diff --git a/conf/app.src b/conf/app.src index 59d2087..799a585 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,3 +1,4 @@ -SOURCE_SUM=ee272e4b2efadcd45543b80a81511b147a2cf3863a9000396fc3d80217f8824e +#useless as long as V1.0 not issued +SOURCE_URL=https://github.com/janeczku/calibre-web/archive/master.zip +SOURCE_SUM=82d6633464fc60d198a671ba973a837f769296c9c5e2ac58537ba20c1e48c563 SOURCE_FORMAT=zip -SOURCE_FILENAME=calibre-web-master.zip diff --git a/scripts/install b/scripts/install index 7ef6a73..7fccaca 100755 --- a/scripts/install +++ b/scripts/install @@ -74,8 +74,10 @@ ynh_app_setting_set $app port $port ynh_app_setting_set $app final_path $final_path # Download, check integrity, uncompress and patch the source from app.src -ynh_setup_source "$final_path" - +#as long as v1 is not reach, sha256sum will change without notice so not usable. +#source are directly in the app so far +#ynh_setup_source "$final_path" +cp -a ../src/. $final_path #================================================= # INSTALL DEPENDENCIES diff --git a/src/LICENSE b/src/LICENSE new file mode 100644 index 0000000..9cecc1d --- /dev/null +++ b/src/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/src/babel.cfg b/src/babel.cfg new file mode 100644 index 0000000..128f13b --- /dev/null +++ b/src/babel.cfg @@ -0,0 +1,3 @@ +[python: **.py] +[jinja2: **/templates/**.*ml] +extensions=jinja2.ext.autoescape,jinja2.ext.with_ \ No newline at end of file diff --git a/src/calibre-web-master.zip b/src/calibre-web-master.zip deleted file mode 100644 index 5d6e027..0000000 Binary files a/src/calibre-web-master.zip and /dev/null differ diff --git a/src/cps.py b/src/cps.py new file mode 100755 index 0000000..055c0ff --- /dev/null +++ b/src/cps.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import sys + +base_path = os.path.dirname(os.path.abspath(__file__)) +# Insert local directories into path +sys.path.append(base_path) +sys.path.append(os.path.join(base_path, 'cps')) +sys.path.append(os.path.join(base_path, 'vendor')) + +from cps.server import Server + +if __name__ == '__main__': + Server.startServer() + + + + + diff --git a/src/cps/__init__.py b/src/cps/__init__.py new file mode 100755 index 0000000..faa18be --- /dev/null +++ b/src/cps/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- diff --git a/src/cps/book_formats.py b/src/cps/book_formats.py new file mode 100644 index 0000000..58d21df --- /dev/null +++ b/src/cps/book_formats.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import logging +import uploader +import os +from flask_babel import gettext as _ +import comic + +try: + from lxml.etree import LXML_VERSION as lxmlversion +except ImportError: + lxmlversion = None + +__author__ = 'lemmsh' + +logger = logging.getLogger("book_formats") + +try: + from wand.image import Image + from wand import version as ImageVersion + use_generic_pdf_cover = False +except (ImportError, RuntimeError) as e: + logger.warning('cannot import Image, generating pdf covers for pdf uploads will not work: %s', e) + use_generic_pdf_cover = True +try: + from PyPDF2 import PdfFileReader + from PyPDF2 import __version__ as PyPdfVersion + use_pdf_meta = True +except ImportError as e: + logger.warning('cannot import PyPDF2, extracting pdf metadata will not work: %s', e) + use_pdf_meta = False + +try: + import epub + use_epub_meta = True +except ImportError as e: + logger.warning('cannot import epub, extracting epub metadata will not work: %s', e) + use_epub_meta = False + +try: + import fb2 + use_fb2_meta = True +except ImportError as e: + logger.warning('cannot import fb2, extracting fb2 metadata will not work: %s', e) + use_fb2_meta = False + + +def process(tmp_file_path, original_file_name, original_file_extension): + meta = None + try: + if ".PDF" == original_file_extension.upper(): + meta = pdf_meta(tmp_file_path, original_file_name, original_file_extension) + if ".EPUB" == original_file_extension.upper() and use_epub_meta is True: + meta = epub.get_epub_info(tmp_file_path, original_file_name, original_file_extension) + if ".FB2" == original_file_extension.upper() and use_fb2_meta is True: + meta = fb2.get_fb2_info(tmp_file_path, original_file_extension) + if original_file_extension.upper() in ['.CBZ', '.CBT']: + meta = comic.get_comic_info(tmp_file_path, original_file_name, original_file_extension) + + except Exception as ex: + logger.warning('cannot parse metadata, using default: %s', ex) + + if meta and meta.title.strip() and meta.author.strip(): + return meta + else: + return default_meta(tmp_file_path, original_file_name, original_file_extension) + + +def default_meta(tmp_file_path, original_file_name, original_file_extension): + return uploader.BookMeta( + file_path=tmp_file_path, + extension=original_file_extension, + title=original_file_name, + author=u"Unknown", + cover=None, + description="", + tags="", + series="", + series_id="", + languages="") + + +def pdf_meta(tmp_file_path, original_file_name, original_file_extension): + + if use_pdf_meta: + pdf = PdfFileReader(open(tmp_file_path, 'rb')) + doc_info = pdf.getDocumentInfo() + else: + doc_info = None + + if doc_info is not None: + author = doc_info.author if doc_info.author else u"Unknown" + title = doc_info.title if doc_info.title else original_file_name + subject = doc_info.subject + else: + author = u"Unknown" + title = original_file_name + subject = "" + return uploader.BookMeta( + file_path=tmp_file_path, + extension=original_file_extension, + title=title, + author=author, + cover=pdf_preview(tmp_file_path, original_file_name), + description=subject, + tags="", + series="", + series_id="", + languages="") + + +def pdf_preview(tmp_file_path, tmp_dir): + if use_generic_pdf_cover: + return None + else: + cover_file_name = os.path.splitext(tmp_file_path)[0] + ".cover.jpg" + with Image(filename=tmp_file_path + "[0]", resolution=150) as img: + img.compression_quality = 88 + img.save(filename=os.path.join(tmp_dir, cover_file_name)) + return cover_file_name + + +def get_versions(): + if not use_generic_pdf_cover: + IVersion = ImageVersion.MAGICK_VERSION + WVersion = ImageVersion.VERSION + else: + IVersion = _(u'not installed') + WVersion = _(u'not installed') + if use_pdf_meta: + PVersion='v'+PyPdfVersion + else: + PVersion=_(u'not installed') + if lxmlversion: + XVersion = 'v'+'.'.join(map(str, lxmlversion)) + else: + XVersion = _(u'not installed') + return {'Image Magick': IVersion, 'PyPdf': PVersion, 'lxml':XVersion, 'Wand Version': WVersion} diff --git a/src/cps/cache_buster.py b/src/cps/cache_buster.py new file mode 100644 index 0000000..31c98c7 --- /dev/null +++ b/src/cps/cache_buster.py @@ -0,0 +1,60 @@ +# Inspired by https://github.com/ChrisTM/Flask-CacheBust +# Uses query strings so CSS font files are found without having to resort to absolute URLs + +import hashlib +import os + + +def init_cache_busting(app): + """ + Configure `app` to so that `url_for` adds a unique query string to URLs generated + for the `'static'` endpoint. + + This allows setting long cache expiration values on static resources + because whenever the resource changes, so does its URL. + """ + + static_folder = os.path.join(app.static_folder, '') # path to the static file folder, with trailing slash + + hash_table = {} # map of file hashes + + app.logger.debug('Computing cache-busting values...') + # compute file hashes + for dirpath, __, filenames in os.walk(static_folder): + for filename in filenames: + # compute version component + rooted_filename = os.path.join(dirpath, filename) + with open(rooted_filename, 'rb') as f: + file_hash = hashlib.md5(f.read()).hexdigest()[:7] + + # save version to tables + file_path = rooted_filename.replace(static_folder, "") + file_path = file_path.replace("\\", "/") # Convert Windows path to web path + hash_table[file_path] = file_hash + app.logger.debug('Finished computing cache-busting values') + + def bust_filename(filename): + return hash_table.get(filename, "") + + def unbust_filename(filename): + return filename.split("?", 1)[0] + + @app.url_defaults + def reverse_to_cache_busted_url(endpoint, values): + """ + Make `url_for` produce busted filenames when using the 'static' endpoint. + """ + if endpoint == "static": + file_hash = bust_filename(values["filename"]) + if file_hash: + values["q"] = file_hash + + def debusting_static_view(filename): + """ + Serve a request for a static file having a busted name. + """ + return original_static_view(filename=unbust_filename(filename)) + + # Replace the default static file view with our debusting view. + original_static_view = app.view_functions["static"] + app.view_functions["static"] = debusting_static_view diff --git a/src/cps/cli.py b/src/cps/cli.py new file mode 100644 index 0000000..7f8d9ab --- /dev/null +++ b/src/cps/cli.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import argparse +import os +import sys + +parser = argparse.ArgumentParser(description='Calibre Web is a web app' + ' providing a interface for browsing, reading and downloading eBooks\n', prog='cps.py') +parser.add_argument('-p', metavar='path', help='path and name to settings db, e.g. /opt/cw.db') +parser.add_argument('-g', metavar='path', help='path and name to gdrive db, e.g. /opt/gd.db') +parser.add_argument('-c', metavar='path', help='path and name to SSL certfile, e.g. /opt/test.cert, works only in combination with keyfile') +parser.add_argument('-k', metavar='path', help='path and name to SSL keyfile, e.g. /opt/test.key, works only in combination with certfile') +args = parser.parse_args() + +generalPath = os.path.normpath(os.getenv("CALIBRE_DBPATH", + os.path.dirname(os.path.realpath(__file__)) + os.sep + ".." + os.sep)) +if args.p: + settingspath = args.p +else: + settingspath = os.path.join(generalPath, "app.db") + +if args.g: + gdpath = args.g +else: + gdpath = os.path.join(generalPath, "gdrive.db") + +certfilepath = None +keyfilepath = None +if args.c: + if os.path.isfile(args.c): + certfilepath = args.c + else: + print("Certfilepath is invalid. Exiting...") + sys.exit(1) + +if args.c is "": + certfilepath = "" + +if args.k: + if os.path.isfile(args.k): + keyfilepath = args.k + else: + print("Keyfilepath is invalid. Exiting...") + sys.exit(1) + +if (args.k and not args.c) or (not args.k and args.c): + print("Certfile and Keyfile have to be used together. Exiting...") + sys.exit(1) + +if args.k is "": + keyfilepath = "" diff --git a/src/cps/comic.py b/src/cps/comic.py new file mode 100644 index 0000000..98343ae --- /dev/null +++ b/src/cps/comic.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import zipfile +import tarfile +import os +import uploader + + +def extractCover(tmp_file_name, original_file_extension): + if original_file_extension.upper() == '.CBZ': + cf = zipfile.ZipFile(tmp_file_name) + compressed_name = cf.namelist()[0] + cover_data = cf.read(compressed_name) + elif original_file_extension.upper() == '.CBT': + cf = tarfile.TarFile(tmp_file_name) + compressed_name = cf.getnames()[0] + cover_data = cf.extractfile(compressed_name).read() + + prefix = os.path.dirname(tmp_file_name) + + tmp_cover_name = prefix + '/cover' + os.path.splitext(compressed_name)[1] + image = open(tmp_cover_name, 'wb') + image.write(cover_data) + image.close() + return tmp_cover_name + + +def get_comic_info(tmp_file_path, original_file_name, original_file_extension): + + coverfile = extractCover(tmp_file_path, original_file_extension) + + return uploader.BookMeta( + file_path=tmp_file_path, + extension=original_file_extension, + title=original_file_name, + author=u"Unknown", + cover=coverfile, + description="", + tags="", + series="", + series_id="", + languages="") diff --git a/src/cps/converter.py b/src/cps/converter.py new file mode 100644 index 0000000..666a4b5 --- /dev/null +++ b/src/cps/converter.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import os +import subprocess +import ub +import re +from flask_babel import gettext as _ + + +def versionKindle(): + versions = _(u'not installed') + if os.path.exists(ub.config.config_converterpath): + try: + p = subprocess.Popen(ub.config.config_converterpath, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + p.wait() + for lines in p.stdout.readlines(): + if isinstance(lines, bytes): + lines = lines.decode('utf-8') + if re.search('Amazon kindlegen\(', lines): + versions = lines + except Exception: + versions = _(u'Excecution permissions missing') + return {'kindlegen' : versions} + + +def versionCalibre(): + versions = _(u'not installed') + if os.path.exists(ub.config.config_converterpath): + try: + p = subprocess.Popen([ub.config.config_converterpath, '--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + p.wait() + for lines in p.stdout.readlines(): + if isinstance(lines, bytes): + lines = lines.decode('utf-8') + if re.search('ebook-convert.*\(calibre', lines): + versions = lines + except Exception: + versions = _(u'Excecution permissions missing') + return {'Calibre converter' : versions} + + +def versioncheck(): + if ub.config.config_ebookconverter == 1: + return versionKindle() + elif ub.config.config_ebookconverter == 2: + return versionCalibre() + else: + return {'ebook_converter':_(u'not configured')} + diff --git a/src/cps/db.py b/src/cps/db.py new file mode 100755 index 0000000..54e42d2 --- /dev/null +++ b/src/cps/db.py @@ -0,0 +1,389 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from sqlalchemy import * +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import * +import os +import re +import ast +from ub import config +import ub + +session = None +cc_exceptions = ['datetime', 'comments', 'float', 'composite', 'series'] +cc_classes = None +engine = None + + +# user defined sort function for calibre databases (Series, etc.) +def title_sort(title): + # calibre sort stuff + title_pat = re.compile(config.config_title_regex, re.IGNORECASE) + match = title_pat.search(title) + if match: + prep = match.group(1) + title = title.replace(prep, '') + ', ' + prep + return title.strip() + + +def lcase(s): + return s.lower() + + +def ucase(s): + return s.upper() + + +Base = declarative_base() + +books_authors_link = Table('books_authors_link', Base.metadata, + Column('book', Integer, ForeignKey('books.id'), primary_key=True), + Column('author', Integer, ForeignKey('authors.id'), primary_key=True) + ) + +books_tags_link = Table('books_tags_link', Base.metadata, + Column('book', Integer, ForeignKey('books.id'), primary_key=True), + Column('tag', Integer, ForeignKey('tags.id'), primary_key=True) + ) + +books_series_link = Table('books_series_link', Base.metadata, + Column('book', Integer, ForeignKey('books.id'), primary_key=True), + Column('series', Integer, ForeignKey('series.id'), primary_key=True) + ) + +books_ratings_link = Table('books_ratings_link', Base.metadata, + Column('book', Integer, ForeignKey('books.id'), primary_key=True), + Column('rating', Integer, ForeignKey('ratings.id'), primary_key=True) + ) + +books_languages_link = Table('books_languages_link', Base.metadata, + Column('book', Integer, ForeignKey('books.id'), primary_key=True), + Column('lang_code', Integer, ForeignKey('languages.id'), primary_key=True) + ) + +books_publishers_link = Table('books_publishers_link', Base.metadata, + Column('book', Integer, ForeignKey('books.id'), primary_key=True), + Column('publisher', Integer, ForeignKey('publishers.id'), primary_key=True) + ) + + +class Identifiers(Base): + __tablename__ = 'identifiers' + + id = Column(Integer, primary_key=True) + type = Column(String) + val = Column(String) + book = Column(Integer, ForeignKey('books.id')) + + def __init__(self, val, id_type, book): + self.val = val + self.type = id_type + self.book = book + + def formatType(self): + if self.type == "amazon": + return u"Amazon" + elif self.type == "isbn": + return u"ISBN" + elif self.type == "doi": + return u"DOI" + elif self.type == "goodreads": + return u"Goodreads" + elif self.type == "google": + return u"Google Books" + elif self.type == "kobo": + return u"Kobo" + else: + return self.type + + def __repr__(self): + if self.type == "amazon": + return u"https://amzn.com/{0}".format(self.val) + elif self.type == "isbn": + return u"http://www.worldcat.org/isbn/{0}".format(self.val) + elif self.type == "doi": + return u"http://dx.doi.org/{0}".format(self.val) + elif self.type == "goodreads": + return u"http://www.goodreads.com/book/show/{0}".format(self.val) + elif self.type == "douban": + return u"https://book.douban.com/subject/{0}".format(self.val) + elif self.type == "google": + return u"https://books.google.com/books?id={0}".format(self.val) + elif self.type == "kobo": + return u"https://www.kobo.com/ebook/{0}".format(self.val) + elif self.type == "url": + return u"{0}".format(self.val) + else: + return u"" + + +class Comments(Base): + __tablename__ = 'comments' + + id = Column(Integer, primary_key=True) + text = Column(String) + book = Column(Integer, ForeignKey('books.id')) + + def __init__(self, text, book): + self.text = text + self.book = book + + def __repr__(self): + return u"".format(self.text) + + +class Tags(Base): + __tablename__ = 'tags' + + id = Column(Integer, primary_key=True, autoincrement=True) + name = Column(String) + + def __init__(self, name): + self.name = name + + def __repr__(self): + return u"".format(self.name) + + +class Authors(Base): + __tablename__ = 'authors' + + id = Column(Integer, primary_key=True) + name = Column(String) + sort = Column(String) + link = Column(String) + + def __init__(self, name, sort, link): + self.name = name + self.sort = sort + self.link = link + + def __repr__(self): + return u"".format(self.name, self.sort, self.link) + + +class Series(Base): + __tablename__ = 'series' + + id = Column(Integer, primary_key=True) + name = Column(String) + sort = Column(String) + + def __init__(self, name, sort): + self.name = name + self.sort = sort + + def __repr__(self): + return u"".format(self.name, self.sort) + + +class Ratings(Base): + __tablename__ = 'ratings' + + id = Column(Integer, primary_key=True) + rating = Column(Integer) + + def __init__(self, rating): + self.rating = rating + + def __repr__(self): + return u"".format(self.rating) + + +class Languages(Base): + __tablename__ = 'languages' + + id = Column(Integer, primary_key=True) + lang_code = Column(String) + + def __init__(self, lang_code): + self.lang_code = lang_code + + def __repr__(self): + return u"".format(self.lang_code) + + +class Publishers(Base): + __tablename__ = 'publishers' + + id = Column(Integer, primary_key=True) + name = Column(String) + sort = Column(String) + + def __init__(self, name, sort): + self.name = name + self.sort = sort + + def __repr__(self): + return u"".format(self.name, self.sort) + + +class Data(Base): + __tablename__ = 'data' + + id = Column(Integer, primary_key=True) + book = Column(Integer, ForeignKey('books.id')) + format = Column(String) + uncompressed_size = Column(Integer) + name = Column(String) + + def __init__(self, book, book_format, uncompressed_size, name): + self.book = book + self.format = book_format + self.uncompressed_size = uncompressed_size + self.name = name + + def __repr__(self): + return u"".format(self.book, self.format, self.uncompressed_size, self.name) + + +class Books(Base): + __tablename__ = 'books' + + DEFAULT_PUBDATE = "0101-01-01 00:00:00+00:00" + + id = Column(Integer, primary_key=True) + title = Column(String) + sort = Column(String) + author_sort = Column(String) + timestamp = Column(String) + pubdate = Column(String) + series_index = Column(String) + last_modified = Column(String) + path = Column(String) + has_cover = Column(Integer) + uuid = Column(String) + + authors = relationship('Authors', secondary=books_authors_link, backref='books') + tags = relationship('Tags', secondary=books_tags_link, backref='books',order_by="Tags.name") + comments = relationship('Comments', backref='books') + data = relationship('Data', backref='books') + series = relationship('Series', secondary=books_series_link, backref='books') + ratings = relationship('Ratings', secondary=books_ratings_link, backref='books') + languages = relationship('Languages', secondary=books_languages_link, backref='books') + publishers = relationship('Publishers', secondary=books_publishers_link, backref='books') + identifiers = relationship('Identifiers', backref='books') + + def __init__(self, title, sort, author_sort, timestamp, pubdate, series_index, last_modified, path, has_cover, + authors, tags, languages=None): + self.title = title + self.sort = sort + self.author_sort = author_sort + self.timestamp = timestamp + self.pubdate = pubdate + self.series_index = series_index + self.last_modified = last_modified + self.path = path + self.has_cover = has_cover + + def __repr__(self): + return u"".format(self.title, self.sort, self.author_sort, + self.timestamp, self.pubdate, self.series_index, + self.last_modified, self.path, self.has_cover) + + @property + def atom_timestamp(self): + return (self.timestamp or '').replace(' ', 'T') + +class Custom_Columns(Base): + __tablename__ = 'custom_columns' + + id = Column(Integer, primary_key=True) + label = Column(String) + name = Column(String) + datatype = Column(String) + mark_for_delete = Column(Boolean) + editable = Column(Boolean) + display = Column(String) + is_multiple = Column(Boolean) + normalized = Column(Boolean) + + def get_display_dict(self): + display_dict = ast.literal_eval(self.display) + return display_dict + + +def setup_db(): + global engine + global session + global cc_classes + + if config.config_calibre_dir is None or config.config_calibre_dir == u'': + content = ub.session.query(ub.Settings).first() + content.config_calibre_dir = None + content.db_configured = False + ub.session.commit() + config.loadSettings() + return False + + dbpath = os.path.join(config.config_calibre_dir, "metadata.db") + try: + if not os.path.exists(dbpath): + raise + engine = create_engine('sqlite:///' + dbpath, echo=False, isolation_level="SERIALIZABLE", connect_args={'check_same_thread': False}) + conn = engine.connect() + except Exception: + content = ub.session.query(ub.Settings).first() + content.config_calibre_dir = None + content.db_configured = False + ub.session.commit() + config.loadSettings() + return False + content = ub.session.query(ub.Settings).first() + content.db_configured = True + ub.session.commit() + config.loadSettings() + conn.connection.create_function('title_sort', 1, title_sort) + conn.connection.create_function('lower', 1, lcase) + conn.connection.create_function('upper', 1, ucase) + + if not cc_classes: + cc = conn.execute("SELECT id, datatype FROM custom_columns") + + cc_ids = [] + books_custom_column_links = {} + cc_classes = {} + for row in cc: + if row.datatype not in cc_exceptions: + books_custom_column_links[row.id] = Table('books_custom_column_' + str(row.id) + '_link', Base.metadata, + Column('book', Integer, ForeignKey('books.id'), + primary_key=True), + Column('value', Integer, + ForeignKey('custom_column_' + str(row.id) + '.id'), + primary_key=True) + ) + cc_ids.append([row.id, row.datatype]) + if row.datatype == 'bool': + ccdict = {'__tablename__': 'custom_column_' + str(row.id), + 'id': Column(Integer, primary_key=True), + 'book': Column(Integer, ForeignKey('books.id')), + 'value': Column(Boolean)} + elif row.datatype == 'int': + ccdict = {'__tablename__': 'custom_column_' + str(row.id), + 'id': Column(Integer, primary_key=True), + 'book': Column(Integer, ForeignKey('books.id')), + 'value': Column(Integer)} + else: + ccdict = {'__tablename__': 'custom_column_' + str(row.id), + 'id': Column(Integer, primary_key=True), + 'value': Column(String)} + cc_classes[row.id] = type('Custom_Column_' + str(row.id), (Base,), ccdict) + + for cc_id in cc_ids: + if (cc_id[1] == 'bool') or (cc_id[1] == 'int'): + setattr(Books, 'custom_column_' + str(cc_id[0]), relationship(cc_classes[cc_id[0]], + primaryjoin=( + Books.id == cc_classes[cc_id[0]].book), + backref='books')) + else: + setattr(Books, 'custom_column_' + str(cc_id[0]), relationship(cc_classes[cc_id[0]], + secondary=books_custom_column_links[cc_id[0]], + backref='books')) + + + Session = scoped_session(sessionmaker(autocommit=False, + autoflush=False, + bind=engine)) + session = Session() + return True diff --git a/src/cps/epub.py b/src/cps/epub.py new file mode 100644 index 0000000..1066557 --- /dev/null +++ b/src/cps/epub.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import zipfile +from lxml import etree +import os +import uploader +from iso639 import languages as isoLanguages + + +def extractCover(zipFile, coverFile, coverpath, tmp_file_name): + if coverFile is None: + return None + else: + zipCoverPath = os.path.join(coverpath, coverFile).replace('\\', '/') + cf = zipFile.read(zipCoverPath) + prefix = os.path.splitext(tmp_file_name)[0] + tmp_cover_name = prefix + '.' + os.path.basename(zipCoverPath) + image = open(tmp_cover_name, 'wb') + image.write(cf) + image.close() + return tmp_cover_name + + +def get_epub_info(tmp_file_path, original_file_name, original_file_extension): + ns = { + 'n': 'urn:oasis:names:tc:opendocument:xmlns:container', + 'pkg': 'http://www.idpf.org/2007/opf', + 'dc': 'http://purl.org/dc/elements/1.1/' + } + + epubZip = zipfile.ZipFile(tmp_file_path) + + txt = epubZip.read('META-INF/container.xml') + tree = etree.fromstring(txt) + cfname = tree.xpath('n:rootfiles/n:rootfile/@full-path', namespaces=ns)[0] + cf = epubZip.read(cfname) + tree = etree.fromstring(cf) + + coverpath = os.path.dirname(cfname) + + p = tree.xpath('/pkg:package/pkg:metadata', namespaces=ns)[0] + + epub_metadata = {} + + for s in ['title', 'description', 'creator', 'language', 'subject']: + tmp = p.xpath('dc:%s/text()' % s, namespaces=ns) + if len(tmp) > 0: + epub_metadata[s] = p.xpath('dc:%s/text()' % s, namespaces=ns)[0] + else: + epub_metadata[s] = "Unknown" + + if epub_metadata['subject'] == "Unknown": + epub_metadata['subject'] = '' + + if epub_metadata['description'] == "Unknown": + description = tree.xpath("//*[local-name() = 'description']/text()") + if len(description) > 0: + epub_metadata['description'] = description + else: + epub_metadata['description'] = "" + + if epub_metadata['language'] == "Unknown": + epub_metadata['language'] = "" + else: + lang = epub_metadata['language'].split('-', 1)[0].lower() + if len(lang) == 2: + epub_metadata['language'] = isoLanguages.get(part1=lang).name + elif len(lang) == 3: + epub_metadata['language'] = isoLanguages.get(part3=lang).name + else: + epub_metadata['language'] = "" + + series = tree.xpath("/pkg:package/pkg:metadata/pkg:meta[@name='calibre:series']/@content", namespaces=ns) + if len(series) > 0: + epub_metadata['series'] = series[0] + else: + epub_metadata['series'] = '' + + series_id = tree.xpath("/pkg:package/pkg:metadata/pkg:meta[@name='calibre:series_index']/@content", namespaces=ns) + if len(series_id) > 0: + epub_metadata['series_id'] = series_id[0] + else: + epub_metadata['series_id'] = '1' + + coversection = tree.xpath("/pkg:package/pkg:manifest/pkg:item[@id='cover-image']/@href", namespaces=ns) + coverfile = None + if len(coversection) > 0: + coverfile = extractCover(epubZip, coversection[0], coverpath, tmp_file_path) + else: + meta_cover = tree.xpath("/pkg:package/pkg:metadata/pkg:meta[@name='cover']/@content", namespaces=ns) + if len(meta_cover) > 0: + coversection = tree.xpath("/pkg:package/pkg:manifest/pkg:item[@id='"+meta_cover[0]+"']/@href", namespaces=ns) + if len(coversection) > 0: + filetype = coversection[0].rsplit('.', 1)[-1] + if filetype == "xhtml" or filetype == "html": # if cover is (x)html format + markup = epubZip.read(os.path.join(coverpath, coversection[0])) + markupTree = etree.fromstring(markup) + # no matter xhtml or html with no namespace + imgsrc = markupTree.xpath("//*[local-name() = 'img']/@src") + # imgsrc maybe startwith "../"" so fullpath join then relpath to cwd + filename = os.path.relpath(os.path.join(os.path.dirname(os.path.join(coverpath, coversection[0])), imgsrc[0])) + coverfile = extractCover(epubZip, filename, "", tmp_file_path) + else: + coverfile = extractCover(epubZip, coversection[0], coverpath, tmp_file_path) + + if not epub_metadata['title']: + title = original_file_name + else: + title = epub_metadata['title'] + + return uploader.BookMeta( + file_path=tmp_file_path, + extension=original_file_extension, + title=title.encode('utf-8').decode('utf-8'), + author=epub_metadata['creator'].encode('utf-8').decode('utf-8'), + cover=coverfile, + description=epub_metadata['description'], + tags=epub_metadata['subject'].encode('utf-8').decode('utf-8'), + series=epub_metadata['series'].encode('utf-8').decode('utf-8'), + series_id=epub_metadata['series_id'].encode('utf-8').decode('utf-8'), + languages=epub_metadata['language']) diff --git a/src/cps/fb2.py b/src/cps/fb2.py new file mode 100644 index 0000000..87295ab --- /dev/null +++ b/src/cps/fb2.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from lxml import etree +import uploader + + +def get_fb2_info(tmp_file_path, original_file_extension): + + ns = { + 'fb': 'http://www.gribuser.ru/xml/fictionbook/2.0', + 'l': 'http://www.w3.org/1999/xlink', + } + + fb2_file = open(tmp_file_path) + tree = etree.fromstring(fb2_file.read()) + + authors = tree.xpath('/fb:FictionBook/fb:description/fb:title-info/fb:author', namespaces=ns) + + def get_author(element): + last_name = element.xpath('fb:last-name/text()', namespaces=ns) + if len(last_name): + last_name = last_name[0].encode('utf-8') + else: + last_name = u'' + middle_name = element.xpath('fb:middle-name/text()', namespaces=ns) + if len(middle_name): + middle_name = middle_name[0].encode('utf-8') + else: + middle_name = u'' + first_name = element.xpath('fb:first-name/text()', namespaces=ns) + if len(first_name): + first_name = first_name[0].encode('utf-8') + else: + first_name = u'' + return (first_name.decode('utf-8') + u' ' + + middle_name.decode('utf-8') + u' ' + + last_name.decode('utf-8')).encode('utf-8') + + author = str(", ".join(map(get_author, authors))) + + title = tree.xpath('/fb:FictionBook/fb:description/fb:title-info/fb:book-title/text()', namespaces=ns) + if len(title): + title = str(title[0].encode('utf-8')) + else: + title = u'' + description = tree.xpath('/fb:FictionBook/fb:description/fb:publish-info/fb:book-name/text()', namespaces=ns) + if len(description): + description = str(description[0].encode('utf-8')) + else: + description = u'' + + return uploader.BookMeta( + file_path=tmp_file_path, + extension=original_file_extension, + title=title.decode('utf-8'), + author=author.decode('utf-8'), + cover=None, + description=description.decode('utf-8'), + tags="", + series="", + series_id="", + languages="") diff --git a/src/cps/gdriveutils.py b/src/cps/gdriveutils.py new file mode 100644 index 0000000..8da2d28 --- /dev/null +++ b/src/cps/gdriveutils.py @@ -0,0 +1,499 @@ +try: + from pydrive.auth import GoogleAuth + from pydrive.drive import GoogleDrive + from pydrive.auth import RefreshError + from apiclient import errors + gdrive_support = True +except ImportError: + gdrive_support = False + +import os +from ub import config +import cli +import shutil +from flask import Response, stream_with_context + +from sqlalchemy import * +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import * + + +import web + +class Singleton: + """ + A non-thread-safe helper class to ease implementing singletons. + This should be used as a decorator -- not a metaclass -- to the + class that should be a singleton. + + The decorated class can define one `__init__` function that + takes only the `self` argument. Also, the decorated class cannot be + inherited from. Other than that, there are no restrictions that apply + to the decorated class. + + To get the singleton instance, use the `Instance` method. Trying + to use `__call__` will result in a `TypeError` being raised. + + """ + + def __init__(self, decorated): + self._decorated = decorated + + def Instance(self): + """ + Returns the singleton instance. Upon its first call, it creates a + new instance of the decorated class and calls its `__init__` method. + On all subsequent calls, the already created instance is returned. + + """ + try: + return self._instance + except AttributeError: + self._instance = self._decorated() + return self._instance + + def __call__(self): + raise TypeError('Singletons must be accessed through `Instance()`.') + + def __instancecheck__(self, inst): + return isinstance(inst, self._decorated) + + +@Singleton +class Gauth: + def __init__(self): + self.auth = GoogleAuth(settings_file=os.path.join(config.get_main_dir,'settings.yaml')) + + +@Singleton +class Gdrive: + def __init__(self): + self.drive = getDrive(gauth=Gauth.Instance().auth) + + +engine = create_engine('sqlite:///{0}'.format(cli.gdpath), echo=False) +Base = declarative_base() + +# Open session for database connection +Session = sessionmaker() +Session.configure(bind=engine) +session = scoped_session(Session) + + +class GdriveId(Base): + __tablename__ = 'gdrive_ids' + + id = Column(Integer, primary_key=True) + gdrive_id = Column(Integer, unique=True) + path = Column(String) + __table_args__ = (UniqueConstraint('gdrive_id', 'path', name='_gdrive_path_uc'),) + + def __repr__(self): + return str(self.path) + + +class PermissionAdded(Base): + __tablename__ = 'permissions_added' + + id = Column(Integer, primary_key=True) + gdrive_id = Column(Integer, unique=True) + + def __repr__(self): + return str(self.gdrive_id) + + +def migrate(): + if not engine.dialect.has_table(engine.connect(), "permissions_added"): + PermissionAdded.__table__.create(bind = engine) + for sql in session.execute("select sql from sqlite_master where type='table'"): + if 'CREATE TABLE gdrive_ids' in sql[0]: + currUniqueConstraint = 'UNIQUE (gdrive_id)' + if currUniqueConstraint in sql[0]: + sql=sql[0].replace(currUniqueConstraint, 'UNIQUE (gdrive_id, path)') + sql=sql.replace(GdriveId.__tablename__, GdriveId.__tablename__ + '2') + session.execute(sql) + session.execute('INSERT INTO gdrive_ids2 (id, gdrive_id, path) SELECT id, gdrive_id, path FROM gdrive_ids;') + session.commit() + session.execute('DROP TABLE %s' % 'gdrive_ids') + session.execute('ALTER TABLE gdrive_ids2 RENAME to gdrive_ids') + break + +if not os.path.exists(cli.gdpath): + try: + Base.metadata.create_all(engine) + except Exception: + raise +migrate() + + +def getDrive(drive=None, gauth=None): + if not drive: + if not gauth: + gauth = GoogleAuth(settings_file=os.path.join(config.get_main_dir,'settings.yaml')) + # Try to load saved client credentials + gauth.LoadCredentialsFile(os.path.join(config.get_main_dir,'gdrive_credentials')) + if gauth.access_token_expired: + # Refresh them if expired + try: + gauth.Refresh() + except RefreshError as e: + web.app.logger.error("Google Drive error: " + e.message) + except Exception as e: + web.app.logger.exception(e) + else: + # Initialize the saved creds + gauth.Authorize() + # Save the current credentials to a file + return GoogleDrive(gauth) + if drive.auth.access_token_expired: + drive.auth.Refresh() + return drive + +def listRootFolders(): + drive = getDrive(Gdrive.Instance().drive) + folder = "'root' in parents and mimeType = 'application/vnd.google-apps.folder' and trashed = false" + fileList = drive.ListFile({'q': folder}).GetList() + return fileList + + +def getEbooksFolder(drive): + return getFolderInFolder('root',config.config_google_drive_folder,drive) + + +def getFolderInFolder(parentId, folderName, drive): + # drive = getDrive(drive) + query="" + if folderName: + query = "title = '%s' and " % folderName.replace("'", "\\'") + folder = query + "'%s' in parents and mimeType = 'application/vnd.google-apps.folder' and trashed = false" % parentId + fileList = drive.ListFile({'q': folder}).GetList() + if fileList.__len__() == 0: + return None + else: + return fileList[0] + +# Search for id of root folder in gdrive database, if not found request from gdrive and store in internal database +def getEbooksFolderId(drive=None): + storedPathName = session.query(GdriveId).filter(GdriveId.path == '/').first() + if storedPathName: + return storedPathName.gdrive_id + else: + gDriveId = GdriveId() + try: + gDriveId.gdrive_id = getEbooksFolder(drive)['id'] + except Exception: + web.app.logger.error('Error gDrive, root ID not found') + gDriveId.path = '/' + session.merge(gDriveId) + session.commit() + return + + +def getFile(pathId, fileName, drive): + metaDataFile = "'%s' in parents and trashed = false and title = '%s'" % (pathId, fileName.replace("'", "\\'")) + + fileList = drive.ListFile({'q': metaDataFile}).GetList() + if fileList.__len__() == 0: + return None + else: + return fileList[0] + + +def getFolderId(path, drive): + # drive = getDrive(drive) + currentFolderId = getEbooksFolderId(drive) + sqlCheckPath = path if path[-1] == '/' else path + '/' + storedPathName = session.query(GdriveId).filter(GdriveId.path == sqlCheckPath).first() + + if not storedPathName: + dbChange = False + s = path.split('/') + for i, x in enumerate(s): + if len(x) > 0: + currentPath = "/".join(s[:i+1]) + if currentPath[-1] != '/': + currentPath = currentPath + '/' + storedPathName = session.query(GdriveId).filter(GdriveId.path == currentPath).first() + if storedPathName: + currentFolderId = storedPathName.gdrive_id + else: + currentFolder = getFolderInFolder(currentFolderId, x, drive) + if currentFolder: + gDriveId = GdriveId() + gDriveId.gdrive_id = currentFolder['id'] + gDriveId.path = currentPath + session.merge(gDriveId) + dbChange = True + currentFolderId = currentFolder['id'] + else: + currentFolderId= None + break + if dbChange: + session.commit() + else: + currentFolderId = storedPathName.gdrive_id + return currentFolderId + + +def getFileFromEbooksFolder(path, fileName): + drive = getDrive(Gdrive.Instance().drive) + if path: + # sqlCheckPath=path if path[-1] =='/' else path + '/' + folderId = getFolderId(path, drive) + else: + folderId = getEbooksFolderId(drive) + if folderId: + return getFile(folderId, fileName, drive) + else: + return None + + +'''def copyDriveFileRemote(drive, origin_file_id, copy_title): + drive = getDrive(drive) + copied_file = {'title': copy_title} + try: + file_data = drive.auth.service.files().copy( + fileId = origin_file_id, body=copied_file).execute() + return drive.CreateFile({'id': file_data['id']}) + except errors.HttpError as error: + print ('An error occurred: %s' % error) + return None''' + + +# Download metadata.db from gdrive +def downloadFile(path, filename, output): + f = getFileFromEbooksFolder(path, filename) + f.GetContentFile(output) + + +def moveGdriveFolderRemote(origin_file, target_folder): + drive = getDrive(Gdrive.Instance().drive) + previous_parents = ",".join([parent["id"] for parent in origin_file.get('parents')]) + gFileTargetDir = getFileFromEbooksFolder(None, target_folder) + if not gFileTargetDir: + # Folder is not exisiting, create, and move folder + gFileTargetDir = drive.CreateFile( + {'title': target_folder, 'parents': [{"kind": "drive#fileLink", 'id': getEbooksFolderId()}], + "mimeType": "application/vnd.google-apps.folder"}) + gFileTargetDir.Upload() + # Move the file to the new folder + drive.auth.service.files().update(fileId=origin_file['id'], + addParents=gFileTargetDir['id'], + removeParents=previous_parents, + fields='id, parents').execute() + # if previous_parents has no childs anymore, delete originfileparent + # is not working correctly, because of slow update on gdrive -> could cause trouble in gdrive.db + # (nonexisting folder has id) + # children = drive.auth.service.children().list(folderId=previous_parents).execute() + # if not len(children['items']): + # drive.auth.service.files().delete(fileId=previous_parents).execute() + + + +def copyToDrive(drive, uploadFile, createRoot, replaceFiles, + ignoreFiles=None, + parent=None, prevDir=''): + ignoreFiles = ignoreFiles or [] + drive = getDrive(drive) + isInitial = not bool(parent) + if not parent: + parent = getEbooksFolder(drive) + if os.path.isdir(os.path.join(prevDir,uploadFile)): + existingFolder = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % (os.path.basename(uploadFile), parent['id'])}).GetList() + if len(existingFolder) == 0 and (not isInitial or createRoot): + parent = drive.CreateFile({'title': os.path.basename(uploadFile), 'parents': [{"kind": "drive#fileLink", 'id': parent['id']}], + "mimeType": "application/vnd.google-apps.folder"}) + parent.Upload() + else: + if (not isInitial or createRoot) and len(existingFolder) > 0: + parent = existingFolder[0] + for f in os.listdir(os.path.join(prevDir, uploadFile)): + if f not in ignoreFiles: + copyToDrive(drive, f, True, replaceFiles, ignoreFiles, parent, os.path.join(prevDir, uploadFile)) + else: + if os.path.basename(uploadFile) not in ignoreFiles: + existingFiles = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % (os.path.basename(uploadFile), parent['id'])}).GetList() + if len(existingFiles) > 0: + driveFile = existingFiles[0] + else: + driveFile = drive.CreateFile({'title': os.path.basename(uploadFile), 'parents': [{"kind":"drive#fileLink", 'id': parent['id']}], }) + driveFile.SetContentFile(os.path.join(prevDir, uploadFile)) + driveFile.Upload() + + +def uploadFileToEbooksFolder(destFile, f): + drive = getDrive(Gdrive.Instance().drive) + parent = getEbooksFolder(drive) + splitDir = destFile.split('/') + for i, x in enumerate(splitDir): + if i == len(splitDir)-1: + existingFiles = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % (x, parent['id'])}).GetList() + if len(existingFiles) > 0: + driveFile = existingFiles[0] + else: + driveFile = drive.CreateFile({'title': x, 'parents': [{"kind": "drive#fileLink", 'id': parent['id']}],}) + driveFile.SetContentFile(f) + driveFile.Upload() + else: + existingFolder = drive.ListFile({'q': "title = '%s' and '%s' in parents and trashed = false" % (x, parent['id'])}).GetList() + if len(existingFolder) == 0: + parent = drive.CreateFile({'title': x, 'parents': [{"kind": "drive#fileLink", 'id': parent['id']}], + "mimeType": "application/vnd.google-apps.folder"}) + parent.Upload() + else: + parent = existingFolder[0] + + +def watchChange(drive, channel_id, channel_type, channel_address, + channel_token=None, expiration=None): + # Watch for all changes to a user's Drive. + # Args: + # service: Drive API service instance. + # channel_id: Unique string that identifies this channel. + # channel_type: Type of delivery mechanism used for this channel. + # channel_address: Address where notifications are delivered. + # channel_token: An arbitrary string delivered to the target address with + # each notification delivered over this channel. Optional. + # channel_address: Address where notifications are delivered. Optional. + # Returns: + # The created channel if successful + # Raises: + # apiclient.errors.HttpError: if http request to create channel fails. + body = { + 'id': channel_id, + 'type': channel_type, + 'address': channel_address + } + if channel_token: + body['token'] = channel_token + if expiration: + body['expiration'] = expiration + return drive.auth.service.changes().watch(body=body).execute() + + +def watchFile(drive, file_id, channel_id, channel_type, channel_address, + channel_token=None, expiration=None): + """Watch for any changes to a specific file. + Args: + service: Drive API service instance. + file_id: ID of the file to watch. + channel_id: Unique string that identifies this channel. + channel_type: Type of delivery mechanism used for this channel. + channel_address: Address where notifications are delivered. + channel_token: An arbitrary string delivered to the target address with + each notification delivered over this channel. Optional. + channel_address: Address where notifications are delivered. Optional. + Returns: + The created channel if successful + Raises: + apiclient.errors.HttpError: if http request to create channel fails. + """ + body = { + 'id': channel_id, + 'type': channel_type, + 'address': channel_address + } + if channel_token: + body['token'] = channel_token + if expiration: + body['expiration'] = expiration + return drive.auth.service.files().watch(fileId=file_id, body=body).execute() + + +def stopChannel(drive, channel_id, resource_id): + """Stop watching to a specific channel. + Args: + service: Drive API service instance. + channel_id: ID of the channel to stop. + resource_id: Resource ID of the channel to stop. + Raises: + apiclient.errors.HttpError: if http request to create channel fails. + """ + body = { + 'id': channel_id, + 'resourceId': resource_id + } + return drive.auth.service.channels().stop(body=body).execute() + + +def getChangeById (drive, change_id): + # Print a single Change resource information. + # + # Args: + # service: Drive API service instance. + # change_id: ID of the Change resource to retrieve. + try: + change = drive.auth.service.changes().get(changeId=change_id).execute() + return change + except (errors.HttpError) as error: + web.app.logger.info(error.message) + return None + +# Deletes the local hashes database to force search for new folder names +def deleteDatabaseOnChange(): + session.query(GdriveId).delete() + session.commit() + +def updateGdriveCalibreFromLocal(): + copyToDrive(Gdrive.Instance().drive, config.config_calibre_dir, False, True) + for x in os.listdir(config.config_calibre_dir): + if os.path.isdir(os.path.join(config.config_calibre_dir, x)): + shutil.rmtree(os.path.join(config.config_calibre_dir, x)) + +# update gdrive.db on edit of books title +def updateDatabaseOnEdit(ID,newPath): + storedPathName = session.query(GdriveId).filter(GdriveId.gdrive_id == ID).first() + if storedPathName: + storedPathName.path = newPath + session.commit() + + +# Deletes the hashes in database of deleted book +def deleteDatabaseEntry(ID): + session.query(GdriveId).filter(GdriveId.gdrive_id == ID).delete() + session.commit() + + +# Gets cover file from gdrive +def get_cover_via_gdrive(cover_path): + df = getFileFromEbooksFolder(cover_path, 'cover.jpg') + if df: + if not session.query(PermissionAdded).filter(PermissionAdded.gdrive_id == df['id']).first(): + df.GetPermissions() + df.InsertPermission({ + 'type': 'anyone', + 'value': 'anyone', + 'role': 'reader', + 'withLink': True}) + permissionAdded = PermissionAdded() + permissionAdded.gdrive_id = df['id'] + session.add(permissionAdded) + session.commit() + return df.metadata.get('webContentLink') + else: + return None + +# Creates chunks for downloading big files +def partial(total_byte_len, part_size_limit): + s = [] + for p in range(0, total_byte_len, part_size_limit): + last = min(total_byte_len - 1, p + part_size_limit - 1) + s.append([p, last]) + return s + +# downloads files in chunks from gdrive +def do_gdrive_download(df, headers): + total_size = int(df.metadata.get('fileSize')) + download_url = df.metadata.get('downloadUrl') + s = partial(total_size, 1024 * 1024) # I'm downloading BIG files, so 100M chunk size is fine for me + + def stream(): + for byte in s: + headers = {"Range": 'bytes=%s-%s' % (byte[0], byte[1])} + resp, content = df.auth.Get_Http_Object().request(download_url, headers=headers) + if resp.status == 206: + yield content + else: + web.app.logger.info('An error occurred: %s' % resp) + return + return Response(stream_with_context(stream()), headers=headers) diff --git a/src/cps/helper.py b/src/cps/helper.py new file mode 100644 index 0000000..d74318b --- /dev/null +++ b/src/cps/helper.py @@ -0,0 +1,692 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import db +import ub +from flask import current_app as app +import logging +from tempfile import gettempdir +import sys +import os +import re +import unicodedata +from io import BytesIO +import worker +import time +from flask import send_from_directory, make_response, redirect, abort +from flask_babel import gettext as _ +from flask_login import current_user +from babel.dates import format_datetime +from datetime import datetime +import threading +import shutil +import requests +import zipfile +try: + import gdriveutils as gd +except ImportError: + pass +import web +import server +import random +import subprocess + +try: + import unidecode + use_unidecode = True +except ImportError: + use_unidecode = False + +# Global variables +updater_thread = None +global_WorkerThread = worker.WorkerThread() +global_WorkerThread.start() + + +def update_download(book_id, user_id): + check = ub.session.query(ub.Downloads).filter(ub.Downloads.user_id == user_id).filter(ub.Downloads.book_id == + book_id).first() + if not check: + new_download = ub.Downloads(user_id=user_id, book_id=book_id) + ub.session.add(new_download) + ub.session.commit() + +# Convert existing book entry to new format +def convert_book_format(book_id, calibrepath, old_book_format, new_book_format, user_id, kindle_mail=None): + book = db.session.query(db.Books).filter(db.Books.id == book_id).first() + data = db.session.query(db.Data).filter(db.Data.book == book.id).filter(db.Data.format == old_book_format).first() + if not data: + error_message = _(u"%(format)s format not found for book id: %(book)d", format=old_book_format, book=book_id) + app.logger.error("convert_book_format: " + error_message) + return error_message + if ub.config.config_use_google_drive: + df = gd.getFileFromEbooksFolder(book.path, data.name + "." + old_book_format.lower()) + if df: + datafile = os.path.join(calibrepath, book.path, data.name + u"." + old_book_format.lower()) + if not os.path.exists(os.path.join(calibrepath, book.path)): + os.makedirs(os.path.join(calibrepath, book.path)) + df.GetContentFile(datafile) + else: + error_message = _(u"%(format)s not found on Google Drive: %(fn)s", + format=old_book_format, fn=data.name + "." + old_book_format.lower()) + return error_message + file_path = os.path.join(calibrepath, book.path, data.name) + if os.path.exists(file_path + "." + old_book_format.lower()): + # read settings and append converter task to queue + if kindle_mail: + settings = ub.get_mail_settings() + settings['subject'] = _('Send to Kindle') # pretranslate Subject for e-mail + settings['body'] = _(u'This e-mail has been sent via Calibre-Web.') + # text = _(u"%(format)s: %(book)s", format=new_book_format, book=book.title) + else: + settings = dict() + text = (u"%s -> %s: %s" % (old_book_format, new_book_format, book.title)) + settings['old_book_format'] = old_book_format + settings['new_book_format'] = new_book_format + global_WorkerThread.add_convert(file_path, book.id, user_id, text, settings, kindle_mail) + return None + else: + error_message = _(u"%(format)s not found: %(fn)s", + format=old_book_format, fn=data.name + "." + old_book_format.lower()) + return error_message + + +def send_test_mail(kindle_mail, user_name): + global_WorkerThread.add_email(_(u'Calibre-Web test e-mail'),None, None, ub.get_mail_settings(), + kindle_mail, user_name, _(u"Test e-mail"), + _(u'This e-mail has been sent via Calibre-Web.')) + return + + +# Send registration email or password reset email, depending on parameter resend (False means welcome email) +def send_registration_mail(e_mail, user_name, default_password, resend=False): + text = "Hello %s!\r\n" % user_name + if not resend: + text += "Your new account at Calibre-Web has been created. Thanks for joining us!\r\n" + text += "Please log in to your account using the following informations:\r\n" + text += "User name: %s\n" % user_name + text += "Password: %s\r\n" % default_password + text += "Don't forget to change your password after first login.\r\n" + text += "Sincerely\r\n\r\n" + text += "Your Calibre-Web team" + global_WorkerThread.add_email(_(u'Get Started with Calibre-Web'),None, None, ub.get_mail_settings(), + e_mail, user_name, _(u"Registration e-mail for user: %(name)s", name=user_name), text) + return + +def check_send_to_kindle(entry): + """ + returns all available book formats for sending to Kindle + """ + if len(entry.data): + bookformats=list() + if ub.config.config_ebookconverter == 0: + # no converter - only for mobi and pdf formats + for ele in iter(entry.data): + if 'MOBI' in ele.format: + bookformats.append({'format':'Mobi','convert':0,'text':_('Send %(format)s to Kindle',format='Mobi')}) + if 'PDF' in ele.format: + bookformats.append({'format':'Pdf','convert':0,'text':_('Send %(format)s to Kindle',format='Pdf')}) + if 'AZW' in ele.format: + bookformats.append({'format':'Azw','convert':0,'text':_('Send %(format)s to Kindle',format='Azw')}) + if 'AZW3' in ele.format: + bookformats.append({'format':'Azw3','convert':0,'text':_('Send %(format)s to Kindle',format='Azw3')}) + else: + formats = list() + for ele in iter(entry.data): + formats.append(ele.format) + if 'MOBI' in formats: + bookformats.append({'format': 'Mobi','convert':0,'text':_('Send %(format)s to Kindle',format='Mobi')}) + if 'AZW' in formats: + bookformats.append({'format': 'Azw','convert':0,'text':_('Send %(format)s to Kindle',format='Azw')}) + if 'AZW3' in formats: + bookformats.append({'format': 'Azw3','convert':0,'text':_('Send %(format)s to Kindle',format='Azw3')}) + if 'PDF' in formats: + bookformats.append({'format': 'Pdf','convert':0,'text':_('Send %(format)s to Kindle',format='Pdf')}) + if ub.config.config_ebookconverter >= 1: + if 'EPUB' in formats and not 'MOBI' in formats: + bookformats.append({'format': 'Mobi','convert':1, + 'text':_('Convert %(orig)s to %(format)s and send to Kindle',orig='Epub',format='Mobi')}) + if ub.config.config_ebookconverter == 2: + if 'EPUB' in formats and not 'AZW3' in formats: + bookformats.append({'format': 'Azw3','convert':1, + 'text':_('Convert %(orig)s to %(format)s and send to Kindle',orig='Epub',format='Azw3')}) + return bookformats + else: + app.logger.error(u'Cannot find book entry %d', entry.id) + return None + + +# Check if a reader is existing for any of the book formats, if not, return empty list, otherwise return +# list with supported formats +def check_read_formats(entry): + EXTENSIONS_READER = {'TXT', 'PDF', 'EPUB', 'ZIP', 'CBZ', 'TAR', 'CBT', 'RAR', 'CBR'} + bookformats = list() + if len(entry.data): + for ele in iter(entry.data): + if ele.format in EXTENSIONS_READER: + bookformats.append(ele.format.lower()) + return bookformats + + +# Files are processed in the following order/priority: +# 1: If Mobi file is existing, it's directly send to kindle email, +# 2: If Epub file is existing, it's converted and send to kindle email, +# 3: If Pdf file is existing, it's directly send to kindle email +def send_mail(book_id, book_format, convert, kindle_mail, calibrepath, user_id): + """Send email with attachments""" + book = db.session.query(db.Books).filter(db.Books.id == book_id).first() + + if convert: + # returns None if success, otherwise errormessage + return convert_book_format(book_id, calibrepath, u'epub', book_format.lower(), user_id, kindle_mail) + else: + for entry in iter(book.data): + if entry.format.upper() == book_format.upper(): + result = entry.name + '.' + book_format.lower() + global_WorkerThread.add_email(_(u"Send to Kindle"), book.path, result, ub.get_mail_settings(), + kindle_mail, user_id, _(u"E-mail: %(book)s", book=book.title), + _(u'This e-mail has been sent via Calibre-Web.')) + return + return _(u"The requested file could not be read. Maybe wrong permissions?") + + +def get_valid_filename(value, replace_whitespace=True): + """ + Returns the given string converted to a string that can be used for a clean + filename. Limits num characters to 128 max. + """ + if value[-1:] == u'.': + value = value[:-1]+u'_' + value = value.replace("/", "_").replace(":", "_").strip('\0') + if use_unidecode: + value = (unidecode.unidecode(value)).strip() + else: + value = value.replace(u'§', u'SS') + value = value.replace(u'ß', u'ss') + value = unicodedata.normalize('NFKD', value) + re_slugify = re.compile('[\W\s-]', re.UNICODE) + if isinstance(value, str): # Python3 str, Python2 unicode + value = re_slugify.sub('', value).strip() + else: + value = unicode(re_slugify.sub('', value).strip()) + if replace_whitespace: + # *+:\"/<>? are replaced by _ + value = re.sub(r'[\*\+:\\\"/<>\?]+', u'_', value, flags=re.U) + # pipe has to be replaced with comma + value = re.sub(r'[\|]+', u',', value, flags=re.U) + value = value[:128] + if not value: + raise ValueError("Filename cannot be empty") + return value + + +def get_sorted_author(value): + try: + if ',' not in value: + regexes = ["^(JR|SR)\.?$", "^I{1,3}\.?$", "^IV\.?$"] + combined = "(" + ")|(".join(regexes) + ")" + value = value.split(" ") + if re.match(combined, value[-1].upper()): + value2 = value[-2] + ", " + " ".join(value[:-2]) + " " + value[-1] + elif len(value) == 1: + value2 = value[0] + else: + value2 = value[-1] + ", " + " ".join(value[:-1]) + else: + value2 = value + except Exception: + web.app.logger.error("Sorting author " + str(value) + "failed") + value2 = value + return value2 + + +# Deletes a book fro the local filestorage, returns True if deleting is successfull, otherwise false +def delete_book_file(book, calibrepath, book_format=None): + # check that path is 2 elements deep, check that target path has no subfolders + if book.path.count('/') == 1: + path = os.path.join(calibrepath, book.path) + if book_format: + for file in os.listdir(path): + if file.upper().endswith("."+book_format): + os.remove(os.path.join(path, file)) + else: + if os.path.isdir(path): + if len(next(os.walk(path))[1]): + web.app.logger.error( + "Deleting book " + str(book.id) + " failed, path has subfolders: " + book.path) + return False + shutil.rmtree(path, ignore_errors=True) + return True + else: + web.app.logger.error("Deleting book " + str(book.id) + " failed, book path not valid: " + book.path) + return False + + +def update_dir_structure_file(book_id, calibrepath): + localbook = db.session.query(db.Books).filter(db.Books.id == book_id).first() + path = os.path.join(calibrepath, localbook.path) + + authordir = localbook.path.split('/')[0] + new_authordir = get_valid_filename(localbook.authors[0].name) + + titledir = localbook.path.split('/')[1] + new_titledir = get_valid_filename(localbook.title) + " (" + str(book_id) + ")" + + if titledir != new_titledir: + try: + new_title_path = os.path.join(os.path.dirname(path), new_titledir) + if not os.path.exists(new_title_path): + os.renames(path, new_title_path) + else: + web.app.logger.info("Copying title: " + path + " into existing: " + new_title_path) + for dir_name, subdir_list, file_list in os.walk(path): + for file in file_list: + os.renames(os.path.join(dir_name, file), os.path.join(new_title_path + dir_name[len(path):], file)) + path = new_title_path + localbook.path = localbook.path.split('/')[0] + '/' + new_titledir + except OSError as ex: + web.app.logger.error("Rename title from: " + path + " to " + new_title_path + ": " + str(ex)) + web.app.logger.debug(ex, exc_info=True) + return _("Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s", src=path, dest=new_title_path, error=str(ex)) + if authordir != new_authordir: + try: + new_author_path = os.path.join(os.path.join(calibrepath, new_authordir), os.path.basename(path)) + os.renames(path, new_author_path) + localbook.path = new_authordir + '/' + localbook.path.split('/')[1] + except OSError as ex: + web.app.logger.error("Rename author from: " + path + " to " + new_author_path + ": " + str(ex)) + web.app.logger.debug(ex, exc_info=True) + return _("Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s", src=path, dest=new_author_path, error=str(ex)) + return False + + +def update_dir_structure_gdrive(book_id): + error = False + book = db.session.query(db.Books).filter(db.Books.id == book_id).first() + + authordir = book.path.split('/')[0] + new_authordir = get_valid_filename(book.authors[0].name) + titledir = book.path.split('/')[1] + new_titledir = get_valid_filename(book.title) + " (" + str(book_id) + ")" + + if titledir != new_titledir: + gFile = gd.getFileFromEbooksFolder(os.path.dirname(book.path), titledir) + if gFile: + gFile['title'] = new_titledir + + gFile.Upload() + book.path = book.path.split('/')[0] + '/' + new_titledir + gd.updateDatabaseOnEdit(gFile['id'], book.path) # only child folder affected + else: + error = _(u'File %(file)s not found on Google Drive', file= book.path) # file not found + + if authordir != new_authordir: + gFile = gd.getFileFromEbooksFolder(os.path.dirname(book.path), titledir) + if gFile: + gd.moveGdriveFolderRemote(gFile,new_authordir) + book.path = new_authordir + '/' + book.path.split('/')[1] + gd.updateDatabaseOnEdit(gFile['id'], book.path) + else: + error = _(u'File %(file)s not found on Google Drive', file=authordir) # file not found + return error + + +def delete_book_gdrive(book, book_format): + error= False + if book_format: + name = '' + for entry in book.data: + if entry.format.upper() == book_format: + name = entry.name + '.' + book_format + gFile = gd.getFileFromEbooksFolder(book.path, name) + else: + gFile = gd.getFileFromEbooksFolder(os.path.dirname(book.path),book.path.split('/')[1]) + if gFile: + gd.deleteDatabaseEntry(gFile['id']) + gFile.Trash() + else: + error =_(u'Book path %(path)s not found on Google Drive', path=book.path) # file not found + return error + + +def generate_random_password(): + s = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%&*()?" + passlen = 8 + return "".join(random.sample(s,passlen )) + +################################## External interface + +def update_dir_stucture(book_id, calibrepath): + if ub.config.config_use_google_drive: + return update_dir_structure_gdrive(book_id) + else: + return update_dir_structure_file(book_id, calibrepath) + + +def delete_book(book, calibrepath, book_format): + if ub.config.config_use_google_drive: + return delete_book_gdrive(book, book_format) + else: + return delete_book_file(book, calibrepath, book_format) + + +def get_book_cover(cover_path): + if ub.config.config_use_google_drive: + try: + path=gd.get_cover_via_gdrive(cover_path) + if path: + return redirect(path) + else: + web.app.logger.error(cover_path + '/cover.jpg not found on Google Drive') + return send_from_directory(os.path.join(os.path.dirname(__file__), "static"), "generic_cover.jpg") + except Exception as e: + web.app.logger.error("Error Message: "+e.message) + web.app.logger.exception(e) + # traceback.print_exc() + return send_from_directory(os.path.join(os.path.dirname(__file__), "static"),"generic_cover.jpg") + else: + return send_from_directory(os.path.join(ub.config.config_calibre_dir, cover_path), "cover.jpg") + + +# saves book cover to gdrive or locally +def save_cover(url, book_path): + img = requests.get(url) + if img.headers.get('content-type') != 'image/jpeg': + web.app.logger.error("Cover is no jpg file, can't save") + return False + + if ub.config.config_use_google_drive: + tmpDir = gettempdir() + f = open(os.path.join(tmpDir, "uploaded_cover.jpg"), "wb") + f.write(img.content) + f.close() + gd.uploadFileToEbooksFolder(os.path.join(book_path, 'cover.jpg'), os.path.join(tmpDir, f.name)) + web.app.logger.info("Cover is saved on Google Drive") + return True + + f = open(os.path.join(ub.config.config_calibre_dir, book_path, "cover.jpg"), "wb") + f.write(img.content) + f.close() + web.app.logger.info("Cover is saved") + return True + + +def do_download_file(book, book_format, data, headers): + if ub.config.config_use_google_drive: + startTime = time.time() + df = gd.getFileFromEbooksFolder(book.path, data.name + "." + book_format) + web.app.logger.debug(time.time() - startTime) + if df: + return gd.do_gdrive_download(df, headers) + else: + abort(404) + else: + filename = os.path.join(ub.config.config_calibre_dir, book.path) + if not os.path.isfile(os.path.join(filename, data.name + "." + book_format)): + # ToDo: improve error handling + web.app.logger.error('File not found: %s' % os.path.join(filename, data.name + "." + book_format)) + response = make_response(send_from_directory(filename, data.name + "." + book_format)) + response.headers = headers + return response + +################################## + + +class Updater(threading.Thread): + + def __init__(self): + threading.Thread.__init__(self) + self.status = 0 + + def run(self): + try: + self.status = 1 + r = requests.get('https://api.github.com/repos/janeczku/calibre-web/zipball/master', stream=True) + r.raise_for_status() + + fname = re.findall("filename=(.+)", r.headers['content-disposition'])[0] + self.status = 2 + z = zipfile.ZipFile(BytesIO(r.content)) + self.status = 3 + tmp_dir = gettempdir() + z.extractall(tmp_dir) + self.status = 4 + self.update_source(os.path.join(tmp_dir, os.path.splitext(fname)[0]), ub.config.get_main_dir) + self.status = 6 + time.sleep(2) + server.Server.setRestartTyp(True) + server.Server.stopServer() + self.status = 7 + time.sleep(2) + except requests.exceptions.HTTPError as ex: + logging.getLogger('cps.web').info( u'HTTP Error' + ' ' + str(ex)) + self.status = 8 + except requests.exceptions.ConnectionError: + logging.getLogger('cps.web').info(u'Connection error') + self.status = 9 + except requests.exceptions.Timeout: + logging.getLogger('cps.web').info(u'Timeout while establishing connection') + self.status = 10 + except requests.exceptions.RequestException: + self.status = 11 + logging.getLogger('cps.web').info(u'General error') + + def get_update_status(self): + return self.status + + @classmethod + def file_to_list(self, filelist): + return [x.strip() for x in open(filelist, 'r') if not x.startswith('#EXT')] + + @classmethod + def one_minus_two(self, one, two): + return [x for x in one if x not in set(two)] + + @classmethod + def reduce_dirs(self, delete_files, new_list): + new_delete = [] + for filename in delete_files: + parts = filename.split(os.sep) + sub = '' + for part in parts: + sub = os.path.join(sub, part) + if sub == '': + sub = os.sep + count = 0 + for song in new_list: + if song.startswith(sub): + count += 1 + break + if count == 0: + if sub != '\\': + new_delete.append(sub) + break + return list(set(new_delete)) + + @classmethod + def reduce_files(self, remove_items, exclude_items): + rf = [] + for item in remove_items: + if not item.startswith(exclude_items): + rf.append(item) + return rf + + @classmethod + def moveallfiles(self, root_src_dir, root_dst_dir): + change_permissions = True + if sys.platform == "win32" or sys.platform == "darwin": + change_permissions = False + else: + logging.getLogger('cps.web').debug('Update on OS-System : ' + sys.platform) + new_permissions = os.stat(root_dst_dir) + # print new_permissions + for src_dir, __, files in os.walk(root_src_dir): + dst_dir = src_dir.replace(root_src_dir, root_dst_dir, 1) + if not os.path.exists(dst_dir): + os.makedirs(dst_dir) + logging.getLogger('cps.web').debug('Create-Dir: '+dst_dir) + if change_permissions: + # print('Permissions: User '+str(new_permissions.st_uid)+' Group '+str(new_permissions.st_uid)) + os.chown(dst_dir, new_permissions.st_uid, new_permissions.st_gid) + for file_ in files: + src_file = os.path.join(src_dir, file_) + dst_file = os.path.join(dst_dir, file_) + if os.path.exists(dst_file): + if change_permissions: + permission = os.stat(dst_file) + logging.getLogger('cps.web').debug('Remove file before copy: '+dst_file) + os.remove(dst_file) + else: + if change_permissions: + permission = new_permissions + shutil.move(src_file, dst_dir) + logging.getLogger('cps.web').debug('Move File '+src_file+' to '+dst_dir) + if change_permissions: + try: + os.chown(dst_file, permission.st_uid, permission.st_gid) + except (Exception) as e: + # ex = sys.exc_info() + old_permissions = os.stat(dst_file) + logging.getLogger('cps.web').debug('Fail change permissions of ' + str(dst_file) + '. Before: ' + + str(old_permissions.st_uid) + ':' + str(old_permissions.st_gid) + ' After: ' + + str(permission.st_uid) + ':' + str(permission.st_gid) + ' error: '+str(e)) + return + + def update_source(self, source, destination): + # destination files + old_list = list() + exclude = ( + 'vendor' + os.sep + 'kindlegen.exe', 'vendor' + os.sep + 'kindlegen', os.sep + 'app.db', + os.sep + 'vendor', os.sep + 'calibre-web.log') + for root, dirs, files in os.walk(destination, topdown=True): + for name in files: + old_list.append(os.path.join(root, name).replace(destination, '')) + for name in dirs: + old_list.append(os.path.join(root, name).replace(destination, '')) + # source files + new_list = list() + for root, dirs, files in os.walk(source, topdown=True): + for name in files: + new_list.append(os.path.join(root, name).replace(source, '')) + for name in dirs: + new_list.append(os.path.join(root, name).replace(source, '')) + + delete_files = self.one_minus_two(old_list, new_list) + + rf = self.reduce_files(delete_files, exclude) + + remove_items = self.reduce_dirs(rf, new_list) + + self.moveallfiles(source, destination) + + for item in remove_items: + item_path = os.path.join(destination, item[1:]) + if os.path.isdir(item_path): + logging.getLogger('cps.web').debug("Delete dir " + item_path) + shutil.rmtree(item_path) + else: + try: + logging.getLogger('cps.web').debug("Delete file " + item_path) + # log_from_thread("Delete file " + item_path) + os.remove(item_path) + except Exception: + logging.getLogger('cps.web').debug("Could not remove:" + item_path) + shutil.rmtree(source, ignore_errors=True) + + +def check_unrar(unrarLocation): + error = False + if os.path.exists(unrarLocation): + try: + if sys.version_info < (3, 0): + unrarLocation = unrarLocation.encode(sys.getfilesystemencoding()) + p = subprocess.Popen(unrarLocation, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + p.wait() + for lines in p.stdout.readlines(): + if isinstance(lines, bytes): + lines = lines.decode('utf-8') + value=re.search('UNRAR (.*) freeware', lines) + if value: + version = value.group(1) + except OSError as e: + error = True + web.app.logger.exception(e) + version =_(u'Error excecuting UnRar') + else: + version = _(u'Unrar binary file not found') + error=True + return (error, version) + + +def is_sha1(sha1): + if len(sha1) != 40: + return False + try: + int(sha1, 16) + except ValueError: + return False + return True + + +def get_current_version_info(): + content = {} + content[0] = '$Format:%H$' + content[1] = '$Format:%cI$' + # content[0] = 'bb7d2c6273ae4560e83950d36d64533343623a57' + # content[1] = '2018-09-09T10:13:08+02:00' + if is_sha1(content[0]) and len(content[1]) > 0: + return {'hash': content[0], 'datetime': content[1]} + return False + + +def json_serial(obj): + """JSON serializer for objects not serializable by default json code""" + + if isinstance(obj, (datetime)): + return obj.isoformat() + raise TypeError ("Type %s not serializable" % type(obj)) + + +def render_task_status(tasklist): + #helper function to apply localize status information in tasklist entries + renderedtasklist=list() + # task2 = task + for task in tasklist: + if task['user'] == current_user.nickname or current_user.role_admin(): + # task2 = copy.deepcopy(task) # = task + if task['formStarttime']: + task['starttime'] = format_datetime(task['formStarttime'], format='short', locale=web.get_locale()) + # task2['formStarttime'] = "" + else: + if 'starttime' not in task: + task['starttime'] = "" + + # localize the task status + if isinstance( task['stat'], int ): + if task['stat'] == worker.STAT_WAITING: + task['status'] = _(u'Waiting') + elif task['stat'] == worker.STAT_FAIL: + task['status'] = _(u'Failed') + elif task['stat'] == worker.STAT_STARTED: + task['status'] = _(u'Started') + elif task['stat'] == worker.STAT_FINISH_SUCCESS: + task['status'] = _(u'Finished') + else: + task['status'] = _(u'Unknown Status') + + # localize the task type + if isinstance( task['taskType'], int ): + if task['taskType'] == worker.TASK_EMAIL: + task['taskMessage'] = _(u'E-mail: ') + task['taskMess'] + elif task['taskType'] == worker.TASK_CONVERT: + task['taskMessage'] = _(u'Convert: ') + task['taskMess'] + elif task['taskType'] == worker.TASK_UPLOAD: + task['taskMessage'] = _(u'Upload: ') + task['taskMess'] + elif task['taskType'] == worker.TASK_CONVERT_ANY: + task['taskMessage'] = _(u'Convert: ') + task['taskMess'] + else: + task['taskMessage'] = _(u'Unknown Task: ') + task['taskMess'] + + renderedtasklist.append(task) + + return renderedtasklist diff --git a/src/cps/redirect.py b/src/cps/redirect.py new file mode 100644 index 0000000..b521bc2 --- /dev/null +++ b/src/cps/redirect.py @@ -0,0 +1,28 @@ +# http://flask.pocoo.org/snippets/62/ + +try: + from urllib.parse import urlparse, urljoin +except ImportError: + from urlparse import urlparse, urljoin +from flask import request, url_for, redirect + + +def is_safe_url(target): + ref_url = urlparse(request.host_url) + test_url = urlparse(urljoin(request.host_url, target)) + return test_url.scheme in ('http', 'https') and ref_url.netloc == test_url.netloc + + +def get_redirect_target(): + for target in request.values.get('next'), request.referrer: + if not target: + continue + if is_safe_url(target): + return target + + +def redirect_back(endpoint, **values): + target = request.form['next'] + if not target or not is_safe_url(target): + target = url_for(endpoint, **values) + return redirect(target) diff --git a/src/cps/reverseproxy.py b/src/cps/reverseproxy.py new file mode 100644 index 0000000..db2c4a3 --- /dev/null +++ b/src/cps/reverseproxy.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +class ReverseProxied(object): + """Wrap the application in this middleware and configure the + front-end server to add these headers, to let you quietly bind + this to a URL other than / and to an HTTP scheme that is + different than what is used locally. + + Code courtesy of: http://flask.pocoo.org/snippets/35/ + + In nginx: + location /myprefix { + proxy_pass http://127.0.0.1:8083; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Scheme $scheme; + proxy_set_header X-Script-Name /myprefix; + } + """ + + def __init__(self, application): + self.app = application + + def __call__(self, environ, start_response): + script_name = environ.get('HTTP_X_SCRIPT_NAME', '') + if script_name: + environ['SCRIPT_NAME'] = script_name + path_info = environ.get('PATH_INFO', '') + if path_info and path_info.startswith(script_name): + environ['PATH_INFO'] = path_info[len(script_name):] + + scheme = environ.get('HTTP_X_SCHEME', '') + if scheme: + environ['wsgi.url_scheme'] = scheme + servr = environ.get('HTTP_X_FORWARDED_SERVER', '') + if servr: + environ['HTTP_HOST'] = servr + return self.app(environ, start_response) diff --git a/src/cps/server.py b/src/cps/server.py new file mode 100644 index 0000000..9e5165b --- /dev/null +++ b/src/cps/server.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from socket import error as SocketError +import sys +import os +import signal +import web + +try: + from gevent.pywsgi import WSGIServer + from gevent.pool import Pool + from gevent import __version__ as geventVersion + gevent_present = True +except ImportError: + from tornado.wsgi import WSGIContainer + from tornado.httpserver import HTTPServer + from tornado.ioloop import IOLoop + from tornado import version as tornadoVersion + gevent_present = False + + +class server: + + wsgiserver = None + restart= False + + def __init__(self): + signal.signal(signal.SIGINT, self.killServer) + signal.signal(signal.SIGTERM, self.killServer) + + def start_gevent(self): + try: + ssl_args = dict() + certfile_path = web.ub.config.get_config_certfile() + keyfile_path = web.ub.config.get_config_keyfile() + if certfile_path and keyfile_path: + if os.path.isfile(certfile_path) and os.path.isfile(keyfile_path): + ssl_args = {"certfile": certfile_path, + "keyfile": keyfile_path} + else: + web.app.logger.info('The specified paths for the ssl certificate file and/or key file seem to be broken. Ignoring ssl. Cert path: %s | Key path: %s' % (certfile_path, keyfile_path)) + if os.name == 'nt': + self.wsgiserver= WSGIServer(('0.0.0.0', web.ub.config.config_port), web.app, spawn=Pool(), **ssl_args) + else: + self.wsgiserver = WSGIServer(('', web.ub.config.config_port), web.app, spawn=Pool(), **ssl_args) + self.wsgiserver.serve_forever() + except SocketError: + try: + web.app.logger.info('Unable to listen on \'\', trying on IPv4 only...') + self.wsgiserver = WSGIServer(('0.0.0.0', web.ub.config.config_port), web.app, spawn=Pool(), **ssl_args) + self.wsgiserver.serve_forever() + except (OSError, SocketError) as e: + web.app.logger.info("Error starting server: %s" % e.strerror) + print("Error starting server: %s" % e.strerror) + web.helper.global_WorkerThread.stop() + sys.exit(1) + except Exception: + web.app.logger.info("Unknown error while starting gevent") + + def startServer(self): + if gevent_present: + web.app.logger.info('Starting Gevent server') + # leave subprocess out to allow forking for fetchers and processors + self.start_gevent() + else: + try: + ssl = None + web.app.logger.info('Starting Tornado server') + certfile_path = web.ub.config.get_config_certfile() + keyfile_path = web.ub.config.get_config_keyfile() + if certfile_path and keyfile_path: + if os.path.isfile(certfile_path) and os.path.isfile(keyfile_path): + ssl = {"certfile": certfile_path, + "keyfile": keyfile_path} + else: + web.app.logger.info('The specified paths for the ssl certificate file and/or key file seem to be broken. Ignoring ssl. Cert path: %s | Key path: %s' % (certfile_path, keyfile_path)) + + # Max Buffersize set to 200MB + http_server = HTTPServer(WSGIContainer(web.app), + max_buffer_size = 209700000, + ssl_options=ssl) + http_server.listen(web.ub.config.config_port) + self.wsgiserver=IOLoop.instance() + self.wsgiserver.start() + # wait for stop signal + self.wsgiserver.close(True) + except SocketError as e: + web.app.logger.info("Error starting server: %s" % e.strerror) + print("Error starting server: %s" % e.strerror) + web.helper.global_WorkerThread.stop() + sys.exit(1) + + if self.restart == True: + web.app.logger.info("Performing restart of Calibre-Web") + web.helper.global_WorkerThread.stop() + if os.name == 'nt': + arguments = ["\"" + sys.executable + "\""] + for e in sys.argv: + arguments.append("\"" + e + "\"") + os.execv(sys.executable, arguments) + else: + os.execl(sys.executable, sys.executable, *sys.argv) + else: + web.app.logger.info("Performing shutdown of Calibre-Web") + web.helper.global_WorkerThread.stop() + sys.exit(0) + + def setRestartTyp(self,starttyp): + self.restart=starttyp + + def killServer(self, signum, frame): + self.stopServer() + + def stopServer(self): + if self.wsgiserver: + if gevent_present: + self.wsgiserver.close() + else: + self.wsgiserver.add_callback(self.wsgiserver.stop) + + @staticmethod + def getNameVersion(): + if gevent_present: + return {'Gevent':'v'+geventVersion} + else: + return {'Tornado':'v'+tornadoVersion} + + +# Start Instance of Server +Server=server() diff --git a/src/cps/static/css/caliBlur-style.css b/src/cps/static/css/caliBlur-style.css new file mode 100644 index 0000000..ddff69b --- /dev/null +++ b/src/cps/static/css/caliBlur-style.css @@ -0,0 +1,2292 @@ +#have_read_form { + width: 1px; + height: 1px; + position: fixed; + top: 5px; + right: 185px; +} +#have_read_form input[type="checkbox" i] { + visibility: hidden; +} +#have_read_form input[type="checkbox" i]:hover:before { + cursor: pointer; + color: #fff; +} +#have_read_form input[type="checkbox" i]:before { + content: "\e106"; + position: fixed; + width: 60px; + height: 60px; + background: transparent; + top: 0; + right: 180px; + visibility: visible; + border-right: 2px solid rgba(0,0,0,.3); + border-left: 2px solid rgba(0,0,0,.3); + padding: 20px 39px 40px 19px; + color: hsla(0,0%,100%,.7); + z-index: 999; +} +#have_read_form input[type="checkbox" i]:checked:before { + content: "\e105"; + position: fixed; + width: 60px; + height: 60px; + background: transparent; + top: 0; + right: 180px; + visibility: visible; + color: var(--color-primary); + padding: 20px 39px 40px 19px; + z-index: 999; +} +.col-sm-10 #have_read_form input[type="checkbox" i]:before, +.col-sm-10 #have_read_form input[type="checkbox" i]:checked:before { + top: 60px; +} +#have_read_form input[type="checkbox" i]:checked:hover:before { + color: #fff; +} +#have_read_form span { + display: none; +} +#have_read_cb { + + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-size: 18px; + font-weight: 400; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.book { + width: 225px; + max-width: 225px; +} + +#infscr-loading img { + display: none; +} +#infscr-loading:before { + content: ''; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border: 2px solid transparent; + border-radius: 50%; + border-top: 2px solid var(--color-secondary); + width: 24px; + height: 24px; + -webkit-animation: spin 0.5s linear infinite; + animation: spin 0.5s linear infinite; + display: block; + margin: 20px auto; + position: fixed; + top: calc(50% - 12px); + left: calc(50% - 12px); + z-index: 999999; +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} +@keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +a { + color: hsla(0, 0%, 100%, .45); +} +a:hover { + transition: color 0.2s; + color: #fff; +} +body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a { + margin: 60px auto auto !important; + width: 240px; + height: 60px; + text-align: center; + color: var(--color-primary) !important; + line-height: 60px; + padding-top: 0; + font-size: 15px; + font-family: Open Sans Bold,Helvetica Neue,Helvetica,Arial,sans-serif; + font-stretch: normal; + font-style: normal; + font-variant-caps: normal; + font-variant-ligatures: normal; + font-variant-numeric: normal; + font-weight: 600; + letter-spacing: normal; + text-shadow: none; + text-size-adjust: 100%; + text-transform: none; + user-select: none; + word-spacing: 0; + writing-mode: horizontal-tb; + -webkit-box-direction: normal; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + padding-bottom: 0; + padding-left: 40px; + padding-right: 40px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + background: rgba(0,0,0,.45); +} +body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a:before { + background: url("https://raw.githubusercontent.com/leram84/layer.Cake/master/Resources/home-gray.png"); + background-size: cover; + background-repeat: no-repeat; + position: absolute; + display: block; + overflow: visible; + width: 25px; + height: 25px; + top: 16.5px; + left: 18px; + content: ''; +} +body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a:hover:after { + background: url("https://raw.githubusercontent.com/leram84/layer.Cake/master/Resources/home-white.png"); + background-size: cover; + background-repeat: no-repeat; + position: absolute; + display: block; + overflow: visible; + width: 25px; + height: 25px; + top: 16.5px; + left: 18px; + content: ''; +} +/* body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-header > a:hover { + background: rgba(0,0,0,.45); + color: #fff !important; +} */ + :root { + --color-background: #474747; + --color-primary: #F9BE03; + --color-secondary: #CC7B19; + --color-secondary-hover: #E59029; +} +/* Root For Emby */ +/* :root { + --color-background: #333333; + --color-primary: #22aadc; + --color-secondary: #52b54b; + --color-secondary-hover: #71c26b; +} color: hsla(0,0%,100%,.45);*/ + +/* Blur Background */ +body { + background-image: url(https://raw.githubusercontent.com/leram84/layer.Cake/master/Resources/blur-noise.png), url("https://raw.githubusercontent.com/leram84/layer.Cake/master/Resources/blur-light.png") !important; + background-repeat: repeat, no-repeat !important; + background-attachment: fixed, fixed !important; + background-position: center center, center center !important; + background-size: auto, cover !important; + -webkit-background-size: auto, cover !important; + -moz-background-size: auto, cover !important; + -o-background-size: auto, cover !important; +} +.navbar-default { + background-color: rgba(0,0,0,.7) !important; + border: none; + position: fixed; + width: 100%; + height: 60px; + z-index: -9; +} +body { + background: url(https://raw.githubusercontent.com/leram84/layer.Cake/master/Resources/blur-noise.png), var(--color-background); + color: hsla(0, 0%, 100%, .45); + font-family: Open Sans Regular, Helvetica Neue, Helvetica, Arial, sans-serif; + font-weight: 600; + overflow: hidden; + margin: 0; +} +body > div.navbar.navbar-default.navbar-static-top > div > form > div { + width: 360px; +} +#btn-upload { + min-width: 1px; + min-height: 1px; + width: 60px; + height: 60px; + left: 0; + line-height: 1; + font-size: 1px; +} +#btn-upload:hover { + cursor: pointer !important; +} +#main-nav > li:nth-child(1) { + float: right; + +} +#form-upload { + position: relative; + float: right; + width: 60px; + margin: 0; + padding: 0; + height: 60px; + margin-right: 0; +} + +#form-upload .form-group .btn { + color: rgba(0,0,0,0); + background: transparent; + border: 0; + text-transform: uppercase; + font-weight: 600; + margin: 0; + padding: 0; + height: 60px; +} +#form-upload:hover .form-group .btn:after { + color: var(--color-secondary-hover); +} +#form-upload:hover .form-group .btn:before { + -webkit-box-shadow: inset 0 0 0 2px #fff; + box-shadow: inset 0 0 0 2px #fff; + background: var(--color-secondary-hover); + color: #fff; +} +#form-upload .form-group .btn:before { + content: "\e043"; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: 400; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: #eee; + font-size: 20px; + background: var(--color-secondary); + border-radius: 50%; + line-height: 35px; + width: 35px; + height: 35px; + position: fixed; + top: 12.5px; + right: 25px; + margin: 0; + padding: 0 2px 0 0; + z-index: -9; +} +#form-upload .form-group .btn:after { + content: "+"; + font-size: 14px; + color: var(--color-secondary); + background: transparent; + border-radius: 50%; + padding: 0; + z-index: 9; + position: fixed; + line-height: 12px; + width: 12px; + height: 12px; + top: 26px; + right: 38px; + /* + content: "+"; + font-size: 14px; + color: #fff; + background: var(--color-secondary); + border-radius: 50%; + padding: 0; + z-index: 9; + position: fixed; + line-height: 14px; + width: 14px; + height: 14px; + top: 10px; + right: 20px; + */ +} +.form-control { + background-image: none; + display: block; + width: 100%; + height: 38px; + padding: 6px 12px; + font-weight: 100; + font-family: "Open Sans Semibold", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px !important; + font-stretch: 100%; + font-style: normal; + font-variant-caps: normal; + font-variant-east-asian: normal; + font-variant-ligatures: normal; + font-variant-numeric: normal; + font-weight: 400; + letter-spacing: normal; + line-height: 22.2857px !important; + color: #eee; + vertical-align: middle; + background-color: hsla(0, 0%, 100%, .25); + border-radius: 3px; + border: 0 !important; + -webkit-box-shadow: none; + box-shadow: none; + -webkit-transition: background-color 0.2s; + transition: background-color 0.2s; +} +.form-control:focus { + border-color: transparent; + outline: 0; + -webkit-box-shadow: none; + box-shadow: none; + background: #eee !important; + color: #555; +} +.form-control.tt-hint { + background: hsla(0, 0%, 100%, .25) !important; +} + +body > div.navbar.navbar-default.navbar-static-top > div > form > div > span > button { + background-color: hsla(0, 0%, 100%, .25); + color: #eee; + border: none; + +} + +body > div.navbar.navbar-default.navbar-static-top > div > form { + margin-left: -167px; + padding: 0; + margin-top: 15px; + margin-bottom: 15px; +} +body > div.navbar.navbar-default.navbar-static-top > div > form > .form-group > input { + border-radius: 4px 0 0 4px; +} +#main-nav { + margin-right: 15px; +} +body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul { + height: 60px; + +} +body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li { + height: 60px; + +} +body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul > li > a { + height: 60px; + padding: 20px 10px; + color: #999; +} +body > div.navbar.navbar-default.navbar-static-top > div > div.navbar-collapse.collapse > ul:nth-child(1) {} +.author > a:hover { + color: #fff !important; +} +.row { + margin: 0; +} +body > div.container-fluid > div > div.col-sm-10 > div > form > h2 { + font-size: 15px; + color: var(--color-primary); + border-top: 1px solid rgba(0,0,0,.3); + padding-top: 60px; + margin-top: 50px; + margin-bottom: 30px; +} +/* clean up */ +.navigation .nav-head:nth-child(1n+2) { + border-top: none; + padding-top: 0; +} +.btn-default { + border-color: var(--color-secondary); + color: #fff; + background-color: var(--color-secondary); + -webkit-transition: background-color 0.1s; + transition: background-color 0.1s; +} +.btn-default:hover { + border-color: var(--color-secondary-hover); + color: #fff; + background-color: var(--color-secondary-hover); +} +body > div.container-fluid > div > div.col-sm-10 > div > form > a { + background-color: hsla(0,0%,100%,.25); + color: #fff; +} +body > div.container-fluid > div > div.col-sm-10 > div > form > a:hover { + background-color: hsla(0,0%,100%,.3); + color: #fff; +} +.btn { + display: inline-block; + padding: 6px 16px; + font-family: Open Sans Bold,Helvetica Neue,Helvetica,Arial,sans-serif; + text-transform: uppercase; + border: 0; + margin-bottom: 0; + font-size: 14px; + font-weight: 400; + line-height: 1.71428571; + text-align: center; + vertical-align: middle; + cursor: pointer; + border-radius: 3px; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + -o-user-select: none; + user-select: none; +} +.btn-primary { + color: #fff; + background-color: hsla(0,0%,100%,.25); + border-color: hsla(0,0%,100%,.25); +} +.btn-primary:hover { + background-color: hsla(0,0%,100%,.3); + border-color: hsla(0,0%,100%,.3); +} +.btn-default.focus, .btn-default:focus { + border-color: var(--color-secondary-hover); + color: #fff; + background-color: var(--color-secondary-hover); +} +.btn-default.active, .btn-default:active, .open>.dropdown-toggle.btn-default { + border-color: var(--color-secondary-hover); + color: #fff; + background-color: var(--color-secondary-hover); +} + +.form-group > label { + font-weight: 100; + color: #fff; +} +.navbar > .container-fluid { + margin: 0; + padding: 0; + height: 60px; +} +.navigation .nav-head { + text-transform: uppercase; + margin: 0; + color: hsla(0,0%,100%,.3); + text-transform: uppercase; + font-size: 12px; + font-family: Open Sans Bold,Helvetica Neue,Helvetica,Arial,sans-serif; + line-height: 45px; + padding-left: 25px; +} +.navigation li a { + color: hsla(0,0%,100%,.7); + text-decoration: none; + padding: 4px 0; + font-size: 13px; + height: 30px; + line-height: 21px; + width: 100%; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.navigation li { + min-height: 30px; + border-radius: 0 4px 4px 0; + max-width: 265px; + padding: 0 25px; + overflow: visible; +} +.navigation li:hover { + background-color: hsla(0,0%,100%,.08); + +} +.navigation li.nav-head:hover { + background-color: transparent; +} +.navigation li a:hover { + background: transparent; + color: #fff; +} +.navigation .create-shelf a { + + width: 150px; + color: #fff !important; + background-color: hsla(0, 0%, 100%, .25); + padding: 2px 7px; + font-size: 12px; + line-height: 1.2; + border-radius: 3px; + font-family: Open Sans Bold, Helvetica Neue, Helvetica, Arial, sans-serif; + border: 0; + -webkit-transition: background-color 0.1s; + transition: background-color 0.1s; + font-weight: 600; + white-space: nowrap; + margin: auto; + text-transform: uppercase; + max-height: 20px; +} +#scnd-nav .dropdown-menu > li > a:hover { + color: #fff; + background: transparent; +} +#scnd-nav .dropdown-menu { + left: 5px; +} +.navigation .create-shelf a:hover { + background-color: hsla(0, 0%, 100%, .3); + border-radius: 3px; +} +.navigation .create-shelf a:before { + content: "+"; + font-size: 120%; + padding-right: 10px; +} +.navigation .create-shelf { + width: auto; + margin: 30px auto; + min-height: auto; +} +.navigation .create-shelf:hover { + background: transparent; +} + +.container-fluid .book .meta .title { + font-weight: 600; + font-size: 13px; + font-family: Open Sans Semibold,Helvetica Neue,Helvetica,Arial,sans-serif; + -webkit-font-smoothing: antialiased; + color: #fff; + line-height: 20px; + +} +.container-fluid .book .meta .author { + font-weight: 600; + font-size: 13px; + font-family: Open Sans Semibold,Helvetica Neue,Helvetica,Arial,sans-serif; + -webkit-font-smoothing: antialiased; + color: hsla(0,0%,100%,.45); + line-height: 20px; +} +.container-fluid .book .meta .author > a { + font-weight: 600; + font-size: 13px; + font-family: Open Sans Semibold,Helvetica Neue,Helvetica,Arial,sans-serif; + -webkit-font-smoothing: antialiased; + color: hsla(0,0%,100%,.45); + line-height: 20px; +} +.container-fluid .book .cover img { + border: none; + -webkit-box-shadow: 0 0 2px rgba(0,0,0,.35); + -moz-box-shadow: 0 0 2px rgba(0,0,0,.35); + box-shadow: 0 0 2px rgba(0,0,0,.35); + position: relative; + z-index: -9; +} +.container-fluid .book .cover img:hover .container-fluid .book .cover:before {} + +#books > .cover > a, +#books_rand > .cover > a, +.book.isotope-item > .cover > a, +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.discover > form > div.col-sm-12 > div.col-sm-12 > div.col-sm-2 > a { + display: inline-block; + width: auto; + height: 100%; + +} +#books > .cover > a:hover, +#books_rand > .cover > a:hover, +.book.isotope-item > .cover > a:hover, +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.discover > form > div.col-sm-12 > div.col-sm-12 > div.col-sm-2 > a:hover { + outline: 2px solid var(--color-secondary); + font-size: 50px; + background: -webkit-radial-gradient(50% 50% farthest-corner,rgba(50,50,50,.5) 0,#323232 100%); + background: radial-gradient(farthest-corner at 50% 50%,rgba(50,50,50,.5) 50%,#323232 100%); + font-family: serif; + font-style: italic; +} +#books > .cover > a:hover:before, +#books_rand > .cover > a:hover:before, +.book.isotope-item > .cover > a:hover:before, +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.discover > form > div.col-sm-12 > div.col-sm-12 > div.col-sm-2 > a:hover:before { + content: "i"; + display: inline-block; + position: absolute; + background: var(--color-secondary); + color: #fff; + border-radius: 50%; + font-weight: 600; + font-size: 40px; + line-height: 50px; + width: 50px; + height: 50px; + padding-left: 19px; + left: 0; + right: 0; + top: 0; + bottom: 0; + margin: auto; +} +.container-fluid .book .cover { + width: auto; + display: inline-block; +} +.navbar { + margin-bottom: 0; + border: none; +} +.navbar-collapse.collapse { + height: 60px !important; + padding-bottom: 0; + overflow: visible!important; +} +.btn.active.focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn:active:focus, +.btn:focus { + outline: none; + outline-offset: 0; +} +.container-fluid .discover { + margin-bottom: 0; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: rgba(0,0,0,.15); + border-radius: 3px; +} +/* clean up */ + +app-loading-container { + background: #3f4245; +} +.app-loading>span { + display: none; +} +.app-loading { + margin: auto; + color: #fff !important; + text-align: center; + font-size: 20px; +} +.app-loading:before { + content: ''; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border: 2px solid transparent; + border-radius: 50%; + border-top: 2px solid var(--color-secondary); + width: 24px; + height: 24px; + -webkit-animation: spin 0.5s linear infinite; + animation: spin 0.5s linear infinite; + display: block; + margin: 20px auto; +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} +@keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +body > div.container-fluid > div > div.col-sm-10::-webkit-scrollbar, +body > div.container-fluid > div.row-fluid > div.col-sm-2::-webkit-scrollbar { + width: 14px; + max-height: calc(100% - 60px); +} +#meta-info::-webkit-scrollbar, +#description::-webkit-scrollbar, +.book-meta::-webkit-scrollbar { + width: 14px; +} +body > div.container-fluid > div > div.col-sm-10::-webkit-scrollbar-track, +body > div.container-fluid > div.row-fluid > div.col-sm-2::-webkit-scrollbar-track { + background-color: transparent; + max-height: calc(100% - 60px); +} +#meta-info::-webkit-scrollbar-track { + background-color: #202020; +} +#description::-webkit-scrollbar-track, +.book-meta::-webkit-scrollbar-track { + background-color: transparent; +} +body > div.container-fluid > div > div.col-sm-10::-webkit-scrollbar-thumb, +body > div.container-fluid > div.row-fluid > div.col-sm-2::-webkit-scrollbar-thumb { + min-height: 110px; + border: 3px solid transparent; + border-radius: 8px; + background-color: hsla(0,0%,100%,.2); + background-clip: padding-box; + max-height: calc(100% - 60px); +} +#meta-info::-webkit-scrollbar-thumb, +#description::-webkit-scrollbar-thumb, +.book-meta::-webkit-scrollbar-thumb { + min-height: 50px; + border: 3px solid transparent; + border-radius: 8px; + background-color: hsla(0,0%,100%,.2); + background-clip: padding-box; +} +body > div.container-fluid > div > div.col-sm-10::-webkit-scrollbar-thumb:hover, +body > div.container-fluid > div.row-fluid > div.col-sm-2::-webkit-scrollbar-thumb:hover, +#meta-info::-webkit-scrollbar-thumb:hover, +#description::-webkit-scrollbar-thumb:hover, +.book-meta::-webkit-scrollbar-thumb:hover { + background-color: hsla(0,0%,100%,.3); +} +::-webkit-scrollbar-corner { + background: transparent; +} +.pace-progress { + display: none; +} +.pace .pace-activity { + border: 2px solid transparent; + border-radius: 50%; + border-top: 2px solid var(--color-secondary); + width: 24px; + height: 24px; + right: auto; + left: 8px; + top: 17px; +} +body > .container-fluid { + margin: 0; + padding: 0; + width: calc(100%); + height: calc(100vh - 60px); + position: fixed; + top: 60px; + left: 0; + min-height: 1px; + min-width: 1px; +} +body > div.container-fluid > div.row-fluid > div.col-sm-2 { + position: fixed; + width: 240px; + height: calc(100vh - 120px); + left: 0; + top: 120px; + background: rgba(0,0,0,.15); + padding: 0 5px 20px 0; + overflow-y: auto; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 { + width: calc(100vw - 240px); + height: calc(100vh - 120px); + padding: 0; + position: fixed; + min-height: 1px; + min-width: 1px; + top: 120px; + right: 0; + overflow-y: scroll !important; +} + +body > div.container-fluid > div > div.col-sm-10 > div.discover > div { + overflow: visible !important; + width: 100%; + margin: 0; +} +body > div.container-fluid > div > div.col-sm-10 > div.discover { + height: auto; + width: calc(100vw - 254px); + margin: 40px 0 !important; + padding: 0 0 0 25px !important; + +} +body > div.container-fluid > div > div.col-sm-10 > div.single { + height: auto; + width: calc(100vw - 254px); + margin: 0 !important; + padding: 15px !important; + +} +body > div.container-fluid > div > div.col-sm-10 > div.discover { + margin-top: 0; +} +body > div.container-fluid > div > div.col-sm-10 > div.discover > h2 { + color: #eee !important; + font-size: 15px !important; + font-family: Open Sans Bold,Helvetica Neue,Helvetica,Arial,sans-serif !important; + line-height: 24px !important; + overflow: hidden!important; + min-width: 0; + width: 100% !important; + max-width: 100% !important; + text-overflow: ellipsis !important; + white-space: nowrap!important; + text-transform: uppercase !important; + font-weight: 600 !important; + padding-left: 15px !important; + margin-bottom: 0 !important; + position: relative !important; + top: 0 !important; + left: 0 !important; + height: auto !important; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.discover > form > div.col-sm-12 > div.col-sm-12 > h2 { + color: #eee; + font-size: 15px; + font-family: Open Sans Bold,Helvetica Neue,Helvetica,Arial,sans-serif; + line-height: 24px; + overflow: hidden; + min-width: 0; + width: 100%; + max-width: 100%; + text-overflow: ellipsis; + white-space: nowrap; + text-transform: uppercase; + font-weight: 600; + padding-left: 15px; + margin-bottom: 20px; + margin-top: 40px; + position: relative; + top: 0; + left: 0; + height: auto; +} +body > div.container-fluid > div > div.col-sm-10 > h3:not(:first-of-type) { + color: #eee; + width: calc(100% - 30px); + max-width: 800px; + margin: 20px auto 10px; + text-align: right; +} +body > div.container-fluid > div > div.col-sm-10 > p { + margin: 40px 0 0 15px; +} +body > div.container-fluid > div > div.col-sm-10 > p > a { + color: var(--color-secondary); +} +body > div.container-fluid > div > div.col-sm-10 > p > a:hover { + color: #fff; +} +body > div.container-fluid > div > div.col-sm-10 > h3:first-of-type { + content: "About"; + width: calc(100vw - 240px); + height: 60px; + margin: 0; + padding-left: 25px; + color: hsla(0,0%,100%,.7); + font-family: "Open Sans Semibold", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 60px; + text-size-adjust: 100%; + white-space: nowrap; + -webkit-box-direction: normal; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + font-weight: 600; + -webkit-margin-before: 0; + -webkit-margin-after: 0; + position: fixed; + top: 60px; + left: 240px; + text-align: left; +} +body > div.container-fluid > div > div.col-sm-10 > div > div > div.col-sm-9.col-lg-9.book-meta > h2:before { + content: "Book Details"; + width: calc(100vw - 540px); + height: 60px; + margin: 0; + padding-left: 25px; + /* background: rgba(0,0,0,.15); */ + color: hsla(0,0%,100%,.7); + font-family: "Open Sans Semibold", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 60px; + text-size-adjust: 100%; + white-space: nowrap; + -webkit-box-direction: normal; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + font-weight: 600; + -webkit-margin-before: 0; + -webkit-margin-after: 0; + position: fixed; + top: 60px; + left: 240px; +} +body > div.container-fluid > div > div.col-sm-10 > div:nth-of-type(2) > h2:before { + content: "Books"; + width: calc(100vw - 240px); + height: 60px; + margin: 0; + padding-left: 25px; + /* background: rgba(0,0,0,.15); */ + color: hsla(0,0%,100%,.7); + font-family: "Open Sans Semibold", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 60px; + text-size-adjust: 100%; + white-space: nowrap; + -webkit-box-direction: normal; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + font-weight: 600; + -webkit-margin-before: 0; + -webkit-margin-after: 0; + position: fixed; + top: 60px; + left: 240px; +} +/* body > div.container-fluid > div > div.col-sm-10 > div > div > div.col-sm-9.col-lg-9.book-meta > h2, */ +.well > h2, +body > div.container-fluid > div > div.col-sm-10 > div.discover:only-of-type > h2 { + width: calc(100vw - 240px) !important; + height: 60px !important; + margin: 0; + padding-left: 25px !important; + color: hsla(0,0%,100%,.7) !important; + font-family: "Open Sans Semibold", "Helvetica Neue", Helvetica, Arial, sans-serif !important; + font-size: 15px !important; + line-height: 60px !important; + text-size-adjust: 100%; + white-space: nowrap !important; + -webkit-box-direction: normal; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + font-weight: 600 !important; + -webkit-margin-before: 0; + -webkit-margin-after: 0; + position: fixed !important; + top: 60px !important; + left: 240px !important; + text-overflow: ellipsis !important; + max-width: calc(100vw - 550px) !important; + overflow: hidden !important; +} +body > div.container-fluid > div > div.col-sm-10 > h2 { + width: calc(100vw - 240px) !important; + height: 60px !important; + margin: 0; + padding-left: 25px !important; + color: hsla(0,0%,100%,.7) !important; + font-family: "Open Sans Semibold", "Helvetica Neue", Helvetica, Arial, sans-serif !important; + font-size: 15px !important; + line-height: 60px !important; + text-size-adjust: 100%; + white-space: nowrap !important; + -webkit-box-direction: normal; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + font-weight: 600 !important; + -webkit-margin-before: 0; + -webkit-margin-after: 0; + position: fixed !important; + top: 60px !important; + left: 240px !important; + text-overflow: ellipsis !important; + max-width: calc(100vw - 550px) !important; + overflow: hidden !important; +} +/* body > div.container-fluid > div > div.col-sm-10 > div > div > div.col-sm-9.col-lg-9.book-meta > h2:before, +.well > h2:before */ +body > div.container-fluid > div.row-fluid > div.col-sm-10:before { + width: 100%; + height: 60px; + background: rgba(0,0,0,.15); + display: block; + content: ''; + position: fixed; + top: 60px; + left: 240px; +} +body > div.container-fluid > div > div.col-sm-10 > div.discover > h2, +body > div.container-fluid > div > div.col-sm-10 > h1, +body > div.container-fluid > div > div.col-sm-10 > div.discover > h1, +body > div.container-fluid > div > div.col-sm-10 > div.col-sm-6.col-lg-6.col-xs-6 > h2 { + width: calc(100vw - 240px); + height: 60px; + margin: 0; + padding-left: 25px; + /* background: rgba(0,0,0,.15); */ + color: hsla(0,0%,100%,.7); + font-family: "Open Sans Semibold", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 60px; + text-size-adjust: 100%; + white-space: nowrap; + -webkit-box-direction: normal; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + font-weight: 600; + -webkit-margin-before: 0; + -webkit-margin-after: 0; + position: fixed; + top: 60px; + left: 240px; +} +body > div.container-fluid > div > div.col-sm-10 > div.discover > h1:first-letter { + text-transform: uppercase; +} +body > div.container-fluid > div > div.col-sm-10 > div.discover > form > .btn.btn-default { + float: right; + margin: 0 0 0 10px; +} +.pagination { + display: block !important; + position: fixed; + top: 60px; + right: 0; + min-width: 1px; + min-height: 1px; + overflow: visible; + cursor: default; + height: 60px; + margin: 0; + line-height: 60px; + font-size: 15px; + z-index: 99999; +} +.pagination > a { + color: hsla(0,0%,100%,.7); +} +.pagination > a:hover { + color: #fff; + text-decoration: none; +} +.pagination > .ellipsis { + color: hsla(0,0%,100%,.7); +} +.navbar-default .navbar-nav>li>a:focus, +.navbar-default .navbar-nav>li>a:hover { + color: #fff !important; +} +body > div.container-fluid > div > div.col-sm-10 > div.pagination > a.next { + color: rgba(0,0,0,0); + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: 100; + margin-left: 0px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + line-height: 60px; + height: 60px; + padding: 0; + font-size: 15px; + position: absolute; + top: 0; + right: 0; +} +body > div.container-fluid > div > div.col-sm-10 > div.pagination > a.previous { + color: rgba(0,0,0,0); + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: 100; + margin-left: 0px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + line-height: 60px; + height: 60px; + width: 65px; + padding: 0; + font-size: 15px; + position: absolute; + top: 0; + right: 65px; +} +body > div.container-fluid > div > div.col-sm-10 > div.pagination > a.next:before { + content: "\e092"; + visibility: visible; + color: hsla(0,0%,100%,.35); + height: 60px; + line-height: 60px; + border-left: 2px solid rgba(0,0,0,.3); + font-size: 15px; + padding: 20px 0 20px 25px; + margin-right: -27px; +} +body > div.container-fluid > div > div.col-sm-10 > div.pagination > a.previous:before { + content: "\e091"; + visibility: visible; + color: hsla(0,0%,100%,.65); + height: 60px; + line-height: 60px; + + font-size: 15px; + padding: 20px 25px 20px 25px; + margin-right: ; +} +body > div.container-fluid > div > div.col-sm-10 > div.pagination > a.next:hover:before { + color: #fff; +} +body > div.container-fluid > div > div.col-sm-10 > div.pagination > a.previous:hover:before { + color: #fff; +} +.pagination > strong { + display: none; +} +.pagination:after { + content: "\e092"; + position: relative; + top: 0; + right: 0; + display: inline-block; + color: hsla(0,0%,100%,.55); + line-height: 60px; + + font-size: 15px; + padding: 0 25px; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: 100; + margin-left: 20px; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + line-height: 60px; + height: 60px; + z-index: -1; +} +.pagination > .ellipsis { + display: none; +} +.pagination > a:nth-last-of-type(2) { + display: none; +} +body > div.container-fluid > div > div.col-sm-10 > div.container { + margin: 60px auto 120px; + border-top: 2px solid rgba(0,0,0,.3); + border-bottom: 2px solid rgba(0,0,0,.3); + background: hsla(0,0%,100%,.02); + padding: 0; + max-width: calc(100% - 30px); +} +body > div.container-fluid > div > div.col-sm-10 > div.container > div { + padding: 0; +} +body > div.container-fluid > div > div.col-sm-10 > div.container > div > .row { + padding: 4px 0; +} +body > div.container-fluid > div > div.col-sm-10 > div.container > div > .row:nth-of-type(odd) { + background: hsla(0,0%,100%,.02); +} +body > div.container-fluid > div > div.col-sm-10 > div.container > div > .row > .col-xs-6 { + width: calc(91.666% - 30px); + overflow: hidden; + text-overflow: ellipsis; + color: hsla(0, 0%, 100%, .45); +} +body > div.container-fluid > div > div.col-sm-10 > div.container > div > .row > .col-xs-6 > a { + text-overflow: ellipsis; + white-space: nowrap; + transition: all 0s; +} +/* Login */ +.well { + max-height: 520px; + height: auto; + background-color: transparent; + border: none; + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none; + min-width: 600px; + max-width: 700px; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: 0 auto; + padding: 60px; +} +/* .well > h2 { + color: #eee; + text-align: center; +} */ +.well > form { + background: rgba(0,0,0,.4); + color: hsla(0,0%,100%,.45); + text-transform: uppercase; + padding: 60px; + margin-top: 60px; +} +.checkbox { + text-transform: none; +} +.well > form > .btn { + display: inline-block; + overflow: hidden; + border-radius: 4px; + color: #fff; + vertical-align: middle; + text-align: center; + text-transform: uppercase; + white-space: nowrap; + font-family: Open Sans Bold,Helvetica Neue,Helvetica,Arial,sans-serif; + -webkit-transition: background-color 0.2s,color 0.2s; + transition: background-color 0.2s,color 0.2s; + padding: 6px 30px 5px; + font-size: 15px; + font-weight: 600; + background-color: var(--color-secondary); + border: none; + width: 100%; + text-rendering: auto; + letter-spacing: normal; + word-spacing: normal; + text-indent: 0; + text-shadow: none; + margin-top: 20px; +} +.well > form > .btn:hover { + background-color: var(--color-secondary-hover); +} +/* Login */ + +/* Alert */ +body > div.row-fluid { + margin-top: 0 !important; +} +.alert { + position: fixed; + top: auto; + bottom: 20px; + left: 50%; + width: 50%; + margin: 0; + -webkit-transform: translate(-50%); + -ms-transform: translate(-50%); + transform: translate(-50%); + opacity: 1 !important; + right: 0; + border-radius: 10px; + + background-color: #000; + color: #eee; + border: 0; + -webkit-box-shadow: 0 4px 12px rgba(0,0,0,.5); + box-shadow: 0 4px 12px rgba(0,0,0,.5); + -webkit-transition: all 0.5s; + transition: all 0.5s; + + height: 34px; + line-height: 1.71428571 !important; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + font-size: 14px; + padding: 5px 0; + + z-index: 99999; + -moz-animation: cssAnimation 0s ease-in 10s forwards; + /* Firefox */ + -webkit-animation: cssAnimation 0s ease-in 10s forwards; + /* Safari and Chrome */ + -o-animation: cssAnimation 0s ease-in 10s forwards; + /* Opera */ + animation: cssAnimation 0s ease-in 10s forwards; + -webkit-animation-fill-mode: forwards; + animation-fill-mode: forwards; + +} +@keyframes cssAnimation { + to { + width: 0; + height: 0; + overflow: hidden; + } +} +@-webkit-keyframes cssAnimation { + to { + width: 0; + height: 0; + visibility: hidden; + } +} + +.alert-danger { + background-color: rgba(255,85,51,.3); + color: #fff; +} +/* Alert */ + +.table>thead>tr>th { + border-bottom: 0; +} +.table>tbody>tr>td, +.table>tbody>tr>th, +.table>tfoot>tr>td, +.table>tfoot>tr>th, +.table>thead>tr>td, +.table>thead>tr>th { + border-top: 1px solid rgba(0,0,0,.3); + background: rgba(0,0,0,.15); +} +#stats, +#libs { + margin: auto; + width: calc(100% - 30px); + max-width: 800px; + color: hsla(0,0%,100%,.75); + border-bottom: 2px solid rgba(0,0,0,.3); + border-top: 2px solid rgba(0,0,0,.2); +} +#libs { + margin-bottom: 40px; +} +#stats > tbody > tr > th, +#libs > tbody > tr > th, +#libs > thead > tr > th:first-child { + color: hsla(0,0%,100%,.45); +} +#books .cover img, +#books_rand .cover img, +.book .cover img { + width: auto; +} +.container-fluid img { + display: block; + width: 100%; + height: auto; + max-width: 195px; + margin: auto; +} +.container-fluid .single .cover img { + border: 0; + border-radius: 0; + -webkit-box-shadow: 0 0 2px rgba(0,0,0,.35); + -moz-box-shadow: 0 0 2px rgba(0,0,0,.35); + box-shadow: 0 0 2px rgba(0,0,0,.35); + background-color: rgba(0,0,0,.45); +} + + +body > div.container-fluid > div > div.col-sm-10 > div > div > div.col-sm-3.col-lg-3, +body > div.container-fluid > div > div.col-sm-10 > div.col-sm-3.col-lg-3.col-xs-12 { + max-width: calc(25% - 75px); + position: fixed; +} +body > div.container-fluid > div > div.col-sm-10 > div.col-sm-3.col-lg-3.col-xs-12 { + padding-top: 40px; + padding-bottom: 40px; +} +body > div.container-fluid > div > div.col-sm-10 > div > div > div.col-sm-9.col-lg-9.book-meta, +body > div.container-fluid > div > div.col-sm-10 > div.col-sm-8 { + margin-left: calc(25% + 3.3333px); + width: calc(75% + 10.5px); +} +body > div.container-fluid > div > div.col-sm-10 > div.col-sm-8 { + padding-top: 40px; + padding-bottom: 40px; +} +body > div.container-fluid > div > div.col-sm-10 > div.col-sm-8 > form > div > span > input.form-control.typeahead.tt-hint { + background: hsla(0, 0%, 100%, .25) !important; +} +body > div.container-fluid > div > div.col-sm-10 > div.col-sm-8 > form > div > span > input.form-control:focus { + background: #fff !important; +} +.glyphicon-star { + color: #fff; +} +.rating-input .glyphicon:hover { + cursor: pointer; +} +.rating-input:hover { + cursor: default; +} +.rating-input { + padding-left: 0; +} +body > div.container-fluid > div > div.col-sm-10 > div.col-sm-8 > form > .btn.btn-default { + float: right; + margin: 0 0 0 10px; +} +#get_meta { + float: left; + margin: 0; +} +textarea { + resize: none; + /* Safari */ + resize: vertical; + /* Chrome */ +} +.modal-backdrop.in { + display: none; +} +#metaModal, +.modal.fade.in {} +#metaModal { + top: 0; + overflow: hidden; + padding-top: 60px; + left: 0; + right: 0; + bottom: 0; + background: rgba(0,0,0,.5); +} +#metaModal > .modal-dialog > .modal-content { + z-index: 9999999999999999999999; +} +#metaModal > .modal-dialog > .modal-content { + max-height: calc(100vh - 90px); + -webkit-box-shadow: 0 5px 15px rgba(0,0,0,.5); + box-shadow: 0 5px 15px rgba(0,0,0,.5); + border-radius: 3px; +} +#metaModal > .modal-dialog > .modal-content > .modal-header { + padding: 0; + background: #282828; + border-radius: 3px 3px 0 0; +} +#metaModal > .modal-dialog > .modal-content > .modal-header > h4 { + border-bottom: 0; + background: #323232; + height: 65px; + + padding: 15px 0 0 15px; + font-size: 20px; + text-overflow: ellipsis; + white-space: nowrap; + line-height: 1.71428571; + font-family: Open Sans Regular,Helvetica Neue,Helvetica,Arial,sans-serif; + font-weight: 400; + color: #eee; + border-radius: 3px 3px 0 0; + margin-bottom: 0; +} +#metaModal > .modal-dialog > .modal-content > .modal-header > h4:before { + content: "\E025"; + font: normal normal normal 16px/1 Glyphicons Halflings; + color: #999; + + padding-right: 10px; +} +#metaModal > .modal-dialog > .modal-content > .modal-header > .close { + color: #eee; + opacity: 0.2; + font-size: 20px; + text-shadow: none; + margin: 20px; +} +#metaModal > .modal-dialog > .modal-content > .modal-header > .close:hover { + opacity: 0.5; +} +#metaModal > .modal-dialog > .modal-content > .modal-header > #meta-search { + margin: 25px 0 0 0; + +} +#metaModal > .modal-dialog > .modal-content > .modal-header > #meta-search > .input-group { + max-width: 100%; +} +#metaModal > .modal-dialog > .modal-content > .modal-header > #meta-search > .input-group > input { + width: calc(100% - 51px); + border-radius: 0; + background-color: hsla(0, 0%, 100%, .15); +} +#metaModal > .modal-dialog > .modal-content > .modal-header > #meta-search > .input-group { + width: 100%; +} +#metaModal > .modal-dialog > .modal-content > .modal-header > #meta-search > .input-group > span > button { + height: 38px; + width: 50px; + padding: 0; + font-weight: 100; + font-family: "Open Sans Semibold", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px !important; + font-stretch: 100%; + font-style: normal; + font-variant-caps: normal; + font-variant-east-asian: normal; + font-variant-ligatures: normal; + font-variant-numeric: normal; + font-weight: 400; + letter-spacing: normal; + line-height: 22.2857px !important; + color: #eee; + vertical-align: middle; + background-color: hsla(0, 0%, 100%, .15); + border-radius: 0; + margin: 0 0 0 -1px; +} +#metaModal > .modal-dialog > .modal-content > .modal-header > #meta-search > .input-group > span { + float: right; + text-align: right; + width: 50px; + + margin: 0; +} +#metaModal > .modal-dialog > .modal-content > .modal-header > div { + font-family: Open Sans Regular,Helvetica Neue,Helvetica,Arial,sans-serif; + font-size: 12px; + line-height: 1.71428571; + color: var(--color-primary); + font-weight: 100; + text-align: right; + position: absolute; + right: 0; + padding: 12.5px; +} +#metaModal > .modal-dialog > .modal-content > .modal-body { + padding: 0; +} +#metaModal > .modal-dialog > .modal-content > .modal-body > .text-center { + text-align: left; + margin-bottom: 0; + padding-top: 10px; +} +#metaModal > .modal-dialog > .modal-content > .modal-body > #book-list { + margin-bottom: 0; +} +input.pill:checked + label { + background-color: transparent; + border-color: transparent; + color: var(--color-secondary); +} + +input.pill + label { + border: 0; + border-radius: 0; + color: hsla(0,0%,100%,.25); + cursor: pointer; + display: inline-block; + padding: 3px 15px; + user-select: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +input.pill + label:hover { + color: var(--color-secondary-hover); +} + + +#meta-info { + max-height: calc(100vh - 357px); + overflow-y: scroll; + background: #282828 !important; + padding: 0; + margin: 0; +} +#meta-info #book-list .media > .media-body { + font-family: "Open Sans Regular", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 24px; + color: #999; + font-weight: 100; + padding-left: 15px; +} +#meta-info #book-list .media > img { + padding: 0; +} +#meta-info #book-list .media > .media-body > h4 > a { + color: #eee; +} +#meta-info #book-list .media > .media-body > h4 > a:hover { + color: #fff; +} +#meta-info #book-list { + width: 100%; + margin: 0; +} +#meta-info #book-list .media:nth-of-type(odd) { + background: hsla(0, 0%, 100%, .02); +} + +#meta-info #book-list .media { + margin-top: 0; + padding: 20px 15px 5px; +} +#meta-info #book-list .media > .media-body > p > a { + color: var(--color-secondary); + padding-left: 10px; +} +#meta-info #book-list .media > .media-body > p > a:hover { + color: #fff; +} + +.modal-content { + position: relative; + background-color: #323232; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 0; + border-radius: 0 0 3px 3px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0,0,0,.5); + box-shadow: 0 3px 9px rgba(0,0,0,.5); +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 0; +} +.modal-header { + padding: 15px; + border-bottom: 0; +} +#meta-info #book-list .media > img:hover { + cursor: pointer; + outline: 2px solid var(--color-secondary); + filter:brightness(90%); +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > form > div.col-sm-9 > div:nth-child(10) > label:before { + content: "Edit Metadata"; + width: calc(100vw - 240px); + height: 60px; + margin: 0; + padding-left: 25px; + background: transparent; + color: hsla(0,0%,100%,.7); + font-family: "Open Sans Semibold", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 60px; + text-size-adjust: 100%; + white-space: nowrap; + -webkit-box-direction: normal; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + font-weight: 600; + -webkit-margin-before: 0; + -webkit-margin-after: 0; + position: fixed; + top: 60px; + left: 240px; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > form > div.col-xs-12 { + margin: 50px 0; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm-8 > form > #test:before { + content: "Advanced Search"; + width: calc(100vw - 240px); + height: 60px; + margin: 0; + padding-left: 25px; + background: transparent; + color: hsla(0,0%,100%,.7); + font-family: "Open Sans Semibold", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 60px; + text-size-adjust: 100%; + white-space: nowrap; + -webkit-box-direction: normal; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + font-weight: 600; + -webkit-margin-before: 0; + -webkit-margin-after: 0; + position: fixed; + top: 60px; + left: 240px; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm-8 > form > #test { + border-top: 2px solid rgba(0,0,0,.3); + margin-top: -50px; + padding-top: 50px; + padding-left: 33.33%; + margin-left: -33.33%; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm-8 > form > .form-group > .btn-toolbar-lg > label.btn { + margin: 2px 3px 0 0; + padding: 0 10px; + background: hsla(0,0%,100%,.25); +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm-8 > form > .form-group > .btn-toolbar-lg > label.btn:hover { + background: hsla(0,0%,100%,.3); +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm-8 > form > .form-group > .btn-toolbar-lg > label.btn-danger:hover { + background: #ce3d2a; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm-8 > form > .form-group > .btn-toolbar-lg > label.btn-danger.active { + background: #ac3323; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm-8 > form > .form-group > .btn-toolbar-lg > label.btn-danger.active:hover { + background: #ce3d2a; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm-8 > form > .form-group > .btn-toolbar-lg > label.btn-primary:hover { + background: var(--color-secondary-hover); +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm-8 > form > .form-group > .btn-toolbar-lg > label.btn-primary.active { + background: var(--color-secondary); +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm-8 > form > .form-group > .btn-toolbar-lg > label.btn-primary.active:hover { + background: var(--color-secondary-hover); +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm-8 > form > .form-group > .btn-toolbar-lg { + margin-left: -33.33%; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm-8 > form > label { + margin-left: -33.33%; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.col-sm-8 > form > label:first-of-type { + padding-top: 40px; +} + + + + + +#bookDetailsModal .modal-header > .close { + display: none; +} +#bookDetailsModal .modal-footer { + /* width: 100px; + position: fixed; + top: 800px; + left: 0; */ + display: none; +} +a:focus { + outline: none; + outline-offset: 0; +} + +#bookDetailsModal { + width: calc(100vw - 240px); + height: calc(100vh - 60px); + padding: 0; + position: fixed; + min-height: 1px; + min-width: 1px; + top: 60px; + left: 240px; + + background-image: url(https://raw.githubusercontent.com/leram84/layer.Cake/master/Resources/blur-noise.png), url("https://raw.githubusercontent.com/leram84/layer.Cake/master/Resources/blur-light.png"); + background-repeat: repeat, no-repeat; + background-attachment: fixed, fixed; + background-position: center center, center center; + background-size: auto, cover !important; + -webkit-background-size: auto, cover; + -moz-background-size: auto, cover; + -o-background-size: auto, cover; +} +#bookDetailsModal > .modal-dialog.modal-lg { + padding: 0; + margin: 0; + width: 100%; + height: 100%; + + +} +#bookDetailsModal > .modal-dialog.modal-lg > .modal-content { + background-color: transparent; + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none; +} +#bookDetailsModal > .modal-dialog.modal-lg > .modal-content > .modal-header { + width: 100%; + height: 60px; + margin: 0; + padding: 0 0 0 25px; + background: rgba(0,0,0,.15); + color: hsla(0,0%,100%,.7); + font-family: "Open Sans Semibold", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 15px; + line-height: 60px; + text-size-adjust: 100%; + white-space: nowrap; + -webkit-box-direction: normal; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + font-weight: 600; + -webkit-margin-before: 0; + -webkit-margin-after: 0; + position: fixed; + top: 0; + left: 0; +} +#bookDetailsModal > .modal-dialog.modal-lg > .modal-content > .modal-header > h4 { + width: 100%; + max-width: calc(100% - 340px); + height: 60px; + line-height: 60px; +} +#bookDetailsModal > .modal-dialog.modal-lg > .modal-content > .modal-body { + width: calc(100vw - 240px); + height: calc(100vh - 120px); + position: fixed; + min-height: 1px; + min-width: 1px; + top: 60px; + left: 0; + padding: 0; +} +#bookDetailsModal > .modal-dialog.modal-lg > .modal-content > .modal-body > .container-fluid { + padding: 0; +} +#bookDetailsModal > .modal-dialog.modal-lg > .modal-content > .modal-body> div > div > div > div.col-sm-3.col-lg-3.col-xs-5 { + padding: 30px 15px 15px 30px; + height: 300px; +} +body > div.container-fluid > div > div.col-sm-10 > div > div > div.col-sm-3.col-lg-3.col-xs-5 { + padding: 15px; + height: 300px; +} +#bookDetailsModal > .modal-dialog.modal-lg > .modal-content > .modal-body> div > div > div > div.col-sm-3.col-lg-3.col-xs-5 > div.cover, +body > div.container-fluid > div > div.col-sm-10 > div > div > div.col-sm-3.col-lg-3.col-xs-5 > div.cover { + margin: 0; + width: 100%; + height: 100%; + +} +#bookDetailsModal > .modal-dialog.modal-lg > .modal-content > .modal-body> div > div > div > div.col-sm-3.col-lg-3.col-xs-5 > div.cover > img, +body > div.container-fluid > div > div.col-sm-10 > div > div > div.col-sm-3.col-lg-3.col-xs-5 > div.cover > img { + margin: 0; + max-height: 300px; +} + + + + + + + + + + + + + + + + +#bookDetailsModal .book-meta > h2 { + margin-top: 15px; +} + +.book-meta > h2 { + font-size: 24px; + font-family: Open Sans Bold,Helvetica Neue,Helvetica,Arial,sans-serif; + color: #eee; + font-weight: 600; + line-height: 1; + margin: 0; + max-width: calc(100% - 100px); + padding: 15px 0; +} +.book-meta > .author:before { + content: "Author:"; + padding-right: 4px; + color: #eee; +} +.book-meta > .author > a { + color: #eee; +} +.book-meta > .rating { + float: right; + position: relative; + margin-top: -60px; + z-index: -1; +} +.book-meta > p { + color: hsla(0, 0%, 100%, .45); +} +.book-meta > .rating > p > .glyphicon-star { + color: #eee; +} +.book-meta > .languages > p > .label-default { + background: transparent; + color: hsla(0, 0%, 100%, .45); + padding: 0; + font-size: 14px; +} +.book-meta > .languages > p:first-letter { + text-transform: uppercase; +} +.book-meta > .tags .btn-info { + background-color: rgba(0,0,0,.15); + color: hsla(0,0%,100%,.7); + padding: 0 10px; + font-size: 13px; + display: inline-block; + overflow: hidden; + border-radius: 4px; + vertical-align: middle; + text-align: center; + white-space: nowrap; + font-family: Open Sans Bold,Helvetica Neue,Helvetica,Arial,sans-serif; + -webkit-transition: background-color 0.2s,color 0.2s; + transition: background-color 0.2s,color 0.2s; + margin: 2px 3px 0 0; +} +.book-meta > .tags .btn-info:hover { + color: #fff; + text-decoration: underline; +} +.book-meta > .tags { + padding-left: 40px; +} +.book-meta > .tags a{ + max-width: 100%; + text-overflow: ellipsis; +} +.book-meta > .tags .glyphicon-tags { + margin-left: -40px; + margin-right: 17px; + color: hsla(0, 0%, 100%, .45); +} +.book-meta > h3:first-of-type { + font-size: 14px; + font-weight: 600; + text-transform: uppercase; + margin-top: -20px; + border-top: 2px solid rgba(0,0,0,.3); + padding-top: 20px; + margin-top: 20px; +} +.book-meta > div { + color: hsla(0,0%,100%,.65); +} +.more-stuff { + margin-top: 0; + padding-top: 0; + border-top: 0; +} +.book-meta > .more-stuff > br { + display: none; +} +.book-meta > .more-stuff > .btn-toolbar:not(#shelf-actions) { + position: fixed; + top: 0; + right: 240px; +} +.col-sm-10 .book-meta > .more-stuff > .btn-toolbar:not(#shelf-actions) { + position: fixed; + top: 60px; + right: 240px; +} +#shelf-actions { + position: fixed; + top: 415px; + left: 0; + padding: 0 15px 0 30px; + margin: 0; + width: calc(25%); +} +.col-sm-10 #shelf-actions { + left: 240px; + top: 475px; + width: calc(25% - 60px); +} +#shelf-actions .btn-group { + width: 100%; +} +.book-meta > .more-stuff > .btn-toolbar { + +} +.book-meta > .more-stuff > .btn-toolbar:nth-of-type(2) { + +} +.book-meta .btn-toolbar > .btn-group > .btn-warning, +.btn-toolbar > .btn-group > .btn-group > #btnGroupDrop2, +#btnGroupDrop1, +#sendbtn, +#read-in-browser, +.btn-toolbar > .btn-group > #btnGroupDrop2, +.book-meta .btn-toolbar > .btn-group > .btn-group:nth-child(1) > a:first-of-type { + background: transparent; + color: transparent; + width: 60px; + height: 60px; + margin: 0; + overflow: hidden; + +} +.book-meta .btn-toolbar > .btn-group > .btn-warning > span, +.btn-toolbar > .btn-group > .btn-group > #btnGroupDrop2 > span, +#btnGroupDrop1 > span, +#sendbtn > span, +#read-in-browser > span, +.btn-toolbar > .btn-group > #btnGroupDrop2 > span, +.book-meta .btn-toolbar > .btn-group > .btn-group:nth-child(1) > a:first-of-type > span { + color: hsla(0,0%,100%,.7); + +} +.book-meta .btn-toolbar > .btn-group > .btn-warning:hover > span, +.btn-toolbar > .btn-group > .btn-group > #btnGroupDrop2:hover > span, +#btnGroupDrop1:hover > span, +#sendbtn:hover > span, +#read-in-browser:hover > span, +.btn-toolbar > .btn-group > #btnGroupDrop2:hover > span, +.book-meta .btn-toolbar > .btn-group > .btn-group:nth-child(1) > a:first-of-type:hover > span { + color: #fff; +} +.btn-toolbar > .btn-group > .btn-group > #btnGroupDrop2 > span.caret { + margin-left: -135px; + padding-bottom: 5px; +} +.btn-toolbar > .btn-group > #btnGroupDrop2 > span.caret, +#read-in-browser > span.caret { + margin-left: -135px; + padding-bottom: 5px; +} +#btnGroupDrop1 > span.caret { + margin-left: -85px; + padding-bottom: 5px; +} +.book-meta .btn-toolbar > .btn-group { + margin: 0; +} +.book-meta > div.btn-toolbar > div > div:nth-child(1) > button:not(#btnGroupDrop1) { + display: none; +} +.book-meta .btn-toolbar > .btn-group > .btn-warning > span.glyphicon-edit, +#sendbtn > span, +.book-meta .btn-toolbar > .btn-group > .btn-group:nth-child(1) > a:first-of-type > span { + font-size: 18px; + line-height: 42px; + width: 100%; + +} +.btn-toolbar > .btn-group > .btn-group > #btnGroupDrop2 > span.glyphicon-eye-open:before, +#read-in-browser > span.glyphicon-eye-open:before { + content: "\e164"; + font-size: 18px; +} +.btn-toolbar > .btn-group > #btnGroupDrop2 > span.glyphicon-list:before, +#read-in-browser > span.glyphicon-list:before { + font-size: 18px; +} +#btnGroupDrop1 > span.glyphicon-download:before { + font-size: 18px; +} +.book-meta > div.btn-toolbar { + position: fixed; + top: 0; + right: 0; + margin: 0; +} +.col-sm-10 .book-meta > div.btn-toolbar { + position: fixed; + top: 60px; + right: 0; + margin: 0; +} +.book-meta > div.btn-toolbar ul.dropdown-menu { + margin-left: -110px; +} +#bookDetailsModal > div > div > div.modal-body > div > div > div > div.col-sm-9.col-lg-9.book-meta > div.btn-toolbar > div > div.btn-group.open > div.dropdown-backdrop { + display: none; +} +#add-to-shelf { + margin-bottom: 0; + padding: 6px 7px; + line-height: 1.2; + border-radius: 3px; + font-family: Open Sans Bold, Helvetica Neue, Helvetica, Arial, sans-serif; + border: 0; + -webkit-transition: background-color 0.1s; + transition: background-color 0.1s; + font-weight: 600; + white-space: nowrap; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; +} +#add-to-shelf > span.glyphicon.glyphicon-list:before { + content: "+"; + font-weight: 100 !important; + font-size: 12px; + padding: 0 3px; +} +.btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { + background-color: hsla(0, 0%, 100%, .3); +} +.btn-primary.active.focus, .btn-primary.active:focus, .btn-primary.active:hover, .btn-primary:active.focus, .btn-primary:active:focus, .btn-primary:active:hover, .open>.dropdown-toggle.btn-primary.focus, .open>.dropdown-toggle.btn-primary:focus, .open>.dropdown-toggle.btn-primary:hover { + color: #fff; + background-color: hsla(0, 0%, 100%, .3); + border-color: transparent; +} + +.book-meta > div.more-stuff > .btn-toolbar > .btn-group > .btn-group > .dropdown-menu { + margin-left: -100px; +} +.book-meta .btn-toolbar > .btn-group > ul.dropdown-menu { + margin-left: -200px; + max-width: 200px; +} +.book-meta .btn-toolbar > .btn-group > ul.dropdown-menu { + margin-left: 0px; + max-width: 200px; + overflow: hidden; +} +.book-meta .btn-toolbar > .btn-group > ul.dropdown-menu > li > a { + max-width: 200px; + text-overflow: ellipsis; + overflow: hidden; +} +.dropdown-menu { + background-color: #020a0e !important; + -webkit-box-shadow: 0 4px 10px rgba(0, 0, 0, .35); + box-shadow: 0 4px 10px rgba(0, 0, 0, .35); + border-radius: 4px !important; +} +.dropdown-menu > li > a { + color: hsla(0,0%,100%,.7); + font-size: 13px; + font-stretch: 100%; + font-style: normal; + font-variant-caps: normal; + font-variant-east-asian: normal; + font-variant-ligatures: normal; + font-variant-numeric: normal; + font-weight: 600; +} +.dropdown-menu > li > a:hover { + color: #fff; + background: hsla(0, 0%, 100%, .08); +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: none; + box-shadow: none; +} +.book-meta > .identifiers > p > .btn-success { + background-color: rgba(0,0,0,.15); + color: hsla(0,0%,100%,.7); + padding: 0 10px; + font-size: 13px; + display: inline-block; + overflow: hidden; + border-radius: 4px; + vertical-align: middle; + text-align: center; + white-space: nowrap; + font-family: Open Sans Bold,Helvetica Neue,Helvetica,Arial,sans-serif; + -webkit-transition: background-color 0.2s,color 0.2s; + transition: background-color 0.2s,color 0.2s; + margin: 2px 3px 0 22px; +} +.book-meta > .identifiers > p > .btn-success:hover { + color: #fff; + text-decoration: underline; +} +#bookDetailsModal .book-meta { + color: hsla(0,0%,100%,.7); + height: calc(100vh - 120px); + overflow-x: hidden; + overflow-y: scroll; +} +.book-meta .publishers { + color: hsla(0,0%,100%,.45); +} +.book-meta > .identifiers > p > .glyphicon-link { + color: hsla(0,0%,100%,.45); +} +.rating .glyphicon-star.good { + color: var(--color-primary); +} +body > div.container-fluid > div > div.col-sm-10 > div.discover > .btn-danger { + background: #ac3323; + width: auto; +} +body > div.container-fluid > div > div.col-sm-10 > div.discover > .btn-danger:hover { + background: #ce3d2a; +} +body > div.container-fluid > div > div.col-sm-10 > div.discover > .btn-primary:first-of-type { + background: hsla(0, 0%, 100%, .25); +} +body > div.container-fluid > div > div.col-sm-10 > div.discover > .btn-primary:first-of-type:hover { + background: hsla(0, 0%, 100%, .3); +} +body > div.container-fluid > div > div.col-sm-10 > div.discover > .btn-primary:last-of-type { + background: var(--color-secondary); +} +body > div.container-fluid > div > div.col-sm-10 > div.discover > .btn-primary:last-of-type:hover { + background: var(--color-secondary-hover); +} +.book-meta > div.more-stuff > .btn-toolbar > .btn-group[aria-label="Remove from shelves"] { + max-width: 100%; + +} +.book-meta > div.more-stuff > .btn-toolbar > .btn-group[aria-label="Remove from shelves"] > a { + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + margin: 20px 0 0 0 !important; + border-radius: 3px; + background: hsla(0, 0%, 100%, .25); + text-transform: none; + padding: 0px 10px 0px 10px; + text-align: left; + line-height: 1.5; +} +.book-meta > div.more-stuff > .btn-toolbar > .btn-group[aria-label="Remove from shelves"] > a:hover { + background: #ce3d2a; + color: #fff; +} +.book-meta > div.more-stuff > .btn-toolbar > .btn-group[aria-label="Remove from shelves"] > a > .glyphicon-remove { + font-size: 12px; + padding-right: 3px; + +} +/* body > div.container-fluid > div > div.col-sm-10 > div.single > div.row > div.col-sm-3.col-lg-3.col-xs-5 > div.cover > img { + max-height: 300px; + max-width: 100%; + width: auto; + margin: 0; +} */ +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.discover > form { + padding-right: 25px; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.discover > form > div.form-group { + max-width: 800px; + padding-left: 15px; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.discover > form > div.col-sm-12 > div.col-sm-12 { + padding: 0; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.discover > form > div.col-sm-12 { + padding: 0; + margin-bottom: 60px; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.discover > form > div.col-sm-12 > #submit { + float: left; + margin-left: calc(100vw - 400px) +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > div.discover > form > div.col-sm-12 > div.col-sm-12 > div.col-sm-2 { + +} +.dropdown-backdrop { + display: none; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > form > div.col-sm-9.col-xs-12 > button.btn.btn-default { + float: right; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > form > div.col-sm-9.col-xs-12 > a:last-of-type { + float: right; + background: hsla(0, 0%, 100%, .25); + margin-right: 10px; +} +body > div.container-fluid > div.row-fluid > div.col-sm-10 > form > div.col-sm-9.col-xs-12 > a:last-of-type:hover { + background: hsla(0, 0%, 100%, .3); +} diff --git a/src/cps/static/css/fonts/GrandHotel-Regular.ttf b/src/cps/static/css/fonts/GrandHotel-Regular.ttf new file mode 100644 index 0000000..bf2bb8a Binary files /dev/null and b/src/cps/static/css/fonts/GrandHotel-Regular.ttf differ diff --git a/src/cps/static/css/fonts/fontello.eot b/src/cps/static/css/fonts/fontello.eot new file mode 100644 index 0000000..f63ffa0 Binary files /dev/null and b/src/cps/static/css/fonts/fontello.eot differ diff --git a/src/cps/static/css/fonts/fontello.svg b/src/cps/static/css/fonts/fontello.svg new file mode 100644 index 0000000..2db1398 --- /dev/null +++ b/src/cps/static/css/fonts/fontello.svg @@ -0,0 +1,33 @@ + + + +Copyright (C) 2013 by original authors @ fontello.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/cps/static/css/fonts/fontello.ttf b/src/cps/static/css/fonts/fontello.ttf new file mode 100644 index 0000000..95715f8 Binary files /dev/null and b/src/cps/static/css/fonts/fontello.ttf differ diff --git a/src/cps/static/css/fonts/fontello.woff b/src/cps/static/css/fonts/fontello.woff new file mode 100644 index 0000000..084f0c5 Binary files /dev/null and b/src/cps/static/css/fonts/fontello.woff differ diff --git a/src/cps/static/css/fonts/glyphicons-halflings-regular.eot b/src/cps/static/css/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..b93a495 Binary files /dev/null and b/src/cps/static/css/fonts/glyphicons-halflings-regular.eot differ diff --git a/src/cps/static/css/fonts/glyphicons-halflings-regular.svg b/src/cps/static/css/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..94fb549 --- /dev/null +++ b/src/cps/static/css/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/cps/static/css/fonts/glyphicons-halflings-regular.ttf b/src/cps/static/css/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..1413fc6 Binary files /dev/null and b/src/cps/static/css/fonts/glyphicons-halflings-regular.ttf differ diff --git a/src/cps/static/css/fonts/glyphicons-halflings-regular.woff b/src/cps/static/css/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..9e61285 Binary files /dev/null and b/src/cps/static/css/fonts/glyphicons-halflings-regular.woff differ diff --git a/src/cps/static/css/fonts/glyphicons-halflings-regular.woff2 b/src/cps/static/css/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..64539b5 Binary files /dev/null and b/src/cps/static/css/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/src/cps/static/css/images/annotation-check.svg b/src/cps/static/css/images/annotation-check.svg new file mode 100644 index 0000000..71cd16d --- /dev/null +++ b/src/cps/static/css/images/annotation-check.svg @@ -0,0 +1,11 @@ + + + + diff --git a/src/cps/static/css/images/annotation-comment.svg b/src/cps/static/css/images/annotation-comment.svg new file mode 100644 index 0000000..86f1f17 --- /dev/null +++ b/src/cps/static/css/images/annotation-comment.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/src/cps/static/css/images/annotation-help.svg b/src/cps/static/css/images/annotation-help.svg new file mode 100644 index 0000000..00938fe --- /dev/null +++ b/src/cps/static/css/images/annotation-help.svg @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/src/cps/static/css/images/annotation-insert.svg b/src/cps/static/css/images/annotation-insert.svg new file mode 100644 index 0000000..519ef68 --- /dev/null +++ b/src/cps/static/css/images/annotation-insert.svg @@ -0,0 +1,10 @@ + + + + diff --git a/src/cps/static/css/images/annotation-key.svg b/src/cps/static/css/images/annotation-key.svg new file mode 100644 index 0000000..8d09d53 --- /dev/null +++ b/src/cps/static/css/images/annotation-key.svg @@ -0,0 +1,11 @@ + + + + diff --git a/src/cps/static/css/images/annotation-newparagraph.svg b/src/cps/static/css/images/annotation-newparagraph.svg new file mode 100644 index 0000000..38d2497 --- /dev/null +++ b/src/cps/static/css/images/annotation-newparagraph.svg @@ -0,0 +1,11 @@ + + + + diff --git a/src/cps/static/css/images/annotation-noicon.svg b/src/cps/static/css/images/annotation-noicon.svg new file mode 100644 index 0000000..c07d108 --- /dev/null +++ b/src/cps/static/css/images/annotation-noicon.svg @@ -0,0 +1,7 @@ + + + diff --git a/src/cps/static/css/images/annotation-note.svg b/src/cps/static/css/images/annotation-note.svg new file mode 100644 index 0000000..7017365 --- /dev/null +++ b/src/cps/static/css/images/annotation-note.svg @@ -0,0 +1,42 @@ + + + + + + + + diff --git a/src/cps/static/css/images/annotation-paragraph.svg b/src/cps/static/css/images/annotation-paragraph.svg new file mode 100644 index 0000000..6ae5212 --- /dev/null +++ b/src/cps/static/css/images/annotation-paragraph.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/src/cps/static/css/images/findbarButton-next-rtl.png b/src/cps/static/css/images/findbarButton-next-rtl.png new file mode 100644 index 0000000..bef0274 Binary files /dev/null and b/src/cps/static/css/images/findbarButton-next-rtl.png differ diff --git a/src/cps/static/css/images/findbarButton-next-rtl@2x.png b/src/cps/static/css/images/findbarButton-next-rtl@2x.png new file mode 100644 index 0000000..1da6dc9 Binary files /dev/null and b/src/cps/static/css/images/findbarButton-next-rtl@2x.png differ diff --git a/src/cps/static/css/images/findbarButton-next.png b/src/cps/static/css/images/findbarButton-next.png new file mode 100644 index 0000000..de1d0fc Binary files /dev/null and b/src/cps/static/css/images/findbarButton-next.png differ diff --git a/src/cps/static/css/images/findbarButton-next@2x.png b/src/cps/static/css/images/findbarButton-next@2x.png new file mode 100644 index 0000000..0250307 Binary files /dev/null and b/src/cps/static/css/images/findbarButton-next@2x.png differ diff --git a/src/cps/static/css/images/findbarButton-previous-rtl.png b/src/cps/static/css/images/findbarButton-previous-rtl.png new file mode 100644 index 0000000..de1d0fc Binary files /dev/null and b/src/cps/static/css/images/findbarButton-previous-rtl.png differ diff --git a/src/cps/static/css/images/findbarButton-previous-rtl@2x.png b/src/cps/static/css/images/findbarButton-previous-rtl@2x.png new file mode 100644 index 0000000..0250307 Binary files /dev/null and b/src/cps/static/css/images/findbarButton-previous-rtl@2x.png differ diff --git a/src/cps/static/css/images/findbarButton-previous.png b/src/cps/static/css/images/findbarButton-previous.png new file mode 100644 index 0000000..bef0274 Binary files /dev/null and b/src/cps/static/css/images/findbarButton-previous.png differ diff --git a/src/cps/static/css/images/findbarButton-previous@2x.png b/src/cps/static/css/images/findbarButton-previous@2x.png new file mode 100644 index 0000000..1da6dc9 Binary files /dev/null and b/src/cps/static/css/images/findbarButton-previous@2x.png differ diff --git a/src/cps/static/css/images/grab.cur b/src/cps/static/css/images/grab.cur new file mode 100644 index 0000000..db7ad5a Binary files /dev/null and b/src/cps/static/css/images/grab.cur differ diff --git a/src/cps/static/css/images/grabbing.cur b/src/cps/static/css/images/grabbing.cur new file mode 100644 index 0000000..e0dfd04 Binary files /dev/null and b/src/cps/static/css/images/grabbing.cur differ diff --git a/src/cps/static/css/images/loading-icon.gif b/src/cps/static/css/images/loading-icon.gif new file mode 100644 index 0000000..1c72ebb Binary files /dev/null and b/src/cps/static/css/images/loading-icon.gif differ diff --git a/src/cps/static/css/images/loading-small.png b/src/cps/static/css/images/loading-small.png new file mode 100644 index 0000000..8831a80 Binary files /dev/null and b/src/cps/static/css/images/loading-small.png differ diff --git a/src/cps/static/css/images/loading-small@2x.png b/src/cps/static/css/images/loading-small@2x.png new file mode 100644 index 0000000..b25b445 Binary files /dev/null and b/src/cps/static/css/images/loading-small@2x.png differ diff --git a/src/cps/static/css/images/secondaryToolbarButton-documentProperties.png b/src/cps/static/css/images/secondaryToolbarButton-documentProperties.png new file mode 100644 index 0000000..40925e2 Binary files /dev/null and b/src/cps/static/css/images/secondaryToolbarButton-documentProperties.png differ diff --git a/src/cps/static/css/images/secondaryToolbarButton-documentProperties@2x.png b/src/cps/static/css/images/secondaryToolbarButton-documentProperties@2x.png new file mode 100644 index 0000000..adb240e Binary files /dev/null and b/src/cps/static/css/images/secondaryToolbarButton-documentProperties@2x.png differ diff --git a/src/cps/static/css/images/secondaryToolbarButton-firstPage.png b/src/cps/static/css/images/secondaryToolbarButton-firstPage.png new file mode 100644 index 0000000..e68846a Binary files /dev/null and b/src/cps/static/css/images/secondaryToolbarButton-firstPage.png differ diff --git a/src/cps/static/css/images/secondaryToolbarButton-firstPage@2x.png b/src/cps/static/css/images/secondaryToolbarButton-firstPage@2x.png new file mode 100644 index 0000000..3ad8af5 Binary files /dev/null and b/src/cps/static/css/images/secondaryToolbarButton-firstPage@2x.png differ diff --git a/src/cps/static/css/images/secondaryToolbarButton-handTool.png b/src/cps/static/css/images/secondaryToolbarButton-handTool.png new file mode 100644 index 0000000..cb85a84 Binary files /dev/null and b/src/cps/static/css/images/secondaryToolbarButton-handTool.png differ diff --git a/src/cps/static/css/images/secondaryToolbarButton-handTool@2x.png b/src/cps/static/css/images/secondaryToolbarButton-handTool@2x.png new file mode 100644 index 0000000..5c13f77 Binary files /dev/null and b/src/cps/static/css/images/secondaryToolbarButton-handTool@2x.png differ diff --git a/src/cps/static/css/images/secondaryToolbarButton-lastPage.png b/src/cps/static/css/images/secondaryToolbarButton-lastPage.png new file mode 100644 index 0000000..be763e0 Binary files /dev/null and b/src/cps/static/css/images/secondaryToolbarButton-lastPage.png differ diff --git a/src/cps/static/css/images/secondaryToolbarButton-lastPage@2x.png b/src/cps/static/css/images/secondaryToolbarButton-lastPage@2x.png new file mode 100644 index 0000000..8570984 Binary files /dev/null and b/src/cps/static/css/images/secondaryToolbarButton-lastPage@2x.png differ diff --git a/src/cps/static/css/images/secondaryToolbarButton-rotateCcw.png b/src/cps/static/css/images/secondaryToolbarButton-rotateCcw.png new file mode 100644 index 0000000..675d6da Binary files /dev/null and b/src/cps/static/css/images/secondaryToolbarButton-rotateCcw.png differ diff --git a/src/cps/static/css/images/secondaryToolbarButton-rotateCcw@2x.png b/src/cps/static/css/images/secondaryToolbarButton-rotateCcw@2x.png new file mode 100644 index 0000000..b9e7431 Binary files /dev/null and b/src/cps/static/css/images/secondaryToolbarButton-rotateCcw@2x.png differ diff --git a/src/cps/static/css/images/secondaryToolbarButton-rotateCw.png b/src/cps/static/css/images/secondaryToolbarButton-rotateCw.png new file mode 100644 index 0000000..e1c7598 Binary files /dev/null and b/src/cps/static/css/images/secondaryToolbarButton-rotateCw.png differ diff --git a/src/cps/static/css/images/secondaryToolbarButton-rotateCw@2x.png b/src/cps/static/css/images/secondaryToolbarButton-rotateCw@2x.png new file mode 100644 index 0000000..cb257b4 Binary files /dev/null and b/src/cps/static/css/images/secondaryToolbarButton-rotateCw@2x.png differ diff --git a/src/cps/static/css/images/shadow.png b/src/cps/static/css/images/shadow.png new file mode 100644 index 0000000..31d3bdb Binary files /dev/null and b/src/cps/static/css/images/shadow.png differ diff --git a/src/cps/static/css/images/texture.png b/src/cps/static/css/images/texture.png new file mode 100644 index 0000000..12bae83 Binary files /dev/null and b/src/cps/static/css/images/texture.png differ diff --git a/src/cps/static/css/images/toolbarButton-bookmark.png b/src/cps/static/css/images/toolbarButton-bookmark.png new file mode 100644 index 0000000..a187be6 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-bookmark.png differ diff --git a/src/cps/static/css/images/toolbarButton-bookmark@2x.png b/src/cps/static/css/images/toolbarButton-bookmark@2x.png new file mode 100644 index 0000000..4efbaa6 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-bookmark@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-download.png b/src/cps/static/css/images/toolbarButton-download.png new file mode 100644 index 0000000..eaab35f Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-download.png differ diff --git a/src/cps/static/css/images/toolbarButton-download@2x.png b/src/cps/static/css/images/toolbarButton-download@2x.png new file mode 100644 index 0000000..896face Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-download@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-menuArrows.png b/src/cps/static/css/images/toolbarButton-menuArrows.png new file mode 100644 index 0000000..e50ca4e Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-menuArrows.png differ diff --git a/src/cps/static/css/images/toolbarButton-menuArrows@2x.png b/src/cps/static/css/images/toolbarButton-menuArrows@2x.png new file mode 100644 index 0000000..f7570bc Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-menuArrows@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-openFile.png b/src/cps/static/css/images/toolbarButton-openFile.png new file mode 100644 index 0000000..b5cf1bd Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-openFile.png differ diff --git a/src/cps/static/css/images/toolbarButton-openFile@2x.png b/src/cps/static/css/images/toolbarButton-openFile@2x.png new file mode 100644 index 0000000..91ab765 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-openFile@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-pageDown-rtl.png b/src/cps/static/css/images/toolbarButton-pageDown-rtl.png new file mode 100644 index 0000000..1957f79 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-pageDown-rtl.png differ diff --git a/src/cps/static/css/images/toolbarButton-pageDown-rtl@2x.png b/src/cps/static/css/images/toolbarButton-pageDown-rtl@2x.png new file mode 100644 index 0000000..16ebcb8 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-pageDown-rtl@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-pageDown.png b/src/cps/static/css/images/toolbarButton-pageDown.png new file mode 100644 index 0000000..8219ecf Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-pageDown.png differ diff --git a/src/cps/static/css/images/toolbarButton-pageDown@2x.png b/src/cps/static/css/images/toolbarButton-pageDown@2x.png new file mode 100644 index 0000000..758c01d Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-pageDown@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-pageUp-rtl.png b/src/cps/static/css/images/toolbarButton-pageUp-rtl.png new file mode 100644 index 0000000..98e7ce4 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-pageUp-rtl.png differ diff --git a/src/cps/static/css/images/toolbarButton-pageUp-rtl@2x.png b/src/cps/static/css/images/toolbarButton-pageUp-rtl@2x.png new file mode 100644 index 0000000..a01b023 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-pageUp-rtl@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-pageUp.png b/src/cps/static/css/images/toolbarButton-pageUp.png new file mode 100644 index 0000000..fb9daa3 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-pageUp.png differ diff --git a/src/cps/static/css/images/toolbarButton-pageUp@2x.png b/src/cps/static/css/images/toolbarButton-pageUp@2x.png new file mode 100644 index 0000000..a5cfd75 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-pageUp@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-presentationMode.png b/src/cps/static/css/images/toolbarButton-presentationMode.png new file mode 100644 index 0000000..3ac2124 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-presentationMode.png differ diff --git a/src/cps/static/css/images/toolbarButton-presentationMode@2x.png b/src/cps/static/css/images/toolbarButton-presentationMode@2x.png new file mode 100644 index 0000000..cada9e7 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-presentationMode@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-print.png b/src/cps/static/css/images/toolbarButton-print.png new file mode 100644 index 0000000..51275e5 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-print.png differ diff --git a/src/cps/static/css/images/toolbarButton-print@2x.png b/src/cps/static/css/images/toolbarButton-print@2x.png new file mode 100644 index 0000000..53d18da Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-print@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-search.png b/src/cps/static/css/images/toolbarButton-search.png new file mode 100644 index 0000000..f9b7557 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-search.png differ diff --git a/src/cps/static/css/images/toolbarButton-search@2x.png b/src/cps/static/css/images/toolbarButton-search@2x.png new file mode 100644 index 0000000..456b133 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-search@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-secondaryToolbarToggle-rtl.png b/src/cps/static/css/images/toolbarButton-secondaryToolbarToggle-rtl.png new file mode 100644 index 0000000..8437095 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-secondaryToolbarToggle-rtl.png differ diff --git a/src/cps/static/css/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png b/src/cps/static/css/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png new file mode 100644 index 0000000..9d9bfa4 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-secondaryToolbarToggle.png b/src/cps/static/css/images/toolbarButton-secondaryToolbarToggle.png new file mode 100644 index 0000000..1f90f83 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-secondaryToolbarToggle.png differ diff --git a/src/cps/static/css/images/toolbarButton-secondaryToolbarToggle@2x.png b/src/cps/static/css/images/toolbarButton-secondaryToolbarToggle@2x.png new file mode 100644 index 0000000..b066fe5 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-secondaryToolbarToggle@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-sidebarToggle-rtl.png b/src/cps/static/css/images/toolbarButton-sidebarToggle-rtl.png new file mode 100644 index 0000000..6f85ec0 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-sidebarToggle-rtl.png differ diff --git a/src/cps/static/css/images/toolbarButton-sidebarToggle-rtl@2x.png b/src/cps/static/css/images/toolbarButton-sidebarToggle-rtl@2x.png new file mode 100644 index 0000000..291e006 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-sidebarToggle-rtl@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-sidebarToggle.png b/src/cps/static/css/images/toolbarButton-sidebarToggle.png new file mode 100644 index 0000000..025dc90 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-sidebarToggle.png differ diff --git a/src/cps/static/css/images/toolbarButton-sidebarToggle@2x.png b/src/cps/static/css/images/toolbarButton-sidebarToggle@2x.png new file mode 100644 index 0000000..7f834df Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-sidebarToggle@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-viewAttachments.png b/src/cps/static/css/images/toolbarButton-viewAttachments.png new file mode 100644 index 0000000..fcd0b26 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-viewAttachments.png differ diff --git a/src/cps/static/css/images/toolbarButton-viewAttachments@2x.png b/src/cps/static/css/images/toolbarButton-viewAttachments@2x.png new file mode 100644 index 0000000..4a5e2b8 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-viewAttachments@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-viewOutline-rtl.png b/src/cps/static/css/images/toolbarButton-viewOutline-rtl.png new file mode 100644 index 0000000..aaa9430 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-viewOutline-rtl.png differ diff --git a/src/cps/static/css/images/toolbarButton-viewOutline-rtl@2x.png b/src/cps/static/css/images/toolbarButton-viewOutline-rtl@2x.png new file mode 100644 index 0000000..3410f70 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-viewOutline-rtl@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-viewOutline.png b/src/cps/static/css/images/toolbarButton-viewOutline.png new file mode 100644 index 0000000..976365a Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-viewOutline.png differ diff --git a/src/cps/static/css/images/toolbarButton-viewOutline@2x.png b/src/cps/static/css/images/toolbarButton-viewOutline@2x.png new file mode 100644 index 0000000..b6a197f Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-viewOutline@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-viewThumbnail.png b/src/cps/static/css/images/toolbarButton-viewThumbnail.png new file mode 100644 index 0000000..584ba55 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-viewThumbnail.png differ diff --git a/src/cps/static/css/images/toolbarButton-viewThumbnail@2x.png b/src/cps/static/css/images/toolbarButton-viewThumbnail@2x.png new file mode 100644 index 0000000..a0208b4 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-viewThumbnail@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-zoomIn.png b/src/cps/static/css/images/toolbarButton-zoomIn.png new file mode 100644 index 0000000..513d081 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-zoomIn.png differ diff --git a/src/cps/static/css/images/toolbarButton-zoomIn@2x.png b/src/cps/static/css/images/toolbarButton-zoomIn@2x.png new file mode 100644 index 0000000..d5d49d5 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-zoomIn@2x.png differ diff --git a/src/cps/static/css/images/toolbarButton-zoomOut.png b/src/cps/static/css/images/toolbarButton-zoomOut.png new file mode 100644 index 0000000..156c26b Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-zoomOut.png differ diff --git a/src/cps/static/css/images/toolbarButton-zoomOut@2x.png b/src/cps/static/css/images/toolbarButton-zoomOut@2x.png new file mode 100644 index 0000000..959e191 Binary files /dev/null and b/src/cps/static/css/images/toolbarButton-zoomOut@2x.png differ diff --git a/src/cps/static/css/images/treeitem-collapsed-rtl.png b/src/cps/static/css/images/treeitem-collapsed-rtl.png new file mode 100644 index 0000000..0496b35 Binary files /dev/null and b/src/cps/static/css/images/treeitem-collapsed-rtl.png differ diff --git a/src/cps/static/css/images/treeitem-collapsed-rtl@2x.png b/src/cps/static/css/images/treeitem-collapsed-rtl@2x.png new file mode 100644 index 0000000..6ad9ebc Binary files /dev/null and b/src/cps/static/css/images/treeitem-collapsed-rtl@2x.png differ diff --git a/src/cps/static/css/images/treeitem-collapsed.png b/src/cps/static/css/images/treeitem-collapsed.png new file mode 100644 index 0000000..06d4d37 Binary files /dev/null and b/src/cps/static/css/images/treeitem-collapsed.png differ diff --git a/src/cps/static/css/images/treeitem-collapsed@2x.png b/src/cps/static/css/images/treeitem-collapsed@2x.png new file mode 100644 index 0000000..eec1e58 Binary files /dev/null and b/src/cps/static/css/images/treeitem-collapsed@2x.png differ diff --git a/src/cps/static/css/images/treeitem-expanded.png b/src/cps/static/css/images/treeitem-expanded.png new file mode 100644 index 0000000..c8d5573 Binary files /dev/null and b/src/cps/static/css/images/treeitem-expanded.png differ diff --git a/src/cps/static/css/images/treeitem-expanded@2x.png b/src/cps/static/css/images/treeitem-expanded@2x.png new file mode 100644 index 0000000..3b3b610 Binary files /dev/null and b/src/cps/static/css/images/treeitem-expanded@2x.png differ diff --git a/src/cps/static/css/kthoom.css b/src/cps/static/css/kthoom.css new file mode 100644 index 0000000..770b94a --- /dev/null +++ b/src/cps/static/css/kthoom.css @@ -0,0 +1,256 @@ +body { + background: #444; + overflow-x: hidden; + overflow-y: auto; + color: white; + font-family: sans-serif; + margin: 0px; +} + +#main { + text-align: center; + z-index: 2; +} + +.view { + padding-top:0px; +} + +#sidebar a, +#sidebar ul, +#sidebar li, +#sidebar li img { + max-width: 100%; + text-align: center; +} + +#sidebar ul { + position: relative; +} + +#sidebar a { + display: inline-block; + position: relative; + cursor: pointer; + padding: 4px; + + transition: all .2s ease; +} + +#sidebar a:hover, +#sidebar a:focus { + outline: none; + box-shadow: 0px 2px 8px 1px black; +} + +#sidebar a.active, +#sidebar a.active img + span { + background-color: #45B29D; +} + +#sidebar li img { + display: block; + max-height: 200px; +} + +#sidebar li img + span { + position: absolute; + bottom: 0; + right: 0; + padding: 2px; + min-width: 25px; + line-height: 25px; + background: #6b6b6b; + border-top-left-radius: 5px; +} + +#sidebar #panels { + z-index: 1; +} + +#progress { + position: absolute; + display: inline; + top: 0; + left: 0; + right: 0; + min-height: 4px; + font-family: sans-serif; + font-size: 10px; + line-height: 10px; + text-align: right; + + transition: min-height 150ms ease-in-out; +} + +#progress .bar-load, +#progress .bar-read { + display: flex; + align-items: flex-end; + justify-content: flex-end; + position: absolute; + top: 0; + left: 0; + bottom: 0; + + transition: width 150ms ease-in-out; +} + +#progress .bar-load { + color: #000; + background-color: #CCC; +} + +#progress .bar-read { + color: #FFF; + background-color: #45B29D; +} + +#progress .text { + display: none; + padding: 0 5px; +} + +#progress.loading, +#titlebar:hover #progress { + min-height: 10px; +} + +#progress.loading .text, +#titlebar:hover #progress .text { + display: inline-block; +} + +.hide { + display: none !important; +} + +#mainContent { + overflow: auto; + outline: none; +} + +#mainText { + text-align: left; + width: 90%; + position: relative; + top: 10px; + background: #ccc; + color: black; + margin-right: auto; + margin-left: auto; + padding: 10px; + word-wrap: break-word; +} + +#titlebar { + min-height: 25px; + height: auto; +} + +#metainfo { + max-width: 70%; +} + +#prev { + left: 40px; +} + +#next { + right: 40px; +} + +.arrow { + position: absolute; + top: 50%; + margin-top: -32px; + font-size: 64px; + color: #E2E2E2; + font-family: arial, sans-serif; + font-weight: bold; + cursor: pointer; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.arrow:hover { + color: #777; +} + +.arrow:active, +.arrow.active { + color: #000; +} + +th, td { + padding: 5px; +} + +th { + text-align: right; + vertical-align: top; +} + +.modal { + /* Makes the modal responsive. Note sure if this should be moved to main.css */ + margin: 0; + max-width: 96%; + transform: translate(-50%, -50%); +} + +.md-content { + min-height: 320px; + height: auto; +} + +.md-content > div { + overflow: hidden; +} + +.md-content > div p { + padding: 5px 0; +} + +.settings-column { + float: left; + min-width: 35%; + padding-bottom: 10px; +} + +.inputs { + margin: -5px; +} + +.inputs input { + vertical-align: middle; +} + +.inputs label { + display: inline-block; + margin: 5px; + white-space: nowrap; +} + +.dark-theme #main { + background-color: #000; +} + +.dark-theme #titlebar { + color: #DDD; +} + +.dark-theme #titlebar a:active { + color: #FFF; +} + +.dark-theme #progress .bar-read { + background-color: red; +} + + +.dark-theme .overlay { + background-color: rgba(0,0,0,0.8); +} diff --git a/src/cps/static/css/libs/bootstrap-datepicker3.css.map b/src/cps/static/css/libs/bootstrap-datepicker3.css.map new file mode 100644 index 0000000..fe24be9 --- /dev/null +++ b/src/cps/static/css/libs/bootstrap-datepicker3.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/datepicker3.less","build/build3.less"],"names":[],"mappings":"AAAA;EACC,kBAAA;EAIA,cAAA;;AAHA,WAAC;EACA,YAAA;;AAGD,WAAC;EACA,cAAA;;AACA,WAFA,IAEC;EAAiB,UAAA;;AAFnB,WAAC,IAGA,MAAM,GAAG,GAAG;EACX,YAAA;;AAGF,WAAC;EACA,MAAA;EACA,OAAA;EACA,YAAA;;AACA,WAJA,SAIC;EACA,SAAS,EAAT;EACA,qBAAA;EACA,kCAAA;EACA,mCAAA;EACA,4CAAA;EACA,aAAA;EACA,uCAAA;EACA,kBAAA;;AAED,WAdA,SAcC;EACA,SAAS,EAAT;EACA,qBAAA;EACA,kCAAA;EACA,mCAAA;EACA,6BAAA;EACA,aAAA;EACA,kBAAA;;AAED,WAvBA,SAuBC,uBAAuB;EAAY,SAAA;;AACpC,WAxBA,SAwBC,uBAAuB;EAAY,SAAA;;AACpC,WAzBA,SAyBC,wBAAwB;EAAW,UAAA;;AACpC,WA1BA,SA0BC,wBAAwB;EAAW,UAAA;;AACpC,WA3BA,SA2BC,yBAAyB;EAAU,SAAA;;AACpC,WA5BA,SA4BC,yBAAyB;EAAU,SAAA;;AACpC,WA7BA,SA6BC,sBAAsB;EACtB,YAAA;EACA,gBAAA;EACA,yCAAA;;AAED,WAlCA,SAkCC,sBAAsB;EACtB,YAAA;EACA,gBAAA;EACA,0BAAA;;AAlDH,WAqDC;EACC,SAAA;EACA,2BAAA;EACA,yBAAA;EACA,wBAAA;EACA,sBAAA;EACA,qBAAA;EACA,iBAAA;;AA5DF,WAqDC,MAQC,GACC;AA9DH,WAqDC,MAQC,GACK;EACH,kBAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;EACA,YAAA;;AAMH,cAAe,YAAE,MAAM,GACtB;AADD,cAAe,YAAE,MAAM,GAClB;EACH,6BAAA;;AAID,WADD,MAAM,GAAG,GACP;AACD,WAFD,MAAM,GAAG,GAEP;EACA,cAAA;;AAED,WALD,MAAM,GAAG,GAKP,IAAI;AACL,WAND,MAAM,GAAG,GAMP;EACA,mBAAA;EACA,eAAA;;AAED,WAVD,MAAM,GAAG,GAUP;AACD,WAXD,MAAM,GAAG,GAWP,SAAS;EACT,gBAAA;EACA,cAAA;EACA,eAAA;;AAED,WAhBD,MAAM,GAAG,GAgBP;EC5DD,WAAA;EACA,yBAAA;EACA,qBAAA;ED6DC,gBAAA;;AC3DD,WDwCD,MAAM,GAAG,GAgBP,YCxDA;AACD,WDuCD,MAAM,GAAG,GAgBP,YCvDA;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WDkCD,MAAM,GAAG,GAgBP,YClDA;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WD6BD,MAAM,GAAG,GAgBP,YC7CA;AACD,WD4BD,MAAM,GAAG,GAgBP,YC5CA;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEJ,WDuBH,MAAM,GAAG,GAgBP,YC7CA,OAME;AAAD,WDuBH,MAAM,GAAG,GAgBP,YC5CA,OAKE;AACD,WDsBH,MAAM,GAAG,GAgBP,YC7CA,OAOE;AAAD,WDsBH,MAAM,GAAG,GAgBP,YC5CA,OAME;AACD,WDqBH,MAAM,GAAG,GAgBP,YC7CA,OAQE;AAAD,WDqBH,MAAM,GAAG,GAgBP,YC5CA,OAOE;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAMN,WDYH,MAAM,GAAG,GAgBP,YC/BA,SAGE;AAAD,WDYH,MAAM,GAAG,GAgBP,YC9BA,UAEE;AAAD,QADM,UAAW,YDapB,MAAM,GAAG,GAgBP,YC5BE;AACD,WDWH,MAAM,GAAG,GAgBP,YC/BA,SAIE;AAAD,WDWH,MAAM,GAAG,GAgBP,YC9BA,UAGE;AAAD,QAFM,UAAW,YDapB,MAAM,GAAG,GAgBP,YC3BE;AACD,WDUH,MAAM,GAAG,GAgBP,YC/BA,SAKE;AAAD,WDUH,MAAM,GAAG,GAgBP,YC9BA,UAIE;AAAD,QAHM,UAAW,YDapB,MAAM,GAAG,GAgBP,YC1BE;EACC,yBAAA;EACI,qBAAA;;AD6BP,WArBF,MAAM,GAAG,GAgBP,YAKC;EACA,mBAAA;;AAGD,WAzBF,MAAM,GAAG,GAgBP,YASC;AACD,WA1BF,MAAM,GAAG,GAgBP,YAUC,SAAS;EACT,mBAAA;EACA,cAAA;;AAGF,WA/BD,MAAM,GAAG,GA+BP;EC3ED,WAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,WDwCD,MAAM,GAAG,GA+BP,MCvEA;AACD,WDuCD,MAAM,GAAG,GA+BP,MCtEA;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WDkCD,MAAM,GAAG,GA+BP,MCjEA;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WD6BD,MAAM,GAAG,GA+BP,MC5DA;AACD,WD4BD,MAAM,GAAG,GA+BP,MC3DA;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEJ,WDuBH,MAAM,GAAG,GA+BP,MC5DA,OAME;AAAD,WDuBH,MAAM,GAAG,GA+BP,MC3DA,OAKE;AACD,WDsBH,MAAM,GAAG,GA+BP,MC5DA,OAOE;AAAD,WDsBH,MAAM,GAAG,GA+BP,MC3DA,OAME;AACD,WDqBH,MAAM,GAAG,GA+BP,MC5DA,OAQE;AAAD,WDqBH,MAAM,GAAG,GA+BP,MC3DA,OAOE;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAMN,WDYH,MAAM,GAAG,GA+BP,MC9CA,SAGE;AAAD,WDYH,MAAM,GAAG,GA+BP,MC7CA,UAEE;AAAD,QADM,UAAW,YDapB,MAAM,GAAG,GA+BP,MC3CE;AACD,WDWH,MAAM,GAAG,GA+BP,MC9CA,SAIE;AAAD,WDWH,MAAM,GAAG,GA+BP,MC7CA,UAGE;AAAD,QAFM,UAAW,YDapB,MAAM,GAAG,GA+BP,MC1CE;AACD,WDUH,MAAM,GAAG,GA+BP,MC9CA,SAKE;AAAD,WDUH,MAAM,GAAG,GA+BP,MC7CA,UAIE;AAAD,QAHM,UAAW,YDapB,MAAM,GAAG,GA+BP,MCzCE;EACC,yBAAA;EACI,qBAAA;;AD2CP,WAnCF,MAAM,GAAG,GA+BP,MAIC;EACA,mBAAA;;AAGD,WAvCF,MAAM,GAAG,GA+BP,MAQC;AACD,WAxCF,MAAM,GAAG,GA+BP,MASC,SAAS;EACT,mBAAA;EACA,cAAA;;AAGF,WA7CD,MAAM,GAAG,GA6CP;ECzFD,WAAA;EACA,yBAAA;EACA,qBAAA;ED0FC,gBAAA;;ACxFD,WDwCD,MAAM,GAAG,GA6CP,MCrFA;AACD,WDuCD,MAAM,GAAG,GA6CP,MCpFA;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WDkCD,MAAM,GAAG,GA6CP,MC/EA;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WD6BD,MAAM,GAAG,GA6CP,MC1EA;AACD,WD4BD,MAAM,GAAG,GA6CP,MCzEA;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEJ,WDuBH,MAAM,GAAG,GA6CP,MC1EA,OAME;AAAD,WDuBH,MAAM,GAAG,GA6CP,MCzEA,OAKE;AACD,WDsBH,MAAM,GAAG,GA6CP,MC1EA,OAOE;AAAD,WDsBH,MAAM,GAAG,GA6CP,MCzEA,OAME;AACD,WDqBH,MAAM,GAAG,GA6CP,MC1EA,OAQE;AAAD,WDqBH,MAAM,GAAG,GA6CP,MCzEA,OAOE;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAMN,WDYH,MAAM,GAAG,GA6CP,MC5DA,SAGE;AAAD,WDYH,MAAM,GAAG,GA6CP,MC3DA,UAEE;AAAD,QADM,UAAW,YDapB,MAAM,GAAG,GA6CP,MCzDE;AACD,WDWH,MAAM,GAAG,GA6CP,MC5DA,SAIE;AAAD,WDWH,MAAM,GAAG,GA6CP,MC3DA,UAGE;AAAD,QAFM,UAAW,YDapB,MAAM,GAAG,GA6CP,MCxDE;AACD,WDUH,MAAM,GAAG,GA6CP,MC5DA,SAKE;AAAD,WDUH,MAAM,GAAG,GA6CP,MC3DA,UAIE;AAAD,QAHM,UAAW,YDapB,MAAM,GAAG,GA6CP,MCvDE;EACC,yBAAA;EACI,qBAAA;;AD0DP,WAlDF,MAAM,GAAG,GA6CP,MAKC;EACA,mBAAA;;AAGD,WAtDF,MAAM,GAAG,GA6CP,MASC;AACD,WAvDF,MAAM,GAAG,GA6CP,MAUC,SAAS;EACT,mBAAA;EACA,cAAA;;AAGF,WA5DD,MAAM,GAAG,GA4DP,MAAM;ECxGP,WAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,WDwCD,MAAM,GAAG,GA4DP,MAAM,YCpGN;AACD,WDuCD,MAAM,GAAG,GA4DP,MAAM,YCnGN;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WDkCD,MAAM,GAAG,GA4DP,MAAM,YC9FN;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WD6BD,MAAM,GAAG,GA4DP,MAAM,YCzFN;AACD,WD4BD,MAAM,GAAG,GA4DP,MAAM,YCxFN;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEJ,WDuBH,MAAM,GAAG,GA4DP,MAAM,YCzFN,OAME;AAAD,WDuBH,MAAM,GAAG,GA4DP,MAAM,YCxFN,OAKE;AACD,WDsBH,MAAM,GAAG,GA4DP,MAAM,YCzFN,OAOE;AAAD,WDsBH,MAAM,GAAG,GA4DP,MAAM,YCxFN,OAME;AACD,WDqBH,MAAM,GAAG,GA4DP,MAAM,YCzFN,OAQE;AAAD,WDqBH,MAAM,GAAG,GA4DP,MAAM,YCxFN,OAOE;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAMN,WDYH,MAAM,GAAG,GA4DP,MAAM,YC3EN,SAGE;AAAD,WDYH,MAAM,GAAG,GA4DP,MAAM,YC1EN,UAEE;AAAD,QADM,UAAW,YDapB,MAAM,GAAG,GA4DP,MAAM,YCxEJ;AACD,WDWH,MAAM,GAAG,GA4DP,MAAM,YC3EN,SAIE;AAAD,WDWH,MAAM,GAAG,GA4DP,MAAM,YC1EN,UAGE;AAAD,QAFM,UAAW,YDapB,MAAM,GAAG,GA4DP,MAAM,YCvEJ;AACD,WDUH,MAAM,GAAG,GA4DP,MAAM,YC3EN,SAKE;AAAD,WDUH,MAAM,GAAG,GA4DP,MAAM,YC1EN,UAIE;AAAD,QAHM,UAAW,YDapB,MAAM,GAAG,GA4DP,MAAM,YCtEJ;EACC,yBAAA;EACI,qBAAA;;ADwEP,WAhEF,MAAM,GAAG,GA4DP,MAAM,YAIL;EACA,mBAAA;;AAGD,WApEF,MAAM,GAAG,GA4DP,MAAM,YAQL;AACD,WArEF,MAAM,GAAG,GA4DP,MAAM,YASL,SAAS;EACT,mBAAA;EACA,cAAA;;AAGF,WA1ED,MAAM,GAAG,GA0EP,MAAM;ECtHP,WAAA;EACA,yBAAA;EACA,qBAAA;;AAEA,WDwCD,MAAM,GAAG,GA0EP,MAAM,MClHN;AACD,WDuCD,MAAM,GAAG,GA0EP,MAAM,MCjHN;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WDkCD,MAAM,GAAG,GA0EP,MAAM,MC5GN;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WD6BD,MAAM,GAAG,GA0EP,MAAM,MCvGN;AACD,WD4BD,MAAM,GAAG,GA0EP,MAAM,MCtGN;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEJ,WDuBH,MAAM,GAAG,GA0EP,MAAM,MCvGN,OAME;AAAD,WDuBH,MAAM,GAAG,GA0EP,MAAM,MCtGN,OAKE;AACD,WDsBH,MAAM,GAAG,GA0EP,MAAM,MCvGN,OAOE;AAAD,WDsBH,MAAM,GAAG,GA0EP,MAAM,MCtGN,OAME;AACD,WDqBH,MAAM,GAAG,GA0EP,MAAM,MCvGN,OAQE;AAAD,WDqBH,MAAM,GAAG,GA0EP,MAAM,MCtGN,OAOE;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAMN,WDYH,MAAM,GAAG,GA0EP,MAAM,MCzFN,SAGE;AAAD,WDYH,MAAM,GAAG,GA0EP,MAAM,MCxFN,UAEE;AAAD,QADM,UAAW,YDapB,MAAM,GAAG,GA0EP,MAAM,MCtFJ;AACD,WDWH,MAAM,GAAG,GA0EP,MAAM,MCzFN,SAIE;AAAD,WDWH,MAAM,GAAG,GA0EP,MAAM,MCxFN,UAGE;AAAD,QAFM,UAAW,YDapB,MAAM,GAAG,GA0EP,MAAM,MCrFJ;AACD,WDUH,MAAM,GAAG,GA0EP,MAAM,MCzFN,SAKE;AAAD,WDUH,MAAM,GAAG,GA0EP,MAAM,MCxFN,UAIE;AAAD,QAHM,UAAW,YDapB,MAAM,GAAG,GA0EP,MAAM,MCpFJ;EACC,yBAAA;EACI,qBAAA;;ADsFP,WA9EF,MAAM,GAAG,GA0EP,MAAM,MAIL;AACD,WA/EF,MAAM,GAAG,GA0EP,MAAM,MAKL,SAAS;EACT,mBAAA;EACA,cAAA;;AAGF,WApFD,MAAM,GAAG,GAoFP;AACD,WArFD,MAAM,GAAG,GAqFP,SAAS;ECjIV,WAAA;EACA,yBAAA;EACA,qBAAA;EDiIC,yCAAA;;AC/HD,WDwCD,MAAM,GAAG,GAoFP,SC5HA;AAAD,WDwCD,MAAM,GAAG,GAqFP,SAAS,YC7HT;AACD,WDuCD,MAAM,GAAG,GAoFP,SC3HA;AAAD,WDuCD,MAAM,GAAG,GAqFP,SAAS,YC5HT;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WDkCD,MAAM,GAAG,GAoFP,SCtHA;AAAD,WDkCD,MAAM,GAAG,GAqFP,SAAS,YCvHT;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WD6BD,MAAM,GAAG,GAoFP,SCjHA;AAAD,WD6BD,MAAM,GAAG,GAqFP,SAAS,YClHT;AACD,WD4BD,MAAM,GAAG,GAoFP,SChHA;AAAD,WD4BD,MAAM,GAAG,GAqFP,SAAS,YCjHT;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEJ,WDuBH,MAAM,GAAG,GAoFP,SCjHA,OAME;AAAD,WDuBH,MAAM,GAAG,GAqFP,SAAS,YClHT,OAME;AAAD,WDuBH,MAAM,GAAG,GAoFP,SChHA,OAKE;AAAD,WDuBH,MAAM,GAAG,GAqFP,SAAS,YCjHT,OAKE;AACD,WDsBH,MAAM,GAAG,GAoFP,SCjHA,OAOE;AAAD,WDsBH,MAAM,GAAG,GAqFP,SAAS,YClHT,OAOE;AAAD,WDsBH,MAAM,GAAG,GAoFP,SChHA,OAME;AAAD,WDsBH,MAAM,GAAG,GAqFP,SAAS,YCjHT,OAME;AACD,WDqBH,MAAM,GAAG,GAoFP,SCjHA,OAQE;AAAD,WDqBH,MAAM,GAAG,GAqFP,SAAS,YClHT,OAQE;AAAD,WDqBH,MAAM,GAAG,GAoFP,SChHA,OAOE;AAAD,WDqBH,MAAM,GAAG,GAqFP,SAAS,YCjHT,OAOE;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAMN,WDYH,MAAM,GAAG,GAoFP,SCnGA,SAGE;AAAD,WDYH,MAAM,GAAG,GAqFP,SAAS,YCpGT,SAGE;AAAD,WDYH,MAAM,GAAG,GAoFP,SClGA,UAEE;AAAD,WDYH,MAAM,GAAG,GAqFP,SAAS,YCnGT,UAEE;AAAD,QADM,UAAW,YDapB,MAAM,GAAG,GAoFP,SChGE;AAAD,QADM,UAAW,YDapB,MAAM,GAAG,GAqFP,SAAS,YCjGP;AACD,WDWH,MAAM,GAAG,GAoFP,SCnGA,SAIE;AAAD,WDWH,MAAM,GAAG,GAqFP,SAAS,YCpGT,SAIE;AAAD,WDWH,MAAM,GAAG,GAoFP,SClGA,UAGE;AAAD,WDWH,MAAM,GAAG,GAqFP,SAAS,YCnGT,UAGE;AAAD,QAFM,UAAW,YDapB,MAAM,GAAG,GAoFP,SC/FE;AAAD,QAFM,UAAW,YDapB,MAAM,GAAG,GAqFP,SAAS,YChGP;AACD,WDUH,MAAM,GAAG,GAoFP,SCnGA,SAKE;AAAD,WDUH,MAAM,GAAG,GAqFP,SAAS,YCpGT,SAKE;AAAD,WDUH,MAAM,GAAG,GAoFP,SClGA,UAIE;AAAD,WDUH,MAAM,GAAG,GAqFP,SAAS,YCnGT,UAIE;AAAD,QAHM,UAAW,YDapB,MAAM,GAAG,GAoFP,SC9FE;AAAD,QAHM,UAAW,YDapB,MAAM,GAAG,GAqFP,SAAS,YC/FP;EACC,yBAAA;EACI,qBAAA;;ADiGR,WAzFD,MAAM,GAAG,GAyFP;AACD,WA1FD,MAAM,GAAG,GA0FP,OAAO;ECtIR,WAAA;EACA,yBAAA;EACA,qBAAA;EDsIC,yCAAA;;ACpID,WDwCD,MAAM,GAAG,GAyFP,OCjIA;AAAD,WDwCD,MAAM,GAAG,GA0FP,OAAO,YClIP;AACD,WDuCD,MAAM,GAAG,GAyFP,OChIA;AAAD,WDuCD,MAAM,GAAG,GA0FP,OAAO,YCjIP;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WDkCD,MAAM,GAAG,GAyFP,OC3HA;AAAD,WDkCD,MAAM,GAAG,GA0FP,OAAO,YC5HP;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WD6BD,MAAM,GAAG,GAyFP,OCtHA;AAAD,WD6BD,MAAM,GAAG,GA0FP,OAAO,YCvHP;AACD,WD4BD,MAAM,GAAG,GAyFP,OCrHA;AAAD,WD4BD,MAAM,GAAG,GA0FP,OAAO,YCtHP;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEJ,WDuBH,MAAM,GAAG,GAyFP,OCtHA,OAME;AAAD,WDuBH,MAAM,GAAG,GA0FP,OAAO,YCvHP,OAME;AAAD,WDuBH,MAAM,GAAG,GAyFP,OCrHA,OAKE;AAAD,WDuBH,MAAM,GAAG,GA0FP,OAAO,YCtHP,OAKE;AACD,WDsBH,MAAM,GAAG,GAyFP,OCtHA,OAOE;AAAD,WDsBH,MAAM,GAAG,GA0FP,OAAO,YCvHP,OAOE;AAAD,WDsBH,MAAM,GAAG,GAyFP,OCrHA,OAME;AAAD,WDsBH,MAAM,GAAG,GA0FP,OAAO,YCtHP,OAME;AACD,WDqBH,MAAM,GAAG,GAyFP,OCtHA,OAQE;AAAD,WDqBH,MAAM,GAAG,GA0FP,OAAO,YCvHP,OAQE;AAAD,WDqBH,MAAM,GAAG,GAyFP,OCrHA,OAOE;AAAD,WDqBH,MAAM,GAAG,GA0FP,OAAO,YCtHP,OAOE;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAMN,WDYH,MAAM,GAAG,GAyFP,OCxGA,SAGE;AAAD,WDYH,MAAM,GAAG,GA0FP,OAAO,YCzGP,SAGE;AAAD,WDYH,MAAM,GAAG,GAyFP,OCvGA,UAEE;AAAD,WDYH,MAAM,GAAG,GA0FP,OAAO,YCxGP,UAEE;AAAD,QADM,UAAW,YDapB,MAAM,GAAG,GAyFP,OCrGE;AAAD,QADM,UAAW,YDapB,MAAM,GAAG,GA0FP,OAAO,YCtGL;AACD,WDWH,MAAM,GAAG,GAyFP,OCxGA,SAIE;AAAD,WDWH,MAAM,GAAG,GA0FP,OAAO,YCzGP,SAIE;AAAD,WDWH,MAAM,GAAG,GAyFP,OCvGA,UAGE;AAAD,WDWH,MAAM,GAAG,GA0FP,OAAO,YCxGP,UAGE;AAAD,QAFM,UAAW,YDapB,MAAM,GAAG,GAyFP,OCpGE;AAAD,QAFM,UAAW,YDapB,MAAM,GAAG,GA0FP,OAAO,YCrGL;AACD,WDUH,MAAM,GAAG,GAyFP,OCxGA,SAKE;AAAD,WDUH,MAAM,GAAG,GA0FP,OAAO,YCzGP,SAKE;AAAD,WDUH,MAAM,GAAG,GAyFP,OCvGA,UAIE;AAAD,WDUH,MAAM,GAAG,GA0FP,OAAO,YCxGP,UAIE;AAAD,QAHM,UAAW,YDapB,MAAM,GAAG,GAyFP,OCnGE;AAAD,QAHM,UAAW,YDapB,MAAM,GAAG,GA0FP,OAAO,YCpGL;EACC,yBAAA;EACI,qBAAA;;ADtEV,WA8EC,MAAM,GAAG,GA8FR;EACC,cAAA;EACA,UAAA;EACA,YAAA;EACA,iBAAA;EACA,WAAA;EACA,UAAA;EACA,eAAA;EACA,kBAAA;;AACA,WAvGF,MAAM,GAAG,GA8FR,KASE;AACD,WAxGF,MAAM,GAAG,GA8FR,KAUE;EACA,mBAAA;;AAED,WA3GF,MAAM,GAAG,GA8FR,KAaE;AACD,WA5GF,MAAM,GAAG,GA8FR,KAcE,SAAS;EACT,gBAAA;EACA,cAAA;EACA,eAAA;;AAED,WAjHF,MAAM,GAAG,GA8FR,KAmBE;AACD,WAlHF,MAAM,GAAG,GA8FR,KAoBE,OAAO;AACR,WAnHF,MAAM,GAAG,GA8FR,KAqBE,OAAO;AACR,WApHF,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS;EChKlB,WAAA;EACA,yBAAA;EACA,qBAAA;EDgKE,yCAAA;;AC9JF,WDwCD,MAAM,GAAG,GA8FR,KAmBE,OCzJD;AAAD,WDwCD,MAAM,GAAG,GA8FR,KAoBE,OAAO,MC1JR;AAAD,WDwCD,MAAM,GAAG,GA8FR,KAqBE,OAAO,SC3JR;AAAD,WDwCD,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MC5JjB;AACD,WDuCD,MAAM,GAAG,GA8FR,KAmBE,OCxJD;AAAD,WDuCD,MAAM,GAAG,GA8FR,KAoBE,OAAO,MCzJR;AAAD,WDuCD,MAAM,GAAG,GA8FR,KAqBE,OAAO,SC1JR;AAAD,WDuCD,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MC3JjB;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WDkCD,MAAM,GAAG,GA8FR,KAmBE,OCnJD;AAAD,WDkCD,MAAM,GAAG,GA8FR,KAoBE,OAAO,MCpJR;AAAD,WDkCD,MAAM,GAAG,GA8FR,KAqBE,OAAO,SCrJR;AAAD,WDkCD,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MCtJjB;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEN,WD6BD,MAAM,GAAG,GA8FR,KAmBE,OC9ID;AAAD,WD6BD,MAAM,GAAG,GA8FR,KAoBE,OAAO,MC/IR;AAAD,WD6BD,MAAM,GAAG,GA8FR,KAqBE,OAAO,SChJR;AAAD,WD6BD,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MCjJjB;AACD,WD4BD,MAAM,GAAG,GA8FR,KAmBE,OC7ID;AAAD,WD4BD,MAAM,GAAG,GA8FR,KAoBE,OAAO,MC9IR;AAAD,WD4BD,MAAM,GAAG,GA8FR,KAqBE,OAAO,SC/IR;AAAD,WD4BD,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MChJjB;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAEJ,WDuBH,MAAM,GAAG,GA8FR,KAmBE,OC9ID,OAME;AAAD,WDuBH,MAAM,GAAG,GA8FR,KAoBE,OAAO,MC/IR,OAME;AAAD,WDuBH,MAAM,GAAG,GA8FR,KAqBE,OAAO,SChJR,OAME;AAAD,WDuBH,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MCjJjB,OAME;AAAD,WDuBH,MAAM,GAAG,GA8FR,KAmBE,OC7ID,OAKE;AAAD,WDuBH,MAAM,GAAG,GA8FR,KAoBE,OAAO,MC9IR,OAKE;AAAD,WDuBH,MAAM,GAAG,GA8FR,KAqBE,OAAO,SC/IR,OAKE;AAAD,WDuBH,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MChJjB,OAKE;AACD,WDsBH,MAAM,GAAG,GA8FR,KAmBE,OC9ID,OAOE;AAAD,WDsBH,MAAM,GAAG,GA8FR,KAoBE,OAAO,MC/IR,OAOE;AAAD,WDsBH,MAAM,GAAG,GA8FR,KAqBE,OAAO,SChJR,OAOE;AAAD,WDsBH,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MCjJjB,OAOE;AAAD,WDsBH,MAAM,GAAG,GA8FR,KAmBE,OC7ID,OAME;AAAD,WDsBH,MAAM,GAAG,GA8FR,KAoBE,OAAO,MC9IR,OAME;AAAD,WDsBH,MAAM,GAAG,GA8FR,KAqBE,OAAO,SC/IR,OAME;AAAD,WDsBH,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MChJjB,OAME;AACD,WDqBH,MAAM,GAAG,GA8FR,KAmBE,OC9ID,OAQE;AAAD,WDqBH,MAAM,GAAG,GA8FR,KAoBE,OAAO,MC/IR,OAQE;AAAD,WDqBH,MAAM,GAAG,GA8FR,KAqBE,OAAO,SChJR,OAQE;AAAD,WDqBH,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MCjJjB,OAQE;AAAD,WDqBH,MAAM,GAAG,GA8FR,KAmBE,OC7ID,OAOE;AAAD,WDqBH,MAAM,GAAG,GA8FR,KAoBE,OAAO,MC9IR,OAOE;AAAD,WDqBH,MAAM,GAAG,GA8FR,KAqBE,OAAO,SC/IR,OAOE;AAAD,WDqBH,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MChJjB,OAOE;EACC,WAAA;EACA,yBAAA;EACI,qBAAA;;AAMN,WDYH,MAAM,GAAG,GA8FR,KAmBE,OChID,SAGE;AAAD,WDYH,MAAM,GAAG,GA8FR,KAoBE,OAAO,MCjIR,SAGE;AAAD,WDYH,MAAM,GAAG,GA8FR,KAqBE,OAAO,SClIR,SAGE;AAAD,WDYH,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MCnIjB,SAGE;AAAD,WDYH,MAAM,GAAG,GA8FR,KAmBE,OC/HD,UAEE;AAAD,WDYH,MAAM,GAAG,GA8FR,KAoBE,OAAO,MChIR,UAEE;AAAD,WDYH,MAAM,GAAG,GA8FR,KAqBE,OAAO,SCjIR,UAEE;AAAD,WDYH,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MClIjB,UAEE;AAAD,QADM,UAAW,YDapB,MAAM,GAAG,GA8FR,KAmBE,OC7HC;AAAD,QADM,UAAW,YDapB,MAAM,GAAG,GA8FR,KAoBE,OAAO,MC9HN;AAAD,QADM,UAAW,YDapB,MAAM,GAAG,GA8FR,KAqBE,OAAO,SC/HN;AAAD,QADM,UAAW,YDapB,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MChIf;AACD,WDWH,MAAM,GAAG,GA8FR,KAmBE,OChID,SAIE;AAAD,WDWH,MAAM,GAAG,GA8FR,KAoBE,OAAO,MCjIR,SAIE;AAAD,WDWH,MAAM,GAAG,GA8FR,KAqBE,OAAO,SClIR,SAIE;AAAD,WDWH,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MCnIjB,SAIE;AAAD,WDWH,MAAM,GAAG,GA8FR,KAmBE,OC/HD,UAGE;AAAD,WDWH,MAAM,GAAG,GA8FR,KAoBE,OAAO,MChIR,UAGE;AAAD,WDWH,MAAM,GAAG,GA8FR,KAqBE,OAAO,SCjIR,UAGE;AAAD,WDWH,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MClIjB,UAGE;AAAD,QAFM,UAAW,YDapB,MAAM,GAAG,GA8FR,KAmBE,OC5HC;AAAD,QAFM,UAAW,YDapB,MAAM,GAAG,GA8FR,KAoBE,OAAO,MC7HN;AAAD,QAFM,UAAW,YDapB,MAAM,GAAG,GA8FR,KAqBE,OAAO,SC9HN;AAAD,QAFM,UAAW,YDapB,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MC/Hf;AACD,WDUH,MAAM,GAAG,GA8FR,KAmBE,OChID,SAKE;AAAD,WDUH,MAAM,GAAG,GA8FR,KAoBE,OAAO,MCjIR,SAKE;AAAD,WDUH,MAAM,GAAG,GA8FR,KAqBE,OAAO,SClIR,SAKE;AAAD,WDUH,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MCnIjB,SAKE;AAAD,WDUH,MAAM,GAAG,GA8FR,KAmBE,OC/HD,UAIE;AAAD,WDUH,MAAM,GAAG,GA8FR,KAoBE,OAAO,MChIR,UAIE;AAAD,WDUH,MAAM,GAAG,GA8FR,KAqBE,OAAO,SCjIR,UAIE;AAAD,WDUH,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MClIjB,UAIE;AAAD,QAHM,UAAW,YDapB,MAAM,GAAG,GA8FR,KAmBE,OC3HC;AAAD,QAHM,UAAW,YDapB,MAAM,GAAG,GA8FR,KAoBE,OAAO,MC5HN;AAAD,QAHM,UAAW,YDapB,MAAM,GAAG,GA8FR,KAqBE,OAAO,SC7HN;AAAD,QAHM,UAAW,YDapB,MAAM,GAAG,GA8FR,KAsBE,OAAO,SAAS,MC9Hf;EACC,yBAAA;EACI,qBAAA;;ADgIP,WAxHF,MAAM,GAAG,GA8FR,KA0BE;AACD,WAzHF,MAAM,GAAG,GA8FR,KA2BE;EACA,cAAA;;AAxMJ,WA6MC;EACC,YAAA;;AA9MF,WAiNC;AAjND,WAkNC;AAlND,WAmNC;AAnND,WAoNC,MAAM,GAAG;EACR,eAAA;;AACA,WALD,mBAKE;AAAD,WAJD,MAIE;AAAD,WAHD,MAGE;AAAD,WAFD,MAAM,GAAG,GAEP;EACA,mBAAA;;AAKD,WADD,MACE;AAAD,WADM,MACL;EACA,kBAAA;;AA7NH,WAkOC;EACC,eAAA;EACA,WAAA;EACA,oBAAA;EACA,sBAAA;;AAGF,YAAY,KAAM;EACjB,eAAA;;AAED;EACC,WAAA;;AADD,gBAEC;EACC,kBAAA;;AAHF,gBAKC,MAAK;EACJ,0BAAA;;AANF,gBAQC,MAAK;EACJ,0BAAA;;AATF,gBAWC;EACC,WAAA;EACA,eAAA;EACA,gBAAA;EACA,uBAAA;EACA,yBAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA","sourcesContent":[".datepicker {\n\tborder-radius: @border-radius-base;\n\t&-inline {\n\t\twidth: 220px;\n\t}\n\tdirection: ltr;\n\t&-rtl {\n\t\tdirection: rtl;\n\t\t&.dropdown-menu { left: auto; }\n\t\ttable tr td span {\n\t\t\tfloat: right;\n\t\t}\n\t}\n\t&-dropdown {\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tpadding: 4px;\n\t\t&:before {\n\t\t\tcontent: '';\n\t\t\tdisplay: inline-block;\n\t\t\tborder-left: 7px solid transparent;\n\t\t\tborder-right: 7px solid transparent;\n\t\t\tborder-bottom: 7px solid @dropdown-border;\n\t\t\tborder-top: 0;\n\t\t\tborder-bottom-color: rgba(0,0,0,.2);\n\t\t\tposition: absolute;\n\t\t}\n\t\t&:after {\n\t\t\tcontent: '';\n\t\t\tdisplay: inline-block;\n\t\t\tborder-left: 6px solid transparent;\n\t\t\tborder-right: 6px solid transparent;\n\t\t\tborder-bottom: 6px solid @dropdown-bg;\n\t\t\tborder-top: 0;\n\t\t\tposition: absolute;\n\t\t}\n\t\t&.datepicker-orient-left:before { left: 6px; }\n\t\t&.datepicker-orient-left:after { left: 7px; }\n\t\t&.datepicker-orient-right:before { right: 6px; }\n\t\t&.datepicker-orient-right:after { right: 7px; }\n\t\t&.datepicker-orient-bottom:before { top: -7px; }\n\t\t&.datepicker-orient-bottom:after { top: -6px; }\n\t\t&.datepicker-orient-top:before {\n\t\t\tbottom: -7px;\n\t\t\tborder-bottom: 0;\n\t\t\tborder-top: 7px solid @dropdown-border;\n\t\t}\n\t\t&.datepicker-orient-top:after {\n\t\t\tbottom: -6px;\n\t\t\tborder-bottom: 0;\n\t\t\tborder-top: 6px solid @dropdown-bg;\n\t\t}\n\t}\n\ttable {\n\t\tmargin: 0;\n\t\t-webkit-touch-callout: none;\n\t\t-webkit-user-select: none;\n\t\t-khtml-user-select: none;\n\t\t-moz-user-select: none;\n\t\t-ms-user-select: none;\n\t\tuser-select: none;\n\t\ttr {\n\t\t\ttd, th {\n\t\t\t\ttext-align: center;\n\t\t\t\twidth: 30px;\n\t\t\t\theight: 30px;\n\t\t\t\tborder-radius: 4px;\n\t\t\t\tborder: none;\n\t\t\t}\n\t\t}\n\t}\n\t// Inline display inside a table presents some problems with\n\t// border and background colors.\n\t.table-striped & table tr {\n\t\ttd, th {\n\t\t\tbackground-color: transparent;\n\t\t}\n\t}\n\ttable tr td {\n\t\t&.old,\n\t\t&.new {\n\t\t\tcolor: @btn-link-disabled-color;\n\t\t}\n\t\t&.day:hover,\n\t\t&.focused {\n\t\t\tbackground: @gray-lighter;\n\t\t\tcursor: pointer;\n\t\t}\n\t\t&.disabled,\n\t\t&.disabled:hover {\n\t\t\tbackground: none;\n\t\t\tcolor: @btn-link-disabled-color;\n\t\t\tcursor: default;\n\t\t}\n\t\t&.highlighted {\n\t\t\t@highlighted-bg: @state-info-bg;\n\t\t\t.button-variant(#000, @highlighted-bg, darken(@highlighted-bg, 20%));\n\t\t\tborder-radius: 0;\n\n\t\t\t&.focused {\n\t\t\t\tbackground: darken(@highlighted-bg, 10%);\n\t\t\t}\n\n\t\t\t&.disabled,\n\t\t\t&.disabled:active {\n\t\t\t\tbackground: @highlighted-bg;\n\t\t\t\tcolor: @btn-link-disabled-color;\n\t\t\t}\n\t\t}\n\t\t&.today {\n\t\t\t@today-bg: lighten(orange, 30%);\n\t\t\t.button-variant(#000, @today-bg, darken(@today-bg, 20%));\n\n\t\t\t&.focused {\n\t\t\t\tbackground: darken(@today-bg, 10%);\n\t\t\t}\n\n\t\t\t&.disabled,\n\t\t\t&.disabled:active {\n\t\t\t\tbackground: @today-bg;\n\t\t\t\tcolor: @btn-link-disabled-color;\n\t\t\t}\n\t\t}\n\t\t&.range {\n\t\t\t@range-bg: @gray-lighter;\n\t\t\t.button-variant(#000, @range-bg, darken(@range-bg, 20%));\n\t\t\tborder-radius: 0;\n\n\t\t\t&.focused {\n\t\t\t\tbackground: darken(@range-bg, 10%);\n\t\t\t}\n\n\t\t\t&.disabled,\n\t\t\t&.disabled:active {\n\t\t\t\tbackground: @range-bg;\n\t\t\t\tcolor: @btn-link-disabled-color;\n\t\t\t}\n\t\t}\n\t\t&.range.highlighted {\n\t\t\t@range-highlighted-bg: mix(@state-info-bg, @gray-lighter, 50%);\n\t\t\t.button-variant(#000, @range-highlighted-bg, darken(@range-highlighted-bg, 20%));\n\n\t\t\t&.focused {\n\t\t\t\tbackground: darken(@range-highlighted-bg, 10%);\n\t\t\t}\n\n\t\t\t&.disabled,\n\t\t\t&.disabled:active {\n\t\t\t\tbackground: @range-highlighted-bg;\n\t\t\t\tcolor: @btn-link-disabled-color;\n\t\t\t}\n\t\t}\n\t\t&.range.today {\n\t\t\t@range-today-bg: mix(orange, @gray-lighter, 50%);\n\t\t\t.button-variant(#000, @range-today-bg, darken(@range-today-bg, 20%));\n\n\t\t\t&.disabled,\n\t\t\t&.disabled:active {\n\t\t\t\tbackground: @range-today-bg;\n\t\t\t\tcolor: @btn-link-disabled-color;\n\t\t\t}\n\t\t}\n\t\t&.selected,\n\t\t&.selected.highlighted {\n\t\t\t.button-variant(#fff, @gray-light, @gray);\n\t\t\ttext-shadow: 0 -1px 0 rgba(0,0,0,.25);\n\t\t}\n\t\t&.active,\n\t\t&.active.highlighted {\n\t\t\t.button-variant(@btn-primary-color, @btn-primary-bg, @btn-primary-border);\n\t\t\ttext-shadow: 0 -1px 0 rgba(0,0,0,.25);\n\t\t}\n\t\tspan {\n\t\t\tdisplay: block;\n\t\t\twidth: 23%;\n\t\t\theight: 54px;\n\t\t\tline-height: 54px;\n\t\t\tfloat: left;\n\t\t\tmargin: 1%;\n\t\t\tcursor: pointer;\n\t\t\tborder-radius: 4px;\n\t\t\t&:hover,\n\t\t\t&.focused {\n\t\t\t\tbackground: @gray-lighter;\n\t\t\t}\n\t\t\t&.disabled,\n\t\t\t&.disabled:hover {\n\t\t\t\tbackground: none;\n\t\t\t\tcolor: @btn-link-disabled-color;\n\t\t\t\tcursor: default;\n\t\t\t}\n\t\t\t&.active,\n\t\t\t&.active:hover,\n\t\t\t&.active.disabled,\n\t\t\t&.active.disabled:hover {\n\t\t\t\t.button-variant(@btn-primary-color, @btn-primary-bg, @btn-primary-border);\n\t\t\t\ttext-shadow: 0 -1px 0 rgba(0,0,0,.25);\n\t\t\t}\n\t\t\t&.old,\n\t\t\t&.new {\n\t\t\t\tcolor: @btn-link-disabled-color;\n\t\t\t}\n\t\t}\n\t}\n\n\t.datepicker-switch {\n\t\twidth: 145px;\n\t}\n\n\t.datepicker-switch,\n\t.prev,\n\t.next,\n\ttfoot tr th {\n\t\tcursor: pointer;\n\t\t&:hover {\n\t\t\tbackground: @gray-lighter;\n\t\t}\n\t}\n\n\t.prev, .next {\n\t\t&.disabled {\n\t\t\tvisibility: hidden;\n\t\t}\n\t}\n\n\t// Basic styling for calendar-week cells\n\t.cw {\n\t\tfont-size: 10px;\n\t\twidth: 12px;\n\t\tpadding: 0 2px 0 5px;\n\t\tvertical-align: middle;\n\t}\n}\n.input-group.date .input-group-addon {\n\tcursor: pointer;\n}\n.input-daterange {\n\twidth: 100%;\n\tinput {\n\t\ttext-align: center;\n\t}\n\tinput:first-child {\n\t\tborder-radius: 3px 0 0 3px;\n\t}\n\tinput:last-child {\n\t\tborder-radius: 0 3px 3px 0;\n\t}\n\t.input-group-addon {\n\t\twidth: auto;\n\t\tmin-width: 16px;\n\t\tpadding: 4px 5px;\n\t\tline-height: @line-height-base;\n\t\ttext-shadow: 0 1px 0 #fff;\n\t\tborder-width: 1px 0;\n\t\tmargin-left: -5px;\n\t\tmargin-right: -5px;\n\t}\n}\n","// Datepicker .less buildfile. Includes select mixins/variables from bootstrap\n// and imports the included datepicker.less to output a minimal datepicker.css\n//\n// Usage:\n// lessc build3.less datepicker.css\n//\n// Variables and mixins copied from Bootstrap 3.3.5\n\n// Variables\n@gray: lighten(#000, 33.5%); // #555\n@gray-light: lighten(#000, 46.7%); // #777\n@gray-lighter: lighten(#000, 93.5%); // #eee\n\n@brand-primary: darken(#428bca, 6.5%); // #337ab7\n\n@btn-primary-color: #fff;\n@btn-primary-bg: @brand-primary;\n@btn-primary-border: darken(@btn-primary-bg, 5%);\n\n@btn-link-disabled-color: @gray-light;\n\n@state-info-bg: #d9edf7;\n\n@line-height-base: 1.428571429; // 20/14\n@border-radius-base: 4px;\n\n@dropdown-bg: #fff;\n@dropdown-border: rgba(0,0,0,.15);\n\n\n// Mixins\n\n// Button variants\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n}\n\n@import \"../less/datepicker3.less\";\n"]} \ No newline at end of file diff --git a/src/cps/static/css/libs/bootstrap-datepicker3.min.css b/src/cps/static/css/libs/bootstrap-datepicker3.min.css new file mode 100644 index 0000000..d0ee6e7 --- /dev/null +++ b/src/cps/static/css/libs/bootstrap-datepicker3.min.css @@ -0,0 +1,7 @@ +/*! + * Datepicker for Bootstrap v1.7.1 (https://github.com/uxsolutions/bootstrap-datepicker) + * + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */ + +.datepicker{border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker-rtl{direction:rtl}.datepicker-rtl.dropdown-menu{left:auto}.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0;padding:4px}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(0,0,0,.15);border-top:0;border-bottom-color:rgba(0,0,0,.2);position:absolute}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;border-top:0;position:absolute}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-bottom:before{top:-7px}.datepicker-dropdown.datepicker-orient-bottom:after{top:-6px}.datepicker-dropdown.datepicker-orient-top:before{bottom:-7px;border-bottom:0;border-top:7px solid rgba(0,0,0,.15)}.datepicker-dropdown.datepicker-orient-top:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker table tr td,.datepicker table tr th{text-align:center;width:30px;height:30px;border-radius:4px;border:none}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.new,.datepicker table tr td.old{color:#777}.datepicker table tr td.day:hover,.datepicker table tr td.focused{background:#eee;cursor:pointer}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:0 0;color:#777;cursor:default}.datepicker table tr td.highlighted{color:#000;background-color:#d9edf7;border-color:#85c5e5;border-radius:0}.datepicker table tr td.highlighted.focus,.datepicker table tr td.highlighted:focus{color:#000;background-color:#afd9ee;border-color:#298fc2}.datepicker table tr td.highlighted:hover{color:#000;background-color:#afd9ee;border-color:#52addb}.datepicker table tr td.highlighted.active,.datepicker table tr td.highlighted:active{color:#000;background-color:#afd9ee;border-color:#52addb}.datepicker table tr td.highlighted.active.focus,.datepicker table tr td.highlighted.active:focus,.datepicker table tr td.highlighted.active:hover,.datepicker table tr td.highlighted:active.focus,.datepicker table tr td.highlighted:active:focus,.datepicker table tr td.highlighted:active:hover{color:#000;background-color:#91cbe8;border-color:#298fc2}.datepicker table tr td.highlighted.disabled.focus,.datepicker table tr td.highlighted.disabled:focus,.datepicker table tr td.highlighted.disabled:hover,.datepicker table tr td.highlighted[disabled].focus,.datepicker table tr td.highlighted[disabled]:focus,.datepicker table tr td.highlighted[disabled]:hover,fieldset[disabled] .datepicker table tr td.highlighted.focus,fieldset[disabled] .datepicker table tr td.highlighted:focus,fieldset[disabled] .datepicker table tr td.highlighted:hover{background-color:#d9edf7;border-color:#85c5e5}.datepicker table tr td.highlighted.focused{background:#afd9ee}.datepicker table tr td.highlighted.disabled,.datepicker table tr td.highlighted.disabled:active{background:#d9edf7;color:#777}.datepicker table tr td.today{color:#000;background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today.focus,.datepicker table tr td.today:focus{color:#000;background-color:#ffc966;border-color:#b37400}.datepicker table tr td.today:hover{color:#000;background-color:#ffc966;border-color:#f59e00}.datepicker table tr td.today.active,.datepicker table tr td.today:active{color:#000;background-color:#ffc966;border-color:#f59e00}.datepicker table tr td.today.active.focus,.datepicker table tr td.today.active:focus,.datepicker table tr td.today.active:hover,.datepicker table tr td.today:active.focus,.datepicker table tr td.today:active:focus,.datepicker table tr td.today:active:hover{color:#000;background-color:#ffbc42;border-color:#b37400}.datepicker table tr td.today.disabled.focus,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today[disabled].focus,.datepicker table tr td.today[disabled]:focus,.datepicker table tr td.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.today.focus,fieldset[disabled] .datepicker table tr td.today:focus,fieldset[disabled] .datepicker table tr td.today:hover{background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today.focused{background:#ffc966}.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:active{background:#ffdb99;color:#777}.datepicker table tr td.range{color:#000;background-color:#eee;border-color:#bbb;border-radius:0}.datepicker table tr td.range.focus,.datepicker table tr td.range:focus{color:#000;background-color:#d5d5d5;border-color:#7c7c7c}.datepicker table tr td.range:hover{color:#000;background-color:#d5d5d5;border-color:#9d9d9d}.datepicker table tr td.range.active,.datepicker table tr td.range:active{color:#000;background-color:#d5d5d5;border-color:#9d9d9d}.datepicker table tr td.range.active.focus,.datepicker table tr td.range.active:focus,.datepicker table tr td.range.active:hover,.datepicker table tr td.range:active.focus,.datepicker table tr td.range:active:focus,.datepicker table tr td.range:active:hover{color:#000;background-color:#c3c3c3;border-color:#7c7c7c}.datepicker table tr td.range.disabled.focus,.datepicker table tr td.range.disabled:focus,.datepicker table tr td.range.disabled:hover,.datepicker table tr td.range[disabled].focus,.datepicker table tr td.range[disabled]:focus,.datepicker table tr td.range[disabled]:hover,fieldset[disabled] .datepicker table tr td.range.focus,fieldset[disabled] .datepicker table tr td.range:focus,fieldset[disabled] .datepicker table tr td.range:hover{background-color:#eee;border-color:#bbb}.datepicker table tr td.range.focused{background:#d5d5d5}.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:active{background:#eee;color:#777}.datepicker table tr td.range.highlighted{color:#000;background-color:#e4eef3;border-color:#9dc1d3}.datepicker table tr td.range.highlighted.focus,.datepicker table tr td.range.highlighted:focus{color:#000;background-color:#c1d7e3;border-color:#4b88a6}.datepicker table tr td.range.highlighted:hover{color:#000;background-color:#c1d7e3;border-color:#73a6c0}.datepicker table tr td.range.highlighted.active,.datepicker table tr td.range.highlighted:active{color:#000;background-color:#c1d7e3;border-color:#73a6c0}.datepicker table tr td.range.highlighted.active.focus,.datepicker table tr td.range.highlighted.active:focus,.datepicker table tr td.range.highlighted.active:hover,.datepicker table tr td.range.highlighted:active.focus,.datepicker table tr td.range.highlighted:active:focus,.datepicker table tr td.range.highlighted:active:hover{color:#000;background-color:#a8c8d8;border-color:#4b88a6}.datepicker table tr td.range.highlighted.disabled.focus,.datepicker table tr td.range.highlighted.disabled:focus,.datepicker table tr td.range.highlighted.disabled:hover,.datepicker table tr td.range.highlighted[disabled].focus,.datepicker table tr td.range.highlighted[disabled]:focus,.datepicker table tr td.range.highlighted[disabled]:hover,fieldset[disabled] .datepicker table tr td.range.highlighted.focus,fieldset[disabled] .datepicker table tr td.range.highlighted:focus,fieldset[disabled] .datepicker table tr td.range.highlighted:hover{background-color:#e4eef3;border-color:#9dc1d3}.datepicker table tr td.range.highlighted.focused{background:#c1d7e3}.datepicker table tr td.range.highlighted.disabled,.datepicker table tr td.range.highlighted.disabled:active{background:#e4eef3;color:#777}.datepicker table tr td.range.today{color:#000;background-color:#f7ca77;border-color:#f1a417}.datepicker table tr td.range.today.focus,.datepicker table tr td.range.today:focus{color:#000;background-color:#f4b747;border-color:#815608}.datepicker table tr td.range.today:hover{color:#000;background-color:#f4b747;border-color:#bf800c}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:active{color:#000;background-color:#f4b747;border-color:#bf800c}.datepicker table tr td.range.today.active.focus,.datepicker table tr td.range.today.active:focus,.datepicker table tr td.range.today.active:hover,.datepicker table tr td.range.today:active.focus,.datepicker table tr td.range.today:active:focus,.datepicker table tr td.range.today:active:hover{color:#000;background-color:#f2aa25;border-color:#815608}.datepicker table tr td.range.today.disabled.focus,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today[disabled].focus,.datepicker table tr td.range.today[disabled]:focus,.datepicker table tr td.range.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.range.today.focus,fieldset[disabled] .datepicker table tr td.range.today:focus,fieldset[disabled] .datepicker table tr td.range.today:hover{background-color:#f7ca77;border-color:#f1a417}.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:active{background:#f7ca77;color:#777}.datepicker table tr td.selected,.datepicker table tr td.selected.highlighted{color:#fff;background-color:#777;border-color:#555;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.selected.focus,.datepicker table tr td.selected.highlighted.focus,.datepicker table tr td.selected.highlighted:focus,.datepicker table tr td.selected:focus{color:#fff;background-color:#5e5e5e;border-color:#161616}.datepicker table tr td.selected.highlighted:hover,.datepicker table tr td.selected:hover{color:#fff;background-color:#5e5e5e;border-color:#373737}.datepicker table tr td.selected.active,.datepicker table tr td.selected.highlighted.active,.datepicker table tr td.selected.highlighted:active,.datepicker table tr td.selected:active{color:#fff;background-color:#5e5e5e;border-color:#373737}.datepicker table tr td.selected.active.focus,.datepicker table tr td.selected.active:focus,.datepicker table tr td.selected.active:hover,.datepicker table tr td.selected.highlighted.active.focus,.datepicker table tr td.selected.highlighted.active:focus,.datepicker table tr td.selected.highlighted.active:hover,.datepicker table tr td.selected.highlighted:active.focus,.datepicker table tr td.selected.highlighted:active:focus,.datepicker table tr td.selected.highlighted:active:hover,.datepicker table tr td.selected:active.focus,.datepicker table tr td.selected:active:focus,.datepicker table tr td.selected:active:hover{color:#fff;background-color:#4c4c4c;border-color:#161616}.datepicker table tr td.selected.disabled.focus,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.highlighted.disabled.focus,.datepicker table tr td.selected.highlighted.disabled:focus,.datepicker table tr td.selected.highlighted.disabled:hover,.datepicker table tr td.selected.highlighted[disabled].focus,.datepicker table tr td.selected.highlighted[disabled]:focus,.datepicker table tr td.selected.highlighted[disabled]:hover,.datepicker table tr td.selected[disabled].focus,.datepicker table tr td.selected[disabled]:focus,.datepicker table tr td.selected[disabled]:hover,fieldset[disabled] .datepicker table tr td.selected.focus,fieldset[disabled] .datepicker table tr td.selected.highlighted.focus,fieldset[disabled] .datepicker table tr td.selected.highlighted:focus,fieldset[disabled] .datepicker table tr td.selected.highlighted:hover,fieldset[disabled] .datepicker table tr td.selected:focus,fieldset[disabled] .datepicker table tr td.selected:hover{background-color:#777;border-color:#555}.datepicker table tr td.active,.datepicker table tr td.active.highlighted{color:#fff;background-color:#337ab7;border-color:#2e6da4;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.active.focus,.datepicker table tr td.active.highlighted.focus,.datepicker table tr td.active.highlighted:focus,.datepicker table tr td.active:focus{color:#fff;background-color:#286090;border-color:#122b40}.datepicker table tr td.active.highlighted:hover,.datepicker table tr td.active:hover{color:#fff;background-color:#286090;border-color:#204d74}.datepicker table tr td.active.active,.datepicker table tr td.active.highlighted.active,.datepicker table tr td.active.highlighted:active,.datepicker table tr td.active:active{color:#fff;background-color:#286090;border-color:#204d74}.datepicker table tr td.active.active.focus,.datepicker table tr td.active.active:focus,.datepicker table tr td.active.active:hover,.datepicker table tr td.active.highlighted.active.focus,.datepicker table tr td.active.highlighted.active:focus,.datepicker table tr td.active.highlighted.active:hover,.datepicker table tr td.active.highlighted:active.focus,.datepicker table tr td.active.highlighted:active:focus,.datepicker table tr td.active.highlighted:active:hover,.datepicker table tr td.active:active.focus,.datepicker table tr td.active:active:focus,.datepicker table tr td.active:active:hover{color:#fff;background-color:#204d74;border-color:#122b40}.datepicker table tr td.active.disabled.focus,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.highlighted.disabled.focus,.datepicker table tr td.active.highlighted.disabled:focus,.datepicker table tr td.active.highlighted.disabled:hover,.datepicker table tr td.active.highlighted[disabled].focus,.datepicker table tr td.active.highlighted[disabled]:focus,.datepicker table tr td.active.highlighted[disabled]:hover,.datepicker table tr td.active[disabled].focus,.datepicker table tr td.active[disabled]:focus,.datepicker table tr td.active[disabled]:hover,fieldset[disabled] .datepicker table tr td.active.focus,fieldset[disabled] .datepicker table tr td.active.highlighted.focus,fieldset[disabled] .datepicker table tr td.active.highlighted:focus,fieldset[disabled] .datepicker table tr td.active.highlighted:hover,fieldset[disabled] .datepicker table tr td.active:focus,fieldset[disabled] .datepicker table tr td.active:hover{background-color:#337ab7;border-color:#2e6da4}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;border-radius:4px}.datepicker table tr td span.focused,.datepicker table tr td span:hover{background:#eee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:0 0;color:#777;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active:hover{color:#fff;background-color:#337ab7;border-color:#2e6da4;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td span.active.disabled.focus,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover.focus,.datepicker table tr td span.active.disabled:hover:focus,.datepicker table tr td span.active.focus,.datepicker table tr td span.active:focus,.datepicker table tr td span.active:hover.focus,.datepicker table tr td span.active:hover:focus{color:#fff;background-color:#286090;border-color:#122b40}.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover:hover{color:#fff;background-color:#286090;border-color:#204d74}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active{color:#fff;background-color:#286090;border-color:#204d74}.datepicker table tr td span.active.active.focus,.datepicker table tr td span.active.active:focus,.datepicker table tr td span.active.active:hover,.datepicker table tr td span.active.disabled.active.focus,.datepicker table tr td span.active.disabled.active:focus,.datepicker table tr td span.active.disabled.active:hover,.datepicker table tr td span.active.disabled:active.focus,.datepicker table tr td span.active.disabled:active:focus,.datepicker table tr td span.active.disabled:active:hover,.datepicker table tr td span.active.disabled:hover.active.focus,.datepicker table tr td span.active.disabled:hover.active:focus,.datepicker table tr td span.active.disabled:hover.active:hover,.datepicker table tr td span.active.disabled:hover:active.focus,.datepicker table tr td span.active.disabled:hover:active:focus,.datepicker table tr td span.active.disabled:hover:active:hover,.datepicker table tr td span.active:active.focus,.datepicker table tr td span.active:active:focus,.datepicker table tr td span.active:active:hover,.datepicker table tr td span.active:hover.active.focus,.datepicker table tr td span.active:hover.active:focus,.datepicker table tr td span.active:hover.active:hover,.datepicker table tr td span.active:hover:active.focus,.datepicker table tr td span.active:hover:active:focus,.datepicker table tr td span.active:hover:active:hover{color:#fff;background-color:#204d74;border-color:#122b40}.datepicker table tr td span.active.disabled.disabled.focus,.datepicker table tr td span.active.disabled.disabled:focus,.datepicker table tr td span.active.disabled.disabled:hover,.datepicker table tr td span.active.disabled.focus,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.disabled.focus,.datepicker table tr td span.active.disabled:hover.disabled:focus,.datepicker table tr td span.active.disabled:hover.disabled:hover,.datepicker table tr td span.active.disabled:hover[disabled].focus,.datepicker table tr td span.active.disabled:hover[disabled]:focus,.datepicker table tr td span.active.disabled:hover[disabled]:hover,.datepicker table tr td span.active.disabled[disabled].focus,.datepicker table tr td span.active.disabled[disabled]:focus,.datepicker table tr td span.active.disabled[disabled]:hover,.datepicker table tr td span.active:hover.disabled.focus,.datepicker table tr td span.active:hover.disabled:focus,.datepicker table tr td span.active:hover.disabled:hover,.datepicker table tr td span.active:hover[disabled].focus,.datepicker table tr td span.active:hover[disabled]:focus,.datepicker table tr td span.active:hover[disabled]:hover,.datepicker table tr td span.active[disabled].focus,.datepicker table tr td span.active[disabled]:focus,.datepicker table tr td span.active[disabled]:hover,fieldset[disabled] .datepicker table tr td span.active.disabled.focus,fieldset[disabled] .datepicker table tr td span.active.disabled:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover,fieldset[disabled] .datepicker table tr td span.active.disabled:hover.focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td span.active.focus,fieldset[disabled] .datepicker table tr td span.active:focus,fieldset[disabled] .datepicker table tr td span.active:hover,fieldset[disabled] .datepicker table tr td span.active:hover.focus,fieldset[disabled] .datepicker table tr td span.active:hover:focus,fieldset[disabled] .datepicker table tr td span.active:hover:hover{background-color:#337ab7;border-color:#2e6da4}.datepicker table tr td span.new,.datepicker table tr td span.old{color:#777}.datepicker .datepicker-switch{width:145px}.datepicker .datepicker-switch,.datepicker .next,.datepicker .prev,.datepicker tfoot tr th{cursor:pointer}.datepicker .datepicker-switch:hover,.datepicker .next:hover,.datepicker .prev:hover,.datepicker tfoot tr th:hover{background:#eee}.datepicker .next.disabled,.datepicker .prev.disabled{visibility:hidden}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.input-group.date .input-group-addon{cursor:pointer}.input-daterange{width:100%}.input-daterange input{text-align:center}.input-daterange input:first-child{border-radius:3px 0 0 3px}.input-daterange input:last-child{border-radius:0 3px 3px 0}.input-daterange .input-group-addon{width:auto;min-width:16px;padding:4px 5px;line-height:1.42857143;text-shadow:0 1px 0 #fff;border-width:1px 0;margin-left:-5px;margin-right:-5px} \ No newline at end of file diff --git a/src/cps/static/css/libs/bootstrap-editable.css b/src/cps/static/css/libs/bootstrap-editable.css new file mode 100644 index 0000000..ff7ea50 --- /dev/null +++ b/src/cps/static/css/libs/bootstrap-editable.css @@ -0,0 +1,663 @@ +/*! X-editable - v1.5.3 +* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery +* http://github.com/vitalets/x-editable +* Copyright (c) 2015 Vitaliy Potapov; Licensed MIT */ +.editableform { + margin-bottom: 0; /* overwrites bootstrap margin */ +} + +.editableform .control-group { + margin-bottom: 0; /* overwrites bootstrap margin */ + white-space: nowrap; /* prevent wrapping buttons on new line */ + line-height: 20px; /* overwriting bootstrap line-height. See #133 */ +} + +/* + BS3 width:1005 for inputs breaks editable form in popup + See: https://github.com/vitalets/x-editable/issues/393 +*/ +.editableform .form-control { + width: auto; +} + +.editable-buttons { + display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */ + vertical-align: top; + margin-left: 7px; + /* inline-block emulation for IE7*/ + zoom: 1; + *display: inline; +} + +.editable-buttons.editable-buttons-bottom { + display: block; + margin-top: 7px; + margin-left: 0; +} + +.editable-input { + vertical-align: top; + display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */ + width: auto; /* bootstrap-responsive has width: 100% that breakes layout */ + white-space: normal; /* reset white-space decalred in parent*/ + /* display-inline emulation for IE7*/ + zoom: 1; + *display: inline; +} + +.editable-buttons .editable-cancel { + margin-left: 7px; +} + +/*for jquery-ui buttons need set height to look more pretty*/ +.editable-buttons button.ui-button-icon-only { + height: 24px; + width: 30px; +} + +.editableform-loading { + background: url('../img/loading.gif') center center no-repeat; + height: 25px; + width: auto; + min-width: 25px; +} + +.editable-inline .editableform-loading { + background-position: left 5px; +} + + .editable-error-block { + max-width: 300px; + margin: 5px 0 0 0; + width: auto; + white-space: normal; +} + +/*add padding for jquery ui*/ +.editable-error-block.ui-state-error { + padding: 3px; +} + +.editable-error { + color: red; +} + +/* ---- For specific types ---- */ + +.editableform .editable-date { + padding: 0; + margin: 0; + float: left; +} + +/* move datepicker icon to center of add-on button. See https://github.com/vitalets/x-editable/issues/183 */ +.editable-inline .add-on .icon-th { + margin-top: 3px; + margin-left: 1px; +} + + +/* checklist vertical alignment */ +.editable-checklist label input[type="checkbox"], +.editable-checklist label span { + vertical-align: middle; + margin: 0; +} + +.editable-checklist label { + white-space: nowrap; +} + +/* set exact width of textarea to fit buttons toolbar */ +.editable-wysihtml5 { + width: 566px; + height: 250px; +} + +/* clear button shown as link in date inputs */ +.editable-clear { + clear: both; + font-size: 0.9em; + text-decoration: none; + text-align: right; +} + +/* IOS-style clear button for text inputs */ +.editable-clear-x { + background: url('../img/clear.png') center center no-repeat; + display: block; + width: 13px; + height: 13px; + position: absolute; + opacity: 0.6; + z-index: 100; + + top: 50%; + right: 6px; + margin-top: -6px; + +} + +.editable-clear-x:hover { + opacity: 1; +} + +.editable-pre-wrapped { + white-space: pre-wrap; +} +.editable-container.editable-popup { + max-width: none !important; /* without this rule poshytip/tooltip does not stretch */ +} + +.editable-container.popover { + width: auto; /* without this rule popover does not stretch */ +} + +.editable-container.editable-inline { + display: inline-block; + vertical-align: middle; + width: auto; + /* inline-block emulation for IE7*/ + zoom: 1; + *display: inline; +} + +.editable-container.ui-widget { + font-size: inherit; /* jqueryui widget font 1.1em too big, overwrite it */ + z-index: 9990; /* should be less than select2 dropdown z-index to close dropdown first when click */ +} +.editable-click, +a.editable-click, +a.editable-click:hover { + text-decoration: none; + border-bottom: dashed 1px #0088cc; +} + +.editable-click.editable-disabled, +a.editable-click.editable-disabled, +a.editable-click.editable-disabled:hover { + color: #585858; + cursor: default; + border-bottom: none; +} + +.editable-empty, .editable-empty:hover, .editable-empty:focus{ + font-style: italic; + color: #DD1144; + /* border-bottom: none; */ + text-decoration: none; +} + +.editable-unsaved { + font-weight: bold; +} + +.editable-unsaved:after { +/* content: '*'*/ +} + +.editable-bg-transition { + -webkit-transition: background-color 1400ms ease-out; + -moz-transition: background-color 1400ms ease-out; + -o-transition: background-color 1400ms ease-out; + -ms-transition: background-color 1400ms ease-out; + transition: background-color 1400ms ease-out; +} + +/*see https://github.com/vitalets/x-editable/issues/139 */ +.form-horizontal .editable +{ + padding-top: 5px; + display:inline-block; +} + + +/*! + * Datepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ +.datepicker { + padding: 4px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + direction: ltr; + /*.dow { + border-top: 1px solid #ddd !important; + }*/ + +} +.datepicker-inline { + width: 220px; +} +.datepicker.datepicker-rtl { + direction: rtl; +} +.datepicker.datepicker-rtl table tr td span { + float: right; +} +.datepicker-dropdown { + top: 0; + left: 0; +} +.datepicker-dropdown:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 6px; +} +.datepicker-dropdown:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 7px; +} +.datepicker > div { + display: none; +} +.datepicker.days div.datepicker-days { + display: block; +} +.datepicker.months div.datepicker-months { + display: block; +} +.datepicker.years div.datepicker-years { + display: block; +} +.datepicker table { + margin: 0; +} +.datepicker td, +.datepicker th { + text-align: center; + width: 20px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + border: none; +} +.table-striped .datepicker table tr td, +.table-striped .datepicker table tr th { + background-color: transparent; +} +.datepicker table tr td.day:hover { + background: #eeeeee; + cursor: pointer; +} +.datepicker table tr td.old, +.datepicker table tr td.new { + color: #999999; +} +.datepicker table tr td.disabled, +.datepicker table tr td.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td.today, +.datepicker table tr td.today:hover, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today.disabled:hover { + background-color: #fde19a; + background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a)); + background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a); + background-image: -o-linear-gradient(top, #fdd49a, #fdf59a); + background-image: linear-gradient(top, #fdd49a, #fdf59a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0); + border-color: #fdf59a #fdf59a #fbed50; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #000; +} +.datepicker table tr td.today:hover, +.datepicker table tr td.today:hover:hover, +.datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today.disabled:hover:hover, +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today:hover.disabled, +.datepicker table tr td.today.disabled.disabled, +.datepicker table tr td.today.disabled:hover.disabled, +.datepicker table tr td.today[disabled], +.datepicker table tr td.today:hover[disabled], +.datepicker table tr td.today.disabled[disabled], +.datepicker table tr td.today.disabled:hover[disabled] { + background-color: #fdf59a; +} +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active { + background-color: #fbf069 \9; +} +.datepicker table tr td.today:hover:hover { + color: #000; +} +.datepicker table tr td.today.active:hover { + color: #fff; +} +.datepicker table tr td.range, +.datepicker table tr td.range:hover, +.datepicker table tr td.range.disabled, +.datepicker table tr td.range.disabled:hover { + background: #eeeeee; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.datepicker table tr td.range.today, +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today.disabled:hover { + background-color: #f3d17a; + background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a)); + background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a); + background-image: -o-linear-gradient(top, #f3c17a, #f3e97a); + background-image: linear-gradient(top, #f3c17a, #f3e97a); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0); + border-color: #f3e97a #f3e97a #edde34; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today:hover:hover, +.datepicker table tr td.range.today.disabled:hover, +.datepicker table tr td.range.today.disabled:hover:hover, +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today:hover.disabled, +.datepicker table tr td.range.today.disabled.disabled, +.datepicker table tr td.range.today.disabled:hover.disabled, +.datepicker table tr td.range.today[disabled], +.datepicker table tr td.range.today:hover[disabled], +.datepicker table tr td.range.today.disabled[disabled], +.datepicker table tr td.range.today.disabled:hover[disabled] { + background-color: #f3e97a; +} +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active { + background-color: #efe24b \9; +} +.datepicker table tr td.selected, +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected.disabled:hover { + background-color: #9e9e9e; + background-image: -moz-linear-gradient(top, #b3b3b3, #808080); + background-image: -ms-linear-gradient(top, #b3b3b3, #808080); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080)); + background-image: -webkit-linear-gradient(top, #b3b3b3, #808080); + background-image: -o-linear-gradient(top, #b3b3b3, #808080); + background-image: linear-gradient(top, #b3b3b3, #808080); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0); + border-color: #808080 #808080 #595959; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected:hover:hover, +.datepicker table tr td.selected.disabled:hover, +.datepicker table tr td.selected.disabled:hover:hover, +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected:hover.disabled, +.datepicker table tr td.selected.disabled.disabled, +.datepicker table tr td.selected.disabled:hover.disabled, +.datepicker table tr td.selected[disabled], +.datepicker table tr td.selected:hover[disabled], +.datepicker table tr td.selected.disabled[disabled], +.datepicker table tr td.selected.disabled:hover[disabled] { + background-color: #808080; +} +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active { + background-color: #666666 \9; +} +.datepicker table tr td.active, +.datepicker table tr td.active:hover, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.active:hover, +.datepicker table tr td.active:hover:hover, +.datepicker table tr td.active.disabled:hover, +.datepicker table tr td.active.disabled:hover:hover, +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active:hover.disabled, +.datepicker table tr td.active.disabled.disabled, +.datepicker table tr td.active.disabled:hover.disabled, +.datepicker table tr td.active[disabled], +.datepicker table tr td.active:hover[disabled], +.datepicker table tr td.active.disabled[disabled], +.datepicker table tr td.active.disabled:hover[disabled] { + background-color: #0044cc; +} +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active { + background-color: #003399 \9; +} +.datepicker table tr td span { + display: block; + width: 23%; + height: 54px; + line-height: 54px; + float: left; + margin: 1%; + cursor: pointer; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.datepicker table tr td span:hover { + background: #eeeeee; +} +.datepicker table tr td span.disabled, +.datepicker table tr td span.disabled:hover { + background: none; + color: #999999; + cursor: default; +} +.datepicker table tr td span.active, +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active.disabled:hover { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active:hover:hover, +.datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active:hover.disabled, +.datepicker table tr td span.active.disabled.disabled, +.datepicker table tr td span.active.disabled:hover.disabled, +.datepicker table tr td span.active[disabled], +.datepicker table tr td span.active:hover[disabled], +.datepicker table tr td span.active.disabled[disabled], +.datepicker table tr td span.active.disabled:hover[disabled] { + background-color: #0044cc; +} +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active { + background-color: #003399 \9; +} +.datepicker table tr td span.old, +.datepicker table tr td span.new { + color: #999999; +} +.datepicker th.datepicker-switch { + width: 145px; +} +.datepicker thead tr:first-child th, +.datepicker tfoot tr th { + cursor: pointer; +} +.datepicker thead tr:first-child th:hover, +.datepicker tfoot tr th:hover { + background: #eeeeee; +} +.datepicker .cw { + font-size: 10px; + width: 12px; + padding: 0 2px 0 5px; + vertical-align: middle; +} +.datepicker thead tr:first-child th.cw { + cursor: default; + background-color: transparent; +} +.input-append.date .add-on i, +.input-prepend.date .add-on i { + display: block; + cursor: pointer; + width: 16px; + height: 16px; +} +.input-daterange input { + text-align: center; +} +.input-daterange input:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-daterange input:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-daterange .add-on { + display: inline-block; + width: auto; + min-width: 16px; + height: 18px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + vertical-align: middle; + background-color: #eeeeee; + border: 1px solid #ccc; + margin-left: -5px; + margin-right: -5px; +} diff --git a/src/cps/static/css/libs/bootstrap-table.min.css b/src/cps/static/css/libs/bootstrap-table.min.css new file mode 100644 index 0000000..770b672 --- /dev/null +++ b/src/cps/static/css/libs/bootstrap-table.min.css @@ -0,0 +1 @@ +.fixed-table-container .bs-checkbox,.fixed-table-container .no-records-found{text-align:center}.fixed-table-body thead th .th-inner,.table td,.table th{box-sizing:border-box}.bootstrap-table .table{margin-bottom:0!important;border-bottom:1px solid #ddd;border-collapse:collapse!important;border-radius:1px}.bootstrap-table .table:not(.table-condensed),.bootstrap-table .table:not(.table-condensed)>tbody>tr>td,.bootstrap-table .table:not(.table-condensed)>tbody>tr>th,.bootstrap-table .table:not(.table-condensed)>tfoot>tr>td,.bootstrap-table .table:not(.table-condensed)>tfoot>tr>th,.bootstrap-table .table:not(.table-condensed)>thead>tr>td{padding:8px}.bootstrap-table .table.table-no-bordered>tbody>tr>td,.bootstrap-table .table.table-no-bordered>thead>tr>th{border-right:2px solid transparent}.bootstrap-table .table.table-no-bordered>tbody>tr>td:last-child{border-right:none}.fixed-table-container{position:relative;clear:both;border:1px solid #ddd;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px}.fixed-table-container.table-no-bordered{border:1px solid transparent}.fixed-table-footer,.fixed-table-header{overflow:hidden}.fixed-table-footer{border-top:1px solid #ddd}.fixed-table-body{overflow-x:auto;overflow-y:auto;height:100%}.fixed-table-container table{width:100%}.fixed-table-container thead th{height:0;padding:0;margin:0;border-left:1px solid #ddd}.fixed-table-container thead th:focus{outline:transparent solid 0}.fixed-table-container thead th:first-child:not([data-not-first-th]){border-left:none;border-top-left-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px}.fixed-table-container tbody td .th-inner,.fixed-table-container thead th .th-inner{padding:8px;line-height:24px;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fixed-table-container thead th .sortable{cursor:pointer;background-position:right;background-repeat:no-repeat;padding-right:30px}.fixed-table-container thead th .both{background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC')}.fixed-table-container thead th .asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==)}.fixed-table-container thead th .desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=)}.fixed-table-container th.detail{width:30px}.fixed-table-container tbody td{border-left:1px solid #ddd}.fixed-table-container tbody tr:first-child td{border-top:none}.fixed-table-container tbody td:first-child{border-left:none}.fixed-table-container tbody .selected td{background-color:#f5f5f5}.fixed-table-container input[type=radio],.fixed-table-container input[type=checkbox]{margin:0 auto!important}.fixed-table-pagination .pagination-detail,.fixed-table-pagination div.pagination{margin-top:10px;margin-bottom:10px}.fixed-table-pagination div.pagination .pagination{margin:0}.fixed-table-pagination .pagination a{padding:6px 12px;line-height:1.428571429}.fixed-table-pagination .pagination-info{line-height:34px;margin-right:5px}.fixed-table-pagination .btn-group{position:relative;display:inline-block;vertical-align:middle}.fixed-table-pagination .dropup .dropdown-menu{margin-bottom:0}.fixed-table-pagination .page-list{display:inline-block}.fixed-table-toolbar .columns-left{margin-right:5px}.fixed-table-toolbar .columns-right{margin-left:5px}.fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429}.fixed-table-toolbar .bs-bars,.fixed-table-toolbar .columns,.fixed-table-toolbar .search{position:relative;margin-top:10px;margin-bottom:10px;line-height:34px}.fixed-table-pagination li.disabled a{pointer-events:none;cursor:default}.fixed-table-loading{display:none;position:absolute;top:42px;right:0;bottom:0;left:0;z-index:99;background-color:#fff;text-align:center}.fixed-table-body .card-view .title{font-weight:700;display:inline-block;min-width:30%;text-align:left!important}.table td,.table th{vertical-align:middle}.fixed-table-toolbar .dropdown-menu{text-align:left;max-height:300px;overflow:auto}.fixed-table-toolbar .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.fixed-table-toolbar .btn-group>.btn-group>.btn{border-radius:0}.fixed-table-toolbar .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.fixed-table-toolbar .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .table>thead>tr>th{vertical-align:bottom;border-bottom:1px solid #ddd}.bootstrap-table .table thead>tr>th{padding:0;margin:0}.bootstrap-table .fixed-table-footer tbody>tr>td{padding:0!important}.bootstrap-table .fixed-table-footer .table{border-bottom:none;border-radius:0;padding:0!important}.bootstrap-table .pull-right .dropdown-menu{right:0;left:auto}p.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden}.fixed-table-pagination:after,.fixed-table-toolbar:after{content:"";display:block;clear:both}.fullscreen{position:fixed;top:0;left:0;z-index:1050;width:100%!important;background:#FFF} \ No newline at end of file diff --git a/src/cps/static/css/libs/bootstrap-theme.min.css b/src/cps/static/css/libs/bootstrap-theme.min.css new file mode 100644 index 0000000..5e39401 --- /dev/null +++ b/src/cps/static/css/libs/bootstrap-theme.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} +/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/src/cps/static/css/libs/bootstrap-theme.min.css.map b/src/cps/static/css/libs/bootstrap-theme.min.css.map new file mode 100644 index 0000000..94813e9 --- /dev/null +++ b/src/cps/static/css/libs/bootstrap-theme.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":";;;;AAmBA,YAAA,aAAA,UAAA,aAAA,aAAA,aAME,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBDvCR,mBAAA,mBAAA,oBAAA,oBAAA,iBAAA,iBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBCsCA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBDlCR,qBAAA,sBAAA,sBAAA,uBAAA,mBAAA,oBAAA,sBAAA,uBAAA,sBAAA,uBAAA,sBAAA,uBAAA,+BAAA,gCAAA,6BAAA,gCAAA,gCAAA,gCCiCA,mBAAA,KACQ,WAAA,KDlDV,mBAAA,oBAAA,iBAAA,oBAAA,oBAAA,oBAuBI,YAAA,KAyCF,YAAA,YAEE,iBAAA,KAKJ,aErEI,YAAA,EAAA,IAAA,EAAA,KACA,iBAAA,iDACA,iBAAA,4CAAA,iBAAA,qEAEA,iBAAA,+CCnBF,OAAA,+GH4CA,OAAA,0DACA,kBAAA,SAuC2C,aAAA,QAA2B,aAAA,KArCtE,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAgBN,aEtEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAiBN,aEvEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAkBN,UExEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,gBAAA,gBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,iBAAA,iBAEE,iBAAA,QACA,aAAA,QAMA,mBAAA,0BAAA,yBAAA,0BAAA,yBAAA,yBAAA,oBAAA,2BAAA,0BAAA,2BAAA,0BAAA,0BAAA,6BAAA,oCAAA,mCAAA,oCAAA,mCAAA,mCAME,iBAAA,QACA,iBAAA,KAmBN,aEzEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAoBN,YE1EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,kBAAA,kBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,mBAAA,mBAEE,iBAAA,QACA,aAAA,QAMA,qBAAA,4BAAA,2BAAA,4BAAA,2BAAA,2BAAA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,+BAAA,sCAAA,qCAAA,sCAAA,qCAAA,qCAME,iBAAA,QACA,iBAAA,KA2BN,eAAA,WClCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBD2CV,0BAAA,0BE3FI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GF0FF,kBAAA,SAEF,yBAAA,+BAAA,+BEhGI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GFgGF,kBAAA,SASF,gBE7GI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SH+HA,cAAA,ICjEA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBD6DV,sCAAA,oCE7GI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD0EV,cAAA,iBAEE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEhII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SHkJA,cAAA,IAHF,sCAAA,oCEhII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDgFV,8BAAA,iCAYI,YAAA,EAAA,KAAA,EAAA,gBAKJ,qBAAA,kBAAA,mBAGE,cAAA,EAqBF,yBAfI,mDAAA,yDAAA,yDAGE,MAAA,KE7JF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UFqKJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC3HA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBDsIV,eEtLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAKF,YEvLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAMF,eExLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAOF,cEzLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAeF,UEjMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuMJ,cE3MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFwMJ,sBE5MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyMJ,mBE7MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0MJ,sBE9MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2MJ,qBE/MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,sBElLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKFyLJ,YACE,cAAA,IC9KA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDgLV,wBAAA,8BAAA,8BAGE,YAAA,EAAA,KAAA,EAAA,QEnOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiOF,aAAA,QALF,+BAAA,qCAAA,qCAQI,YAAA,KAUJ,OCnME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBD4MV,8BE5PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyPJ,8BE7PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0PJ,8BE9PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2PJ,2BE/PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4PJ,8BEhQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6PJ,6BEjQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoQJ,MExQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsQF,aAAA,QC3NA,mBAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/src/cps/static/css/libs/bootstrap.min.css b/src/cps/static/css/libs/bootstrap.min.css new file mode 100644 index 0000000..ed3905e --- /dev/null +++ b/src/cps/static/css/libs/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/src/cps/static/css/libs/bootstrap.min.css.map b/src/cps/static/css/libs/bootstrap.min.css.map new file mode 100644 index 0000000..6c7fa40 --- /dev/null +++ b/src/cps/static/css/libs/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/normalize.less","less/print.less","bootstrap.css","dist/css/bootstrap.css","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":";;;;4EAQA,KACE,YAAA,WACA,yBAAA,KACA,qBAAA,KAOF,KACE,OAAA,EAaF,QAAA,MAAA,QAAA,WAAA,OAAA,OAAA,OAAA,OAAA,KAAA,KAAA,IAAA,QAAA,QAaE,QAAA,MAQF,MAAA,OAAA,SAAA,MAIE,QAAA,aACA,eAAA,SAQF,sBACE,QAAA,KACA,OAAA,EAQF,SAAA,SAEE,QAAA,KAUF,EACE,iBAAA,YAQF,SAAA,QAEE,QAAA,EAUF,YACE,cAAA,IAAA,OAOF,EAAA,OAEE,YAAA,IAOF,IACE,WAAA,OAQF,GACE,OAAA,MAAA,EACA,UAAA,IAOF,KACE,MAAA,KACA,WAAA,KAOF,MACE,UAAA,IAOF,IAAA,IAEE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IACE,IAAA,MAGF,IACE,OAAA,OAUF,IACE,OAAA,EAOF,eACE,SAAA,OAUF,OACE,OAAA,IAAA,KAOF,GACE,OAAA,EAAA,mBAAA,YAAA,gBAAA,YACA,WAAA,YAOF,IACE,SAAA,KAOF,KAAA,IAAA,IAAA,KAIE,YAAA,UAAA,UACA,UAAA,IAkBF,OAAA,MAAA,SAAA,OAAA,SAKE,OAAA,EACA,KAAA,QACA,MAAA,QAOF,OACE,SAAA,QAUF,OAAA,OAEE,eAAA,KAWF,OAAA,wBAAA,kBAAA,mBAIE,mBAAA,OACA,OAAA,QAOF,iBAAA,qBAEE,OAAA,QAOF,yBAAA,wBAEE,QAAA,EACA,OAAA,EAQF,MACE,YAAA,OAWF,qBAAA,kBAEE,mBAAA,WAAA,gBAAA,WAAA,WAAA,WACA,QAAA,EASF,8CAAA,8CAEE,OAAA,KAQF,mBACE,mBAAA,YACA,gBAAA,YAAA,WAAA,YAAA,mBAAA,UASF,iDAAA,8CAEE,mBAAA,KAOF,SACE,QAAA,MAAA,OAAA,MACA,OAAA,EAAA,IACA,OAAA,IAAA,MAAA,OAQF,OACE,QAAA,EACA,OAAA,EAOF,SACE,SAAA,KAQF,SACE,YAAA,IAUF,MACE,eAAA,EACA,gBAAA,SAGF,GAAA,GAEE,QAAA,uFCjUF,aA7FI,EAAA,OAAA,QAGI,MAAA,eACA,YAAA,eACA,WAAA,cAAA,mBAAA,eACA,WAAA,eAGJ,EAAA,UAEI,gBAAA,UAGJ,cACI,QAAA,KAAA,WAAA,IAGJ,kBACI,QAAA,KAAA,YAAA,IAKJ,6BAAA,mBAEI,QAAA,GAGJ,WAAA,IAEI,OAAA,IAAA,MAAA,KC4KL,kBAAA,MDvKK,MC0KL,QAAA,mBDrKK,IE8KN,GDLC,kBAAA,MDrKK,ICwKL,UAAA,eCUD,GF5KM,GE2KN,EF1KM,QAAA,ECuKL,OAAA,ECSD,GF3KM,GCsKL,iBAAA,MD/JK,QCkKL,QAAA,KCSD,YFtKU,oBCiKT,iBAAA,eD7JK,OCgKL,OAAA,IAAA,MAAA,KD5JK,OC+JL,gBAAA,mBCSD,UFpKU,UC+JT,iBAAA,eDzJS,mBEkKV,mBDLC,OAAA,IAAA,MAAA,gBEjPD,WACA,YAAA,uBFsPD,IAAA,+CE7OC,IAAK,sDAAuD,4BAA6B,iDAAkD,gBAAiB,gDAAiD,eAAgB,+CAAgD,mBAAoB,2EAA4E,cAE7W,WACA,SAAA,SACA,IAAA,IACA,QAAA,aACA,YAAA,uBACA,WAAA,OACA,YAAA,IACA,YAAA,EAIkC,uBAAA,YAAW,wBAAA,UACX,2BAAW,QAAA,QAEX,uBDuPlC,QAAS,QCtPyB,sBFiPnC,uBEjP8C,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,qBAAW,QAAA,QACX,0BAAW,QAAA,QACX,qBAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,sBAAW,QAAA,QACX,yBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,+BAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,gCAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,gCAAW,QAAA,QACX,gCAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,0BAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,mCAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,sBAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,0BAAW,QAAA,QACX,4BAAW,QAAA,QACX,qCAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,mCAAW,QAAA,QACX,uCAAW,QAAA,QACX,gCAAW,QAAA,QACX,oCAAW,QAAA,QACX,qCAAW,QAAA,QACX,yCAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,iCAAW,QAAA,QACX,oCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,qBAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QASX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,+BAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,mCAAW,QAAA,QACX,4BAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,kCAAW,QAAA,QACX,mCAAW,QAAA,QACX,sCAAW,QAAA,QACX,0CAAW,QAAA,QACX,oCAAW,QAAA,QACX,wCAAW,QAAA,QACX,qCAAW,QAAA,QACX,iCAAW,QAAA,QACX,gCAAW,QAAA,QACX,kCAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QCtS/C,0BCgEE,QAAA,QHi+BF,EDNC,mBAAA,WGxhCI,gBAAiB,WFiiCZ,WAAY,WGl+BZ,OADL,QJg+BJ,mBAAA,WGthCI,gBAAiB,WACpB,WAAA,WHyhCD,KGrhCC,UAAW,KAEX,4BAAA,cAEA,KACA,YAAA,iBAAA,UAAA,MAAA,WHuhCD,UAAA,KGnhCC,YAAa,WF4hCb,MAAO,KACP,iBAAkB,KExhClB,OADA,MAEA,OHqhCD,SG/gCC,YAAa,QACb,UAAA,QACA,YAAA,QAEA,EFwhCA,MAAO,QEthCL,gBAAA,KAIF,QH8gCD,QKjkCC,MAAA,QACA,gBAAA,UF6DF,QACE,QAAA,IAAA,KAAA,yBHygCD,eAAA,KGlgCC,OHqgCD,OAAA,ECSD,IACE,eAAgB,ODDjB,4BM/kCC,0BLklCF,gBKnlCE,iBADA,eH4EA,QAAS,MACT,UAAA,KHugCD,OAAA,KGhgCC,aACA,cAAA,IAEA,eACA,QAAA,aC6FA,UAAA,KACK,OAAA,KACG,QAAA,IEvLR,YAAA,WACA,iBAAA,KACA,OAAA,IAAA,MAAA,KN+lCD,cAAA,IGjgCC,mBAAoB,IAAI,IAAI,YAC5B,cAAA,IAAA,IAAA,YHmgCD,WAAA,IAAA,IAAA,YG5/BC,YACA,cAAA,IAEA,GH+/BD,WAAA,KGv/BC,cAAe,KACf,OAAA,EACA,WAAA,IAAA,MAAA,KAEA,SACA,SAAA,SACA,MAAA,IACA,OAAA,IACA,QAAA,EHy/BD,OAAA,KGj/BC,SAAA,OF0/BA,KAAM,cEx/BJ,OAAA,EAEA,0BACA,yBACA,SAAA,OACA,MAAA,KHm/BH,OAAA,KGx+BC,OAAQ,EACR,SAAA,QH0+BD,KAAA,KCSD,cACE,OAAQ,QAQV,IACA,IMlpCE,IACA,IACA,IACA,INwoCF,GACA,GACA,GACA,GACA,GACA,GDAC,YAAA,QOlpCC,YAAa,IN2pCb,YAAa,IACb,MAAO,QAoBT,WAZA,UAaA,WAZA,UM5pCI,WN6pCJ,UM5pCI,WN6pCJ,UM5pCI,WN6pCJ,UDMC,WCLD,UACA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SMppCE,YAAa,INwqCb,YAAa,EACb,MAAO,KAGT,IMxqCE,IAJF,IN2qCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UM5qCA,WN8qCA,UACA,UANA,SM5qCI,UN8qCJ,SM3qCA,UN6qCA,SAQE,UAAW,IAGb,IMprCE,IAJF,INurCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UMvrCA,WNyrCA,UACA,UANA,SMxrCI,UN0rCJ,SMtrCA,UNwrCA,SMxrCU,UAAA,IACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KAOR,IADF,GPssCC,UAAA,KCSD,EMzsCE,OAAA,EAAA,EAAA,KAEA,MPosCD,cAAA,KO/rCC,UAAW,KAwOX,YAAa,IA1OX,YAAA,IPssCH,yBO7rCC,MNssCE,UAAW,MMjsCf,OAAA,MAEE,UAAA,IAKF,MP0rCC,KO1rCsB,QAAA,KP6rCtB,iBAAA,QO5rCsB,WP+rCtB,WAAA,KO9rCsB,YPisCtB,WAAA,MOhsCsB,aPmsCtB,WAAA,OOlsCsB,cPqsCtB,WAAA,QOlsCsB,aPqsCtB,YAAA,OOpsCsB,gBPusCtB,eAAA,UOtsCsB,gBPysCtB,eAAA,UOrsCC,iBPwsCD,eAAA,WQ3yCC,YR8yCD,MAAA,KCSD,cOpzCI,MAAA,QAHF,qBDwGF,qBP6sCC,MAAA,QCSD,cO3zCI,MAAA,QAHF,qBD2GF,qBPitCC,MAAA,QCSD,WOl0CI,MAAA,QAHF,kBD8GF,kBPqtCC,MAAA,QCSD,cOz0CI,MAAA,QAHF,qBDiHF,qBPytCC,MAAA,QCSD,aOh1CI,MAAA,QDwHF,oBAHF,oBExHE,MAAA,QACA,YR01CA,MAAO,KQx1CL,iBAAA,QAHF,mBF8HF,mBP2tCC,iBAAA,QCSD,YQ/1CI,iBAAA,QAHF,mBFiIF,mBP+tCC,iBAAA,QCSD,SQt2CI,iBAAA,QAHF,gBFoIF,gBPmuCC,iBAAA,QCSD,YQ72CI,iBAAA,QAHF,mBFuIF,mBPuuCC,iBAAA,QCSD,WQp3CI,iBAAA,QF6IF,kBADF,kBAEE,iBAAA,QPsuCD,aO7tCC,eAAgB,INsuChB,OAAQ,KAAK,EAAE,KMpuCf,cAAA,IAAA,MAAA,KAFF,GPkuCC,GCSC,WAAY,EACZ,cAAe,KM9tCf,MP0tCD,MO3tCD,MAPI,MASF,cAAA,EAIF,eALE,aAAA,EACA,WAAA,KPkuCD,aO9tCC,aAAc,EAKZ,YAAA,KACA,WAAA,KP6tCH,gBOvtCC,QAAS,aACT,cAAA,IACA,aAAA,IAEF,GNguCE,WAAY,EM9tCZ,cAAA,KAGA,GADF,GP0tCC,YAAA,WOttCC,GPytCD,YAAA,IOnnCD,GAvFM,YAAA,EAEA,yBACA,kBGtNJ,MAAA,KACA,MAAA,MACA,SAAA,OVq6CC,MAAA,KO7nCC,WAAY,MAhFV,cAAA,SPgtCH,YAAA,OOtsCD,kBNgtCE,YAAa,OM1sCjB,0BPssCC,YOrsCC,OAAA,KA9IqB,cAAA,IAAA,OAAA,KAmJvB,YACE,UAAA,IACA,eAAA,UAEA,WPssCD,QAAA,KAAA,KOjsCG,OAAA,EAAA,EAAA,KN0sCF,UAAW,OACX,YAAa,IAAI,MAAM,KMptCzB,yBP+sCC,wBO/sCD,yBNytCE,cAAe,EMnsCb,kBAFA,kBACA,iBPksCH,QAAA,MO/rCG,UAAA,INwsCF,YAAa,WACb,MAAO,KMhsCT,yBP2rCC,yBO3rCD,wBAEE,QAAA,cAEA,oBACA,sBACA,cAAA,KP6rCD,aAAA,EOvrCG,WAAA,MNgsCF,aAAc,IAAI,MAAM,KACxB,YAAa,EMhsCX,kCNksCJ,kCMnsCe,iCACX,oCNmsCJ,oCDLC,mCCUC,QAAS,GMjsCX,iCNmsCA,iCMzsCM,gCAOJ,mCNmsCF,mCDLC,kCO7rCC,QAAA,cPksCD,QWv+CC,cAAe,KVg/Cf,WAAY,OACZ,YAAa,WU7+Cb,KXy+CD,IWr+CD,IACE,KACA,YAAA,MAAA,OAAA,SAAA,cAAA,UAEA,KACA,QAAA,IAAA,IXu+CD,UAAA,IWn+CC,MAAO,QACP,iBAAA,QACA,cAAA,IAEA,IACA,QAAA,IAAA,IACA,UAAA,IV4+CA,MU5+CA,KXq+CD,iBAAA,KW3+CC,cAAe,IASb,mBAAA,MAAA,EAAA,KAAA,EAAA,gBACA,WAAA,MAAA,EAAA,KAAA,EAAA,gBAEA,QV6+CF,QU7+CE,EXq+CH,UAAA,KWh+CC,YAAa,IACb,mBAAA,KACA,WAAA,KAEA,IACA,QAAA,MACA,QAAA,MACA,OAAA,EAAA,EAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KACA,WAAA,UXk+CD,UAAA,WW7+CC,iBAAkB,QAehB,OAAA,IAAA,MAAA,KACA,cAAA,IAEA,SACA,QAAA,EACA,UAAA,QXi+CH,MAAA,QW59CC,YAAa,SACb,iBAAA,YACA,cAAA,EC1DF,gBCHE,WAAA,MACA,WAAA,OAEA,Wb8hDD,cAAA,KYxhDC,aAAA,KAqEA,aAAc,KAvEZ,YAAA,KZ+hDH,yBY1hDC,WAkEE,MAAO,OZ69CV,yBY5hDC,WA+DE,MAAO,OZk+CV,0BYzhDC,WCvBA,MAAA,QAGA,iBbmjDD,cAAA,KYthDC,aAAc,KCvBd,aAAA,KACA,YAAA,KCAE,KACE,aAAA,MAEA,YAAA,MAGA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UdgjDL,SAAA,SchiDG,WAAA,IACE,cAAA,KdkiDL,aAAA,Kc1hDG,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud6hDH,MAAA,Kc7hDG,WdgiDH,MAAA,KchiDG,WdmiDH,MAAA,acniDG,WdsiDH,MAAA,actiDG,UdyiDH,MAAA,IcziDG,Ud4iDH,MAAA,ac5iDG,Ud+iDH,MAAA,ac/iDG,UdkjDH,MAAA,IcljDG,UdqjDH,MAAA,acrjDG,UdwjDH,MAAA,acxjDG,Ud2jDH,MAAA,Ic3jDG,Ud8jDH,MAAA,ac/iDG,UdkjDH,MAAA,YcljDG,gBdqjDH,MAAA,KcrjDG,gBdwjDH,MAAA,acxjDG,gBd2jDH,MAAA,ac3jDG,ed8jDH,MAAA,Ic9jDG,edikDH,MAAA,acjkDG,edokDH,MAAA,acpkDG,edukDH,MAAA,IcvkDG,ed0kDH,MAAA,ac1kDG,ed6kDH,MAAA,ac7kDG,edglDH,MAAA,IchlDG,edmlDH,MAAA,ac9kDG,edilDH,MAAA,YchmDG,edmmDH,MAAA,KcnmDG,gBdsmDH,KAAA,KctmDG,gBdymDH,KAAA,aczmDG,gBd4mDH,KAAA,ac5mDG,ed+mDH,KAAA,Ic/mDG,edknDH,KAAA,aclnDG,edqnDH,KAAA,acrnDG,edwnDH,KAAA,IcxnDG,ed2nDH,KAAA,ac3nDG,ed8nDH,KAAA,ac9nDG,edioDH,KAAA,IcjoDG,edooDH,KAAA,ac/nDG,edkoDH,KAAA,YcnnDG,edsnDH,KAAA,KctnDG,kBdynDH,YAAA,KcznDG,kBd4nDH,YAAA,ac5nDG,kBd+nDH,YAAA,ac/nDG,iBdkoDH,YAAA,IcloDG,iBdqoDH,YAAA,acroDG,iBdwoDH,YAAA,acxoDG,iBd2oDH,YAAA,Ic3oDG,iBd8oDH,YAAA,ac9oDG,iBdipDH,YAAA,acjpDG,iBdopDH,YAAA,IcppDG,iBdupDH,YAAA,acvpDG,iBd0pDH,YAAA,Yc5rDG,iBACE,YAAA,EAOJ,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud0rDD,MAAA,Kc1rDC,Wd6rDD,MAAA,Kc7rDC,WdgsDD,MAAA,achsDC,WdmsDD,MAAA,acnsDC,UdssDD,MAAA,IctsDC,UdysDD,MAAA,aczsDC,Ud4sDD,MAAA,ac5sDC,Ud+sDD,MAAA,Ic/sDC,UdktDD,MAAA,acltDC,UdqtDD,MAAA,acrtDC,UdwtDD,MAAA,IcxtDC,Ud2tDD,MAAA,ac5sDC,Ud+sDD,MAAA,Yc/sDC,gBdktDD,MAAA,KcltDC,gBdqtDD,MAAA,acrtDC,gBdwtDD,MAAA,acxtDC,ed2tDD,MAAA,Ic3tDC,ed8tDD,MAAA,ac9tDC,ediuDD,MAAA,acjuDC,edouDD,MAAA,IcpuDC,eduuDD,MAAA,acvuDC,ed0uDD,MAAA,ac1uDC,ed6uDD,MAAA,Ic7uDC,edgvDD,MAAA,ac3uDC,ed8uDD,MAAA,Yc7vDC,edgwDD,MAAA,KchwDC,gBdmwDD,KAAA,KcnwDC,gBdswDD,KAAA,actwDC,gBdywDD,KAAA,aczwDC,ed4wDD,KAAA,Ic5wDC,ed+wDD,KAAA,ac/wDC,edkxDD,KAAA,aclxDC,edqxDD,KAAA,IcrxDC,edwxDD,KAAA,acxxDC,ed2xDD,KAAA,ac3xDC,ed8xDD,KAAA,Ic9xDC,ediyDD,KAAA,ac5xDC,ed+xDD,KAAA,YchxDC,edmxDD,KAAA,KcnxDC,kBdsxDD,YAAA,KctxDC,kBdyxDD,YAAA,aczxDC,kBd4xDD,YAAA,ac5xDC,iBd+xDD,YAAA,Ic/xDC,iBdkyDD,YAAA,aclyDC,iBdqyDD,YAAA,acryDC,iBdwyDD,YAAA,IcxyDC,iBd2yDD,YAAA,ac3yDC,iBd8yDD,YAAA,ac9yDC,iBdizDD,YAAA,IcjzDC,iBdozDD,YAAA,acpzDC,iBduzDD,YAAA,YY9yDD,iBE3CE,YAAA,GAQF,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udw1DD,MAAA,Kcx1DC,Wd21DD,MAAA,Kc31DC,Wd81DD,MAAA,ac91DC,Wdi2DD,MAAA,acj2DC,Udo2DD,MAAA,Icp2DC,Udu2DD,MAAA,acv2DC,Ud02DD,MAAA,ac12DC,Ud62DD,MAAA,Ic72DC,Udg3DD,MAAA,ach3DC,Udm3DD,MAAA,acn3DC,Uds3DD,MAAA,Ict3DC,Udy3DD,MAAA,ac12DC,Ud62DD,MAAA,Yc72DC,gBdg3DD,MAAA,Kch3DC,gBdm3DD,MAAA,acn3DC,gBds3DD,MAAA,act3DC,edy3DD,MAAA,Icz3DC,ed43DD,MAAA,ac53DC,ed+3DD,MAAA,ac/3DC,edk4DD,MAAA,Icl4DC,edq4DD,MAAA,acr4DC,edw4DD,MAAA,acx4DC,ed24DD,MAAA,Ic34DC,ed84DD,MAAA,acz4DC,ed44DD,MAAA,Yc35DC,ed85DD,MAAA,Kc95DC,gBdi6DD,KAAA,Kcj6DC,gBdo6DD,KAAA,acp6DC,gBdu6DD,KAAA,acv6DC,ed06DD,KAAA,Ic16DC,ed66DD,KAAA,ac76DC,edg7DD,KAAA,ach7DC,edm7DD,KAAA,Icn7DC,eds7DD,KAAA,act7DC,edy7DD,KAAA,acz7DC,ed47DD,KAAA,Ic57DC,ed+7DD,KAAA,ac17DC,ed67DD,KAAA,Yc96DC,edi7DD,KAAA,Kcj7DC,kBdo7DD,YAAA,Kcp7DC,kBdu7DD,YAAA,acv7DC,kBd07DD,YAAA,ac17DC,iBd67DD,YAAA,Ic77DC,iBdg8DD,YAAA,ach8DC,iBdm8DD,YAAA,acn8DC,iBds8DD,YAAA,Ict8DC,iBdy8DD,YAAA,acz8DC,iBd48DD,YAAA,ac58DC,iBd+8DD,YAAA,Ic/8DC,iBdk9DD,YAAA,acl9DC,iBdq9DD,YAAA,YYz8DD,iBE9CE,YAAA,GAQF,0BACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Uds/DD,MAAA,Kct/DC,Wdy/DD,MAAA,Kcz/DC,Wd4/DD,MAAA,ac5/DC,Wd+/DD,MAAA,ac//DC,UdkgED,MAAA,IclgEC,UdqgED,MAAA,acrgEC,UdwgED,MAAA,acxgEC,Ud2gED,MAAA,Ic3gEC,Ud8gED,MAAA,ac9gEC,UdihED,MAAA,acjhEC,UdohED,MAAA,IcphEC,UduhED,MAAA,acxgEC,Ud2gED,MAAA,Yc3gEC,gBd8gED,MAAA,Kc9gEC,gBdihED,MAAA,acjhEC,gBdohED,MAAA,acphEC,eduhED,MAAA,IcvhEC,ed0hED,MAAA,ac1hEC,ed6hED,MAAA,ac7hEC,edgiED,MAAA,IchiEC,edmiED,MAAA,acniEC,edsiED,MAAA,actiEC,edyiED,MAAA,IcziEC,ed4iED,MAAA,acviEC,ed0iED,MAAA,YczjEC,ed4jED,MAAA,Kc5jEC,gBd+jED,KAAA,Kc/jEC,gBdkkED,KAAA,aclkEC,gBdqkED,KAAA,acrkEC,edwkED,KAAA,IcxkEC,ed2kED,KAAA,ac3kEC,ed8kED,KAAA,ac9kEC,edilED,KAAA,IcjlEC,edolED,KAAA,acplEC,edulED,KAAA,acvlEC,ed0lED,KAAA,Ic1lEC,ed6lED,KAAA,acxlEC,ed2lED,KAAA,Yc5kEC,ed+kED,KAAA,Kc/kEC,kBdklED,YAAA,KcllEC,kBdqlED,YAAA,acrlEC,kBdwlED,YAAA,acxlEC,iBd2lED,YAAA,Ic3lEC,iBd8lED,YAAA,ac9lEC,iBdimED,YAAA,acjmEC,iBdomED,YAAA,IcpmEC,iBdumED,YAAA,acvmEC,iBd0mED,YAAA,ac1mEC,iBd6mED,YAAA,Ic7mEC,iBdgnED,YAAA,achnEC,iBdmnED,YAAA,YetrED,iBACA,YAAA,GAGA,MACA,iBAAA,YAEA,QfyrED,YAAA,IevrEC,eAAgB,IAChB,MAAA,KfyrED,WAAA,KelrEC,GACA,WAAA,KfsrED,OexrEC,MAAO,KdmsEP,UAAW,KACX,cAAe,KcvrET,mBd0rER,mBczrEQ,mBAHA,mBACA,mBd0rER,mBDHC,QAAA,IensEC,YAAa,WAoBX,eAAA,IACA,WAAA,IAAA,MAAA,KArBJ,mBdktEE,eAAgB,OAChB,cAAe,IAAI,MAAM,KDJ1B,uCCMD,uCcrtEA,wCdstEA,wCclrEI,2CANI,2CforEP,WAAA,EezqEG,mBf4qEH,WAAA,IAAA,MAAA,KCWD,cACE,iBAAkB,Kc/pEpB,6BdkqEA,6BcjqEE,6BAZM,6BfsqEP,6BCMD,6BDHC,QAAA,ICWD,gBACE,OAAQ,IAAI,MAAM,Kc1qEpB,4Bd6qEA,4Bc7qEA,4BAQQ,4Bf8pEP,4BCMD,4Bc7pEM,OAAA,IAAA,MAAA,KAYF,4BAFJ,4BfopEC,oBAAA,IevoEG,yCf0oEH,iBAAA,QehoEC,4BACA,iBAAA,QfooED,uBe9nEG,SAAA,OdyoEF,QAAS,acxoEL,MAAA,KAEA,sBfioEL,sBgB7wEC,SAAA,OfwxEA,QAAS,WACT,MAAO,KAST,0BerxEE,0Bf+wEF,0BAGA,0BexxEM,0BAMJ,0BfgxEF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCgBlyEC,sCAAA,oCfyyEF,sCetxEM,sCf2xEJ,iBAAkB,QASpB,2Be1yEE,2BfoyEF,2BAGA,2Be7yEM,2BAMJ,2BfqyEF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBvzEC,uCAAA,qCf8zEF,uCe3yEM,uCfgzEJ,iBAAkB,QASpB,wBe/zEE,wBfyzEF,wBAGA,wBel0EM,wBAMJ,wBf0zEF,wBAGA,wBACA,wBDNC,wBCAD,wBAGA,wBASE,iBAAkB,QDLnB,oCgB50EC,oCAAA,kCfm1EF,oCeh0EM,oCfq0EJ,iBAAkB,QASpB,2Bep1EE,2Bf80EF,2BAGA,2Bev1EM,2BAMJ,2Bf+0EF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBj2EC,uCAAA,qCfw2EF,uCer1EM,uCf01EJ,iBAAkB,QASpB,0Bez2EE,0Bfm2EF,0BAGA,0Be52EM,0BAMJ,0Bfo2EF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCehtEC,sCADF,oCdwtEA,sCe12EM,sCDoJJ,iBAAA,QA6DF,kBACE,WAAY,KA3DV,WAAA,KAEA,oCACA,kBACA,MAAA,KfotED,cAAA,Ke7pEC,WAAY,OAnDV,mBAAA,yBfmtEH,OAAA,IAAA,MAAA,KCWD,yBACE,cAAe,Ec5qEjB,qCd+qEA,qCcjtEI,qCARM,qCfktET,qCCMD,qCDHC,YAAA,OCWD,kCACE,OAAQ,EcvrEV,0Dd0rEA,0Dc1rEA,0DAzBU,0Df4sET,0DCMD,0DAME,YAAa,Ec/rEf,yDdksEA,yDclsEA,yDArBU,yDfgtET,yDCMD,yDAME,aAAc,EDLjB,yDe1sEW,yDEzNV,yDjBk6EC,yDiBj6ED,cAAA,GAMA,SjBk6ED,UAAA,EiB/5EC,QAAS,EACT,OAAA,EACA,OAAA,EAEA,OACA,QAAA,MACA,MAAA,KACA,QAAA,EACA,cAAA,KACA,UAAA,KjBi6ED,YAAA,QiB95EC,MAAO,KACP,OAAA,EACA,cAAA,IAAA,MAAA,QAEA,MjBg6ED,QAAA,aiBr5EC,UAAW,Kb4BX,cAAA,IACG,YAAA,IJ63EJ,mBiBr5EC,mBAAoB,WhBg6EjB,gBAAiB,WgB95EpB,WAAA,WjBy5ED,qBiBv5EC,kBAGA,OAAQ,IAAI,EAAE,EACd,WAAA,MjBs5ED,YAAA,OiBj5EC,iBACA,QAAA,MAIF,kBhB25EE,QAAS,MgBz5ET,MAAA,KAIF,iBAAA,ahB05EE,OAAQ,KI99ER,uBY2EF,2BjB64EC,wBiB54EC,QAAA,IAAA,KAAA,yBACA,eAAA,KAEA,OACA,QAAA,MjB+4ED,YAAA,IiBr3EC,UAAW,KACX,YAAA,WACA,MAAA,KAEA,cACA,QAAA,MACA,MAAA,KACA,OAAA,KACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KbxDA,iBAAA,KACQ,iBAAA,KAyHR,OAAA,IAAA,MAAA,KACK,cAAA,IACG,mBAAA,MAAA,EAAA,IAAA,IAAA,iBJwzET,WAAA,MAAA,EAAA,IAAA,IAAA,iBkBh8EC,mBAAA,aAAA,YAAA,KAAA,mBAAA,YAAA,KACE,cAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KACA,WAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KdWM,oBJy7ET,aAAA,QIx5EC,QAAA,EACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBAEF,gCAA0B,MAAA,KJ25E3B,QAAA,EI15EiC,oCJ65EjC,MAAA,KiBh4EG,yCACA,MAAA,KAQF,0BhBs4EA,iBAAkB,YAClB,OAAQ,EgBn4EN,wBjB63EH,wBiB13EC,iChBq4EA,iBAAkB,KgBn4EhB,QAAA,EAIF,wBACE,iCjB03EH,OAAA,YiB72EC,sBjBg3ED,OAAA,KiB91EG,mBhB02EF,mBAAoB,KAEtB,qDgB32EM,8BjBo2EH,8BiBj2EC,wCAAA,+BhB62EA,YAAa,KgB32EX,iCjBy2EH,iCiBt2EC,2CAAA,kChB02EF,0BACA,0BACA,oCACA,2BAKE,YAAa,KgBh3EX,iCjB82EH,iCACF,2CiBp2EC,kChBu2EA,0BACA,0BACA,oCACA,2BgBz2EA,YAAA,MhBi3EF,YgBv2EE,cAAA,KAGA,UADA,OjBi2ED,SAAA,SiBr2EC,QAAS,MhBg3ET,WAAY,KgBx2EV,cAAA,KAGA,gBADA,aAEA,WAAA,KjBi2EH,aAAA,KiB91EC,cAAe,EhBy2Ef,YAAa,IACb,OAAQ,QgBp2ER,+BjBg2ED,sCiBl2EC,yBACA,gCAIA,SAAU,ShBw2EV,WAAY,MgBt2EZ,YAAA,MAIF,oBAAA,cAEE,WAAA,KAGA,iBADA,cAEA,SAAA,SACA,QAAA,aACA,aAAA,KjB61ED,cAAA,EiB31EC,YAAa,IhBs2Eb,eAAgB,OgBp2EhB,OAAA,QAUA,kCjBo1ED,4BCWC,WAAY,EACZ,YAAa,KgBv1Eb,wCAAA,qCjBm1ED,8BCOD,+BgBh2EI,2BhB+1EJ,4BAME,OAAQ,YDNT,0BiBv1EG,uBAMF,oCAAA,iChB61EA,OAAQ,YDNT,yBiBp1EK,sBAaJ,mCAFF,gCAGE,OAAA,YAGA,qBjBy0ED,WAAA,KiBv0EC,YAAA,IhBk1EA,eAAgB,IgBh1Ed,cAAA,EjB00EH,8BiB5zED,8BCnQE,cAAA,EACA,aAAA,EAEA,UACA,OAAA,KlBkkFD,QAAA,IAAA,KkBhkFC,UAAA,KACE,YAAA,IACA,cAAA,IAGF,gBjB0kFA,OAAQ,KiBxkFN,YAAA,KD2PA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjBy0EH,QAAA,IAAA,KiB/0EC,UAAW,KAST,YAAA,IACA,cAAA,IAVJ,mChB81EE,OAAQ,KgBh1EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjBy0EH,WAAA,KiBr0EC,QAAS,IAAI,KC/Rb,UAAA,KACA,YAAA,IAEA,UACA,OAAA,KlBumFD,QAAA,KAAA,KkBrmFC,UAAA,KACE,YAAA,UACA,cAAA,IAGF,gBjB+mFA,OAAQ,KiB7mFN,YAAA,KDuRA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjBk1EH,QAAA,KAAA,KiBx1EC,UAAW,KAST,YAAA,UACA,cAAA,IAVJ,mChBu2EE,OAAQ,KgBz1EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjBk1EH,WAAA,KiBz0EC,QAAS,KAAK,KAEd,UAAA,KjB00ED,YAAA,UiBt0EG,cjBy0EH,SAAA,SiBp0EC,4BACA,cAAA,OAEA,uBACA,SAAA,SACA,IAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,MACA,MAAA,KjBu0ED,OAAA,KiBr0EC,YAAa,KhBg1Eb,WAAY,OACZ,eAAgB,KDLjB,oDiBv0EC,uCADA,iCAGA,MAAO,KhBg1EP,OAAQ,KACR,YAAa,KDLd,oDiBv0EC,uCADA,iCAKA,MAAO,KhB80EP,OAAQ,KACR,YAAa,KAKf,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBruFG,mCAJA,yBD0ZJ,gCbvWE,MAAA,QJ2rFD,2BkBxuFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJgsFD,iCiBz1EC,aAAc,QC5YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlByuFH,gCiB91EC,MAAO,QCtYL,iBAAA,QlBuuFH,aAAA,QCWD,oCACE,MAAO,QAKT,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBnwFG,mCAJA,yBD6ZJ,gCb1WE,MAAA,QJytFD,2BkBtwFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJ8tFD,iCiBp3EC,aAAc,QC/YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBuwFH,gCiBz3EC,MAAO,QCzYL,iBAAA,QlBqwFH,aAAA,QCWD,oCACE,MAAO,QAKT,qBAEA,4BAJA,0BADA,uBAEA,kBAEA,yBDNC,0BkBjyFG,iCAJA,uBDgaJ,8Bb7WE,MAAA,QJuvFD,yBkBpyFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJ4vFD,+BiB/4EC,aAAc,QClZZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBqyFH,8BiBp5EC,MAAO,QC5YL,iBAAA,QlBmyFH,aAAA,QiB/4EG,kCjBk5EH,MAAA,QiB/4EG,2CjBk5EH,IAAA,KiBv4EC,mDACA,IAAA,EAEA,YjB04ED,QAAA,MiBvzEC,WAAY,IAwEZ,cAAe,KAtIX,MAAA,QAEA,yBjBy3EH,yBiBrvEC,QAAS,aA/HP,cAAA,EACA,eAAA,OjBw3EH,2BiB1vEC,QAAS,aAxHP,MAAA,KjBq3EH,eAAA,OiBj3EG,kCACA,QAAA,aAmHJ,0BhB4wEE,QAAS,aACT,eAAgB,OgBr3Ed,wCjB82EH,6CiBtwED,2CjBywEC,MAAA,KiB72EG,wCACA,MAAA,KAmGJ,4BhBwxEE,cAAe,EgBp3Eb,eAAA,OAGA,uBADA,oBjB82EH,QAAA,aiBpxEC,WAAY,EhB+xEZ,cAAe,EgBr3EX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB6xEC,sCiBx2EG,SAAA,SjB22EH,YAAA,EiBh2ED,kDhB42EE,IAAK,GgBl2EL,2BjB+1EH,kCiBh2EG,wBAEA,+BAXF,YAAa,IhBo3Eb,WAAY,EgBn2EV,cAAA,EJviBF,2BIshBF,wBJrhBE,WAAA,KI4jBA,6BAyBA,aAAc,MAnCV,YAAA,MAEA,yBjBw1EH,gCACF,YAAA,IiBx3EG,cAAe,EAwCf,WAAA,OAwBJ,sDAdQ,MAAA,KjB80EL,yBACF,+CiBn0EC,YAAA,KAEE,UAAW,MjBs0EZ,yBACF,+CmBp6FG,YAAa,IACf,UAAA,MAGA,KACA,QAAA,aACA,QAAA,IAAA,KAAA,cAAA,EACA,UAAA,KACA,YAAA,IACA,YAAA,WACA,WAAA,OC0CA,YAAA,OACA,eAAA,OACA,iBAAA,aACA,aAAA,ahB+JA,OAAA,QACG,oBAAA,KACC,iBAAA,KACI,gBAAA,KJ+tFT,YAAA,KmBv6FG,iBAAA,KlBm7FF,OAAQ,IAAI,MAAM,YAClB,cAAe,IkB96Ff,kBdzBA,kBACA,WLk8FD,kBCOD,kBADA,WAME,QAAS,IAAI,KAAK,yBAClB,eAAgB,KkBh7FhB,WnBy6FD,WmB56FG,WlBw7FF,MAAO,KkBn7FL,gBAAA,Kf6BM,YADR,YJk5FD,iBAAA,KmBz6FC,QAAA,ElBq7FA,mBAAoB,MAAM,EAAE,IAAI,IAAI,iBAC5B,WAAY,MAAM,EAAE,IAAI,IAAI,iBoBh+FpC,cAGA,ejB8DA,wBACQ,OAAA,YJ05FT,OAAA,kBmBz6FG,mBAAA,KlBq7FM,WAAY,KkBn7FhB,QAAA,IASN,eC3DE,yBACA,eAAA,KpBi+FD,aoB99FC,MAAA,KnB0+FA,iBAAkB,KmBx+FhB,aAAA,KpBk+FH,mBoBh+FO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBi+FH,mBoB99FC,MAAA,KnB0+FA,iBAAkB,QAClB,aAAc,QmBt+FR,oBADJ,oBpBi+FH,mCoB99FG,MAAA,KnB0+FF,iBAAkB,QAClB,aAAc,QmBt+FN,0BnB4+FV,0BAHA,0BmB1+FM,0BnB4+FN,0BAHA,0BDFC,yCoBx+FK,yCnB4+FN,yCmBv+FE,MAAA,KnB++FA,iBAAkB,QAClB,aAAc,QmBx+FZ,oBpBg+FH,oBoBh+FG,mCnB6+FF,iBAAkB,KmBz+FV,4BnB8+FV,4BAHA,4BDHC,6BCOD,6BAHA,6BkB39FA,sCClBM,sCnB8+FN,sCmBx+FI,iBAAA,KACA,aAAA,KDcJ,oBC9DE,MAAA,KACA,iBAAA,KpB0hGD,aoBvhGC,MAAA,KnBmiGA,iBAAkB,QmBjiGhB,aAAA,QpB2hGH,mBoBzhGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB0hGH,mBoBvhGC,MAAA,KnBmiGA,iBAAkB,QAClB,aAAc,QmB/hGR,oBADJ,oBpB0hGH,mCoBvhGG,MAAA,KnBmiGF,iBAAkB,QAClB,aAAc,QmB/hGN,0BnBqiGV,0BAHA,0BmBniGM,0BnBqiGN,0BAHA,0BDFC,yCoBjiGK,yCnBqiGN,yCmBhiGE,MAAA,KnBwiGA,iBAAkB,QAClB,aAAc,QmBjiGZ,oBpByhGH,oBoBzhGG,mCnBsiGF,iBAAkB,KmBliGV,4BnBuiGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBjhGA,sCCrBM,sCnBuiGN,sCmBjiGI,iBAAA,QACA,aAAA,QDkBJ,oBClEE,MAAA,QACA,iBAAA,KpBmlGD,aoBhlGC,MAAA,KnB4lGA,iBAAkB,QmB1lGhB,aAAA,QpBolGH,mBoBllGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBmlGH,mBoBhlGC,MAAA,KnB4lGA,iBAAkB,QAClB,aAAc,QmBxlGR,oBADJ,oBpBmlGH,mCoBhlGG,MAAA,KnB4lGF,iBAAkB,QAClB,aAAc,QmBxlGN,0BnB8lGV,0BAHA,0BmB5lGM,0BnB8lGN,0BAHA,0BDFC,yCoB1lGK,yCnB8lGN,yCmBzlGE,MAAA,KnBimGA,iBAAkB,QAClB,aAAc,QmB1lGZ,oBpBklGH,oBoBllGG,mCnB+lGF,iBAAkB,KmB3lGV,4BnBgmGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBtkGA,sCCzBM,sCnBgmGN,sCmB1lGI,iBAAA,QACA,aAAA,QDsBJ,oBCtEE,MAAA,QACA,iBAAA,KpB4oGD,UoBzoGC,MAAA,KnBqpGA,iBAAkB,QmBnpGhB,aAAA,QpB6oGH,gBoB3oGO,gBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB4oGH,gBoBzoGC,MAAA,KnBqpGA,iBAAkB,QAClB,aAAc,QmBjpGR,iBADJ,iBpB4oGH,gCoBzoGG,MAAA,KnBqpGF,iBAAkB,QAClB,aAAc,QmBjpGN,uBnBupGV,uBAHA,uBmBrpGM,uBnBupGN,uBAHA,uBDFC,sCoBnpGK,sCnBupGN,sCmBlpGE,MAAA,KnB0pGA,iBAAkB,QAClB,aAAc,QmBnpGZ,iBpB2oGH,iBoB3oGG,gCnBwpGF,iBAAkB,KmBppGV,yBnBypGV,yBAHA,yBDHC,0BCOD,0BAHA,0BkB3nGA,mCC7BM,mCnBypGN,mCmBnpGI,iBAAA,QACA,aAAA,QD0BJ,iBC1EE,MAAA,QACA,iBAAA,KpBqsGD,aoBlsGC,MAAA,KnB8sGA,iBAAkB,QmB5sGhB,aAAA,QpBssGH,mBoBpsGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBqsGH,mBoBlsGC,MAAA,KnB8sGA,iBAAkB,QAClB,aAAc,QmB1sGR,oBADJ,oBpBqsGH,mCoBlsGG,MAAA,KnB8sGF,iBAAkB,QAClB,aAAc,QmB1sGN,0BnBgtGV,0BAHA,0BmB9sGM,0BnBgtGN,0BAHA,0BDFC,yCoB5sGK,yCnBgtGN,yCmB3sGE,MAAA,KnBmtGA,iBAAkB,QAClB,aAAc,QmB5sGZ,oBpBosGH,oBoBpsGG,mCnBitGF,iBAAkB,KmB7sGV,4BnBktGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBhrGA,sCCjCM,sCnBktGN,sCmB5sGI,iBAAA,QACA,aAAA,QD8BJ,oBC9EE,MAAA,QACA,iBAAA,KpB8vGD,YoB3vGC,MAAA,KnBuwGA,iBAAkB,QmBrwGhB,aAAA,QpB+vGH,kBoB7vGO,kBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB8vGH,kBoB3vGC,MAAA,KnBuwGA,iBAAkB,QAClB,aAAc,QmBnwGR,mBADJ,mBpB8vGH,kCoB3vGG,MAAA,KnBuwGF,iBAAkB,QAClB,aAAc,QmBnwGN,yBnBywGV,yBAHA,yBmBvwGM,yBnBywGN,yBAHA,yBDFC,wCoBrwGK,wCnBywGN,wCmBpwGE,MAAA,KnB4wGA,iBAAkB,QAClB,aAAc,QmBrwGZ,mBpB6vGH,mBoB7vGG,kCnB0wGF,iBAAkB,KmBtwGV,2BnB2wGV,2BAHA,2BDHC,4BCOD,4BAHA,4BkBruGA,qCCrCM,qCnB2wGN,qCmBrwGI,iBAAA,QACA,aAAA,QDuCJ,mBACE,MAAA,QACA,iBAAA,KnB+tGD,UmB5tGC,YAAA,IlBwuGA,MAAO,QACP,cAAe,EAEjB,UGzwGE,iBemCE,iBflCM,oBJkwGT,6BmB7tGC,iBAAA,YlByuGA,mBAAoB,KACZ,WAAY,KkBtuGlB,UAEF,iBAAA,gBnB6tGD,gBmB3tGG,aAAA,YnBiuGH,gBmB/tGG,gBAIA,MAAA,QlBuuGF,gBAAiB,UACjB,iBAAkB,YDNnB,0BmBhuGK,0BAUN,mCATM,mClB2uGJ,MAAO,KmB1yGP,gBAAA,KAGA,mBADA,QpBmyGD,QAAA,KAAA,KmBztGC,UAAW,KlBquGX,YAAa,UmBjzGb,cAAA,IAGA,mBADA,QpB0yGD,QAAA,IAAA,KmB5tGC,UAAW,KlBwuGX,YAAa,ImBxzGb,cAAA,IAGA,mBADA,QpBizGD,QAAA,IAAA,ImB3tGC,UAAW,KACX,YAAA,IACA,cAAA,IAIF,WACE,QAAA,MnB2tGD,MAAA,KCYD,sBACE,WAAY,IqBz3GZ,6BADF,4BtBk3GC,6BI7rGC,MAAA,KAEQ,MJisGT,QAAA,EsBr3GC,mBAAA,QAAA,KAAA,OACE,cAAA,QAAA,KAAA,OtBu3GH,WAAA,QAAA,KAAA,OsBl3GC,StBq3GD,QAAA,EsBn3Ga,UtBs3Gb,QAAA,KsBr3Ga,atBw3Gb,QAAA,MsBv3Ga,etB03Gb,QAAA,UsBt3GC,kBACA,QAAA,gBlBwKA,YACQ,SAAA,SAAA,OAAA,EAOR,SAAA,OACQ,mCAAA,KAAA,8BAAA,KAGR,2BAAA,KACQ,4BAAA,KAAA,uBAAA,KJ2sGT,oBAAA,KuBr5GC,4BAA6B,OAAQ,WACrC,uBAAA,OAAA,WACA,oBAAA,OAAA,WAEA,OACA,QAAA,aACA,MAAA,EACA,OAAA,EACA,YAAA,IACA,eAAA,OvBu5GD,WAAA,IAAA,OuBn5GC,WAAY,IAAI,QtBk6GhB,aAAc,IAAI,MAAM,YsBh6GxB,YAAA,IAAA,MAAA,YAKA,UADF,QvBo5GC,SAAA,SuB94GC,uBACA,QAAA,EAEA,eACA,SAAA,SACA,IAAA,KACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,MAAA,KACA,UAAA,MACA,QAAA,IAAA,EACA,OAAA,IAAA,EAAA,EACA,UAAA,KACA,WAAA,KACA,WAAA,KnBsBA,iBAAA,KACQ,wBAAA,YmBrBR,gBAAA,YtB+5GA,OsB/5GA,IAAA,MAAA,KvBk5GD,OAAA,IAAA,MAAA,gBuB74GC,cAAA,IACE,mBAAA,EAAA,IAAA,KAAA,iBACA,WAAA,EAAA,IAAA,KAAA,iBAzBJ,0BCzBE,MAAA,EACA,KAAA,KAEA,wBxBo8GD,OAAA,IuB96GC,OAAQ,IAAI,EAmCV,SAAA,OACA,iBAAA,QAEA,oBACA,QAAA,MACA,QAAA,IAAA,KACA,MAAA,KvB84GH,YAAA,IuBx4GC,YAAA,WtBw5GA,MAAO,KsBt5GL,YAAA,OvB44GH,0BuB14GG,0BAMF,MAAA,QtBo5GA,gBAAiB,KACjB,iBAAkB,QsBj5GhB,yBAEA,+BADA,+BvBu4GH,MAAA,KuB73GC,gBAAA,KtB64GA,iBAAkB,QAClB,QAAS,EDZV,2BuB33GC,iCAAA,iCAEE,MAAA,KEzGF,iCF2GE,iCAEA,gBAAA,KvB63GH,OAAA,YuBx3GC,iBAAkB,YAGhB,iBAAA,KvBw3GH,OAAA,0DuBn3GG,qBvBs3GH,QAAA,MuB72GC,QACA,QAAA,EAQF,qBACE,MAAA,EACA,KAAA,KAIF,oBACE,MAAA,KACA,KAAA,EAEA,iBACA,QAAA,MACA,QAAA,IAAA,KvBw2GD,UAAA,KuBp2GC,YAAa,WACb,MAAA,KACA,YAAA,OAEA,mBACA,SAAA,MACA,IAAA,EvBs2GD,MAAA,EuBl2GC,OAAQ,EACR,KAAA,EACA,QAAA,IAQF,2BtB42GE,MAAO,EsBx2GL,KAAA,KAEA,eACA,sCvB41GH,QAAA,GuBn2GC,WAAY,EtBm3GZ,cAAe,IAAI,OsBx2GjB,cAAA,IAAA,QAEA,uBvB41GH,8CuBv0GC,IAAK,KAXL,OAAA,KApEA,cAAA,IvB25GC,yBuBv1GD,6BA1DA,MAAA,EACA,KAAA,KvBq5GD,kC0BpiHG,MAAO,KzBojHP,KAAM,GyBhjHR,W1BsiHD,oB0B1iHC,SAAU,SzB0jHV,QAAS,ayBpjHP,eAAA,OAGA,yB1BsiHH,gBCgBC,SAAU,SACV,MAAO,KyB7iHT,gC1BsiHC,gCCYD,+BAFA,+ByBhjHA,uBANM,uBzBujHN,sBAFA,sBAQE,QAAS,EyBljHP,qB1BuiHH,2B0BliHD,2BACE,iC1BoiHD,YAAA,KCgBD,aACE,YAAa,KDZd,kB0B1iHD,wBAAA,0BzB2jHE,MAAO,KDZR,kB0B/hHD,wBACE,0B1BiiHD,YAAA,I0B5hHC,yE1B+hHD,cAAA,E2BhlHC,4BACG,YAAA,EDsDL,mEzB6iHE,wBAAyB,E0B5lHzB,2BAAA,E3BilHD,6C0B5hHD,8CACE,uBAAA,E1B8hHD,0BAAA,E0B3hHC,sB1B8hHD,MAAA,KCgBD,8D0B/mHE,cAAA,E3BomHD,mE0B3hHD,oECjEE,wBAAA,EACG,2BAAA,EDqEL,oEzB0iHE,uBAAwB,EyBxiHxB,0BAAA,EAiBF,mCACE,iCACA,QAAA,EAEF,iCACE,cAAA,IACA,aAAA,IAKF,oCtB/CE,cAAA,KACQ,aAAA,KsBkDR,iCtBnDA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBsByDV,0CACE,mBAAA,K1BugHD,WAAA,K0BngHC,YACA,YAAA,EAGF,eACE,aAAA,IAAA,IAAA,E1BqgHD,oBAAA,ECgBD,uBACE,aAAc,EAAE,IAAI,IyB1gHlB,yBACA,+BACA,oC1B+/GH,QAAA,M0BtgHC,MAAO,KAcH,MAAA,K1B2/GL,UAAA,KCgBD,oCACE,MAAO,KyBpgHL,8BACA,oC1By/GH,oC0Bp/GC,0CACE,WAAA,K1Bs/GH,YAAA,E2B/pHC,4DACC,cAAA,EAQA,sD3B4pHF,uBAAA,I0Bt/GC,wBAAA,IC/KA,2BAAA,EACC,0BAAA,EAQA,sD3BkqHF,uBAAA,E0Bv/GC,wBAAyB,EACzB,2BAAA,I1By/GD,0BAAA,ICgBD,uE0BtrHE,cAAA,E3B2qHD,4E0Bt/GD,6EC7LE,2BAAA,EACC,0BAAA,EDoMH,6EACE,uBAAA,EACA,wBAAA,EAEA,qB1Bo/GD,QAAA,M0Bx/GC,MAAO,KzBwgHP,aAAc,MyBjgHZ,gBAAA,SAEA,0B1Bq/GH,gC0B9/GC,QAAS,WAYP,MAAA,K1Bq/GH,MAAA,G0Bj/GG,qC1Bo/GH,MAAA,KCgBD,+CACE,KAAM,KyB7+GF,gDAFA,6C1Bs+GL,2D0Br+GK,wDEzOJ,SAAU,SACV,KAAA,cACA,eAAA,K5BitHD,a4B7sHC,SAAA,SACE,QAAA,MACA,gBAAA,S5BgtHH,0B4BxtHC,MAAO,KAeL,cAAA,EACA,aAAA,EAOA,2BACA,SAAA,S5BusHH,QAAA,E4BrsHG,MAAA,KACE,MAAA,K5BusHL,cAAA,ECgBD,iCACE,QAAS,EiBnrHT,8BACA,mCACA,sCACA,OAAA,KlBwqHD,QAAA,KAAA,KkBtqHC,UAAA,KjBsrHA,YAAa,UACb,cAAe,IiBrrHb,oClB0qHH,yCkBvqHC,4CjBurHA,OAAQ,KACR,YAAa,KDTd,8C4B/sHD,mDAAA,sD3B0tHA,sCACA,2CiBzrHI,8CjB8rHF,OAAQ,KiB1sHR,8BACA,mCACA,sCACA,OAAA,KlB+rHD,QAAA,IAAA,KkB7rHC,UAAA,KjB6sHA,YAAa,IACb,cAAe,IiB5sHb,oClBisHH,yCkB9rHC,4CjB8sHA,OAAQ,KACR,YAAa,KDTd,8C4B7tHD,mDAAA,sD3BwuHA,sCACA,2CiBhtHI,8CjBqtHF,OAAQ,K2BzuHR,2B5B6tHD,mB4B7tHC,iB3B8uHA,QAAS,W2BzuHX,8D5B6tHC,sD4B7tHD,oDAEE,cAAA,EAEA,mB5B+tHD,iB4B1tHC,MAAO,GACP,YAAA,OACA,eAAA,OAEA,mBACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,K5B4tHD,WAAA,O4BztHC,iBAAA,KACE,OAAA,IAAA,MAAA,KACA,cAAA,I5B4tHH,4B4BztHC,QAAA,IAAA,KACE,UAAA,KACA,cAAA,I5B4tHH,4B4B/uHC,QAAS,KAAK,K3B+vHd,UAAW,K2BruHT,cAAA,IAKJ,wCAAA,qC3BquHE,WAAY,EAEd,uCACA,+BACA,kC0B70HE,6CACG,8CC4GL,6D5BqtHC,wE4BptHC,wBAAA,E5ButHD,2BAAA,ECgBD,+BACE,aAAc,EAEhB,sCACA,8B2BhuHA,+D5BstHC,oDCWD,iC0Bl1HE,4CACG,6CCiHH,uBAAA,E5BwtHD,0BAAA,E4BltHC,8BAGA,YAAA,E5BotHD,iB4BxtHC,SAAU,SAUR,UAAA,E5BitHH,YAAA,O4B/sHK,sB5BktHL,SAAA,SCgBD,2BACE,YAAa,K2BxtHb,6BAAA,4B5B4sHD,4B4BzsHK,QAAA,EAGJ,kCAAA,wCAGI,aAAA,K5B4sHL,iC6B12HD,uCACE,QAAA,EACA,YAAA,K7B62HD,K6B/2HC,aAAc,EAOZ,cAAA,EACA,WAAA,KARJ,QAWM,SAAA,SACA,QAAA,M7B42HL,U6B12HK,SAAA,S5B03HJ,QAAS,M4Bx3HH,QAAA,KAAA,KAMJ,gB7Bu2HH,gB6Bt2HK,gBAAA,K7By2HL,iBAAA,KCgBD,mB4Br3HQ,MAAA,KAGA,yBADA,yB7B02HP,MAAA,K6Bl2HG,gBAAA,K5Bk3HF,OAAQ,YACR,iBAAkB,Y4B/2Hd,aAzCN,mB7B64HC,mBwBh5HC,iBAAA,KACA,aAAA,QAEA,kBxBm5HD,OAAA,I6Bn5HC,OAAQ,IAAI,EA0DV,SAAA,O7B41HH,iBAAA,Q6Bl1HC,c7Bq1HD,UAAA,K6Bn1HG,UAEA,cAAA,IAAA,MAAA,KALJ,aASM,MAAA,KACA,cAAA,KAEA,e7Bo1HL,aAAA,I6Bn1HK,YAAA,WACE,OAAA,IAAA,MAAA,Y7Bq1HP,cAAA,IAAA,IAAA,EAAA,ECgBD,qBACE,aAAc,KAAK,KAAK,K4B51HlB,sBAEA,4BADA,4BAEA,MAAA,K7Bi1HP,OAAA,Q6B50HC,iBAAA,KAqDA,OAAA,IAAA,MAAA,KA8BA,oBAAA,YAnFA,wBAwDE,MAAA,K7B2xHH,cAAA,E6BzxHK,2BACA,MAAA,KA3DJ,6BAgEE,cAAA,IACA,WAAA,OAYJ,iDA0DE,IAAK,KAjED,KAAA,K7B0xHH,yB6BztHD,2BA9DM,QAAA,W7B0xHL,MAAA,G6Bn2HD,6BAuFE,cAAA,GAvFF,6B5Bw3HA,aAAc,EACd,cAAe,IDZhB,kC6BtuHD,wCA3BA,wCATM,OAAA,IAAA,MAAA,K7B+wHH,yB6B3uHD,6B5B2vHE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,kC6B92HD,wC7B+2HD,wC6B72HG,oBAAA,MAIE,c7B+2HL,MAAA,K6B52HK,gB7B+2HL,cAAA,ICgBD,iBACE,YAAa,I4Bv3HP,uBAQR,6B7Bo2HC,6B6Bl2HG,MAAA,K7Bq2HH,iBAAA,Q6Bn2HK,gBACA,MAAA,KAYN,mBACE,WAAA,I7B41HD,YAAA,E6Bz1HG,e7B41HH,MAAA,K6B11HK,kBACA,MAAA,KAPN,oBAYI,cAAA,IACA,WAAA,OAYJ,wCA0DE,IAAK,KAjED,KAAA,K7B21HH,yB6B1xHD,kBA9DM,QAAA,W7B21HL,MAAA,G6Bl1HD,oBACA,cAAA,GAIE,oBACA,cAAA,EANJ,yB5B02HE,aAAc,EACd,cAAe,IDZhB,8B6B1yHD,oCA3BA,oCATM,OAAA,IAAA,MAAA,K7Bm1HH,yB6B/yHD,yB5B+zHE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,8B6Bx0HD,oC7By0HD,oC6Bv0HG,oBAAA,MAGA,uB7B00HH,QAAA,K6B/zHC,qBF3OA,QAAA,M3B+iID,yB8BxiIC,WAAY,KACZ,uBAAA,EACA,wBAAA,EAEA,Q9B0iID,SAAA,S8BliIC,WAAY,KA8nBZ,cAAe,KAhoBb,OAAA,IAAA,MAAA,Y9ByiIH,yB8BzhIC,QAgnBE,cAAe,K9B86GlB,yB8BjhIC,eACA,MAAA,MAGA,iBACA,cAAA,KAAA,aAAA,KAEA,WAAA,Q9BkhID,2BAAA,M8BhhIC,WAAA,IAAA,MAAA,YACE,mBAAA,MAAA,EAAA,IAAA,EAAA,qB9BkhIH,WAAA,MAAA,EAAA,IAAA,EAAA,qB8Bz7GD,oBArlBI,WAAA,KAEA,yBAAA,iB9BkhID,MAAA,K8BhhIC,WAAA,EACE,mBAAA,KACA,WAAA,KAEA,0B9BkhIH,QAAA,gB8B/gIC,OAAA,eACE,eAAA,E9BihIH,SAAA,kBCkBD,oBACE,WAAY,QDZf,sC8B/gIK,mC9B8gIH,oC8BzgIC,cAAe,E7B4hIf,aAAc,G6Bj+GlB,sCAnjBE,mC7ByhIA,WAAY,MDdX,4D8BngID,sC9BogID,mCCkBG,WAAY,O6B3gId,kCANE,gC9BsgIH,4B8BvgIG,0BAuiBF,aAAc,M7Bm/Gd,YAAa,MAEf,yBDZC,kC8B3gIK,gC9B0gIH,4B8B3gIG,0BAcF,aAAc,EAChB,YAAA,GAMF,mBA8gBE,QAAS,KAhhBP,aAAA,EAAA,EAAA,I9BkgIH,yB8B7/HC,mB7B+gIE,cAAe,G6B1gIjB,qBADA,kB9BggID,SAAA,M8Bz/HC,MAAO,EAggBP,KAAM,E7B4gHN,QAAS,KDdR,yB8B7/HD,qB9B8/HD,kB8B7/HC,cAAA,GAGF,kBACE,IAAA,EACA,aAAA,EAAA,EAAA,I9BigID,qB8B1/HC,OAAQ,EACR,cAAA,EACA,aAAA,IAAA,EAAA,EAEA,cACA,MAAA,K9B4/HD,OAAA,K8B1/HC,QAAA,KAAA,K7B4gIA,UAAW,K6B1gIT,YAAA,KAIA,oBAbJ,oB9BwgIC,gBAAA,K8Bv/HG,kB7B0gIF,QAAS,MDdR,yBACF,iC8Bh/HC,uCACA,YAAA,OAGA,eC9LA,SAAA,SACA,MAAA,MD+LA,QAAA,IAAA,KACA,WAAA,IACA,aAAA,KACA,cAAA,I9Bm/HD,iBAAA,Y8B/+HC,iBAAA,KACE,OAAA,IAAA,MAAA,Y9Bi/HH,cAAA,I8B5+HG,qBACA,QAAA,EAEA,yB9B++HH,QAAA,M8BrgIC,MAAO,KAyBL,OAAA,I9B++HH,cAAA,I8BpjHD,mCAvbI,WAAA,I9Bg/HH,yB8Bt+HC,eACA,QAAA,MAGE,YACA,OAAA,MAAA,M9By+HH,iB8B58HC,YAAA,KA2YA,eAAgB,KAjaZ,YAAA,KAEA,yBACA,iCACA,SAAA,OACA,MAAA,KACA,MAAA,KAAA,WAAA,E9Bs+HH,iBAAA,Y8B3kHC,OAAQ,E7B8lHR,mBAAoB,K6Bt/HhB,WAAA,KAGA,kDAqZN,sC9BklHC,QAAA,IAAA,KAAA,IAAA,KCmBD,sC6Bv/HQ,YAAA,KAmBR,4C9Bs9HD,4C8BvlHG,iBAAkB,M9B4lHnB,yB8B5lHD,YAtYI,MAAA,K9Bq+HH,OAAA,E8Bn+HK,eACA,MAAA,K9Bu+HP,iB8B39HG,YAAa,KACf,eAAA,MAGA,aACA,QAAA,KAAA,K1B9NA,WAAA,IACQ,aAAA,M2B/DR,cAAA,IACA,YAAA,M/B4vID,WAAA,IAAA,MAAA,YiBtuHC,cAAe,IAAI,MAAM,YAwEzB,mBAAoB,MAAM,EAAE,IAAI,EAAE,qBAAyB,EAAE,IAAI,EAAE,qBAtI/D,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,IAAA,EAAA,qBAEA,yBjBwyHH,yBiBpqHC,QAAS,aA/HP,cAAA,EACA,eAAA,OjBuyHH,2BiBzqHC,QAAS,aAxHP,MAAA,KjBoyHH,eAAA,OiBhyHG,kCACA,QAAA,aAmHJ,0BhBmsHE,QAAS,aACT,eAAgB,OgB5yHd,wCjB6xHH,6CiBrrHD,2CjBwrHC,MAAA,KiB5xHG,wCACA,MAAA,KAmGJ,4BhB+sHE,cAAe,EgB3yHb,eAAA,OAGA,uBADA,oBjB6xHH,QAAA,aiBnsHC,WAAY,EhBstHZ,cAAe,EgB5yHX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB4sHC,sCiBvxHG,SAAA,SjB0xHH,YAAA,E8BngID,kDAmWE,IAAK,GAvWH,yBACE,yB9B8gIL,cAAA,I8B5/HD,oCAoVE,cAAe,GA1Vf,yBACA,aACA,MAAA,KACA,YAAA,E1BzPF,eAAA,EACQ,aAAA,EJmwIP,YAAA,EACF,OAAA,E8BngIG,mBAAoB,KACtB,WAAA,M9BugID,8B8BngIC,WAAY,EACZ,uBAAA,EHzUA,wBAAA,EAQA,mDACC,cAAA,E3By0IF,uBAAA,I8B//HC,wBAAyB,IChVzB,2BAAA,EACA,0BAAA,EDkVA,YCnVA,WAAA,IACA,cAAA,IDqVA,mBCtVA,WAAA,KACA,cAAA,KD+VF,mBChWE,WAAA,KACA,cAAA,KDuWF,aAsSE,WAAY,KA1SV,cAAA,KAEA,yB9B+/HD,aACF,MAAA,K8Bl+HG,aAAc,KAhBhB,YAAA,MACA,yBE5WA,aF8WE,MAAA,eAFF,cAKI,MAAA,gB9Bu/HH,aAAA,M8B7+HD,4BACA,aAAA,GADF,gBAKI,iBAAA,Q9Bg/HH,aAAA,QCmBD,8B6BhgIM,MAAA,KARN,oC9B0/HC,oC8B5+HG,MAAA,Q9B++HH,iBAAA,Y8B1+HK,6B9B6+HL,MAAA,KCmBD,iC6B5/HQ,MAAA,KAKF,uC9By+HL,uCCmBC,MAAO,KACP,iBAAkB,Y6Bz/HZ,sCAIF,4C9Bu+HL,4CCmBC,MAAO,KACP,iBAAkB,Q6Bv/HZ,wCAxCR,8C9BihIC,8C8Bn+HG,MAAA,K9Bs+HH,iBAAA,YCmBD,+B6Bt/HM,aAAA,KAGA,qCApDN,qC9B2hIC,iBAAA,KCmBD,yC6Bp/HI,iBAAA,KAOE,iCAAA,6B7Bk/HJ,aAAc,Q6B9+HR,oCAiCN,0C9B+7HD,0C8B3xHC,MAAO,KA7LC,iBAAA,QACA,yB7B8+HR,sD6B5+HU,MAAA,KAKF,4D9By9HP,4DCmBC,MAAO,KACP,iBAAkB,Y6Bz+HV,2DAIF,iE9Bu9HP,iECmBC,MAAO,KACP,iBAAkB,Q6Bv+HV,6D9B09HX,mEADE,mE8B1jIC,MAAO,KA8GP,iBAAA,aAEE,6B9Bi9HL,MAAA,K8B58HG,mC9B+8HH,MAAA,KCmBD,0B6B/9HM,MAAA,KAIA,gCAAA,gC7Bg+HJ,MAAO,K6Bt9HT,0CARQ,0CASN,mD9Bu8HD,mD8Bt8HC,MAAA,KAFF,gBAKI,iBAAA,K9B08HH,aAAA,QCmBD,8B6B19HM,MAAA,QARN,oC9Bo9HC,oC8Bt8HG,MAAA,K9By8HH,iBAAA,Y8Bp8HK,6B9Bu8HL,MAAA,QCmBD,iC6Bt9HQ,MAAA,QAKF,uC9Bm8HL,uCCmBC,MAAO,KACP,iBAAkB,Y6Bn9HZ,sCAIF,4C9Bi8HL,4CCmBC,MAAO,KACP,iBAAkB,Q6Bj9HZ,wCAxCR,8C9B2+HC,8C8B57HG,MAAA,K9B+7HH,iBAAA,YCmBD,+B6B/8HM,aAAA,KAGA,qCArDN,qC9Bq/HC,iBAAA,KCmBD,yC6B78HI,iBAAA,KAME,iCAAA,6B7B48HJ,aAAc,Q6Bx8HR,oCAuCN,0C9Bm5HD,0C8B33HC,MAAO,KAvDC,iBAAA,QAuDV,yBApDU,kE9Bs7HP,aAAA,Q8Bn7HO,0D9Bs7HP,iBAAA,QCmBD,sD6Bt8HU,MAAA,QAKF,4D9Bm7HP,4DCmBC,MAAO,KACP,iBAAkB,Y6Bn8HV,2DAIF,iE9Bi7HP,iECmBC,MAAO,KACP,iBAAkB,Q6Bj8HV,6D9Bo7HX,mEADE,mE8B1hIC,MAAO,KA+GP,iBAAA,aAEE,6B9Bg7HL,MAAA,Q8B36HG,mC9B86HH,MAAA,KCmBD,0B6B97HM,MAAA,QAIA,gCAAA,gC7B+7HJ,MAAO,KgCvkJT,0CH0oBQ,0CGzoBN,mDjCwjJD,mDiCvjJC,MAAA,KAEA,YACA,QAAA,IAAA,KjC2jJD,cAAA,KiChkJC,WAAY,KAQV,iBAAA,QjC2jJH,cAAA,IiCxjJK,eACA,QAAA,ajC4jJL,yBiCxkJC,QAAS,EAAE,IAkBT,MAAA,KjCyjJH,QAAA,SkC5kJC,oBACA,MAAA,KAEA,YlC+kJD,QAAA,akCnlJC,aAAc,EAOZ,OAAA,KAAA,ElC+kJH,cAAA,ICmBD,eiC/lJM,QAAA,OAEA,iBACA,oBACA,SAAA,SACA,MAAA,KACA,QAAA,IAAA,KACA,YAAA,KACA,YAAA,WlCglJL,MAAA,QkC9kJG,gBAAA,KjCimJF,iBAAkB,KiC9lJZ,OAAA,IAAA,MAAA,KPVH,6B3B2lJJ,gCkC7kJG,YAAA,EjCgmJF,uBAAwB,I0BvnJxB,0BAAA,I3BymJD,4BkCxkJG,+BjC2lJF,wBAAyB,IACzB,2BAA4B,IiCxlJxB,uBAFA,uBAGA,0BAFA,0BlC8kJL,QAAA,EkCtkJG,MAAA,QjCylJF,iBAAkB,KAClB,aAAc,KAEhB,sBiCvlJM,4BAFA,4BjC0lJN,yBiCvlJM,+BAFA,+BAGA,QAAA,ElC2kJL,MAAA,KkCloJC,OAAQ,QjCqpJR,iBAAkB,QAClB,aAAc,QiCnlJV,wBAEA,8BADA,8BjColJN,2BiCtlJM,iCjCulJN,iCDZC,MAAA,KkC/jJC,OAAQ,YjCklJR,iBAAkB,KkC7pJd,aAAA,KAEA,oBnC8oJL,uBmC5oJG,QAAA,KAAA,KlC+pJF,UAAW,K0B1pJX,YAAA,U3B4oJD,gCmC3oJG,mClC8pJF,uBAAwB,I0BvqJxB,0BAAA,I3BypJD,+BkC1kJD,kCjC6lJE,wBAAyB,IkC7qJrB,2BAAA,IAEA,oBnC8pJL,uBmC5pJG,QAAA,IAAA,KlC+qJF,UAAW,K0B1qJX,YAAA,I3B4pJD,gCmC3pJG,mClC8qJF,uBAAwB,I0BvrJxB,0BAAA,I3ByqJD,+BoC3qJD,kCACE,wBAAA,IACA,2BAAA,IAEA,OpC6qJD,aAAA,EoCjrJC,OAAQ,KAAK,EAOX,WAAA,OpC6qJH,WAAA,KCmBD,UmC7rJM,QAAA,OAEA,YACA,eACA,QAAA,apC8qJL,QAAA,IAAA,KoC5rJC,iBAAkB,KnC+sJlB,OAAQ,IAAI,MAAM,KmC5rJd,cAAA,KAnBN,kBpCisJC,kBCmBC,gBAAiB,KmCzrJb,iBAAA,KA3BN,eAAA,kBAkCM,MAAA,MAlCN,mBAAA,sBnC6tJE,MAAO,KmClrJH,mBAEA,yBADA,yBpCqqJL,sBqCltJC,MAAO,KACP,OAAA,YACA,iBAAA,KAEA,OACA,QAAA,OACA,QAAA,KAAA,KAAA,KACA,UAAA,IACA,YAAA,IACA,YAAA,EACA,MAAA,KrCotJD,WAAA,OqChtJG,YAAA,OpCmuJF,eAAgB,SoCjuJZ,cAAA,MrCotJL,cqCltJK,cAKJ,MAAA,KACE,gBAAA,KrC+sJH,OAAA,QqC1sJG,aACA,QAAA,KAOJ,YCtCE,SAAA,StC+uJD,IAAA,KCmBD,eqC7vJM,iBAAA,KALJ,2BD0CF,2BrC4sJC,iBAAA,QCmBD,eqCpwJM,iBAAA,QALJ,2BD8CF,2BrC+sJC,iBAAA,QCmBD,eqC3wJM,iBAAA,QALJ,2BDkDF,2BrCktJC,iBAAA,QCmBD,YqClxJM,iBAAA,QALJ,wBDsDF,wBrCqtJC,iBAAA,QCmBD,eqCzxJM,iBAAA,QALJ,2BD0DF,2BrCwtJC,iBAAA,QCmBD,cqChyJM,iBAAA,QCDJ,0BADF,0BAEE,iBAAA,QAEA,OACA,QAAA,aACA,UAAA,KACA,QAAA,IAAA,IACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OvCqxJD,YAAA,OuClxJC,eAAA,OACE,iBAAA,KvCoxJH,cAAA,KuC/wJG,aACA,QAAA,KAGF,YtCkyJA,SAAU,SsChyJR,IAAA,KAMA,0BvC4wJH,eCmBC,IAAK,EsC7xJD,QAAA,IAAA,IvCgxJL,cuC9wJK,cAKJ,MAAA,KtC4xJA,gBAAiB,KsC1xJf,OAAA,QvC4wJH,+BuCxwJC,4BACE,MAAA,QvC0wJH,iBAAA,KuCtwJG,wBvCywJH,MAAA,MuCrwJG,+BvCwwJH,aAAA,IwCj0JC,uBACA,YAAA,IAEA,WACA,YAAA,KxCo0JD,eAAA,KwCz0JC,cAAe,KvC41Jf,MAAO,QuCn1JL,iBAAA,KAIA,eAbJ,cAcI,MAAA,QxCo0JH,awCl1JC,cAAe,KAmBb,UAAA,KxCk0JH,YAAA,ICmBD,cuCh1JI,iBAAA,QAEA,sBxCi0JH,4BwC31JC,cAAe,KA8Bb,aAAA,KxCg0JH,cAAA,IwC7yJD,sBAfI,UAAA,KxCi0JD,oCwC9zJC,WvCi1JA,YAAa,KuC/0JX,eAAA,KxCi0JH,sBwCvzJD,4BvC00JE,cAAe,KuC90Jb,aAAA,KC5CJ,ezC42JD,cyC32JC,UAAA,MAGA,WACA,QAAA,MACA,QAAA,IACA,cAAA,KrCiLA,YAAA,WACK,iBAAA,KACG,OAAA,IAAA,MAAA,KJ8rJT,cAAA,IyCx3JC,mBAAoB,OAAO,IAAI,YxC24J1B,cAAe,OAAO,IAAI,YwC93J7B,WAAA,OAAA,IAAA,YAKF,iBzC22JD,eCmBC,aAAc,KACd,YAAa,KwCv3JX,mBA1BJ,kBzCk4JC,kByCv2JG,aAAA,QCzBJ,oBACE,QAAA,IACA,MAAA,KAEA,O1Cs4JD,QAAA,K0C14JC,cAAe,KAQb,OAAA,IAAA,MAAA,YAEA,cAAA,IAVJ,UAeI,WAAA,E1Ck4JH,MAAA,QCmBD,mByC/4JI,YAAA,IArBJ,SAyBI,U1C+3JH,cAAA,ECmBD,WyCx4JE,WAAA,IAFF,mBAAA,mBAMI,cAAA,KAEA,0BACA,0B1Cy3JH,SAAA,S0Cj3JC,IAAK,KCvDL,MAAA,MACA,MAAA,Q3C46JD,e0Ct3JC,MAAO,QClDL,iBAAA,Q3C26JH,aAAA,Q2Cx6JG,kB3C26JH,iBAAA,Q2Cn7JC,2BACA,MAAA,Q3Cu7JD,Y0C73JC,MAAO,QCtDL,iBAAA,Q3Cs7JH,aAAA,Q2Cn7JG,e3Cs7JH,iBAAA,Q2C97JC,wBACA,MAAA,Q3Ck8JD,e0Cp4JC,MAAO,QC1DL,iBAAA,Q3Ci8JH,aAAA,Q2C97JG,kB3Ci8JH,iBAAA,Q2Cz8JC,2BACA,MAAA,Q3C68JD,c0C34JC,MAAO,QC9DL,iBAAA,Q3C48JH,aAAA,Q2Cz8JG,iB3C48JH,iBAAA,Q4C78JC,0BAAQ,MAAA,QACR,wCAAQ,K5Cm9JP,oBAAA,KAAA,E4C/8JD,GACA,oBAAA,EAAA,GACA,mCAAQ,K5Cq9JP,oBAAA,KAAA,E4Cv9JD,GACA,oBAAA,EAAA,GACA,gCAAQ,K5Cq9JP,oBAAA,KAAA,E4C78JD,GACA,oBAAA,EAAA,GAGA,UACA,OAAA,KxCsCA,cAAA,KACQ,SAAA,OJ26JT,iBAAA,Q4C78JC,cAAe,IACf,mBAAA,MAAA,EAAA,IAAA,IAAA,eACA,WAAA,MAAA,EAAA,IAAA,IAAA,eAEA,cACA,MAAA,KACA,MAAA,EACA,OAAA,KACA,UAAA,KxCyBA,YAAA,KACQ,MAAA,KAyHR,WAAA,OACK,iBAAA,QACG,mBAAA,MAAA,EAAA,KAAA,EAAA,gBJ+zJT,WAAA,MAAA,EAAA,KAAA,EAAA,gB4C18JC,mBAAoB,MAAM,IAAI,K3Cq+JzB,cAAe,MAAM,IAAI,K4Cp+J5B,WAAA,MAAA,IAAA,KDEF,sBCAE,gCDAF,iBAAA,yK5C88JD,iBAAA,oK4Cv8JC,iBAAiB,iK3Cm+JjB,wBAAyB,KAAK,KG/gK9B,gBAAA,KAAA,KJy/JD,qBIv/JS,+BwCmDR,kBAAmB,qBAAqB,GAAG,OAAO,SErElD,aAAA,qBAAA,GAAA,OAAA,S9C4gKD,UAAA,qBAAA,GAAA,OAAA,S6Cz9JG,sBACA,iBAAA,Q7C69JH,wC4Cx8JC,iBAAkB,yKEzElB,iBAAA,oK9CohKD,iBAAA,iK6Cj+JG,mBACA,iBAAA,Q7Cq+JH,qC4C58JC,iBAAkB,yKE7ElB,iBAAA,oK9C4hKD,iBAAA,iK6Cz+JG,sBACA,iBAAA,Q7C6+JH,wC4Ch9JC,iBAAkB,yKEjFlB,iBAAA,oK9CoiKD,iBAAA,iK6Cj/JG,qBACA,iBAAA,Q7Cq/JH,uC+C5iKC,iBAAkB,yKAElB,iBAAA,oK/C6iKD,iBAAA,iK+C1iKG,O/C6iKH,WAAA,KC4BD,mB8CnkKE,WAAA,E/C4iKD,O+CxiKD,YACE,SAAA,O/C0iKD,KAAA,E+CtiKC,Y/CyiKD,MAAA,Q+CriKG,c/CwiKH,QAAA,MC4BD,4B8C9jKE,UAAA,KAGF,aAAA,mBAEE,aAAA,KAGF,YAAA,kB9C+jKE,cAAe,K8CxjKjB,YAHE,Y/CoiKD,a+ChiKC,QAAA,W/CmiKD,eAAA,I+C/hKC,c/CkiKD,eAAA,O+C7hKC,cACA,eAAA,OAMF,eACE,WAAA,EACA,cAAA,ICvDF,YAEE,aAAA,EACA,WAAA,KAQF,YACE,aAAA,EACA,cAAA,KAGA,iBACA,SAAA,SACA,QAAA,MhD6kKD,QAAA,KAAA,KgD1kKC,cAAA,KrB3BA,iBAAA,KACC,OAAA,IAAA,MAAA,KqB6BD,6BACE,uBAAA,IrBvBF,wBAAA,I3BsmKD,4BgDpkKC,cAAe,E/CgmKf,2BAA4B,I+C9lK5B,0BAAA,IAFF,kBAAA,uBAKI,MAAA,KAIF,2CAAA,gD/CgmKA,MAAO,K+C5lKL,wBAFA,wBhDykKH,6BgDxkKG,6BAKF,MAAO,KACP,gBAAA,KACA,iBAAA,QAKA,uB/C4lKA,MAAO,KACP,WAAY,K+CzlKV,0BhDmkKH,gCgDlkKG,gCALF,MAAA,K/CmmKA,OAAQ,YACR,iBAAkB,KDxBnB,mDgD5kKC,yDAAA,yD/CymKA,MAAO,QDxBR,gDgDhkKC,sDAAA,sD/C6lKA,MAAO,K+CzlKL,wBAEA,8BADA,8BhDmkKH,QAAA,EgDxkKC,MAAA,K/ComKA,iBAAkB,QAClB,aAAc,QAEhB,iDDpBC,wDCuBD,uDADA,uD+CzmKE,8DAYI,6D/C4lKN,uD+CxmKE,8D/C2mKF,6DAKE,MAAO,QDxBR,8CiD1qKG,oDADF,oDAEE,MAAA,QAEA,yBhDusKF,MAAO,QgDrsKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhDwsKJ,MAAO,QDtBR,gCiDhrKO,gCAGF,qCAFE,qChD2sKN,MAAO,QACP,iBAAkB,QAEpB,iCgDvsKQ,uCAFA,uChD0sKR,sCDtBC,4CiDnrKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,sBhDouKF,MAAO,QgDluKH,iBAAA,QAFF,uBAAA,4BAKI,MAAA,QAGF,gDAAA,qDhDquKJ,MAAO,QDtBR,6BiD7sKO,6BAGF,kCAFE,kChDwuKN,MAAO,QACP,iBAAkB,QAEpB,8BgDpuKQ,oCAFA,oChDuuKR,mCDtBC,yCiDhtKO,yCArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,yBhDiwKF,MAAO,QgD/vKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhDkwKJ,MAAO,QDtBR,gCiD1uKO,gCAGF,qCAFE,qChDqwKN,MAAO,QACP,iBAAkB,QAEpB,iCgDjwKQ,uCAFA,uChDowKR,sCDtBC,4CiD7uKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,wBhD8xKF,MAAO,QgD5xKH,iBAAA,QAFF,yBAAA,8BAKI,MAAA,QAGF,kDAAA,uDhD+xKJ,MAAO,QDtBR,+BiDvwKO,+BAGF,oCAFE,oChDkyKN,MAAO,QACP,iBAAkB,QAEpB,gCgD9xKQ,sCAFA,sChDiyKR,qCDtBC,2CiD1wKO,2CDkGN,MAAO,KACP,iBAAA,QACA,aAAA,QAEF,yBACE,WAAA,EACA,cAAA,IE1HF,sBACE,cAAA,EACA,YAAA,IAEA,O9C0DA,cAAA,KACQ,iBAAA,KJ6uKT,OAAA,IAAA,MAAA,YkDnyKC,cAAe,IACf,mBAAA,EAAA,IAAA,IAAA,gBlDqyKD,WAAA,EAAA,IAAA,IAAA,gBkD/xKC,YACA,QAAA,KvBnBC,e3BuzKF,QAAA,KAAA,KkDtyKC,cAAe,IAAI,MAAM,YAMvB,uBAAA,IlDmyKH,wBAAA,IkD7xKC,0CACA,MAAA,QAEA,alDgyKD,WAAA,EkDpyKC,cAAe,EjDg0Kf,UAAW,KACX,MAAO,QDtBR,oBkD1xKC,sBjDkzKF,eiDxzKI,mBAKJ,qBAEE,MAAA,QvBvCA,cACC,QAAA,KAAA,K3Bs0KF,iBAAA,QkDrxKC,WAAY,IAAI,MAAM,KjDizKtB,2BAA4B,IiD9yK1B,0BAAA,IAHJ,mBAAA,mCAMM,cAAA,ElDwxKL,oCkDnxKG,oDjD+yKF,aAAc,IAAI,EiD7yKZ,cAAA,EvBtEL,4D3B61KF,4EkDjxKG,WAAA,EjD6yKF,uBAAwB,IiD3yKlB,wBAAA,IvBtEL,0D3B21KF,0EkD1yKC,cAAe,EvB1Df,2BAAA,IACC,0BAAA,IuB0FH,+EAEI,uBAAA,ElD8wKH,wBAAA,EkD1wKC,wDlD6wKD,iBAAA,EC4BD,0BACE,iBAAkB,EiDlyKpB,8BlD0wKC,ckD1wKD,gCjDuyKE,cAAe,EiDvyKjB,sCAQM,sBlDwwKL,wCC4BC,cAAe,K0Br5Kf,aAAA,KuByGF,wDlDqxKC,0BC4BC,uBAAwB,IACxB,wBAAyB,IiDlzK3B,yFAoBQ,yFlDwwKP,2DkDzwKO,2DjDqyKN,uBAAwB,IACxB,wBAAyB,IAK3B,wGiD9zKA,wGjD4zKA,wGDtBC,wGCuBD,0EiD7zKA,0EjD2zKA,0EiDnyKU,0EjD2yKR,uBAAwB,IAK1B,uGiDx0KA,uGjDs0KA,uGDtBC,uGCuBD,yEiDv0KA,yEjDq0KA,yEiDzyKU,yEvB7HR,wBAAA,IuBiGF,sDlDqzKC,yBC4BC,2BAA4B,IAC5B,0BAA2B,IiDxyKrB,qFA1CR,qFAyCQ,wDlDmxKP,wDC4BC,2BAA4B,IAC5B,0BAA2B,IAG7B,oGDtBC,oGCwBD,oGiD91KA,oGjD21KA,uEiD7yKU,uEjD+yKV,uEiD71KA,uEjDm2KE,0BAA2B,IAG7B,mGDtBC,mGCwBD,mGiDx2KA,mGjDq2KA,sEiDnzKU,sEjDqzKV,sEiDv2KA,sEjD62KE,2BAA4B,IiDlzK1B,0BlD2xKH,qCkDt1KD,0BAAA,qCA+DI,WAAA,IAAA,MAAA,KA/DJ,kDAAA,kDAmEI,WAAA,EAnEJ,uBAAA,yCjD23KE,OAAQ,EiDjzKA,+CjDqzKV,+CiD/3KA,+CjDi4KA,+CAEA,+CANA,+CDjBC,iECoBD,iEiDh4KA,iEjDk4KA,iEAEA,iEANA,iEAWE,YAAa,EiD3zKL,8CjD+zKV,8CiD74KA,8CjD+4KA,8CAEA,8CANA,8CDjBC,gECoBD,gEiD94KA,gEjDg5KA,gEAEA,gEANA,gEAWE,aAAc,EAIhB,+CiD35KA,+CjDy5KA,+CiDl0KU,+CjDq0KV,iEiD55KA,iEjD05KA,iEDtBC,iEC6BC,cAAe,EAEjB,8CiDn0KU,8CjDq0KV,8CiDr6KA,8CjDo6KA,gEDtBC,gECwBD,gEiDh0KI,gEACA,cAAA,EAUJ,yBACE,cAAA,ElDmyKD,OAAA,EkD/xKG,aACA,cAAA,KANJ,oBASM,cAAA,ElDkyKL,cAAA,IkD7xKG,2BlDgyKH,WAAA,IC4BD,4BiDxzKM,cAAA,EAKF,wDAvBJ,wDlDqzKC,WAAA,IAAA,MAAA,KkD5xKK,2BlD+xKL,WAAA,EmDlhLC,uDnDqhLD,cAAA,IAAA,MAAA,KmDlhLG,eACA,aAAA,KnDshLH,8BmDxhLC,MAAA,KAMI,iBAAA,QnDqhLL,aAAA,KmDlhLK,0DACA,iBAAA,KAGJ,qCAEI,MAAA,QnDmhLL,iBAAA,KmDpiLC,yDnDuiLD,oBAAA,KmDpiLG,eACA,aAAA,QnDwiLH,8BmD1iLC,MAAA,KAMI,iBAAA,QnDuiLL,aAAA,QmDpiLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnDqiLL,iBAAA,KmDtjLC,yDnDyjLD,oBAAA,QmDtjLG,eACA,aAAA,QnD0jLH,8BmD5jLC,MAAA,QAMI,iBAAA,QnDyjLL,aAAA,QmDtjLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnDujLL,iBAAA,QmDxkLC,yDnD2kLD,oBAAA,QmDxkLG,YACA,aAAA,QnD4kLH,2BmD9kLC,MAAA,QAMI,iBAAA,QnD2kLL,aAAA,QmDxkLK,uDACA,iBAAA,QAGJ,kCAEI,MAAA,QnDykLL,iBAAA,QmD1lLC,sDnD6lLD,oBAAA,QmD1lLG,eACA,aAAA,QnD8lLH,8BmDhmLC,MAAA,QAMI,iBAAA,QnD6lLL,aAAA,QmD1lLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnD2lLL,iBAAA,QmD5mLC,yDnD+mLD,oBAAA,QmD5mLG,cACA,aAAA,QnDgnLH,6BmDlnLC,MAAA,QAMI,iBAAA,QnD+mLL,aAAA,QmD5mLK,yDACA,iBAAA,QAGJ,oCAEI,MAAA,QnD6mLL,iBAAA,QoD5nLC,wDACA,oBAAA,QAEA,kBACA,SAAA,SpD+nLD,QAAA,MoDpoLC,OAAQ,EnDgqLR,QAAS,EACT,SAAU,OAEZ,yCmDtpLI,wBADA,yBAEA,yBACA,wBACA,SAAA,SACA,IAAA,EACA,OAAA,EpD+nLH,KAAA,EoD1nLC,MAAO,KACP,OAAA,KpD4nLD,OAAA,EoDvnLC,wBpD0nLD,eAAA,OqDppLC,uBACA,eAAA,IAEA,MACA,WAAA,KACA,QAAA,KjDwDA,cAAA,KACQ,iBAAA,QJgmLT,OAAA,IAAA,MAAA,QqD/pLC,cAAe,IASb,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACA,WAAA,MAAA,EAAA,IAAA,IAAA,gBAKJ,iBACE,aAAA,KACA,aAAA,gBAEF,SACE,QAAA,KACA,cAAA,ICtBF,SACE,QAAA,IACA,cAAA,IAEA,OACA,MAAA,MACA,UAAA,KjCRA,YAAA,IAGA,YAAA,ErBqrLD,MAAA,KsD7qLC,YAAA,EAAA,IAAA,EAAA,KrDysLA,OAAQ,kBqDvsLN,QAAA,GjCbF,aiCeE,ajCZF,MAAA,KrB6rLD,gBAAA,KsDzqLC,OAAA,QACE,OAAA,kBACA,QAAA,GAEA,aACA,mBAAA,KtD2qLH,QAAA,EuDhsLC,OAAQ,QACR,WAAA,IvDksLD,OAAA,EuD7rLC,YACA,SAAA,OAEA,OACA,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EAIA,QAAA,KvD6rLD,QAAA,KuD1rLC,SAAA,OnD+GA,2BAAA,MACI,QAAA,EAEI,0BAkER,mBAAA,kBAAA,IAAA,SAEK,cAAA,aAAA,IAAA,SACG,WAAA,UAAA,IAAA,SJ6gLT,kBAAA,kBuDhsLC,cAAA,kBnD2GA,aAAA,kBACI,UAAA,kBAEI,wBJwlLT,kBAAA,euDpsLK,cAAe,eACnB,aAAA,eACA,UAAA,eAIF,mBACE,WAAA,OACA,WAAA,KvDqsLD,cuDhsLC,SAAU,SACV,MAAA,KACA,OAAA,KAEA,eACA,SAAA,SnDaA,iBAAA,KACQ,wBAAA,YmDZR,gBAAA,YtD4tLA,OsD5tLA,IAAA,MAAA,KAEA,OAAA,IAAA,MAAA,evDksLD,cAAA,IuD9rLC,QAAS,EACT,mBAAA,EAAA,IAAA,IAAA,eACA,WAAA,EAAA,IAAA,IAAA,eAEA,gBACA,SAAA,MACA,IAAA,EACA,MAAA,EvDgsLD,OAAA,EuD9rLC,KAAA,ElCrEA,QAAA,KAGA,iBAAA,KkCmEA,qBlCtEA,OAAA,iBAGA,QAAA,EkCwEF,mBACE,OAAA,kBACA,QAAA,GAIF,cACE,QAAA,KvDgsLD,cAAA,IAAA,MAAA,QuD3rLC,qBACA,WAAA,KAKF,aACE,OAAA,EACA,YAAA,WAIF,YACE,SAAA,SACA,QAAA,KvD0rLD,cuD5rLC,QAAS,KAQP,WAAA,MACA,WAAA,IAAA,MAAA,QATJ,wBAaI,cAAA,EvDsrLH,YAAA,IuDlrLG,mCvDqrLH,YAAA,KuD/qLC,oCACA,YAAA,EAEA,yBACA,SAAA,SvDkrLD,IAAA,QuDhqLC,MAAO,KAZP,OAAA,KACE,SAAA,OvDgrLD,yBuD7qLD,cnDvEA,MAAA,MACQ,OAAA,KAAA,KmD2ER,eAAY,mBAAA,EAAA,IAAA,KAAA,evD+qLX,WAAA,EAAA,IAAA,KAAA,euDzqLD,UAFA,MAAA,OvDirLD,yBwD/zLC,UACA,MAAA,OCNA,SAEA,SAAA,SACA,QAAA,KACA,QAAA,MACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,ODHA,WAAA,OnCVA,aAAA,OAGA,UAAA,OrBs1LD,YAAA,OwD30LC,OAAA,iBnCdA,QAAA,ErB61LD,WAAA,KwD90LY,YAAmB,OAAA,kBxDk1L/B,QAAA,GwDj1LY,aAAmB,QAAA,IAAA,ExDq1L/B,WAAA,KwDp1LY,eAAmB,QAAA,EAAA,IxDw1L/B,YAAA,IwDv1LY,gBAAmB,QAAA,IAAA,ExD21L/B,WAAA,IwDt1LC,cACA,QAAA,EAAA,IACA,YAAA,KAEA,eACA,UAAA,MxDy1LD,QAAA,IAAA,IwDr1LC,MAAO,KACP,WAAA,OACA,iBAAA,KACA,cAAA,IAEA,exDu1LD,SAAA,SwDn1LC,MAAA,EACE,OAAA,EACA,aAAA,YACA,aAAA,MAEA,4BxDq1LH,OAAA,EwDn1LC,KAAA,IACE,YAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,iCxDq1LH,MAAA,IwDn1LC,OAAA,EACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,kCxDq1LH,OAAA,EwDn1LC,KAAA,IACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,8BxDq1LH,IAAA,IwDn1LC,KAAA,EACE,WAAA,KACA,aAAA,IAAA,IAAA,IAAA,EACA,mBAAA,KAEA,6BxDq1LH,IAAA,IwDn1LC,MAAA,EACE,WAAA,KACA,aAAA,IAAA,EAAA,IAAA,IACA,kBAAA,KAEA,+BxDq1LH,IAAA,EwDn1LC,KAAA,IACE,YAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,oCxDq1LH,IAAA,EwDn1LC,MAAA,IACE,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,qCxDq1LH,IAAA,E0Dl7LC,KAAM,IACN,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,SACA,SAAA,SACA,IAAA,EDXA,KAAA,EAEA,QAAA,KACA,QAAA,KACA,UAAA,MACA,QAAA,IACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KCAA,eAAA,OAEA,WAAA,OACA,aAAA,OAAA,UAAA,OACA,YAAA,OACA,iBAAA,KACA,wBAAA,YtD8CA,gBAAA,YACQ,OAAA,IAAA,MAAA,KJk5LT,OAAA,IAAA,MAAA,e0D77LC,cAAA,IAAY,mBAAA,EAAA,IAAA,KAAA,e1Dg8Lb,WAAA,EAAA,IAAA,KAAA,e0D/7La,WAAA,KACZ,aAAY,WAAA,MACZ,eAAY,YAAA,KAGd,gBACE,WAAA,KAEA,cACA,YAAA,MAEA,e1Dq8LD,QAAA,IAAA,K0Dl8LC,OAAQ,EACR,UAAA,K1Do8LD,iBAAA,Q0D57LC,cAAA,IAAA,MAAA,QzDy9LA,cAAe,IAAI,IAAI,EAAE,EyDt9LvB,iBACA,QAAA,IAAA,KAEA,gBACA,sB1D87LH,SAAA,S0D37LC,QAAS,MACT,MAAA,E1D67LD,OAAA,E0D37LC,aAAc,YACd,aAAA,M1D87LD,gB0Dz7LC,aAAA,KAEE,sBACA,QAAA,GACA,aAAA,KAEA,oB1D27LH,OAAA,M0D17LG,KAAA,IACE,YAAA,MACA,iBAAA,KACA,iBAAA,gBACA,oBAAA,E1D67LL,0B0Dz7LC,OAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,KACA,oBAAA,EAEA,sB1D27LH,IAAA,I0D17LG,KAAA,MACE,WAAA,MACA,mBAAA,KACA,mBAAA,gBACA,kBAAA,E1D67LL,4B0Dz7LC,OAAA,MACE,KAAA,IACA,QAAA,IACA,mBAAA,KACA,kBAAA,EAEA,uB1D27LH,IAAA,M0D17LG,KAAA,IACE,YAAA,MACA,iBAAA,EACA,oBAAA,KACA,oBAAA,gB1D67LL,6B0Dx7LC,IAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,EACA,oBAAA,KAEA,qB1D07LH,IAAA,I0Dz7LG,MAAA,MACE,WAAA,MACA,mBAAA,EACA,kBAAA,KACA,kBAAA,gB1D47LL,2B2DpjMC,MAAO,IACP,OAAA,M3DsjMD,QAAA,I2DnjMC,mBAAoB,EACpB,kBAAA,KAEA,U3DqjMD,SAAA,S2DljMG,gBACA,SAAA,SvD6KF,MAAA,KACK,SAAA,OJ04LN,sB2D/jMC,SAAU,S1D4lMV,QAAS,K0D9kML,mBAAA,IAAA,YAAA,K3DqjML,cAAA,IAAA,YAAA,K2D3hMC,WAAA,IAAA,YAAA,KvDmKK,4BAFL,0BAGQ,YAAA,EA3JA,qDA+GR,sBAEQ,mBAAA,kBAAA,IAAA,YJ86LP,cAAA,aAAA,IAAA,Y2DzjMG,WAAA,UAAA,IAAA,YvDmHJ,4BAAA,OACQ,oBAAA,OuDjHF,oBAAA,O3D4jML,YAAA,OI58LD,mCHs+LA,2BGr+LQ,KAAA,EuD5GF,kBAAA,sB3D6jML,UAAA,sBC2BD,kCADA,2BG5+LA,KAAA,EACQ,kBAAA,uBuDtGF,UAAA,uBArCN,6B3DomMD,gC2DpmMC,iC1D+nME,KAAM,E0DllMN,kBAAA,mB3D4jMH,UAAA,oBAGA,wB2D5mMD,sBAAA,sBAsDI,QAAA,MAEA,wB3D0jMH,KAAA,E2DtjMG,sB3DyjMH,sB2DrnMC,SAAU,SA+DR,IAAA,E3DyjMH,MAAA,KC0BD,sB0D/kMI,KAAA,KAnEJ,sBAuEI,KAAA,MAvEJ,2BA0EI,4B3DwjMH,KAAA,E2D/iMC,6BACA,KAAA,MAEA,8BACA,KAAA,KtC3FA,kBsC6FA,SAAA,SACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,I3DmjMD,UAAA,K2D9iMC,MAAA,KdnGE,WAAA,OACA,YAAA,EAAA,IAAA,IAAA,eACA,iBAAA,cAAA,OAAA,kBACA,QAAA,G7CqpMH,uB2DljMC,iBAAA,sEACE,iBAAA,iEACA,iBAAA,uFdxGA,iBAAA,kEACA,OAAA,+GACA,kBAAA,SACA,wBACA,MAAA,E7C6pMH,KAAA,K2DpjMC,iBAAA,sE1DglMA,iBAAiB,iE0D9kMf,iBAAA,uFACA,iBAAA,kEACA,OAAA,+GtCvHF,kBAAA,SsCyFF,wB3DslMC,wBC4BC,MAAO,KACP,gBAAiB,KACjB,OAAQ,kB0D7kMN,QAAA,EACA,QAAA,G3DwjMH,0C2DhmMD,2CA2CI,6BADA,6B1DklMF,SAAU,S0D7kMR,IAAA,IACA,QAAA,E3DqjMH,QAAA,a2DrmMC,WAAY,MAqDV,0CADA,6B3DsjMH,KAAA,I2D1mMC,YAAa,MA0DX,2CADA,6BAEA,MAAA,IACA,aAAA,MAME,6BADF,6B3DmjMH,MAAA,K2D9iMG,OAAA,KACE,YAAA,M3DgjML,YAAA,E2DriMC,oCACA,QAAA,QAEA,oCACA,QAAA,QAEA,qBACA,SAAA,SACA,OAAA,K3DwiMD,KAAA,I2DjjMC,QAAS,GAYP,MAAA,IACA,aAAA,EACA,YAAA,KACA,WAAA,OACA,WAAA,KAEA,wBACA,QAAA,aAWA,MAAA,KACA,OAAA,K3D8hMH,OAAA,I2D7jMC,YAAa,OAkCX,OAAA,QACA,iBAAA,OACA,iBAAA,cACA,OAAA,IAAA,MAAA,K3D8hMH,cAAA,K2DthMC,6BACA,MAAA,KACA,OAAA,KACA,OAAA,EACA,iBAAA,KAEA,kBACA,SAAA,SACA,MAAA,IACA,OAAA,K3DyhMD,KAAA,I2DxhMC,QAAA,GACE,YAAA,K3D0hMH,eAAA,K2Dj/LC,MAAO,KAhCP,WAAA,O1D8iMA,YAAa,EAAE,IAAI,IAAI,eAEzB,uB0D3iMM,YAAA,KAEA,oCACA,0C3DmhMH,2C2D3hMD,6BAAA,6BAYI,MAAA,K3DmhMH,OAAA,K2D/hMD,WAAA,M1D2jME,UAAW,KDxBZ,0C2D9gMD,6BACE,YAAA,MAEA,2C3DghMD,6B2D5gMD,aAAA,M3D+gMC,kBACF,MAAA,I4D7wMC,KAAA,I3DyyME,eAAgB,KAElB,qBACE,OAAQ,MAkBZ,qCADA,sCADA,mBADA,oBAXA,gBADA,iBAOA,uBADA,wBADA,iBADA,kBADA,wBADA,yBASA,mCADA,oC2DpzME,oBAAA,qBAAA,oBAAA,qB3D2zMF,WADA,YAOA,uBADA,wBADA,qBADA,sBADA,cADA,e2D/zMI,a3Dq0MJ,cDvBC,kB4D7yMG,mB3DqzMJ,WADA,YAwBE,QAAS,MACT,QAAS,IASX,qCADA,mBANA,gBAGA,uBADA,iBADA,wBAIA,mCDhBC,oB6D/0MC,oB5Dk2MF,W+B51MA,uBhCo0MC,qB4D5zMG,cChBF,aACA,kB5D+1MF,W+Br1ME,MAAO,KhCy0MR,cgCt0MC,QAAS,MACT,aAAA,KhCw0MD,YAAA,KgC/zMC,YhCk0MD,MAAA,gBgC/zMC,WhCk0MD,MAAA,egC/zMC,MhCk0MD,QAAA,e8Dz1MC,MACA,QAAA,gBAEA,WACA,WAAA,O9B8BF,WACE,KAAA,EAAA,EAAA,EhCg0MD,MAAA,YgCzzMC,YAAa,KACb,iBAAA,YhC2zMD,OAAA,E+D31MC,Q/D81MD,QAAA,eC4BD,OACE,SAAU,M+Dn4MV,chE42MD,MAAA,aC+BD,YADA,YADA,YADA,YAIE,QAAS,e+Dp5MT,kBhEs4MC,mBgEr4MD,yBhEi4MD,kB+Dl1MD,mBA6IA,yB9D4tMA,kBACA,mB8Dj3ME,yB9D62MF,kBACA,mBACA,yB+Dv5MY,QAAA,eACV,yBAAU,YhE04MT,QAAA,gBC4BD,iB+Dp6MU,QAAA,gBhE64MX,c+D51MG,QAAS,oB/Dg2MV,c+Dl2MC,c/Dm2MH,QAAA,sB+D91MG,yB/Dk2MD,kBACF,QAAA,iB+D91MG,yB/Dk2MD,mBACF,QAAA,kBgEh6MC,yBhEo6MC,yBgEn6MD,QAAA,wBACA,+CAAU,YhEw6MT,QAAA,gBC4BD,iB+Dl8MU,QAAA,gBhE26MX,c+Dr2MG,QAAS,oB/Dy2MV,c+D32MC,c/D42MH,QAAA,sB+Dv2MG,+C/D22MD,kBACF,QAAA,iB+Dv2MG,+C/D22MD,mBACF,QAAA,kBgE97MC,+ChEk8MC,yBgEj8MD,QAAA,wBACA,gDAAU,YhEs8MT,QAAA,gBC4BD,iB+Dh+MU,QAAA,gBhEy8MX,c+D92MG,QAAS,oB/Dk3MV,c+Dp3MC,c/Dq3MH,QAAA,sB+Dh3MG,gD/Do3MD,kBACF,QAAA,iB+Dh3MG,gD/Do3MD,mBACF,QAAA,kBgE59MC,gDhEg+MC,yBgE/9MD,QAAA,wBACA,0BAAU,YhEo+MT,QAAA,gBC4BD,iB+D9/MU,QAAA,gBhEu+MX,c+Dv3MG,QAAS,oB/D23MV,c+D73MC,c/D83MH,QAAA,sB+Dz3MG,0B/D63MD,kBACF,QAAA,iB+Dz3MG,0B/D63MD,mBACF,QAAA,kBgEl/MC,0BhEs/MC,yBACF,QAAA,wBgEv/MC,yBhE2/MC,WACF,QAAA,gBgE5/MC,+ChEggNC,WACF,QAAA,gBgEjgNC,gDhEqgNC,WACF,QAAA,gBAGA,0B+Dh3MC,WA4BE,QAAS,gBC5LX,eAAU,QAAA,eACV,aAAU,ehEyhNT,QAAA,gBC4BD,oB+DnjNU,QAAA,gBhE4hNX,iB+D93MG,QAAS,oBAMX,iB/D23MD,iB+Dt2MG,QAAS,sB/D22MZ,qB+D/3MC,QAAS,e/Dk4MV,a+D53MC,qBAcE,QAAS,iB/Dm3MZ,sB+Dh4MC,QAAS,e/Dm4MV,a+D73MC,sBAOE,QAAS,kB/D23MZ,4B+D53MC,QAAS,eCpLT,ahEojNC,4BACF,QAAA,wBC6BD,aACE,cACE,QAAS","sourcesContent":["/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n margin: .67em 0;\n font-size: 2em;\n}\nmark {\n color: #000;\n background: #ff0;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\nsup {\n top: -.5em;\n}\nsub {\n bottom: -.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n height: 0;\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n margin: 0;\n font: inherit;\n color: inherit;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n padding: 0;\n border: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n padding: .35em .625em .75em;\n margin: 0 2px;\n border: 1px solid #c0c0c0;\n}\nlegend {\n padding: 0;\n border: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-spacing: 0;\n border-collapse: collapse;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n -webkit-box-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n display: inline-block;\n max-width: 100%;\n height: auto;\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all .2s ease-in-out;\n -o-transition: all .2s ease-in-out;\n transition: all .2s ease-in-out;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: .2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n margin-left: -5px;\n list-style: none;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n overflow: hidden;\n clear: left;\n text-align: right;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: .01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n padding: 6px 12px;\n margin-bottom: 0;\n font-size: 14px;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n opacity: .65;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: normal;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity .15s linear;\n -o-transition: opacity .15s linear;\n transition: opacity .15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-timing-function: ease;\n -o-transition-timing-function: ease;\n transition-timing-function: ease;\n -webkit-transition-duration: .35s;\n -o-transition-duration: .35s;\n transition-duration: .35s;\n -webkit-transition-property: height, visibility;\n -o-transition-property: height, visibility;\n transition-property: height, visibility;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, .15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555;\n text-align: center;\n background-color: #eee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eee;\n}\n.nav > li.disabled > a {\n color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n -webkit-overflow-scrolling: touch;\n border-top: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-top: 8px;\n margin-right: 15px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-top: 8px;\n margin-right: -15px;\n margin-bottom: 8px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border .2s ease-in-out;\n -o-transition: border .2s ease-in-out;\n transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@-o-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n float: left;\n width: 0;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n -webkit-transition: width .6s ease;\n -o-transition: width .6s ease;\n transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n -webkit-background-size: 40px 40px;\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777;\n cursor: not-allowed;\n background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: .2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: .5;\n}\nbutton.close {\n -webkit-appearance: none;\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transition: -webkit-transform .3s ease-out;\n -o-transition: -o-transform .3s ease-out;\n transition: transform .3s ease-out;\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, .2);\n border-radius: 6px;\n outline: 0;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: .5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 12px;\n font-style: normal;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n filter: alpha(opacity=0);\n opacity: 0;\n\n line-break: auto;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: .9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n font-style: normal;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, .2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n\n line-break: auto;\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999;\n border-top-color: rgba(0, 0, 0, .25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999;\n border-right-color: rgba(0, 0, 0, .25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999;\n border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999;\n border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: .6s ease-in-out left;\n -o-transition: .6s ease-in-out left;\n transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform .6s ease-in-out;\n -o-transition: -o-transform .6s ease-in-out;\n transition: transform .6s ease-in-out;\n\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n left: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n left: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n left: 0;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: .5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n filter: alpha(opacity=90);\n outline: 0;\n opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on
    ,
      , or
      .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: (@carousel-control-font-size * 1.5);\n height: (@carousel-control-font-size * 1.5);\n margin-top: (@carousel-control-font-size / -2);\n font-size: (@carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: (@carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: (@carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file diff --git a/src/cps/static/css/libs/normalize.css b/src/cps/static/css/libs/normalize.css new file mode 100644 index 0000000..c3e014d --- /dev/null +++ b/src/cps/static/css/libs/normalize.css @@ -0,0 +1,505 @@ +/*! normalize.css v1.0.1 | MIT License | git.io/normalize */ + +/* ========================================================================== + HTML5 display definitions + ========================================================================== */ + +/* + * Corrects `block` display not defined in IE 6/7/8/9 and Firefox 3. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section, +summary { + display: block; +} + +/* + * Corrects `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. + */ + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +/* + * Prevents modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/* + * Addresses styling for `hidden` attribute not present in IE 7/8/9, Firefox 3, + * and Safari 4. + * Known issue: no IE 6 support. + */ + +[hidden] { + display: none; +} + +/* ========================================================================== + Base + ========================================================================== */ + +/* + * 1. Corrects text resizing oddly in IE 6/7 when body `font-size` is set using + * `em` units. + * 2. Prevents iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-size: 100%; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ +} + +/* + * Addresses `font-family` inconsistency between `textarea` and other form + * elements. + */ + +html, +button, +input, +select, +textarea { + font-family: sans-serif; +} + +/* + * Addresses margins handled incorrectly in IE 6/7. + */ + +body { + margin: 0; +} + +/* ========================================================================== + Links + ========================================================================== */ + +/* + * Addresses `outline` inconsistency between Chrome and other browsers. + */ + +a:focus { + outline: thin dotted; +} + +/* + * Improves readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* ========================================================================== + Typography + ========================================================================== */ + +/* + * Addresses font sizes and margins set differently in IE 6/7. + * Addresses font sizes within `section` and `article` in Firefox 4+, Safari 5, + * and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +h2 { + font-size: 1.5em; + margin: 0.83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.75em; + margin: 2.33em 0; +} + +/* + * Addresses styling not present in IE 7/8/9, Safari 5, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/* + * Addresses style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +blockquote { + margin: 1em 40px; +} + +/* + * Addresses styling not present in Safari 5 and Chrome. + */ + +dfn { + font-style: italic; +} + +/* + * Addresses styling not present in IE 6/7/8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/* + * Addresses margins set differently in IE 6/7. + */ + +p, +pre { + margin: 1em 0; +} + +/* + * Corrects font family set oddly in IE 6, Safari 4/5, and Chrome. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + _font-family: 'courier new', monospace; + font-size: 1em; +} + +/* + * Improves readability of pre-formatted text in all browsers. + */ + +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +/* + * Addresses CSS quotes not supported in IE 6/7. + */ + +q { + quotes: none; +} + +/* + * Addresses `quotes` property not supported in Safari 4. + */ + +q:before, +q:after { + content: ''; + content: none; +} + +/* + * Addresses inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/* + * Prevents `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* ========================================================================== + Lists + ========================================================================== */ + +/* + * Addresses margins set differently in IE 6/7. + */ + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +/* + * Addresses paddings set differently in IE 6/7. + */ + +menu, +ol, +ul { + padding: 0 0 0 40px; +} + +/* + * Corrects list images handled incorrectly in IE 7. + */ + +nav ul, +nav ol { + list-style: none; + list-style-image: none; +} + +/* ========================================================================== + Embedded content + ========================================================================== */ + +/* + * 1. Removes border when inside `a` element in IE 6/7/8/9 and Firefox 3. + * 2. Improves image quality when scaled in IE 7. + */ + +img { + border: 0; /* 1 */ + -ms-interpolation-mode: bicubic; /* 2 */ +} + +/* + * Corrects overflow displayed oddly in IE 9. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* ========================================================================== + Figures + ========================================================================== */ + +/* + * Addresses margin not present in IE 6/7/8/9, Safari 5, and Opera 11. + */ + +figure { + margin: 0; +} + +/* ========================================================================== + Forms + ========================================================================== */ + +/* + * Corrects margin displayed oddly in IE 6/7. + */ + +form { + margin: 0; +} + +/* + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/* + * 1. Corrects color not being inherited in IE 6/7/8/9. + * 2. Corrects text not wrapping in Firefox 3. + * 3. Corrects alignment displayed oddly in IE 6/7. + */ + +legend { + border: 0; /* 1 */ + padding: 0; + white-space: normal; /* 2 */ + *margin-left: -7px; /* 3 */ +} + +/* + * 1. Corrects font size not being inherited in all browsers. + * 2. Addresses margins set differently in IE 6/7, Firefox 3+, Safari 5, + * and Chrome. + * 3. Improves appearance and consistency in all browsers. + */ + +button, +input, +select, +textarea { + font-size: 100%; /* 1 */ + margin: 0; /* 2 */ + vertical-align: baseline; /* 3 */ + *vertical-align: middle; /* 3 */ +} + +/* + * Addresses Firefox 3+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +button, +input { + line-height: normal; +} + +/* + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Corrects inability to style clickable `input` types in iOS. + * 3. Improves usability and consistency of cursor style between image-type + * `input` and others. + * 4. Removes inner spacing in IE 7 without affecting normal text inputs. + * Known issue: inner spacing remains in IE 6. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ + *overflow: visible; /* 4 */ +} + +/* + * Re-set default cursor for disabled elements. + */ + +button[disabled], +input[disabled] { + cursor: default; +} + +/* + * 1. Addresses box sizing set to content-box in IE 8/9. + * 2. Removes excess padding in IE 8/9. + * 3. Removes excess padding in IE 7. + * Known issue: excess padding remains in IE 6. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + *height: 13px; /* 3 */ + *width: 13px; /* 3 */ +} + +/* + * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ +/* +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +*/ + +/* + * Removes inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ + +/* input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} */ + +/* + * Removes inner padding and border in Firefox 3+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/* + * 1. Removes default vertical scrollbar in IE 6/7/8/9. + * 2. Improves readability and alignment in all browsers. + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + +/* ========================================================================== + Tables + ========================================================================== */ + +/* + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/src/cps/static/css/libs/typeahead.css b/src/cps/static/css/libs/typeahead.css new file mode 100644 index 0000000..fde250d --- /dev/null +++ b/src/cps/static/css/libs/typeahead.css @@ -0,0 +1,189 @@ +/* + * typehead.js-bootstrap3.less + * @version 0.2.3 + * https://github.com/hyspace/typeahead.js-bootstrap3.less + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ +.has-warning .twitter-typeahead .tt-input, +.has-warning .twitter-typeahead .tt-hint { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .twitter-typeahead .tt-input:focus, +.has-warning .twitter-typeahead .tt-hint:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-error .twitter-typeahead .tt-input, +.has-error .twitter-typeahead .tt-hint { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .twitter-typeahead .tt-input:focus, +.has-error .twitter-typeahead .tt-hint:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-success .twitter-typeahead .tt-input, +.has-success .twitter-typeahead .tt-hint { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .twitter-typeahead .tt-input:focus, +.has-success .twitter-typeahead .tt-hint:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.input-group .twitter-typeahead:first-child .tt-input, +.input-group .twitter-typeahead:first-child .tt-hint { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.input-group .twitter-typeahead:last-child .tt-input, +.input-group .twitter-typeahead:last-child .tt-hint { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.input-group.input-group-sm .twitter-typeahead .tt-input, +.input-group.input-group-sm .twitter-typeahead .tt-hint { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group.input-group-sm .twitter-typeahead .tt-input, +select.input-group.input-group-sm .twitter-typeahead .tt-hint { + height: 30px; + line-height: 30px; +} +textarea.input-group.input-group-sm .twitter-typeahead .tt-input, +textarea.input-group.input-group-sm .twitter-typeahead .tt-hint, +select[multiple].input-group.input-group-sm .twitter-typeahead .tt-input, +select[multiple].input-group.input-group-sm .twitter-typeahead .tt-hint { + height: auto; +} +.input-group.input-group-sm .twitter-typeahead:not(:first-child):not(:last-child) .tt-input, +.input-group.input-group-sm .twitter-typeahead:not(:first-child):not(:last-child) .tt-hint { + border-radius: 0; +} +.input-group.input-group-sm .twitter-typeahead:first-child .tt-input, +.input-group.input-group-sm .twitter-typeahead:first-child .tt-hint { + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group.input-group-sm .twitter-typeahead:last-child .tt-input, +.input-group.input-group-sm .twitter-typeahead:last-child .tt-hint { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} +.input-group.input-group-lg .twitter-typeahead .tt-input, +.input-group.input-group-lg .twitter-typeahead .tt-hint { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; +} +select.input-group.input-group-lg .twitter-typeahead .tt-input, +select.input-group.input-group-lg .twitter-typeahead .tt-hint { + height: 46px; + line-height: 46px; +} +textarea.input-group.input-group-lg .twitter-typeahead .tt-input, +textarea.input-group.input-group-lg .twitter-typeahead .tt-hint, +select[multiple].input-group.input-group-lg .twitter-typeahead .tt-input, +select[multiple].input-group.input-group-lg .twitter-typeahead .tt-hint { + height: auto; +} +.input-group.input-group-lg .twitter-typeahead:not(:first-child):not(:last-child) .tt-input, +.input-group.input-group-lg .twitter-typeahead:not(:first-child):not(:last-child) .tt-hint { + border-radius: 0; +} +.input-group.input-group-lg .twitter-typeahead:first-child .tt-input, +.input-group.input-group-lg .twitter-typeahead:first-child .tt-hint { + border-bottom-left-radius: 6px; + border-top-left-radius: 6px; + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group.input-group-lg .twitter-typeahead:last-child .tt-input, +.input-group.input-group-lg .twitter-typeahead:last-child .tt-hint { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 6px; + border-top-right-radius: 6px; +} +.twitter-typeahead { + width: 100%; +} +.input-group .twitter-typeahead { + display: table-cell !important; + float: left; +} +.twitter-typeahead .tt-hint { + color: #999999; +} +.twitter-typeahead .tt-input { + z-index: 2; +} +.twitter-typeahead .tt-input[disabled], +.twitter-typeahead .tt-input[readonly], +fieldset[disabled] .twitter-typeahead .tt-input { + cursor: not-allowed; + background-color: #eeeeee !important; +} +.tt-dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + min-width: 160px; + width: 100%; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; + *border-right-width: 2px; + *border-bottom-width: 2px; +} +.tt-dropdown-menu .tt-suggestion { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333333; + white-space: nowrap; +} +.tt-dropdown-menu .tt-suggestion.tt-cursor { + text-decoration: none; + outline: 0; + background-color: #f5f5f5; + color: #262626; +} +.tt-dropdown-menu .tt-suggestion.tt-cursor a { + color: #262626; +} +.tt-dropdown-menu .tt-suggestion p { + margin: 0; +} diff --git a/src/cps/static/css/libs/viewer.css b/src/cps/static/css/libs/viewer.css new file mode 100644 index 0000000..fb1e56d --- /dev/null +++ b/src/cps/static/css/libs/viewer.css @@ -0,0 +1,2165 @@ +/* Copyright 2014 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.textLayer { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + overflow: hidden; + opacity: 0.2; + line-height: 1.0; +} + +.textLayer > div { + color: transparent; + position: absolute; + white-space: pre; + cursor: text; + -webkit-transform-origin: 0% 0%; + -moz-transform-origin: 0% 0%; + -o-transform-origin: 0% 0%; + -ms-transform-origin: 0% 0%; + transform-origin: 0% 0%; +} + +.textLayer .highlight { + margin: -1px; + padding: 1px; + + background-color: rgb(180, 0, 170); + border-radius: 4px; +} + +.textLayer .highlight.begin { + border-radius: 4px 0px 0px 4px; +} + +.textLayer .highlight.end { + border-radius: 0px 4px 4px 0px; +} + +.textLayer .highlight.middle { + border-radius: 0px; +} + +.textLayer .highlight.selected { + background-color: rgb(0, 100, 0); +} + +.textLayer ::selection { background: rgb(0,0,255); } +.textLayer ::-moz-selection { background: rgb(0,0,255); } + +.textLayer .endOfContent { + display: block; + position: absolute; + left: 0px; + top: 100%; + right: 0px; + bottom: 0px; + z-index: -1; + cursor: default; + -webkit-user-select: none; + -ms-user-select: none; + -moz-user-select: none; +} + +.textLayer .endOfContent.active { + top: 0px; +} + + +.annotationLayer section { + position: absolute; +} + +.annotationLayer .linkAnnotation > a { + position: absolute; + font-size: 1em; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.annotationLayer .linkAnnotation > a /* -ms-a */ { + background: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7") 0 0 repeat; +} + +.annotationLayer .linkAnnotation > a:hover { + opacity: 0.2; + background: #ff0; + box-shadow: 0px 2px 10px #ff0; +} + +.annotationLayer .textAnnotation img { + position: absolute; + cursor: pointer; +} + +.annotationLayer .textWidgetAnnotation input, +.annotationLayer .textWidgetAnnotation textarea, +.annotationLayer .choiceWidgetAnnotation select, +.annotationLayer .buttonWidgetAnnotation.checkBox input, +.annotationLayer .buttonWidgetAnnotation.radioButton input { + background-color: rgba(0, 54, 255, 0.13); + border: 1px solid transparent; + box-sizing: border-box; + font-size: 9px; + height: 100%; + padding: 0 3px; + vertical-align: top; + width: 100%; +} + +.annotationLayer .textWidgetAnnotation textarea { + font: message-box; + font-size: 9px; + resize: none; +} + +.annotationLayer .textWidgetAnnotation input[disabled], +.annotationLayer .textWidgetAnnotation textarea[disabled], +.annotationLayer .choiceWidgetAnnotation select[disabled], +.annotationLayer .buttonWidgetAnnotation.checkBox input[disabled], +.annotationLayer .buttonWidgetAnnotation.radioButton input[disabled] { + background: none; + border: 1px solid transparent; + cursor: not-allowed; +} + +.annotationLayer .textWidgetAnnotation input:hover, +.annotationLayer .textWidgetAnnotation textarea:hover, +.annotationLayer .choiceWidgetAnnotation select:hover, +.annotationLayer .buttonWidgetAnnotation.checkBox input:hover, +.annotationLayer .buttonWidgetAnnotation.radioButton input:hover { + border: 1px solid #000; +} + +.annotationLayer .textWidgetAnnotation input:focus, +.annotationLayer .textWidgetAnnotation textarea:focus, +.annotationLayer .choiceWidgetAnnotation select:focus { + background: none; + border: 1px solid transparent; +} + +.annotationLayer .textWidgetAnnotation input.comb { + font-family: monospace; + padding-left: 2px; + padding-right: 0; +} + +.annotationLayer .textWidgetAnnotation input.comb:focus { + /* + * Letter spacing is placed on the right side of each character. Hence, the + * letter spacing of the last character may be placed outside the visible + * area, causing horizontal scrolling. We avoid this by extending the width + * when the element has focus and revert this when it loses focus. + */ + width: 115%; +} + +.annotationLayer .buttonWidgetAnnotation.checkBox input, +.annotationLayer .buttonWidgetAnnotation.radioButton input { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + appearance: none; +} + +.annotationLayer .popupWrapper { + position: absolute; + width: 20em; +} + +.annotationLayer .popup { + position: absolute; + z-index: 200; + max-width: 20em; + background-color: #FFFF99; + box-shadow: 0px 2px 5px #333; + border-radius: 2px; + padding: 0.6em; + margin-left: 5px; + cursor: pointer; + word-wrap: break-word; +} + +.annotationLayer .popup h1 { + font-size: 1em; + border-bottom: 1px solid #000000; + padding-bottom: 0.2em; +} + +.annotationLayer .popup p { + padding-top: 0.2em; +} + +.annotationLayer .highlightAnnotation, +.annotationLayer .underlineAnnotation, +.annotationLayer .squigglyAnnotation, +.annotationLayer .strikeoutAnnotation, +.annotationLayer .fileAttachmentAnnotation { + cursor: pointer; +} + +.pdfViewer .canvasWrapper { + overflow: hidden; +} + +.pdfViewer .page { + direction: ltr; + width: 816px; + height: 1056px; + margin: 1px auto -8px auto; + position: relative; + overflow: visible; + border: 9px solid transparent; + background-clip: content-box; + border-image: url(../images/shadow.png) 9 9 repeat; + background-color: white; +} + +.pdfViewer.removePageBorders .page { + margin: 0px auto 10px auto; + border: none; +} + +.pdfViewer.singlePageView { + display: inline-block; +} + +.pdfViewer.singlePageView .page { + margin: 0; + border: none; +} + +.pdfViewer .page canvas { + margin: 0; + display: block; +} + +.pdfViewer .page .loadingIcon { + position: absolute; + display: block; + left: 0; + top: 0; + right: 0; + bottom: 0; + background: url('../images/loading-icon.gif') center no-repeat; +} + +.pdfPresentationMode:-webkit-full-screen .pdfViewer .page { + margin-bottom: 100%; + border: 0; +} + +.pdfPresentationMode:-moz-full-screen .pdfViewer .page { + margin-bottom: 100%; + border: 0; +} + +.pdfPresentationMode:-ms-fullscreen .pdfViewer .page { + margin-bottom: 100% !important; + border: 0; +} + +.pdfPresentationMode:fullscreen .pdfViewer .page { + margin-bottom: 100%; + border: 0; +} + +* { + padding: 0; + margin: 0; +} + +html { + height: 100%; + width: 100%; + /* Font size is needed to make the activity bar the correct size. */ + font-size: 10px; +} + +body { + height: 100%; + width: 100%; + background-color: #404040; + background-image: url(../images/texture.png); +} + +body, +input, +button, +select { + font: message-box; + outline: none; +} + +.hidden { + display: none !important; +} +[hidden] { + display: none !important; +} + +#viewerContainer.pdfPresentationMode:-webkit-full-screen { + top: 0px; + border-top: 2px solid transparent; + background-color: #000; + width: 100%; + height: 100%; + overflow: hidden; + cursor: none; + -webkit-user-select: none; +} + +#viewerContainer.pdfPresentationMode:-moz-full-screen { + top: 0px; + border-top: 2px solid transparent; + background-color: #000; + width: 100%; + height: 100%; + overflow: hidden; + cursor: none; + -moz-user-select: none; +} + +#viewerContainer.pdfPresentationMode:-ms-fullscreen { + top: 0px !important; + border-top: 2px solid transparent; + width: 100%; + height: 100%; + overflow: hidden !important; + cursor: none; + -ms-user-select: none; +} + +#viewerContainer.pdfPresentationMode:-ms-fullscreen::-ms-backdrop { + background-color: #000; +} + +#viewerContainer.pdfPresentationMode:fullscreen { + top: 0px; + border-top: 2px solid transparent; + background-color: #000; + width: 100%; + height: 100%; + overflow: hidden; + cursor: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +.pdfPresentationMode:-webkit-full-screen a:not(.internalLink) { + display: none; +} + +.pdfPresentationMode:-moz-full-screen a:not(.internalLink) { + display: none; +} + +.pdfPresentationMode:-ms-fullscreen a:not(.internalLink) { + display: none !important; +} + +.pdfPresentationMode:fullscreen a:not(.internalLink) { + display: none; +} + +.pdfPresentationMode:-webkit-full-screen .textLayer > div { + cursor: none; +} + +.pdfPresentationMode:-moz-full-screen .textLayer > div { + cursor: none; +} + +.pdfPresentationMode:-ms-fullscreen .textLayer > div { + cursor: none; +} + +.pdfPresentationMode:fullscreen .textLayer > div { + cursor: none; +} + +.pdfPresentationMode.pdfPresentationModeControls > *, +.pdfPresentationMode.pdfPresentationModeControls .textLayer > div { + cursor: default; +} + +#outerContainer { + width: 100%; + height: 100%; + position: relative; +} + +#sidebarContainer { + position: absolute; + top: 0; + bottom: 0; + width: 200px; + visibility: hidden; + -webkit-transition-duration: 200ms; + -webkit-transition-timing-function: ease; + transition-duration: 200ms; + transition-timing-function: ease; + +} +html[dir='ltr'] #sidebarContainer { + -webkit-transition-property: left; + transition-property: left; + left: -200px; +} +html[dir='rtl'] #sidebarContainer { + -webkit-transition-property: right; + transition-property: right; + right: -200px; +} + +#outerContainer.sidebarMoving > #sidebarContainer, +#outerContainer.sidebarOpen > #sidebarContainer { + visibility: visible; +} +html[dir='ltr'] #outerContainer.sidebarOpen > #sidebarContainer { + left: 0px; +} +html[dir='rtl'] #outerContainer.sidebarOpen > #sidebarContainer { + right: 0px; +} + +#mainContainer { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + min-width: 320px; + -webkit-transition-duration: 200ms; + -webkit-transition-timing-function: ease; + transition-duration: 200ms; + transition-timing-function: ease; +} +html[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer { + -webkit-transition-property: left; + transition-property: left; + left: 200px; +} +html[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer { + -webkit-transition-property: right; + transition-property: right; + right: 200px; +} + +#sidebarContent { + top: 32px; + bottom: 0; + overflow: auto; + -webkit-overflow-scrolling: touch; + position: absolute; + width: 200px; + background-color: hsla(0,0%,0%,.1); +} +html[dir='ltr'] #sidebarContent { + left: 0; + box-shadow: inset -1px 0 0 hsla(0,0%,0%,.25); +} +html[dir='rtl'] #sidebarContent { + right: 0; + box-shadow: inset 1px 0 0 hsla(0,0%,0%,.25); +} + +#viewerContainer { + overflow: auto; + -webkit-overflow-scrolling: touch; + position: absolute; + top: 32px; + right: 0; + bottom: 0; + left: 0; + outline: none; +} +html[dir='ltr'] #viewerContainer { + box-shadow: inset 1px 0 0 hsla(0,0%,100%,.05); +} +html[dir='rtl'] #viewerContainer { + box-shadow: inset -1px 0 0 hsla(0,0%,100%,.05); +} + +.toolbar { + position: relative; + left: 0; + right: 0; + z-index: 9999; + cursor: default; +} + +#toolbarContainer { + width: 100%; +} + +#toolbarSidebar { + width: 200px; + height: 32px; + background-color: #424242; /* fallback */ + background-image: url(../images/texture.png), + linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95)); +} +html[dir='ltr'] #toolbarSidebar { + box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25), + inset 0 -1px 0 hsla(0,0%,100%,.05), + 0 1px 0 hsla(0,0%,0%,.15), + 0 0 1px hsla(0,0%,0%,.1); +} +html[dir='rtl'] #toolbarSidebar { + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25), + inset 0 1px 0 hsla(0,0%,100%,.05), + 0 1px 0 hsla(0,0%,0%,.15), + 0 0 1px hsla(0,0%,0%,.1); +} + +#toolbarContainer, .findbar, .secondaryToolbar { + position: relative; + height: 32px; + background-color: #474747; /* fallback */ + background-image: url(../images/texture.png), + linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95)); +} +html[dir='ltr'] #toolbarContainer, .findbar, .secondaryToolbar { + box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08), + inset 0 1px 1px hsla(0,0%,0%,.15), + inset 0 -1px 0 hsla(0,0%,100%,.05), + 0 1px 0 hsla(0,0%,0%,.15), + 0 1px 1px hsla(0,0%,0%,.1); +} +html[dir='rtl'] #toolbarContainer, .findbar, .secondaryToolbar { + box-shadow: inset -1px 0 0 hsla(0,0%,100%,.08), + inset 0 1px 1px hsla(0,0%,0%,.15), + inset 0 -1px 0 hsla(0,0%,100%,.05), + 0 1px 0 hsla(0,0%,0%,.15), + 0 1px 1px hsla(0,0%,0%,.1); +} + +#toolbarViewer { + height: 32px; +} + +#loadingBar { + position: relative; + width: 100%; + height: 4px; + background-color: #333; + border-bottom: 1px solid #333; +} + +#loadingBar .progress { + position: absolute; + top: 0; + left: 0; + width: 0%; + height: 100%; + background-color: #ddd; + overflow: hidden; + -webkit-transition: width 200ms; + transition: width 200ms; +} + +@-webkit-keyframes progressIndeterminate { + 0% { left: -142px; } + 100% { left: 0; } +} + +@keyframes progressIndeterminate { + 0% { left: -142px; } + 100% { left: 0; } +} + +#loadingBar .progress.indeterminate { + background-color: #999; + -webkit-transition: none; + transition: none; +} + +#loadingBar .progress.indeterminate .glimmer { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: calc(100% + 150px); + + background: repeating-linear-gradient(135deg, + #bbb 0, #999 5px, + #999 45px, #ddd 55px, + #ddd 95px, #bbb 100px); + + -webkit-animation: progressIndeterminate 950ms linear infinite; + animation: progressIndeterminate 950ms linear infinite; +} + +.findbar, .secondaryToolbar { + top: 32px; + position: absolute; + z-index: 10000; + height: 32px; + + min-width: 16px; + padding: 0px 6px 0px 6px; + margin: 4px 2px 4px 2px; + color: hsl(0,0%,85%); + font-size: 12px; + line-height: 14px; + text-align: left; + cursor: default; +} + +html[dir='ltr'] .findbar { + left: 68px; +} + +html[dir='rtl'] .findbar { + right: 68px; +} + +.findbar label { + -webkit-user-select: none; + -moz-user-select: none; +} + +#findInput[data-status="pending"] { + background-image: url(../images/loading-small.png); + background-repeat: no-repeat; + background-position: right; +} +html[dir='rtl'] #findInput[data-status="pending"] { + background-position: left; +} + +.secondaryToolbar { + padding: 6px; + height: auto; + z-index: 30000; +} +html[dir='ltr'] .secondaryToolbar { + right: 4px; +} +html[dir='rtl'] .secondaryToolbar { + left: 4px; +} + +#secondaryToolbarButtonContainer { + max-width: 200px; + max-height: 400px; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + margin-bottom: -4px; +} + +.doorHanger, +.doorHangerRight { + border: 1px solid hsla(0,0%,0%,.5); + border-radius: 2px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); +} +.doorHanger:after, .doorHanger:before, +.doorHangerRight:after, .doorHangerRight:before { + bottom: 100%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; +} +.doorHanger:after, +.doorHangerRight:after { + border-bottom-color: hsla(0,0%,32%,.99); + border-width: 8px; +} +.doorHanger:before, +.doorHangerRight:before { + border-bottom-color: hsla(0,0%,0%,.5); + border-width: 9px; +} + +html[dir='ltr'] .doorHanger:after, +html[dir='rtl'] .doorHangerRight:after { + left: 13px; + margin-left: -8px; +} + +html[dir='ltr'] .doorHanger:before, +html[dir='rtl'] .doorHangerRight:before { + left: 13px; + margin-left: -9px; +} + +html[dir='rtl'] .doorHanger:after, +html[dir='ltr'] .doorHangerRight:after { + right: 13px; + margin-right: -8px; +} + +html[dir='rtl'] .doorHanger:before, +html[dir='ltr'] .doorHangerRight:before { + right: 13px; + margin-right: -9px; +} + +#findResultsCount { + background-color: hsl(0, 0%, 85%); + color: hsl(0, 0%, 32%); + text-align: center; + padding: 3px 4px; +} + +#findMsg { + font-style: italic; + color: #A6B7D0; +} + +#findInput.notFound { + background-color: rgb(255, 102, 102); +} + +#toolbarViewerMiddle { + position: absolute; + left: 50%; + transform: translateX(-50%); +} + +html[dir='ltr'] #toolbarViewerLeft, +html[dir='rtl'] #toolbarViewerRight { + float: left; +} +html[dir='ltr'] #toolbarViewerRight, +html[dir='rtl'] #toolbarViewerLeft { + float: right; +} +html[dir='ltr'] #toolbarViewerLeft > *, +html[dir='ltr'] #toolbarViewerMiddle > *, +html[dir='ltr'] #toolbarViewerRight > *, +html[dir='ltr'] .findbar > * { + position: relative; + float: left; +} +html[dir='rtl'] #toolbarViewerLeft > *, +html[dir='rtl'] #toolbarViewerMiddle > *, +html[dir='rtl'] #toolbarViewerRight > *, +html[dir='rtl'] .findbar > * { + position: relative; + float: right; +} + +html[dir='ltr'] .splitToolbarButton { + margin: 3px 2px 4px 0; + display: inline-block; +} +html[dir='rtl'] .splitToolbarButton { + margin: 3px 0 4px 2px; + display: inline-block; +} +html[dir='ltr'] .splitToolbarButton > .toolbarButton { + border-radius: 0; + float: left; +} +html[dir='rtl'] .splitToolbarButton > .toolbarButton { + border-radius: 0; + float: right; +} + +.toolbarButton, +.secondaryToolbarButton, +.overlayButton { + border: 0 none; + background: none; + width: 32px; + height: 25px; +} + +.toolbarButton > span { + display: inline-block; + width: 0; + height: 0; + overflow: hidden; +} + +.toolbarButton[disabled], +.secondaryToolbarButton[disabled], +.overlayButton[disabled] { + opacity: .5; +} + +.toolbarButton.group { + margin-right: 0; +} + +.splitToolbarButton.toggled .toolbarButton { + margin: 0; +} + +.splitToolbarButton:hover > .toolbarButton, +.splitToolbarButton:focus > .toolbarButton, +.splitToolbarButton.toggled > .toolbarButton, +.toolbarButton.textButton { + background-color: hsla(0,0%,0%,.12); + background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-clip: padding-box; + border: 1px solid hsla(0,0%,0%,.35); + border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42); + box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, + 0 0 1px hsla(0,0%,100%,.15) inset, + 0 1px 0 hsla(0,0%,100%,.05); + -webkit-transition-property: background-color, border-color, box-shadow; + -webkit-transition-duration: 150ms; + -webkit-transition-timing-function: ease; + transition-property: background-color, border-color, box-shadow; + transition-duration: 150ms; + transition-timing-function: ease; + +} +.splitToolbarButton > .toolbarButton:hover, +.splitToolbarButton > .toolbarButton:focus, +.dropdownToolbarButton:hover, +.overlayButton:hover, +.overlayButton:focus, +.toolbarButton.textButton:hover, +.toolbarButton.textButton:focus { + background-color: hsla(0,0%,0%,.2); + box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, + 0 0 1px hsla(0,0%,100%,.15) inset, + 0 0 1px hsla(0,0%,0%,.05); + z-index: 199; +} +.splitToolbarButton > .toolbarButton { + position: relative; +} +html[dir='ltr'] .splitToolbarButton > .toolbarButton:first-child, +html[dir='rtl'] .splitToolbarButton > .toolbarButton:last-child { + position: relative; + margin: 0; + margin-right: -1px; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; + border-right-color: transparent; +} +html[dir='ltr'] .splitToolbarButton > .toolbarButton:last-child, +html[dir='rtl'] .splitToolbarButton > .toolbarButton:first-child { + position: relative; + margin: 0; + margin-left: -1px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-left-color: transparent; +} +.splitToolbarButtonSeparator { + padding: 8px 0; + width: 1px; + background-color: hsla(0,0%,0%,.5); + z-index: 99; + box-shadow: 0 0 0 1px hsla(0,0%,100%,.08); + display: inline-block; + margin: 5px 0; +} +html[dir='ltr'] .splitToolbarButtonSeparator { + float: left; +} +html[dir='rtl'] .splitToolbarButtonSeparator { + float: right; +} +.splitToolbarButton:hover > .splitToolbarButtonSeparator, +.splitToolbarButton.toggled > .splitToolbarButtonSeparator { + padding: 12px 0; + margin: 1px 0; + box-shadow: 0 0 0 1px hsla(0,0%,100%,.03); + -webkit-transition-property: padding; + -webkit-transition-duration: 10ms; + -webkit-transition-timing-function: ease; + transition-property: padding; + transition-duration: 10ms; + transition-timing-function: ease; +} + +.toolbarButton, +.dropdownToolbarButton, +.secondaryToolbarButton, +.overlayButton { + min-width: 16px; + padding: 2px 6px 0; + border: 1px solid transparent; + border-radius: 2px; + color: hsla(0,0%,100%,.8); + font-size: 12px; + line-height: 14px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + /* Opera does not support user-select, use <... unselectable="on"> instead */ + cursor: default; + -webkit-transition-property: background-color, border-color, box-shadow; + -webkit-transition-duration: 150ms; + -webkit-transition-timing-function: ease; + transition-property: background-color, border-color, box-shadow; + transition-duration: 150ms; + transition-timing-function: ease; +} + +html[dir='ltr'] .toolbarButton, +html[dir='ltr'] .overlayButton, +html[dir='ltr'] .dropdownToolbarButton { + margin: 3px 2px 4px 0; +} +html[dir='rtl'] .toolbarButton, +html[dir='rtl'] .overlayButton, +html[dir='rtl'] .dropdownToolbarButton { + margin: 3px 0 4px 2px; +} + +.toolbarButton:hover, +.toolbarButton:focus, +.dropdownToolbarButton, +.overlayButton, +.secondaryToolbarButton:hover, +.secondaryToolbarButton:focus { + background-color: hsla(0,0%,0%,.12); + background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + background-clip: padding-box; + border: 1px solid hsla(0,0%,0%,.35); + border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42); + box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset, + 0 0 1px hsla(0,0%,100%,.15) inset, + 0 1px 0 hsla(0,0%,100%,.05); +} + +.toolbarButton:hover:active, +.overlayButton:hover:active, +.dropdownToolbarButton:hover:active, +.secondaryToolbarButton:hover:active { + background-color: hsla(0,0%,0%,.2); + background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + border-color: hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45); + box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset, + 0 0 1px hsla(0,0%,0%,.2) inset, + 0 1px 0 hsla(0,0%,100%,.05); + -webkit-transition-property: background-color, border-color, box-shadow; + -webkit-transition-duration: 10ms; + -webkit-transition-timing-function: linear; + transition-property: background-color, border-color, box-shadow; + transition-duration: 10ms; + transition-timing-function: linear; +} + +.toolbarButton.toggled, +.splitToolbarButton.toggled > .toolbarButton.toggled, +.secondaryToolbarButton.toggled { + background-color: hsla(0,0%,0%,.3); + background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0)); + border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.45) hsla(0,0%,0%,.5); + box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset, + 0 0 1px hsla(0,0%,0%,.2) inset, + 0 1px 0 hsla(0,0%,100%,.05); + -webkit-transition-property: background-color, border-color, box-shadow; + -webkit-transition-duration: 10ms; + -webkit-transition-timing-function: linear; + transition-property: background-color, border-color, box-shadow; + transition-duration: 10ms; + transition-timing-function: linear; +} + +.toolbarButton.toggled:hover:active, +.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active, +.secondaryToolbarButton.toggled:hover:active { + background-color: hsla(0,0%,0%,.4); + border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.5) hsla(0,0%,0%,.55); + box-shadow: 0 1px 1px hsla(0,0%,0%,.2) inset, + 0 0 1px hsla(0,0%,0%,.3) inset, + 0 1px 0 hsla(0,0%,100%,.05); +} + +.dropdownToolbarButton { + width: 120px; + max-width: 120px; + padding: 0; + overflow: hidden; + background: url(../images/toolbarButton-menuArrows.png) no-repeat; +} +html[dir='ltr'] .dropdownToolbarButton { + background-position: 95%; +} +html[dir='rtl'] .dropdownToolbarButton { + background-position: 5%; +} + +.dropdownToolbarButton > select { + min-width: 140px; + font-size: 12px; + color: hsl(0,0%,95%); + margin: 0; + padding: 3px 2px 2px; + border: none; + background: rgba(0,0,0,0); /* Opera does not support 'transparent' ',placeholder:null,clear:!0}),a.fn.editabletypes.text=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("textarea",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.setClass(),this.setAttr("placeholder"),this.setAttr("rows"),this.$input.keydown(function(b){b.ctrlKey&&13===b.which&&a(this).closest("form").submit()})},activate:function(){a.fn.editabletypes.text.prototype.activate.call(this)}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:"",inputclass:"input-large",placeholder:null,rows:7}),a.fn.editabletypes.textarea=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("select",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.list),a.extend(b.prototype,{renderList:function(){this.$input.empty();var b=this.options.escape,c=function(d,e){var f;if(a.isArray(e))for(var g=0;g",f),e[g].children));else{f.value=e[g].value,e[g].disabled&&(f.disabled=!0);var h=a("
      ").append(b).appendTo(this.$tpl)}this.$input=this.$tpl.find('input[type="checkbox"]'),this.setClass()}},value2str:function(b){return a.isArray(b)?b.sort().join(a.trim(this.options.separator)):""},str2value:function(b){var c,d=null;return"string"==typeof b&&b.length?(c=new RegExp("\\s*"+a.trim(this.options.separator)+"\\s*"),d=b.split(c)):d=a.isArray(b)?b:[b],d},value2input:function(b){this.$input.prop("checked",!1),a.isArray(b)&&b.length&&this.$input.each(function(c,d){var e=a(d);a.each(b,function(a,b){e.val()==b&&e.prop("checked",!0)})})},input2value:function(){var b=[];return this.$input.filter(":checked").each(function(c,d){b.push(a(d).val())}),b},value2htmlFinal:function(b,c){var d=[],e=a.fn.editableutils.itemsByValue(b,this.sourceData),f=this.options.escape;e.length?(a.each(e,function(b,c){var e=f?a.fn.editableutils.escape(c.text):c.text;d.push(e)}),a(c).html(d.join("
      "))):a(c).empty()},activate:function(){this.$input.first().focus()},autosubmit:function(){this.$input.on("keydown",function(b){13===b.which&&a(this).closest("form").submit()})}}),b.defaults=a.extend({},a.fn.editabletypes.list.defaults,{tpl:'
      ',inputclass:null,separator:","}),a.fn.editabletypes.checklist=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("password",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),a.extend(b.prototype,{value2html:function(b,c){b?a(c).text("[hidden]"):a(c).empty()},html2value:function(a){return null}}),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:''}),a.fn.editabletypes.password=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("email",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:''}),a.fn.editabletypes.email=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("url",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:''}),a.fn.editabletypes.url=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("tel",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:''}),a.fn.editabletypes.tel=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("number",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.text),a.extend(b.prototype,{render:function(){b.superclass.render.call(this),this.setAttr("min"),this.setAttr("max"),this.setAttr("step"); +},postrender:function(){this.$clear&&this.$clear.css({right:24})}}),b.defaults=a.extend({},a.fn.editabletypes.text.defaults,{tpl:'',inputclass:"input-mini",min:null,max:null,step:null}),a.fn.editabletypes.number=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("range",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.number),a.extend(b.prototype,{render:function(){this.$input=this.$tpl.filter("input"),this.setClass(),this.setAttr("min"),this.setAttr("max"),this.setAttr("step"),this.$input.on("input",function(){a(this).siblings("output").text(a(this).val())})},activate:function(){this.$input.focus()}}),b.defaults=a.extend({},a.fn.editabletypes.number.defaults,{tpl:'',inputclass:"input-medium"}),a.fn.editabletypes.range=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("time",a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.setClass()}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:''}),a.fn.editabletypes.time=b}(window.jQuery),function(a){"use strict";var b=function(c){if(this.init("select2",c,b.defaults),c.select2=c.select2||{},this.sourceData=null,c.placeholder&&(c.select2.placeholder=c.placeholder),!c.select2.tags&&c.source){var d=c.source;a.isFunction(c.source)&&(d=c.source.call(c.scope)),"string"==typeof d?(c.select2.ajax=c.select2.ajax||{},c.select2.ajax.data||(c.select2.ajax.data=function(a){return{query:a}}),c.select2.ajax.results||(c.select2.ajax.results=function(a){return{results:a}}),c.select2.ajax.url=d):(this.sourceData=this.convertSource(d),c.select2.data=this.sourceData)}if(this.options.select2=a.extend({},b.defaults.select2,c.select2),this.isMultiple=this.options.select2.tags||this.options.select2.multiple,this.isRemote="ajax"in this.options.select2,this.idFunc=this.options.select2.id,"function"!=typeof this.idFunc){var e=this.idFunc||"id";this.idFunc=function(a){return a[e]}}this.formatSelection=this.options.select2.formatSelection,"function"!=typeof this.formatSelection&&(this.formatSelection=function(a){return a.text})};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.setClass(),this.isRemote&&this.$input.on("select2-loaded",a.proxy(function(a){this.sourceData=a.items.results},this)),this.isMultiple&&this.$input.on("change",function(){a(this).closest("form").parent().triggerHandler("resize")})},value2html:function(c,d){var e,f="",g=this;this.options.select2.tags?e=c:this.sourceData&&(e=a.fn.editableutils.itemsByValue(c,this.sourceData,this.idFunc)),a.isArray(e)?(f=[],a.each(e,function(a,b){f.push(b&&"object"==typeof b?g.formatSelection(b):b)})):e&&(f=g.formatSelection(e)),f=a.isArray(f)?f.join(this.options.viewseparator):f,b.superclass.value2html.call(this,f,d)},html2value:function(a){return this.options.select2.tags?this.str2value(a,this.options.viewseparator):null},value2input:function(b){if(a.isArray(b)&&(b=b.join(this.getSeparator())),this.$input.data("select2")?this.$input.val(b).trigger("change",!0):(this.$input.val(b),this.$input.select2(this.options.select2)),this.isRemote&&!this.isMultiple&&!this.options.select2.initSelection){var c=this.options.select2.id,d=this.options.select2.formatSelection;if(!c&&!d){var e=a(this.options.scope);if(!e.data("editable").isEmpty){var f={id:b,text:e.text()};this.$input.select2("data",f)}}}},input2value:function(){return this.$input.select2("val")},str2value:function(b,c){if("string"!=typeof b||!this.isMultiple)return b;c=c||this.getSeparator();var d,e,f;if(null===b||b.length<1)return null;for(d=b.split(c),e=0,f=d.length;f>e;e+=1)d[e]=a.trim(d[e]);return d},autosubmit:function(){this.$input.on("change",function(b,c){c||a(this).closest("form").submit()})},getSeparator:function(){return this.options.select2.separator||a.fn.select2.defaults.separator},convertSource:function(b){if(a.isArray(b)&&b.length&&void 0!==b[0].value)for(var c=0;c',select2:null,placeholder:null,source:null,viewseparator:", "}),a.fn.editabletypes.select2=b}(window.jQuery),function(a){var b=function(b,c){return this.$element=a(b),this.$element.is("input")?(this.options=a.extend({},a.fn.combodate.defaults,c,this.$element.data()),void this.init()):void a.error("Combodate should be applied to INPUT element")};b.prototype={constructor:b,init:function(){this.map={day:["D","date"],month:["M","month"],year:["Y","year"],hour:["[Hh]","hours"],minute:["m","minutes"],second:["s","seconds"],ampm:["[Aa]",""]},this.$widget=a('').html(this.getTemplate()),this.initCombos(),this.$widget.on("change","select",a.proxy(function(b){this.$element.val(this.getValue()).change(),this.options.smartDays&&(a(b.target).is(".month")||a(b.target).is(".year"))&&this.fillCombo("day")},this)),this.$widget.find("select").css("width","auto"),this.$element.hide().after(this.$widget),this.setValue(this.$element.val()||this.options.value)},getTemplate:function(){var b=this.options.template;return a.each(this.map,function(a,c){c=c[0];var d=new RegExp(c+"+"),e=c.length>1?c.substring(1,2):c;b=b.replace(d,"{"+e+"}")}),b=b.replace(/ /g," "),a.each(this.map,function(a,c){c=c[0];var d=c.length>1?c.substring(1,2):c;b=b.replace("{"+d+"}",'')}),b},initCombos:function(){for(var a in this.map){var b=this.$widget.find("."+a);this["$"+a]=b.length?b:null,this.fillCombo(a)}},fillCombo:function(a){var b=this["$"+a];if(b){var c="fill"+a.charAt(0).toUpperCase()+a.slice(1),d=this[c](),e=b.val();b.empty();for(var f=0;f'+d[f][1]+"");b.val(e)}},fillCommon:function(a){var b,c=[];if("name"===this.options.firstItem){b=moment.relativeTime||moment.langData()._relativeTime;var d="function"==typeof b[a]?b[a](1,!0,a,!1):b[a];d=d.split(" ").reverse()[0],c.push(["",d])}else"empty"===this.options.firstItem&&c.push(["",""]);return c},fillDay:function(){var a,b,c=this.fillCommon("d"),d=-1!==this.options.template.indexOf("DD"),e=31;if(this.options.smartDays&&this.$month&&this.$year){var f=parseInt(this.$month.val(),10),g=parseInt(this.$year.val(),10);isNaN(f)||isNaN(g)||(e=moment([g,f]).daysInMonth())}for(b=1;e>=b;b++)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillMonth:function(){var a,b,c=this.fillCommon("M"),d=-1!==this.options.template.indexOf("MMMM"),e=-1!==this.options.template.indexOf("MMM"),f=-1!==this.options.template.indexOf("MM");for(b=0;11>=b;b++)a=d?moment().date(1).month(b).format("MMMM"):e?moment().date(1).month(b).format("MMM"):f?this.leadZero(b+1):b+1,c.push([b,a]);return c},fillYear:function(){var a,b,c=[],d=-1!==this.options.template.indexOf("YYYY");for(b=this.options.maxYear;b>=this.options.minYear;b--)a=d?b:(b+"").substring(2),c[this.options.yearDescending?"push":"unshift"]([b,a]);return c=this.fillCommon("y").concat(c)},fillHour:function(){var a,b,c=this.fillCommon("h"),d=-1!==this.options.template.indexOf("h"),e=(-1!==this.options.template.indexOf("H"),-1!==this.options.template.toLowerCase().indexOf("hh")),f=d?1:0,g=d?12:23;for(b=f;g>=b;b++)a=e?this.leadZero(b):b,c.push([b,a]);return c},fillMinute:function(){var a,b,c=this.fillCommon("m"),d=-1!==this.options.template.indexOf("mm");for(b=0;59>=b;b+=this.options.minuteStep)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillSecond:function(){var a,b,c=this.fillCommon("s"),d=-1!==this.options.template.indexOf("ss");for(b=0;59>=b;b+=this.options.secondStep)a=d?this.leadZero(b):b,c.push([b,a]);return c},fillAmpm:function(){var a=-1!==this.options.template.indexOf("a"),b=(-1!==this.options.template.indexOf("A"),[["am",a?"am":"AM"],["pm",a?"pm":"PM"]]);return b},getValue:function(b){var c,d={},e=this,f=!1;return a.each(this.map,function(a,b){if("ampm"!==a){var c="day"===a?1:0;return d[a]=e["$"+a]?parseInt(e["$"+a].val(),10):c,isNaN(d[a])?(f=!0,!1):void 0}}),f?"":(this.$ampm&&(12===d.hour?d.hour="am"===this.$ampm.val()?0:12:d.hour="am"===this.$ampm.val()?d.hour:d.hour+12),c=moment([d.year,d.month,d.day,d.hour,d.minute,d.second]),this.highlight(c),b=void 0===b?this.options.format:b,null===b?c.isValid()?c:null:c.isValid()?c.format(b):"")},setValue:function(b){function c(b,c){var d={};return b.children("option").each(function(b,e){var f,g=a(e).attr("value");""!==g&&(f=Math.abs(g-c),("undefined"==typeof d.distance||f=12?(f.ampm="pm",f.hour>12&&(f.hour-=12)):(f.ampm="am",0===f.hour&&(f.hour=12))),a.each(f,function(a,b){e["$"+a]&&("minute"===a&&e.options.minuteStep>1&&e.options.roundTime&&(b=c(e["$"+a],b)),"second"===a&&e.options.secondStep>1&&e.options.roundTime&&(b=c(e["$"+a],b)),e["$"+a].val(b))}),this.options.smartDays&&this.fillCombo("day"),this.$element.val(d.format(this.options.format)).change())}},highlight:function(a){a.isValid()?this.options.errorClass?this.$widget.removeClass(this.options.errorClass):this.$widget.find("select").css("border-color",this.borderColor):this.options.errorClass?this.$widget.addClass(this.options.errorClass):(this.borderColor||(this.borderColor=this.$widget.find("select").css("border-color")),this.$widget.find("select").css("border-color","red"))},leadZero:function(a){return 9>=a?"0"+a:a},destroy:function(){this.$widget.remove(),this.$element.removeData("combodate").show()}},a.fn.combodate=function(c){var d,e=Array.apply(null,arguments);return e.shift(),"getValue"===c&&this.length&&(d=this.eq(0).data("combodate"))?d.getValue.apply(d,e):this.each(function(){var d=a(this),f=d.data("combodate"),g="object"==typeof c&&c;f||d.data("combodate",f=new b(this,g)),"string"==typeof c&&"function"==typeof f[c]&&f[c].apply(f,e)})},a.fn.combodate.defaults={format:"DD-MM-YYYY HH:mm",template:"D / MMM / YYYY H : mm",value:null,minYear:1970,maxYear:2015,yearDescending:!0,minuteStep:5,secondStep:1,firstItem:"empty",errorClass:null,roundTime:!0,smartDays:!1}}(window.jQuery),function(a){"use strict";var b=function(c){this.init("combodate",c,b.defaults),this.options.viewformat||(this.options.viewformat=this.options.format),c.combodate=a.fn.editableutils.tryParseJson(c.combodate,!0),this.options.combodate=a.extend({},b.defaults.combodate,c.combodate,{format:this.options.format,template:this.options.template})};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{render:function(){this.$input.combodate(this.options.combodate),"bs3"===a.fn.editableform.engine&&this.$input.siblings().find("select").addClass("form-control"),this.options.inputclass&&this.$input.siblings().find("select").addClass(this.options.inputclass)},value2html:function(a,c){var d=a?a.format(this.options.viewformat):"";b.superclass.value2html.call(this,d,c)},html2value:function(a){return a?moment(a,this.options.viewformat):null},value2str:function(a){return a?a.format(this.options.format):""},str2value:function(a){return a?moment(a,this.options.format):null},value2submit:function(a){return this.value2str(a)},value2input:function(a){this.$input.combodate("setValue",a)},input2value:function(){return this.$input.combodate("getValue",null)},activate:function(){this.$input.siblings(".combodate").find("select").eq(0).focus()},autosubmit:function(){}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'',inputclass:null,format:"YYYY-MM-DD",viewformat:null,template:"D / MMM / YYYY",combodate:null}),a.fn.editabletypes.combodate=b}(window.jQuery),function(a){"use strict";var b=a.fn.editableform.Constructor.prototype.initInput;a.extend(a.fn.editableform.Constructor.prototype,{initTemplate:function(){this.$form=a(a.fn.editableform.template),this.$form.find(".control-group").addClass("form-group"),this.$form.find(".editable-error-block").addClass("help-block")},initInput:function(){b.apply(this);var c=null===this.input.options.inputclass||this.input.options.inputclass===!1,d="input-sm",e="text,select,textarea,password,email,url,tel,number,range,time,typeaheadjs".split(",");~a.inArray(this.input.type,e)&&(this.input.$input.addClass("form-control"),c&&(this.input.options.inputclass=d,this.input.$input.addClass(d)));for(var f=this.$form.find(".editable-buttons"),g=c?[d]:this.input.options.inputclass.split(" "),h=0;h',a.fn.editableform.errorGroupClass="has-error",a.fn.editableform.errorBlockClass=null,a.fn.editableform.engine="bs3"}(window.jQuery),function(a){"use strict";a.extend(a.fn.editableContainer.Popup.prototype,{containerName:"popover",containerDataName:"bs.popover",innerCss:".popover-content",defaults:a.fn.popover.Constructor.DEFAULTS,initContainer:function(){a.extend(this.containerOptions,{trigger:"manual",selector:!1,content:" ",template:this.defaults.template});var b;this.$element.data("template")&&(b=this.$element.data("template"),this.$element.removeData("template")),this.call(this.containerOptions),b&&this.$element.data("template",b)},innerShow:function(){this.call("show")},innerHide:function(){this.call("hide")},innerDestroy:function(){this.call("destroy")},setContainerOption:function(a,b){this.container().options[a]=b},setPosition:function(){(function(){var a=this.tip(),b="function"==typeof this.options.placement?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,c=/\s?auto?\s?/i,d=c.test(b);d&&(b=b.replace(c,"")||"top");var e=this.getPosition(),f=a[0].offsetWidth,g=a[0].offsetHeight;if(d){var h=this.$element.parent(),i=b,j=document.documentElement.scrollTop||document.body.scrollTop,k="body"==this.options.container?window.innerWidth:h.outerWidth(),l="body"==this.options.container?window.innerHeight:h.outerHeight(),m="body"==this.options.container?0:h.offset().left;b="bottom"==b&&e.top+e.height+g-j>l?"top":"top"==b&&e.top-j-g<0?"bottom":"right"==b&&e.right+f>k?"left":"left"==b&&e.left-fthis.o.endDate?this.viewDate=new Date(this.o.endDate):this.viewDate=new Date(this.date),this.fill()}},fillDow:function(){var a=this.o.weekStart,b="";if(this.o.calendarWeeks){var c=' ';b+=c,this.picker.find(".datepicker-days thead tr:first-child").prepend(c)}for(;a'+k[this.o.language].daysMin[a++%7]+"";b+="",this.picker.find(".datepicker-days thead").append(b)},fillMonths:function(){for(var a="",b=0;12>b;)a+=''+k[this.o.language].monthsShort[b++]+"";this.picker.find(".datepicker-months td").html(a)},setRange:function(b){b&&b.length?this.range=a.map(b,function(a){return a.valueOf()}):delete this.range,this.fill()},getClassNames:function(b){var c=[],d=this.viewDate.getUTCFullYear(),e=this.viewDate.getUTCMonth(),f=this.date.valueOf(),g=new Date;return b.getUTCFullYear()d||b.getUTCFullYear()==d&&b.getUTCMonth()>e)&&c.push("new"),this.o.todayHighlight&&b.getUTCFullYear()==g.getFullYear()&&b.getUTCMonth()==g.getMonth()&&b.getUTCDate()==g.getDate()&&c.push("today"),f&&b.valueOf()==f&&c.push("active"),(b.valueOf()this.o.endDate||-1!==a.inArray(b.getUTCDay(),this.o.daysOfWeekDisabled))&&c.push("disabled"),this.range&&(b>this.range[0]&&b"),this.o.calendarWeeks)){var r=new Date(+m+(this.o.weekStart-m.getUTCDay()-7)%7*864e5),s=new Date(+r+(11-r.getUTCDay())%7*864e5),t=new Date(+(t=b(s.getUTCFullYear(),0,1))+(11-t.getUTCDay())%7*864e5),u=(s-t)/864e5/7+1;q.push(''+u+"")}p=this.getClassNames(m),p.push("day");var v=this.o.beforeShowDay(m);void 0===v?v={}:"boolean"==typeof v?v={enabled:v}:"string"==typeof v&&(v={classes:v}),v.enabled===!1&&p.push("disabled"),v.classes&&(p=p.concat(v.classes.split(/\s+/))),v.tooltip&&(c=v.tooltip),p=a.unique(p),q.push('"+m.getUTCDate()+""),m.getUTCDay()==this.o.weekEnd&&q.push(""),m.setUTCDate(m.getUTCDate()+1)}this.picker.find(".datepicker-days tbody").empty().append(q.join(""));var w=this.date&&this.date.getUTCFullYear(),x=this.picker.find(".datepicker-months").find("th:eq(1)").text(e).end().find("span").removeClass("active");w&&w==e&&x.eq(this.date.getUTCMonth()).addClass("active"),(g>e||e>i)&&x.addClass("disabled"),e==g&&x.slice(0,h).addClass("disabled"),e==i&&x.slice(j+1).addClass("disabled"),q="",e=10*parseInt(e/10,10);var y=this.picker.find(".datepicker-years").find("th:eq(1)").text(e+"-"+(e+9)).end().find("td");e-=1;for(var z=-1;11>z;z++)q+='e||e>i?" disabled":"")+'">'+e+"",e+=1;y.html(q)},updateNavArrows:function(){if(this._allow_update){var a=new Date(this.viewDate),b=a.getUTCFullYear(),c=a.getUTCMonth();switch(this.viewMode){case 0:this.o.startDate!==-(1/0)&&b<=this.o.startDate.getUTCFullYear()&&c<=this.o.startDate.getUTCMonth()?this.picker.find(".prev").css({visibility:"hidden"}):this.picker.find(".prev").css({visibility:"visible"}),this.o.endDate!==1/0&&b>=this.o.endDate.getUTCFullYear()&&c>=this.o.endDate.getUTCMonth()?this.picker.find(".next").css({visibility:"hidden"}):this.picker.find(".next").css({visibility:"visible"});break;case 1:case 2:this.o.startDate!==-(1/0)&&b<=this.o.startDate.getUTCFullYear()?this.picker.find(".prev").css({visibility:"hidden"}):this.picker.find(".prev").css({visibility:"visible"}),this.o.endDate!==1/0&&b>=this.o.endDate.getUTCFullYear()?this.picker.find(".next").css({visibility:"hidden"}):this.picker.find(".next").css({visibility:"visible"})}}},click:function(c){c.preventDefault();var d=a(c.target).closest("span, td, th");if(1==d.length)switch(d[0].nodeName.toLowerCase()){case"th":switch(d[0].className){case"datepicker-switch":this.showMode(1);break;case"prev":case"next":var e=l.modes[this.viewMode].navStep*("prev"==d[0].className?-1:1);switch(this.viewMode){case 0:this.viewDate=this.moveMonth(this.viewDate,e);break;case 1:case 2:this.viewDate=this.moveYear(this.viewDate,e)}this.fill();break;case"today":var f=new Date;f=b(f.getFullYear(),f.getMonth(),f.getDate(),0,0,0),this.showMode(-2);var g="linked"==this.o.todayBtn?null:"view";this._setDate(f,g);break;case"clear":var h;this.isInput?h=this.element:this.component&&(h=this.element.find("input")),h&&h.val("").change(),this._trigger("changeDate"),this.update(),this.o.autoclose&&this.hide()}break;case"span":if(!d.is(".disabled")){if(this.viewDate.setUTCDate(1),d.is(".month")){var i=1,j=d.parent().find("span").index(d),k=this.viewDate.getUTCFullYear();this.viewDate.setUTCMonth(j),this._trigger("changeMonth",this.viewDate),1===this.o.minViewMode&&this._setDate(b(k,j,i,0,0,0,0))}else{var k=parseInt(d.text(),10)||0,i=1,j=0;this.viewDate.setUTCFullYear(k),this._trigger("changeYear",this.viewDate),2===this.o.minViewMode&&this._setDate(b(k,j,i,0,0,0,0))}this.showMode(-1),this.fill()}break;case"td":if(d.is(".day")&&!d.is(".disabled")){var i=parseInt(d.text(),10)||1,k=this.viewDate.getUTCFullYear(),j=this.viewDate.getUTCMonth();d.is(".old")?0===j?(j=11,k-=1):j-=1:d.is(".new")&&(11==j?(j=0,k+=1):j+=1),this._setDate(b(k,j,i,0,0,0,0))}}},_setDate:function(a,b){b&&"date"!=b||(this.date=new Date(a)),b&&"view"!=b||(this.viewDate=new Date(a)),this.fill(),this.setValue(),this._trigger("changeDate");var c;this.isInput?c=this.element:this.component&&(c=this.element.find("input")),c&&(c.change(),!this.o.autoclose||b&&"date"!=b||this.hide())},moveMonth:function(a,b){if(!b)return a;var c,d,e=new Date(a.valueOf()),f=e.getUTCDate(),g=e.getUTCMonth(),h=Math.abs(b);if(b=b>0?1:-1,1==h)d=-1==b?function(){return e.getUTCMonth()==g}:function(){return e.getUTCMonth()!=c},c=g+b,e.setUTCMonth(c),(0>c||c>11)&&(c=(c+12)%12);else{for(var i=0;h>i;i++)e=this.moveMonth(e,b);c=e.getUTCMonth(),e.setUTCDate(f),d=function(){return c!=e.getUTCMonth()}}for(;d();)e.setUTCDate(--f),e.setUTCMonth(c);return e},moveYear:function(a,b){return this.moveMonth(a,12*b)},dateWithinRange:function(a){return a>=this.o.startDate&&a<=this.o.endDate},keydown:function(a){if(this.picker.is(":not(:visible)"))return void(27==a.keyCode&&this.show());var b,c,d,e=!1;switch(a.keyCode){case 27:this.hide(),a.preventDefault();break;case 37:case 39:if(!this.o.keyboardNavigation)break;b=37==a.keyCode?-1:1,a.ctrlKey?(c=this.moveYear(this.date,b),d=this.moveYear(this.viewDate,b)):a.shiftKey?(c=this.moveMonth(this.date,b),d=this.moveMonth(this.viewDate,b)):(c=new Date(this.date),c.setUTCDate(this.date.getUTCDate()+b),d=new Date(this.viewDate),d.setUTCDate(this.viewDate.getUTCDate()+b)),this.dateWithinRange(c)&&(this.date=c,this.viewDate=d,this.setValue(),this.update(),a.preventDefault(),e=!0);break;case 38:case 40:if(!this.o.keyboardNavigation)break;b=38==a.keyCode?-1:1,a.ctrlKey?(c=this.moveYear(this.date,b),d=this.moveYear(this.viewDate,b)):a.shiftKey?(c=this.moveMonth(this.date,b),d=this.moveMonth(this.viewDate,b)):(c=new Date(this.date),c.setUTCDate(this.date.getUTCDate()+7*b),d=new Date(this.viewDate),d.setUTCDate(this.viewDate.getUTCDate()+7*b)),this.dateWithinRange(c)&&(this.date=c,this.viewDate=d,this.setValue(),this.update(),a.preventDefault(),e=!0);break;case 13:this.hide(),a.preventDefault();break;case 9:this.hide()}if(e){this._trigger("changeDate");var f;this.isInput?f=this.element:this.component&&(f=this.element.find("input")),f&&f.change()}},showMode:function(a){a&&(this.viewMode=Math.max(this.o.minViewMode,Math.min(2,this.viewMode+a))),this.picker.find(">div").hide().filter(".datepicker-"+l.modes[this.viewMode].clsName).css("display","block"),this.updateNavArrows()}};var f=function(b,c){this.element=a(b),this.inputs=a.map(c.inputs,function(a){return a.jquery?a[0]:a}),delete c.inputs,a(this.inputs).datepicker(c).bind("changeDate",a.proxy(this.dateUpdated,this)),this.pickers=a.map(this.inputs,function(b){return a(b).data("datepicker")}),this.updateDates()};f.prototype={updateDates:function(){this.dates=a.map(this.pickers,function(a){return a.date}),this.updateRanges()},updateRanges:function(){var b=a.map(this.dates,function(a){return a.valueOf()});a.each(this.pickers,function(a,c){c.setRange(b)})},dateUpdated:function(b){var c=a(b.target).data("datepicker"),d=c.getUTCDate(),e=a.inArray(b.target,this.inputs),f=this.inputs.length;if(-1!=e){if(d=0&&dthis.dates[e])for(;f>e&&d>this.dates[e];)this.pickers[e++].setUTCDate(d);this.updateDates()}},remove:function(){a.map(this.pickers,function(a){a.remove()}),delete this.element.data().datepicker}};var g=a.fn.datepicker,h=a.fn.datepicker=function(b){var g=Array.apply(null,arguments);g.shift();var h;return this.each(function(){var j=a(this),k=j.data("datepicker"),l="object"==typeof b&&b;if(!k){var m=c(this,"date"),n=a.extend({},i,m,l),o=d(n.language),p=a.extend({},i,o,m,l);if(j.is(".input-daterange")||p.inputs){var q={inputs:p.inputs||j.find("input").toArray()};j.data("datepicker",k=new f(this,a.extend(p,q)))}else j.data("datepicker",k=new e(this,p))}return"string"==typeof b&&"function"==typeof k[b]&&(h=k[b].apply(k,g),void 0!==h)?!1:void 0}),void 0!==h?h:this},i=a.fn.datepicker.defaults={autoclose:!1,beforeShowDay:a.noop,calendarWeeks:!1,clearBtn:!1,daysOfWeekDisabled:[],endDate:1/0,forceParse:!0,format:"mm/dd/yyyy",keyboardNavigation:!0,language:"en",minViewMode:0,rtl:!1,startDate:-(1/0),startView:0,todayBtn:!1,todayHighlight:!1,weekStart:0},j=a.fn.datepicker.locale_opts=["format","rtl","weekStart"];a.fn.datepicker.Constructor=e;var k=a.fn.datepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"], +daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today",clear:"Clear"}},l={modes:[{clsName:"days",navFnc:"Month",navStep:1},{clsName:"months",navFnc:"FullYear",navStep:1},{clsName:"years",navFnc:"FullYear",navStep:10}],isLeapYear:function(a){return a%4===0&&a%100!==0||a%400===0},getDaysInMonth:function(a,b){return[31,l.isLeapYear(a)?29:28,31,30,31,30,31,31,30,31,30,31][b]},validParts:/dd?|DD?|mm?|MM?|yy(?:yy)?/g,nonpunctuation:/[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g,parseFormat:function(a){var b=a.replace(this.validParts,"\x00").split("\x00"),c=a.match(this.validParts);if(!b||!b.length||!c||0===c.length)throw new Error("Invalid date format.");return{separators:b,parts:c}},parseDate:function(c,d,f){if(c instanceof Date)return c;if("string"==typeof d&&(d=l.parseFormat(d)),/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(c)){var g,h,i=/([\-+]\d+)([dmwy])/,j=c.match(/([\-+]\d+)([dmwy])/g);c=new Date;for(var m=0;mb;)b+=12;for(b%=12,a.setUTCMonth(b);a.getUTCMonth()!=b;)a.setUTCDate(a.getUTCDate()-1);return a},d:function(a,b){return a.setUTCDate(b)}};r.M=r.MM=r.mm=r.m,r.dd=r.d,c=b(c.getFullYear(),c.getMonth(),c.getDate(),0,0,0);var s=d.parts.slice();if(j.length!=s.length&&(s=a(s).filter(function(b,c){return-1!==a.inArray(c,q)}).toArray()),j.length==s.length){for(var m=0,t=s.length;t>m;m++){if(n=parseInt(j[m],10),g=s[m],isNaN(n))switch(g){case"MM":o=a(k[f].months).filter(function(){var a=this.slice(0,j[m].length),b=j[m].slice(0,a.length);return a==b}),n=a.inArray(o[0],k[f].months)+1;break;case"M":o=a(k[f].monthsShort).filter(function(){var a=this.slice(0,j[m].length),b=j[m].slice(0,a.length);return a==b}),n=a.inArray(o[0],k[f].monthsShort)+1}p[g]=n}for(var u,m=0;m=g;g++)f.length&&b.push(f.shift()),b.push(e[c.parts[g]]);return b.join("")},headTemplate:'',contTemplate:'',footTemplate:''};l.template='
      '+l.headTemplate+""+l.footTemplate+'
      '+l.headTemplate+l.contTemplate+l.footTemplate+'
      '+l.headTemplate+l.contTemplate+l.footTemplate+"
      ",a.fn.datepicker.DPGlobal=l,a.fn.datepicker.noConflict=function(){return a.fn.datepicker=g,this},a(document).on("focus.datepicker.data-api click.datepicker.data-api",'[data-provide="datepicker"]',function(b){var c=a(this);c.data("datepicker")||(b.preventDefault(),h.call(c,"show"))}),a(function(){h.call(a('[data-provide="datepicker-inline"]'))})}(window.jQuery),function(a){"use strict";a.fn.bdatepicker=a.fn.datepicker.noConflict(),a.fn.datepicker||(a.fn.datepicker=a.fn.bdatepicker);var b=function(a){this.init("date",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{initPicker:function(b,c){this.options.viewformat||(this.options.viewformat=this.options.format),b.datepicker=a.fn.editableutils.tryParseJson(b.datepicker,!0),this.options.datepicker=a.extend({},c.datepicker,b.datepicker,{format:this.options.viewformat}),this.options.datepicker.language=this.options.datepicker.language||"en",this.dpg=a.fn.bdatepicker.DPGlobal,this.parsedFormat=this.dpg.parseFormat(this.options.format),this.parsedViewFormat=this.dpg.parseFormat(this.options.viewformat)},render:function(){this.$input.bdatepicker(this.options.datepicker),this.options.clear&&(this.$clear=a('
      ').html(this.options.clear).click(a.proxy(function(a){a.preventDefault(),a.stopPropagation(),this.clear()},this)),this.$tpl.parent().append(a('
      ').append(this.$clear)))},value2html:function(a,c){var d=a?this.dpg.formatDate(a,this.parsedViewFormat,this.options.datepicker.language):"";b.superclass.value2html.call(this,d,c)},html2value:function(a){return this.parseDate(a,this.parsedViewFormat)},value2str:function(a){return a?this.dpg.formatDate(a,this.parsedFormat,this.options.datepicker.language):""},str2value:function(a){return this.parseDate(a,this.parsedFormat)},value2submit:function(a){return this.value2str(a)},value2input:function(a){this.$input.bdatepicker("update",a)},input2value:function(){return this.$input.data("datepicker").date},activate:function(){},clear:function(){this.$input.data("datepicker").date=null,this.$input.find(".active").removeClass("active"),this.options.showbuttons||this.$input.closest("form").submit()},autosubmit:function(){this.$input.on("mouseup",".day",function(b){if(!a(b.currentTarget).is(".old")&&!a(b.currentTarget).is(".new")){var c=a(this).closest("form");setTimeout(function(){c.submit()},200)}})},parseDate:function(a,b){var c,d=null;return a&&(d=this.dpg.parseDate(a,b,this.options.datepicker.language),"string"==typeof a&&(c=this.dpg.formatDate(d,b,this.options.datepicker.language),a!==c&&(d=null))),d}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'
      ',inputclass:null,format:"yyyy-mm-dd",viewformat:null,datepicker:{weekStart:0,startView:0,minViewMode:0,autoclose:!1},clear:"× clear"}),a.fn.editabletypes.date=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("datefield",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.date),a.extend(b.prototype,{render:function(){this.$input=this.$tpl.find("input"),this.setClass(),this.setAttr("placeholder"),this.$tpl.bdatepicker(this.options.datepicker),this.$input.off("focus keydown"),this.$input.keyup(a.proxy(function(){this.$tpl.removeData("date"),this.$tpl.bdatepicker("update")},this))},value2input:function(a){this.$input.val(a?this.dpg.formatDate(a,this.parsedViewFormat,this.options.datepicker.language):""),this.$tpl.bdatepicker("update")},input2value:function(){return this.html2value(this.$input.val())},activate:function(){a.fn.editabletypes.text.prototype.activate.call(this)},autosubmit:function(){}}),b.defaults=a.extend({},a.fn.editabletypes.date.defaults,{tpl:'
      ',inputclass:"input-small",datepicker:{weekStart:0,startView:0,minViewMode:0,autoclose:!0}}),a.fn.editabletypes.datefield=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("datetime",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.abstractinput),a.extend(b.prototype,{initPicker:function(b,c){this.options.viewformat||(this.options.viewformat=this.options.format),b.datetimepicker=a.fn.editableutils.tryParseJson(b.datetimepicker,!0),this.options.datetimepicker=a.extend({},c.datetimepicker,b.datetimepicker,{format:this.options.viewformat}),this.options.datetimepicker.language=this.options.datetimepicker.language||"en",this.dpg=a.fn.datetimepicker.DPGlobal,this.parsedFormat=this.dpg.parseFormat(this.options.format,this.options.formatType),this.parsedViewFormat=this.dpg.parseFormat(this.options.viewformat,this.options.formatType)},render:function(){this.$input.datetimepicker(this.options.datetimepicker),this.$input.on("changeMode",function(b){var c=a(this).closest("form").parent();setTimeout(function(){c.triggerHandler("resize")},0)}),this.options.clear&&(this.$clear=a('').html(this.options.clear).click(a.proxy(function(a){a.preventDefault(),a.stopPropagation(),this.clear()},this)),this.$tpl.parent().append(a('
      ').append(this.$clear)))},value2html:function(a,c){var d=a?this.dpg.formatDate(this.toUTC(a),this.parsedViewFormat,this.options.datetimepicker.language,this.options.formatType):"";return c?void b.superclass.value2html.call(this,d,c):d},html2value:function(a){var b=this.parseDate(a,this.parsedViewFormat);return b?this.fromUTC(b):null},value2str:function(a){return a?this.dpg.formatDate(this.toUTC(a),this.parsedFormat,this.options.datetimepicker.language,this.options.formatType):""},str2value:function(a){var b=this.parseDate(a,this.parsedFormat);return b?this.fromUTC(b):null},value2submit:function(a){return this.value2str(a)},value2input:function(a){a&&this.$input.data("datetimepicker").setDate(a)},input2value:function(){var a=this.$input.data("datetimepicker");return a.date?a.getDate():null},activate:function(){},clear:function(){this.$input.data("datetimepicker").date=null,this.$input.find(".active").removeClass("active"),this.options.showbuttons||this.$input.closest("form").submit()},autosubmit:function(){this.$input.on("mouseup",".minute",function(b){var c=a(this).closest("form");setTimeout(function(){c.submit()},200)})},toUTC:function(a){return a?new Date(a.valueOf()-6e4*a.getTimezoneOffset()):a},fromUTC:function(a){return a?new Date(a.valueOf()+6e4*a.getTimezoneOffset()):a},parseDate:function(a,b){var c,d=null;return a&&(d=this.dpg.parseDate(a,b,this.options.datetimepicker.language,this.options.formatType),"string"==typeof a&&(c=this.dpg.formatDate(d,b,this.options.datetimepicker.language,this.options.formatType),a!==c&&(d=null))),d}}),b.defaults=a.extend({},a.fn.editabletypes.abstractinput.defaults,{tpl:'
      ',inputclass:null,format:"yyyy-mm-dd hh:ii",formatType:"standard",viewformat:null,datetimepicker:{todayHighlight:!1,autoclose:!1},clear:"× clear"}),a.fn.editabletypes.datetime=b}(window.jQuery),function(a){"use strict";var b=function(a){this.init("datetimefield",a,b.defaults),this.initPicker(a,b.defaults)};a.fn.editableutils.inherit(b,a.fn.editabletypes.datetime),a.extend(b.prototype,{render:function(){this.$input=this.$tpl.find("input"),this.setClass(),this.setAttr("placeholder"),this.$tpl.datetimepicker(this.options.datetimepicker),this.$input.off("focus keydown"),this.$input.keyup(a.proxy(function(){this.$tpl.removeData("date"),this.$tpl.datetimepicker("update")},this))},value2input:function(a){this.$input.val(this.value2html(a)),this.$tpl.datetimepicker("update")},input2value:function(){return this.html2value(this.$input.val())},activate:function(){a.fn.editabletypes.text.prototype.activate.call(this)},autosubmit:function(){}}),b.defaults=a.extend({},a.fn.editabletypes.datetime.defaults,{tpl:'
      ',inputclass:"input-medium",datetimepicker:{todayHighlight:!1,autoclose:!0}}),a.fn.editabletypes.datetimefield=b}(window.jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/bootstrap-table-editable.min.js b/src/cps/static/js/libs/bootstrap-table/bootstrap-table-editable.min.js new file mode 100644 index 0000000..e93e824 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/bootstrap-table-editable.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.extend(a.fn.bootstrapTable.defaults,{editable:!0,onEditableInit:function(){return!1},onEditableSave:function(){return!1},onEditableShown:function(){return!1},onEditableHidden:function(){return!1}}),a.extend(a.fn.bootstrapTable.Constructor.EVENTS,{"editable-init.bs.table":"onEditableInit","editable-save.bs.table":"onEditableSave","editable-shown.bs.table":"onEditableShown","editable-hidden.bs.table":"onEditableHidden"});var b=a.fn.bootstrapTable.Constructor,c=b.prototype.initTable,d=b.prototype.initBody;b.prototype.initTable=function(){var b=this;c.apply(this,Array.prototype.slice.apply(arguments)),this.options.editable&&a.each(this.columns,function(c,d){if(d.editable){var e={},f=[],g="editable-",h=function(a,b){var c=a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()});if(c.slice(0,g.length)==g){var d=c.replace(g,"data-");e[d]=b}};a.each(b.options,h),d.formatter=d.formatter||function(a){return a},d._formatter=d._formatter?d._formatter:d.formatter,d.formatter=function(c,g,i){var j=d._formatter?d._formatter(c,g,i):c;a.each(d,h),a.each(e,function(a,b){f.push(" "+a+'="'+b+'"')});var k=!1;return d.editable.hasOwnProperty("noeditFormatter")&&(k=d.editable.noeditFormatter(c,g,i)),k===!1?['"].join(""):k}}})},b.prototype.initBody=function(){var b=this;d.apply(this,Array.prototype.slice.apply(arguments)),this.options.editable&&(a.each(this.columns,function(c,d){d.editable&&(b.$body.find('a[data-name="'+d.field+'"]').editable(d.editable).off("save").on("save",function(c,e){var f=b.getData(),g=a(this).parents("tr[data-index]").data("index"),h=f[g],i=h[d.field];a(this).data("value",e.submitValue),h[d.field]=e.submitValue,b.trigger("editable-save",d.field,h,i,a(this)),b.resetFooter()}),b.$body.find('a[data-name="'+d.field+'"]').editable(d.editable).off("shown").on("shown",function(c,e){var f=b.getData(),g=a(this).parents("tr[data-index]").data("index"),h=f[g];b.trigger("editable-shown",d.field,h,a(this),e)}),b.$body.find('a[data-name="'+d.field+'"]').editable(d.editable).off("hidden").on("hidden",function(c,e){var f=b.getData(),g=a(this).parents("tr[data-index]").data("index"),h=f[g];b.trigger("editable-hidden",d.field,h,a(this),e)}))}),this.trigger("editable-init"))}}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/bootstrap-table.min.js b/src/cps/static/js/libs/bootstrap-table/bootstrap-table.min.js new file mode 100644 index 0000000..ae407d4 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/bootstrap-table.min.js @@ -0,0 +1,9 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";var b=3;try{b=parseInt(a.fn.dropdown.Constructor.VERSION,10)}catch(c){}var d={3:{buttonsClass:"default",iconsPrefix:"glyphicon",icons:{paginationSwitchDown:"glyphicon-collapse-down icon-chevron-down",paginationSwitchUp:"glyphicon-collapse-up icon-chevron-up",refresh:"glyphicon-refresh icon-refresh",toggleOff:"glyphicon-list-alt icon-list-alt",toggleOn:"glyphicon-list-alt icon-list-alt",columns:"glyphicon-th icon-th",detailOpen:"glyphicon-plus icon-plus",detailClose:"glyphicon-minus icon-minus",fullscreen:"glyphicon-fullscreen"},pullClass:"pull",toobarDropdowHtml:['"],toobarDropdowItemHtml:'
    1. ',pageDropdownHtml:['"],pageDropdownItemHtml:''},4:{buttonsClass:"secondary",iconsPrefix:"fa",icons:{paginationSwitchDown:"fa-toggle-down",paginationSwitchUp:"fa-toggle-up",refresh:"fa-refresh",toggleOff:"fa-toggle-off",toggleOn:"fa-toggle-on",columns:"fa-th-list",detailOpen:"fa-plus",detailClose:"fa-minus",fullscreen:"fa-arrows-alt"},pullClass:"float",toobarDropdowHtml:['"],toobarDropdowItemHtml:'',pageDropdownHtml:['"],pageDropdownItemHtml:'%s'}}[b],e=null,f=function(a){var b=arguments,c=!0,d=1;return a=a.replace(/%s/g,function(){var a=b[d++];return"undefined"==typeof a?(c=!1,""):a}),c?a:""},g=function(b,c,d,e){var f="";return a.each(b,function(a,b){return b[c]===e?(f=b[d],!1):!0}),f},h=function(b){var c,d,e,f=0,g=[];for(c=0;cd;d++)g[c][d]=!1;for(c=0;ce;e++)g[c+e][k]=!0;for(e=0;j>e;e++)g[c][k+e]=!0}},i=function(){if(null===e){var b,c,d=a("

      ").addClass("fixed-table-scroll-inner"),f=a("

      ").addClass("fixed-table-scroll-outer");f.append(d),a("body").append(f),b=d[0].offsetWidth,f.css("overflow","scroll"),c=d[0].offsetWidth,b===c&&(c=f[0].clientWidth),f.remove(),e=b-c}return e},j=function(b,c,d,e){var g=c;if("string"==typeof c){var h=c.split(".");h.length>1?(g=window,a.each(h,function(a,b){g=g[b]})):g=window[c]}return"object"==typeof g?g:"function"==typeof g?g.apply(b,d||[]):!g&&"string"==typeof c&&f.apply(this,[c].concat(d))?f.apply(this,[c].concat(d)):e},k=function(b,c,d){var e=Object.getOwnPropertyNames||function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},f=e(b),g=e(c),h="";if(d&&f.length!==g.length)return!1;for(var i=0;i-1&&b[h]!==c[h])return!1;return!0},l=function(a){return"string"==typeof a?a.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/`/g,"`"):a},m=function(a){for(var b in a){var c=b.split(/(?=[A-Z])/).join("-").toLowerCase();c!==b&&(a[c]=a[b],delete a[b])}return a},n=function(a,b,c){var d=a;if("string"!=typeof b||a.hasOwnProperty(b))return c?l(a[b]):a[b];var e=b.split(".");for(var f in e)e.hasOwnProperty(f)&&(d=d&&d[e[f]]);return c?l(d):d},o=function(){return!!(navigator.userAgent.indexOf("MSIE ")>0||navigator.userAgent.match(/Trident.*rv\:11\./))},p=function(){Object.keys||(Object.keys=function(){var a=Object.prototype.hasOwnProperty,b=!{toString:null}.propertyIsEnumerable("toString"),c=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],d=c.length;return function(e){if("object"!=typeof e&&("function"!=typeof e||null===e))throw new TypeError("Object.keys called on non-object");var f,g,h=[];for(f in e)a.call(e,f)&&h.push(f);if(b)for(g=0;d>g;g++)a.call(e,c[g])&&h.push(c[g]);return h}}())},q=function(b,c){this.options=c,this.$el=a(b),this.$el_=this.$el.clone(),this.timeoutId_=0,this.timeoutFooter_=0,this.init()};q.DEFAULTS={classes:"table table-hover",sortClass:void 0,locale:void 0,height:void 0,undefinedText:"-",sortName:void 0,sortOrder:"asc",sortStable:!1,rememberOrder:!1,striped:!1,columns:[[]],data:[],totalField:"total",dataField:"rows",method:"get",url:void 0,ajax:void 0,cache:!0,contentType:"application/json",dataType:"json",ajaxOptions:{},queryParams:function(a){return a},queryParamsType:"limit",responseHandler:function(a){return a},pagination:!1,onlyInfoPagination:!1,paginationLoop:!0,sidePagination:"client",totalRows:0,pageNumber:1,pageSize:10,pageList:[10,25,50,100],paginationHAlign:"right",paginationVAlign:"bottom",paginationDetailHAlign:"left",paginationPreText:"‹",paginationNextText:"›",search:!1,searchOnEnterKey:!1,strictSearch:!1,searchAlign:"right",selectItemName:"btSelectItem",showHeader:!0,showFooter:!1,showColumns:!1,showPaginationSwitch:!1,showRefresh:!1,showToggle:!1,showFullscreen:!1,smartDisplay:!0,escape:!1,minimumCountColumns:1,idField:void 0,uniqueId:void 0,cardView:!1,detailView:!1,detailFormatter:function(){return""},detailFilter:function(){return!0},trimOnSearch:!0,clickToSelect:!1,singleSelect:!1,toolbar:void 0,toolbarAlign:"left",buttonsToolbar:void 0,buttonsAlign:"right",checkboxHeader:!0,sortable:!0,silentSort:!0,maintainSelected:!1,searchTimeOut:500,searchText:"",iconSize:void 0,buttonsClass:d.buttonsClass,iconsPrefix:d.iconsPrefix,icons:d.icons,customSearch:a.noop,customSort:a.noop,ignoreClickToSelectOn:function(b){return a.inArray(b.tagName,["A","BUTTON"])},rowStyle:function(){return{}},rowAttributes:function(){return{}},footerStyle:function(){return{}},onAll:function(){return!1},onClickCell:function(){return!1},onDblClickCell:function(){return!1},onClickRow:function(){return!1},onDblClickRow:function(){return!1},onSort:function(){return!1},onCheck:function(){return!1},onUncheck:function(){return!1},onCheckAll:function(){return!1},onUncheckAll:function(){return!1},onCheckSome:function(){return!1},onUncheckSome:function(){return!1},onLoadSuccess:function(){return!1},onLoadError:function(){return!1},onColumnSwitch:function(){return!1},onPageChange:function(){return!1},onSearch:function(){return!1},onToggle:function(){return!1},onPreBody:function(){return!1},onPostBody:function(){return!1},onPostHeader:function(){return!1},onExpandRow:function(){return!1},onCollapseRow:function(){return!1},onRefreshOptions:function(){return!1},onRefresh:function(){return!1},onResetView:function(){return!1},onScrollBody:function(){return!1}},q.LOCALES={},q.LOCALES["en-US"]=q.LOCALES.en={formatLoadingMessage:function(){return"Loading, please wait..."},formatRecordsPerPage:function(a){return f("%s rows per page",a)},formatShowingRows:function(a,b,c){return f("Showing %s to %s of %s rows",a,b,c)},formatDetailPagination:function(a){return f("Showing %s rows",a)},formatSearch:function(){return"Search"},formatNoMatches:function(){return"No matching records found"},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatRefresh:function(){return"Refresh"},formatToggle:function(){return"Toggle"},formatFullscreen:function(){return"Fullscreen"},formatColumns:function(){return"Columns"},formatAllRows:function(){return"All"}},a.extend(q.DEFAULTS,q.LOCALES["en-US"]),q.COLUMN_DEFAULTS={radio:!1,checkbox:!1,checkboxEnabled:!0,field:void 0,title:void 0,titleTooltip:void 0,"class":void 0,align:void 0,halign:void 0,falign:void 0,valign:void 0,width:void 0,sortable:!1,order:"asc",visible:!0,switchable:!0,clickToSelect:!0,formatter:void 0,footerFormatter:void 0,events:void 0,sorter:void 0,sortName:void 0,cellStyle:void 0,searchable:!0,searchFormatter:!0,cardVisible:!0,escape:!1,showSelectTitle:!1},q.EVENTS={"all.bs.table":"onAll","click-cell.bs.table":"onClickCell","dbl-click-cell.bs.table":"onDblClickCell","click-row.bs.table":"onClickRow","dbl-click-row.bs.table":"onDblClickRow","sort.bs.table":"onSort","check.bs.table":"onCheck","uncheck.bs.table":"onUncheck","check-all.bs.table":"onCheckAll","uncheck-all.bs.table":"onUncheckAll","check-some.bs.table":"onCheckSome","uncheck-some.bs.table":"onUncheckSome","load-success.bs.table":"onLoadSuccess","load-error.bs.table":"onLoadError","column-switch.bs.table":"onColumnSwitch","page-change.bs.table":"onPageChange","search.bs.table":"onSearch","toggle.bs.table":"onToggle","pre-body.bs.table":"onPreBody","post-body.bs.table":"onPostBody","post-header.bs.table":"onPostHeader","expand-row.bs.table":"onExpandRow","collapse-row.bs.table":"onCollapseRow","refresh-options.bs.table":"onRefreshOptions","reset-view.bs.table":"onResetView","refresh.bs.table":"onRefresh","scroll-body.bs.table":"onScrollBody"},q.prototype.init=function(){this.initLocale(),this.initContainer(),this.initTable(),this.initHeader(),this.initData(),this.initHiddenRows(),this.initFooter(),this.initToolbar(),this.initPagination(),this.initBody(),this.initSearchText(),this.initServer()},q.prototype.initLocale=function(){if(this.options.locale){var b=this.options.locale.split(/-|_/);b[0].toLowerCase(),b[1]&&b[1].toUpperCase(),a.fn.bootstrapTable.locales[this.options.locale]?a.extend(this.options,a.fn.bootstrapTable.locales[this.options.locale]):a.fn.bootstrapTable.locales[b.join("-")]?a.extend(this.options,a.fn.bootstrapTable.locales[b.join("-")]):a.fn.bootstrapTable.locales[b[0]]&&a.extend(this.options,a.fn.bootstrapTable.locales[b[0]])}},q.prototype.initContainer=function(){this.$container=a(['
      ','
      ',"top"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?'
      ':"",'
      ','
      ','
      ','
      ',this.options.formatLoadingMessage(),"
      ","
      ",'',"
      ","bottom"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?'
      ':"","
      "].join("")),this.$container.insertAfter(this.$el),this.$tableContainer=this.$container.find(".fixed-table-container"),this.$tableHeader=this.$container.find(".fixed-table-header"),this.$tableBody=this.$container.find(".fixed-table-body"),this.$tableLoading=this.$container.find(".fixed-table-loading"),this.$tableFooter=this.$container.find(".fixed-table-footer"),this.$toolbar=this.options.buttonsToolbar?a("body").find(this.options.buttonsToolbar):this.$container.find(".fixed-table-toolbar"),this.$pagination=this.$container.find(".fixed-table-pagination"),this.$tableBody.append(this.$el),this.$container.after('
      '),this.$el.addClass(this.options.classes),this.options.striped&&this.$el.addClass("table-striped"),-1!==a.inArray("table-no-bordered",this.options.classes.split(" "))&&this.$tableContainer.addClass("table-no-bordered")},q.prototype.initTable=function(){var b=this,c=[],d=[];if(this.$header=this.$el.find(">thead"),this.$header.length||(this.$header=a("").appendTo(this.$el)),this.$header.find("tr").each(function(){var b=[];a(this).find("th").each(function(){"undefined"!=typeof a(this).data("field")&&a(this).data("field",a(this).data("field")+""),b.push(a.extend({},{title:a(this).html(),"class":a(this).attr("class"),titleTooltip:a(this).attr("title"),rowspan:a(this).attr("rowspan")?+a(this).attr("rowspan"):void 0,colspan:a(this).attr("colspan")?+a(this).attr("colspan"):void 0},a(this).data()))}),c.push(b)}),a.isArray(this.options.columns[0])||(this.options.columns=[this.options.columns]),this.options.columns=a.extend(!0,[],c,this.options.columns),this.columns=[],this.fieldsColumnsIndex=[],h(this.options.columns),a.each(this.options.columns,function(c,d){a.each(d,function(d,e){e=a.extend({},q.COLUMN_DEFAULTS,e),"undefined"!=typeof e.fieldIndex&&(b.columns[e.fieldIndex]=e,b.fieldsColumnsIndex[e.field]=e.fieldIndex),b.options.columns[c][d]=e})}),!this.options.data.length){var e=[];this.$el.find(">tbody>tr").each(function(c){var f={};f._id=a(this).attr("id"),f._class=a(this).attr("class"),f._data=m(a(this).data()),a(this).find(">td").each(function(d){for(var g,h,i=a(this),j=+i.attr("colspan")||1,k=+i.attr("rowspan")||1;e[c]&&e[c][d];d++);for(g=d;d+j>g;g++)for(h=c;c+k>h;h++)e[h]||(e[h]=[]),e[h][g]=!0;var l=b.columns[d].field;f[l]=a(this).html(),f["_"+l+"_id"]=a(this).attr("id"),f["_"+l+"_class"]=a(this).attr("class"),f["_"+l+"_rowspan"]=a(this).attr("rowspan"),f["_"+l+"_colspan"]=a(this).attr("colspan"),f["_"+l+"_title"]=a(this).attr("title"),f["_"+l+"_data"]=m(a(this).data())}),d.push(f)}),this.options.data=d,d.length&&(this.fromHtml=!0)}},q.prototype.initHeader=function(){var b=this,c={},d=[];this.header={fields:[],styles:[],classes:[],formatters:[],events:[],sorters:[],sortNames:[],cellStyles:[],searchables:[]},a.each(this.options.columns,function(e,g){d.push(""),0===e&&!b.options.cardView&&b.options.detailView&&d.push(f('
      ',b.options.columns.length)),a.each(g,function(a,e){var g="",h="",i="",j="",k=f(' class="%s"',e["class"]),m=(b.options.sortOrder||e.order,"px"),n=e.width;if(void 0===e.width||b.options.cardView||"string"==typeof e.width&&-1!==e.width.indexOf("%")&&(m="%"),e.width&&"string"==typeof e.width&&(n=e.width.replace("%","").replace("px","")),h=f("text-align: %s; ",e.halign?e.halign:e.align),i=f("text-align: %s; ",e.align),j=f("vertical-align: %s; ",e.valign),j+=f("width: %s; ",!e.checkbox&&!e.radio||n?n?n+m:void 0:e.showSelectTitle?void 0:"36px"),"undefined"!=typeof e.fieldIndex){if(b.header.fields[e.fieldIndex]=e.field,b.header.styles[e.fieldIndex]=i+j,b.header.classes[e.fieldIndex]=k,b.header.formatters[e.fieldIndex]=e.formatter,b.header.events[e.fieldIndex]=e.events,b.header.sorters[e.fieldIndex]=e.sorter,b.header.sortNames[e.fieldIndex]=e.sortName,b.header.cellStyles[e.fieldIndex]=e.cellStyle,b.header.searchables[e.fieldIndex]=e.searchable,!e.visible)return;if(b.options.cardView&&!e.cardVisible)return;c[e.field]=e}d.push(""),d.push(f('
      ',b.options.sortable&&e.sortable?"sortable both":"")),g=b.options.escape?l(e.title):e.title;var o=g;e.checkbox&&(g="",!b.options.singleSelect&&b.options.checkboxHeader&&(g=''),b.header.stateField=e.field),e.radio&&(g="",b.header.stateField=e.field,b.options.singleSelect=!0),!g&&e.showSelectTitle&&(g+=o),d.push(g),d.push("
      "),d.push('
      '),d.push("
      "),d.push("")}),d.push("")}),this.$header.html(d.join("")),this.$header.find("th[data-field]").each(function(){a(this).data(c[a(this).data("field")])}),this.$container.off("click",".th-inner").on("click",".th-inner",function(c){var d=a(this);return b.options.detailView&&!d.parent().hasClass("bs-checkbox")&&d.closest(".bootstrap-table")[0]!==b.$container[0]?!1:void(b.options.sortable&&d.parent().data().sortable&&b.onSort(c))}),this.$header.children().children().off("keypress").on("keypress",function(c){if(b.options.sortable&&a(this).data().sortable){var d=c.keyCode||c.which;13==d&&b.onSort(c)}}),a(window).off("resize.bootstrap-table"),!this.options.showHeader||this.options.cardView?(this.$header.hide(),this.$tableHeader.hide(),this.$tableLoading.css("top",0)):(this.$header.show(),this.$tableHeader.show(),this.$tableLoading.css("top",this.$header.outerHeight()+1),this.getCaret(),a(window).on("resize.bootstrap-table",a.proxy(this.resetWidth,this))),this.$selectAll=this.$header.find('[name="btSelectAll"]'),this.$selectAll.off("click").on("click",function(){var c=a(this).prop("checked");b[c?"checkAll":"uncheckAll"](),b.updateSelected()})},q.prototype.initFooter=function(){!this.options.showFooter||this.options.cardView?this.$tableFooter.hide():this.$tableFooter.show()},q.prototype.initData=function(a,b){this.options.data="append"===b?this.options.data.concat(a):"prepend"===b?[].concat(a).concat(this.options.data):a||this.options.data,this.data=this.options.data,"server"!==this.options.sidePagination&&this.initSort()},q.prototype.initSort=function(){var b=this,c=this.options.sortName,d="desc"===this.options.sortOrder?-1:1,e=a.inArray(this.options.sortName,this.header.fields),g=0;return this.options.customSort!==a.noop?void this.options.customSort.apply(this,[this.options.sortName,this.options.sortOrder]):void(-1!==e&&(this.options.sortStable&&a.each(this.data,function(a,b){b._position=a}),this.data.sort(function(f,g){b.header.sortNames[e]&&(c=b.header.sortNames[e]);var h=n(f,c,b.options.escape),i=n(g,c,b.options.escape),k=j(b.header,b.header.sorters[e],[h,i,f,g]);return void 0!==k?b.options.sortStable&&0===k?f._position-g._position:d*k:((void 0===h||null===h)&&(h=""),(void 0===i||null===i)&&(i=""),b.options.sortStable&&h===i?(h=f._position,i=g._position,f._position-g._position):a.isNumeric(h)&&a.isNumeric(i)?(h=parseFloat(h),i=parseFloat(i),i>h?-1*d:d):h===i?0:("string"!=typeof h&&(h=h.toString()),-1===h.localeCompare(i)?-1*d:d))}),void 0!==this.options.sortClass&&(clearTimeout(g),g=setTimeout(function(){b.$el.removeClass(b.options.sortClass);var a=b.$header.find(f('[data-field="%s"]',b.options.sortName).index()+1);b.$el.find(f("tr td:nth-child(%s)",a)).addClass(b.options.sortClass)},250))))},q.prototype.onSort=function(b){var c="keypress"===b.type?a(b.currentTarget):a(b.currentTarget).parent(),d=this.$header.find("th").eq(c.index());return this.$header.add(this.$header_).find("span.order").remove(),this.options.sortName===c.data("field")?this.options.sortOrder="asc"===this.options.sortOrder?"desc":"asc":(this.options.sortName=c.data("field"),this.options.sortOrder=this.options.rememberOrder?"asc"===c.data("order")?"desc":"asc":this.columns[this.fieldsColumnsIndex[c.data("field")]].order),this.trigger("sort",this.options.sortName,this.options.sortOrder),c.add(d).data("order",this.options.sortOrder),this.getCaret(),"server"===this.options.sidePagination?void this.initServer(this.options.silentSort):(this.initSort(),void this.initBody())},q.prototype.initToolbar=function(){var b,c,e=this,g=[],h=0,i=0;this.$toolbar.find(".bs-bars").children().length&&a("body").append(a(this.options.toolbar)),this.$toolbar.html(""),("string"==typeof this.options.toolbar||"object"==typeof this.options.toolbar)&&a(f('
      ',d.pullClass,this.options.toolbarAlign)).appendTo(this.$toolbar).append(a(this.options.toolbar)),g=[f('
      ',this.options.buttonsAlign,d.pullClass,this.options.buttonsAlign)],"string"==typeof this.options.icons&&(this.options.icons=j(null,this.options.icons)),this.options.showPaginationSwitch&&g.push(f('"),this.options.showFullscreen&&this.$toolbar.find('button[name="fullscreen"]').off("click").on("click",a.proxy(this.toggleFullscreen,this)),this.options.showRefresh&&g.push(f('"),this.options.showToggle&&g.push(f('"),this.options.showFullscreen&&g.push(f('"),this.options.showColumns&&(g.push(f('
      ',this.options.formatColumns()),'",d.toobarDropdowHtml[0]),a.each(this.columns,function(a,b){if(!(b.radio||b.checkbox||e.options.cardView&&!b.cardVisible)){var c=b.visible?' checked="checked"':"";b.switchable&&(g.push(f(d.toobarDropdowItemHtml,f(' %s',b.field,a,c,b.title))),i++)}}),g.push(d.toobarDropdowHtml[1],"
      ")),g.push("
      "),(this.showToolbar||g.length>2)&&this.$toolbar.append(g.join("")),this.options.showPaginationSwitch&&this.$toolbar.find('button[name="paginationSwitch"]').off("click").on("click",a.proxy(this.togglePagination,this)),this.options.showRefresh&&this.$toolbar.find('button[name="refresh"]').off("click").on("click",a.proxy(this.refresh,this)),this.options.showToggle&&this.$toolbar.find('button[name="toggle"]').off("click").on("click",function(){e.toggleView()}),this.options.showColumns&&(b=this.$toolbar.find(".keep-open"),i<=this.options.minimumCountColumns&&b.find("input").prop("disabled",!0),b.find("li").off("click").on("click",function(a){a.stopImmediatePropagation()}),b.find("input").off("click").on("click",function(){var b=a(this);e.toggleColumn(a(this).val(),b.prop("checked"),!1),e.trigger("column-switch",a(this).data("field"),b.prop("checked"))})),this.options.search&&(g=[],g.push(f('"),this.$toolbar.append(g.join("")),c=this.$toolbar.find(".search input"),c.off("keyup drop blur").on("keyup drop blur",function(b){e.options.searchOnEnterKey&&13!==b.keyCode||a.inArray(b.keyCode,[37,38,39,40])>-1||(clearTimeout(h),h=setTimeout(function(){e.onSearch(b)},e.options.searchTimeOut))}),o()&&c.off("mouseup").on("mouseup",function(a){clearTimeout(h),h=setTimeout(function(){e.onSearch(a)},e.options.searchTimeOut)}))},q.prototype.onSearch=function(b){var c=a.trim(a(b.currentTarget).val());this.options.trimOnSearch&&a(b.currentTarget).val()!==c&&a(b.currentTarget).val(c),c!==this.searchText&&(this.searchText=c,this.options.searchText=c,this.options.pageNumber=1,this.initSearch(),b.firedByInitSearchText?"client"===this.options.sidePagination&&this.updatePagination():this.updatePagination(),this.trigger("search",c))},q.prototype.initSearch=function(){var b=this;if("server"!==this.options.sidePagination){if(this.options.customSearch!==a.noop)return void window[this.options.customSearch].apply(this,[this.searchText]);var c=this.searchText&&(this.options.escape?l(this.searchText):this.searchText).toLowerCase(),d=a.isEmptyObject(this.filterColumns)?null:this.filterColumns;this.data=d?a.grep(this.options.data,function(b){for(var c in d)if(a.isArray(d[c])&&-1===a.inArray(b[c],d[c])||!a.isArray(d[c])&&b[c]!==d[c])return!1;return!0}):this.options.data,this.data=c?a.grep(this.data,function(d,e){for(var f=0;f-1&&(m=!0)}this.totalPages=~~((this.options.totalRows-1)/this.options.pageSize)+1,this.options.totalPages=this.totalPages}if(this.totalPages>0&&this.options.pageNumber>this.totalPages&&(this.options.pageNumber=this.totalPages),this.pageFrom=(this.options.pageNumber-1)*this.options.pageSize+1,this.pageTo=this.options.pageNumber*this.options.pageSize,this.pageTo>this.options.totalRows&&(this.pageTo=this.options.totalRows),l.push(f('
      ',d.pullClass,this.options.paginationDetailHAlign),'',this.options.onlyInfoPagination?this.options.formatDetailPagination(this.options.totalRows):this.options.formatShowingRows(this.pageFrom,this.pageTo,this.options.totalRows),""),!this.options.onlyInfoPagination){l.push('');var q=[f('',"top"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?"dropdown":"dropup"),'",d.pageDropdownHtml[0]];if("string"==typeof this.options.pageList){var r=this.options.pageList.replace("[","").replace("]","").replace(/ /g,"").split(",");o=[],a.each(r,function(a,b){o.push(b.toUpperCase()===k.options.formatAllRows().toUpperCase()||"UNLIMITED"===b.toUpperCase()?k.options.formatAllRows():+b)})}for(a.each(o,function(a,b){if(!k.options.smartDisplay||0===a||o[a-1]"),l.push(this.options.formatRecordsPerPage(q.join(""))),l.push(""),l.push("
      ",f('")}this.$pagination.html(l.join("")),this.options.onlyInfoPagination||(g=this.$pagination.find(".page-list a"),h=this.$pagination.find(".page-pre"),i=this.$pagination.find(".page-next"),j=this.$pagination.find(".page-item").not(".page-next, .page-pre"),this.options.smartDisplay&&(this.totalPages<=1&&this.$pagination.find("div.pagination").hide(),(o.length<2||this.options.totalRows<=o[0])&&this.$pagination.find("span.page-list").hide(),this.$pagination[this.getData().length?"show":"hide"]()),this.options.paginationLoop||(1===this.options.pageNumber&&h.addClass("disabled"),this.options.pageNumber===this.totalPages&&i.addClass("disabled")),m&&(this.options.pageSize=this.options.formatAllRows()),g.off("click").on("click",a.proxy(this.onPageListChange,this)),h.off("click").on("click",a.proxy(this.onPagePre,this)),i.off("click").on("click",a.proxy(this.onPageNext,this)),j.off("click").on("click",a.proxy(this.onPageNumber,this)))},q.prototype.updatePagination=function(b){b&&a(b.currentTarget).hasClass("disabled")||(this.options.maintainSelected||this.resetRows(),this.initPagination(),"server"===this.options.sidePagination?this.initServer():this.initBody(),this.trigger("page-change",this.options.pageNumber,this.options.pageSize))},q.prototype.onPageListChange=function(b){b.preventDefault();var c=a(b.currentTarget);return c.parent().addClass("active").siblings().removeClass("active"),this.options.pageSize=c.text().toUpperCase()===this.options.formatAllRows().toUpperCase()?this.options.formatAllRows():+c.text(),this.$toolbar.find(".page-size").text(this.options.pageSize),this.updatePagination(b),!1},q.prototype.onPagePre=function(a){return a.preventDefault(),this.options.pageNumber-1===0?this.options.pageNumber=this.options.totalPages:this.options.pageNumber--,this.updatePagination(a),!1},q.prototype.onPageNext=function(a){return a.preventDefault(),this.options.pageNumber+1>this.options.totalPages?this.options.pageNumber=1:this.options.pageNumber++,this.updatePagination(a),!1},q.prototype.onPageNumber=function(b){return b.preventDefault(),this.options.pageNumber!==+a(b.currentTarget).text()?(this.options.pageNumber=+a(b.currentTarget).text(),this.updatePagination(b),!1):void 0},q.prototype.initRow=function(b,c){var d,e=this,h=[],i={},k=[],m="",o={},p=[];if(!(a.inArray(b,this.hiddenRows)>-1)){if(i=j(this.options,this.options.rowStyle,[b,c],i),i&&i.css)for(d in i.css)k.push(d+": "+i.css[d]);if(o=j(this.options,this.options.rowAttributes,[b,c],o))for(d in o)p.push(f('%s="%s"',d,l(o[d])));return b._data&&!a.isEmptyObject(b._data)&&a.each(b._data,function(a,b){"index"!==a&&(m+=f(' data-%s="%s"',a,b))}),h.push(""),this.options.cardView&&h.push(f('
      ',this.header.fields.length)),!this.options.cardView&&this.options.detailView&&(h.push(""),j(null,this.options.detailFilter,[c,b])&&h.push('',f('',this.options.iconsPrefix,this.options.icons.detailOpen),""),h.push("")),a.each(this.header.fields,function(d,m){var o="",p=n(b,m,e.options.escape),q="",r="",s={},t="",u=e.header.classes[d],v="",w="",x="",y="",z=e.columns[d]; + +if((!e.fromHtml||"undefined"!=typeof p||z.checkbox||z.radio)&&z.visible&&(!e.options.cardView||z.cardVisible)){if(z.escape&&(p=l(p)),i=f('style="%s"',k.concat(e.header.styles[d]).join("; ")),b["_"+m+"_id"]&&(t=f(' id="%s"',b["_"+m+"_id"])),b["_"+m+"_class"]&&(u=f(' class="%s"',b["_"+m+"_class"])),b["_"+m+"_rowspan"]&&(w=f(' rowspan="%s"',b["_"+m+"_rowspan"])),b["_"+m+"_colspan"]&&(x=f(' colspan="%s"',b["_"+m+"_colspan"])),b["_"+m+"_title"]&&(y=f(' title="%s"',b["_"+m+"_title"])),s=j(e.header,e.header.cellStyles[d],[p,b,c,m],s),s.classes&&(u=f(' class="%s"',s.classes)),s.css){var A=[];for(var B in s.css)A.push(B+": "+s.css[B]);i=f('style="%s"',A.concat(e.header.styles[d]).join("; "))}q=j(z,e.header.formatters[d],[p,b,c,m],p),b["_"+m+"_data"]&&!a.isEmptyObject(b["_"+m+"_data"])&&a.each(b["_"+m+"_data"],function(a,b){"index"!==a&&(v+=f(' data-%s="%s"',a,b))}),z.checkbox||z.radio?(r=z.checkbox?"checkbox":r,r=z.radio?"radio":r,o=[f(e.options.cardView?'
      ':'',z["class"]||""),"",e.header.formatters[d]&&"string"==typeof q?q:"",e.options.cardView?"
      ":""].join(""),b[e.header.stateField]=q===!0||!!p||q&&q.checked):(q="undefined"==typeof q||null===q?e.options.undefinedText:q,o=e.options.cardView?['
      ',e.options.showHeader?f('%s',i,g(e.columns,"field","title",m)):"",f('%s',q),"
      "].join(""):[f("",t,u,i,v,w,x,y),q,""].join(""),e.options.cardView&&e.options.smartDisplay&&""===q&&(o='
      ')),h.push(o)}}),this.options.cardView&&h.push("
      "),h.push(""),h.join(" ")}},q.prototype.initBody=function(b){var c=this,d=this.getData();this.trigger("pre-body",d),this.$body=this.$el.find(">tbody"),this.$body.length||(this.$body=a("").appendTo(this.$el)),this.options.pagination&&"server"!==this.options.sidePagination||(this.pageFrom=1,this.pageTo=d.length);for(var e,g=a(document.createDocumentFragment()),h=this.pageFrom-1;h'+f('%s',this.$header.find("th").length,this.options.formatNoMatches())+""),this.$body.html(g),b||this.scrollTo(0),this.$body.find("> tr[data-index] > td").off("click dblclick").on("click dblclick",function(b){var d=a(this),e=d.parent(),g=c.data[e.data("index")],h=d[0].cellIndex,i=c.getVisibleFields(),j=i[c.options.detailView&&!c.options.cardView?h-1:h],k=c.columns[c.fieldsColumnsIndex[j]],l=n(g,j,c.options.escape);if(!d.find(".detail-icon").length&&(c.trigger("click"===b.type?"click-cell":"dbl-click-cell",j,l,g,d),c.trigger("click"===b.type?"click-row":"dbl-click-row",g,e,j),"click"===b.type&&c.options.clickToSelect&&k.clickToSelect&&c.options.ignoreClickToSelectOn(b.target))){var m=e.find(f('[name="%s"]',c.options.selectItemName));m.length&&m[0].click()}}),this.$body.find("> tr[data-index] > td > .detail-icon").off("click").on("click",function(b){b.preventDefault();var e=a(this),g=e.parent().parent(),h=g.data("index"),i=d[h];if(g.next().is("tr.detail-view"))e.find("i").attr("class",f("%s %s",c.options.iconsPrefix,c.options.icons.detailOpen)),c.trigger("collapse-row",h,i,g.next()),g.next().remove();else{e.find("i").attr("class",f("%s %s",c.options.iconsPrefix,c.options.icons.detailClose)),g.after(f('',g.find("td").length));var k=g.next().find("td"),l=j(c.options,c.options.detailFormatter,[h,i,k],"");1===k.length&&k.append(l),c.trigger("expand-row",h,i,k)}return c.resetView(),!1}),this.$selectItem=this.$body.find(f('[name="%s"]',this.options.selectItemName)),this.$selectItem.off("click").on("click",function(b){b.stopImmediatePropagation();var d=a(this),e=d.prop("checked"),f=c.data[d.data("index")];(a(this).is(":radio")||c.options.singleSelect)&&a.each(c.options.data,function(a,b){b[c.header.stateField]=!1}),f[c.header.stateField]=e,c.options.singleSelect&&(c.$selectItem.not(this).each(function(){c.data[a(this).data("index")][c.header.stateField]=!1}),c.$selectItem.filter(":checked").not(this).prop("checked",!1)),c.updateSelected(),c.trigger(e?"check":"uncheck",f,d)}),a.each(this.header.events,function(b,d){if(d){"string"==typeof d&&(d=j(null,d));var e=c.header.fields[b],f=a.inArray(e,c.getVisibleFields());if(-1!==f){c.options.detailView&&!c.options.cardView&&(f+=1);for(var g in d)c.$body.find(">tr:not(.no-records-found)").each(function(){var b=a(this),h=b.find(c.options.cardView?".card-view":"td").eq(f),i=g.indexOf(" "),j=g.substring(0,i),k=g.substring(i+1),l=d[g];h.find(k).off(j).on(j,function(a){var d=b.data("index"),f=c.data[d],g=f[e];l.apply(this,[a,g,f,d])})})}}}),this.updateSelected(),this.resetView(),this.trigger("post-body",d)},q.prototype.initServer=function(b,c,d){var e,f=this,g={},h=a.inArray(this.options.sortName,this.header.fields),i={searchText:this.searchText,sortName:this.options.sortName,sortOrder:this.options.sortOrder};this.header.sortNames[h]&&(i.sortName=this.header.sortNames[h]),this.options.pagination&&"server"===this.options.sidePagination&&(i.pageSize=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize,i.pageNumber=this.options.pageNumber),(d||this.options.url||this.options.ajax)&&("limit"===this.options.queryParamsType&&(i={search:i.searchText,sort:i.sortName,order:i.sortOrder},this.options.pagination&&"server"===this.options.sidePagination&&(i.offset=this.options.pageSize===this.options.formatAllRows()?0:this.options.pageSize*(this.options.pageNumber-1),i.limit=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize,0===i.limit&&delete i.limit)),a.isEmptyObject(this.filterColumnsPartial)||(i.filter=JSON.stringify(this.filterColumnsPartial,null)),g=j(this.options,this.options.queryParams,[i],g),a.extend(g,c||{}),g!==!1&&(b||this.$tableLoading.show(),e=a.extend({},j(null,this.options.ajaxOptions),{type:this.options.method,url:d||this.options.url,data:"application/json"===this.options.contentType&&"post"===this.options.method?JSON.stringify(g):g,cache:this.options.cache,contentType:this.options.contentType,dataType:this.options.dataType,success:function(a){a=j(f.options,f.options.responseHandler,[a],a),f.load(a),f.trigger("load-success",a),b||f.$tableLoading.hide()},error:function(a){var c=[];"server"===f.options.sidePagination&&(c={},c[f.options.totalField]=0,c[f.options.dataField]=[]),f.load(c),f.trigger("load-error",a.status,a),b||f.$tableLoading.hide()}}),this.options.ajax?j(this,this.options.ajax,[e],null):(this._xhr&&4!==this._xhr.readyState&&this._xhr.abort(),this._xhr=a.ajax(e))))},q.prototype.initSearchText=function(){if(this.options.search&&(this.searchText="",""!==this.options.searchText)){var a=this.$toolbar.find(".search input");a.val(this.options.searchText),this.onSearch({currentTarget:a,firedByInitSearchText:!0})}},q.prototype.getCaret=function(){var b=this;a.each(this.$header.find("th"),function(c,d){a(d).find(".sortable").removeClass("desc asc").addClass(a(d).data("field")===b.options.sortName?b.options.sortOrder:"both")})},q.prototype.updateSelected=function(){var b=this.$selectItem.filter(":enabled").length&&this.$selectItem.filter(":enabled").length===this.$selectItem.filter(":enabled").filter(":checked").length;this.$selectAll.add(this.$selectAll_).prop("checked",b),this.$selectItem.each(function(){a(this).closest("tr")[a(this).prop("checked")?"addClass":"removeClass"]("selected")})},q.prototype.updateRows=function(){var b=this;this.$selectItem.each(function(){b.data[a(this).data("index")][b.header.stateField]=a(this).prop("checked")})},q.prototype.resetRows=function(){var b=this;a.each(this.data,function(a,c){b.$selectAll.prop("checked",!1),b.$selectItem.prop("checked",!1),b.header.stateField&&(c[b.header.stateField]=!1)}),this.initHiddenRows()},q.prototype.trigger=function(b){var c=Array.prototype.slice.call(arguments,1);b+=".bs.table",this.options[q.EVENTS[b]].apply(this.options,c),this.$el.trigger(a.Event(b),c),this.options.onAll(b,c),this.$el.trigger(a.Event("all.bs.table"),[b,c])},q.prototype.resetHeader=function(){clearTimeout(this.timeoutId_),this.timeoutId_=setTimeout(a.proxy(this.fitHeader,this),this.$el.is(":hidden")?100:0)},q.prototype.fitHeader=function(){var b,c,d,e,g=this;if(g.$el.is(":hidden"))return void(g.timeoutId_=setTimeout(a.proxy(g.fitHeader,g),100));if(b=this.$tableBody.get(0),c=b.scrollWidth>b.clientWidth&&b.scrollHeight>b.clientHeight+this.$header.outerHeight()?i():0,this.$el.css("margin-top",-this.$header.outerHeight()),d=a(":focus"),d.length>0){var h=d.parents("th");if(h.length>0){var j=h.attr("data-field");if(void 0!==j){var k=this.$header.find("[data-field='"+j+"']");k.length>0&&k.find(":input").addClass("focus-temp")}}}this.$header_=this.$header.clone(!0,!0),this.$selectAll_=this.$header_.find('[name="btSelectAll"]'),this.$tableHeader.css({"margin-right":c}).find("table").css("width",this.$el.outerWidth()).html("").attr("class",this.$el.attr("class")).append(this.$header_),e=a(".focus-temp:visible:eq(0)"),e.length>0&&(e.focus(),this.$header.find(".focus-temp").removeClass("focus-temp")),this.$header.find("th[data-field]").each(function(){g.$header_.find(f('th[data-field="%s"]',a(this).data("field"))).data(a(this).data())});var l=this.getVisibleFields(),m=this.$header_.find("th");this.$body.find(">tr:first-child:not(.no-records-found) > *").each(function(b){var c=a(this),d=b;if(g.options.detailView&&!g.options.cardView&&(0===b&&g.$header_.find("th.detail").find(".fht-cell").width(c.innerWidth()),d=b-1),-1!==d){var e=g.$header_.find(f('th[data-field="%s"]',l[d]));e.length>1&&(e=a(m[c[0].cellIndex]));var h=e.width()-e.find(".fht-cell").width();e.find(".fht-cell").width(c.innerWidth()-h)}}),this.horizontalScroll(),this.trigger("post-header")},q.prototype.resetFooter=function(){var b=this,c=b.getData(),d=[];this.options.showFooter&&!this.options.cardView&&(!this.options.cardView&&this.options.detailView&&d.push('
       
      '),a.each(this.columns,function(a,e){var g,h="",i="",k=[],l={},m=f(' class="%s"',e["class"]);if(e.visible&&(!b.options.cardView||e.cardVisible)){if(h=f("text-align: %s; ",e.falign?e.falign:e.align),i=f("vertical-align: %s; ",e.valign),l=j(null,b.options.footerStyle),l&&l.css)for(g in l.css)k.push(g+": "+l.css[g]);d.push(""),d.push('
      '),d.push(j(e,e.footerFormatter,[c]," ")||" "),d.push("
      "),d.push('
      '),d.push("
      "),d.push("")}}),this.$tableFooter.find("tr").html(d.join("")),this.$tableFooter.show(),clearTimeout(this.timeoutFooter_),this.timeoutFooter_=setTimeout(a.proxy(this.fitFooter,this),this.$el.is(":hidden")?100:0))},q.prototype.fitFooter=function(){var b,c,d;return clearTimeout(this.timeoutFooter_),this.$el.is(":hidden")?void(this.timeoutFooter_=setTimeout(a.proxy(this.fitFooter,this),100)):(c=this.$el.css("width"),d=c>this.$tableBody.width()?i():0,this.$tableFooter.css({"margin-right":d}).find("table").css("width",c).attr("class",this.$el.attr("class")),b=this.$tableFooter.find("td"),this.$body.find(">tr:first-child:not(.no-records-found) > *").each(function(c){var d=a(this);b.eq(c).find(".fht-cell").width(d.innerWidth())}),void this.horizontalScroll())},q.prototype.horizontalScroll=function(){var b=this;b.trigger("scroll-body"),this.$tableBody.off("scroll").on("scroll",function(){b.options.showHeader&&b.options.height&&b.$tableHeader.scrollLeft(a(this).scrollLeft()),b.options.showFooter&&!b.options.cardView&&b.$tableFooter.scrollLeft(a(this).scrollLeft())})},q.prototype.toggleColumn=function(a,b,c){if(-1!==a&&(this.columns[a].visible=b,this.initHeader(),this.initSearch(),this.initPagination(),this.initBody(),this.options.showColumns)){var d=this.$toolbar.find(".keep-open input").prop("disabled",!1);c&&d.filter(f('[value="%s"]',a)).prop("checked",b),d.filter(":checked").length<=this.options.minimumCountColumns&&d.filter(":checked").prop("disabled",!0)}},q.prototype.getVisibleFields=function(){var b=this,c=[];return a.each(this.header.fields,function(a,d){var e=b.columns[b.fieldsColumnsIndex[d]];e.visible&&c.push(d)}),c},q.prototype.resetView=function(a){var b=0;if(a&&a.height&&(this.options.height=a.height),this.$selectAll.prop("checked",this.$selectItem.length>0&&this.$selectItem.length===this.$selectItem.filter(":checked").length),this.options.height){var c=this.$toolbar.outerHeight(!0),d=this.$pagination.outerHeight(!0),e=this.options.height-c-d;this.$tableContainer.css("height",e+"px")}return this.options.cardView?(this.$el.css("margin-top","0"),this.$tableContainer.css("padding-bottom","0"),void this.$tableFooter.hide()):(this.options.showHeader&&this.options.height?(this.$tableHeader.show(),this.resetHeader(),b+=this.$header.outerHeight()):(this.$tableHeader.hide(),this.trigger("post-header")),this.options.showFooter&&(this.resetFooter(),this.options.height&&(b+=this.$tableFooter.outerHeight()+1)),this.getCaret(),this.$tableContainer.css("padding-bottom",b+"px"),void this.trigger("reset-view"))},q.prototype.getData=function(b){var c=this.options.data;return(this.searchText||this.options.sortName||!a.isEmptyObject(this.filterColumns)||!a.isEmptyObject(this.filterColumnsPartial))&&(c=this.data),b?c.slice(this.pageFrom-1,this.pageTo):c},q.prototype.load=function(b){var c=!1;this.options.pagination&&"server"===this.options.sidePagination?(this.options.totalRows=b[this.options.totalField],c=b.fixedScroll,b=b[this.options.dataField]):a.isArray(b)||(c=b.fixedScroll,b=b.data),this.initData(b),this.initSearch(),this.initPagination(),this.initBody(c)},q.prototype.append=function(a){this.initData(a,"append"),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},q.prototype.prepend=function(a){this.initData(a,"prepend"),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},q.prototype.remove=function(b){var c,d,e=this.options.data.length;if(b.hasOwnProperty("field")&&b.hasOwnProperty("values")){for(c=e-1;c>=0;c--)d=this.options.data[c],d.hasOwnProperty(b.field)&&-1!==a.inArray(d[b.field],b.values)&&(this.options.data.splice(c,1),"server"===this.options.sidePagination&&(this.options.totalRows-=1));e!==this.options.data.length&&(this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0))}},q.prototype.removeAll=function(){this.options.data.length>0&&(this.options.data.splice(0,this.options.data.length),this.initSearch(),this.initPagination(),this.initBody(!0))},q.prototype.getRowByUniqueId=function(a){var b,c,d,e=this.options.uniqueId,f=this.options.data.length,g=null;for(b=f-1;b>=0;b--){if(c=this.options.data[b],c.hasOwnProperty(e))d=c[e];else{if(!c._data.hasOwnProperty(e))continue;d=c._data[e]}if("string"==typeof d?a=a.toString():"number"==typeof d&&(Number(d)===d&&d%1===0?a=parseInt(a):d===Number(d)&&0!==d&&(a=parseFloat(a))),d===a){g=c;break}}return g},q.prototype.removeByUniqueId=function(a){var b=this.options.data.length,c=this.getRowByUniqueId(a);c&&this.options.data.splice(this.options.data.indexOf(c),1),b!==this.options.data.length&&(this.initSearch(),this.initPagination(),this.initBody(!0))},q.prototype.updateByUniqueId=function(b){var c=this,d=a.isArray(b)?b:[b];a.each(d,function(b,d){var e;d.hasOwnProperty("id")&&d.hasOwnProperty("row")&&(e=a.inArray(c.getRowByUniqueId(d.id),c.options.data),-1!==e&&a.extend(c.options.data[e],d.row))}),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},q.prototype.refreshColumnTitle=function(b){if(b.hasOwnProperty("field")&&b.hasOwnProperty("title")&&(this.columns[this.fieldsColumnsIndex[b.field]].title=this.options.escape?l(b.title):b.title,this.columns[this.fieldsColumnsIndex[b.field]].visible)){var c=void 0!==this.options.height?this.$tableHeader:this.$header;c.find("th[data-field]").each(function(){return a(this).data("field")===b.field?(a(a(this).find(".th-inner")[0]).text(b.title),!1):void 0})}},q.prototype.insertRow=function(a){a.hasOwnProperty("index")&&a.hasOwnProperty("row")&&(this.options.data.splice(a.index,0,a.row),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0))},q.prototype.updateRow=function(b){var c=this,d=a.isArray(b)?b:[b];a.each(d,function(b,d){d.hasOwnProperty("index")&&d.hasOwnProperty("row")&&a.extend(c.options.data[d.index],d.row)}),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},q.prototype.initHiddenRows=function(){this.hiddenRows=[]},q.prototype.showRow=function(a){this.toggleRow(a,!0)},q.prototype.hideRow=function(a){this.toggleRow(a,!1)},q.prototype.toggleRow=function(b,c){var d,e;b.hasOwnProperty("index")?d=this.getData()[b.index]:b.hasOwnProperty("uniqueId")&&(d=this.getRowByUniqueId(b.uniqueId)),d&&(e=a.inArray(d,this.hiddenRows),c||-1!==e?c&&e>-1&&this.hiddenRows.splice(e,1):this.hiddenRows.push(d),this.initBody(!0))},q.prototype.getHiddenRows=function(){var b=this,c=this.getData(),d=[];return a.each(c,function(c,e){a.inArray(e,b.hiddenRows)>-1&&d.push(e)}),this.hiddenRows=d,d},q.prototype.mergeCells=function(b){var c,d,e,f=b.index,g=a.inArray(b.field,this.getVisibleFields()),h=b.rowspan||1,i=b.colspan||1,j=this.$body.find(">tr");if(this.options.detailView&&!this.options.cardView&&(g+=1),e=j.eq(f).find(">td").eq(g),!(0>f||0>g||f>=this.data.length)){for(c=f;f+h>c;c++)for(d=g;g+i>d;d++)j.eq(c).find(">td").eq(d).hide();e.attr("rowspan",h).attr("colspan",i).show()}},q.prototype.updateCell=function(a){a.hasOwnProperty("index")&&a.hasOwnProperty("field")&&a.hasOwnProperty("value")&&(this.data[a.index][a.field]=a.value,a.reinit!==!1&&(this.initSort(),this.initBody(!0)))},q.prototype.updateCellById=function(b){var c=this;if(b.hasOwnProperty("id")&&b.hasOwnProperty("field")&&b.hasOwnProperty("value")){var d=a.isArray(b)?b:[b];a.each(d,function(b,d){var e;e=a.inArray(c.getRowByUniqueId(d.id),c.options.data),-1!==e&&(c.data[e][d.field]=d.value)}),b.reinit!==!1&&(this.initSort(),this.initBody(!0))}},q.prototype.getOptions=function(){return a.extend(!0,{},this.options)},q.prototype.getSelections=function(){var b=this;return a.grep(this.options.data,function(a){return a[b.header.stateField]===!0})},q.prototype.getAllSelections=function(){var b=this;return a.grep(this.options.data,function(a){return a[b.header.stateField]})},q.prototype.checkAll=function(){this.checkAll_(!0)},q.prototype.uncheckAll=function(){this.checkAll_(!1)},q.prototype.checkInvert=function(){var b=this,c=b.$selectItem.filter(":enabled"),d=c.filter(":checked");c.each(function(){a(this).prop("checked",!a(this).prop("checked"))}),b.updateRows(),b.updateSelected(),b.trigger("uncheck-some",d),d=b.getSelections(),b.trigger("check-some",d)},q.prototype.checkAll_=function(a){var b;a||(b=this.getSelections()),this.$selectAll.add(this.$selectAll_).prop("checked",a),this.$selectItem.filter(":enabled").prop("checked",a),this.updateRows(),a&&(b=this.getSelections()),this.trigger(a?"check-all":"uncheck-all",b)},q.prototype.check=function(a){this.check_(!0,a)},q.prototype.uncheck=function(a){this.check_(!1,a)},q.prototype.check_=function(a,b){var c=this.$selectItem.filter(f('[data-index="%s"]',b)).prop("checked",a);this.data[b][this.header.stateField]=a,this.updateSelected(),this.trigger(a?"check":"uncheck",this.data[b],c)},q.prototype.checkBy=function(a){this.checkBy_(!0,a)},q.prototype.uncheckBy=function(a){this.checkBy_(!1,a)},q.prototype.checkBy_=function(b,c){if(c.hasOwnProperty("field")&&c.hasOwnProperty("values")){var d=this,e=[];a.each(this.options.data,function(g,h){if(!h.hasOwnProperty(c.field))return!1;if(-1!==a.inArray(h[c.field],c.values)){var i=d.$selectItem.filter(":enabled").filter(f('[data-index="%s"]',g)).prop("checked",b);h[d.header.stateField]=b,e.push(h),d.trigger(b?"check":"uncheck",h,i)}}),this.updateSelected(),this.trigger(b?"check-some":"uncheck-some",e)}},q.prototype.destroy=function(){this.$el.insertBefore(this.$container),a(this.options.toolbar).insertBefore(this.$el),this.$container.next().remove(),this.$container.remove(),this.$el.html(this.$el_.html()).css("margin-top","0").attr("class",this.$el_.attr("class")||"")},q.prototype.showLoading=function(){this.$tableLoading.show()},q.prototype.hideLoading=function(){this.$tableLoading.hide()},q.prototype.togglePagination=function(){this.options.pagination=!this.options.pagination;var a=this.$toolbar.find('button[name="paginationSwitch"] i');this.options.pagination?a.attr("class",this.options.iconsPrefix+" "+this.options.icons.paginationSwitchDown):a.attr("class",this.options.iconsPrefix+" "+this.options.icons.paginationSwitchUp),this.updatePagination()},q.prototype.toggleFullscreen=function(){this.$el.closest(".bootstrap-table").toggleClass("fullscreen")},q.prototype.refresh=function(a){a&&a.url&&(this.options.url=a.url),a&&a.pageNumber&&(this.options.pageNumber=a.pageNumber),a&&a.pageSize&&(this.options.pageSize=a.pageSize),this.initServer(a&&a.silent,a&&a.query,a&&a.url),this.trigger("refresh",a)},q.prototype.resetWidth=function(){this.options.showHeader&&this.options.height&&this.fitHeader(),this.options.showFooter&&!this.options.cardView&&this.fitFooter()},q.prototype.showColumn=function(a){this.toggleColumn(this.fieldsColumnsIndex[a],!0,!0)},q.prototype.hideColumn=function(a){this.toggleColumn(this.fieldsColumnsIndex[a],!1,!0)},q.prototype.getHiddenColumns=function(){return a.grep(this.columns,function(a){return!a.visible})},q.prototype.getVisibleColumns=function(){return a.grep(this.columns,function(a){return a.visible})},q.prototype.toggleAllColumns=function(b){var c=this;if(a.each(this.columns,function(a){c.columns[a].visible=b}),this.initHeader(),this.initSearch(),this.initPagination(),this.initBody(),this.options.showColumns){var d=this.$toolbar.find(".keep-open input").prop("disabled",!1);d.filter(":checked").length<=this.options.minimumCountColumns&&d.filter(":checked").prop("disabled",!0)}},q.prototype.showAllColumns=function(){this.toggleAllColumns(!0)},q.prototype.hideAllColumns=function(){this.toggleAllColumns(!1)},q.prototype.filterBy=function(b){this.filterColumns=a.isEmptyObject(b)?{}:b,this.options.pageNumber=1,this.initSearch(),this.updatePagination()},q.prototype.scrollTo=function(a){return"string"==typeof a&&(a="bottom"===a?this.$tableBody[0].scrollHeight:0),"number"==typeof a&&this.$tableBody.scrollTop(a),"undefined"==typeof a?this.$tableBody.scrollTop():void 0},q.prototype.getScrollPosition=function(){return this.scrollTo()},q.prototype.selectPage=function(a){a>0&&a<=this.options.totalPages&&(this.options.pageNumber=a,this.updatePagination())},q.prototype.prevPage=function(){this.options.pageNumber>1&&(this.options.pageNumber--,this.updatePagination())},q.prototype.nextPage=function(){this.options.pageNumber tr[data-index="%s"]',b));c.next().is("tr.detail-view")===(a?!1:!0)&&c.find("> td > .detail-icon").click()},q.prototype.expandRow=function(a){this.expandRow_(!0,a)},q.prototype.collapseRow=function(a){this.expandRow_(!1,a)},q.prototype.expandAllRows=function(b){if(b){var c=this.$body.find(f('> tr[data-index="%s"]',0)),d=this,e=null,g=!1,h=-1;if(c.next().is("tr.detail-view")?c.next().next().is("tr.detail-view")||(c.next().find(".detail-icon").click(),g=!0):(c.find("> td > .detail-icon").click(),g=!0),g)try{h=setInterval(function(){e=d.$body.find("tr.detail-view").last().find(".detail-icon"),e.length>0?e.click():clearInterval(h)},1)}catch(i){clearInterval(h)}}else for(var j=this.$body.children(),k=0;k1?"n":"")+"."},formatDetailPagination:function(a){return"Zeige "+a+" Zeile"+(a>1?"n":"")+"."},formatSearch:function(){return"Suchen"},formatNoMatches:function(){return"Keine passenden Ergebnisse gefunden"},formatPaginationSwitch:function(){return"Verstecke/Zeige Nummerierung"},formatRefresh:function(){return"Neu laden"},formatToggle:function(){return"Umschalten"},formatColumns:function(){return"Spalten"},formatAllRows:function(){return"Alle"},formatExport:function(){return"Datenexport"},formatClearFilters:function(){return"Lösche Filter"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["de-DE"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-el-GR.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-el-GR.min.js new file mode 100644 index 0000000..46c7f53 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-el-GR.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["el-GR"]={formatLoadingMessage:function(){return"Φορτώνει, παρακαλώ περιμένετε..."},formatRecordsPerPage:function(a){return a+" αποτελέσματα ανά σελίδα"},formatShowingRows:function(a,b,c){return"Εμφανίζονται από την "+a+" ως την "+b+" από σύνολο "+c+" σειρών"},formatSearch:function(){return"Αναζητήστε"},formatNoMatches:function(){return"Δεν βρέθηκαν αποτελέσματα"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["el-GR"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-en-US.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-en-US.min.js new file mode 100644 index 0000000..a39dddd --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-en-US.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["en-US"]={formatLoadingMessage:function(){return"Loading, please wait..."},formatRecordsPerPage:function(a){return a+" rows per page"},formatShowingRows:function(a,b,c){return"Showing "+a+" to "+b+" of "+c+" rows"},formatSearch:function(){return"Search"},formatNoMatches:function(){return"No matching records found"},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatRefresh:function(){return"Refresh"},formatToggle:function(){return"Toggle"},formatColumns:function(){return"Columns"},formatAllRows:function(){return"All"},formatExport:function(){return"Export data"},formatClearFilters:function(){return"Clear filters"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["en-US"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-AR.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-AR.min.js new file mode 100644 index 0000000..f65909a --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-AR.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["es-AR"]={formatLoadingMessage:function(){return"Cargando, espere por favor..."},formatRecordsPerPage:function(a){return a+" registros por página"},formatShowingRows:function(a,b,c){return"Mostrando "+a+" a "+b+" de "+c+" filas"},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se encontraron registros"},formatAllRows:function(){return"Todo"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["es-AR"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-CL.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-CL.min.js new file mode 100644 index 0000000..7eb6cff --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-CL.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["es-CL"]={formatLoadingMessage:function(){return"Cargando, espere por favor..."},formatRecordsPerPage:function(a){return a+" filas por página"},formatShowingRows:function(a,b,c){return"Mostrando "+a+" a "+b+" de "+c+" filas"},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se encontraron registros"},formatPaginationSwitch:function(){return"Ocultar/Mostrar paginación"},formatRefresh:function(){return"Refrescar"},formatToggle:function(){return"Cambiar"},formatColumns:function(){return"Columnas"},formatAllRows:function(){return"Todo"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["es-CL"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-CR.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-CR.min.js new file mode 100644 index 0000000..6aab576 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-CR.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["es-CR"]={formatLoadingMessage:function(){return"Cargando, por favor espere..."},formatRecordsPerPage:function(a){return a+" registros por página"},formatShowingRows:function(a,b,c){return"Mostrando de "+a+" a "+b+" registros de "+c+" registros en total"},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se encontraron registros"},formatRefresh:function(){return"Refrescar"},formatToggle:function(){return"Alternar"},formatColumns:function(){return"Columnas"},formatAllRows:function(){return"Todo"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["es-CR"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-ES.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-ES.min.js new file mode 100644 index 0000000..d91ae71 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-ES.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["es-ES"]={formatLoadingMessage:function(){return"Por favor espere..."},formatRecordsPerPage:function(a){return a+" resultados por página"},formatShowingRows:function(a,b,c){return"Mostrando desde "+a+" hasta "+b+" - En total "+c+" resultados"},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se encontraron resultados"},formatPaginationSwitch:function(){return"Ocultar/Mostrar paginación"},formatRefresh:function(){return"Refrescar"},formatToggle:function(){return"Ocultar/Mostrar"},formatColumns:function(){return"Columnas"},formatAllRows:function(){return"Todos"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["es-ES"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-MX.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-MX.min.js new file mode 100644 index 0000000..bbea4be --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-MX.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["es-MX"]={formatLoadingMessage:function(){return"Cargando, espere por favor..."},formatRecordsPerPage:function(a){return a+" registros por página"},formatShowingRows:function(a,b,c){return"Mostrando "+a+" a "+b+" de "+c+" filas"},formatDetailPagination:function(a){return"Mostrando "+a+" filas"},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se encontraron registros que coincidan"},formatPaginationSwitch:function(){return"Mostrar/ocultar paginación"},formatRefresh:function(){return"Actualizar"},formatToggle:function(){return"Cambiar vista"},formatFullscreen:function(){return"Pantalla completa"},formatColumns:function(){return"Columnas"},formatAllRows:function(){return"Todo"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["es-MX"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-NI.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-NI.min.js new file mode 100644 index 0000000..a4832d6 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-NI.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["es-NI"]={formatLoadingMessage:function(){return"Cargando, por favor espere..."},formatRecordsPerPage:function(a){return a+" registros por página"},formatShowingRows:function(a,b,c){return"Mostrando de "+a+" a "+b+" registros de "+c+" registros en total"},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se encontraron registros"},formatRefresh:function(){return"Refrescar"},formatToggle:function(){return"Alternar"},formatColumns:function(){return"Columnas"},formatAllRows:function(){return"Todo"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["es-NI"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-SP.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-SP.min.js new file mode 100644 index 0000000..514507b --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-es-SP.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["es-SP"]={formatLoadingMessage:function(){return"Cargando, por favor espera..."},formatRecordsPerPage:function(a){return a+" registros por página."},formatShowingRows:function(a,b,c){return a+" - "+b+" de "+c+" registros."},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se han encontrado registros."},formatRefresh:function(){return"Actualizar"},formatToggle:function(){return"Alternar"},formatColumns:function(){return"Columnas"},formatAllRows:function(){return"Todo"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["es-SP"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-et-EE.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-et-EE.min.js new file mode 100644 index 0000000..20ebe25 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-et-EE.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["et-EE"]={formatLoadingMessage:function(){return"Päring käib, palun oota..."},formatRecordsPerPage:function(a){return a+" rida lehe kohta"},formatShowingRows:function(a,b,c){return"Näitan tulemusi "+a+" kuni "+b+" - kokku "+c+" tulemust"},formatSearch:function(){return"Otsi"},formatNoMatches:function(){return"Päringu tingimustele ei vastanud ühtegi tulemust"},formatPaginationSwitch:function(){return"Näita/Peida lehtedeks jagamine"},formatRefresh:function(){return"Värskenda"},formatToggle:function(){return"Lülita"},formatColumns:function(){return"Veerud"},formatAllRows:function(){return"Kõik"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["et-EE"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-eu-EU.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-eu-EU.min.js new file mode 100644 index 0000000..bc4a479 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-eu-EU.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["eu-EU"]={formatLoadingMessage:function(){return"Itxaron mesedez..."},formatRecordsPerPage:function(a){return a+" emaitza orriko."},formatShowingRows:function(a,b,c){return c+" erregistroetatik "+a+"etik "+b+"erakoak erakusten."},formatSearch:function(){return"Bilatu"},formatNoMatches:function(){return"Ez da emaitzarik aurkitu"},formatPaginationSwitch:function(){return"Ezkutatu/Erakutsi orrikatzea"},formatRefresh:function(){return"Eguneratu"},formatToggle:function(){return"Ezkutatu/Erakutsi"},formatColumns:function(){return"Zutabeak"},formatAllRows:function(){return"Guztiak"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["eu-EU"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-fa-IR.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-fa-IR.min.js new file mode 100644 index 0000000..ba09033 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-fa-IR.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["fa-IR"]={formatLoadingMessage:function(){return"در حال بارگذاری, لطفا صبر کنید..."},formatRecordsPerPage:function(a){return a+" رکورد در صفحه"},formatShowingRows:function(a,b,c){return"نمایش "+a+" تا "+b+" از "+c+" ردیف"},formatSearch:function(){return"جستجو"},formatNoMatches:function(){return"رکوردی یافت نشد."},formatPaginationSwitch:function(){return"نمایش/مخفی صفحه بندی"},formatRefresh:function(){return"به روز رسانی"},formatToggle:function(){return"تغییر نمایش"},formatColumns:function(){return"سطر ها"},formatAllRows:function(){return"همه"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["fa-IR"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-fr-BE.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-fr-BE.min.js new file mode 100644 index 0000000..92ac742 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-fr-BE.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["fr-BE"]={formatLoadingMessage:function(){return"Chargement en cours..."},formatRecordsPerPage:function(a){return a+" entrées par page"},formatShowingRows:function(a,b,c){return"Affiche de"+a+" à "+b+" sur "+c+" lignes"},formatSearch:function(){return"Recherche"},formatNoMatches:function(){return"Pas de fichiers trouvés"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["fr-BE"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-fr-FR.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-fr-FR.min.js new file mode 100644 index 0000000..c87c951 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-fr-FR.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["fr-FR"]={formatLoadingMessage:function(){return"Chargement en cours, patientez, s´il vous plaît ..."},formatRecordsPerPage:function(a){return a+" lignes par page"},formatShowingRows:function(a,b,c){return"Affichage des lignes "+a+" à "+b+" sur "+c+" lignes au total"},formatSearch:function(){return"Rechercher"},formatNoMatches:function(){return"Aucun résultat trouvé"},formatPaginationSwitch:function(){return"Montrer/Masquer pagination"},formatRefresh:function(){return"Rafraîchir"},formatToggle:function(){return"Alterner"},formatColumns:function(){return"Colonnes"},formatAllRows:function(){return"Tous"},formatExport:function(){return"Exporter les données"},formatClearFilters:function(){return"Vider les filtres"},formatMultipleSort:function(){return"Tri avancé"},formatAddLevel:function(){return"Ajouter un niveau"},formatDeleteLevel:function(){return"Supprimer un niveau"},formatColumn:function(){return"Colonne"},formatOrder:function(){return"Ordre"},formatSortBy:function(){return"Trier par"},formatThenBy:function(){return"Puis par"},formatSort:function(){return"Trier"},formatCancel:function(){return"Annuler"},formatDuplicateAlertTitle:function(){return"Doublon(s) détecté(s)!"},formatDuplicateAlertDescription:function(){return"Supprimez ou changez les colonnes dupliquées."},formatSortOrders:function(){return{asc:"Croissant",desc:"Décroissant"}},formatAdvancedSearch:function(){return"Recherche avancée"},formatAdvancedCloseButton:function(){return"Fermer"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["fr-FR"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-he-IL.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-he-IL.min.js new file mode 100644 index 0000000..ce8de42 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-he-IL.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["he-IL"]={formatLoadingMessage:function(){return"טוען, נא להמתין..."},formatRecordsPerPage:function(a){return a+" שורות בעמוד"},formatShowingRows:function(a,b,c){return"מציג "+a+" עד "+b+" מ-"+c+" שורות"},formatSearch:function(){return"חיפוש"},formatNoMatches:function(){return"לא נמצאו רשומות תואמות"},formatPaginationSwitch:function(){return"הסתר/הצג מספור דפים"},formatRefresh:function(){return"רענן"},formatToggle:function(){return"החלף תצוגה"},formatColumns:function(){return"עמודות"},formatAllRows:function(){return"הכל"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["he-IL"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-hr-HR.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-hr-HR.min.js new file mode 100644 index 0000000..6ca01e6 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-hr-HR.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["hr-HR"]={formatLoadingMessage:function(){return"Molimo pričekajte ..."},formatRecordsPerPage:function(a){return a+" broj zapisa po stranici"},formatShowingRows:function(a,b,c){return"Prikazujem "+a+". - "+b+". od ukupnog broja zapisa "+c},formatSearch:function(){return"Pretraži"},formatNoMatches:function(){return"Nije pronađen niti jedan zapis"},formatPaginationSwitch:function(){return"Prikaži/sakrij stranice"},formatRefresh:function(){return"Osvježi"},formatToggle:function(){return"Promijeni prikaz"},formatColumns:function(){return"Kolone"},formatAllRows:function(){return"Sve"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["hr-HR"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-hu-HU.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-hu-HU.min.js new file mode 100644 index 0000000..8ae75c5 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-hu-HU.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["hu-HU"]={formatLoadingMessage:function(){return"Betöltés, kérem várjon..."},formatRecordsPerPage:function(a){return a+" rekord per oldal"},formatShowingRows:function(a,b,c){return"Megjelenítve "+a+" - "+b+" / "+c+" összesen"},formatSearch:function(){return"Keresés"},formatNoMatches:function(){return"Nincs találat"},formatPaginationSwitch:function(){return"Lapozó elrejtése/megjelenítése"},formatRefresh:function(){return"Frissítés"},formatToggle:function(){return"Összecsuk/Kinyit"},formatColumns:function(){return"Oszlopok"},formatAllRows:function(){return"Összes"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["hu-HU"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-id-ID.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-id-ID.min.js new file mode 100644 index 0000000..d6cb8b8 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-id-ID.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["id-ID"]={formatLoadingMessage:function(){return"Memuat, mohon tunggu..."},formatRecordsPerPage:function(a){return a+" baris per halaman"},formatShowingRows:function(a,b,c){return"Menampilkan "+a+" sampai "+b+" dari "+c+" baris"},formatSearch:function(){return"Pencarian"},formatNoMatches:function(){return"Tidak ditemukan data yang cocok"},formatPaginationSwitch:function(){return"Sembunyikan/Tampilkan halaman"},formatRefresh:function(){return"Muat ulang"},formatToggle:function(){return"Beralih"},formatColumns:function(){return"kolom"},formatAllRows:function(){return"Semua"},formatExport:function(){return"Ekspor data"},formatClearFilters:function(){return"Bersihkan filter"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["id-ID"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-it-IT.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-it-IT.min.js new file mode 100644 index 0000000..3c6ae1c --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-it-IT.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["it-IT"]={formatLoadingMessage:function(){return"Caricamento in corso..."},formatRecordsPerPage:function(a){return a+" elementi per pagina"},formatShowingRows:function(a,b,c){return"Elementi mostrati da "+a+" a "+b+" (Numero totali di elementi "+c+")"},formatSearch:function(){return"Cerca"},formatNoMatches:function(){return"Nessun elemento trovato"},formatPaginationSwitch:function(){return"Nascondi/Mostra paginazione"},formatRefresh:function(){return"Aggiorna"},formatToggle:function(){return"Attiva/Disattiva"},formatColumns:function(){return"Colonne"},formatAllRows:function(){return"Tutto"},formatExport:function(){return"Esporta dati"},formatClearFilters:function(){return"Pulisci filtri"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["it-IT"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ja-JP.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ja-JP.min.js new file mode 100644 index 0000000..fae4e99 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ja-JP.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["ja-JP"]={formatLoadingMessage:function(){return"読み込み中です。少々お待ちください。"},formatRecordsPerPage:function(a){return"ページ当たり最大"+a+"件"},formatShowingRows:function(a,b,c){return"全"+c+"件から、"+a+"から"+b+"件目まで表示しています"},formatSearch:function(){return"検索"},formatNoMatches:function(){return"該当するレコードが見つかりません"},formatPaginationSwitch:function(){return"ページ数を表示・非表示"},formatRefresh:function(){return"更新"},formatToggle:function(){return"トグル"},formatColumns:function(){return"列"},formatAllRows:function(){return"すべて"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["ja-JP"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ka-GE.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ka-GE.min.js new file mode 100644 index 0000000..68bfb13 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ka-GE.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["ka-GE"]={formatLoadingMessage:function(){return"იტვირთება, გთხოვთ მოიცადოთ..."},formatRecordsPerPage:function(a){return a+" ჩანაწერი თითო გვერდზე"},formatShowingRows:function(a,b,c){return"ნაჩვენებია "+a+"-დან "+b+"-მდე ჩანაწერი ჯამური "+c+"-დან"},formatSearch:function(){return"ძებნა"},formatNoMatches:function(){return"მონაცემები არ არის"},formatPaginationSwitch:function(){return"გვერდების გადამრთველის დამალვა/გამოჩენა"},formatRefresh:function(){return"განახლება"},formatToggle:function(){return"ჩართვა/გამორთვა"},formatColumns:function(){return"სვეტები"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["ka-GE"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ko-KR.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ko-KR.min.js new file mode 100644 index 0000000..4c222cf --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ko-KR.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["ko-KR"]={formatLoadingMessage:function(){return"데이터를 불러오는 중입니다..."},formatRecordsPerPage:function(a){return"페이지 당 "+a+"개 데이터 출력"},formatShowingRows:function(a,b,c){return"전체 "+c+"개 중 "+a+"~"+b+"번째 데이터 출력,"},formatSearch:function(){return"검색"},formatNoMatches:function(){return"조회된 데이터가 없습니다."},formatRefresh:function(){return"새로 고침"},formatToggle:function(){return"전환"},formatColumns:function(){return"컬럼 필터링"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["ko-KR"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ms-MY.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ms-MY.min.js new file mode 100644 index 0000000..7a6bcb4 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ms-MY.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["ms-MY"]={formatLoadingMessage:function(){return"Permintaan sedang dimuatkan. Sila tunggu sebentar..."},formatRecordsPerPage:function(a){return a+" rekod setiap muka surat"},formatShowingRows:function(a,b,c){return"Sedang memaparkan rekod "+a+" hingga "+b+" daripada jumlah "+c+" rekod"},formatSearch:function(){return"Cari"},formatNoMatches:function(){return"Tiada rekod yang menyamai permintaan"},formatPaginationSwitch:function(){return"Tunjuk/sembunyi muka surat"},formatRefresh:function(){return"Muatsemula"},formatToggle:function(){return"Tukar"},formatColumns:function(){return"Lajur"},formatAllRows:function(){return"Semua"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["ms-MY"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-nb-NO.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-nb-NO.min.js new file mode 100644 index 0000000..9853b41 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-nb-NO.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["nb-NO"]={formatLoadingMessage:function(){return"Oppdaterer, vennligst vent..."},formatRecordsPerPage:function(a){return a+" poster pr side"},formatShowingRows:function(a,b,c){return"Viser "+a+" til "+b+" av "+c+" rekker"},formatSearch:function(){return"Søk"},formatNoMatches:function(){return"Ingen poster funnet"},formatRefresh:function(){return"Oppdater"},formatToggle:function(){return"Endre"},formatColumns:function(){return"Kolonner"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["nb-NO"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-nl-NL.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-nl-NL.min.js new file mode 100644 index 0000000..dc24dc6 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-nl-NL.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["nl-NL"]={formatLoadingMessage:function(){return"Laden, even geduld..."},formatRecordsPerPage:function(a){return a+" records per pagina"},formatShowingRows:function(a,b,c){return"Toon "+a+" tot "+b+" van "+c+" record"+(c>1?"s":"")},formatDetailPagination:function(a){return"Toon "+a+" record"+(a>1?"s":"")},formatSearch:function(){return"Zoeken"},formatNoMatches:function(){return"Geen resultaten gevonden"},formatRefresh:function(){return"Vernieuwen"},formatToggle:function(){return"Omschakelen"},formatColumns:function(){return"Kolommen"},formatAllRows:function(){return"Alle"},formatPaginationSwitch:function(){return"Verberg/Toon paginatie"},formatExport:function(){return"Exporteer data"},formatClearFilters:function(){return"Verwijder filters"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["nl-NL"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-pl-PL.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-pl-PL.min.js new file mode 100644 index 0000000..6a8f2d2 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-pl-PL.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["pl-PL"]={formatLoadingMessage:function(){return"Ładowanie, proszę czekać..."},formatRecordsPerPage:function(a){return a+" rekordów na stronę"},formatShowingRows:function(a,b,c){return"Wyświetlanie rekordów od "+a+" do "+b+" z "+c},formatSearch:function(){return"Szukaj"},formatNoMatches:function(){return"Niestety, nic nie znaleziono"},formatRefresh:function(){return"Odśwież"},formatToggle:function(){return"Przełącz"},formatColumns:function(){return"Kolumny"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["pl-PL"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-pt-BR.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-pt-BR.min.js new file mode 100644 index 0000000..28e8149 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-pt-BR.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["pt-BR"]={formatLoadingMessage:function(){return"Carregando, aguarde..."},formatRecordsPerPage:function(a){return a+" registros por página"},formatShowingRows:function(a,b,c){return"Exibindo "+a+" até "+b+" de "+c+" linhas"},formatSearch:function(){return"Pesquisar"},formatRefresh:function(){return"Recarregar"},formatToggle:function(){return"Alternar"},formatColumns:function(){return"Colunas"},formatPaginationSwitch:function(){return"Ocultar/Exibir paginação"},formatNoMatches:function(){return"Nenhum registro encontrado"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["pt-BR"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-pt-PT.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-pt-PT.min.js new file mode 100644 index 0000000..d7941bd --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-pt-PT.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["pt-PT"]={formatLoadingMessage:function(){return"A carregar, por favor aguarde..."},formatRecordsPerPage:function(a){return a+" registos por página"},formatShowingRows:function(a,b,c){return"A mostrar "+a+" até "+b+" de "+c+" linhas"},formatSearch:function(){return"Pesquisa"},formatNoMatches:function(){return"Nenhum registo encontrado"},formatPaginationSwitch:function(){return"Esconder/Mostrar paginação"},formatRefresh:function(){return"Atualizar"},formatToggle:function(){return"Alternar"},formatColumns:function(){return"Colunas"},formatAllRows:function(){return"Tudo"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["pt-PT"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ro-RO.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ro-RO.min.js new file mode 100644 index 0000000..e394c8d --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ro-RO.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["ro-RO"]={formatLoadingMessage:function(){return"Se incarca, va rugam asteptati..."},formatRecordsPerPage:function(a){return a+" inregistrari pe pagina"},formatShowingRows:function(a,b,c){return"Arata de la "+a+" pana la "+b+" din "+c+" randuri"},formatSearch:function(){return"Cauta"},formatNoMatches:function(){return"Nu au fost gasite inregistrari"},formatPaginationSwitch:function(){return"Ascunde/Arata paginatia"},formatRefresh:function(){return"Reincarca"},formatToggle:function(){return"Comuta"},formatColumns:function(){return"Coloane"},formatAllRows:function(){return"Toate"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["ro-RO"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ru-RU.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ru-RU.min.js new file mode 100644 index 0000000..52b63e4 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ru-RU.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["ru-RU"]={formatLoadingMessage:function(){return"Пожалуйста, подождите, идёт загрузка..."},formatRecordsPerPage:function(a){return a+" записей на страницу"},formatShowingRows:function(a,b,c){return"Записи с "+a+" по "+b+" из "+c},formatSearch:function(){return"Поиск"},formatNoMatches:function(){return"Ничего не найдено"},formatRefresh:function(){return"Обновить"},formatToggle:function(){return"Переключить"},formatColumns:function(){return"Колонки"},formatClearFilters:function(){return"Очистить фильтры"},formatMultipleSort:function(){return"Множественная сортировка"},formatAddLevel:function(){return"Добавить уровень"},formatDeleteLevel:function(){return"Удалить уровень"},formatColumn:function(){return"Колонка"},formatOrder:function(){return"Порядок"},formatSortBy:function(){return"Сортировать по"},formatThenBy:function(){return"затем по"},formatSort:function(){return"Сортировать"},formatCancel:function(){return"Отмена"},formatDuplicateAlertTitle:function(){return"Дублирование колонок!"},formatDuplicateAlertDescription:function(){return"Удалите, пожалуйста, дублирующую колонку, или замените ее на другую."}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["ru-RU"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-sk-SK.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-sk-SK.min.js new file mode 100644 index 0000000..212226f --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-sk-SK.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["sk-SK"]={formatLoadingMessage:function(){return"Prosím čakajte ..."},formatRecordsPerPage:function(a){return a+" záznamov na stranu"},formatShowingRows:function(a,b,c){return"Zobrazená "+a+". - "+b+". položka z celkových "+c},formatSearch:function(){return"Vyhľadávanie"},formatNoMatches:function(){return"Nenájdená žiadna vyhovujúca položka"},formatPaginationSwitch:function(){return"Skry/Zobraz stránkovanie"},formatRefresh:function(){return"Obnoviť"},formatToggle:function(){return"Prepni"},formatColumns:function(){return"Stĺpce"},formatAllRows:function(){return"Všetky"},formatExport:function(){return"Exportuj dáta"},formatClearFilters:function(){return"Odstráň filtre"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["sk-SK"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-sv-SE.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-sv-SE.min.js new file mode 100644 index 0000000..c777661 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-sv-SE.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["sv-SE"]={formatLoadingMessage:function(){return"Laddar, vänligen vänta..."},formatRecordsPerPage:function(a){return a+" rader per sida"},formatShowingRows:function(a,b,c){return"Visa "+a+" till "+b+" av "+c+" rader"},formatSearch:function(){return"Sök"},formatNoMatches:function(){return"Inga matchande resultat funna."},formatRefresh:function(){return"Uppdatera"},formatToggle:function(){return"Skifta"},formatColumns:function(){return"kolumn"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["sv-SE"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-th-TH.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-th-TH.min.js new file mode 100644 index 0000000..e575bfd --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-th-TH.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["th-TH"]={formatLoadingMessage:function(){return"กำลังโหลดข้อมูล, กรุณารอสักครู่..."},formatRecordsPerPage:function(a){return a+" รายการต่อหน้า"},formatShowingRows:function(a,b,c){return"รายการที่ "+a+" ถึง "+b+" จากทั้งหมด "+c+" รายการ"},formatSearch:function(){return"ค้นหา"},formatNoMatches:function(){return"ไม่พบรายการที่ค้นหา !"},formatRefresh:function(){return"รีเฟรส"},formatToggle:function(){return"สลับมุมมอง"},formatColumns:function(){return"คอลัมน์"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["th-TH"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-tr-TR.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-tr-TR.min.js new file mode 100644 index 0000000..9a6aa9b --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-tr-TR.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["tr-TR"]={formatLoadingMessage:function(){return"Yükleniyor, lütfen bekleyin..."},formatRecordsPerPage:function(a){return"Sayfa başına "+a+" kayıt."},formatShowingRows:function(a,b,c){return c+" kayıttan "+a+"-"+b+" arası gösteriliyor."},formatSearch:function(){return"Ara"},formatNoMatches:function(){return"Eşleşen kayıt bulunamadı."},formatRefresh:function(){return"Yenile"},formatToggle:function(){return"Değiştir"},formatColumns:function(){return"Sütunlar"},formatAllRows:function(){return"Tüm Satırlar"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["tr-TR"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-uk-UA.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-uk-UA.min.js new file mode 100644 index 0000000..72451d3 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-uk-UA.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["uk-UA"]={formatLoadingMessage:function(){return"Завантаження, будь ласка, зачекайте..."},formatRecordsPerPage:function(a){return a+" записів на сторінку"},formatShowingRows:function(a,b,c){return"Показано з "+a+" по "+b+". Всього: "+c},formatSearch:function(){return"Пошук"},formatNoMatches:function(){return"Не знайдено жодного запису"},formatRefresh:function(){return"Оновити"},formatToggle:function(){return"Змінити"},formatColumns:function(){return"Стовпці"},formatClearFilters:function(){return"Очистити фільтри"},formatMultipleSort:function(){return"Сортування за кількома стовпцями"},formatAddLevel:function(){return"Додати рівень"},formatDeleteLevel:function(){return"Видалити рівень"},formatColumn:function(){return"Стовпець"},formatOrder:function(){return"Порядок"},formatSortBy:function(){return"Сортувати за"},formatThenBy:function(){return"потім за"},formatSort:function(){return"Сортувати"},formatCancel:function(){return"Скасувати"},formatDuplicateAlertTitle:function(){return"Дублювання стовпців!"},formatDuplicateAlertDescription:function(){return"Видаліть, будь ласка, дублюючий стовпець, або замініть його на інший."}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["uk-UA"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ur-PK.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ur-PK.min.js new file mode 100644 index 0000000..7866677 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-ur-PK.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["ur-PK"]={formatLoadingMessage:function(){return"براۓ مہربانی انتظار کیجئے"},formatRecordsPerPage:function(a){return a+" ریکارڈز فی صفہ "},formatShowingRows:function(a,b,c){return"دیکھیں "+a+" سے "+b+" کے "+c+"ریکارڈز"},formatSearch:function(){return"تلاش"},formatNoMatches:function(){return"کوئی ریکارڈ نہیں ملا"},formatRefresh:function(){return"تازہ کریں"},formatToggle:function(){return"تبدیل کریں"},formatColumns:function(){return"کالم"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["ur-PK"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-uz-Latn-UZ.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-uz-Latn-UZ.min.js new file mode 100644 index 0000000..9713f33 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-uz-Latn-UZ.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["uz-Latn-UZ"]={formatLoadingMessage:function(){return"Yuklanyapti, iltimos kuting..."},formatRecordsPerPage:function(a){return a+" qator har sahifada"},formatShowingRows:function(a,b,c){return"Ko'rsatypati "+a+" dan "+b+" gacha "+c+" qatorlarni"},formatSearch:function(){return"Qidirish"},formatNoMatches:function(){return"Hech narsa topilmadi"},formatPaginationSwitch:function(){return"Sahifalashni yashirish/ko'rsatish"},formatRefresh:function(){return"Yangilash"},formatToggle:function(){return"Ko'rinish"},formatColumns:function(){return"Ustunlar"},formatAllRows:function(){return"Hammasi"},formatExport:function(){return"Eksport"},formatClearFilters:function(){return"Filtrlarni tozalash"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["uz-Latn-UZ"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-vi-VN.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-vi-VN.min.js new file mode 100644 index 0000000..000b0bb --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-vi-VN.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["vi-VN"]={formatLoadingMessage:function(){return"Đang tải..."},formatRecordsPerPage:function(a){return a+" bản ghi mỗi trang"},formatShowingRows:function(a,b,c){return"Hiển thị từ trang "+a+" đến "+b+" của "+c+" bảng ghi"},formatSearch:function(){return"Tìm kiếm"},formatNoMatches:function(){return"Không có dữ liệu"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["vi-VN"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-zh-CN.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-zh-CN.min.js new file mode 100644 index 0000000..81e27db --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-zh-CN.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["zh-CN"]={formatLoadingMessage:function(){return"正在努力地加载数据中,请稍候……"},formatRecordsPerPage:function(a){return"每页显示 "+a+" 条记录"},formatShowingRows:function(a,b,c){return"显示第 "+a+" 到第 "+b+" 条记录,总共 "+c+" 条记录"},formatSearch:function(){return"搜索"},formatNoMatches:function(){return"没有找到匹配的记录"},formatPaginationSwitch:function(){return"隐藏/显示分页"},formatRefresh:function(){return"刷新"},formatToggle:function(){return"切换"},formatColumns:function(){return"列"},formatExport:function(){return"导出数据"},formatClearFilters:function(){return"清空过滤"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["zh-CN"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-zh-TW.min.js b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-zh-TW.min.js new file mode 100644 index 0000000..4feed19 --- /dev/null +++ b/src/cps/static/js/libs/bootstrap-table/locale/bootstrap-table-zh-TW.min.js @@ -0,0 +1,7 @@ +/* +* bootstrap-table - v1.12.1 - 2018-03-12 +* https://github.com/wenzhixin/bootstrap-table +* Copyright (c) 2018 zhixin wen +* Licensed MIT License +*/ +!function(a){"use strict";a.fn.bootstrapTable.locales["zh-TW"]={formatLoadingMessage:function(){return"正在努力地載入資料,請稍候……"},formatRecordsPerPage:function(a){return"每頁顯示 "+a+" 項記錄"},formatShowingRows:function(a,b,c){return"顯示第 "+a+" 到第 "+b+" 項記錄,總共 "+c+" 項記錄"},formatSearch:function(){return"搜尋"},formatNoMatches:function(){return"沒有找到符合的結果"},formatPaginationSwitch:function(){return"隱藏/顯示分頁"},formatRefresh:function(){return"重新整理"},formatToggle:function(){return"切換"},formatColumns:function(){return"列"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["zh-TW"])}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/bootstrap.min.js b/src/cps/static/js/libs/bootstrap.min.js new file mode 100644 index 0000000..9bcd2fc --- /dev/null +++ b/src/cps/static/js/libs/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
      ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/compatibility.js b/src/cps/static/js/libs/compatibility.js new file mode 100644 index 0000000..df626a7 --- /dev/null +++ b/src/cps/static/js/libs/compatibility.js @@ -0,0 +1,639 @@ +/* Copyright 2012 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* eslint strict: ["error", "function"] */ +/* eslint-disable no-extend-native */ +/* globals VBArray, PDFJS */ + +(function compatibilityWrapper() { + 'use strict'; + +var userAgent = navigator.userAgent; + +var isAndroid = /Android/.test(userAgent); +var isAndroidPre3 = /Android\s[0-2][^\d]/.test(userAgent); +var isAndroidPre5 = /Android\s[0-4][^\d]/.test(userAgent); +var isChrome = userAgent.indexOf('Chrom') >= 0; +var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(userAgent); +var isIE = userAgent.indexOf('Trident') >= 0; +var isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent); +var isOpera = userAgent.indexOf('Opera') >= 0; +var isSafari = /Safari\//.test(userAgent) && + !/(Chrome\/|Android\s)/.test(userAgent); + +// Initializing PDFJS global object here, it case if we need to change/disable +// some PDF.js features, e.g. range requests +if (typeof PDFJS === 'undefined') { + (typeof window !== 'undefined' ? window : this).PDFJS = {}; +} + +// Checking if the typed arrays are supported +// Support: iOS<6.0 (subarray), IE<10, Android<4.0 +(function checkTypedArrayCompatibility() { + if (typeof Uint8Array !== 'undefined') { + // Support: iOS<6.0 + if (typeof Uint8Array.prototype.subarray === 'undefined') { + Uint8Array.prototype.subarray = function subarray(start, end) { + return new Uint8Array(this.slice(start, end)); + }; + Float32Array.prototype.subarray = function subarray(start, end) { + return new Float32Array(this.slice(start, end)); + }; + } + + // Support: Android<4.1 + if (typeof Float64Array === 'undefined') { + window.Float64Array = Float32Array; + } + return; + } + + function subarray(start, end) { + return new TypedArray(this.slice(start, end)); + } + + function setArrayOffset(array, offset) { + if (arguments.length < 2) { + offset = 0; + } + for (var i = 0, n = array.length; i < n; ++i, ++offset) { + this[offset] = array[i] & 0xFF; + } + } + + function TypedArray(arg1) { + var result, i, n; + if (typeof arg1 === 'number') { + result = []; + for (i = 0; i < arg1; ++i) { + result[i] = 0; + } + } else if ('slice' in arg1) { + result = arg1.slice(0); + } else { + result = []; + for (i = 0, n = arg1.length; i < n; ++i) { + result[i] = arg1[i]; + } + } + + result.subarray = subarray; + result.buffer = result; + result.byteLength = result.length; + result.set = setArrayOffset; + + if (typeof arg1 === 'object' && arg1.buffer) { + result.buffer = arg1.buffer; + } + return result; + } + + window.Uint8Array = TypedArray; + window.Int8Array = TypedArray; + + // we don't need support for set, byteLength for 32-bit array + // so we can use the TypedArray as well + window.Uint32Array = TypedArray; + window.Int32Array = TypedArray; + window.Uint16Array = TypedArray; + window.Float32Array = TypedArray; + window.Float64Array = TypedArray; +})(); + +// URL = URL || webkitURL +// Support: Safari<7, Android 4.2+ +(function normalizeURLObject() { + if (!window.URL) { + window.URL = window.webkitURL; + } +})(); + +// Object.defineProperty()? +// Support: Android<4.0, Safari<5.1 +(function checkObjectDefinePropertyCompatibility() { + if (typeof Object.defineProperty !== 'undefined') { + var definePropertyPossible = true; + try { + // some browsers (e.g. safari) cannot use defineProperty() on DOM objects + // and thus the native version is not sufficient + Object.defineProperty(new Image(), 'id', { value: 'test' }); + // ... another test for android gb browser for non-DOM objects + var Test = function Test() {}; + Test.prototype = { get id() { } }; + Object.defineProperty(new Test(), 'id', + { value: '', configurable: true, enumerable: true, writable: false }); + } catch (e) { + definePropertyPossible = false; + } + if (definePropertyPossible) { + return; + } + } + + Object.defineProperty = function objectDefineProperty(obj, name, def) { + delete obj[name]; + if ('get' in def) { + obj.__defineGetter__(name, def['get']); + } + if ('set' in def) { + obj.__defineSetter__(name, def['set']); + } + if ('value' in def) { + obj.__defineSetter__(name, function objectDefinePropertySetter(value) { + this.__defineGetter__(name, function objectDefinePropertyGetter() { + return value; + }); + return value; + }); + obj[name] = def.value; + } + }; +})(); + + +// No XMLHttpRequest#response? +// Support: IE<11, Android <4.0 +(function checkXMLHttpRequestResponseCompatibility() { + var xhrPrototype = XMLHttpRequest.prototype; + var xhr = new XMLHttpRequest(); + if (!('overrideMimeType' in xhr)) { + // IE10 might have response, but not overrideMimeType + // Support: IE10 + Object.defineProperty(xhrPrototype, 'overrideMimeType', { + value: function xmlHttpRequestOverrideMimeType(mimeType) {} + }); + } + if ('responseType' in xhr) { + return; + } + + // The worker will be using XHR, so we can save time and disable worker. + PDFJS.disableWorker = true; + + Object.defineProperty(xhrPrototype, 'responseType', { + get: function xmlHttpRequestGetResponseType() { + return this._responseType || 'text'; + }, + set: function xmlHttpRequestSetResponseType(value) { + if (value === 'text' || value === 'arraybuffer') { + this._responseType = value; + if (value === 'arraybuffer' && + typeof this.overrideMimeType === 'function') { + this.overrideMimeType('text/plain; charset=x-user-defined'); + } + } + } + }); + + // Support: IE9 + if (typeof VBArray !== 'undefined') { + Object.defineProperty(xhrPrototype, 'response', { + get: function xmlHttpRequestResponseGet() { + if (this.responseType === 'arraybuffer') { + return new Uint8Array(new VBArray(this.responseBody).toArray()); + } + return this.responseText; + } + }); + return; + } + + Object.defineProperty(xhrPrototype, 'response', { + get: function xmlHttpRequestResponseGet() { + if (this.responseType !== 'arraybuffer') { + return this.responseText; + } + var text = this.responseText; + var i, n = text.length; + var result = new Uint8Array(n); + for (i = 0; i < n; ++i) { + result[i] = text.charCodeAt(i) & 0xFF; + } + return result.buffer; + } + }); +})(); + +// window.btoa (base64 encode function) ? +// Support: IE<10 +(function checkWindowBtoaCompatibility() { + if ('btoa' in window) { + return; + } + + var digits = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + + window.btoa = function windowBtoa(chars) { + var buffer = ''; + var i, n; + for (i = 0, n = chars.length; i < n; i += 3) { + var b1 = chars.charCodeAt(i) & 0xFF; + var b2 = chars.charCodeAt(i + 1) & 0xFF; + var b3 = chars.charCodeAt(i + 2) & 0xFF; + var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4); + var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64; + var d4 = i + 2 < n ? (b3 & 0x3F) : 64; + buffer += (digits.charAt(d1) + digits.charAt(d2) + + digits.charAt(d3) + digits.charAt(d4)); + } + return buffer; + }; +})(); + +// window.atob (base64 encode function)? +// Support: IE<10 +(function checkWindowAtobCompatibility() { + if ('atob' in window) { + return; + } + + // https://github.com/davidchambers/Base64.js + var digits = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + window.atob = function (input) { + input = input.replace(/=+$/, ''); + if (input.length % 4 === 1) { + throw new Error('bad atob input'); + } + for ( + // initialize result and counters + var bc = 0, bs, buffer, idx = 0, output = ''; + // get next character + (buffer = input.charAt(idx++)); + // character found in table? + // initialize bit storage and add its ascii value + ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, + // and if not first of each 4 characters, + // convert the first 8 bits to one ascii character + bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 + ) { + // try to find character in table (0-63, not found => -1) + buffer = digits.indexOf(buffer); + } + return output; + }; +})(); + +// Function.prototype.bind? +// Support: Android<4.0, iOS<6.0 +(function checkFunctionPrototypeBindCompatibility() { + if (typeof Function.prototype.bind !== 'undefined') { + return; + } + + Function.prototype.bind = function functionPrototypeBind(obj) { + var fn = this, headArgs = Array.prototype.slice.call(arguments, 1); + var bound = function functionPrototypeBindBound() { + var args = headArgs.concat(Array.prototype.slice.call(arguments)); + return fn.apply(obj, args); + }; + return bound; + }; +})(); + +// HTMLElement dataset property +// Support: IE<11, Safari<5.1, Android<4.0 +(function checkDatasetProperty() { + var div = document.createElement('div'); + if ('dataset' in div) { + return; // dataset property exists + } + + Object.defineProperty(HTMLElement.prototype, 'dataset', { + get: function() { + if (this._dataset) { + return this._dataset; + } + + var dataset = {}; + for (var j = 0, jj = this.attributes.length; j < jj; j++) { + var attribute = this.attributes[j]; + if (attribute.name.substring(0, 5) !== 'data-') { + continue; + } + var key = attribute.name.substring(5).replace(/\-([a-z])/g, + function(all, ch) { + return ch.toUpperCase(); + }); + dataset[key] = attribute.value; + } + + Object.defineProperty(this, '_dataset', { + value: dataset, + writable: false, + enumerable: false + }); + return dataset; + }, + enumerable: true + }); +})(); + +// HTMLElement classList property +// Support: IE<10, Android<4.0, iOS<5.0 +(function checkClassListProperty() { + var div = document.createElement('div'); + if ('classList' in div) { + return; // classList property exists + } + + function changeList(element, itemName, add, remove) { + var s = element.className || ''; + var list = s.split(/\s+/g); + if (list[0] === '') { + list.shift(); + } + var index = list.indexOf(itemName); + if (index < 0 && add) { + list.push(itemName); + } + if (index >= 0 && remove) { + list.splice(index, 1); + } + element.className = list.join(' '); + return (index >= 0); + } + + var classListPrototype = { + add: function(name) { + changeList(this.element, name, true, false); + }, + contains: function(name) { + return changeList(this.element, name, false, false); + }, + remove: function(name) { + changeList(this.element, name, false, true); + }, + toggle: function(name) { + changeList(this.element, name, true, true); + } + }; + + Object.defineProperty(HTMLElement.prototype, 'classList', { + get: function() { + if (this._classList) { + return this._classList; + } + + var classList = Object.create(classListPrototype, { + element: { + value: this, + writable: false, + enumerable: true + } + }); + Object.defineProperty(this, '_classList', { + value: classList, + writable: false, + enumerable: false + }); + return classList; + }, + enumerable: true + }); +})(); + +// Check console compatibility +// In older IE versions the console object is not available +// unless console is open. +// Support: IE<10 +(function checkConsoleCompatibility() { + if (!('console' in window)) { + window.console = { + log: function() {}, + error: function() {}, + warn: function() {} + }; + } else if (!('bind' in console.log)) { + // native functions in IE9 might not have bind + console.log = (function(fn) { + return function(msg) { return fn(msg); }; + })(console.log); + console.error = (function(fn) { + return function(msg) { return fn(msg); }; + })(console.error); + console.warn = (function(fn) { + return function(msg) { return fn(msg); }; + })(console.warn); + } +})(); + +// Check onclick compatibility in Opera +// Support: Opera<15 +(function checkOnClickCompatibility() { + // workaround for reported Opera bug DSK-354448: + // onclick fires on disabled buttons with opaque content + function ignoreIfTargetDisabled(event) { + if (isDisabled(event.target)) { + event.stopPropagation(); + } + } + function isDisabled(node) { + return node.disabled || (node.parentNode && isDisabled(node.parentNode)); + } + if (isOpera) { + // use browser detection since we cannot feature-check this bug + document.addEventListener('click', ignoreIfTargetDisabled, true); + } +})(); + +// Checks if possible to use URL.createObjectURL() +// Support: IE +(function checkOnBlobSupport() { + // sometimes IE loosing the data created with createObjectURL(), see #3977 + if (isIE) { + PDFJS.disableCreateObjectURL = true; + } +})(); + +// Checks if navigator.language is supported +(function checkNavigatorLanguage() { + if ('language' in navigator) { + return; + } + PDFJS.locale = navigator.userLanguage || 'en-US'; +})(); + +// Support: Safari 6.0+, Android<3.0, Chrome 39/40, iOS +(function checkRangeRequests() { + // Safari has issues with cached range requests see: + // https://github.com/mozilla/pdf.js/issues/3260 + // Last tested with version 6.0.4. + + // Older versions of Android (pre 3.0) has issues with range requests, see: + // https://github.com/mozilla/pdf.js/issues/3381. + // Make sure that we only match webkit-based Android browsers, + // since Firefox/Fennec works as expected. + + // Range requests are broken in Chrome 39 and 40, https://crbug.com/442318 + if (isSafari || isAndroidPre3 || isChromeWithRangeBug || isIOS) { + PDFJS.disableRange = true; + PDFJS.disableStream = true; + } +})(); + +// Check if the browser supports manipulation of the history. +// Support: IE<10, Android<4.2 +(function checkHistoryManipulation() { + // Android 2.x has so buggy pushState support that it was removed in + // Android 3.0 and restored as late as in Android 4.2. + // Support: Android 2.x + if (!history.pushState || isAndroidPre3) { + PDFJS.disableHistory = true; + } +})(); + +// Support: IE<11, Chrome<21, Android<4.4, Safari<6 +(function checkSetPresenceInImageData() { + // IE < 11 will use window.CanvasPixelArray which lacks set function. + if (window.CanvasPixelArray) { + if (typeof window.CanvasPixelArray.prototype.set !== 'function') { + window.CanvasPixelArray.prototype.set = function(arr) { + for (var i = 0, ii = this.length; i < ii; i++) { + this[i] = arr[i]; + } + }; + } + } else { + // Old Chrome and Android use an inaccessible CanvasPixelArray prototype. + // Because we cannot feature detect it, we rely on user agent parsing. + var polyfill = false, versionMatch; + if (isChrome) { + versionMatch = userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); + // Chrome < 21 lacks the set function. + polyfill = versionMatch && parseInt(versionMatch[2]) < 21; + } else if (isAndroid) { + // Android < 4.4 lacks the set function. + // Android >= 4.4 will contain Chrome in the user agent, + // thus pass the Chrome check above and not reach this block. + polyfill = isAndroidPre5; + } else if (isSafari) { + versionMatch = userAgent. + match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//); + // Safari < 6 lacks the set function. + polyfill = versionMatch && parseInt(versionMatch[1]) < 6; + } + + if (polyfill) { + var contextPrototype = window.CanvasRenderingContext2D.prototype; + var createImageData = contextPrototype.createImageData; + contextPrototype.createImageData = function(w, h) { + var imageData = createImageData.call(this, w, h); + imageData.data.set = function(arr) { + for (var i = 0, ii = this.length; i < ii; i++) { + this[i] = arr[i]; + } + }; + return imageData; + }; + // this closure will be kept referenced, so clear its vars + contextPrototype = null; + } + } +})(); + +// Support: IE<10, Android<4.0, iOS +(function checkRequestAnimationFrame() { + function fakeRequestAnimationFrame(callback) { + window.setTimeout(callback, 20); + } + + if (isIOS) { + // requestAnimationFrame on iOS is broken, replacing with fake one. + window.requestAnimationFrame = fakeRequestAnimationFrame; + return; + } + if ('requestAnimationFrame' in window) { + return; + } + window.requestAnimationFrame = + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || + fakeRequestAnimationFrame; +})(); + +// Support: Android, iOS +(function checkCanvasSizeLimitation() { + if (isIOS || isAndroid) { + // 5MP + PDFJS.maxCanvasPixels = 5242880; + } +})(); + +// Disable fullscreen support for certain problematic configurations. +// Support: IE11+ (when embedded). +(function checkFullscreenSupport() { + if (isIE && window.parent !== window) { + PDFJS.disableFullscreen = true; + } +})(); + +// Provides document.currentScript support +// Support: IE, Chrome<29. +(function checkCurrentScript() { + if ('currentScript' in document) { + return; + } + Object.defineProperty(document, 'currentScript', { + get: function () { + var scripts = document.getElementsByTagName('script'); + return scripts[scripts.length - 1]; + }, + enumerable: true, + configurable: true + }); +})(); + +// Provides `input.type = 'type'` runtime failure protection. +// Support: IE9,10. +(function checkInputTypeNumberAssign() { + var el = document.createElement('input'); + try { + el.type = 'number'; + } catch (ex) { + var inputProto = el.constructor.prototype; + var typeProperty = Object.getOwnPropertyDescriptor(inputProto, 'type'); + Object.defineProperty(inputProto, 'type', { + get: function () { return typeProperty.get.call(this); }, + set: function (value) { + typeProperty.set.call(this, value === 'number' ? 'text' : value); + }, + enumerable: true, + configurable: true + }); + } +})(); + +// Provides correct document.readyState value for legacy browsers. +// Support: IE9,10. +(function checkDocumentReadyState() { + if (!document.attachEvent) { + return; + } + var documentProto = document.constructor.prototype; + var readyStateProto = Object.getOwnPropertyDescriptor(documentProto, + 'readyState'); + Object.defineProperty(documentProto, 'readyState', { + get: function () { + var value = readyStateProto.get.call(this); + return value === 'interactive' ? 'loading' : value; + }, + set: function (value) { readyStateProto.set.call(this, value); }, + enumerable: true, + configurable: true + }); +})(); + +}).call((typeof window === 'undefined') ? this : window); diff --git a/src/cps/static/js/libs/context.js b/src/cps/static/js/libs/context.js new file mode 100644 index 0000000..711a91b --- /dev/null +++ b/src/cps/static/js/libs/context.js @@ -0,0 +1,147 @@ +/*! + * context.js Library associated with > v0.9.6.2 of intention.js + * http://intentionjs.com/ + * + * Copyright 2011, 2013 Dowjones and other contributors + * Released under the MIT license + * + */ + +(function () { + + 'use strict'; + var context = function($, Intention){ + + // create a brand spankin new intention object + var intent=new Intention(), + // placeholder for the horizontal axis + horizontal_axis, + orientation_axis; + + // throttle funtion used for keeping calls to the resize responive + // callback to a minimum + function throttle(callback, interval){ + var lastExec = new Date(), + timer = null; + + return function(e){ + var d = new Date(); + if (d-lastExec < interval) { + if (timer) { + window.clearTimeout(timer); + } + var callbackWrapper = function(event){ + return function(){ + callback(event); + }; + }; + timer = window.setTimeout(callbackWrapper(e), interval); + return false; + } + callback(e); + lastExec = d; + }; + } + + // catchall + // ======================================================================= + intent.responsive([{name:'base'}]).respond('base'); + + // width context? + // ======================================================================= + horizontal_axis = intent.responsive({ + ID:'width', + contexts: [ + {name:'standard', min:840}, + {name:'tablet', min:510}, + {name:'mobile', min:0}], + // compare the return value of the callback to each context + // return true for a match + matcher: function(test, context){ + if(typeof test === 'string'){ + + return test === context.name; + } + return test>=context.min; + }, + // callback, return value is passed to matcher() + // to compare against current context + measure: function(arg){ + + if(typeof arg === 'string'){ + return arg; + } + + return $(window).width(); + }}); + + // orientation context? + // ======================================================================= + orientation_axis = intent.responsive({ + ID:'orientation', + contexts: [{name:'portrait', rotation: 0}, + {name:'landscape', rotation:90}], + matcher: function(measure, ctx){ + return measure === ctx.rotation; + }, + measure: function(){ + var test = Math.abs(window.orientation); + if(test > 0) { + test = 180 - test; + } + return test; + } + }); + + // ONE TIME CHECK AXES: + // touch device? + // ======================================================================= + intent.responsive({ + ID:'touch', + contexts:[{name:'touch'}], + matcher: function() { + return "ontouchstart" in window; + }}).respond(); + + // retina display? + // ======================================================================= + intent.responsive({ + ID: 'highres', + // contexts + contexts:[{name:'highres'}], + // matching: + matcher: function(){ + return window.devicePixelRatio > 1; + }}).respond(); + + // bind events to the window + $(window).on('resize', throttle(horizontal_axis.respond, 100)) + .on('orientationchange', horizontal_axis.respond) + .on('orientationchange', orientation_axis.respond); + + // register the current width and orientation without waiting for a window + // resize + horizontal_axis.respond(); + orientation_axis.respond(); + + $(function(){ + // at doc ready grab all of the elements in the doc + intent.elements(document); + }); + + // return the intention object so that it can be extended by other plugins + return intent; + }; + + (function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define('context', ['jquery', 'intention'], factory); + } else { + // Browser globals + root.intent = factory(root.jQuery, root.Intention); + } + }(this, function ($, Intention) { + return context($, Intention); + })); +}).call(this); \ No newline at end of file diff --git a/src/cps/static/js/libs/context.min.js b/src/cps/static/js/libs/context.min.js new file mode 100644 index 0000000..21bbcc5 --- /dev/null +++ b/src/cps/static/js/libs/context.min.js @@ -0,0 +1,10 @@ +/*! intention.js v0.9.7.3 +* http://intentionjs.com/ +* +* context.js +* +* Copyright 2011, 2013 Dowjones and other contributors +* Released under the MIT license +* +*/ +!function(){"use strict";var a=function(a,b){function c(a,b){var c=new Date,d=null;return function(e){var f=new Date;if(b>f-c){d&&window.clearTimeout(d);var g=function(b){return function(){a(b)}};return d=window.setTimeout(g(e),b),!1}a(e),c=f}}var d,e,f=new b;return f.responsive([{name:"base"}]).respond("base"),d=f.responsive({ID:"width",contexts:[{name:"standard",min:840},{name:"tablet",min:510},{name:"mobile",min:0}],matcher:function(a,b){return"string"==typeof a?a===b.name:a>=b.min},measure:function(b){return"string"==typeof b?b:a(window).width()}}),e=f.responsive({ID:"orientation",contexts:[{name:"portrait",rotation:0},{name:"landscape",rotation:90}],matcher:function(a,b){return a===b.rotation},measure:function(){var a=Math.abs(window.orientation);return a>0&&(a=180-a),a}}),f.responsive({ID:"touch",contexts:[{name:"touch"}],matcher:function(){return"ontouchstart"in window}}).respond(),f.responsive({ID:"highres",contexts:[{name:"highres"}],matcher:function(){return window.devicePixelRatio>1}}).respond(),a(window).on("resize",c(d.respond,100)).on("orientationchange",d.respond).on("orientationchange",e.respond),d.respond(),e.respond(),a(function(){f.elements(document)}),f};!function(a,b){"function"==typeof define&&define.amd?define("context",["jquery","intention"],b):a.intent=b(a.jQuery,a.Intention)}(this,function(b,c){return a(b,c)})}.call(this); \ No newline at end of file diff --git a/src/cps/static/js/libs/debugger.js b/src/cps/static/js/libs/debugger.js new file mode 100644 index 0000000..33c2bc4 --- /dev/null +++ b/src/cps/static/js/libs/debugger.js @@ -0,0 +1,616 @@ +/* Copyright 2012 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +var FontInspector = (function FontInspectorClosure() { + var fonts; + var active = false; + var fontAttribute = 'data-font-name'; + function removeSelection() { + var divs = document.querySelectorAll('div[' + fontAttribute + ']'); + for (var i = 0, ii = divs.length; i < ii; ++i) { + var div = divs[i]; + div.className = ''; + } + } + function resetSelection() { + var divs = document.querySelectorAll('div[' + fontAttribute + ']'); + for (var i = 0, ii = divs.length; i < ii; ++i) { + var div = divs[i]; + div.className = 'debuggerHideText'; + } + } + function selectFont(fontName, show) { + var divs = document.querySelectorAll('div[' + fontAttribute + '=' + + fontName + ']'); + for (var i = 0, ii = divs.length; i < ii; ++i) { + var div = divs[i]; + div.className = show ? 'debuggerShowText' : 'debuggerHideText'; + } + } + function textLayerClick(e) { + if (!e.target.dataset.fontName || + e.target.tagName.toUpperCase() !== 'DIV') { + return; + } + var fontName = e.target.dataset.fontName; + var selects = document.getElementsByTagName('input'); + for (var i = 0; i < selects.length; ++i) { + var select = selects[i]; + if (select.dataset.fontName !== fontName) { + continue; + } + select.checked = !select.checked; + selectFont(fontName, select.checked); + select.scrollIntoView(); + } + } + return { + // Properties/functions needed by PDFBug. + id: 'FontInspector', + name: 'Font Inspector', + panel: null, + manager: null, + init: function init(pdfjsLib) { + var panel = this.panel; + panel.setAttribute('style', 'padding: 5px;'); + var tmp = document.createElement('button'); + tmp.addEventListener('click', resetSelection); + tmp.textContent = 'Refresh'; + panel.appendChild(tmp); + + fonts = document.createElement('div'); + panel.appendChild(fonts); + }, + cleanup: function cleanup() { + fonts.textContent = ''; + }, + enabled: false, + get active() { + return active; + }, + set active(value) { + active = value; + if (active) { + document.body.addEventListener('click', textLayerClick, true); + resetSelection(); + } else { + document.body.removeEventListener('click', textLayerClick, true); + removeSelection(); + } + }, + // FontInspector specific functions. + fontAdded: function fontAdded(fontObj, url) { + function properties(obj, list) { + var moreInfo = document.createElement('table'); + for (var i = 0; i < list.length; i++) { + var tr = document.createElement('tr'); + var td1 = document.createElement('td'); + td1.textContent = list[i]; + tr.appendChild(td1); + var td2 = document.createElement('td'); + td2.textContent = obj[list[i]].toString(); + tr.appendChild(td2); + moreInfo.appendChild(tr); + } + return moreInfo; + } + var moreInfo = properties(fontObj, ['name', 'type']); + var fontName = fontObj.loadedName; + var font = document.createElement('div'); + var name = document.createElement('span'); + name.textContent = fontName; + var download = document.createElement('a'); + if (url) { + url = /url\(['"]?([^\)"']+)/.exec(url); + download.href = url[1]; + } else if (fontObj.data) { + url = URL.createObjectURL(new Blob([fontObj.data], { + type: fontObj.mimeType + })); + download.href = url; + } + download.textContent = 'Download'; + var logIt = document.createElement('a'); + logIt.href = ''; + logIt.textContent = 'Log'; + logIt.addEventListener('click', function(event) { + event.preventDefault(); + console.log(fontObj); + }); + var select = document.createElement('input'); + select.setAttribute('type', 'checkbox'); + select.dataset.fontName = fontName; + select.addEventListener('click', (function(select, fontName) { + return (function() { + selectFont(fontName, select.checked); + }); + })(select, fontName)); + font.appendChild(select); + font.appendChild(name); + font.appendChild(document.createTextNode(' ')); + font.appendChild(download); + font.appendChild(document.createTextNode(' ')); + font.appendChild(logIt); + font.appendChild(moreInfo); + fonts.appendChild(font); + // Somewhat of a hack, should probably add a hook for when the text layer + // is done rendering. + setTimeout(function() { + if (this.active) { + resetSelection(); + } + }.bind(this), 2000); + } + }; +})(); + +var opMap; + +// Manages all the page steppers. +var StepperManager = (function StepperManagerClosure() { + var steppers = []; + var stepperDiv = null; + var stepperControls = null; + var stepperChooser = null; + var breakPoints = Object.create(null); + return { + // Properties/functions needed by PDFBug. + id: 'Stepper', + name: 'Stepper', + panel: null, + manager: null, + init: function init(pdfjsLib) { + var self = this; + this.panel.setAttribute('style', 'padding: 5px;'); + stepperControls = document.createElement('div'); + stepperChooser = document.createElement('select'); + stepperChooser.addEventListener('change', function(event) { + self.selectStepper(this.value); + }); + stepperControls.appendChild(stepperChooser); + stepperDiv = document.createElement('div'); + this.panel.appendChild(stepperControls); + this.panel.appendChild(stepperDiv); + if (sessionStorage.getItem('pdfjsBreakPoints')) { + breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints')); + } + + opMap = Object.create(null); + for (var key in pdfjsLib.OPS) { + opMap[pdfjsLib.OPS[key]] = key; + } + }, + cleanup: function cleanup() { + stepperChooser.textContent = ''; + stepperDiv.textContent = ''; + steppers = []; + }, + enabled: false, + active: false, + // Stepper specific functions. + create: function create(pageIndex) { + var debug = document.createElement('div'); + debug.id = 'stepper' + pageIndex; + debug.setAttribute('hidden', true); + debug.className = 'stepper'; + stepperDiv.appendChild(debug); + var b = document.createElement('option'); + b.textContent = 'Page ' + (pageIndex + 1); + b.value = pageIndex; + stepperChooser.appendChild(b); + var initBreakPoints = breakPoints[pageIndex] || []; + var stepper = new Stepper(debug, pageIndex, initBreakPoints); + steppers.push(stepper); + if (steppers.length === 1) { + this.selectStepper(pageIndex, false); + } + return stepper; + }, + selectStepper: function selectStepper(pageIndex, selectPanel) { + var i; + pageIndex = pageIndex | 0; + if (selectPanel) { + this.manager.selectPanel(this); + } + for (i = 0; i < steppers.length; ++i) { + var stepper = steppers[i]; + if (stepper.pageIndex === pageIndex) { + stepper.panel.removeAttribute('hidden'); + } else { + stepper.panel.setAttribute('hidden', true); + } + } + var options = stepperChooser.options; + for (i = 0; i < options.length; ++i) { + var option = options[i]; + option.selected = (option.value | 0) === pageIndex; + } + }, + saveBreakPoints: function saveBreakPoints(pageIndex, bps) { + breakPoints[pageIndex] = bps; + sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints)); + } + }; +})(); + +// The stepper for each page's IRQueue. +var Stepper = (function StepperClosure() { + // Shorter way to create element and optionally set textContent. + function c(tag, textContent) { + var d = document.createElement(tag); + if (textContent) { + d.textContent = textContent; + } + return d; + } + + function simplifyArgs(args) { + if (typeof args === 'string') { + var MAX_STRING_LENGTH = 75; + return args.length <= MAX_STRING_LENGTH ? args : + args.substr(0, MAX_STRING_LENGTH) + '...'; + } + if (typeof args !== 'object' || args === null) { + return args; + } + if ('length' in args) { // array + var simpleArgs = [], i, ii; + var MAX_ITEMS = 10; + for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) { + simpleArgs.push(simplifyArgs(args[i])); + } + if (i < args.length) { + simpleArgs.push('...'); + } + return simpleArgs; + } + var simpleObj = {}; + for (var key in args) { + simpleObj[key] = simplifyArgs(args[key]); + } + return simpleObj; + } + + function Stepper(panel, pageIndex, initialBreakPoints) { + this.panel = panel; + this.breakPoint = 0; + this.nextBreakPoint = null; + this.pageIndex = pageIndex; + this.breakPoints = initialBreakPoints; + this.currentIdx = -1; + this.operatorListIdx = 0; + } + Stepper.prototype = { + init: function init(operatorList) { + var panel = this.panel; + var content = c('div', 'c=continue, s=step'); + var table = c('table'); + content.appendChild(table); + table.cellSpacing = 0; + var headerRow = c('tr'); + table.appendChild(headerRow); + headerRow.appendChild(c('th', 'Break')); + headerRow.appendChild(c('th', 'Idx')); + headerRow.appendChild(c('th', 'fn')); + headerRow.appendChild(c('th', 'args')); + panel.appendChild(content); + this.table = table; + this.updateOperatorList(operatorList); + }, + updateOperatorList: function updateOperatorList(operatorList) { + var self = this; + + function cboxOnClick() { + var x = +this.dataset.idx; + if (this.checked) { + self.breakPoints.push(x); + } else { + self.breakPoints.splice(self.breakPoints.indexOf(x), 1); + } + StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints); + } + + var MAX_OPERATORS_COUNT = 15000; + if (this.operatorListIdx > MAX_OPERATORS_COUNT) { + return; + } + + var chunk = document.createDocumentFragment(); + var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT, + operatorList.fnArray.length); + for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) { + var line = c('tr'); + line.className = 'line'; + line.dataset.idx = i; + chunk.appendChild(line); + var checked = this.breakPoints.indexOf(i) !== -1; + var args = operatorList.argsArray[i] || []; + + var breakCell = c('td'); + var cbox = c('input'); + cbox.type = 'checkbox'; + cbox.className = 'points'; + cbox.checked = checked; + cbox.dataset.idx = i; + cbox.onclick = cboxOnClick; + + breakCell.appendChild(cbox); + line.appendChild(breakCell); + line.appendChild(c('td', i.toString())); + var fn = opMap[operatorList.fnArray[i]]; + var decArgs = args; + if (fn === 'showText') { + var glyphs = args[0]; + var newArgs = []; + var str = []; + for (var j = 0; j < glyphs.length; j++) { + var glyph = glyphs[j]; + if (typeof glyph === 'object' && glyph !== null) { + str.push(glyph.fontChar); + } else { + if (str.length > 0) { + newArgs.push(str.join('')); + str = []; + } + newArgs.push(glyph); // null or number + } + } + if (str.length > 0) { + newArgs.push(str.join('')); + } + decArgs = [newArgs]; + } + line.appendChild(c('td', fn)); + line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs)))); + } + if (operatorsToDisplay < operatorList.fnArray.length) { + line = c('tr'); + var lastCell = c('td', '...'); + lastCell.colspan = 4; + chunk.appendChild(lastCell); + } + this.operatorListIdx = operatorList.fnArray.length; + this.table.appendChild(chunk); + }, + getNextBreakPoint: function getNextBreakPoint() { + this.breakPoints.sort(function(a, b) { return a - b; }); + for (var i = 0; i < this.breakPoints.length; i++) { + if (this.breakPoints[i] > this.currentIdx) { + return this.breakPoints[i]; + } + } + return null; + }, + breakIt: function breakIt(idx, callback) { + StepperManager.selectStepper(this.pageIndex, true); + var self = this; + var dom = document; + self.currentIdx = idx; + var listener = function(e) { + switch (e.keyCode) { + case 83: // step + dom.removeEventListener('keydown', listener); + self.nextBreakPoint = self.currentIdx + 1; + self.goTo(-1); + callback(); + break; + case 67: // continue + dom.removeEventListener('keydown', listener); + var breakPoint = self.getNextBreakPoint(); + self.nextBreakPoint = breakPoint; + self.goTo(-1); + callback(); + break; + } + }; + dom.addEventListener('keydown', listener); + self.goTo(idx); + }, + goTo: function goTo(idx) { + var allRows = this.panel.getElementsByClassName('line'); + for (var x = 0, xx = allRows.length; x < xx; ++x) { + var row = allRows[x]; + if ((row.dataset.idx | 0) === idx) { + row.style.backgroundColor = 'rgb(251,250,207)'; + row.scrollIntoView(); + } else { + row.style.backgroundColor = null; + } + } + } + }; + return Stepper; +})(); + +var Stats = (function Stats() { + var stats = []; + function clear(node) { + while (node.hasChildNodes()) { + node.removeChild(node.lastChild); + } + } + function getStatIndex(pageNumber) { + for (var i = 0, ii = stats.length; i < ii; ++i) { + if (stats[i].pageNumber === pageNumber) { + return i; + } + } + return false; + } + return { + // Properties/functions needed by PDFBug. + id: 'Stats', + name: 'Stats', + panel: null, + manager: null, + init: function init(pdfjsLib) { + this.panel.setAttribute('style', 'padding: 5px;'); + pdfjsLib.PDFJS.enableStats = true; + }, + enabled: false, + active: false, + // Stats specific functions. + add: function(pageNumber, stat) { + if (!stat) { + return; + } + var statsIndex = getStatIndex(pageNumber); + if (statsIndex !== false) { + var b = stats[statsIndex]; + this.panel.removeChild(b.div); + stats.splice(statsIndex, 1); + } + var wrapper = document.createElement('div'); + wrapper.className = 'stats'; + var title = document.createElement('div'); + title.className = 'title'; + title.textContent = 'Page: ' + pageNumber; + var statsDiv = document.createElement('div'); + statsDiv.textContent = stat.toString(); + wrapper.appendChild(title); + wrapper.appendChild(statsDiv); + stats.push({ pageNumber: pageNumber, div: wrapper }); + stats.sort(function(a, b) { return a.pageNumber - b.pageNumber; }); + clear(this.panel); + for (var i = 0, ii = stats.length; i < ii; ++i) { + this.panel.appendChild(stats[i].div); + } + }, + cleanup: function () { + stats = []; + clear(this.panel); + } + }; +})(); + +// Manages all the debugging tools. +var PDFBug = (function PDFBugClosure() { + var panelWidth = 300; + var buttons = []; + var activePanel = null; + + return { + tools: [ + FontInspector, + StepperManager, + Stats + ], + enable: function(ids) { + var all = false, tools = this.tools; + if (ids.length === 1 && ids[0] === 'all') { + all = true; + } + for (var i = 0; i < tools.length; ++i) { + var tool = tools[i]; + if (all || ids.indexOf(tool.id) !== -1) { + tool.enabled = true; + } + } + if (!all) { + // Sort the tools by the order they are enabled. + tools.sort(function(a, b) { + var indexA = ids.indexOf(a.id); + indexA = indexA < 0 ? tools.length : indexA; + var indexB = ids.indexOf(b.id); + indexB = indexB < 0 ? tools.length : indexB; + return indexA - indexB; + }); + } + }, + init: function init(pdfjsLib, container) { + /* + * Basic Layout: + * PDFBug + * Controls + * Panels + * Panel + * Panel + * ... + */ + var ui = document.createElement('div'); + ui.id = 'PDFBug'; + + var controls = document.createElement('div'); + controls.setAttribute('class', 'controls'); + ui.appendChild(controls); + + var panels = document.createElement('div'); + panels.setAttribute('class', 'panels'); + ui.appendChild(panels); + + container.appendChild(ui); + container.style.right = panelWidth + 'px'; + + // Initialize all the debugging tools. + var tools = this.tools; + var self = this; + for (var i = 0; i < tools.length; ++i) { + var tool = tools[i]; + var panel = document.createElement('div'); + var panelButton = document.createElement('button'); + panelButton.textContent = tool.name; + panelButton.addEventListener('click', (function(selected) { + return function(event) { + event.preventDefault(); + self.selectPanel(selected); + }; + })(i)); + controls.appendChild(panelButton); + panels.appendChild(panel); + tool.panel = panel; + tool.manager = this; + if (tool.enabled) { + tool.init(pdfjsLib); + } else { + panel.textContent = tool.name + ' is disabled. To enable add ' + + ' "' + tool.id + '" to the pdfBug parameter ' + + 'and refresh (separate multiple by commas).'; + } + buttons.push(panelButton); + } + this.selectPanel(0); + }, + cleanup: function cleanup() { + for (var i = 0, ii = this.tools.length; i < ii; i++) { + if (this.tools[i].enabled) { + this.tools[i].cleanup(); + } + } + }, + selectPanel: function selectPanel(index) { + if (typeof index !== 'number') { + index = this.tools.indexOf(index); + } + if (index === activePanel) { + return; + } + activePanel = index; + var tools = this.tools; + for (var j = 0; j < tools.length; ++j) { + if (j === index) { + buttons[j].setAttribute('class', 'active'); + tools[j].active = true; + tools[j].panel.removeAttribute('hidden'); + } else { + buttons[j].setAttribute('class', ''); + tools[j].active = false; + tools[j].panel.setAttribute('hidden', 'true'); + } + } + } + }; +})(); diff --git a/src/cps/static/js/libs/epub.min.js b/src/cps/static/js/libs/epub.min.js new file mode 100644 index 0000000..4d43f06 --- /dev/null +++ b/src/cps/static/js/libs/epub.min.js @@ -0,0 +1,8 @@ +/*! + * @overview RSVP - a tiny implementation of Promises/A+. + * @copyright Copyright (c) 2016 Yehuda Katz, Tom Dale, Stefan Penner and contributors + * @license Licensed under MIT license + * See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE + * @version 3.5.0 + */ +"use strict";!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?b(exports):"function"==typeof define&&define.amd?define(["exports"],b):b(a.RSVP=a.RSVP||{})}(this,function(a){function b(a,b){for(var c=0,d=a.length;c1)throw new Error("Second argument not supported");if("object"!=typeof a)throw new TypeError("Argument must be an object");return h.prototype=a,new h},Aa=[],Ba=void 0,Ca=1,Da=2,Ea=new y,Fa=new y;E.prototype._validateInput=function(a){return xa(a)},E.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},E.prototype._init=function(){this._result=new Array(this.length)},E.prototype._enumerate=function(){for(var a=this.length,b=this.promise,c=this._input,d=0;b._state===Ba&&d=i)l.resolve();else{if(c&&c.cancelled)return e.remove(),this.element.removeChild(f),void l.reject(new Error("User cancelled"));h=g,b=new EPUBJS.Chapter(this.spine[h],this.store),e.displayChapter(b,this.globalLayoutProperties).then(function(a){e.pageMap.forEach(function(a){j+=1,d.push({cfi:a.start,page:j})}),e.pageMap.length%2>0&&e.spreads&&(j+=1,d.push({cfi:e.pageMap[e.pageMap.length-1].end,page:j})),setTimeout(function(){k(l)},1)})}return l.promise}.bind(this);k().then(function(){e.remove(),this.element.removeChild(f),g.resolve(d)}.bind(this),function(a){g.reject(a)});return g.promise},EPUBJS.Book.prototype.generatePagination=function(a,b,c){var d=this,e=new RSVP.defer;return this.ready.spine.promise.then(function(){d.generatePageList(a,b,c).then(function(a){d.pageList=d.contents.pageList=a,d.pagination.process(a),d.ready.pageList.resolve(d.pageList),e.resolve(d.pageList)},function(a){e.reject(a)})}),e.promise},EPUBJS.Book.prototype.loadPagination=function(a){var b;return b="string"==typeof a?JSON.parse(a):a,b&&b.length&&(this.pageList=b,this.pagination.process(this.pageList),this.ready.pageList.resolve(this.pageList)),this.pageList},EPUBJS.Book.prototype.getPageList=function(){return this.ready.pageList.promise},EPUBJS.Book.prototype.getMetadata=function(){return this.ready.metadata.promise},EPUBJS.Book.prototype.getToc=function(){return this.ready.toc.promise},EPUBJS.Book.prototype.networkListeners=function(){var a=this;window.addEventListener("offline",function(b){a.online=!1,a.settings.storage&&a.fromStorage(!0),a.trigger("book:offline")},!1),window.addEventListener("online",function(b){a.online=!0,a.settings.storage&&a.fromStorage(!1),a.trigger("book:online")},!1)},EPUBJS.Book.prototype.listenToRenderer=function(a){var b=this;a.Events.forEach(function(c){a.on(c,function(a){b.trigger(c,a)})}),a.on("renderer:visibleRangeChanged",function(a){var b,c,d,e=[];this.pageList.length>0&&(b=this.pagination.pageFromCfi(a.start),d=this.pagination.percentageFromPage(b),e.push(b),a.end&&(c=this.pagination.pageFromCfi(a.end),e.push(c)),this.trigger("book:pageChanged",{anchorPage:b,percentage:d,pageRange:e}))}.bind(this)),a.on("render:loaded",this.loadChange.bind(this))},EPUBJS.Book.prototype.loadChange=function(a){var b,c,d=EPUBJS.core.uri(a),e=EPUBJS.core.uri(this.currentChapter.absolute);d.path!=e.path?(console.warn("Miss Match",d.path,this.currentChapter.absolute),b=this.spineIndexByURL[d.filename],c=new EPUBJS.Chapter(this.spine[b],this.store),this.currentChapter=c,this.renderer.currentChapter=c,this.renderer.afterLoad(this.renderer.render.docEl),this.renderer.beforeDisplay(function(){this.renderer.afterDisplay()}.bind(this))):this._rendering||this.renderer.reformat()},EPUBJS.Book.prototype.unlistenToRenderer=function(a){a.Events.forEach(function(b){a.off(b)})},EPUBJS.Book.prototype.coverUrl=function(){var a=this.ready.cover.promise.then(function(a){return this.settings.fromStorage?this.store.getUrl(this.contents.cover):this.settings.contained?this.zip.getUrl(this.contents.cover):this.contents.cover}.bind(this));return a.then(function(a){this.cover=a}.bind(this)),a},EPUBJS.Book.prototype.loadXml=function(a){return this.settings.fromStorage?this.store.getXml(a,this.settings.encoding):this.settings.contained?this.zip.getXml(a,this.settings.encoding):EPUBJS.core.request(a,"xml",this.settings.withCredentials)},EPUBJS.Book.prototype.urlFrom=function(a){var b,c=EPUBJS.core.uri(a),d=c.protocol,e="/"==c.path[0],f=window.location,g=f.origin||f.protocol+"//"+f.host,h=document.getElementsByTagName("base");return h.length&&(b=h[0].href),c.protocol?c.origin+c.path:!d&&e?(b||g)+c.path:d||e?void 0:EPUBJS.core.resolveUrl(b||f.pathname,c.path)},EPUBJS.Book.prototype.unarchive=function(a){return this.zip=new EPUBJS.Unarchiver,this.store=this.zip,this.zip.open(a)},EPUBJS.Book.prototype.isContained=function(a){if(a instanceof ArrayBuffer)return!0;var b=EPUBJS.core.uri(a);return!(!b.extension||"epub"!=b.extension&&"zip"!=b.extension)},EPUBJS.Book.prototype.isSaved=function(a){var b;return!!localStorage&&(b=localStorage.getItem(a),!(!localStorage||null===b))},EPUBJS.Book.prototype.generateBookKey=function(a){return"epubjs:"+EPUBJS.VERSION+":"+window.location.host+":"+a},EPUBJS.Book.prototype.saveContents=function(){if(!localStorage)return!1;localStorage.setItem(this.settings.bookKey,JSON.stringify(this.contents))},EPUBJS.Book.prototype.removeSavedContents=function(){if(!localStorage)return!1;localStorage.removeItem(this.settings.bookKey)},EPUBJS.Book.prototype.renderTo=function(a){var b=this;if(EPUBJS.core.isElement(a))this.element=a;else{if("string"!=typeof a)return void console.error("Not an Element");this.element=EPUBJS.core.getEl(a)}return this.opened.then(function(){return b.renderer.initialize(b.element,b.settings.width,b.settings.height),b.metadata.direction&&b.renderer.setDirection(b.metadata.direction),b._rendered(),b.startDisplay()})},EPUBJS.Book.prototype.startDisplay=function(){return this.settings.goto?this.goto(this.settings.goto):this.settings.previousLocationCfi?this.gotoCfi(this.settings.previousLocationCfi):this.displayChapter(this.spinePos,this.settings.displayLastPage)},EPUBJS.Book.prototype.restore=function(a){var b,c=this,d=["manifest","spine","metadata","cover","toc","spineNodeIndex","spineIndexByURL","globalLayoutProperties"],e=!1,f=this.generateBookKey(a),g=localStorage.getItem(f),h=d.length;if(this.settings.clearSaved&&(e=!0),!e&&"undefined"!=g&&null!==g)for(c.contents=JSON.parse(g),b=0;b=this.spine.length)&&(console.warn("Not A Valid Location"),f=0,b=!1,e=!1),g=new EPUBJS.Chapter(this.spine[f],this.store),this._rendering=!0,this._needsAssetReplacement()&&g.registerHook("beforeChapterRender",[EPUBJS.replace.head,EPUBJS.replace.resources,EPUBJS.replace.svg],!0),h.currentChapter=g,d=h.renderer.displayChapter(g,this.globalLayoutProperties),e?h.renderer.gotoCfi(e):b&&h.renderer.lastPage(),d.then(function(a){h.spinePos=f,i.resolve(h.renderer),h.settings.fromStorage===!1&&h.settings.contained===!1&&h.preloadNextChapter(),h._rendering=!1,h._displayQ.dequeue(),0===h._displayQ.length()&&h._gotoQ.dequeue()},function(a){console.error("Could not load Chapter: "+g.absolute,a),h.trigger("book:chapterLoadFailed",g.absolute),h._rendering=!1,i.reject(a)}),i.promise):(this._q.enqueue("displayChapter",arguments),i.reject({message:"Rendering",stack:(new Error).stack}),i.promise)},EPUBJS.Book.prototype.nextPage=function(a){var a=a||new RSVP.defer;return this.isRendered?this.renderer.nextPage()?(a.resolve(!0),a.promise):this.nextChapter(a):(this._q.enqueue("nextPage",[a]),a.promise)},EPUBJS.Book.prototype.prevPage=function(a){var a=a||new RSVP.defer;return this.isRendered?this.renderer.prevPage()?(a.resolve(!0),a.promise):this.prevChapter(a):(this._q.enqueue("prevPage",[a]),a.promise)},EPUBJS.Book.prototype.nextChapter=function(a){var a=a||new RSVP.defer;if(this.spinePos0){for(var b=this.spinePos-1;this.spine[b]&&this.spine[b].linear&&"no"==this.spine[b].linear;)b--;if(b>=0)return this.displayChapter(b,!0,a)}return this.trigger("book:atStart"),a.resolve(!0),a.promise},EPUBJS.Book.prototype.getCurrentLocationCfi=function(){return!!this.isRendered&&this.renderer.currentLocationCfi},EPUBJS.Book.prototype.goto=function(a){return 0===a.indexOf("epubcfi(")?this.gotoCfi(a):a.indexOf("%")===a.length-1?this.gotoPercentage(parseInt(a.substring(0,a.length-1))/100):"number"==typeof a||isNaN(a)===!1?this.gotoPage(a):this.gotoHref(a)},EPUBJS.Book.prototype.gotoCfi=function(a,b){var c,d,e,f,g,h=b||new RSVP.defer;return this.isRendered?this._moving||this._rendering?(console.warn("Renderer is moving"),this._gotoQ.enqueue("gotoCfi",[a,h]),!1):(c=new EPUBJS.EpubCFI(a),(d=c.spinePos)!=-1&&(e=this.spine[d],f=h.promise,this._moving=!0,this.currentChapter&&this.spinePos===d?(this.renderer.gotoCfi(c),this._moving=!1,h.resolve(this.renderer.currentLocationCfi)):(e&&d!=-1||(d=0,e=this.spine[d]),g=this.displayChapter(a),g.then(function(a){this._moving=!1,h.resolve(a.currentLocationCfi)}.bind(this),function(){this._moving=!1}.bind(this))),f.then(function(){this._gotoQ.dequeue()}.bind(this)),f)):(console.warn("Not yet Rendered"),this.settings.previousLocationCfi=a,!1)},EPUBJS.Book.prototype.gotoHref=function(a,b){var c,d,e,f,g,h=b||new RSVP.defer;return this.isRendered?this._moving||this._rendering?(this._gotoQ.enqueue("gotoHref",[a,h]),!1):(c=a.split("#"),d=c[0],e=c[1]||!1,f=d.search("://")==-1?d.replace(EPUBJS.core.uri(this.settings.contentsPath).path,""):d.replace(this.settings.contentsPath,""),g=this.spineIndexByURL[f],d||(g=this.currentChapter?this.currentChapter.spinePos:0),"number"==typeof g&&(this.currentChapter&&g==this.currentChapter.spinePos?(e?this.renderer.section(e):this.renderer.firstPage(),h.resolve(this.renderer.currentLocationCfi),h.promise.then(function(){this._gotoQ.dequeue()}.bind(this)),h.promise):this.displayChapter(g).then(function(){e&&this.renderer.section(e),h.resolve(this.renderer.currentLocationCfi)}.bind(this)))):(this.settings.goto=a,!1)},EPUBJS.Book.prototype.gotoPage=function(a){var b=this.pagination.cfiFromPage(a);return this.gotoCfi(b)},EPUBJS.Book.prototype.gotoPercentage=function(a){var b=this.pagination.pageFromPercentage(a);return this.gotoPage(b)},EPUBJS.Book.prototype.preloadNextChapter=function(){var a,b=this.spinePos+1;if(b>=this.spine.length)return!1;(a=new EPUBJS.Chapter(this.spine[b]))&&EPUBJS.core.request(a.absolute)},EPUBJS.Book.prototype.storeOffline=function(){var a=this,b=EPUBJS.core.values(this.manifest);return this.store.put(b).then(function(){a.settings.stored=!0,a.trigger("book:stored")})},EPUBJS.Book.prototype.availableOffline=function(){return this.settings.stored>0},EPUBJS.Book.prototype.toStorage=function(){var a=this.settings.bookKey;this.store.isStored(a).then(function(b){return b===!0?(this.settings.stored=!0,!0):this.storeOffline().then(function(){this.store.token(a,!0)}.bind(this))}.bind(this))},EPUBJS.Book.prototype.fromStorage=function(a){EPUBJS.replace.head,EPUBJS.replace.resources,EPUBJS.replace.svg;this.contained||this.settings.contained||(this.online&&this.opened.then(this.toStorage.bind(this)),this.store&&this.settings.fromStorage&&a===!1?(this.settings.fromStorage=!1,this.store.off("offline"),this.store=!1):this.settings.fromStorage||(this.store=new EPUBJS.Storage(this.settings.credentials),this.store.on("offline",function(a){a?(this.offline=!0,this.settings.fromStorage=!0,this.trigger("book:offline")):(this.offline=!1,this.settings.fromStorage=!1,this.trigger("book:online"))}.bind(this))))},EPUBJS.Book.prototype.setStyle=function(a,b,c){var d=["color","background","background-color"];if(!this.isRendered)return this._q.enqueue("setStyle",arguments);this.settings.styles[a]=b,this.renderer.setStyle(a,b,c),d.indexOf(a)===-1&&this.renderer.reformat()},EPUBJS.Book.prototype.removeStyle=function(a){if(!this.isRendered)return this._q.enqueue("removeStyle",arguments);this.renderer.removeStyle(a),this.renderer.reformat(),delete this.settings.styles[a]},EPUBJS.Book.prototype.resetClasses=function(a){if(!this.isRendered)return this._q.enqueue("setClasses",arguments);a.constructor===String&&(a=[a]),this.settings.classes=a,this.renderer.setClasses(this.settings.classes),this.renderer.reformat()},EPUBJS.Book.prototype.addClass=function(a){if(!this.isRendered)return this._q.enqueue("addClass",arguments);this.settings.classes.indexOf(a)==-1&&this.settings.classes.push(a),this.renderer.setClasses(this.settings.classes),this.renderer.reformat()},EPUBJS.Book.prototype.removeClass=function(a){if(!this.isRendered)return this._q.enqueue("removeClass",arguments);var b=this.settings.classes.indexOf(a);b!=-1&&(delete this.settings.classes[b],this.renderer.setClasses(this.settings.classes),this.renderer.reformat())},EPUBJS.Book.prototype.addHeadTag=function(a,b){if(!this.isRendered)return this._q.enqueue("addHeadTag",arguments);this.settings.headTags[a]=b},EPUBJS.Book.prototype.useSpreads=function(a){console.warn("useSpreads is deprecated, use forceSingle or set a layoutOveride instead"),a===!1?this.forceSingle(!0):this.forceSingle(!1)},EPUBJS.Book.prototype.forceSingle=function(a){var b=void 0===a||a;this.renderer.forceSingle(b),this.settings.forceSingle=b,this.isRendered&&this.renderer.reformat()},EPUBJS.Book.prototype.setMinSpreadWidth=function(a){this.settings.minSpreadWidth=a,this.isRendered&&(this.renderer.setMinSpreadWidth(this.settings.minSpreadWidth),this.renderer.reformat())},EPUBJS.Book.prototype.setGap=function(a){this.settings.gap=a,this.isRendered&&(this.renderer.setGap(this.settings.gap),this.renderer.reformat())},EPUBJS.Book.prototype.chapter=function(a){var b,c,d=this.spineIndexByURL[a];return d&&(b=this.spine[d],c=new EPUBJS.Chapter(b,this.store,this.settings.withCredentials),c.load()),c},EPUBJS.Book.prototype.unload=function(){this.settings.restore&&localStorage&&this.saveContents(),this.unlistenToRenderer(this.renderer),this.trigger("book:unload")},EPUBJS.Book.prototype.destroy=function(){window.removeEventListener("beforeunload",this.unload),this.currentChapter&&this.currentChapter.unload(),this.unload(),this.renderer&&this.renderer.remove()},EPUBJS.Book.prototype._ready=function(){this.trigger("book:ready")},EPUBJS.Book.prototype._rendered=function(a){this.isRendered=!0,this.trigger("book:rendered"),this._q.flush()},EPUBJS.Book.prototype.applyStyles=function(a,b){a.applyStyles(this.settings.styles),b()},EPUBJS.Book.prototype.applyClasses=function(a,b){a.setClasses(this.settings.classes),b()},EPUBJS.Book.prototype.applyHeadTags=function(a,b){a.applyHeadTags(this.settings.headTags),b()},EPUBJS.Book.prototype._registerReplacements=function(a){a.registerHook("beforeChapterDisplay",this.applyStyles.bind(this,a),!0),a.registerHook("beforeChapterDisplay",this.applyHeadTags.bind(this,a),!0),a.registerHook("beforeChapterDisplay",this.applyClasses.bind(this,a),!0),a.registerHook("beforeChapterDisplay",EPUBJS.replace.hrefs.bind(this),!0)},EPUBJS.Book.prototype._needsAssetReplacement=function(){return!!this.settings.fromStorage||!!this.settings.contained},EPUBJS.Book.prototype.parseLayoutProperties=function(a){return{layout:this.settings.layoutOveride&&this.settings.layoutOveride.layout||a.layout||"reflowable",spread:this.settings.layoutOveride&&this.settings.layoutOveride.spread||a.spread||"auto",orientation:this.settings.layoutOveride&&this.settings.layoutOveride.orientation||a.orientation||"auto"}},RSVP.EventTarget.mixin(EPUBJS.Book.prototype),RSVP.on("error",function(a){console.error(a)}),EPUBJS.Chapter=function(a,b,c){this.href=a.href,this.absolute=a.url,this.id=a.id,this.spinePos=a.index,this.cfiBase=a.cfiBase,this.properties=a.properties,this.manifestProperties=a.manifestProperties,this.linear=a.linear,this.pages=1,this.store=b,this.credentials=c,this.epubcfi=new EPUBJS.EpubCFI,this.deferred=new RSVP.defer,this.loaded=this.deferred.promise,EPUBJS.Hooks.mixin(this),this.getHooks("beforeChapterRender"),this.caches={}},EPUBJS.Chapter.prototype.load=function(a,b){var c,d=a||this.store,e=b||this.credentials;return c=d?d.getXml(this.absolute):EPUBJS.core.request(this.absolute,!1,e),c.then(function(a){try{this.setDocument(a),this.deferred.resolve(this)}catch(a){this.deferred.reject({message:this.absolute+" -> "+a.message,stack:(new Error).stack})}}.bind(this)),c},EPUBJS.Chapter.prototype.render=function(a){return this.load().then(function(a){var b=a.querySelector("head"),c=a.createElement("base");return c.setAttribute("href",this.absolute),b.insertBefore(c,b.firstChild),this.contents=a,new RSVP.Promise(function(b,c){this.triggerHooks("beforeChapterRender",function(){b(a)}.bind(this),this)}.bind(this))}.bind(this)).then(function(a){return(new XMLSerializer).serializeToString(a)}.bind(this))},EPUBJS.Chapter.prototype.url=function(a){var b,c=new RSVP.defer,d=a||this.store,e=this;return d?this.tempUrl?(b=this.tempUrl,c.resolve(b)):d.getUrl(this.absolute).then(function(a){e.tempUrl=a,c.resolve(a)}):(b=this.absolute,c.resolve(b)),c.promise},EPUBJS.Chapter.prototype.setPages=function(a){this.pages=a},EPUBJS.Chapter.prototype.getPages=function(a){return this.pages},EPUBJS.Chapter.prototype.getID=function(){return this.ID},EPUBJS.Chapter.prototype.unload=function(a){this.document=null,this.tempUrl&&a&&(a.revokeUrl(this.tempUrl),this.tempUrl=!1)},EPUBJS.Chapter.prototype.setDocument=function(a){this.document=a,this.contents=a.documentElement,!this.document.evaluate&&document.evaluate&&(this.document.evaluate=document.evaluate)},EPUBJS.Chapter.prototype.cfiFromRange=function(a){var b,c,d,e,f,g,h;if(this.document){if(void 0!==document.evaluate){if(c=EPUBJS.core.getElementXPath(a.startContainer),d=EPUBJS.core.getElementXPath(a.endContainer),e=this.document.evaluate(c,this.document,EPUBJS.core.nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue,a.collapsed||(f=this.document.evaluate(d,this.document,EPUBJS.core.nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue),b=this.document.createRange(),e)try{b.setStart(e,a.startOffset),!a.collapsed&&f&&b.setEnd(f,a.endOffset)}catch(a){console.log("missed"),e=!1}e||(console.log("not found, try fuzzy match"),g=EPUBJS.core.cleanStringForXpath(a.startContainer.textContent),c="//text()[contains(.,"+g+")]",(e=this.document.evaluate(c,this.document,EPUBJS.core.nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue)&&(b.setStart(e,a.startOffset),a.collapsed||(h=EPUBJS.core.cleanStringForXpath(a.endContainer.textContent),d="//text()[contains(.,"+h+")]",(f=this.document.evaluate(d,this.document,EPUBJS.core.nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue)&&b.setEnd(f,a.endOffset))))}else b=a;return this.epubcfi.generateCfiFromRange(b,this.cfiBase)}},EPUBJS.Chapter.prototype.find=function(a){var b=this,c=[],d=a.toLowerCase(),e=function(a){for(var e,f,g,h=a.textContent.toLowerCase(),i=b.document.createRange(),j=-1,k=150;f!=-1;)f=h.indexOf(d,j+1),f!=-1&&(i=b.document.createRange(),i.setStart(a,f),i.setEnd(a,f+d.length),e=b.cfiFromRange(i),a.textContent.lengthb?1:a0?i:i+1:0===f?i:f===-1?EPUBJS.core.locationOf(a,b,c,i,h):EPUBJS.core.locationOf(a,b,c,g,i))},EPUBJS.core.indexOfSorted=function(a,b,c,d,e){var f,g=d||0,h=e||b.length,i=parseInt(g+(h-g)/2);return c||(c=function(a,b){return a>b?1:a0;){if(c=d.shift(),"text"===c.type?(e=g.childNodes[c.index],g=e.parentNode||g):g=c.id?f.getElementById(c.id):h[c.index],!g||void 0===g)return console.error("No Element For",c,a.str),!1;h=Array.prototype.slice.call(g.children)}return g},EPUBJS.EpubCFI.prototype.compare=function(a,b){if("string"==typeof a&&(a=new EPUBJS.EpubCFI(a)),"string"==typeof b&&(b=new EPUBJS.EpubCFI(b)),a.spinePos>b.spinePos)return 1;if(a.spinePosb.steps[c].index)return 1;if(a.steps[c].indexb.characterOffset?1:a.characterOffset")},EPUBJS.EpubCFI.prototype.generateRangeFromCfi=function(a,b){var c,d,e,f,g,h,i=b||document,j=i.createRange();return"string"==typeof a&&(a=this.parse(a)),a.spinePos!==-1&&(c=a.steps[a.steps.length-1],void 0!==document.evaluate?(d=this.generateXpathFromSteps(a.steps),e=i.evaluate(d,i,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue):(g=this.generateQueryFromSteps(a.steps),(h=i.querySelector(g))&&"text"==c.type&&(e=h.childNodes[c.index])),e?(e&&a.characterOffset>=0?(f=e.length,a.characterOffset-1&&this.hooks[a].splice(c,1):Array.isArray(b)&&b.forEach(function(b){(c=this.hooks[a].indexOf(b))>-1&&this.hooks[a].splice(c,1)},this))},a.prototype.triggerHooks=function(a,b,c){function d(){--f<=0&&b&&b()}var e,f;if(void 0===this.hooks[a])return!1;e=this.hooks[a],f=e.length,0===f&&b&&b(),e.forEach(function(a){a(d,c)})},{register:function(a){if(void 0===EPUBJS.hooks[a]&&(EPUBJS.hooks[a]={}),"object"!=typeof EPUBJS.hooks[a])throw"Already registered: "+a;return EPUBJS.hooks[a]},mixin:function(b){for(var c in a.prototype)b[c]=a.prototype[c]}}}(),EPUBJS.Layout=EPUBJS.Layout||{},EPUBJS.Layout.isFixedLayout=function(a){var b=a.querySelector("[name=viewport]");if(!b||!b.hasAttribute("content"))return!1;var c=b.getAttribute("content");return/width=(\d+)/.test(c)&&/height=(\d+)/.test(c)},EPUBJS.Layout.Reflowable=function(){this.documentElement=null,this.spreadWidth=null},EPUBJS.Layout.Reflowable.prototype.format=function(a,b,c,d){var e=EPUBJS.core.prefixed("columnAxis"),f=EPUBJS.core.prefixed("columnGap"),g=EPUBJS.core.prefixed("columnWidth"),h=EPUBJS.core.prefixed("columnFill"),i=Math.floor(b),j=Math.floor(i/8),k=d>=0?d:j%2==0?j:j-1;return this.documentElement=a,this.spreadWidth=i+k,a.style.overflow="hidden",a.style.width=i+"px",a.style.height=c+"px",a.style[e]="horizontal",a.style[h]="auto",a.style[g]=i+"px",a.style[f]=k+"px",this.colWidth=i,this.gap=k,{pageWidth:this.spreadWidth,pageHeight:c}},EPUBJS.Layout.Reflowable.prototype.calculatePages=function(){var a,b;return this.documentElement.style.width="auto",a=this.documentElement.scrollWidth,b=Math.ceil(a/this.spreadWidth),{displayedPages:b,pageCount:b}},EPUBJS.Layout.ReflowableSpreads=function(){this.documentElement=null,this.spreadWidth=null},EPUBJS.Layout.ReflowableSpreads.prototype.format=function(a,b,c,d){var e=EPUBJS.core.prefixed("columnAxis"),f=EPUBJS.core.prefixed("columnGap"),g=EPUBJS.core.prefixed("columnWidth"),h=EPUBJS.core.prefixed("columnFill"),i=2,j=Math.floor(b),k=j%2==0?j:j-1,l=Math.floor(k/8),m=d>=0?d:l%2==0?l:l-1,n=Math.floor((k-m)/i);return this.documentElement=a,this.spreadWidth=(n+m)*i,a.style.overflow="hidden",a.style.width=k+"px",a.style.height=c+"px",a.style[e]="horizontal",a.style[h]="auto",a.style[f]=m+"px",a.style[g]=n+"px",this.colWidth=n,this.gap=m,{pageWidth:this.spreadWidth,pageHeight:c}},EPUBJS.Layout.ReflowableSpreads.prototype.calculatePages=function(){var a=this.documentElement.scrollWidth,b=Math.ceil(a/this.spreadWidth);return this.documentElement.style.width=b*this.spreadWidth-this.gap+"px",{displayedPages:b,pageCount:2*b}},EPUBJS.Layout.Fixed=function(){this.documentElement=null},EPUBJS.Layout.Fixed.prototype.format=function(a,b,c,d){var e,f,g,h,i=EPUBJS.core.prefixed("columnWidth"),j=EPUBJS.core.prefixed("transform"),k=EPUBJS.core.prefixed("transformOrigin"),l=a.querySelector("[name=viewport]");this.documentElement=a,l&&l.hasAttribute("content")&&(e=l.getAttribute("content"),f=e.split(","),f[0]&&(g=f[0].replace("width=","")),f[1]&&(h=f[1].replace("height=","")));var m=b/g,n=c/h,o=m=d?g.resolve():(c=f,b=new EPUBJS.Chapter(this.spine[c],this.store,this.credentials),this.process(b).then(function(){setTimeout(function(){e(g)},1)})),g.promise}.bind(this);return"number"==typeof a&&(this.break=a),e().then(function(){this.total=this._locations.length-1,this._currentCfi&&(this.currentLocation=this._currentCfi),b.resolve(this._locations)}.bind(this)),b.promise},EPUBJS.Locations.prototype.process=function(a){return a.load().then(function(b){var c,d,e,f=b,g=f.documentElement.querySelector("body"),h=0;this.sprint(g,function(b){var g,i=b.length,j=0;for(0===h&&(c=f.createRange(),c.setStart(b,0)),g=this.break-h,g>i&&(h+=i,j=i);j=i?h=i-(j-this.break):(c.setEnd(b,j),e=a.cfiFromRange(c),this._locations.push(e),h=0,j+=1,c=f.createRange(),c.setStart(b,j));d=b}.bind(this)),c&&(c.setEnd(d,d.length),e=a.cfiFromRange(c),this._locations.push(e),h=0)}.bind(this))},EPUBJS.Locations.prototype.sprint=function(a,b){for(var c,d=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);c=d.nextNode();)b(c)},EPUBJS.Locations.prototype.locationFromCfi=function(a){return 0===this._locations.length?-1:EPUBJS.core.locationOf(a,this._locations,this.epubcfi.compare)},EPUBJS.Locations.prototype.percentageFromCfi=function(a){var b=this.locationFromCfi(a);return this.percentageFromLocation(b)},EPUBJS.Locations.prototype.percentageFromLocation=function(a){return a&&this.total?a/this.total:0},EPUBJS.Locations.prototype.cfiFromLocation=function(a){var b=-1;return"number"!=typeof a&&(a=parseInt(a)),a>=0&&a1?a/100:a,c=Math.ceil(this.total*b);return this.cfiFromLocation(c)},EPUBJS.Locations.prototype.load=function(a){return this._locations=JSON.parse(a),this.total=this._locations.length-1,this._locations},EPUBJS.Locations.prototype.save=function(a){return JSON.stringify(this._locations)},EPUBJS.Locations.prototype.getCurrent=function(a){return this._current},EPUBJS.Locations.prototype.setCurrent=function(a){var b;if("string"==typeof a)this._currentCfi=a;else{if("number"!=typeof a)return;this._current=a}0!==this._locations.length&&("string"==typeof a?(b=this.locationFromCfi(a),this._current=b):b=a,this.trigger("changed",{percentage:this.percentageFromLocation(b)}))},Object.defineProperty(EPUBJS.Locations.prototype,"currentLocation",{get:function(){return this._current},set:function(a){this.setCurrent(a)}}),RSVP.EventTarget.mixin(EPUBJS.Locations.prototype),EPUBJS.Pagination=function(a){this.pages=[],this.locations=[],this.epubcfi=new EPUBJS.EpubCFI,a&&a.length&&this.process(a)},EPUBJS.Pagination.prototype.process=function(a){a.forEach(function(a){this.pages.push(a.page),this.locations.push(a.cfi)},this),this.pageList=a,this.firstPage=parseInt(this.pages[0]),this.lastPage=parseInt(this.pages[this.pages.length-1]),this.totalPages=this.lastPage-this.firstPage},EPUBJS.Pagination.prototype.pageFromCfi=function(a){var b=-1;if(0===this.locations.length)return-1;var c=EPUBJS.core.indexOfSorted(a,this.locations,this.epubcfi.compare);return c!=-1?b=this.pages[c]:(c=EPUBJS.core.locationOf(a,this.locations,this.epubcfi.compare),void 0!==(b=c-1>=0?this.pages[c-1]:this.pages[0])||(b=-1)),b},EPUBJS.Pagination.prototype.cfiFromPage=function(a){var b=-1;"number"!=typeof a&&(a=parseInt(a));var c=this.pages.indexOf(a);return c!=-1&&(b=this.locations[c]),b},EPUBJS.Pagination.prototype.pageFromPercentage=function(a){return Math.round(this.totalPages*a)},EPUBJS.Pagination.prototype.percentageFromPage=function(a){var b=(a-this.firstPage)/this.totalPages;return Math.round(1e3*b)/1e3},EPUBJS.Pagination.prototype.percentageFromCfi=function(a){var b=this.pageFromCfi(a);return this.percentageFromPage(b)},EPUBJS.Parser=function(a){this.baseUrl=a||""},EPUBJS.Parser.prototype.container=function(a){var b,c,d,e;return a?(b=a.querySelector("rootfile"))?(c=b.getAttribute("full-path"),d=EPUBJS.core.uri(c).directory,e=a.xmlEncoding,{packagePath:c,basePath:d,encoding:e}):void console.error("No RootFile Found"):void console.error("Container File Not Found")},EPUBJS.Parser.prototype.identifier=function(a){var b;return a?(b=a.querySelector("metadata"),b?this.getElementText(b,"identifier"):void console.error("No Metadata Found")):void console.error("Package File Not Found")},EPUBJS.Parser.prototype.packageContents=function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=this;return b&&(this.baseUrl=b),a?(c=a.querySelector("metadata"))?(d=a.querySelector("manifest"))?(e=a.querySelector("spine"))?(f=n.manifest(d),g=n.findNavPath(d),h=n.findTocPath(d,e),i=n.findCoverPath(a),j=Array.prototype.indexOf.call(e.parentNode.childNodes,e),k=n.spine(e,f),l={},k.forEach(function(a){l[a.href]=a.index}),m=n.metadata(c),m.direction=e.getAttribute("page-progression-direction"),{metadata:m,spine:k,manifest:f,navPath:g,tocPath:h,coverPath:i,spineNodeIndex:j,spineIndexByURL:l}):void console.error("No Spine Found"):void console.error("No Manifest Found"):void console.error("No Metadata Found"):void console.error("Package File Not Found")},EPUBJS.Parser.prototype.findNavPath=function(a){var b=a.querySelector("item[properties$='nav'], item[properties^='nav '], item[properties*=' nav ']");return!!b&&b.getAttribute("href")},EPUBJS.Parser.prototype.findTocPath=function(a,b){var c,d=a.querySelector("item[media-type='application/x-dtbncx+xml']");return d||(c=b.getAttribute("toc"))&&(d=a.querySelector("item[id='"+c+"']")),!!d&&d.getAttribute("href")},EPUBJS.Parser.prototype.metadata=function(a){var b={},c=this;return b.bookTitle=c.getElementText(a,"title"),b.creator=c.getElementText(a,"creator"),b.description=c.getElementText(a,"description"),b.pubdate=c.getElementText(a,"date"),b.publisher=c.getElementText(a,"publisher"),b.identifier=c.getElementText(a,"identifier"),b.language=c.getElementText(a,"language"),b.rights=c.getElementText(a,"rights"),b.modified_date=c.querySelectorText(a,"meta[property='dcterms:modified']"),b.layout=c.querySelectorText(a,"meta[property='rendition:layout']"),b.orientation=c.querySelectorText(a,"meta[property='rendition:orientation']"),b.spread=c.querySelectorText(a,"meta[property='rendition:spread']"),b},EPUBJS.Parser.prototype.findCoverPath=function(a){if("2.0"===a.querySelector("package").getAttribute("version")){var b=a.querySelector('meta[name="cover"]');if(b){var c=b.getAttribute("content"),d=a.querySelector("item[id='"+c+"']");return!!d&&d.getAttribute("href")}return!1}var e=a.querySelector("item[properties='cover-image']");return!!e&&e.getAttribute("href")},EPUBJS.Parser.prototype.getElementText=function(a,b){var c,d=a.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/",b);return d&&0!==d.length?(c=d[0],c.childNodes.length?c.childNodes[0].nodeValue:""):""},EPUBJS.Parser.prototype.querySelectorText=function(a,b){var c=a.querySelector(b);return c&&c.childNodes.length?c.childNodes[0].nodeValue:""},EPUBJS.Parser.prototype.manifest=function(a){var b=this.baseUrl,c={},d=a.querySelectorAll("item");return Array.prototype.slice.call(d).forEach(function(a){var d=a.getAttribute("id"),e=a.getAttribute("href")||"",f=a.getAttribute("media-type")||"",g=a.getAttribute("properties")||"";c[d]={href:e,url:b+e,type:f,properties:g}}),c},EPUBJS.Parser.prototype.spine=function(a,b){var c=a.getElementsByTagName("itemref"),d=Array.prototype.slice.call(c),e=EPUBJS.core.indexOfElementNode(a),f=new EPUBJS.EpubCFI;return d.map(function(a,c){var d=a.getAttribute("idref"),g=f.generateChapterComponent(e,c,d),h=a.getAttribute("properties")||"",i=h.length?h.split(" "):[],j=b[d].properties,k=j.length?j.split(" "):[];return{id:d,linear:a.getAttribute("linear")||"",properties:i,manifestProperties:k,href:b[d].href,url:b[d].url,index:c,cfiBase:g,cfi:"epubcfi("+g+")"}})},EPUBJS.Parser.prototype.querySelectorByType=function(a,b,c){var d=a.querySelector(b+'[*|type="'+c+'"]');if(null!==d&&0!==d.length)return d;d=a.querySelectorAll(b);for(var e=0;e1&&d[1],{cfi:f,href:h,packageUrl:e,page:j}):{href:h,page:j}},EPUBJS.Render.Iframe=function(){this.iframe=null,this.document=null,this.window=null,this.docEl=null,this.bodyEl=null,this.leftPos=0,this.pageWidth=0,this.id=EPUBJS.core.uuid()},EPUBJS.Render.Iframe.prototype.create=function(){return this.element=document.createElement("div"),this.element.id="epubjs-view:"+this.id,this.isMobile=navigator.userAgent.match(/(iPad|iPhone|iPod|Mobile|Android)/g),this.transform=EPUBJS.core.prefixed("transform"),this.element},EPUBJS.Render.Iframe.prototype.addIframe=function(){return this.iframe=document.createElement("iframe"),this.iframe.id="epubjs-iframe:"+this.id,this.iframe.scrolling=this.scrolling||"no",this.iframe.seamless="seamless",this.iframe.style.border="none",this.iframe.addEventListener("load",this.loaded.bind(this),!1),(this._width||this._height)&&(this.iframe.height=this._height,this.iframe.width=this._width),this.iframe},EPUBJS.Render.Iframe.prototype.load=function(a,b){var c=this,d=new RSVP.defer;return this.window&&this.unload(),this.iframe&&this.element.removeChild(this.iframe),this.iframe=this.addIframe(),this.element.appendChild(this.iframe),this.iframe.onload=function(a){c.document=c.iframe.contentDocument,c.docEl=c.document.documentElement,c.headEl=c.document.head,c.bodyEl=c.document.body||c.document.querySelector("body"),c.window=c.iframe.contentWindow,c.window.addEventListener("resize",c.resized.bind(c),!1),c.leftPos=0,c.setLeft(0),c.bodyEl&&(c.bodyEl.style.margin="0"),d.resolve(c.docEl)},this.iframe.onerror=function(a){d.reject({message:"Error Loading Contents: "+a,stack:(new Error).stack})},this.document=this.iframe.contentDocument,this.document?(this.iframe.contentDocument.open(),this.iframe.contentDocument.write(a),this.iframe.contentDocument.close(),d.promise):(d.reject(new Error("No Document Available")),d.promise)},EPUBJS.Render.Iframe.prototype.loaded=function(a){var b,c,d=this.iframe.contentWindow.location.href;this.document=this.iframe.contentDocument,this.docEl=this.document.documentElement,this.headEl=this.document.head,this.bodyEl=this.document.body||this.document.querySelector("body"),this.window=this.iframe.contentWindow,this.window.focus(),"about:blank"!=d&&(b=this.iframe.contentDocument.querySelector("base"),c=b.getAttribute("href"),this.trigger("render:loaded",c))},EPUBJS.Render.Iframe.prototype.resize=function(a,b){this.element&&(this.element.style.height=b,isNaN(a)||a%2==0||(a+=1),this.element.style.width=a,this.iframe&&(this.iframe.height=b,this.iframe.width=a),this._height=b,this._width=a,this.width=this.element.getBoundingClientRect().width||a,this.height=this.element.getBoundingClientRect().height||b)},EPUBJS.Render.Iframe.prototype.resized=function(a){this.width=this.iframe.getBoundingClientRect().width,this.height=this.iframe.getBoundingClientRect().height},EPUBJS.Render.Iframe.prototype.totalWidth=function(){return this.docEl.scrollWidth},EPUBJS.Render.Iframe.prototype.totalHeight=function(){return this.docEl.scrollHeight},EPUBJS.Render.Iframe.prototype.setPageDimensions=function(a,b){this.pageWidth=a,this.pageHeight=b},EPUBJS.Render.Iframe.prototype.setDirection=function(a){this.direction=a,this.docEl&&"rtl"==this.docEl.dir&&(this.docEl.dir="rtl","pre-paginated"!==this.layout&&(this.docEl.style.position="static",this.docEl.style.right="auto"))},EPUBJS.Render.Iframe.prototype.setLeft=function(a){this.isMobile?this.docEl.style[this.transform]="translate("+-a+"px, 0)":this.document.defaultView.scrollTo(a,0)},EPUBJS.Render.Iframe.prototype.setLayout=function(a){this.layout=a},EPUBJS.Render.Iframe.prototype.setStyle=function(a,b,c){c&&(a=EPUBJS.core.prefixed(a)),this.bodyEl&&(this.bodyEl.style[a]=b)},EPUBJS.Render.Iframe.prototype.removeStyle=function(a){this.bodyEl&&(this.bodyEl.style[a]="")},EPUBJS.Render.Iframe.prototype.setClasses=function(a){this.bodyEl&&(this.bodyEl.className=a.join(" "))},EPUBJS.Render.Iframe.prototype.addHeadTag=function(a,b,c){var d=c||this.document,e=d.createElement(a),f=d.head;for(var g in b)e.setAttribute(g,b[g]);f&&f.insertBefore(e,f.firstChild)},EPUBJS.Render.Iframe.prototype.page=function(a){this.leftPos=this.pageWidth*(a-1),"rtl"===this.direction&&(this.leftPos=this.leftPos*-1),this.setLeft(this.leftPos)},EPUBJS.Render.Iframe.prototype.getPageNumberByElement=function(a){var b;if(a)return b=this.leftPos+a.getBoundingClientRect().left,Math.floor(b/this.pageWidth)+1},EPUBJS.Render.Iframe.prototype.getPageNumberByRect=function(a){var b;return b=this.leftPos+a.left,Math.floor(b/this.pageWidth)+1},EPUBJS.Render.Iframe.prototype.getBaseElement=function(){return this.bodyEl},EPUBJS.Render.Iframe.prototype.getDocumentElement=function(){return this.docEl},EPUBJS.Render.Iframe.prototype.isElementVisible=function(a){var b,c;return!!(a&&"function"==typeof a.getBoundingClientRect&&(b=a.getBoundingClientRect(),c=b.left,0!==b.width&&0!==b.height&&c>=0&&c=1&&a<=this.displayedPages&&(this.chapterPos=a,this.render.page(a),this.visibleRangeCfi=this.getVisibleRangeCfi(),this.currentLocationCfi=this.visibleRangeCfi.start,this.trigger("renderer:locationChanged",this.currentLocationCfi),this.trigger("renderer:visibleRangeChanged",this.visibleRangeCfi),!0):(console.warn("pageMap not set, queuing"),this._q.enqueue("page",arguments),!0)},EPUBJS.Renderer.prototype.nextPage=function(){return this.page(this.chapterPos+1)},EPUBJS.Renderer.prototype.prevPage=function(){return this.page(this.chapterPos-1)},EPUBJS.Renderer.prototype.pageByElement=function(a){var b;a&&(b=this.render.getPageNumberByElement(a),this.page(b))},EPUBJS.Renderer.prototype.lastPage=function(){if(this._moving)return this._q.enqueue("lastPage",arguments);this.page(this.displayedPages)},EPUBJS.Renderer.prototype.firstPage=function(){if(this._moving)return this._q.enqueue("firstPage",arguments);this.page(1)},EPUBJS.Renderer.prototype.section=function(a){var b=this.doc.getElementById(a);b&&this.pageByElement(b)},EPUBJS.Renderer.prototype.firstElementisTextNode=function(a){var b=a.childNodes;return!!(b.length&&b[0]&&3===b[0].nodeType&&b[0].textContent.trim().length)},EPUBJS.Renderer.prototype.isGoodNode=function(a){return["audio","canvas","embed","iframe","img","math","object","svg","video"].indexOf(a.tagName.toLowerCase())!==-1||this.firstElementisTextNode(a)},EPUBJS.Renderer.prototype.walk=function(a,b,c){for(var d,e,f,g,h=a,i=[h],j=1e4,k=0;!d&&i.length;){if(a=i.shift(),this.containsPoint(a,b,c)&&this.isGoodNode(a)&&(d=a),!d&&a&&a.childElementCount>0){if(!(e=a.children)||!e.length)return d;f=e.length?e.length:0;for(var l=f-1;l>=0;l--)e[l]!=g&&i.unshift(e[l])}if(!d&&0===i.length&&h&&null!==h.parentNode&&(i.push(h.parentNode),g=h,h=h.parentNode),++k>j){console.error("ENDLESS LOOP");break}}return d},EPUBJS.Renderer.prototype.containsPoint=function(a,b,c){var d;return!!(a&&"function"==typeof a.getBoundingClientRect&&(d=a.getBoundingClientRect(),0!==d.width&&0!==d.height&&d.left>=b&&b<=d.left+d.width))},EPUBJS.Renderer.prototype.textSprint=function(a,b){var c,d,e=function(a){return/^\s*$/.test(a.data)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT};try{for(c=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,{acceptNode:e},!1);d=c.nextNode();)b(d)}catch(f){for(c=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,e,!1);d=c.nextNode();)b(d)}},EPUBJS.Renderer.prototype.sprint=function(a,b){for(var c,d=document.createTreeWalker(a,NodeFilter.SHOW_ELEMENT,null,!1);c=d.nextNode();)b(c)},EPUBJS.Renderer.prototype.mapPage=function(){var a,b,c,d,e,f,g,h,i=this,j=[],k=this.render.getBaseElement(),l=1,m=this.layout.colWidth+this.layout.gap,n=this.formated.pageWidth*(this.chapterPos-1),o=m*l-n,p=0,q=function(b){var c,e,f;if(b.nodeType==Node.TEXT_NODE){if(e=document.createRange(),e.selectNodeContents(b),!(c=e.getBoundingClientRect())||0===c.width&&0===c.height)return;c.left>p&&(f=r(b)),c.right>p&&(f=r(b)),d=b,f&&(a=null)}},r=function(e){var f;return i.splitTextNodeIntoWordsRanges(e).forEach(function(e){var g=e.getBoundingClientRect();!g||0===g.width&&0===g.height||(g.left+g.width0&&(b&&(b.setEnd(a,e),c.push(b)),b=this.doc.createRange(),b.setStart(a,e+1));return b&&(b.setEnd(a,d.length),c.push(b)),c},EPUBJS.Renderer.prototype.rangePosition=function(a){var b;return b=a.getClientRects(),b.length?b[0]:null},EPUBJS.Renderer.prototype.getPageCfi=function(){var a=2*this.chapterPos-1;return this.pageMap[a].start},EPUBJS.Renderer.prototype.getRange=function(a,b,c){var d,e=this.doc.createRange();return c=!0,void 0===document.caretPositionFromPoint||c?void 0===document.caretRangeFromPoint||c?(this.visibileEl=this.findElementAfter(a,b),e.setStart(this.visibileEl,1)):e=this.doc.caretRangeFromPoint(a,b):(d=this.doc.caretPositionFromPoint(a,b),e.setStart(d.offsetNode,d.offset)),e},EPUBJS.Renderer.prototype.pagesInCurrentChapter=function(){return this.pageMap?this.pageMap.length:(console.warn("page map not loaded"),!1)},EPUBJS.Renderer.prototype.currentRenderedPage=function(){return this.pageMap?this.spreads&&this.pageMap.length>1?2*this.chapterPos-1:this.chapterPos:(console.warn("page map not loaded"),!1)},EPUBJS.Renderer.prototype.getRenderedPagesLeft=function(){var a,b;return this.pageMap?(b=this.pageMap.length,a=this.spreads?2*this.chapterPos-1:this.chapterPos,b-a):(console.warn("page map not loaded"),!1)},EPUBJS.Renderer.prototype.getVisibleRangeCfi=function(){var a,b,c;return this.pageMap?(this.spreads?(a=2*this.chapterPos,b=this.pageMap[a-2],c=b,this.pageMap.length>1&&this.pageMap.length>a-1&&(c=this.pageMap[a-1])):(a=this.chapterPos,b=this.pageMap[a-1],c=b),b||(console.warn("page range miss:",a,this.pageMap),b=this.pageMap[this.pageMap.length-1],c=b),{start:b.start,end:c.end}):(console.warn("page map not loaded"),!1)},EPUBJS.Renderer.prototype.gotoCfi=function(a){var b,c,d;if(this._moving)return this._q.enqueue("gotoCfi",arguments);if(EPUBJS.core.isString(a)&&(a=this.epubcfi.parse(a)),void 0===document.evaluate)(c=this.epubcfi.addMarker(a,this.doc))&&(b=this.render.getPageNumberByElement(c),this.epubcfi.removeMarker(c,this.doc),this.page(b));else if(d=this.epubcfi.generateRangeFromCfi(a,this.doc)){var e=d.getBoundingClientRect();b=e?this.render.getPageNumberByRect(e):1,this.page(b),this.currentLocationCfi=a.str}else this.page(1)},EPUBJS.Renderer.prototype.findFirstVisible=function(a){var b,c=a||this.render.getBaseElement();return b=this.walk(c,0,0),b?b:a},EPUBJS.Renderer.prototype.findElementAfter=function(a,b,c){var d,e=c||this.render.getBaseElement();return d=this.walk(e,a,b),d?d:e},EPUBJS.Renderer.prototype.resize=function(a,b,c){this.width=a,this.height=b,c!==!1&&this.render.resize(this.width,this.height),this.contents&&this.reformat(),this.trigger("renderer:resized",{width:this.width,height:this.height})},EPUBJS.Renderer.prototype.onResized=function(a){this.trigger("renderer:beforeResize");var b=this.container.clientWidth,c=this.container.clientHeight;this.resize(b,c,!1)},EPUBJS.Renderer.prototype.addEventListeners=function(){this.render.document&&this.listenedEvents.forEach(function(a){this.render.document.addEventListener(a,this.triggerEvent.bind(this),!1)},this)},EPUBJS.Renderer.prototype.removeEventListeners=function(){this.render.document&&this.listenedEvents.forEach(function(a){this.render.document.removeEventListener(a,this.triggerEvent,!1)},this)},EPUBJS.Renderer.prototype.triggerEvent=function(a){this.trigger("renderer:"+a.type,a)},EPUBJS.Renderer.prototype.addSelectionListeners=function(){this.render.document.addEventListener("selectionchange",this.onSelectionChange.bind(this),!1)},EPUBJS.Renderer.prototype.removeSelectionListeners=function(){this.render.document&&this.doc.removeEventListener("selectionchange",this.onSelectionChange,!1)},EPUBJS.Renderer.prototype.onSelectionChange=function(a){this.selectionEndTimeout&&clearTimeout(this.selectionEndTimeout),this.selectionEndTimeout=setTimeout(function(){this.selectedRange=this.render.window.getSelection(),this.trigger("renderer:selected",this.selectedRange)}.bind(this),500)},EPUBJS.Renderer.prototype.setMinSpreadWidth=function(a){this.minSpreadWidth=a,this.spreads=this.determineSpreads(a)},EPUBJS.Renderer.prototype.determineSpreads=function(a){return!(this.isForcedSingle||!a||this.width=d?h.resolve():(c=a[e].url,g=window.encodeURIComponent(c),EPUBJS.core.request(c,"binary").then(function(a){return localforage.setItem(g,a)}).then(function(a){e++,setTimeout(function(){f(h)},1)})),h.promise}.bind(this);return Array.isArray(a)||(a=[a]),f().then(function(){c.resolve()}.bind(this)),c.promise},EPUBJS.Storage.prototype.token=function(a,b){var c=window.encodeURIComponent(a);return localforage.setItem(c,b).then(function(a){return null!==a})},EPUBJS.Storage.prototype.isStored=function(a){var b=window.encodeURIComponent(a);return localforage.getItem(b).then(function(a){return null!==a})},EPUBJS.Storage.prototype.getText=function(a){var b=window.encodeURIComponent(a);return EPUBJS.core.request(a,"arraybuffer",this.withCredentials).then(function(a){return this.offline&&(this.offline=!1,this.trigger("offline",!1)),localforage.setItem(b,a),a}.bind(this)).then(function(b){var c=new RSVP.defer,d=EPUBJS.core.getMimeType(a),e=new Blob([b],{type:d}),f=new FileReader;return f.addEventListener("loadend",function(){c.resolve(f.result)}),f.readAsText(e,d),c.promise}).catch(function(){var c=new RSVP.defer,d=localforage.getItem(b);return this.offline||(this.offline=!0,this.trigger("offline",!0)),d?(d.then(function(b){var d=EPUBJS.core.getMimeType(a),e=new Blob([b],{type:d}),f=new FileReader;f.addEventListener("loadend",function(){c.resolve(f.result)}),f.readAsText(e,d)}),c.promise):(c.reject({message:"File not found in the storage: "+a,stack:(new Error).stack}),c.promise)}.bind(this))},EPUBJS.Storage.prototype.getUrl=function(a){var b=window.encodeURIComponent(a);return EPUBJS.core.request(a,"arraybuffer",this.withCredentials).then(function(c){return this.offline&&(this.offline=!1,this.trigger("offline",!1)),localforage.setItem(b,c),a}.bind(this)).catch(function(){var c,d,e=new RSVP.defer,f=window.URL||window.webkitURL||window.mozURL;return this.offline||(this.offline=!0,this.trigger("offline",!0)),b in this.urlCache?(e.resolve(this.urlCache[b]),e.promise):(c=localforage.getItem(b))?(c.then(function(c){var g=new Blob([c],{type:EPUBJS.core.getMimeType(a)});d=f.createObjectURL(g),e.resolve(d),this.urlCache[b]=d}.bind(this)),e.promise):(e.reject({message:"File not found in the storage: "+a,stack:(new Error).stack}),e.promise)}.bind(this))},EPUBJS.Storage.prototype.getXml=function(a){var b=window.encodeURIComponent(a);return EPUBJS.core.request(a,"arraybuffer",this.withCredentials).then(function(a){return this.offline&&(this.offline=!1,this.trigger("offline",!1)),localforage.setItem(b,a),a}.bind(this)).then(function(b){var c=new RSVP.defer,d=EPUBJS.core.getMimeType(a),e=new Blob([b],{type:d}),f=new FileReader;return f.addEventListener("loadend",function(){var a=new DOMParser,b=a.parseFromString(f.result,"text/xml");c.resolve(b)}),f.readAsText(e,d),c.promise}).catch(function(){var c=new RSVP.defer,d=localforage.getItem(b);return this.offline||(this.offline=!0,this.trigger("offline",!0)),d?(d.then(function(b){var d=EPUBJS.core.getMimeType(a),e=new Blob([b],{type:d}),f=new FileReader;f.addEventListener("loadend",function(){var a=new DOMParser,b=a.parseFromString(f.result,"text/xml");c.resolve(b)}),f.readAsText(e,d)}),c.promise):(c.reject({message:"File not found in the storage: "+a,stack:(new Error).stack}),c.promise)}.bind(this))},EPUBJS.Storage.prototype.revokeUrl=function(a){var b=window.URL||window.webkitURL||window.mozURL,c=this.urlCache[a];c&&b.revokeObjectURL(c)},EPUBJS.Storage.prototype.failed=function(a){console.error(a)},RSVP.EventTarget.mixin(EPUBJS.Storage.prototype),EPUBJS.Unarchiver=function(a){this.checkRequirements(),this.urlCache={}},EPUBJS.Unarchiver.prototype.checkRequirements=function(a){"undefined"==typeof JSZip&&console.error("JSZip lib not loaded")},EPUBJS.Unarchiver.prototype.open=function(a,b){if(a instanceof ArrayBuffer){this.zip=new JSZip(a);var c=new RSVP.defer;return c.resolve(),c.promise}return EPUBJS.core.request(a,"binary").then(function(a){this.zip=new JSZip(a)}.bind(this))},EPUBJS.Unarchiver.prototype.getXml=function(a,b){var c=window.decodeURIComponent(a);return this.getText(c,b).then(function(b){var c=new DOMParser,d=EPUBJS.core.getMimeType(a);return 65279===b.charCodeAt(0)&&(b=b.slice(1)),c.parseFromString(b,d)})},EPUBJS.Unarchiver.prototype.getUrl=function(a,b){var c,d,e=this,f=new RSVP.defer,g=window.decodeURIComponent(a),h=this.zip.file(g),i=window.URL||window.webkitURL||window.mozURL;return h?a in this.urlCache?(f.resolve(this.urlCache[a]),f.promise):(d=new Blob([h.asUint8Array()],{type:EPUBJS.core.getMimeType(h.name)}),c=i.createObjectURL(d),f.resolve(c),e.urlCache[a]=c,f.promise):(f.reject({message:"File not found in the epub: "+a,stack:(new Error).stack}),f.promise)},EPUBJS.Unarchiver.prototype.getText=function(a,b){var c,d=new RSVP.defer,e=window.decodeURIComponent(a),f=this.zip.file(e);return f?(c=f.asText(),d.resolve(c),d.promise):(d.reject({message:"File not found in the epub: "+a,stack:(new Error).stack}),d.promise)},EPUBJS.Unarchiver.prototype.revokeUrl=function(a){var b=window.URL||window.webkitURL||window.mozURL,c=this.urlCache[a];c&&b.revokeObjectURL(c)},EPUBJS.Unarchiver.prototype.failed=function(a){console.error(a)},EPUBJS.Unarchiver.prototype.afterSaved=function(a){this.callback()},EPUBJS.Unarchiver.prototype.toStorage=function(a){function b(){0===--e&&d.afterSaved()}var c=0,d=this,e=a.length;a.forEach(function(a){setTimeout(function(a){d.saveEntryFileToStorage(a,b)},c,a),c+=20}),console.log("time",c)},function(){var a={application:{ecmascript:["es","ecma"],javascript:"js",ogg:"ogx",pdf:"pdf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],"rdf+xml":"rdf",smil:["smi","smil"],"xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","opf","ncx"],zip:"zip","x-httpd-eruby":"rhtml","x-latex":"latex","x-maker":["frm","maker","frame","fm","fb","book","fbdoc"],"x-object":"o","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","epub+zip":"epub","font-tdpfr":"pfr","inkml+xml":["ink","inkml"],json:"json","jsonml+json":"jsonml","mathml+xml":"mathml","metalink+xml":"metalink",mp4:"mp4s","omdoc+xml":"omdoc",oxps:"oxps","vnd.amazon.ebook":"azw",widget:"wgt","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-otf":"otf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-font-woff":"woff","x-mobipocket-ebook":["prc","mobi"],"x-mspublisher":"pub","x-nzb":"nzb","x-tgif":"obj","xaml+xml":"xaml","xml-dtd":"dtd","xproc+xml":"xpl","xslt+xml":"xslt","internet-property-stream":"acx","x-compress":"z","x-compressed":"tgz","x-gzip":"gz"},audio:{flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp2","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"x-aiff":["aif","aiff","aifc"],"x-ms-wma":"wma","x-wav":"wav",adpcm:"adp",mp4:"mp4a",webm:"weba","x-aac":"aac","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",mid:["mid","rmi"]},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"x-icon":"ico",bmp:"bmp",webp:"webp","x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",mathml:"mml",plain:["txt","text","brf","conf","def","list","log","in","bas"],richtext:"rtx","tab-separated-values":"tsv","x-bibtex":"bib","x-dsrc":"d","x-diff":["diff","patch"],"x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas"],"x-pcs-gcd":"gcd","x-perl":["pl","pm"],"x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcard":"vcf",sgml:["sgml","sgm"],"x-c":["c","cc","cxx","cpp","h","hh","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt"},video:{mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv"}},b=function(){var b,c,d,e,f={};for(b in a)if(a.hasOwnProperty(b))for(c in a[b])if(a[b].hasOwnProperty(c))if("string"==typeof(d=a[b][c]))f[d]=b+"/"+c;else for(e=0;en/2.5&&(p=n/2.5,pop_content.style.maxHeight=p+"px"),popRect.height+l>=n-25?(c.style.top=l-popRect.height+"px",c.classList.add("above")):c.classList.remove("above"),k-popRect.width<=0?(c.style.left=k+"px",c.classList.add("left")):c.classList.remove("left"),k+popRect.width/2>=o?(c.style.left=k-300+"px",popRect=c.getBoundingClientRect(),c.style.left=k-popRect.width+"px",popRect.height+l>=n-25?(c.style.top=l-popRect.height+"px",c.classList.add("above")):c.classList.remove("above"),c.classList.add("right")):c.classList.remove("right")}function d(){f[i].classList.add("on")}function e(){f[i].classList.remove("on")}function g(){setTimeout(function(){f[i].classList.remove("show")},100)}var h,i,j,k,l,m;"noteref"==a.getAttribute("epub:type")&&(h=a.getAttribute("href"),i=h.replace("#",""),j=b.render.document.getElementById(i),a.addEventListener("mouseover",c,!1),a.addEventListener("mouseout",g,!1))}),a&&a()},EPUBJS.Hooks.register("beforeChapterDisplay").mathml=function(a,b){if(b.currentChapter.manifestProperties.indexOf("mathml")!==-1){b.render.iframe.contentWindow.mathmlCallback=a;var c=document.createElement("script");c.type="text/x-mathjax-config",c.innerHTML=' MathJax.Hub.Register.StartupHook("End",function () { window.mathmlCallback(); }); MathJax.Hub.Config({jax: ["input/TeX","input/MathML","output/SVG"],extensions: ["tex2jax.js","mml2jax.js","MathEvents.js"],TeX: {extensions: ["noErrors.js","noUndefined.js","autoload-all.js"]},MathMenu: {showRenderer: false},menuSettings: {zoom: "Click"},messageStyle: "none"}); ',b.doc.body.appendChild(c),EPUBJS.core.addScript("http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML",null,b.doc.head)}else a&&a()},EPUBJS.Hooks.register("beforeChapterDisplay").smartimages=function(a,b){var c=b.contents.querySelectorAll("img"),d=Array.prototype.slice.call(c),e=b.height;if("reflowable"!=b.layoutSettings.layout)return void a();d.forEach(function(a){var c=function(){var c,d=a.getBoundingClientRect(),f=d.height,g=d.top,h=a.getAttribute("data-height"),i=h||f,j=Number(getComputedStyle(a,"").fontSize.match(/(\d*(\.\d*)?)px/)[1]),k=j?j/2:0;e=b.contents.clientHeight,g<0&&(g=0),i+g>=e?(ge&&(a.style.maxHeight=e+"px",a.style.width="auto",d=a.getBoundingClientRect(),i=d.height),a.style.display="block",a.style.WebkitColumnBreakBefore="always",a.style.breakBefore="column"),a.setAttribute("data-height",c)):(a.style.removeProperty("max-height"),a.style.removeProperty("margin-top"))},d=function(){b.off("renderer:resized",c),b.off("renderer:chapterUnload",this)};a.addEventListener("load",c,!1),b.on("renderer:resized",c),b.on("renderer:chapterUnload",d),c()}),a&&a()},EPUBJS.Hooks.register("beforeChapterDisplay").transculsions=function(a,b){var c=b.contents.querySelectorAll("[transclusion]");Array.prototype.slice.call(c).forEach(function(a){function c(){j=g,k=h,j>chapter.colWidth&&(d=chapter.colWidth/j,j=chapter.colWidth,k*=d),f.width=j,f.height=k}var d,e=a.getAttribute("ref"),f=document.createElement("iframe"),g=a.getAttribute("width"),h=a.getAttribute("height"),i=a.parentNode,j=g,k=h;c(),b.listenUntil("renderer:resized","renderer:chapterUnloaded",c),f.src=e,i.replaceChild(f,a)}),a&&a()}; \ No newline at end of file diff --git a/src/cps/static/js/libs/intention.js b/src/cps/static/js/libs/intention.js new file mode 100644 index 0000000..69e674f --- /dev/null +++ b/src/cps/static/js/libs/intention.js @@ -0,0 +1,564 @@ +/*! + * intention.js Library v0.9.7.2 + * http://intentionjs.com/ + * + * Copyright 2011, 2013 Dowjones and other contributors + * Released under the MIT license + * + */ + +(function(root, factory) { + + 'use strict'; + + if (typeof define === 'function' && define.amd) { + define('intention', ['jquery', 'underscore'], factory); + } else { + root.Intention = factory(root.jQuery, root._); + } +}(this, function($, _) { + 'use strict'; + + var Intention = function(params){ + var intent = _.extend(this, params, + {_listeners:{}, contexts:[], elms:$(), axes:{}, priority:[]}); + + return intent; + }; + + Intention.prototype = { + + // public methods + responsive:function responsive(contexts, options){ + // for generating random ids for axis when not specified + var idChars = 'abcdefghijklmnopqrstuvwxyz0123456789', + id='', i; + + // create a random id for the axis + for(i=0; i<5; i++){ + id += idChars[Math.floor(Math.random() * idChars.length)]; + } + var defaults = { + // if no matcher function is specified expect to compare a + // string to the ctx.name property + matcher: function(measure, ctx){ + return measure === ctx.name; + }, + // function takes one arg and returns it + measure: _.identity, + ID: id + }; + + if(_.isObject(options) === false) { + options = {}; + } + + if((_.isArray(contexts)) && (_.isArray(contexts[0].contexts))){ + _.each(contexts, function(axis){ + responsive.apply(this, axis); + }, this); + return; + } + + if((_.isArray(contexts) === false) && _.isObject(contexts)){ + options = contexts; + } else { + options.contexts = contexts; + } + + // fill in the options + options = _.extend({}, defaults, options); + + // bind an the respond function to the axis ID and prefix it + // with an underscore so that it does not get whomped accidentally + this.on('_' + options.ID + ':', _.bind( + function(e){ + this.axes = this._contextualize( + options.ID, e.context, this.axes); + this._respond(this.axes, this.elms); + + }, this)); + + var axis = { + ID:options.ID, + current:null, + contexts:options.contexts, + respond:_.bind(this._responder(options.ID, options.contexts, + options.matcher, options.measure), this) + }; + + this.axes[options.ID] = axis; + + this.axes.__keys__ = this.priority; + + this.priority.unshift(options.ID); + + return axis; + }, + + elements: function(scope){ + + // find all responsive elms in a specific dom scope + if(!scope){ + scope = document; + } + + $('[data-intent],[intent],[data-in],[in]', + scope).each(_.bind(function(i, elm){ + this.add($(elm)); + }, this)); + + return this; + }, + + add: function(elms, options){ + + var spec; + + if(!options) { + options = {}; + } + + // is expecting a jquery object + elms.each(_.bind(function(i, elm){ + var exists = false; + this.elms.each(function(i, respElm){ + if(elm === respElm) { + exists=true; + return false; + } + return true; + }); + + if(exists === false){ + // create the elements responsive data + spec = this._fillSpec( + _.extend(options, this._attrsToSpec(elm.attributes, this.axes))); + // make any appropriate changes based on the current contexts + this._makeChanges($(elm), spec, this.axes); + + this.elms.push({ + elm: elm, + spec: spec + }); + } + + }, this)); + + return this; + }, + + remove: function(elms){ + // is expecting a jquery object + var respElms = this.elms; + // elms to remove + elms.each(function(i, elm){ + // elms to check against + respElms.each(function(i, candidate){ + if(elm === candidate.elm){ + respElms.splice(i, 1); + // found the match, break the loop + return false; + } + return true; + }); + }); + return this; + }, + + is: function(ctxName){ + var axes = this.axes; + return _.some(axes.__keys__, function(key){ + return ctxName === axes[key].current; + }); + }, + + current: function(axisName){ + if(this.axes.hasOwnProperty(axisName)){ + return this.axes[axisName].current; + } else { + return false; + } + }, + + // code and concept taken from simple implementation of + // observer pattern outlined here: + // http://www.nczonline.net/blog/2010/03/09/custom-events-in-javascript/ + on: function(type, listener){ + + var events = type.split(' '), + i=0; + + for(i;ie;e++)g+=f[Math.floor(Math.random()*f.length)];var h={matcher:function(a,b){return a===b.name},measure:b.identity,ID:g};if(b.isObject(c)===!1&&(c={}),b.isArray(a)&&b.isArray(a[0].contexts))return b.each(a,function(a){d.apply(this,a)},this),void 0;b.isArray(a)===!1&&b.isObject(a)?c=a:c.contexts=a,c=b.extend({},h,c),this.on("_"+c.ID+":",b.bind(function(a){this.axes=this._contextualize(c.ID,a.context,this.axes),this._respond(this.axes,this.elms)},this));var i={ID:c.ID,current:null,contexts:c.contexts,respond:b.bind(this._responder(c.ID,c.contexts,c.matcher,c.measure),this)};return this.axes[c.ID]=i,this.axes.__keys__=this.priority,this.priority.unshift(c.ID),i},elements:function(c){return c||(c=document),a("[data-intent],[intent],[data-in],[in]",c).each(b.bind(function(b,c){this.add(a(c))},this)),this},add:function(c,d){var e;return d||(d={}),c.each(b.bind(function(c,f){var g=!1;this.elms.each(function(a,b){return f===b?(g=!0,!1):!0}),g===!1&&(e=this._fillSpec(b.extend(d,this._attrsToSpec(f.attributes,this.axes))),this._makeChanges(a(f),e,this.axes),this.elms.push({elm:f,spec:e}))},this)),this},remove:function(a){var b=this.elms;return a.each(function(a,c){b.each(function(a,d){return c===d.elm?(b.splice(a,1),!1):!0})}),this},is:function(a){var c=this.axes;return b.some(c.__keys__,function(b){return a===c[b].current})},current:function(a){return this.axes.hasOwnProperty(a)?this.axes[a].current:!1},on:function(a,b){var c=a.split(" "),d=0;for(d;d").get(0).files !== undefined; +feature.formdata = window.FormData !== undefined; + +var hasProp = !!$.fn.prop; + +// attr2 uses prop when it can but checks the return type for +// an expected string. this accounts for the case where a form +// contains inputs with names like "action" or "method"; in those +// cases "prop" returns the element +$.fn.attr2 = function() { + if ( ! hasProp ) { + return this.attr.apply(this, arguments); + } + var val = this.prop.apply(this, arguments); + if ( ( val && val.jquery ) || typeof val === 'string' ) { + return val; + } + return this.attr.apply(this, arguments); +}; + +/** + * ajaxSubmit() provides a mechanism for immediately submitting + * an HTML form using AJAX. + */ +$.fn.ajaxSubmit = function(options) { + /*jshint scripturl:true */ + + // fast fail if nothing selected (http://dev.jquery.com/ticket/2752) + if (!this.length) { + log('ajaxSubmit: skipping submit process - no element selected'); + return this; + } + + var method, action, url, $form = this; + + if (typeof options == 'function') { + options = { success: options }; + } + else if ( options === undefined ) { + options = {}; + } + + method = options.type || this.attr2('method'); + action = options.url || this.attr2('action'); + + url = (typeof action === 'string') ? $.trim(action) : ''; + url = url || window.location.href || ''; + if (url) { + // clean url (don't include hash vaue) + url = (url.match(/^([^#]+)/)||[])[1]; + } + + options = $.extend(true, { + url: url, + success: $.ajaxSettings.success, + type: method || $.ajaxSettings.type, + iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank' + }, options); + + // hook for manipulating the form data before it is extracted; + // convenient for use with rich editors like tinyMCE or FCKEditor + var veto = {}; + this.trigger('form-pre-serialize', [this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); + return this; + } + + // provide opportunity to alter form data before it is serialized + if (options.beforeSerialize && options.beforeSerialize(this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSerialize callback'); + return this; + } + + var traditional = options.traditional; + if ( traditional === undefined ) { + traditional = $.ajaxSettings.traditional; + } + + var elements = []; + var qx, a = this.formToArray(options.semantic, elements); + if (options.data) { + options.extraData = options.data; + qx = $.param(options.data, traditional); + } + + // give pre-submit callback an opportunity to abort the submit + if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSubmit callback'); + return this; + } + + // fire vetoable 'validate' event + this.trigger('form-submit-validate', [a, this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); + return this; + } + + var q = $.param(a, traditional); + if (qx) { + q = ( q ? (q + '&' + qx) : qx ); + } + if (options.type.toUpperCase() == 'GET') { + options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; + options.data = null; // data is null for 'get' + } + else { + options.data = q; // data is the query string for 'post' + } + + var callbacks = []; + if (options.resetForm) { + callbacks.push(function() { $form.resetForm(); }); + } + if (options.clearForm) { + callbacks.push(function() { $form.clearForm(options.includeHidden); }); + } + + // perform a load on the target only if dataType is not provided + if (!options.dataType && options.target) { + var oldSuccess = options.success || function(){}; + callbacks.push(function(data) { + var fn = options.replaceTarget ? 'replaceWith' : 'html'; + $(options.target)[fn](data).each(oldSuccess, arguments); + }); + } + else if (options.success) { + callbacks.push(options.success); + } + + options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg + var context = options.context || this ; // jQuery 1.4+ supports scope context + for (var i=0, max=callbacks.length; i < max; i++) { + callbacks[i].apply(context, [data, status, xhr || $form, $form]); + } + }; + + if (options.error) { + var oldError = options.error; + options.error = function(xhr, status, error) { + var context = options.context || this; + oldError.apply(context, [xhr, status, error, $form]); + }; + } + + if (options.complete) { + var oldComplete = options.complete; + options.complete = function(xhr, status) { + var context = options.context || this; + oldComplete.apply(context, [xhr, status, $form]); + }; + } + + // are there files to upload? + + // [value] (issue #113), also see comment: + // https://github.com/malsup/form/commit/588306aedba1de01388032d5f42a60159eea9228#commitcomment-2180219 + var fileInputs = $('input[type=file]:enabled', this).filter(function() { return $(this).val() !== ''; }); + + var hasFileInputs = fileInputs.length > 0; + var mp = 'multipart/form-data'; + var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); + + var fileAPI = feature.fileapi && feature.formdata; + log("fileAPI :" + fileAPI); + var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI; + + var jqxhr; + + // options.iframe allows user to force iframe mode + // 06-NOV-09: now defaulting to iframe mode if file input is detected + if (options.iframe !== false && (options.iframe || shouldUseFrame)) { + // hack to fix Safari hang (thanks to Tim Molendijk for this) + // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d + if (options.closeKeepAlive) { + $.get(options.closeKeepAlive, function() { + jqxhr = fileUploadIframe(a); + }); + } + else { + jqxhr = fileUploadIframe(a); + } + } + else if ((hasFileInputs || multipart) && fileAPI) { + jqxhr = fileUploadXhr(a); + } + else { + jqxhr = $.ajax(options); + } + + $form.removeData('jqxhr').data('jqxhr', jqxhr); + + // clear element array + for (var k=0; k < elements.length; k++) { + elements[k] = null; + } + + // fire 'notify' event + this.trigger('form-submit-notify', [this, options]); + return this; + + // utility fn for deep serialization + function deepSerialize(extraData){ + var serialized = $.param(extraData, options.traditional).split('&'); + var len = serialized.length; + var result = []; + var i, part; + for (i=0; i < len; i++) { + // #252; undo param space replacement + serialized[i] = serialized[i].replace(/\+/g,' '); + part = serialized[i].split('='); + // #278; use array instead of object storage, favoring array serializations + result.push([decodeURIComponent(part[0]), decodeURIComponent(part[1])]); + } + return result; + } + + // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz) + function fileUploadXhr(a) { + var formdata = new FormData(); + + for (var i=0; i < a.length; i++) { + formdata.append(a[i].name, a[i].value); + } + + if (options.extraData) { + var serializedData = deepSerialize(options.extraData); + for (i=0; i < serializedData.length; i++) { + if (serializedData[i]) { + formdata.append(serializedData[i][0], serializedData[i][1]); + } + } + } + + options.data = null; + + var s = $.extend(true, {}, $.ajaxSettings, options, { + contentType: false, + processData: false, + cache: false, + type: method || 'POST' + }); + + if (options.uploadProgress) { + // workaround because jqXHR does not expose upload property + s.xhr = function() { + var xhr = $.ajaxSettings.xhr(); + if (xhr.upload) { + xhr.upload.addEventListener('progress', function(event) { + var percent = 0; + var position = event.loaded || event.position; /*event.position is deprecated*/ + var total = event.total; + if (event.lengthComputable) { + percent = Math.ceil(position / total * 100); + } + options.uploadProgress(event, position, total, percent); + }, false); + } + return xhr; + }; + } + + s.data = null; + var beforeSend = s.beforeSend; + s.beforeSend = function(xhr, o) { + //Send FormData() provided by user + if (options.formData) { + o.data = options.formData; + } + else { + o.data = formdata; + } + if(beforeSend) { + beforeSend.call(this, xhr, o); + } + }; + return $.ajax(s); + } + + // private function for handling file uploads (hat tip to YAHOO!) + function fileUploadIframe(a) { + var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle; + var deferred = $.Deferred(); + + // #341 + deferred.abort = function(status) { + xhr.abort(status); + }; + + if (a) { + // ensure that every serialized input is still enabled + for (i=0; i < elements.length; i++) { + el = $(elements[i]); + if ( hasProp ) { + el.prop('disabled', false); + } + else { + el.removeAttr('disabled'); + } + } + } + + s = $.extend(true, {}, $.ajaxSettings, options); + s.context = s.context || s; + id = 'jqFormIO' + (new Date().getTime()); + if (s.iframeTarget) { + $io = $(s.iframeTarget); + n = $io.attr2('name'); + if (!n) { + $io.attr2('name', id); + } + else { + id = n; + } + } + else { + $io = $('")!==-1},d=function(a){return{type:"fragmented",fragments:a,content:"",bookmark:null,beforeBookmark:null}},e=function(a){return{type:"complete",fragments:null,content:a,bookmark:null,beforeBookmark:null}},f=function(f){var g,h,i;return g=b.read(f.getBody()),i=a.map(g,function(a){return f.serializer.trimContent(a)}),h=i.join(""),c(h)?d(i):e(h)},g=function(a,c,d){"fragmented"===c.type?b.write(c.fragments,a.getBody()):a.setContent(c.content,{format:"raw"}),a.selection.moveToBookmark(d?c.beforeBookmark:c.bookmark)},h=function(a){return"fragmented"===a.type?a.fragments.join(""):a.content},i=function(a,b){return h(a)===h(b)};return{createFragmentedLevel:d,createCompleteLevel:e,createFromEditor:f,applyToEditor:g,isEq:i}}),g("u",["p","9","1z"],function(a,b,c){return function(a){function d(b){a.setDirty(b)}function e(a){n(!1),i.add({},a)}function f(){i.typing&&(n(!1),i.add())}var g,h,i=this,j=0,k=[],l=0,m=function(){return 0===l},n=function(a){m()&&(i.typing=a)};return a.on("init",function(){i.add()}),a.on("BeforeExecCommand",function(a){var b=a.command;"Undo"!==b&&"Redo"!==b&&"mceRepaint"!==b&&(f(),i.beforeChange())}),a.on("ExecCommand",function(a){var b=a.command;"Undo"!==b&&"Redo"!==b&&"mceRepaint"!==b&&e(a)}),a.on("ObjectResizeStart Cut",function(){i.beforeChange()}),a.on("SaveContent ObjectResized blur",e),a.on("DragEnd",e),a.on("KeyUp",function(b){var f=b.keyCode;b.isDefaultPrevented()||((f>=33&&f<=36||f>=37&&f<=40||45===f||b.ctrlKey)&&(e(),a.nodeChanged()),46!==f&&8!==f||a.nodeChanged(),h&&i.typing&&c.isEq(c.createFromEditor(a),k[0])===!1&&(a.isDirty()===!1&&(d(!0),a.fire("change",{level:k[0],lastLevel:null})),a.fire("TypingUndo"),h=!1,a.nodeChanged()))}),a.on("KeyDown",function(a){var b=a.keyCode;if(!a.isDefaultPrevented()){if(b>=33&&b<=36||b>=37&&b<=40||45===b)return void(i.typing&&e(a));var c=a.ctrlKey&&!a.altKey||a.metaKey;!(b<16||b>20)||224===b||91===b||i.typing||c||(i.beforeChange(),n(!0),i.add({},a),h=!0)}}),a.on("MouseDown",function(a){i.typing&&e(a)}),a.addShortcut("meta+z","","Undo"),a.addShortcut("meta+y,meta+shift+z","","Redo"),a.on("AddUndo Undo Redo ClearUndos",function(b){b.isDefaultPrevented()||a.nodeChanged()}),i={data:k,typing:!1,beforeChange:function(){m()&&(g=a.selection.getBookmark(2,!0))},add:function(e,f){var h,i,l,n=a.settings;if(l=c.createFromEditor(a),e=e||{},e=b.extend(e,l),m()===!1||a.removed)return null;if(i=k[j],a.fire("BeforeAddUndo",{level:e,lastLevel:i,originalEvent:f}).isDefaultPrevented())return null;if(i&&c.isEq(i,e))return null;if(k[j]&&(k[j].beforeBookmark=g),n.custom_undo_redo_levels&&k.length>n.custom_undo_redo_levels){for(h=0;h0&&(d(!0),a.fire("change",o)),e},undo:function(){var b;return i.typing&&(i.add(),i.typing=!1,n(!1)),j>0&&(b=k[--j],c.applyToEditor(a,b,!0),d(!0),a.fire("undo",{level:b})),b},redo:function(){var b;return j0||i.typing&&k[0]&&!c.isEq(c.createFromEditor(a),k[0])},hasRedo:function(){return j0}function h(a){return a<0}function i(a,b){for(var c;c=a(b);)if(!y(c))return c;return null}function j(a,c,d,e,f){var j=new b(a,e);if(h(c)){if((v(a)||y(a))&&(a=i(j.prev,!0),d(a)))return a;for(;a=i(j.prev,f);)if(d(a))return a}if(g(c)){if((v(a)||y(a))&&(a=i(j.next,!0),d(a)))return a;for(;a=i(j.next,f);)if(d(a))return a}return null}function k(a,b){for(a=a.parentNode;a&&a!=b;a=a.parentNode)if(u(a))return a;return b}function l(a,b){for(;a&&a!=b;){if(w(a))return a;a=a.parentNode}return null}function m(a,b,c){return l(a.container(),c)==l(b.container(),c)}function n(a,b,c){return k(a.container(),c)==k(b.container(),c)}function o(a,b){var c,d;return b?(c=b.container(),d=b.offset(),A(c)?c.childNodes[d+a]:null):null}function p(a,b){var c=b.ownerDocument.createRange();return a?(c.setStartBefore(b),c.setEndBefore(b)):(c.setStartAfter(b),c.setEndAfter(b)),c}function q(a,b,c){return l(b,a)==l(c,a)}function r(a,b,c){var d,e;for(e=a?"previousSibling":"nextSibling";c&&c!=b;){if(d=c[e],x(d)&&(d=d[e]),v(d)){if(q(b,d,c))return d;break}if(B(d))break;c=c.parentNode}return null}function s(a,b,d){var f,g,h,i,j=z(r,!0,b),k=z(r,!1,b);if(g=d.startContainer,h=d.startOffset,e.isCaretContainerBlock(g)){if(A(g)||(g=g.parentNode),i=g.getAttribute("data-mce-caret"),"before"==i&&(f=g.nextSibling,v(f)))return C(f);if("after"==i&&(f=g.previousSibling,v(f)))return D(f)}if(!d.collapsed)return d;if(c.isText(g)){if(x(g)){if(1===a){if(f=k(g))return C(f);if(f=j(g))return D(f)}if(a===-1){if(f=j(g))return D(f);if(f=k(g))return C(f)}return d}if(e.endsWithCaretContainer(g)&&h>=g.data.length-1)return 1===a&&(f=k(g))?C(f):d;if(e.startsWithCaretContainer(g)&&h<=1)return a===-1&&(f=j(g))?D(f):d;if(h===g.data.length)return f=k(g),f?C(f):d;if(0===h)return f=j(g),f?D(f):d}return d}function t(a,b){return v(o(a,b))}var u=c.isContentEditableTrue,v=c.isContentEditableFalse,w=c.matchStyleValues("display","block table table-cell table-caption list-item"),x=e.isCaretContainer,y=e.isCaretContainerBlock,z=a.curry,A=c.isElement,B=f.isCaretCandidate,C=z(p,!0),D=z(p,!1);return{isForwards:g,isBackwards:h,findNode:j,getEditingHost:k,getParentBlock:l,isInSameBlock:m,isInSameEditingHost:n,isBeforeContentEditableFalse:z(t,0),isAfterContentEditableFalse:z(t,-1),normalizeRange:s}}),g("4m",["1j","44","1p","5i","1g","1w"],function(a,b,c,d,e,f){function g(a,b){for(var c=[];a&&a!=b;)c.push(a),a=a.parentNode;return c}function h(a,b){return a.hasChildNodes()&&b0)return c(v,--w);if(p(a)&&w0&&(y=h(v,w-1),r(y)))return!s(y)&&(z=d.findNode(y,a,t,y))?m(z)?c(z,z.data.length):c.after(z):m(y)?c(y,y.data.length):c.before(y);if(p(a)&&w0?b.from(m):b.none()},l=function(a,b,c){return a?i.isEmpty(b)?(d.remove(b),g.positionIn(!0,c.dom())):g.positionIn(!1,b.dom()).bind(function(d){return k(a,c,b,d)}):i.isEmpty(c)?(d.remove(c),g.positionIn(!0,b.dom())):g.positionIn(!1,c.dom()).bind(function(d){return k(a,b,c,d)})};return{mergeBlocks:l}}),g("4i",["5f","5g"],function(a,b){var c=function(c,d){var e;return e=a.read(c.getBody(),d,c.selection.getRng()).bind(function(a){return b.mergeBlocks(d,a.from().block(),a.to().block())}),e.each(function(a){c.selection.setRng(a.toRange())}),e.isSome()};return{backspaceDelete:c}}),g("4j",["5d","1q","1r","5h","5g"],function(a,b,c,d,e){var f=function(f,g){var h=g.getRng();return a.liftN([d.getParentTextBlock(f,c.fromDom(h.startContainer)),d.getParentTextBlock(f,c.fromDom(h.endContainer))],function(a,c){return b.eq(a,c)===!1&&(h.deleteContents(),e.mergeBlocks(!0,a,c).each(function(a){g.setRng(a.toRange())}),!0)}).getOr(!1)},g=function(a,b){var d=c.fromDom(a.getBody());return a.selection.isCollapsed()===!1&&f(d,a.selection)};return{backspaceDelete:g}}),g("66",["3x","63","60","3y","3z","49"],function(a,b,c,d,e,f){var g=function(g){if(!c.isArray(g))throw new e("cases must be an array");if(0===g.length)throw new e("there must be at least one case");var h=[],i={};return a.each(g,function(j,k){var l=b.keys(j);if(1!==l.length)throw new e("one and only one name per case");var m=l[0],n=j[m];if(void 0!==i[m])throw new e("duplicate key detected:"+m);if("cata"===m)throw new e("cannot have a case named cata (sorry)");if(!c.isArray(n))throw new e("case arguments must be an array");h.push(m),i[m]=function(){var c=arguments.length;if(c!==n.length)throw new e("Wrong number of arguments to case "+m+". Expected "+n.length+" ("+n+"), got "+c);for(var i=new d(c),j=0;jk.before(b).offset()},p=function(a,b){return o(b,a)?new k(b.container(),b.offset()-1):b},q=function(a){return m.isText(a)?new k(a,0):k.before(a)},r=function(a){return m.isText(a)?new k(a,a.data.length):k.after(a)},s=function(a){return j.isCaretCandidate(a.previousSibling)?b.some(r(a.previousSibling)):a.previousSibling?n.findCaretPositionIn(a.previousSibling,!1):b.none()},t=function(a){return j.isCaretCandidate(a.nextSibling)?b.some(q(a.nextSibling)):a.nextSibling?n.findCaretPositionIn(a.nextSibling,!0):b.none()},u=function(a,c){var d=k.before(c.previousSibling?c.previousSibling:c.parentNode);return n.findCaretPosition(a,!1,d).fold(function(){return n.findCaretPosition(a,!0,k.after(c))},b.some)},v=function(a,c){return n.findCaretPosition(a,!0,k.after(c)).fold(function(){return n.findCaretPosition(a,!1,k.before(c))},b.some)},w=function(a,b){return s(b).orThunk(function(){return t(b)}).orThunk(function(){return u(a,b)})},x=function(a,b){return t(b).orThunk(function(){return s(b)}).orThunk(function(){return v(a,b)})},y=function(a,b,c){return a?x(b,c):w(b,c)},z=function(b,c,d){return y(b,c,d).map(a.curry(p,d))},A=function(a,b,c){c.fold(function(){a.focus()},function(c){a.selection.setRng(c.toRange(),b)})},B=function(a){return function(b){return b.dom()===a}},C=function(a,b){return b&&a.schema.getBlockElements().hasOwnProperty(g.name(b))},D=function(a){if(l.isEmpty(a)){var c=f.fromHtml('
      ');return e.empty(a),d.append(a,c),b.some(k.before(c.dom()))}return b.none()},E=function(a,b){return c.liftN([i.prevSibling(a),i.nextSibling(a),b],function(b,c,d){var f,g=b.dom(),h=c.dom();return m.isText(g)&&m.isText(h)?(f=g.data.length,g.appendData(h.data),e.remove(c),e.remove(a),d.container()===h?new k(g,f):d):(e.remove(a),d)}).orThunk(function(){return e.remove(a),b})},F=function(c,d,e){var f=z(d,c.getBody(),e.dom()),g=h.ancestor(e,a.curry(C,c),B(c.getBody())),i=E(e,f);g.bind(D).fold(function(){A(c,d,i)},function(a){A(c,d,b.some(a))})};return{deleteElement:F}}),g("4k",["1r","1p","5i","5f","5j","5k","5g","1j"],function(a,b,c,d,e,f,g,h){var i=function(b,c){return function(d){return f.deleteElement(b,c,a.fromDom(d)),!0}},j=function(a,c){return function(d){var e=c?b.before(d):b.after(d);return a.selection.setRng(e.toRange()),!0}},k=function(a){return function(b){return a.selection.setRng(b.toRange()),!0}},l=function(a,b){var c=e.read(a.getBody(),b,a.selection.getRng()).map(function(c){return c.fold(i(a,b),j(a,b),k(a))});return c.getOr(!1)},m=function(b,c){var d=b.selection.getNode();return!!h.isContentEditableFalse(d)&&(f.deleteElement(b,c,a.fromDom(b.selection.getNode())),!0)},n=function(a,b){for(;b&&b!==a;){if(h.isContentEditableTrue(b)||h.isContentEditableFalse(b))return b;b=b.parentNode}return null},o=function(a){var c,d=n(a.getBody(),a.selection.getNode());return h.isContentEditableTrue(d)&&a.dom.isBlock(d)&&a.dom.isEmpty(d)&&(c=a.dom.create("br",{"data-mce-bogus":"1"}),a.dom.setHTML(d,""),d.appendChild(c),a.selection.setRng(b.before(c).toRange())),!0},p=function(a,b){return a.selection.isCollapsed()?l(a,b):m(a,b)};return{backspaceDelete:p,paddEmptyElement:o}}),g("68",["1m","1j","1l"],function(a,b,c){var d=b.isText,e=function(a){return d(a)&&a.data[0]===c.ZWSP},f=function(a){return d(a)&&a.data[a.data.length-1]===c.ZWSP},g=function(a){return a.ownerDocument.createTextNode(c.ZWSP)},h=function(a){if(d(a.previousSibling))return f(a.previousSibling)?a.previousSibling:(a.previousSibling.appendData(c.ZWSP),a.previousSibling);if(d(a))return e(a)?a:(a.insertData(0,c.ZWSP),a);var b=g(a);return a.parentNode.insertBefore(b,a),b},i=function(a){if(d(a.nextSibling))return e(a.nextSibling)?a.nextSibling:(a.nextSibling.insertData(0,c.ZWSP),a.nextSibling);if(d(a))return f(a)?a:(a.appendData(c.ZWSP),a);var b=g(a);return a.nextSibling?a.parentNode.insertBefore(b,a.nextSibling):a.parentNode.appendChild(b),b},j=function(a,b){return a?h(b):i(b)};return{insertInline:j,insertInlineBefore:a.curry(j,!0),insertInlineAfter:a.curry(j,!1)}}),g("69",["3x","1k","1p","1j","1l","9"],function(a,b,c,d,e,f){var g=d.isElement,h=d.isText,i=function(a){var b=a.parentNode;b&&b.removeChild(a)},j=function(a){try{return a.nodeValue}catch(a){return""}},k=function(a,b){0===b.length?i(a):a.nodeValue=b},l=function(a){var b=e.trim(a);return{count:a.length-b.length,text:b}},m=function(a,b){return s(a),b},n=function(a,b){var d=l(a.data.substr(0,b.offset())),e=l(a.data.substr(b.offset())),f=d.text+e.text;return f.length>0?(k(a,f),new c(a,b.offset()-d.count)):b},o=function(b,d){var e=d.container(),f=a.indexOf(e.childNodes,b).map(function(a){return a0&&h(a[a.length-1])?a.slice(0,-1):a},j=function(a,b){var c=a.getParent(b,a.isBlock);return c&&"LI"===c.nodeName?c:null},k=function(a,b){return!!j(a,b)},l=function(a,b){var c=b.cloneRange(),d=b.cloneRange();return c.setStartBefore(a),d.setEndAfter(a),[c.cloneContents(),d.cloneContents()]},m=function(a,d){var e=c.before(a),f=new b(d),g=f.next(e);return g?g.toRange():null},n=function(a,d){var e=c.after(a),f=new b(d),g=f.prev(e);return g?g.toRange():null},o=function(b,c,d,e){var f=l(b,e),g=b.parentNode;return g.insertBefore(f[0],b),a.each(c,function(a){g.insertBefore(a,b)}),g.insertBefore(f[1],b),g.removeChild(b),n(c[c.length-1],d)},p=function(b,c,d){var e=b.parentNode;return a.each(c,function(a){e.insertBefore(a,b)}),m(b,d)},q=function(a,b,c,d){return d.insertAfter(b.reverse(),a),n(b[0],c)},r=function(a,d,e,h){var k=f(d,a,h),l=j(d,e.startContainer),m=i(g(k.firstChild)),n=1,r=2,s=d.getRoot(),t=function(a){var f=c.fromRangeStart(e),g=new b(d.getRoot()),h=a===n?g.prev(f):g.next(f);return!h||j(d,h.getNode())!==l};return t(n)?p(l,m,s):t(r)?q(l,m,s,d):o(l,m,s,e)};return{isListFragment:d,insertAtCaret:r,isParentBlockLi:k,trimListItems:i,listItems:g}}),g("21",["1p","4m","1v","1j","4n","6","n","4o","9"],function(a,b,c,d,e,f,g,h,i){var j=d.matchNodeNames("td th"),k=function(a,b,c){if("all"===c.getAttribute("data-mce-bogus"))c.parentNode.insertBefore(a.dom.createFragment(b),c);else{var d=c.firstChild,e=c.lastChild;!d||d===e&&"BR"===d.nodeName?a.dom.setHTML(c,b):a.selection.setContent(b)}},l=function(d,l,m){function n(a){function b(a){return d[a]&&3==d[a].nodeType}var c,d,e;return c=I.getRng(!0),d=c.startContainer,e=c.startOffset,3==d.nodeType&&(e>0?a=a.replace(/^ /," "):b("previousSibling")||(a=a.replace(/^ /," ")),e|)$/," "):b("nextSibling")||(a=a.replace(/( | )(
      |)$/," "))),a}function o(){var a,b,c;a=I.getRng(!0),b=a.startContainer,c=a.startOffset,3==b.nodeType&&a.collapsed&&("\xa0"===b.data[c]?(b.deleteData(c,1),/[\u00a0| ]$/.test(l)||(l+=" ")):"\xa0"===b.data[c-1]&&(b.deleteData(c-1,1),/[\u00a0| ]$/.test(l)||(l=" "+l)))}function p(){if(G){var a=d.getBody(),b=new c(J);i.each(J.select("*[data-mce-fragment]"),function(c){for(var d=c.parentNode;d&&d!=a;d=d.parentNode)H[c.nodeName.toLowerCase()]&&b.compare(d,c)&&J.remove(c,!0)})}}function q(a){for(var b=a;b=b.walk();)1===b.type&&b.attr("data-mce-fragment","1")}function r(a){i.each(a.getElementsByTagName("*"),function(a){a.removeAttribute("data-mce-fragment")})}function s(a){return!!a.getAttribute("data-mce-fragment")}function t(a){return a&&!d.schema.getShortEndedElements()[a.nodeName]}function u(c){function e(a){for(var b=d.getBody();a&&a!==b;a=a.parentNode)if("false"===d.dom.getContentEditable(a))return a;return null}function g(c){var e=a.fromRangeStart(c),f=new b(d.getBody());if(e=f.next(e))return e.toRange()}var h,i,k;if(c){if(I.scrollIntoView(c),h=e(c))return J.remove(c),void I.select(h);C=J.createRng(),D=c.previousSibling,D&&3==D.nodeType?(C.setStart(D,D.nodeValue.length),f.ie||(E=c.nextSibling,E&&3==E.nodeType&&(D.appendData(E.data),E.parentNode.removeChild(E)))):(C.setStartBefore(c),C.setEndBefore(c)),i=J.getParent(c,J.isBlock),J.remove(c),i&&J.isEmpty(i)&&(d.$(i).empty(),C.setStart(i,0),C.setEnd(i,0),j(i)||s(i)||!(k=g(C))?J.add(i,J.create("br",{"data-mce-bogus":"1"})):(C=k,J.remove(i))),I.setRng(C)}}var v,w,x,y,z,A,B,C,D,E,F,G,H=d.schema.getTextInlineElements(),I=d.selection,J=d.dom;/^ | $/.test(l)&&(l=n(l)),v=d.parser,G=m.merge,w=new g({validate:d.settings.validate},d.schema),F='​',A={content:l,format:"html",selection:!0},d.fire("BeforeSetContent",A),l=A.content,l.indexOf("{$caret}")==-1&&(l+="{$caret}"),l=l.replace(/\{\$caret\}/,F),C=I.getRng();var K=C.startContainer||(C.parentElement?C.parentElement():null),L=d.getBody();K===L&&I.isCollapsed()&&J.isBlock(L.firstChild)&&t(L.firstChild)&&J.isEmpty(L.firstChild)&&(C=J.createRng(),C.setStart(L.firstChild,0),C.setEnd(L.firstChild,0),I.setRng(C)),I.isCollapsed()||(d.selection.setRng(e.normalize(d.selection.getRng())),d.getDoc().execCommand("Delete",!1,null),o()),x=I.getNode();var M={context:x.nodeName.toLowerCase(),data:m.data};if(z=v.parse(l,M),m.paste===!0&&h.isListFragment(z)&&h.isParentBlockLi(J,x))return C=h.insertAtCaret(w,J,d.selection.getRng(!0),z),d.selection.setRng(C),void d.fire("SetContent",A);if(q(z),D=z.lastChild,"mce_marker"==D.attr("id"))for(B=D,D=D.prev;D;D=D.walk(!0))if(3==D.type||!J.isBlock(D.name)){d.schema.isValidChild(D.parent.name,"span")&&D.parent.insert(B,D,"br"===D.name);break}if(d._selectionOverrides.showBlockCaretContainer(x),M.invalid){for(I.setContent(F),x=I.getNode(),y=d.getBody(),9==x.nodeType?x=D=y:D=x;D!==y;)x=D,D=D.parentNode;l=x==y?y.innerHTML:J.getOuterHTML(x),l=w.serialize(v.parse(l.replace(//i,function(){return w.serialize(z)}))),x==y?J.setHTML(y,l):J.setOuterHTML(x,l)}else l=w.serialize(z),k(d,l,x);p(),u(J.get("mce_marker")),r(d.getBody()),d.fire("SetContent",A),d.addVisual()},m=function(a){var b;return"string"!=typeof a?(b=i.extend({paste:a.paste,data:{paste:a.paste}},a),{content:a.content,details:b}):{content:a,details:{}}},n=function(a,b){var c=m(b);l(a,c.content,c.details)};return{insertAtCaret:n}}),g("v",["20","1j","h","c","6","21","9"],function(a,b,c,d,e,f,g){var h=g.each,i=g.extend,j=g.map,k=g.inArray,l=g.explode,m=e.ie&&e.ie<11,n=!0,o=!1;return function(g){function p(a,b,c,d){var e,f,i=0;if(!g.removed){if(/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(a)||d&&d.skip_focus||g.focus(),d=g.fire("BeforeExecCommand",{command:a,ui:b,value:c}),d.isDefaultPrevented())return!1;if(f=a.toLowerCase(),e=H.exec[f])return e(f,b,c),g.fire("ExecCommand",{command:a,ui:b,value:c}),!0;if(h(g.plugins,function(d){if(d.execCommand&&d.execCommand(a,b,c))return g.fire("ExecCommand",{command:a,ui:b,value:c}),i=!0,!1}),i)return i;if(g.theme&&g.theme.execCommand&&g.theme.execCommand(a,b,c))return g.fire("ExecCommand",{command:a,ui:b,value:c}),!0;try{i=g.getDoc().execCommand(a,b,c)}catch(a){}return!!i&&(g.fire("ExecCommand",{command:a,ui:b,value:c}),!0)}}function q(a){var b;if(!g.quirks.isHidden()&&!g.removed){if(a=a.toLowerCase(),b=H.state[a])return b(a);try{return g.getDoc().queryCommandState(a)}catch(a){}return!1}}function r(a){var b;if(!g.quirks.isHidden()&&!g.removed){if(a=a.toLowerCase(),b=H.value[a])return b(a);try{return g.getDoc().queryCommandValue(a)}catch(a){}}}function s(a,b){b=b||"exec",h(a,function(a,c){h(c.toLowerCase().split(","),function(c){H[b][c]=a})})}function t(a,b,c){a=a.toLowerCase(),H.exec[a]=function(a,d,e,f){return b.call(c||g,d,e,f)}}function u(a){if(a=a.toLowerCase(),H.exec[a])return!0;try{return g.getDoc().queryCommandSupported(a)}catch(a){}return!1}function v(a,b,c){a=a.toLowerCase(),H.state[a]=function(){return b.call(c||g)}}function w(a,b,c){a=a.toLowerCase(),H.value[a]=function(){return b.call(c||g)}}function x(a){return a=a.toLowerCase(),!!H.exec[a]}function y(a,b,c){return void 0===b&&(b=o),void 0===c&&(c=null),g.getDoc().execCommand(a,b,c)}function z(a){return F.match(a)}function A(a,b){F.toggle(a,b?{value:b}:void 0),g.nodeChanged()}function B(a){G=E.getBookmark(a)}function C(){E.moveToBookmark(G)}var D,E,F,G,H={state:{},exec:{},value:{}},I=g.settings;g.on("PreInit",function(){D=g.dom,E=g.selection,I=g.settings,F=g.formatter}),i(this,{execCommand:p,queryCommandState:q,queryCommandValue:r,queryCommandSupported:u,addCommands:s,addCommand:t,addQueryStateHandler:v,addQueryValueHandler:w,hasCustomCommand:x}),s({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){g.undoManager.add()},"Cut,Copy,Paste":function(a){var b,c=g.getDoc();try{y(a)}catch(a){b=n}if("paste"!==a||c.queryCommandEnabled(a)||(b=!0),b||!c.queryCommandSupported(a)){var d=g.translate("Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.");e.mac&&(d=d.replace(/Ctrl\+/g,"\u2318+")),g.notificationManager.open({text:d,type:"error"})}},unlink:function(){if(E.isCollapsed()){var a=g.dom.getParent(g.selection.getStart(),"a");return void(a&&g.dom.remove(a,!0))}F.remove("link")},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull,JustifyNone":function(a){var b=a.substring(7);"full"==b&&(b="justify"),h("left,center,right,justify".split(","),function(a){b!=a&&F.remove("align"+a)}),"none"!=b&&A("align"+b)},"InsertUnorderedList,InsertOrderedList":function(a){var b,c;y(a),b=D.getParent(E.getNode(),"ol,ul"),b&&(c=b.parentNode,/^(H[1-6]|P|ADDRESS|PRE)$/.test(c.nodeName)&&(B(),D.split(c,b),C()))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(a){A(a)},"ForeColor,HiliteColor,FontName":function(a,b,c){A(a,c)},FontSize:function(a,b,c){var d,e;c>=1&&c<=7&&(e=l(I.font_size_style_values),d=l(I.font_size_classes),c=d?d[c-1]||c:e[c-1]||c),A(a,c)},RemoveFormat:function(a){F.remove(a)},mceBlockQuote:function(){A("blockquote")},FormatBlock:function(a,b,c){return A(c||"p")},mceCleanup:function(){var a=E.getBookmark();g.setContent(g.getContent({cleanup:n}),{cleanup:n}),E.moveToBookmark(a)},mceRemoveNode:function(a,b,c){var d=c||E.getNode();d!=g.getBody()&&(B(),g.dom.remove(d,n),C())},mceSelectNodeDepth:function(a,b,c){var d=0;D.getParent(E.getNode(),function(a){if(1==a.nodeType&&d++==c)return E.select(a),o},g.getBody())},mceSelectNode:function(a,b,c){E.select(c)},mceInsertContent:function(a,b,c){f.insertAtCaret(g,c)},mceInsertRawHTML:function(a,b,c){E.setContent("tiny_mce_marker"),g.setContent(g.getContent().replace(/tiny_mce_marker/g,function(){return c}))},mceToggleFormat:function(a,b,c){A(c)},mceSetContent:function(a,b,c){g.setContent(c)},"Indent,Outdent":function(a){var b,c,d;b=I.indentation,c=/[a-z%]+$/i.exec(b),b=parseInt(b,10),q("InsertUnorderedList")||q("InsertOrderedList")?y(a):(I.forced_root_block||D.getParent(E.getNode(),D.isBlock)||F.apply("div"),h(E.getSelectedBlocks(),function(e){if("false"!==D.getContentEditable(e)&&"LI"!==e.nodeName){var f=g.getParam("indent_use_margin",!1)?"margin":"padding";f="TABLE"===e.nodeName?"margin":f,f+="rtl"==D.getStyle(e,"direction",!0)?"Right":"Left","outdent"==a?(d=Math.max(0,parseInt(e.style[f]||0,10)-b),D.setStyle(e,f,d?d+c:"")):(d=parseInt(e.style[f]||0,10)+b+c,D.setStyle(e,f,d))}}))},mceRepaint:function(){},InsertHorizontalRule:function(){g.execCommand("mceInsertContent",!1,"
      ")},mceToggleVisualAid:function(){g.hasVisual=!g.hasVisual,g.addVisual()},mceReplaceContent:function(a,b,c){g.execCommand("mceInsertContent",!1,c.replace(/\{\$selection\}/g,E.getContent({format:"text"})))},mceInsertLink:function(a,b,c){var d;"string"==typeof c&&(c={href:c}),d=D.getParent(E.getNode(),"a"),c.href=c.href.replace(" ","%20"),d&&c.href||F.remove("link"),c.href&&F.apply("link",c,d)},selectAll:function(){var a,c=D.getRoot();if(E.getRng().setStart){var d=D.getParent(E.getStart(),b.isContentEditableTrue);d&&(a=D.createRng(),a.selectNodeContents(d),E.setRng(a))}else a=E.getRng(),a.item||(a.moveToElementText(c),a.select())},"delete":function(){a.deleteCommand(g)},forwardDelete:function(){a.forwardDeleteCommand(g)},mceNewDocument:function(){g.setContent("")},InsertLineBreak:function(a,b,e){function f(){for(var a,b=new d(p,r),c=g.schema.getNonEmptyElements();a=b.next();)if(c[a.nodeName.toLowerCase()]||a.length>0)return!0}var h,i,j,k=e,l=E.getRng(!0);new c(D).normalize(l);var o=l.startOffset,p=l.startContainer;if(1==p.nodeType&&p.hasChildNodes()){var q=o>p.childNodes.length-1;p=p.childNodes[Math.min(o,p.childNodes.length-1)]||p,o=q&&3==p.nodeType?p.nodeValue.length:0}var r=D.getParent(p,D.isBlock),s=r?r.nodeName.toUpperCase():"",t=r?D.getParent(r.parentNode,D.isBlock):null,u=t?t.nodeName.toUpperCase():"",v=k&&k.ctrlKey;"LI"!=u||v||(r=t,s=u),p&&3==p.nodeType&&o>=p.nodeValue.length&&(m||f()||(h=D.create("br"),l.insertNode(h),l.setStartAfter(h),l.setEndAfter(h),i=!0)),h=D.create("br"),l.insertNode(h);var w=D.doc.documentMode;return m&&"PRE"==s&&(!w||w<8)&&h.parentNode.insertBefore(D.doc.createTextNode("\r"),h),j=D.create("span",{}," "),h.parentNode.insertBefore(j,h),E.scrollIntoView(j),D.remove(j),i?(l.setStartBefore(h),l.setEndBefore(h)):(l.setStartAfter(h),l.setEndAfter(h)),E.setRng(l),g.undoManager.add(),n}}),s({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(a){var b="align"+a.substring(7),c=E.isCollapsed()?[D.getParent(E.getNode(),D.isBlock)]:E.getSelectedBlocks(),d=j(c,function(a){return!!F.matchNode(a,b)});return k(d,n)!==-1},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(a){return z(a)},mceBlockQuote:function(){return z("blockquote")},Outdent:function(){var a;if(I.inline_styles){if((a=D.getParent(E.getStart(),D.isBlock))&&parseInt(a.style.paddingLeft,10)>0)return n;if((a=D.getParent(E.getEnd(),D.isBlock))&&parseInt(a.style.paddingLeft,10)>0)return n}return q("InsertUnorderedList")||q("InsertOrderedList")||!I.inline_styles&&!!D.getParent(E.getNode(),"BLOCKQUOTE")},"InsertUnorderedList,InsertOrderedList":function(a){var b=D.getParent(E.getNode(),"ul,ol");return b&&("insertunorderedlist"===a&&"UL"===b.tagName||"insertorderedlist"===a&&"OL"===b.tagName)}},"state"),s({"FontSize,FontName":function(a){var b,c=0;return(b=D.getParent(E.getNode(),"span"))&&(c="fontsize"==a?b.style.fontSize:b.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()),c}},"value"),s({Undo:function(){g.undoManager.undo()},Redo:function(){g.undoManager.redo()}})}}),g("w",["22","9"],function(a,b){function c(b,g){var h,i,j=this;if(b=e(b),g=j.settings=g||{},h=g.base_uri,/^([\w\-]+):([^\/]{2})/i.test(b)||/^\s*#/.test(b))return void(j.source=b);var k=0===b.indexOf("//");0!==b.indexOf("/")||k||(b=(h?h.protocol||"http":"http")+"://mce_host"+b),/^[\w\-]*:?\/\//.test(b)||(i=g.base_uri?g.base_uri.path:new c(a.location.href).directory,""===g.base_uri.protocol?b="//mce_host"+j.toAbsPath(i,b):(b=/([^#?]*)([#?]?.*)/.exec(b),b=(h&&h.protocol||"http")+"://mce_host"+j.toAbsPath(i,b[1])+b[2])),b=b.replace(/@@/g,"(mce_at)"),b=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(b),d(f,function(a,c){var d=b[c];d&&(d=d.replace(/\(mce_at\)/g,"@@")),j[a]=d}),h&&(j.protocol||(j.protocol=h.protocol),j.userInfo||(j.userInfo=h.userInfo),j.port||"mce_host"!==j.host||(j.port=h.port),j.host&&"mce_host"!==j.host||(j.host=h.host),j.source=""),k&&(j.protocol="")}var d=b.each,e=b.trim,f="source protocol authority userInfo user password host port relative path directory file query anchor".split(" "),g={ftp:21,http:80,https:443,mailto:25};return c.prototype={setPath:function(a){var b=this;a=/^(.*?)\/?(\w+)?$/.exec(a),b.path=a[0],b.directory=a[1],b.file=a[2],b.source="",b.getURI()},toRelative:function(a){var b,d=this;if("./"===a)return a;if(a=new c(a,{base_uri:d}),"mce_host"!=a.host&&d.host!=a.host&&a.host||d.port!=a.port||d.protocol!=a.protocol&&""!==a.protocol)return a.getURI();var e=d.getURI(),f=a.getURI();return e==f||"/"==e.charAt(e.length-1)&&e.substr(0,e.length-1)==f?e:(b=d.toRelPath(d.path,a.path),a.query&&(b+="?"+a.query),a.anchor&&(b+="#"+a.anchor),b)},toAbsolute:function(a,b){return a=new c(a,{base_uri:this}),a.getURI(b&&this.isSameOrigin(a))},isSameOrigin:function(a){if(this.host==a.host&&this.protocol==a.protocol){if(this.port==a.port)return!0;var b=g[this.protocol];if(b&&(this.port||b)==(a.port||b))return!0}return!1},toRelPath:function(a,b){var c,d,e,f=0,g="";if(a=a.substring(0,a.lastIndexOf("/")),a=a.split("/"),c=b.split("/"),a.length>=c.length)for(d=0,e=a.length;d=c.length||a[d]!=c[d]){f=d+1;break}if(a.length=a.length||a[d]!=c[d]){f=d+1;break}if(1===f)return b;for(d=0,e=a.length-(f-1);d=0;c--)0!==b[c].length&&"."!==b[c]&&(".."!==b[c]?g>0?g--:h.push(b[c]):g++);return c=a.length-g,f=c<=0?h.reverse().join("/"):a.slice(0,c).join("/")+"/"+h.reverse().join("/"),0!==f.indexOf("/")&&(f="/"+f),e&&f.lastIndexOf("/")!==f.length-1&&(f+=e),f},getURI:function(a){var b,c=this;return c.source&&!a||(b="",a||(b+=c.protocol?c.protocol+"://":"//",c.userInfo&&(b+=c.userInfo+"@"),c.host&&(b+=c.host),c.port&&(b+=":"+c.port)),c.path&&(b+=c.path),c.query&&(b+="?"+c.query),c.anchor&&(b+="#"+c.anchor),c.source=b),c.source}},c.parseDataUri=function(a){var b,c;return a=decodeURIComponent(a).split(","),c=/data:([^;]+)/.exec(a[0]),c&&(b=c[1]),{type:b,data:a[1]}},c.getDocumentBaseUrl=function(a){var b;return b=0!==a.protocol.indexOf("http")&&"file:"!==a.protocol?a.href:a.protocol+"//"+a.host+a.pathname,/^[^:]+:\/\/\/?[^\/]+\//.test(b)&&(b=b.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(b)||(b+="/")),b},c}),g("x",["9"],function(a){function b(){}var c,d,e=a.each,f=a.extend;return b.extend=c=function(a){function b(){var a,b,c,e=this;if(!d&&(e.init&&e.init.apply(e,arguments),b=e.Mixins))for(a=b.length;a--;)c=b[a],c.init&&c.init.apply(e,arguments)}function g(){return this}function h(a,b){return function(){var c,d=this,e=d._super;return d._super=m[a],c=b.apply(d,arguments),d._super=e,c}}var i,j,k,l=this,m=l.prototype;d=!0,i=new l,d=!1,a.Mixins&&(e(a.Mixins,function(b){for(var c in b)"init"!==c&&(a[c]=b[c])}),m.Mixins&&(a.Mixins=m.Mixins.concat(a.Mixins))),a.Methods&&e(a.Methods.split(","),function(b){a[b]=g}),a.Properties&&e(a.Properties.split(","),function(b){var c="_"+b;a[b]=function(a){var b,d=this;return a!==b?(d[c]=a,d):d[c]}}),a.Statics&&e(a.Statics,function(a,c){b[c]=a}),a.Defaults&&m.Defaults&&(a.Defaults=f({},m.Defaults,a.Defaults));for(j in a)k=a[j],"function"==typeof k&&m[j]?i[j]=h(j,k):i[j]=k;return b.prototype=i,b.constructor=b,b.extend=c,b},b}),g("y",["9"],function(a){function b(b){function c(){return!1}function d(){return!0}function e(a,e){var f,h,i,k;if(a=a.toLowerCase(),e=e||{},e.type=a,e.target||(e.target=j),e.preventDefault||(e.preventDefault=function(){e.isDefaultPrevented=d},e.stopPropagation=function(){e.isPropagationStopped=d},e.stopImmediatePropagation=function(){e.isImmediatePropagationStopped=d},e.isDefaultPrevented=c,e.isPropagationStopped=c,e.isImmediatePropagationStopped=c),b.beforeFire&&b.beforeFire(e),f=m[a])for(h=0,i=f.length;h0}function f(a,b){var c,g;if(a===b)return!0;if(null===a||null===b)return a===b;if("object"!=typeof a||"object"!=typeof b)return a===b;if(d.isArray(b)){if(a.length!==b.length)return!1;for(c=a.length;c--;)if(!f(a[c],b[c]))return!1}if(e(a)||e(b))return a===b;g={};for(c in b){if(!f(a[c],b[c]))return!1;g[c]=!0}for(c in a)if(!g[c]&&!f(a[c],b[c]))return!1;return!0}return b.extend({Mixins:[c],init:function(b){var c,d;b=b||{};for(c in b)d=b[c],d instanceof a&&(b[c]=d.create(this,c));this.data=b},set:function(b,c){var d,e,g=this.data[b];if(c instanceof a&&(c=c.create(this,b)),"object"==typeof b){for(d in b)this.set(d,b[d]);return this}return f(g,c)||(this.data[b]=c,e={target:this,name:b,value:c,oldValue:g},this.fire("change:"+b,e),this.fire("change",e)),this},get:function(a){return this.data[a]},has:function(a){return a in this.data},bind:function(b){return a.create(this,b)},destroy:function(){this.fire("destroy")}})}),g("2d",["x"],function(a){"use strict";function b(a){for(var b,c=[],d=a.length;d--;)b=a[d],b.__checked||(c.push(b),b.__checked=1);for(d=c.length;d--;)delete c[d].__checked;return c}var c,d=/^([\w\\*]+)?(?:#([\w\-\\]+))?(?:\.([\w\\\.]+))?(?:\[\@?([\w\\]+)([\^\$\*!~]?=)([\w\\]+)\])?(?:\:(.+))?/i,e=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,f=/^\s*|\s*$/g,g=a.extend({init:function(a){function b(a){if(a)return a=a.toLowerCase(),function(b){return"*"===a||b.type===a}}function c(a){if(a)return function(b){return b._name===a}}function g(a){if(a)return a=a.split("."),function(b){for(var c=a.length;c--;)if(!b.classes.contains(a[c]))return!1;return!0}}function h(a,b,c){if(a)return function(d){var e=d[a]?d[a]():"";return b?"="===b?e===c:"*="===b?e.indexOf(c)>=0:"~="===b?(" "+e+" ").indexOf(" "+c+" ")>=0:"!="===b?e!=c:"^="===b?0===e.indexOf(c):"$="===b&&e.substr(e.length-c.length)===c:!!c}}function i(a){var b;if(a)return a=/(?:not\((.+)\))|(.+)/i.exec(a),a[1]?(b=k(a[1],[]),function(a){return!l(a,b)}):(a=a[2],function(b,c,d){return"first"===a?0===c:"last"===a?c===d-1:"even"===a?c%2===0:"odd"===a?c%2===1:!!b[a]&&b[a]()})}function j(a,e,j){function k(a){a&&e.push(a)}var l;return l=d.exec(a.replace(f,"")),k(b(l[1])),k(c(l[2])),k(g(l[3])),k(h(l[4],l[5],l[6])),k(i(l[7])),e.pseudo=!!l[7],e.direct=j,e}function k(a,b){var c,d,f,g=[];do if(e.exec(""),d=e.exec(a),d&&(a=d[3],g.push(d[1]),d[2])){c=d[3];break}while(d);for(c&&k(c,b),a=[],f=0;f"!=g[f]&&a.push(j(g[f],[],">"===g[f-1]));return b.push(a),b}var l=this.match;this._selectors=k(a,[])},match:function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o;for(b=b||this._selectors,c=0,d=b.length;c=0;e--)for(j=g[e];o;){if(j.pseudo)for(m=o.parent().items(),k=l=m.length;k--&&m[k]!==o;);for(h=0,i=j.length;h1&&(h=b(h))}return c||(c=g.Collection),new c(h)}});return g}),g("2e",["9","2d","x"],function(a,b,c){"use strict";var d,e,f=Array.prototype.push,g=Array.prototype.slice;return e={length:0,init:function(a){a&&this.add(a)},add:function(b){var c=this;return a.isArray(b)?f.apply(c,b):b instanceof d?c.add(b.toArray()):f.call(c,b),c},set:function(a){var b,c=this,d=c.length;for(c.length=0,c.add(a),b=c.length;b0&&(a+=" "),a+=this.prefix+this.cls[b];return a},c}),g("2f",["5"],function(a){var b,c={};return{add:function(d){var e=d.parent();if(e){if(!e._layout||e._layout.isNative())return;c[e._id]||(c[e._id]=e),b||(b=!0,a.requestAnimationFrame(function(){var a,d;b=!1;for(a in c)d=c[a],d.state.get("rendered")&&d.reflow();c={}},document.body))}},remove:function(a){c[a._id]&&delete c[a._id]}}}),g("2g",["x","9","y","4p","2e","4q","a","4r","4s","2f"],function(a,b,c,d,e,f,g,h,i,j){"use strict";function k(a){return a._eventDispatcher||(a._eventDispatcher=new c({scope:a,toggleEvent:function(b,d){d&&c.isNative(b)&&(a._nativeEvents||(a._nativeEvents={}),a._nativeEvents[b]=!0,a.state.get("rendered")&&l(a))}})),a._eventDispatcher}function l(a){function b(b){var c=a.getParentCtrl(b.target);c&&c.fire(b.type,b)}function c(){var a=j._lastHoverCtrl;a&&(a.fire("mouseleave",{target:a.getEl()}),a.parents().each(function(a){a.fire("mouseleave",{target:a.getEl()})}),j._lastHoverCtrl=null)}function d(b){var c,d,e,f=a.getParentCtrl(b.target),g=j._lastHoverCtrl,h=0;if(f!==g){if(j._lastHoverCtrl=f,d=f.parents().toArray().reverse(),d.push(f),g){for(e=g.parents().toArray().reverse(),e.push(g),h=0;h=h;c--)g=e[c],g.fire("mouseleave",{target:g.getEl()})}for(c=h;ci.maxW?i.maxW:c,i.w=c,i.innerW=c-d),c=a.h,c!==f&&(c=ci.maxH?i.maxH:c,i.h=c,i.innerH=c-e),c=a.innerW,c!==f&&(c=ci.maxW-d?i.maxW-d:c,i.innerW=c,i.w=c+d),c=a.innerH,c!==f&&(c=ci.maxH-e?i.maxH-e:c,i.innerH=c,i.h=c+e),a.contentW!==f&&(i.contentW=a.contentW),a.contentH!==f&&(i.contentH=a.contentH),b=h._lastLayoutRect,b.x===i.x&&b.y===i.y&&b.w===i.w&&b.h===i.h||(g=m.repaintControls,g&&g.map&&!g.map[h._id]&&(g.push(h),g.map[h._id]=!0),b.x=i.x,b.y=i.y,b.w=i.w,b.h=i.h),h):i},repaint:function(){var a,b,c,d,e,f,g,h,i,j,k=this;i=document.createRange?function(a){return a}:Math.round,a=k.getEl().style,d=k._layoutRect,h=k._lastRepaintRect||{},e=k.borderBox,f=e.left+e.right,g=e.top+e.bottom,d.x!==h.x&&(a.left=i(d.x)+"px",h.x=d.x),d.y!==h.y&&(a.top=i(d.y)+"px",h.y=d.y),d.w!==h.w&&(j=i(d.w-f),a.width=(j>=0?j:0)+"px",h.w=d.w),d.h!==h.h&&(j=i(d.h-g),a.height=(j>=0?j:0)+"px",h.h=d.h),k._hasBody&&d.innerW!==h.innerW&&(j=i(d.innerW),c=k.getEl("body"),c&&(b=c.style,b.width=(j>=0?j:0)+"px"),h.innerW=d.innerW),k._hasBody&&d.innerH!==h.innerH&&(j=i(d.innerH),c=c||k.getEl("body"),c&&(b=b||c.style,b.height=(j>=0?j:0)+"px"),h.innerH=d.innerH),k._lastRepaintRect=h,k.fire("repaint",{},!1)},updateLayoutRect:function(){var a=this;a.parent()._lastRect=null,f.css(a.getEl(),{width:"",height:""}),a._layoutRect=a._lastRepaintRect=a._lastLayoutRect=null,a.initLayoutRect()},on:function(a,b){function c(a){var b,c;return"string"!=typeof a?a:function(e){return b||d.parentsAndSelf().each(function(d){var e=d.settings.callbacks;if(e&&(b=e[a]))return c=d,!1}),b?b.call(c,e):(e.action=a,void this.fire("execute",e))}}var d=this;return k(d).on(a,c(b)),d},off:function(a,b){return k(this).off(a,b),this},fire:function(a,b,c){var d=this;if(b=b||{},b.control||(b.control=d),b=k(d).fire(a,b),c!==!1&&d.parent)for(var e=d.parent();e&&!b.isPropagationStopped();)e.fire(a,b,!1),e=e.parent();return b},hasEventListeners:function(a){return k(this).has(a)},parents:function(a){var b,c=this,d=new e;for(b=c.parent();b;b=b.parent())d.add(b);return a&&(d=d.filter(a)),d},parentsAndSelf:function(a){return new e(this).add(this.parents(a))},next:function(){var a=this.parent().items();return a[a.indexOf(this)+1]},prev:function(){var a=this.parent().items();return a[a.indexOf(this)-1]},innerHtml:function(a){return this.$el.html(a),this},getEl:function(a){var b=a?this._id+"-"+a:this._id;return this._elmCache[b]||(this._elmCache[b]=g("#"+b)[0]),this._elmCache[b]},show:function(){return this.visible(!0)},hide:function(){return this.visible(!1)},focus:function(){try{this.getEl().focus()}catch(a){}return this},blur:function(){return this.getEl().blur(),this},aria:function(a,b){var c=this,d=c.getEl(c.ariaTarget);return"undefined"==typeof b?c._aria[a]:(c._aria[a]=b,c.state.get("rendered")&&d.setAttribute("role"==a?a:"aria-"+a,b),c)},encode:function(a,b){return b!==!1&&(a=this.translate(a)),(a||"").replace(/[&<>"]/g,function(a){return"&#"+a.charCodeAt(0)+";"})},translate:function(a){return m.translate?m.translate(a):a},before:function(a){var b=this,c=b.parent();return c&&c.insert(a,c.items().indexOf(b),!0),b},after:function(a){var b=this,c=b.parent();return c&&c.insert(a,c.items().indexOf(b)),b},remove:function(){var a,b,c=this,d=c.getEl(),e=c.parent();if(c.items){var f=c.items().toArray();for(b=f.length;b--;)f[b].remove()}e&&e.items&&(a=[],e.items().each(function(b){b!==c&&a.push(b)}),e.items().set(a),e._lastRect=null),c._eventsRoot&&c._eventsRoot==c&&g(d).off();var h=c.getRoot().controlIdLookup;return h&&delete h[c._id],d&&d.parentNode&&d.parentNode.removeChild(d),c.state.set("rendered",!1),c.state.destroy(),c.fire("remove"),c},renderBefore:function(a){return g(a).before(this.renderHtml()),this.postRender(),this},renderTo:function(a){return g(a||this.getContainerElm()).append(this.renderHtml()),this.postRender(),this},preRender:function(){},render:function(){},renderHtml:function(){return'
      '},postRender:function(){var a,b,c,d,e,f=this,h=f.settings;f.$el=g(f.getEl()),f.state.set("rendered",!0);for(d in h)0===d.indexOf("on")&&f.on(d.substr(2),h[d]);if(f._eventsRoot){for(c=f.parent();!e&&c;c=c.parent())e=c._eventsRoot;if(e)for(d in e._nativeEvents)f._nativeEvents[d]=!0}l(f),h.style&&(a=f.getEl(),a&&(a.setAttribute("style",h.style),a.style.cssText=h.style)),f.settings.border&&(b=f.borderBox,f.$el.css({"border-top-width":b.top,"border-right-width":b.right,"border-bottom-width":b.bottom,"border-left-width":b.left}));var i=f.getRoot();i.controlIdLookup||(i.controlIdLookup={}),i.controlIdLookup[f._id]=f;for(var k in f._aria)f.aria(k,f._aria[k]);f.state.get("visible")===!1&&(f.getEl().style.display="none"),f.bindStates(),f.state.on("change:visible",function(a){var b,c=a.value;f.state.get("rendered")&&(f.getEl().style.display=c===!1?"none":"",f.getEl().getBoundingClientRect()),b=f.parent(),b&&(b._lastRect=null),f.fire(c?"show":"hide"),j.add(f)}),f.fire("postrender",{},!1)},bindStates:function(){},scrollIntoView:function(a){function b(a,b){var c,d,e=a;for(c=d=0;e&&e!=b&&e.nodeType;)c+=e.offsetLeft||0,d+=e.offsetTop||0,e=e.offsetParent;return{x:c,y:d}}var c,d,e,f,g,h,i=this.getEl(),j=i.parentNode,k=b(i,j);return c=k.x,d=k.y,e=i.offsetWidth,f=i.offsetHeight,g=j.clientWidth,h=j.clientHeight,"end"==a?(c-=g-e,d-=h-f):"center"==a&&(c-=g/2-e/2,d-=h/2-f/2),j.scrollLeft=c,j.scrollTop=d,this},getRoot:function(){for(var a,b=this,c=[];b;){if(b.rootControl){a=b.rootControl;break}c.push(b),a=b,b=b.parent()}a||(a=this);for(var d=c.length;d--;)c[d].rootControl=a;return a},reflow:function(){j.remove(this);var a=this.parent();return a&&a._layout&&!a._layout.isNative()&&a.reflow(),this}};return b.each("text title visible disabled active value".split(" "),function(a){r[a]=function(b){return 0===arguments.length?this.state.get(a):("undefined"!=typeof b&&this.state.set(a,b),this)}}),m=a.extend(r)}),g("2h",[],function(){"use strict";var a={};return{add:function(b,c){a[b.toLowerCase()]=c},has:function(b){return!!a[b.toLowerCase()]},create:function(b,c){var d;if("string"==typeof b?(c=c||{},c.type=b):(c=b,b=c.type),b=b.toLowerCase(),d=a[b],!d)throw new Error("Could not find control by type: "+b);return d=new d(c),d.type=b,d}}}),g("2i",[],function(){"use strict";var a=function(a){return!!a.getAttribute("data-mce-tabstop")};return function(b){function c(a){return a&&1===a.nodeType}function d(a){return a=a||u,c(a)?a.getAttribute("role"):null}function e(a){for(var b,c=a||u;c=c.parentNode;)if(b=d(c))return b}function f(a){var b=u;if(c(b))return b.getAttribute("aria-"+a)}function g(a){var b=a.tagName.toUpperCase();return"INPUT"==b||"TEXTAREA"==b||"SELECT"==b}function h(b){return!(!g(b)||b.hidden)||(!!a(b)||!!/^(button|menuitem|checkbox|tab|menuitemcheckbox|option|gridcell|slider)$/.test(d(b)))}function i(a){function b(a){if(1==a.nodeType&&"none"!=a.style.display&&!a.disabled){h(a)&&c.push(a);for(var d=0;d=b.length&&(a=0),b[a]&&b[a].focus(),a}function m(a,b){var c=-1,d=j();b=b||i(d.getEl());for(var e=0;e=0&&(c=b.getEl(),c&&c.parentNode.removeChild(c),c=a.getEl(),c&&c.parentNode.removeChild(c)),b.parent(this)},create:function(b){var c,e=this,g=[];return f.isArray(b)||(b=[b]),f.each(b,function(b){b&&(b instanceof a||("string"==typeof b&&(b={type:b}),c=f.extend({},e.settings.defaults,b),b.type=c.type=c.type||b.type||e.settings.defaultType||(c.defaults?c.defaults.type:null),b=d.create(c)),g.push(b))}),g},renderNew:function(){var a=this;return a.items().each(function(b,c){var d;b.parent(a),b.state.get("rendered")||(d=a.getEl("body"),d.hasChildNodes()&&c<=d.childNodes.length-1?g(d.childNodes[c]).before(b.renderHtml()):g(d).append(b.renderHtml()),b.postRender(),i.add(b))}),a._layout.applyClasses(a.items().filter(":visible")),a._lastRect=null,a},append:function(a){return this.add(a).renderNew()},prepend:function(a){var b=this;return b.items().set(b.create(a).concat(b.items().toArray())),b.renderNew()},insert:function(a,b,c){var d,e,f,g=this;return a=g.create(a),d=g.items(),!c&&b=0&&b
      '+(a.settings.html||"")+b.renderHtml(a)+"
      "},postRender:function(){var a,b=this;return b.items().exec("postRender"),b._super(),b._layout.postRender(b),b.state.set("rendered",!0),b.settings.style&&b.$el.css(b.settings.style),b.settings.border&&(a=b.borderBox,b.$el.css({"border-top-width":a.top,"border-right-width":a.right,"border-bottom-width":a.bottom,"border-left-width":a.left})),b.parent()||(b.keyboardNav=new e({root:b})),b},initLayoutRect:function(){var a=this,b=a._super();return a._layout.recalc(a),b},recalc:function(){var a=this,b=a._layoutRect,c=a._lastRect;if(!c||c.w!=b.w||c.h!=b.h)return a._layout.recalc(a),b=a.layoutRect(),a._lastRect={x:b.x,y:b.y,w:b.w,h:b.h},!0},reflow:function(){var b;if(i.remove(this),this.visible()){for(a.repaintControls=[],a.repaintControls.map={},this.recalc(),b=a.repaintControls.length;b--;)a.repaintControls[b].repaint();"flow"!==this.settings.layout&&"stack"!==this.settings.layout&&this.repaint(),a.repaintControls=[]}return this}})}),g("2k",["a"],function(a){"use strict";function b(a){var b,c,d,e,f,g,h,i,j=Math.max;return b=a.documentElement,c=a.body,d=j(b.scrollWidth,c.scrollWidth),e=j(b.clientWidth,c.clientWidth),f=j(b.offsetWidth,c.offsetWidth),g=j(b.scrollHeight,c.scrollHeight),h=j(b.clientHeight,c.clientHeight),i=j(b.offsetHeight,c.offsetHeight),{width:d
      ").css({position:"absolute",top:0,left:0,width:p.width,height:p.height,zIndex:2147483647,opacity:1e-4,cursor:o}).appendTo(n.body),a(n).on("mousemove touchmove",k).on("mouseup touchend",j),e.start(d)},k=function(a){return c(a),a.button!==h?j(a):(a.deltaX=a.screenX-l,a.deltaY=a.screenY-m,a.preventDefault(),void e.drag(a))},j=function(b){c(b),a(n).off("mousemove touchmove",k).off("mouseup touchend",j),g.remove(),e.stop&&e.stop(b)},this.destroy=function(){a(f()).off()},a(f()).on("mousedown touchstart",i)}}),g("2l",["a","2k"],function(a,b){"use strict";return{init:function(){var a=this;a.on("repaint",a.renderScroll)},renderScroll:function(){function c(){function b(b,g,h,i,j,k){var l,m,n,o,p,q,r,s,t;if(m=e.getEl("scroll"+b)){if(s=g.toLowerCase(),t=h.toLowerCase(),a(e.getEl("absend")).css(s,e.layoutRect()[i]-1),!j)return void a(m).css("display","none");a(m).css("display","block"),l=e.getEl("body"),n=e.getEl("scroll"+b+"t"),o=l["client"+h]-2*f,o-=c&&d?m["client"+k]:0,p=l["scroll"+h],q=o/p,r={},r[s]=l["offset"+g]+f,r[t]=o,a(m).css(r),r={},r[s]=l["scroll"+g]*q,r[t]=o*q,a(n).css(r)}}var c,d,g;g=e.getEl("body"),c=g.scrollWidth>g.clientWidth,d=g.scrollHeight>g.clientHeight,b("h","Left","Width","contentW",c,"Height"),b("v","Top","Height","contentH",d,"Width")}function d(){function c(c,d,g,h,i){var j,k=e._id+"-scroll"+c,l=e.classPrefix;a(e.getEl()).append('
      '),e.draghelper=new b(k+"t",{start:function(){j=e.getEl("body")["scroll"+d],a("#"+k).addClass(l+"active")},drag:function(a){var b,k,l,m,n=e.layoutRect();k=n.contentW>n.innerW,l=n.contentH>n.innerH,m=e.getEl("body")["client"+g]-2*f,m-=k&&l?e.getEl("scroll"+c)["client"+i]:0,b=m/e.getEl("body")["scroll"+g],e.getEl("body")["scroll"+d]=j+a["delta"+h]/b},stop:function(){a("#"+k).removeClass(l+"active")}})}e.classes.add("scroll"),c("v","Top","Height","Y","Width"),c("h","Left","Width","X","Height")}var e=this,f=2; +e.settings.autoScroll&&(e._hasScroll||(e._hasScroll=!0,d(),e.on("wheel",function(a){var b=e.getEl("body");b.scrollLeft+=10*(a.deltaX||0),b.scrollTop+=10*a.deltaY,c()}),a(e.getEl("body")).on("scroll",c)),c())}}}),g("2m",["2j","2l"],function(a,b){"use strict";return a.extend({Defaults:{layout:"fit",containerCls:"panel"},Mixins:[b],renderHtml:function(){var a=this,b=a._layout,c=a.settings.html;return a.preRender(),b.preRender(a),"undefined"==typeof c?c='
      '+b.renderHtml(a)+"
      ":("function"==typeof c&&(c=c.call(a)),a._hasBody=!1),'
      '+(a._preBodyHtml||"")+c+"
      "}})}),g("2n",["4q"],function(a){"use strict";function b(b,c,d){var e,f,g,h,i,j,k,l,m,n;return m=a.getViewPort(),f=a.getPos(c),g=f.x,h=f.y,b.state.get("fixed")&&"static"==a.getRuntimeStyle(document.body,"position")&&(g-=m.x,h-=m.y),e=b.getEl(),n=a.getSize(e),i=n.width,j=n.height,n=a.getSize(c),k=n.width,l=n.height,d=(d||"").split(""),"b"===d[0]&&(h+=l),"r"===d[1]&&(g+=k),"c"===d[0]&&(h+=Math.round(l/2)),"c"===d[1]&&(g+=Math.round(k/2)),"b"===d[3]&&(h-=j),"r"===d[4]&&(g-=i),"c"===d[3]&&(h-=Math.round(j/2)),"c"===d[4]&&(g-=Math.round(i/2)),{x:g,y:h,w:i,h:j}}return{testMoveRel:function(c,d){for(var e=a.getViewPort(),f=0;f0&&g.x+g.w0&&g.y+g.he.x&&g.x+g.we.y&&g.y+g.hb?(a=b-c,a<0?0:a):a}var e=this;if(e.settings.constrainToViewport){var f=a.getViewPort(window),g=e.layoutRect();b=d(b,f.w+f.x,g.w),c=d(c,f.h+f.y,g.h)}return e.state.get("rendered")?e.layoutRect({x:b,y:c}).repaint():(e.settings.x=b,e.settings.y=c),e.fire("move",{x:b,y:c}),e}}}),g("2o",["4q"],function(a){"use strict";return{resizeToContent:function(){this._layoutRect.autoResize=!0,this._lastRect=null,this.reflow()},resizeTo:function(b,c){if(b<=1||c<=1){var d=a.getWindowSize();b=b<=1?b*d.w:b,c=c<=1?c*d.h:c}return this._layoutRect.autoResize=!1,this.layoutRect({minW:b,minH:c,w:b,h:c}).reflow()},resizeBy:function(a,b){var c=this,d=c.layoutRect();return c.resizeTo(d.w+a,d.h+b)}}}),g("2p",["2m","2n","2o","4q","a","5"],function(a,b,c,d,e,f){"use strict";function g(a,b){for(;a;){if(a==b)return!0;a=a.parent()}}function h(a){for(var b=s.length;b--;){var c=s[b],d=c.getParentCtrl(a.target);if(c.settings.autohide){if(d&&(g(d,c)||c.parent()===d))continue;a=c.fire("autohide",{target:a.target}),a.isDefaultPrevented()||c.hide()}}}function i(){o||(o=function(a){2!=a.button&&h(a)},e(document).on("click touchstart",o))}function j(){p||(p=function(){var a;for(a=s.length;a--;)l(s[a])},e(window).on("scroll",p))}function k(){if(!q){var a=document.documentElement,b=a.clientWidth,c=a.clientHeight;q=function(){document.all&&b==a.clientWidth&&c==a.clientHeight||(b=a.clientWidth,c=a.clientHeight,u.hideAll())},e(window).on("resize",q)}}function l(a){function b(b,c){for(var d,e=0;ec&&(a.fixed(!1).layoutRect({y:a._autoFixY}).repaint(),b(!1,a._autoFixY-c)):(a._autoFixY=a.layoutRect().y,a._autoFixY').appendTo(b.getContainerElm())),f.setTimeout(function(){c.addClass(d+"in"),e(b.getEl()).addClass(d+"in")}),r=!0),m(!0,b)}}),b.on("show",function(){b.parents().each(function(a){if(a.state.get("fixed"))return b.fixed(!0),!1})}),a.popover&&(b._preBodyHtml='
      ',b.classes.add("popover").add("bottom").add(b.isRtl()?"end":"start")),b.aria("label",a.ariaLabel),b.aria("labelledby",b._id),b.aria("describedby",b.describedBy||b._id+"-none")},fixed:function(a){var b=this;if(b.state.get("fixed")!=a){if(b.state.get("rendered")){var c=d.getViewPort();a?b.layoutRect().y-=c.y:b.layoutRect().y+=c.y}b.classes.toggle("fixed",a),b.state.set("fixed",a)}return b},show:function(){var a,b=this,c=b._super();for(a=s.length;a--&&s[a]!==b;);return a===-1&&s.push(b),c},hide:function(){return n(this),m(!1,this),this._super()},hideAll:function(){u.hideAll()},close:function(){var a=this;return a.fire("close").isDefaultPrevented()||(a.remove(),m(!1,a)),a},remove:function(){n(this),this._super()},postRender:function(){var a=this;return a.settings.bodyRole&&this.getEl("body").setAttribute("role",a.settings.bodyRole),a._super()}});return u.hideAll=function(){for(var a=s.length;a--;){var b=s[a];b&&b.settings.autohide&&(b.hide(),s.splice(a,1))}},u}),g("23",["2p","2m","4q","a","2k","4r","6","5"],function(a,b,c,d,e,f,g,h){"use strict";function i(a){var b,c="width=device-width,initial-scale=1.0,user-scalable=0,minimum-scale=1.0,maximum-scale=1.0",e=d("meta[name=viewport]")[0];g.overrideViewPort!==!1&&(e||(e=document.createElement("meta"),e.setAttribute("name","viewport"),document.getElementsByTagName("head")[0].appendChild(e)),b=e.getAttribute("content"),b&&"undefined"!=typeof n&&(n=b),e.setAttribute("content",a?c:n))}function j(a,b){k()&&b===!1&&d([document.documentElement,document.body]).removeClass(a+"fullscreen")}function k(){for(var a=0;aa.w&&(d=a.x-Math.max(0,b/2),f.layoutRect({w:b,x:d}),e=!0)),g&&(g.layoutRect({w:f.layoutRect().innerW}).recalc(),b=g.layoutRect().minW+a.deltaW,b>a.w&&(d=a.x-Math.max(0,b-a.w),f.layoutRect({w:b,x:d}),e=!0)),e&&f.recalc()},initLayoutRect:function(){var a,b=this,d=b._super(),e=0;if(b.settings.title&&!b._fullscreen){a=b.getEl("head");var f=c.getSize(a);d.headerW=f.width,d.headerH=f.height,e+=d.headerH}b.statusbar&&(e+=b.statusbar.layoutRect().h),d.deltaH+=e,d.minH+=e,d.h+=e;var g=c.getWindowSize();return d.x=b.settings.x||Math.max(0,g.w/2-d.w/2),d.y=b.settings.y||Math.max(0,g.h/2-d.h/2),d},renderHtml:function(){var a=this,b=a._layout,c=a._id,d=a.classPrefix,e=a.settings,f="",g="",h=e.html;return a.preRender(),b.preRender(a),e.title&&(f='
      '+a.encode(e.title)+'
      '),e.url&&(h=''),"undefined"==typeof h&&(h=b.renderHtml(a)),a.statusbar&&(g=a.statusbar.renderHtml()),'
      '+f+'
      '+h+"
      "+g+"
      "},fullscreen:function(a){var b,e,g=this,i=document.documentElement,j=g.classPrefix;if(a!=g._fullscreen)if(d(window).on("resize",function(){var a;if(g._fullscreen)if(b)g._timer||(g._timer=h.setTimeout(function(){var a=c.getWindowSize();g.moveTo(0,0).resizeTo(a.w,a.h),g._timer=0},50));else{a=(new Date).getTime();var d=c.getWindowSize();g.moveTo(0,0).resizeTo(d.w,d.h),(new Date).getTime()-a>50&&(b=!0)}}),e=g.layoutRect(),g._fullscreen=a,a){g._initial={x:e.x,y:e.y,w:e.w,h:e.h},g.borderBox=f.parseBox("0"),g.getEl("head").style.display="none",e.deltaH-=e.headerH+2,d([i,document.body]).addClass(j+"fullscreen"),g.classes.add("fullscreen");var k=c.getWindowSize();g.moveTo(0,0).resizeTo(k.w,k.h)}else g.borderBox=f.parseBox(g.settings.border),g.getEl("head").style.display="",e.deltaH+=e.headerH,d([i,document.body]).removeClass(j+"fullscreen"),g.classes.remove("fullscreen"),g.moveTo(g._initial.x,g._initial.y).resizeTo(g._initial.w,g._initial.h);return g.reflow()},postRender:function(){var a,b=this;setTimeout(function(){b.classes.add("in"),b.fire("open")},0),b._super(),b.statusbar&&b.statusbar.postRender(),b.focus(),this.dragHelper=new e(b._id+"-dragh",{start:function(){a={x:b.layoutRect().x,y:b.layoutRect().y}},drag:function(c){b.moveTo(a.x+c.deltaX,a.y+c.deltaY)}}),b.on("submit",function(a){a.isDefaultPrevented()||b.close()}),m.push(b),i(!0)},submit:function(){return this.fire("submit",{data:this.toJSON()})},remove:function(){var a,b=this;for(b.dragHelper.destroy(),b._super(),b.statusbar&&this.statusbar.remove(),j(b.classPrefix,!1),a=m.length;a--;)m[a]===b&&m.splice(a,1);i(m.length>0)},getContentWindow:function(){var a=this.getEl().getElementsByTagName("iframe")[0];return a?a.contentWindow:null}});return l(),o}),g("24",["23"],function(a){"use strict";var b=a.extend({init:function(a){a={border:1,padding:20,layout:"flex",pack:"center",align:"center",containerCls:"panel",autoScroll:!0,buttons:{type:"button",text:"Ok",action:"ok"},items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200}},this._super(a)},Statics:{OK:1,OK_CANCEL:2,YES_NO:3,YES_NO_CANCEL:4,msgBox:function(c){function d(a,b,c){return{type:"button",text:a,subtype:c?"primary":"",onClick:function(a){a.control.parents()[1].close(),f(b)}}}var e,f=c.callback||function(){};switch(c.buttons){case b.OK_CANCEL:e=[d("Ok",!0,!0),d("Cancel",!1)];break;case b.YES_NO:case b.YES_NO_CANCEL:e=[d("Yes",1,!0),d("No",0)],c.buttons==b.YES_NO_CANCEL&&e.push(d("Cancel",-1));break;default:e=[d("Ok",!0,!0)]}return new a({padding:20,x:c.x,y:c.y,minWidth:300,minHeight:100,layout:"flex",pack:"center",align:"center",buttons:e,title:c.title,role:"alertdialog",items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200,text:c.text},onPostRender:function(){this.aria("describedby",this.items()[0]._id)},onClose:c.onClose,onCancel:function(){f(!1)}}).renderTo(document.body).reflow()},alert:function(a,c){return"string"==typeof a&&(a={text:a}),a.callback=c,b.msgBox(a)},confirm:function(a,c){return"string"==typeof a&&(a={text:a}),a.callback=c,a.buttons=b.OK_CANCEL,b.msgBox(a)}}});return b}),g("10",["23","24"],function(a,b){return function(c){function d(){if(h.length)return h[h.length-1]}function e(a){c.fire("OpenWindow",{win:a})}function f(a){c.fire("CloseWindow",{win:a})}var g=this,h=[];g.windows=h,c.on("remove",function(){for(var a=h.length;a--;)h[a].close()}),g.open=function(b,d){var g;return c.editorManager.setActive(c),b.title=b.title||" ",b.url=b.url||b.file,b.url&&(b.width=parseInt(b.width||320,10),b.height=parseInt(b.height||240,10)),b.body&&(b.items={defaults:b.defaults,type:b.bodyType||"form",items:b.body,data:b.data,callbacks:b.commands}),b.url||b.buttons||(b.buttons=[{text:"Ok",subtype:"primary",onclick:function(){g.find("form")[0].submit()}},{text:"Cancel",onclick:function(){g.close()}}]),g=new a(b),h.push(g),g.on("close",function(){for(var a=h.length;a--;)h[a]===g&&h.splice(a,1);h.length||c.focus(),f(g)}),b.data&&g.on("postRender",function(){this.find("*").each(function(a){var c=a.name();c in b.data&&a.value(b.data[c])})}),g.features=b||{},g.params=d||{},1===h.length&&c.nodeChanged(),g=g.renderTo().reflow(),e(g),g},g.alert=function(a,d,g){var h;h=b.alert(a,function(){d?d.call(g||this):c.focus()}),h.on("close",function(){f(h)}),e(h)},g.confirm=function(a,c,d){var g;g=b.confirm(a,function(a){c.call(d||this,a)}),g.on("close",function(){f(g)}),e(g)},g.close=function(){d()&&d().close()},g.getParams=function(){return d()?d().params:null},g.setParams=function(a){d()&&(d().params=a)},g.getWindows=function(){return h}}}),g("2q",["2g","2n"],function(a,b){return a.extend({Mixins:[b],Defaults:{classes:"widget tooltip tooltip-n"},renderHtml:function(){var a=this,b=a.classPrefix;return'"},bindStates:function(){var a=this;return a.state.on("change:text",function(b){a.getEl().lastChild.innerHTML=a.encode(b.value)}),a._super()},repaint:function(){var a,b,c=this;a=c.getEl().style,b=c._layoutRect,a.left=b.x+"px",a.top=b.y+"px",a.zIndex=131070}})}),g("2r",["2g","2q"],function(a,b){"use strict";var c,d=a.extend({init:function(a){var b=this;b._super(a),a=b.settings,b.canFocus=!0,a.tooltip&&d.tooltips!==!1&&(b.on("mouseenter",function(c){var d=b.tooltip().moveTo(-65535);if(c.control==b){var e=d.text(a.tooltip).show().testMoveRel(b.getEl(),["bc-tc","bc-tl","bc-tr"]);d.classes.toggle("tooltip-n","bc-tc"==e),d.classes.toggle("tooltip-nw","bc-tl"==e),d.classes.toggle("tooltip-ne","bc-tr"==e),d.moveRel(b.getEl(),e)}else d.hide()}),b.on("mouseleave mousedown click",function(){b.tooltip().hide()})),b.aria("label",a.ariaLabel||a.tooltip)},tooltip:function(){return c||(c=new b({type:"tooltip"}),c.renderTo()),c},postRender:function(){var a=this,b=a.settings;a._super(),a.parent()||!b.width&&!b.height||(a.initLayoutRect(),a.repaint()),b.autofocus&&a.focus()},bindStates:function(){function a(a){c.aria("disabled",a),c.classes.toggle("disabled",a)}function b(a){c.aria("pressed",a),c.classes.toggle("active",a)}var c=this;return c.state.on("change:disabled",function(b){a(b.value)}),c.state.on("change:active",function(a){b(a.value)}),c.state.get("disabled")&&a(!0),c.state.get("active")&&b(!0),c._super()},remove:function(){this._super(),c&&(c.remove(),c=null)}});return d}),g("2s",["2r"],function(a){"use strict";return a.extend({Defaults:{value:0},init:function(a){var b=this;b._super(a),b.classes.add("progress"),b.settings.filter||(b.settings.filter=function(a){return Math.round(a)})},renderHtml:function(){var a=this,b=a._id,c=this.classPrefix;return'
      0%
      '},postRender:function(){var a=this;return a._super(),a.value(a.settings.value),a},bindStates:function(){function a(a){a=b.settings.filter(a),b.getEl().lastChild.innerHTML=a+"%",b.getEl().firstChild.firstChild.style.width=a+"%"}var b=this;return b.state.on("change:value",function(b){a(b.value)}),a(b.state.get("value")),b._super()}})}),g("25",["2g","2n","2s","5"],function(a,b,c,d){return a.extend({Mixins:[b],Defaults:{classes:"widget notification"},init:function(a){var b=this;b._super(a),a.text&&b.text(a.text),a.icon&&(b.icon=a.icon),a.color&&(b.color=a.color),a.type&&b.classes.add("notification-"+a.type),a.timeout&&(a.timeout<0||a.timeout>0)&&!a.closeButton?b.closeButton=!1:(b.classes.add("has-close"),b.closeButton=!0),a.progressBar&&(b.progressBar=new c),b.on("click",function(a){a.target.className.indexOf(b.classPrefix+"close")!=-1&&b.close()})},renderHtml:function(){var a=this,b=a.classPrefix,c="",d="",e="",f="";return a.icon&&(c=''),a.color&&(f=' style="background-color: '+a.color+'"'),a.closeButton&&(d=''),a.progressBar&&(e=a.progressBar.renderHtml()),'"},postRender:function(){var a=this;return d.setTimeout(function(){a.$el.addClass(a.classPrefix+"in")}),a._super()},bindStates:function(){var a=this;return a.state.on("change:text",function(b){a.getEl().childNodes[1].innerHTML=b.value}),a.progressBar&&a.progressBar.bindStates(),a._super()},close:function(){var a=this;return a.fire("close").isDefaultPrevented()||a.remove(),a},repaint:function(){var a,b,c=this;a=c.getEl().style,b=c._layoutRect,a.left=b.x+"px",a.top=b.y+"px",a.zIndex=65534}})}),g("11",["25","5","9"],function(a,b,c){return function(d){function e(){if(m.length)return m[m.length-1]}function f(){b.requestAnimationFrame(function(){g(),h()})}function g(){for(var a=0;a0){var a=m.slice(0,1)[0],b=d.inline?d.getElement():d.getContentAreaContainer();if(a.moveRel(b,"tc-tc"),m.length>1)for(var c=1;c0&&(c.timer=setTimeout(function(){c.close()},b.timeout)),c.on("close",function(){var a=m.length;for(c.timer&&d.getWin().clearTimeout(c.timer);a--;)m[a]===c&&m.splice(a,1);h()}),c.renderTo(),h()):c=e,c}},l.close=function(){e()&&e().close()},l.getNotifications=function(){return m},d.on("SkinLoaded",function(){var a=d.settings.service_message;a&&d.notificationManager.open({text:a,type:"warning",timeout:0,icon:""})})}}),g("12",["z","e","9"],function(a,b,c){function d(a,b){return"selectionchange"==b?a.getDoc():!a.inline&&/^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(b)?a.getDoc().documentElement:a.settings.event_root?(a.eventRoot||(a.eventRoot=g.select(a.settings.event_root)[0]),a.eventRoot):a.getBody()}function e(a,b){function c(a){return!a.hidden&&!a.readonly}var e,h;if(a.delegates||(a.delegates={}),!a.delegates[b]&&!a.removed)if(e=d(a,b),a.settings.event_root){if(f||(f={},a.editorManager.on("removeEditor",function(){var b;if(!a.editorManager.activeEditor&&f){for(b in f)a.dom.unbind(d(a,b));f=null}})),f[b])return;h=function(d){for(var e=d.target,f=a.editorManager.editors,h=f.length;h--;){var i=f[h].getBody();(i===e||g.isChildOf(e,i))&&c(f[h])&&f[h].fire(b,d)}},f[b]=h,g.bind(e,b,h)}else h=function(d){c(a)&&a.fire(b,d)},g.bind(e,b,h),a.delegates[b]=h}var f,g=b.DOM,h={bindPendingEventDelegates:function(){var a=this;c.each(a._pendingNativeEvents,function(b){e(a,b)})},toggleNativeEvent:function(a,b){var c=this;"focus"!=a&&"blur"!=a&&(b?c.initialized?e(c,a):c._pendingNativeEvents?c._pendingNativeEvents.push(a):c._pendingNativeEvents=[a]:c.initialized&&(c.dom.unbind(d(c,a),a,c.delegates[a]),delete c.delegates[a]))},unbindAllNativeEvents:function(){var a,b=this;if(b.delegates){for(a in b.delegates)b.dom.unbind(d(b,a),a,b.delegates[a]);delete b.delegates}b.inline||(b.getBody().onload=null,b.dom.unbind(b.getWin()),b.dom.unbind(b.getDoc())),b.dom.unbind(b.getBody()),b.dom.unbind(b.getContainer())}};return h=c.extend({},a,h)}),g("13",["9","6"],function(a,b){var c=a.each,d=a.explode,e={f9:120,f10:121,f11:122},f=a.makeMap("alt,ctrl,shift,meta,access");return function(g){function h(a){var g,h,i={};c(d(a,"+"),function(a){a in f?i[a]=!0:/^[0-9]{2,}$/.test(a)?i.keyCode=parseInt(a,10):(i.charCode=a.charCodeAt(0),i.keyCode=e[a]||a.toUpperCase().charCodeAt(0))}),g=[i.keyCode];for(h in f)i[h]?g.push(h):i[h]=!1;return i.id=g.join(","),i.access&&(i.alt=!0,b.mac?i.ctrl=!0:i.shift=!0),i.meta&&(b.mac?i.meta=!0:(i.ctrl=!0,i.meta=!1)),i}function i(b,c,e,f){var i;return i=a.map(d(b,">"),h),i[i.length-1]=a.extend(i[i.length-1],{func:e,scope:f||g}),a.extend(i[0],{desc:g.translate(c),subpatterns:i.slice(1)})}function j(a){return a.altKey||a.ctrlKey||a.metaKey}function k(a){return"keydown"===a.type&&a.keyCode>=112&&a.keyCode<=123}function l(a,b){return!!b&&(b.ctrl==a.ctrlKey&&b.meta==a.metaKey&&(b.alt==a.altKey&&b.shift==a.shiftKey&&(!!(a.keyCode==b.keyCode||a.charCode&&a.charCode==b.charCode)&&(a.preventDefault(),!0))))}function m(a){return a.func?a.func.call(a.scope):null}var n=this,o={},p=[];g.on("keyup keypress keydown",function(a){!j(a)&&!k(a)||a.isDefaultPrevented()||(c(o,function(b){if(l(a,b))return p=b.subpatterns.slice(0),"keydown"==a.type&&m(b),!0}),l(a,p[0])&&(1===p.length&&"keydown"==a.type&&m(p[0]),p.shift()))}),n.add=function(b,e,f,h){var j;return j=f,"string"==typeof f?f=function(){g.execCommand(j,!1,null)}:a.isArray(j)&&(f=function(){g.execCommand(j[0],j[1],j[2])}),c(d(a.trim(b.toLowerCase())),function(a){var b=i(a,e,f,h);o[b.id]=b}),!0},n.remove=function(a){var b=i(a);return!!o[b.id]&&(delete o[b.id],!0)}}}),g("26",["9"],function(a){var b=function(b,c,d,e,f){return f=a.extend({id:c,theme:"modern",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:d,add_form_submit_trigger:!0,submit_patch:!0,add_unload_trigger:!0,convert_urls:!0,relative_urls:!0,remove_script_host:!0,object_resizing:!0,doctype:"",visual:!0,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,padd_empty_editor:!0,render_ui:!0,indentation:"30px",inline_styles:!0,convert_fonts_to_spans:!0,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",entity_encoding:"named",url_converter:b.convertURL,url_converter_scope:b,ie7_compat:!0},e,f,{validate:!0,content_editable:f.inline}),e&&e.external_plugins&&f.external_plugins&&(f.external_plugins=a.extend({},e.external_plugins,f.external_plugins)),f};return{getEditorSettings:b}}),h("4t",window),g("2b",["g"],function(a){var b=a.PluginManager,c=function(a,c){for(var d in b.urls){var e=b.urls[d]+"/plugin"+c+".js";if(e===a)return d}return null},d=function(a,b){var d=c(b,a.suffix);return d?"Failed to load plugin: "+d+" from url "+b:"Failed to load plugin url: "+b},e=function(a,b){a.notificationManager.open({type:"error",text:b})},f=function(a,b){a._skinLoaded?e(a,b):a.on("SkinLoaded",function(){e(a,b)})},g=function(a,b){f(a,"Failed to upload image: "+b)},h=function(a,b){f(a,d(a,b))},i=function(a,b){f(a,"Failed to load content css: "+b[0])},j=function(a){var b=window.console;b&&!window.test&&(b.error?b.error.apply(b,arguments):b.log.apply(b,arguments))};return{pluginLoadError:h,uploadError:g,displayError:f,contentCssError:i,initError:j}}),g("6c",["1m","1k"],function(a,b){var c=function(a){return a.dom.select("*[data-mce-caret]")[0]},d=function(a){a.selection.setRng(a.selection.getRng())},e=function(a,c){c.hasAttribute("data-mce-caret")&&(b.showCaretContainerBlock(c),d(a),a.selection.scrollIntoView(c))},f=function(a,d){var f=c(a);if(f)return"compositionstart"===d.type?(d.preventDefault(),d.stopPropagation(),void e(f)):void(b.hasContent(f)&&e(a,f))},g=function(b){b.on("keyup compositionstart",a.curry(f,b))};return{setup:g}}),g("6r",["4","9","1w"],function(a,b,c){return function(c,d){function e(a,b){return a?a.replace(/\/$/,"")+"/"+b.replace(/^\//,""):b}function f(a,b,c,f){var g,h;g=new XMLHttpRequest,g.open("POST",d.url),g.withCredentials=d.credentials,g.upload.onprogress=function(a){f(a.loaded/a.total*100)},g.onerror=function(){c("Image upload failed due to a XHR Transport error. Code: "+g.status)},g.onload=function(){var a;return g.status<200||g.status>=300?void c("HTTP Error: "+g.status):(a=JSON.parse(g.responseText),a&&"string"==typeof a.location?void b(e(d.basePath,a.location)):void c("Invalid JSON: "+g.responseText))},h=new FormData,h.append("file",a.blob(),a.filename()),g.send(h)}function g(){return new a(function(a){a([])})}function h(a,b){return{url:b,blobInfo:a,status:!0}}function i(a,b){return{url:"",blobInfo:a,status:!1,error:b}}function j(a,c){b.each(p[a],function(a){a(c)}),delete p[a]}function k(b,d,e){return c.markPending(b.blobUri()),new a(function(a){var f,g,k=function(){};try{var l=function(){f&&(f.close(),g=k)},m=function(d){l(),c.markUploaded(b.blobUri(),d),j(b.blobUri(),h(b,d)),a(h(b,d))},n=function(d){l(),c.removeFailed(b.blobUri()),j(b.blobUri(),i(b,d)),a(i(b,d))};g=function(a){a<0||a>100||(f||(f=e()),f.progressBar.value(a))},d(b,m,n,g)}catch(c){a(i(b,c.message))}})}function l(a){return a===f}function m(b){var c=b.blobUri();return new a(function(a){p[c]=p[c]||[],p[c].push(a)})}function n(e,f){return e=b.grep(e,function(a){return!c.isUploaded(a.blobUri())}),a.all(b.map(e,function(a){return c.isPending(a.blobUri())?m(a):k(a,d.handler,f)}))}function o(a,b){return!d.url&&l(d.handler)?g():n(a,b)}var p={};return d=b.extend({credentials:!1,handler:f},d),{upload:o}}}),g("7a",["4"],function(a){function b(b){return new a(function(a,c){var d=function(){c("Cannot convert "+b+" to Blob. Resource might not exist or is inaccessible.")};try{var e=new XMLHttpRequest;e.open("GET",b,!0),e.responseType="blob",e.onload=function(){200==this.status?a(this.response):d()},e.onerror=d,e.send()}catch(a){d()}})}function c(a){var b,c;return a=decodeURIComponent(a).split(","),c=/data:([^;]+)/.exec(a[0]),c&&(b=c[1]),{type:b,data:a[1]}}function d(b){return new a(function(a){var d,e,f;b=c(b);try{d=atob(b.data)}catch(b){return void a(new Blob([]))}for(e=new Uint8Array(d.length),f=0;f0&&b.moveEnd("character",f),b.select()}catch(a){}a.nodeChanged()}}},c=function(c){c.settings.forced_root_block&&c.on("NodeChange",a.curry(b,c))};return{setup:c}}),g("7f",["1g","1j","43"],function(a,b,c){function d(e){function f(b){return a.map(b,function(a){return a=c.clone(a),a.node=e,a})}if(a.isArray(e))return a.reduce(e,function(a,b){return a.concat(d(b))},[]);if(b.isElement(e))return f(e.getClientRects());if(b.isText(e)){var g=e.ownerDocument.createRange();return g.setStart(e,0),g.setEnd(e,e.data.length),f(g.getClientRects())}}return{getClientRects:d}}),g("70",["1w","1g","1j","7f","43","5i","44"],function(a,b,c,d,e,f,g){function h(a,b){return Math.abs(a.left-b)}function i(a,b){return Math.abs(a.right-b)}function j(a,c){function d(a,b){return a>=b.left&&a<=b.right}return b.reduce(a,function(a,b){var e,f;return e=Math.min(h(a,c),i(a,c)),f=Math.min(h(b,c),i(b,c)),d(c,b)?b:d(c,a)?a:f==e&&p(b.node)?b:f=a.top&&e<=a.bottom}),g=j(f,c),g&&(g=j(l(a,g),c),g&&p(g.node))?n(g,c):null}var p=c.isContentEditableFalse,q=f.findNode,r=a.curry;return{findClosestClientRect:j,findLineNodeRects:l,closestCaret:o}}),g("7i",["1w","1g","7f","44","5i","4m","1p","43"],function(a,b,c,d,e,f,g,h){function i(a,b,c,f){for(;f=e.findNode(f,a,d.isEditableCaretCandidate,b);)if(c(f))return}function j(a,d,e,f,g,h){function j(f){var h,i,j;for(j=c.getClientRects(f),a==-1&&(j=j.reverse()),h=0;h0&&d(i,b.last(n))&&m++,i.line=m,g(i))return!0;n.push(i)}}var k,l,m=0,n=[];return(l=b.last(h.getClientRects()))?(k=h.getNode(),j(k),i(a,f,j,k),n):n}function k(a,b){return b.line>a}function l(a,b){return b.line===a}function m(a,c,d,e){function i(c){return 1==a?b.last(c.getClientRects()):b.last(c.getClientRects())}var j,k,l,m,n,o,p=new f(c),q=[],r=0;1==a?(j=p.next,k=h.isBelow,l=h.isAbove,m=g.after(e)):(j=p.prev,k=h.isAbove,l=h.isBelow,m=g.before(e)),o=i(m);do if(m.isVisible()&&(n=i(m),!l(n,o))){if(q.length>0&&k(n,b.last(q))&&r++,n=h.clone(n),n.position=m,n.line=r,d(n))return q;q.push(n)}while(m=j(m));return q}var n=a.curry,o=n(j,-1,h.isAbove,h.isBelow),p=n(j,1,h.isBelow,h.isAbove);return{upUntil:o,downUntil:p,positionsUntil:m,isAboveLine:n(k),isLine:n(l)}}),g("73",["1p","5i","1j","1w"],function(a,b,c,d){var e=c.isContentEditableTrue,f=c.isContentEditableFalse,g=function(a,b,c,d){return b._selectionOverrides.showCaret(a,c,d)},h=function(a){var b=a.ownerDocument.createRange();return b.selectNode(a),b},i=function(a,b){var c;return c=a.fire("BeforeObjectSelected",{target:b}),c.isDefaultPrevented()?null:h(b)},j=function(c,h){var i,j;return h=b.normalizeRange(1,c.getBody(),h),i=a.fromRangeStart(h),f(i.getNode())?g(1,c,i.getNode(),!i.isAtEnd()):f(i.getNode(!0))?g(1,c,i.getNode(!0),!1):(j=c.dom.getParent(i.getNode(),d.or(f,e)),f(j)?g(1,c,j,!1):null)},k=function(a,b){var c;return b&&b.collapsed?(c=j(a,b),c?c:b):b};return{showCaret:g,selectNode:i,renderCaretAtRange:j,renderRangeCaret:k}}),g("7c",["1k","1p","5i","4m","70","7i","1j","h","6","73","1g","1w"],function(a,b,c,d,e,f,g,h,i,j,k,l){var m=g.isContentEditableFalse,n=h.getSelectedNode,o=c.isAfterContentEditableFalse,p=c.isBeforeContentEditableFalse,q=function(a,b){for(;b=a(b);)if(b.isVisible())return b;return b},r=function(a,b){var d=c.isInSameBlock(a,b);return!(d||!g.isBr(a.getNode()))||d},s=function(b){return a.isCaretContainerBlock(b.startContainer)},t=function(a,d,e){return e=c.normalizeRange(a,d,e),a===-1?b.fromRangeStart(e):b.fromRangeEnd(e)},u=function(a,b,c,d,e){var f,g,h,i;return!e.collapsed&&(f=n(e),m(f))?j.showCaret(a,b,f,a===-1):(i=s(e),g=t(a,b.getBody(),e),d(g)?j.selectNode(b,g.getNode(a===-1)):(g=c(g))?d(g)?j.showCaret(a,b,g.getNode(a===-1),1===a):(h=c(g),d(h)&&r(g,h)?j.showCaret(a,b,h.getNode(a===-1),1===a):i?j.renderRangeCaret(b,g.toRange()):null):i?e:null)},v=function(a,b,c,d){var g,h,i,l,q,r,s,u,v;if(v=n(d),g=t(a,b.getBody(),d),h=c(b.getBody(),f.isAboveLine(1),g),i=k.filter(h,f.isLine(1)),q=k.last(g.getClientRects()),p(g)&&(v=g.getNode()),o(g)&&(v=g.getNode(!0)),!q)return null;if(r=q.left,l=e.findClosestClientRect(i,r),l&&m(l.node))return s=Math.abs(r-l.left),u=Math.abs(r-l.right),j.showCaret(a,b,l.node,s=11)&&(b.innerHTML='
      '),b},x=function(a,c,e){var f,g,h,i=new d(a.getBody()),j=l.curry(q,i.next),k=l.curry(q,i.prev);if(e.collapsed&&a.settings.forced_root_block){if(f=a.dom.getParent(e.startContainer,"PRE"),!f)return;g=1===c?j(b.fromRangeStart(e)):k(b.fromRangeStart(e)),g||(h=w(a),1===c?a.$(f).after(h):a.$(f).before(h),a.selection.select(h,!0),a.selection.collapse())}},y=function(a,b){var c,e=new d(a.getBody()),f=l.curry(q,e.next),g=l.curry(q,e.prev),h=b?1:-1,i=b?f:g,j=b?p:o,k=a.selection.getRng();return(c=u(h,a,i,j,k))?c:(c=x(a,h,k),c?c:null)},z=function(a,b){var c,d=b?1:-1,e=b?f.downUntil:f.upUntil,g=a.selection.getRng();return(c=v(d,a,e,g))?c:(c=x(a,d,g),c?c:null)},A=function(a,b){return function(){var c=y(a,b);return!!c&&(a.selection.setRng(c),!0)}},B=function(a,b){return function(){var c=z(a,b);return!!c&&(a.selection.setRng(c),!0)}};return{moveH:A,moveV:B}}),g("7j",["60","3y","3z"],function(a,b,c){var d=function(a,b){return b},e=function(b,c){var d=a.isObject(b)&&a.isObject(c);return d?g(b,c):c},f=function(a){return function(){for(var d=new b(arguments.length),e=0;e'},l=function(a,b){return a.nodeName===b||a.previousSibling&&a.previousSibling.nodeName===b},m=function(a,b){return b&&a.isBlock(b)&&!/^(TD|TH|CAPTION|FORM)$/.test(b.nodeName)&&!/^(fixed|absolute)/i.test(b.style.position)&&"true"!==a.getContentEditable(b)},n=function(a,b,c){var d;a.isBlock(c)&&(d=b.getRng(),c.appendChild(a.create("span",null,"\xa0")),b.select(c),c.lastChild.outerHTML="",b.setRng(d))},o=function(a,b,c){var d,e=c,f=[];if(e){for(;e=e.firstChild;){if(a.isBlock(e))return;1!=e.nodeType||b[e.nodeName.toLowerCase()]||f.push(e)}for(d=f.length;d--;)e=f[d],!e.hasChildNodes()||e.firstChild==e.lastChild&&""===e.firstChild.nodeValue?a.remove(e):i(e)&&a.remove(e)}},p=function(a,c,d){return b.isText(c)===!1?d:a?1===d&&c.data.charAt(d-1)===f.ZWSP?0:d:d===c.data.length-1&&c.data.charAt(d)===f.ZWSP?c.data.length:d},q=function(a){var b=a.cloneRange();return b.setStart(a.startContainer,p(!0,a.startContainer,a.startOffset)),b.setEnd(a.endContainer,p(!1,a.endContainer,a.endOffset)),b},r=function(a){for(;a;){if(1===a.nodeType||3===a.nodeType&&a.data&&/[\r\n\s]/.test(a.data))return a;a=a.nextSibling}},s=function(b){function f(f){function x(a){var b,c,f,h,j=a;if(a){if(e.ie&&e.ie<9&&N&&N.firstChild&&N.firstChild==N.lastChild&&"BR"==N.firstChild.tagName&&g.remove(N.firstChild),/^(LI|DT|DD)$/.test(a.nodeName)){var k=r(a.firstChild);k&&/^(UL|OL|DL)$/.test(k.nodeName)&&a.insertBefore(g.doc.createTextNode("\xa0"),a.firstChild)}if(f=g.createRng(),e.ie||a.normalize(),a.hasChildNodes()){for(b=new d(a,a);c=b.current();){if(3==c.nodeType){f.setStart(c,0),f.setEnd(c,0);break}if(w[c.nodeName.toLowerCase()]){f.setStartBefore(c),f.setEndBefore(c);break}j=c,c=b.next()}c||(f.setStart(j,0),f.setEnd(j,0))}else"BR"==a.nodeName?a.nextSibling&&g.isBlock(a.nextSibling)?((!O||O<9)&&(h=g.create("br"),a.parentNode.insertBefore(h,a)),f.setStartBefore(a),f.setEndBefore(a)):(f.setStartAfter(a),f.setEndAfter(a)):(f.setStart(a,0),f.setEnd(a,0));i.setRng(f),g.remove(h),i.scrollIntoView(a)}}function y(a){var b=s.forced_root_block;b&&b.toLowerCase()===a.tagName.toLowerCase()&&g.setAttribs(a,s.forced_root_block_attrs)}function z(a){var b,c,d,e=L,f=u.getTextInlineElements();if(a||"TABLE"==T||"HR"==T?(b=g.create(a||V),y(b)):b=N.cloneNode(!1),d=b,s.keep_styles===!1)g.setAttrib(b,"style",null),g.setAttrib(b,"class",null);else do if(f[e.nodeName]){if("_mce_caret"==e.id)continue;c=e.cloneNode(!1),g.setAttrib(c,"id",""),b.hasChildNodes()?(c.appendChild(b.firstChild),b.appendChild(c)):(d=c,b.appendChild(c))}while((e=e.parentNode)&&e!=K);return h||(d.innerHTML='
      '),b}function A(a){var b,c,e,f;if(f=p(a,L,M),3==L.nodeType&&(a?f>0:fL.childNodes.length-1,L=L.childNodes[Math.min(M,L.childNodes.length-1)]||L,M=W&&3==L.nodeType?L.nodeValue.length:0),K=F(L)){if(t.beforeChange(),!g.isBlock(K)&&K!=g.getRoot())return void(V&&!P||D());if((V&&!P||!V&&P)&&(L=B(L,M)),N=g.getParent(L,g.isBlock),S=N?g.getParent(N.parentNode,g.isBlock):null,T=N?N.nodeName.toUpperCase():"",U=S?S.nodeName.toUpperCase():"","LI"!=U||f.ctrlKey||(N=S,T=U),b.undoManager.typing&&(b.undoManager.typing=!1,b.undoManager.add()),/^(LI|DT|DD)$/.test(T)){if(!V&&P)return void D();if(g.isEmpty(N))return void C()}if("PRE"==T&&s.br_in_pre!==!1){if(!P)return void D()}else if(!V&&!P&&"LI"!=T||V&&P)return void D();V&&N===b.getBody()||(V=V||"P",a.isCaretContainerBlock(N)?(Q=a.showCaretContainerBlock(N),g.isEmpty(N)&&k(N),x(Q)):A()?H():A(!0)?(Q=N.parentNode.insertBefore(z(),N),n(g,i,Q),x(l(N,"HR")?Q:N)):(J=q(I).cloneRange(),J.setEndAfter(N),R=J.extractContents(),E(R),Q=R.firstChild,g.insertAfter(R,N),o(g,v,Q),G(N),g.isEmpty(N)&&k(N),Q.normalize(),g.isEmpty(Q)?(g.remove(Q),H()):x(Q)),g.setAttrib(Q,"id",""),b.fire("NewBlock",{newBlock:Q}),t.typing=!1,t.add())}}}var g=b.dom,i=b.selection,s=b.settings,t=b.undoManager,u=b.schema,v=u.getNonEmptyElements(),w=u.getMoveCaretBeforeOnEnterElements();b.on("keydown",function(a){13==a.keyCode&&f(a)!==!1&&a.preventDefault()})};return{setup:s}}),g("7e",["1m","1p","1j","5n"],function(a,b,c,d){var e=function(a,b){return i(a)&&c.isText(b.container())},f=function(a,b){var c=b.container(),d=b.offset();c.insertData(d,"\xa0"),a.selection.setCursorLocation(c,d+1)},g=function(a,b,c){return!!e(c,b)&&(f(a,b),!0)},h=function(c){var e=b.fromRangeStart(c.selection.getRng()),f=d.readLocation(c.getBody(),e);return f.map(a.curry(g,c,e)).getOr(!1)},i=function(b){return b.fold(a.constant(!1),a.constant(!0),a.constant(!0),a.constant(!1))},j=function(a){return!!a.selection.isCollapsed()&&h(a)};return{insertAtSelection:j}}),g("6y",["3x","7e","7d","p"],function(a,b,c,d){var e=function(e,f){var g=c.match([{keyCode:d.SPACEBAR,action:c.action(b.insertAtSelection,e)}],f);a.find(g,function(a){return a.action()}).each(function(a){f.preventDefault()})},f=function(a){a.on("keydown",function(b){b.isDefaultPrevented()===!1&&e(a,b)})};return{setup:f}}),g("6f",["6v","5o","6w","6x","6y"],function(a,b,c,d,e){var f=function(f){var g=b.setupSelectedState(f);a.setup(f,g),c.setup(f,g),d.setup(f),e.setup(f)};return{setup:f}}),g("6g",["h","6","5"],function(a,b,c){return function(d){function e(a){var b,c;if(c=d.$(a).parentsUntil(d.getBody()).add(a),c.length===g.length){for(b=c.length;b>=0&&c[b]===g[b];b--);if(b===-1)return g=c,!0}return g=c,!1}var f,g=[];"onselectionchange"in d.getDoc()||d.on("NodeChange Click MouseUp KeyUp Focus",function(b){var c,e;c=d.selection.getRng(),e={startContainer:c.startContainer,startOffset:c.startOffset,endContainer:c.endContainer,endOffset:c.endOffset},"nodechange"!=b.type&&a.compareRanges(e,f)||d.fire("SelectionChange"),f=e}),d.on("contextmenu",function(){d.fire("SelectionChange")}),d.on("SelectionChange",function(){var a=d.selection.getStart(!0);!b.range&&d.selection.isCollapsed()||!e(a)&&d.dom.isChildOf(a,d.getBody())&&d.nodeChanged({selectionChange:!0})}),d.on("MouseUp",function(a){a.isDefaultPrevented()||("IMG"==d.selection.getNode().nodeName?c.setEditorTimeout(d,function(){d.nodeChanged()}):d.nodeChanged())}),this.nodeChanged=function(a){var b,c,e,f=d.selection;d.initialized&&f&&!d.settings.disable_nodechange&&!d.readonly&&(e=d.getBody(),b=f.getStart(!0)||e,b.ownerDocument==d.getDoc()&&d.dom.isChildOf(b,e)||(b=e),c=[],d.dom.getParent(b,function(a){return a===e||void c.push(a)}),a=a||{},a.element=b,a.parents=c,d.fire("NodeChange",a))}}}),g("6z",["1k","69","1p","a","1j","h","43","5"],function(a,b,c,d,e,f,g,h){var i=e.isContentEditableFalse,j=function(a){return a&&/^(TD|TH)$/i.test(a.nodeName)};return function(c,e){function f(a,b){var d,e,f,h,i,j=g.collapse(a.getBoundingClientRect(),b);return"BODY"==c.tagName?(d=c.ownerDocument.documentElement,e=c.scrollLeft||d.scrollLeft,f=c.scrollTop||d.scrollTop):(i=c.getBoundingClientRect(),e=c.scrollLeft-i.left,f=c.scrollTop-i.top),j.left+=e,j.right+=e,j.top+=f,j.bottom+=f,j.width=1,h=a.offsetWidth-a.clientWidth,h>0&&(b&&(h*=-1),j.left+=h,j.right+=h),j}function k(){var b,e,f,g,h;for(b=d("*[contentEditable=false]",c),g=0;g').css(h).appendTo(c),b&&r.addClass("mce-visual-caret-before"),n(),k=g.ownerDocument.createRange(),k.setStart(s,0),k.setEnd(s,0),k):(s=a.insertInline(g,b),k=g.ownerDocument.createRange(),i(s.nextSibling)?(k.setStart(s,0),k.setEnd(s,0)):(k.setStart(s,1),k.setEnd(s,1)),k)}function m(){k(),s&&(b.remove(s),s=null),r&&(r.remove(),r=null),clearInterval(q)}function n(){q=h.setInterval(function(){d("div.mce-visual-caret",c).toggleClass("mce-visual-caret-hidden")},500)}function o(){h.clearInterval(q)}function p(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"}var q,r,s;return{show:l,hide:m,getCss:p,destroy:o}}});g("7g",[],function(){var a=function(a){var b,c,d,e;return e=a.getBoundingClientRect(),b=a.ownerDocument,c=b.documentElement,d=b.defaultView,{top:e.top+d.pageYOffset-c.clientTop,left:e.left+d.pageXOffset-c.clientLeft}},b=function(b){return b.inline?a(b.getBody()):{left:0,top:0}},c=function(a){var b=a.getBody();return a.inline?{left:b.scrollLeft,top:b.scrollTop}:{left:0,top:0}},d=function(a){var b=a.getBody(),c=a.getDoc().documentElement,d={left:b.scrollLeft,top:b.scrollTop},e={left:b.scrollLeft||c.scrollLeft,top:b.scrollTop||c.scrollTop};return a.inline?d:e},e=function(b,c){if(c.target.ownerDocument!==b.getDoc()){var e=a(b.getContentAreaContainer()),f=d(b);return{left:c.pageX-e.left+f.left,top:c.pageY-e.top+f.top}}return{left:c.pageX,top:c.pageY}},f=function(a,b,c){return{pageX:c.left-a.left+b.left,pageY:c.top-a.top+b.top}},g=function(a,d){return f(b(a),c(a),e(a,d))};return{calc:g}});g("71",["1j","1g","1w","5","e","7g"],function(a,b,c,d,e,f){var g=a.isContentEditableFalse,h=a.isContentEditableTrue,i=function(a,b){return g(b)&&b!==a},j=function(a,b,c){return b!==c&&!a.dom.isChildOf(b,c)&&!g(b)},k=function(a){var b=a.cloneNode(!0);return b.removeAttribute("data-mce-selected"),b},l=function(a,b,c,d){var e=b.cloneNode(!0);a.dom.setStyles(e,{width:c,height:d}),a.dom.setAttrib(e,"data-mce-selected",null);var f=a.dom.create("div",{"class":"mce-drag-container","data-mce-bogus":"all",unselectable:"on",contenteditable:"false"});return a.dom.setStyles(f,{position:"absolute",opacity:.5,overflow:"hidden",border:0,padding:0,margin:0,width:c,height:d}),a.dom.setStyles(e,{margin:0,boxSizing:"border-box"}),f.appendChild(e),f},m=function(a,b){a.parentNode!==b&&b.appendChild(a)},n=function(a,b,c,d,e,f){var g=0,h=0;a.style.left=b.pageX+"px",a.style.top=b.pageY+"px",b.pageX+c>e&&(g=b.pageX+c-e),b.pageY+d>f&&(h=b.pageY+d-f),a.style.width=c-g+"px",a.style.height=d-h+"px"},o=function(a){a&&a.parentNode&&a.parentNode.removeChild(a)},p=function(a){return 0===a.button},q=function(a){return a.element},r=function(a,b){return{pageX:b.pageX-a.relX,pageY:b.pageY+5}},s=function(a,d){return function(e){if(p(e)){var f=b.find(d.dom.getParents(e.target),c.or(g,h));if(i(d.getBody(),f)){var j=d.dom.getPos(f),k=d.getBody(),m=d.getDoc().documentElement;a.element=f,a.screenX=e.screenX,a.screenY=e.screenY,a.maxX=(d.inline?k.scrollWidth:m.offsetWidth)-2,a.maxY=(d.inline?k.scrollHeight:m.offsetHeight)-2,a.relX=e.pageX-j.x,a.relY=e.pageY-j.y,a.width=f.offsetWidth,a.height=f.offsetHeight,a.ghost=l(d,f,a.width,a.height)}}}},t=function(a,b){var c=d.throttle(function(a,c){b._selectionOverrides.hideFakeCaret(),b.selection.placeCaretAt(a,c)},0);return function(d){var e=Math.max(Math.abs(d.screenX-a.screenX),Math.abs(d.screenY-a.screenY));if(q(a)&&!a.dragging&&e>10){var g=b.fire("dragstart",{target:a.element});if(g.isDefaultPrevented())return;a.dragging=!0,b.focus()}if(a.dragging){var h=r(a,f.calc(b,d));m(a.ghost,b.getBody()),n(a.ghost,h,a.width,a.height,a.maxX,a.maxY),c(d.clientX,d.clientY)}}},u=function(a){var b=a.getSel().getRangeAt(0),c=b.startContainer;return 3===c.nodeType?c.parentNode:c},v=function(a,b){return function(c){if(a.dragging&&j(b,u(b.selection),a.element)){var d=k(a.element),e=b.fire("drop",{targetClone:d,clientX:c.clientX,clientY:c.clientY});e.isDefaultPrevented()||(d=e.targetClone,b.undoManager.transact(function(){o(a.element),b.insertContent(b.dom.getOuterHTML(d)),b._selectionOverrides.hideFakeCaret()}))}x(a)}},w=function(a,b){return function(){x(a),a.dragging&&b.fire("dragend")}},x=function(a){a.dragging=!1,a.element=null,o(a.ghost)},y=function(a){var b,c,d,f,g,h,i={};b=e.DOM,h=document,c=s(i,a),d=t(i,a),f=v(i,a),g=w(i,a),a.on("mousedown",c),a.on("mousemove",d),a.on("mouseup",f),b.bind(h,"mousemove",d),b.bind(h,"mouseup",g),a.on("remove",function(){b.unbind(h,"mousemove",d),b.unbind(h,"mouseup",g)})},z=function(a){a.on("drop",function(b){var c="undefined"!=typeof b.clientX?a.getDoc().elementFromPoint(b.clientX,b.clientY):null;(g(c)||g(a.dom.getContentEditableParent(c)))&&b.preventDefault()})},A=function(a){y(a),z(a)};return{init:A}}),g("7k",[],function(){var a=function(a){return void 0!==a.style};return{isSupported:a}}),g("7h",["60","3x","63","4z","5a","6o","1r","4d","7k","6l","3z","49","4t"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){var n=function(b,c,d){if(!a.isString(d))throw l.error("Invalid call to CSS.set. Property ",c,":: Value ",d,":: Element ",b),new k("CSS value must be a string: "+d);i.isSupported(b)&&b.style.setProperty(c,d)},o=function(a,b){i.isSupported(a)&&a.style.removeProperty(b)},p=function(a,b,c){var d=a.dom();n(d,b,c)},q=function(a,b){var d=a.dom();c.each(b,function(a,b){n(d,b,a)})},r=function(a,b){var d=a.dom();c.each(b,function(a,b){a.fold(function(){o(d,b)},function(a){n(d,b,a)})})},s=function(a,b){var c=a.dom(),d=m.getComputedStyle(c),e=d.getPropertyValue(b),g=""!==e||f.inBody(a)?e:t(c,b);return null===g?void 0:g},t=function(a,b){return i.isSupported(a)?a.style.getPropertyValue(b):""},u=function(a,b){var c=a.dom(),e=t(c,b);return d.from(e).filter(function(a){return a.length>0})},v=function(a,b,c){var d=g.fromTag(a);p(d,b,c);var e=u(d,b);return e.isSome()},w=function(a,b){var c=a.dom();o(c,b),e.has(a,"style")&&""===j.trim(e.get(a,"style"))&&e.remove(a,"style")},x=function(a,b){var c=e.get(a,"style"),d=b(a),f=void 0===c?e.remove:e.set;return f(a,"style",c),d},y=function(a,b){var c=a.dom(),d=b.dom();i.isSupported(c)&&i.isSupported(d)&&(d.style.cssText=c.style.cssText)},z=function(a){return a.dom().offsetWidth},A=function(a,b,c){u(a,c).each(function(a){u(b,c).isNone()&&p(b,c,a)})},B=function(a,c,d){h.isElement(a)&&h.isElement(c)&&b.each(d,function(b){A(a,c,b)})};return{copy:y,set:p,preserve:x,setAll:q,setOptions:r,remove:w,get:s,getRaw:u,isValidValue:v,reflow:z,transfer:B}}),g("72",["1m","1r","7h","59"],function(a,b,c,d){var e=function(a,b){var c=b.dom();return c[a]},f=function(a,b){return parseInt(c.get(b,a),10)},g=a.curry(e,"clientWidth"),h=a.curry(e,"clientHeight"),i=a.curry(f,"margin-top"),j=a.curry(f,"margin-left"),k=function(a){return a.dom().getBoundingClientRect()},l=function(a,b,c){var d=g(a),e=h(a);return b>=0&&c>=0&&b<=d&&c<=e},m=function(a,b,c,d){var e=k(b),f=a?e.left+b.dom().clientLeft+j(b):0,g=a?e.top+b.dom().clientTop+i(b):0,h=c-f,l=d-g;return{x:h,y:l}},n=function(a,c,e){var f=b.fromDom(a.getBody()),g=a.inline?f:d.documentElement(f),h=m(a.inline,g,c,e);return l(g,h.x,h.y)};return{isXYInContentArea:n}}),g("6h",["1k","1p","5i","4m","6z","70","1j","1n","71","72","6","73","5","p"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n){function o(g){function o(a){return g.dom.hasClass(a,"mce-offscreen-selection")}function t(){var a=g.dom.get(M);return a?a.getElementsByTagName("*")[0]:a}function u(a){return g.dom.isBlock(a)}function v(a){a&&g.selection.setRng(a)}function w(){return g.selection.getRng()}function x(a,b){g.selection.scrollIntoView(a,b)}function y(a,b,c){var d;return d=g.fire("ShowCaret",{target:b,direction:a,before:c}),d.isDefaultPrevented()?null:(x(b,a===-1),L.show(c,b))}function z(a,d){return d=c.normalizeRange(a,K,d),a==-1?b.fromRangeStart(d):b.fromRangeEnd(d)}function A(b){b.hasAttribute("data-mce-caret")&&(a.showCaretContainerBlock(b),v(w()),x(b[0]))}function B(){function a(a){for(var b=g.getBody();a&&a!=b;){if(p(a)||q(a))return a;a=a.parentNode}return null}function c(b){var c=!1;b.on("touchstart",function(){c=!1}),b.on("touchmove",function(){c=!0}),b.on("touchend",function(d){var e=a(d.target);q(e)&&(c||(d.preventDefault(),F(l.selectNode(b,e))))})}g.on("mouseup",function(a){var b=w();b.collapsed&&j.isXYInContentArea(g,a.clientX,a.clientY)&&v(l.renderCaretAtRange(g,b))}),g.on("click",function(b){var c;c=a(b.target),c&&(q(c)&&(b.preventDefault(),g.focus()),p(c)&&g.dom.isChildOf(c,g.selection.getNode())&&G())}),g.on("blur NewBlock",function(){G(),I()});var e=function(a){var c=new d(a);if(!a.firstChild)return!1;var e=b.before(a.firstChild),f=c.next(e);return f&&!s(f)&&!r(f)},u=function(a,b){var c=g.dom.getParent(a,g.dom.isBlock),d=g.dom.getParent(b,g.dom.isBlock);return c===d},x=function(a,b){var c=g.dom.getParent(a,g.dom.isBlock),d=g.dom.getParent(b,g.dom.isBlock);return c&&!u(c,d)&&e(c)};c(g),g.on("mousedown",function(b){var c;if(j.isXYInContentArea(g,b.clientX,b.clientY)!==!1)if(c=a(b.target))q(c)?(b.preventDefault(),F(l.selectNode(g,c))):(G(),p(c)&&b.shiftKey||h.isXYWithinRange(b.clientX,b.clientY,g.selection.getRng())||g.selection.placeCaretAt(b.clientX,b.clientY));else{G(),I();var d=f.closestCaret(K,b.clientX,b.clientY);d&&(x(b.target,d.node)||(b.preventDefault(),g.getBody().focus(),v(y(1,d.node,d.before))))}}),g.on("keypress",function(a){if(!n.modifierPressed(a))switch(a.keyCode){default:q(g.selection.getNode())&&a.preventDefault()}}),g.on("getSelectionRange",function(a){var b=a.range;if(J){if(!J.parentNode)return void(J=null);b=b.cloneRange(),b.selectNode(J),a.range=b}}),g.on("setSelectionRange",function(a){var b;b=F(a.range,a.forward),b&&(a.range=b)}),g.on("AfterSetSelectionRange",function(a){var b=a.range;E(b)||I(),o(b.startContainer.parentNode)||G()}),g.on("focus",function(){m.setEditorTimeout(g,function(){g.selection.setRng(l.renderRangeCaret(g,g.selection.getRng()))},0)}),g.on("copy",function(a){var b=a.clipboardData;if(!a.isDefaultPrevented()&&a.clipboardData&&!k.ie){var c=t();c&&(a.preventDefault(),b.clearData(),b.setData("text/html",c.outerHTML),b.setData("text/plain",c.outerText))}}),i.init(g)}function C(){var a=g.contentStyles,b=".mce-content-body";a.push(L.getCss()),a.push(b+" .mce-offscreen-selection {position: absolute;left: -9999999999px;max-width: 1000000px;}"+b+" *[contentEditable=false] {cursor: default;}"+b+" *[contentEditable=true] {cursor: text;}")}function D(b){return a.isCaretContainer(b)||a.startsWithCaretContainer(b)||a.endsWithCaretContainer(b)}function E(a){return D(a.startContainer)||D(a.endContainer); +}function F(a,b){var c,d,e,f,h,i,j,l,m,n,o=g.$,p=g.dom;if(!a)return null;if(a.collapsed){if(!E(a))if(b===!1){if(l=z(-1,a),q(l.getNode(!0)))return y(-1,l.getNode(!0),!1);if(q(l.getNode()))return y(-1,l.getNode(),!l.isAtEnd())}else{if(l=z(1,a),q(l.getNode()))return y(1,l.getNode(),!l.isAtEnd());if(q(l.getNode(!0)))return y(1,l.getNode(!0),!1)}return null}return f=a.startContainer,h=a.startOffset,i=a.endOffset,3==f.nodeType&&0==h&&q(f.parentNode)&&(f=f.parentNode,h=p.nodeIndex(f),f=f.parentNode),1!=f.nodeType?null:(i==h+1&&(c=f.childNodes[h]),q(c)?(m=n=c.cloneNode(!0),j=g.fire("ObjectSelected",{target:c,targetClone:m}),j.isDefaultPrevented()?null:(m=j.targetClone,d=o("#"+M),0===d.length&&(d=o('
      ').attr("id",M),d.appendTo(g.getBody())),a=g.dom.createRng(),m===n&&k.ie?(d.empty().append('

      \xa0

      ').append(m),a.setStartAfter(d[0].firstChild.firstChild),a.setEndAfter(m)):(d.empty().append("\xa0").append(m).append("\xa0"),a.setStart(d[0].firstChild,1),a.setEnd(d[0].lastChild,0)),d.css({top:p.getPos(c,g.getBody()).y}),d[0].focus(),e=g.selection.getSel(),e.removeAllRanges(),e.addRange(a),g.$("*[data-mce-selected]").removeAttr("data-mce-selected"),c.setAttribute("data-mce-selected",1),J=c,I(),a)):null)}function G(){J&&(J.removeAttribute("data-mce-selected"),g.$("#"+M).remove(),J=null)}function H(){L.destroy(),J=null}function I(){L.hide()}var J,K=g.getBody(),L=new e(g.getBody(),u),M="sel-"+g.dom.uniqueId();return k.ceFalse&&(B(),C()),{showCaret:y,showBlockCaretContainer:A,hideFakeCaret:I,destroy:H}}var p=g.isContentEditableTrue,q=g.isContentEditableFalse,r=c.isAfterContentEditableFalse,s=c.isBeforeContentEditableFalse;return o}),g("74",["e"],function(a){function b(b,c,d){for(var e=[];c&&c!=b;c=c.parentNode)e.push(a.nodeIndex(c,d));return e}function c(a,b){var c,d,e;for(d=a,c=b.length-1;c>=0;c--){if(e=d.childNodes,b[c]>e.length-1)return null;d=e[b[c]]}return d}return{create:b,resolve:c}}),g("6i",["p","h","c","74","i","d","6","9","5","1k","1p","4m"],function(a,b,c,d,e,f,g,h,i,j,k,l){return function(c){function d(a,b){try{c.getDoc().execCommand(a,!1,b)}catch(a){}}function m(){var a=c.getDoc().documentMode;return a?a:6}function n(a){return a.isDefaultPrevented()}function o(a){var b,d;a.dataTransfer&&(c.selection.isCollapsed()&&"IMG"==a.target.tagName&&_.select(a.target),b=c.selection.getContent(),b.length>0&&(d=ga+escape(c.id)+","+escape(b),a.dataTransfer.setData(ha,d)))}function p(a){var b;return a.dataTransfer&&(b=a.dataTransfer.getData(ha),b&&b.indexOf(ga)>=0)?(b=b.substr(ga.length).split(","),{id:unescape(b[0]),html:unescape(b[1])}):null}function q(a,b){c.queryCommandSupported("mceInsertClipboardContent")?c.execCommand("mceInsertClipboardContent",!1,{content:a,internal:b}):c.execCommand("mceInsertContent",!1,a)}function r(){function a(a){var b=$.create("body"),c=a.cloneContents();return b.appendChild(c),_.serializer.serialize(b,{format:"html"})}function d(d){if(!d.setStart){if(d.item)return!1;var e=d.duplicate();return e.moveToElementText(c.getBody()),b.compareRanges(d,e)}var f=a(d),g=$.createRng();g.selectNode(c.getBody());var h=a(g);return f===h}c.on("keydown",function(a){var b,e,f=a.keyCode;if(!n(a)&&(f==Z||f==Y)){if(b=c.selection.isCollapsed(),e=c.getBody(),b&&!$.isEmpty(e))return;if(!b&&!d(c.selection.getRng()))return;a.preventDefault(),c.setContent(""),e.firstChild&&$.isBlock(e.firstChild)?c.selection.setCursorLocation(e.firstChild,0):c.selection.setCursorLocation(e,0),c.nodeChanged()}})}function s(){c.shortcuts.add("meta+a",null,"SelectAll")}function t(){c.settings.content_editable||$.bind(c.getDoc(),"mousedown mouseup",function(a){var b;if(a.target==c.getDoc().documentElement)if(b=_.getRng(),c.getBody().focus(),"mousedown"==a.type){if(j.isCaretContainer(b.startContainer))return;_.placeCaretAt(a.clientX,a.clientY)}else _.setRng(b)})}function u(){c.on("keydown",function(a){if(!n(a)&&a.keyCode===Y){if(!c.getBody().getElementsByTagName("hr").length)return;if(_.isCollapsed()&&0===_.getRng(!0).startOffset){var b=_.getNode(),d=b.previousSibling;if("HR"==b.nodeName)return $.remove(b),void a.preventDefault();d&&d.nodeName&&"hr"===d.nodeName.toLowerCase()&&($.remove(d),a.preventDefault())}}})}function v(){window.Range.prototype.getClientRects||c.on("mousedown",function(a){if(!n(a)&&"HTML"===a.target.nodeName){var b=c.getBody();b.blur(),i.setEditorTimeout(c,function(){b.focus()})}})}function w(){c.on("click",function(a){var b=a.target;/^(IMG|HR)$/.test(b.nodeName)&&"false"!==$.getContentEditableParent(b)&&(a.preventDefault(),c.selection.select(b),c.nodeChanged()),"A"==b.nodeName&&$.hasClass(b,"mce-item-anchor")&&(a.preventDefault(),_.select(b))})}function x(){function a(){var a=$.getAttribs(_.getStart().cloneNode(!1));return function(){var b=_.getStart();b!==c.getBody()&&($.setAttrib(b,"style",null),X(a,function(a){b.setAttributeNode(a.cloneNode(!0))}))}}function b(){return!_.isCollapsed()&&$.getParent(_.getStart(),$.isBlock)!=$.getParent(_.getEnd(),$.isBlock)}c.on("keypress",function(d){var e;if(!n(d)&&(8==d.keyCode||46==d.keyCode)&&b())return e=a(),c.getDoc().execCommand("delete",!1,null),e(),d.preventDefault(),!1}),$.bind(c.getDoc(),"cut",function(d){var e;!n(d)&&b()&&(e=a(),i.setEditorTimeout(c,function(){e()}))})}function y(){document.body.setAttribute("role","application")}function z(){c.on("keydown",function(a){if(!n(a)&&a.keyCode===Y&&_.isCollapsed()&&0===_.getRng(!0).startOffset){var b=_.getNode().previousSibling;if(b&&b.nodeName&&"table"===b.nodeName.toLowerCase())return a.preventDefault(),!1}})}function A(){m()>7||(d("RespectVisibilityInDesign",!0),c.contentStyles.push(".mceHideBrInPre pre br {display: none}"),$.addClass(c.getBody(),"mceHideBrInPre"),ba.addNodeFilter("pre",function(a){for(var b,c,d,f,g=a.length;g--;)for(b=a[g].getAll("br"),c=b.length;c--;)d=b[c],f=d.prev,f&&3===f.type&&"\n"!=f.value.charAt(f.value-1)?f.value+="\n":d.parent.insert(new e("#text",3),d,!0).value="\n"}),ca.addNodeFilter("pre",function(a){for(var b,c,d,e,f=a.length;f--;)for(b=a[f].getAll("br"),c=b.length;c--;)d=b[c],e=d.prev,e&&3==e.type&&(e.value=e.value.replace(/\r?\n$/,""))}))}function B(){$.bind(c.getBody(),"mouseup",function(){var a,b=_.getNode();"IMG"==b.nodeName&&((a=$.getStyle(b,"width"))&&($.setAttrib(b,"width",a.replace(/[^0-9%]+/g,"")),$.setStyle(b,"width","")),(a=$.getStyle(b,"height"))&&($.setAttrib(b,"height",a.replace(/[^0-9%]+/g,"")),$.setStyle(b,"height","")))})}function C(){c.on("keydown",function(b){var d,e,f,g,h;if(!n(b)&&b.keyCode==a.BACKSPACE&&(d=_.getRng(),e=d.startContainer,f=d.startOffset,g=$.getRoot(),h=e,d.collapsed&&0===f)){for(;h&&h.parentNode&&h.parentNode.firstChild==h&&h.parentNode!=g;)h=h.parentNode;"BLOCKQUOTE"===h.tagName&&(c.formatter.toggle("blockquote",null,h),d=$.createRng(),d.setStart(e,0),d.setEnd(e,0),_.setRng(d))}})}function D(){function a(){U(),d("StyleWithCSS",!1),d("enableInlineTableEditing",!1),aa.object_resizing||d("enableObjectResizing",!1)}aa.readonly||c.on("BeforeExecCommand MouseDown",a)}function E(){function a(){X($.select("a"),function(a){var b=a.parentNode,c=$.getRoot();if(b.lastChild===a){for(;b&&!$.isBlock(b);){if(b.parentNode.lastChild!==b||b===c)return;b=b.parentNode}$.add(b,"br",{"data-mce-bogus":1})}})}c.on("SetContent ExecCommand",function(b){"setcontent"!=b.type&&"mceInsertLink"!==b.command||a()})}function F(){aa.forced_root_block&&c.on("init",function(){d("DefaultParagraphSeparator",aa.forced_root_block)})}function G(){c.on("keydown",function(a){var b;n(a)||a.keyCode!=Y||(b=c.getDoc().selection.createRange(),b&&b.item&&(a.preventDefault(),c.undoManager.beforeChange(),$.remove(b.item(0)),c.undoManager.add()))})}function H(){var a;m()>=10&&(a="",X("p div h1 h2 h3 h4 h5 h6".split(" "),function(b,c){a+=(c>0?",":"")+b+":empty"}),c.contentStyles.push(a+"{padding-right: 1px !important}"))}function I(){m()<9&&(ba.addNodeFilter("noscript",function(a){for(var b,c,d=a.length;d--;)b=a[d],c=b.firstChild,c&&b.attr("data-mce-innertext",c.value)}),ca.addNodeFilter("noscript",function(a){for(var b,c,d,g=a.length;g--;)b=a[g],c=a[g].firstChild,c?c.value=f.decode(c.value):(d=b.attributes.map["data-mce-innertext"],d&&(b.attr("data-mce-innertext",null),c=new e("#text",3),c.value=d,c.raw=!0,b.append(c)))}))}function J(){function a(a,b){var c=h.createTextRange();try{c.moveToPoint(a,b)}catch(a){c=null}return c}function b(b){var d;b.button?(d=a(b.x,b.y),d&&(d.compareEndPoints("StartToStart",e)>0?d.setEndPoint("StartToStart",e):d.setEndPoint("EndToEnd",e),d.select())):c()}function c(){var a=g.selection.createRange();e&&!a.item&&0===a.compareEndPoints("StartToEnd",a)&&e.select(),$.unbind(g,"mouseup",c),$.unbind(g,"mousemove",b),e=d=0}var d,e,f,g=$.doc,h=g.body;g.documentElement.unselectable=!0,$.bind(g,"mousedown contextmenu",function(h){if("HTML"===h.target.nodeName){if(d&&c(),f=g.documentElement,f.scrollHeight>f.clientHeight)return;d=1,e=a(h.x,h.y),e&&($.bind(g,"mouseup",c),$.bind(g,"mousemove",b),$.getRoot().focus(),e.select())}})}function K(){c.on("keyup focusin mouseup",function(b){65==b.keyCode&&a.metaKeyPressed(b)||_.normalize()},!0)}function L(){c.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")}function M(){c.inline||c.on("keydown",function(){document.activeElement==document.body&&c.getWin().focus()})}function N(){c.inline||(c.contentStyles.push("body {min-height: 150px}"),c.on("click",function(a){var b;if("HTML"==a.target.nodeName){if(g.ie>11)return void c.getBody().focus();b=c.selection.getRng(),c.getBody().focus(),c.selection.setRng(b),c.selection.normalize(),c.nodeChanged()}}))}function O(){g.mac&&c.on("keydown",function(b){!a.metaKeyPressed(b)||b.shiftKey||37!=b.keyCode&&39!=b.keyCode||(b.preventDefault(),c.selection.getSel().modify("move",37==b.keyCode?"backward":"forward","lineboundary"))})}function P(){d("AutoUrlDetect",!1)}function Q(){c.on("click",function(a){var b=a.target;do if("A"===b.tagName)return void a.preventDefault();while(b=b.parentNode)}),c.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")}function R(){c.on("init",function(){c.dom.bind(c.getBody(),"submit",function(a){a.preventDefault()})})}function S(){ba.addNodeFilter("br",function(a){for(var b=a.length;b--;)"Apple-interchange-newline"==a[b].attr("class")&&a[b].remove()})}function T(){c.on("dragstart",function(a){o(a)}),c.on("drop",function(a){if(!n(a)){var d=p(a);if(d&&d.id!=c.id){a.preventDefault();var e=b.getCaretRangeFromPoint(a.x,a.y,c.getDoc());_.setRng(e),q(d.html,!0)}}})}function U(){}function V(){var a;return!da||c.removed?0:(a=c.selection.getSel(),!a||!a.rangeCount||0===a.rangeCount)}function W(){function b(a){var b=new l(a.getBody()),c=a.selection.getRng(),d=k.fromRangeStart(c),e=k.fromRangeEnd(c),f=b.prev(d),g=b.next(e);return!a.selection.isCollapsed()&&(!f||f.isAtStart()&&d.isEqual(f))&&(!g||g.isAtEnd()&&d.isEqual(g))}c.on("keypress",function(d){!n(d)&&!_.isCollapsed()&&d.charCode>31&&!a.metaKeyPressed(d)&&b(c)&&(d.preventDefault(),c.setContent(String.fromCharCode(d.charCode)),c.selection.select(c.getBody(),!0),c.selection.collapse(!1),c.nodeChanged())}),c.on("keydown",function(a){var d=a.keyCode;n(a)||d!=Z&&d!=Y||b(c)&&(a.preventDefault(),c.setContent(""),c.nodeChanged())})}var X=h.each,Y=a.BACKSPACE,Z=a.DELETE,$=c.dom,_=c.selection,aa=c.settings,ba=c.parser,ca=c.serializer,da=g.gecko,ea=g.ie,fa=g.webkit,ga="data:text/mce-internal,",ha=ea?"Text":"URL";return C(),r(),g.windowsPhone||K(),fa&&(W(),t(),w(),F(),R(),z(),S(),g.iOS?(M(),N(),Q()):s()),ea&&g.ie<11&&(u(),y(),A(),B(),G(),H(),I(),J()),g.ie>=11&&(N(),z()),g.ie&&(s(),P(),T()),da&&(W(),u(),v(),x(),D(),E(),L(),O(),z()),{refreshContentEditable:U,isHidden:V}}}),g("5r",["22","4t","6c","e","s","o","6d","2b","6e","t","l","i","j","6f","6g","6h","u","5","6i","9"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t){var u=d.DOM,v=function(a){var b=new k(a.settings,a.schema);return b.addAttributeFilter("src,href,style,tabindex",function(b,c){for(var d,e,f,g=b.length,h=a.dom;g--;)if(d=b[g],e=d.attr(c),f="data-mce-"+c,!d.attributes.map[f]){if(0===e.indexOf("data:")||0===e.indexOf("blob:"))continue;"style"===c?(e=h.serializeStyle(h.parseStyle(e),d.name),e.length||(e=null),d.attr(f,e),d.attr(c,e)):"tabindex"===c?(d.attr(f,e),d.attr(c,null)):d.attr(f,a.convertURL(e,c,d.name))}}),b.addNodeFilter("script",function(a){for(var b,c,d=a.length;d--;)b=a[d],c=b.attr("type")||"no/type",0!==c.indexOf("mce-")&&b.attr("type","mce-"+c)}),b.addNodeFilter("#cdata",function(a){for(var b,c=a.length;c--;)b=a[c],b.type=8,b.name="#comment",b.value="[CDATA["+b.value+"]]"}),b.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(b){for(var c,d=b.length,e=a.schema.getNonEmptyElements();d--;)c=b[d],c.isEmpty(e)&&0===c.getAll("br").length&&(c.append(new l("br",1)).shortEnded=!0)}),b},w=function(a){a.settings.auto_focus&&r.setEditorTimeout(a,function(){var b;b=a.settings.auto_focus===!0?a:a.editorManager.get(a.settings.auto_focus),b.destroyed||b.focus()},100)},x=function(a){a.bindPendingEventDelegates(),a.initialized=!0,a.fire("init"),a.focus(!0),a.nodeChanged({initial:!0}),a.execCallback("init_instance_callback",a),w(a)},y=function(a){return a.inline?u.styleSheetLoader:a.dom.styleSheetLoader},z=function(k,l){var r,w,z=k.settings,A=k.getElement(),B=k.getDoc();z.inline||(k.getElement().style.visibility=k.orgVisibility),l||z.content_editable||(B.open(),B.write(k.iframeHTML),B.close()),z.content_editable&&(k.on("remove",function(){var a=this.getBody();u.removeClass(a,"mce-content-body"),u.removeClass(a,"mce-edit-focus"),u.setAttrib(a,"contentEditable",null)}),u.addClass(A,"mce-content-body"),k.contentDocument=B=z.content_document||a,k.contentWindow=z.content_window||b,k.bodyElement=A,z.content_document=z.content_window=null,z.root_name=A.nodeName.toLowerCase()),r=k.getBody(),r.disabled=!0,k.readonly=z.readonly,k.readonly||(k.inline&&"static"===u.getStyle(r,"position",!0)&&(r.style.position="relative"),r.contentEditable=k.getParam("content_editable_state",!0)),r.disabled=!1,k.editorUpload=new g(k),k.schema=new m(z),k.dom=new d(B,{keep_values:!0,url_converter:k.convertURL,url_converter_scope:k,hex_colors:z.force_hex_style_colors,class_filter:z.class_filter,update_styles:!0,root_element:k.inline?k.getBody():null,collect:z.content_editable,schema:k.schema,onSetAttrib:function(a){k.fire("SetAttrib",a)}}),k.parser=v(k),k.serializer=new f(z,k),k.selection=new e(k.dom,k.getWin(),k.serializer,k),k.formatter=new j(k),k.undoManager=new q(k),k._nodeChangeDispatcher=new o(k),k._selectionOverrides=new p(k),c.setup(k),n.setup(k),i.setup(k),k.fire("PreInit"),z.browser_spellcheck||z.gecko_spellcheck||(B.body.spellcheck=!1,u.setAttrib(r,"spellcheck","false")),k.quirks=new s(k),k.fire("PostRender"),z.directionality&&(r.dir=z.directionality),z.nowrap&&(r.style.whiteSpace="nowrap"),z.protect&&k.on("BeforeSetContent",function(a){t.each(z.protect,function(b){a.content=a.content.replace(b,function(a){return""})})}),k.on("SetContent",function(){k.addVisual(k.getBody())}),z.padd_empty_editor&&k.on("PostProcess",function(a){a.content=a.content.replace(/^(]*>( | |\s|\u00a0|
      |)<\/p>[\r\n]*|
      [\r\n]*)$/,"")}),k.load({initial:!0,format:"html"}),k.startContent=k.getContent({format:"raw"}),k.on("compositionstart compositionend",function(a){k.composing="compositionstart"===a.type}),k.contentStyles.length>0&&(w="",t.each(k.contentStyles,function(a){w+=a+"\r\n"}),k.dom.addStyle(w)),y(k).loadAll(k.contentCSS,function(a){x(k)},function(a){x(k),h.contentCssError(k,a)})};return{initContentBody:z}}),g("4v",["g"],function(a){return a.PluginManager}),g("4w",["g"],function(a){return a.ThemeManager}),g("4u",["22","4t","e","6","5r","4v","4w","9","2a"],function(a,b,c,d,e,f,g,h,i){var j=c.DOM,k=function(a,b,c){var d,e,g=f.get(c);if(d=f.urls[c]||a.documentBaseUrl.replace(/\/$/,""),c=h.trim(c),g&&h.inArray(b,c)===-1){if(h.each(f.dependencies(c),function(c){k(a,b,c)}),a.plugins[c])return;e=new g(a,d,a.$),a.plugins[c]=e,e.init&&(e.init(a,d),b.push(c))}},l=function(a){var b=[];h.each(a.settings.plugins.replace(/\-/g,"").split(/[ ,]/),function(c){k(a,b,c)})},m=function(a){var b,c=a.settings;c.theme&&("function"!=typeof c.theme?(c.theme=c.theme.replace(/-/,""),b=g.get(c.theme),a.theme=new b(a,g.urls[c.theme]),a.theme.init&&a.theme.init(a,g.urls[c.theme]||a.documentBaseUrl.replace(/\/$/,""),a.$)):a.theme=c.theme)},n=function(a){var b,c,d,e,f,g=a.settings,h=a.getElement();return g.render_ui&&a.theme&&(a.orgDisplay=h.style.display,"function"!=typeof g.theme?(b=g.width||j.getStyle(h,"width")||"100%",c=g.height||j.getStyle(h,"height")||h.offsetHeight,d=g.min_height||100,e=/^[0-9\.]+(|px)$/i,e.test(""+b)&&(b=Math.max(parseInt(b,10),100)),e.test(""+c)&&(c=Math.max(parseInt(c,10),d)),f=a.theme.renderUI({targetNode:h,width:b,height:c,deltaWidth:g.delta_width,deltaHeight:g.delta_height}),g.content_editable||(c=(f.iframeHeight||c)+("number"==typeof c?f.deltaHeight||0:""),c",f.document_base_url!=a.documentBaseUrl&&(a.iframeHTML+=''),!d.caretAfter&&f.ie7_compat&&(a.iframeHTML+=''),a.iframeHTML+='',c=f.body_id||"tinymce",c.indexOf("=")!=-1&&(c=a.getParam("body_id","","hash"),c=c[a.id]||c),e=f.body_class||"",e.indexOf("=")!=-1&&(e=a.getParam("body_class","","hash"),e=e[a.id]||""),f.content_security_policy&&(a.iframeHTML+=''),a.iframeHTML+='
      ';var g=j.create("iframe",{id:a.id+"_ifr",frameBorder:"0",allowTransparency:"true",title:a.editorManager.translate("Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help"),style:{width:"100%",height:b.height,display:"block"}});g.onload=function(){g.onload=null,a.fire("load")};var h=o(a,g);return a.contentAreaContainer=b.iframeContainer,a.iframeElement=g,j.add(b.iframeContainer,g),h},q=function(a){var b,c=a.settings,d=a.getElement();if(a.rtl=c.rtl_ui||a.editorManager.i18n.rtl,a.editorManager.i18n.setCode(c.language),c.aria_label=c.aria_label||j.getAttrib(d,"aria-label",a.getLang("aria.rich_text_area")),a.fire("ScriptsLoaded"),m(a),l(a),b=n(a),c.content_css&&h.each(h.explode(c.content_css),function(b){a.contentCSS.push(a.documentBaseURI.toAbsolute(b))}),c.content_style&&a.contentStyles.push(c.content_style),c.content_editable)return e.initContentBody(a);var f=p(a,b);b.editorContainer&&(j.get(b.editorContainer).style.display=a.orgDisplay,a.hidden=j.isHidden(b.editorContainer)),a.getElement().style.display="none",j.setAttrib(a.id,"aria-hidden",!0),f||e.initContentBody(a)};return{init:q}}),g("27",["4t","e","7","f","6","2b","4u","11","4v","4w","9","10"],function(a,b,c,d,e,f,g,h,i,j,k,l){var m=b.DOM,n=function(a,b){var c=a.settings,e=d.ScriptLoader;if(c.language&&"en"!=c.language&&!c.language_url&&(c.language_url=a.editorManager.baseURL+"/langs/"+c.language+".js"),c.language_url&&e.add(c.language_url),c.theme&&"function"!=typeof c.theme&&"-"!=c.theme.charAt(0)&&!j.urls[c.theme]){var h=c.theme_url;h=h?a.documentBaseURI.toAbsolute(h):"themes/"+c.theme+"/theme"+b+".js",j.load(c.theme,h)}k.isArray(c.plugins)&&(c.plugins=c.plugins.join(" ")),k.each(c.external_plugins,function(a,b){i.load(b,a),c.plugins+=" "+b}),k.each(c.plugins.split(/[ ,]/),function(a){if(a=k.trim(a),a&&!i.urls[a])if("-"===a.charAt(0)){a=a.substr(1,a.length);var c=i.dependencies(a);k.each(c,function(a){var c={prefix:"plugins/",resource:a,suffix:"/plugin"+b+".js"};a=i.createUrl(c,a),i.load(a.resource,a)})}else i.load(a,{prefix:"plugins/",resource:a,suffix:"/plugin"+b+".js"})}),e.loadQueue(function(){a.removed||g.init(a)},a,function(b){f.pluginLoadError(a,b[0]),a.removed||g.init(a)})},o=function(b){function d(){m.unbind(a,"ready",d),b.render()}var f=b.settings,g=b.id;if(!c.Event.domLoaded)return void m.bind(a,"ready",d);if(b.getElement()&&e.contentEditable){f.inline?b.inline=!0:(b.orgVisibility=b.getElement().style.visibility,b.getElement().style.visibility="hidden");var i=b.getElement().form||m.getParent(g,"form");i&&(b.formElement=i,f.hidden_input&&!/TEXTAREA|INPUT/i.test(b.getElement().nodeName)&&(m.insertAfter(m.create("input",{type:"hidden",name:g}),g),b.hasHiddenInput=!0),b.formEventDelegate=function(a){b.fire(a.type,a)},m.bind(i,"submit reset",b.formEventDelegate),b.on("reset",function(){b.setContent(b.startContent,{format:"raw"})}),!f.submit_patch||i.submit.nodeType||i.submit.length||i._mceOldSubmit||(i._mceOldSubmit=i.submit,i.submit=function(){return b.editorManager.triggerSave(),b.setDirty(!1),i._mceOldSubmit(i)})),b.windowManager=new l(b),b.notificationManager=new h(b),"xml"===f.encoding&&b.on("GetContent",function(a){a.save&&(a.content=m.encode(a.content))}),f.add_form_submit_trigger&&b.on("submit",function(){b.initialized&&b.save()}),f.add_unload_trigger&&(b._beforeUnload=function(){!b.initialized||b.destroyed||b.isHidden()||b.save({format:"raw",no_events:!0,set_dirty:!1})},b.editorManager.on("BeforeUnload",b._beforeUnload)),b.editorManager.add(b),n(b,b.suffix)}};return{render:o}}),g("28",[],function(){function a(a,b,c){try{a.getDoc().execCommand(b,!1,c)}catch(a){}}function b(a){var b,c;return b=a.getBody(),c=function(b){a.dom.getParents(b.target,"a").length>0&&b.preventDefault()},a.dom.bind(b,"click",c),{unbind:function(){a.dom.unbind(b,"click",c)}}}function c(c,d){c._clickBlocker&&(c._clickBlocker.unbind(),c._clickBlocker=null),d?(c._clickBlocker=b(c),c.selection.controlSelection.hideResizeRect(),c.readonly=!0,c.getBody().contentEditable=!1):(c.readonly=!1,c.getBody().contentEditable=!0,a(c,"StyleWithCSS",!1),a(c,"enableInlineTableEditing",!1),a(c,"enableObjectResizing",!1),c.focus(),c.nodeChanged())}function d(a,b){var d=a.readonly?"readonly":"design";b!=d&&(a.initialized?c(a,"readonly"==b):a.on("init",function(){c(a,"readonly"==b)}),a.fire("SwitchMode",{mode:b}))}return{setMode:d}}),g("29",[],function(){var a=function(a,b,c){var d=a.sidebars?a.sidebars:[];d.push({name:b,settings:c}),a.sidebars=d};return{add:a}}),g("14",["g","a","e","v","12","26","6","n","27","28","13","29","9","w","2a"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){function p(c,e,h){var i,j,l=this;i=l.documentBaseUrl=h.documentBaseURL,j=h.baseURI,e=f.getEditorSettings(l,c,i,h.defaultSettings,e),l.settings=e,a.language=e.language||"en",a.languageLoad=e.language_load,a.baseURL=h.baseURL,l.id=c,l.setDirty(!1),l.plugins={},l.documentBaseURI=new n(e.document_base_url,{base_uri:j}),l.baseURI=j,l.contentCSS=[],l.contentStyles=[],l.shortcuts=new k(l),l.loadedCSS={},l.editorCommands=new d(l),l.suffix=h.suffix,l.editorManager=h,l.inline=e.inline,e.cache_suffix&&(g.cacheSuffix=e.cache_suffix.replace(/^[\?\&]+/,"")),e.override_viewport===!1&&(g.overrideViewPort=!1),h.fire("SetupEditor",l),l.execCallback("setup",l),l.$=b.overrideDefaults(function(){return{context:l.inline?l.getBody():l.getDoc(),element:l.getBody()}})}var q=c.DOM,r=m.extend,s=m.each,t=m.trim,u=m.resolve,v=g.gecko,w=g.ie;return p.prototype={render:function(){i.render(this)},focus:function(a){function b(a){return f.dom.getParent(a,function(a){return"true"===f.dom.getContentEditable(a)})}var c,d,e,f=this,h=f.selection,i=f.settings.content_editable,j=f.getDoc(),k=f.getBody();if(!f.removed){if(!a){if(c=h.getRng(),c.item&&(d=c.item(0)),f.quirks.refreshContentEditable(),e=b(h.getNode()),f.$.contains(k,e))return e.focus(),h.normalize(),void f.editorManager.setActive(f);if(i||(g.opera||f.getBody().focus(),f.getWin().focus()),v||i){if(k.setActive)try{k.setActive()}catch(a){k.focus()}else f.selection.setRng(f.lastRng),k.focus();i&&h.normalize()}d&&d.ownerDocument==j&&(c=j.body.createControlRange(),c.addElement(d),c.select())}f.editorManager.setActive(f)}},execCallback:function(a){var b,c=this,d=c.settings[a];if(d)return c.callbackLookup&&(b=c.callbackLookup[a])&&(d=b.func,b=b.scope),"string"==typeof d&&(b=d.replace(/\.\w+$/,""),b=b?u(b):0,d=u(d),c.callbackLookup=c.callbackLookup||{},c.callbackLookup[a]={func:d,scope:b}),d.apply(b||c,Array.prototype.slice.call(arguments,1))},translate:function(a){if(a&&m.is(a,"string")){var b=this.settings.language||"en",c=this.editorManager.i18n;a=c.data[b+"."+a]||a.replace(/\{\#([^\}]+)\}/g,function(a,d){return c.data[b+"."+d]||"{#"+d+"}"})}return this.editorManager.translate(a)},getLang:function(a,b){return this.editorManager.i18n.data[(this.settings.language||"en")+"."+a]||(void 0!==b?b:"{#"+a+"}")},getParam:function(a,b,c){var d,e=a in this.settings?this.settings[a]:b;return"hash"===c?(d={},"string"==typeof e?s(e.indexOf("=")>0?e.split(/[;,](?![^=;,]*(?:[;,]|$))/):e.split(","),function(a){a=a.split("="),a.length>1?d[t(a[0])]=t(a[1]):d[t(a[0])]=t(a)}):d=e,d):e},nodeChanged:function(a){this._nodeChangeDispatcher.nodeChanged(a)},addButton:function(a,b){var c=this;b.cmd&&(b.onclick=function(){c.execCommand(b.cmd)}),b.text||b.icon||(b.icon=a),c.buttons=c.buttons||{},b.tooltip=b.tooltip||b.title,c.buttons[a]=b},addSidebar:function(a,b){return l.add(this,a,b)},addMenuItem:function(a,b){var c=this;b.cmd&&(b.onclick=function(){c.execCommand(b.cmd)}),c.menuItems=c.menuItems||{},c.menuItems[a]=b},addContextToolbar:function(a,b){var c,d=this;d.contextToolbars=d.contextToolbars||[],"string"==typeof a&&(c=a,a=function(a){return d.dom.is(a,c)}),d.contextToolbars.push({id:o.uuid("mcet"),predicate:a,items:b})},addCommand:function(a,b,c){this.editorCommands.addCommand(a,b,c)},addQueryStateHandler:function(a,b,c){this.editorCommands.addQueryStateHandler(a,b,c)},addQueryValueHandler:function(a,b,c){this.editorCommands.addQueryValueHandler(a,b,c)},addShortcut:function(a,b,c,d){this.shortcuts.add(a,b,c,d)},execCommand:function(a,b,c,d){return this.editorCommands.execCommand(a,b,c,d)},queryCommandState:function(a){return this.editorCommands.queryCommandState(a)},queryCommandValue:function(a){return this.editorCommands.queryCommandValue(a)},queryCommandSupported:function(a){return this.editorCommands.queryCommandSupported(a)},show:function(){var a=this;a.hidden&&(a.hidden=!1,a.inline?a.getBody().contentEditable=!0:(q.show(a.getContainer()),q.hide(a.id)),a.load(),a.fire("show"))},hide:function(){var a=this,b=a.getDoc();a.hidden||(w&&b&&!a.inline&&b.execCommand("SelectAll"),a.save(),a.inline?(a.getBody().contentEditable=!1,a==a.editorManager.focusedEditor&&(a.editorManager.focusedEditor=null)):(q.hide(a.getContainer()),q.setStyle(a.id,"display",a.orgDisplay)),a.hidden=!0,a.fire("hide"))},isHidden:function(){return!!this.hidden},setProgressState:function(a,b){this.fire("ProgressState",{state:a,time:b})},load:function(a){var b,c=this,d=c.getElement();return c.removed?"":d?(a=a||{},a.load=!0,b=c.setContent(void 0!==d.value?d.value:d.innerHTML,a),a.element=d,a.no_events||c.fire("LoadContent",a),a.element=d=null,b):void 0},save:function(a){var b,c,d=this,e=d.getElement();if(e&&d.initialized&&!d.removed)return a=a||{},a.save=!0,a.element=e,b=a.content=d.getContent(a),a.no_events||d.fire("SaveContent",a),"raw"==a.format&&d.fire("RawSaveContent",a),b=a.content,/TEXTAREA|INPUT/i.test(e.nodeName)?e.value=b:(d.inline||(e.innerHTML=b),(c=q.getParent(d.id,"form"))&&s(c.elements,function(a){if(a.name==d.id)return a.value=b,!1})),a.element=e=null,a.set_dirty!==!1&&d.setDirty(!1),b},setContent:function(a,b){var c,d,e=this,f=e.getBody();return b=b||{},b.format=b.format||"html",b.set=!0,b.content=a,b.no_events||e.fire("BeforeSetContent",b),a=b.content,0===a.length||/^\s+$/.test(a)?(d=w&&w<11?"":'
      ',"TABLE"==f.nodeName?a=""+d+"":/^(UL|OL)$/.test(f.nodeName)&&(a="
    2. "+d+"
    3. "),c=e.settings.forced_root_block,c&&e.schema.isValidChild(f.nodeName.toLowerCase(),c.toLowerCase())?(a=d,a=e.dom.createHTML(c,e.settings.forced_root_block_attrs,a)):w||a||(a='
      '),e.dom.setHTML(f,a),e.fire("SetContent",b)):("raw"!==b.format&&(a=new h({validate:e.validate},e.schema).serialize(e.parser.parse(a,{isRootContent:!0}))),b.content=t(a),e.dom.setHTML(f,b.content),b.no_events||e.fire("SetContent",b)),b.content},getContent:function(a){var b,c=this,d=c.getBody();return c.removed?"":(a=a||{},a.format=a.format||"html",a.get=!0,a.getInner=!0,a.no_events||c.fire("BeforeGetContent",a),b="raw"==a.format?m.trim(c.serializer.getTrimmedContent()):"text"==a.format?d.innerText||d.textContent:c.serializer.serialize(d,a),"text"!=a.format?a.content=t(b):a.content=b,a.no_events||c.fire("GetContent",a),a.content)},insertContent:function(a,b){b&&(a=r({content:a},b)),this.execCommand("mceInsertContent",!1,a)},isDirty:function(){return!this.isNotDirty},setDirty:function(a){var b=!this.isNotDirty;this.isNotDirty=!a,a&&a!=b&&this.fire("dirty")},setMode:function(a){j.setMode(this,a)},getContainer:function(){var a=this;return a.container||(a.container=q.get(a.editorContainer||a.id+"_parent")),a.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return this.targetElm||(this.targetElm=q.get(this.id)),this.targetElm},getWin:function(){var a,b=this;return b.contentWindow||(a=b.iframeElement,a&&(b.contentWindow=a.contentWindow)),b.contentWindow},getDoc:function(){var a,b=this;return b.contentDocument||(a=b.getWin(),a&&(b.contentDocument=a.document)),b.contentDocument},getBody:function(){var a=this.getDoc();return this.bodyElement||(a?a.body:null)},convertURL:function(a,b,c){var d=this,e=d.settings;return e.urlconverter_callback?d.execCallback("urlconverter_callback",a,c,!0,b):!e.convert_urls||c&&"LINK"==c.nodeName||0===a.indexOf("file:")||0===a.length?a:e.relative_urls?d.documentBaseURI.toRelative(a):a=d.documentBaseURI.toAbsolute(a,e.remove_script_host)},addVisual:function(a){var b,c=this,d=c.settings,e=c.dom;a=a||c.getBody(),void 0===c.hasVisual&&(c.hasVisual=d.visual),s(e.select("table,a",a),function(a){var f;switch(a.nodeName){case"TABLE":return b=d.visual_table_class||"mce-item-table",f=e.getAttrib(a,"border"),void(f&&"0"!=f||!c.hasVisual?e.removeClass(a,b):e.addClass(a,b));case"A":return void(e.getAttrib(a,"href",!1)||(f=e.getAttrib(a,"name")||a.id,b=d.visual_anchor_class||"mce-item-anchor",f&&c.hasVisual?e.addClass(a,b):e.removeClass(a,b)))}}),c.fire("VisualAid",{element:a,hasVisual:c.hasVisual})},remove:function(){var a=this;a.removed||(a.save(),a.removed=1,a.unbindAllNativeEvents(),a.hasHiddenInput&&q.remove(a.getElement().nextSibling),a.inline||(w&&w<10&&a.getDoc().execCommand("SelectAll",!1,null),q.setStyle(a.id,"display",a.orgDisplay),a.getBody().onload=null),a.fire("remove"),a.editorManager.remove(a),q.remove(a.getContainer()),a._selectionOverrides.destroy(),a.editorUpload.destroy(),a.destroy())},destroy:function(a){var b,c=this;if(!c.destroyed){if(!a&&!c.removed)return void c.remove();a||(c.editorManager.off("beforeunload",c._beforeUnload),c.theme&&c.theme.destroy&&c.theme.destroy(),c.selection.destroy(),c.dom.destroy()),b=c.formElement,b&&(b._mceOldSubmit&&(b.submit=b._mceOldSubmit,b._mceOldSubmit=null),q.unbind(b,"submit reset",c.formEventDelegate)),c.contentAreaContainer=c.formElement=c.container=c.editorContainer=null,c.bodyElement=c.contentDocument=c.contentWindow=null,c.iframeElement=c.targetElm=null,c.selection&&(c.selection=c.selection.win=c.selection.dom=c.selection.dom.doc=null), +c.destroyed=1}},uploadImages:function(a){return this.editorUpload.uploadImages(a)},_scanForImages:function(){return this.editorUpload.scanForImages()}},r(p.prototype,e),p}),g("15",["9"],function(a){"use strict";var b={},c="en";return{setCode:function(a){a&&(c=a,this.rtl=!!this.data[a]&&"rtl"===this.data[a]._dir)},getCode:function(){return c},rtl:!1,add:function(a,c){var d=b[a];d||(b[a]=d={});for(var e in c)d[e]=c[e];this.setCode(a)},translate:function(d){function e(b){return a.is(b,"function")?Object.prototype.toString.call(b):f(b)?"":""+b}function f(b){return""===b||null===b||a.is(b,"undefined")}function g(b){return b=e(b),a.hasOwn(h,b)?e(h[b]):b}var h=b[c]||{};if(f(d))return"";if(a.is(d,"object")&&a.hasOwn(d,"raw"))return e(d.raw);if(a.is(d,"array")){var i=d.slice(1);d=g(d[0]).replace(/\{([0-9]+)\}/g,function(b,c){return a.hasOwn(i,c)?e(i[c]):b})}return g(d).replace(/{context:\w+}$/,"")},data:b}}),g("16",["e","5","6"],function(a,b,c){function d(a){function d(){try{return document.activeElement}catch(a){return document.body}}function j(a,b){if(b&&b.startContainer){if(!a.isChildOf(b.startContainer,a.getRoot())||!a.isChildOf(b.endContainer,a.getRoot()))return;return{startContainer:b.startContainer,startOffset:b.startOffset,endContainer:b.endContainer,endOffset:b.endOffset}}return b}function l(a,b){var c;return b.startContainer?(c=a.getDoc().createRange(),c.setStart(b.startContainer,b.startOffset),c.setEnd(b.endContainer,b.endOffset)):c=b,c}function m(m){var n=m.editor;n.on("init",function(){(n.inline||c.ie)&&("onbeforedeactivate"in document&&c.ie<9?n.dom.bind(n.getBody(),"beforedeactivate",function(a){if(a.target==n.getBody())try{n.lastRng=n.selection.getRng()}catch(a){}}):n.on("nodechange mouseup keyup",function(a){var b=d();"nodechange"==a.type&&a.selectionChange||(b&&b.id==n.id+"_ifr"&&(b=n.getBody()),n.dom.isChildOf(b,n.getBody())&&(n.lastRng=n.selection.getRng()))}),c.webkit&&!e&&(e=function(){var b=a.activeEditor;if(b&&b.selection){var c=b.selection.getRng();c&&!c.collapsed&&(n.lastRng=c)}},h.bind(document,"selectionchange",e)))}),n.on("setcontent",function(){n.lastRng=null}),n.on("mousedown",function(){n.selection.lastFocusBookmark=null}),n.on("focusin",function(){var b,c=a.focusedEditor;n.selection.lastFocusBookmark&&(b=l(n,n.selection.lastFocusBookmark),n.selection.lastFocusBookmark=null,n.selection.setRng(b)),c!=n&&(c&&c.fire("blur",{focusedEditor:n}),a.setActive(n),a.focusedEditor=n,n.fire("focus",{blurredEditor:c}),n.focus(!0)),n.lastRng=null}),n.on("focusout",function(){b.setEditorTimeout(n,function(){var b=a.focusedEditor;i(n,d())||b!=n||(n.fire("blur",{focusedEditor:null}),a.focusedEditor=null,n.selection&&(n.selection.lastFocusBookmark=null))})}),f||(f=function(b){var c,d=a.activeEditor;c=b.target,d&&c.ownerDocument===document&&(d.selection&&c!==d.getBody()&&k(n,c)&&(d.selection.lastFocusBookmark=j(d.dom,d.lastRng)),c===document.body||i(d,c)||a.focusedEditor!==d||(d.fire("blur",{focusedEditor:null}),a.focusedEditor=null))},h.bind(document,"focusin",f)),n.inline&&!g&&(g=function(b){var c=a.activeEditor,d=c.dom;if(c.inline&&d&&!d.isChildOf(b.target,c.getBody())){var e=c.selection.getRng();e.collapsed||(c.lastRng=e)}},h.bind(document,"mouseup",g))}function n(b){a.focusedEditor==b.editor&&(a.focusedEditor=null),a.activeEditor||(h.unbind(document,"selectionchange",e),h.unbind(document,"focusin",f),h.unbind(document,"mouseup",g),e=f=g=null)}a.on("AddEditor",m),a.on("RemoveEditor",n)}var e,f,g,h=a.DOM,i=function(a,b){var c=a?a.settings.custom_ui_selector:"",e=h.getParent(b,function(b){return d.isEditorUIElement(b)||!!c&&a.dom.is(b,c)});return null!==e},j=function(a){return a.inline===!0},k=function(a,b){return j(a)===!1||a.dom.isChildOf(b,a.getBody())===!1};return d.isEditorUIElement=function(a){return a.className.toString().indexOf("mce-")!==-1},d._isUIElement=i,d}),g("2c",["9"],function(a){var b=a.each,c=a.explode,d=function(a){a.on("AddEditor",function(a){var d=a.editor;d.on("preInit",function(){function a(a,c){b(c,function(b,c){b&&h.setStyle(a,c,b)}),h.rename(a,"span")}function e(a){h=d.dom,i.convert_fonts_to_spans&&b(h.select("font,u,strike",a.node),function(a){f[a.nodeName.toLowerCase()](h,a)})}var f,g,h,i=d.settings;i.inline_styles&&(g=c(i.font_size_legacy_values),f={font:function(b,c){a(c,{backgroundColor:c.style.backgroundColor,color:c.color,fontFamily:c.face,fontSize:g[parseInt(c.size,10)-1]})},u:function(b,c){"html4"===d.settings.schema&&a(c,{textDecoration:"underline"})},strike:function(b,c){a(c,{textDecoration:"line-through"})}},d.on("PreProcess SetContent",e))})})};return{register:d}}),g("17",["g","a","e","14","6","2b","16","2c","15","z","4","9","w"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){function n(a){v(s.editors,function(b){"scroll"===a.type?b.fire("ScrollWindow",a):b.fire("ResizeWindow",a)})}function o(a,c){c!==y&&(c?b(window).on("resize scroll",n):b(window).off("resize scroll",n),y=c)}function p(a){var b,c=s.editors;delete c[a.id];for(var d=0;d0&&v(u(b),function(a){var b;(b=t.get(a))?c.push(b):v(document.forms,function(b){v(b.elements,function(b){b.name===a&&(a="mce_editor_"+x++,t.setAttrib(b,"id",a),c.push(b))})})});break;case"textareas":case"specific_textareas":v(t.select("textarea"),function(b){a.editor_deselector&&i(b,a.editor_deselector)||a.editor_selector&&!i(b,a.editor_selector)||c.push(b)})}return c}function m(){function e(a,b,c){var e=new d(a,b,p);n.push(e),e.on("init",function(){++k===i.length&&r(n)}),e.targetElm=e.targetElm||c,e.render()}var i,k=0,n=[];return t.unbind(window,"ready",m),h("onpageload"),i=b.unique(j(a)),a.types?void v(a.types,function(b){l.each(i,function(c){return!t.is(c,b.selector)||(e(g(c),w({},a,b),c),!1)})}):(l.each(i,function(a){q(p.get(a.id))}),i=l.grep(i,function(a){return!p.get(a.id)}),void(0===i.length?r([]):v(i,function(b){c(a,b)?f.initError("Could not initialize inline editor on invalid inline target element",b):e(g(b),a,b)})))}var n,o,p=this;o=l.makeMap("area base basefont br col frame hr img input isindex link meta param embed source wbr track colgroup option tbody tfoot thead tr script noscript style textarea video audio iframe object menu"," ");var r=function(a){n=a};return p.settings=a,t.bind(window,"ready",m),new k(function(a){n?a(n):r=function(b){a(b)}})},get:function(a){return arguments.length?a in this.editors?this.editors[a]:null:this.editors},add:function(a){var b=this,c=b.editors;return c[a.id]=a,c.push(a),o(c,!0),b.activeEditor=a,b.fire("AddEditor",{editor:a}),r||(r=function(){b.fire("BeforeUnload")},t.bind(window,"beforeunload",r)),a},createEditor:function(a,b){return this.add(new d(a,b,this))},remove:function(a){var b,c,d=this,e=d.editors;{if(a)return"string"==typeof a?(a=a.selector||a,void v(t.select(a),function(a){c=e[a.id],c&&d.remove(c)})):(c=a,e[c.id]?(p(c)&&d.fire("RemoveEditor",{editor:c}),e.length||t.unbind(window,"beforeunload",r),c.remove(),o(e,e.length>0),c):null);for(b=e.length-1;b>=0;b--)d.remove(e[b])}},execCommand:function(a,b,c){var e=this,f=e.get(c);switch(a){case"mceAddEditor":return e.get(c)||new d(c,e.settings,e).render(),!0;case"mceRemoveEditor":return f&&f.remove(),!0;case"mceToggleEditor":return f?(f.isHidden()?f.show():f.hide(),!0):(e.execCommand("mceAddEditor",0,c),!0)}return!!e.activeEditor&&e.activeEditor.execCommand(a,b,c)},triggerSave:function(){v(this.editors,function(a){a.save()})},addI18n:function(a,b){i.add(a,b)},translate:function(a){return i.translate(a)},setActive:function(a){var b=this.activeEditor;this.activeEditor!=a&&(b&&b.fire("deactivate",{relatedTarget:a}),a.fire("activate",{relatedTarget:b})),this.activeEditor=a}},w(s,j),s.setup(),h.register(s),s}),g("18",["z","9"],function(a,b){var c={send:function(a){function d(){!a.async||4==e.readyState||f++>1e4?(a.success&&f<1e4&&200==e.status?a.success.call(a.success_scope,""+e.responseText,e,a):a.error&&a.error.call(a.error_scope,f>1e4?"TIMED_OUT":"GENERAL",e,a),e=null):setTimeout(d,10)}var e,f=0;if(a.scope=a.scope||this,a.success_scope=a.success_scope||a.scope,a.error_scope=a.error_scope||a.scope,a.async=a.async!==!1,a.data=a.data||"",c.fire("beforeInitialize",{settings:a}),e=new XMLHttpRequest){if(e.overrideMimeType&&e.overrideMimeType(a.content_type),e.open(a.type||(a.data?"POST":"GET"),a.url,a.async),a.crossDomain&&(e.withCredentials=!0),a.content_type&&e.setRequestHeader("Content-Type",a.content_type),a.requestheaders&&b.each(a.requestheaders,function(a){e.setRequestHeader(a.key,a.value)}),e.setRequestHeader("X-Requested-With","XMLHttpRequest"),e=c.fire("beforeSend",{xhr:e,settings:a}).xhr,e.send(a.data),!a.async)return d();setTimeout(d,10)}}};return b.extend(c,a),c}),g("19",[],function(){function a(b,c){var d,e,f,g;if(c=c||'"',null===b)return"null";if(f=typeof b,"string"==f)return e="\bb\tt\nn\ff\rr\"\"''\\\\",c+b.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(a,b){return'"'===c&&"'"===a?a:(d=e.indexOf(b),d+1?"\\"+e.charAt(d+1):(a=b.charCodeAt().toString(16),"\\u"+"0000".substring(a.length)+a))})+c;if("object"==f){if(b.hasOwnProperty&&"[object Array]"===Object.prototype.toString.call(b)){for(d=0,e="[";d0?",":"")+a(b[d],c);return e+"]"}e="{";for(g in b)b.hasOwnProperty(g)&&(e+="function"!=typeof b[g]?(e.length>1?","+c:c)+g+c+":"+a(b[g],c):"");return e+"}"}return""+b}return{serialize:a,parse:function(a){try{return window[String.fromCharCode(101)+"val"]("("+a+")")}catch(a){}}}}),g("1a",["19","18","9"],function(a,b,c){function d(a){this.settings=e({},a),this.count=0}var e=c.extend;return d.sendRPC=function(a){return(new d).send(a)},d.prototype={send:function(c){var d=c.error,f=c.success;c=e(this.settings,c),c.success=function(b,e){b=a.parse(b),"undefined"==typeof b&&(b={error:"JSON Parse error."}),b.error?d.call(c.error_scope||c.scope,b.error,e):f.call(c.success_scope||c.scope,b.result)},c.error=function(a,b){d&&d.call(c.error_scope||c.scope,a,b)},c.data=a.serialize({id:c.id||"c"+this.count++,method:c.method,params:c.params}),c.content_type="application/json",b.send(c)}},d}),g("1b",["e"],function(a){return{callbacks:{},count:0,send:function(b){var c=this,d=a.DOM,e=void 0!==b.count?b.count:c.count,f="tinymce_jsonp_"+e;c.callbacks[e]=function(a){d.remove(f),delete c.callbacks[e],b.callback(a)},d.add(d.doc.body,"script",{id:f,src:b.url,type:"text/javascript"}),c.count++}}}),g("1c",[],function(){function a(){g=[];for(var a in f)g.push(a);d.length=g.length}function b(){function b(a){var b,c;return c=void 0!==a?j+a:d.indexOf(",",j),c===-1||c>d.length?null:(b=d.substring(j,c),j=c+1,b)}var c,d,g,j=0;if(f={},i){e.load(h),d=e.getAttribute(h)||"";do{var k=b();if(null===k)break;if(c=b(parseInt(k,32)||0),null!==c){if(k=b(),null===k)break;g=b(parseInt(k,32)||0),c&&(f[c]=g)}}while(null!==c);a()}}function c(){var b,c="";if(i){for(var d in f)b=f[d],c+=(c?",":"")+d.length.toString(32)+","+d+","+b.length.toString(32)+","+b;e.setAttribute(h,c);try{e.save(h)}catch(a){}a()}}var d,e,f,g,h,i;try{if(window.localStorage)return localStorage}catch(a){}return h="tinymce",e=document.documentElement,i=!!e.addBehavior,i&&e.addBehavior("#default#userData"),d={key:function(a){return g[a]},getItem:function(a){return a in f?f[a]:null},setItem:function(a,b){f[a]=""+b,c()},removeItem:function(a){delete f[a],c()},clear:function(){f={},c()}},b(),d}),g("1d",["e","7","f","g","9","6"],function(a,b,c,d,e,f){var g=function(g){g.DOM=a.DOM,g.ScriptLoader=c.ScriptLoader,g.PluginManager=d.PluginManager,g.ThemeManager=d.ThemeManager,g.dom=g.dom||{},g.dom.Event=b.Event,e.each("trim isArray is toArray makeMap each map grep inArray extend create walk createNS resolve explode _addCacheSuffix".split(" "),function(a){g[a]=e[a]}),e.each("isOpera isWebKit isIE isGecko isMac".split(" "),function(a){g[a]=f[a.substr(2).toLowerCase()]})};return{register:g}}),g("1e",[],function(){function a(a){function e(a,e,f){var g,h,i,j,k,l;return g=0,h=0,i=0,a/=255,e/=255,f/=255,k=b(a,b(e,f)),l=c(a,c(e,f)),k==l?(i=k,{h:0,s:0,v:100*i}):(j=a==k?e-f:f==k?a-e:f-a,g=a==k?3:f==k?1:5,g=60*(g-j/(l-k)),h=(l-k)/l,i=l,{h:d(g),s:d(100*h),v:d(100*i)})}function f(a,e,f){var g,h,i,j;if(a=(parseInt(a,10)||0)%360,e=parseInt(e,10)/100,f=parseInt(f,10)/100,e=c(0,b(e,1)),f=c(0,b(f,1)),0===e)return void(l=m=n=d(255*f));switch(g=a/60,h=f*e,i=h*(1-Math.abs(g%2-1)),j=f-h,Math.floor(g)){case 0:l=h,m=i,n=0;break;case 1:l=i,m=h,n=0;break;case 2:l=0,m=h,n=i;break;case 3:l=0,m=i,n=h;break;case 4:l=i,m=0,n=h;break;case 5:l=h,m=0,n=i;break;default:l=m=n=0}l=d(255*(l+j)),m=d(255*(m+j)),n=d(255*(n+j))}function g(){function a(a){return a=parseInt(a,10).toString(16),a.length>1?a:"0"+a}return"#"+a(l)+a(m)+a(n)}function h(){return{r:l,g:m,b:n}}function i(){return e(l,m,n)}function j(a){var b;return"object"==typeof a?"r"in a?(l=a.r,m=a.g,n=a.b):"v"in a&&f(a.h,a.s,a.v):(b=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)[^\)]*\)/gi.exec(a))?(l=parseInt(b[1],10),m=parseInt(b[2],10),n=parseInt(b[3],10)):(b=/#([0-F]{2})([0-F]{2})([0-F]{2})/gi.exec(a))?(l=parseInt(b[1],16),m=parseInt(b[2],16),n=parseInt(b[3],16)):(b=/#([0-F])([0-F])([0-F])/gi.exec(a))&&(l=parseInt(b[1]+b[1],16),m=parseInt(b[2]+b[2],16),n=parseInt(b[3]+b[3],16)),l=l<0?0:l>255?255:l,m=m<0?0:m>255?255:m,n=n<0?0:n>255?255:n,k}var k=this,l=0,m=0,n=0;a&&j(a),k.toRgb=h,k.toHsv=i,k.toHex=g,k.parse=j}var b=Math.min,c=Math.max,d=Math.round;return a}),g("2t",["x","9"],function(a,b){"use strict";return a.extend({Defaults:{firstControlClass:"first",lastControlClass:"last"},init:function(a){this.settings=b.extend({},this.Defaults,a)},preRender:function(a){a.bodyClasses.add(this.settings.containerClass)},applyClasses:function(a){var b,c,d,e,f=this,g=f.settings;b=g.firstControlClass,c=g.lastControlClass,a.each(function(a){a.classes.remove(b).remove(c).add(g.controlClass),a.visible()&&(d||(d=a),e=a)}),d&&d.classes.add(b),e&&e.classes.add(c)},renderHtml:function(a){var b=this,c="";return b.applyClasses(a.items()),a.items().each(function(a){c+=a.renderHtml()}),c},recalc:function(){},postRender:function(){},isNative:function(){return!1}})}),g("2u",["2t"],function(a){"use strict";return a.extend({Defaults:{containerClass:"abs-layout",controlClass:"abs-layout-item"},recalc:function(a){a.items().filter(":visible").each(function(a){var b=a.settings;a.layoutRect({x:b.x,y:b.y,w:b.w,h:b.h}),a.recalc&&a.recalc()})},renderHtml:function(a){return'
      '+this._super(a)}})}),g("2v",["2r"],function(a){"use strict";return a.extend({Defaults:{classes:"widget btn",role:"button"},init:function(a){var b,c=this;c._super(a),a=c.settings,b=c.settings.size,c.on("click mousedown",function(a){a.preventDefault()}),c.on("touchstart",function(a){c.fire("click",a),a.preventDefault()}),a.subtype&&c.classes.add(a.subtype),b&&c.classes.add("btn-"+b),a.icon&&c.icon(a.icon)},icon:function(a){return arguments.length?(this.state.set("icon",a),this):this.state.get("icon")},repaint:function(){var a,b=this.getEl().firstChild;b&&(a=b.style,a.width=a.height="100%"),this._super()},renderHtml:function(){var a,b=this,c=b._id,d=b.classPrefix,e=b.state.get("icon"),f=b.state.get("text"),g="";return a=b.settings.image,a?(e="none","string"!=typeof a&&(a=window.getSelection?a[0]:a[1]),a=" style=\"background-image: url('"+a+"')\""):a="",f&&(b.classes.add("btn-has-text"),g=''+b.encode(f)+""),e=e?d+"ico "+d+"i-"+e:"",'
      "},bindStates:function(){function a(a){var e=c("span."+d,b.getEl());a?(e[0]||(c("button:first",b.getEl()).append(''),e=c("span."+d,b.getEl())),e.html(b.encode(a))):e.remove(),b.classes.toggle("btn-has-text",!!a)}var b=this,c=b.$,d=b.classPrefix+"txt";return b.state.on("change:text",function(b){a(b.value)}),b.state.on("change:icon",function(c){var d=c.value,e=b.classPrefix;b.settings.icon=d,d=d?e+"ico "+e+"i-"+b.settings.icon:"";var f=b.getEl().firstChild,g=f.getElementsByTagName("i")[0];d?(g&&g==f.firstChild||(g=document.createElement("i"),f.insertBefore(g,f.firstChild)),g.className=d):g&&f.removeChild(g),a(b.state.get("text"))}),b._super()}})}),g("2w",["2j"],function(a){"use strict";return a.extend({Defaults:{defaultType:"button",role:"group"},renderHtml:function(){var a=this,b=a._layout;return a.classes.add("btn-group"),a.preRender(),b.preRender(a),'
      '+(a.settings.html||"")+b.renderHtml(a)+"
      "}})}),g("2x",["2r"],function(a){"use strict";return a.extend({Defaults:{classes:"checkbox",role:"checkbox",checked:!1},init:function(a){var b=this;b._super(a),b.on("click mousedown",function(a){a.preventDefault()}),b.on("click",function(a){a.preventDefault(),b.disabled()||b.checked(!b.checked())}),b.checked(b.settings.checked)},checked:function(a){return arguments.length?(this.state.set("checked",a),this):this.state.get("checked")},value:function(a){return arguments.length?this.checked(a):this.checked()},renderHtml:function(){var a=this,b=a._id,c=a.classPrefix;return'
      '+a.encode(a.state.get("text"))+"
      "},bindStates:function(){function a(a){b.classes.toggle("checked",a),b.aria("checked",a)}var b=this;return b.state.on("change:text",function(a){b.getEl("al").firstChild.data=b.translate(a.value)}),b.state.on("change:checked change:value",function(c){b.fire("change"),a(c.value)}),b.state.on("change:icon",function(a){var c=a.value,d=b.classPrefix;if("undefined"==typeof c)return b.settings.icon;b.settings.icon=c,c=c?d+"ico "+d+"i-"+b.settings.icon:"";var e=b.getEl().firstChild,f=e.getElementsByTagName("i")[0];c?(f&&f==e.firstChild||(f=document.createElement("i"),e.insertBefore(f,e.firstChild)),f.className=c):f&&e.removeChild(f)}),b.state.get("checked")&&a(!0),b._super()}})}),g("2y",["2r","2h","4q","a","p","9"],function(a,b,c,d,e,f){"use strict";return a.extend({init:function(a){var b=this;b._super(a),a=b.settings,b.classes.add("combobox"),b.subinput=!0,b.ariaTarget="inp",a.menu=a.menu||a.values,a.menu&&(a.icon="caret"),b.on("click",function(c){var e=c.target,f=b.getEl();if(d.contains(f,e)||e==f)for(;e&&e!=f;)e.id&&e.id.indexOf("-open")!=-1&&(b.fire("action"),a.menu&&(b.showMenu(),c.aria&&b.menu.items()[0].focus())),e=e.parentNode}),b.on("keydown",function(a){var c;13==a.keyCode&&"INPUT"===a.target.nodeName&&(a.preventDefault(),b.parents().reverse().each(function(a){if(a.toJSON)return c=a,!1}),b.fire("submit",{data:c.toJSON()}))}),b.on("keyup",function(a){if("INPUT"==a.target.nodeName){var c=b.state.get("value"),d=a.target.value;d!==c&&(b.state.set("value",d),b.fire("autocomplete",a))}}),b.on("mouseover",function(a){var c=b.tooltip().moveTo(-65535);if(b.statusLevel()&&a.target.className.indexOf(b.classPrefix+"status")!==-1){var d=b.statusMessage()||"Ok",e=c.text(d).show().testMoveRel(a.target,["bc-tc","bc-tl","bc-tr"]);c.classes.toggle("tooltip-n","bc-tc"==e),c.classes.toggle("tooltip-nw","bc-tl"==e),c.classes.toggle("tooltip-ne","bc-tr"==e),c.moveRel(a.target,e)}})},statusLevel:function(a){return arguments.length>0&&this.state.set("statusLevel",a),this.state.get("statusLevel")},statusMessage:function(a){return arguments.length>0&&this.state.set("statusMessage",a),this.state.get("statusMessage")},showMenu:function(){var a,c=this,d=c.settings;c.menu||(a=d.menu||[],a.length?a={type:"menu",items:a}:a.type=a.type||"menu",c.menu=b.create(a).parent(c).renderTo(c.getContainerElm()),c.fire("createmenu"),c.menu.reflow(),c.menu.on("cancel",function(a){a.control===c.menu&&c.focus()}),c.menu.on("show hide",function(a){a.control.items().each(function(a){a.active(a.value()==c.value())})}).fire("show"),c.menu.on("select",function(a){c.value(a.control.value())}),c.on("focusin",function(a){"INPUT"==a.target.tagName.toUpperCase()&&c.menu.hide()}),c.aria("expanded",!0)),c.menu.show(),c.menu.layoutRect({w:c.layoutRect().w}),c.menu.moveRel(c.getEl(),c.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])},focus:function(){this.getEl("inp").focus()},repaint:function(){var a,b,e=this,f=e.getEl(),g=e.getEl("open"),h=e.layoutRect(),i=0,j=f.firstChild;e.statusLevel()&&"none"!==e.statusLevel()&&(i=parseInt(c.getRuntimeStyle(j,"padding-right"),10)-parseInt(c.getRuntimeStyle(j,"padding-left"),10)),a=g?h.w-c.getSize(g).width-10:h.w-10;var k=document;return k.all&&(!k.documentMode||k.documentMode<=8)&&(b=e.layoutRect().h-2+"px"),d(j).css({width:a-i,lineHeight:b}),e._super(),e},postRender:function(){var a=this;return d(this.getEl("inp")).on("change",function(b){a.state.set("value",b.target.value),a.fire("change",b)}),a._super()},renderHtml:function(){var a,b,c=this,d=c._id,e=c.settings,f=c.classPrefix,g=c.state.get("value")||"",h="",i="",j="";return"spellcheck"in e&&(i+=' spellcheck="'+e.spellcheck+'"'),e.maxLength&&(i+=' maxlength="'+e.maxLength+'"'),e.size&&(i+=' size="'+e.size+'"'),e.subtype&&(i+=' type="'+e.subtype+'"'),j='',c.disabled()&&(i+=' disabled="disabled"'),a=e.icon,a&&"caret"!=a&&(a=f+"ico "+f+"i-"+e.icon),b=c.state.get("text"),(a||b)&&(h='
      ",c.classes.add("has-open")),'
      '+j+h+"
      "},value:function(a){return arguments.length?(this.state.set("value",a),this):(this.state.get("rendered")&&this.state.set("value",this.getEl("inp").value),this.state.get("value"))},showAutoComplete:function(a,c){var d=this;if(0===a.length)return void d.hideMenu();var e=function(a,b){return function(){d.fire("selectitem",{title:b,value:a})}};d.menu?d.menu.items().remove():d.menu=b.create({type:"menu",classes:"combobox-menu",layout:"flow"}).parent(d).renderTo(),f.each(a,function(a){d.menu.add({text:a.title,url:a.previewUrl,match:c,classes:"menu-item-ellipsis",onclick:e(a.value,a.title)})}),d.menu.renderNew(),d.hideMenu(),d.menu.on("cancel",function(a){a.control.parent()===d.menu&&(a.stopPropagation(),d.focus(),d.hideMenu())}),d.menu.on("select",function(){d.focus()});var g=d.layoutRect().w;d.menu.layoutRect({w:g,minW:0,maxW:g}),d.menu.reflow(),d.menu.show(),d.menu.moveRel(d.getEl(),d.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])},hideMenu:function(){this.menu&&this.menu.hide()},bindStates:function(){var a=this;a.state.on("change:value",function(b){a.getEl("inp").value!=b.value&&(a.getEl("inp").value=b.value)}),a.state.on("change:disabled",function(b){a.getEl("inp").disabled=b.value}),a.state.on("change:statusLevel",function(b){var d=a.getEl("status"),e=a.classPrefix,f=b.value;c.css(d,"display","none"===f?"none":""),c.toggleClass(d,e+"i-checkmark","ok"===f),c.toggleClass(d,e+"i-warning","warn"===f),c.toggleClass(d,e+"i-error","error"===f),a.classes.toggle("has-status","none"!==f),a.repaint()}),c.on(a.getEl("status"),"mouseleave",function(){a.tooltip().hide()}),a.on("cancel",function(b){a.menu&&a.menu.visible()&&(b.stopPropagation(),a.hideMenu())});var b=function(a,b){b&&b.items().length>0&&b.items().eq(a)[0].focus()};return a.on("keydown",function(c){var d=c.keyCode;"INPUT"===c.target.nodeName&&(d===e.DOWN?(c.preventDefault(),a.fire("autocomplete"),b(0,a.menu)):d===e.UP&&(c.preventDefault(),b(-1,a.menu)))}),a._super()},remove:function(){d(this.getEl("inp")).off(),this.menu&&this.menu.remove(),this._super()}})}),g("2z",["2y"],function(a){"use strict";return a.extend({init:function(a){var b=this;a.spellcheck=!1,a.onaction&&(a.icon="none"),b._super(a),b.classes.add("colorbox"),b.on("change keyup postrender",function(){b.repaintColor(b.value())})},repaintColor:function(a){var b=this.getEl("open"),c=b?b.getElementsByTagName("i")[0]:null;if(c)try{c.style.background=a}catch(a){}},bindStates:function(){var a=this;return a.state.on("change:value",function(b){a.state.get("rendered")&&a.repaintColor(b.value)}),a._super()}})}),g("30",["2v","2p"],function(a,b){"use strict";return a.extend({showPanel:function(){var a=this,c=a.settings;if(a.active(!0),a.panel)a.panel.show();else{var d=c.panel;d.type&&(d={layout:"grid",items:d}),d.role=d.role||"dialog",d.popover=!0,d.autohide=!0,d.ariaRoot=!0,a.panel=new b(d).on("hide",function(){a.active(!1)}).on("cancel",function(b){b.stopPropagation(),a.focus(),a.hidePanel()}).parent(a).renderTo(a.getContainerElm()),a.panel.fire("show"),a.panel.reflow()}var e=a.panel.testMoveRel(a.getEl(),c.popoverAlign||(a.isRtl()?["bc-tc","bc-tl","bc-tr"]:["bc-tc","bc-tr","bc-tl"]));a.panel.classes.toggle("start","bc-tl"===e),a.panel.classes.toggle("end","bc-tr"===e),a.panel.moveRel(a.getEl(),e)},hidePanel:function(){var a=this;a.panel&&a.panel.hide()},postRender:function(){var a=this;return a.aria("haspopup",!0),a.on("click",function(b){b.control===a&&(a.panel&&a.panel.visible()?a.hidePanel():(a.showPanel(),a.panel.focus(!!b.aria)))}),a._super()},remove:function(){return this.panel&&(this.panel.remove(),this.panel=null),this._super()}})}),g("31",["30","e"],function(a,b){"use strict";var c=b.DOM;return a.extend({init:function(a){this._super(a),this.classes.add("colorbutton")},color:function(a){return a?(this._color=a,this.getEl("preview").style.backgroundColor=a,this):this._color},resetColor:function(){return this._color=null,this.getEl("preview").style.backgroundColor=null,this},renderHtml:function(){var a=this,b=a._id,c=a.classPrefix,d=a.state.get("text"),e=a.settings.icon?c+"ico "+c+"i-"+a.settings.icon:"",f=a.settings.image?" style=\"background-image: url('"+a.settings.image+"')\"":"",g="";return d&&(a.classes.add("btn-has-text"),g=''+a.encode(d)+""),'
      '},postRender:function(){var a=this,b=a.settings.onclick;return a.on("click",function(d){d.aria&&"down"==d.aria.key||d.control!=a||c.getParent(d.target,"."+a.classPrefix+"open")||(d.stopImmediatePropagation(),b.call(a,d))}),delete a.settings.onclick,a._super()}})}),g("32",["2r","2k","4q","1e"],function(a,b,c,d){"use strict";return a.extend({Defaults:{classes:"widget colorpicker"},init:function(a){this._super(a)},postRender:function(){function a(a,b){var d,e,f=c.getPos(a);return d=b.pageX-f.x,e=b.pageY-f.y,d=Math.max(0,Math.min(d/a.clientWidth,1)),e=Math.max(0,Math.min(e/a.clientHeight,1)),{x:d,y:e}}function e(a,b){var e=(360-a.h)/360;c.css(j,{top:100*e+"%"}),b||c.css(l,{left:a.s+"%",top:100-a.v+"%"}),k.style.background=new d({s:100,v:100,h:a.h}).toHex(),m.color().parse({s:a.s,v:a.v,h:a.h})}function f(b){var c;c=a(k,b),h.s=100*c.x,h.v=100*(1-c.y),e(h),m.fire("change")}function g(b){var c;c=a(i,b),h=n.toHsv(),h.h=360*(1-c.y),e(h,!0),m.fire("change")}var h,i,j,k,l,m=this,n=m.color();i=m.getEl("h"),j=m.getEl("hp"),k=m.getEl("sv"),l=m.getEl("svp"),m._repaint=function(){h=n.toHsv(),e(h)},m._super(),m._svdraghelper=new b(m._id+"-sv",{start:f,drag:f}),m._hdraghelper=new b(m._id+"-h",{start:g,drag:g}),m._repaint()},rgb:function(){return this.color().toRgb()},value:function(a){var b=this;return arguments.length?(b.color().parse(a),void(b._rendered&&b._repaint())):b.color().toHex()},color:function(){return this._color||(this._color=new d),this._color},renderHtml:function(){function a(){var a,b,c,d,g="";for(c="filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=",d=f.split(","),a=0,b=d.length-1;a';return g}var b,c=this,d=c._id,e=c.classPrefix,f="#ff0000,#ff0080,#ff00ff,#8000ff,#0000ff,#0080ff,#00ffff,#00ff80,#00ff00,#80ff00,#ffff00,#ff8000,#ff0000",g="background: -ms-linear-gradient(top,"+f+");background: linear-gradient(to bottom,"+f+");";return b='
      '+a()+'
      ','
      '+b+"
      "}})}),g("33",["2r"],function(a){"use strict";return a.extend({init:function(a){var b=this;a.delimiter||(a.delimiter="\xbb"),b._super(a),b.classes.add("path"),b.canFocus=!0,b.on("click",function(a){var c,d=a.target;(c=d.getAttribute("data-index"))&&b.fire("select",{value:b.row()[c],index:c})}),b.row(b.settings.row)},focus:function(){var a=this;return a.getEl().firstChild.focus(),a},row:function(a){return arguments.length?(this.state.set("row",a),this):this.state.get("row")},renderHtml:function(){var a=this;return'
      '+a._getDataPathHtml(a.state.get("row"))+"
      "},bindStates:function(){var a=this;return a.state.on("change:row",function(b){a.innerHtml(a._getDataPathHtml(b.value))}),a._super()},_getDataPathHtml:function(a){var b,c,d=this,e=a||[],f="",g=d.classPrefix;for(b=0,c=e.length;b0?'":"")+'
      '+e[b].name+"
      "; +return f||(f='
      \xa0
      '),f}})}),g("34",["33"],function(a){return a.extend({postRender:function(){function a(a){if(1===a.nodeType){if("BR"==a.nodeName||a.getAttribute("data-mce-bogus"))return!0;if("bookmark"===a.getAttribute("data-mce-type"))return!0}return!1}var b=this,c=b.settings.editor;return c.settings.elementpath!==!1&&(b.on("select",function(a){c.focus(),c.selection.select(this.row()[a.index].element),c.nodeChanged()}),c.on("nodeChange",function(d){for(var e=[],f=d.parents,g=f.length;g--;)if(1==f[g].nodeType&&!a(f[g])){var h=c.fire("ResolveName",{name:f[g].nodeName.toLowerCase(),target:f[g]});if(h.isDefaultPrevented()||e.push({name:h.name,element:f[g]}),h.isPropagationStopped())break}b.row(e)})),b._super()}})}),g("35",["2j"],function(a){"use strict";return a.extend({Defaults:{layout:"flex",align:"center",defaults:{flex:1}},renderHtml:function(){var a=this,b=a._layout,c=a.classPrefix;return a.classes.add("formitem"),b.preRender(a),'
      '+(a.settings.title?'
      '+a.settings.title+"
      ":"")+'
      '+(a.settings.html||"")+b.renderHtml(a)+"
      "}})}),g("36",["2j","35","9"],function(a,b,c){"use strict";return a.extend({Defaults:{containerCls:"form",layout:"flex",direction:"column",align:"stretch",flex:1,padding:20,labelGap:30,spacing:10,callbacks:{submit:function(){this.submit()}}},preRender:function(){var a=this,d=a.items();a.settings.formItemDefaults||(a.settings.formItemDefaults={layout:"flex",autoResize:"overflow",defaults:{flex:1}}),d.each(function(d){var e,f=d.settings.label;f&&(e=new b(c.extend({items:{type:"label",id:d._id+"-l",text:f,flex:0,forId:d._id,disabled:d.disabled()}},a.settings.formItemDefaults)),e.type="formitem",d.aria("labelledby",d._id+"-l"),"undefined"==typeof d.settings.flex&&(d.settings.flex=1),a.replace(d,e),e.add(d))})},submit:function(){return this.fire("submit",{data:this.toJSON()})},postRender:function(){var a=this;a._super(),a.fromJSON(a.settings.data)},bindStates:function(){function a(){var a,c,d,e=0,f=[];if(b.settings.labelGapCalc!==!1)for(d="children"==b.settings.labelGapCalc?b.find("formitem"):b.items(),d.filter("formitem").each(function(a){var b=a.items()[0],c=b.getEl().clientWidth;e=c>e?c:e,f.push(b)}),c=b.settings.labelGap||0,a=f.length;a--;)f[a].settings.minWidth=e+c}var b=this;b._super(),b.on("show",a),a()}})}),g("37",["36"],function(a){"use strict";return a.extend({Defaults:{containerCls:"fieldset",layout:"flex",direction:"column",align:"stretch",flex:1,padding:"25 15 5 15",labelGap:30,spacing:10,border:1},renderHtml:function(){var a=this,b=a._layout,c=a.classPrefix;return a.preRender(),b.preRender(a),'
      '+(a.settings.title?''+a.settings.title+"":"")+'
      '+(a.settings.html||"")+b.renderHtml(a)+"
      "}})}),g("4x",["e","1j","1g","1w","9","2a"],function(a,b,c,d,e,f){var g=e.trim,h=function(a,b,c,d,e){return{type:a,title:b,url:c,level:d,attach:e}},i=function(a){for(;a=a.parentNode;){var c=a.contentEditable;if(c&&"inherit"!==c)return b.isContentEditableTrue(a)}return!1},j=function(b,c){return a.DOM.select(b,c)},k=function(a){return a.innerText||a.textContent},l=function(a){return a.id?a.id:f.uuid("h")},m=function(a){return a&&"A"===a.nodeName&&(a.id||a.name)},n=function(a){return m(a)&&p(a)},o=function(a){return a&&/^(H[1-6])$/.test(a.nodeName)},p=function(a){return i(a)&&!b.isContentEditableFalse(a)},q=function(a){return o(a)&&p(a)},r=function(a){return o(a)?parseInt(a.nodeName.substr(1),10):0},s=function(a){var b=l(a),c=function(){a.id=b};return h("header",k(a),"#"+b,r(a),c)},t=function(a){var b=a.id||a.name,c=k(a);return h("anchor",c?c:"#"+b,"#"+b,0,d.noop)},u=function(a){return c.map(c.filter(a,q),s)},v=function(a){return c.map(c.filter(a,n),t)},w=function(a){var b=j("h1,h2,h3,h4,h5,h6,a:not([href])",a);return b},x=function(a){return g(a.title).length>0},y=function(a){var b=w(a);return c.filter(u(b).concat(v(b)),x)};return{find:y}}),g("38",["4t","4x","17","2y","1g","1w","9"],function(a,b,c,d,e,f,g){"use strict";var h=function(){return a.tinymce?a.tinymce.activeEditor:c.activeEditor},i={},j=5,k=function(a){return{title:a.title,value:{title:{raw:a.title},url:a.url,attach:a.attach}}},l=function(a){return g.map(a,k)},m=function(a,b){return{title:a,value:{title:a,url:b,attach:f.noop}}},n=function(a,b){var c=e.find(b,function(b){return b.url===a});return!c},o=function(a,b,c){var d=b in a?a[b]:c;return d===!1?null:d},p=function(a,b,c,d){var h={title:"-"},j=function(a){var d=e.filter(a[c],function(a){return n(a,b)});return g.map(d,function(a){return{title:a,value:{title:a,url:a,attach:f.noop}}})},k=function(a){var c=e.filter(b,function(b){return b.type==a});return l(c)},p=function(){var a=k("anchor"),b=o(d,"anchor_top","#top"),c=o(d,"anchor_bottom","#bottom");return null!==b&&a.unshift(m("",b)),null!==c&&a.push(m("",c)),a},q=function(a){return e.reduce(a,function(a,b){var c=0===a.length||0===b.length;return c?a.concat(b):a.concat(h,b)},[])};return d.typeahead_urls===!1?[]:"file"===c?q([r(a,j(i)),r(a,k("header")),r(a,p())]):r(a,j(i))},q=function(a,b){var c=i[b];/^https?/.test(a)&&(c?e.indexOf(c,a)===-1&&(i[b]=c.slice(0,j).concat(a)):i[b]=[a])},r=function(a,b){var c=a.toLowerCase(),d=g.grep(b,function(a){return a.title.toLowerCase().indexOf(c)!==-1});return 1===d.length&&d[0].title===a?[]:d},s=function(a){var b=a.title;return b.raw?b.raw:b},t=function(a,c,d,e){var f=function(f){var g=b.find(d),h=p(f,g,e,c);a.showAutoComplete(h,f)};a.on("autocomplete",function(){f(a.value())}),a.on("selectitem",function(b){var c=b.value;a.value(c.url);var d=s(c);"image"===e?a.fire("change",{meta:{alt:d,attach:c.attach}}):a.fire("change",{meta:{text:d,attach:c.attach}}),a.focus()}),a.on("click",function(b){0===a.value().length&&"INPUT"===b.target.nodeName&&f("")}),a.on("PostRender",function(){a.getRoot().on("submit",function(b){b.isDefaultPrevented()||q(a.value(),e)})})},u=function(a){var b=a.status,c=a.message;return"valid"===b?{status:"ok",message:c}:"unknown"===b?{status:"warn",message:c}:"invalid"===b?{status:"warn",message:c}:{status:"none",message:""}},v=function(a,b,c){var d=b.filepicker_validator_handler;if(d){var e=function(b){return 0===b.length?void a.statusLevel("none"):void d({url:b,type:c},function(b){var c=u(b);a.statusMessage(c.message),a.statusLevel(c.status)})};a.state.on("change:value",function(a){e(a.value)})}};return d.extend({init:function(b){var c,d,e,f=this,i=h(),j=i.settings,k=b.filetype;b.spellcheck=!1,e=j.file_picker_types||j.file_browser_callback_types,e&&(e=g.makeMap(e,/[, ]/)),e&&!e[k]||(d=j.file_picker_callback,!d||e&&!e[k]?(d=j.file_browser_callback,!d||e&&!e[k]||(c=function(){d(f.getEl("inp").id,f.value(),k,a)})):c=function(){var a=f.fire("beforecall").meta;a=g.extend({filetype:k},a),d.call(i,function(a,b){f.value(a).fire("change",{meta:b})},f.value(),a)}),c&&(b.icon="browse",b.onaction=c),f._super(b),t(f,j,i.getBody(),k),v(f,j,k)}})}),g("39",["2u"],function(a){"use strict";return a.extend({recalc:function(a){var b=a.layoutRect(),c=a.paddingBox;a.items().filter(":visible").each(function(a){a.layoutRect({x:c.left,y:c.top,w:b.innerW-c.right-c.left,h:b.innerH-c.top-c.bottom}),a.recalc&&a.recalc()})}})}),g("3a",["2u"],function(a){"use strict";return a.extend({recalc:function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N=[],O=Math.max,P=Math.min;for(d=a.items().filter(":visible"),e=a.layoutRect(),f=a.paddingBox,g=a.settings,m=a.isRtl()?g.direction||"row-reversed":g.direction,h=g.align,i=a.isRtl()?g.pack||"end":g.pack,j=g.spacing||0,"row-reversed"!=m&&"column-reverse"!=m||(d=d.set(d.toArray().reverse()),m=m.split("-")[0]),"column"==m?(z="y",x="h",y="minH",A="maxH",C="innerH",B="top",D="deltaH",E="contentH",J="left",H="w",F="x",G="innerW",I="minW",K="right",L="deltaW",M="contentW"):(z="x",x="w",y="minW",A="maxW",C="innerW",B="left",D="deltaW",E="contentW",J="top",H="h",F="y",G="innerH",I="minH",K="bottom",L="deltaH",M="contentH"),l=e[C]-f[B]-f[B],w=k=0,b=0,c=d.length;b0&&(k+=q,o[A]&&N.push(n),o.flex=q),l-=o[y],r=f[J]+o[I]+f[K],r>w&&(w=r);if(u={},l<0?u[y]=e[y]-l+e[D]:u[y]=e[C]-l+e[D],u[I]=w+e[L],u[E]=e[C]-l,u[M]=w,u.minW=P(u.minW,e.maxW),u.minH=P(u.minH,e.maxH),u.minW=O(u.minW,e.startMinWidth),u.minH=O(u.minH,e.startMinHeight),!e.autoResize||u.minW==e.minW&&u.minH==e.minH){for(t=l/k,b=0,c=N.length;bs?(l-=o[A]-o[y],k-=o.flex,o.flex=0,o.maxFlexSize=s):o.maxFlexSize=0;for(t=l/k,v=f[B],u={},0===k&&("end"==i?v=l+f[B]:"center"==i?(v=Math.round(e[C]/2-(e[C]-l)/2)+f[B],v<0&&(v=f[B])):"justify"==i&&(v=f[B],j=Math.floor(l/(d.length-1)))),u[F]=f[J],b=0,c=d.length;b0&&(r+=o.flex*t),u[x]=r,u[z]=v,n.layoutRect(u),n.recalc&&n.recalc(),v+=r+j}else if(u.w=u.minW,u.h=u.minH,a.layoutRect(u),this.recalc(a),null===a._lastRect){var Q=a.parent();Q&&(Q._lastRect=null,Q.recalc())}}})}),g("3b",["2t"],function(a){return a.extend({Defaults:{containerClass:"flow-layout",controlClass:"flow-layout-item",endClass:"break"},recalc:function(a){a.items().filter(":visible").each(function(a){a.recalc&&a.recalc()})},isNative:function(){return!0}})}),g("4y",["1m","4z","1r","4d","e"],function(a,b,c,d,e){var f=function(a,c,d){for(;d!==c;){if(d.style[a]){var e=d.style[a];return""!==e?b.some(e):b.none()}d=d.parentNode}return b.none()},g=function(a){return/[0-9.]+px$/.test(a)?Math.round(72*parseInt(a,10)/96)+"pt":a},h=function(a){return a.replace(/[\'\"]/g,"").replace(/,\s+/g,",")},i=function(a,c){return b.from(e.DOM.getStyle(c,a,!0))},j=function(a){return function(e,g){return b.from(g).map(c.fromDom).filter(d.isElement).bind(function(b){return f(a,e,b.dom()).or(i(a,b.dom()))}).getOr("")}};return{getFontSize:j("fontSize"),getFontFamily:a.compose(h,j("fontFamily")),toPt:g}}),g("3c",["2g","2r","2p","9","1g","e","17","6","4y"],function(a,b,c,d,e,f,g,h,i){function j(a){a.settings.ui_container&&(h.container=f.DOM.select(a.settings.ui_container)[0])}function k(b){b.on("ScriptsLoaded",function(){b.rtl&&(a.rtl=!0)})}function l(a){function b(b,c){return function(){var d=this;a.on("nodeChange",function(e){var f=a.formatter,g=null;m(e.parents,function(a){if(m(b,function(b){if(c?f.matchNode(a,c,{value:b.value})&&(g=b.value):f.matchNode(a,b.value)&&(g=b.value),g)return!1}),g)return!1}),d.value(g)})}}function e(b){return function(){var c=this,d=function(a){return a?a.split(",")[0]:""};a.on("init nodeChange",function(e){var f,g=null;f=i.getFontFamily(a.getBody(),e.element),m(b,function(a){a.value.toLowerCase()===f.toLowerCase()&&(g=a.value)}),m(b,function(a){g||d(a.value).toLowerCase()!==d(f).toLowerCase()||(g=a.value)}),c.value(g),!g&&f&&c.text(d(f))})}}function f(b){return function(){var c=this;a.on("init nodeChange",function(d){var e,f,g=null;e=i.getFontSize(a.getBody(),d.element),f=i.toPt(e),m(b,function(a){a.value===e?g=e:a.value===f&&(g=f)}),c.value(g),g||c.text(f)})}}function g(a){a=a.replace(/;$/,"").split(";");for(var b=a.length;b--;)a[b]=a[b].split("=");return a}function h(){function b(a){var c=[];if(a)return m(a,function(a){var f={text:a.title,icon:a.icon};if(a.items)f.menu=b(a.items);else{var g=a.format||"custom"+d++;a.format||(a.name=g,e.push(a)),f.format=g,f.cmd=a.cmd}c.push(f)}),c}function c(){var c;return c=b(a.settings.style_formats_merge?a.settings.style_formats?f.concat(a.settings.style_formats):f:a.settings.style_formats||f)}var d=0,e=[],f=[{title:"Headings",items:[{title:"Heading 1",format:"h1"},{title:"Heading 2",format:"h2"},{title:"Heading 3",format:"h3"},{title:"Heading 4",format:"h4"},{title:"Heading 5",format:"h5"},{title:"Heading 6",format:"h6"}]},{title:"Inline",items:[{title:"Bold",icon:"bold",format:"bold"},{title:"Italic",icon:"italic",format:"italic"},{title:"Underline",icon:"underline",format:"underline"},{title:"Strikethrough",icon:"strikethrough",format:"strikethrough"},{title:"Superscript",icon:"superscript",format:"superscript"},{title:"Subscript",icon:"subscript",format:"subscript"},{title:"Code",icon:"code",format:"code"}]},{title:"Blocks",items:[{title:"Paragraph",format:"p"},{title:"Blockquote",format:"blockquote"},{title:"Div",format:"div"},{title:"Pre",format:"pre"}]},{title:"Alignment",items:[{title:"Left",icon:"alignleft",format:"alignleft"},{title:"Center",icon:"aligncenter",format:"aligncenter"},{title:"Right",icon:"alignright",format:"alignright"},{title:"Justify",icon:"alignjustify",format:"alignjustify"}]}];return a.on("init",function(){m(e,function(b){a.formatter.register(b.name,b)})}),{type:"menu",items:c(),onPostRender:function(b){a.fire("renderFormatsMenu",{control:b.control})},itemDefaults:{preview:!0,textStyle:function(){if(this.settings.format)return a.formatter.getCssText(this.settings.format)},onPostRender:function(){var b=this;b.parent().on("show",function(){var c,d;c=b.settings.format,c&&(b.disabled(!a.formatter.canApply(c)),b.active(a.formatter.match(c))),d=b.settings.cmd,d&&b.active(a.queryCommandState(d))})},onclick:function(){this.settings.format&&o(this.settings.format),this.settings.cmd&&a.execCommand(this.settings.cmd)}}}}function j(b){return function(){var c=this;a.formatter?a.formatter.formatChanged(b,function(a){c.active(a)}):a.on("init",function(){a.formatter.formatChanged(b,function(a){c.active(a)})})}}function k(b){return function(){function c(){var c="redo"==b?"hasRedo":"hasUndo";return!!a.undoManager&&a.undoManager[c]()}var d=this;d.disabled(!c()),a.on("Undo Redo AddUndo TypingUndo ClearUndos SwitchMode",function(){d.disabled(a.readonly||!c())})}}function l(){var b=this;a.on("VisualAid",function(a){b.active(a.hasVisual)}),b.active(a.hasVisual)}function o(b){b.control&&(b=b.control.value()),b&&a.execCommand("mceToggleFormat",!1,b)}function p(b){var c=b.length;return d.each(b,function(b){b.menu&&(b.hidden=0===p(b.menu));var d=b.format;d&&(b.hidden=!a.formatter.canApply(d)),b.hidden&&c--}),c}function q(b){var c=b.items().length;return b.items().each(function(b){b.menu&&b.visible(q(b.menu)>0),!b.menu&&b.settings.menu&&b.visible(p(b.settings.menu)>0);var d=b.settings.format;d&&b.visible(a.formatter.canApply(d)),b.visible()||c--}),c}var r;r=h(),m({bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript"},function(b,c){a.addButton(c,{tooltip:b,onPostRender:j(c),onclick:function(){o(c)}})}),m({outdent:["Decrease indent","Outdent"],indent:["Increase indent","Indent"],cut:["Cut","Cut"],copy:["Copy","Copy"],paste:["Paste","Paste"],help:["Help","mceHelp"],selectall:["Select all","SelectAll"],removeformat:["Clear formatting","RemoveFormat"],visualaid:["Visual aids","mceToggleVisualAid"],newdocument:["New document","mceNewDocument"]},function(b,c){a.addButton(c,{tooltip:b[0],cmd:b[1]})}),m({blockquote:["Blockquote","mceBlockQuote"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],alignleft:["Align left","JustifyLeft"],aligncenter:["Align center","JustifyCenter"],alignright:["Align right","JustifyRight"],alignjustify:["Justify","JustifyFull"],alignnone:["No alignment","JustifyNone"]},function(b,c){a.addButton(c,{tooltip:b[0],cmd:b[1],onPostRender:j(c)})});var s=function(a){var b=a;return b.length>0&&"-"===b[0].text&&(b=b.slice(1)),b.length>0&&"-"===b[b.length-1].text&&(b=b.slice(0,b.length-1)),b},t=function(b){var c,e;if("string"==typeof b)e=b.split(" ");else if(d.isArray(b))return n(d.map(b,t));return c=d.grep(e,function(b){return"|"===b||b in a.menuItems}),d.map(c,function(b){return"|"===b?{text:"-"}:a.menuItems[b]})},u=function(b){var c=[{text:"-"}],e=d.grep(a.menuItems,function(a){return a.context===b});return d.each(e,function(a){"before"==a.separator&&c.push({text:"|"}),a.prependToContext?c.unshift(a):c.push(a),"after"==a.separator&&c.push({text:"|"})}),c},v=function(a){return s(a.insert_button_items?t(a.insert_button_items):u("insert"))};a.addButton("undo",{tooltip:"Undo",onPostRender:k("undo"),cmd:"undo"}),a.addButton("redo",{tooltip:"Redo",onPostRender:k("redo"),cmd:"redo"}),a.addMenuItem("newdocument",{text:"New document",icon:"newdocument",cmd:"mceNewDocument"}),a.addMenuItem("undo",{text:"Undo",icon:"undo",shortcut:"Meta+Z",onPostRender:k("undo"),cmd:"undo"}),a.addMenuItem("redo",{text:"Redo",icon:"redo",shortcut:"Meta+Y",onPostRender:k("redo"),cmd:"redo"}),a.addMenuItem("visualaid",{text:"Visual aids",selectable:!0,onPostRender:l,cmd:"mceToggleVisualAid"}),a.addButton("remove",{tooltip:"Remove",icon:"remove",cmd:"Delete"}),a.addButton("insert",{type:"menubutton",icon:"insert",menu:[],oncreatemenu:function(){this.menu.add(v(a.settings)),this.menu.renderNew()}}),m({cut:["Cut","Cut","Meta+X"],copy:["Copy","Copy","Meta+C"],paste:["Paste","Paste","Meta+V"],selectall:["Select all","SelectAll","Meta+A"],bold:["Bold","Bold","Meta+B"],italic:["Italic","Italic","Meta+I"],underline:["Underline","Underline","Meta+U"],strikethrough:["Strikethrough","Strikethrough"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],removeformat:["Clear formatting","RemoveFormat"]},function(b,c){a.addMenuItem(c,{text:b[0],icon:c,shortcut:b[2],cmd:b[1]})}),a.on("mousedown",function(){c.hideAll()}),a.addButton("styleselect",{type:"menubutton",text:"Formats",menu:r,onShowMenu:function(){a.settings.style_formats_autohide&&q(this.menu)}}),a.addButton("formatselect",function(){var c=[],d=g(a.settings.block_formats||"Paragraph=p;Heading 1=h1;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Preformatted=pre");return m(d,function(b){c.push({text:b[0],value:b[1],textStyle:function(){return a.formatter.getCssText(b[1])}})}),{type:"listbox",text:d[0][0],values:c,fixedWidth:!0,onselect:o,onPostRender:b(c)}}),a.addButton("fontselect",function(){var b="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats",c=[],d=g(a.settings.font_formats||b);return m(d,function(a){c.push({text:{raw:a[0]},value:a[1],textStyle:a[1].indexOf("dings")==-1?"font-family:"+a[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:c,fixedWidth:!0,onPostRender:e(c),onselect:function(b){b.control.settings.value&&a.execCommand("FontName",!1,b.control.settings.value)}}}),a.addButton("fontsizeselect",function(){var b=[],c="8pt 10pt 12pt 14pt 18pt 24pt 36pt",d=a.settings.fontsize_formats||c;return m(d.split(" "),function(a){var c=a,d=a,e=a.split("=");e.length>1&&(c=e[0],d=e[1]),b.push({text:c,value:d})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:b,fixedWidth:!0,onPostRender:f(b),onclick:function(b){b.control.settings.value&&a.execCommand("FontSize",!1,b.control.settings.value)}}}),a.addMenuItem("formats",{text:"Formats",menu:r})}var m=d.each,n=function(a){return e.reduce(a,function(a,b){return a.concat(b)},[])};return g.on("AddEditor",function(a){var b=a.editor;k(b),l(b),j(b)}),a.translate=function(a){return g.translate(a)},b.tooltips=!h.iOS,{}}),g("3d",["2u"],function(a){"use strict";return a.extend({recalc:function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E=[],F=[];b=a.settings,e=a.items().filter(":visible"),f=a.layoutRect(),d=b.columns||Math.ceil(Math.sqrt(e.length)),c=Math.ceil(e.length/d),s=b.spacingH||b.spacing||0,t=b.spacingV||b.spacing||0,u=b.alignH||b.align,v=b.alignV||b.align,q=a.paddingBox,C="reverseRows"in b?b.reverseRows:a.isRtl(),u&&"string"==typeof u&&(u=[u]),v&&"string"==typeof v&&(v=[v]);for(l=0;lE[l]?y:E[l],F[m]=z>F[m]?z:F[m];for(A=f.innerW-q.left-q.right,w=0,l=0;l0?s:0),A-=(l>0?s:0)+E[l];for(B=f.innerH-q.top-q.bottom,x=0,m=0;m0?t:0),B-=(m>0?t:0)+F[m];if(w+=q.left+q.right,x+=q.top+q.bottom,i={},i.minW=w+(f.w-f.innerW),i.minH=x+(f.h-f.innerH),i.contentW=i.minW-f.deltaW,i.contentH=i.minH-f.deltaH,i.minW=Math.min(i.minW,f.maxW),i.minH=Math.min(i.minH,f.maxH),i.minW=Math.max(i.minW,f.startMinWidth),i.minH=Math.max(i.minH,f.startMinHeight),!f.autoResize||i.minW==f.minW&&i.minH==f.minH){f.autoResize&&(i=a.layoutRect(i),i.contentW=i.minW-f.deltaW,i.contentH=i.minH-f.deltaH);var G;G="start"==b.packV?0:B>0?Math.floor(B/c):0;var H=0,I=b.flexWidths;if(I)for(l=0;l'},src:function(a){this.getEl().src=a},html:function(a,c){var d=this,e=this.getEl().contentWindow.document.body;return e?(e.innerHTML=a,c&&c()):b.setTimeout(function(){d.html(a)}),this}})}),g("3f",["2r"],function(a){"use strict";return a.extend({init:function(a){var b=this;b._super(a),b.classes.add("widget").add("infobox"),b.canFocus=!1},severity:function(a){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(a)},help:function(a){this.state.set("help",a)},renderHtml:function(){var a=this,b=a.classPrefix;return'
      '+a.encode(a.state.get("text"))+'
      '},bindStates:function(){var a=this;return a.state.on("change:text",function(b){a.getEl("body").firstChild.data=a.encode(b.value),a.state.get("rendered")&&a.updateLayoutRect()}),a.state.on("change:help",function(b){a.classes.toggle("has-help",b.value),a.state.get("rendered")&&a.updateLayoutRect()}),a._super()}})}),g("3g",["2r","4q"],function(a,b){"use strict";return a.extend({init:function(a){var b=this;b._super(a),b.classes.add("widget").add("label"),b.canFocus=!1,a.multiline&&b.classes.add("autoscroll"),a.strong&&b.classes.add("strong")},initLayoutRect:function(){var a=this,c=a._super();if(a.settings.multiline){var d=b.getSize(a.getEl());d.width>c.maxW&&(c.minW=c.maxW,a.classes.add("multiline")),a.getEl().style.width=c.minW+"px",c.startMinH=c.h=c.minH=Math.min(c.maxH,b.getSize(a.getEl()).height)}return c},repaint:function(){var a=this;return a.settings.multiline||(a.getEl().style.lineHeight=a.layoutRect().h+"px"),a._super()},severity:function(a){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(a)},renderHtml:function(){var a,b,c=this,d=c.settings.forId,e=c.settings.html?c.settings.html:c.encode(c.state.get("text"));return!d&&(b=c.settings.forName)&&(a=c.getRoot().find("#"+b)[0],a&&(d=a._id)),d?'":''+e+""},bindStates:function(){var a=this;return a.state.on("change:text",function(b){a.innerHtml(a.encode(b.value)),a.state.get("rendered")&&a.updateLayoutRect()}),a._super()}})}),g("3h",["2j"],function(a){"use strict";return a.extend({Defaults:{role:"toolbar",layout:"flow"},init:function(a){var b=this;b._super(a),b.classes.add("toolbar")},postRender:function(){var a=this;return a.items().each(function(a){a.classes.add("toolbar-item")}),a._super()}})}),g("3i",["3h"],function(a){"use strict";return a.extend({Defaults:{role:"menubar",containerCls:"menubar",ariaRoot:!0,defaults:{type:"menubutton"}}})}),g("3j",["2v","2h","3i"],function(a,b,c){"use strict";function d(a,b){for(;a;){if(b===a)return!0;a=a.parentNode}return!1}var e=a.extend({init:function(a){var b=this;b._renderOpen=!0,b._super(a),a=b.settings,b.classes.add("menubtn"),a.fixedWidth&&b.classes.add("fixed-width"),b.aria("haspopup",!0),b.state.set("menu",a.menu||b.render())},showMenu:function(a){var c,d=this;return d.menu&&d.menu.visible()&&a!==!1?d.hideMenu():(d.menu||(c=d.state.get("menu")||[],c.length?c={type:"menu",items:c}:c.type=c.type||"menu",c.renderTo?d.menu=c.parent(d).show().renderTo():d.menu=b.create(c).parent(d).renderTo(),d.fire("createmenu"),d.menu.reflow(),d.menu.on("cancel",function(a){a.control.parent()===d.menu&&(a.stopPropagation(),d.focus(),d.hideMenu())}),d.menu.on("select",function(){d.focus()}),d.menu.on("show hide",function(a){a.control==d.menu&&d.activeMenu("show"==a.type),d.aria("expanded","show"==a.type)}).fire("show")),d.menu.show(),d.menu.layoutRect({w:d.layoutRect().w}),d.menu.moveRel(d.getEl(),d.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"]),void d.fire("showmenu"))},hideMenu:function(){var a=this;a.menu&&(a.menu.items().each(function(a){a.hideMenu&&a.hideMenu()}),a.menu.hide())},activeMenu:function(a){this.classes.toggle("active",a)},renderHtml:function(){var a,b=this,d=b._id,e=b.classPrefix,f=b.settings.icon,g=b.state.get("text"),h="";return a=b.settings.image,a?(f="none","string"!=typeof a&&(a=window.getSelection?a[0]:a[1]),a=" style=\"background-image: url('"+a+"')\""):a="",g&&(b.classes.add("btn-has-text"),h=''+b.encode(g)+""),f=b.settings.icon?e+"ico "+e+"i-"+f:"",b.aria("role",b.parent()instanceof c?"menuitem":"button"),'
      '},postRender:function(){var a=this;return a.on("click",function(b){b.control===a&&d(b.target,a.getEl())&&(a.focus(),a.showMenu(!b.aria),b.aria&&a.menu.items().filter(":visible")[0].focus())}),a.on("mouseenter",function(b){var c,d=b.control,f=a.parent();d&&f&&d instanceof e&&d.parent()==f&&(f.items().filter("MenuButton").each(function(a){a.hideMenu&&a!=d&&(a.menu&&a.menu.visible()&&(c=!0),a.hideMenu())}),c&&(d.focus(),d.showMenu()))}),a._super()},bindStates:function(){var a=this;return a.state.on("change:menu",function(){a.menu&&a.menu.remove(),a.menu=null}),a._super()},remove:function(){this._super(),this.menu&&this.menu.remove()}});return e}),g("3k",["2r","2h","6","5"],function(a,b,c,d){"use strict";return a.extend({Defaults:{border:0,role:"menuitem"},init:function(a){var b,c=this;c._super(a),a=c.settings,c.classes.add("menu-item"),a.menu&&c.classes.add("menu-item-expand"),a.preview&&c.classes.add("menu-item-preview"),b=c.state.get("text"),"-"!==b&&"|"!==b||(c.classes.add("menu-item-sep"),c.aria("role","separator"),c.state.set("text","-")),a.selectable&&(c.aria("role","menuitemcheckbox"),c.classes.add("menu-item-checkbox"),a.icon="selected"),a.preview||a.selectable||c.classes.add("menu-item-normal"),c.on("mousedown",function(a){a.preventDefault()}),a.menu&&!a.ariaHideMenu&&c.aria("haspopup",!0)},hasMenus:function(){return!!this.settings.menu},showMenu:function(){var a,c=this,d=c.settings,e=c.parent();if(e.items().each(function(a){a!==c&&a.hideMenu()}),d.menu){a=c.menu,a?a.show():(a=d.menu,a.length?a={type:"menu",items:a}:a.type=a.type||"menu",e.settings.itemDefaults&&(a.itemDefaults=e.settings.itemDefaults),a=c.menu=b.create(a).parent(c).renderTo(),a.reflow(),a.on("cancel",function(b){b.stopPropagation(),c.focus(),a.hide()}),a.on("show hide",function(a){a.control.items&&a.control.items().each(function(a){a.active(a.settings.selected)})}).fire("show"),a.on("hide",function(b){b.control===a&&c.classes.remove("selected")}),a.submenu=!0),a._parentMenu=e,a.classes.add("menu-sub");var f=a.testMoveRel(c.getEl(),c.isRtl()?["tl-tr","bl-br","tr-tl","br-bl"]:["tr-tl","br-bl","tl-tr","bl-br"]);a.moveRel(c.getEl(),f),a.rel=f,f="menu-sub-"+f,a.classes.remove(a._lastRel).add(f),a._lastRel=f,c.classes.add("selected"),c.aria("expanded",!0)}},hideMenu:function(){var a=this;return a.menu&&(a.menu.items().each(function(a){a.hideMenu&&a.hideMenu()}),a.menu.hide(),a.aria("expanded",!1)),a},renderHtml:function(){function a(a){var b,d,e={};for(e=c.mac?{alt:"⌥",ctrl:"⌘",shift:"⇧",meta:"⌘"}:{meta:"Ctrl"},a=a.split("+"),b=0;b").replace(new RegExp(b("]mce~match!"),"g"),"")}var f=this,g=f._id,h=f.settings,i=f.classPrefix,j=f.state.get("text"),k=f.settings.icon,l="",m=h.shortcut,n=f.encode(h.url),o="";return k&&f.parent().classes.add("menu-has-icons"),h.image&&(l=" style=\"background-image: url('"+h.image+"')\""),m&&(m=a(m)),k=i+"ico "+i+"i-"+(f.settings.icon||"none"),o="-"!==j?'\xa0":"",j=e(f.encode(d(j))),n=e(f.encode(d(n))),'
      '+o+("-"!==j?''+j+"":"")+(m?'
      '+m+"
      ":"")+(h.menu?'
      ':"")+(n?'":"")+"
      "},postRender:function(){var a=this,b=a.settings,c=b.textStyle;if("function"==typeof c&&(c=c.call(this)),c){var e=a.getEl("text");e&&e.setAttribute("style",c)}return a.on("mouseenter click",function(c){c.control===a&&(b.menu||"click"!==c.type?(a.showMenu(),c.aria&&a.menu.focus(!0)):(a.fire("select"),d.requestAnimationFrame(function(){a.parent().hideAll()})))}),a._super(),a},hover:function(){var a=this;return a.parent().items().each(function(a){a.classes.remove("selected")}),a.classes.toggle("selected",!0),a},active:function(a){return"undefined"!=typeof a&&this.aria("checked",a),this._super(a)},remove:function(){this._super(),this.menu&&this.menu.remove()}})}),g("3l",["a","2g","5"],function(a,b,c){"use strict";return function(d,e){var f,g,h=this,i=b.classPrefix;h.show=function(b,j){function k(){f&&(a(d).append('
      '),j&&j())}return h.hide(),f=!0,b?g=c.setTimeout(k,b):k(),h},h.hide=function(){var a=d.lastChild;return c.clearTimeout(g),a&&a.className.indexOf("throbber")!=-1&&a.parentNode.removeChild(a),f=!1,h}}}),g("3m",["2p","3k","3l","9"],function(a,b,c,d){"use strict";return a.extend({Defaults:{defaultType:"menuitem",border:1,layout:"stack",role:"application",bodyRole:"menu",ariaRoot:!0},init:function(a){var b=this;if(a.autohide=!0,a.constrainToViewport=!0,"function"==typeof a.items&&(a.itemsFactory=a.items,a.items=[]),a.itemDefaults)for(var c=a.items,e=c.length;e--;)c[e]=d.extend({},a.itemDefaults,c[e]);b._super(a),b.classes.add("menu")},repaint:function(){return this.classes.toggle("menu-align",!0), +this._super(),this.getEl().style.height="",this.getEl("body").style.height="",this},cancel:function(){var a=this;a.hideAll(),a.fire("select")},load:function(){function a(){e.throbber&&(e.throbber.hide(),e.throbber=null)}var b,d,e=this;d=e.settings.itemsFactory,d&&(e.throbber||(e.throbber=new c(e.getEl("body"),!0),0===e.items().length?(e.throbber.show(),e.fire("loading")):e.throbber.show(100,function(){e.items().remove(),e.fire("loading")}),e.on("hide close",a)),e.requestTime=b=(new Date).getTime(),e.settings.itemsFactory(function(c){return 0===c.length?void e.hide():void(e.requestTime===b&&(e.getEl().style.width="",e.getEl("body").style.width="",a(),e.items().remove(),e.getEl("body").innerHTML="",e.add(c),e.renderNew(),e.fire("loaded")))}))},hideAll:function(){var a=this;return this.find("menuitem").exec("hideMenu"),a._super()},preRender:function(){var a=this;return a.items().each(function(b){var c=b.settings;if(c.icon||c.image||c.selectable)return a._hasIcons=!0,!1}),a.settings.itemsFactory&&a.on("postrender",function(){a.settings.itemsFactory&&a.load()}),a._super()}})}),g("3n",["3j","3m"],function(a,b){"use strict";return a.extend({init:function(a){function b(c){for(var f=0;f0&&(e=c[0].text,g.state.set("value",c[0].value)),g.state.set("menu",c)),g.state.set("text",a.text||e),g.classes.add("listbox"),g.on("select",function(b){var c=b.control;f&&(b.lastControl=f),a.multiple?c.active(!c.active()):g.value(b.control.value()),f=c})},bindStates:function(){function a(a,c){a instanceof b&&a.items().each(function(a){a.hasMenus()||a.active(a.value()===c)})}function c(a,b){var d;if(a)for(var e=0;e'},postRender:function(){var a=this;a._super(),a.resizeDragHelper=new b(this._id,{start:function(){a.fire("ResizeStart")},drag:function(b){"both"!=a.settings.direction&&(b.deltaX=0),a.fire("Resize",b)},stop:function(){a.fire("ResizeEnd")}})},remove:function(){return this.resizeDragHelper&&this.resizeDragHelper.destroy(),this._super()}})}),g("3q",["2r"],function(a){"use strict";function b(a){var b="";if(a)for(var c=0;c'+a[c]+"";return b}return a.extend({Defaults:{classes:"selectbox",role:"selectbox",options:[]},init:function(a){var b=this;b._super(a),b.settings.size&&(b.size=b.settings.size),b.settings.options&&(b._options=b.settings.options),b.on("keydown",function(a){var c;13==a.keyCode&&(a.preventDefault(),b.parents().reverse().each(function(a){if(a.toJSON)return c=a,!1}),b.fire("submit",{data:c.toJSON()}))})},options:function(a){return arguments.length?(this.state.set("options",a),this):this.state.get("options")},renderHtml:function(){var a,c=this,d="";return a=b(c._options),c.size&&(d=' size = "'+c.size+'"'),'"},bindStates:function(){var a=this;return a.state.on("change:options",function(c){a.getEl().innerHTML=b(c.value)}),a._super()}})}),g("3r",["2r","2k","4q"],function(a,b,c){"use strict";function d(a,b,c){return ac&&(a=c),a}function e(a,b,c){a.setAttribute("aria-"+b,c)}function f(a,b){var d,f,g,h,i,j;"v"==a.settings.orientation?(h="top",g="height",f="h"):(h="left",g="width",f="w"),j=a.getEl("handle"),d=(a.layoutRect()[f]||100)-c.getSize(j)[g],i=d*((b-a._minValue)/(a._maxValue-a._minValue))+"px",j.style[h]=i,j.style.height=a.layoutRect().h+"px",e(j,"valuenow",b),e(j,"valuetext",""+a.settings.previewFilter(b)),e(j,"valuemin",a._minValue),e(j,"valuemax",a._maxValue)}return a.extend({init:function(a){var b=this;a.previewFilter||(a.previewFilter=function(a){return Math.round(100*a)/100}),b._super(a),b.classes.add("slider"),"v"==a.orientation&&b.classes.add("vertical"),b._minValue=a.minValue||0,b._maxValue=a.maxValue||100,b._initValue=b.state.get("value")},renderHtml:function(){var a=this,b=a._id,c=a.classPrefix;return'
      '},reset:function(){this.value(this._initValue).repaint()},postRender:function(){function a(a,b,c){return(c+a)/(b-a)}function e(a,b,c){return c*(b-a)-a}function f(b,c){function f(f){var g;g=n.value(),g=e(b,c,a(b,c,g)+.05*f),g=d(g,b,c),n.value(g),n.fire("dragstart",{value:g}),n.fire("drag",{value:g}),n.fire("dragend",{value:g})}n.on("keydown",function(a){switch(a.keyCode){case 37:case 38:f(-1);break;case 39:case 40:f(1)}})}function g(a,e,f){var g,h,i,o,p;n._dragHelper=new b(n._id,{handle:n._id+"-handle",start:function(a){g=a[j],h=parseInt(n.getEl("handle").style[k],10),i=(n.layoutRect()[m]||100)-c.getSize(f)[l],n.fire("dragstart",{value:p})},drag:function(b){var c=b[j]-g;o=d(h+c,0,i),f.style[k]=o+"px",p=a+o/i*(e-a),n.value(p),n.tooltip().text(""+n.settings.previewFilter(p)).show().moveRel(f,"bc tc"),n.fire("drag",{value:p})},stop:function(){n.tooltip().hide(),n.fire("dragend",{value:p})}})}var h,i,j,k,l,m,n=this;h=n._minValue,i=n._maxValue,"v"==n.settings.orientation?(j="screenY",k="top",l="height",m="h"):(j="screenX",k="left",l="width",m="w"),n._super(),f(h,i,n.getEl("handle")),g(h,i,n.getEl("handle"))},repaint:function(){this._super(),f(this,this.value())},bindStates:function(){var a=this;return a.state.on("change:value",function(b){f(a,b.value)}),a._super()}})}),g("3s",["2r"],function(a){"use strict";return a.extend({renderHtml:function(){var a=this;return a.classes.add("spacer"),a.canFocus=!1,'
      '}})}),g("3t",["3j","4q","a"],function(a,b,c){return a.extend({Defaults:{classes:"widget btn splitbtn",role:"button"},repaint:function(){var a,d,e=this,f=e.getEl(),g=e.layoutRect();return e._super(),a=f.firstChild,d=f.lastChild,c(a).css({width:g.w-b.getSize(d).width,height:g.h-2}),c(d).css({height:g.h-2}),e},activeMenu:function(a){var b=this;c(b.getEl().lastChild).toggleClass(b.classPrefix+"active",a)},renderHtml:function(){var a,b=this,c=b._id,d=b.classPrefix,e=b.state.get("icon"),f=b.state.get("text"),g="";return a=b.settings.image,a?(e="none","string"!=typeof a&&(a=window.getSelection?a[0]:a[1]),a=" style=\"background-image: url('"+a+"')\""):a="",e=b.settings.icon?d+"ico "+d+"i-"+e:"",f&&(b.classes.add("btn-has-text"),g=''+b.encode(f)+""),'
      '},postRender:function(){var a=this,b=a.settings.onclick;return a.on("click",function(a){var c=a.target;if(a.control==this)for(;c;){if(a.aria&&"down"!=a.aria.key||"BUTTON"==c.nodeName&&c.className.indexOf("open")==-1)return a.stopImmediatePropagation(),void(b&&b.call(this,a));c=c.parentNode}}),delete a.settings.onclick,a._super()}})}),g("3u",["3b"],function(a){"use strict";return a.extend({Defaults:{containerClass:"stack-layout",controlClass:"stack-layout-item",endClass:"break"},isNative:function(){return!0}})}),g("3v",["2m","a","4q"],function(a,b,c){"use strict";return a.extend({Defaults:{layout:"absolute",defaults:{type:"panel"}},activateTab:function(a){var c;this.activeTabId&&(c=this.getEl(this.activeTabId),b(c).removeClass(this.classPrefix+"active"),c.setAttribute("aria-selected","false")),this.activeTabId="t"+a,c=this.getEl("t"+a),c.setAttribute("aria-selected","true"),b(c).addClass(this.classPrefix+"active"),this.items()[a].show().fire("showtab"),this.reflow(),this.items().each(function(b,c){a!=c&&b.hide()})},renderHtml:function(){var a=this,b=a._layout,c="",d=a.classPrefix;return a.preRender(),b.preRender(a),a.items().each(function(b,e){var f=a._id+"-t"+e;b.aria("role","tabpanel"),b.aria("labelledby",f),c+='"}),'
      '+c+'
      '+b.renderHtml(a)+"
      "},postRender:function(){var a=this;a._super(),a.settings.activeTab=a.settings.activeTab||0,a.activateTab(a.settings.activeTab),this.on("click",function(b){var c=b.target.parentNode;if(c&&c.id==a._id+"-head")for(var d=c.childNodes.length;d--;)c.childNodes[d]==b.target&&a.activateTab(d)})},initLayoutRect:function(){var a,b,d,e=this;b=c.getSize(e.getEl("head")).width,b=b<0?0:b,d=0,e.items().each(function(a){b=Math.max(b,a.layoutRect().minW),d=Math.max(d,a.layoutRect().minH)}),e.items().each(function(a){a.settings.x=0,a.settings.y=0,a.settings.w=b,a.settings.h=d,a.layoutRect({x:0,y:0,w:b,h:d})});var f=c.getSize(e.getEl("head")).height;return e.settings.minWidth=b,e.settings.minHeight=d+f,a=e._super(),a.deltaH+=f,a.innerH=a.h-a.deltaH,a}})}),g("3w",["2r","9","4q"],function(a,b,c){return a.extend({init:function(a){var b=this;b._super(a),b.classes.add("textbox"),a.multiline?b.classes.add("multiline"):(b.on("keydown",function(a){var c;13==a.keyCode&&(a.preventDefault(),b.parents().reverse().each(function(a){if(a.toJSON)return c=a,!1}),b.fire("submit",{data:c.toJSON()}))}),b.on("keyup",function(a){b.state.set("value",a.target.value)}))},repaint:function(){var a,b,c,d,e,f=this,g=0;a=f.getEl().style,b=f._layoutRect,e=f._lastRepaintRect||{};var h=document;return!f.settings.multiline&&h.all&&(!h.documentMode||h.documentMode<=8)&&(a.lineHeight=b.h-g+"px"),c=f.borderBox,d=c.left+c.right+8,g=c.top+c.bottom+(f.settings.multiline?8:0),b.x!==e.x&&(a.left=b.x+"px",e.x=b.x),b.y!==e.y&&(a.top=b.y+"px",e.y=b.y),b.w!==e.w&&(a.width=b.w-d+"px",e.w=b.w),b.h!==e.h&&(a.height=b.h-g+"px",e.h=b.h),f._lastRepaintRect=e,f.fire("repaint",{},!1),f},renderHtml:function(){var a,d,e=this,f=e.settings;return a={id:e._id,hidefocus:"1"},b.each(["rows","spellcheck","maxLength","size","readonly","min","max","step","list","pattern","placeholder","required","multiple"],function(b){a[b]=f[b]}),e.disabled()&&(a.disabled="disabled"),f.subtype&&(a.type=f.subtype),d=c.create(f.multiline?"textarea":"input",a),d.value=e.state.get("value"),d.className=e.classes,d.outerHTML},value:function(a){return arguments.length?(this.state.set("value",a),this):(this.state.get("rendered")&&this.state.set("value",this.getEl().value),this.state.get("value"))},postRender:function(){var a=this;a.getEl().value=a.state.get("value"),a._super(),a.$el.on("change",function(b){a.state.set("value",b.target.value),a.fire("change",b)})},bindStates:function(){var a=this;return a.state.on("change:value",function(b){a.getEl().value!=b.value&&(a.getEl().value=b.value)}),a.state.on("change:disabled",function(b){a.getEl().disabled=b.value}),a._super()},remove:function(){this.$el.off(),this._super()}})}),g("1f",["2d","2e","2f","2g","2h","2i","2j","2k","2l","2m","2n","2o","2p","23","24","2q","2r","2s","25","2t","2u","2v","2w","2x","2y","2z","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","3g","3h","3i","3j","3k","3l","3m","3n","3o","3p","3q","3r","3s","3t","3u","3v","3w"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,_,aa,ba,ca,da,ea){"use strict";var fa=function(a,b){e.add(a.split(".").pop(),b)},ga=function(a,b,c){var d,e;for(e=b.split(/[.\/]/),d=0;d= this.maxSize) { + this.list.remove(tailItem); + delete this.hash[tailItem.key]; + } + if (node = this.hash[key]) { + node.val = val; + this.list.moveToFront(node); + } else { + node = new Node(key, val); + this.list.add(node); + this.hash[key] = node; + this.size++; + } + }, + get: function get(key) { + var node = this.hash[key]; + if (node) { + this.list.moveToFront(node); + return node.val; + } + }, + reset: function reset() { + this.size = 0; + this.hash = {}; + this.list = new List(); + } + }); + function List() { + this.head = this.tail = null; + } + _.mixin(List.prototype, { + add: function add(node) { + if (this.head) { + node.next = this.head; + this.head.prev = node; + } + this.head = node; + this.tail = this.tail || node; + }, + remove: function remove(node) { + node.prev ? node.prev.next = node.next : this.head = node.next; + node.next ? node.next.prev = node.prev : this.tail = node.prev; + }, + moveToFront: function(node) { + this.remove(node); + this.add(node); + } + }); + function Node(key, val) { + this.key = key; + this.val = val; + this.prev = this.next = null; + } + return LruCache; + }(); + var PersistentStorage = function() { + "use strict"; + var ls, methods; + try { + ls = window.localStorage; + ls.setItem("~~~", "!"); + ls.removeItem("~~~"); + } catch (err) { + ls = null; + } + function PersistentStorage(namespace) { + this.prefix = [ "__", namespace, "__" ].join(""); + this.ttlKey = "__ttl__"; + this.keyMatcher = new RegExp("^" + _.escapeRegExChars(this.prefix)); + } + if (ls && window.JSON) { + methods = { + _prefix: function(key) { + return this.prefix + key; + }, + _ttlKey: function(key) { + return this._prefix(key) + this.ttlKey; + }, + get: function(key) { + if (this.isExpired(key)) { + this.remove(key); + } + return decode(ls.getItem(this._prefix(key))); + }, + set: function(key, val, ttl) { + if (_.isNumber(ttl)) { + ls.setItem(this._ttlKey(key), encode(now() + ttl)); + } else { + ls.removeItem(this._ttlKey(key)); + } + return ls.setItem(this._prefix(key), encode(val)); + }, + remove: function(key) { + ls.removeItem(this._ttlKey(key)); + ls.removeItem(this._prefix(key)); + return this; + }, + clear: function() { + var i, key, keys = [], len = ls.length; + for (i = 0; i < len; i++) { + if ((key = ls.key(i)).match(this.keyMatcher)) { + keys.push(key.replace(this.keyMatcher, "")); + } + } + for (i = keys.length; i--; ) { + this.remove(keys[i]); + } + return this; + }, + isExpired: function(key) { + var ttl = decode(ls.getItem(this._ttlKey(key))); + return _.isNumber(ttl) && now() > ttl ? true : false; + } + }; + } else { + methods = { + get: _.noop, + set: _.noop, + remove: _.noop, + clear: _.noop, + isExpired: _.noop + }; + } + _.mixin(PersistentStorage.prototype, methods); + return PersistentStorage; + function now() { + return new Date().getTime(); + } + function encode(val) { + return JSON.stringify(_.isUndefined(val) ? null : val); + } + function decode(val) { + return JSON.parse(val); + } + }(); + var Transport = function() { + "use strict"; + var pendingRequestsCount = 0, pendingRequests = {}, maxPendingRequests = 6, sharedCache = new LruCache(10); + function Transport(o) { + o = o || {}; + this.cancelled = false; + this.lastUrl = null; + this._send = o.transport ? callbackToDeferred(o.transport) : $.ajax; + this._get = o.rateLimiter ? o.rateLimiter(this._get) : this._get; + this._cache = o.cache === false ? new LruCache(0) : sharedCache; + } + Transport.setMaxPendingRequests = function setMaxPendingRequests(num) { + maxPendingRequests = num; + }; + Transport.resetCache = function resetCache() { + sharedCache.reset(); + }; + _.mixin(Transport.prototype, { + _get: function(url, o, cb) { + var that = this, jqXhr; + if (this.cancelled || url !== this.lastUrl) { + return; + } + if (jqXhr = pendingRequests[url]) { + jqXhr.done(done).fail(fail); + } else if (pendingRequestsCount < maxPendingRequests) { + pendingRequestsCount++; + pendingRequests[url] = this._send(url, o).done(done).fail(fail).always(always); + } else { + this.onDeckRequestArgs = [].slice.call(arguments, 0); + } + function done(resp) { + cb && cb(null, resp); + that._cache.set(url, resp); + } + function fail() { + cb && cb(true); + } + function always() { + pendingRequestsCount--; + delete pendingRequests[url]; + if (that.onDeckRequestArgs) { + that._get.apply(that, that.onDeckRequestArgs); + that.onDeckRequestArgs = null; + } + } + }, + get: function(url, o, cb) { + var resp; + if (_.isFunction(o)) { + cb = o; + o = {}; + } + this.cancelled = false; + this.lastUrl = url; + if (resp = this._cache.get(url)) { + _.defer(function() { + cb && cb(null, resp); + }); + } else { + this._get(url, o, cb); + } + return !!resp; + }, + cancel: function() { + this.cancelled = true; + } + }); + return Transport; + function callbackToDeferred(fn) { + return function customSendWrapper(url, o) { + var deferred = $.Deferred(); + fn(url, o, onSuccess, onError); + return deferred; + function onSuccess(resp) { + _.defer(function() { + deferred.resolve(resp); + }); + } + function onError(err) { + _.defer(function() { + deferred.reject(err); + }); + } + }; + } + }(); + var SearchIndex = function() { + "use strict"; + function SearchIndex(o) { + o = o || {}; + if (!o.datumTokenizer || !o.queryTokenizer) { + $.error("datumTokenizer and queryTokenizer are both required"); + } + this.datumTokenizer = o.datumTokenizer; + this.queryTokenizer = o.queryTokenizer; + this.reset(); + } + _.mixin(SearchIndex.prototype, { + bootstrap: function bootstrap(o) { + this.datums = o.datums; + this.trie = o.trie; + }, + add: function(data) { + var that = this; + data = _.isArray(data) ? data : [ data ]; + _.each(data, function(datum) { + var id, tokens; + id = that.datums.push(datum) - 1; + tokens = normalizeTokens(that.datumTokenizer(datum)); + _.each(tokens, function(token) { + var node, chars, ch; + node = that.trie; + chars = token.split(""); + while (ch = chars.shift()) { + node = node.children[ch] || (node.children[ch] = newNode()); + node.ids.push(id); + } + }); + }); + }, + get: function get(query) { + var that = this, tokens, matches; + tokens = normalizeTokens(this.queryTokenizer(query)); + _.each(tokens, function(token) { + var node, chars, ch, ids; + if (matches && matches.length === 0) { + return false; + } + node = that.trie; + chars = token.split(""); + while (node && (ch = chars.shift())) { + node = node.children[ch]; + } + if (node && chars.length === 0) { + ids = node.ids.slice(0); + matches = matches ? getIntersection(matches, ids) : ids; + } else { + matches = []; + return false; + } + }); + return matches ? _.map(unique(matches), function(id) { + return that.datums[id]; + }) : []; + }, + reset: function reset() { + this.datums = []; + this.trie = newNode(); + }, + serialize: function serialize() { + return { + datums: this.datums, + trie: this.trie + }; + } + }); + return SearchIndex; + function normalizeTokens(tokens) { + tokens = _.filter(tokens, function(token) { + return !!token; + }); + tokens = _.map(tokens, function(token) { + return token.toLowerCase(); + }); + return tokens; + } + function newNode() { + return { + ids: [], + children: {} + }; + } + function unique(array) { + var seen = {}, uniques = []; + for (var i = 0, len = array.length; i < len; i++) { + if (!seen[array[i]]) { + seen[array[i]] = true; + uniques.push(array[i]); + } + } + return uniques; + } + function getIntersection(arrayA, arrayB) { + var ai = 0, bi = 0, intersection = []; + arrayA = arrayA.sort(compare); + arrayB = arrayB.sort(compare); + var lenArrayA = arrayA.length, lenArrayB = arrayB.length; + while (ai < lenArrayA && bi < lenArrayB) { + if (arrayA[ai] < arrayB[bi]) { + ai++; + } else if (arrayA[ai] > arrayB[bi]) { + bi++; + } else { + intersection.push(arrayA[ai]); + ai++; + bi++; + } + } + return intersection; + function compare(a, b) { + return a - b; + } + } + }(); + var oParser = function() { + "use strict"; + return { + local: getLocal, + prefetch: getPrefetch, + remote: getRemote + }; + function getLocal(o) { + return o.local || null; + } + function getPrefetch(o) { + var prefetch, defaults; + defaults = { + url: null, + thumbprint: "", + ttl: 24 * 60 * 60 * 1e3, + filter: null, + ajax: {} + }; + if (prefetch = o.prefetch || null) { + prefetch = _.isString(prefetch) ? { + url: prefetch + } : prefetch; + prefetch = _.mixin(defaults, prefetch); + prefetch.thumbprint = VERSION + prefetch.thumbprint; + prefetch.ajax.type = prefetch.ajax.type || "GET"; + prefetch.ajax.dataType = prefetch.ajax.dataType || "json"; + !prefetch.url && $.error("prefetch requires url to be set"); + } + return prefetch; + } + function getRemote(o) { + var remote, defaults; + defaults = { + url: null, + cache: true, + wildcard: "%QUERY", + replace: null, + rateLimitBy: "debounce", + rateLimitWait: 300, + send: null, + filter: null, + ajax: {} + }; + if (remote = o.remote || null) { + remote = _.isString(remote) ? { + url: remote + } : remote; + remote = _.mixin(defaults, remote); + remote.rateLimiter = /^throttle$/i.test(remote.rateLimitBy) ? byThrottle(remote.rateLimitWait) : byDebounce(remote.rateLimitWait); + remote.ajax.type = remote.ajax.type || "GET"; + remote.ajax.dataType = remote.ajax.dataType || "json"; + delete remote.rateLimitBy; + delete remote.rateLimitWait; + !remote.url && $.error("remote requires url to be set"); + } + return remote; + function byDebounce(wait) { + return function(fn) { + return _.debounce(fn, wait); + }; + } + function byThrottle(wait) { + return function(fn) { + return _.throttle(fn, wait); + }; + } + } + }(); + (function(root) { + "use strict"; + var old, keys; + old = root.Bloodhound; + keys = { + data: "data", + protocol: "protocol", + thumbprint: "thumbprint" + }; + root.Bloodhound = Bloodhound; + function Bloodhound(o) { + if (!o || !o.local && !o.prefetch && !o.remote) { + $.error("one of local, prefetch, or remote is required"); + } + this.limit = o.limit || 5; + this.sorter = getSorter(o.sorter); + this.dupDetector = o.dupDetector || ignoreDuplicates; + this.local = oParser.local(o); + this.prefetch = oParser.prefetch(o); + this.remote = oParser.remote(o); + this.cacheKey = this.prefetch ? this.prefetch.cacheKey || this.prefetch.url : null; + this.index = new SearchIndex({ + datumTokenizer: o.datumTokenizer, + queryTokenizer: o.queryTokenizer + }); + this.storage = this.cacheKey ? new PersistentStorage(this.cacheKey) : null; + } + Bloodhound.noConflict = function noConflict() { + root.Bloodhound = old; + return Bloodhound; + }; + Bloodhound.tokenizers = tokenizers; + _.mixin(Bloodhound.prototype, { + _loadPrefetch: function loadPrefetch(o) { + var that = this, serialized, deferred; + if (serialized = this._readFromStorage(o.thumbprint)) { + this.index.bootstrap(serialized); + deferred = $.Deferred().resolve(); + } else { + deferred = $.ajax(o.url, o.ajax).done(handlePrefetchResponse); + } + return deferred; + function handlePrefetchResponse(resp) { + that.clear(); + that.add(o.filter ? o.filter(resp) : resp); + that._saveToStorage(that.index.serialize(), o.thumbprint, o.ttl); + } + }, + _getFromRemote: function getFromRemote(query, cb) { + var that = this, url, uriEncodedQuery; + if (!this.transport) { + return; + } + query = query || ""; + uriEncodedQuery = encodeURIComponent(query); + url = this.remote.replace ? this.remote.replace(this.remote.url, query) : this.remote.url.replace(this.remote.wildcard, uriEncodedQuery); + return this.transport.get(url, this.remote.ajax, handleRemoteResponse); + function handleRemoteResponse(err, resp) { + err ? cb([]) : cb(that.remote.filter ? that.remote.filter(resp) : resp); + } + }, + _cancelLastRemoteRequest: function cancelLastRemoteRequest() { + this.transport && this.transport.cancel(); + }, + _saveToStorage: function saveToStorage(data, thumbprint, ttl) { + if (this.storage) { + this.storage.set(keys.data, data, ttl); + this.storage.set(keys.protocol, location.protocol, ttl); + this.storage.set(keys.thumbprint, thumbprint, ttl); + } + }, + _readFromStorage: function readFromStorage(thumbprint) { + var stored = {}, isExpired; + if (this.storage) { + stored.data = this.storage.get(keys.data); + stored.protocol = this.storage.get(keys.protocol); + stored.thumbprint = this.storage.get(keys.thumbprint); + } + isExpired = stored.thumbprint !== thumbprint || stored.protocol !== location.protocol; + return stored.data && !isExpired ? stored.data : null; + }, + _initialize: function initialize() { + var that = this, local = this.local, deferred; + deferred = this.prefetch ? this._loadPrefetch(this.prefetch) : $.Deferred().resolve(); + local && deferred.done(addLocalToIndex); + this.transport = this.remote ? new Transport(this.remote) : null; + return this.initPromise = deferred.promise(); + function addLocalToIndex() { + that.add(_.isFunction(local) ? local() : local); + } + }, + initialize: function initialize(force) { + return !this.initPromise || force ? this._initialize() : this.initPromise; + }, + add: function add(data) { + this.index.add(data); + }, + get: function get(query, cb) { + var that = this, matches = [], cacheHit = false; + matches = this.index.get(query); + matches = this.sorter(matches).slice(0, this.limit); + matches.length < this.limit ? cacheHit = this._getFromRemote(query, returnRemoteMatches) : this._cancelLastRemoteRequest(); + if (!cacheHit) { + (matches.length > 0 || !this.transport) && cb && cb(matches); + } + function returnRemoteMatches(remoteMatches) { + var matchesWithBackfill = matches.slice(0); + _.each(remoteMatches, function(remoteMatch) { + var isDuplicate; + isDuplicate = _.some(matchesWithBackfill, function(match) { + return that.dupDetector(remoteMatch, match); + }); + !isDuplicate && matchesWithBackfill.push(remoteMatch); + return matchesWithBackfill.length < that.limit; + }); + cb && cb(that.sorter(matchesWithBackfill)); + } + }, + clear: function clear() { + this.index.reset(); + }, + clearPrefetchCache: function clearPrefetchCache() { + this.storage && this.storage.clear(); + }, + clearRemoteCache: function clearRemoteCache() { + this.transport && Transport.resetCache(); + }, + ttAdapter: function ttAdapter() { + return _.bind(this.get, this); + } + }); + return Bloodhound; + function getSorter(sortFn) { + return _.isFunction(sortFn) ? sort : noSort; + function sort(array) { + return array.sort(sortFn); + } + function noSort(array) { + return array; + } + } + function ignoreDuplicates() { + return false; + } + })(this); + var html = function() { + return { + wrapper: '', + dropdown: '', + dataset: '
      ', + suggestions: '', + suggestion: '
      ' + }; + }(); + var css = function() { + "use strict"; + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + dropdown: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + suggestions: { + display: "block" + }, + suggestion: { + whiteSpace: "nowrap", + cursor: "pointer" + }, + suggestionChild: { + whiteSpace: "normal" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + if (_.isMsie() && _.isMsie() <= 7) { + _.mixin(css.input, { + marginTop: "-1px" + }); + } + return css; + }(); + var EventBus = function() { + "use strict"; + var namespace = "typeahead:"; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + trigger: function(type) { + var args = [].slice.call(arguments, 1); + this.$el.trigger(namespace + type, args); + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function getRegex(patterns, caseSensitive, wordsOnly) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + escapedPatterns.push(_.escapeRegExChars(patterns[i])); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o) { + var that = this, onBlur, onFocus, onKeydown, onInput; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$hint = $(o.hint); + this.$input = $(o.input).on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + if (!_.isMsie()) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + this.query = this.$input.val(); + this.$overflowHelper = buildOverflowHelper(this.$input); + } + Input.normalizeQuery = function(str) { + return (str || "").replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._checkInputValue(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault, hintValue, inputValue; + switch (keyName) { + case "tab": + hintValue = this.getHint(); + inputValue = this.getInputValue(); + preventDefault = hintValue && hintValue !== inputValue && !withModifier($e); + break; + + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkInputValue: function checkInputValue() { + var inputValue, areEquivalent, hasDifferentWhitespace; + inputValue = this.getInputValue(); + areEquivalent = areQueriesEquivalent(inputValue, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== inputValue.length : false; + this.query = inputValue; + if (!areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getQuery: function getQuery() { + return this.query; + }, + setQuery: function setQuery(query) { + this.query = query; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value, silent) { + this.$input.val(value); + silent ? this.clearHint() : this._checkInputValue(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query, true); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + getLanguageDirection: function getLanguageDirection() { + return (this.$input.css("direction") || "ltr").toLowerCase(); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$hint = this.$input = this.$overflowHelper = null; + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var datasetKey = "ttDataset", valueKey = "ttValue", datumKey = "ttDatum"; + function Dataset(o) { + o = o || {}; + o.templates = o.templates || {}; + if (!o.source) { + $.error("missing source"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + this.query = null; + this.highlight = !!o.highlight; + this.name = o.name || _.getUniqueId(); + this.source = o.source; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.$el = $(html.dataset.replace("%CLASS%", this.name)); + } + Dataset.extractDatasetName = function extractDatasetName(el) { + return $(el).data(datasetKey); + }; + Dataset.extractValue = function extractDatum(el) { + return $(el).data(valueKey); + }; + Dataset.extractDatum = function extractDatum(el) { + return $(el).data(datumKey); + }; + _.mixin(Dataset.prototype, EventEmitter, { + _render: function render(query, suggestions) { + if (!this.$el) { + return; + } + var that = this, hasSuggestions; + this.$el.empty(); + hasSuggestions = suggestions && suggestions.length; + if (!hasSuggestions && this.templates.empty) { + this.$el.html(getEmptyHtml()).prepend(that.templates.header ? getHeaderHtml() : null).append(that.templates.footer ? getFooterHtml() : null); + } else if (hasSuggestions) { + this.$el.html(getSuggestionsHtml()).prepend(that.templates.header ? getHeaderHtml() : null).append(that.templates.footer ? getFooterHtml() : null); + } + this.trigger("rendered"); + function getEmptyHtml() { + return that.templates.empty({ + query: query, + isEmpty: true + }); + } + function getSuggestionsHtml() { + var $suggestions, nodes; + $suggestions = $(html.suggestions).css(css.suggestions); + nodes = _.map(suggestions, getSuggestionNode); + $suggestions.append.apply($suggestions, nodes); + that.highlight && highlight({ + className: "tt-highlight", + node: $suggestions[0], + pattern: query + }); + return $suggestions; + function getSuggestionNode(suggestion) { + var $el; + $el = $(html.suggestion).append(that.templates.suggestion(suggestion)).data(datasetKey, that.name).data(valueKey, that.displayFn(suggestion)).data(datumKey, suggestion); + $el.children().each(function() { + $(this).css(css.suggestionChild); + }); + return $el; + } + } + function getHeaderHtml() { + return that.templates.header({ + query: query, + isEmpty: !hasSuggestions + }); + } + function getFooterHtml() { + return that.templates.footer({ + query: query, + isEmpty: !hasSuggestions + }); + } + }, + getRoot: function getRoot() { + return this.$el; + }, + update: function update(query) { + var that = this; + this.query = query; + this.canceled = false; + this.source(query, render); + function render(suggestions) { + if (!that.canceled && query === that.query) { + that._render(query, suggestions); + } + } + }, + cancel: function cancel() { + this.canceled = true; + }, + clear: function clear() { + this.cancel(); + this.$el.empty(); + this.trigger("rendered"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = null; + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || "value"; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + empty: templates.empty && _.templatify(templates.empty), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion || suggestionTemplate + }; + function suggestionTemplate(context) { + return "

      " + displayFn(context) + "

      "; + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Dropdown = function() { + "use strict"; + function Dropdown(o) { + var that = this, onSuggestionClick, onSuggestionMouseEnter, onSuggestionMouseLeave; + o = o || {}; + if (!o.menu) { + $.error("menu is required"); + } + this.isOpen = false; + this.isEmpty = true; + this.datasets = _.map(o.datasets, initializeDataset); + onSuggestionClick = _.bind(this._onSuggestionClick, this); + onSuggestionMouseEnter = _.bind(this._onSuggestionMouseEnter, this); + onSuggestionMouseLeave = _.bind(this._onSuggestionMouseLeave, this); + this.$menu = $(o.menu).on("click.tt", ".tt-suggestion", onSuggestionClick).on("mouseenter.tt", ".tt-suggestion", onSuggestionMouseEnter).on("mouseleave.tt", ".tt-suggestion", onSuggestionMouseLeave); + _.each(this.datasets, function(dataset) { + that.$menu.append(dataset.getRoot()); + dataset.onSync("rendered", that._onRendered, that); + }); + } + _.mixin(Dropdown.prototype, EventEmitter, { + _onSuggestionClick: function onSuggestionClick($e) { + this.trigger("suggestionClicked", $($e.currentTarget)); + }, + _onSuggestionMouseEnter: function onSuggestionMouseEnter($e) { + this._removeCursor(); + this._setCursor($($e.currentTarget), true); + }, + _onSuggestionMouseLeave: function onSuggestionMouseLeave() { + this._removeCursor(); + }, + _onRendered: function onRendered() { + this.isEmpty = _.every(this.datasets, isDatasetEmpty); + this.isEmpty ? this._hide() : this.isOpen && this._show(); + this.trigger("datasetRendered"); + function isDatasetEmpty(dataset) { + return dataset.isEmpty(); + } + }, + _hide: function() { + this.$menu.hide(); + }, + _show: function() { + this.$menu.css("display", "block"); + }, + _getSuggestions: function getSuggestions() { + return this.$menu.find(".tt-suggestion"); + }, + _getCursor: function getCursor() { + return this.$menu.find(".tt-cursor").first(); + }, + _setCursor: function setCursor($el, silent) { + $el.first().addClass("tt-cursor"); + !silent && this.trigger("cursorMoved"); + }, + _removeCursor: function removeCursor() { + this._getCursor().removeClass("tt-cursor"); + }, + _moveCursor: function moveCursor(increment) { + var $suggestions, $oldCursor, newCursorIndex, $newCursor; + if (!this.isOpen) { + return; + } + $oldCursor = this._getCursor(); + $suggestions = this._getSuggestions(); + this._removeCursor(); + newCursorIndex = $suggestions.index($oldCursor) + increment; + newCursorIndex = (newCursorIndex + 1) % ($suggestions.length + 1) - 1; + if (newCursorIndex === -1) { + this.trigger("cursorRemoved"); + return; + } else if (newCursorIndex < -1) { + newCursorIndex = $suggestions.length - 1; + } + this._setCursor($newCursor = $suggestions.eq(newCursorIndex)); + this._ensureVisible($newCursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, menuScrollTop, menuHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + menuScrollTop = this.$menu.scrollTop(); + menuHeight = this.$menu.height() + parseInt(this.$menu.css("paddingTop"), 10) + parseInt(this.$menu.css("paddingBottom"), 10); + if (elTop < 0) { + this.$menu.scrollTop(menuScrollTop + elTop); + } else if (menuHeight < elBottom) { + this.$menu.scrollTop(menuScrollTop + (elBottom - menuHeight)); + } + }, + close: function close() { + if (this.isOpen) { + this.isOpen = false; + this._removeCursor(); + this._hide(); + this.trigger("closed"); + } + }, + open: function open() { + if (!this.isOpen) { + this.isOpen = true; + !this.isEmpty && this._show(); + this.trigger("opened"); + } + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$menu.css(dir === "ltr" ? css.ltr : css.rtl); + }, + moveCursorUp: function moveCursorUp() { + this._moveCursor(-1); + }, + moveCursorDown: function moveCursorDown() { + this._moveCursor(+1); + }, + getDatumForSuggestion: function getDatumForSuggestion($el) { + var datum = null; + if ($el.length) { + datum = { + raw: Dataset.extractDatum($el), + value: Dataset.extractValue($el), + datasetName: Dataset.extractDatasetName($el) + }; + } + return datum; + }, + getDatumForCursor: function getDatumForCursor() { + return this.getDatumForSuggestion(this._getCursor().first()); + }, + getDatumForTopSuggestion: function getDatumForTopSuggestion() { + return this.getDatumForSuggestion(this._getSuggestions().first()); + }, + update: function update(query) { + _.each(this.datasets, updateDataset); + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.isEmpty = true; + function clearDataset(dataset) { + dataset.clear(); + } + }, + isVisible: function isVisible() { + return this.isOpen && !this.isEmpty; + }, + destroy: function destroy() { + this.$menu.off(".tt"); + this.$menu = null; + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Dropdown; + function initializeDataset(oDataset) { + return new Dataset(oDataset); + } + }(); + var Typeahead = function() { + "use strict"; + var attrsKey = "ttAttrs"; + function Typeahead(o) { + var $menu, $input, $hint; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + this.isActivated = false; + this.autoselect = !!o.autoselect; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.$node = buildDom(o.input, o.withHint); + $menu = this.$node.find(".tt-dropdown-menu"); + $input = this.$node.find(".tt-input"); + $hint = this.$node.find(".tt-hint"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + this.eventBus = o.eventBus || new EventBus({ + el: $input + }); + this.dropdown = new Dropdown({ + menu: $menu, + datasets: o.datasets + }).onSync("suggestionClicked", this._onSuggestionClicked, this).onSync("cursorMoved", this._onCursorMoved, this).onSync("cursorRemoved", this._onCursorRemoved, this).onSync("opened", this._onOpened, this).onSync("closed", this._onClosed, this).onAsync("datasetRendered", this._onDatasetRendered, this); + this.input = new Input({ + input: $input, + hint: $hint + }).onSync("focused", this._onFocused, this).onSync("blurred", this._onBlurred, this).onSync("enterKeyed", this._onEnterKeyed, this).onSync("tabKeyed", this._onTabKeyed, this).onSync("escKeyed", this._onEscKeyed, this).onSync("upKeyed", this._onUpKeyed, this).onSync("downKeyed", this._onDownKeyed, this).onSync("leftKeyed", this._onLeftKeyed, this).onSync("rightKeyed", this._onRightKeyed, this).onSync("queryChanged", this._onQueryChanged, this).onSync("whitespaceChanged", this._onWhitespaceChanged, this); + this._setLanguageDirection(); + } + _.mixin(Typeahead.prototype, { + _onSuggestionClicked: function onSuggestionClicked(type, $el) { + var datum; + if (datum = this.dropdown.getDatumForSuggestion($el)) { + this._select(datum); + } + }, + _onCursorMoved: function onCursorMoved() { + var datum = this.dropdown.getDatumForCursor(); + this.input.setInputValue(datum.value, true); + this.eventBus.trigger("cursorchanged", datum.raw, datum.datasetName); + }, + _onCursorRemoved: function onCursorRemoved() { + this.input.resetInputValue(); + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered() { + this._updateHint(); + }, + _onOpened: function onOpened() { + this._updateHint(); + this.eventBus.trigger("opened"); + }, + _onClosed: function onClosed() { + this.input.clearHint(); + this.eventBus.trigger("closed"); + }, + _onFocused: function onFocused() { + this.isActivated = true; + this.dropdown.open(); + }, + _onBlurred: function onBlurred() { + this.isActivated = false; + this.dropdown.empty(); + this.dropdown.close(); + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var cursorDatum, topSuggestionDatum; + cursorDatum = this.dropdown.getDatumForCursor(); + topSuggestionDatum = this.dropdown.getDatumForTopSuggestion(); + if (cursorDatum) { + this._select(cursorDatum); + $e.preventDefault(); + } else if (this.autoselect && topSuggestionDatum) { + this._select(topSuggestionDatum); + $e.preventDefault(); + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var datum; + if (datum = this.dropdown.getDatumForCursor()) { + this._select(datum); + $e.preventDefault(); + } else { + this._autocomplete(true); + } + }, + _onEscKeyed: function onEscKeyed() { + this.dropdown.close(); + this.input.resetInputValue(); + }, + _onUpKeyed: function onUpKeyed() { + var query = this.input.getQuery(); + this.dropdown.isEmpty && query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.moveCursorUp(); + this.dropdown.open(); + }, + _onDownKeyed: function onDownKeyed() { + var query = this.input.getQuery(); + this.dropdown.isEmpty && query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.moveCursorDown(); + this.dropdown.open(); + }, + _onLeftKeyed: function onLeftKeyed() { + this.dir === "rtl" && this._autocomplete(); + }, + _onRightKeyed: function onRightKeyed() { + this.dir === "ltr" && this._autocomplete(); + }, + _onQueryChanged: function onQueryChanged(e, query) { + this.input.clearHintIfInvalid(); + query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.empty(); + this.dropdown.open(); + this._setLanguageDirection(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + this.dropdown.open(); + }, + _setLanguageDirection: function setLanguageDirection() { + var dir; + if (this.dir !== (dir = this.input.getLanguageDirection())) { + this.dir = dir; + this.$node.css("direction", dir); + this.dropdown.setLanguageDirection(dir); + } + }, + _updateHint: function updateHint() { + var datum, val, query, escapedQuery, frontMatchRegEx, match; + datum = this.dropdown.getDatumForTopSuggestion(); + if (datum && this.dropdown.isVisible() && !this.input.hasOverflow()) { + val = this.input.getInputValue(); + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(datum.value); + match ? this.input.setHint(val + match[1]) : this.input.clearHint(); + } else { + this.input.clearHint(); + } + }, + _autocomplete: function autocomplete(laxCursor) { + var hint, query, isCursorAtEnd, datum; + hint = this.input.getHint(); + query = this.input.getQuery(); + isCursorAtEnd = laxCursor || this.input.isCursorAtEnd(); + if (hint && query !== hint && isCursorAtEnd) { + datum = this.dropdown.getDatumForTopSuggestion(); + datum && this.input.setInputValue(datum.value); + this.eventBus.trigger("autocompleted", datum.raw, datum.datasetName); + } + }, + _select: function select(datum) { + this.input.setQuery(datum.value); + this.input.setInputValue(datum.value, true); + this._setLanguageDirection(); + this.eventBus.trigger("selected", datum.raw, datum.datasetName); + this.dropdown.close(); + _.defer(_.bind(this.dropdown.empty, this.dropdown)); + }, + open: function open() { + this.dropdown.open(); + }, + close: function close() { + this.dropdown.close(); + }, + setVal: function setVal(val) { + val = _.toStr(val); + if (this.isActivated) { + this.input.setInputValue(val); + } else { + this.input.setQuery(val); + this.input.setInputValue(val, true); + } + this._setLanguageDirection(); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + destroy: function destroy() { + this.input.destroy(); + this.dropdown.destroy(); + destroyDomStructure(this.$node); + this.$node = null; + } + }); + return Typeahead; + function buildDom(input, withHint) { + var $input, $wrapper, $dropdown, $hint; + $input = $(input); + $wrapper = $(html.wrapper).css(css.wrapper); + $dropdown = $(html.dropdown).css(css.dropdown); + $hint = $input.clone().css(css.hint).css(getBackgroundStyles($input)); + $hint.val("").removeData().addClass("tt-hint").removeAttr("id name placeholder required").prop("readonly", true).attr({ + autocomplete: "off", + spellcheck: "false", + tabindex: -1 + }); + $input.data(attrsKey, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass("tt-input").attr({ + autocomplete: "off", + spellcheck: false + }).css(withHint ? css.input : css.inputWithNoHint); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input.wrap($wrapper).parent().prepend(withHint ? $hint : null).append($dropdown); + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function destroyDomStructure($node) { + var $input = $node.find(".tt-input"); + _.each($input.data(attrsKey), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.detach().removeData(attrsKey).removeClass("tt-input").insertAfter($node); + $node.remove(); + } + }(); + (function() { + "use strict"; + var old, typeaheadKey, methods; + old = $.fn.typeahead; + typeaheadKey = "ttTypeahead"; + methods = { + initialize: function initialize(o, datasets) { + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + return this.each(attach); + function attach() { + var $input = $(this), eventBus, typeahead; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + typeahead = new Typeahead({ + input: $input, + eventBus: eventBus = new EventBus({ + el: $input + }), + withHint: _.isUndefined(o.hint) ? true : !!o.hint, + minLength: o.minLength, + autoselect: o.autoselect, + datasets: datasets + }); + $input.data(typeaheadKey, typeahead); + } + }, + open: function open() { + return this.each(openTypeahead); + function openTypeahead() { + var $input = $(this), typeahead; + if (typeahead = $input.data(typeaheadKey)) { + typeahead.open(); + } + } + }, + close: function close() { + return this.each(closeTypeahead); + function closeTypeahead() { + var $input = $(this), typeahead; + if (typeahead = $input.data(typeaheadKey)) { + typeahead.close(); + } + } + }, + val: function val(newVal) { + return !arguments.length ? getVal(this.first()) : this.each(setVal); + function setVal() { + var $input = $(this), typeahead; + if (typeahead = $input.data(typeaheadKey)) { + typeahead.setVal(newVal); + } + } + function getVal($input) { + var typeahead, query; + if (typeahead = $input.data(typeaheadKey)) { + query = typeahead.getVal(); + } + return query; + } + }, + destroy: function destroy() { + return this.each(unattach); + function unattach() { + var $input = $(this), typeahead; + if (typeahead = $input.data(typeaheadKey)) { + typeahead.destroy(); + $input.removeData(typeaheadKey); + } + } + } + }; + $.fn.typeahead = function(method) { + var tts; + if (methods[method] && method !== "initialize") { + tts = this.filter(function() { + return !!$(this).data(typeaheadKey); + }); + return methods[method].apply(tts, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + })(); +})(window.jQuery); \ No newline at end of file diff --git a/src/cps/static/js/libs/underscore-min.js b/src/cps/static/js/libs/underscore-min.js new file mode 100644 index 0000000..f01025b --- /dev/null +++ b/src/cps/static/js/libs/underscore-min.js @@ -0,0 +1,6 @@ +// Underscore.js 1.8.3 +// http://underscorejs.org +// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +(function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.hasOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}},j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this); +//# sourceMappingURL=underscore-min.map \ No newline at end of file diff --git a/src/cps/static/js/libs/underscore-min.map b/src/cps/static/js/libs/underscore-min.map new file mode 100644 index 0000000..cf356bf --- /dev/null +++ b/src/cps/static/js/libs/underscore-min.map @@ -0,0 +1 @@ +{"version":3,"file":"underscore-min.js","sources":["underscore.js"],"names":["createReduce","dir","iterator","obj","iteratee","memo","keys","index","length","currentKey","context","optimizeCb","isArrayLike","_","arguments","createPredicateIndexFinder","array","predicate","cb","getLength","createIndexFinder","predicateFind","sortedIndex","item","idx","i","Math","max","min","slice","call","isNaN","collectNonEnumProps","nonEnumIdx","nonEnumerableProps","constructor","proto","isFunction","prototype","ObjProto","prop","has","contains","push","root","this","previousUnderscore","ArrayProto","Array","Object","FuncProto","Function","toString","hasOwnProperty","nativeIsArray","isArray","nativeKeys","nativeBind","bind","nativeCreate","create","Ctor","_wrapped","exports","module","VERSION","func","argCount","value","other","collection","accumulator","apply","identity","isObject","matcher","property","Infinity","createAssigner","keysFunc","undefinedOnly","source","l","key","baseCreate","result","MAX_ARRAY_INDEX","pow","each","forEach","map","collect","results","reduce","foldl","inject","reduceRight","foldr","find","detect","findIndex","findKey","filter","select","list","reject","negate","every","all","some","any","includes","include","fromIndex","guard","values","indexOf","invoke","method","args","isFunc","pluck","where","attrs","findWhere","computed","lastComputed","shuffle","rand","set","shuffled","random","sample","n","sortBy","criteria","sort","left","right","a","b","group","behavior","groupBy","indexBy","countBy","toArray","size","partition","pass","fail","first","head","take","initial","last","rest","tail","drop","compact","flatten","input","shallow","strict","startIndex","output","isArguments","j","len","without","difference","uniq","unique","isSorted","isBoolean","seen","union","intersection","argsLength","zip","unzip","object","findLastIndex","low","high","mid","floor","lastIndexOf","range","start","stop","step","ceil","executeBound","sourceFunc","boundFunc","callingContext","self","TypeError","bound","concat","partial","boundArgs","position","bindAll","Error","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","now","remaining","clearTimeout","trailing","debounce","immediate","timestamp","callNow","wrap","wrapper","compose","after","times","before","once","hasEnumBug","propertyIsEnumerable","allKeys","mapObject","pairs","invert","functions","methods","names","extend","extendOwn","assign","pick","oiteratee","omit","String","defaults","props","clone","tap","interceptor","isMatch","eq","aStack","bStack","className","areArrays","aCtor","bCtor","pop","isEqual","isEmpty","isString","isElement","nodeType","type","name","Int8Array","isFinite","parseFloat","isNumber","isNull","isUndefined","noConflict","constant","noop","propertyOf","matches","accum","Date","getTime","escapeMap","&","<",">","\"","'","`","unescapeMap","createEscaper","escaper","match","join","testRegexp","RegExp","replaceRegexp","string","test","replace","escape","unescape","fallback","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","\\","\r","\n","
","
","escapeChar","template","text","settings","oldSettings","offset","variable","render","e","data","argument","chain","instance","_chain","mixin","valueOf","toJSON","define","amd"],"mappings":";;;;CAKC,WA4KC,QAASA,GAAaC,GAGpB,QAASC,GAASC,EAAKC,EAAUC,EAAMC,EAAMC,EAAOC,GAClD,KAAOD,GAAS,GAAaC,EAARD,EAAgBA,GAASN,EAAK,CACjD,GAAIQ,GAAaH,EAAOA,EAAKC,GAASA,CACtCF,GAAOD,EAASC,EAAMF,EAAIM,GAAaA,EAAYN,GAErD,MAAOE,GAGT,MAAO,UAASF,EAAKC,EAAUC,EAAMK,GACnCN,EAAWO,EAAWP,EAAUM,EAAS,EACzC,IAAIJ,IAAQM,EAAYT,IAAQU,EAAEP,KAAKH,GACnCK,GAAUF,GAAQH,GAAKK,OACvBD,EAAQN,EAAM,EAAI,EAAIO,EAAS,CAMnC,OAJIM,WAAUN,OAAS,IACrBH,EAAOF,EAAIG,EAAOA,EAAKC,GAASA,GAChCA,GAASN,GAEJC,EAASC,EAAKC,EAAUC,EAAMC,EAAMC,EAAOC,IA+ZtD,QAASO,GAA2Bd,GAClC,MAAO,UAASe,EAAOC,EAAWP,GAChCO,EAAYC,EAAGD,EAAWP,EAG1B,KAFA,GAAIF,GAASW,EAAUH,GACnBT,EAAQN,EAAM,EAAI,EAAIO,EAAS,EAC5BD,GAAS,GAAaC,EAARD,EAAgBA,GAASN,EAC5C,GAAIgB,EAAUD,EAAMT,GAAQA,EAAOS,GAAQ,MAAOT,EAEpD,QAAQ,GAsBZ,QAASa,GAAkBnB,EAAKoB,EAAeC,GAC7C,MAAO,UAASN,EAAOO,EAAMC,GAC3B,GAAIC,GAAI,EAAGjB,EAASW,EAAUH,EAC9B,IAAkB,gBAAPQ,GACLvB,EAAM,EACNwB,EAAID,GAAO,EAAIA,EAAME,KAAKC,IAAIH,EAAMhB,EAAQiB,GAE5CjB,EAASgB,GAAO,EAAIE,KAAKE,IAAIJ,EAAM,EAAGhB,GAAUgB,EAAMhB,EAAS,MAE9D,IAAIc,GAAeE,GAAOhB,EAE/B,MADAgB,GAAMF,EAAYN,EAAOO,GAClBP,EAAMQ,KAASD,EAAOC,GAAO,CAEtC,IAAID,IAASA,EAEX,MADAC,GAAMH,EAAcQ,EAAMC,KAAKd,EAAOS,EAAGjB,GAASK,EAAEkB,OAC7CP,GAAO,EAAIA,EAAMC,GAAK,CAE/B,KAAKD,EAAMvB,EAAM,EAAIwB,EAAIjB,EAAS,EAAGgB,GAAO,GAAWhB,EAANgB,EAAcA,GAAOvB,EACpE,GAAIe,EAAMQ,KAASD,EAAM,MAAOC,EAElC,QAAQ,GAqPZ,QAASQ,GAAoB7B,EAAKG,GAChC,GAAI2B,GAAaC,EAAmB1B,OAChC2B,EAAchC,EAAIgC,YAClBC,EAASvB,EAAEwB,WAAWF,IAAgBA,EAAYG,WAAcC,EAGhEC,EAAO,aAGX,KAFI3B,EAAE4B,IAAItC,EAAKqC,KAAU3B,EAAE6B,SAASpC,EAAMkC,IAAOlC,EAAKqC,KAAKH,GAEpDP,KACLO,EAAON,EAAmBD,GACtBO,IAAQrC,IAAOA,EAAIqC,KAAUJ,EAAMI,KAAU3B,EAAE6B,SAASpC,EAAMkC,IAChElC,EAAKqC,KAAKH,GA74BhB,GAAII,GAAOC,KAGPC,EAAqBF,EAAK/B,EAG1BkC,EAAaC,MAAMV,UAAWC,EAAWU,OAAOX,UAAWY,EAAYC,SAASb,UAIlFK,EAAmBI,EAAWJ,KAC9Bd,EAAmBkB,EAAWlB,MAC9BuB,EAAmBb,EAASa,SAC5BC,EAAmBd,EAASc,eAK5BC,EAAqBN,MAAMO,QAC3BC,EAAqBP,OAAO3C,KAC5BmD,EAAqBP,EAAUQ,KAC/BC,EAAqBV,OAAOW,OAG1BC,EAAO,aAGPhD,EAAI,SAASV,GACf,MAAIA,aAAeU,GAAUV,EACvB0C,eAAgBhC,QACtBgC,KAAKiB,SAAW3D,GADiB,GAAIU,GAAEV,GAOlB,oBAAZ4D,UACa,mBAAXC,SAA0BA,OAAOD,UAC1CA,QAAUC,OAAOD,QAAUlD,GAE7BkD,QAAQlD,EAAIA,GAEZ+B,EAAK/B,EAAIA,EAIXA,EAAEoD,QAAU,OAKZ,IAAItD,GAAa,SAASuD,EAAMxD,EAASyD,GACvC,GAAIzD,QAAiB,GAAG,MAAOwD,EAC/B,QAAoB,MAAZC,EAAmB,EAAIA,GAC7B,IAAK,GAAG,MAAO,UAASC,GACtB,MAAOF,GAAKpC,KAAKpB,EAAS0D,GAE5B,KAAK,GAAG,MAAO,UAASA,EAAOC,GAC7B,MAAOH,GAAKpC,KAAKpB,EAAS0D,EAAOC,GAEnC,KAAK,GAAG,MAAO,UAASD,EAAO7D,EAAO+D,GACpC,MAAOJ,GAAKpC,KAAKpB,EAAS0D,EAAO7D,EAAO+D,GAE1C,KAAK,GAAG,MAAO,UAASC,EAAaH,EAAO7D,EAAO+D,GACjD,MAAOJ,GAAKpC,KAAKpB,EAAS6D,EAAaH,EAAO7D,EAAO+D,IAGzD,MAAO,YACL,MAAOJ,GAAKM,MAAM9D,EAASI,aAO3BI,EAAK,SAASkD,EAAO1D,EAASyD,GAChC,MAAa,OAATC,EAAsBvD,EAAE4D,SACxB5D,EAAEwB,WAAW+B,GAAezD,EAAWyD,EAAO1D,EAASyD,GACvDtD,EAAE6D,SAASN,GAAevD,EAAE8D,QAAQP,GACjCvD,EAAE+D,SAASR,GAEpBvD,GAAET,SAAW,SAASgE,EAAO1D,GAC3B,MAAOQ,GAAGkD,EAAO1D,EAASmE,KAI5B,IAAIC,GAAiB,SAASC,EAAUC,GACtC,MAAO,UAAS7E,GACd,GAAIK,GAASM,UAAUN,MACvB,IAAa,EAATA,GAAqB,MAAPL,EAAa,MAAOA,EACtC,KAAK,GAAII,GAAQ,EAAWC,EAARD,EAAgBA,IAIlC,IAAK,GAHD0E,GAASnE,UAAUP,GACnBD,EAAOyE,EAASE,GAChBC,EAAI5E,EAAKE,OACJiB,EAAI,EAAOyD,EAAJzD,EAAOA,IAAK,CAC1B,GAAI0D,GAAM7E,EAAKmB,EACVuD,IAAiB7E,EAAIgF,SAAc,KAAGhF,EAAIgF,GAAOF,EAAOE,IAGjE,MAAOhF,KAKPiF,EAAa,SAAS9C,GACxB,IAAKzB,EAAE6D,SAASpC,GAAY,QAC5B,IAAIqB,EAAc,MAAOA,GAAarB,EACtCuB,GAAKvB,UAAYA,CACjB,IAAI+C,GAAS,GAAIxB,EAEjB,OADAA,GAAKvB,UAAY,KACV+C,GAGLT,EAAW,SAASO,GACtB,MAAO,UAAShF,GACd,MAAc,OAAPA,MAAmB,GAAIA,EAAIgF,KAQlCG,EAAkB5D,KAAK6D,IAAI,EAAG,IAAM,EACpCpE,EAAYyD,EAAS,UACrBhE,EAAc,SAAS0D,GACzB,GAAI9D,GAASW,EAAUmD,EACvB,OAAwB,gBAAV9D,IAAsBA,GAAU,GAAe8E,GAAV9E,EASrDK,GAAE2E,KAAO3E,EAAE4E,QAAU,SAAStF,EAAKC,EAAUM,GAC3CN,EAAWO,EAAWP,EAAUM,EAChC,IAAIe,GAAGjB,CACP,IAAII,EAAYT,GACd,IAAKsB,EAAI,EAAGjB,EAASL,EAAIK,OAAYA,EAAJiB,EAAYA,IAC3CrB,EAASD,EAAIsB,GAAIA,EAAGtB,OAEjB,CACL,GAAIG,GAAOO,EAAEP,KAAKH,EAClB,KAAKsB,EAAI,EAAGjB,EAASF,EAAKE,OAAYA,EAAJiB,EAAYA,IAC5CrB,EAASD,EAAIG,EAAKmB,IAAKnB,EAAKmB,GAAItB,GAGpC,MAAOA,IAITU,EAAE6E,IAAM7E,EAAE8E,QAAU,SAASxF,EAAKC,EAAUM,GAC1CN,EAAWc,EAAGd,EAAUM,EAIxB,KAAK,GAHDJ,IAAQM,EAAYT,IAAQU,EAAEP,KAAKH,GACnCK,GAAUF,GAAQH,GAAKK,OACvBoF,EAAU5C,MAAMxC,GACXD,EAAQ,EAAWC,EAARD,EAAgBA,IAAS,CAC3C,GAAIE,GAAaH,EAAOA,EAAKC,GAASA,CACtCqF,GAAQrF,GAASH,EAASD,EAAIM,GAAaA,EAAYN,GAEzD,MAAOyF,IA+BT/E,EAAEgF,OAAShF,EAAEiF,MAAQjF,EAAEkF,OAAS/F,EAAa,GAG7Ca,EAAEmF,YAAcnF,EAAEoF,MAAQjG,GAAc,GAGxCa,EAAEqF,KAAOrF,EAAEsF,OAAS,SAAShG,EAAKc,EAAWP,GAC3C,GAAIyE,EAMJ,OAJEA,GADEvE,EAAYT,GACRU,EAAEuF,UAAUjG,EAAKc,EAAWP,GAE5BG,EAAEwF,QAAQlG,EAAKc,EAAWP,GAE9ByE,QAAa,IAAKA,KAAS,EAAUhF,EAAIgF,GAA7C,QAKFtE,EAAEyF,OAASzF,EAAE0F,OAAS,SAASpG,EAAKc,EAAWP,GAC7C,GAAIkF,KAKJ,OAJA3E,GAAYC,EAAGD,EAAWP,GAC1BG,EAAE2E,KAAKrF,EAAK,SAASiE,EAAO7D,EAAOiG,GAC7BvF,EAAUmD,EAAO7D,EAAOiG,IAAOZ,EAAQjD,KAAKyB,KAE3CwB,GAIT/E,EAAE4F,OAAS,SAAStG,EAAKc,EAAWP,GAClC,MAAOG,GAAEyF,OAAOnG,EAAKU,EAAE6F,OAAOxF,EAAGD,IAAaP,IAKhDG,EAAE8F,MAAQ9F,EAAE+F,IAAM,SAASzG,EAAKc,EAAWP,GACzCO,EAAYC,EAAGD,EAAWP,EAG1B,KAAK,GAFDJ,IAAQM,EAAYT,IAAQU,EAAEP,KAAKH,GACnCK,GAAUF,GAAQH,GAAKK,OAClBD,EAAQ,EAAWC,EAARD,EAAgBA,IAAS,CAC3C,GAAIE,GAAaH,EAAOA,EAAKC,GAASA,CACtC,KAAKU,EAAUd,EAAIM,GAAaA,EAAYN,GAAM,OAAO,EAE3D,OAAO,GAKTU,EAAEgG,KAAOhG,EAAEiG,IAAM,SAAS3G,EAAKc,EAAWP,GACxCO,EAAYC,EAAGD,EAAWP,EAG1B,KAAK,GAFDJ,IAAQM,EAAYT,IAAQU,EAAEP,KAAKH,GACnCK,GAAUF,GAAQH,GAAKK,OAClBD,EAAQ,EAAWC,EAARD,EAAgBA,IAAS,CAC3C,GAAIE,GAAaH,EAAOA,EAAKC,GAASA,CACtC,IAAIU,EAAUd,EAAIM,GAAaA,EAAYN,GAAM,OAAO,EAE1D,OAAO,GAKTU,EAAE6B,SAAW7B,EAAEkG,SAAWlG,EAAEmG,QAAU,SAAS7G,EAAKoB,EAAM0F,EAAWC,GAGnE,MAFKtG,GAAYT,KAAMA,EAAMU,EAAEsG,OAAOhH,KACd,gBAAb8G,IAAyBC,KAAOD,EAAY,GAChDpG,EAAEuG,QAAQjH,EAAKoB,EAAM0F,IAAc,GAI5CpG,EAAEwG,OAAS,SAASlH,EAAKmH,GACvB,GAAIC,GAAO1F,EAAMC,KAAKhB,UAAW,GAC7B0G,EAAS3G,EAAEwB,WAAWiF,EAC1B,OAAOzG,GAAE6E,IAAIvF,EAAK,SAASiE,GACzB,GAAIF,GAAOsD,EAASF,EAASlD,EAAMkD,EACnC,OAAe,OAARpD,EAAeA,EAAOA,EAAKM,MAAMJ,EAAOmD,MAKnD1G,EAAE4G,MAAQ,SAAStH,EAAKgF,GACtB,MAAOtE,GAAE6E,IAAIvF,EAAKU,EAAE+D,SAASO,KAK/BtE,EAAE6G,MAAQ,SAASvH,EAAKwH,GACtB,MAAO9G,GAAEyF,OAAOnG,EAAKU,EAAE8D,QAAQgD,KAKjC9G,EAAE+G,UAAY,SAASzH,EAAKwH,GAC1B,MAAO9G,GAAEqF,KAAK/F,EAAKU,EAAE8D,QAAQgD,KAI/B9G,EAAEc,IAAM,SAASxB,EAAKC,EAAUM,GAC9B,GACI0D,GAAOyD,EADPxC,GAAUR,IAAUiD,GAAgBjD,GAExC,IAAgB,MAAZzE,GAA2B,MAAPD,EAAa,CACnCA,EAAMS,EAAYT,GAAOA,EAAMU,EAAEsG,OAAOhH,EACxC,KAAK,GAAIsB,GAAI,EAAGjB,EAASL,EAAIK,OAAYA,EAAJiB,EAAYA,IAC/C2C,EAAQjE,EAAIsB,GACR2C,EAAQiB,IACVA,EAASjB,OAIbhE,GAAWc,EAAGd,EAAUM,GACxBG,EAAE2E,KAAKrF,EAAK,SAASiE,EAAO7D,EAAOiG,GACjCqB,EAAWzH,EAASgE,EAAO7D,EAAOiG,IAC9BqB,EAAWC,GAAgBD,KAAchD,KAAYQ,KAAYR,OACnEQ,EAASjB,EACT0D,EAAeD,IAIrB,OAAOxC,IAITxE,EAAEe,IAAM,SAASzB,EAAKC,EAAUM,GAC9B,GACI0D,GAAOyD,EADPxC,EAASR,IAAUiD,EAAejD,GAEtC,IAAgB,MAAZzE,GAA2B,MAAPD,EAAa,CACnCA,EAAMS,EAAYT,GAAOA,EAAMU,EAAEsG,OAAOhH,EACxC,KAAK,GAAIsB,GAAI,EAAGjB,EAASL,EAAIK,OAAYA,EAAJiB,EAAYA,IAC/C2C,EAAQjE,EAAIsB,GACA4D,EAARjB,IACFiB,EAASjB,OAIbhE,GAAWc,EAAGd,EAAUM,GACxBG,EAAE2E,KAAKrF,EAAK,SAASiE,EAAO7D,EAAOiG,GACjCqB,EAAWzH,EAASgE,EAAO7D,EAAOiG,IACnBsB,EAAXD,GAAwChD,MAAbgD,GAAoChD,MAAXQ,KACtDA,EAASjB,EACT0D,EAAeD,IAIrB,OAAOxC,IAKTxE,EAAEkH,QAAU,SAAS5H,GAInB,IAAK,GAAe6H,GAHhBC,EAAMrH,EAAYT,GAAOA,EAAMU,EAAEsG,OAAOhH,GACxCK,EAASyH,EAAIzH,OACb0H,EAAWlF,MAAMxC,GACZD,EAAQ,EAAiBC,EAARD,EAAgBA,IACxCyH,EAAOnH,EAAEsH,OAAO,EAAG5H,GACfyH,IAASzH,IAAO2H,EAAS3H,GAAS2H,EAASF,IAC/CE,EAASF,GAAQC,EAAI1H,EAEvB,OAAO2H,IAMTrH,EAAEuH,OAAS,SAASjI,EAAKkI,EAAGnB,GAC1B,MAAS,OAALmB,GAAanB,GACVtG,EAAYT,KAAMA,EAAMU,EAAEsG,OAAOhH,IAC/BA,EAAIU,EAAEsH,OAAOhI,EAAIK,OAAS,KAE5BK,EAAEkH,QAAQ5H,GAAK0B,MAAM,EAAGH,KAAKC,IAAI,EAAG0G,KAI7CxH,EAAEyH,OAAS,SAASnI,EAAKC,EAAUM,GAEjC,MADAN,GAAWc,EAAGd,EAAUM,GACjBG,EAAE4G,MAAM5G,EAAE6E,IAAIvF,EAAK,SAASiE,EAAO7D,EAAOiG,GAC/C,OACEpC,MAAOA,EACP7D,MAAOA,EACPgI,SAAUnI,EAASgE,EAAO7D,EAAOiG,MAElCgC,KAAK,SAASC,EAAMC,GACrB,GAAIC,GAAIF,EAAKF,SACTK,EAAIF,EAAMH,QACd,IAAII,IAAMC,EAAG,CACX,GAAID,EAAIC,GAAKD,QAAW,GAAG,MAAO,EAClC,IAAQC,EAAJD,GAASC,QAAW,GAAG,OAAQ,EAErC,MAAOH,GAAKlI,MAAQmI,EAAMnI,QACxB,SAIN,IAAIsI,GAAQ,SAASC,GACnB,MAAO,UAAS3I,EAAKC,EAAUM,GAC7B,GAAI2E,KAMJ,OALAjF,GAAWc,EAAGd,EAAUM,GACxBG,EAAE2E,KAAKrF,EAAK,SAASiE,EAAO7D,GAC1B,GAAI4E,GAAM/E,EAASgE,EAAO7D,EAAOJ,EACjC2I,GAASzD,EAAQjB,EAAOe,KAEnBE,GAMXxE,GAAEkI,QAAUF,EAAM,SAASxD,EAAQjB,EAAOe,GACpCtE,EAAE4B,IAAI4C,EAAQF,GAAME,EAAOF,GAAKxC,KAAKyB,GAAaiB,EAAOF,IAAQf,KAKvEvD,EAAEmI,QAAUH,EAAM,SAASxD,EAAQjB,EAAOe,GACxCE,EAAOF,GAAOf,IAMhBvD,EAAEoI,QAAUJ,EAAM,SAASxD,EAAQjB,EAAOe,GACpCtE,EAAE4B,IAAI4C,EAAQF,GAAME,EAAOF,KAAaE,EAAOF,GAAO,IAI5DtE,EAAEqI,QAAU,SAAS/I,GACnB,MAAKA,GACDU,EAAE0C,QAAQpD,GAAa0B,EAAMC,KAAK3B,GAClCS,EAAYT,GAAaU,EAAE6E,IAAIvF,EAAKU,EAAE4D,UACnC5D,EAAEsG,OAAOhH,OAIlBU,EAAEsI,KAAO,SAAShJ,GAChB,MAAW,OAAPA,EAAoB,EACjBS,EAAYT,GAAOA,EAAIK,OAASK,EAAEP,KAAKH,GAAKK,QAKrDK,EAAEuI,UAAY,SAASjJ,EAAKc,EAAWP,GACrCO,EAAYC,EAAGD,EAAWP,EAC1B,IAAI2I,MAAWC,IAIf,OAHAzI,GAAE2E,KAAKrF,EAAK,SAASiE,EAAOe,EAAKhF,IAC9Bc,EAAUmD,EAAOe,EAAKhF,GAAOkJ,EAAOC,GAAM3G,KAAKyB,MAE1CiF,EAAMC,IAShBzI,EAAE0I,MAAQ1I,EAAE2I,KAAO3I,EAAE4I,KAAO,SAASzI,EAAOqH,EAAGnB,GAC7C,MAAa,OAATlG,MAA2B,GACtB,MAALqH,GAAanB,EAAclG,EAAM,GAC9BH,EAAE6I,QAAQ1I,EAAOA,EAAMR,OAAS6H,IAMzCxH,EAAE6I,QAAU,SAAS1I,EAAOqH,EAAGnB,GAC7B,MAAOrF,GAAMC,KAAKd,EAAO,EAAGU,KAAKC,IAAI,EAAGX,EAAMR,QAAe,MAAL6H,GAAanB,EAAQ,EAAImB,MAKnFxH,EAAE8I,KAAO,SAAS3I,EAAOqH,EAAGnB,GAC1B,MAAa,OAATlG,MAA2B,GACtB,MAALqH,GAAanB,EAAclG,EAAMA,EAAMR,OAAS,GAC7CK,EAAE+I,KAAK5I,EAAOU,KAAKC,IAAI,EAAGX,EAAMR,OAAS6H,KAMlDxH,EAAE+I,KAAO/I,EAAEgJ,KAAOhJ,EAAEiJ,KAAO,SAAS9I,EAAOqH,EAAGnB,GAC5C,MAAOrF,GAAMC,KAAKd,EAAY,MAALqH,GAAanB,EAAQ,EAAImB,IAIpDxH,EAAEkJ,QAAU,SAAS/I,GACnB,MAAOH,GAAEyF,OAAOtF,EAAOH,EAAE4D,UAI3B,IAAIuF,GAAU,SAASC,EAAOC,EAASC,EAAQC,GAE7C,IAAK,GADDC,MAAa7I,EAAM,EACdC,EAAI2I,GAAc,EAAG5J,EAASW,EAAU8I,GAAYzJ,EAAJiB,EAAYA,IAAK,CACxE,GAAI2C,GAAQ6F,EAAMxI,EAClB,IAAIb,EAAYwD,KAAWvD,EAAE0C,QAAQa,IAAUvD,EAAEyJ,YAAYlG,IAAS,CAE/D8F,IAAS9F,EAAQ4F,EAAQ5F,EAAO8F,EAASC,GAC9C,IAAII,GAAI,EAAGC,EAAMpG,EAAM5D,MAEvB,KADA6J,EAAO7J,QAAUgK,EACNA,EAAJD,GACLF,EAAO7I,KAAS4C,EAAMmG,SAEdJ,KACVE,EAAO7I,KAAS4C,GAGpB,MAAOiG,GAITxJ,GAAEmJ,QAAU,SAAShJ,EAAOkJ,GAC1B,MAAOF,GAAQhJ,EAAOkJ,GAAS,IAIjCrJ,EAAE4J,QAAU,SAASzJ,GACnB,MAAOH,GAAE6J,WAAW1J,EAAOa,EAAMC,KAAKhB,UAAW,KAMnDD,EAAE8J,KAAO9J,EAAE+J,OAAS,SAAS5J,EAAO6J,EAAUzK,EAAUM,GACjDG,EAAEiK,UAAUD,KACfnK,EAAUN,EACVA,EAAWyK,EACXA,GAAW,GAEG,MAAZzK,IAAkBA,EAAWc,EAAGd,EAAUM,GAG9C,KAAK,GAFD2E,MACA0F,KACKtJ,EAAI,EAAGjB,EAASW,EAAUH,GAAYR,EAAJiB,EAAYA,IAAK,CAC1D,GAAI2C,GAAQpD,EAAMS,GACdoG,EAAWzH,EAAWA,EAASgE,EAAO3C,EAAGT,GAASoD,CAClDyG,IACGpJ,GAAKsJ,IAASlD,GAAUxC,EAAO1C,KAAKyB,GACzC2G,EAAOlD,GACEzH,EACJS,EAAE6B,SAASqI,EAAMlD,KACpBkD,EAAKpI,KAAKkF,GACVxC,EAAO1C,KAAKyB,IAEJvD,EAAE6B,SAAS2C,EAAQjB,IAC7BiB,EAAO1C,KAAKyB,GAGhB,MAAOiB,IAKTxE,EAAEmK,MAAQ,WACR,MAAOnK,GAAE8J,KAAKX,EAAQlJ,WAAW,GAAM,KAKzCD,EAAEoK,aAAe,SAASjK,GAGxB,IAAK,GAFDqE,MACA6F,EAAapK,UAAUN,OAClBiB,EAAI,EAAGjB,EAASW,EAAUH,GAAYR,EAAJiB,EAAYA,IAAK,CAC1D,GAAIF,GAAOP,EAAMS,EACjB,KAAIZ,EAAE6B,SAAS2C,EAAQ9D,GAAvB,CACA,IAAK,GAAIgJ,GAAI,EAAOW,EAAJX,GACT1J,EAAE6B,SAAS5B,UAAUyJ,GAAIhJ,GADAgJ,KAG5BA,IAAMW,GAAY7F,EAAO1C,KAAKpB,IAEpC,MAAO8D,IAKTxE,EAAE6J,WAAa,SAAS1J,GACtB,GAAI4I,GAAOI,EAAQlJ,WAAW,GAAM,EAAM,EAC1C,OAAOD,GAAEyF,OAAOtF,EAAO,SAASoD,GAC9B,OAAQvD,EAAE6B,SAASkH,EAAMxF,MAM7BvD,EAAEsK,IAAM,WACN,MAAOtK,GAAEuK,MAAMtK,YAKjBD,EAAEuK,MAAQ,SAASpK,GAIjB,IAAK,GAHDR,GAASQ,GAASH,EAAEc,IAAIX,EAAOG,GAAWX,QAAU,EACpD6E,EAASrC,MAAMxC,GAEVD,EAAQ,EAAWC,EAARD,EAAgBA,IAClC8E,EAAO9E,GAASM,EAAE4G,MAAMzG,EAAOT,EAEjC,OAAO8E,IAMTxE,EAAEwK,OAAS,SAAS7E,EAAMW,GAExB,IAAK,GADD9B,MACK5D,EAAI,EAAGjB,EAASW,EAAUqF,GAAWhG,EAAJiB,EAAYA,IAChD0F,EACF9B,EAAOmB,EAAK/E,IAAM0F,EAAO1F,GAEzB4D,EAAOmB,EAAK/E,GAAG,IAAM+E,EAAK/E,GAAG,EAGjC,OAAO4D,IAiBTxE,EAAEuF,UAAYrF,EAA2B,GACzCF,EAAEyK,cAAgBvK,GAA4B,GAI9CF,EAAES,YAAc,SAASN,EAAOb,EAAKC,EAAUM,GAC7CN,EAAWc,EAAGd,EAAUM,EAAS,EAGjC,KAFA,GAAI0D,GAAQhE,EAASD,GACjBoL,EAAM,EAAGC,EAAOrK,EAAUH,GACjBwK,EAAND,GAAY,CACjB,GAAIE,GAAM/J,KAAKgK,OAAOH,EAAMC,GAAQ,EAChCpL,GAASY,EAAMyK,IAAQrH,EAAOmH,EAAME,EAAM,EAAQD,EAAOC,EAE/D,MAAOF,IAgCT1K,EAAEuG,QAAUhG,EAAkB,EAAGP,EAAEuF,UAAWvF,EAAES,aAChDT,EAAE8K,YAAcvK,GAAmB,EAAGP,EAAEyK,eAKxCzK,EAAE+K,MAAQ,SAASC,EAAOC,EAAMC,GAClB,MAARD,IACFA,EAAOD,GAAS,EAChBA,EAAQ,GAEVE,EAAOA,GAAQ,CAKf,KAAK,GAHDvL,GAASkB,KAAKC,IAAID,KAAKsK,MAAMF,EAAOD,GAASE,GAAO,GACpDH,EAAQ5I,MAAMxC,GAETgB,EAAM,EAAShB,EAANgB,EAAcA,IAAOqK,GAASE,EAC9CH,EAAMpK,GAAOqK,CAGf,OAAOD,GAQT,IAAIK,GAAe,SAASC,EAAYC,EAAWzL,EAAS0L,EAAgB7E,GAC1E,KAAM6E,YAA0BD,IAAY,MAAOD,GAAW1H,MAAM9D,EAAS6G,EAC7E,IAAI8E,GAAOjH,EAAW8G,EAAW5J,WAC7B+C,EAAS6G,EAAW1H,MAAM6H,EAAM9E,EACpC,OAAI1G,GAAE6D,SAASW,GAAgBA,EACxBgH,EAMTxL,GAAE6C,KAAO,SAASQ,EAAMxD,GACtB,GAAI+C,GAAcS,EAAKR,OAASD,EAAY,MAAOA,GAAWe,MAAMN,EAAMrC,EAAMC,KAAKhB,UAAW,GAChG,KAAKD,EAAEwB,WAAW6B,GAAO,KAAM,IAAIoI,WAAU,oCAC7C,IAAI/E,GAAO1F,EAAMC,KAAKhB,UAAW,GAC7ByL,EAAQ,WACV,MAAON,GAAa/H,EAAMqI,EAAO7L,EAASmC,KAAM0E,EAAKiF,OAAO3K,EAAMC,KAAKhB,aAEzE,OAAOyL,IAMT1L,EAAE4L,QAAU,SAASvI,GACnB,GAAIwI,GAAY7K,EAAMC,KAAKhB,UAAW,GAClCyL,EAAQ,WAGV,IAAK,GAFDI,GAAW,EAAGnM,EAASkM,EAAUlM,OACjC+G,EAAOvE,MAAMxC,GACRiB,EAAI,EAAOjB,EAAJiB,EAAYA,IAC1B8F,EAAK9F,GAAKiL,EAAUjL,KAAOZ,EAAIC,UAAU6L,KAAcD,EAAUjL,EAEnE,MAAOkL,EAAW7L,UAAUN,QAAQ+G,EAAK5E,KAAK7B,UAAU6L,KACxD,OAAOV,GAAa/H,EAAMqI,EAAO1J,KAAMA,KAAM0E,GAE/C,OAAOgF,IAMT1L,EAAE+L,QAAU,SAASzM,GACnB,GAAIsB,GAA8B0D,EAA3B3E,EAASM,UAAUN,MAC1B,IAAc,GAAVA,EAAa,KAAM,IAAIqM,OAAM,wCACjC,KAAKpL,EAAI,EAAOjB,EAAJiB,EAAYA,IACtB0D,EAAMrE,UAAUW,GAChBtB,EAAIgF,GAAOtE,EAAE6C,KAAKvD,EAAIgF,GAAMhF,EAE9B,OAAOA,IAITU,EAAEiM,QAAU,SAAS5I,EAAM6I,GACzB,GAAID,GAAU,SAAS3H,GACrB,GAAI6H,GAAQF,EAAQE,MAChBC,EAAU,IAAMF,EAASA,EAAOvI,MAAM3B,KAAM/B,WAAaqE,EAE7D,OADKtE,GAAE4B,IAAIuK,EAAOC,KAAUD,EAAMC,GAAW/I,EAAKM,MAAM3B,KAAM/B,YACvDkM,EAAMC,GAGf,OADAH,GAAQE,SACDF,GAKTjM,EAAEqM,MAAQ,SAAShJ,EAAMiJ,GACvB,GAAI5F,GAAO1F,EAAMC,KAAKhB,UAAW,EACjC,OAAOsM,YAAW,WAChB,MAAOlJ,GAAKM,MAAM,KAAM+C,IACvB4F,IAKLtM,EAAEwM,MAAQxM,EAAE4L,QAAQ5L,EAAEqM,MAAOrM,EAAG,GAOhCA,EAAEyM,SAAW,SAASpJ,EAAMiJ,EAAMI,GAChC,GAAI7M,GAAS6G,EAAMlC,EACfmI,EAAU,KACVC,EAAW,CACVF,KAASA,KACd,IAAIG,GAAQ,WACVD,EAAWF,EAAQI,WAAY,EAAQ,EAAI9M,EAAE+M,MAC7CJ,EAAU,KACVnI,EAASnB,EAAKM,MAAM9D,EAAS6G,GACxBiG,IAAS9M,EAAU6G,EAAO,MAEjC,OAAO,YACL,GAAIqG,GAAM/M,EAAE+M,KACPH,IAAYF,EAAQI,WAAY,IAAOF,EAAWG,EACvD,IAAIC,GAAYV,GAAQS,EAAMH,EAc9B,OAbA/M,GAAUmC,KACV0E,EAAOzG,UACU,GAAb+M,GAAkBA,EAAYV,GAC5BK,IACFM,aAAaN,GACbA,EAAU,MAEZC,EAAWG,EACXvI,EAASnB,EAAKM,MAAM9D,EAAS6G,GACxBiG,IAAS9M,EAAU6G,EAAO,OACrBiG,GAAWD,EAAQQ,YAAa,IAC1CP,EAAUJ,WAAWM,EAAOG,IAEvBxI,IAQXxE,EAAEmN,SAAW,SAAS9J,EAAMiJ,EAAMc,GAChC,GAAIT,GAASjG,EAAM7G,EAASwN,EAAW7I,EAEnCqI,EAAQ,WACV,GAAI/D,GAAO9I,EAAE+M,MAAQM,CAEVf,GAAPxD,GAAeA,GAAQ,EACzB6D,EAAUJ,WAAWM,EAAOP,EAAOxD,IAEnC6D,EAAU,KACLS,IACH5I,EAASnB,EAAKM,MAAM9D,EAAS6G,GACxBiG,IAAS9M,EAAU6G,EAAO,QAKrC,OAAO,YACL7G,EAAUmC,KACV0E,EAAOzG,UACPoN,EAAYrN,EAAE+M,KACd,IAAIO,GAAUF,IAAcT,CAO5B,OANKA,KAASA,EAAUJ,WAAWM,EAAOP,IACtCgB,IACF9I,EAASnB,EAAKM,MAAM9D,EAAS6G,GAC7B7G,EAAU6G,EAAO,MAGZlC,IAOXxE,EAAEuN,KAAO,SAASlK,EAAMmK,GACtB,MAAOxN,GAAE4L,QAAQ4B,EAASnK,IAI5BrD,EAAE6F,OAAS,SAASzF,GAClB,MAAO,YACL,OAAQA,EAAUuD,MAAM3B,KAAM/B,aAMlCD,EAAEyN,QAAU,WACV,GAAI/G,GAAOzG,UACP+K,EAAQtE,EAAK/G,OAAS,CAC1B,OAAO,YAGL,IAFA,GAAIiB,GAAIoK,EACJxG,EAASkC,EAAKsE,GAAOrH,MAAM3B,KAAM/B,WAC9BW,KAAK4D,EAASkC,EAAK9F,GAAGK,KAAKe,KAAMwC,EACxC,OAAOA,KAKXxE,EAAE0N,MAAQ,SAASC,EAAOtK,GACxB,MAAO,YACL,QAAMsK,EAAQ,EACLtK,EAAKM,MAAM3B,KAAM/B,WAD1B,SAOJD,EAAE4N,OAAS,SAASD,EAAOtK,GACzB,GAAI7D,EACJ,OAAO,YAKL,QAJMmO,EAAQ,IACZnO,EAAO6D,EAAKM,MAAM3B,KAAM/B,YAEb,GAAT0N,IAAYtK,EAAO,MAChB7D,IAMXQ,EAAE6N,KAAO7N,EAAE4L,QAAQ5L,EAAE4N,OAAQ,EAM7B,IAAIE,KAAevL,SAAU,MAAMwL,qBAAqB,YACpD1M,GAAsB,UAAW,gBAAiB,WAClC,uBAAwB,iBAAkB,iBAqB9DrB,GAAEP,KAAO,SAASH,GAChB,IAAKU,EAAE6D,SAASvE,GAAM,QACtB,IAAIqD,EAAY,MAAOA,GAAWrD,EAClC,IAAIG,KACJ,KAAK,GAAI6E,KAAOhF,GAASU,EAAE4B,IAAItC,EAAKgF,IAAM7E,EAAKqC,KAAKwC,EAGpD,OADIwJ,IAAY3M,EAAoB7B,EAAKG,GAClCA,GAITO,EAAEgO,QAAU,SAAS1O,GACnB,IAAKU,EAAE6D,SAASvE,GAAM,QACtB,IAAIG,KACJ,KAAK,GAAI6E,KAAOhF,GAAKG,EAAKqC,KAAKwC,EAG/B,OADIwJ,IAAY3M,EAAoB7B,EAAKG,GAClCA,GAITO,EAAEsG,OAAS,SAAShH,GAIlB,IAAK,GAHDG,GAAOO,EAAEP,KAAKH,GACdK,EAASF,EAAKE,OACd2G,EAASnE,MAAMxC,GACViB,EAAI,EAAOjB,EAAJiB,EAAYA,IAC1B0F,EAAO1F,GAAKtB,EAAIG,EAAKmB,GAEvB,OAAO0F,IAKTtG,EAAEiO,UAAY,SAAS3O,EAAKC,EAAUM,GACpCN,EAAWc,EAAGd,EAAUM,EAKtB,KAAK,GADDD,GAHFH,EAAQO,EAAEP,KAAKH,GACbK,EAASF,EAAKE,OACdoF,KAEKrF,EAAQ,EAAWC,EAARD,EAAgBA,IAClCE,EAAaH,EAAKC,GAClBqF,EAAQnF,GAAcL,EAASD,EAAIM,GAAaA,EAAYN,EAE9D,OAAOyF,IAIX/E,EAAEkO,MAAQ,SAAS5O,GAIjB,IAAK,GAHDG,GAAOO,EAAEP,KAAKH,GACdK,EAASF,EAAKE,OACduO,EAAQ/L,MAAMxC,GACTiB,EAAI,EAAOjB,EAAJiB,EAAYA,IAC1BsN,EAAMtN,IAAMnB,EAAKmB,GAAItB,EAAIG,EAAKmB,IAEhC,OAAOsN,IAITlO,EAAEmO,OAAS,SAAS7O,GAGlB,IAAK,GAFDkF,MACA/E,EAAOO,EAAEP,KAAKH,GACTsB,EAAI,EAAGjB,EAASF,EAAKE,OAAYA,EAAJiB,EAAYA,IAChD4D,EAAOlF,EAAIG,EAAKmB,KAAOnB,EAAKmB,EAE9B,OAAO4D,IAKTxE,EAAEoO,UAAYpO,EAAEqO,QAAU,SAAS/O,GACjC,GAAIgP,KACJ,KAAK,GAAIhK,KAAOhF,GACVU,EAAEwB,WAAWlC,EAAIgF,KAAOgK,EAAMxM,KAAKwC,EAEzC,OAAOgK,GAAM3G,QAIf3H,EAAEuO,OAAStK,EAAejE,EAAEgO,SAI5BhO,EAAEwO,UAAYxO,EAAEyO,OAASxK,EAAejE,EAAEP,MAG1CO,EAAEwF,QAAU,SAASlG,EAAKc,EAAWP,GACnCO,EAAYC,EAAGD,EAAWP,EAE1B,KAAK,GADmByE,GAApB7E,EAAOO,EAAEP,KAAKH,GACTsB,EAAI,EAAGjB,EAASF,EAAKE,OAAYA,EAAJiB,EAAYA,IAEhD,GADA0D,EAAM7E,EAAKmB,GACPR,EAAUd,EAAIgF,GAAMA,EAAKhF,GAAM,MAAOgF,IAK9CtE,EAAE0O,KAAO,SAASlE,EAAQmE,EAAW9O,GACnC,GAA+BN,GAAUE,EAArC+E,KAAalF,EAAMkL,CACvB,IAAW,MAAPlL,EAAa,MAAOkF,EACpBxE,GAAEwB,WAAWmN,IACflP,EAAOO,EAAEgO,QAAQ1O,GACjBC,EAAWO,EAAW6O,EAAW9O,KAEjCJ,EAAO0J,EAAQlJ,WAAW,GAAO,EAAO,GACxCV,EAAW,SAASgE,EAAOe,EAAKhF,GAAO,MAAOgF,KAAOhF,IACrDA,EAAM8C,OAAO9C,GAEf,KAAK,GAAIsB,GAAI,EAAGjB,EAASF,EAAKE,OAAYA,EAAJiB,EAAYA,IAAK,CACrD,GAAI0D,GAAM7E,EAAKmB,GACX2C,EAAQjE,EAAIgF,EACZ/E,GAASgE,EAAOe,EAAKhF,KAAMkF,EAAOF,GAAOf,GAE/C,MAAOiB,IAITxE,EAAE4O,KAAO,SAAStP,EAAKC,EAAUM,GAC/B,GAAIG,EAAEwB,WAAWjC,GACfA,EAAWS,EAAE6F,OAAOtG,OACf,CACL,GAAIE,GAAOO,EAAE6E,IAAIsE,EAAQlJ,WAAW,GAAO,EAAO,GAAI4O,OACtDtP,GAAW,SAASgE,EAAOe,GACzB,OAAQtE,EAAE6B,SAASpC,EAAM6E,IAG7B,MAAOtE,GAAE0O,KAAKpP,EAAKC,EAAUM,IAI/BG,EAAE8O,SAAW7K,EAAejE,EAAEgO,SAAS,GAKvChO,EAAE+C,OAAS,SAAStB,EAAWsN,GAC7B,GAAIvK,GAASD,EAAW9C,EAExB,OADIsN,IAAO/O,EAAEwO,UAAUhK,EAAQuK,GACxBvK,GAITxE,EAAEgP,MAAQ,SAAS1P,GACjB,MAAKU,GAAE6D,SAASvE,GACTU,EAAE0C,QAAQpD,GAAOA,EAAI0B,QAAUhB,EAAEuO,UAAWjP,GADtBA,GAO/BU,EAAEiP,IAAM,SAAS3P,EAAK4P,GAEpB,MADAA,GAAY5P,GACLA,GAITU,EAAEmP,QAAU,SAAS3E,EAAQ1D,GAC3B,GAAIrH,GAAOO,EAAEP,KAAKqH,GAAQnH,EAASF,EAAKE,MACxC,IAAc,MAAV6K,EAAgB,OAAQ7K,CAE5B,KAAK,GADDL,GAAM8C,OAAOoI,GACR5J,EAAI,EAAOjB,EAAJiB,EAAYA,IAAK,CAC/B,GAAI0D,GAAM7E,EAAKmB,EACf,IAAIkG,EAAMxC,KAAShF,EAAIgF,MAAUA,IAAOhF,IAAM,OAAO,EAEvD,OAAO,EAKT,IAAI8P,GAAK,SAAStH,EAAGC,EAAGsH,EAAQC,GAG9B,GAAIxH,IAAMC,EAAG,MAAa,KAAND,GAAW,EAAIA,IAAM,EAAIC,CAE7C,IAAS,MAALD,GAAkB,MAALC,EAAW,MAAOD,KAAMC,CAErCD,aAAa9H,KAAG8H,EAAIA,EAAE7E,UACtB8E,YAAa/H,KAAG+H,EAAIA,EAAE9E,SAE1B,IAAIsM,GAAYhN,EAAStB,KAAK6G,EAC9B,IAAIyH,IAAchN,EAAStB,KAAK8G,GAAI,OAAO,CAC3C,QAAQwH,GAEN,IAAK,kBAEL,IAAK,kBAGH,MAAO,GAAKzH,GAAM,GAAKC,CACzB,KAAK,kBAGH,OAAKD,KAAOA,GAAWC,KAAOA,EAEhB,KAAND,EAAU,GAAKA,IAAM,EAAIC,GAAKD,KAAOC,CAC/C,KAAK,gBACL,IAAK,mBAIH,OAAQD,KAAOC,EAGnB,GAAIyH,GAA0B,mBAAdD,CAChB,KAAKC,EAAW,CACd,GAAgB,gBAAL1H,IAA6B,gBAALC,GAAe,OAAO,CAIzD,IAAI0H,GAAQ3H,EAAExG,YAAaoO,EAAQ3H,EAAEzG,WACrC,IAAImO,IAAUC,KAAW1P,EAAEwB,WAAWiO,IAAUA,YAAiBA,IACxCzP,EAAEwB,WAAWkO,IAAUA,YAAiBA,KACzC,eAAiB5H,IAAK,eAAiBC,GAC7D,OAAO,EAQXsH,EAASA,MACTC,EAASA,KAET,KADA,GAAI3P,GAAS0P,EAAO1P,OACbA,KAGL,GAAI0P,EAAO1P,KAAYmI,EAAG,MAAOwH,GAAO3P,KAAYoI,CAQtD,IAJAsH,EAAOvN,KAAKgG,GACZwH,EAAOxN,KAAKiG,GAGRyH,EAAW,CAGb,GADA7P,EAASmI,EAAEnI,OACPA,IAAWoI,EAAEpI,OAAQ,OAAO,CAEhC,MAAOA,KACL,IAAKyP,EAAGtH,EAAEnI,GAASoI,EAAEpI,GAAS0P,EAAQC,GAAS,OAAO,MAEnD,CAEL,GAAsBhL,GAAlB7E,EAAOO,EAAEP,KAAKqI,EAGlB,IAFAnI,EAASF,EAAKE,OAEVK,EAAEP,KAAKsI,GAAGpI,SAAWA,EAAQ,OAAO,CACxC,MAAOA,KAGL,GADA2E,EAAM7E,EAAKE,IACLK,EAAE4B,IAAImG,EAAGzD,KAAQ8K,EAAGtH,EAAExD,GAAMyD,EAAEzD,GAAM+K,EAAQC,GAAU,OAAO,EAMvE,MAFAD,GAAOM,MACPL,EAAOK,OACA,EAIT3P,GAAE4P,QAAU,SAAS9H,EAAGC,GACtB,MAAOqH,GAAGtH,EAAGC,IAKf/H,EAAE6P,QAAU,SAASvQ,GACnB,MAAW,OAAPA,GAAoB,EACpBS,EAAYT,KAASU,EAAE0C,QAAQpD,IAAQU,EAAE8P,SAASxQ,IAAQU,EAAEyJ,YAAYnK,IAA6B,IAAfA,EAAIK,OAChE,IAAvBK,EAAEP,KAAKH,GAAKK,QAIrBK,EAAE+P,UAAY,SAASzQ,GACrB,SAAUA,GAAwB,IAAjBA,EAAI0Q,WAKvBhQ,EAAE0C,QAAUD,GAAiB,SAASnD,GACpC,MAA8B,mBAAvBiD,EAAStB,KAAK3B,IAIvBU,EAAE6D,SAAW,SAASvE,GACpB,GAAI2Q,SAAc3Q,EAClB,OAAgB,aAAT2Q,GAAgC,WAATA,KAAuB3Q,GAIvDU,EAAE2E,MAAM,YAAa,WAAY,SAAU,SAAU,OAAQ,SAAU,SAAU,SAASuL,GACxFlQ,EAAE,KAAOkQ,GAAQ,SAAS5Q,GACxB,MAAOiD,GAAStB,KAAK3B,KAAS,WAAa4Q,EAAO,OAMjDlQ,EAAEyJ,YAAYxJ,aACjBD,EAAEyJ,YAAc,SAASnK,GACvB,MAAOU,GAAE4B,IAAItC,EAAK,YAMJ,kBAAP,KAAyC,gBAAb6Q,aACrCnQ,EAAEwB,WAAa,SAASlC,GACtB,MAAqB,kBAAPA,KAAqB,IAKvCU,EAAEoQ,SAAW,SAAS9Q,GACpB,MAAO8Q,UAAS9Q,KAAS4B,MAAMmP,WAAW/Q,KAI5CU,EAAEkB,MAAQ,SAAS5B,GACjB,MAAOU,GAAEsQ,SAAShR,IAAQA,KAASA,GAIrCU,EAAEiK,UAAY,SAAS3K,GACrB,MAAOA,MAAQ,GAAQA,KAAQ,GAAgC,qBAAvBiD,EAAStB,KAAK3B,IAIxDU,EAAEuQ,OAAS,SAASjR,GAClB,MAAe,QAARA,GAITU,EAAEwQ,YAAc,SAASlR,GACvB,MAAOA,SAAa,IAKtBU,EAAE4B,IAAM,SAAStC,EAAKgF,GACpB,MAAc,OAAPhF,GAAekD,EAAevB,KAAK3B,EAAKgF,IAQjDtE,EAAEyQ,WAAa,WAEb,MADA1O,GAAK/B,EAAIiC,EACFD,MAIThC,EAAE4D,SAAW,SAASL,GACpB,MAAOA,IAITvD,EAAE0Q,SAAW,SAASnN,GACpB,MAAO,YACL,MAAOA,KAIXvD,EAAE2Q,KAAO,aAET3Q,EAAE+D,SAAWA,EAGb/D,EAAE4Q,WAAa,SAAStR,GACtB,MAAc,OAAPA,EAAc,aAAe,SAASgF,GAC3C,MAAOhF,GAAIgF,KAMftE,EAAE8D,QAAU9D,EAAE6Q,QAAU,SAAS/J,GAE/B,MADAA,GAAQ9G,EAAEwO,aAAc1H,GACjB,SAASxH,GACd,MAAOU,GAAEmP,QAAQ7P,EAAKwH,KAK1B9G,EAAE2N,MAAQ,SAASnG,EAAGjI,EAAUM,GAC9B,GAAIiR,GAAQ3O,MAAMtB,KAAKC,IAAI,EAAG0G,GAC9BjI,GAAWO,EAAWP,EAAUM,EAAS,EACzC,KAAK,GAAIe,GAAI,EAAO4G,EAAJ5G,EAAOA,IAAKkQ,EAAMlQ,GAAKrB,EAASqB,EAChD,OAAOkQ,IAIT9Q,EAAEsH,OAAS,SAASvG,EAAKD,GAKvB,MAJW,OAAPA,IACFA,EAAMC,EACNA,EAAM,GAEDA,EAAMF,KAAKgK,MAAMhK,KAAKyG,UAAYxG,EAAMC,EAAM,KAIvDf,EAAE+M,IAAMgE,KAAKhE,KAAO,WAClB,OAAO,GAAIgE,OAAOC,UAIpB,IAAIC,IACFC,IAAK,QACLC,IAAK,OACLC,IAAK,OACLC,IAAK,SACLC,IAAK,SACLC,IAAK,UAEHC,EAAcxR,EAAEmO,OAAO8C,GAGvBQ,EAAgB,SAAS5M,GAC3B,GAAI6M,GAAU,SAASC,GACrB,MAAO9M,GAAI8M,IAGTvN,EAAS,MAAQpE,EAAEP,KAAKoF,GAAK+M,KAAK,KAAO,IACzCC,EAAaC,OAAO1N,GACpB2N,EAAgBD,OAAO1N,EAAQ,IACnC,OAAO,UAAS4N,GAEd,MADAA,GAAmB,MAAVA,EAAiB,GAAK,GAAKA,EAC7BH,EAAWI,KAAKD,GAAUA,EAAOE,QAAQH,EAAeL,GAAWM,GAG9EhS,GAAEmS,OAASV,EAAcR,GACzBjR,EAAEoS,SAAWX,EAAcD,GAI3BxR,EAAEwE,OAAS,SAASgG,EAAQzG,EAAUsO,GACpC,GAAI9O,GAAkB,MAAViH,MAAsB,GAAIA,EAAOzG,EAI7C,OAHIR,SAAe,KACjBA,EAAQ8O,GAEHrS,EAAEwB,WAAW+B,GAASA,EAAMtC,KAAKuJ,GAAUjH,EAKpD,IAAI+O,GAAY,CAChBtS,GAAEuS,SAAW,SAASC,GACpB,GAAIC,KAAOH,EAAY,EACvB,OAAOE,GAASA,EAASC,EAAKA,GAKhCzS,EAAE0S,kBACAC,SAAc,kBACdC,YAAc,mBACdT,OAAc,mBAMhB,IAAIU,GAAU,OAIVC,GACFxB,IAAU,IACVyB,KAAU,KACVC,KAAU,IACVC,KAAU,IACVC,SAAU,QACVC,SAAU,SAGRzB,EAAU,4BAEV0B,EAAa,SAASzB,GACxB,MAAO,KAAOmB,EAAQnB,GAOxB3R,GAAEqT,SAAW,SAASC,EAAMC,EAAUC,IAC/BD,GAAYC,IAAaD,EAAWC,GACzCD,EAAWvT,EAAE8O,YAAayE,EAAUvT,EAAE0S,iBAGtC,IAAI5O,GAAUgO,SACXyB,EAASpB,QAAUU,GAASzO,QAC5BmP,EAASX,aAAeC,GAASzO,QACjCmP,EAASZ,UAAYE,GAASzO,QAC/BwN,KAAK,KAAO,KAAM,KAGhBlS,EAAQ,EACR0E,EAAS,QACbkP,GAAKpB,QAAQpO,EAAS,SAAS6N,EAAOQ,EAAQS,EAAaD,EAAUc,GAanE,MAZArP,IAAUkP,EAAKtS,MAAMtB,EAAO+T,GAAQvB,QAAQR,EAAS0B,GACrD1T,EAAQ+T,EAAS9B,EAAMhS,OAEnBwS,EACF/N,GAAU,cAAgB+N,EAAS,iCAC1BS,EACTxO,GAAU,cAAgBwO,EAAc,uBAC/BD,IACTvO,GAAU,OAASuO,EAAW,YAIzBhB,IAETvN,GAAU,OAGLmP,EAASG,WAAUtP,EAAS,mBAAqBA,EAAS,OAE/DA,EAAS,2CACP,oDACAA,EAAS,eAEX,KACE,GAAIuP,GAAS,GAAIrR,UAASiR,EAASG,UAAY,MAAO,IAAKtP,GAC3D,MAAOwP,GAEP,KADAA,GAAExP,OAASA,EACLwP,EAGR,GAAIP,GAAW,SAASQ,GACtB,MAAOF,GAAO1S,KAAKe,KAAM6R,EAAM7T,IAI7B8T,EAAWP,EAASG,UAAY,KAGpC,OAFAL,GAASjP,OAAS,YAAc0P,EAAW,OAAS1P,EAAS,IAEtDiP,GAITrT,EAAE+T,MAAQ,SAASzU,GACjB,GAAI0U,GAAWhU,EAAEV,EAEjB,OADA0U,GAASC,QAAS,EACXD,EAUT,IAAIxP,GAAS,SAASwP,EAAU1U,GAC9B,MAAO0U,GAASC,OAASjU,EAAEV,GAAKyU,QAAUzU,EAI5CU,GAAEkU,MAAQ,SAAS5U,GACjBU,EAAE2E,KAAK3E,EAAEoO,UAAU9O,GAAM,SAAS4Q,GAChC,GAAI7M,GAAOrD,EAAEkQ,GAAQ5Q,EAAI4Q,EACzBlQ,GAAEyB,UAAUyO,GAAQ,WAClB,GAAIxJ,IAAQ1E,KAAKiB,SAEjB,OADAnB,GAAK6B,MAAM+C,EAAMzG,WACVuE,EAAOxC,KAAMqB,EAAKM,MAAM3D,EAAG0G,QAMxC1G,EAAEkU,MAAMlU,GAGRA,EAAE2E,MAAM,MAAO,OAAQ,UAAW,QAAS,OAAQ,SAAU,WAAY,SAASuL,GAChF,GAAIzJ,GAASvE,EAAWgO,EACxBlQ,GAAEyB,UAAUyO,GAAQ,WAClB,GAAI5Q,GAAM0C,KAAKiB,QAGf,OAFAwD,GAAO9C,MAAMrE,EAAKW,WACJ,UAATiQ,GAA6B,WAATA,GAAqC,IAAf5Q,EAAIK,cAAqBL,GAAI,GACrEkF,EAAOxC,KAAM1C,MAKxBU,EAAE2E,MAAM,SAAU,OAAQ,SAAU,SAASuL,GAC3C,GAAIzJ,GAASvE,EAAWgO,EACxBlQ,GAAEyB,UAAUyO,GAAQ,WAClB,MAAO1L,GAAOxC,KAAMyE,EAAO9C,MAAM3B,KAAKiB,SAAUhD,eAKpDD,EAAEyB,UAAU8B,MAAQ,WAClB,MAAOvB,MAAKiB,UAKdjD,EAAEyB,UAAU0S,QAAUnU,EAAEyB,UAAU2S,OAASpU,EAAEyB,UAAU8B,MAEvDvD,EAAEyB,UAAUc,SAAW,WACrB,MAAO,GAAKP,KAAKiB,UAUG,kBAAXoR,SAAyBA,OAAOC,KACzCD,OAAO,gBAAkB,WACvB,MAAOrU,OAGXiB,KAAKe"} \ No newline at end of file diff --git a/src/cps/static/js/libs/viewer.js b/src/cps/static/js/libs/viewer.js new file mode 100644 index 0000000..26734ca --- /dev/null +++ b/src/cps/static/js/libs/viewer.js @@ -0,0 +1,7496 @@ +/* Copyright 2016 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*globals require, chrome */ + +'use strict'; +; +var pdfjsWebLibs; +{ + pdfjsWebLibs = { pdfjsWebPDFJS: window.pdfjsDistBuildPdf }; + (function () { + (function (root, factory) { + factory(root.pdfjsWebGrabToPan = {}); + }(this, function (exports) { + function GrabToPan(options) { + this.element = options.element; + this.document = options.element.ownerDocument; + if (typeof options.ignoreTarget === 'function') { + this.ignoreTarget = options.ignoreTarget; + } + this.onActiveChanged = options.onActiveChanged; + this.activate = this.activate.bind(this); + this.deactivate = this.deactivate.bind(this); + this.toggle = this.toggle.bind(this); + this._onmousedown = this._onmousedown.bind(this); + this._onmousemove = this._onmousemove.bind(this); + this._endPan = this._endPan.bind(this); + var overlay = this.overlay = document.createElement('div'); + overlay.className = 'grab-to-pan-grabbing'; + } + GrabToPan.prototype = { + CSS_CLASS_GRAB: 'grab-to-pan-grab', + activate: function GrabToPan_activate() { + if (!this.active) { + this.active = true; + this.element.addEventListener('mousedown', this._onmousedown, true); + this.element.classList.add(this.CSS_CLASS_GRAB); + if (this.onActiveChanged) { + this.onActiveChanged(true); + } + } + }, + deactivate: function GrabToPan_deactivate() { + if (this.active) { + this.active = false; + this.element.removeEventListener('mousedown', this._onmousedown, true); + this._endPan(); + this.element.classList.remove(this.CSS_CLASS_GRAB); + if (this.onActiveChanged) { + this.onActiveChanged(false); + } + } + }, + toggle: function GrabToPan_toggle() { + if (this.active) { + this.deactivate(); + } else { + this.activate(); + } + }, + ignoreTarget: function GrabToPan_ignoreTarget(node) { + return node[matchesSelector]('a[href], a[href] *, input, textarea, button, button *, select, option'); + }, + _onmousedown: function GrabToPan__onmousedown(event) { + if (event.button !== 0 || this.ignoreTarget(event.target)) { + return; + } + if (event.originalTarget) { + try { + event.originalTarget.tagName; + } catch (e) { + return; + } + } + this.scrollLeftStart = this.element.scrollLeft; + this.scrollTopStart = this.element.scrollTop; + this.clientXStart = event.clientX; + this.clientYStart = event.clientY; + this.document.addEventListener('mousemove', this._onmousemove, true); + this.document.addEventListener('mouseup', this._endPan, true); + this.element.addEventListener('scroll', this._endPan, true); + event.preventDefault(); + event.stopPropagation(); + var focusedElement = document.activeElement; + if (focusedElement && !focusedElement.contains(event.target)) { + focusedElement.blur(); + } + }, + _onmousemove: function GrabToPan__onmousemove(event) { + this.element.removeEventListener('scroll', this._endPan, true); + if (isLeftMouseReleased(event)) { + this._endPan(); + return; + } + var xDiff = event.clientX - this.clientXStart; + var yDiff = event.clientY - this.clientYStart; + var scrollTop = this.scrollTopStart - yDiff; + var scrollLeft = this.scrollLeftStart - xDiff; + if (this.element.scrollTo) { + this.element.scrollTo({ + top: scrollTop, + left: scrollLeft, + behavior: 'instant' + }); + } else { + this.element.scrollTop = scrollTop; + this.element.scrollLeft = scrollLeft; + } + if (!this.overlay.parentNode) { + document.body.appendChild(this.overlay); + } + }, + _endPan: function GrabToPan__endPan() { + this.element.removeEventListener('scroll', this._endPan, true); + this.document.removeEventListener('mousemove', this._onmousemove, true); + this.document.removeEventListener('mouseup', this._endPan, true); + if (this.overlay.parentNode) { + this.overlay.parentNode.removeChild(this.overlay); + } + } + }; + var matchesSelector; + [ + 'webkitM', + 'mozM', + 'msM', + 'oM', + 'm' + ].some(function (prefix) { + var name = prefix + 'atches'; + if (name in document.documentElement) { + matchesSelector = name; + } + name += 'Selector'; + if (name in document.documentElement) { + matchesSelector = name; + } + return matchesSelector; + }); + var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9; + var chrome = window.chrome; + var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app); + var isSafari6plus = /Apple/.test(navigator.vendor) && /Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent); + function isLeftMouseReleased(event) { + if ('buttons' in event && isNotIEorIsIE10plus) { + return !(event.buttons & 1); + } + if (isChrome15OrOpera15plus || isSafari6plus) { + return event.which === 0; + } + } + exports.GrabToPan = GrabToPan; + })); + (function (root, factory) { + factory(root.pdfjsWebOverlayManager = {}); + }(this, function (exports) { + var OverlayManager = { + overlays: {}, + active: null, + register: function overlayManagerRegister(name, element, callerCloseMethod, canForceClose) { + return new Promise(function (resolve) { + var container; + if (!name || !element || !(container = element.parentNode)) { + throw new Error('Not enough parameters.'); + } else if (this.overlays[name]) { + throw new Error('The overlay is already registered.'); + } + this.overlays[name] = { + element: element, + container: container, + callerCloseMethod: callerCloseMethod || null, + canForceClose: canForceClose || false + }; + resolve(); + }.bind(this)); + }, + unregister: function overlayManagerUnregister(name) { + return new Promise(function (resolve) { + if (!this.overlays[name]) { + throw new Error('The overlay does not exist.'); + } else if (this.active === name) { + throw new Error('The overlay cannot be removed while it is active.'); + } + delete this.overlays[name]; + resolve(); + }.bind(this)); + }, + open: function overlayManagerOpen(name) { + return new Promise(function (resolve) { + if (!this.overlays[name]) { + throw new Error('The overlay does not exist.'); + } else if (this.active) { + if (this.overlays[name].canForceClose) { + this._closeThroughCaller(); + } else if (this.active === name) { + throw new Error('The overlay is already active.'); + } else { + throw new Error('Another overlay is currently active.'); + } + } + this.active = name; + this.overlays[this.active].element.classList.remove('hidden'); + this.overlays[this.active].container.classList.remove('hidden'); + window.addEventListener('keydown', this._keyDown); + resolve(); + }.bind(this)); + }, + close: function overlayManagerClose(name) { + return new Promise(function (resolve) { + if (!this.overlays[name]) { + throw new Error('The overlay does not exist.'); + } else if (!this.active) { + throw new Error('The overlay is currently not active.'); + } else if (this.active !== name) { + throw new Error('Another overlay is currently active.'); + } + this.overlays[this.active].container.classList.add('hidden'); + this.overlays[this.active].element.classList.add('hidden'); + this.active = null; + window.removeEventListener('keydown', this._keyDown); + resolve(); + }.bind(this)); + }, + _keyDown: function overlayManager_keyDown(evt) { + var self = OverlayManager; + if (self.active && evt.keyCode === 27) { + self._closeThroughCaller(); + evt.preventDefault(); + } + }, + _closeThroughCaller: function overlayManager_closeThroughCaller() { + if (this.overlays[this.active].callerCloseMethod) { + this.overlays[this.active].callerCloseMethod(); + } + if (this.active) { + this.close(this.active); + } + } + }; + exports.OverlayManager = OverlayManager; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFRenderingQueue = {}); + }(this, function (exports) { + var CLEANUP_TIMEOUT = 30000; + var RenderingStates = { + INITIAL: 0, + RUNNING: 1, + PAUSED: 2, + FINISHED: 3 + }; + var PDFRenderingQueue = function PDFRenderingQueueClosure() { + function PDFRenderingQueue() { + this.pdfViewer = null; + this.pdfThumbnailViewer = null; + this.onIdle = null; + this.highestPriorityPage = null; + this.idleTimeout = null; + this.printing = false; + this.isThumbnailViewEnabled = false; + } + PDFRenderingQueue.prototype = { + setViewer: function PDFRenderingQueue_setViewer(pdfViewer) { + this.pdfViewer = pdfViewer; + }, + setThumbnailViewer: function PDFRenderingQueue_setThumbnailViewer(pdfThumbnailViewer) { + this.pdfThumbnailViewer = pdfThumbnailViewer; + }, + isHighestPriority: function PDFRenderingQueue_isHighestPriority(view) { + return this.highestPriorityPage === view.renderingId; + }, + renderHighestPriority: function PDFRenderingQueue_renderHighestPriority(currentlyVisiblePages) { + if (this.idleTimeout) { + clearTimeout(this.idleTimeout); + this.idleTimeout = null; + } + if (this.pdfViewer.forceRendering(currentlyVisiblePages)) { + return; + } + if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) { + if (this.pdfThumbnailViewer.forceRendering()) { + return; + } + } + if (this.printing) { + return; + } + if (this.onIdle) { + this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT); + } + }, + getHighestPriority: function PDFRenderingQueue_getHighestPriority(visible, views, scrolledDown) { + var visibleViews = visible.views; + var numVisible = visibleViews.length; + if (numVisible === 0) { + return false; + } + for (var i = 0; i < numVisible; ++i) { + var view = visibleViews[i].view; + if (!this.isViewFinished(view)) { + return view; + } + } + if (scrolledDown) { + var nextPageIndex = visible.last.id; + if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) { + return views[nextPageIndex]; + } + } else { + var previousPageIndex = visible.first.id - 2; + if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) { + return views[previousPageIndex]; + } + } + return null; + }, + isViewFinished: function PDFRenderingQueue_isViewFinished(view) { + return view.renderingState === RenderingStates.FINISHED; + }, + renderView: function PDFRenderingQueue_renderView(view) { + var state = view.renderingState; + switch (state) { + case RenderingStates.FINISHED: + return false; + case RenderingStates.PAUSED: + this.highestPriorityPage = view.renderingId; + view.resume(); + break; + case RenderingStates.RUNNING: + this.highestPriorityPage = view.renderingId; + break; + case RenderingStates.INITIAL: + this.highestPriorityPage = view.renderingId; + var continueRendering = function () { + this.renderHighestPriority(); + }.bind(this); + view.draw().then(continueRendering, continueRendering); + break; + } + return true; + } + }; + return PDFRenderingQueue; + }(); + exports.RenderingStates = RenderingStates; + exports.PDFRenderingQueue = PDFRenderingQueue; + })); + (function (root, factory) { + factory(root.pdfjsWebPreferences = {}); + }(this, function (exports) { + var defaultPreferences = null; + function getDefaultPreferences() { + if (!defaultPreferences) { + defaultPreferences = Promise.resolve({ + "showPreviousViewOnLoad": true, + "defaultZoomValue": "", + "sidebarViewOnLoad": 0, + "enableHandToolOnLoad": false, + "enableWebGL": false, + "pdfBugEnabled": false, + "disableRange": false, + "disableStream": false, + "disableAutoFetch": false, + "disableFontFace": false, + "disableTextLayer": false, + "useOnlyCssZoom": false, + "externalLinkTarget": 0, + "enhanceTextSelection": false, + "renderer": "canvas", + "renderInteractiveForms": false, + "disablePageLabels": false + }); + } + return defaultPreferences; + } + function cloneObj(obj) { + var result = {}; + for (var i in obj) { + if (Object.prototype.hasOwnProperty.call(obj, i)) { + result[i] = obj[i]; + } + } + return result; + } + var Preferences = { + prefs: null, + isInitializedPromiseResolved: false, + initializedPromise: null, + initialize: function preferencesInitialize() { + return this.initializedPromise = getDefaultPreferences().then(function (defaults) { + Object.defineProperty(this, 'defaults', { + value: Object.freeze(defaults), + writable: false, + enumerable: true, + configurable: false + }); + this.prefs = cloneObj(defaults); + return this._readFromStorage(defaults); + }.bind(this)).then(function (prefObj) { + this.isInitializedPromiseResolved = true; + if (prefObj) { + this.prefs = prefObj; + } + }.bind(this)); + }, + _writeToStorage: function preferences_writeToStorage(prefObj) { + return Promise.resolve(); + }, + _readFromStorage: function preferences_readFromStorage(prefObj) { + return Promise.resolve(); + }, + reset: function preferencesReset() { + return this.initializedPromise.then(function () { + this.prefs = cloneObj(this.defaults); + return this._writeToStorage(this.defaults); + }.bind(this)); + }, + reload: function preferencesReload() { + return this.initializedPromise.then(function () { + this._readFromStorage(this.defaults).then(function (prefObj) { + if (prefObj) { + this.prefs = prefObj; + } + }.bind(this)); + }.bind(this)); + }, + set: function preferencesSet(name, value) { + return this.initializedPromise.then(function () { + if (this.defaults[name] === undefined) { + throw new Error('preferencesSet: \'' + name + '\' is undefined.'); + } else if (value === undefined) { + throw new Error('preferencesSet: no value is specified.'); + } + var valueType = typeof value; + var defaultType = typeof this.defaults[name]; + if (valueType !== defaultType) { + if (valueType === 'number' && defaultType === 'string') { + value = value.toString(); + } else { + throw new Error('Preferences_set: \'' + value + '\' is a \"' + valueType + '\", expected \"' + defaultType + '\".'); + } + } else { + if (valueType === 'number' && (value | 0) !== value) { + throw new Error('Preferences_set: \'' + value + '\' must be an \"integer\".'); + } + } + this.prefs[name] = value; + return this._writeToStorage(this.prefs); + }.bind(this)); + }, + get: function preferencesGet(name) { + return this.initializedPromise.then(function () { + var defaultValue = this.defaults[name]; + if (defaultValue === undefined) { + throw new Error('preferencesGet: \'' + name + '\' is undefined.'); + } else { + var prefValue = this.prefs[name]; + if (prefValue !== undefined) { + return prefValue; + } + } + return defaultValue; + }.bind(this)); + } + }; + Preferences._writeToStorage = function (prefObj) { + return new Promise(function (resolve) { + localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj)); + resolve(); + }); + }; + Preferences._readFromStorage = function (prefObj) { + return new Promise(function (resolve) { + var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences')); + resolve(readPrefs); + }); + }; + exports.Preferences = Preferences; + })); + (function (root, factory) { + factory(root.pdfjsWebViewHistory = {}); + }(this, function (exports) { + var DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20; + var ViewHistory = function ViewHistoryClosure() { + function ViewHistory(fingerprint, cacheSize) { + this.fingerprint = fingerprint; + this.cacheSize = cacheSize || DEFAULT_VIEW_HISTORY_CACHE_SIZE; + this.isInitializedPromiseResolved = false; + this.initializedPromise = this._readFromStorage().then(function (databaseStr) { + this.isInitializedPromiseResolved = true; + var database = JSON.parse(databaseStr || '{}'); + if (!('files' in database)) { + database.files = []; + } + if (database.files.length >= this.cacheSize) { + database.files.shift(); + } + var index; + for (var i = 0, length = database.files.length; i < length; i++) { + var branch = database.files[i]; + if (branch.fingerprint === this.fingerprint) { + index = i; + break; + } + } + if (typeof index !== 'number') { + index = database.files.push({ fingerprint: this.fingerprint }) - 1; + } + this.file = database.files[index]; + this.database = database; + }.bind(this)); + } + ViewHistory.prototype = { + _writeToStorage: function ViewHistory_writeToStorage() { + return new Promise(function (resolve) { + var databaseStr = JSON.stringify(this.database); + localStorage.setItem('pdfjs.history', databaseStr); + resolve(); + }.bind(this)); + }, + _readFromStorage: function ViewHistory_readFromStorage() { + return new Promise(function (resolve) { + var value = localStorage.getItem('pdfjs.history'); + if (!value) { + var databaseStr = localStorage.getItem('database'); + if (databaseStr) { + try { + var database = JSON.parse(databaseStr); + if (typeof database.files[0].fingerprint === 'string') { + localStorage.setItem('pdfjs.history', databaseStr); + localStorage.removeItem('database'); + value = databaseStr; + } + } catch (ex) { + } + } + } + resolve(value); + }); + }, + set: function ViewHistory_set(name, val) { + if (!this.isInitializedPromiseResolved) { + return; + } + this.file[name] = val; + return this._writeToStorage(); + }, + setMultiple: function ViewHistory_setMultiple(properties) { + if (!this.isInitializedPromiseResolved) { + return; + } + for (var name in properties) { + this.file[name] = properties[name]; + } + return this._writeToStorage(); + }, + get: function ViewHistory_get(name, defaultValue) { + if (!this.isInitializedPromiseResolved) { + return defaultValue; + } + return this.file[name] || defaultValue; + } + }; + return ViewHistory; + }(); + exports.ViewHistory = ViewHistory; + })); + (function (root, factory) { + factory(root.pdfjsWebDownloadManager = {}, root.pdfjsWebPDFJS); + }(this, function (exports, pdfjsLib) { + function download(blobUrl, filename) { + var a = document.createElement('a'); + if (a.click) { + a.href = blobUrl; + a.target = '_parent'; + if ('download' in a) { + a.download = filename; + } + (document.body || document.documentElement).appendChild(a); + a.click(); + a.parentNode.removeChild(a); + } else { + if (window.top === window && blobUrl.split('#')[0] === window.location.href.split('#')[0]) { + var padCharacter = blobUrl.indexOf('?') === -1 ? '?' : '&'; + blobUrl = blobUrl.replace(/#|$/, padCharacter + '$&'); + } + window.open(blobUrl, '_parent'); + } + } + function DownloadManager() { + } + DownloadManager.prototype = { + downloadUrl: function DownloadManager_downloadUrl(url, filename) { + if (!pdfjsLib.createValidAbsoluteUrl(url, 'http://example.com')) { + return; + } + download(url + '#pdfjs.action=download', filename); + }, + downloadData: function DownloadManager_downloadData(data, filename, contentType) { + if (navigator.msSaveBlob) { + return navigator.msSaveBlob(new Blob([data], { type: contentType }), filename); + } + var blobUrl = pdfjsLib.createObjectURL(data, contentType, pdfjsLib.PDFJS.disableCreateObjectURL); + download(blobUrl, filename); + }, + download: function DownloadManager_download(blob, url, filename) { + if (!URL) { + this.downloadUrl(url, filename); + return; + } + if (navigator.msSaveBlob) { + if (!navigator.msSaveBlob(blob, filename)) { + this.downloadUrl(url, filename); + } + return; + } + var blobUrl = URL.createObjectURL(blob); + download(blobUrl, filename); + } + }; + exports.DownloadManager = DownloadManager; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFAttachmentViewer = {}, root.pdfjsWebPDFJS); + }(this, function (exports, pdfjsLib) { + var PDFAttachmentViewer = function PDFAttachmentViewerClosure() { + function PDFAttachmentViewer(options) { + this.attachments = null; + this.container = options.container; + this.eventBus = options.eventBus; + this.downloadManager = options.downloadManager; + } + PDFAttachmentViewer.prototype = { + reset: function PDFAttachmentViewer_reset() { + this.attachments = null; + var container = this.container; + while (container.firstChild) { + container.removeChild(container.firstChild); + } + }, + _dispatchEvent: function PDFAttachmentViewer_dispatchEvent(attachmentsCount) { + this.eventBus.dispatch('attachmentsloaded', { + source: this, + attachmentsCount: attachmentsCount + }); + }, + _bindLink: function PDFAttachmentViewer_bindLink(button, content, filename) { + button.onclick = function downloadFile(e) { + this.downloadManager.downloadData(content, filename, ''); + return false; + }.bind(this); + }, + render: function PDFAttachmentViewer_render(params) { + var attachments = params && params.attachments || null; + var attachmentsCount = 0; + if (this.attachments) { + this.reset(); + } + this.attachments = attachments; + if (!attachments) { + this._dispatchEvent(attachmentsCount); + return; + } + var names = Object.keys(attachments).sort(function (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()); + }); + attachmentsCount = names.length; + for (var i = 0; i < attachmentsCount; i++) { + var item = attachments[names[i]]; + var filename = pdfjsLib.getFilenameFromUrl(item.filename); + var div = document.createElement('div'); + div.className = 'attachmentsItem'; + var button = document.createElement('button'); + this._bindLink(button, item.content, filename); + button.textContent = pdfjsLib.removeNullCharacters(filename); + div.appendChild(button); + this.container.appendChild(div); + } + this._dispatchEvent(attachmentsCount); + } + }; + return PDFAttachmentViewer; + }(); + exports.PDFAttachmentViewer = PDFAttachmentViewer; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFOutlineViewer = {}, root.pdfjsWebPDFJS); + }(this, function (exports, pdfjsLib) { + var PDFJS = pdfjsLib.PDFJS; + var DEFAULT_TITLE = '\u2013'; + var PDFOutlineViewer = function PDFOutlineViewerClosure() { + function PDFOutlineViewer(options) { + this.outline = null; + this.lastToggleIsShow = true; + this.container = options.container; + this.linkService = options.linkService; + this.eventBus = options.eventBus; + } + PDFOutlineViewer.prototype = { + reset: function PDFOutlineViewer_reset() { + this.outline = null; + this.lastToggleIsShow = true; + var container = this.container; + while (container.firstChild) { + container.removeChild(container.firstChild); + } + }, + _dispatchEvent: function PDFOutlineViewer_dispatchEvent(outlineCount) { + this.eventBus.dispatch('outlineloaded', { + source: this, + outlineCount: outlineCount + }); + }, + _bindLink: function PDFOutlineViewer_bindLink(element, item) { + if (item.url) { + pdfjsLib.addLinkAttributes(element, { + url: item.url, + target: item.newWindow ? PDFJS.LinkTarget.BLANK : undefined + }); + return; + } + var self = this, destination = item.dest; + element.href = self.linkService.getDestinationHash(destination); + element.onclick = function () { + if (destination) { + self.linkService.navigateTo(destination); + } + return false; + }; + }, + _setStyles: function PDFOutlineViewer_setStyles(element, item) { + var styleStr = ''; + if (item.bold) { + styleStr += 'font-weight: bold;'; + } + if (item.italic) { + styleStr += 'font-style: italic;'; + } + if (styleStr) { + element.setAttribute('style', styleStr); + } + }, + _addToggleButton: function PDFOutlineViewer_addToggleButton(div) { + var toggler = document.createElement('div'); + toggler.className = 'outlineItemToggler'; + toggler.onclick = function (event) { + event.stopPropagation(); + toggler.classList.toggle('outlineItemsHidden'); + if (event.shiftKey) { + var shouldShowAll = !toggler.classList.contains('outlineItemsHidden'); + this._toggleOutlineItem(div, shouldShowAll); + } + }.bind(this); + div.insertBefore(toggler, div.firstChild); + }, + _toggleOutlineItem: function PDFOutlineViewer_toggleOutlineItem(root, show) { + this.lastToggleIsShow = show; + var togglers = root.querySelectorAll('.outlineItemToggler'); + for (var i = 0, ii = togglers.length; i < ii; ++i) { + togglers[i].classList[show ? 'remove' : 'add']('outlineItemsHidden'); + } + }, + toggleOutlineTree: function PDFOutlineViewer_toggleOutlineTree() { + if (!this.outline) { + return; + } + this._toggleOutlineItem(this.container, !this.lastToggleIsShow); + }, + render: function PDFOutlineViewer_render(params) { + var outline = params && params.outline || null; + var outlineCount = 0; + if (this.outline) { + this.reset(); + } + this.outline = outline; + if (!outline) { + this._dispatchEvent(outlineCount); + return; + } + var fragment = document.createDocumentFragment(); + var queue = [{ + parent: fragment, + items: this.outline + }]; + var hasAnyNesting = false; + while (queue.length > 0) { + var levelData = queue.shift(); + for (var i = 0, len = levelData.items.length; i < len; i++) { + var item = levelData.items[i]; + var div = document.createElement('div'); + div.className = 'outlineItem'; + var element = document.createElement('a'); + this._bindLink(element, item); + this._setStyles(element, item); + element.textContent = pdfjsLib.removeNullCharacters(item.title) || DEFAULT_TITLE; + div.appendChild(element); + if (item.items.length > 0) { + hasAnyNesting = true; + this._addToggleButton(div); + var itemsDiv = document.createElement('div'); + itemsDiv.className = 'outlineItems'; + div.appendChild(itemsDiv); + queue.push({ + parent: itemsDiv, + items: item.items + }); + } + levelData.parent.appendChild(div); + outlineCount++; + } + } + if (hasAnyNesting) { + this.container.classList.add('outlineWithDeepNesting'); + } + this.container.appendChild(fragment); + this._dispatchEvent(outlineCount); + } + }; + return PDFOutlineViewer; + }(); + exports.PDFOutlineViewer = PDFOutlineViewer; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFSidebar = {}, root.pdfjsWebPDFRenderingQueue); + }(this, function (exports, pdfRenderingQueue) { + var RenderingStates = pdfRenderingQueue.RenderingStates; + var SidebarView = { + NONE: 0, + THUMBS: 1, + OUTLINE: 2, + ATTACHMENTS: 3 + }; + var PDFSidebar = function PDFSidebarClosure() { + function PDFSidebar(options) { + this.isOpen = false; + this.active = SidebarView.THUMBS; + this.isInitialViewSet = false; + this.onToggled = null; + this.pdfViewer = options.pdfViewer; + this.pdfThumbnailViewer = options.pdfThumbnailViewer; + this.pdfOutlineViewer = options.pdfOutlineViewer; + this.mainContainer = options.mainContainer; + this.outerContainer = options.outerContainer; + this.eventBus = options.eventBus; + this.toggleButton = options.toggleButton; + this.thumbnailButton = options.thumbnailButton; + this.outlineButton = options.outlineButton; + this.attachmentsButton = options.attachmentsButton; + this.thumbnailView = options.thumbnailView; + this.outlineView = options.outlineView; + this.attachmentsView = options.attachmentsView; + this._addEventListeners(); + } + PDFSidebar.prototype = { + reset: function PDFSidebar_reset() { + this.isInitialViewSet = false; + this.close(); + this.switchView(SidebarView.THUMBS); + this.outlineButton.disabled = false; + this.attachmentsButton.disabled = false; + }, + get visibleView() { + return this.isOpen ? this.active : SidebarView.NONE; + }, + get isThumbnailViewVisible() { + return this.isOpen && this.active === SidebarView.THUMBS; + }, + get isOutlineViewVisible() { + return this.isOpen && this.active === SidebarView.OUTLINE; + }, + get isAttachmentsViewVisible() { + return this.isOpen && this.active === SidebarView.ATTACHMENTS; + }, + setInitialView: function PDFSidebar_setInitialView(view) { + if (this.isInitialViewSet) { + return; + } + this.isInitialViewSet = true; + if (this.isOpen && view === SidebarView.NONE) { + this._dispatchEvent(); + return; + } + var isViewPreserved = view === this.visibleView; + this.switchView(view, true); + if (isViewPreserved) { + this._dispatchEvent(); + } + }, + switchView: function PDFSidebar_switchView(view, forceOpen) { + if (view === SidebarView.NONE) { + this.close(); + return; + } + var isViewChanged = view !== this.active; + var shouldForceRendering = false; + switch (view) { + case SidebarView.THUMBS: + this.thumbnailButton.classList.add('toggled'); + this.outlineButton.classList.remove('toggled'); + this.attachmentsButton.classList.remove('toggled'); + this.thumbnailView.classList.remove('hidden'); + this.outlineView.classList.add('hidden'); + this.attachmentsView.classList.add('hidden'); + if (this.isOpen && isViewChanged) { + this._updateThumbnailViewer(); + shouldForceRendering = true; + } + break; + case SidebarView.OUTLINE: + if (this.outlineButton.disabled) { + return; + } + this.thumbnailButton.classList.remove('toggled'); + this.outlineButton.classList.add('toggled'); + this.attachmentsButton.classList.remove('toggled'); + this.thumbnailView.classList.add('hidden'); + this.outlineView.classList.remove('hidden'); + this.attachmentsView.classList.add('hidden'); + break; + case SidebarView.ATTACHMENTS: + if (this.attachmentsButton.disabled) { + return; + } + this.thumbnailButton.classList.remove('toggled'); + this.outlineButton.classList.remove('toggled'); + this.attachmentsButton.classList.add('toggled'); + this.thumbnailView.classList.add('hidden'); + this.outlineView.classList.add('hidden'); + this.attachmentsView.classList.remove('hidden'); + break; + default: + console.error('PDFSidebar_switchView: "' + view + '" is an unsupported value.'); + return; + } + this.active = view | 0; + if (forceOpen && !this.isOpen) { + this.open(); + return; + } + if (shouldForceRendering) { + this._forceRendering(); + } + if (isViewChanged) { + this._dispatchEvent(); + } + }, + open: function PDFSidebar_open() { + if (this.isOpen) { + return; + } + this.isOpen = true; + this.toggleButton.classList.add('toggled'); + this.outerContainer.classList.add('sidebarMoving'); + this.outerContainer.classList.add('sidebarOpen'); + if (this.active === SidebarView.THUMBS) { + this._updateThumbnailViewer(); + } + this._forceRendering(); + this._dispatchEvent(); + }, + close: function PDFSidebar_close() { + if (!this.isOpen) { + return; + } + this.isOpen = false; + this.toggleButton.classList.remove('toggled'); + this.outerContainer.classList.add('sidebarMoving'); + this.outerContainer.classList.remove('sidebarOpen'); + this._forceRendering(); + this._dispatchEvent(); + }, + toggle: function PDFSidebar_toggle() { + if (this.isOpen) { + this.close(); + } else { + this.open(); + } + }, + _dispatchEvent: function PDFSidebar_dispatchEvent() { + this.eventBus.dispatch('sidebarviewchanged', { + source: this, + view: this.visibleView + }); + }, + _forceRendering: function PDFSidebar_forceRendering() { + if (this.onToggled) { + this.onToggled(); + } else { + this.pdfViewer.forceRendering(); + this.pdfThumbnailViewer.forceRendering(); + } + }, + _updateThumbnailViewer: function PDFSidebar_updateThumbnailViewer() { + var pdfViewer = this.pdfViewer; + var thumbnailViewer = this.pdfThumbnailViewer; + var pagesCount = pdfViewer.pagesCount; + for (var pageIndex = 0; pageIndex < pagesCount; pageIndex++) { + var pageView = pdfViewer.getPageView(pageIndex); + if (pageView && pageView.renderingState === RenderingStates.FINISHED) { + var thumbnailView = thumbnailViewer.getThumbnail(pageIndex); + thumbnailView.setImage(pageView); + } + } + thumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber); + }, + _addEventListeners: function PDFSidebar_addEventListeners() { + var self = this; + self.mainContainer.addEventListener('transitionend', function (evt) { + if (evt.target === this) { + self.outerContainer.classList.remove('sidebarMoving'); + } + }); + self.thumbnailButton.addEventListener('click', function () { + self.switchView(SidebarView.THUMBS); + }); + self.outlineButton.addEventListener('click', function () { + self.switchView(SidebarView.OUTLINE); + }); + self.outlineButton.addEventListener('dblclick', function () { + self.pdfOutlineViewer.toggleOutlineTree(); + }); + self.attachmentsButton.addEventListener('click', function () { + self.switchView(SidebarView.ATTACHMENTS); + }); + self.eventBus.on('outlineloaded', function (e) { + var outlineCount = e.outlineCount; + self.outlineButton.disabled = !outlineCount; + if (!outlineCount && self.active === SidebarView.OUTLINE) { + self.switchView(SidebarView.THUMBS); + } + }); + self.eventBus.on('attachmentsloaded', function (e) { + var attachmentsCount = e.attachmentsCount; + self.attachmentsButton.disabled = !attachmentsCount; + if (!attachmentsCount && self.active === SidebarView.ATTACHMENTS) { + self.switchView(SidebarView.THUMBS); + } + }); + self.eventBus.on('presentationmodechanged', function (e) { + if (!e.active && !e.switchInProgress && self.isThumbnailViewVisible) { + self._updateThumbnailViewer(); + } + }); + } + }; + return PDFSidebar; + }(); + exports.SidebarView = SidebarView; + exports.PDFSidebar = PDFSidebar; + })); + (function (root, factory) { + factory(root.pdfjsWebUIUtils = {}, root.pdfjsWebPDFJS); + }(this, function (exports, pdfjsLib) { + var CSS_UNITS = 96.0 / 72.0; + var DEFAULT_SCALE_VALUE = 'auto'; + var DEFAULT_SCALE = 1.0; + var MIN_SCALE = 0.25; + var MAX_SCALE = 10.0; + var UNKNOWN_SCALE = 0; + var MAX_AUTO_SCALE = 1.25; + var SCROLLBAR_PADDING = 40; + var VERTICAL_PADDING = 5; + var RendererType = { + CANVAS: 'canvas', + SVG: 'svg' + }; + var mozL10n = document.mozL10n || document.webL10n; + var PDFJS = pdfjsLib.PDFJS; + PDFJS.disableFullscreen = PDFJS.disableFullscreen === undefined ? false : PDFJS.disableFullscreen; + PDFJS.useOnlyCssZoom = PDFJS.useOnlyCssZoom === undefined ? false : PDFJS.useOnlyCssZoom; + PDFJS.maxCanvasPixels = PDFJS.maxCanvasPixels === undefined ? 16777216 : PDFJS.maxCanvasPixels; + PDFJS.disableHistory = PDFJS.disableHistory === undefined ? false : PDFJS.disableHistory; + PDFJS.disableTextLayer = PDFJS.disableTextLayer === undefined ? false : PDFJS.disableTextLayer; + PDFJS.ignoreCurrentPositionOnZoom = PDFJS.ignoreCurrentPositionOnZoom === undefined ? false : PDFJS.ignoreCurrentPositionOnZoom; + PDFJS.locale = PDFJS.locale === undefined ? navigator.language : PDFJS.locale; + function getOutputScale(ctx) { + var devicePixelRatio = window.devicePixelRatio || 1; + var backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1; + var pixelRatio = devicePixelRatio / backingStoreRatio; + return { + sx: pixelRatio, + sy: pixelRatio, + scaled: pixelRatio !== 1 + }; + } + function scrollIntoView(element, spot, skipOverflowHiddenElements) { + var parent = element.offsetParent; + if (!parent) { + console.error('offsetParent is not set -- cannot scroll'); + return; + } + var checkOverflow = skipOverflowHiddenElements || false; + var offsetY = element.offsetTop + element.clientTop; + var offsetX = element.offsetLeft + element.clientLeft; + while (parent.clientHeight === parent.scrollHeight || checkOverflow && getComputedStyle(parent).overflow === 'hidden') { + if (parent.dataset._scaleY) { + offsetY /= parent.dataset._scaleY; + offsetX /= parent.dataset._scaleX; + } + offsetY += parent.offsetTop; + offsetX += parent.offsetLeft; + parent = parent.offsetParent; + if (!parent) { + return; + } + } + if (spot) { + if (spot.top !== undefined) { + offsetY += spot.top; + } + if (spot.left !== undefined) { + offsetX += spot.left; + parent.scrollLeft = offsetX; + } + } + parent.scrollTop = offsetY; + } + function watchScroll(viewAreaElement, callback) { + var debounceScroll = function debounceScroll(evt) { + if (rAF) { + return; + } + rAF = window.requestAnimationFrame(function viewAreaElementScrolled() { + rAF = null; + var currentY = viewAreaElement.scrollTop; + var lastY = state.lastY; + if (currentY !== lastY) { + state.down = currentY > lastY; + } + state.lastY = currentY; + callback(state); + }); + }; + var state = { + down: true, + lastY: viewAreaElement.scrollTop, + _eventHandler: debounceScroll + }; + var rAF = null; + viewAreaElement.addEventListener('scroll', debounceScroll, true); + return state; + } + function parseQueryString(query) { + var parts = query.split('&'); + var params = {}; + for (var i = 0, ii = parts.length; i < ii; ++i) { + var param = parts[i].split('='); + var key = param[0].toLowerCase(); + var value = param.length > 1 ? param[1] : null; + params[decodeURIComponent(key)] = decodeURIComponent(value); + } + return params; + } + function binarySearchFirstItem(items, condition) { + var minIndex = 0; + var maxIndex = items.length - 1; + if (items.length === 0 || !condition(items[maxIndex])) { + return items.length; + } + if (condition(items[minIndex])) { + return minIndex; + } + while (minIndex < maxIndex) { + var currentIndex = minIndex + maxIndex >> 1; + var currentItem = items[currentIndex]; + if (condition(currentItem)) { + maxIndex = currentIndex; + } else { + minIndex = currentIndex + 1; + } + } + return minIndex; + } + function approximateFraction(x) { + if (Math.floor(x) === x) { + return [ + x, + 1 + ]; + } + var xinv = 1 / x; + var limit = 8; + if (xinv > limit) { + return [ + 1, + limit + ]; + } else if (Math.floor(xinv) === xinv) { + return [ + 1, + xinv + ]; + } + var x_ = x > 1 ? xinv : x; + var a = 0, b = 1, c = 1, d = 1; + while (true) { + var p = a + c, q = b + d; + if (q > limit) { + break; + } + if (x_ <= p / q) { + c = p; + d = q; + } else { + a = p; + b = q; + } + } + var result; + if (x_ - a / b < c / d - x_) { + result = x_ === x ? [ + a, + b + ] : [ + b, + a + ]; + } else { + result = x_ === x ? [ + c, + d + ] : [ + d, + c + ]; + } + return result; + } + function roundToDivide(x, div) { + var r = x % div; + return r === 0 ? x : Math.round(x - r + div); + } + function getVisibleElements(scrollEl, views, sortByVisibility) { + var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight; + var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth; + function isElementBottomBelowViewTop(view) { + var element = view.div; + var elementBottom = element.offsetTop + element.clientTop + element.clientHeight; + return elementBottom > top; + } + var visible = [], view, element; + var currentHeight, viewHeight, hiddenHeight, percentHeight; + var currentWidth, viewWidth; + var firstVisibleElementInd = views.length === 0 ? 0 : binarySearchFirstItem(views, isElementBottomBelowViewTop); + for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) { + view = views[i]; + element = view.div; + currentHeight = element.offsetTop + element.clientTop; + viewHeight = element.clientHeight; + if (currentHeight > bottom) { + break; + } + currentWidth = element.offsetLeft + element.clientLeft; + viewWidth = element.clientWidth; + if (currentWidth + viewWidth < left || currentWidth > right) { + continue; + } + hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, currentHeight + viewHeight - bottom); + percentHeight = (viewHeight - hiddenHeight) * 100 / viewHeight | 0; + visible.push({ + id: view.id, + x: currentWidth, + y: currentHeight, + view: view, + percent: percentHeight + }); + } + var first = visible[0]; + var last = visible[visible.length - 1]; + if (sortByVisibility) { + visible.sort(function (a, b) { + var pc = a.percent - b.percent; + if (Math.abs(pc) > 0.001) { + return -pc; + } + return a.id - b.id; + }); + } + return { + first: first, + last: last, + views: visible + }; + } + function noContextMenuHandler(e) { + e.preventDefault(); + } + function getPDFFileNameFromURL(url) { + var reURI = /^(?:([^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; + var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i; + var splitURI = reURI.exec(url); + var suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]); + if (suggestedFilename) { + suggestedFilename = suggestedFilename[0]; + if (suggestedFilename.indexOf('%') !== -1) { + try { + suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0]; + } catch (e) { + } + } + } + return suggestedFilename || 'document.pdf'; + } + function normalizeWheelEventDelta(evt) { + var delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY); + var angle = Math.atan2(evt.deltaY, evt.deltaX); + if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) { + delta = -delta; + } + var MOUSE_DOM_DELTA_PIXEL_MODE = 0; + var MOUSE_DOM_DELTA_LINE_MODE = 1; + var MOUSE_PIXELS_PER_LINE = 30; + var MOUSE_LINES_PER_PAGE = 30; + if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) { + delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE; + } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) { + delta /= MOUSE_LINES_PER_PAGE; + } + return delta; + } + var animationStarted = new Promise(function (resolve) { + window.requestAnimationFrame(resolve); + }); + var localized = new Promise(function (resolve, reject) { + if (!mozL10n) { + resolve(); + return; + } + if (mozL10n.getReadyState() !== 'loading') { + resolve(); + return; + } + window.addEventListener('localized', function localized(evt) { + resolve(); + }); + }); + var EventBus = function EventBusClosure() { + function EventBus() { + this._listeners = Object.create(null); + } + EventBus.prototype = { + on: function EventBus_on(eventName, listener) { + var eventListeners = this._listeners[eventName]; + if (!eventListeners) { + eventListeners = []; + this._listeners[eventName] = eventListeners; + } + eventListeners.push(listener); + }, + off: function EventBus_on(eventName, listener) { + var eventListeners = this._listeners[eventName]; + var i; + if (!eventListeners || (i = eventListeners.indexOf(listener)) < 0) { + return; + } + eventListeners.splice(i, 1); + }, + dispatch: function EventBus_dispath(eventName) { + var eventListeners = this._listeners[eventName]; + if (!eventListeners || eventListeners.length === 0) { + return; + } + var args = Array.prototype.slice.call(arguments, 1); + eventListeners.slice(0).forEach(function (listener) { + listener.apply(null, args); + }); + } + }; + return EventBus; + }(); + var ProgressBar = function ProgressBarClosure() { + function clamp(v, min, max) { + return Math.min(Math.max(v, min), max); + } + function ProgressBar(id, opts) { + this.visible = true; + this.div = document.querySelector(id + ' .progress'); + this.bar = this.div.parentNode; + this.height = opts.height || 100; + this.width = opts.width || 100; + this.units = opts.units || '%'; + this.div.style.height = this.height + this.units; + this.percent = 0; + } + ProgressBar.prototype = { + updateBar: function ProgressBar_updateBar() { + if (this._indeterminate) { + this.div.classList.add('indeterminate'); + this.div.style.width = this.width + this.units; + return; + } + this.div.classList.remove('indeterminate'); + var progressSize = this.width * this._percent / 100; + this.div.style.width = progressSize + this.units; + }, + get percent() { + return this._percent; + }, + set percent(val) { + this._indeterminate = isNaN(val); + this._percent = clamp(val, 0, 100); + this.updateBar(); + }, + setWidth: function ProgressBar_setWidth(viewer) { + if (viewer) { + var container = viewer.parentNode; + var scrollbarWidth = container.offsetWidth - viewer.offsetWidth; + if (scrollbarWidth > 0) { + this.bar.setAttribute('style', 'width: calc(100% - ' + scrollbarWidth + 'px);'); + } + } + }, + hide: function ProgressBar_hide() { + if (!this.visible) { + return; + } + this.visible = false; + this.bar.classList.add('hidden'); + document.body.classList.remove('loadingInProgress'); + }, + show: function ProgressBar_show() { + if (this.visible) { + return; + } + this.visible = true; + document.body.classList.add('loadingInProgress'); + this.bar.classList.remove('hidden'); + } + }; + return ProgressBar; + }(); + exports.CSS_UNITS = CSS_UNITS; + exports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE; + exports.DEFAULT_SCALE = DEFAULT_SCALE; + exports.MIN_SCALE = MIN_SCALE; + exports.MAX_SCALE = MAX_SCALE; + exports.UNKNOWN_SCALE = UNKNOWN_SCALE; + exports.MAX_AUTO_SCALE = MAX_AUTO_SCALE; + exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING; + exports.VERTICAL_PADDING = VERTICAL_PADDING; + exports.RendererType = RendererType; + exports.mozL10n = mozL10n; + exports.EventBus = EventBus; + exports.ProgressBar = ProgressBar; + exports.getPDFFileNameFromURL = getPDFFileNameFromURL; + exports.noContextMenuHandler = noContextMenuHandler; + exports.parseQueryString = parseQueryString; + exports.getVisibleElements = getVisibleElements; + exports.roundToDivide = roundToDivide; + exports.approximateFraction = approximateFraction; + exports.getOutputScale = getOutputScale; + exports.scrollIntoView = scrollIntoView; + exports.watchScroll = watchScroll; + exports.binarySearchFirstItem = binarySearchFirstItem; + exports.normalizeWheelEventDelta = normalizeWheelEventDelta; + exports.animationStarted = animationStarted; + exports.localized = localized; + })); + (function (root, factory) { + factory(root.pdfjsWebDOMEvents = {}, root.pdfjsWebUIUtils); + }(this, function (exports, uiUtils) { + var EventBus = uiUtils.EventBus; + function attachDOMEventsToEventBus(eventBus) { + eventBus.on('documentload', function () { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('documentload', true, true, {}); + window.dispatchEvent(event); + }); + eventBus.on('pagerendered', function (e) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('pagerendered', true, true, { + pageNumber: e.pageNumber, + cssTransform: e.cssTransform + }); + e.source.div.dispatchEvent(event); + }); + eventBus.on('textlayerrendered', function (e) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('textlayerrendered', true, true, { pageNumber: e.pageNumber }); + e.source.textLayerDiv.dispatchEvent(event); + }); + eventBus.on('pagechange', function (e) { + var event = document.createEvent('UIEvents'); + event.initUIEvent('pagechange', true, true, window, 0); + event.pageNumber = e.pageNumber; + e.source.container.dispatchEvent(event); + }); + eventBus.on('pagesinit', function (e) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('pagesinit', true, true, null); + e.source.container.dispatchEvent(event); + }); + eventBus.on('pagesloaded', function (e) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('pagesloaded', true, true, { pagesCount: e.pagesCount }); + e.source.container.dispatchEvent(event); + }); + eventBus.on('scalechange', function (e) { + var event = document.createEvent('UIEvents'); + event.initUIEvent('scalechange', true, true, window, 0); + event.scale = e.scale; + event.presetValue = e.presetValue; + e.source.container.dispatchEvent(event); + }); + eventBus.on('updateviewarea', function (e) { + var event = document.createEvent('UIEvents'); + event.initUIEvent('updateviewarea', true, true, window, 0); + event.location = e.location; + e.source.container.dispatchEvent(event); + }); + eventBus.on('find', function (e) { + if (e.source === window) { + return; + } + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('find' + e.type, true, true, { + query: e.query, + phraseSearch: e.phraseSearch, + caseSensitive: e.caseSensitive, + highlightAll: e.highlightAll, + findPrevious: e.findPrevious + }); + window.dispatchEvent(event); + }); + eventBus.on('attachmentsloaded', function (e) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('attachmentsloaded', true, true, { attachmentsCount: e.attachmentsCount }); + e.source.container.dispatchEvent(event); + }); + eventBus.on('sidebarviewchanged', function (e) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('sidebarviewchanged', true, true, { view: e.view }); + e.source.outerContainer.dispatchEvent(event); + }); + eventBus.on('pagemode', function (e) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('pagemode', true, true, { mode: e.mode }); + e.source.pdfViewer.container.dispatchEvent(event); + }); + eventBus.on('namedaction', function (e) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('namedaction', true, true, { action: e.action }); + e.source.pdfViewer.container.dispatchEvent(event); + }); + eventBus.on('presentationmodechanged', function (e) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('presentationmodechanged', true, true, { + active: e.active, + switchInProgress: e.switchInProgress + }); + window.dispatchEvent(event); + }); + eventBus.on('outlineloaded', function (e) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent('outlineloaded', true, true, { outlineCount: e.outlineCount }); + e.source.container.dispatchEvent(event); + }); + } + var globalEventBus = null; + function getGlobalEventBus() { + if (globalEventBus) { + return globalEventBus; + } + globalEventBus = new EventBus(); + attachDOMEventsToEventBus(globalEventBus); + return globalEventBus; + } + exports.attachDOMEventsToEventBus = attachDOMEventsToEventBus; + exports.getGlobalEventBus = getGlobalEventBus; + })); + (function (root, factory) { + factory(root.pdfjsWebHandTool = {}, root.pdfjsWebGrabToPan, root.pdfjsWebPreferences, root.pdfjsWebUIUtils); + }(this, function (exports, grabToPan, preferences, uiUtils) { + var GrabToPan = grabToPan.GrabToPan; + var Preferences = preferences.Preferences; + var localized = uiUtils.localized; + var HandTool = function HandToolClosure() { + function HandTool(options) { + this.container = options.container; + this.eventBus = options.eventBus; + this.wasActive = false; + this.handTool = new GrabToPan({ + element: this.container, + onActiveChanged: function (isActive) { + this.eventBus.dispatch('handtoolchanged', { isActive: isActive }); + }.bind(this) + }); + this.eventBus.on('togglehandtool', this.toggle.bind(this)); + Promise.all([ + localized, + Preferences.get('enableHandToolOnLoad') + ]).then(function resolved(values) { + if (values[1] === true) { + this.handTool.activate(); + } + }.bind(this)).catch(function rejected(reason) { + }); + this.eventBus.on('presentationmodechanged', function (e) { + if (e.switchInProgress) { + return; + } + if (e.active) { + this.enterPresentationMode(); + } else { + this.exitPresentationMode(); + } + }.bind(this)); + } + HandTool.prototype = { + get isActive() { + return !!this.handTool.active; + }, + toggle: function HandTool_toggle() { + this.handTool.toggle(); + }, + enterPresentationMode: function HandTool_enterPresentationMode() { + if (this.isActive) { + this.wasActive = true; + this.handTool.deactivate(); + } + }, + exitPresentationMode: function HandTool_exitPresentationMode() { + if (this.wasActive) { + this.wasActive = false; + this.handTool.activate(); + } + } + }; + return HandTool; + }(); + exports.HandTool = HandTool; + })); + (function (root, factory) { + factory(root.pdfjsWebPasswordPrompt = {}, root.pdfjsWebUIUtils, root.pdfjsWebOverlayManager, root.pdfjsWebPDFJS); + }(this, function (exports, uiUtils, overlayManager, pdfjsLib) { + var mozL10n = uiUtils.mozL10n; + var OverlayManager = overlayManager.OverlayManager; + var PasswordPrompt = function PasswordPromptClosure() { + function PasswordPrompt(options) { + this.overlayName = options.overlayName; + this.container = options.container; + this.label = options.label; + this.input = options.input; + this.submitButton = options.submitButton; + this.cancelButton = options.cancelButton; + this.updateCallback = null; + this.reason = null; + this.submitButton.addEventListener('click', this.verify.bind(this)); + this.cancelButton.addEventListener('click', this.close.bind(this)); + this.input.addEventListener('keydown', function (e) { + if (e.keyCode === 13) { + this.verify(); + } + }.bind(this)); + OverlayManager.register(this.overlayName, this.container, this.close.bind(this), true); + } + PasswordPrompt.prototype = { + open: function PasswordPrompt_open() { + OverlayManager.open(this.overlayName).then(function () { + this.input.type = 'password'; + this.input.focus(); + var promptString = mozL10n.get('password_label', null, 'Enter the password to open this PDF file.'); + if (this.reason === pdfjsLib.PasswordResponses.INCORRECT_PASSWORD) { + promptString = mozL10n.get('password_invalid', null, 'Invalid password. Please try again.'); + } + this.label.textContent = promptString; + }.bind(this)); + }, + close: function PasswordPrompt_close() { + OverlayManager.close(this.overlayName).then(function () { + this.input.value = ''; + this.input.type = ''; + }.bind(this)); + }, + verify: function PasswordPrompt_verify() { + var password = this.input.value; + if (password && password.length > 0) { + this.close(); + return this.updateCallback(password); + } + }, + setUpdateCallback: function PasswordPrompt_setUpdateCallback(updateCallback, reason) { + this.updateCallback = updateCallback; + this.reason = reason; + } + }; + return PasswordPrompt; + }(); + exports.PasswordPrompt = PasswordPrompt; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFDocumentProperties = {}, root.pdfjsWebUIUtils, root.pdfjsWebOverlayManager); + }(this, function (exports, uiUtils, overlayManager) { + var getPDFFileNameFromURL = uiUtils.getPDFFileNameFromURL; + var mozL10n = uiUtils.mozL10n; + var OverlayManager = overlayManager.OverlayManager; + var PDFDocumentProperties = function PDFDocumentPropertiesClosure() { + function PDFDocumentProperties(options) { + this.fields = options.fields; + this.overlayName = options.overlayName; + this.container = options.container; + this.rawFileSize = 0; + this.url = null; + this.pdfDocument = null; + if (options.closeButton) { + options.closeButton.addEventListener('click', this.close.bind(this)); + } + this.dataAvailablePromise = new Promise(function (resolve) { + this.resolveDataAvailable = resolve; + }.bind(this)); + OverlayManager.register(this.overlayName, this.container, this.close.bind(this)); + } + PDFDocumentProperties.prototype = { + open: function PDFDocumentProperties_open() { + Promise.all([ + OverlayManager.open(this.overlayName), + this.dataAvailablePromise + ]).then(function () { + this._getProperties(); + }.bind(this)); + }, + close: function PDFDocumentProperties_close() { + OverlayManager.close(this.overlayName); + }, + setFileSize: function PDFDocumentProperties_setFileSize(fileSize) { + if (fileSize > 0) { + this.rawFileSize = fileSize; + } + }, + setDocumentAndUrl: function PDFDocumentProperties_setDocumentAndUrl(pdfDocument, url) { + this.pdfDocument = pdfDocument; + this.url = url; + this.resolveDataAvailable(); + }, + _getProperties: function PDFDocumentProperties_getProperties() { + if (!OverlayManager.active) { + return; + } + this.pdfDocument.getDownloadInfo().then(function (data) { + if (data.length === this.rawFileSize) { + return; + } + this.setFileSize(data.length); + this._updateUI(this.fields['fileSize'], this._parseFileSize()); + }.bind(this)); + this.pdfDocument.getMetadata().then(function (data) { + var content = { + 'fileName': getPDFFileNameFromURL(this.url), + 'fileSize': this._parseFileSize(), + 'title': data.info.Title, + 'author': data.info.Author, + 'subject': data.info.Subject, + 'keywords': data.info.Keywords, + 'creationDate': this._parseDate(data.info.CreationDate), + 'modificationDate': this._parseDate(data.info.ModDate), + 'creator': data.info.Creator, + 'producer': data.info.Producer, + 'version': data.info.PDFFormatVersion, + 'pageCount': this.pdfDocument.numPages + }; + for (var identifier in content) { + this._updateUI(this.fields[identifier], content[identifier]); + } + }.bind(this)); + }, + _updateUI: function PDFDocumentProperties_updateUI(field, content) { + if (field && content !== undefined && content !== '') { + field.textContent = content; + } + }, + _parseFileSize: function PDFDocumentProperties_parseFileSize() { + var fileSize = this.rawFileSize, kb = fileSize / 1024; + if (!kb) { + return; + } else if (kb < 1024) { + return mozL10n.get('document_properties_kb', { + size_kb: (+kb.toPrecision(3)).toLocaleString(), + size_b: fileSize.toLocaleString() + }, '{{size_kb}} KB ({{size_b}} bytes)'); + } + return mozL10n.get('document_properties_mb', { + size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(), + size_b: fileSize.toLocaleString() + }, '{{size_mb}} MB ({{size_b}} bytes)'); + }, + _parseDate: function PDFDocumentProperties_parseDate(inputDate) { + var dateToParse = inputDate; + if (dateToParse === undefined) { + return ''; + } + if (dateToParse.substring(0, 2) === 'D:') { + dateToParse = dateToParse.substring(2); + } + var year = parseInt(dateToParse.substring(0, 4), 10); + var month = parseInt(dateToParse.substring(4, 6), 10) - 1; + var day = parseInt(dateToParse.substring(6, 8), 10); + var hours = parseInt(dateToParse.substring(8, 10), 10); + var minutes = parseInt(dateToParse.substring(10, 12), 10); + var seconds = parseInt(dateToParse.substring(12, 14), 10); + var utRel = dateToParse.substring(14, 15); + var offsetHours = parseInt(dateToParse.substring(15, 17), 10); + var offsetMinutes = parseInt(dateToParse.substring(18, 20), 10); + if (utRel === '-') { + hours += offsetHours; + minutes += offsetMinutes; + } else if (utRel === '+') { + hours -= offsetHours; + minutes -= offsetMinutes; + } + var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds)); + var dateString = date.toLocaleDateString(); + var timeString = date.toLocaleTimeString(); + return mozL10n.get('document_properties_date_string', { + date: dateString, + time: timeString + }, '{{date}}, {{time}}'); + } + }; + return PDFDocumentProperties; + }(); + exports.PDFDocumentProperties = PDFDocumentProperties; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFFindController = {}, root.pdfjsWebUIUtils); + }(this, function (exports, uiUtils) { + var scrollIntoView = uiUtils.scrollIntoView; + var FindStates = { + FIND_FOUND: 0, + FIND_NOTFOUND: 1, + FIND_WRAPPED: 2, + FIND_PENDING: 3 + }; + var FIND_SCROLL_OFFSET_TOP = -50; + var FIND_SCROLL_OFFSET_LEFT = -400; + var CHARACTERS_TO_NORMALIZE = { + '\u2018': '\'', + '\u2019': '\'', + '\u201A': '\'', + '\u201B': '\'', + '\u201C': '"', + '\u201D': '"', + '\u201E': '"', + '\u201F': '"', + '\u00BC': '1/4', + '\u00BD': '1/2', + '\u00BE': '3/4' + }; + var PDFFindController = function PDFFindControllerClosure() { + function PDFFindController(options) { + this.pdfViewer = options.pdfViewer || null; + this.onUpdateResultsCount = null; + this.onUpdateState = null; + this.reset(); + var replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(''); + this.normalizationRegex = new RegExp('[' + replace + ']', 'g'); + } + PDFFindController.prototype = { + reset: function PDFFindController_reset() { + this.startedTextExtraction = false; + this.extractTextPromises = []; + this.pendingFindMatches = Object.create(null); + this.active = false; + this.pageContents = []; + this.pageMatches = []; + this.pageMatchesLength = null; + this.matchCount = 0; + this.selected = { + pageIdx: -1, + matchIdx: -1 + }; + this.offset = { + pageIdx: null, + matchIdx: null + }; + this.pagesToSearch = null; + this.resumePageIdx = null; + this.state = null; + this.dirtyMatch = false; + this.findTimeout = null; + this.firstPagePromise = new Promise(function (resolve) { + this.resolveFirstPage = resolve; + }.bind(this)); + }, + normalize: function PDFFindController_normalize(text) { + return text.replace(this.normalizationRegex, function (ch) { + return CHARACTERS_TO_NORMALIZE[ch]; + }); + }, + _prepareMatches: function PDFFindController_prepareMatches(matchesWithLength, matches, matchesLength) { + function isSubTerm(matchesWithLength, currentIndex) { + var currentElem, prevElem, nextElem; + currentElem = matchesWithLength[currentIndex]; + nextElem = matchesWithLength[currentIndex + 1]; + if (currentIndex < matchesWithLength.length - 1 && currentElem.match === nextElem.match) { + currentElem.skipped = true; + return true; + } + for (var i = currentIndex - 1; i >= 0; i--) { + prevElem = matchesWithLength[i]; + if (prevElem.skipped) { + continue; + } + if (prevElem.match + prevElem.matchLength < currentElem.match) { + break; + } + if (prevElem.match + prevElem.matchLength >= currentElem.match + currentElem.matchLength) { + currentElem.skipped = true; + return true; + } + } + return false; + } + var i, len; + matchesWithLength.sort(function (a, b) { + return a.match === b.match ? a.matchLength - b.matchLength : a.match - b.match; + }); + for (i = 0, len = matchesWithLength.length; i < len; i++) { + if (isSubTerm(matchesWithLength, i)) { + continue; + } + matches.push(matchesWithLength[i].match); + matchesLength.push(matchesWithLength[i].matchLength); + } + }, + calcFindPhraseMatch: function PDFFindController_calcFindPhraseMatch(query, pageIndex, pageContent) { + var matches = []; + var queryLen = query.length; + var matchIdx = -queryLen; + while (true) { + matchIdx = pageContent.indexOf(query, matchIdx + queryLen); + if (matchIdx === -1) { + break; + } + matches.push(matchIdx); + } + this.pageMatches[pageIndex] = matches; + }, + calcFindWordMatch: function PDFFindController_calcFindWordMatch(query, pageIndex, pageContent) { + var matchesWithLength = []; + var queryArray = query.match(/\S+/g); + var subquery, subqueryLen, matchIdx; + for (var i = 0, len = queryArray.length; i < len; i++) { + subquery = queryArray[i]; + subqueryLen = subquery.length; + matchIdx = -subqueryLen; + while (true) { + matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen); + if (matchIdx === -1) { + break; + } + matchesWithLength.push({ + match: matchIdx, + matchLength: subqueryLen, + skipped: false + }); + } + } + if (!this.pageMatchesLength) { + this.pageMatchesLength = []; + } + this.pageMatchesLength[pageIndex] = []; + this.pageMatches[pageIndex] = []; + this._prepareMatches(matchesWithLength, this.pageMatches[pageIndex], this.pageMatchesLength[pageIndex]); + }, + calcFindMatch: function PDFFindController_calcFindMatch(pageIndex) { + var pageContent = this.normalize(this.pageContents[pageIndex]); + var query = this.normalize(this.state.query); + var caseSensitive = this.state.caseSensitive; + var phraseSearch = this.state.phraseSearch; + var queryLen = query.length; + if (queryLen === 0) { + return; + } + if (!caseSensitive) { + pageContent = pageContent.toLowerCase(); + query = query.toLowerCase(); + } + if (phraseSearch) { + this.calcFindPhraseMatch(query, pageIndex, pageContent); + } else { + this.calcFindWordMatch(query, pageIndex, pageContent); + } + this.updatePage(pageIndex); + if (this.resumePageIdx === pageIndex) { + this.resumePageIdx = null; + this.nextPageMatch(); + } + if (this.pageMatches[pageIndex].length > 0) { + this.matchCount += this.pageMatches[pageIndex].length; + this.updateUIResultsCount(); + } + }, + extractText: function PDFFindController_extractText() { + if (this.startedTextExtraction) { + return; + } + this.startedTextExtraction = true; + this.pageContents = []; + var extractTextPromisesResolves = []; + var numPages = this.pdfViewer.pagesCount; + for (var i = 0; i < numPages; i++) { + this.extractTextPromises.push(new Promise(function (resolve) { + extractTextPromisesResolves.push(resolve); + })); + } + var self = this; + function extractPageText(pageIndex) { + self.pdfViewer.getPageTextContent(pageIndex).then(function textContentResolved(textContent) { + var textItems = textContent.items; + var str = []; + for (var i = 0, len = textItems.length; i < len; i++) { + str.push(textItems[i].str); + } + self.pageContents.push(str.join('')); + extractTextPromisesResolves[pageIndex](pageIndex); + if (pageIndex + 1 < self.pdfViewer.pagesCount) { + extractPageText(pageIndex + 1); + } + }); + } + extractPageText(0); + }, + executeCommand: function PDFFindController_executeCommand(cmd, state) { + if (this.state === null || cmd !== 'findagain') { + this.dirtyMatch = true; + } + this.state = state; + this.updateUIState(FindStates.FIND_PENDING); + this.firstPagePromise.then(function () { + this.extractText(); + clearTimeout(this.findTimeout); + if (cmd === 'find') { + this.findTimeout = setTimeout(this.nextMatch.bind(this), 250); + } else { + this.nextMatch(); + } + }.bind(this)); + }, + updatePage: function PDFFindController_updatePage(index) { + if (this.selected.pageIdx === index) { + this.pdfViewer.currentPageNumber = index + 1; + } + var page = this.pdfViewer.getPageView(index); + if (page.textLayer) { + page.textLayer.updateMatches(); + } + }, + nextMatch: function PDFFindController_nextMatch() { + var previous = this.state.findPrevious; + var currentPageIndex = this.pdfViewer.currentPageNumber - 1; + var numPages = this.pdfViewer.pagesCount; + this.active = true; + if (this.dirtyMatch) { + this.dirtyMatch = false; + this.selected.pageIdx = this.selected.matchIdx = -1; + this.offset.pageIdx = currentPageIndex; + this.offset.matchIdx = null; + this.hadMatch = false; + this.resumePageIdx = null; + this.pageMatches = []; + this.matchCount = 0; + this.pageMatchesLength = null; + var self = this; + for (var i = 0; i < numPages; i++) { + this.updatePage(i); + if (!(i in this.pendingFindMatches)) { + this.pendingFindMatches[i] = true; + this.extractTextPromises[i].then(function (pageIdx) { + delete self.pendingFindMatches[pageIdx]; + self.calcFindMatch(pageIdx); + }); + } + } + } + if (this.state.query === '') { + this.updateUIState(FindStates.FIND_FOUND); + return; + } + if (this.resumePageIdx) { + return; + } + var offset = this.offset; + this.pagesToSearch = numPages; + if (offset.matchIdx !== null) { + var numPageMatches = this.pageMatches[offset.pageIdx].length; + if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) { + this.hadMatch = true; + offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1; + this.updateMatch(true); + return; + } + this.advanceOffsetPage(previous); + } + this.nextPageMatch(); + }, + matchesReady: function PDFFindController_matchesReady(matches) { + var offset = this.offset; + var numMatches = matches.length; + var previous = this.state.findPrevious; + if (numMatches) { + this.hadMatch = true; + offset.matchIdx = previous ? numMatches - 1 : 0; + this.updateMatch(true); + return true; + } + this.advanceOffsetPage(previous); + if (offset.wrapped) { + offset.matchIdx = null; + if (this.pagesToSearch < 0) { + this.updateMatch(false); + return true; + } + } + return false; + }, + updateMatchPosition: function PDFFindController_updateMatchPosition(pageIndex, index, elements, beginIdx) { + if (this.selected.matchIdx === index && this.selected.pageIdx === pageIndex) { + var spot = { + top: FIND_SCROLL_OFFSET_TOP, + left: FIND_SCROLL_OFFSET_LEFT + }; + scrollIntoView(elements[beginIdx], spot, true); + } + }, + nextPageMatch: function PDFFindController_nextPageMatch() { + if (this.resumePageIdx !== null) { + console.error('There can only be one pending page.'); + } + do { + var pageIdx = this.offset.pageIdx; + var matches = this.pageMatches[pageIdx]; + if (!matches) { + this.resumePageIdx = pageIdx; + break; + } + } while (!this.matchesReady(matches)); + }, + advanceOffsetPage: function PDFFindController_advanceOffsetPage(previous) { + var offset = this.offset; + var numPages = this.extractTextPromises.length; + offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1; + offset.matchIdx = null; + this.pagesToSearch--; + if (offset.pageIdx >= numPages || offset.pageIdx < 0) { + offset.pageIdx = previous ? numPages - 1 : 0; + offset.wrapped = true; + } + }, + updateMatch: function PDFFindController_updateMatch(found) { + var state = FindStates.FIND_NOTFOUND; + var wrapped = this.offset.wrapped; + this.offset.wrapped = false; + if (found) { + var previousPage = this.selected.pageIdx; + this.selected.pageIdx = this.offset.pageIdx; + this.selected.matchIdx = this.offset.matchIdx; + state = wrapped ? FindStates.FIND_WRAPPED : FindStates.FIND_FOUND; + if (previousPage !== -1 && previousPage !== this.selected.pageIdx) { + this.updatePage(previousPage); + } + } + this.updateUIState(state, this.state.findPrevious); + if (this.selected.pageIdx !== -1) { + this.updatePage(this.selected.pageIdx); + } + }, + updateUIResultsCount: function PDFFindController_updateUIResultsCount() { + if (this.onUpdateResultsCount) { + this.onUpdateResultsCount(this.matchCount); + } + }, + updateUIState: function PDFFindController_updateUIState(state, previous) { + if (this.onUpdateState) { + this.onUpdateState(state, previous, this.matchCount); + } + } + }; + return PDFFindController; + }(); + exports.FindStates = FindStates; + exports.PDFFindController = PDFFindController; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFPresentationMode = {}, root.pdfjsWebUIUtils); + }(this, function (exports, uiUtils) { + var normalizeWheelEventDelta = uiUtils.normalizeWheelEventDelta; + var DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500; + var DELAY_BEFORE_HIDING_CONTROLS = 3000; + var ACTIVE_SELECTOR = 'pdfPresentationMode'; + var CONTROLS_SELECTOR = 'pdfPresentationModeControls'; + var PDFPresentationMode = function PDFPresentationModeClosure() { + function PDFPresentationMode(options) { + this.container = options.container; + this.viewer = options.viewer || options.container.firstElementChild; + this.pdfViewer = options.pdfViewer; + this.eventBus = options.eventBus; + var contextMenuItems = options.contextMenuItems || null; + this.active = false; + this.args = null; + this.contextMenuOpen = false; + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + this.touchSwipeState = null; + if (contextMenuItems) { + contextMenuItems.contextFirstPage.addEventListener('click', function PDFPresentationMode_contextFirstPageClick(e) { + this.contextMenuOpen = false; + this.eventBus.dispatch('firstpage'); + }.bind(this)); + contextMenuItems.contextLastPage.addEventListener('click', function PDFPresentationMode_contextLastPageClick(e) { + this.contextMenuOpen = false; + this.eventBus.dispatch('lastpage'); + }.bind(this)); + contextMenuItems.contextPageRotateCw.addEventListener('click', function PDFPresentationMode_contextPageRotateCwClick(e) { + this.contextMenuOpen = false; + this.eventBus.dispatch('rotatecw'); + }.bind(this)); + contextMenuItems.contextPageRotateCcw.addEventListener('click', function PDFPresentationMode_contextPageRotateCcwClick(e) { + this.contextMenuOpen = false; + this.eventBus.dispatch('rotateccw'); + }.bind(this)); + } + } + PDFPresentationMode.prototype = { + request: function PDFPresentationMode_request() { + if (this.switchInProgress || this.active || !this.viewer.hasChildNodes()) { + return false; + } + this._addFullscreenChangeListeners(); + this._setSwitchInProgress(); + this._notifyStateChange(); + if (this.container.requestFullscreen) { + this.container.requestFullscreen(); + } else if (this.container.mozRequestFullScreen) { + this.container.mozRequestFullScreen(); + } else if (this.container.webkitRequestFullscreen) { + this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); + } else if (this.container.msRequestFullscreen) { + this.container.msRequestFullscreen(); + } else { + return false; + } + this.args = { + page: this.pdfViewer.currentPageNumber, + previousScale: this.pdfViewer.currentScaleValue + }; + return true; + }, + _mouseWheel: function PDFPresentationMode_mouseWheel(evt) { + if (!this.active) { + return; + } + evt.preventDefault(); + var delta = normalizeWheelEventDelta(evt); + var MOUSE_SCROLL_COOLDOWN_TIME = 50; + var PAGE_SWITCH_THRESHOLD = 0.1; + var currentTime = new Date().getTime(); + var storedTime = this.mouseScrollTimeStamp; + if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) { + return; + } + if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) { + this._resetMouseScrollState(); + } + this.mouseScrollDelta += delta; + if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) { + var totalDelta = this.mouseScrollDelta; + this._resetMouseScrollState(); + var success = totalDelta > 0 ? this._goToPreviousPage() : this._goToNextPage(); + if (success) { + this.mouseScrollTimeStamp = currentTime; + } + } + }, + get isFullscreen() { + return !!(document.fullscreenElement || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement); + }, + _goToPreviousPage: function PDFPresentationMode_goToPreviousPage() { + var page = this.pdfViewer.currentPageNumber; + if (page <= 1) { + return false; + } + this.pdfViewer.currentPageNumber = page - 1; + return true; + }, + _goToNextPage: function PDFPresentationMode_goToNextPage() { + var page = this.pdfViewer.currentPageNumber; + if (page >= this.pdfViewer.pagesCount) { + return false; + } + this.pdfViewer.currentPageNumber = page + 1; + return true; + }, + _notifyStateChange: function PDFPresentationMode_notifyStateChange() { + this.eventBus.dispatch('presentationmodechanged', { + source: this, + active: this.active, + switchInProgress: !!this.switchInProgress + }); + }, + _setSwitchInProgress: function PDFPresentationMode_setSwitchInProgress() { + if (this.switchInProgress) { + clearTimeout(this.switchInProgress); + } + this.switchInProgress = setTimeout(function switchInProgressTimeout() { + this._removeFullscreenChangeListeners(); + delete this.switchInProgress; + this._notifyStateChange(); + }.bind(this), DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS); + }, + _resetSwitchInProgress: function PDFPresentationMode_resetSwitchInProgress() { + if (this.switchInProgress) { + clearTimeout(this.switchInProgress); + delete this.switchInProgress; + } + }, + _enter: function PDFPresentationMode_enter() { + this.active = true; + this._resetSwitchInProgress(); + this._notifyStateChange(); + this.container.classList.add(ACTIVE_SELECTOR); + setTimeout(function enterPresentationModeTimeout() { + this.pdfViewer.currentPageNumber = this.args.page; + this.pdfViewer.currentScaleValue = 'page-fit'; + }.bind(this), 0); + this._addWindowListeners(); + this._showControls(); + this.contextMenuOpen = false; + this.container.setAttribute('contextmenu', 'viewerContextMenu'); + window.getSelection().removeAllRanges(); + }, + _exit: function PDFPresentationMode_exit() { + var page = this.pdfViewer.currentPageNumber; + this.container.classList.remove(ACTIVE_SELECTOR); + setTimeout(function exitPresentationModeTimeout() { + this.active = false; + this._removeFullscreenChangeListeners(); + this._notifyStateChange(); + this.pdfViewer.currentScaleValue = this.args.previousScale; + this.pdfViewer.currentPageNumber = page; + this.args = null; + }.bind(this), 0); + this._removeWindowListeners(); + this._hideControls(); + this._resetMouseScrollState(); + this.container.removeAttribute('contextmenu'); + this.contextMenuOpen = false; + }, + _mouseDown: function PDFPresentationMode_mouseDown(evt) { + if (this.contextMenuOpen) { + this.contextMenuOpen = false; + evt.preventDefault(); + return; + } + if (evt.button === 0) { + var isInternalLink = evt.target.href && evt.target.classList.contains('internalLink'); + if (!isInternalLink) { + evt.preventDefault(); + this.pdfViewer.currentPageNumber += evt.shiftKey ? -1 : 1; + } + } + }, + _contextMenu: function PDFPresentationMode_contextMenu() { + this.contextMenuOpen = true; + }, + _showControls: function PDFPresentationMode_showControls() { + if (this.controlsTimeout) { + clearTimeout(this.controlsTimeout); + } else { + this.container.classList.add(CONTROLS_SELECTOR); + } + this.controlsTimeout = setTimeout(function showControlsTimeout() { + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + }.bind(this), DELAY_BEFORE_HIDING_CONTROLS); + }, + _hideControls: function PDFPresentationMode_hideControls() { + if (!this.controlsTimeout) { + return; + } + clearTimeout(this.controlsTimeout); + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + }, + _resetMouseScrollState: function PDFPresentationMode_resetMouseScrollState() { + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + }, + _touchSwipe: function PDFPresentationMode_touchSwipe(evt) { + if (!this.active) { + return; + } + var SWIPE_MIN_DISTANCE_THRESHOLD = 50; + var SWIPE_ANGLE_THRESHOLD = Math.PI / 6; + if (evt.touches.length > 1) { + this.touchSwipeState = null; + return; + } + switch (evt.type) { + case 'touchstart': + this.touchSwipeState = { + startX: evt.touches[0].pageX, + startY: evt.touches[0].pageY, + endX: evt.touches[0].pageX, + endY: evt.touches[0].pageY + }; + break; + case 'touchmove': + if (this.touchSwipeState === null) { + return; + } + this.touchSwipeState.endX = evt.touches[0].pageX; + this.touchSwipeState.endY = evt.touches[0].pageY; + evt.preventDefault(); + break; + case 'touchend': + if (this.touchSwipeState === null) { + return; + } + var delta = 0; + var dx = this.touchSwipeState.endX - this.touchSwipeState.startX; + var dy = this.touchSwipeState.endY - this.touchSwipeState.startY; + var absAngle = Math.abs(Math.atan2(dy, dx)); + if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) { + delta = dx; + } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) { + delta = dy; + } + if (delta > 0) { + this._goToPreviousPage(); + } else if (delta < 0) { + this._goToNextPage(); + } + break; + } + }, + _addWindowListeners: function PDFPresentationMode_addWindowListeners() { + this.showControlsBind = this._showControls.bind(this); + this.mouseDownBind = this._mouseDown.bind(this); + this.mouseWheelBind = this._mouseWheel.bind(this); + this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this); + this.contextMenuBind = this._contextMenu.bind(this); + this.touchSwipeBind = this._touchSwipe.bind(this); + window.addEventListener('mousemove', this.showControlsBind); + window.addEventListener('mousedown', this.mouseDownBind); + window.addEventListener('wheel', this.mouseWheelBind); + window.addEventListener('keydown', this.resetMouseScrollStateBind); + window.addEventListener('contextmenu', this.contextMenuBind); + window.addEventListener('touchstart', this.touchSwipeBind); + window.addEventListener('touchmove', this.touchSwipeBind); + window.addEventListener('touchend', this.touchSwipeBind); + }, + _removeWindowListeners: function PDFPresentationMode_removeWindowListeners() { + window.removeEventListener('mousemove', this.showControlsBind); + window.removeEventListener('mousedown', this.mouseDownBind); + window.removeEventListener('wheel', this.mouseWheelBind); + window.removeEventListener('keydown', this.resetMouseScrollStateBind); + window.removeEventListener('contextmenu', this.contextMenuBind); + window.removeEventListener('touchstart', this.touchSwipeBind); + window.removeEventListener('touchmove', this.touchSwipeBind); + window.removeEventListener('touchend', this.touchSwipeBind); + delete this.showControlsBind; + delete this.mouseDownBind; + delete this.mouseWheelBind; + delete this.resetMouseScrollStateBind; + delete this.contextMenuBind; + delete this.touchSwipeBind; + }, + _fullscreenChange: function PDFPresentationMode_fullscreenChange() { + if (this.isFullscreen) { + this._enter(); + } else { + this._exit(); + } + }, + _addFullscreenChangeListeners: function PDFPresentationMode_addFullscreenChangeListeners() { + this.fullscreenChangeBind = this._fullscreenChange.bind(this); + window.addEventListener('fullscreenchange', this.fullscreenChangeBind); + window.addEventListener('mozfullscreenchange', this.fullscreenChangeBind); + window.addEventListener('webkitfullscreenchange', this.fullscreenChangeBind); + window.addEventListener('MSFullscreenChange', this.fullscreenChangeBind); + }, + _removeFullscreenChangeListeners: function PDFPresentationMode_removeFullscreenChangeListeners() { + window.removeEventListener('fullscreenchange', this.fullscreenChangeBind); + window.removeEventListener('mozfullscreenchange', this.fullscreenChangeBind); + window.removeEventListener('webkitfullscreenchange', this.fullscreenChangeBind); + window.removeEventListener('MSFullscreenChange', this.fullscreenChangeBind); + delete this.fullscreenChangeBind; + } + }; + return PDFPresentationMode; + }(); + exports.PDFPresentationMode = PDFPresentationMode; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFThumbnailView = {}, root.pdfjsWebUIUtils, root.pdfjsWebPDFRenderingQueue); + }(this, function (exports, uiUtils, pdfRenderingQueue) { + var mozL10n = uiUtils.mozL10n; + var getOutputScale = uiUtils.getOutputScale; + var RenderingStates = pdfRenderingQueue.RenderingStates; + var THUMBNAIL_WIDTH = 98; + var THUMBNAIL_CANVAS_BORDER_WIDTH = 1; + var PDFThumbnailView = function PDFThumbnailViewClosure() { + function getTempCanvas(width, height) { + var tempCanvas = PDFThumbnailView.tempImageCache; + if (!tempCanvas) { + tempCanvas = document.createElement('canvas'); + PDFThumbnailView.tempImageCache = tempCanvas; + } + tempCanvas.width = width; + tempCanvas.height = height; + tempCanvas.mozOpaque = true; + var ctx = tempCanvas.getContext('2d', { alpha: false }); + ctx.save(); + ctx.fillStyle = 'rgb(255, 255, 255)'; + ctx.fillRect(0, 0, width, height); + ctx.restore(); + return tempCanvas; + } + function PDFThumbnailView(options) { + var container = options.container; + var id = options.id; + var defaultViewport = options.defaultViewport; + var linkService = options.linkService; + var renderingQueue = options.renderingQueue; + var disableCanvasToImageConversion = options.disableCanvasToImageConversion || false; + this.id = id; + this.renderingId = 'thumbnail' + id; + this.pageLabel = null; + this.pdfPage = null; + this.rotation = 0; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this.linkService = linkService; + this.renderingQueue = renderingQueue; + this.renderTask = null; + this.renderingState = RenderingStates.INITIAL; + this.resume = null; + this.disableCanvasToImageConversion = disableCanvasToImageConversion; + this.pageWidth = this.viewport.width; + this.pageHeight = this.viewport.height; + this.pageRatio = this.pageWidth / this.pageHeight; + this.canvasWidth = THUMBNAIL_WIDTH; + this.canvasHeight = this.canvasWidth / this.pageRatio | 0; + this.scale = this.canvasWidth / this.pageWidth; + var anchor = document.createElement('a'); + anchor.href = linkService.getAnchorUrl('#page=' + id); + anchor.title = mozL10n.get('thumb_page_title', { page: id }, 'Page {{page}}'); + anchor.onclick = function stopNavigation() { + linkService.page = id; + return false; + }; + this.anchor = anchor; + var div = document.createElement('div'); + div.className = 'thumbnail'; + div.setAttribute('data-page-number', this.id); + this.div = div; + if (id === 1) { + div.classList.add('selected'); + } + var ring = document.createElement('div'); + ring.className = 'thumbnailSelectionRing'; + var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH; + ring.style.width = this.canvasWidth + borderAdjustment + 'px'; + ring.style.height = this.canvasHeight + borderAdjustment + 'px'; + this.ring = ring; + div.appendChild(ring); + anchor.appendChild(div); + container.appendChild(anchor); + } + PDFThumbnailView.prototype = { + setPdfPage: function PDFThumbnailView_setPdfPage(pdfPage) { + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + var totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport(1, totalRotation); + this.reset(); + }, + reset: function PDFThumbnailView_reset() { + this.cancelRendering(); + this.pageWidth = this.viewport.width; + this.pageHeight = this.viewport.height; + this.pageRatio = this.pageWidth / this.pageHeight; + this.canvasHeight = this.canvasWidth / this.pageRatio | 0; + this.scale = this.canvasWidth / this.pageWidth; + this.div.removeAttribute('data-loaded'); + var ring = this.ring; + var childNodes = ring.childNodes; + for (var i = childNodes.length - 1; i >= 0; i--) { + ring.removeChild(childNodes[i]); + } + var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH; + ring.style.width = this.canvasWidth + borderAdjustment + 'px'; + ring.style.height = this.canvasHeight + borderAdjustment + 'px'; + if (this.canvas) { + this.canvas.width = 0; + this.canvas.height = 0; + delete this.canvas; + } + if (this.image) { + this.image.removeAttribute('src'); + delete this.image; + } + }, + update: function PDFThumbnailView_update(rotation) { + if (typeof rotation !== 'undefined') { + this.rotation = rotation; + } + var totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: 1, + rotation: totalRotation + }); + this.reset(); + }, + cancelRendering: function PDFThumbnailView_cancelRendering() { + if (this.renderTask) { + this.renderTask.cancel(); + this.renderTask = null; + } + this.renderingState = RenderingStates.INITIAL; + this.resume = null; + }, + _getPageDrawContext: function PDFThumbnailView_getPageDrawContext(noCtxScale) { + var canvas = document.createElement('canvas'); + this.canvas = canvas; + canvas.mozOpaque = true; + var ctx = canvas.getContext('2d', { alpha: false }); + var outputScale = getOutputScale(ctx); + canvas.width = this.canvasWidth * outputScale.sx | 0; + canvas.height = this.canvasHeight * outputScale.sy | 0; + canvas.style.width = this.canvasWidth + 'px'; + canvas.style.height = this.canvasHeight + 'px'; + if (!noCtxScale && outputScale.scaled) { + ctx.scale(outputScale.sx, outputScale.sy); + } + return ctx; + }, + _convertCanvasToImage: function PDFThumbnailView_convertCanvasToImage() { + if (!this.canvas) { + return; + } + if (this.renderingState !== RenderingStates.FINISHED) { + return; + } + var id = this.renderingId; + var className = 'thumbnailImage'; + var ariaLabel = mozL10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}'); + if (this.disableCanvasToImageConversion) { + this.canvas.id = id; + this.canvas.className = className; + this.canvas.setAttribute('aria-label', ariaLabel); + this.div.setAttribute('data-loaded', true); + this.ring.appendChild(this.canvas); + return; + } + var image = document.createElement('img'); + image.id = id; + image.className = className; + image.setAttribute('aria-label', ariaLabel); + image.style.width = this.canvasWidth + 'px'; + image.style.height = this.canvasHeight + 'px'; + image.src = this.canvas.toDataURL(); + this.image = image; + this.div.setAttribute('data-loaded', true); + this.ring.appendChild(image); + this.canvas.width = 0; + this.canvas.height = 0; + delete this.canvas; + }, + draw: function PDFThumbnailView_draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error('Must be in new state before drawing'); + return Promise.resolve(undefined); + } + this.renderingState = RenderingStates.RUNNING; + var resolveRenderPromise, rejectRenderPromise; + var promise = new Promise(function (resolve, reject) { + resolveRenderPromise = resolve; + rejectRenderPromise = reject; + }); + var self = this; + function thumbnailDrawCallback(error) { + if (renderTask === self.renderTask) { + self.renderTask = null; + } + if (error === 'cancelled') { + rejectRenderPromise(error); + return; + } + self.renderingState = RenderingStates.FINISHED; + self._convertCanvasToImage(); + if (!error) { + resolveRenderPromise(undefined); + } else { + rejectRenderPromise(error); + } + } + var ctx = this._getPageDrawContext(); + var drawViewport = this.viewport.clone({ scale: this.scale }); + var renderContinueCallback = function renderContinueCallback(cont) { + if (!self.renderingQueue.isHighestPriority(self)) { + self.renderingState = RenderingStates.PAUSED; + self.resume = function resumeCallback() { + self.renderingState = RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + var renderContext = { + canvasContext: ctx, + viewport: drawViewport + }; + var renderTask = this.renderTask = this.pdfPage.render(renderContext); + renderTask.onContinue = renderContinueCallback; + renderTask.promise.then(function pdfPageRenderCallback() { + thumbnailDrawCallback(null); + }, function pdfPageRenderError(error) { + thumbnailDrawCallback(error); + }); + return promise; + }, + setImage: function PDFThumbnailView_setImage(pageView) { + if (this.renderingState !== RenderingStates.INITIAL) { + return; + } + var img = pageView.canvas; + if (!img) { + return; + } + if (!this.pdfPage) { + this.setPdfPage(pageView.pdfPage); + } + this.renderingState = RenderingStates.FINISHED; + var ctx = this._getPageDrawContext(true); + var canvas = ctx.canvas; + if (img.width <= 2 * canvas.width) { + ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height); + this._convertCanvasToImage(); + return; + } + var MAX_NUM_SCALING_STEPS = 3; + var reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS; + var reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS; + var reducedImage = getTempCanvas(reducedWidth, reducedHeight); + var reducedImageCtx = reducedImage.getContext('2d'); + while (reducedWidth > img.width || reducedHeight > img.height) { + reducedWidth >>= 1; + reducedHeight >>= 1; + } + reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight); + while (reducedWidth > 2 * canvas.width) { + reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1); + reducedWidth >>= 1; + reducedHeight >>= 1; + } + ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height); + this._convertCanvasToImage(); + }, + get pageId() { + return this.pageLabel !== null ? this.pageLabel : this.id; + }, + setPageLabel: function PDFThumbnailView_setPageLabel(label) { + this.pageLabel = typeof label === 'string' ? label : null; + this.anchor.title = mozL10n.get('thumb_page_title', { page: this.pageId }, 'Page {{page}}'); + if (this.renderingState !== RenderingStates.FINISHED) { + return; + } + var ariaLabel = mozL10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}'); + if (this.image) { + this.image.setAttribute('aria-label', ariaLabel); + } else if (this.disableCanvasToImageConversion && this.canvas) { + this.canvas.setAttribute('aria-label', ariaLabel); + } + } + }; + return PDFThumbnailView; + }(); + PDFThumbnailView.tempImageCache = null; + exports.PDFThumbnailView = PDFThumbnailView; + })); + (function (root, factory) { + factory(root.pdfjsWebSecondaryToolbar = {}, root.pdfjsWebUIUtils); + }(this, function (exports, uiUtils) { + var SCROLLBAR_PADDING = uiUtils.SCROLLBAR_PADDING; + var mozL10n = uiUtils.mozL10n; + var SecondaryToolbar = function SecondaryToolbarClosure() { + function SecondaryToolbar(options, mainContainer, eventBus) { + this.toolbar = options.toolbar; + this.toggleButton = options.toggleButton; + this.toolbarButtonContainer = options.toolbarButtonContainer; + this.buttons = [ + { + element: options.presentationModeButton, + eventName: 'presentationmode', + close: true + }, + { + element: options.openFileButton, + eventName: 'openfile', + close: true + }, + { + element: options.printButton, + eventName: 'print', + close: true + }, + { + element: options.downloadButton, + eventName: 'download', + close: true + }, + { + element: options.viewBookmarkButton, + eventName: null, + close: true + }, + { + element: options.firstPageButton, + eventName: 'firstpage', + close: true + }, + { + element: options.lastPageButton, + eventName: 'lastpage', + close: true + }, + { + element: options.pageRotateCwButton, + eventName: 'rotatecw', + close: false + }, + { + element: options.pageRotateCcwButton, + eventName: 'rotateccw', + close: false + }, + { + element: options.toggleHandToolButton, + eventName: 'togglehandtool', + close: true + }, + { + element: options.documentPropertiesButton, + eventName: 'documentproperties', + close: true + } + ]; + this.items = { + firstPage: options.firstPageButton, + lastPage: options.lastPageButton, + pageRotateCw: options.pageRotateCwButton, + pageRotateCcw: options.pageRotateCcwButton + }; + this.mainContainer = mainContainer; + this.eventBus = eventBus; + this.opened = false; + this.containerHeight = null; + this.previousContainerHeight = null; + this.reset(); + this._bindClickListeners(); + this._bindHandToolListener(options.toggleHandToolButton); + this.eventBus.on('resize', this._setMaxHeight.bind(this)); + } + SecondaryToolbar.prototype = { + get isOpen() { + return this.opened; + }, + setPageNumber: function SecondaryToolbar_setPageNumber(pageNumber) { + this.pageNumber = pageNumber; + this._updateUIState(); + }, + setPagesCount: function SecondaryToolbar_setPagesCount(pagesCount) { + this.pagesCount = pagesCount; + this._updateUIState(); + }, + reset: function SecondaryToolbar_reset() { + this.pageNumber = 0; + this.pagesCount = 0; + this._updateUIState(); + }, + _updateUIState: function SecondaryToolbar_updateUIState() { + var items = this.items; + items.firstPage.disabled = this.pageNumber <= 1; + items.lastPage.disabled = this.pageNumber >= this.pagesCount; + items.pageRotateCw.disabled = this.pagesCount === 0; + items.pageRotateCcw.disabled = this.pagesCount === 0; + }, + _bindClickListeners: function SecondaryToolbar_bindClickListeners() { + this.toggleButton.addEventListener('click', this.toggle.bind(this)); + for (var button in this.buttons) { + var element = this.buttons[button].element; + var eventName = this.buttons[button].eventName; + var close = this.buttons[button].close; + element.addEventListener('click', function (eventName, close) { + if (eventName !== null) { + this.eventBus.dispatch(eventName, { source: this }); + } + if (close) { + this.close(); + } + }.bind(this, eventName, close)); + } + }, + _bindHandToolListener: function SecondaryToolbar_bindHandToolListener(toggleHandToolButton) { + var isHandToolActive = false; + this.eventBus.on('handtoolchanged', function (e) { + if (isHandToolActive === e.isActive) { + return; + } + isHandToolActive = e.isActive; + if (isHandToolActive) { + toggleHandToolButton.title = mozL10n.get('hand_tool_disable.title', null, 'Disable hand tool'); + toggleHandToolButton.firstElementChild.textContent = mozL10n.get('hand_tool_disable_label', null, 'Disable hand tool'); + } else { + toggleHandToolButton.title = mozL10n.get('hand_tool_enable.title', null, 'Enable hand tool'); + toggleHandToolButton.firstElementChild.textContent = mozL10n.get('hand_tool_enable_label', null, 'Enable hand tool'); + } + }); + }, + open: function SecondaryToolbar_open() { + if (this.opened) { + return; + } + this.opened = true; + this._setMaxHeight(); + this.toggleButton.classList.add('toggled'); + this.toolbar.classList.remove('hidden'); + }, + close: function SecondaryToolbar_close() { + if (!this.opened) { + return; + } + this.opened = false; + this.toolbar.classList.add('hidden'); + this.toggleButton.classList.remove('toggled'); + }, + toggle: function SecondaryToolbar_toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + }, + _setMaxHeight: function SecondaryToolbar_setMaxHeight() { + if (!this.opened) { + return; + } + this.containerHeight = this.mainContainer.clientHeight; + if (this.containerHeight === this.previousContainerHeight) { + return; + } + this.toolbarButtonContainer.setAttribute('style', 'max-height: ' + (this.containerHeight - SCROLLBAR_PADDING) + 'px;'); + this.previousContainerHeight = this.containerHeight; + } + }; + return SecondaryToolbar; + }(); + exports.SecondaryToolbar = SecondaryToolbar; + })); + (function (root, factory) { + factory(root.pdfjsWebToolbar = {}, root.pdfjsWebUIUtils); + }(this, function (exports, uiUtils) { + var mozL10n = uiUtils.mozL10n; + var noContextMenuHandler = uiUtils.noContextMenuHandler; + var animationStarted = uiUtils.animationStarted; + var localized = uiUtils.localized; + var DEFAULT_SCALE_VALUE = uiUtils.DEFAULT_SCALE_VALUE; + var DEFAULT_SCALE = uiUtils.DEFAULT_SCALE; + var MIN_SCALE = uiUtils.MIN_SCALE; + var MAX_SCALE = uiUtils.MAX_SCALE; + var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading'; + var SCALE_SELECT_CONTAINER_PADDING = 8; + var SCALE_SELECT_PADDING = 22; + var Toolbar = function ToolbarClosure() { + function Toolbar(options, mainContainer, eventBus) { + this.toolbar = options.container; + this.mainContainer = mainContainer; + this.eventBus = eventBus; + this.items = options; + this._wasLocalized = false; + this.reset(); + this._bindListeners(); + } + Toolbar.prototype = { + setPageNumber: function (pageNumber, pageLabel) { + this.pageNumber = pageNumber; + this.pageLabel = pageLabel; + this._updateUIState(false); + }, + setPagesCount: function (pagesCount, hasPageLabels) { + this.pagesCount = pagesCount; + this.hasPageLabels = hasPageLabels; + this._updateUIState(true); + }, + setPageScale: function (pageScaleValue, pageScale) { + this.pageScaleValue = pageScaleValue; + this.pageScale = pageScale; + this._updateUIState(false); + }, + reset: function () { + this.pageNumber = 0; + this.pageLabel = null; + this.hasPageLabels = false; + this.pagesCount = 0; + this.pageScaleValue = DEFAULT_SCALE_VALUE; + this.pageScale = DEFAULT_SCALE; + this._updateUIState(true); + }, + _bindListeners: function Toolbar_bindClickListeners() { + var eventBus = this.eventBus; + var self = this; + var items = this.items; + items.previous.addEventListener('click', function () { + eventBus.dispatch('previouspage'); + }); + items.next.addEventListener('click', function () { + eventBus.dispatch('nextpage'); + }); + items.zoomIn.addEventListener('click', function () { + eventBus.dispatch('zoomin'); + }); + items.zoomOut.addEventListener('click', function () { + eventBus.dispatch('zoomout'); + }); + items.pageNumber.addEventListener('click', function () { + this.select(); + }); + items.pageNumber.addEventListener('change', function () { + eventBus.dispatch('pagenumberchanged', { + source: self, + value: this.value + }); + }); + items.scaleSelect.addEventListener('change', function () { + if (this.value === 'custom') { + return; + } + eventBus.dispatch('scalechanged', { + source: self, + value: this.value + }); + }); + items.presentationModeButton.addEventListener('click', function (e) { + eventBus.dispatch('presentationmode'); + }); + items.openFile.addEventListener('click', function (e) { + eventBus.dispatch('openfile'); + }); + items.print.addEventListener('click', function (e) { + eventBus.dispatch('print'); + }); + items.download.addEventListener('click', function (e) { + eventBus.dispatch('download'); + }); + items.scaleSelect.oncontextmenu = noContextMenuHandler; + localized.then(this._localized.bind(this)); + }, + _localized: function Toolbar_localized() { + this._wasLocalized = true; + this._adjustScaleWidth(); + this._updateUIState(true); + }, + _updateUIState: function Toolbar_updateUIState(resetNumPages) { + function selectScaleOption(value, scale) { + var options = items.scaleSelect.options; + var predefinedValueFound = false; + for (var i = 0, ii = options.length; i < ii; i++) { + var option = options[i]; + if (option.value !== value) { + option.selected = false; + continue; + } + option.selected = true; + predefinedValueFound = true; + } + if (!predefinedValueFound) { + var customScale = Math.round(scale * 10000) / 100; + items.customScaleOption.textContent = mozL10n.get('page_scale_percent', { scale: customScale }, '{{scale}}%'); + items.customScaleOption.selected = true; + } + } + if (!this._wasLocalized) { + return; + } + var pageNumber = this.pageNumber; + var scaleValue = (this.pageScaleValue || this.pageScale).toString(); + var scale = this.pageScale; + var items = this.items; + var pagesCount = this.pagesCount; + if (resetNumPages) { + if (this.hasPageLabels) { + items.pageNumber.type = 'text'; + } else { + items.pageNumber.type = 'number'; + items.numPages.textContent = mozL10n.get('of_pages', { pagesCount: pagesCount }, 'of {{pagesCount}}'); + } + items.pageNumber.max = pagesCount; + } + if (this.hasPageLabels) { + items.pageNumber.value = this.pageLabel; + items.numPages.textContent = mozL10n.get('page_of_pages', { + pageNumber: pageNumber, + pagesCount: pagesCount + }, '({{pageNumber}} of {{pagesCount}})'); + } else { + items.pageNumber.value = pageNumber; + } + items.previous.disabled = pageNumber <= 1; + items.next.disabled = pageNumber >= pagesCount; + items.zoomOut.disabled = scale <= MIN_SCALE; + items.zoomIn.disabled = scale >= MAX_SCALE; + selectScaleOption(scaleValue, scale); + }, + updateLoadingIndicatorState: function Toolbar_updateLoadingIndicatorState(loading) { + var pageNumberInput = this.items.pageNumber; + if (loading) { + pageNumberInput.classList.add(PAGE_NUMBER_LOADING_INDICATOR); + } else { + pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR); + } + }, + _adjustScaleWidth: function Toolbar_adjustScaleWidth() { + var container = this.items.scaleSelectContainer; + var select = this.items.scaleSelect; + animationStarted.then(function () { + if (container.clientWidth === 0) { + container.setAttribute('style', 'display: inherit;'); + } + if (container.clientWidth > 0) { + select.setAttribute('style', 'min-width: inherit;'); + var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING; + select.setAttribute('style', 'min-width: ' + (width + SCALE_SELECT_PADDING) + 'px;'); + container.setAttribute('style', 'min-width: ' + width + 'px; ' + 'max-width: ' + width + 'px;'); + } + }); + } + }; + return Toolbar; + }(); + exports.Toolbar = Toolbar; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFFindBar = {}, root.pdfjsWebUIUtils, root.pdfjsWebPDFFindController); + }(this, function (exports, uiUtils, pdfFindController) { + var mozL10n = uiUtils.mozL10n; + var FindStates = pdfFindController.FindStates; + var PDFFindBar = function PDFFindBarClosure() { + function PDFFindBar(options) { + this.opened = false; + this.bar = options.bar || null; + this.toggleButton = options.toggleButton || null; + this.findField = options.findField || null; + this.highlightAll = options.highlightAllCheckbox || null; + this.caseSensitive = options.caseSensitiveCheckbox || null; + this.findMsg = options.findMsg || null; + this.findResultsCount = options.findResultsCount || null; + this.findStatusIcon = options.findStatusIcon || null; + this.findPreviousButton = options.findPreviousButton || null; + this.findNextButton = options.findNextButton || null; + this.findController = options.findController || null; + this.eventBus = options.eventBus; + if (this.findController === null) { + throw new Error('PDFFindBar cannot be used without a ' + 'PDFFindController instance.'); + } + var self = this; + this.toggleButton.addEventListener('click', function () { + self.toggle(); + }); + this.findField.addEventListener('input', function () { + self.dispatchEvent(''); + }); + this.bar.addEventListener('keydown', function (evt) { + switch (evt.keyCode) { + case 13: + if (evt.target === self.findField) { + self.dispatchEvent('again', evt.shiftKey); + } + break; + case 27: + self.close(); + break; + } + }); + this.findPreviousButton.addEventListener('click', function () { + self.dispatchEvent('again', true); + }); + this.findNextButton.addEventListener('click', function () { + self.dispatchEvent('again', false); + }); + this.highlightAll.addEventListener('click', function () { + self.dispatchEvent('highlightallchange'); + }); + this.caseSensitive.addEventListener('click', function () { + self.dispatchEvent('casesensitivitychange'); + }); + } + PDFFindBar.prototype = { + reset: function PDFFindBar_reset() { + this.updateUIState(); + }, + dispatchEvent: function PDFFindBar_dispatchEvent(type, findPrev) { + this.eventBus.dispatch('find', { + source: this, + type: type, + query: this.findField.value, + caseSensitive: this.caseSensitive.checked, + phraseSearch: true, + highlightAll: this.highlightAll.checked, + findPrevious: findPrev + }); + }, + updateUIState: function PDFFindBar_updateUIState(state, previous, matchCount) { + var notFound = false; + var findMsg = ''; + var status = ''; + switch (state) { + case FindStates.FIND_FOUND: + break; + case FindStates.FIND_PENDING: + status = 'pending'; + break; + case FindStates.FIND_NOTFOUND: + findMsg = mozL10n.get('find_not_found', null, 'Phrase not found'); + notFound = true; + break; + case FindStates.FIND_WRAPPED: + if (previous) { + findMsg = mozL10n.get('find_reached_top', null, 'Reached top of document, continued from bottom'); + } else { + findMsg = mozL10n.get('find_reached_bottom', null, 'Reached end of document, continued from top'); + } + break; + } + if (notFound) { + this.findField.classList.add('notFound'); + } else { + this.findField.classList.remove('notFound'); + } + this.findField.setAttribute('data-status', status); + this.findMsg.textContent = findMsg; + this.updateResultsCount(matchCount); + }, + updateResultsCount: function (matchCount) { + if (!this.findResultsCount) { + return; + } + if (!matchCount) { + this.findResultsCount.classList.add('hidden'); + return; + } + this.findResultsCount.textContent = matchCount.toLocaleString(); + this.findResultsCount.classList.remove('hidden'); + }, + open: function PDFFindBar_open() { + if (!this.opened) { + this.opened = true; + this.toggleButton.classList.add('toggled'); + this.bar.classList.remove('hidden'); + } + this.findField.select(); + this.findField.focus(); + }, + close: function PDFFindBar_close() { + if (!this.opened) { + return; + } + this.opened = false; + this.toggleButton.classList.remove('toggled'); + this.bar.classList.add('hidden'); + this.findController.active = false; + }, + toggle: function PDFFindBar_toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } + }; + return PDFFindBar; + }(); + exports.PDFFindBar = PDFFindBar; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFHistory = {}, root.pdfjsWebDOMEvents); + }(this, function (exports, domEvents) { + function PDFHistory(options) { + this.linkService = options.linkService; + this.eventBus = options.eventBus || domEvents.getGlobalEventBus(); + this.initialized = false; + this.initialDestination = null; + this.initialBookmark = null; + } + PDFHistory.prototype = { + initialize: function pdfHistoryInitialize(fingerprint) { + this.initialized = true; + this.reInitialized = false; + this.allowHashChange = true; + this.historyUnlocked = true; + this.isViewerInPresentationMode = false; + this.previousHash = window.location.hash.substring(1); + this.currentBookmark = ''; + this.currentPage = 0; + this.updatePreviousBookmark = false; + this.previousBookmark = ''; + this.previousPage = 0; + this.nextHashParam = ''; + this.fingerprint = fingerprint; + this.currentUid = this.uid = 0; + this.current = {}; + var state = window.history.state; + if (this._isStateObjectDefined(state)) { + if (state.target.dest) { + this.initialDestination = state.target.dest; + } else { + this.initialBookmark = state.target.hash; + } + this.currentUid = state.uid; + this.uid = state.uid + 1; + this.current = state.target; + } else { + if (state && state.fingerprint && this.fingerprint !== state.fingerprint) { + this.reInitialized = true; + } + this._pushOrReplaceState({ fingerprint: this.fingerprint }, true); + } + var self = this; + window.addEventListener('popstate', function pdfHistoryPopstate(evt) { + if (!self.historyUnlocked) { + return; + } + if (evt.state) { + self._goTo(evt.state); + return; + } + if (self.uid === 0) { + var previousParams = self.previousHash && self.currentBookmark && self.previousHash !== self.currentBookmark ? { + hash: self.currentBookmark, + page: self.currentPage + } : { page: 1 }; + replacePreviousHistoryState(previousParams, function () { + updateHistoryWithCurrentHash(); + }); + } else { + updateHistoryWithCurrentHash(); + } + }); + function updateHistoryWithCurrentHash() { + self.previousHash = window.location.hash.slice(1); + self._pushToHistory({ hash: self.previousHash }, false, true); + self._updatePreviousBookmark(); + } + function replacePreviousHistoryState(params, callback) { + self.historyUnlocked = false; + self.allowHashChange = false; + window.addEventListener('popstate', rewriteHistoryAfterBack); + history.back(); + function rewriteHistoryAfterBack() { + window.removeEventListener('popstate', rewriteHistoryAfterBack); + window.addEventListener('popstate', rewriteHistoryAfterForward); + self._pushToHistory(params, false, true); + history.forward(); + } + function rewriteHistoryAfterForward() { + window.removeEventListener('popstate', rewriteHistoryAfterForward); + self.allowHashChange = true; + self.historyUnlocked = true; + callback(); + } + } + function pdfHistoryBeforeUnload() { + var previousParams = self._getPreviousParams(null, true); + if (previousParams) { + var replacePrevious = !self.current.dest && self.current.hash !== self.previousHash; + self._pushToHistory(previousParams, false, replacePrevious); + self._updatePreviousBookmark(); + } + window.removeEventListener('beforeunload', pdfHistoryBeforeUnload); + } + window.addEventListener('beforeunload', pdfHistoryBeforeUnload); + window.addEventListener('pageshow', function pdfHistoryPageShow(evt) { + window.addEventListener('beforeunload', pdfHistoryBeforeUnload); + }); + self.eventBus.on('presentationmodechanged', function (e) { + self.isViewerInPresentationMode = e.active; + }); + }, + clearHistoryState: function pdfHistory_clearHistoryState() { + this._pushOrReplaceState(null, true); + }, + _isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) { + return state && state.uid >= 0 && state.fingerprint && this.fingerprint === state.fingerprint && state.target && state.target.hash ? true : false; + }, + _pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj, replace) { + if (replace) { + window.history.replaceState(stateObj, '', document.URL); + } else { + window.history.pushState(stateObj, '', document.URL); + } + }, + get isHashChangeUnlocked() { + if (!this.initialized) { + return true; + } + return this.allowHashChange; + }, + _updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() { + if (this.updatePreviousBookmark && this.currentBookmark && this.currentPage) { + this.previousBookmark = this.currentBookmark; + this.previousPage = this.currentPage; + this.updatePreviousBookmark = false; + } + }, + updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark, pageNum) { + if (this.initialized) { + this.currentBookmark = bookmark.substring(1); + this.currentPage = pageNum | 0; + this._updatePreviousBookmark(); + } + }, + updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) { + if (this.initialized) { + this.nextHashParam = param; + } + }, + push: function pdfHistoryPush(params, isInitialBookmark) { + if (!(this.initialized && this.historyUnlocked)) { + return; + } + if (params.dest && !params.hash) { + params.hash = this.current.hash && this.current.dest && this.current.dest === params.dest ? this.current.hash : this.linkService.getDestinationHash(params.dest).split('#')[1]; + } + if (params.page) { + params.page |= 0; + } + if (isInitialBookmark) { + var target = window.history.state.target; + if (!target) { + this._pushToHistory(params, false); + this.previousHash = window.location.hash.substring(1); + } + this.updatePreviousBookmark = this.nextHashParam ? false : true; + if (target) { + this._updatePreviousBookmark(); + } + return; + } + if (this.nextHashParam) { + if (this.nextHashParam === params.hash) { + this.nextHashParam = null; + this.updatePreviousBookmark = true; + return; + } + this.nextHashParam = null; + } + if (params.hash) { + if (this.current.hash) { + if (this.current.hash !== params.hash) { + this._pushToHistory(params, true); + } else { + if (!this.current.page && params.page) { + this._pushToHistory(params, false, true); + } + this.updatePreviousBookmark = true; + } + } else { + this._pushToHistory(params, true); + } + } else if (this.current.page && params.page && this.current.page !== params.page) { + this._pushToHistory(params, true); + } + }, + _getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage, beforeUnload) { + if (!(this.currentBookmark && this.currentPage)) { + return null; + } else if (this.updatePreviousBookmark) { + this.updatePreviousBookmark = false; + } + if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) { + return null; + } + if (!this.current.dest && !onlyCheckPage || beforeUnload) { + if (this.previousBookmark === this.currentBookmark) { + return null; + } + } else if (this.current.page || onlyCheckPage) { + if (this.previousPage === this.currentPage) { + return null; + } + } else { + return null; + } + var params = { + hash: this.currentBookmark, + page: this.currentPage + }; + if (this.isViewerInPresentationMode) { + params.hash = null; + } + return params; + }, + _stateObj: function pdfHistory_stateObj(params) { + return { + fingerprint: this.fingerprint, + uid: this.uid, + target: params + }; + }, + _pushToHistory: function pdfHistory_pushToHistory(params, addPrevious, overwrite) { + if (!this.initialized) { + return; + } + if (!params.hash && params.page) { + params.hash = 'page=' + params.page; + } + if (addPrevious && !overwrite) { + var previousParams = this._getPreviousParams(); + if (previousParams) { + var replacePrevious = !this.current.dest && this.current.hash !== this.previousHash; + this._pushToHistory(previousParams, false, replacePrevious); + } + } + this._pushOrReplaceState(this._stateObj(params), overwrite || this.uid === 0); + this.currentUid = this.uid++; + this.current = params; + this.updatePreviousBookmark = true; + }, + _goTo: function pdfHistory_goTo(state) { + if (!(this.initialized && this.historyUnlocked && this._isStateObjectDefined(state))) { + return; + } + if (!this.reInitialized && state.uid < this.currentUid) { + var previousParams = this._getPreviousParams(true); + if (previousParams) { + this._pushToHistory(this.current, false); + this._pushToHistory(previousParams, false); + this.currentUid = state.uid; + window.history.back(); + return; + } + } + this.historyUnlocked = false; + if (state.target.dest) { + this.linkService.navigateTo(state.target.dest); + } else { + this.linkService.setHash(state.target.hash); + } + this.currentUid = state.uid; + if (state.uid > this.uid) { + this.uid = state.uid; + } + this.current = state.target; + this.updatePreviousBookmark = true; + var currentHash = window.location.hash.substring(1); + if (this.previousHash !== currentHash) { + this.allowHashChange = false; + } + this.previousHash = currentHash; + this.historyUnlocked = true; + }, + back: function pdfHistoryBack() { + this.go(-1); + }, + forward: function pdfHistoryForward() { + this.go(1); + }, + go: function pdfHistoryGo(direction) { + if (this.initialized && this.historyUnlocked) { + var state = window.history.state; + if (direction === -1 && state && state.uid > 0) { + window.history.back(); + } else if (direction === 1 && state && state.uid < this.uid - 1) { + window.history.forward(); + } + } + } + }; + exports.PDFHistory = PDFHistory; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFLinkService = {}, root.pdfjsWebUIUtils, root.pdfjsWebDOMEvents); + }(this, function (exports, uiUtils, domEvents) { + var parseQueryString = uiUtils.parseQueryString; + var PageNumberRegExp = /^\d+$/; + function isPageNumber(str) { + return PageNumberRegExp.test(str); + } + var PDFLinkService = function PDFLinkServiceClosure() { + function PDFLinkService(options) { + options = options || {}; + this.eventBus = options.eventBus || domEvents.getGlobalEventBus(); + this.baseUrl = null; + this.pdfDocument = null; + this.pdfViewer = null; + this.pdfHistory = null; + this._pagesRefCache = null; + } + PDFLinkService.prototype = { + setDocument: function PDFLinkService_setDocument(pdfDocument, baseUrl) { + this.baseUrl = baseUrl; + this.pdfDocument = pdfDocument; + this._pagesRefCache = Object.create(null); + }, + setViewer: function PDFLinkService_setViewer(pdfViewer) { + this.pdfViewer = pdfViewer; + }, + setHistory: function PDFLinkService_setHistory(pdfHistory) { + this.pdfHistory = pdfHistory; + }, + get pagesCount() { + return this.pdfDocument ? this.pdfDocument.numPages : 0; + }, + get page() { + return this.pdfViewer.currentPageNumber; + }, + set page(value) { + this.pdfViewer.currentPageNumber = value; + }, + navigateTo: function PDFLinkService_navigateTo(dest) { + var destString = ''; + var self = this; + var goToDestination = function (destRef) { + var pageNumber; + if (destRef instanceof Object) { + pageNumber = self._cachedPageNumber(destRef); + } else if ((destRef | 0) === destRef) { + pageNumber = destRef + 1; + } else { + console.error('PDFLinkService_navigateTo: "' + destRef + '" is not a valid destination reference.'); + return; + } + if (pageNumber) { + if (pageNumber < 1 || pageNumber > self.pagesCount) { + console.error('PDFLinkService_navigateTo: "' + pageNumber + '" is a non-existent page number.'); + return; + } + self.pdfViewer.scrollPageIntoView({ + pageNumber: pageNumber, + destArray: dest + }); + if (self.pdfHistory) { + self.pdfHistory.push({ + dest: dest, + hash: destString, + page: pageNumber + }); + } + } else { + self.pdfDocument.getPageIndex(destRef).then(function (pageIndex) { + self.cachePageRef(pageIndex + 1, destRef); + goToDestination(destRef); + }).catch(function () { + console.error('PDFLinkService_navigateTo: "' + destRef + '" is not a valid page reference.'); + }); + } + }; + var destinationPromise; + if (typeof dest === 'string') { + destString = dest; + destinationPromise = this.pdfDocument.getDestination(dest); + } else { + destinationPromise = Promise.resolve(dest); + } + destinationPromise.then(function (destination) { + dest = destination; + if (!(destination instanceof Array)) { + console.error('PDFLinkService_navigateTo: "' + destination + '" is not a valid destination array.'); + return; + } + goToDestination(destination[0]); + }); + }, + getDestinationHash: function PDFLinkService_getDestinationHash(dest) { + if (typeof dest === 'string') { + return this.getAnchorUrl('#' + (isPageNumber(dest) ? 'nameddest=' : '') + escape(dest)); + } + if (dest instanceof Array) { + var str = JSON.stringify(dest); + return this.getAnchorUrl('#' + escape(str)); + } + return this.getAnchorUrl(''); + }, + getAnchorUrl: function PDFLinkService_getAnchorUrl(anchor) { + return (this.baseUrl || '') + anchor; + }, + setHash: function PDFLinkService_setHash(hash) { + var pageNumber, dest; + if (hash.indexOf('=') >= 0) { + var params = parseQueryString(hash); + if ('search' in params) { + this.eventBus.dispatch('findfromurlhash', { + source: this, + query: params['search'].replace(/"/g, ''), + phraseSearch: params['phrase'] === 'true' + }); + } + if ('nameddest' in params) { + if (this.pdfHistory) { + this.pdfHistory.updateNextHashParam(params.nameddest); + } + this.navigateTo(params.nameddest); + return; + } + if ('page' in params) { + pageNumber = params.page | 0 || 1; + } + if ('zoom' in params) { + var zoomArgs = params.zoom.split(','); + var zoomArg = zoomArgs[0]; + var zoomArgNumber = parseFloat(zoomArg); + if (zoomArg.indexOf('Fit') === -1) { + dest = [ + null, + { name: 'XYZ' }, + zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, + zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, + zoomArgNumber ? zoomArgNumber / 100 : zoomArg + ]; + } else { + if (zoomArg === 'Fit' || zoomArg === 'FitB') { + dest = [ + null, + { name: zoomArg } + ]; + } else if (zoomArg === 'FitH' || zoomArg === 'FitBH' || (zoomArg === 'FitV' || zoomArg === 'FitBV')) { + dest = [ + null, + { name: zoomArg }, + zoomArgs.length > 1 ? zoomArgs[1] | 0 : null + ]; + } else if (zoomArg === 'FitR') { + if (zoomArgs.length !== 5) { + console.error('PDFLinkService_setHash: ' + 'Not enough parameters for \'FitR\'.'); + } else { + dest = [ + null, + { name: zoomArg }, + zoomArgs[1] | 0, + zoomArgs[2] | 0, + zoomArgs[3] | 0, + zoomArgs[4] | 0 + ]; + } + } else { + console.error('PDFLinkService_setHash: \'' + zoomArg + '\' is not a valid zoom value.'); + } + } + } + if (dest) { + this.pdfViewer.scrollPageIntoView({ + pageNumber: pageNumber || this.page, + destArray: dest, + allowNegativeOffset: true + }); + } else if (pageNumber) { + this.page = pageNumber; + } + if ('pagemode' in params) { + this.eventBus.dispatch('pagemode', { + source: this, + mode: params.pagemode + }); + } + } else { + if (isPageNumber(hash) && hash <= this.pagesCount) { + console.warn('PDFLinkService_setHash: specifying a page number ' + 'directly after the hash symbol (#) is deprecated, ' + 'please use the "#page=' + hash + '" form instead.'); + this.page = hash | 0; + } + dest = unescape(hash); + try { + dest = JSON.parse(dest); + if (!(dest instanceof Array)) { + dest = dest.toString(); + } + } catch (ex) { + } + if (typeof dest === 'string' || isValidExplicitDestination(dest)) { + if (this.pdfHistory) { + this.pdfHistory.updateNextHashParam(dest); + } + this.navigateTo(dest); + return; + } + console.error('PDFLinkService_setHash: \'' + unescape(hash) + '\' is not a valid destination.'); + } + }, + executeNamedAction: function PDFLinkService_executeNamedAction(action) { + switch (action) { + case 'GoBack': + if (this.pdfHistory) { + this.pdfHistory.back(); + } + break; + case 'GoForward': + if (this.pdfHistory) { + this.pdfHistory.forward(); + } + break; + case 'NextPage': + if (this.page < this.pagesCount) { + this.page++; + } + break; + case 'PrevPage': + if (this.page > 1) { + this.page--; + } + break; + case 'LastPage': + this.page = this.pagesCount; + break; + case 'FirstPage': + this.page = 1; + break; + default: + break; + } + this.eventBus.dispatch('namedaction', { + source: this, + action: action + }); + }, + cachePageRef: function PDFLinkService_cachePageRef(pageNum, pageRef) { + var refStr = pageRef.num + ' ' + pageRef.gen + ' R'; + this._pagesRefCache[refStr] = pageNum; + }, + _cachedPageNumber: function PDFLinkService_cachedPageNumber(pageRef) { + var refStr = pageRef.num + ' ' + pageRef.gen + ' R'; + return this._pagesRefCache && this._pagesRefCache[refStr] || null; + } + }; + function isValidExplicitDestination(dest) { + if (!(dest instanceof Array)) { + return false; + } + var destLength = dest.length, allowNull = true; + if (destLength < 2) { + return false; + } + var page = dest[0]; + if (!(typeof page === 'object' && typeof page.num === 'number' && (page.num | 0) === page.num && typeof page.gen === 'number' && (page.gen | 0) === page.gen) && !(typeof page === 'number' && (page | 0) === page && page >= 0)) { + return false; + } + var zoom = dest[1]; + if (!(typeof zoom === 'object' && typeof zoom.name === 'string')) { + return false; + } + switch (zoom.name) { + case 'XYZ': + if (destLength !== 5) { + return false; + } + break; + case 'Fit': + case 'FitB': + return destLength === 2; + case 'FitH': + case 'FitBH': + case 'FitV': + case 'FitBV': + if (destLength !== 3) { + return false; + } + break; + case 'FitR': + if (destLength !== 6) { + return false; + } + allowNull = false; + break; + default: + return false; + } + for (var i = 2; i < destLength; i++) { + var param = dest[i]; + if (!(typeof param === 'number' || allowNull && param === null)) { + return false; + } + } + return true; + } + return PDFLinkService; + }(); + var SimpleLinkService = function SimpleLinkServiceClosure() { + function SimpleLinkService() { + } + SimpleLinkService.prototype = { + get page() { + return 0; + }, + set page(value) { + }, + navigateTo: function (dest) { + }, + getDestinationHash: function (dest) { + return '#'; + }, + getAnchorUrl: function (hash) { + return '#'; + }, + setHash: function (hash) { + }, + executeNamedAction: function (action) { + }, + cachePageRef: function (pageNum, pageRef) { + } + }; + return SimpleLinkService; + }(); + exports.PDFLinkService = PDFLinkService; + exports.SimpleLinkService = SimpleLinkService; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFPageView = {}, root.pdfjsWebUIUtils, root.pdfjsWebPDFRenderingQueue, root.pdfjsWebDOMEvents, root.pdfjsWebPDFJS); + }(this, function (exports, uiUtils, pdfRenderingQueue, domEvents, pdfjsLib) { + var CSS_UNITS = uiUtils.CSS_UNITS; + var DEFAULT_SCALE = uiUtils.DEFAULT_SCALE; + var getOutputScale = uiUtils.getOutputScale; + var approximateFraction = uiUtils.approximateFraction; + var roundToDivide = uiUtils.roundToDivide; + var RendererType = uiUtils.RendererType; + var RenderingStates = pdfRenderingQueue.RenderingStates; + var TEXT_LAYER_RENDER_DELAY = 200; + var PDFPageView = function PDFPageViewClosure() { + function PDFPageView(options) { + var container = options.container; + var id = options.id; + var scale = options.scale; + var defaultViewport = options.defaultViewport; + var renderingQueue = options.renderingQueue; + var textLayerFactory = options.textLayerFactory; + var annotationLayerFactory = options.annotationLayerFactory; + var enhanceTextSelection = options.enhanceTextSelection || false; + var renderInteractiveForms = options.renderInteractiveForms || false; + this.id = id; + this.renderingId = 'page' + id; + this.pageLabel = null; + this.rotation = 0; + this.scale = scale || DEFAULT_SCALE; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this.hasRestrictedScaling = false; + this.enhanceTextSelection = enhanceTextSelection; + this.renderInteractiveForms = renderInteractiveForms; + this.eventBus = options.eventBus || domEvents.getGlobalEventBus(); + this.renderingQueue = renderingQueue; + this.textLayerFactory = textLayerFactory; + this.annotationLayerFactory = annotationLayerFactory; + this.renderer = options.renderer || RendererType.CANVAS; + this.paintTask = null; + this.paintedViewportMap = new WeakMap(); + this.renderingState = RenderingStates.INITIAL; + this.resume = null; + this.error = null; + this.onBeforeDraw = null; + this.onAfterDraw = null; + this.textLayer = null; + this.zoomLayer = null; + this.annotationLayer = null; + var div = document.createElement('div'); + div.className = 'page'; + div.style.width = Math.floor(this.viewport.width) + 'px'; + div.style.height = Math.floor(this.viewport.height) + 'px'; + div.setAttribute('data-page-number', this.id); + this.div = div; + container.appendChild(div); + } + PDFPageView.prototype = { + setPdfPage: function PDFPageView_setPdfPage(pdfPage) { + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + var totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport(this.scale * CSS_UNITS, totalRotation); + this.stats = pdfPage.stats; + this.reset(); + }, + destroy: function PDFPageView_destroy() { + this.zoomLayer = null; + this.reset(); + if (this.pdfPage) { + this.pdfPage.cleanup(); + } + }, + reset: function PDFPageView_reset(keepZoomLayer, keepAnnotations) { + this.cancelRendering(); + var div = this.div; + div.style.width = Math.floor(this.viewport.width) + 'px'; + div.style.height = Math.floor(this.viewport.height) + 'px'; + var childNodes = div.childNodes; + var currentZoomLayerNode = keepZoomLayer && this.zoomLayer || null; + var currentAnnotationNode = keepAnnotations && this.annotationLayer && this.annotationLayer.div || null; + for (var i = childNodes.length - 1; i >= 0; i--) { + var node = childNodes[i]; + if (currentZoomLayerNode === node || currentAnnotationNode === node) { + continue; + } + div.removeChild(node); + } + div.removeAttribute('data-loaded'); + if (currentAnnotationNode) { + this.annotationLayer.hide(); + } else { + this.annotationLayer = null; + } + if (this.canvas && !currentZoomLayerNode) { + this.paintedViewportMap.delete(this.canvas); + this.canvas.width = 0; + this.canvas.height = 0; + delete this.canvas; + } + if (this.svg) { + this.paintedViewportMap.delete(this.svg); + delete this.svg; + } + this.loadingIconDiv = document.createElement('div'); + this.loadingIconDiv.className = 'loadingIcon'; + div.appendChild(this.loadingIconDiv); + }, + update: function PDFPageView_update(scale, rotation) { + this.scale = scale || this.scale; + if (typeof rotation !== 'undefined') { + this.rotation = rotation; + } + var totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: this.scale * CSS_UNITS, + rotation: totalRotation + }); + if (this.svg) { + this.cssTransform(this.svg, true); + this.eventBus.dispatch('pagerendered', { + source: this, + pageNumber: this.id, + cssTransform: true + }); + return; + } + var isScalingRestricted = false; + if (this.canvas && pdfjsLib.PDFJS.maxCanvasPixels > 0) { + var outputScale = this.outputScale; + if ((Math.floor(this.viewport.width) * outputScale.sx | 0) * (Math.floor(this.viewport.height) * outputScale.sy | 0) > pdfjsLib.PDFJS.maxCanvasPixels) { + isScalingRestricted = true; + } + } + if (this.canvas) { + if (pdfjsLib.PDFJS.useOnlyCssZoom || this.hasRestrictedScaling && isScalingRestricted) { + this.cssTransform(this.canvas, true); + this.eventBus.dispatch('pagerendered', { + source: this, + pageNumber: this.id, + cssTransform: true + }); + return; + } + if (!this.zoomLayer) { + this.zoomLayer = this.canvas.parentNode; + this.zoomLayer.style.position = 'absolute'; + } + } + if (this.zoomLayer) { + this.cssTransform(this.zoomLayer.firstChild); + } + this.reset(true, true); + }, + cancelRendering: function PDFPageView_cancelRendering() { + if (this.paintTask) { + this.paintTask.cancel(); + this.paintTask = null; + } + this.renderingState = RenderingStates.INITIAL; + this.resume = null; + if (this.textLayer) { + this.textLayer.cancel(); + this.textLayer = null; + } + }, + updatePosition: function PDFPageView_updatePosition() { + if (this.textLayer) { + this.textLayer.render(TEXT_LAYER_RENDER_DELAY); + } + }, + cssTransform: function PDFPageView_transform(target, redrawAnnotations) { + var CustomStyle = pdfjsLib.CustomStyle; + var width = this.viewport.width; + var height = this.viewport.height; + var div = this.div; + target.style.width = target.parentNode.style.width = div.style.width = Math.floor(width) + 'px'; + target.style.height = target.parentNode.style.height = div.style.height = Math.floor(height) + 'px'; + var relativeRotation = this.viewport.rotation - this.paintedViewportMap.get(target).rotation; + var absRotation = Math.abs(relativeRotation); + var scaleX = 1, scaleY = 1; + if (absRotation === 90 || absRotation === 270) { + scaleX = height / width; + scaleY = width / height; + } + var cssTransform = 'rotate(' + relativeRotation + 'deg) ' + 'scale(' + scaleX + ',' + scaleY + ')'; + CustomStyle.setProp('transform', target, cssTransform); + if (this.textLayer) { + var textLayerViewport = this.textLayer.viewport; + var textRelativeRotation = this.viewport.rotation - textLayerViewport.rotation; + var textAbsRotation = Math.abs(textRelativeRotation); + var scale = width / textLayerViewport.width; + if (textAbsRotation === 90 || textAbsRotation === 270) { + scale = width / textLayerViewport.height; + } + var textLayerDiv = this.textLayer.textLayerDiv; + var transX, transY; + switch (textAbsRotation) { + case 0: + transX = transY = 0; + break; + case 90: + transX = 0; + transY = '-' + textLayerDiv.style.height; + break; + case 180: + transX = '-' + textLayerDiv.style.width; + transY = '-' + textLayerDiv.style.height; + break; + case 270: + transX = '-' + textLayerDiv.style.width; + transY = 0; + break; + default: + console.error('Bad rotation value.'); + break; + } + CustomStyle.setProp('transform', textLayerDiv, 'rotate(' + textAbsRotation + 'deg) ' + 'scale(' + scale + ', ' + scale + ') ' + 'translate(' + transX + ', ' + transY + ')'); + CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%'); + } + if (redrawAnnotations && this.annotationLayer) { + this.annotationLayer.render(this.viewport, 'display'); + } + }, + get width() { + return this.viewport.width; + }, + get height() { + return this.viewport.height; + }, + getPagePoint: function PDFPageView_getPagePoint(x, y) { + return this.viewport.convertToPdfPoint(x, y); + }, + draw: function PDFPageView_draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error('Must be in new state before drawing'); + this.reset(); + } + this.renderingState = RenderingStates.RUNNING; + var self = this; + var pdfPage = this.pdfPage; + var viewport = this.viewport; + var div = this.div; + var canvasWrapper = document.createElement('div'); + canvasWrapper.style.width = div.style.width; + canvasWrapper.style.height = div.style.height; + canvasWrapper.classList.add('canvasWrapper'); + if (this.annotationLayer && this.annotationLayer.div) { + div.insertBefore(canvasWrapper, this.annotationLayer.div); + } else { + div.appendChild(canvasWrapper); + } + var textLayerDiv = null; + var textLayer = null; + if (this.textLayerFactory) { + textLayerDiv = document.createElement('div'); + textLayerDiv.className = 'textLayer'; + textLayerDiv.style.width = canvasWrapper.style.width; + textLayerDiv.style.height = canvasWrapper.style.height; + if (this.annotationLayer && this.annotationLayer.div) { + div.insertBefore(textLayerDiv, this.annotationLayer.div); + } else { + div.appendChild(textLayerDiv); + } + textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport, this.enhanceTextSelection); + } + this.textLayer = textLayer; + var renderContinueCallback = null; + if (this.renderingQueue) { + renderContinueCallback = function renderContinueCallback(cont) { + if (!self.renderingQueue.isHighestPriority(self)) { + self.renderingState = RenderingStates.PAUSED; + self.resume = function resumeCallback() { + self.renderingState = RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + } + var finishPaintTask = function finishPaintTask(error) { + if (paintTask === self.paintTask) { + self.paintTask = null; + } + if (error === 'cancelled') { + self.error = null; + return Promise.resolve(undefined); + } + self.renderingState = RenderingStates.FINISHED; + if (self.loadingIconDiv) { + div.removeChild(self.loadingIconDiv); + delete self.loadingIconDiv; + } + if (self.zoomLayer) { + var zoomLayerCanvas = self.zoomLayer.firstChild; + self.paintedViewportMap.delete(zoomLayerCanvas); + zoomLayerCanvas.width = 0; + zoomLayerCanvas.height = 0; + if (div.contains(self.zoomLayer)) { + div.removeChild(self.zoomLayer); + } + self.zoomLayer = null; + } + self.error = error; + self.stats = pdfPage.stats; + if (self.onAfterDraw) { + self.onAfterDraw(); + } + self.eventBus.dispatch('pagerendered', { + source: self, + pageNumber: self.id, + cssTransform: false + }); + if (error) { + return Promise.reject(error); + } + return Promise.resolve(undefined); + }; + var paintTask = this.renderer === RendererType.SVG ? this.paintOnSvg(canvasWrapper) : this.paintOnCanvas(canvasWrapper); + paintTask.onRenderContinue = renderContinueCallback; + this.paintTask = paintTask; + var resultPromise = paintTask.promise.then(function () { + return finishPaintTask(null).then(function () { + if (textLayer) { + pdfPage.getTextContent({ normalizeWhitespace: true }).then(function textContentResolved(textContent) { + textLayer.setTextContent(textContent); + textLayer.render(TEXT_LAYER_RENDER_DELAY); + }); + } + }); + }, function (reason) { + return finishPaintTask(reason); + }); + if (this.annotationLayerFactory) { + if (!this.annotationLayer) { + this.annotationLayer = this.annotationLayerFactory.createAnnotationLayerBuilder(div, pdfPage, this.renderInteractiveForms); + } + this.annotationLayer.render(this.viewport, 'display'); + } + div.setAttribute('data-loaded', true); + if (this.onBeforeDraw) { + this.onBeforeDraw(); + } + return resultPromise; + }, + paintOnCanvas: function (canvasWrapper) { + var resolveRenderPromise, rejectRenderPromise; + var promise = new Promise(function (resolve, reject) { + resolveRenderPromise = resolve; + rejectRenderPromise = reject; + }); + var result = { + promise: promise, + onRenderContinue: function (cont) { + cont(); + }, + cancel: function () { + renderTask.cancel(); + } + }; + var self = this; + var pdfPage = this.pdfPage; + var viewport = this.viewport; + var canvas = document.createElement('canvas'); + canvas.id = 'page' + this.id; + canvas.setAttribute('hidden', 'hidden'); + var isCanvasHidden = true; + var showCanvas = function () { + if (isCanvasHidden) { + canvas.removeAttribute('hidden'); + isCanvasHidden = false; + } + }; + canvasWrapper.appendChild(canvas); + this.canvas = canvas; + canvas.mozOpaque = true; + var ctx = canvas.getContext('2d', { alpha: false }); + var outputScale = getOutputScale(ctx); + this.outputScale = outputScale; + if (pdfjsLib.PDFJS.useOnlyCssZoom) { + var actualSizeViewport = viewport.clone({ scale: CSS_UNITS }); + outputScale.sx *= actualSizeViewport.width / viewport.width; + outputScale.sy *= actualSizeViewport.height / viewport.height; + outputScale.scaled = true; + } + if (pdfjsLib.PDFJS.maxCanvasPixels > 0) { + var pixelsInViewport = viewport.width * viewport.height; + var maxScale = Math.sqrt(pdfjsLib.PDFJS.maxCanvasPixels / pixelsInViewport); + if (outputScale.sx > maxScale || outputScale.sy > maxScale) { + outputScale.sx = maxScale; + outputScale.sy = maxScale; + outputScale.scaled = true; + this.hasRestrictedScaling = true; + } else { + this.hasRestrictedScaling = false; + } + } + var sfx = approximateFraction(outputScale.sx); + var sfy = approximateFraction(outputScale.sy); + canvas.width = roundToDivide(viewport.width * outputScale.sx, sfx[0]); + canvas.height = roundToDivide(viewport.height * outputScale.sy, sfy[0]); + canvas.style.width = roundToDivide(viewport.width, sfx[1]) + 'px'; + canvas.style.height = roundToDivide(viewport.height, sfy[1]) + 'px'; + this.paintedViewportMap.set(canvas, viewport); + var transform = !outputScale.scaled ? null : [ + outputScale.sx, + 0, + 0, + outputScale.sy, + 0, + 0 + ]; + var renderContext = { + canvasContext: ctx, + transform: transform, + viewport: this.viewport, + renderInteractiveForms: this.renderInteractiveForms + }; + var renderTask = this.pdfPage.render(renderContext); + renderTask.onContinue = function (cont) { + showCanvas(); + if (result.onRenderContinue) { + result.onRenderContinue(cont); + } else { + cont(); + } + }; + renderTask.promise.then(function pdfPageRenderCallback() { + showCanvas(); + resolveRenderPromise(undefined); + }, function pdfPageRenderError(error) { + showCanvas(); + rejectRenderPromise(error); + }); + return result; + }, + paintOnSvg: function PDFPageView_paintOnSvg(wrapper) { + var cancelled = false; + var ensureNotCancelled = function () { + if (cancelled) { + throw 'cancelled'; + } + }; + var self = this; + var pdfPage = this.pdfPage; + var SVGGraphics = pdfjsLib.SVGGraphics; + var actualSizeViewport = this.viewport.clone({ scale: CSS_UNITS }); + var promise = pdfPage.getOperatorList().then(function (opList) { + ensureNotCancelled(); + var svgGfx = new SVGGraphics(pdfPage.commonObjs, pdfPage.objs); + return svgGfx.getSVG(opList, actualSizeViewport).then(function (svg) { + ensureNotCancelled(); + self.svg = svg; + self.paintedViewportMap.set(svg, actualSizeViewport); + svg.style.width = wrapper.style.width; + svg.style.height = wrapper.style.height; + self.renderingState = RenderingStates.FINISHED; + wrapper.appendChild(svg); + }); + }); + return { + promise: promise, + onRenderContinue: function (cont) { + cont(); + }, + cancel: function () { + cancelled = true; + } + }; + }, + setPageLabel: function PDFView_setPageLabel(label) { + this.pageLabel = typeof label === 'string' ? label : null; + if (this.pageLabel !== null) { + this.div.setAttribute('data-page-label', this.pageLabel); + } else { + this.div.removeAttribute('data-page-label'); + } + } + }; + return PDFPageView; + }(); + exports.PDFPageView = PDFPageView; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFThumbnailViewer = {}, root.pdfjsWebUIUtils, root.pdfjsWebPDFThumbnailView); + }(this, function (exports, uiUtils, pdfThumbnailView) { + var watchScroll = uiUtils.watchScroll; + var getVisibleElements = uiUtils.getVisibleElements; + var scrollIntoView = uiUtils.scrollIntoView; + var PDFThumbnailView = pdfThumbnailView.PDFThumbnailView; + var THUMBNAIL_SCROLL_MARGIN = -19; + var PDFThumbnailViewer = function PDFThumbnailViewerClosure() { + function PDFThumbnailViewer(options) { + this.container = options.container; + this.renderingQueue = options.renderingQueue; + this.linkService = options.linkService; + this.scroll = watchScroll(this.container, this._scrollUpdated.bind(this)); + this._resetView(); + } + PDFThumbnailViewer.prototype = { + _scrollUpdated: function PDFThumbnailViewer_scrollUpdated() { + this.renderingQueue.renderHighestPriority(); + }, + getThumbnail: function PDFThumbnailViewer_getThumbnail(index) { + return this.thumbnails[index]; + }, + _getVisibleThumbs: function PDFThumbnailViewer_getVisibleThumbs() { + return getVisibleElements(this.container, this.thumbnails); + }, + scrollThumbnailIntoView: function PDFThumbnailViewer_scrollThumbnailIntoView(page) { + var selected = document.querySelector('.thumbnail.selected'); + if (selected) { + selected.classList.remove('selected'); + } + var thumbnail = document.querySelector('div.thumbnail[data-page-number="' + page + '"]'); + if (thumbnail) { + thumbnail.classList.add('selected'); + } + var visibleThumbs = this._getVisibleThumbs(); + var numVisibleThumbs = visibleThumbs.views.length; + if (numVisibleThumbs > 0) { + var first = visibleThumbs.first.id; + var last = numVisibleThumbs > 1 ? visibleThumbs.last.id : first; + if (page <= first || page >= last) { + scrollIntoView(thumbnail, { top: THUMBNAIL_SCROLL_MARGIN }); + } + } + }, + get pagesRotation() { + return this._pagesRotation; + }, + set pagesRotation(rotation) { + this._pagesRotation = rotation; + for (var i = 0, l = this.thumbnails.length; i < l; i++) { + var thumb = this.thumbnails[i]; + thumb.update(rotation); + } + }, + cleanup: function PDFThumbnailViewer_cleanup() { + var tempCanvas = PDFThumbnailView.tempImageCache; + if (tempCanvas) { + tempCanvas.width = 0; + tempCanvas.height = 0; + } + PDFThumbnailView.tempImageCache = null; + }, + _resetView: function PDFThumbnailViewer_resetView() { + this.thumbnails = []; + this._pageLabels = null; + this._pagesRotation = 0; + this._pagesRequests = []; + this.container.textContent = ''; + }, + setDocument: function PDFThumbnailViewer_setDocument(pdfDocument) { + if (this.pdfDocument) { + this._cancelRendering(); + this._resetView(); + } + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return Promise.resolve(); + } + return pdfDocument.getPage(1).then(function (firstPage) { + var pagesCount = pdfDocument.numPages; + var viewport = firstPage.getViewport(1.0); + for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { + var thumbnail = new PDFThumbnailView({ + container: this.container, + id: pageNum, + defaultViewport: viewport.clone(), + linkService: this.linkService, + renderingQueue: this.renderingQueue, + disableCanvasToImageConversion: false + }); + this.thumbnails.push(thumbnail); + } + }.bind(this)); + }, + _cancelRendering: function PDFThumbnailViewer_cancelRendering() { + for (var i = 0, ii = this.thumbnails.length; i < ii; i++) { + if (this.thumbnails[i]) { + this.thumbnails[i].cancelRendering(); + } + } + }, + setPageLabels: function PDFThumbnailViewer_setPageLabels(labels) { + if (!this.pdfDocument) { + return; + } + if (!labels) { + this._pageLabels = null; + } else if (!(labels instanceof Array && this.pdfDocument.numPages === labels.length)) { + this._pageLabels = null; + console.error('PDFThumbnailViewer_setPageLabels: Invalid page labels.'); + } else { + this._pageLabels = labels; + } + for (var i = 0, ii = this.thumbnails.length; i < ii; i++) { + var thumbnailView = this.thumbnails[i]; + var label = this._pageLabels && this._pageLabels[i]; + thumbnailView.setPageLabel(label); + } + }, + _ensurePdfPageLoaded: function PDFThumbnailViewer_ensurePdfPageLoaded(thumbView) { + if (thumbView.pdfPage) { + return Promise.resolve(thumbView.pdfPage); + } + var pageNumber = thumbView.id; + if (this._pagesRequests[pageNumber]) { + return this._pagesRequests[pageNumber]; + } + var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) { + thumbView.setPdfPage(pdfPage); + this._pagesRequests[pageNumber] = null; + return pdfPage; + }.bind(this)); + this._pagesRequests[pageNumber] = promise; + return promise; + }, + forceRendering: function () { + var visibleThumbs = this._getVisibleThumbs(); + var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this.thumbnails, this.scroll.down); + if (thumbView) { + this._ensurePdfPageLoaded(thumbView).then(function () { + this.renderingQueue.renderView(thumbView); + }.bind(this)); + return true; + } + return false; + } + }; + return PDFThumbnailViewer; + }(); + exports.PDFThumbnailViewer = PDFThumbnailViewer; + })); + (function (root, factory) { + factory(root.pdfjsWebTextLayerBuilder = {}, root.pdfjsWebDOMEvents, root.pdfjsWebPDFJS); + }(this, function (exports, domEvents, pdfjsLib) { + var EXPAND_DIVS_TIMEOUT = 300; + var TextLayerBuilder = function TextLayerBuilderClosure() { + function TextLayerBuilder(options) { + this.textLayerDiv = options.textLayerDiv; + this.eventBus = options.eventBus || domEvents.getGlobalEventBus(); + this.textContent = null; + this.renderingDone = false; + this.pageIdx = options.pageIndex; + this.pageNumber = this.pageIdx + 1; + this.matches = []; + this.viewport = options.viewport; + this.textDivs = []; + this.findController = options.findController || null; + this.textLayerRenderTask = null; + this.enhanceTextSelection = options.enhanceTextSelection; + this._bindMouse(); + } + TextLayerBuilder.prototype = { + _finishRendering: function TextLayerBuilder_finishRendering() { + this.renderingDone = true; + if (!this.enhanceTextSelection) { + var endOfContent = document.createElement('div'); + endOfContent.className = 'endOfContent'; + this.textLayerDiv.appendChild(endOfContent); + } + this.eventBus.dispatch('textlayerrendered', { + source: this, + pageNumber: this.pageNumber, + numTextDivs: this.textDivs.length + }); + }, + render: function TextLayerBuilder_render(timeout) { + if (!this.textContent || this.renderingDone) { + return; + } + this.cancel(); + this.textDivs = []; + var textLayerFrag = document.createDocumentFragment(); + this.textLayerRenderTask = pdfjsLib.renderTextLayer({ + textContent: this.textContent, + container: textLayerFrag, + viewport: this.viewport, + textDivs: this.textDivs, + timeout: timeout, + enhanceTextSelection: this.enhanceTextSelection + }); + this.textLayerRenderTask.promise.then(function () { + this.textLayerDiv.appendChild(textLayerFrag); + this._finishRendering(); + this.updateMatches(); + }.bind(this), function (reason) { + }); + }, + cancel: function TextLayerBuilder_cancel() { + if (this.textLayerRenderTask) { + this.textLayerRenderTask.cancel(); + this.textLayerRenderTask = null; + } + }, + setTextContent: function TextLayerBuilder_setTextContent(textContent) { + this.cancel(); + this.textContent = textContent; + }, + convertMatches: function TextLayerBuilder_convertMatches(matches, matchesLength) { + var i = 0; + var iIndex = 0; + var bidiTexts = this.textContent.items; + var end = bidiTexts.length - 1; + var queryLen = this.findController === null ? 0 : this.findController.state.query.length; + var ret = []; + if (!matches) { + return ret; + } + for (var m = 0, len = matches.length; m < len; m++) { + var matchIdx = matches[m]; + while (i !== end && matchIdx >= iIndex + bidiTexts[i].str.length) { + iIndex += bidiTexts[i].str.length; + i++; + } + if (i === bidiTexts.length) { + console.error('Could not find a matching mapping'); + } + var match = { + begin: { + divIdx: i, + offset: matchIdx - iIndex + } + }; + if (matchesLength) { + matchIdx += matchesLength[m]; + } else { + matchIdx += queryLen; + } + while (i !== end && matchIdx > iIndex + bidiTexts[i].str.length) { + iIndex += bidiTexts[i].str.length; + i++; + } + match.end = { + divIdx: i, + offset: matchIdx - iIndex + }; + ret.push(match); + } + return ret; + }, + renderMatches: function TextLayerBuilder_renderMatches(matches) { + if (matches.length === 0) { + return; + } + var bidiTexts = this.textContent.items; + var textDivs = this.textDivs; + var prevEnd = null; + var pageIdx = this.pageIdx; + var isSelectedPage = this.findController === null ? false : pageIdx === this.findController.selected.pageIdx; + var selectedMatchIdx = this.findController === null ? -1 : this.findController.selected.matchIdx; + var highlightAll = this.findController === null ? false : this.findController.state.highlightAll; + var infinity = { + divIdx: -1, + offset: undefined + }; + function beginText(begin, className) { + var divIdx = begin.divIdx; + textDivs[divIdx].textContent = ''; + appendTextToDiv(divIdx, 0, begin.offset, className); + } + function appendTextToDiv(divIdx, fromOffset, toOffset, className) { + var div = textDivs[divIdx]; + var content = bidiTexts[divIdx].str.substring(fromOffset, toOffset); + var node = document.createTextNode(content); + if (className) { + var span = document.createElement('span'); + span.className = className; + span.appendChild(node); + div.appendChild(span); + return; + } + div.appendChild(node); + } + var i0 = selectedMatchIdx, i1 = i0 + 1; + if (highlightAll) { + i0 = 0; + i1 = matches.length; + } else if (!isSelectedPage) { + return; + } + for (var i = i0; i < i1; i++) { + var match = matches[i]; + var begin = match.begin; + var end = match.end; + var isSelected = isSelectedPage && i === selectedMatchIdx; + var highlightSuffix = isSelected ? ' selected' : ''; + if (this.findController) { + this.findController.updateMatchPosition(pageIdx, i, textDivs, begin.divIdx); + } + if (!prevEnd || begin.divIdx !== prevEnd.divIdx) { + if (prevEnd !== null) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + beginText(begin); + } else { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset); + } + if (begin.divIdx === end.divIdx) { + appendTextToDiv(begin.divIdx, begin.offset, end.offset, 'highlight' + highlightSuffix); + } else { + appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, 'highlight begin' + highlightSuffix); + for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) { + textDivs[n0].className = 'highlight middle' + highlightSuffix; + } + beginText(end, 'highlight end' + highlightSuffix); + } + prevEnd = end; + } + if (prevEnd) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + }, + updateMatches: function TextLayerBuilder_updateMatches() { + if (!this.renderingDone) { + return; + } + var matches = this.matches; + var textDivs = this.textDivs; + var bidiTexts = this.textContent.items; + var clearedUntilDivIdx = -1; + for (var i = 0, len = matches.length; i < len; i++) { + var match = matches[i]; + var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx); + for (var n = begin, end = match.end.divIdx; n <= end; n++) { + var div = textDivs[n]; + div.textContent = bidiTexts[n].str; + div.className = ''; + } + clearedUntilDivIdx = match.end.divIdx + 1; + } + if (this.findController === null || !this.findController.active) { + return; + } + var pageMatches, pageMatchesLength; + if (this.findController !== null) { + pageMatches = this.findController.pageMatches[this.pageIdx] || null; + pageMatchesLength = this.findController.pageMatchesLength ? this.findController.pageMatchesLength[this.pageIdx] || null : null; + } + this.matches = this.convertMatches(pageMatches, pageMatchesLength); + this.renderMatches(this.matches); + }, + _bindMouse: function TextLayerBuilder_bindMouse() { + var div = this.textLayerDiv; + var self = this; + var expandDivsTimer = null; + div.addEventListener('mousedown', function (e) { + if (self.enhanceTextSelection && self.textLayerRenderTask) { + self.textLayerRenderTask.expandTextDivs(true); + if (expandDivsTimer) { + clearTimeout(expandDivsTimer); + expandDivsTimer = null; + } + return; + } + var end = div.querySelector('.endOfContent'); + if (!end) { + return; + } + var adjustTop = e.target !== div; + adjustTop = adjustTop && window.getComputedStyle(end).getPropertyValue('-moz-user-select') !== 'none'; + if (adjustTop) { + var divBounds = div.getBoundingClientRect(); + var r = Math.max(0, (e.pageY - divBounds.top) / divBounds.height); + end.style.top = (r * 100).toFixed(2) + '%'; + } + end.classList.add('active'); + }); + div.addEventListener('mouseup', function (e) { + if (self.enhanceTextSelection && self.textLayerRenderTask) { + expandDivsTimer = setTimeout(function () { + if (self.textLayerRenderTask) { + self.textLayerRenderTask.expandTextDivs(false); + } + expandDivsTimer = null; + }, EXPAND_DIVS_TIMEOUT); + return; + } + var end = div.querySelector('.endOfContent'); + if (!end) { + return; + } + end.style.top = ''; + end.classList.remove('active'); + }); + } + }; + return TextLayerBuilder; + }(); + function DefaultTextLayerFactory() { + } + DefaultTextLayerFactory.prototype = { + createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport, enhanceTextSelection) { + return new TextLayerBuilder({ + textLayerDiv: textLayerDiv, + pageIndex: pageIndex, + viewport: viewport, + enhanceTextSelection: enhanceTextSelection + }); + } + }; + exports.TextLayerBuilder = TextLayerBuilder; + exports.DefaultTextLayerFactory = DefaultTextLayerFactory; + })); + (function (root, factory) { + factory(root.pdfjsWebAnnotationLayerBuilder = {}, root.pdfjsWebUIUtils, root.pdfjsWebPDFLinkService, root.pdfjsWebPDFJS); + }(this, function (exports, uiUtils, pdfLinkService, pdfjsLib) { + var mozL10n = uiUtils.mozL10n; + var SimpleLinkService = pdfLinkService.SimpleLinkService; + var AnnotationLayerBuilder = function AnnotationLayerBuilderClosure() { + function AnnotationLayerBuilder(options) { + this.pageDiv = options.pageDiv; + this.pdfPage = options.pdfPage; + this.renderInteractiveForms = options.renderInteractiveForms; + this.linkService = options.linkService; + this.downloadManager = options.downloadManager; + this.div = null; + } + AnnotationLayerBuilder.prototype = { + render: function AnnotationLayerBuilder_render(viewport, intent) { + var self = this; + var parameters = { intent: intent === undefined ? 'display' : intent }; + this.pdfPage.getAnnotations(parameters).then(function (annotations) { + viewport = viewport.clone({ dontFlip: true }); + parameters = { + viewport: viewport, + div: self.div, + annotations: annotations, + page: self.pdfPage, + renderInteractiveForms: self.renderInteractiveForms, + linkService: self.linkService, + downloadManager: self.downloadManager + }; + if (self.div) { + pdfjsLib.AnnotationLayer.update(parameters); + } else { + if (annotations.length === 0) { + return; + } + self.div = document.createElement('div'); + self.div.className = 'annotationLayer'; + self.pageDiv.appendChild(self.div); + parameters.div = self.div; + pdfjsLib.AnnotationLayer.render(parameters); + if (typeof mozL10n !== 'undefined') { + mozL10n.translate(self.div); + } + } + }); + }, + hide: function AnnotationLayerBuilder_hide() { + if (!this.div) { + return; + } + this.div.setAttribute('hidden', 'true'); + } + }; + return AnnotationLayerBuilder; + }(); + function DefaultAnnotationLayerFactory() { + } + DefaultAnnotationLayerFactory.prototype = { + createAnnotationLayerBuilder: function (pageDiv, pdfPage, renderInteractiveForms) { + return new AnnotationLayerBuilder({ + pageDiv: pageDiv, + pdfPage: pdfPage, + renderInteractiveForms: renderInteractiveForms, + linkService: new SimpleLinkService() + }); + } + }; + exports.AnnotationLayerBuilder = AnnotationLayerBuilder; + exports.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFViewer = {}, root.pdfjsWebUIUtils, root.pdfjsWebPDFPageView, root.pdfjsWebPDFRenderingQueue, root.pdfjsWebTextLayerBuilder, root.pdfjsWebAnnotationLayerBuilder, root.pdfjsWebPDFLinkService, root.pdfjsWebDOMEvents, root.pdfjsWebPDFJS); + }(this, function (exports, uiUtils, pdfPageView, pdfRenderingQueue, textLayerBuilder, annotationLayerBuilder, pdfLinkService, domEvents, pdfjsLib) { + var UNKNOWN_SCALE = uiUtils.UNKNOWN_SCALE; + var SCROLLBAR_PADDING = uiUtils.SCROLLBAR_PADDING; + var VERTICAL_PADDING = uiUtils.VERTICAL_PADDING; + var MAX_AUTO_SCALE = uiUtils.MAX_AUTO_SCALE; + var CSS_UNITS = uiUtils.CSS_UNITS; + var DEFAULT_SCALE = uiUtils.DEFAULT_SCALE; + var DEFAULT_SCALE_VALUE = uiUtils.DEFAULT_SCALE_VALUE; + var RendererType = uiUtils.RendererType; + var scrollIntoView = uiUtils.scrollIntoView; + var watchScroll = uiUtils.watchScroll; + var getVisibleElements = uiUtils.getVisibleElements; + var PDFPageView = pdfPageView.PDFPageView; + var RenderingStates = pdfRenderingQueue.RenderingStates; + var PDFRenderingQueue = pdfRenderingQueue.PDFRenderingQueue; + var TextLayerBuilder = textLayerBuilder.TextLayerBuilder; + var AnnotationLayerBuilder = annotationLayerBuilder.AnnotationLayerBuilder; + var SimpleLinkService = pdfLinkService.SimpleLinkService; + var PresentationModeState = { + UNKNOWN: 0, + NORMAL: 1, + CHANGING: 2, + FULLSCREEN: 3 + }; + var DEFAULT_CACHE_SIZE = 10; + var PDFViewer = function pdfViewer() { + function PDFPageViewBuffer(size) { + var data = []; + this.push = function cachePush(view) { + var i = data.indexOf(view); + if (i >= 0) { + data.splice(i, 1); + } + data.push(view); + if (data.length > size) { + data.shift().destroy(); + } + }; + this.resize = function (newSize) { + size = newSize; + while (data.length > size) { + data.shift().destroy(); + } + }; + } + function isSameScale(oldScale, newScale) { + if (newScale === oldScale) { + return true; + } + if (Math.abs(newScale - oldScale) < 1e-15) { + return true; + } + return false; + } + function PDFViewer(options) { + this.container = options.container; + this.viewer = options.viewer || options.container.firstElementChild; + this.eventBus = options.eventBus || domEvents.getGlobalEventBus(); + this.linkService = options.linkService || new SimpleLinkService(); + this.downloadManager = options.downloadManager || null; + this.removePageBorders = options.removePageBorders || false; + this.enhanceTextSelection = options.enhanceTextSelection || false; + this.renderInteractiveForms = options.renderInteractiveForms || false; + this.renderer = options.renderer || RendererType.CANVAS; + this.defaultRenderingQueue = !options.renderingQueue; + if (this.defaultRenderingQueue) { + this.renderingQueue = new PDFRenderingQueue(); + this.renderingQueue.setViewer(this); + } else { + this.renderingQueue = options.renderingQueue; + } + this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this)); + this.presentationModeState = PresentationModeState.UNKNOWN; + this._resetView(); + if (this.removePageBorders) { + this.viewer.classList.add('removePageBorders'); + } + } + PDFViewer.prototype = { + get pagesCount() { + return this._pages.length; + }, + getPageView: function (index) { + return this._pages[index]; + }, + get pageViewsReady() { + return this._pageViewsReady; + }, + get currentPageNumber() { + return this._currentPageNumber; + }, + set currentPageNumber(val) { + if ((val | 0) !== val) { + throw new Error('Invalid page number.'); + } + if (!this.pdfDocument) { + this._currentPageNumber = val; + return; + } + this._setCurrentPageNumber(val, true); + }, + _setCurrentPageNumber: function PDFViewer_setCurrentPageNumber(val, resetCurrentPageView) { + if (this._currentPageNumber === val) { + if (resetCurrentPageView) { + this._resetCurrentPageView(); + } + return; + } + if (!(0 < val && val <= this.pagesCount)) { + console.error('PDFViewer_setCurrentPageNumber: "' + val + '" is out of bounds.'); + return; + } + var arg = { + source: this, + pageNumber: val, + pageLabel: this._pageLabels && this._pageLabels[val - 1] + }; + this._currentPageNumber = val; + this.eventBus.dispatch('pagechanging', arg); + this.eventBus.dispatch('pagechange', arg); + if (resetCurrentPageView) { + this._resetCurrentPageView(); + } + }, + get currentPageLabel() { + return this._pageLabels && this._pageLabels[this._currentPageNumber - 1]; + }, + set currentPageLabel(val) { + var pageNumber = val | 0; + if (this._pageLabels) { + var i = this._pageLabels.indexOf(val); + if (i >= 0) { + pageNumber = i + 1; + } + } + this.currentPageNumber = pageNumber; + }, + get currentScale() { + return this._currentScale !== UNKNOWN_SCALE ? this._currentScale : DEFAULT_SCALE; + }, + set currentScale(val) { + if (isNaN(val)) { + throw new Error('Invalid numeric scale'); + } + if (!this.pdfDocument) { + this._currentScale = val; + this._currentScaleValue = val !== UNKNOWN_SCALE ? val.toString() : null; + return; + } + this._setScale(val, false); + }, + get currentScaleValue() { + return this._currentScaleValue; + }, + set currentScaleValue(val) { + if (!this.pdfDocument) { + this._currentScale = isNaN(val) ? UNKNOWN_SCALE : val; + this._currentScaleValue = val.toString(); + return; + } + this._setScale(val, false); + }, + get pagesRotation() { + return this._pagesRotation; + }, + set pagesRotation(rotation) { + if (!(typeof rotation === 'number' && rotation % 90 === 0)) { + throw new Error('Invalid pages rotation angle.'); + } + this._pagesRotation = rotation; + if (!this.pdfDocument) { + return; + } + for (var i = 0, l = this._pages.length; i < l; i++) { + var pageView = this._pages[i]; + pageView.update(pageView.scale, rotation); + } + this._setScale(this._currentScaleValue, true); + if (this.defaultRenderingQueue) { + this.update(); + } + }, + setDocument: function (pdfDocument) { + if (this.pdfDocument) { + this._cancelRendering(); + this._resetView(); + } + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + var pagesCount = pdfDocument.numPages; + var self = this; + var resolvePagesPromise; + var pagesPromise = new Promise(function (resolve) { + resolvePagesPromise = resolve; + }); + this.pagesPromise = pagesPromise; + pagesPromise.then(function () { + self._pageViewsReady = true; + self.eventBus.dispatch('pagesloaded', { + source: self, + pagesCount: pagesCount + }); + }); + var isOnePageRenderedResolved = false; + var resolveOnePageRendered = null; + var onePageRendered = new Promise(function (resolve) { + resolveOnePageRendered = resolve; + }); + this.onePageRendered = onePageRendered; + var bindOnAfterAndBeforeDraw = function (pageView) { + pageView.onBeforeDraw = function pdfViewLoadOnBeforeDraw() { + self._buffer.push(this); + }; + pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() { + if (!isOnePageRenderedResolved) { + isOnePageRenderedResolved = true; + resolveOnePageRendered(); + } + }; + }; + var firstPagePromise = pdfDocument.getPage(1); + this.firstPagePromise = firstPagePromise; + return firstPagePromise.then(function (pdfPage) { + var scale = this.currentScale; + var viewport = pdfPage.getViewport(scale * CSS_UNITS); + for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { + var textLayerFactory = null; + if (!pdfjsLib.PDFJS.disableTextLayer) { + textLayerFactory = this; + } + var pageView = new PDFPageView({ + container: this.viewer, + eventBus: this.eventBus, + id: pageNum, + scale: scale, + defaultViewport: viewport.clone(), + renderingQueue: this.renderingQueue, + textLayerFactory: textLayerFactory, + annotationLayerFactory: this, + enhanceTextSelection: this.enhanceTextSelection, + renderInteractiveForms: this.renderInteractiveForms, + renderer: this.renderer + }); + bindOnAfterAndBeforeDraw(pageView); + this._pages.push(pageView); + } + var linkService = this.linkService; + onePageRendered.then(function () { + if (!pdfjsLib.PDFJS.disableAutoFetch) { + var getPagesLeft = pagesCount; + for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { + pdfDocument.getPage(pageNum).then(function (pageNum, pdfPage) { + var pageView = self._pages[pageNum - 1]; + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } + linkService.cachePageRef(pageNum, pdfPage.ref); + getPagesLeft--; + if (!getPagesLeft) { + resolvePagesPromise(); + } + }.bind(null, pageNum)); + } + } else { + resolvePagesPromise(); + } + }); + self.eventBus.dispatch('pagesinit', { source: self }); + if (this.defaultRenderingQueue) { + this.update(); + } + if (this.findController) { + this.findController.resolveFirstPage(); + } + }.bind(this)); + }, + setPageLabels: function PDFViewer_setPageLabels(labels) { + if (!this.pdfDocument) { + return; + } + if (!labels) { + this._pageLabels = null; + } else if (!(labels instanceof Array && this.pdfDocument.numPages === labels.length)) { + this._pageLabels = null; + console.error('PDFViewer_setPageLabels: Invalid page labels.'); + } else { + this._pageLabels = labels; + } + for (var i = 0, ii = this._pages.length; i < ii; i++) { + var pageView = this._pages[i]; + var label = this._pageLabels && this._pageLabels[i]; + pageView.setPageLabel(label); + } + }, + _resetView: function () { + this._pages = []; + this._currentPageNumber = 1; + this._currentScale = UNKNOWN_SCALE; + this._currentScaleValue = null; + this._pageLabels = null; + this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE); + this._location = null; + this._pagesRotation = 0; + this._pagesRequests = []; + this._pageViewsReady = false; + this.viewer.textContent = ''; + }, + _scrollUpdate: function PDFViewer_scrollUpdate() { + if (this.pagesCount === 0) { + return; + } + this.update(); + for (var i = 0, ii = this._pages.length; i < ii; i++) { + this._pages[i].updatePosition(); + } + }, + _setScaleDispatchEvent: function pdfViewer_setScaleDispatchEvent(newScale, newValue, preset) { + var arg = { + source: this, + scale: newScale, + presetValue: preset ? newValue : undefined + }; + this.eventBus.dispatch('scalechanging', arg); + this.eventBus.dispatch('scalechange', arg); + }, + _setScaleUpdatePages: function pdfViewer_setScaleUpdatePages(newScale, newValue, noScroll, preset) { + this._currentScaleValue = newValue.toString(); + if (isSameScale(this._currentScale, newScale)) { + if (preset) { + this._setScaleDispatchEvent(newScale, newValue, true); + } + return; + } + for (var i = 0, ii = this._pages.length; i < ii; i++) { + this._pages[i].update(newScale); + } + this._currentScale = newScale; + if (!noScroll) { + var page = this._currentPageNumber, dest; + if (this._location && !pdfjsLib.PDFJS.ignoreCurrentPositionOnZoom && !(this.isInPresentationMode || this.isChangingPresentationMode)) { + page = this._location.pageNumber; + dest = [ + null, + { name: 'XYZ' }, + this._location.left, + this._location.top, + null + ]; + } + this.scrollPageIntoView({ + pageNumber: page, + destArray: dest, + allowNegativeOffset: true + }); + } + this._setScaleDispatchEvent(newScale, newValue, preset); + if (this.defaultRenderingQueue) { + this.update(); + } + }, + _setScale: function PDFViewer_setScale(value, noScroll) { + var scale = parseFloat(value); + if (scale > 0) { + this._setScaleUpdatePages(scale, value, noScroll, false); + } else { + var currentPage = this._pages[this._currentPageNumber - 1]; + if (!currentPage) { + return; + } + var hPadding = this.isInPresentationMode || this.removePageBorders ? 0 : SCROLLBAR_PADDING; + var vPadding = this.isInPresentationMode || this.removePageBorders ? 0 : VERTICAL_PADDING; + var pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale; + var pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale; + switch (value) { + case 'page-actual': + scale = 1; + break; + case 'page-width': + scale = pageWidthScale; + break; + case 'page-height': + scale = pageHeightScale; + break; + case 'page-fit': + scale = Math.min(pageWidthScale, pageHeightScale); + break; + case 'auto': + var isLandscape = currentPage.width > currentPage.height; + var horizontalScale = isLandscape ? Math.min(pageHeightScale, pageWidthScale) : pageWidthScale; + scale = Math.min(MAX_AUTO_SCALE, horizontalScale); + break; + default: + console.error('PDFViewer_setScale: "' + value + '" is an unknown zoom value.'); + return; + } + this._setScaleUpdatePages(scale, value, noScroll, true); + } + }, + _resetCurrentPageView: function () { + if (this.isInPresentationMode) { + this._setScale(this._currentScaleValue, true); + } + var pageView = this._pages[this._currentPageNumber - 1]; + scrollIntoView(pageView.div); + }, + scrollPageIntoView: function PDFViewer_scrollPageIntoView(params) { + if (!this.pdfDocument) { + return; + } + if (arguments.length > 1 || typeof params === 'number') { + console.warn('Call of scrollPageIntoView() with obsolete signature.'); + var paramObj = {}; + if (typeof params === 'number') { + paramObj.pageNumber = params; + } + if (arguments[1] instanceof Array) { + paramObj.destArray = arguments[1]; + } + params = paramObj; + } + var pageNumber = params.pageNumber || 0; + var dest = params.destArray || null; + var allowNegativeOffset = params.allowNegativeOffset || false; + if (this.isInPresentationMode || !dest) { + this._setCurrentPageNumber(pageNumber, true); + return; + } + var pageView = this._pages[pageNumber - 1]; + if (!pageView) { + console.error('PDFViewer_scrollPageIntoView: ' + 'Invalid "pageNumber" parameter.'); + return; + } + var x = 0, y = 0; + var width = 0, height = 0, widthScale, heightScale; + var changeOrientation = pageView.rotation % 180 === 0 ? false : true; + var pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / CSS_UNITS; + var pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / CSS_UNITS; + var scale = 0; + switch (dest[1].name) { + case 'XYZ': + x = dest[2]; + y = dest[3]; + scale = dest[4]; + x = x !== null ? x : 0; + y = y !== null ? y : pageHeight; + break; + case 'Fit': + case 'FitB': + scale = 'page-fit'; + break; + case 'FitH': + case 'FitBH': + y = dest[2]; + scale = 'page-width'; + if (y === null && this._location) { + x = this._location.left; + y = this._location.top; + } + break; + case 'FitV': + case 'FitBV': + x = dest[2]; + width = pageWidth; + height = pageHeight; + scale = 'page-height'; + break; + case 'FitR': + x = dest[2]; + y = dest[3]; + width = dest[4] - x; + height = dest[5] - y; + var hPadding = this.removePageBorders ? 0 : SCROLLBAR_PADDING; + var vPadding = this.removePageBorders ? 0 : VERTICAL_PADDING; + widthScale = (this.container.clientWidth - hPadding) / width / CSS_UNITS; + heightScale = (this.container.clientHeight - vPadding) / height / CSS_UNITS; + scale = Math.min(Math.abs(widthScale), Math.abs(heightScale)); + break; + default: + console.error('PDFViewer_scrollPageIntoView: \'' + dest[1].name + '\' is not a valid destination type.'); + return; + } + if (scale && scale !== this._currentScale) { + this.currentScaleValue = scale; + } else if (this._currentScale === UNKNOWN_SCALE) { + this.currentScaleValue = DEFAULT_SCALE_VALUE; + } + if (scale === 'page-fit' && !dest[4]) { + scrollIntoView(pageView.div); + return; + } + var boundingRect = [ + pageView.viewport.convertToViewportPoint(x, y), + pageView.viewport.convertToViewportPoint(x + width, y + height) + ]; + var left = Math.min(boundingRect[0][0], boundingRect[1][0]); + var top = Math.min(boundingRect[0][1], boundingRect[1][1]); + if (!allowNegativeOffset) { + left = Math.max(left, 0); + top = Math.max(top, 0); + } + scrollIntoView(pageView.div, { + left: left, + top: top + }); + }, + _updateLocation: function (firstPage) { + var currentScale = this._currentScale; + var currentScaleValue = this._currentScaleValue; + var normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue; + var pageNumber = firstPage.id; + var pdfOpenParams = '#page=' + pageNumber; + pdfOpenParams += '&zoom=' + normalizedScaleValue; + var currentPageView = this._pages[pageNumber - 1]; + var container = this.container; + var topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y); + var intLeft = Math.round(topLeft[0]); + var intTop = Math.round(topLeft[1]); + pdfOpenParams += ',' + intLeft + ',' + intTop; + this._location = { + pageNumber: pageNumber, + scale: normalizedScaleValue, + top: intTop, + left: intLeft, + pdfOpenParams: pdfOpenParams + }; + }, + update: function PDFViewer_update() { + var visible = this._getVisiblePages(); + var visiblePages = visible.views; + if (visiblePages.length === 0) { + return; + } + var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * visiblePages.length + 1); + this._buffer.resize(suggestedCacheSize); + this.renderingQueue.renderHighestPriority(visible); + var currentId = this._currentPageNumber; + var firstPage = visible.first; + for (var i = 0, ii = visiblePages.length, stillFullyVisible = false; i < ii; ++i) { + var page = visiblePages[i]; + if (page.percent < 100) { + break; + } + if (page.id === currentId) { + stillFullyVisible = true; + break; + } + } + if (!stillFullyVisible) { + currentId = visiblePages[0].id; + } + if (!this.isInPresentationMode) { + this._setCurrentPageNumber(currentId); + } + this._updateLocation(firstPage); + this.eventBus.dispatch('updateviewarea', { + source: this, + location: this._location + }); + }, + containsElement: function (element) { + return this.container.contains(element); + }, + focus: function () { + this.container.focus(); + }, + get isInPresentationMode() { + return this.presentationModeState === PresentationModeState.FULLSCREEN; + }, + get isChangingPresentationMode() { + return this.presentationModeState === PresentationModeState.CHANGING; + }, + get isHorizontalScrollbarEnabled() { + return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth; + }, + _getVisiblePages: function () { + if (!this.isInPresentationMode) { + return getVisibleElements(this.container, this._pages, true); + } + var visible = []; + var currentPage = this._pages[this._currentPageNumber - 1]; + visible.push({ + id: currentPage.id, + view: currentPage + }); + return { + first: currentPage, + last: currentPage, + views: visible + }; + }, + cleanup: function () { + for (var i = 0, ii = this._pages.length; i < ii; i++) { + if (this._pages[i] && this._pages[i].renderingState !== RenderingStates.FINISHED) { + this._pages[i].reset(); + } + } + }, + _cancelRendering: function PDFViewer_cancelRendering() { + for (var i = 0, ii = this._pages.length; i < ii; i++) { + if (this._pages[i]) { + this._pages[i].cancelRendering(); + } + } + }, + _ensurePdfPageLoaded: function (pageView) { + if (pageView.pdfPage) { + return Promise.resolve(pageView.pdfPage); + } + var pageNumber = pageView.id; + if (this._pagesRequests[pageNumber]) { + return this._pagesRequests[pageNumber]; + } + var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) { + pageView.setPdfPage(pdfPage); + this._pagesRequests[pageNumber] = null; + return pdfPage; + }.bind(this)); + this._pagesRequests[pageNumber] = promise; + return promise; + }, + forceRendering: function (currentlyVisiblePages) { + var visiblePages = currentlyVisiblePages || this._getVisiblePages(); + var pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, this.scroll.down); + if (pageView) { + this._ensurePdfPageLoaded(pageView).then(function () { + this.renderingQueue.renderView(pageView); + }.bind(this)); + return true; + } + return false; + }, + getPageTextContent: function (pageIndex) { + return this.pdfDocument.getPage(pageIndex + 1).then(function (page) { + return page.getTextContent({ normalizeWhitespace: true }); + }); + }, + createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport, enhanceTextSelection) { + return new TextLayerBuilder({ + textLayerDiv: textLayerDiv, + eventBus: this.eventBus, + pageIndex: pageIndex, + viewport: viewport, + findController: this.isInPresentationMode ? null : this.findController, + enhanceTextSelection: this.isInPresentationMode ? false : enhanceTextSelection + }); + }, + createAnnotationLayerBuilder: function (pageDiv, pdfPage, renderInteractiveForms) { + return new AnnotationLayerBuilder({ + pageDiv: pageDiv, + pdfPage: pdfPage, + renderInteractiveForms: renderInteractiveForms, + linkService: this.linkService, + downloadManager: this.downloadManager + }); + }, + setFindController: function (findController) { + this.findController = findController; + }, + getPagesOverview: function () { + return this._pages.map(function (pageView) { + var viewport = pageView.pdfPage.getViewport(1); + return { + width: viewport.width, + height: viewport.height + }; + }); + } + }; + return PDFViewer; + }(); + exports.PresentationModeState = PresentationModeState; + exports.PDFViewer = PDFViewer; + })); + (function (root, factory) { + factory(root.pdfjsWebApp = {}, root.pdfjsWebUIUtils, root.pdfjsWebDownloadManager, root.pdfjsWebPDFHistory, root.pdfjsWebPreferences, root.pdfjsWebPDFSidebar, root.pdfjsWebViewHistory, root.pdfjsWebPDFThumbnailViewer, root.pdfjsWebToolbar, root.pdfjsWebSecondaryToolbar, root.pdfjsWebPasswordPrompt, root.pdfjsWebPDFPresentationMode, root.pdfjsWebPDFDocumentProperties, root.pdfjsWebHandTool, root.pdfjsWebPDFViewer, root.pdfjsWebPDFRenderingQueue, root.pdfjsWebPDFLinkService, root.pdfjsWebPDFOutlineViewer, root.pdfjsWebOverlayManager, root.pdfjsWebPDFAttachmentViewer, root.pdfjsWebPDFFindController, root.pdfjsWebPDFFindBar, root.pdfjsWebDOMEvents, root.pdfjsWebPDFJS); + }(this, function (exports, uiUtilsLib, downloadManagerLib, pdfHistoryLib, preferencesLib, pdfSidebarLib, viewHistoryLib, pdfThumbnailViewerLib, toolbarLib, secondaryToolbarLib, passwordPromptLib, pdfPresentationModeLib, pdfDocumentPropertiesLib, handToolLib, pdfViewerLib, pdfRenderingQueueLib, pdfLinkServiceLib, pdfOutlineViewerLib, overlayManagerLib, pdfAttachmentViewerLib, pdfFindControllerLib, pdfFindBarLib, domEventsLib, pdfjsLib) { + var UNKNOWN_SCALE = uiUtilsLib.UNKNOWN_SCALE; + var DEFAULT_SCALE_VALUE = uiUtilsLib.DEFAULT_SCALE_VALUE; + var MIN_SCALE = uiUtilsLib.MIN_SCALE; + var MAX_SCALE = uiUtilsLib.MAX_SCALE; + var ProgressBar = uiUtilsLib.ProgressBar; + var getPDFFileNameFromURL = uiUtilsLib.getPDFFileNameFromURL; + var noContextMenuHandler = uiUtilsLib.noContextMenuHandler; + var mozL10n = uiUtilsLib.mozL10n; + var parseQueryString = uiUtilsLib.parseQueryString; + var PDFHistory = pdfHistoryLib.PDFHistory; + var Preferences = preferencesLib.Preferences; + var SidebarView = pdfSidebarLib.SidebarView; + var PDFSidebar = pdfSidebarLib.PDFSidebar; + var ViewHistory = viewHistoryLib.ViewHistory; + var PDFThumbnailViewer = pdfThumbnailViewerLib.PDFThumbnailViewer; + var Toolbar = toolbarLib.Toolbar; + var SecondaryToolbar = secondaryToolbarLib.SecondaryToolbar; + var PasswordPrompt = passwordPromptLib.PasswordPrompt; + var PDFPresentationMode = pdfPresentationModeLib.PDFPresentationMode; + var PDFDocumentProperties = pdfDocumentPropertiesLib.PDFDocumentProperties; + var HandTool = handToolLib.HandTool; + var PresentationModeState = pdfViewerLib.PresentationModeState; + var PDFViewer = pdfViewerLib.PDFViewer; + var RenderingStates = pdfRenderingQueueLib.RenderingStates; + var PDFRenderingQueue = pdfRenderingQueueLib.PDFRenderingQueue; + var PDFLinkService = pdfLinkServiceLib.PDFLinkService; + var PDFOutlineViewer = pdfOutlineViewerLib.PDFOutlineViewer; + var OverlayManager = overlayManagerLib.OverlayManager; + var PDFAttachmentViewer = pdfAttachmentViewerLib.PDFAttachmentViewer; + var PDFFindController = pdfFindControllerLib.PDFFindController; + var PDFFindBar = pdfFindBarLib.PDFFindBar; + var getGlobalEventBus = domEventsLib.getGlobalEventBus; + var normalizeWheelEventDelta = uiUtilsLib.normalizeWheelEventDelta; + var animationStarted = uiUtilsLib.animationStarted; + var localized = uiUtilsLib.localized; + var RendererType = uiUtilsLib.RendererType; + var DEFAULT_SCALE_DELTA = 1.1; + var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000; + function configure(PDFJS) { + PDFJS.imageResourcesPath = IMAGE_LOCATION; + PDFJS.workerSrc = PDFWORKER_LOCATION; + PDFJS.cMapUrl = '../web/cmaps/'; + PDFJS.cMapPacked = true; + } + var DefaultExernalServices = { + updateFindControlState: function (data) { + }, + initPassiveLoading: function (callbacks) { + }, + fallback: function (data, callback) { + }, + reportTelemetry: function (data) { + }, + createDownloadManager: function () { + return new downloadManagerLib.DownloadManager(); + }, + supportsIntegratedFind: false, + supportsDocumentFonts: true, + supportsDocumentColors: true, + supportedMouseWheelZoomModifierKeys: { + ctrlKey: true, + metaKey: true + } + }; + var PDFViewerApplication = { + initialBookmark: document.location.hash.substring(1), + initialDestination: null, + initialized: false, + fellback: false, + appConfig: null, + pdfDocument: null, + pdfLoadingTask: null, + printService: null, + pdfViewer: null, + pdfThumbnailViewer: null, + pdfRenderingQueue: null, + pdfPresentationMode: null, + pdfDocumentProperties: null, + pdfLinkService: null, + pdfHistory: null, + pdfSidebar: null, + pdfOutlineViewer: null, + pdfAttachmentViewer: null, + store: null, + downloadManager: null, + toolbar: null, + secondaryToolbar: null, + eventBus: null, + pageRotation: 0, + isInitialViewSet: false, + viewerPrefs: { + sidebarViewOnLoad: SidebarView.NONE, + pdfBugEnabled: false, + showPreviousViewOnLoad: true, + defaultZoomValue: '', + disablePageLabels: false, + renderer: 'canvas', + enhanceTextSelection: false, + renderInteractiveForms: false + }, + isViewerEmbedded: window.parent !== window, + url: '', + baseUrl: '', + externalServices: DefaultExernalServices, + initialize: function pdfViewInitialize(appConfig) { + var self = this; + var PDFJS = pdfjsLib.PDFJS; + Preferences.initialize(); + this.preferences = Preferences; + configure(PDFJS); + this.appConfig = appConfig; + return this._readPreferences().then(function () { + return self._initializeViewerComponents(); + }).then(function () { + self.bindEvents(); + self.bindWindowEvents(); + localized.then(function () { + self.eventBus.dispatch('localized'); + }); + if (self.isViewerEmbedded && !PDFJS.isExternalLinkTargetSet()) { + PDFJS.externalLinkTarget = PDFJS.LinkTarget.TOP; + } + self.initialized = true; + }); + }, + _readPreferences: function () { + var self = this; + var PDFJS = pdfjsLib.PDFJS; + return Promise.all([ + Preferences.get('enableWebGL').then(function resolved(value) { + PDFJS.disableWebGL = !value; + }), + Preferences.get('sidebarViewOnLoad').then(function resolved(value) { + self.viewerPrefs['sidebarViewOnLoad'] = value; + }), + Preferences.get('pdfBugEnabled').then(function resolved(value) { + self.viewerPrefs['pdfBugEnabled'] = value; + }), + Preferences.get('showPreviousViewOnLoad').then(function resolved(value) { + self.viewerPrefs['showPreviousViewOnLoad'] = value; + }), + Preferences.get('defaultZoomValue').then(function resolved(value) { + self.viewerPrefs['defaultZoomValue'] = value; + }), + Preferences.get('enhanceTextSelection').then(function resolved(value) { + self.viewerPrefs['enhanceTextSelection'] = value; + }), + Preferences.get('disableTextLayer').then(function resolved(value) { + if (PDFJS.disableTextLayer === true) { + return; + } + PDFJS.disableTextLayer = value; + }), + Preferences.get('disableRange').then(function resolved(value) { + if (PDFJS.disableRange === true) { + return; + } + PDFJS.disableRange = value; + }), + Preferences.get('disableStream').then(function resolved(value) { + if (PDFJS.disableStream === true) { + return; + } + PDFJS.disableStream = value; + }), + Preferences.get('disableAutoFetch').then(function resolved(value) { + PDFJS.disableAutoFetch = value; + }), + Preferences.get('disableFontFace').then(function resolved(value) { + if (PDFJS.disableFontFace === true) { + return; + } + PDFJS.disableFontFace = value; + }), + Preferences.get('useOnlyCssZoom').then(function resolved(value) { + PDFJS.useOnlyCssZoom = value; + }), + Preferences.get('externalLinkTarget').then(function resolved(value) { + if (PDFJS.isExternalLinkTargetSet()) { + return; + } + PDFJS.externalLinkTarget = value; + }), + Preferences.get('renderer').then(function resolved(value) { + self.viewerPrefs['renderer'] = value; + }), + Preferences.get('renderInteractiveForms').then(function resolved(value) { + self.viewerPrefs['renderInteractiveForms'] = value; + }), + Preferences.get('disablePageLabels').then(function resolved(value) { + self.viewerPrefs['disablePageLabels'] = value; + }) + ]).catch(function (reason) { + }); + }, + _initializeViewerComponents: function () { + var self = this; + var appConfig = this.appConfig; + return new Promise(function (resolve, reject) { + var eventBus = appConfig.eventBus || getGlobalEventBus(); + self.eventBus = eventBus; + var pdfRenderingQueue = new PDFRenderingQueue(); + pdfRenderingQueue.onIdle = self.cleanup.bind(self); + self.pdfRenderingQueue = pdfRenderingQueue; + var pdfLinkService = new PDFLinkService({ eventBus: eventBus }); + self.pdfLinkService = pdfLinkService; + var downloadManager = self.externalServices.createDownloadManager(); + self.downloadManager = downloadManager; + var container = appConfig.mainContainer; + var viewer = appConfig.viewerContainer; + self.pdfViewer = new PDFViewer({ + container: container, + viewer: viewer, + eventBus: eventBus, + renderingQueue: pdfRenderingQueue, + linkService: pdfLinkService, + downloadManager: downloadManager, + renderer: self.viewerPrefs['renderer'], + enhanceTextSelection: self.viewerPrefs['enhanceTextSelection'], + renderInteractiveForms: self.viewerPrefs['renderInteractiveForms'] + }); + pdfRenderingQueue.setViewer(self.pdfViewer); + pdfLinkService.setViewer(self.pdfViewer); + var thumbnailContainer = appConfig.sidebar.thumbnailView; + self.pdfThumbnailViewer = new PDFThumbnailViewer({ + container: thumbnailContainer, + renderingQueue: pdfRenderingQueue, + linkService: pdfLinkService + }); + pdfRenderingQueue.setThumbnailViewer(self.pdfThumbnailViewer); + self.pdfHistory = new PDFHistory({ + linkService: pdfLinkService, + eventBus: eventBus + }); + pdfLinkService.setHistory(self.pdfHistory); + self.findController = new PDFFindController({ pdfViewer: self.pdfViewer }); + self.findController.onUpdateResultsCount = function (matchCount) { + if (self.supportsIntegratedFind) { + return; + } + self.findBar.updateResultsCount(matchCount); + }; + self.findController.onUpdateState = function (state, previous, matchCount) { + if (self.supportsIntegratedFind) { + self.externalServices.updateFindControlState({ + result: state, + findPrevious: previous + }); + } else { + self.findBar.updateUIState(state, previous, matchCount); + } + }; + self.pdfViewer.setFindController(self.findController); + var findBarConfig = Object.create(appConfig.findBar); + findBarConfig.findController = self.findController; + findBarConfig.eventBus = eventBus; + self.findBar = new PDFFindBar(findBarConfig); + self.overlayManager = OverlayManager; + self.handTool = new HandTool({ + container: container, + eventBus: eventBus + }); + self.pdfDocumentProperties = new PDFDocumentProperties(appConfig.documentProperties); + self.toolbar = new Toolbar(appConfig.toolbar, container, eventBus); + self.secondaryToolbar = new SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus); + if (self.supportsFullscreen) { + self.pdfPresentationMode = new PDFPresentationMode({ + container: container, + viewer: viewer, + pdfViewer: self.pdfViewer, + eventBus: eventBus, + contextMenuItems: appConfig.fullscreen + }); + } + self.passwordPrompt = new PasswordPrompt(appConfig.passwordOverlay); + self.pdfOutlineViewer = new PDFOutlineViewer({ + container: appConfig.sidebar.outlineView, + eventBus: eventBus, + linkService: pdfLinkService + }); + self.pdfAttachmentViewer = new PDFAttachmentViewer({ + container: appConfig.sidebar.attachmentsView, + eventBus: eventBus, + downloadManager: downloadManager + }); + var sidebarConfig = Object.create(appConfig.sidebar); + sidebarConfig.pdfViewer = self.pdfViewer; + sidebarConfig.pdfThumbnailViewer = self.pdfThumbnailViewer; + sidebarConfig.pdfOutlineViewer = self.pdfOutlineViewer; + sidebarConfig.eventBus = eventBus; + self.pdfSidebar = new PDFSidebar(sidebarConfig); + self.pdfSidebar.onToggled = self.forceRendering.bind(self); + resolve(undefined); + }); + }, + run: function pdfViewRun(config) { + this.initialize(config).then(webViewerInitialized); + }, + zoomIn: function pdfViewZoomIn(ticks) { + var newScale = this.pdfViewer.currentScale; + do { + newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2); + newScale = Math.ceil(newScale * 10) / 10; + newScale = Math.min(MAX_SCALE, newScale); + } while (--ticks > 0 && newScale < MAX_SCALE); + this.pdfViewer.currentScaleValue = newScale; + }, + zoomOut: function pdfViewZoomOut(ticks) { + var newScale = this.pdfViewer.currentScale; + do { + newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2); + newScale = Math.floor(newScale * 10) / 10; + newScale = Math.max(MIN_SCALE, newScale); + } while (--ticks > 0 && newScale > MIN_SCALE); + this.pdfViewer.currentScaleValue = newScale; + }, + get pagesCount() { + return this.pdfDocument ? this.pdfDocument.numPages : 0; + }, + set page(val) { + this.pdfViewer.currentPageNumber = val; + }, + get page() { + return this.pdfViewer.currentPageNumber; + }, + get printing() { + return !!this.printService; + }, + get supportsPrinting() { + return PDFPrintServiceFactory.instance.supportsPrinting; + }, + get supportsFullscreen() { + var support; + var doc = document.documentElement; + support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || doc.webkitRequestFullScreen || doc.msRequestFullscreen); + if (document.fullscreenEnabled === false || document.mozFullScreenEnabled === false || document.webkitFullscreenEnabled === false || document.msFullscreenEnabled === false) { + support = false; + } + if (support && pdfjsLib.PDFJS.disableFullscreen === true) { + support = false; + } + return pdfjsLib.shadow(this, 'supportsFullscreen', support); + }, + get supportsIntegratedFind() { + return this.externalServices.supportsIntegratedFind; + }, + get supportsDocumentFonts() { + return this.externalServices.supportsDocumentFonts; + }, + get supportsDocumentColors() { + return this.externalServices.supportsDocumentColors; + }, + get loadingBar() { + var bar = new ProgressBar('#loadingBar', {}); + return pdfjsLib.shadow(this, 'loadingBar', bar); + }, + get supportedMouseWheelZoomModifierKeys() { + return this.externalServices.supportedMouseWheelZoomModifierKeys; + }, + initPassiveLoading: function pdfViewInitPassiveLoading() { + throw new Error('Not implemented: initPassiveLoading'); + }, + setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) { + this.url = url; + this.baseUrl = url.split('#')[0]; + try { + this.setTitle(decodeURIComponent(pdfjsLib.getFilenameFromUrl(url)) || url); + } catch (e) { + this.setTitle(url); + } + }, + setTitle: function pdfViewSetTitle(title) { + if (this.isViewerEmbedded) { + return; + } + document.title = title; + }, + close: function pdfViewClose() { + var errorWrapper = this.appConfig.errorWrapper.container; + errorWrapper.setAttribute('hidden', 'true'); + if (!this.pdfLoadingTask) { + return Promise.resolve(); + } + var promise = this.pdfLoadingTask.destroy(); + this.pdfLoadingTask = null; + if (this.pdfDocument) { + this.pdfDocument = null; + this.pdfThumbnailViewer.setDocument(null); + this.pdfViewer.setDocument(null); + this.pdfLinkService.setDocument(null, null); + } + this.store = null; + this.isInitialViewSet = false; + this.pdfSidebar.reset(); + this.pdfOutlineViewer.reset(); + this.pdfAttachmentViewer.reset(); + this.findController.reset(); + this.findBar.reset(); + this.toolbar.reset(); + this.secondaryToolbar.reset(); + if (typeof PDFBug !== 'undefined') { + PDFBug.cleanup(); + } + return promise; + }, + open: function pdfViewOpen(file, args) { + if (arguments.length > 2 || typeof args === 'number') { + return Promise.reject(new Error('Call of open() with obsolete signature.')); + } + if (this.pdfLoadingTask) { + return this.close().then(function () { + Preferences.reload(); + return this.open(file, args); + }.bind(this)); + } + var parameters = Object.create(null), scale; + if (typeof file === 'string') { + this.setTitleUsingUrl(file); + parameters.url = file; + } else if (file && 'byteLength' in file) { + parameters.data = file; + } else if (file.url && file.originalUrl) { + this.setTitleUsingUrl(file.originalUrl); + parameters.url = file.url; + } + if (args) { + for (var prop in args) { + parameters[prop] = args[prop]; + } + if (args.scale) { + scale = args.scale; + } + if (args.length) { + this.pdfDocumentProperties.setFileSize(args.length); + } + } + var self = this; + self.downloadComplete = false; + var loadingTask = pdfjsLib.getDocument(parameters); + this.pdfLoadingTask = loadingTask; + loadingTask.onPassword = function passwordNeeded(updateCallback, reason) { + self.passwordPrompt.setUpdateCallback(updateCallback, reason); + self.passwordPrompt.open(); + }; + loadingTask.onProgress = function getDocumentProgress(progressData) { + self.progress(progressData.loaded / progressData.total); + }; + loadingTask.onUnsupportedFeature = this.fallback.bind(this); + return loadingTask.promise.then(function getDocumentCallback(pdfDocument) { + self.load(pdfDocument, scale); + }, function getDocumentError(exception) { + var message = exception && exception.message; + var loadingErrorMessage = mozL10n.get('loading_error', null, 'An error occurred while loading the PDF.'); + if (exception instanceof pdfjsLib.InvalidPDFException) { + loadingErrorMessage = mozL10n.get('invalid_file_error', null, 'Invalid or corrupted PDF file.'); + } else if (exception instanceof pdfjsLib.MissingPDFException) { + loadingErrorMessage = mozL10n.get('missing_file_error', null, 'Missing PDF file.'); + } else if (exception instanceof pdfjsLib.UnexpectedResponseException) { + loadingErrorMessage = mozL10n.get('unexpected_response_error', null, 'Unexpected server response.'); + } + var moreInfo = { message: message }; + self.error(loadingErrorMessage, moreInfo); + throw new Error(loadingErrorMessage); + }); + }, + download: function pdfViewDownload() { + function downloadByUrl() { + downloadManager.downloadUrl(url, filename); + } + var url = this.baseUrl; + var filename = getPDFFileNameFromURL(url); + var downloadManager = this.downloadManager; + downloadManager.onerror = function (err) { + PDFViewerApplication.error('PDF failed to download.'); + }; + if (!this.pdfDocument) { + downloadByUrl(); + return; + } + if (!this.downloadComplete) { + downloadByUrl(); + return; + } + this.pdfDocument.getData().then(function getDataSuccess(data) { + var blob = pdfjsLib.createBlob(data, 'application/pdf'); + downloadManager.download(blob, url, filename); + }, downloadByUrl).then(null, downloadByUrl); + }, + fallback: function pdfViewFallback(featureId) { + }, + error: function pdfViewError(message, moreInfo) { + var moreInfoText = mozL10n.get('error_version_info', { + version: pdfjsLib.version || '?', + build: pdfjsLib.build || '?' + }, 'PDF.js v{{version}} (build: {{build}})') + '\n'; + if (moreInfo) { + moreInfoText += mozL10n.get('error_message', { message: moreInfo.message }, 'Message: {{message}}'); + if (moreInfo.stack) { + moreInfoText += '\n' + mozL10n.get('error_stack', { stack: moreInfo.stack }, 'Stack: {{stack}}'); + } else { + if (moreInfo.filename) { + moreInfoText += '\n' + mozL10n.get('error_file', { file: moreInfo.filename }, 'File: {{file}}'); + } + if (moreInfo.lineNumber) { + moreInfoText += '\n' + mozL10n.get('error_line', { line: moreInfo.lineNumber }, 'Line: {{line}}'); + } + } + } + var errorWrapperConfig = this.appConfig.errorWrapper; + var errorWrapper = errorWrapperConfig.container; + errorWrapper.removeAttribute('hidden'); + var errorMessage = errorWrapperConfig.errorMessage; + errorMessage.textContent = message; + var closeButton = errorWrapperConfig.closeButton; + closeButton.onclick = function () { + errorWrapper.setAttribute('hidden', 'true'); + }; + var errorMoreInfo = errorWrapperConfig.errorMoreInfo; + var moreInfoButton = errorWrapperConfig.moreInfoButton; + var lessInfoButton = errorWrapperConfig.lessInfoButton; + moreInfoButton.onclick = function () { + errorMoreInfo.removeAttribute('hidden'); + moreInfoButton.setAttribute('hidden', 'true'); + lessInfoButton.removeAttribute('hidden'); + errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px'; + }; + lessInfoButton.onclick = function () { + errorMoreInfo.setAttribute('hidden', 'true'); + moreInfoButton.removeAttribute('hidden'); + lessInfoButton.setAttribute('hidden', 'true'); + }; + moreInfoButton.oncontextmenu = noContextMenuHandler; + lessInfoButton.oncontextmenu = noContextMenuHandler; + closeButton.oncontextmenu = noContextMenuHandler; + moreInfoButton.removeAttribute('hidden'); + lessInfoButton.setAttribute('hidden', 'true'); + errorMoreInfo.value = moreInfoText; + }, + progress: function pdfViewProgress(level) { + var percent = Math.round(level * 100); + if (percent > this.loadingBar.percent || isNaN(percent)) { + this.loadingBar.percent = percent; + if (pdfjsLib.PDFJS.disableAutoFetch && percent) { + if (this.disableAutoFetchLoadingBarTimeout) { + clearTimeout(this.disableAutoFetchLoadingBarTimeout); + this.disableAutoFetchLoadingBarTimeout = null; + } + this.loadingBar.show(); + this.disableAutoFetchLoadingBarTimeout = setTimeout(function () { + this.loadingBar.hide(); + this.disableAutoFetchLoadingBarTimeout = null; + }.bind(this), DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT); + } + } + }, + load: function pdfViewLoad(pdfDocument, scale) { + var self = this; + scale = scale || UNKNOWN_SCALE; + this.pdfDocument = pdfDocument; + this.pdfDocumentProperties.setDocumentAndUrl(pdfDocument, this.url); + var downloadedPromise = pdfDocument.getDownloadInfo().then(function () { + self.downloadComplete = true; + self.loadingBar.hide(); + }); + this.toolbar.setPagesCount(pdfDocument.numPages, false); + this.secondaryToolbar.setPagesCount(pdfDocument.numPages); + var id = this.documentFingerprint = pdfDocument.fingerprint; + var store = this.store = new ViewHistory(id); + var baseDocumentUrl; + baseDocumentUrl = null; + this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl); + var pdfViewer = this.pdfViewer; + pdfViewer.currentScale = scale; + pdfViewer.setDocument(pdfDocument); + var firstPagePromise = pdfViewer.firstPagePromise; + var pagesPromise = pdfViewer.pagesPromise; + var onePageRendered = pdfViewer.onePageRendered; + this.pageRotation = 0; + var pdfThumbnailViewer = this.pdfThumbnailViewer; + pdfThumbnailViewer.setDocument(pdfDocument); + firstPagePromise.then(function (pdfPage) { + downloadedPromise.then(function () { + self.eventBus.dispatch('documentload', { source: self }); + }); + self.loadingBar.setWidth(self.appConfig.viewerContainer); + if (!pdfjsLib.PDFJS.disableHistory && !self.isViewerEmbedded) { + if (!self.viewerPrefs['showPreviousViewOnLoad']) { + self.pdfHistory.clearHistoryState(); + } + self.pdfHistory.initialize(self.documentFingerprint); + if (self.pdfHistory.initialDestination) { + self.initialDestination = self.pdfHistory.initialDestination; + } else if (self.pdfHistory.initialBookmark) { + self.initialBookmark = self.pdfHistory.initialBookmark; + } + } + var initialParams = { + destination: self.initialDestination, + bookmark: self.initialBookmark, + hash: null + }; + store.initializedPromise.then(function resolved() { + var storedHash = null, sidebarView = null; + if (self.viewerPrefs['showPreviousViewOnLoad'] && store.get('exists', false)) { + var pageNum = store.get('page', '1'); + var zoom = self.viewerPrefs['defaultZoomValue'] || store.get('zoom', DEFAULT_SCALE_VALUE); + var left = store.get('scrollLeft', '0'); + var top = store.get('scrollTop', '0'); + storedHash = 'page=' + pageNum + '&zoom=' + zoom + ',' + left + ',' + top; + sidebarView = store.get('sidebarView', SidebarView.NONE); + } else if (self.viewerPrefs['defaultZoomValue']) { + storedHash = 'page=1&zoom=' + self.viewerPrefs['defaultZoomValue']; + } + self.setInitialView(storedHash, { + scale: scale, + sidebarView: sidebarView + }); + initialParams.hash = storedHash; + if (!self.isViewerEmbedded) { + self.pdfViewer.focus(); + } + }, function rejected(reason) { + console.error(reason); + self.setInitialView(null, { scale: scale }); + }); + pagesPromise.then(function resolved() { + if (!initialParams.destination && !initialParams.bookmark && !initialParams.hash) { + return; + } + if (self.hasEqualPageSizes) { + return; + } + self.initialDestination = initialParams.destination; + self.initialBookmark = initialParams.bookmark; + self.pdfViewer.currentScaleValue = self.pdfViewer.currentScaleValue; + self.setInitialView(initialParams.hash); + }); + }); + pdfDocument.getPageLabels().then(function (labels) { + if (!labels || self.viewerPrefs['disablePageLabels']) { + return; + } + var i = 0, numLabels = labels.length; + if (numLabels !== self.pagesCount) { + console.error('The number of Page Labels does not match ' + 'the number of pages in the document.'); + return; + } + while (i < numLabels && labels[i] === (i + 1).toString()) { + i++; + } + if (i === numLabels) { + return; + } + pdfViewer.setPageLabels(labels); + pdfThumbnailViewer.setPageLabels(labels); + self.toolbar.setPagesCount(pdfDocument.numPages, true); + self.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); + }); + pagesPromise.then(function () { + if (self.supportsPrinting) { + pdfDocument.getJavaScript().then(function (javaScript) { + if (javaScript.length) { + console.warn('Warning: JavaScript is not supported'); + self.fallback(pdfjsLib.UNSUPPORTED_FEATURES.javaScript); + } + var regex = /\bprint\s*\(/; + for (var i = 0, ii = javaScript.length; i < ii; i++) { + var js = javaScript[i]; + if (js && regex.test(js)) { + setTimeout(function () { + window.print(); + }); + return; + } + } + }); + } + }); + Promise.all([ + onePageRendered, + animationStarted + ]).then(function () { + pdfDocument.getOutline().then(function (outline) { + self.pdfOutlineViewer.render({ outline: outline }); + }); + pdfDocument.getAttachments().then(function (attachments) { + self.pdfAttachmentViewer.render({ attachments: attachments }); + }); + }); + pdfDocument.getMetadata().then(function (data) { + var info = data.info, metadata = data.metadata; + self.documentInfo = info; + self.metadata = metadata; + console.log('PDF ' + pdfDocument.fingerprint + ' [' + info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() + ' / ' + (info.Creator || '-').trim() + ']' + ' (PDF.js: ' + (pdfjsLib.version || '-') + (!pdfjsLib.PDFJS.disableWebGL ? ' [WebGL]' : '') + ')'); + var pdfTitle; + if (metadata && metadata.has('dc:title')) { + var title = metadata.get('dc:title'); + if (title !== 'Untitled') { + pdfTitle = title; + } + } + if (!pdfTitle && info && info['Title']) { + pdfTitle = info['Title']; + } + if (pdfTitle) { + self.setTitle(pdfTitle + ' - ' + document.title); + } + if (info.IsAcroFormPresent) { + console.warn('Warning: AcroForm/XFA is not supported'); + self.fallback(pdfjsLib.UNSUPPORTED_FEATURES.forms); + } + }); + }, + setInitialView: function pdfViewSetInitialView(storedHash, options) { + var scale = options && options.scale; + var sidebarView = options && options.sidebarView; + this.isInitialViewSet = true; + this.pdfSidebar.setInitialView(this.viewerPrefs['sidebarViewOnLoad'] || sidebarView | 0); + if (this.initialDestination) { + this.pdfLinkService.navigateTo(this.initialDestination); + this.initialDestination = null; + } else if (this.initialBookmark) { + this.pdfLinkService.setHash(this.initialBookmark); + this.pdfHistory.push({ hash: this.initialBookmark }, true); + this.initialBookmark = null; + } else if (storedHash) { + this.pdfLinkService.setHash(storedHash); + } else if (scale) { + this.pdfViewer.currentScaleValue = scale; + this.page = 1; + } + this.toolbar.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel); + this.secondaryToolbar.setPageNumber(this.pdfViewer.currentPageNumber); + if (!this.pdfViewer.currentScaleValue) { + this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; + } + }, + cleanup: function pdfViewCleanup() { + if (!this.pdfDocument) { + return; + } + this.pdfViewer.cleanup(); + this.pdfThumbnailViewer.cleanup(); + if (this.pdfViewer.renderer !== RendererType.SVG) { + this.pdfDocument.cleanup(); + } + }, + forceRendering: function pdfViewForceRendering() { + this.pdfRenderingQueue.printing = this.printing; + this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar.isThumbnailViewVisible; + this.pdfRenderingQueue.renderHighestPriority(); + }, + beforePrint: function pdfViewSetupBeforePrint() { + if (this.printService) { + return; + } + if (!this.supportsPrinting) { + var printMessage = mozL10n.get('printing_not_supported', null, 'Warning: Printing is not fully supported by this browser.'); + this.error(printMessage); + return; + } + if (!this.pdfViewer.pageViewsReady) { + var notReadyMessage = mozL10n.get('printing_not_ready', null, 'Warning: The PDF is not fully loaded for printing.'); + window.alert(notReadyMessage); + return; + } + var pagesOverview = this.pdfViewer.getPagesOverview(); + var printContainer = this.appConfig.printContainer; + var printService = PDFPrintServiceFactory.instance.createPrintService(this.pdfDocument, pagesOverview, printContainer); + this.printService = printService; + this.forceRendering(); + printService.layout(); + }, + get hasEqualPageSizes() { + var firstPage = this.pdfViewer.getPageView(0); + for (var i = 1, ii = this.pagesCount; i < ii; ++i) { + var pageView = this.pdfViewer.getPageView(i); + if (pageView.width !== firstPage.width || pageView.height !== firstPage.height) { + return false; + } + } + return true; + }, + afterPrint: function pdfViewSetupAfterPrint() { + if (this.printService) { + this.printService.destroy(); + this.printService = null; + } + this.forceRendering(); + }, + rotatePages: function pdfViewRotatePages(delta) { + var pageNumber = this.page; + this.pageRotation = (this.pageRotation + 360 + delta) % 360; + this.pdfViewer.pagesRotation = this.pageRotation; + this.pdfThumbnailViewer.pagesRotation = this.pageRotation; + this.forceRendering(); + this.pdfViewer.currentPageNumber = pageNumber; + }, + requestPresentationMode: function pdfViewRequestPresentationMode() { + if (!this.pdfPresentationMode) { + return; + } + this.pdfPresentationMode.request(); + }, + bindEvents: function pdfViewBindEvents() { + var eventBus = this.eventBus; + eventBus.on('resize', webViewerResize); + eventBus.on('hashchange', webViewerHashchange); + eventBus.on('beforeprint', this.beforePrint.bind(this)); + eventBus.on('afterprint', this.afterPrint.bind(this)); + eventBus.on('pagerendered', webViewerPageRendered); + eventBus.on('textlayerrendered', webViewerTextLayerRendered); + eventBus.on('updateviewarea', webViewerUpdateViewarea); + eventBus.on('pagechanging', webViewerPageChanging); + eventBus.on('scalechanging', webViewerScaleChanging); + eventBus.on('sidebarviewchanged', webViewerSidebarViewChanged); + eventBus.on('pagemode', webViewerPageMode); + eventBus.on('namedaction', webViewerNamedAction); + eventBus.on('presentationmodechanged', webViewerPresentationModeChanged); + eventBus.on('presentationmode', webViewerPresentationMode); + eventBus.on('openfile', webViewerOpenFile); + eventBus.on('print', webViewerPrint); + eventBus.on('download', webViewerDownload); + eventBus.on('firstpage', webViewerFirstPage); + eventBus.on('lastpage', webViewerLastPage); + eventBus.on('nextpage', webViewerNextPage); + eventBus.on('previouspage', webViewerPreviousPage); + eventBus.on('zoomin', webViewerZoomIn); + eventBus.on('zoomout', webViewerZoomOut); + eventBus.on('pagenumberchanged', webViewerPageNumberChanged); + eventBus.on('scalechanged', webViewerScaleChanged); + eventBus.on('rotatecw', webViewerRotateCw); + eventBus.on('rotateccw', webViewerRotateCcw); + eventBus.on('documentproperties', webViewerDocumentProperties); + eventBus.on('find', webViewerFind); + eventBus.on('findfromurlhash', webViewerFindFromUrlHash); + eventBus.on('fileinputchange', webViewerFileInputChange); + }, + bindWindowEvents: function pdfViewBindWindowEvents() { + var eventBus = this.eventBus; + window.addEventListener('wheel', webViewerWheel); + window.addEventListener('click', webViewerClick); + window.addEventListener('keydown', webViewerKeyDown); + window.addEventListener('resize', function windowResize() { + eventBus.dispatch('resize'); + }); + window.addEventListener('hashchange', function windowHashChange() { + eventBus.dispatch('hashchange', { hash: document.location.hash.substring(1) }); + }); + window.addEventListener('beforeprint', function windowBeforePrint() { + eventBus.dispatch('beforeprint'); + }); + window.addEventListener('afterprint', function windowAfterPrint() { + eventBus.dispatch('afterprint'); + }); + window.addEventListener('change', function windowChange(evt) { + var files = evt.target.files; + if (!files || files.length === 0) { + return; + } + eventBus.dispatch('fileinputchange', { fileInput: evt.target }); + }); + } + }; + var validateFileURL; + var HOSTED_VIEWER_ORIGINS = [ + 'null', + 'http://mozilla.github.io', + 'https://mozilla.github.io' + ]; + validateFileURL = function validateFileURL(file) { + try { + var viewerOrigin = new URL(window.location.href).origin || 'null'; + if (HOSTED_VIEWER_ORIGINS.indexOf(viewerOrigin) >= 0) { + return; + } + var fileOrigin = new URL(file, window.location.href).origin; + if (fileOrigin !== viewerOrigin) { + throw new Error('file origin does not match viewer\'s'); + } + } catch (e) { + var message = e && e.message; + var loadingErrorMessage = mozL10n.get('loading_error', null, 'An error occurred while loading the PDF.'); + var moreInfo = { message: message }; + PDFViewerApplication.error(loadingErrorMessage, moreInfo); + throw e; + } + }; + function loadAndEnablePDFBug(enabledTabs) { + return new Promise(function (resolve, reject) { + var appConfig = PDFViewerApplication.appConfig; + var script = document.createElement('script'); + script.src = appConfig.debuggerScriptPath; + script.onload = function () { + PDFBug.enable(enabledTabs); + PDFBug.init(pdfjsLib, appConfig.mainContainer); + resolve(); + }; + script.onerror = function () { + reject(new Error('Cannot load debugger at ' + script.src)); + }; + (document.getElementsByTagName('head')[0] || document.body).appendChild(script); + }); + } + function webViewerInitialized() { + var file; + var queryString = document.location.search.substring(1); + var params = parseQueryString(queryString); + file = 'file' in params ? params.file : DEFAULT_URL; + validateFileURL(file); + var waitForBeforeOpening = []; + var appConfig = PDFViewerApplication.appConfig; + var fileInput = document.createElement('input'); + fileInput.id = appConfig.openFileInputName; + fileInput.className = 'fileInput'; + fileInput.setAttribute('type', 'file'); + fileInput.oncontextmenu = noContextMenuHandler; + document.body.appendChild(fileInput); + if (!window.File || !window.FileReader || !window.FileList || !window.Blob) { + appConfig.toolbar.openFile.setAttribute('hidden', 'true'); + appConfig.secondaryToolbar.openFileButton.setAttribute('hidden', 'true'); + } else { + fileInput.value = null; + } + var PDFJS = pdfjsLib.PDFJS; + if (PDFViewerApplication.viewerPrefs['pdfBugEnabled']) { + var hash = document.location.hash.substring(1); + var hashParams = parseQueryString(hash); + if ('disableworker' in hashParams) { + PDFJS.disableWorker = hashParams['disableworker'] === 'true'; + } + if ('disablerange' in hashParams) { + PDFJS.disableRange = hashParams['disablerange'] === 'true'; + } + if ('disablestream' in hashParams) { + PDFJS.disableStream = hashParams['disablestream'] === 'true'; + } + if ('disableautofetch' in hashParams) { + PDFJS.disableAutoFetch = hashParams['disableautofetch'] === 'true'; + } + if ('disablefontface' in hashParams) { + PDFJS.disableFontFace = hashParams['disablefontface'] === 'true'; + } + if ('disablehistory' in hashParams) { + PDFJS.disableHistory = hashParams['disablehistory'] === 'true'; + } + if ('webgl' in hashParams) { + PDFJS.disableWebGL = hashParams['webgl'] !== 'true'; + } + if ('useonlycsszoom' in hashParams) { + PDFJS.useOnlyCssZoom = hashParams['useonlycsszoom'] === 'true'; + } + if ('verbosity' in hashParams) { + PDFJS.verbosity = hashParams['verbosity'] | 0; + } + if ('ignorecurrentpositiononzoom' in hashParams) { + PDFJS.ignoreCurrentPositionOnZoom = hashParams['ignorecurrentpositiononzoom'] === 'true'; + } + if ('locale' in hashParams) { + PDFJS.locale = hashParams['locale']; + } + if ('textlayer' in hashParams) { + switch (hashParams['textlayer']) { + case 'off': + PDFJS.disableTextLayer = true; + break; + case 'visible': + case 'shadow': + case 'hover': + var viewer = appConfig.viewerContainer; + viewer.classList.add('textLayer-' + hashParams['textlayer']); + break; + } + } + if ('pdfbug' in hashParams) { + PDFJS.pdfBug = true; + var pdfBug = hashParams['pdfbug']; + var enabled = pdfBug.split(','); + waitForBeforeOpening.push(loadAndEnablePDFBug(enabled)); + } + } + mozL10n.setLanguage(PDFJS.locale); + if (!PDFViewerApplication.supportsPrinting) { + appConfig.toolbar.print.classList.add('hidden'); + appConfig.secondaryToolbar.printButton.classList.add('hidden'); + } + if (!PDFViewerApplication.supportsFullscreen) { + appConfig.toolbar.presentationModeButton.classList.add('hidden'); + appConfig.secondaryToolbar.presentationModeButton.classList.add('hidden'); + } + if (PDFViewerApplication.supportsIntegratedFind) { + appConfig.toolbar.viewFind.classList.add('hidden'); + } + appConfig.sidebar.mainContainer.addEventListener('transitionend', function (e) { + if (e.target === this) { + PDFViewerApplication.eventBus.dispatch('resize'); + } + }, true); + appConfig.sidebar.toggleButton.addEventListener('click', function () { + PDFViewerApplication.pdfSidebar.toggle(); + }); + Promise.all(waitForBeforeOpening).then(function () { + webViewerOpenFileViaURL(file); + }).catch(function (reason) { + PDFViewerApplication.error(mozL10n.get('loading_error', null, 'An error occurred while opening.'), reason); + }); + } + var webViewerOpenFileViaURL; + webViewerOpenFileViaURL = function webViewerOpenFileViaURL(file) { + if (file && file.lastIndexOf('file:', 0) === 0) { + PDFViewerApplication.setTitleUsingUrl(file); + var xhr = new XMLHttpRequest(); + xhr.onload = function () { + PDFViewerApplication.open(new Uint8Array(xhr.response)); + }; + try { + xhr.open('GET', file); + xhr.responseType = 'arraybuffer'; + xhr.send(); + } catch (e) { + PDFViewerApplication.error(mozL10n.get('loading_error', null, 'An error occurred while loading the PDF.'), e); + } + return; + } + if (file) { + PDFViewerApplication.open(file); + } + }; + function webViewerPageRendered(e) { + var pageNumber = e.pageNumber; + var pageIndex = pageNumber - 1; + var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex); + if (pageNumber === PDFViewerApplication.page) { + PDFViewerApplication.toolbar.updateLoadingIndicatorState(false); + } + if (!pageView) { + return; + } + if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) { + var thumbnailView = PDFViewerApplication.pdfThumbnailViewer.getThumbnail(pageIndex); + thumbnailView.setImage(pageView); + } + if (pdfjsLib.PDFJS.pdfBug && Stats.enabled && pageView.stats) { + Stats.add(pageNumber, pageView.stats); + } + if (pageView.error) { + PDFViewerApplication.error(mozL10n.get('rendering_error', null, 'An error occurred while rendering the page.'), pageView.error); + } + } + function webViewerTextLayerRendered(e) { + } + function webViewerPageMode(e) { + var mode = e.mode, view; + switch (mode) { + case 'thumbs': + view = SidebarView.THUMBS; + break; + case 'bookmarks': + case 'outline': + view = SidebarView.OUTLINE; + break; + case 'attachments': + view = SidebarView.ATTACHMENTS; + break; + case 'none': + view = SidebarView.NONE; + break; + default: + console.error('Invalid "pagemode" hash parameter: ' + mode); + return; + } + PDFViewerApplication.pdfSidebar.switchView(view, true); + } + function webViewerNamedAction(e) { + var action = e.action; + switch (action) { + case 'GoToPage': + PDFViewerApplication.appConfig.toolbar.pageNumber.select(); + break; + case 'Find': + if (!PDFViewerApplication.supportsIntegratedFind) { + PDFViewerApplication.findBar.toggle(); + } + break; + } + } + function webViewerPresentationModeChanged(e) { + var active = e.active; + var switchInProgress = e.switchInProgress; + PDFViewerApplication.pdfViewer.presentationModeState = switchInProgress ? PresentationModeState.CHANGING : active ? PresentationModeState.FULLSCREEN : PresentationModeState.NORMAL; + } + function webViewerSidebarViewChanged(e) { + PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled = PDFViewerApplication.pdfSidebar.isThumbnailViewVisible; + var store = PDFViewerApplication.store; + if (!store || !PDFViewerApplication.isInitialViewSet) { + return; + } + store.initializedPromise.then(function () { + store.set('sidebarView', e.view).catch(function () { + }); + }); + } + function webViewerUpdateViewarea(e) { + var location = e.location, store = PDFViewerApplication.store; + if (store) { + store.initializedPromise.then(function () { + store.setMultiple({ + 'exists': true, + 'page': location.pageNumber, + 'zoom': location.scale, + 'scrollLeft': location.left, + 'scrollTop': location.top + }).catch(function () { + }); + }); + } + var href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams); + PDFViewerApplication.appConfig.toolbar.viewBookmark.href = href; + PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href = href; + PDFViewerApplication.pdfHistory.updateCurrentBookmark(location.pdfOpenParams, location.pageNumber); + var currentPage = PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1); + var loading = currentPage.renderingState !== RenderingStates.FINISHED; + PDFViewerApplication.toolbar.updateLoadingIndicatorState(loading); + } + function webViewerResize() { + var currentScaleValue = PDFViewerApplication.pdfViewer.currentScaleValue; + if (currentScaleValue === 'auto' || currentScaleValue === 'page-fit' || currentScaleValue === 'page-width') { + PDFViewerApplication.pdfViewer.currentScaleValue = currentScaleValue; + } else if (!currentScaleValue) { + PDFViewerApplication.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; + } + PDFViewerApplication.pdfViewer.update(); + } + function webViewerHashchange(e) { + if (PDFViewerApplication.pdfHistory.isHashChangeUnlocked) { + var hash = e.hash; + if (!hash) { + return; + } + if (!PDFViewerApplication.isInitialViewSet) { + PDFViewerApplication.initialBookmark = hash; + } else { + PDFViewerApplication.pdfLinkService.setHash(hash); + } + } + } + var webViewerFileInputChange; + webViewerFileInputChange = function webViewerFileInputChange(e) { + var file = e.fileInput.files[0]; + if (!pdfjsLib.PDFJS.disableCreateObjectURL && typeof URL !== 'undefined' && URL.createObjectURL) { + PDFViewerApplication.open(URL.createObjectURL(file)); + } else { + var fileReader = new FileReader(); + fileReader.onload = function webViewerChangeFileReaderOnload(evt) { + var buffer = evt.target.result; + var uint8Array = new Uint8Array(buffer); + PDFViewerApplication.open(uint8Array); + }; + fileReader.readAsArrayBuffer(file); + } + PDFViewerApplication.setTitleUsingUrl(file.name); + var appConfig = PDFViewerApplication.appConfig; + appConfig.toolbar.viewBookmark.setAttribute('hidden', 'true'); + appConfig.secondaryToolbar.viewBookmarkButton.setAttribute('hidden', 'true'); + appConfig.toolbar.download.setAttribute('hidden', 'true'); + appConfig.secondaryToolbar.downloadButton.setAttribute('hidden', 'true'); + }; + function webViewerPresentationMode() { + PDFViewerApplication.requestPresentationMode(); + } + function webViewerOpenFile() { + var openFileInputName = PDFViewerApplication.appConfig.openFileInputName; + document.getElementById(openFileInputName).click(); + } + function webViewerPrint() { + window.print(); + } + function webViewerDownload() { + PDFViewerApplication.download(); + } + function webViewerFirstPage() { + if (PDFViewerApplication.pdfDocument) { + PDFViewerApplication.page = 1; + } + } + function webViewerLastPage() { + if (PDFViewerApplication.pdfDocument) { + PDFViewerApplication.page = PDFViewerApplication.pagesCount; + } + } + function webViewerNextPage() { + PDFViewerApplication.page++; + } + function webViewerPreviousPage() { + PDFViewerApplication.page--; + } + function webViewerZoomIn() { + PDFViewerApplication.zoomIn(); + } + function webViewerZoomOut() { + PDFViewerApplication.zoomOut(); + } + function webViewerPageNumberChanged(e) { + var pdfViewer = PDFViewerApplication.pdfViewer; + pdfViewer.currentPageLabel = e.value; + if (e.value !== pdfViewer.currentPageNumber.toString() && e.value !== pdfViewer.currentPageLabel) { + PDFViewerApplication.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); + } + } + function webViewerScaleChanged(e) { + PDFViewerApplication.pdfViewer.currentScaleValue = e.value; + } + function webViewerRotateCw() { + PDFViewerApplication.rotatePages(90); + } + function webViewerRotateCcw() { + PDFViewerApplication.rotatePages(-90); + } + function webViewerDocumentProperties() { + PDFViewerApplication.pdfDocumentProperties.open(); + } + function webViewerFind(e) { + PDFViewerApplication.findController.executeCommand('find' + e.type, { + query: e.query, + phraseSearch: e.phraseSearch, + caseSensitive: e.caseSensitive, + highlightAll: e.highlightAll, + findPrevious: e.findPrevious + }); + } + function webViewerFindFromUrlHash(e) { + PDFViewerApplication.findController.executeCommand('find', { + query: e.query, + phraseSearch: e.phraseSearch, + caseSensitive: false, + highlightAll: true, + findPrevious: false + }); + } + function webViewerScaleChanging(e) { + PDFViewerApplication.toolbar.setPageScale(e.presetValue, e.scale); + PDFViewerApplication.pdfViewer.update(); + } + function webViewerPageChanging(e) { + var page = e.pageNumber; + PDFViewerApplication.toolbar.setPageNumber(page, e.pageLabel || null); + PDFViewerApplication.secondaryToolbar.setPageNumber(page); + if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) { + PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page); + } + if (pdfjsLib.PDFJS.pdfBug && Stats.enabled) { + var pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1); + if (pageView.stats) { + Stats.add(page, pageView.stats); + } + } + } + var zoomDisabled = false, zoomDisabledTimeout; + function webViewerWheel(evt) { + var pdfViewer = PDFViewerApplication.pdfViewer; + if (pdfViewer.isInPresentationMode) { + return; + } + if (evt.ctrlKey || evt.metaKey) { + var support = PDFViewerApplication.supportedMouseWheelZoomModifierKeys; + if (evt.ctrlKey && !support.ctrlKey || evt.metaKey && !support.metaKey) { + return; + } + evt.preventDefault(); + if (zoomDisabled) { + return; + } + var previousScale = pdfViewer.currentScale; + var delta = normalizeWheelEventDelta(evt); + var MOUSE_WHEEL_DELTA_PER_PAGE_SCALE = 3.0; + var ticks = delta * MOUSE_WHEEL_DELTA_PER_PAGE_SCALE; + if (ticks < 0) { + PDFViewerApplication.zoomOut(-ticks); + } else { + PDFViewerApplication.zoomIn(ticks); + } + var currentScale = pdfViewer.currentScale; + if (previousScale !== currentScale) { + var scaleCorrectionFactor = currentScale / previousScale - 1; + var rect = pdfViewer.container.getBoundingClientRect(); + var dx = evt.clientX - rect.left; + var dy = evt.clientY - rect.top; + pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor; + pdfViewer.container.scrollTop += dy * scaleCorrectionFactor; + } + } else { + zoomDisabled = true; + clearTimeout(zoomDisabledTimeout); + zoomDisabledTimeout = setTimeout(function () { + zoomDisabled = false; + }, 1000); + } + } + function webViewerClick(evt) { + if (!PDFViewerApplication.secondaryToolbar.isOpen) { + return; + } + var appConfig = PDFViewerApplication.appConfig; + if (PDFViewerApplication.pdfViewer.containsElement(evt.target) || appConfig.toolbar.container.contains(evt.target) && evt.target !== appConfig.secondaryToolbar.toggleButton) { + PDFViewerApplication.secondaryToolbar.close(); + } + } + function webViewerKeyDown(evt) { + if (OverlayManager.active) { + return; + } + var handled = false, ensureViewerFocused = false; + var cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0); + var pdfViewer = PDFViewerApplication.pdfViewer; + var isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode; + if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) { + switch (evt.keyCode) { + case 70: + if (!PDFViewerApplication.supportsIntegratedFind) { + PDFViewerApplication.findBar.open(); + handled = true; + } + break; + case 71: + if (!PDFViewerApplication.supportsIntegratedFind) { + var findState = PDFViewerApplication.findController.state; + if (findState) { + PDFViewerApplication.findController.executeCommand('findagain', { + query: findState.query, + phraseSearch: findState.phraseSearch, + caseSensitive: findState.caseSensitive, + highlightAll: findState.highlightAll, + findPrevious: cmd === 5 || cmd === 12 + }); + } + handled = true; + } + break; + case 61: + case 107: + case 187: + case 171: + if (!isViewerInPresentationMode) { + PDFViewerApplication.zoomIn(); + } + handled = true; + break; + case 173: + case 109: + case 189: + if (!isViewerInPresentationMode) { + PDFViewerApplication.zoomOut(); + } + handled = true; + break; + case 48: + case 96: + if (!isViewerInPresentationMode) { + setTimeout(function () { + pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; + }); + handled = false; + } + break; + case 38: + if (isViewerInPresentationMode || PDFViewerApplication.page > 1) { + PDFViewerApplication.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 40: + if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) { + PDFViewerApplication.page = PDFViewerApplication.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + } + } + if (cmd === 1 || cmd === 8) { + switch (evt.keyCode) { + case 83: + PDFViewerApplication.download(); + handled = true; + break; + } + } + if (cmd === 3 || cmd === 10) { + switch (evt.keyCode) { + case 80: + PDFViewerApplication.requestPresentationMode(); + handled = true; + break; + case 71: + PDFViewerApplication.appConfig.toolbar.pageNumber.select(); + handled = true; + break; + } + } + if (handled) { + if (ensureViewerFocused && !isViewerInPresentationMode) { + pdfViewer.focus(); + } + evt.preventDefault(); + return; + } + var curElement = document.activeElement || document.querySelector(':focus'); + var curElementTagName = curElement && curElement.tagName.toUpperCase(); + if (curElementTagName === 'INPUT' || curElementTagName === 'TEXTAREA' || curElementTagName === 'SELECT') { + if (evt.keyCode !== 27) { + return; + } + } + if (cmd === 0) { + switch (evt.keyCode) { + case 38: + case 33: + case 8: + if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') { + break; + } + case 37: + if (pdfViewer.isHorizontalScrollbarEnabled) { + break; + } + case 75: + case 80: + if (PDFViewerApplication.page > 1) { + PDFViewerApplication.page--; + } + handled = true; + break; + case 27: + if (PDFViewerApplication.secondaryToolbar.isOpen) { + PDFViewerApplication.secondaryToolbar.close(); + handled = true; + } + if (!PDFViewerApplication.supportsIntegratedFind && PDFViewerApplication.findBar.opened) { + PDFViewerApplication.findBar.close(); + handled = true; + } + break; + case 40: + case 34: + case 32: + if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') { + break; + } + case 39: + if (pdfViewer.isHorizontalScrollbarEnabled) { + break; + } + case 74: + case 78: + if (PDFViewerApplication.page < PDFViewerApplication.pagesCount) { + PDFViewerApplication.page++; + } + handled = true; + break; + case 36: + if (isViewerInPresentationMode || PDFViewerApplication.page > 1) { + PDFViewerApplication.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 35: + if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) { + PDFViewerApplication.page = PDFViewerApplication.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + case 72: + if (!isViewerInPresentationMode) { + PDFViewerApplication.handTool.toggle(); + } + break; + case 82: + PDFViewerApplication.rotatePages(90); + break; + } + } + if (cmd === 4) { + switch (evt.keyCode) { + case 32: + if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') { + break; + } + if (PDFViewerApplication.page > 1) { + PDFViewerApplication.page--; + } + handled = true; + break; + case 82: + PDFViewerApplication.rotatePages(-90); + break; + } + } + if (!handled && !isViewerInPresentationMode) { + if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== 'BUTTON') { + ensureViewerFocused = true; + } + } + if (cmd === 2) { + switch (evt.keyCode) { + case 37: + if (isViewerInPresentationMode) { + PDFViewerApplication.pdfHistory.back(); + handled = true; + } + break; + case 39: + if (isViewerInPresentationMode) { + PDFViewerApplication.pdfHistory.forward(); + handled = true; + } + break; + } + } + if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) { + pdfViewer.focus(); + } + if (handled) { + evt.preventDefault(); + } + } + localized.then(function webViewerLocalized() { + document.getElementsByTagName('html')[0].dir = mozL10n.getDirection(); + }); + var PDFPrintServiceFactory = { + instance: { + supportsPrinting: false, + createPrintService: function () { + throw new Error('Not implemented: createPrintService'); + } + } + }; + exports.PDFViewerApplication = PDFViewerApplication; + exports.DefaultExernalServices = DefaultExernalServices; + exports.PDFPrintServiceFactory = PDFPrintServiceFactory; + })); + (function (root, factory) { + factory(root.pdfjsWebPDFPrintService = {}, root.pdfjsWebUIUtils, root.pdfjsWebOverlayManager, root.pdfjsWebApp, root.pdfjsWebPDFJS); + }(this, function (exports, uiUtils, overlayManager, app, pdfjsLib) { + var mozL10n = uiUtils.mozL10n; + var CSS_UNITS = uiUtils.CSS_UNITS; + var PDFPrintServiceFactory = app.PDFPrintServiceFactory; + var OverlayManager = overlayManager.OverlayManager; + var activeService = null; + function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size) { + var scratchCanvas = activeService.scratchCanvas; + var PRINT_RESOLUTION = 150; + var PRINT_UNITS = PRINT_RESOLUTION / 72.0; + scratchCanvas.width = Math.floor(size.width * PRINT_UNITS); + scratchCanvas.height = Math.floor(size.height * PRINT_UNITS); + var width = Math.floor(size.width * CSS_UNITS) + 'px'; + var height = Math.floor(size.height * CSS_UNITS) + 'px'; + var ctx = scratchCanvas.getContext('2d'); + ctx.save(); + ctx.fillStyle = 'rgb(255, 255, 255)'; + ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height); + ctx.restore(); + return pdfDocument.getPage(pageNumber).then(function (pdfPage) { + var renderContext = { + canvasContext: ctx, + transform: [ + PRINT_UNITS, + 0, + 0, + PRINT_UNITS, + 0, + 0 + ], + viewport: pdfPage.getViewport(1), + intent: 'print' + }; + return pdfPage.render(renderContext).promise; + }).then(function () { + return { + width: width, + height: height + }; + }); + } + function PDFPrintService(pdfDocument, pagesOverview, printContainer) { + this.pdfDocument = pdfDocument; + this.pagesOverview = pagesOverview; + this.printContainer = printContainer; + this.currentPage = -1; + this.scratchCanvas = document.createElement('canvas'); + } + PDFPrintService.prototype = { + layout: function () { + this.throwIfInactive(); + var pdfDocument = this.pdfDocument; + var body = document.querySelector('body'); + body.setAttribute('data-pdfjsprinting', true); + var hasEqualPageSizes = this.pagesOverview.every(function (size) { + return size.width === this.pagesOverview[0].width && size.height === this.pagesOverview[0].height; + }, this); + if (!hasEqualPageSizes) { + console.warn('Not all pages have the same size. The printed ' + 'result may be incorrect!'); + } + this.pageStyleSheet = document.createElement('style'); + var pageSize = this.pagesOverview[0]; + this.pageStyleSheet.textContent = '@supports ((size:A4) and (size:1pt 1pt)) {' + '@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' + '}'; + body.appendChild(this.pageStyleSheet); + }, + destroy: function () { + if (activeService !== this) { + return; + } + this.printContainer.textContent = ''; + if (this.pageStyleSheet && this.pageStyleSheet.parentNode) { + this.pageStyleSheet.parentNode.removeChild(this.pageStyleSheet); + this.pageStyleSheet = null; + } + this.scratchCanvas.width = this.scratchCanvas.height = 0; + this.scratchCanvas = null; + activeService = null; + ensureOverlay().then(function () { + if (OverlayManager.active !== 'printServiceOverlay') { + return; + } + OverlayManager.close('printServiceOverlay'); + }); + }, + renderPages: function () { + var pageCount = this.pagesOverview.length; + var renderNextPage = function (resolve, reject) { + this.throwIfInactive(); + if (++this.currentPage >= pageCount) { + renderProgress(pageCount, pageCount); + resolve(); + return; + } + var index = this.currentPage; + renderProgress(index, pageCount); + renderPage(this, this.pdfDocument, index + 1, this.pagesOverview[index]).then(this.useRenderedPage.bind(this)).then(function () { + renderNextPage(resolve, reject); + }, reject); + }.bind(this); + return new Promise(renderNextPage); + }, + useRenderedPage: function (printItem) { + this.throwIfInactive(); + var img = document.createElement('img'); + img.style.width = printItem.width; + img.style.height = printItem.height; + var scratchCanvas = this.scratchCanvas; + if ('toBlob' in scratchCanvas && !pdfjsLib.PDFJS.disableCreateObjectURL) { + scratchCanvas.toBlob(function (blob) { + img.src = URL.createObjectURL(blob); + }); + } else { + img.src = scratchCanvas.toDataURL(); + } + var wrapper = document.createElement('div'); + wrapper.appendChild(img); + this.printContainer.appendChild(wrapper); + return new Promise(function (resolve, reject) { + img.onload = resolve; + img.onerror = reject; + }); + }, + performPrint: function () { + this.throwIfInactive(); + return new Promise(function (resolve) { + setTimeout(function () { + if (!this.active) { + resolve(); + return; + } + print.call(window); + setTimeout(resolve, 20); + }.bind(this), 0); + }.bind(this)); + }, + get active() { + return this === activeService; + }, + throwIfInactive: function () { + if (!this.active) { + throw new Error('This print request was cancelled or completed.'); + } + } + }; + var print = window.print; + window.print = function print() { + if (activeService) { + console.warn('Ignored window.print() because of a pending print job.'); + return; + } + ensureOverlay().then(function () { + if (activeService) { + OverlayManager.open('printServiceOverlay'); + } + }); + try { + dispatchEvent('beforeprint'); + } finally { + if (!activeService) { + console.error('Expected print service to be initialized.'); + if (OverlayManager.active === 'printServiceOverlay') { + OverlayManager.close('printServiceOverlay'); + } + return; + } + var activeServiceOnEntry = activeService; + activeService.renderPages().then(function () { + return activeServiceOnEntry.performPrint(); + }).catch(function () { + }).then(function () { + if (activeServiceOnEntry.active) { + abort(); + } + }); + } + }; + function dispatchEvent(eventType) { + var event = document.createEvent('CustomEvent'); + event.initCustomEvent(eventType, false, false, 'custom'); + window.dispatchEvent(event); + } + function abort() { + if (activeService) { + activeService.destroy(); + dispatchEvent('afterprint'); + } + } + function renderProgress(index, total) { + var progressContainer = document.getElementById('printServiceOverlay'); + var progress = Math.round(100 * index / total); + var progressBar = progressContainer.querySelector('progress'); + var progressPerc = progressContainer.querySelector('.relative-progress'); + progressBar.value = progress; + progressPerc.textContent = mozL10n.get('print_progress_percent', { progress: progress }, progress + '%'); + } + var hasAttachEvent = !!document.attachEvent; + window.addEventListener('keydown', function (event) { + if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) { + window.print(); + if (hasAttachEvent) { + return; + } + event.preventDefault(); + if (event.stopImmediatePropagation) { + event.stopImmediatePropagation(); + } else { + event.stopPropagation(); + } + return; + } + }, true); + if (hasAttachEvent) { + document.attachEvent('onkeydown', function (event) { + event = event || window.event; + if (event.keyCode === 80 && event.ctrlKey) { + event.keyCode = 0; + return false; + } + }); + } + if ('onbeforeprint' in window) { + var stopPropagationIfNeeded = function (event) { + if (event.detail !== 'custom' && event.stopImmediatePropagation) { + event.stopImmediatePropagation(); + } + }; + window.addEventListener('beforeprint', stopPropagationIfNeeded); + window.addEventListener('afterprint', stopPropagationIfNeeded); + } + var overlayPromise; + function ensureOverlay() { + if (!overlayPromise) { + overlayPromise = OverlayManager.register('printServiceOverlay', document.getElementById('printServiceOverlay'), abort, true); + document.getElementById('printCancel').onclick = abort; + } + return overlayPromise; + } + PDFPrintServiceFactory.instance = { + supportsPrinting: true, + createPrintService: function (pdfDocument, pagesOverview, printContainer) { + if (activeService) { + throw new Error('The print service is created and active.'); + } + activeService = new PDFPrintService(pdfDocument, pagesOverview, printContainer); + return activeService; + } + }; + exports.PDFPrintService = PDFPrintService; + })); + }.call(pdfjsWebLibs)); +} +; +function getViewerConfiguration() { + return { + appContainer: document.body, + mainContainer: document.getElementById('viewerContainer'), + viewerContainer: document.getElementById('viewer'), + eventBus: null, + toolbar: { + container: document.getElementById('toolbarViewer'), + numPages: document.getElementById('numPages'), + pageNumber: document.getElementById('pageNumber'), + scaleSelectContainer: document.getElementById('scaleSelectContainer'), + scaleSelect: document.getElementById('scaleSelect'), + customScaleOption: document.getElementById('customScaleOption'), + previous: document.getElementById('previous'), + next: document.getElementById('next'), + zoomIn: document.getElementById('zoomIn'), + zoomOut: document.getElementById('zoomOut'), + viewFind: document.getElementById('viewFind'), + openFile: document.getElementById('openFile'), + print: document.getElementById('print'), + presentationModeButton: document.getElementById('presentationMode'), + download: document.getElementById('download'), + viewBookmark: document.getElementById('viewBookmark') + }, + secondaryToolbar: { + toolbar: document.getElementById('secondaryToolbar'), + toggleButton: document.getElementById('secondaryToolbarToggle'), + toolbarButtonContainer: document.getElementById('secondaryToolbarButtonContainer'), + presentationModeButton: document.getElementById('secondaryPresentationMode'), + openFileButton: document.getElementById('secondaryOpenFile'), + printButton: document.getElementById('secondaryPrint'), + downloadButton: document.getElementById('secondaryDownload'), + viewBookmarkButton: document.getElementById('secondaryViewBookmark'), + firstPageButton: document.getElementById('firstPage'), + lastPageButton: document.getElementById('lastPage'), + pageRotateCwButton: document.getElementById('pageRotateCw'), + pageRotateCcwButton: document.getElementById('pageRotateCcw'), + toggleHandToolButton: document.getElementById('toggleHandTool'), + documentPropertiesButton: document.getElementById('documentProperties') + }, + fullscreen: { + contextFirstPage: document.getElementById('contextFirstPage'), + contextLastPage: document.getElementById('contextLastPage'), + contextPageRotateCw: document.getElementById('contextPageRotateCw'), + contextPageRotateCcw: document.getElementById('contextPageRotateCcw') + }, + sidebar: { + mainContainer: document.getElementById('mainContainer'), + outerContainer: document.getElementById('outerContainer'), + toggleButton: document.getElementById('sidebarToggle'), + thumbnailButton: document.getElementById('viewThumbnail'), + outlineButton: document.getElementById('viewOutline'), + attachmentsButton: document.getElementById('viewAttachments'), + thumbnailView: document.getElementById('thumbnailView'), + outlineView: document.getElementById('outlineView'), + attachmentsView: document.getElementById('attachmentsView') + }, + findBar: { + bar: document.getElementById('findbar'), + toggleButton: document.getElementById('viewFind'), + findField: document.getElementById('findInput'), + highlightAllCheckbox: document.getElementById('findHighlightAll'), + caseSensitiveCheckbox: document.getElementById('findMatchCase'), + findMsg: document.getElementById('findMsg'), + findResultsCount: document.getElementById('findResultsCount'), + findStatusIcon: document.getElementById('findStatusIcon'), + findPreviousButton: document.getElementById('findPrevious'), + findNextButton: document.getElementById('findNext') + }, + passwordOverlay: { + overlayName: 'passwordOverlay', + container: document.getElementById('passwordOverlay'), + label: document.getElementById('passwordText'), + input: document.getElementById('password'), + submitButton: document.getElementById('passwordSubmit'), + cancelButton: document.getElementById('passwordCancel') + }, + documentProperties: { + overlayName: 'documentPropertiesOverlay', + container: document.getElementById('documentPropertiesOverlay'), + closeButton: document.getElementById('documentPropertiesClose'), + fields: { + 'fileName': document.getElementById('fileNameField'), + 'fileSize': document.getElementById('fileSizeField'), + 'title': document.getElementById('titleField'), + 'author': document.getElementById('authorField'), + 'subject': document.getElementById('subjectField'), + 'keywords': document.getElementById('keywordsField'), + 'creationDate': document.getElementById('creationDateField'), + 'modificationDate': document.getElementById('modificationDateField'), + 'creator': document.getElementById('creatorField'), + 'producer': document.getElementById('producerField'), + 'version': document.getElementById('versionField'), + 'pageCount': document.getElementById('pageCountField') + } + }, + errorWrapper: { + container: document.getElementById('errorWrapper'), + errorMessage: document.getElementById('errorMessage'), + closeButton: document.getElementById('errorClose'), + errorMoreInfo: document.getElementById('errorMoreInfo'), + moreInfoButton: document.getElementById('errorShowMore'), + lessInfoButton: document.getElementById('errorShowLess') + }, + printContainer: document.getElementById('printContainer'), + openFileInputName: 'fileInput', + debuggerScriptPath: './debugger.js' + }; +} +function webViewerLoad() { + var config = getViewerConfiguration(); + window.PDFViewerApplication = pdfjsWebLibs.pdfjsWebApp.PDFViewerApplication; + pdfjsWebLibs.pdfjsWebApp.PDFViewerApplication.run(config); +} +if (document.readyState === 'interactive' || document.readyState === 'complete') { + webViewerLoad(); +} else { + document.addEventListener('DOMContentLoaded', webViewerLoad, true); +} \ No newline at end of file diff --git a/src/cps/static/js/libs/zip.min.js b/src/cps/static/js/libs/zip.min.js new file mode 100644 index 0000000..9834c4a --- /dev/null +++ b/src/cps/static/js/libs/zip.min.js @@ -0,0 +1,29 @@ +/*! + Copyright (c) 2013 Gildas Lormeau. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + + 3. The names of the authors may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, + INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +!function(a){function b(){var a=-1,b=this;b.append=function(c){var d,e=b.table;for(d=0;d>>8^e[255&(a^c[d])]},b.get=function(){return~a}}function c(a,b,c){return a.slice?a.slice(b,b+c):a.webkitSlice?a.webkitSlice(b,b+c):a.mozSlice?a.mozSlice(b,b+c):a.msSlice?a.msSlice(b,b+c):void 0}function d(a,b){var c,d;return c=new ArrayBuffer(a),d=new Uint8Array(c),b&&d.set(b,0),{buffer:c,array:d,view:new DataView(c)}}function e(){}function f(a){function b(b,c){var f=new Blob([a],{type:M});d=new h(f),d.init(function(){e.size=d.size,b()},c)}function c(a,b,c,e){d.readUint8Array(a,b,c,e)}var d,e=this;e.size=0,e.init=b,e.readUint8Array=c}function g(b){function c(a){for(var c=b.length;"="==b.charAt(c-1);)c--;f=b.indexOf(",")+1,g.size=Math.floor(.75*(c-f)),a()}function e(c,e,g){var h,i=d(e),j=4*Math.floor(c/3),k=4*Math.ceil((c+e)/3),l=a.atob(b.substring(j+f,k+f)),m=c-3*Math.floor(j/4);for(h=m;m+e>h;h++)i.array[h-m]=l.charCodeAt(h);g(i.array)}var f,g=this;g.size=0,g.init=c,g.readUint8Array=e}function h(a){function b(b){this.size=a.size,b()}function d(b,d,e,f){var g=new FileReader;g.onload=function(a){e(new Uint8Array(a.target.result))},g.onerror=f,g.readAsArrayBuffer(c(a,b,d))}var e=this;e.size=0,e.init=b,e.readUint8Array=d}function i(){}function j(a){function b(a){e=new Blob([],{type:M}),a()}function c(a,b){e=new Blob([e,A?a:a.buffer],{type:M}),b()}function d(b,c){var d=new FileReader;d.onload=function(a){b(a.target.result)},d.onerror=c,d.readAsText(e,a)}var e,f=this;f.init=b,f.writeUint8Array=c,f.getData=d}function k(b){function c(a){g+="data:"+(b||"")+";base64,",a()}function d(b,c){var d,e=h.length,f=h;for(h="",d=0;d<3*Math.floor((e+b.length)/3)-e;d++)f+=String.fromCharCode(b[d]);for(;d2?g+=a.btoa(f):h=f,c()}function e(b){b(g+a.btoa(h))}var f=this,g="",h="";f.init=c,f.writeUint8Array=d,f.getData=e}function l(a){function b(b){e=new Blob([],{type:a}),b()}function c(b,c){e=new Blob([e,A?b:b.buffer],{type:a}),c()}function d(a){a(e)}var e,f=this;f.init=b,f.writeUint8Array=c,f.getData=d}function m(a,b,c,d,e,f,g,h,i,j){function k(){a.removeEventListener(N,l,!1),h(o)}function l(a){var b=a.data,d=b.data;b.onappend&&(o+=d.length,c.writeUint8Array(d,function(){f(!1,d),m()},j)),b.onflush&&(d?(o+=d.length,c.writeUint8Array(d,function(){f(!1,d),k()},j)):k()),b.progress&&g&&g(n+b.current,e)}function m(){n=p*J,e>n?b.readUint8Array(d+n,Math.min(J,e-n),function(b){a.postMessage({append:!0,data:b}),p++,g&&g(n,e),f(!0,b)},i):a.postMessage({flush:!0})}var n,o,p=0;o=0,a.addEventListener(N,l,!1),m()}function n(a,b,c,d,e,f,g,h,i,j){function k(){var o;l=m*J,e>l?b.readUint8Array(d+l,Math.min(J,e-l),function(b){var h=a.append(b,function(){g&&g(d+l,e)});n+=h.length,f(!0,b),c.writeUint8Array(h,function(){f(!1,h),m++,setTimeout(k,1)},j),g&&g(l,e)},i):(o=a.flush(),o?(n+=o.length,c.writeUint8Array(o,function(){f(!1,o),h(n)},j)):h(n))}var l,m=0,n=0;k()}function o(c,d,e,f,g,h,i,j,k){function l(a,b){g&&!a&&q.append(b)}function o(a){h(a,q.get())}var p,q=new b;return a.zip.useWebWorkers?(p=new Worker(a.zip.workerScriptsPath+K),m(p,c,d,e,f,l,i,o,j,k)):n(new a.zip.Inflater,c,d,e,f,l,i,o,j,k),p}function p(c,d,e,f,g,h,i){function j(a,b){a&&p.append(b)}function k(a){f(a,p.get())}function l(){o.removeEventListener(N,l,!1),m(o,c,d,0,c.size,j,g,k,h,i)}var o,p=new b;return a.zip.useWebWorkers?(o=new Worker(a.zip.workerScriptsPath+L),o.addEventListener(N,l,!1),o.postMessage({init:!0,level:e})):n(new a.zip.Deflater,c,d,0,c.size,j,g,k,h,i),o}function q(a,c,d,e,f,g,h,i,j){function k(){var b=l*J;e>b?a.readUint8Array(d+b,Math.min(J,e-b),function(a){f&&m.append(a),h&&h(b,e,a),c.writeUint8Array(a,function(){l++,k()},j)},i):g(e,m.get())}var l=0,m=new b;k()}function r(a){var b,c,d="",e=["Ç","ü","é","â","ä","à","å","ç","ê","ë","è","ï","î","ì","Ä","Å","É","æ","Æ","ô","ö","ò","û","ù","ÿ","Ö","Ü","ø","£","Ø","×","ƒ","á","í","ó","ú","ñ","Ñ","ª","º","¿","®","¬","½","¼","¡","«","»","_","_","_","¦","¦","Á","Â","À","©","¦","¦","+","+","¢","¥","+","+","-","-","+","-","+","ã","Ã","+","+","-","-","¦","-","+","¤","ð","Ð","Ê","Ë","È","i","Í","Î","Ï","+","+","_","_","¦","Ì","_","Ó","ß","Ô","Ò","õ","Õ","µ","þ","Þ","Ú","Û","Ù","ý","Ý","¯","´","­","±","_","¾","¶","§","÷","¸","°","¨","·","¹","³","²","_"," "];for(b=0;b127?e[c-128]:String.fromCharCode(c);return d}function s(a){return decodeURIComponent(escape(a))}function t(a){var b,c="";for(b=0;b>16,c=65535&a;try{return new Date(1980+((65024&b)>>9),((480&b)>>5)-1,31&b,(63488&c)>>11,(2016&c)>>5,2*(31&c),0)}catch(d){}}function v(a,b,c,d,e){return a.version=b.view.getUint16(c,!0),a.bitFlag=b.view.getUint16(c+2,!0),a.compressionMethod=b.view.getUint16(c+4,!0),a.lastModDateRaw=b.view.getUint32(c+6,!0),a.lastModDate=u(a.lastModDateRaw),1===(1&a.bitFlag)?(e(C),void 0):((d||8!=(8&a.bitFlag))&&(a.crc32=b.view.getUint32(c+10,!0),a.compressedSize=b.view.getUint32(c+14,!0),a.uncompressedSize=b.view.getUint32(c+18,!0)),4294967295===a.compressedSize||4294967295===a.uncompressedSize?(e(D),void 0):(a.filenameLength=b.view.getUint16(c+22,!0),a.extraFieldLength=b.view.getUint16(c+24,!0),void 0))}function w(a,b){function c(){}function e(c,f){a.readUint8Array(a.size-c,c,function(a){var b=d(a.length,a).view;1347093766!=b.getUint32(0)?e(c+1,f):f(b)},function(){b(E)})}return c.prototype.getData=function(c,e,f,g){function h(a,b){m&&m.terminate(),m=null,a&&a(b)}function i(a){var b=d(4);return b.view.setUint32(0,a),n.crc32==b.view.getUint32(0)}function j(a,b){g&&!i(b)?k():c.getData(function(a){h(e,a)})}function k(){h(b,H)}function l(){h(b,G)}var m,n=this;a.readUint8Array(n.offset,30,function(e){var h,i=d(e.length,e);return 1347093252!=i.view.getUint32(0)?(b(B),void 0):(v(n,i,4,!1,b),h=n.offset+30+n.filenameLength+n.extraFieldLength,c.init(function(){0===n.compressionMethod?q(a,c,h,n.compressedSize,g,j,f,k,l):m=o(a,c,h,n.compressedSize,g,j,f,k,l)},l),void 0)},k)},{getEntries:function(f){return a.size<22?(b(B),void 0):(e(22,function(e){var g,h;g=e.getUint32(16,!0),h=e.getUint16(8,!0),a.readUint8Array(g,a.size-g,function(a){var e,g,i,j,k=0,l=[],m=d(a.length,a);for(e=0;h>e;e++){if(g=new c,1347092738!=m.view.getUint32(k))return b(B),void 0;v(g,m,k+6,!0,b),g.commentLength=m.view.getUint16(k+32,!0),g.directory=16==(16&m.view.getUint8(k+38)),g.offset=m.view.getUint32(k+42,!0),i=t(m.array.subarray(k+46,k+46+g.filenameLength)),g.filename=2048===(2048&g.bitFlag)?s(i):r(i),g.directory||"/"!=g.filename.charAt(g.filename.length-1)||(g.directory=!0),j=t(m.array.subarray(k+46+g.filenameLength+g.extraFieldLength,k+46+g.filenameLength+g.extraFieldLength+g.commentLength)),g.comment=2048===(2048&g.bitFlag)?s(j):r(j),l.push(g),k+=46+g.filenameLength+g.extraFieldLength+g.commentLength}f(l)},function(){b(E)})}),void 0)},close:function(a){a&&a()}}}function x(a){return unescape(encodeURIComponent(a))}function y(a){var b,c=[];for(b=0;ba;a++){for(c=a,b=0;8>b;b++)1&c?c=c>>>1^3988292384:c>>>=1;d[a]=c}return d}(),f.prototype=new e,f.prototype.constructor=f,g.prototype=new e,g.prototype.constructor=g,h.prototype=new e,h.prototype.constructor=h,i.prototype.getData=function(a){a(this.data)},j.prototype=new i,j.prototype.constructor=j,k.prototype=new i,k.prototype.constructor=k,l.prototype=new i,l.prototype.constructor=l,a.zip={Reader:e,Writer:i,BlobReader:h,Data64URIReader:g,TextReader:f,BlobWriter:l,Data64URIWriter:k,TextWriter:j,createReader:function(a,b,c){a.init(function(){b(w(a,c))},c)},createWriter:function(a,b,c,d){a.init(function(){b(z(a,c,d))},c)},workerScriptsPath:"",useWebWorkers:!0}}(this),function(){function a(a){function b(b){this.size=a.uncompressedSize,b()}function c(b){f.data?b():a.getData(new r,function(a){f.data=a,e=new v(a),b()},null,f.checkCrc32)}function d(a,b,d,f){c(function(){e.readUint8Array(a,b,d,f)},f)}var e,f=this;f.size=0,f.init=b,f.readUint8Array=d}function b(a){function b(a){c+=a.uncompressedSize||0,a.children.forEach(b)}var c=0;return b(a),c}function c(a,b,d){function e(){g++,g +//
      ...
      +$(document).on("change", "input[type=\"checkbox\"][data-control]", function () { + var $this = $(this); + var name = $this.data("control"); + var showOrHide = $this.prop("checked"); + + $("[data-related=\"" + name + "\"]").each(function () { + $(this).toggle(showOrHide); + }); +}); + +$(function() { + var updateTimerID; + var updateText; + + // Allow ajax prefilters to be added/removed dynamically + // eslint-disable-next-line new-cap + var preFilters = $.Callbacks(); + $.ajaxPrefilter(preFilters.fire); + + function restartTimer() { + $("#spinner").addClass("hidden"); + $("#RestartDialog").modal("hide"); + } + + function updateTimer() { + $.ajax({ + dataType: "json", + url: window.location.pathname + "/../../get_updater_status", + success: function success(data) { + // console.log(data.status); + $("#Updatecontent").html(updateText[data.status]); + if (data.status > 6) { + clearInterval(updateTimerID); + $("#spinner2").hide(); + $("#updateFinished").removeClass("hidden"); + $("#check_for_update").removeClass("hidden"); + $("#perform_update").addClass("hidden"); + } + }, + error: function error() { + // console.log('Done'); + clearInterval(updateTimerID); + $("#spinner2").hide(); + $("#Updatecontent").html(updateText[7]); + $("#updateFinished").removeClass("hidden"); + $("#check_for_update").removeClass("hidden"); + $("#perform_update").addClass("hidden"); + }, + timeout: 2000 + }); + } + + $(".discover .row").isotope({ + // options + itemSelector : ".book", + layoutMode : "fitRows" + }); + + $(".load-more .row").infinitescroll({ + debug: false, + navSelector : ".pagination", + // selector for the paged navigation (it will be hidden) + nextSelector : ".pagination a:last", + // selector for the NEXT link (to page 2) + itemSelector : ".load-more .book", + animate : true, + extraScrollPx: 300 + // selector for all items you'll retrieve + }, function(data) { + $(".load-more .row").isotope( "appended", $(data), null ); + }); + + $("#sendbtn").click(function() { + var $this = $(this); + $this.text("Please wait..."); + $this.addClass("disabled"); + }); + $("#restart").click(function() { + $.ajax({ + dataType: "json", + url: window.location.pathname + "/../../shutdown", + data: {"parameter":0}, + success: function success() { + $("#spinner").show(); + setTimeout(restartTimer, 3000); + } + }); + }); + $("#shutdown").click(function() { + $.ajax({ + dataType: "json", + url: window.location.pathname + "/../../shutdown", + data: {"parameter":1}, + success: function success(data) { + return alert(data.text); + } + }); + }); + $("#check_for_update").click(function() { + var $this = $(this); + var buttonText = $this.html(); + $this.html("..."); + $("#update_error").addClass("hidden") + $.ajax({ + dataType: "json", + url: window.location.pathname + "/../../get_update_status", + success: function success(data) { + $this.html(buttonText); + + var cssClass = ''; + var message = '' + + if (data.success === true) { + if (data.update === true) { + $("#check_for_update").addClass("hidden"); + $("#perform_update").removeClass("hidden"); + $("#update_info") + .removeClass("hidden") + .find("span").html(data.commit); + + data.history.reverse().forEach(function(entry, index) { + $("" + entry[0] + "" + entry[1] + "").appendTo($("#update_table")); + }); + cssClass = 'alert-warning' + } else { + cssClass = 'alert-success' + } + } else { + cssClass = 'alert-danger' + } + + message = '
      ×' + data.message + '
      '; + + $(message).insertAfter($("#update_table")); + } + }); + }); + $("#restart_database").click(function() { + $.ajax({ + dataType: "json", + url: window.location.pathname + "/../../shutdown", + data: {"parameter":2} + }); + }); + $("#perform_update").click(function() { + $("#spinner2").show(); + $.ajax({ + type: "POST", + dataType: "json", + data: { start: "True"}, + url: window.location.pathname + "/../../get_updater_status", + success: function success(data) { + updateText = data.text; + $("#Updatecontent").html(updateText[data.status]); + // console.log(data.status); + updateTimerID = setInterval(updateTimer, 2000); + } + }); + }); + + $("input[data-control]").trigger("change"); + + $("#bookDetailsModal") + .on("show.bs.modal", function(e) { + var $modalBody = $(this).find(".modal-body"); + + // Prevent static assets from loading multiple times + var useCache = function(options) { + options.async = true; + options.cache = true; + }; + preFilters.add(useCache); + + $.get(e.relatedTarget.href).done(function(content) { + $modalBody.html(content); + preFilters.remove(useCache); + }); + }) + .on("hidden.bs.modal", function() { + $(this).find(".modal-body").html("..."); + }); + + $(window).resize(function() { + $(".discover .row").isotope("reLayout"); + }); +}); diff --git a/src/cps/static/js/reading/epub.js b/src/cps/static/js/reading/epub.js new file mode 100644 index 0000000..169c207 --- /dev/null +++ b/src/cps/static/js/reading/epub.js @@ -0,0 +1,43 @@ +/* global $, calibre, EPUBJS, ePubReader */ + +(function() { + "use strict"; + + EPUBJS.filePath = calibre.filePath; + EPUBJS.cssPath = calibre.cssPath; + + var reader = ePubReader(calibre.bookUrl, { + restore: true, + bookmarks: calibre.bookmark ? [calibre.bookmark] : [] + }); + + if (calibre.useBookmarks) { + reader.on("reader:bookmarked", updateBookmark.bind(reader, "add")); + reader.on("reader:unbookmarked", updateBookmark.bind(reader, "remove")); + } else { + $("#bookmark, #show-Bookmarks").remove(); + } + + /** + * @param {string} action - Add or remove bookmark + * @param {string|int} location - Location or zero + */ + function updateBookmark(action, location) { + // Remove other bookmarks (there can only be one) + if (action === "add") { + this.settings.bookmarks.filter(function (bookmark) { + return bookmark && bookmark !== location; + }).map(function (bookmark) { + this.removeBookmark(bookmark); + }.bind(this)); + } + + // Save to database + $.ajax(calibre.bookmarkUrl, { + method: "post", + data: { bookmark: location || "" } + }).fail(function (xhr, status, error) { + alert(error); + }); + } +})(); diff --git a/src/cps/static/js/shelforder.js b/src/cps/static/js/shelforder.js new file mode 100644 index 0000000..36390fb --- /dev/null +++ b/src/cps/static/js/shelforder.js @@ -0,0 +1,32 @@ +/* global Sortable,sortTrue */ + +Sortable.create(sortTrue, { + group: "sorting", + sort: true +}); + +// eslint-disable-next-line no-unused-vars +function sendData(path) { + var elements; + var counter; + var maxElements; + var tmp = []; + + elements = Sortable.utils.find(sortTrue, "div"); + maxElements = elements.length; + + var form = document.createElement("form"); + form.setAttribute("method", "post"); + form.setAttribute("action", path); + + for (counter = 0;counter < maxElements;counter++) { + tmp[counter] = elements[counter].getAttribute("id"); + var hiddenField = document.createElement("input"); + hiddenField.setAttribute("type", "hidden"); + hiddenField.setAttribute("name", elements[counter].getAttribute("id")); + hiddenField.setAttribute("value", String(counter + 1)); + form.appendChild(hiddenField); + } + document.body.appendChild(form); + form.submit(); +} diff --git a/src/cps/static/js/table.js b/src/cps/static/js/table.js new file mode 100644 index 0000000..3c51b74 --- /dev/null +++ b/src/cps/static/js/table.js @@ -0,0 +1,57 @@ +$(function() { + + $("#domain_submit").click(function(event){ + event.preventDefault(); + $("#domain_add").ajaxForm(); + $(this).closest("form").submit(); + $.ajax({ + method:"get", + url: window.location.pathname + "/../../ajax/domainlist", + async: true, + timeout: 900, + success:function(data){ + $('#domain-table').bootstrapTable("load", data); + } + }); + }); + $('#domain-table').bootstrapTable({ + formatNoMatches: function () { + return ''; + }, + striped: false + }); + $("#btndeletedomain").click(function() { + //get data-id attribute of the clicked element + var domainId = $(this).data('domainId'); + $.ajax({ + method:"post", + url: window.location.pathname + "/../../ajax/deletedomain", + data: {"domainid":domainId} + }); + $('#DeleteDomain').modal('hide'); + $.ajax({ + method:"get", + url: window.location.pathname + "/../../ajax/domainlist", + async: true, + timeout: 900, + success:function(data){ + $('#domain-table').bootstrapTable("load", data); + } + }); + + }); + //triggered when modal is about to be shown + $('#DeleteDomain').on('show.bs.modal', function(e) { + //get data-id attribute of the clicked element and store in button + var domainId = $(e.relatedTarget).data('domain-id'); + $(e.currentTarget).find("#btndeletedomain").data('domainId',domainId); + }); +}); + +function TableActions (value, row, index) { + return [ + '', + '', + '' + ].join(''); +} diff --git a/src/cps/static/js/unrar.js b/src/cps/static/js/unrar.js new file mode 100644 index 0000000..3bf3bf2 --- /dev/null +++ b/src/cps/static/js/unrar.js @@ -0,0 +1,901 @@ +/** + * unrar.js + * + * Copyright(c) 2011 Google Inc. + * Copyright(c) 2011 antimatter15 + * + * Reference Documentation: + * + * http://kthoom.googlecode.com/hg/docs/unrar.html + */ +/* global bitjs, importScripts */ + +// This file expects to be invoked as a Worker (see onmessage below). +importScripts("io.js"); +importScripts("archive.js"); + +// Progress variables. +var currentFilename = ""; +var currentFileNumber = 0; +var currentBytesUnarchivedInFile = 0; +var currentBytesUnarchived = 0; +var totalUncompressedBytesInArchive = 0; +var totalFilesInArchive = 0; + +// Helper functions. +var info = function(str) { + postMessage(new bitjs.archive.UnarchiveInfoEvent(str)); +}; +var err = function(str) { + postMessage(new bitjs.archive.UnarchiveErrorEvent(str)); +}; +var postProgress = function() { + postMessage(new bitjs.archive.UnarchiveProgressEvent( + currentFilename, + currentFileNumber, + currentBytesUnarchivedInFile, + currentBytesUnarchived, + totalUncompressedBytesInArchive, + totalFilesInArchive)); +}; + +// shows a byte value as its hex representation +var nibble = "0123456789ABCDEF"; +var byteValueToHexString = function(num) { + return nibble[num >> 4] + nibble[num & 0xF]; +}; +var twoByteValueToHexString = function(num) { + return nibble[(num >> 12) & 0xF] + nibble[(num >> 8) & 0xF] + nibble[(num >> 4) & 0xF] + nibble[num & 0xF]; +}; + + +// Volume Types +// MARK_HEAD = 0x72; +var MAIN_HEAD = 0x73, + FILE_HEAD = 0x74, + // COMM_HEAD = 0x75, + // AV_HEAD = 0x76, + // SUB_HEAD = 0x77, + // PROTECT_HEAD = 0x78, + // SIGN_HEAD = 0x79, + // NEWSUB_HEAD = 0x7a, + ENDARC_HEAD = 0x7b; + +// bstream is a bit stream +var RarVolumeHeader = function(bstream) { + + var headPos = bstream.bytePtr; + // byte 1,2 + info("Rar Volume Header @" + bstream.bytePtr); + + this.crc = bstream.readBits(16); + info(" crc=" + this.crc); + + // byte 3 + this.headType = bstream.readBits(8); + info(" headType=" + this.headType); + + // Get flags + // bytes 4,5 + this.flags = {}; + this.flags.value = bstream.peekBits(16); + + info(" flags=" + twoByteValueToHexString(this.flags.value)); + switch (this.headType) { + case MAIN_HEAD: + this.flags.MHD_VOLUME = !!bstream.readBits(1); + this.flags.MHD_COMMENT = !!bstream.readBits(1); + this.flags.MHD_LOCK = !!bstream.readBits(1); + this.flags.MHD_SOLID = !!bstream.readBits(1); + this.flags.MHD_PACK_COMMENT = !!bstream.readBits(1); + this.flags.MHD_NEWNUMBERING = this.flags.MHD_PACK_COMMENT; + this.flags.MHD_AV = !!bstream.readBits(1); + this.flags.MHD_PROTECT = !!bstream.readBits(1); + this.flags.MHD_PASSWORD = !!bstream.readBits(1); + this.flags.MHD_FIRSTVOLUME = !!bstream.readBits(1); + this.flags.MHD_ENCRYPTVER = !!bstream.readBits(1); + bstream.readBits(6); // unused + break; + case FILE_HEAD: + this.flags.LHD_SPLIT_BEFORE = !!bstream.readBits(1); // 0x0001 + this.flags.LHD_SPLIT_AFTER = !!bstream.readBits(1); // 0x0002 + this.flags.LHD_PASSWORD = !!bstream.readBits(1); // 0x0004 + this.flags.LHD_COMMENT = !!bstream.readBits(1); // 0x0008 + this.flags.LHD_SOLID = !!bstream.readBits(1); // 0x0010 + bstream.readBits(3); // unused + this.flags.LHD_LARGE = !!bstream.readBits(1); // 0x0100 + this.flags.LHD_UNICODE = !!bstream.readBits(1); // 0x0200 + this.flags.LHD_SALT = !!bstream.readBits(1); // 0x0400 + this.flags.LHD_VERSION = !!bstream.readBits(1); // 0x0800 + this.flags.LHD_EXTTIME = !!bstream.readBits(1); // 0x1000 + this.flags.LHD_EXTFLAGS = !!bstream.readBits(1); // 0x2000 + bstream.readBits(2); // unused + info(" LHD_SPLIT_BEFORE = " + this.flags.LHD_SPLIT_BEFORE); + break; + default: + bstream.readBits(16); + } + + // byte 6,7 + this.headSize = bstream.readBits(16); + info(" headSize=" + this.headSize); + switch (this.headType) { + case MAIN_HEAD: + this.highPosAv = bstream.readBits(16); + this.posAv = bstream.readBits(32); + if (this.flags.MHD_ENCRYPTVER) { + this.encryptVer = bstream.readBits(8); + } + info("Found MAIN_HEAD with highPosAv=" + this.highPosAv + ", posAv=" + this.posAv); + break; + case FILE_HEAD: + this.packSize = bstream.readBits(32); + this.unpackedSize = bstream.readBits(32); + this.hostOS = bstream.readBits(8); + this.fileCRC = bstream.readBits(32); + this.fileTime = bstream.readBits(32); + this.unpVer = bstream.readBits(8); + this.method = bstream.readBits(8); + this.nameSize = bstream.readBits(16); + this.fileAttr = bstream.readBits(32); + + if (this.flags.LHD_LARGE) { + info("Warning: Reading in LHD_LARGE 64-bit size values"); + this.HighPackSize = bstream.readBits(32); + this.HighUnpSize = bstream.readBits(32); + } else { + this.HighPackSize = 0; + this.HighUnpSize = 0; + if (this.unpackedSize === 0xffffffff) { + this.HighUnpSize = 0x7fffffff; + this.unpackedSize = 0xffffffff; + } + } + this.fullPackSize = 0; + this.fullUnpackSize = 0; + this.fullPackSize |= this.HighPackSize; + this.fullPackSize <<= 32; + this.fullPackSize |= this.packSize; + + // read in filename + + this.filename = bstream.readBytes(this.nameSize); + var _s = ""; + for (var _i = 0; _i < this.filename.length ; _i++) { + _s += String.fromCharCode(this.filename[_i]); + } + + this.filename = _s; + + if (this.flags.LHD_SALT) { + info("Warning: Reading in 64-bit salt value"); + this.salt = bstream.readBits(64); // 8 bytes + } + + if (this.flags.LHD_EXTTIME) { + // 16-bit flags + var extTimeFlags = bstream.readBits(16); + + // this is adapted straight out of arcread.cpp, Archive::ReadHeader() + for (var I = 0; I < 4; ++I) { + var rmode = extTimeFlags >> ((3 - I) * 4); + if ((rmode & 8) === 0) { + continue; + } + if (I !== 0) { + bstream.readBits(16); + } + var count = (rmode & 3); + for (var J = 0; J < count; ++J) { + bstream.readBits(8); + } + } + } + + if (this.flags.LHD_COMMENT) { + info("Found a LHD_COMMENT"); + } + + + while (headPos + this.headSize > bstream.bytePtr) bstream.readBits(1); + + info("Found FILE_HEAD with packSize=" + this.packSize + ", unpackedSize= " + this.unpackedSize + ", hostOS=" + this.hostOS + ", unpVer=" + this.unpVer + ", method=" + this.method + ", filename=" + this.filename); + + break; + default: + info("Found a header of type 0x" + byteValueToHexString(this.headType)); + // skip the rest of the header bytes (for now) + bstream.readBytes( this.headSize - 7 ); + break; + } +}; + +//var BLOCK_LZ = 0; + +var rLDecode = [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224], + rLBits = [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], + rDBitLengthCounts = [4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 14, 0, 12], + rSDDecode = [0, 4, 8, 16, 32, 64, 128, 192], + rSDBits = [2, 2, 3, 4, 5, 6, 6, 6]; + +var rDDecode = [0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, + 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, + 4096, 6144, 8192, 12288, 16384, 24576, 32768, 49152, 65536, 98304, + 131072, 196608, 262144, 327680, 393216, 458752, 524288, 589824, + 655360, 720896, 786432, 851968, 917504, 983040]; + +var rDBits = [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, 14, 14, + 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]; + +var rLowDistRepCount = 16; + +var rNC = 299, + rDC = 60, + rLDC = 17, + rRC = 28, + rBC = 20, + rHuffTableSize = (rNC + rDC + rRC + rLDC); + +//var UnpBlockType = BLOCK_LZ; +var UnpOldTable = new Array(rHuffTableSize); + +var BD = { //bitdecode + DecodeLen: new Array(16), + DecodePos: new Array(16), + DecodeNum: new Array(rBC) +}; +var LD = { //litdecode + DecodeLen: new Array(16), + DecodePos: new Array(16), + DecodeNum: new Array(rNC) +}; +var DD = { //distdecode + DecodeLen: new Array(16), + DecodePos: new Array(16), + DecodeNum: new Array(rDC) +}; +var LDD = { //low dist decode + DecodeLen: new Array(16), + DecodePos: new Array(16), + DecodeNum: new Array(rLDC) +}; +var RD = { //rep decode + DecodeLen: new Array(16), + DecodePos: new Array(16), + DecodeNum: new Array(rRC) +}; + +var rBuffer; + +// read in Huffman tables for RAR +function RarReadTables(bstream) { + var BitLength = new Array(rBC), + Table = new Array(rHuffTableSize); + var i; + // before we start anything we need to get byte-aligned + bstream.readBits( (8 - bstream.bitPtr) & 0x7 ); + + if (bstream.readBits(1)) { + info("Error! PPM not implemented yet"); + return; + } + + if (!bstream.readBits(1)) { //discard old table + for (i = UnpOldTable.length; i--;) UnpOldTable[i] = 0; + } + + // read in bit lengths + for (var I = 0; I < rBC; ++I) { + + var Length = bstream.readBits(4); + if (Length === 15) { + var ZeroCount = bstream.readBits(4); + if (ZeroCount === 0) { + BitLength[I] = 15; + } else { + ZeroCount += 2; + while (ZeroCount-- > 0 && I < rBC) { + BitLength[I++] = 0; + } + --I; + } + } else { + BitLength[I] = Length; + } + } + + // now all 20 bit lengths are obtained, we construct the Huffman Table: + + rarMakeDecodeTables(BitLength, 0, BD, rBC); + + var TableSize = rHuffTableSize; + //console.log(DecodeLen, DecodePos, DecodeNum); + for (i = 0; i < TableSize;) { + var N; + var num = rarDecodeNumber(bstream, BD); + if (num < 16) { + Table[i] = (num + UnpOldTable[i]) & 0xf; + i++; + } else if (num < 18) { + N = (num === 16) ? (bstream.readBits(3) + 3) : (bstream.readBits(7) + 11); + + while (N-- > 0 && i < TableSize) { + Table[i] = Table[i - 1]; + i++; + } + } else { + N = (num === 18) ? (bstream.readBits(3) + 3) : (bstream.readBits(7) + 11); + + while (N-- > 0 && i < TableSize) { + Table[i++] = 0; + } + } + } + + rarMakeDecodeTables(Table, 0, LD, rNC); + rarMakeDecodeTables(Table, rNC, DD, rDC); + rarMakeDecodeTables(Table, rNC + rDC, LDD, rLDC); + rarMakeDecodeTables(Table, rNC + rDC + rLDC, RD, rRC); + + for (i = UnpOldTable.length; i--;) { + UnpOldTable[i] = Table[i]; + } + return true; +} + + +function rarDecodeNumber(bstream, dec) { + var DecodeLen = dec.DecodeLen, DecodePos = dec.DecodePos, DecodeNum = dec.DecodeNum; + var bitField = bstream.getBits() & 0xfffe; + //some sort of rolled out binary search + var bits = ((bitField < DecodeLen[8]) ? + ((bitField < DecodeLen[4]) ? + ((bitField < DecodeLen[2]) ? + ((bitField < DecodeLen[1]) ? 1 : 2) + : ((bitField < DecodeLen[3]) ? 3 : 4)) + : (bitField < DecodeLen[6]) ? + ((bitField < DecodeLen[5]) ? 5 : 6) + : ((bitField < DecodeLen[7]) ? 7 : 8)) + : ((bitField < DecodeLen[12]) ? + ((bitField < DecodeLen[10]) ? + ((bitField < DecodeLen[9]) ? 9 : 10) + : ((bitField < DecodeLen[11]) ? 11 : 12)) + : (bitField < DecodeLen[14]) ? + ((bitField < DecodeLen[13]) ? 13 : 14) + : 15)); + bstream.readBits(bits); + var N = DecodePos[bits] + ((bitField - DecodeLen[bits - 1]) >>> (16 - bits)); + + return DecodeNum[N]; +} + + +function rarMakeDecodeTables(BitLength, offset, dec, size) { + var DecodeLen = dec.DecodeLen, DecodePos = dec.DecodePos, DecodeNum = dec.DecodeNum; + var LenCount = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + TmpPos = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + N = 0, M = 0; + var i; + for (i = DecodeNum.length; i--;) DecodeNum[i] = 0; + for (i = 0; i < size; i++) { + LenCount[BitLength[i + offset] & 0xF]++; + } + LenCount[0] = 0; + TmpPos[0] = 0; + DecodePos[0] = 0; + DecodeLen[0] = 0; + + var I; + for (I = 1; I < 16; ++I) { + N = 2 * (N + LenCount[I]); + M = (N << (15 - I)); + if (M > 0xFFFF) { + M = 0xFFFF; + } + DecodeLen[I] = M; + DecodePos[I] = DecodePos[I - 1] + LenCount[I - 1]; + TmpPos[I] = DecodePos[I]; + } + for (I = 0; I < size; ++I) { + if (BitLength[I + offset] !== 0) { + DecodeNum[ TmpPos[ BitLength[offset + I] & 0xF ]++] = I; + } + } +} + +// TODO: implement +function Unpack15() { //bstream, Solid) { + info("ERROR! RAR 1.5 compression not supported"); +} + +var lowDistRepCount = 0, prevLowDist = 0; + +var rOldDist = [0, 0, 0, 0]; + +var lastDist = 0; +var lastLength = 0; + +function Unpack20(bstream) { //, Solid) { + var destUnpSize = rBuffer.data.length; + var oldDistPtr = 0; + var Length; + var Distance; + rarReadTables20(bstream); + while (destUnpSize > rBuffer.ptr) { + var num = rarDecodeNumber(bstream, LD); + var Bits; + if (num < 256) { + rBuffer.insertByte(num); + continue; + } + if (num > 269) { + Length = rLDecode[num -= 270] + 3; + if ((Bits = rLBits[num]) > 0) { + Length += bstream.readBits(Bits); + } + var DistNumber = rarDecodeNumber(bstream, DD); + Distance = rDDecode[DistNumber] + 1; + if ((Bits = rDBits[DistNumber]) > 0) { + Distance += bstream.readBits(Bits); + } + if (Distance >= 0x2000) { + Length++; + if (Distance >= 0x40000) Length++; + } + lastLength = Length; + lastDist = rOldDist[oldDistPtr++ & 3] = Distance; + rarCopyString(Length, Distance); + continue; + } + if (num === 269) { + rarReadTables20(bstream); + + rarUpdateProgress(); + + continue; + } + if (num === 256) { + lastDist = rOldDist[oldDistPtr++ & 3] = lastDist; + rarCopyString(lastLength, lastDist); + continue; + } + if (num < 261) { + Distance = rOldDist[(oldDistPtr - (num - 256)) & 3]; + var LengthNumber = rarDecodeNumber(bstream, RD); + Length = rLDecode[LengthNumber] + 2; + if ((Bits = rLBits[LengthNumber]) > 0) { + Length += bstream.readBits(Bits); + } + if (Distance >= 0x101) { + Length++; + if (Distance >= 0x2000) { + Length++; + if (Distance >= 0x40000) Length++; + } + } + lastLength = Length; + lastDist = rOldDist[oldDistPtr++ & 3] = Distance; + rarCopyString(Length, Distance); + continue; + } + if (num < 270) { + var Distance = rSDDecode[num -= 261] + 1; + if ((Bits = rSDBits[num]) > 0) { + Distance += bstream.readBits(Bits); + } + lastLength = 2; + lastDist = rOldDist[oldDistPtr++ & 3] = Distance; + rarCopyString(2, Distance); + continue; + } + } + rarUpdateProgress(); +} + +function rarUpdateProgress() { + var change = rBuffer.ptr - currentBytesUnarchivedInFile; + currentBytesUnarchivedInFile = rBuffer.ptr; + currentBytesUnarchived += change; + postProgress(); +} + + +var rNC20 = 298, + rDC20 = 48, + rRC20 = 28, + rBC20 = 19, + rMC20 = 257; + +var UnpOldTable20 = new Array(rMC20 * 4); + +function rarReadTables20(bstream) { + var BitLength = new Array(rBC20); + var Table = new Array(rMC20 * 4); + var TableSize, N, I; + bstream.readBits(1); + if (!bstream.readBits(1)) { + var i; + for (i = UnpOldTable20.length; i--;) UnpOldTable20[i] = 0; + } + TableSize = rNC20 + rDC20 + rRC20; + for (I = 0; I < rBC20; I++) { + BitLength[I] = bstream.readBits(4); + } + rarMakeDecodeTables(BitLength, 0, BD, rBC20); + I = 0; + while (I < TableSize) { + var num = rarDecodeNumber(bstream, BD); + if (num < 16) { + Table[I] = num + UnpOldTable20[I] & 0xf; + I++; + } else if (num === 16) { + N = bstream.readBits(2) + 3; + while (N-- > 0 && I < TableSize) { + Table[I] = Table[I - 1]; + I++; + } + } else { + if (num === 17) { + N = bstream.readBits(3) + 3; + } else { + N = bstream.readBits(7) + 11; + } + while (N-- > 0 && I < TableSize) { + Table[I++] = 0; + } + } + } + rarMakeDecodeTables(Table, 0, LD, rNC20); + rarMakeDecodeTables(Table, rNC20, DD, rDC20); + rarMakeDecodeTables(Table, rNC20 + rDC20, RD, rRC20); + for (i = UnpOldTable20.length; i--;) UnpOldTable20[i] = Table[i]; +} + + +function Unpack29(bstream, Solid) { + // lazy initialize rDDecode and rDBits + + var DDecode = new Array(rDC); + var DBits = new Array(rDC); + + var Dist = 0, BitLength = 0, Slot = 0; + var I; + for (I = 0; I < rDBitLengthCounts.length; I++,BitLength++) { + for (var J = 0; J < rDBitLengthCounts[I]; J++,Slot++,Dist+=(1<= 271) { + var Length = rLDecode[num -= 271] + 3; + if ((Bits = rLBits[num]) > 0) { + Length += bstream.readBits(Bits); + } + var DistNumber = rarDecodeNumber(bstream, DD); + var Distance = DDecode[DistNumber]+1; + if ((Bits = DBits[DistNumber]) > 0) { + if (DistNumber > 9) { + if (Bits > 4) { + Distance += ((bstream.getBits() >>> (20 - Bits)) << 4); + bstream.readBits(Bits - 4); + //todo: check this + } + if (lowDistRepCount > 0) { + lowDistRepCount--; + Distance += prevLowDist; + } else { + var LowDist = rarDecodeNumber(bstream, LDD); + if (LowDist === 16) { + lowDistRepCount = rLowDistRepCount - 1; + Distance += prevLowDist; + } else { + Distance += LowDist; + prevLowDist = LowDist; + } + } + } else { + Distance += bstream.readBits(Bits); + } + } + if (Distance >= 0x2000) { + Length++; + if (Distance >= 0x40000) { + Length++; + } + } + RarInsertOldDist(Distance); + RarInsertLastMatch(Length, Distance); + rarCopyString(Length, Distance); + continue; + } + if (num === 256) { + if (!RarReadEndOfBlock(bstream)) break; + continue; + } + if (num === 257) { + //console.log("READVMCODE"); + if (!RarReadVMCode(bstream)) break; + continue; + } + if (num === 258) { + if (lastLength != 0) { + rarCopyString(lastLength, lastDist); + } + continue; + } + if (num < 263) { + var DistNum = num - 259; + var Distance = rOldDist[DistNum]; + + for (var I = DistNum; I > 0; I--) { + rOldDist[I] = rOldDist[I-1]; + } + rOldDist[0] = Distance; + + var LengthNumber = rarDecodeNumber(bstream, RD); + var Length = rLDecode[LengthNumber] + 2; + if ((Bits = rLBits[LengthNumber]) > 0) { + Length += bstream.readBits(Bits); + } + RarInsertLastMatch(Length, Distance); + rarCopyString(Length, Distance); + continue; + } + if (num < 272) { + var Distance = rSDDecode[num -= 263] + 1; + if ((Bits = rSDBits[num]) > 0) { + Distance += bstream.readBits(Bits); + } + RarInsertOldDist(Distance); + RarInsertLastMatch(2, Distance); + rarCopyString(2, Distance); + continue; + } + } + rarUpdateProgress() +} + +function RarReadEndOfBlock(bstream) { + + rarUpdateProgress() + + var NewTable = false, NewFile = false; + if (bstream.readBits(1)) { + NewTable = true; + } else { + NewFile = true; + NewTable = !!bstream.readBits(1); + } + //tablesRead = !NewTable; + return !(NewFile || NewTable && !RarReadTables(bstream)); +} + + +function RarReadVMCode(bstream) { + var FirstByte = bstream.readBits(8); + var Length = (FirstByte & 7) + 1; + if (Length === 7) { + Length = bstream.readBits(8) + 7; + } else if (Length === 8) { + Length = bstream.readBits(16); + } + var vmCode = []; + for(var I = 0; I < Length; I++) { + //do something here with cheking readbuf + vmCode.push(bstream.readBits(8)); + } + return RarAddVMCode(FirstByte, vmCode, Length); +} + +function RarAddVMCode(firstByte, vmCode, length) { + //console.log(vmCode); + if (vmCode.length > 0) { + info("Error! RarVM not supported yet!"); + } + return true; +} + +function RarInsertLastMatch(length, distance) { + lastDist = distance; + lastLength = length; +} + +function RarInsertOldDist(distance) { + rOldDist.splice(3,1); + rOldDist.splice(0,0,distance); +} + +//this is the real function, the other one is for debugging +function rarCopyString(length, distance) { + var destPtr = rBuffer.ptr - distance; + if (destPtr < 0) { + var l = rOldBuffers.length; + while (destPtr < 0) { + destPtr = rOldBuffers[--l].data.length + destPtr; + } + //TODO: lets hope that it never needs to read beyond file boundaries + while(length--) rBuffer.insertByte(rOldBuffers[l].data[destPtr++]); + } + if (length > distance) { + while(length--) rBuffer.insertByte(rBuffer.data[destPtr++]); + } else { + rBuffer.insertBytes(rBuffer.data.subarray(destPtr, destPtr + length)); + } +} + +var rOldBuffers = [] +// v must be a valid RarVolume +function unpack(v) { + + // TODO: implement what happens when unpVer is < 15 + var Ver = v.header.unpVer <= 15 ? 15 : v.header.unpVer, + Solid = v.header.LHD_SOLID, + bstream = new bitjs.io.BitStream(v.fileData.buffer, true /* rtl */, v.fileData.byteOffset, v.fileData.byteLength ); + + rBuffer = new bitjs.io.ByteBuffer(v.header.unpackedSize); + + info("Unpacking " + v.filename+" RAR v" + Ver); + + switch(Ver) { + case 15: // rar 1.5 compression + Unpack15(); //(bstream, Solid); + break; + case 20: // rar 2.x compression + case 26: // files larger than 2GB + Unpack20(bstream); //, Solid); + break; + case 29: // rar 3.x compression + case 36: // alternative hash + Unpack29(bstream, Solid); + break; + } // switch(method) + + rOldBuffers.push(rBuffer); + //TODO: clear these old buffers when there's over 4MB of history + return rBuffer.data; +} + +// bstream is a bit stream +var RarLocalFile = function(bstream) { + + this.header = new RarVolumeHeader(bstream); + this.filename = this.header.filename; + + if (this.header.headType != FILE_HEAD && this.header.headType != ENDARC_HEAD) { + this.isValid = false; + info("Error! RAR Volume did not include a FILE_HEAD header "); + } else { + // read in the compressed data + this.fileData = null; + if (this.header.packSize > 0) { + this.fileData = bstream.readBytes(this.header.packSize); + this.isValid = true; + } + } +}; + +RarLocalFile.prototype.unrar = function() { + + if (!this.header.flags.LHD_SPLIT_BEFORE) { + // unstore file + if (this.header.method === 0x30) { + info("Unstore " + this.filename); + this.isValid = true; + + currentBytesUnarchivedInFile += this.fileData.length; + currentBytesUnarchived += this.fileData.length; + + // Create a new buffer and copy it over. + var len = this.header.packSize; + var newBuffer = new bitjs.io.ByteBuffer(len); + newBuffer.insertBytes(this.fileData); + this.fileData = newBuffer.data; + } else { + this.isValid = true; + this.fileData = unpack(this); + } + } +} + +var unrar = function(arrayBuffer) { + currentFilename = ""; + currentFileNumber = 0; + currentBytesUnarchivedInFile = 0; + currentBytesUnarchived = 0; + totalUncompressedBytesInArchive = 0; + totalFilesInArchive = 0; + + postMessage(new bitjs.archive.UnarchiveStartEvent()); + var bstream = new bitjs.io.BitStream(arrayBuffer, false /* rtl */); + + var header = new RarVolumeHeader(bstream); + if (header.crc === 0x6152 && + header.headType === 0x72 && + header.flags.value === 0x1A21 && + header.headSize === 7) + { + info("Found RAR signature"); + + var mhead = new RarVolumeHeader(bstream); + if (mhead.headType != MAIN_HEAD) { + info("Error! RAR did not include a MAIN_HEAD header"); + } else { + var localFiles = [], + localFile = null; + do { + try { + localFile = new RarLocalFile(bstream); + info("RAR localFile isValid=" + localFile.isValid + ", volume packSize=" + localFile.header.packSize); + if (localFile && localFile.isValid && localFile.header.packSize > 0) { + totalUncompressedBytesInArchive += localFile.header.unpackedSize; + localFiles.push(localFile); + } else if (localFile.header.packSize === 0 && localFile.header.unpackedSize === 0) { + localFile.isValid = true; + } + } catch(err) { + break; + } + //info("bstream" + bstream.bytePtr+"/"+bstream.bytes.length); + } while( localFile.isValid ); + totalFilesInArchive = localFiles.length; + + // now we have all information but things are unpacked + // TODO: unpack + localFiles = localFiles.sort(function(a,b) { + var aname = a.filename.toLowerCase(); + var bname = b.filename.toLowerCase(); + return aname > bname ? 1 : -1; + }); + + info(localFiles.map(function(a) {return a.filename}).join(', ')); + for (var i = 0; i < localFiles.length; ++i) { + var localfile = localFiles[i]; + + // update progress + currentFilename = localfile.header.filename; + currentBytesUnarchivedInFile = 0; + + // actually do the unzipping + localfile.unrar(); + + if (localfile.isValid) { + postMessage(new bitjs.archive.UnarchiveExtractEvent(localfile)); + postProgress(); + } + } + + postProgress(); + } + } else { + err("Invalid RAR file"); + } + postMessage(new bitjs.archive.UnarchiveFinishEvent()); +}; + +// event.data.file has the ArrayBuffer. +onmessage = function(event) { + var ab = event.data.file; + unrar(ab, true); +}; diff --git a/src/cps/static/js/untar.js b/src/cps/static/js/untar.js new file mode 100644 index 0000000..ae6a206 --- /dev/null +++ b/src/cps/static/js/untar.js @@ -0,0 +1,209 @@ +/** +* untar.js +* +* Licensed under the MIT License +* +* Copyright(c) 2011 Google Inc. +* +* Reference Documentation: +* +* TAR format: http://www.gnu.org/software/automake/manual/tar/Standard.html +*/ + +// This file expects to be invoked as a Worker (see onmessage below). +importScripts('bytestream.js'); +importScripts('archive.js'); + +const UnarchiveState = { + NOT_STARTED: 0, + UNARCHIVING: 1, + WAITING: 2, + FINISHED: 3, +}; + +// State - consider putting these into a class. +let unarchiveState = UnarchiveState.NOT_STARTED; +let bytestream = null; +let allLocalFiles = null; +let logToConsole = false; + +// Progress variables. +let currentFilename = ""; +let currentFileNumber = 0; +let currentBytesUnarchivedInFile = 0; +let currentBytesUnarchived = 0; +let totalUncompressedBytesInArchive = 0; +let totalFilesInArchive = 0; + +// Helper functions. +const info = function(str) { + postMessage(new bitjs.archive.UnarchiveInfoEvent(str)); +}; +const err = function(str) { + postMessage(new bitjs.archive.UnarchiveErrorEvent(str)); +}; + +// Removes all characters from the first zero-byte in the string onwards. +var readCleanString = function(bstr, numBytes) { + var str = bstr.readString(numBytes); + var zIndex = str.indexOf(String.fromCharCode(0)); + return zIndex != -1 ? str.substr(0, zIndex) : str; +}; + + +const postProgress = function() { + postMessage(new bitjs.archive.UnarchiveProgressEvent( + currentFilename, + currentFileNumber, + currentBytesUnarchivedInFile, + currentBytesUnarchived, + totalUncompressedBytesInArchive, + totalFilesInArchive, + bytestream.getNumBytesRead(), + )); +}; + + +class TarLocalFile { + // takes a ByteStream and parses out the local file information + constructor(bstream) { + this.isValid = false; + + let bytesRead = 0; + + // Read in the header block + this.name = readCleanString(bstream, 100); + this.mode = readCleanString(bstream, 8); + this.uid = readCleanString(bstream, 8); + this.gid = readCleanString(bstream, 8); + this.size = parseInt(readCleanString(bstream, 12), 8); + this.mtime = readCleanString(bstream, 12); + this.chksum = readCleanString(bstream, 8); + this.typeflag = readCleanString(bstream, 1); + this.linkname = readCleanString(bstream, 100); + this.maybeMagic = readCleanString(bstream, 6); + + if (this.maybeMagic == "ustar") { + this.version = readCleanString(bstream, 2); + this.uname = readCleanString(bstream, 32); + this.gname = readCleanString(bstream, 32); + this.devmajor = readCleanString(bstream, 8); + this.devminor = readCleanString(bstream, 8); + this.prefix = readCleanString(bstream, 155); + + if (this.prefix.length) { + this.name = this.prefix + this.name; + } + bstream.readBytes(12); // 512 - 500in + } else { + bstream.readBytes(255); // 512 - 257 + } + + bytesRead += 512; + + // Done header, now rest of blocks are the file contents. + this.filename = this.name; + this.fileData = null; + + info("Untarring file '" + this.filename + "'"); + info(" size = " + this.size); + info(" typeflag = " + this.typeflag); + + // A regular file. + if (this.typeflag == 0) { + info(" This is a regular file."); + const sizeInBytes = parseInt(this.size); + this.fileData = new Uint8Array(bstream.readBytes(sizeInBytes)); + bytesRead += sizeInBytes; + if (this.name.length > 0 && this.size > 0 && this.fileData && this.fileData.buffer) { + this.isValid = true; + } + + // Round up to 512-byte blocks. + const remaining = 512 - bytesRead % 512; + if (remaining > 0 && remaining < 512) { + bstream.readBytes(remaining); + } + } else if (this.typeflag == 5) { + info(" This is a directory.") + } + } +} + +const untar = function() { + let bstream = bytestream.tee(); + + // While we don't encounter an empty block, keep making TarLocalFiles. + while (bstream.peekNumber(4) != 0) { + const oneLocalFile = new TarLocalFile(bstream); + if (oneLocalFile && oneLocalFile.isValid) { + // If we make it to this point and haven't thrown an error, we have successfully + // read in the data for a local file, so we can update the actual bytestream. + bytestream = bstream.tee(); + + allLocalFiles.push(oneLocalFile); + totalUncompressedBytesInArchive += oneLocalFile.size; + + // update progress + currentFilename = oneLocalFile.filename; + currentFileNumber = totalFilesInArchive++; + currentBytesUnarchivedInFile = oneLocalFile.size; + currentBytesUnarchived += oneLocalFile.size; + postMessage(new bitjs.archive.UnarchiveExtractEvent(oneLocalFile)); + postProgress(); + } + } + totalFilesInArchive = allLocalFiles.length; + + postProgress(); + + bytestream = bstream.tee(); +}; + +// event.data.file has the first ArrayBuffer. +// event.data.bytes has all subsequent ArrayBuffers. +onmessage = function(event) { + const bytes = event.data.file || event.data.bytes; + logToConsole = !!event.data.logToConsole; + + // This is the very first time we have been called. Initialize the bytestream. + if (!bytestream) { + bytestream = new bitjs.io.ByteStream(bytes); + } else { + bytestream.push(bytes); + } + + if (unarchiveState === UnarchiveState.NOT_STARTED) { + currentFilename = ""; + currentFileNumber = 0; + currentBytesUnarchivedInFile = 0; + currentBytesUnarchived = 0; + totalUncompressedBytesInArchive = 0; + totalFilesInArchive = 0; + allLocalFiles = []; + + postMessage(new bitjs.archive.UnarchiveStartEvent()); + + unarchiveState = UnarchiveState.UNARCHIVING; + + postProgress(); + } + + if (unarchiveState === UnarchiveState.UNARCHIVING || + unarchiveState === UnarchiveState.WAITING) { + try { + untar(); + unarchiveState = UnarchiveState.FINISHED; + postMessage(new bitjs.archive.UnarchiveFinishEvent()); + } catch (e) { + if (typeof e === 'string' && e.startsWith('Error! Overflowed')) { + // Overrun the buffer. + unarchiveState = UnarchiveState.WAITING; + } else { + console.error('Found an error while untarring'); + console.dir(e); + throw e; + } + } + } +}; diff --git a/src/cps/static/js/unzip.js b/src/cps/static/js/unzip.js new file mode 100644 index 0000000..2b5be91 --- /dev/null +++ b/src/cps/static/js/unzip.js @@ -0,0 +1,618 @@ +/** + * unzip.js + * + * Copyright(c) 2011 Google Inc. + * Copyright(c) 2011 antimatter15 + * + * Reference Documentation: + * + * ZIP format: http://www.pkware.com/documents/casestudies/APPNOTE.TXT + * DEFLATE format: http://tools.ietf.org/html/rfc1951 + */ +/* global bitjs */ + +// This file expects to be invoked as a Worker (see onmessage below). +importScripts("io.js"); +importScripts("archive.js"); + +// Progress variables. +var currentFilename = ""; +var currentFileNumber = 0; +var currentBytesUnarchivedInFile = 0; +var currentBytesUnarchived = 0; +var totalUncompressedBytesInArchive = 0; +var totalFilesInArchive = 0; + +// Helper functions. +var info = function(str) { + postMessage(new bitjs.archive.UnarchiveInfoEvent(str)); +}; +var err = function(str) { + postMessage(new bitjs.archive.UnarchiveErrorEvent(str)); +}; +var postProgress = function() { + postMessage(new bitjs.archive.UnarchiveProgressEvent( + currentFilename, + currentFileNumber, + currentBytesUnarchivedInFile, + currentBytesUnarchived, + totalUncompressedBytesInArchive, + totalFilesInArchive)); +}; + +var zLocalFileHeaderSignature = 0x04034b50; +var zArchiveExtraDataSignature = 0x08064b50; +var zCentralFileHeaderSignature = 0x02014b50; +var zDigitalSignatureSignature = 0x05054b50; +var zEndOfCentralDirSignature = 0x06064b50; +var zEndOfCentralDirLocatorSignature = 0x07064b50; + +// takes a ByteStream and parses out the local file information +var ZipLocalFile = function(bstream) { + if (typeof bstream != typeof {} || !bstream.readNumber || typeof bstream.readNumber != typeof function(){}) { + return null; + } + + bstream.readNumber(4); // swallow signature + this.version = bstream.readNumber(2); + this.generalPurpose = bstream.readNumber(2); + this.compressionMethod = bstream.readNumber(2); + this.lastModFileTime = bstream.readNumber(2); + this.lastModFileDate = bstream.readNumber(2); + this.crc32 = bstream.readNumber(4); + this.compressedSize = bstream.readNumber(4); + this.uncompressedSize = bstream.readNumber(4); + this.fileNameLength = bstream.readNumber(2); + this.extraFieldLength = bstream.readNumber(2); + + this.filename = null; + if (this.fileNameLength > 0) { + this.filename = bstream.readString(this.fileNameLength); + } + + info("Zip Local File Header:"); + info(" version=" + this.version); + info(" general purpose=" + this.generalPurpose); + info(" compression method=" + this.compressionMethod); + info(" last mod file time=" + this.lastModFileTime); + info(" last mod file date=" + this.lastModFileDate); + info(" crc32=" + this.crc32); + info(" compressed size=" + this.compressedSize); + info(" uncompressed size=" + this.uncompressedSize); + info(" file name length=" + this.fileNameLength); + info(" extra field length=" + this.extraFieldLength); + info(" filename = '" + this.filename + "'"); + + this.extraField = null; + if (this.extraFieldLength > 0) { + this.extraField = bstream.readString(this.extraFieldLength); + info(" extra field=" + this.extraField); + } + + // read in the compressed data + this.fileData = null; + if (this.compressedSize > 0) { + this.fileData = new Uint8Array(bstream.bytes.buffer, bstream.ptr, this.compressedSize); + bstream.ptr += this.compressedSize; + } + + // TODO: deal with data descriptor if present (we currently assume no data descriptor!) + // "This descriptor exists only if bit 3 of the general purpose bit flag is set" + // But how do you figure out how big the file data is if you don't know the compressedSize + // from the header?!? + if ((this.generalPurpose & bitjs.BIT[3]) != 0) { + this.crc32 = bstream.readNumber(4); + this.compressedSize = bstream.readNumber(4); + this.uncompressedSize = bstream.readNumber(4); + } +}; + +// determine what kind of compressed data we have and decompress +ZipLocalFile.prototype.unzip = function() { + + // Zip Version 1.0, no compression (store only) + if (this.compressionMethod == 0 ) { + info("ZIP v"+this.version+", store only: " + this.filename + " (" + this.compressedSize + " bytes)"); + currentBytesUnarchivedInFile = this.compressedSize; + currentBytesUnarchived += this.compressedSize; + } + // version == 20, compression method == 8 (DEFLATE) + else if (this.compressionMethod == 8) { + info("ZIP v2.0, DEFLATE: " + this.filename + " (" + this.compressedSize + " bytes)"); + this.fileData = inflate(this.fileData, this.uncompressedSize); + } + else { + err("UNSUPPORTED VERSION/FORMAT: ZIP v" + this.version + ", compression method=" + this.compressionMethod + ": " + this.filename + " (" + this.compressedSize + " bytes)"); + this.fileData = null; + } +}; + + +// Takes an ArrayBuffer of a zip file in +// returns null on error +// returns an array of DecompressedFile objects on success +var unzip = function(arrayBuffer) { + postMessage(new bitjs.archive.UnarchiveStartEvent()); + + currentFilename = ""; + currentFileNumber = 0; + currentBytesUnarchivedInFile = 0; + currentBytesUnarchived = 0; + totalUncompressedBytesInArchive = 0; + totalFilesInArchive = 0; + currentBytesUnarchived = 0; + + var bstream = new bitjs.io.ByteStream(arrayBuffer); + // detect local file header signature or return null + if (bstream.peekNumber(4) == zLocalFileHeaderSignature) { + var localFiles = []; + // loop until we don't see any more local files + while (bstream.peekNumber(4) == zLocalFileHeaderSignature) { + var oneLocalFile = new ZipLocalFile(bstream); + // this should strip out directories/folders + if (oneLocalFile && oneLocalFile.uncompressedSize > 0 && oneLocalFile.fileData) { + localFiles.push(oneLocalFile); + totalUncompressedBytesInArchive += oneLocalFile.uncompressedSize; + } + } + totalFilesInArchive = localFiles.length; + + // got all local files, now sort them + localFiles.sort(function(a,b) { + var aname = a.filename.toLowerCase(); + var bname = b.filename.toLowerCase(); + return aname > bname ? 1 : -1; + }); + + // archive extra data record + if (bstream.peekNumber(4) == zArchiveExtraDataSignature) { + info(" Found an Archive Extra Data Signature"); + + // skipping this record for now + bstream.readNumber(4); + var archiveExtraFieldLength = bstream.readNumber(4); + bstream.readString(archiveExtraFieldLength); + } + + // central directory structure + // TODO: handle the rest of the structures (Zip64 stuff) + if (bstream.peekNumber(4) == zCentralFileHeaderSignature) { + info(" Found a Central File Header"); + + // read all file headers + while (bstream.peekNumber(4) == zCentralFileHeaderSignature) { + bstream.readNumber(4); // signature + bstream.readNumber(2); // version made by + bstream.readNumber(2); // version needed to extract + bstream.readNumber(2); // general purpose bit flag + bstream.readNumber(2); // compression method + bstream.readNumber(2); // last mod file time + bstream.readNumber(2); // last mod file date + bstream.readNumber(4); // crc32 + bstream.readNumber(4); // compressed size + bstream.readNumber(4); // uncompressed size + var fileNameLength = bstream.readNumber(2); // file name length + var extraFieldLength = bstream.readNumber(2); // extra field length + var fileCommentLength = bstream.readNumber(2); // file comment length + bstream.readNumber(2); // disk number start + bstream.readNumber(2); // internal file attributes + bstream.readNumber(4); // external file attributes + bstream.readNumber(4); // relative offset of local header + + bstream.readString(fileNameLength); // file name + bstream.readString(extraFieldLength); // extra field + bstream.readString(fileCommentLength); // file comment + } + } + + // digital signature + if (bstream.peekNumber(4) == zDigitalSignatureSignature) { + info(" Found a Digital Signature"); + + bstream.readNumber(4); + var sizeOfSignature = bstream.readNumber(2); + bstream.readString(sizeOfSignature); // digital signature data + } + + // report # files and total length + if (localFiles.length > 0) { + postProgress(); + } + + // now do the unzipping of each file + for (var i = 0; i < localFiles.length; ++i) { + var localfile = localFiles[i]; + + // update progress + currentFilename = localfile.filename; + currentFileNumber = i; + currentBytesUnarchivedInFile = 0; + + // actually do the unzipping + localfile.unzip(); + + if (localfile.fileData != null) { + postMessage(new bitjs.archive.UnarchiveExtractEvent(localfile)); + postProgress(); + } + } + postProgress(); + postMessage(new bitjs.archive.UnarchiveFinishEvent()); + } +} + +// returns a table of Huffman codes +// each entry's index is its code and its value is a JavaScript object +// containing {length: 6, symbol: X} +function getHuffmanCodes(bitLengths) { + // ensure bitLengths is an array containing at least one element + if (typeof bitLengths != typeof [] || bitLengths.length < 1) { + err("Error! getHuffmanCodes() called with an invalid array"); + return null; + } + + // Reference: http://tools.ietf.org/html/rfc1951#page-8 + var numLengths = bitLengths.length, + bl_count = [], + MAX_BITS = 1; + + // Step 1: count up how many codes of each length we have + for (var i = 0; i < numLengths; ++i) { + var length = bitLengths[i]; + // test to ensure each bit length is a positive, non-zero number + if (typeof length != typeof 1 || length < 0) { + err("bitLengths contained an invalid number in getHuffmanCodes(): " + length + " of type " + (typeof length)); + return null; + } + // increment the appropriate bitlength count + if (bl_count[length] == undefined) bl_count[length] = 0; + // a length of zero means this symbol is not participating in the huffman coding + if (length > 0) bl_count[length]++; + + if (length > MAX_BITS) MAX_BITS = length; + } + + // Step 2: Find the numerical value of the smallest code for each code length + var next_code = [], + code = 0; + for (var bits = 1; bits <= MAX_BITS; ++bits) { + var length = bits-1; + // ensure undefined lengths are zero + if (bl_count[length] == undefined) bl_count[length] = 0; + code = (code + bl_count[bits-1]) << 1; + next_code[bits] = code; + } + + // Step 3: Assign numerical values to all codes + var table = {}, tableLength = 0; + for (var n = 0; n < numLengths; ++n) { + var len = bitLengths[n]; + if (len != 0) { + table[next_code[len]] = { length: len, symbol: n }; //, bitstring: binaryValueToString(next_code[len],len) }; + tableLength++; + next_code[len]++; + } + } + table.maxLength = tableLength; + + return table; +} + +/* + The Huffman codes for the two alphabets are fixed, and are not + represented explicitly in the data. The Huffman code lengths + for the literal/length alphabet are: + + Lit Value Bits Codes + --------- ---- ----- + 0 - 143 8 00110000 through + 10111111 + 144 - 255 9 110010000 through + 111111111 + 256 - 279 7 0000000 through + 0010111 + 280 - 287 8 11000000 through + 11000111 +*/ +// fixed Huffman codes go from 7-9 bits, so we need an array whose index can hold up to 9 bits +var fixedHCtoLiteral = null; +var fixedHCtoDistance = null; +function getFixedLiteralTable() { + // create once + if (!fixedHCtoLiteral) { + var bitlengths = new Array(288); + for (var i = 0; i <= 143; ++i) bitlengths[i] = 8; + for (i = 144; i <= 255; ++i) bitlengths[i] = 9; + for (i = 256; i <= 279; ++i) bitlengths[i] = 7; + for (i = 280; i <= 287; ++i) bitlengths[i] = 8; + + // get huffman code table + fixedHCtoLiteral = getHuffmanCodes(bitlengths); + } + return fixedHCtoLiteral; +} +function getFixedDistanceTable() { + // create once + if (!fixedHCtoDistance) { + var bitlengths = new Array(32); + for (var i = 0; i < 32; ++i) { bitlengths[i] = 5; } + + // get huffman code table + fixedHCtoDistance = getHuffmanCodes(bitlengths); + } + return fixedHCtoDistance; +} + +// extract one bit at a time until we find a matching Huffman Code +// then return that symbol +function decodeSymbol(bstream, hcTable) { + var code = 0, len = 0; + var match = false; + + // loop until we match + for (;;) { + // read in next bit + var bit = bstream.readBits(1); + code = (code<<1) | bit; + ++len; + + // check against Huffman Code table and break if found + if (hcTable.hasOwnProperty(code) && hcTable[code].length == len) { + + break; + } + if (len > hcTable.maxLength) { + err("Bit stream out of sync, didn't find a Huffman Code, length was " + len + + " and table only max code length of " + hcTable.maxLength); + break; + } + } + return hcTable[code].symbol; +} + + +var CodeLengthCodeOrder = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; + /* + Extra Extra Extra + Code Bits Length(s) Code Bits Lengths Code Bits Length(s) + ---- ---- ------ ---- ---- ------- ---- ---- ------- + 257 0 3 267 1 15,16 277 4 67-82 + 258 0 4 268 1 17,18 278 4 83-98 + 259 0 5 269 2 19-22 279 4 99-114 + 260 0 6 270 2 23-26 280 4 115-130 + 261 0 7 271 2 27-30 281 5 131-162 + 262 0 8 272 2 31-34 282 5 163-194 + 263 0 9 273 3 35-42 283 5 195-226 + 264 0 10 274 3 43-50 284 5 227-257 + 265 1 11,12 275 3 51-58 285 0 258 + 266 1 13,14 276 3 59-66 + + */ +var LengthLookupTable = [ + [0,3], [0,4], [0,5], [0,6], + [0,7], [0,8], [0,9], [0,10], + [1,11], [1,13], [1,15], [1,17], + [2,19], [2,23], [2,27], [2,31], + [3,35], [3,43], [3,51], [3,59], + [4,67], [4,83], [4,99], [4,115], + [5,131], [5,163], [5,195], [5,227], + [0,258] +]; + /* + Extra Extra Extra + Code Bits Dist Code Bits Dist Code Bits Distance + ---- ---- ---- ---- ---- ------ ---- ---- -------- + 0 0 1 10 4 33-48 20 9 1025-1536 + 1 0 2 11 4 49-64 21 9 1537-2048 + 2 0 3 12 5 65-96 22 10 2049-3072 + 3 0 4 13 5 97-128 23 10 3073-4096 + 4 1 5,6 14 6 129-192 24 11 4097-6144 + 5 1 7,8 15 6 193-256 25 11 6145-8192 + 6 2 9-12 16 7 257-384 26 12 8193-12288 + 7 2 13-16 17 7 385-512 27 12 12289-16384 + 8 3 17-24 18 8 513-768 28 13 16385-24576 + 9 3 25-32 19 8 769-1024 29 13 24577-32768 + */ +var DistLookupTable = [ + [0,1], [0,2], [0,3], [0,4], + [1,5], [1,7], + [2,9], [2,13], + [3,17], [3,25], + [4,33], [4,49], + [5,65], [5,97], + [6,129], [6,193], + [7,257], [7,385], + [8,513], [8,769], + [9,1025], [9,1537], + [10,2049], [10,3073], + [11,4097], [11,6145], + [12,8193], [12,12289], + [13,16385], [13,24577] +]; + +function inflateBlockData(bstream, hcLiteralTable, hcDistanceTable, buffer) { + /* + loop (until end of block code recognized) + decode literal/length value from input stream + if value < 256 + copy value (literal byte) to output stream + otherwise + if value = end of block (256) + break from loop + otherwise (value = 257..285) + decode distance from input stream + + move backwards distance bytes in the output + stream, and copy length bytes from this + position to the output stream. + */ + var numSymbols = 0, blockSize = 0; + for (;;) { + var symbol = decodeSymbol(bstream, hcLiteralTable); + ++numSymbols; + if (symbol < 256) { + // copy literal byte to output + buffer.insertByte(symbol); + blockSize++; + } + else { + // end of block reached + if (symbol == 256) { + break; + } + else { + var lengthLookup = LengthLookupTable[symbol-257], + length = lengthLookup[1] + bstream.readBits(lengthLookup[0]), + distLookup = DistLookupTable[decodeSymbol(bstream, hcDistanceTable)], + distance = distLookup[1] + bstream.readBits(distLookup[0]); + + // now apply length and distance appropriately and copy to output + + // TODO: check that backward distance < data.length? + + // http://tools.ietf.org/html/rfc1951#page-11 + // "Note also that the referenced string may overlap the current + // position; for example, if the last 2 bytes decoded have values + // X and Y, a string reference with + // adds X,Y,X,Y,X to the output stream." + // + // loop for each character + var ch = buffer.ptr - distance; + blockSize += length; + if(length > distance) { + var data = buffer.data; + while (length--) { + buffer.insertByte(data[ch++]); + } + } else { + buffer.insertBytes(buffer.data.subarray(ch, ch + length)) + } + + } // length-distance pair + } // length-distance pair or end-of-block + } // loop until we reach end of block + return blockSize; +} + +// {Uint8Array} compressedData A Uint8Array of the compressed file data. +// compression method 8 +// deflate: http://tools.ietf.org/html/rfc1951 +function inflate(compressedData, numDecompressedBytes) { + // Bit stream representing the compressed data. + var bstream = new bitjs.io.BitStream(compressedData.buffer, + false /* rtl */, + compressedData.byteOffset, + compressedData.byteLength); + var buffer = new bitjs.io.ByteBuffer(numDecompressedBytes); + var numBlocks = 0, blockSize = 0; + + // block format: http://tools.ietf.org/html/rfc1951#page-9 + do { + var bFinal = bstream.readBits(1), + bType = bstream.readBits(2); + blockSize = 0; + ++numBlocks; + // no compression + if (bType == 0) { + // skip remaining bits in this byte + while (bstream.bitPtr != 0) bstream.readBits(1); + var len = bstream.readBits(16), + nlen = bstream.readBits(16); + // TODO: check if nlen is the ones-complement of len? + + if(len > 0) buffer.insertBytes(bstream.readBytes(len)); + blockSize = len; + } + // fixed Huffman codes + else if(bType == 1) { + blockSize = inflateBlockData(bstream, getFixedLiteralTable(), getFixedDistanceTable(), buffer); + } + // dynamic Huffman codes + else if(bType == 2) { + var numLiteralLengthCodes = bstream.readBits(5) + 257; + var numDistanceCodes = bstream.readBits(5) + 1, + numCodeLengthCodes = bstream.readBits(4) + 4; + + // populate the array of code length codes (first de-compaction) + var codeLengthsCodeLengths = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; + for (var i = 0; i < numCodeLengthCodes; ++i) { + codeLengthsCodeLengths[ CodeLengthCodeOrder[i] ] = bstream.readBits(3); + } + + // get the Huffman Codes for the code lengths + var codeLengthsCodes = getHuffmanCodes(codeLengthsCodeLengths); + + // now follow this mapping + /* + 0 - 15: Represent code lengths of 0 - 15 + 16: Copy the previous code length 3 - 6 times. + The next 2 bits indicate repeat length + (0 = 3, ... , 3 = 6) + Example: Codes 8, 16 (+2 bits 11), + 16 (+2 bits 10) will expand to + 12 code lengths of 8 (1 + 6 + 5) + 17: Repeat a code length of 0 for 3 - 10 times. + (3 bits of length) + 18: Repeat a code length of 0 for 11 - 138 times + (7 bits of length) + */ + // to generate the true code lengths of the Huffman Codes for the literal + // and distance tables together + var literalCodeLengths = []; + var prevCodeLength = 0; + while (literalCodeLengths.length < numLiteralLengthCodes + numDistanceCodes) { + var symbol = decodeSymbol(bstream, codeLengthsCodes); + if (symbol <= 15) { + literalCodeLengths.push(symbol); + prevCodeLength = symbol; + } + else if (symbol == 16) { + var repeat = bstream.readBits(2) + 3; + while (repeat--) { + literalCodeLengths.push(prevCodeLength); + } + } + else if (symbol == 17) { + var repeat = bstream.readBits(3) + 3; + while (repeat--) { + literalCodeLengths.push(0); + } + } + else if (symbol == 18) { + var repeat = bstream.readBits(7) + 11; + while (repeat--) { + literalCodeLengths.push(0); + } + } + } + + // now split the distance code lengths out of the literal code array + var distanceCodeLengths = literalCodeLengths.splice(numLiteralLengthCodes, numDistanceCodes); + + // now generate the true Huffman Code tables using these code lengths + var hcLiteralTable = getHuffmanCodes(literalCodeLengths), + hcDistanceTable = getHuffmanCodes(distanceCodeLengths); + blockSize = inflateBlockData(bstream, hcLiteralTable, hcDistanceTable, buffer); + } + // error + else { + err("Error! Encountered deflate block of type 3"); + return null; + } + + // update progress + currentBytesUnarchivedInFile += blockSize; + currentBytesUnarchived += blockSize; + postProgress(); + + } while (bFinal != 1); + // we are done reading blocks if the bFinal bit was set for this block + + // return the buffer data bytes + return buffer.data; +} + +// event.data.file has the ArrayBuffer. +onmessage = function(event) { + unzip(event.data.file, true); +}; diff --git a/src/cps/static/locale/ach/viewer.properties b/src/cps/static/locale/ach/viewer.properties new file mode 100644 index 0000000..1b1f491 --- /dev/null +++ b/src/cps/static/locale/ach/viewer.properties @@ -0,0 +1,181 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pot buk mukato +previous_label=Mukato +next.title=Pot buk malubo +next_label=Malubo + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pot buk +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=pi {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} me {{pagesCount}}) + +zoom_out.title=Jwik Matidi +zoom_out_label=Jwik Matidi +zoom_in.title=Kwot Madit +zoom_in_label=Kwot Madit +zoom.title=Kwoti +presentation_mode.title=Lokke i kit me tyer +presentation_mode_label=Kit me tyer +open_file.title=Yab Pwail +open_file_label=Yab +print.title=Go +print_label=Go +download.title=Gam +download_label=Gam +bookmark.title=Neno ma kombedi (lok onyo yab i dirica manyen) +bookmark_label=Neno ma kombedi + +# Secondary toolbar and context menu +tools.title=Gintic +tools_label=Gintic +first_page.title=Cit i pot buk mukwongo +first_page.label=Cit i pot buk mukwongo +first_page_label=Cit i pot buk mukwongo +last_page.title=Cit i pot buk magiko +last_page.label=Cit i pot buk magiko +last_page_label=Cit i pot buk magiko +page_rotate_cw.title=Wire i tung lacuc +page_rotate_cw.label=Wire i tung lacuc +page_rotate_cw_label=Wire i tung lacuc +page_rotate_ccw.title=Wire i tung lacam +page_rotate_ccw.label=Wire i tung lacam +page_rotate_ccw_label=Wire i tung lacam + +hand_tool_enable.title=Ye gintic me cing +hand_tool_enable_label=Ye gintic me cing +hand_tool_disable.title=Juk gintic me cing +hand_tool_disable_label=Juk gintic me cing + +# Document properties dialog box +document_properties.title=Jami me gin acoya… +document_properties_label=Jami me gin acoya… +document_properties_file_name=Nying pwail: +document_properties_file_size=Dit pa pwail: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Wiye: +document_properties_author=Ngat mucoyo: +document_properties_subject=Lok: +document_properties_keywords=Lok mapire tek: +document_properties_creation_date=Nino dwe me cwec: +document_properties_modification_date=Nino dwe me yub: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Lacwec: +document_properties_producer=Layub PDF: +document_properties_version=Kit PDF: +document_properties_page_count=Kwan me pot buk: +document_properties_close=Lor + +print_progress_message=Yubo coc me agoya… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Juki + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Lok gintic ma inget +toggle_sidebar_label=Lok gintic ma inget +document_outline_label=Pek pa gin acoya +attachments.title=Nyut twec +attachments_label=Twec +thumbs.title=Nyut cal +thumbs_label=Cal +findbar.title=Nong iye gin acoya +findbar_label=Nong + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pot buk {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Cal me pot buk {{page}} + +# Find panel button title and messages +find_label=Nong: +find_previous.title=Nong timme pa lok mukato +find_previous_label=Mukato +find_next.title=Nong timme pa lok malubo +find_next_label=Malubo +find_highlight=Wer weng +find_match_case_label=Lok marwate +find_reached_top=Oo iwi gin acoya, omede ki i tere +find_reached_bottom=Oo i agiki me gin acoya, omede ki iwiye +find_not_found=Lok pe ononge + +# Error panel labels +error_more_info=Ngec Mukene +error_less_info=Ngec Manok +error_close=Lor +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Kwena: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Can kikore {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Pwail: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rek: {{line}} +rendering_error=Bal otime i kare me nyuto pot buk. + +# Predefined zoom values +page_scale_width=Lac me iye pot buk +page_scale_fit=Porre me pot buk +page_scale_auto=Kwot pire kene +page_scale_actual=Dite kikome +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Bal +loading_error=Bal otime kun cano PDF. +invalid_file_error=Pwail me PDF ma pe atir onyo obale woko. +missing_file_error=Pwail me PDF tye ka rem. +unexpected_response_error=Lagam mape kigeno pa lapok tic. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Lok angea manok] +password_label=Ket mung me donyo me yabo pwail me PDF man. +password_invalid=Mung me donyo pe atir. Tim ber i tem doki. +password_ok=OK +password_cancel=Juki + +printing_not_supported=Ciko: Layeny ma pe teno goyo liweng. +printing_not_ready=Ciko: PDF pe ocane weng me agoya. +web_fonts_disabled=Kijuko dit pa coc me kakube woko: pe romo tic ki dit pa coc me PDF ma kiketo i kine. +document_colors_not_allowed=Pe ki yee ki gin acoya me PDF me tic ki rangi gi kengi: Kijuko woko “Yee pot buk me yero rangi mamegi kengi” ki i layeny. diff --git a/src/cps/static/locale/af/viewer.properties b/src/cps/static/locale/af/viewer.properties new file mode 100644 index 0000000..2429e3c --- /dev/null +++ b/src/cps/static/locale/af/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Vorige bladsy +previous_label=Vorige +next.title=Volgende bladsy +next_label=Volgende + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Bladsy +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=van {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} van {{pagesCount}}) + +zoom_out.title=Zoem uit +zoom_out_label=Zoem uit +zoom_in.title=Zoem in +zoom_in_label=Zoem in +zoom.title=Zoem +presentation_mode.title=Wissel na voorleggingsmodus +presentation_mode_label=Voorleggingsmodus +open_file.title=Open lêer +open_file_label=Open +print.title=Druk +print_label=Druk +download.title=Laai af +download_label=Laai af +bookmark.title=Huidige aansig (kopieer of open in nuwe venster) +bookmark_label=Huidige aansig + +# Secondary toolbar and context menu +tools.title=Nutsgoed +tools_label=Nutsgoed +first_page.title=Gaan na eerste bladsy +first_page.label=Gaan na eerste bladsy +first_page_label=Gaan na eerste bladsy +last_page.title=Gaan na laaste bladsy +last_page.label=Gaan na laaste bladsy +last_page_label=Gaan na laaste bladsy +page_rotate_cw.title=Roteer kloksgewys +page_rotate_cw.label=Roteer kloksgewys +page_rotate_cw_label=Roteer kloksgewys +page_rotate_ccw.title=Roteer anti-kloksgewys +page_rotate_ccw.label=Roteer anti-kloksgewys +page_rotate_ccw_label=Roteer anti-kloksgewys + +hand_tool_enable.title=Aktiveer handjie +hand_tool_enable_label=Aktiveer handjie +hand_tool_disable.title=Deaktiveer handjie +hand_tool_disable_label=Deaktiveer handjie + +# Document properties dialog box +document_properties.title=Dokumenteienskappe… +document_properties_label=Dokumenteienskappe… +document_properties_file_name=Lêernaam: +document_properties_file_size=Lêergrootte: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kG ({{size_b}} grepe) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MG ({{size_b}} grepe) +document_properties_title=Titel: +document_properties_author=Outeur: +document_properties_subject=Onderwerp: +document_properties_keywords=Sleutelwoorde: +document_properties_creation_date=Skeppingsdatum: +document_properties_modification_date=Wysigingsdatum: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Skepper: +document_properties_producer=PDF-vervaardiger: +document_properties_version=PDF-weergawe: +document_properties_page_count=Aantal bladsye: +document_properties_close=Sluit + +print_progress_message=Berei tans dokument voor om te druk… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Kanselleer + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Sypaneel aan/af +toggle_sidebar_label=Sypaneel aan/af +document_outline.title=Wys dokumentskema (dubbelklik om alle items oop/toe te vou) +document_outline_label=Dokumentoorsig +attachments.title=Wys aanhegsels +attachments_label=Aanhegsels +thumbs.title=Wys duimnaels +thumbs_label=Duimnaels +findbar.title=Soek in dokument +findbar_label=Vind + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Bladsy {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Duimnael van bladsy {{page}} + +# Find panel button title and messages +find_label=Vind: +find_previous.title=Vind die vorige voorkoms van die frase +find_previous_label=Vorige +find_next.title=Vind die volgende voorkoms van die frase +find_next_label=Volgende +find_highlight=Verlig alle +find_match_case_label=Kassensitief +find_reached_top=Bokant van dokument is bereik; gaan voort van onder af +find_reached_bottom=Einde van dokument is bereik; gaan voort van bo af +find_not_found=Frase nie gevind nie + +# Error panel labels +error_more_info=Meer inligting +error_less_info=Minder inligting +error_close=Sluit +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (ID: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Boodskap: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stapel: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Lêer: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Lyn: {{line}} +rendering_error='n Fout het voorgekom toe die bladsy weergegee is. + +# Predefined zoom values +page_scale_width=Bladsywydte +page_scale_fit=Pas bladsy +page_scale_auto=Outomatiese zoem +page_scale_actual=Werklike grootte +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Fout +loading_error='n Fout het voorgekom met die laai van die PDF. +invalid_file_error=Ongeldige of korrupte PDF-lêer. +missing_file_error=PDF-lêer is weg. +unexpected_response_error=Onverwagse antwoord van bediener. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}}-annotasie] +password_label=Gee die wagwoord om dié PDF-lêer mee te open. +password_invalid=Ongeldige wagwoord. Probeer gerus weer. +password_ok=OK +password_cancel=Kanselleer + +printing_not_supported=Waarskuwing: Dié blaaier ondersteun nie drukwerk ten volle nie. +printing_not_ready=Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie. +web_fonts_disabled=Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie. +document_colors_not_allowed=PDF-dokumente word nie toegelaat om hul eie kleure te gebruik nie: “Laat bladsye toe om hul eie kleure te kies” is gedeaktiveer in die blaaier. diff --git a/src/cps/static/locale/ak/viewer.properties b/src/cps/static/locale/ak/viewer.properties new file mode 100644 index 0000000..ed7b70f --- /dev/null +++ b/src/cps/static/locale/ak/viewer.properties @@ -0,0 +1,132 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Krataafa baako a etwa mu +previous_label=Ekyiri-baako +next.title=Krataafa a edi so baako +next_label=Dea-ɛ-di-so-baako + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Zuum pue +zoom_out_label=Zuum ba abɔnten +zoom_in.title=Zuum kɔ mu +zoom_in_label=Zuum kɔ mu +zoom.title=Zuum +presentation_mode.title=Sesa kɔ Yɛkyerɛ Tebea mu +presentation_mode_label=Yɛkyerɛ Tebea +open_file.title=Bue Fael +open_file_label=Bue +print.title=Prente +print_label=Prente +download.title=Twe +download_label=Twe +bookmark.title=Seisei nhwɛ (fa anaaso bue wɔ tokuro foforo mu) +bookmark_label=Seisei nhwɛ + +# Secondary toolbar and context menu + + +# Document properties dialog box +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_title=Ti asɛm: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Sɔ anaaso dum saedbaa +toggle_sidebar_label=Sɔ anaaso dum saedbaa +document_outline_label=Dɔkomɛnt bɔbea +thumbs.title=Kyerɛ mfoniwaa +thumbs_label=Mfoniwaa +findbar.title=Hu wɔ dɔkomɛnt no mu +findbar_label=Hu + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Krataafa {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Krataafa ne mfoniwaa {{page}} + +# Find panel button title and messages +find_label=Hunu: +find_previous.title=San hu fres wɔ ekyiri baako +find_previous_label=Ekyiri baako +find_next.title=San hu fres no wɔ enim baako +find_next_label=Ndiso +find_highlight=Hyɛ bibiara nso +find_match_case_label=Fa susu kaase +find_reached_top=Edu krataafa ne soro, atoa so efiri ase +find_reached_bottom=Edu krataafa n'ewiei, atoa so efiri soro +find_not_found=Ennhu fres + +# Error panel labels +error_more_info=Infɔmehyɛn bio a wɔka ho +error_less_info=Te infɔmehyɛn bio a wɔka ho so +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{vɛɛhyen}} (nsi: {{si}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Nkrato: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Staake: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fael: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Laen: {{line}} +rendering_error=Mfomso bae wɔ bere a wɔ rekyerɛ krataafa no. + +# Predefined zoom values +page_scale_width=Krataafa tɛtrɛtɛ +page_scale_fit=Krataafa ehimtwa +page_scale_auto=Zuum otomatik +page_scale_actual=Kɛseyɛ ankasa +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=Mfomso +loading_error=Mfomso bae wɔ bere a wɔreloode PDF no. +invalid_file_error=PDF fael no nndi mu anaaso ho atɔ kyima. +missing_file_error=PDF fael no ayera. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Tɛkst-nyiano] +password_ok=OK + +printing_not_supported=Kɔkɔbɔ: Brawsa yi nnhyɛ daa mma prent ho kwan. +printing_not_ready=Kɔkɔbɔ: Wɔnntwee PDF fael no nyinara mmbaee ama wo ɛ tumi aprente. +web_fonts_disabled=Ɔedum wɛb-mfɔnt: nntumi mmfa PDF mfɔnt a wɔhyɛ mu nndi dwuma. +document_colors_not_allowed=Wɔmma ho kwan sɛ PDF adɔkomɛnt de wɔn ara wɔn ahosu bɛdi dwuma: wɔ adum 'Ma ho kwan ma nkrataafa mpaw wɔn ara wɔn ahosu' wɔ brawsa yi mu. diff --git a/src/cps/static/locale/an/viewer.properties b/src/cps/static/locale/an/viewer.properties new file mode 100644 index 0000000..65b6a60 --- /dev/null +++ b/src/cps/static/locale/an/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pachina anterior +previous_label=Anterior +next.title=Pachina siguient +next_label=Siguient + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pachina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Achiquir +zoom_out_label=Achiquir +zoom_in.title=Agrandir +zoom_in_label=Agrandir +zoom.title=Grandaria +presentation_mode.title=Cambear t'o modo de presentación +presentation_mode_label=Modo de presentación +open_file.title=Ubrir o fichero +open_file_label=Ubrir +print.title=Imprentar +print_label=Imprentar +download.title=Descargar +download_label=Descargar +bookmark.title=Vista actual (copiar u ubrir en una nueva finestra) +bookmark_label=Anvista actual + +# Secondary toolbar and context menu +tools.title=Ferramientas +tools_label=Ferramientas +first_page.title=Ir ta la primer pachina +first_page.label=Ir ta la primer pachina +first_page_label=Ir ta la primer pachina +last_page.title=Ir ta la zaguer pachina +last_page.label=Ir ta la zaguera pachina +last_page_label=Ir ta la zaguer pachina +page_rotate_cw.title=Chirar enta la dreita +page_rotate_cw.label=Chirar enta la dreita +page_rotate_cw_label=Chira enta la dreita +page_rotate_ccw.title=Chirar enta la zurda +page_rotate_ccw.label=Chirar en sentiu antihorario +page_rotate_ccw_label=Chirar enta la zurda + +hand_tool_enable.title=Activar a ferramienta man +hand_tool_enable_label=Activar a ferramenta man +hand_tool_disable.title=Desactivar a ferramienta man +hand_tool_disable_label=Desactivar a ferramienta man + +# Document properties dialog box +document_properties.title=Propiedatz d'o documento... +document_properties_label=Propiedatz d'o documento... +document_properties_file_name=Nombre de fichero: +document_properties_file_size=Grandaria d'o fichero: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titol: +document_properties_author=Autor: +document_properties_subject=Afer: +document_properties_keywords=Parolas clau: +document_properties_creation_date=Calendata de creyación: +document_properties_modification_date=Calendata de modificación: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creyador: +document_properties_producer=Creyador de PDF: +document_properties_version=Versión de PDF: +document_properties_page_count=Numero de pachinas: +document_properties_close=Zarrar + +print_progress_message=Se ye preparando la documentación pa imprentar… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Amostrar u amagar a barra lateral +toggle_sidebar_label=Amostrar a barra lateral +document_outline.title=Amostrar esquema d'o documento (fer doble clic pa expandir/compactar totz los items) +document_outline_label=Esquema d'o documento +attachments.title=Amostrar os adchuntos +attachments_label=Adchuntos +thumbs.title=Amostrar as miniaturas +thumbs_label=Miniaturas +findbar.title=Trobar en o documento +findbar_label=Trobar + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pachina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura d'a pachina {{page}} + +# Find panel button title and messages +find_label=Trobar: +find_previous.title=Trobar l'anterior coincidencia d'a frase +find_previous_label=Anterior +find_next.title=Trobar a siguient coincidencia d'a frase +find_next_label=Siguient +find_highlight=Resaltar-lo tot +find_match_case_label=Coincidencia de mayusclas/minusclas +find_reached_top=S'ha plegau a l'inicio d'o documento, se contina dende baixo +find_reached_bottom=S'ha plegau a la fin d'o documento, se contina dende alto +find_not_found=No s'ha trobau a frase + +# Error panel labels +error_more_info=Mas información +error_less_info=Menos información +error_close=Zarrar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensache: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fichero: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linia: {{line}} +rendering_error=Ha ocurriu una error en renderizar a pachina. + +# Predefined zoom values +page_scale_width=Amplaria d'a pachina +page_scale_fit=Achuste d'a pachina +page_scale_auto=Grandaria automatica +page_scale_actual=Grandaria actual +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Error +loading_error=S'ha produciu una error en cargar o PDF. +invalid_file_error=O PDF no ye valido u ye estorbau. +missing_file_error=No i ha fichero PDF. +unexpected_response_error=Respuesta a lo servicio inasperada. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotación {{type}}] +password_label=Introduzca a clau ta ubrir iste fichero PDF. +password_invalid=Clau invalida. Torna a intentar-lo. +password_ok=Acceptar +password_cancel=Cancelar + +printing_not_supported=Pare cuenta: Iste navegador no maneya totalment as impresions. +printing_not_ready=Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo. +web_fonts_disabled=As fuents web son desactivadas: no se puet incrustar fichers PDF. +document_colors_not_allowed=Los documentos PDF no pueden fer servir las suyas propias colors: 'Permitir que as pachinas triguen as suyas propias colors' ye desactivau en o navegador. diff --git a/src/cps/static/locale/ar/viewer.properties b/src/cps/static/locale/ar/viewer.properties new file mode 100644 index 0000000..ab62e35 --- /dev/null +++ b/src/cps/static/locale/ar/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=الصفحة السابقة +previous_label=السابقة +next.title=الصفحة التالية +next_label=التالية + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=صفحة +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=من {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} من {{pagesCount}}) + +zoom_out.title=بعّد +zoom_out_label=بعّد +zoom_in.title=قرّب +zoom_in_label=قرّب +zoom.title=التقريب +presentation_mode.title=انتقل لوضع العرض التقديمي +presentation_mode_label=وضع العرض التقديمي +open_file.title=افتح ملفًا +open_file_label=افتح +print.title=اطبع +print_label=اطبع +download.title=نزّل +download_label=نزّل +bookmark.title=المنظور الحالي (انسخ أو افتح في نافذة جديدة) +bookmark_label=المنظور الحالي + +# Secondary toolbar and context menu +tools.title=الأدوات +tools_label=الأدوات +first_page.title=اذهب إلى الصفحة الأولى +first_page.label=اذهب إلى الصفحة الأولى +first_page_label=اذهب إلى الصفحة الأولى +last_page.title=اذهب إلى الصفحة الأخيرة +last_page.label=اذهب إلى الصفحة الأخيرة +last_page_label=اذهب إلى الصفحة الأخيرة +page_rotate_cw.title=أدر باتجاه عقارب الساعة +page_rotate_cw.label=أدر باتجاه عقارب الساعة +page_rotate_cw_label=أدر باتجاه عقارب الساعة +page_rotate_ccw.title=أدر بعكس اتجاه عقارب الساعة +page_rotate_ccw.label=أدر بعكس اتجاه عقارب الساعة +page_rotate_ccw_label=أدر بعكس اتجاه عقارب الساعة + +hand_tool_enable.title=فعّل أداة اليد +hand_tool_enable_label=فعّل أداة اليد +hand_tool_disable.title=عطّل أداة اليد +hand_tool_disable_label=عطّل أداة اليد + +# Document properties dialog box +document_properties.title=خصائص المستند… +document_properties_label=خصائص المستند… +document_properties_file_name=اسم الملف: +document_properties_file_size=حجم الملف: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} ك.بايت ({{size_b}} بايت) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} م.بايت ({{size_b}} بايت) +document_properties_title=العنوان: +document_properties_author=المؤلف: +document_properties_subject=الموضوع: +document_properties_keywords=الكلمات الأساسية: +document_properties_creation_date=تاريخ الإنشاء: +document_properties_modification_date=تاريخ التعديل: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}، {{time}} +document_properties_creator=المنشئ: +document_properties_producer=منتج PDF: +document_properties_version=إصدارة PDF: +document_properties_page_count=عدد الصفحات: +document_properties_close=أغلق + +print_progress_message=يُحضّر المستند للطباعة… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}٪ +print_progress_close=ألغِ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=بدّل الشريط الجانبي +toggle_sidebar_label=بدّل الشريط الجانبي +document_outline.title=اعرض فهرس المستند (نقر مزدوج لتمديد أو تقليص كل العناصر) +document_outline_label=مخطط المستند +attachments.title=اعرض المرفقات +attachments_label=المُرفقات +thumbs.title=اعرض مُصغرات +thumbs_label=مُصغّرات +findbar.title=ابحث في المستند +findbar_label=ابحث + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=صفحة {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=مصغّرة صفحة {{page}} + +# Find panel button title and messages +find_label=ابحث: +find_previous.title=ابحث عن التّواجد السّابق للعبارة +find_previous_label=السابق +find_next.title=ابحث عن التّواجد التّالي للعبارة +find_next_label=التالي +find_highlight=أبرِز الكل +find_match_case_label=طابق حالة الأحرف +find_reached_top=تابعت من الأسفل بعدما وصلت إلى بداية المستند +find_reached_bottom=تابعت من الأعلى بعدما وصلت إلى نهاية المستند +find_not_found=لا وجود للعبارة + +# Error panel labels +error_more_info=معلومات أكثر +error_less_info=معلومات أقل +error_close=أغلق +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=‏PDF.js ن{{version}} ‏(بناء: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=الرسالة: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=الرصّة: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=الملف: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=السطر: {{line}} +rendering_error=حدث خطأ أثناء عرض الصفحة. + +# Predefined zoom values +page_scale_width=عرض الصفحة +page_scale_fit=ملائمة الصفحة +page_scale_auto=تقريب تلقائي +page_scale_actual=الحجم الحقيقي +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}٪ + +# Loading indicator messages +loading_error_indicator=عطل +loading_error=حدث عطل أثناء تحميل ملف PDF. +invalid_file_error=ملف PDF تالف أو غير صحيح. +missing_file_error=ملف PDF غير موجود. +unexpected_response_error=استجابة خادوم غير متوقعة. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[تعليق {{type}}] +password_label=أدخل لكلمة السر لفتح هذا الملف. +password_invalid=كلمة سر خطأ. من فضلك أعد المحاولة. +password_ok=حسنا +password_cancel=ألغِ + +printing_not_supported=تحذير: لا يدعم هذا المتصفح الطباعة بشكل كامل. +printing_not_ready=تحذير: ملف PDF لم يُحمّل كاملًا للطباعة. +web_fonts_disabled=خطوط الوب مُعطّلة: تعذّر استخدام خطوط PDF المُضمّنة. +document_colors_not_allowed=ليس مسموحًا لملفات PDF باستخدام ألوانها الخاصة: خيار ”اسمح للصفحات باختيار ألوانها الخاصة“ ليس مُفعّلًا في المتصفح. diff --git a/src/cps/static/locale/as/viewer.properties b/src/cps/static/locale/as/viewer.properties new file mode 100644 index 0000000..f0e4d9e --- /dev/null +++ b/src/cps/static/locale/as/viewer.properties @@ -0,0 +1,173 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=পূৰ্বৱৰ্তী পৃষ্ঠা +previous_label=পূৰ্বৱৰ্তী +next.title=পৰৱৰ্তী পৃষ্ঠা +next_label=পৰৱৰ্তী + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=জুম আউট +zoom_out_label=জুম আউট +zoom_in.title=জুম ইন +zoom_in_label=জুম ইন +zoom.title=জুম কৰক +presentation_mode.title=উপস্থাপন অৱস্থালে যাওক +presentation_mode_label=উপস্থাপন অৱস্থা +open_file.title=ফাইল খোলক +open_file_label=খোলক +print.title=প্ৰিন্ট কৰক +print_label=প্ৰিন্ট কৰক +download.title=ডাউনল'ড কৰক +download_label=ডাউনল'ড কৰক +bookmark.title=বৰ্তমান দৃশ্য (কপি কৰক অথবা নতুন উইন্ডোত খোলক) +bookmark_label=বৰ্তমান দৃশ্য + +# Secondary toolbar and context menu +tools.title=সঁজুলিসমূহ +tools_label=সঁজুলিসমূহ +first_page.title=প্ৰথম পৃষ্ঠাত যাওক +first_page.label=প্ৰথম পৃষ্ঠাত যাওক +first_page_label=প্ৰথম পৃষ্ঠাত যাওক +last_page.title=সৰ্বশেষ পৃষ্ঠাত যাওক +last_page.label=সৰ্বশেষ পৃষ্ঠাত যাওক +last_page_label=সৰ্বশেষ পৃষ্ঠাত যাওক +page_rotate_cw.title=ঘড়ীৰ দিশত ঘুৰাওক +page_rotate_cw.label=ঘড়ীৰ দিশত ঘুৰাওক +page_rotate_cw_label=ঘড়ীৰ দিশত ঘুৰাওক +page_rotate_ccw.title=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক +page_rotate_ccw.label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক +page_rotate_ccw_label=ঘড়ীৰ ওলোটা দিশত ঘুৰাওক + +hand_tool_enable.title=হাঁত সঁজুলি সামৰ্থবান কৰক +hand_tool_enable_label=হাঁত সঁজুলি সামৰ্থবান কৰক +hand_tool_disable.title=হাঁত সঁজুলি অসামৰ্থবান কৰক +hand_tool_disable_label=হাঁত সঁজুলি অসামৰ্থবান কৰক + +# Document properties dialog box +document_properties.title=দস্তাবেজৰ বৈশিষ্ট্যসমূহ… +document_properties_label=দস্তাবেজৰ বৈশিষ্ট্যসমূহ… +document_properties_file_name=ফাইল নাম: +document_properties_file_size=ফাইলৰ আকাৰ: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=শীৰ্ষক: +document_properties_author=লেখক: +document_properties_subject=বিষয়: +document_properties_keywords=কিৱাৰ্ডসমূহ: +document_properties_creation_date=সৃষ্টিৰ তাৰিখ: +document_properties_modification_date=পৰিবৰ্তনৰ তাৰিখ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=সৃষ্টিকৰ্তা: +document_properties_producer=PDF উৎপাদক: +document_properties_version=PDF সংস্কৰণ: +document_properties_page_count=পৃষ্ঠাৰ গণনা: +document_properties_close=বন্ধ কৰক + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=কাষবাৰ টগল কৰক +toggle_sidebar_label=কাষবাৰ টগল কৰক +document_outline_label=দস্তাবেজ আউটলাইন +attachments.title=এটাচমেন্টসমূহ দেখুৱাওক +attachments_label=এটাচমেন্টসমূহ +thumbs.title=থাম্বনেইলসমূহ দেখুৱাওক +thumbs_label=থাম্বনেইলসমূহ +findbar.title=দস্তাবেজত সন্ধান কৰক +findbar_label=সন্ধান কৰক + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=পৃষ্ঠা {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=পৃষ্ঠাৰ থাম্বনেইল {{page}} + +# Find panel button title and messages +find_label=সন্ধান কৰক: +find_previous.title=বাক্যাংশৰ পূৰ্বৱৰ্তী উপস্থিতি সন্ধান কৰক +find_previous_label=পূৰ্বৱৰ্তী +find_next.title=বাক্যাংশৰ পৰৱৰ্তী উপস্থিতি সন্ধান কৰক +find_next_label=পৰৱৰ্তী +find_highlight=সকলো উজ্জ্বল কৰক +find_match_case_label=ফলা মিলাওক +find_reached_top=তলৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ ওপৰলৈ অহা হৈছে +find_reached_bottom=ওপৰৰ পৰা আৰম্ভ কৰি, দস্তাবেজৰ তললৈ অহা হৈছে +find_not_found=বাক্যাংশ পোৱা নগল + +# Error panel labels +error_more_info=অধিক তথ্য +error_less_info=কম তথ্য +error_close=বন্ধ কৰক +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=বাৰ্তা: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=স্টেক: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ফাইল: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=শাৰী: {{line}} +rendering_error=এই পৃষ্ঠা ৰেণ্ডাৰ কৰোতে এটা ত্ৰুটি দেখা দিলে। + +# Predefined zoom values +page_scale_width=পৃষ্ঠাৰ প্ৰস্থ +page_scale_fit=পৃষ্ঠা খাপ +page_scale_auto=স্বচালিত জুম +page_scale_actual=প্ৰকৃত আকাৰ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=ত্ৰুটি +loading_error=PDF ল'ড কৰোতে এটা ত্ৰুটি দেখা দিলে। +invalid_file_error=অবৈধ অথবা ক্ষতিগ্ৰস্থ PDF file। +missing_file_error=সন্ধানহিন PDF ফাইল। +unexpected_response_error=অপ্ৰত্যাশিত চাৰ্ভাৰ প্ৰতিক্ৰিয়া। + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} টোকা] +password_label=এই PDF ফাইল খোলিবলৈ পাছৱৰ্ড সুমুৱাওক। +password_invalid=অবৈধ পাছৱৰ্ড। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক। +password_ok=ঠিক আছে + +printing_not_supported=সতৰ্কবাৰ্তা: প্ৰিন্টিং এই ব্ৰাউছাৰ দ্বাৰা সম্পূৰ্ণভাৱে সমৰ্থিত নহয়। +printing_not_ready=সতৰ্কবাৰ্তা: PDF প্ৰিন্টিংৰ বাবে সম্পূৰ্ণভাৱে ল'ডেড নহয়। +web_fonts_disabled=ৱেব ফন্টসমূহ অসামৰ্থবান কৰা আছে: অন্তৰ্ভুক্ত PDF ফন্টসমূহ ব্যৱহাৰ কৰিবলে অক্ষম। +document_colors_not_allowed=PDF দস্তাবেজসমূহৰ সিহতৰ নিজস্ব ৰঙ ব্যৱহাৰ কৰাৰ অনুমতি নাই: ব্ৰাউছাৰত 'পৃষ্ঠাসমূহক সিহতৰ নিজস্ব ৰঙ নিৰ্বাচন কৰাৰ অনুমতি দিয়ক' অসামৰ্থবান কৰা আছে। diff --git a/src/cps/static/locale/ast/viewer.properties b/src/cps/static/locale/ast/viewer.properties new file mode 100644 index 0000000..8c82496 --- /dev/null +++ b/src/cps/static/locale/ast/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Páxina anterior +previous_label=Anterior +next.title=Páxina siguiente +next_label=Siguiente + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Páxina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Reducir +zoom_out_label=Reducir +zoom_in.title=Aumentar +zoom_in_label=Aumentar +zoom.title=Tamañu +presentation_mode.title= +presentation_mode_label= +open_file.title=Abrir ficheru +open_file_label=Abrir +print.title=Imprentar +print_label=Imprentar +download.title=Descargar +download_label=Descargar +bookmark.title=Vista actual (copiar o abrir nuna nueva ventana) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Ferramientes +tools_label=Ferramientes +first_page.title=Dir a la primer páxina +first_page.label=Dir a la primer páxina +first_page_label=Dir a la primer páxina +last_page.title=Dir a la postrer páxina +last_page.label=Dir a la cabera páxina +last_page_label=Dir a la postrer páxina +page_rotate_cw.title=Xirar en sen horariu +page_rotate_cw.label= +page_rotate_cw_label=Xirar en sen horariu +page_rotate_ccw.title=Xirar en sen antihorariu +page_rotate_ccw.label= +page_rotate_ccw_label=Xirar en sen antihorariu + +hand_tool_enable.title=Activar ferramienta mano +hand_tool_enable_label=Activar ferramienta mano +hand_tool_disable.title=Desactivar ferramienta mano +hand_tool_disable_label=Desactivar ferramienta mano + +# Document properties dialog box +document_properties.title=Propiedaes del documentu… +document_properties_label=Propiedaes del documentu… +document_properties_file_name=Nome de ficheru: +document_properties_file_size=Tamañu de ficheru: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Títulu: +document_properties_author=Autor: +document_properties_subject=Asuntu: +document_properties_keywords=Pallabres clave: +document_properties_creation_date=Data de creación: +document_properties_modification_date=Data de modificación: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creador: +document_properties_producer=Productor PDF: +document_properties_version=Versión PDF: +document_properties_page_count=Númberu de páxines: +document_properties_close=Zarrar + +print_progress_message=Tresnando documentu pa imprentar… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Encaboxar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Camudar barra llateral +toggle_sidebar_label=Camudar barra llateral +document_outline.title=Amosar esquema del documentu (duble clic pa espander/contrayer tolos elementos) +document_outline_label=Esquema del documentu +attachments.title=Amosar axuntos +attachments_label=Axuntos +thumbs.title=Amosar miniatures +thumbs_label=Miniatures +findbar.title=Guetar nel documentu +findbar_label=Guetar + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Páxina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura de la páxina {{page}} + +# Find panel button title and messages +find_label=Guetar: +find_previous.title=Alcontrar l'anterior apaición de la fras +find_previous_label=Anterior +find_next.title=Alcontrar la siguiente apaición d'esta fras +find_next_label=Siguiente +find_highlight=Remarcar toos +find_match_case_label=Coincidencia de mayús./minús. +find_reached_top=Algamóse'l principiu del documentu, siguir dende'l final +find_reached_bottom=Algamóse'l final del documentu, siguir dende'l principiu +find_not_found=Frase non atopada + +# Error panel labels +error_more_info=Más información +error_less_info=Menos información +error_close=Zarrar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensaxe: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Ficheru: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Llinia: {{line}} +rendering_error=Hebo un fallu al renderizar la páxina. + +# Predefined zoom values +page_scale_width=Anchor de la páxina +page_scale_fit=Axuste de la páxina +page_scale_auto=Tamañu automáticu +page_scale_actual=Tamañu actual +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Fallu +loading_error=Hebo un fallu al cargar el PDF. +invalid_file_error=Ficheru PDF inválidu o corruptu. +missing_file_error=Nun hai ficheru PDF. +unexpected_response_error=Rempuesta inesperada del sirvidor. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotación {{type}}] +password_label=Introduz la contraseña p'abrir esti ficheru PDF +password_invalid=Contraseña non válida. Vuelvi a intentalo. +password_ok=Aceutar +password_cancel=Encaboxar + +printing_not_supported=Alvertencia: La imprentación entá nun ta sofitada dafechu nesti restolador. +printing_not_ready=Avisu: Esti PDF nun se cargó completamente pa poder imprentase. +web_fonts_disabled=Les fontes web tán desactivaes: ye imposible usar les fontes PDF embebíes. +document_colors_not_allowed=Los documentos PDF nun tienen permisu pa usar les sos colores: «Permitir que les páxines escueyan les sos colores» ta desactivao nel restolador. diff --git a/src/cps/static/locale/az/viewer.properties b/src/cps/static/locale/az/viewer.properties new file mode 100644 index 0000000..c1f3a93 --- /dev/null +++ b/src/cps/static/locale/az/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Əvvəlki səhifə +previous_label=Əvvəlkini tap +next.title=Növbəti səhifə +next_label=İrəli + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Səhifə +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} / {{pagesCount}}) + +zoom_out.title=Uzaqlaş +zoom_out_label=Uzaqlaş +zoom_in.title=Yaxınlaş +zoom_in_label=Yaxınlaş +zoom.title=Yaxınlaşdırma +presentation_mode.title=Təqdimat Rejiminə Keç +presentation_mode_label=Təqdimat Rejimi +open_file.title=Fayl Aç +open_file_label=Aç +print.title=Yazdır +print_label=Yazdır +download.title=Yüklə +download_label=Yüklə +bookmark.title=Hazırkı görünüş (köçür və ya yeni pəncərədə aç) +bookmark_label=Hazırki görünüş + +# Secondary toolbar and context menu +tools.title=Alətlər +tools_label=Alətlər +first_page.title=İlk Səhifəyə get +first_page.label=İlk Səhifəyə get +first_page_label=İlk Səhifəyə get +last_page.title=Son Səhifəyə get +last_page.label=Son Səhifəyə get +last_page_label=Son Səhifəyə get +page_rotate_cw.title=Saat İstiqamətində Fırlat +page_rotate_cw.label=Saat İstiqamətində Fırlat +page_rotate_cw_label=Saat İstiqamətində Fırlat +page_rotate_ccw.title=Saat İstiqamətinin Əksinə Fırlat +page_rotate_ccw.label=Saat İstiqamətinin Əksinə Fırlat +page_rotate_ccw_label=Saat İstiqamətinin Əksinə Fırlat + +hand_tool_enable.title=Əl alətini aktiv et +hand_tool_enable_label=Əl alətini aktiv et +hand_tool_disable.title=Əl alətini deaktiv et +hand_tool_disable_label=Əl alətini deaktiv et + +# Document properties dialog box +document_properties.title=Sənəd xüsusiyyətləri… +document_properties_label=Sənəd xüsusiyyətləri… +document_properties_file_name=Fayl adı: +document_properties_file_size=Fayl ölçüsü: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bayt) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bayt) +document_properties_title=Başlık: +document_properties_author=Müəllif: +document_properties_subject=Mövzu: +document_properties_keywords=Açar sözlər: +document_properties_creation_date=Yaradılış Tarixi : +document_properties_modification_date=Dəyişdirilmə Tarixi : +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Yaradan: +document_properties_producer=PDF yaradıcısı: +document_properties_version=PDF versiyası: +document_properties_page_count=Səhifə sayı: +document_properties_close=Qapat + +print_progress_message=Sənəd çap üçün hazırlanır… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Ləğv et + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Yan Paneli Aç/Bağla +toggle_sidebar_label=Yan Paneli Aç/Bağla +document_outline.title=Sənədin eskizini göstər (bütün bəndləri açmaq/yığmaq üçün iki dəfə klikləyin) +document_outline_label=Sənəd strukturu +attachments.title=Bağlamaları göstər +attachments_label=Bağlamalar +thumbs.title=Kiçik şəkilləri göstər +thumbs_label=Kiçik şəkillər +findbar.title=Sənəddə Tap +findbar_label=Tap + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Səhifə{{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} səhifəsinin kiçik vəziyyəti + +# Find panel button title and messages +find_label=Tap: +find_previous.title=Bir öncəki uyğun gələn sözü tapır +find_previous_label=Geri +find_next.title=Bir sonrakı uyğun gələn sözü tapır +find_next_label=İrəli +find_highlight=İşarələ +find_match_case_label=Böyük/kiçik hərfə həssaslıq +find_reached_top=Sənədin yuxarısına çatdı, aşağıdan davam edir +find_reached_bottom=Sənədin sonuna çatdı, yuxarıdan davam edir +find_not_found=Uyğunlaşma tapılmadı + +# Error panel labels +error_more_info=Daha çox məlumati +error_less_info=Daha az məlumat +error_close=Qapat +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (yığma: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=İsmarıc: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stek: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fayl: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Sətir: {{line}} +rendering_error=Səhifə göstərilərkən səhv yarandı. + +# Predefined zoom values +page_scale_width=Səhifə genişliyi +page_scale_fit=Səhifəni sığdır +page_scale_auto=Avtomatik yaxınlaşdır +page_scale_actual=Hazırki Həcm +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Səhv +loading_error=PDF yüklenərkən bir səhv yarandı. +invalid_file_error=Səhv və ya zədələnmiş olmuş PDF fayl. +missing_file_error=PDF fayl yoxdur. +unexpected_response_error=Gözlənilməz server cavabı. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotasiyası] +password_label=Bu PDF faylı açmaq üçün şifrəni daxil edin. +password_invalid=Şifrə yanlışdır. Bir daha sınayın. +password_ok=Tamam +password_cancel=Ləğv et + +printing_not_supported=Xəbərdarlıq: Çap bu səyyah tərəfindən tam olaraq dəstəklənmir. +printing_not_ready=Xəbərdarlıq: PDF çap üçün tam yüklənməyib. +web_fonts_disabled=Web Şriftlər söndürülüb: yerləşdirilmiş PDF şriftlərini istifadə etmək mümkün deyil. +document_colors_not_allowed=PDF sənədlərə öz rənglərini işlətməyə icazə verilmir: “Səhifələrə öz rənglərini istifadə etməyə icazə ver”mə səyyahda söndürülüb. diff --git a/src/cps/static/locale/be/viewer.properties b/src/cps/static/locale/be/viewer.properties new file mode 100644 index 0000000..7b444c9 --- /dev/null +++ b/src/cps/static/locale/be/viewer.properties @@ -0,0 +1,179 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Папярэдняя старонка +previous_label=Папярэдняя +next.title=Наступная старонка +next_label=Наступная + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Старонка +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=з {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} з {{pagesCount}}) + +zoom_out.title=Паменшыць +zoom_out_label=Паменшыць +zoom_in.title=Павялічыць +zoom_in_label=Павялічыць +zoom.title=Павялічэнне тэксту +presentation_mode.title=Пераключыцца ў рэжым паказу +presentation_mode_label=Рэжым паказу +open_file.title=Адкрыць файл +open_file_label=Адкрыць +print.title=Друкаваць +print_label=Друкаваць +download.title=Загрузка +download_label=Загрузка +bookmark.title=Цяперашняя праява (скапіяваць або адчыніць у новым акне) +bookmark_label=Цяперашняя праява + +# Secondary toolbar and context menu +tools.title=Прылады +tools_label=Прылады +first_page.title=Перайсці на першую старонку +first_page.label=Перайсці на першую старонку +first_page_label=Перайсці на першую старонку +last_page.title=Перайсці на апошнюю старонку +last_page.label=Перайсці на апошнюю старонку +last_page_label=Перайсці на апошнюю старонку +page_rotate_cw.title=Павярнуць па сонцу +page_rotate_cw.label=Павярнуць па сонцу +page_rotate_cw_label=Павярнуць па сонцу +page_rotate_ccw.title=Павярнуць супраць сонца +page_rotate_ccw.label=Павярнуць супраць сонца +page_rotate_ccw_label=Павярнуць супраць сонца + +hand_tool_enable.title=Дазволіць ручную прыладу +hand_tool_enable_label=Дазволіць ручную прыладу +hand_tool_disable.title=Забараніць ручную прыладу +hand_tool_disable_label=Забараніць ручную прыладу + +# Document properties dialog box +document_properties.title=Уласцівасці дакумента… +document_properties_label=Уласцівасці дакумента… +document_properties_file_name=Назва файла: +document_properties_file_size=Памер файла: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} КБ ({{size_b}} байт) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} МБ ({{size_b}} байт) +document_properties_title=Загаловак: +document_properties_author=Аўтар: +document_properties_subject=Тэма: +document_properties_keywords=Ключавыя словы: +document_properties_creation_date=Дата стварэння: +document_properties_modification_date=Дата змянення: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Стваральнік: +document_properties_producer=Вырабнік PDF: +document_properties_version=Версія PDF: +document_properties_page_count=Колькасць старонак: +document_properties_close=Закрыць + +print_progress_message=Падрыхтоўка дакумента да друку… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Скасаваць + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Пераключэнне палічкі +toggle_sidebar_label=Пераключыць палічку +attachments.title=Паказаць далучэнні +attachments_label=Далучэнні +thumbs.title=Паказ накідаў +thumbs_label=Накіды +findbar.title=Пошук у дакуменце +findbar_label=Знайсці + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Старонка {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Накід старонкі {{page}} + +# Find panel button title and messages +find_label=Пошук: +find_previous.title=Знайсці папярэдні выпадак выразу +find_previous_label=Папярэдні +find_next.title=Знайсці наступны выпадак выразу +find_next_label=Наступны +find_highlight=Падфарбаваць усе +find_match_case_label=Адрозніваць вялікія/малыя літары +find_reached_top=Дасягнуты пачатак дакумента, працяг з канца +find_reached_bottom=Дасягнуты канец дакумента, працяг з пачатку +find_not_found=Выраз не знойдзены + +# Error panel labels +error_more_info=Падрабязней +error_less_info=Сцісла +error_close=Закрыць +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js в{{version}} (пабудова: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Паведамленне: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Стос: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Файл: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Радок: {{line}} +rendering_error=Здарылася памылка падчас адлюстравання старонкі. + +# Predefined zoom values +page_scale_width=Шырыня старонкі +page_scale_fit=Уцісненне старонкі +page_scale_auto=Самастойнае павялічэнне +page_scale_actual=Сапраўдны памер +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Памылка +loading_error=Здарылася памылка падчас загрузкі PDF. +invalid_file_error=Няспраўны або пашкоджаны файл PDF. +missing_file_error=Адсутны файл PDF. +unexpected_response_error=Нечаканы адказ сервера. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Увядзіце пароль, каб адкрыць гэты файл PDF. +password_invalid=Нядзейсны пароль. Паспрабуйце зноў. +password_ok=Добра +password_cancel=Скасаваць + +printing_not_supported=Папярэджанне: друк не падтрымліваецца цалкам гэтым браўзерам. +printing_not_ready=Увага: PDF не сцягнуты цалкам для друкавання. +web_fonts_disabled=Шрыфты Сеціва забаронены: немагчыма ўжываць укладзеныя шрыфты PDF. diff --git a/src/cps/static/locale/bg/viewer.properties b/src/cps/static/locale/bg/viewer.properties new file mode 100644 index 0000000..80dc6d5 --- /dev/null +++ b/src/cps/static/locale/bg/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Предишна страница +previous_label=Предишна +next.title=Следваща страница +next_label=Следваща + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Страница +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=от {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} от {{pagesCount}}) + +zoom_out.title=Намаляване +zoom_out_label=Намаляване +zoom_in.title=Увеличаване +zoom_in_label=Увеличаване +zoom.title=Мащабиране +presentation_mode.title=Превключване към режим на представяне +presentation_mode_label=Режим на представяне +open_file.title=Отваряне на файл +open_file_label=Отваряне +print.title=Отпечатване +print_label=Отпечатване +download.title=Изтегляне +download_label=Изтегляне +bookmark.title=Текущ изглед (копиране или отваряне в нов прозорец) +bookmark_label=Текущ изглед + +# Secondary toolbar and context menu +tools.title=Инструменти +tools_label=Инструменти +first_page.title=Към първата страница +first_page.label=Към първата страница +first_page_label=Към първата страница +last_page.title=Към последната страница +last_page.label=Към последната страница +last_page_label=Към последната страница +page_rotate_cw.title=Превъртане по часовниковата стрелка +page_rotate_cw.label=Превъртане по часовниковата стрелка +page_rotate_cw_label=Превъртане по часовниковата стрелка +page_rotate_ccw.title=Превъртане обратно на часовниковата стрелка +page_rotate_ccw.label=Превъртане обратно на часовниковата стрелка +page_rotate_ccw_label=Превъртане обратно на часовниковата стрелка + +hand_tool_enable.title=Включване на инструмента ръка +hand_tool_enable_label=Включване на инструмента ръка +hand_tool_disable.title=Изключване на инструмента ръка +hand_tool_disable_label=Изключване на инструмента ръка + +# Document properties dialog box +document_properties.title=Свойства на документа… +document_properties_label=Свойства на документа… +document_properties_file_name=Име на файл: +document_properties_file_size=Големина на файл: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} КБ ({{size_b}} байта) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} МБ ({{size_b}} байта) +document_properties_title=Заглавие: +document_properties_author=Автор: +document_properties_subject=Тема: +document_properties_keywords=Ключови думи: +document_properties_creation_date=Дата на създаване: +document_properties_modification_date=Дата на промяна: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Създател: +document_properties_producer=PDF произведен от: +document_properties_version=PDF версия: +document_properties_page_count=Брой страници: +document_properties_close=Затваряне + +print_progress_message=Подготвяне на документа за отпечатване… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Отказ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Превключване на страничната лента +toggle_sidebar_label=Превключване на страничната лента +document_outline.title=Показване на структурата на документа (двукратно щракване за свиване/разгъване на всичко) +document_outline_label=Структура на документа +attachments.title=Показване на притурките +attachments_label=Притурки +thumbs.title=Показване на миниатюрите +thumbs_label=Миниатюри +findbar.title=Намиране в документа +findbar_label=Търсене + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Страница {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Миниатюра на страница {{page}} + +# Find panel button title and messages +find_label=Търсене: +find_previous.title=Намиране на предишно съвпадение на фразата +find_previous_label=Предишна +find_next.title=Намиране на следващо съвпадение на фразата +find_next_label=Следваща +find_highlight=Открояване на всички +find_match_case_label=Точно съвпадения +find_reached_top=Достигнато е началото на документа, продължаване от края +find_reached_bottom=Достигнат е краят на документа, продължаване от началото +find_not_found=Фразата не е намерена + +# Error panel labels +error_more_info=Повече информация +error_less_info=По-малко информация +error_close=Затваряне +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js версия {{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Съобщение: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Стек: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Файл: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Ред: {{line}} +rendering_error=Грешка при изчертаване на страницата. + +# Predefined zoom values +page_scale_width=Ширина на страницата +page_scale_fit=Вместване в страницата +page_scale_auto=Автоматично мащабиране +page_scale_actual=Действителен размер +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Грешка +loading_error=Получи се грешка при зареждане на PDF-а. +invalid_file_error=Невалиден или повреден PDF файл. +missing_file_error=Липсващ PDF файл. +unexpected_response_error=Неочакван отговор от сървъра. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Анотация {{type}}] +password_label=Въведете парола за отваряне на този PDF файл. +password_invalid=Невалидна парола. Моля, опитайте отново. +password_ok=Добре +password_cancel=Отказ + +printing_not_supported=Внимание: Този браузър няма пълна поддръжка на отпечатване. +printing_not_ready=Внимание: Този PDF файл не е напълно зареден за печат. +web_fonts_disabled=Уеб-шрифтовете са забранени: разрешаване на използването на вградените PDF шрифтове. +document_colors_not_allowed=На PDF-документите не е разрешено да използват собствени цветове: „Разрешаване на страниците да избират собствени цветове“ е изключено в браузъра. diff --git a/src/cps/static/locale/bn-BD/viewer.properties b/src/cps/static/locale/bn-BD/viewer.properties new file mode 100644 index 0000000..9b660f6 --- /dev/null +++ b/src/cps/static/locale/bn-BD/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=পূর্ববর্তী পৃষ্ঠা +previous_label=পূর্ববর্তী +next.title=পরবর্তী পৃষ্ঠা +next_label=পরবর্তী + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=পাতা +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} এর +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pagesCount}} এর {{pageNumber}}) + +zoom_out.title=ছোট আকারে প্রদর্শন +zoom_out_label=ছোট আকারে প্রদর্শন +zoom_in.title=বড় আকারে প্রদর্শন +zoom_in_label=বড় আকারে প্রদর্শন +zoom.title=বড় আকারে প্রদর্শন +presentation_mode.title=উপস্থাপনা মোডে স্যুইচ করুন +presentation_mode_label=উপস্থাপনা মোড +open_file.title=ফাইল খুলুন +open_file_label=খুলুন +print.title=মুদ্রণ +print_label=মুদ্রণ +download.title=ডাউনলোড +download_label=ডাউনলোড +bookmark.title=বর্তমান অবস্থা (অনুলিপি অথবা নতুন উইন্ডো তে খুলুন) +bookmark_label=বর্তমান অবস্থা + +# Secondary toolbar and context menu +tools.title=টুল +tools_label=টুল +first_page.title=প্রথম পাতায় যাও +first_page.label=প্রথম পাতায় যাও +first_page_label=প্রথম পাতায় যাও +last_page.title=শেষ পাতায় যাও +last_page.label=শেষ পাতায় যাও +last_page_label=শেষ পাতায় যাও +page_rotate_cw.title=ঘড়ির কাঁটার দিকে ঘোরাও +page_rotate_cw.label=ঘড়ির কাঁটার দিকে ঘোরাও +page_rotate_cw_label=ঘড়ির কাঁটার দিকে ঘোরাও +page_rotate_ccw.title=ঘড়ির কাঁটার বিপরীতে ঘোরাও +page_rotate_ccw.label=ঘড়ির কাঁটার বিপরীতে ঘোরাও +page_rotate_ccw_label=ঘড়ির কাঁটার বিপরীতে ঘোরাও + +hand_tool_enable.title=হ্যান্ড টুল সক্রিয় করুন +hand_tool_enable_label=হ্যান্ড টুল সক্রিয় করুন +hand_tool_disable.title=হ্যান্ড টুল নিস্ক্রিয় করুন +hand_tool_disable_label=হ্যান্ড টুল নিস্ক্রিয় করুন + +# Document properties dialog box +document_properties.title=নথি বৈশিষ্ট্য… +document_properties_label=নথি বৈশিষ্ট্য… +document_properties_file_name=ফাইলের নাম: +document_properties_file_size=ফাইলের আকার: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} কেবি ({{size_b}} বাইট) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} এমবি ({{size_b}} বাইট) +document_properties_title=শিরোনাম: +document_properties_author=লেখক: +document_properties_subject=বিষয়: +document_properties_keywords=কীওয়ার্ড: +document_properties_creation_date=তৈরির তারিখ: +document_properties_modification_date=পরিবর্তনের তারিখ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=প্রস্তুতকারক: +document_properties_producer=পিডিএফ প্রস্তুতকারক: +document_properties_version=পিডিএফ সংষ্করণ: +document_properties_page_count=মোট পাতা: +document_properties_close=বন্ধ + +print_progress_message=মুদ্রণের জন্য নথি প্রস্তুত করা হচ্ছে… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=বাতিল + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=সাইডবার টগল করুন +toggle_sidebar_label=সাইডবার টগল করুন +document_outline.title=নথির আউটলাইন দেখাও (সব আইটেম প্রসারিত/সঙ্কুচিত করতে ডবল ক্লিক করুন) +document_outline_label=নথির রূপরেখা +attachments.title=সংযুক্তি দেখাও +attachments_label=সংযুক্তি +thumbs.title=থাম্বনেইল সমূহ প্রদর্শন করুন +thumbs_label=থাম্বনেইল সমূহ +findbar.title=নথির মধ্যে খুঁজুন +findbar_label=অনুসন্ধান + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=পৃষ্ঠা {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} পৃষ্ঠার থাম্বনেইল + +# Find panel button title and messages +find_label=অনুসন্ধান: +find_previous.title=বাক্যাংশের পূর্ববর্তী উপস্থিতি অনুসন্ধান +find_previous_label=পূর্ববর্তী +find_next.title=বাক্যাংশের পরবর্তী উপস্থিতি অনুসন্ধান +find_next_label=পরবর্তী +find_highlight=সব হাইলাইট করা হবে +find_match_case_label=অক্ষরের ছাঁদ মেলানো +find_reached_top=পৃষ্ঠার শুরুতে পৌছে গেছে, নীচ থেকে আরম্ভ করা হয়েছে +find_reached_bottom=পৃষ্ঠার শেষে পৌছে গেছে, উপর থেকে আরম্ভ করা হয়েছে +find_not_found=বাক্যাংশ পাওয়া যায়নি + +# Error panel labels +error_more_info=আরও তথ্য +error_less_info=কম তথ্য +error_close=বন্ধ +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=বার্তা: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=নথি: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=লাইন: {{line}} +rendering_error=পৃষ্ঠা উপস্থাপনার সময় ত্রুটি দেখা দিয়েছে। + +# Predefined zoom values +page_scale_width=পৃষ্ঠার প্রস্থ +page_scale_fit=পৃষ্ঠা ফিট করুন +page_scale_auto=স্বয়ংক্রিয় জুম +page_scale_actual=প্রকৃত আকার +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=ত্রুটি +loading_error=পিডিএফ লোড করার সময় ত্রুটি দেখা দিয়েছে। +invalid_file_error=অকার্যকর অথবা ক্ষতিগ্রস্ত পিডিএফ ফাইল। +missing_file_error=নিখোঁজ PDF ফাইল। +unexpected_response_error=অপ্রত্যাশীত সার্ভার প্রতিক্রিয়া। + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} টীকা] +password_label=পিডিএফ ফাইলটি ওপেন করতে পাসওয়ার্ড দিন। +password_invalid=ভুল পাসওয়ার্ড। অনুগ্রহ করে আবার চেষ্টা করুন। +password_ok=ঠিক আছে +password_cancel=বাতিল + +printing_not_supported=সতর্কতা: এই ব্রাউজারে মুদ্রণ সম্পূর্ণভাবে সমর্থিত নয়। +printing_not_ready=সতর্কীকরণ: পিডিএফটি মুদ্রণের জন্য সম্পূর্ণ লোড হয়নি। +web_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয়: সংযুক্ত পিডিএফ ফন্ট ব্যবহার করা যাচ্ছে না। +document_colors_not_allowed=পিডিএফ ডকুমেন্টকে তাদের নিজস্ব রঙ ব্যবহারে অনুমতি নেই: 'পাতা তাদের নিজেস্ব রঙ নির্বাচন করতে অনুমতি দিন' এই ব্রাউজারে নিষ্ক্রিয় রয়েছে। diff --git a/src/cps/static/locale/bn-IN/viewer.properties b/src/cps/static/locale/bn-IN/viewer.properties new file mode 100644 index 0000000..3fe4fc3 --- /dev/null +++ b/src/cps/static/locale/bn-IN/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=পূর্ববর্তী পৃষ্ঠা +previous_label=পূর্ববর্তী +next.title=পরবর্তী পৃষ্ঠা +next_label=পরবর্তী + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=পেজ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pagesCount}} এর {{pageNumber}}) + +zoom_out.title=ছোট মাপে প্রদর্শন +zoom_out_label=ছোট মাপে প্রদর্শন +zoom_in.title=বড় মাপে প্রদর্শন +zoom_in_label=বড় মাপে প্রদর্শন +zoom.title=প্রদর্শনের মাপ +presentation_mode.title=উপস্থাপনা মোড স্যুইচ করুন +presentation_mode_label=উপস্থাপনা মোড +open_file.title=ফাইল খুলুন +open_file_label=খুলুন +print.title=প্রিন্ট করুন +print_label=প্রিন্ট করুন +download.title=ডাউনলোড করুন +download_label=ডাউনলোড করুন +bookmark.title=বর্তমান প্রদর্শন (কপি করুন অথবা নতুন উইন্ডোতে খুলুন) +bookmark_label=বর্তমান প্রদর্শন + +# Secondary toolbar and context menu +tools.title=সরঞ্জাম +tools_label=সরঞ্জাম +first_page.title=প্রথম পৃষ্ঠায় চলুন +first_page.label=প্রথম পৃষ্ঠায় চলুন +first_page_label=প্রথম পৃষ্ঠায় চলুন +last_page.title=সর্বশেষ পৃষ্ঠায় চলুন +last_page.label=সর্বশেষ পৃষ্ঠায় চলুন +last_page_label=সর্বশেষ পৃষ্ঠায় চলুন +page_rotate_cw.title=ডানদিকে ঘোরানো হবে +page_rotate_cw.label=ডানদিকে ঘোরানো হবে +page_rotate_cw_label=ডানদিকে ঘোরানো হবে +page_rotate_ccw.title=বাঁদিকে ঘোরানো হবে +page_rotate_ccw.label=বাঁদিকে ঘোরানো হবে +page_rotate_ccw_label=বাঁদিকে ঘোরানো হবে + +hand_tool_enable.title=হ্যান্ড টুল সক্রিয় করুন +hand_tool_enable_label=হ্যান্ড টুল সক্রিয় করুন +hand_tool_disable.title=হ্যান্ড টুল নিস্ক্রিয় করুন +hand_tool_disable_label=হ্যান্ড টুল নিস্ক্রিয় করুন + +# Document properties dialog box +document_properties.title=নথির বৈশিষ্ট্য… +document_properties_label=নথির বৈশিষ্ট্য… +document_properties_file_name=ফাইলের নাম: +document_properties_file_size=ফাইলের মাপ: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} মেগাবাইট ({{size_b}} bytes) +document_properties_title=শিরোনাম: +document_properties_author=লেখক: +document_properties_subject=বিষয়: +document_properties_keywords=নির্দেশক শব্দ: +document_properties_creation_date=নির্মাণের তারিখ: +document_properties_modification_date=পরিবর্তনের তারিখ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=নির্মাতা: +document_properties_producer=PDF নির্মাতা: +document_properties_version=PDF সংস্করণ: +document_properties_page_count=মোট পৃষ্ঠা: +document_properties_close=বন্ধ করুন + +print_progress_message=ডকুমেন্ট প্রিন্টিং-র জন্য তৈরি করা হচ্ছে... +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=বাতিল + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=সাইডবার টগল করুন +toggle_sidebar_label=সাইডবার টগল করুন +document_outline.title=ডকুমেন্ট আউটলাইন দেখান (দুবার ক্লিক করুন বাড়াতে//collapse সমস্ত আইটেম) +document_outline_label=ডকুমেন্ট আউটলাইন +attachments.title=সংযুক্তিসমূহ দেখান +attachments_label=সংযুক্ত বস্তু +thumbs.title=থাম্ব-নেইল প্রদর্শন +thumbs_label=থাম্ব-নেইল প্রদর্শন +findbar.title=নথিতে খুঁজুন +findbar_label=অনুসন্ধান করুন + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=পৃষ্ঠা {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=পৃষ্ঠা {{page}}-র থাম্ব-নেইল + +# Find panel button title and messages +find_label=অনুসন্ধান: +find_previous.title=চিহ্নিত পংক্তির পূর্ববর্তী উপস্থিতি অনুসন্ধান করুন +find_previous_label=পূর্ববর্তী +find_next.title=চিহ্নিত পংক্তির পরবর্তী উপস্থিতি অনুসন্ধান করুন +find_next_label=পরবর্তী +find_highlight=সমগ্র উজ্জ্বল করুন +find_match_case_label=হরফের ছাঁদ মেলানো হবে +find_reached_top=পৃষ্ঠার প্রারম্ভে পৌছে গেছে, নীচের অংশ থেকে আরম্ভ করা হবে +find_reached_bottom=পৃষ্ঠার অন্তিম প্রান্তে পৌছে গেছে, প্রথম অংশ থেকে আরম্ভ করা হবে +find_not_found=পংক্তি পাওয়া যায়নি + +# Error panel labels +error_more_info=অতিরিক্ত তথ্য +error_less_info=কম তথ্য +error_close=বন্ধ করুন +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Message: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Line: {{line}} +rendering_error=পৃষ্ঠা প্রদর্শনকালে একটি সমস্যা দেখা দিয়েছে। + +# Predefined zoom values +page_scale_width=পৃষ্ঠার প্রস্থ অনুযায়ী +page_scale_fit=পৃষ্ঠার মাপ অনুযায়ী +page_scale_auto=স্বয়ংক্রিয় মাপ নির্ধারণ +page_scale_actual=প্রকৃত মাপ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=ত্রুটি +loading_error=PDF লোড করার সময় সমস্যা দেখা দিয়েছে। +invalid_file_error=অবৈধ বা ক্ষতিগ্রস্ত পিডিএফ ফাইল। +missing_file_error=অনুপস্থিত PDF ফাইল +unexpected_response_error=সার্ভার থেকে অপ্রত্যাশিত সাড়া পাওয়া গেছে। + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=এই PDF ফাইল খোলার জন্য পাসওয়ার্ড দিন। +password_invalid=পাসওয়ার্ড সঠিক নয়। অনুগ্রহ করে পুনরায় প্রচেষ্টা করুন। +password_ok=OK +password_cancel=বাতিল করুন + +printing_not_supported=সতর্কবার্তা: এই ব্রাউজার দ্বারা প্রিন্ট ব্যবস্থা সম্পূর্ণরূপে সমর্থিত নয়। +printing_not_ready=সতর্কবাণী: পিডিএফ সম্পূর্ণরূপে মুদ্রণের জন্য লোড করা হয় না. +web_fonts_disabled=ওয়েব ফন্ট নিষ্ক্রিয় করা হয়েছে: এমবেডেড পিডিএফ ফন্ট ব্যবহার করতে অক্ষম. +document_colors_not_allowed=পিডিএফ নথি তাদের নিজস্ব রং ব্যবহার করার জন্য অনুমতিপ্রাপ্ত নয়: ব্রাউজারে নিষ্ক্রিয় করা হয়েছে য়েন 'পেজ তাদের নিজস্ব রং নির্বাচন করার অনুমতি প্রদান করা য়ায়।' diff --git a/src/cps/static/locale/br/viewer.properties b/src/cps/static/locale/br/viewer.properties new file mode 100644 index 0000000..b7f0d99 --- /dev/null +++ b/src/cps/static/locale/br/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pajenn a-raok +previous_label=A-raok +next.title=Pajenn war-lerc'h +next_label=War-lerc'h + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pajenn +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=eus {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} war {{pagesCount}}) + +zoom_out.title=Zoum bihanaat +zoom_out_label=Zoum bihanaat +zoom_in.title=Zoum brasaat +zoom_in_label=Zoum brasaat +zoom.title=Zoum +presentation_mode.title=Trec'haoliñ etrezek ar mod kinnigadenn +presentation_mode_label=Mod kinnigadenn +open_file.title=Digeriñ ur restr +open_file_label=Digeriñ ur restr +print.title=Moullañ +print_label=Moullañ +download.title=Pellgargañ +download_label=Pellgargañ +bookmark.title=Gwel bremanel (eilañ pe zigeriñ e-barzh ur prenestr nevez) +bookmark_label=Gwel bremanel + +# Secondary toolbar and context menu +tools.title=Ostilhoù +tools_label=Ostilhoù +first_page.title=Mont d'ar bajenn gentañ +first_page.label=Mont d'ar bajenn gentañ +first_page_label=Mont d'ar bajenn gentañ +last_page.title=Mont d'ar bajenn diwezhañ +last_page.label=Mont d'ar bajenn diwezhañ +last_page_label=Mont d'ar bajenn diwezhañ +page_rotate_cw.title=C'hwelañ gant roud ar bizied +page_rotate_cw.label=C'hwelañ gant roud ar bizied +page_rotate_cw_label=C'hwelañ gant roud ar bizied +page_rotate_ccw.title=C'hwelañ gant roud gin ar bizied +page_rotate_ccw.label=C'hwelañ gant roud gin ar bizied +page_rotate_ccw_label=C'hwelañ gant roud gin ar bizied + +hand_tool_enable.title=Gweredekaat an ostilh "dorn" +hand_tool_enable_label=Gweredekaat an ostilh "dorn" +hand_tool_disable.title=Diweredekaat an ostilh "dorn" +hand_tool_disable_label=Diweredekaat an ostilh "dorn" + +# Document properties dialog box +document_properties.title=Perzhioù an teul… +document_properties_label=Perzhioù an teul… +document_properties_file_name=Anv restr : +document_properties_file_size=Ment ar restr : +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} Ke ({{size_b}} eizhbit) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} Me ({{size_b}} eizhbit) +document_properties_title=Titl : +document_properties_author=Aozer : +document_properties_subject=Danvez : +document_properties_keywords=Gerioù-alc'hwez : +document_properties_creation_date=Deiziad krouiñ : +document_properties_modification_date=Deiziad kemmañ : +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Krouer : +document_properties_producer=Kenderc'her PDF : +document_properties_version=Handelv PDF : +document_properties_page_count=Niver a bajennoù : +document_properties_close=Serriñ + +print_progress_message=O prientiñ an teul evit moullañ... +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Nullañ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Diskouez/kuzhat ar varrenn gostez +toggle_sidebar_label=Diskouez/kuzhat ar varrenn gostez +document_outline.title=Diskouez steuñv an teul (daouglikit evit brasaat/bihanaat an holl elfennoù) +document_outline_label=Sinedoù an teuliad +attachments.title=Diskouez ar c'henstagadurioù +attachments_label=Kenstagadurioù +thumbs.title=Diskouez ar melvennoù +thumbs_label=Melvennoù +findbar.title=Klask e-barzh an teuliad +findbar_label=Klask + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pajenn {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Melvenn ar bajenn {{page}} + +# Find panel button title and messages +find_label=Kavout : +find_previous.title=Kavout an tamm frazenn kent o klotañ ganti +find_previous_label=Kent +find_next.title=Kavout an tamm frazenn war-lerc'h o klotañ ganti +find_next_label=War-lerc'h +find_highlight=Usskediñ pep tra +find_match_case_label=Teurel evezh ouzh ar pennlizherennoù +find_reached_top=Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz +find_reached_bottom=Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h +find_not_found=N'haller ket kavout ar frazenn + +# Error panel labels +error_more_info=Muioc'h a ditouroù +error_less_info=Nebeutoc'h a ditouroù +error_close=Serriñ +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js handelv {{version}} (kempunadur : {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Kemennadenn : {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Torn : {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Restr : {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linenn : {{line}} +rendering_error=Degouezhet ez eus bet ur fazi e-pad skrammañ ar bajennad. + +# Predefined zoom values +page_scale_width=Led ar bajenn +page_scale_fit=Pajenn a-bezh +page_scale_auto=Zoum emgefreek +page_scale_actual=Ment wir +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Fazi +loading_error=Degouezhet ez eus bet ur fazi e-pad kargañ ar PDF. +invalid_file_error=Restr PDF didalvoudek pe kontronet. +missing_file_error=Restr PDF o vankout. +unexpected_response_error=Respont dic'hortoz a-berzh an dafariad + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Notennañ] +password_label=Enankit ar ger-tremen evit digeriñ ar restr PDF-mañ. +password_invalid=Ger-tremen didalvoudek. Klaskit en-dro mar plij. +password_ok=Mat eo +password_cancel=Nullañ + +printing_not_supported=Kemenn : N'eo ket skoret penn-da-benn ar moullañ gant ar merdeer-mañ. +printing_not_ready=Kemenn : N'hall ket bezañ moullet ar restr PDF rak n'eo ket karget penn-da-benn. +web_fonts_disabled=Diweredekaet eo an nodrezhoù web : n'haller ket arverañ an nodrezhoù PDF enframmet. +document_colors_not_allowed=N'eo ket aotreet an teuliadoù PDF da arverañ o livioù dezho : diweredekaet eo “Aotren ar pajennoù da zibab o livioù dezho” e-barzh ar merdeer. diff --git a/src/cps/static/locale/bs/viewer.properties b/src/cps/static/locale/bs/viewer.properties new file mode 100644 index 0000000..0dcbe7a --- /dev/null +++ b/src/cps/static/locale/bs/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Prethodna strana +previous_label=Prethodna +next.title=Sljedeća strna +next_label=Sljedeća + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Strana +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=od {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} od {{pagesCount}}) + +zoom_out.title=Umanji +zoom_out_label=Umanji +zoom_in.title=Uvećaj +zoom_in_label=Uvećaj +zoom.title=Uvećanje +presentation_mode.title=Prebaci se u prezentacijski režim +presentation_mode_label=Prezentacijski režim +open_file.title=Otvori fajl +open_file_label=Otvori +print.title=Štampaj +print_label=Štampaj +download.title=Preuzmi +download_label=Preuzmi +bookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru) +bookmark_label=Trenutni prikaz + +# Secondary toolbar and context menu +tools.title=Alati +tools_label=Alati +first_page.title=Idi na prvu stranu +first_page.label=Idi na prvu stranu +first_page_label=Idi na prvu stranu +last_page.title=Idi na zadnju stranu +last_page.label=Idi na zadnju stranu +last_page_label=Idi na zadnju stranu +page_rotate_cw.title=Rotiraj u smjeru kazaljke na satu +page_rotate_cw.label=Rotiraj u smjeru kazaljke na satu +page_rotate_cw_label=Rotiraj u smjeru kazaljke na satu +page_rotate_ccw.title=Rotiraj suprotno smjeru kazaljke na satu +page_rotate_ccw.label=Rotiraj suprotno smjeru kazaljke na satu +page_rotate_ccw_label=Rotiraj suprotno smjeru kazaljke na satu + +hand_tool_enable.title=Omogući ručni alat +hand_tool_enable_label=Omogući ručni alat +hand_tool_disable.title=Onemogući ručni alat +hand_tool_disable_label=Onemogući ručni alat + +# Document properties dialog box +document_properties.title=Svojstva dokumenta... +document_properties_label=Svojstva dokumenta... +document_properties_file_name=Naziv fajla: +document_properties_file_size=Veličina fajla: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bajta) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajta) +document_properties_title=Naslov: +document_properties_author=Autor: +document_properties_subject=Predmet: +document_properties_keywords=Ključne riječi: +document_properties_creation_date=Datum kreiranja: +document_properties_modification_date=Datum promjene: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Kreator: +document_properties_producer=PDF stvaratelj: +document_properties_version=PDF verzija: +document_properties_page_count=Broj stranica: +document_properties_close=Zatvori + +print_progress_message=Pripremam dokument za štampu… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Otkaži + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Uključi/isključi bočnu traku +toggle_sidebar_label=Uključi/isključi bočnu traku +document_outline.title=Prikaži outline dokumenta (dvoklik za skupljanje/širenje svih stavki) +document_outline_label=Konture dokumenta +attachments.title=Prikaži priloge +attachments_label=Prilozi +thumbs.title=Prikaži thumbnailove +thumbs_label=Thumbnailovi +findbar.title=Pronađi u dokumentu +findbar_label=Pronađi + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Strana {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Thumbnail strane {{page}} + +# Find panel button title and messages +find_label=Pronađi: +find_previous.title=Pronađi prethodno pojavljivanje fraze +find_previous_label=Prethodno +find_next.title=Pronađi sljedeće pojavljivanje fraze +find_next_label=Sljedeće +find_highlight=Označi sve +find_match_case_label=Osjetljivost na karaktere +find_reached_top=Dostigao sam vrh dokumenta, nastavljam sa dna +find_reached_bottom=Dostigao sam kraj dokumenta, nastavljam sa vrha +find_not_found=Fraza nije pronađena + +# Error panel labels +error_more_info=Više informacija +error_less_info=Manje informacija +error_close=Zatvori +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Poruka: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fajl: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linija: {{line}} +rendering_error=Došlo je do greške prilikom renderiranja strane. + +# Predefined zoom values +page_scale_width=Širina strane +page_scale_fit=Uklopi stranu +page_scale_auto=Automatsko uvećanje +page_scale_actual=Stvarna veličina +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Greška +loading_error=Došlo je do greške prilikom učitavanja PDF-a. +invalid_file_error=Neispravan ili oštećen PDF fajl. +missing_file_error=Nedostaje PDF fajl. +unexpected_response_error=Neočekivani odgovor servera. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} pribilješka] +password_label=Upišite lozinku da biste otvorili ovaj PDF fajl. +password_invalid=Pogrešna lozinka. Pokušajte ponovo. +password_ok=OK +password_cancel=Otkaži + +printing_not_supported=Upozorenje: Štampanje nije u potpunosti podržano u ovom browseru. +printing_not_ready=Upozorenje: PDF nije u potpunosti učitan za štampanje. +web_fonts_disabled=Web fontovi su onemogućeni: nemoguće koristiti ubačene PDF fontove. +document_colors_not_allowed=PDF dokumentima nije dozvoljeno da koriste vlastite boje: 'Dozvoli stranicama da izaberu vlastite boje' je deaktivirano u browseru. diff --git a/src/cps/static/locale/ca/viewer.properties b/src/cps/static/locale/ca/viewer.properties new file mode 100644 index 0000000..f360b34 --- /dev/null +++ b/src/cps/static/locale/ca/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pàgina anterior +previous_label=Anterior +next.title=Pàgina següent +next_label=Següent + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pàgina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Allunya +zoom_out_label=Allunya +zoom_in.title=Apropa +zoom_in_label=Apropa +zoom.title=Escala +presentation_mode.title=Canvia al mode de presentació +presentation_mode_label=Mode de presentació +open_file.title=Obre el fitxer +open_file_label=Obre +print.title=Imprimeix +print_label=Imprimeix +download.title=Baixa +download_label=Baixa +bookmark.title=Vista actual (copia o obre en una finestra nova) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Eines +tools_label=Eines +first_page.title=Vés a la primera pàgina +first_page.label=Vés a la primera pàgina +first_page_label=Vés a la primera pàgina +last_page.title=Vés a l'última pàgina +last_page.label=Vés a l'última pàgina +last_page_label=Vés a l'última pàgina +page_rotate_cw.title=Gira cap a la dreta +page_rotate_cw.label=Gira cap a la dreta +page_rotate_cw_label=Gira cap a la dreta +page_rotate_ccw.title=Gira cap a l'esquerra +page_rotate_ccw.label=Gira cap a l'esquerra +page_rotate_ccw_label=Gira cap a l'esquerra + +hand_tool_enable.title=Habilita l'eina de mà +hand_tool_enable_label=Habilita l'eina de mà +hand_tool_disable.title=Inhabilita l'eina de mà +hand_tool_disable_label=Inhabilita l'eina de mà + +# Document properties dialog box +document_properties.title=Propietats del document… +document_properties_label=Propietats del document… +document_properties_file_name=Nom del fitxer: +document_properties_file_size=Mida del fitxer: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Títol: +document_properties_author=Autor: +document_properties_subject=Assumpte: +document_properties_keywords=Paraules clau: +document_properties_creation_date=Data de creació: +document_properties_modification_date=Data de modificació: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creador: +document_properties_producer=Generador de PDF: +document_properties_version=Versió de PDF: +document_properties_page_count=Nombre de pàgines: +document_properties_close=Tanca + +print_progress_message=S'està preparant la impressió del document… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancel·la + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Mostra/amaga la barra lateral +toggle_sidebar_label=Mostra/amaga la barra lateral +document_outline.title=Mostra l'esquema del document (doble clic per ampliar/reduir tots els elements) +document_outline_label=Contorn del document +attachments.title=Mostra les adjuncions +attachments_label=Adjuncions +thumbs.title=Mostra les miniatures +thumbs_label=Miniatures +findbar.title=Cerca al document +findbar_label=Cerca + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pàgina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura de la pàgina {{page}} + +# Find panel button title and messages +find_label=Cerca: +find_previous.title=Cerca l'anterior coincidència de l'expressió +find_previous_label=Anterior +find_next.title=Cerca la següent coincidència de l'expressió +find_next_label=Següent +find_highlight=Ressalta-ho tot +find_match_case_label=Distingeix entre majúscules i minúscules +find_reached_top=S'ha arribat al principi del document, es continua pel final +find_reached_bottom=S'ha arribat al final del document, es continua pel principi +find_not_found=No s'ha trobat l'expressió + +# Error panel labels +error_more_info=Més informació +error_less_info=Menys informació +error_close=Tanca +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (muntatge: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Missatge: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fitxer: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Línia: {{line}} +rendering_error=S'ha produït un error mentre es renderitzava la pàgina. + +# Predefined zoom values +page_scale_width=Amplària de la pàgina +page_scale_fit=Ajusta la pàgina +page_scale_auto=Zoom automàtic +page_scale_actual=Mida real +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Error +loading_error=S'ha produït un error en carregar el PDF. +invalid_file_error=El fitxer PDF no és vàlid o està malmès. +missing_file_error=Falta el fitxer PDF. +unexpected_response_error=Resposta inesperada del servidor. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotació {{type}}] +password_label=Introduïu la contrasenya per obrir aquest fitxer PDF. +password_invalid=La contrasenya no és vàlida. Torneu-ho a provar. +password_ok=D'acord +password_cancel=Cancel·la + +printing_not_supported=Avís: la impressió no és plenament funcional en aquest navegador. +printing_not_ready=Atenció: el PDF no s'ha acabat de carregar per imprimir-lo. +web_fonts_disabled=Els tipus de lletra web estan desactivats: no es poden utilitzar els tipus de lletra incrustats al PDF. +document_colors_not_allowed=Els documents PDF no poden usar els seus colors propis: «Permet a les pàgines triar els colors propis» es troba desactivat al navegador. diff --git a/src/cps/static/locale/cs/viewer.properties b/src/cps/static/locale/cs/viewer.properties new file mode 100644 index 0000000..25b1ef9 --- /dev/null +++ b/src/cps/static/locale/cs/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Přejde na předchozí stránku +previous_label=Předchozí +next.title=Přejde na následující stránku +next_label=Další + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Stránka +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=z {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} z {{pagesCount}}) + +zoom_out.title=Zmenší velikost +zoom_out_label=Zmenšit +zoom_in.title=Zvětší velikost +zoom_in_label=Zvětšit +zoom.title=Nastaví velikost +presentation_mode.title=Přepne do režimu prezentace +presentation_mode_label=Režim prezentace +open_file.title=Otevře soubor +open_file_label=Otevřít +print.title=Vytiskne dokument +print_label=Tisk +download.title=Stáhne dokument +download_label=Stáhnout +bookmark.title=Současný pohled (kopírovat nebo otevřít v novém okně) +bookmark_label=Současný pohled + +# Secondary toolbar and context menu +tools.title=Nástroje +tools_label=Nástroje +first_page.title=Přejde na první stránku +first_page.label=Přejít na první stránku +first_page_label=Přejít na první stránku +last_page.title=Přejde na poslední stránku +last_page.label=Přejít na poslední stránku +last_page_label=Přejít na poslední stránku +page_rotate_cw.title=Otočí po směru hodin +page_rotate_cw.label=Otočit po směru hodin +page_rotate_cw_label=Otočit po směru hodin +page_rotate_ccw.title=Otočí proti směru hodin +page_rotate_ccw.label=Otočit proti směru hodin +page_rotate_ccw_label=Otočit proti směru hodin + +hand_tool_enable.title=Povolí nástroj ručička +hand_tool_enable_label=Povolit nástroj ručička +hand_tool_disable.title=Zakáže nástroj ručička +hand_tool_disable_label=Zakázat nástroj ručička + +# Document properties dialog box +document_properties.title=Vlastnosti dokumentu… +document_properties_label=Vlastnosti dokumentu… +document_properties_file_name=Název souboru: +document_properties_file_size=Velikost souboru: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bajtů) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajtů) +document_properties_title=Nadpis: +document_properties_author=Autor: +document_properties_subject=Předmět: +document_properties_keywords=Klíčová slova: +document_properties_creation_date=Datum vytvoření: +document_properties_modification_date=Datum úpravy: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Vytvořil: +document_properties_producer=Tvůrce PDF: +document_properties_version=Verze PDF: +document_properties_page_count=Počet stránek: +document_properties_close=Zavřít + +print_progress_message=Příprava dokumentu pro tisk… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}} % +print_progress_close=Zrušit + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Postranní lišta +toggle_sidebar_label=Postranní lišta +document_outline.title=Zobrazit osnovu dokumentu (dvojité klepnutí rozbalí/sbalí všechny položky) +document_outline_label=Osnova dokumentu +attachments.title=Zobrazí přílohy +attachments_label=Přílohy +thumbs.title=Zobrazí náhledy +thumbs_label=Náhledy +findbar.title=Najde v dokumentu +findbar_label=Najít + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Strana {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Náhled strany {{page}} + +# Find panel button title and messages +find_label=Najít: +find_previous.title=Najde předchozí výskyt hledaného spojení +find_previous_label=Předchozí +find_next.title=Najde další výskyt hledaného spojení +find_next_label=Další +find_highlight=Zvýraznit +find_match_case_label=Rozlišovat velikost +find_reached_top=Dosažen začátek dokumentu, pokračuje se od konce +find_reached_bottom=Dosažen konec dokumentu, pokračuje se od začátku +find_not_found=Hledané spojení nenalezeno + +# Error panel labels +error_more_info=Více informací +error_less_info=Méně informací +error_close=Zavřít +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (sestavení: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Zpráva: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Zásobník: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Soubor: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Řádek: {{line}} +rendering_error=Při vykreslování stránky nastala chyba. + +# Predefined zoom values +page_scale_width=Podle šířky +page_scale_fit=Podle výšky +page_scale_auto=Automatická velikost +page_scale_actual=Skutečná velikost +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Chyba +loading_error=Při nahrávání PDF nastala chyba. +invalid_file_error=Neplatný nebo chybný soubor PDF. +missing_file_error=Chybí soubor PDF. +unexpected_response_error=Neočekávaná odpověď serveru. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotace typu {{type}}] +password_label=Pro otevření PDF souboru vložte heslo. +password_invalid=Neplatné heslo. Zkuste to znovu. +password_ok=OK +password_cancel=Zrušit + +printing_not_supported=Upozornění: Tisk není v tomto prohlížeči plně podporován. +printing_not_ready=Upozornění: Dokument PDF není kompletně načten. +web_fonts_disabled=Webová písma jsou zakázána, proto není možné použít vložená písma PDF. +document_colors_not_allowed=PDF dokumenty nemají povoleno používat vlastní barvy: volba 'Povolit stránkám používat vlastní barvy' je v prohlížeči deaktivována. diff --git a/src/cps/static/locale/csb/viewer.properties b/src/cps/static/locale/csb/viewer.properties new file mode 100644 index 0000000..293a353 --- /dev/null +++ b/src/cps/static/locale/csb/viewer.properties @@ -0,0 +1,134 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pòprzédnô strona +previous_label=Pòprzédnô +next.title=Nôslédnô strona +next_label=Nôslédnô + +# LOCALIZATION NOTE (page_label, page_of): +# These strings are concatenated to form the "Page: X of Y" string. +# Do not translate "{{pageCount}}", it will be substituted with a number +# representing the total number of pages. +page_label=Strona: +page_of=z {{pageCount}} + +zoom_out.title=Zmniészë +zoom_out_label=Zmniészë +zoom_in.title=Zwikszë +zoom_in_label=Wiôlgòsc +zoom.title=Wiôlgòsc +print.title=Drëkùjë +print_label=Drëkùjë +presentation_mode.title=Przéńdzë w trib prezentacje +presentation_mode_label=Trib prezentacje +open_file.title=Òtemkni lopk +open_file_label=Òtemkni +download.title=Zladënk +download_label=Zladënk +bookmark.title=Spamiãtôj wëzdrzatk (kòpérëje, abò òtemkni w nowim òknnie) +bookmark_label=Aktualny wëzdrzatk + +find_label=Szëkôj: +find_previous.title=Biéj do pòprzédnégò wënikù szëkbë +find_previous_label=Pòprzédny +find_next.title=Biéj do nôslédnégò wënikù szëkbë +find_next_label=Nôslédny +find_highlight=Pòdszkrzëni wszëtczé +find_match_case_label=Rozeznôwôj miarã lëterów +find_not_found=Nie nalôzł tekstu +find_reached_bottom=Doszedł do kùńca dokùmentu, zaczinającë òd górë +find_reached_top=Doszedł do pòczątkù dokùmentu, zaczinającë òd dołù + +toggle_sidebar.title=Pòsuwk wëbiérkù +toggle_sidebar_label=Pòsuwk wëbiérkù + +outline.title=Wëskrzëni òbcéch dokùmentu +outline_label=Òbcéch dokùmentu +thumbs.title=Wëskrzëni miniaturë +thumbs_label=Miniaturë +findbar.title=Przeszëkôj dokùment +findbar_label=Nalezë +tools_label=Nôrzãdła +first_page.title=Biéj do pierszi stronë +first_page.label=Biéj do pierszi stronë +last_page.label=Biéj do òstatny stronë +invalid_file_error=Lëchi ôrt, abò pòpsëti lopk PDF. + + + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Strona {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura stronë {{page}} + +# Error panel labels +error_more_info=Wicy infòrmacje +error_less_info=Mni infòrmacje +error_close=Close +error_version_info=PDF.js v{{version}} (build: {{build}}) + + +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Message: {{wiadło}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stóg}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{lopk}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Line: {{line}} +rendering_error=Pòkôza sã fela przë renderowanim stronë. + +# Predefined zoom values +page_scale_width=Szérzawa stronë +page_scale_fit=Dopasëje stronã +page_scale_auto=Aùtomatnô wiôlgòsc +page_scale_actual=Naturalnô wiôlgòsc + +# Loading indicator messages +# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage +loading_error_indicator=Fela +loading_error=Pòkôza sã fela przë wczëtiwanim PDFù. + +# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip. +# "{{[type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" + +request_password=PDF je zabezpieczony parolą: +printing_not_supported = Òstrzéga: przezérnik nie je do kùńca wspieróny przez drëkôrze + +# Context menu +page_rotate_cw.label=Òbkrãcë w prawò +page_rotate_ccw.label=Òbkrãcë w lewò + + +last_page.title=Biéj do pòprzédny stronë +last_page_label=Biéj do pòprzédny stronë +page_rotate_cw.title=Òbkrãcë w prawò +page_rotate_cw_label=Òbkrãcë w prawò +page_rotate_ccw.title=Òbkrãcë w lewò +page_rotate_ccw_label=Òbkrãcë w lewò + + +web_fonts_disabled=Sécowé czconczi są wëłączoné: włączë je, bë móc ùżiwac òsadzonëch czconków w lopkach PDF. + + +missing_file_error=Felëje lopka PDF. +printing_not_ready = Òstrzéga: lopk mùszi sã do kùńca wczëtac zanim gò mòże drëkòwac + +document_colors_disabled=Dokùmentë PDF nie mògą ù swòjich farwów: \'Pòzwòlë stronóm wëbierac swòje farwë\' je wëłączoné w przezérnikù. +invalid_password=Lëchô parola. +text_annotation_type.alt=[Adnotacjô {{type}}] + +tools.title=Tools +first_page_label=Go to First Page + + diff --git a/src/cps/static/locale/cy/viewer.properties b/src/cps/static/locale/cy/viewer.properties new file mode 100644 index 0000000..3ded4bc --- /dev/null +++ b/src/cps/static/locale/cy/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Tudalen Flaenorol +previous_label=Blaenorol +next.title=Tudalen Nesaf +next_label=Nesaf + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Tudalen +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=o {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} o {{pagesCount}}) + +zoom_out.title=Chwyddo Allan +zoom_out_label=Chwyddo Allan +zoom_in.title=Chwyddo Mewn +zoom_in_label=Chwyddo Mewn +zoom.title=Chwyddo +presentation_mode.title=Newid i'r Modd Cyflwyno +presentation_mode_label=Modd Cyflwyno +open_file.title=Agor Ffeil +open_file_label=Agor +print.title=Argraffu +print_label=Argraffu +download.title=Llwyth +download_label=Llwytho i Lawr +bookmark.title=Golwg cyfredol (copïo neu agor ffenestr newydd) +bookmark_label=Golwg Gyfredol + +# Secondary toolbar and context menu +tools.title=Offer +tools_label=Offer +first_page.title=Mynd i'r Dudalen Gyntaf +first_page.label=Mynd i'r Dudalen Gyntaf +first_page_label=Mynd i'r Dudalen Gyntaf +last_page.title=Mynd i'r Dudalen Olaf +last_page.label=Mynd i'r Dudalen Olaf +last_page_label=Mynd i'r Dudalen Olaf +page_rotate_cw.title=Cylchdroi Clocwedd +page_rotate_cw.label=Cylchdroi Clocwedd +page_rotate_cw_label=Cylchdroi Clocwedd +page_rotate_ccw.title=Cylchdroi Gwrthglocwedd +page_rotate_ccw.label=Cylchdroi Gwrthglocwedd +page_rotate_ccw_label=Cylchdroi Gwrthglocwedd + +hand_tool_enable.title=Galluogi offeryn llaw +hand_tool_enable_label=Galluogi offeryn llaw +hand_tool_disable.title=Analluogi offeryn llaw +hand_tool_disable_label=Analluogi offeryn llaw + +# Document properties dialog box +document_properties.title=Priodweddau Dogfen… +document_properties_label=Priodweddau Dogfen… +document_properties_file_name=Enw ffeil: +document_properties_file_size=Maint ffeil: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} beit) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} beit) +document_properties_title=Teitl: +document_properties_author=Awdur: +document_properties_subject=Pwnc: +document_properties_keywords=Allweddair: +document_properties_creation_date=Dyddiad Creu: +document_properties_modification_date=Dyddiad Addasu: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Crewr: +document_properties_producer=Cynhyrchydd PDF: +document_properties_version=Fersiwn PDF: +document_properties_page_count=Cyfrif Tudalen: +document_properties_close=Cau + +print_progress_message=Paratoi dogfen ar gyfer ei hargraffu… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Diddymu + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toglo'r Bar Ochr +toggle_sidebar_label=Toglo'r Bar Ochr +document_outline.title=Dangos Amlinell Dogfen (clic dwbl i ymestyn/cau pob eitem) +document_outline_label=Amlinelliad Dogfen +attachments.title=Dangos Atodiadau +attachments_label=Atodiadau +thumbs.title=Dangos Lluniau Bach +thumbs_label=Lluniau Bach +findbar.title=Canfod yn y Ddogfen +findbar_label=Canfod + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Tudalen {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Llun Bach Tudalen {{page}} + +# Find panel button title and messages +find_label=Canfod: +find_previous.title=Canfod enghraifft flaenorol o'r ymadrodd +find_previous_label=Blaenorol +find_next.title=Canfod enghraifft nesaf yr ymadrodd +find_next_label=Nesaf +find_highlight=Amlygu popeth +find_match_case_label=Cydweddu maint +find_reached_top=Wedi cyrraedd brig y dudalen, parhau o'r gwaelod +find_reached_bottom=Wedi cyrraedd diwedd y dudalen, parhau o'r brig +find_not_found=Heb ganfod ymadrodd + +# Error panel labels +error_more_info=Rhagor o Wybodaeth +error_less_info=Llai o wybodaeth +error_close=Cau +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Neges: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stac: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Ffeil: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Llinell: {{line}} +rendering_error=Digwyddodd gwall wrth adeiladu'r dudalen. + +# Predefined zoom values +page_scale_width=Lled Tudalen +page_scale_fit=Ffit Tudalen +page_scale_auto=Chwyddo Awtomatig +page_scale_actual=Maint Gwirioneddol +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Gwall +loading_error=Digwyddodd gwall wrth lwytho'r PDF. +invalid_file_error=Ffeil PDF annilys neu llwgr. +missing_file_error=Ffeil PDF coll. +unexpected_response_error=Ymateb annisgwyl gan y gweinydd. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anodiad {{type}} ] +password_label=Rhowch gyfrinair i agor y PDF. +password_invalid=Cyfrinair annilys. Ceisiwch eto. +password_ok=Iawn +password_cancel=Diddymu + +printing_not_supported=Rhybudd: Nid yw argraffu yn cael ei gynnal yn llawn gan y porwr. +printing_not_ready=Rhybudd: Nid yw'r PDF wedi ei lwytho'n llawn ar gyfer argraffu. +web_fonts_disabled=Ffontiau gwe wedi eu hanalluogi: methu defnyddio ffontiau PDF mewnblanedig. +document_colors_not_allowed=Nid oes caniatâd i ddogfennau PDF i ddefnyddio eu lliwiau eu hunain: Mae “Caniatáu i dudalennau ddefnyddio eu lliwiau eu hunain” wedi ei atal yn y porwr. diff --git a/src/cps/static/locale/da/viewer.properties b/src/cps/static/locale/da/viewer.properties new file mode 100644 index 0000000..4c788e9 --- /dev/null +++ b/src/cps/static/locale/da/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Forrige side +previous_label=Forrige +next.title=Næste side +next_label=Næste + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Side +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=af {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} af {{pagesCount}}) + +zoom_out.title=Zoom ud +zoom_out_label=Zoom ud +zoom_in.title=Zoom ind +zoom_in_label=Zoom ind +zoom.title=Zoom +print.title=Udskriv +print_label=Udskriv +presentation_mode.title=Skift til fuldskærmsvisning +presentation_mode_label=Fuldskærmsvisning +open_file.title=Åbn fil +open_file_label=Åbn +download.title=Hent +download_label=Hent +bookmark.title=Aktuel visning (kopier eller åbn i et nyt vindue) +bookmark_label=Aktuel visning + +# Secondary toolbar and context menu +tools.title=Funktioner +tools_label=Funktioner +first_page.title=Gå til første side +first_page.label=Gå til første side +first_page_label=Gå til første side +last_page.title=Gå til sidste side +last_page.label=Gå til sidste side +last_page_label=Gå til sidste side +page_rotate_cw.title=Roter med uret +page_rotate_cw.label=Roter med uret +page_rotate_cw_label=Roter med uret +page_rotate_ccw.title=Roter mod uret +page_rotate_ccw.label=Roter mod uret +page_rotate_ccw_label=Roter mod uret + +hand_tool_enable.title=Aktiver håndværktøj +hand_tool_enable_label=Aktiver håndværktøj +hand_tool_disable.title=Deaktiver håndværktøj +hand_tool_disable_label=Deaktiver håndværktøj + +# Document properties dialog box +document_properties.title=Dokumentegenskaber… +document_properties_label=Dokumentegenskaber… +document_properties_file_name=Filnavn: +document_properties_file_size=Filstørrelse: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titel: +document_properties_author=Forfatter: +document_properties_subject=Emne: +document_properties_keywords=Nøgleord: +document_properties_creation_date=Oprettet: +document_properties_modification_date=Redigeret: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Program: +document_properties_producer=PDF-producent: +document_properties_version=PDF-version: +document_properties_page_count=Antal sider: +document_properties_close=Luk + +print_progress_message=Forbereder dokument til udskrivning… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Annuller + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Slå sidepanel til eller fra +toggle_sidebar_label=Slå sidepanel til eller fra +document_outline.title=Vis dokumentets disposition (dobbeltklik for at vise/skjule alle elementer) +document_outline_label=Dokument-dosposition +attachments.title=Vis vedhæftede filer +attachments_label=Vedhæftede filer +thumbs.title=Vis miniaturer +thumbs_label=Miniaturer +findbar.title=Find i dokument +findbar_label=Find + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Side {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniature af side {{page}} + +# Find panel button title and messages +find_label=Find: +find_previous.title=Find den forrige forekomst +find_previous_label=Forrige +find_next.title=Find den næste forekomst +find_next_label=Næste +find_highlight=Fremhæv alle +find_match_case_label=Forskel på store og små bogstaver +find_reached_top=Toppen af siden blev nået, fortsatte fra bunden +find_reached_bottom=Bunden af siden blev nået, fortsatte fra toppen +find_not_found=Der blev ikke fundet noget + +# Error panel labels +error_more_info=Mere information +error_less_info=Mindre information +error_close=Luk +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Fejlmeddelelse: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fil: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linje: {{line}} +rendering_error=Der opstod en fejl ved generering af siden. + +# Predefined zoom values +page_scale_width=Sidebredde +page_scale_fit=Tilpas til side +page_scale_auto=Automatisk zoom +page_scale_actual=Faktisk størrelse +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Fejl +loading_error=Der opstod en fejl ved indlæsning af PDF-filen. +invalid_file_error=PDF-filen er ugyldig eller ødelagt. +missing_file_error=Manglende PDF-fil. +unexpected_response_error=Uventet svar fra serveren. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}}kommentar] +password_label=Angiv adgangskode til at åbne denne PDF-fil. +password_invalid=Ugyldig adgangskode. Prøv igen. +password_ok=OK +password_cancel=Fortryd + +printing_not_supported=Advarsel: Udskrivning er ikke fuldt understøttet af browseren. +printing_not_ready=Advarsel: PDF-filen er ikke fuldt indlæst til udskrivning. +web_fonts_disabled=Webskrifttyper er deaktiverede. De indlejrede skrifttyper i PDF-filen kan ikke anvendes. +document_colors_not_allowed=PDF-dokumenter må ikke bruge deres egne farver: 'Tillad sider at vælge deres egne farver' er deaktiveret i browseren. diff --git a/src/cps/static/locale/de/viewer.properties b/src/cps/static/locale/de/viewer.properties new file mode 100644 index 0000000..a0382ab --- /dev/null +++ b/src/cps/static/locale/de/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Eine Seite zurück +previous_label=Zurück +next.title=Eine Seite vor +next_label=Vor + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Seite +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=von {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} von {{pagesCount}}) + +zoom_out.title=Verkleinern +zoom_out_label=Verkleinern +zoom_in.title=Vergrößern +zoom_in_label=Vergrößern +zoom.title=Zoom +print.title=Drucken +print_label=Drucken +presentation_mode.title=In Präsentationsmodus wechseln +presentation_mode_label=Präsentationsmodus +open_file.title=Datei öffnen +open_file_label=Öffnen +download.title=Dokument speichern +download_label=Speichern +bookmark.title=Aktuelle Ansicht (zum Kopieren oder Öffnen in einem neuen Fenster) +bookmark_label=Aktuelle Ansicht + +# Secondary toolbar and context menu +tools.title=Werkzeuge +tools_label=Werkzeuge +first_page.title=Erste Seite anzeigen +first_page.label=Erste Seite anzeigen +first_page_label=Erste Seite anzeigen +last_page.title=Letzte Seite anzeigen +last_page.label=Letzte Seite anzeigen +last_page_label=Letzte Seite anzeigen +page_rotate_cw.title=Im Uhrzeigersinn drehen +page_rotate_cw.label=Im Uhrzeigersinn drehen +page_rotate_cw_label=Im Uhrzeigersinn drehen +page_rotate_ccw.title=Gegen Uhrzeigersinn drehen +page_rotate_ccw.label=Gegen Uhrzeigersinn drehen +page_rotate_ccw_label=Gegen Uhrzeigersinn drehen + +hand_tool_enable.title=Hand-Werkzeug aktivieren +hand_tool_enable_label=Hand-Werkzeug aktivieren +hand_tool_disable.title=Hand-Werkzeug deaktivieren +hand_tool_disable_label=Hand-Werkzeug deaktivieren + +# Document properties dialog box +document_properties.title=Dokumenteigenschaften +document_properties_label=Dokumenteigenschaften… +document_properties_file_name=Dateiname: +document_properties_file_size=Dateigröße: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} Bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} Bytes) +document_properties_title=Titel: +document_properties_author=Autor: +document_properties_subject=Thema: +document_properties_keywords=Stichwörter: +document_properties_creation_date=Erstelldatum: +document_properties_modification_date=Bearbeitungsdatum: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}} {{time}} +document_properties_creator=Anwendung: +document_properties_producer=PDF erstellt mit: +document_properties_version=PDF-Version: +document_properties_page_count=Seitenzahl: +document_properties_close=Schließen + +print_progress_message=Dokument wird für Drucken vorbereitet… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Abbrechen + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Sidebar umschalten +toggle_sidebar_label=Sidebar umschalten +document_outline.title=Dokumentstruktur anzeigen (Doppelklicken, um alle Einträge aus- bzw. einzuklappen) +document_outline_label=Dokumentstruktur +attachments.title=Anhänge anzeigen +attachments_label=Anhänge +thumbs.title=Miniaturansichten anzeigen +thumbs_label=Miniaturansichten +findbar.title=Dokument durchsuchen +findbar_label=Suchen + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Seite {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniaturansicht von Seite {{page}} + +# Find panel button title and messages +find_label=Suchen: +find_previous.title=Vorheriges Vorkommen des Suchbegriffs finden +find_previous_label=Zurück +find_next.title=Nächstes Vorkommen des Suchbegriffs finden +find_next_label=Weiter +find_highlight=Alle hervorheben +find_match_case_label=Groß-/Kleinschreibung beachten +find_reached_top=Anfang des Dokuments erreicht, fahre am Ende fort +find_reached_bottom=Ende des Dokuments erreicht, fahre am Anfang fort +find_not_found=Suchbegriff nicht gefunden + +# Error panel labels +error_more_info=Mehr Informationen +error_less_info=Weniger Informationen +error_close=Schließen +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js Version {{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Nachricht: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Aufrufliste: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Datei: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Zeile: {{line}} +rendering_error=Beim Darstellen der Seite trat ein Fehler auf. + +# Predefined zoom values +page_scale_width=Seitenbreite +page_scale_fit=Seitengröße +page_scale_auto=Automatischer Zoom +page_scale_actual=Originalgröße +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Fehler +loading_error=Beim Laden der PDF-Datei trat ein Fehler auf. +invalid_file_error=Ungültige oder beschädigte PDF-Datei +missing_file_error=Fehlende PDF-Datei +unexpected_response_error=Unerwartete Antwort des Servers + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anlage: {{type}}] +password_label=Geben Sie zum Öffnen der PDF-Datei deren Passwort ein. +password_invalid=Falsches Passwort. Bitte versuchen Sie es erneut. +password_ok=OK +password_cancel=Abbrechen + +printing_not_supported=Warnung: Die Drucken-Funktion wird durch diesen Browser nicht vollständig unterstützt. +printing_not_ready=Warnung: Die PDF-Datei ist nicht vollständig geladen, dies ist für das Drucken aber empfohlen. +web_fonts_disabled=Web-Schriftarten sind deaktiviert: Eingebettete PDF-Schriftarten konnten nicht geladen werden. +document_colors_not_allowed=PDF-Dokumenten ist es nicht erlaubt, ihre eigenen Farben zu verwenden: 'Seiten das Verwenden von eigenen Farben erlauben' ist im Browser deaktiviert. diff --git a/src/cps/static/locale/el/viewer.properties b/src/cps/static/locale/el/viewer.properties new file mode 100644 index 0000000..ffe464c --- /dev/null +++ b/src/cps/static/locale/el/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Προηγούμενη σελίδα +previous_label=Προηγούμενη +next.title=Επόμενη σελίδα +next_label=Επόμενη + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Σελίδα +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=από {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} από {{pagesCount}}) + +zoom_out.title=Σμίκρυνση +zoom_out_label=Σμίκρυνση +zoom_in.title=Μεγέθυνση +zoom_in_label=Μεγέθυνση +zoom.title=Ζουμ +presentation_mode.title=Εναλλαγή σε λειτουργία παρουσίασης +presentation_mode_label=Λειτουργία παρουσίασης +open_file.title=Άνοιγμα αρχείου +open_file_label=Άνοιγμα +print.title=Εκτύπωση +print_label=Εκτύπωση +download.title=Λήψη +download_label=Λήψη +bookmark.title=Τρέχουσα προβολή (αντιγραφή ή άνοιγμα σε νέο παράθυρο) +bookmark_label=Τρέχουσα προβολή + +# Secondary toolbar and context menu +tools.title=Εργαλεία +tools_label=Εργαλεία +first_page.title=Μετάβαση στην πρώτη σελίδα +first_page.label=Μετάβαση στην πρώτη σελίδα +first_page_label=Μετάβαση στην πρώτη σελίδα +last_page.title=Μετάβαση στη τελευταία σελίδα +last_page.label=Μετάβαση στη τελευταία σελίδα +last_page_label=Μετάβαση στη τελευταία σελίδα +page_rotate_cw.title=Δεξιόστροφη περιστροφή +page_rotate_cw.label=Δεξιόστροφη περιστροφή +page_rotate_cw_label=Δεξιόστροφη περιστροφή +page_rotate_ccw.title=Αριστερόστροφη περιστροφή +page_rotate_ccw.label=Αριστερόστροφη περιστροφή +page_rotate_ccw_label=Αριστερόστροφη περιστροφή + +hand_tool_enable.title=Ενεργοποίηση εργαλείου χεριού +hand_tool_enable_label=Ενεργοποίηση εργαλείου χεριού +hand_tool_disable.title=Απενεργοποίηση εργαλείου χεριού +hand_tool_disable_label=Απενεργοποίηση εργαλείου χεριού + +# Document properties dialog box +document_properties.title=Ιδιότητες εγγράφου… +document_properties_label=Ιδιότητες εγγράφου… +document_properties_file_name=Όνομα αρχείου: +document_properties_file_size=Μέγεθος αρχείου: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Τίτλος: +document_properties_author=Συγγραφέας: +document_properties_subject=Θέμα: +document_properties_keywords=Λέξεις κλειδιά: +document_properties_creation_date=Ημερομηνία δημιουργίας: +document_properties_modification_date=Ημερομηνία τροποποίησης: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Δημιουργός: +document_properties_producer=Παραγωγός PDF: +document_properties_version=Έκδοση PDF: +document_properties_page_count=Αριθμός σελίδων: +document_properties_close=Κλείσιμο + +print_progress_message=Προετοιμασία του εγγράφου για εκτύπωση… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Άκυρο + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Εναλλαγή προβολής πλευρικής στήλης +toggle_sidebar_label=Εναλλαγή προβολής πλευρικής στήλης +document_outline.title=Εμφάνιση διάρθρωσης εγγράφου (διπλό κλικ για ανάπτυξη/σύμπτυξη όλων των στοιχείων) +document_outline_label=Διάρθρωση εγγράφου +attachments.title=Προβολή συνημμένων +attachments_label=Συνημμένα +thumbs.title=Προβολή μικρογραφιών +thumbs_label=Μικρογραφίες +findbar.title=Εύρεση στο έγγραφο +findbar_label=Εύρεση + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Σελίδα {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Μικρογραφία της σελίδας {{page}} + +# Find panel button title and messages +find_label=Εύρεση: +find_previous.title=Εύρεση της προηγούμενης εμφάνισης της φράσης +find_previous_label=Προηγούμενο +find_next.title=Εύρεση της επόμενης εμφάνισης της φράσης +find_next_label=Επόμενο +find_highlight=Επισήμανση όλων +find_match_case_label=Ταίριασμα χαρακτήρα +find_reached_top=Έλευση στην αρχή του εγγράφου, συνέχεια από το τέλος +find_reached_bottom=Έλευση στο τέλος του εγγράφου, συνέχεια από την αρχή +find_not_found=Η φράση δεν βρέθηκε + +# Error panel labels +error_more_info=Περισσότερες πληροφορίες +error_less_info=Λιγότερες πληροφορίες +error_close=Κλείσιμο +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Μήνυμα: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Στοίβα: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Αρχείο: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Γραμμή: {{line}} +rendering_error=Προέκυψε σφάλμα κατά την ανάλυση της σελίδας. + +# Predefined zoom values +page_scale_width=Πλάτος σελίδας +page_scale_fit=Μέγεθος σελίδας +page_scale_auto=Αυτόματη μεγέθυνση +page_scale_actual=Πραγματικό μέγεθος +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Σφάλμα +loading_error=Προέκυψε ένα σφάλμα κατά τη φόρτωση του PDF. +invalid_file_error=Μη έγκυρο ή κατεστραμμένο αρχείο PDF. +missing_file_error=Λείπει αρχείο PDF. +unexpected_response_error=Μη αναμενόμενη απόκριση από το διακομιστή. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Σχόλιο] +password_label=Εισαγωγή κωδικού για το άνοιγμα του PDF αρχείου. +password_invalid=Μη έγκυρος κωδικός. Προσπαθείστε ξανά. +password_ok=ΟΚ +password_cancel=Ακύρωση + +printing_not_supported=Προειδοποίηση: Η εκτύπωση δεν υποστηρίζεται πλήρως από αυτόν τον περιηγητή. +printing_not_ready=Προειδοποίηση: Το PDF δεν φορτώθηκε πλήρως για εκτύπωση. +web_fonts_disabled=Οι γραμματοσειρές Web απενεργοποιημένες: αδυναμία χρήσης των ενσωματωμένων γραμματοσειρών PDF. +document_colors_not_allowed=Στα PDF έγγραφα δεν επιτρέπεται να χρησιμοποιούν τα δικά τους χρώματα: Το “Να επιτρέπεται στις σελίδες να επιλέγουν τα δικά τους χρώματα” είναι απενεργοποιημένο στον περιηγητή. diff --git a/src/cps/static/locale/en-GB/viewer.properties b/src/cps/static/locale/en-GB/viewer.properties new file mode 100644 index 0000000..c6fee1f --- /dev/null +++ b/src/cps/static/locale/en-GB/viewer.properties @@ -0,0 +1,174 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Previous Page +previous_label=Previous +next.title=Next Page +next_label=Next + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Zoom Out +zoom_out_label=Zoom Out +zoom_in.title=Zoom In +zoom_in_label=Zoom In +zoom.title=Zoom +presentation_mode.title=Switch to Presentation Mode +presentation_mode_label=Presentation Mode +open_file.title=Open File +open_file_label=Open +print.title=Print +print_label=Print +download.title=Download +download_label=Download +bookmark.title=Current view (copy or open in new window) +bookmark_label=Current View + +# Secondary toolbar and context menu +tools.title=Tools +tools_label=Tools +first_page.title=Go to First Page +first_page.label=Go to First Page +first_page_label=Go to First Page +last_page.title=Go to Last Page +last_page.label=Go to Last Page +last_page_label=Go to Last Page +page_rotate_cw.title=Rotate Clockwise +page_rotate_cw.label=Rotate Clockwise +page_rotate_cw_label=Rotate Clockwise +page_rotate_ccw.title=Rotate Anti-Clockwise +page_rotate_ccw.label=Rotate Anti-Clockwise +page_rotate_ccw_label=Rotate Anti-Clockwise + +hand_tool_enable.title=Enable hand tool +hand_tool_enable_label=Enable hand tool +hand_tool_disable.title=Disable hand tool +hand_tool_disable_label=Disable hand tool + +# Document properties dialog box +document_properties.title=Document Properties… +document_properties_label=Document Properties… +document_properties_file_name=File name: +document_properties_file_size=File size: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Title: +document_properties_author=Author: +document_properties_subject=Subject: +document_properties_keywords=Keywords: +document_properties_creation_date=Creation Date: +document_properties_modification_date=Modification Date: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creator: +document_properties_producer=PDF Producer: +document_properties_version=PDF Version: +document_properties_page_count=Page Count: +document_properties_close=Close + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toggle Sidebar +toggle_sidebar_label=Toggle Sidebar +attachments.title=Show Attachments +attachments_label=Attachments +thumbs.title=Show Thumbnails +thumbs_label=Thumbnails +findbar.title=Find in Document +findbar_label=Find + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Page {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Thumbnail of Page {{page}} + +# Find panel button title and messages +find_label=Find: +find_previous.title=Find the previous occurrence of the phrase +find_previous_label=Previous +find_next.title=Find the next occurrence of the phrase +find_next_label=Next +find_highlight=Highlight all +find_match_case_label=Match case +find_reached_top=Reached top of document, continued from bottom +find_reached_bottom=Reached end of document, continued from top +find_not_found=Phrase not found + +# Error panel labels +error_more_info=More Information +error_less_info=Less Information +error_close=Close +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Message: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Line: {{line}} +rendering_error=An error occurred while rendering the page. + +# Predefined zoom values +page_scale_width=Page Width +page_scale_fit=Page Fit +page_scale_auto=Automatic Zoom +page_scale_actual=Actual Size +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Error +loading_error=An error occurred while loading the PDF. +invalid_file_error=Invalid or corrupted PDF file. +missing_file_error=Missing PDF file. +unexpected_response_error=Unexpected server response. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Enter the password to open this PDF file. +password_invalid=Invalid password. Please try again. +password_ok=OK +password_cancel=Cancel + +printing_not_supported=Warning: Printing is not fully supported by this browser. +printing_not_ready=Warning: The PDF is not fully loaded for printing. +web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. +document_colors_not_allowed=PDF documents are not allowed to use their own colours: 'Allow pages to choose their own colours' is deactivated in the browser. diff --git a/src/cps/static/locale/en-US/viewer.properties b/src/cps/static/locale/en-US/viewer.properties new file mode 100644 index 0000000..43ce1f3 --- /dev/null +++ b/src/cps/static/locale/en-US/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Previous Page +previous_label=Previous +next.title=Next Page +next_label=Next + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Page +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=of {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} of {{pagesCount}}) + +zoom_out.title=Zoom Out +zoom_out_label=Zoom Out +zoom_in.title=Zoom In +zoom_in_label=Zoom In +zoom.title=Zoom +presentation_mode.title=Switch to Presentation Mode +presentation_mode_label=Presentation Mode +open_file.title=Open File +open_file_label=Open +print.title=Print +print_label=Print +download.title=Download +download_label=Download +bookmark.title=Current view (copy or open in new window) +bookmark_label=Current View + +# Secondary toolbar and context menu +tools.title=Tools +tools_label=Tools +first_page.title=Go to First Page +first_page.label=Go to First Page +first_page_label=Go to First Page +last_page.title=Go to Last Page +last_page.label=Go to Last Page +last_page_label=Go to Last Page +page_rotate_cw.title=Rotate Clockwise +page_rotate_cw.label=Rotate Clockwise +page_rotate_cw_label=Rotate Clockwise +page_rotate_ccw.title=Rotate Counterclockwise +page_rotate_ccw.label=Rotate Counterclockwise +page_rotate_ccw_label=Rotate Counterclockwise + +hand_tool_enable.title=Enable hand tool +hand_tool_enable_label=Enable hand tool +hand_tool_disable.title=Disable hand tool +hand_tool_disable_label=Disable hand tool + +# Document properties dialog box +document_properties.title=Document Properties… +document_properties_label=Document Properties… +document_properties_file_name=File name: +document_properties_file_size=File size: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Title: +document_properties_author=Author: +document_properties_subject=Subject: +document_properties_keywords=Keywords: +document_properties_creation_date=Creation Date: +document_properties_modification_date=Modification Date: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creator: +document_properties_producer=PDF Producer: +document_properties_version=PDF Version: +document_properties_page_count=Page Count: +document_properties_close=Close + +print_progress_message=Preparing document for printing… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancel + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toggle Sidebar +toggle_sidebar_label=Toggle Sidebar +document_outline.title=Show Document Outline (double-click to expand/collapse all items) +document_outline_label=Document Outline +attachments.title=Show Attachments +attachments_label=Attachments +thumbs.title=Show Thumbnails +thumbs_label=Thumbnails +findbar.title=Find in Document +findbar_label=Find + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Page {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Thumbnail of Page {{page}} + +# Find panel button title and messages +find_label=Find: +find_previous.title=Find the previous occurrence of the phrase +find_previous_label=Previous +find_next.title=Find the next occurrence of the phrase +find_next_label=Next +find_highlight=Highlight all +find_match_case_label=Match case +find_reached_top=Reached top of document, continued from bottom +find_reached_bottom=Reached end of document, continued from top +find_not_found=Phrase not found + +# Error panel labels +error_more_info=More Information +error_less_info=Less Information +error_close=Close +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Message: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Line: {{line}} +rendering_error=An error occurred while rendering the page. + +# Predefined zoom values +page_scale_width=Page Width +page_scale_fit=Page Fit +page_scale_auto=Automatic Zoom +page_scale_actual=Actual Size +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Error +loading_error=An error occurred while loading the PDF. +invalid_file_error=Invalid or corrupted PDF file. +missing_file_error=Missing PDF file. +unexpected_response_error=Unexpected server response. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Enter the password to open this PDF file. +password_invalid=Invalid password. Please try again. +password_ok=OK +password_cancel=Cancel + +printing_not_supported=Warning: Printing is not fully supported by this browser. +printing_not_ready=Warning: The PDF is not fully loaded for printing. +web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. +document_colors_not_allowed=PDF documents are not allowed to use their own colors: “Allow pages to choose their own colors” is deactivated in the browser. diff --git a/src/cps/static/locale/en-ZA/viewer.properties b/src/cps/static/locale/en-ZA/viewer.properties new file mode 100644 index 0000000..7139148 --- /dev/null +++ b/src/cps/static/locale/en-ZA/viewer.properties @@ -0,0 +1,174 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Previous Page +previous_label=Previous +next.title=Next Page +next_label=Next + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Zoom Out +zoom_out_label=Zoom Out +zoom_in.title=Zoom In +zoom_in_label=Zoom In +zoom.title=Zoom +presentation_mode.title=Switch to Presentation Mode +presentation_mode_label=Presentation Mode +open_file.title=Open File +open_file_label=Open +print.title=Print +print_label=Print +download.title=Download +download_label=Download +bookmark.title=Current view (copy or open in new window) +bookmark_label=Current View + +# Secondary toolbar and context menu +tools.title=Tools +tools_label=Tools +first_page.title=Go to First Page +first_page.label=Go to First Page +first_page_label=Go to First Page +last_page.title=Go to Last Page +last_page.label=Go to Last Page +last_page_label=Go to Last Page +page_rotate_cw.title=Rotate Clockwise +page_rotate_cw.label=Rotate Clockwise +page_rotate_cw_label=Rotate Clockwise +page_rotate_ccw.title=Rotate Counterclockwise +page_rotate_ccw.label=Rotate Counterclockwise +page_rotate_ccw_label=Rotate Counterclockwise + +hand_tool_enable.title=Enable hand tool +hand_tool_enable_label=Enable hand tool +hand_tool_disable.title=Disable hand tool +hand_tool_disable_label=Disable hand tool + +# Document properties dialog box +document_properties.title=Document Properties… +document_properties_label=Document Properties… +document_properties_file_name=File name: +document_properties_file_size=File size: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Title: +document_properties_author=Author: +document_properties_subject=Subject: +document_properties_keywords=Keywords: +document_properties_creation_date=Creation Date: +document_properties_modification_date=Modification Date: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creator: +document_properties_producer=PDF Producer: +document_properties_version=PDF Version: +document_properties_page_count=Page Count: +document_properties_close=Close + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toggle Sidebar +toggle_sidebar_label=Toggle Sidebar +document_outline_label=Document Outline +attachments.title=Show Attachments +attachments_label=Attachments +thumbs.title=Show Thumbnails +thumbs_label=Thumbnails +findbar.title=Find in Document +findbar_label=Find + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Page {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Thumbnail of Page {{page}} + +# Find panel button title and messages +find_label=Find: +find_previous.title=Find the previous occurrence of the phrase +find_previous_label=Previous +find_next.title=Find the next occurrence of the phrase +find_next_label=Next +find_highlight=Highlight all +find_match_case_label=Match case +find_reached_top=Reached top of document, continued from bottom +find_reached_bottom=Reached end of document, continued from top +find_not_found=Phrase not found + +# Error panel labels +error_more_info=More Information +error_less_info=Less Information +error_close=Close +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Message: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Line: {{line}} +rendering_error=An error occurred while rendering the page. + +# Predefined zoom values +page_scale_width=Page Width +page_scale_fit=Page Fit +page_scale_auto=Automatic Zoom +page_scale_actual=Actual Size +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Error +loading_error=An error occurred while loading the PDF. +invalid_file_error=Invalid or corrupted PDF file. +missing_file_error=Missing PDF file. +unexpected_response_error=Unexpected server response. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Enter the password to open this PDF file. +password_invalid=Invalid password. Please try again. +password_ok=OK + +printing_not_supported=Warning: Printing is not fully supported by this browser. +printing_not_ready=Warning: The PDF is not fully loaded for printing. +web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. +document_colors_not_allowed=PDF documents are not allowed to use their own colours: “Allow pages to choose their own colours” is deactivated in the browser. diff --git a/src/cps/static/locale/eo/viewer.properties b/src/cps/static/locale/eo/viewer.properties new file mode 100644 index 0000000..8ebe179 --- /dev/null +++ b/src/cps/static/locale/eo/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Antaŭa paĝo +previous_label=Malantaŭen +next.title=Venonta paĝo +next_label=Antaŭen + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Paĝo +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=el {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} el {{pagesCount}}) + +zoom_out.title=Malpligrandigi +zoom_out_label=Malpligrandigi +zoom_in.title=Pligrandigi +zoom_in_label=Pligrandigi +zoom.title=Pligrandigilo +presentation_mode.title=Iri al prezenta reĝimo +presentation_mode_label=Prezenta reĝimo +open_file.title=Malfermi dosieron +open_file_label=Malfermi +print.title=Presi +print_label=Presi +download.title=Elŝuti +download_label=Elŝuti +bookmark.title=Nuna vido (kopii aŭ malfermi en nova fenestro) +bookmark_label=Nuna vido + +# Secondary toolbar and context menu +tools.title=Iloj +tools_label=Iloj +first_page.title=Iri al la unua paĝo +first_page.label=Iri al la unua paĝo +first_page_label=Iri al la unua paĝo +last_page.title=Iri al la lasta paĝo +last_page.label=Iri al la lasta paĝo +last_page_label=Iri al la lasta paĝo +page_rotate_cw.title=Rotaciigi dekstrume +page_rotate_cw.label=Rotaciigi dekstrume +page_rotate_cw_label=Rotaciigi dekstrume +page_rotate_ccw.title=Rotaciigi maldekstrume +page_rotate_ccw.label=Rotaciigi maldekstrume +page_rotate_ccw_label=Rotaciigi maldekstrume + +hand_tool_enable.title=Aktivigi manan ilon +hand_tool_enable_label=Aktivigi manan ilon +hand_tool_disable.title=Malaktivigi manan ilon +hand_tool_disable_label=Malaktivigi manan ilon + +# Document properties dialog box +document_properties.title=Atributoj de dokumento… +document_properties_label=Atributoj de dokumento… +document_properties_file_name=Nomo de dosiero: +document_properties_file_size=Grado de dosiero: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KO ({{size_b}} oktetoj) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MO ({{size_b}} oktetoj) +document_properties_title=Titolo: +document_properties_author=Aŭtoro: +document_properties_subject=Temo: +document_properties_keywords=Ŝlosilvorto: +document_properties_creation_date=Dato de kreado: +document_properties_modification_date=Dato de modifo: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Kreinto: +document_properties_producer=Produktinto de PDF: +document_properties_version=Versio de PDF: +document_properties_page_count=Nombro de paĝoj: +document_properties_close=Fermi + +print_progress_message=Preparo de dokumento por presi ĝin … +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Nuligi + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Montri/kaŝi flankan strion +toggle_sidebar_label=Montri/kaŝi flankan strion +document_outline.title=Montri la konturon de dokumento (alklaku duoble por faldi/malfaldi ĉiujn elementojn) +document_outline_label=Konturo de dokumento +attachments.title=Montri kunsendaĵojn +attachments_label=Kunsendaĵojn +thumbs.title=Montri miniaturojn +thumbs_label=Miniaturoj +findbar.title=Serĉi en dokumento +findbar_label=Serĉi + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Paĝo {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniaturo de paĝo {{page}} + +# Find panel button title and messages +find_label=Serĉi: +find_previous.title=Serĉi la antaŭan aperon de la frazo +find_previous_label=Malantaŭen +find_next.title=Serĉi la venontan aperon de la frazo +find_next_label=Antaŭen +find_highlight=Elstarigi ĉiujn +find_match_case_label=Distingi inter majuskloj kaj minuskloj +find_reached_top=Komenco de la dokumento atingita, daŭrigado ekde la fino +find_reached_bottom=Fino de la dokumento atingita, daŭrigado ekde la komenco +find_not_found=Frazo ne trovita + +# Error panel labels +error_more_info=Pli da informo +error_less_info=Mapli da informo +error_close=Fermi +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mesaĝo: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stako: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Dosiero: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linio: {{line}} +rendering_error=Okazis eraro dum la montrado de la paĝo. + +# Predefined zoom values +page_scale_width=Larĝo de paĝo +page_scale_fit=Adapti paĝon +page_scale_auto=Aŭtomata skalo +page_scale_actual=Reala gandeco +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Eraro +loading_error=Okazis eraro dum la ŝargado de la PDF dosiero. +invalid_file_error=Nevalida aŭ difektita PDF dosiero. +missing_file_error=Mankas dosiero PDF. +unexpected_response_error=Neatendita respondo de servilo. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Prinoto: {{type}}] +password_label=Tajpu pasvorton por malfermi tiun ĉi dosieron PDF. +password_invalid=Nevalida pasvorto. Bonvolu provi denove. +password_ok=Akcepti +password_cancel=Nuligi + +printing_not_supported=Averto: tiu ĉi retumilo ne plene subtenas presadon. +printing_not_ready=Averto: La PDF dosiero ne estas plene ŝargita por presado. +web_fonts_disabled=Neaktivaj teksaĵaj tiparoj: ne elbas uzi enmetitajn tiparojn de PDF. +document_colors_not_allowed=PDF dokumentoj ne rajtas uzi siajn proprajn kolorojn: 'Permesi al paĝoj uzi siajn proprajn kolorojn' ne estas aktiva en la retumilo. diff --git a/src/cps/static/locale/es-AR/viewer.properties b/src/cps/static/locale/es-AR/viewer.properties new file mode 100644 index 0000000..f2e2a3c --- /dev/null +++ b/src/cps/static/locale/es-AR/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Página anterior +previous_label=Anterior +next.title=Página siguiente +next_label=Siguiente + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Página +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=( {{pageNumber}} de {{pagesCount}} ) + +zoom_out.title=Alejar +zoom_out_label=Alejar +zoom_in.title=Acercar +zoom_in_label=Acercar +zoom.title=Zoom +presentation_mode.title=Cambiar a modo presentación +presentation_mode_label=Modo presentación +open_file.title=Abrir archivo +open_file_label=Abrir +print.title=Imprimir +print_label=Imprimir +download.title=Descargar +download_label=Descargar +bookmark.title=Vista actual (copiar o abrir en nueva ventana) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Herramientas +tools_label=Herramientas +first_page.title=Ir a primera página +first_page.label=Ir a primera página +first_page_label=Ir a primera página +last_page.title=Ir a última página +last_page.label=Ir a última página +last_page_label=Ir a última página +page_rotate_cw.title=Rotar horario +page_rotate_cw.label=Rotar horario +page_rotate_cw_label=Rotar horario +page_rotate_ccw.title=Rotar antihorario +page_rotate_ccw.label=Rotar antihorario +page_rotate_ccw_label=Rotar antihorario + +hand_tool_enable.title=Habilitar herramienta mano +hand_tool_enable_label=Habilitar herramienta mano +hand_tool_disable.title=Deshabilitar herramienta mano +hand_tool_disable_label=Deshabilitar herramienta mano + +# Document properties dialog box +document_properties.title=Propiedades del documento… +document_properties_label=Propiedades del documento… +document_properties_file_name=Nombre de archivo: +document_properties_file_size=Tamaño de archovo: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Título: +document_properties_author=Autor: +document_properties_subject=Asunto: +document_properties_keywords=Palabras clave: +document_properties_creation_date=Fecha de creación: +document_properties_modification_date=Fecha de modificación: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creador: +document_properties_producer=PDF Productor: +document_properties_version=Versión de PDF: +document_properties_page_count=Cantidad de páginas: +document_properties_close=Cerrar + +print_progress_message=Preparando documento para imprimir… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Alternar barra lateral +toggle_sidebar_label=Alternar barra lateral +document_outline.title=Mostrar esquema del documento (doble clic para expandir/colapsar todos los ítems) +document_outline_label=Esquema del documento +attachments.title=Mostrar adjuntos +attachments_label=Adjuntos +thumbs.title=Mostrar miniaturas +thumbs_label=Miniaturas +findbar.title=Buscar en documento +findbar_label=Buscar + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Página {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura de página {{page}} + +# Find panel button title and messages +find_label=Buscar: +find_previous.title=Buscar la aparición anterior de la frase +find_previous_label=Anterior +find_next.title=Buscar la siguiente aparición de la frase +find_next_label=Siguiente +find_highlight=Resaltar todo +find_match_case_label=Coincidir mayúsculas +find_reached_top=Inicio de documento alcanzado, continuando desde abajo +find_reached_bottom=Fin de documento alcanzando, continuando desde arriba +find_not_found=Frase no encontrada + +# Error panel labels +error_more_info=Más información +error_less_info=Menos información +error_close=Cerrar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensaje: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Archivo: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Línea: {{line}} +rendering_error=Ocurrió un error al dibujar la página. + +# Predefined zoom values +page_scale_width=Ancho de página +page_scale_fit=Ajustar página +page_scale_auto=Zoom automático +page_scale_actual=Tamaño real +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Error +loading_error=Ocurrió un error al cargar el PDF. +invalid_file_error=Archivo PDF no válido o cocrrupto. +missing_file_error=Archivo PDF faltante. +unexpected_response_error=Respuesta del servidor inesperada. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Anotación] +password_label=Ingrese la contraseña para abrir este archivo PDF +password_invalid=Contraseña inválida. Intente nuevamente. +password_ok=Aceptar +password_cancel=Cancelar + +printing_not_supported=Advertencia: La impresión no está totalmente soportada por este navegador. +printing_not_ready=Advertencia: El PDF no está completamente cargado para impresión. +web_fonts_disabled=Tipografía web deshabilitada: no se pueden usar tipos incrustados en PDF. +document_colors_not_allowed=Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador. diff --git a/src/cps/static/locale/es-CL/viewer.properties b/src/cps/static/locale/es-CL/viewer.properties new file mode 100644 index 0000000..ddfbe90 --- /dev/null +++ b/src/cps/static/locale/es-CL/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Página anterior +previous_label=Anterior +next.title=Página siguiente +next_label=Siguiente + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Página +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Alejar +zoom_out_label=Alejar +zoom_in.title=Acercar +zoom_in_label=Acercar +zoom.title=Ampliación +presentation_mode.title=Cambiar al modo de presentación +presentation_mode_label=Modo de presentación +open_file.title=Abrir archivo +open_file_label=Abrir +print.title=Imprimir +print_label=Imprimir +download.title=Descargar +download_label=Descargar +bookmark.title=Vista actual (copiar o abrir en nueva ventana) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Herramientas +tools_label=Herramientas +first_page.title=Ir a la primera página +first_page.label=Ir a la primera página +first_page_label=Ir a la primera página +last_page.title=Ir a la última página +last_page.label=Ir a la última página +last_page_label=Ir a la última página +page_rotate_cw.title=Girar a la derecha +page_rotate_cw.label=Girar a la derecha +page_rotate_cw_label=Girar a la derecha +page_rotate_ccw.title=Girar a la izquierda +page_rotate_ccw.label=Girar a la izquierda +page_rotate_ccw_label=Girar a la izquierda + +hand_tool_enable.title=Activar herramienta de mano +hand_tool_enable_label=Activar herramienta de mano +hand_tool_disable.title=Desactivar herramienta de mano +hand_tool_disable_label=Desactivar herramienta de mano + +# Document properties dialog box +document_properties.title=Propiedades del documento… +document_properties_label=Propiedades del documento… +document_properties_file_name=Nombre de archivo: +document_properties_file_size=Tamaño del archivo: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Título: +document_properties_author=Autor: +document_properties_subject=Asunto: +document_properties_keywords=Palabras clave: +document_properties_creation_date=Fecha de creación: +document_properties_modification_date=Fecha de modificación: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creador: +document_properties_producer=Productor del PDF: +document_properties_version=Versión de PDF: +document_properties_page_count=Cantidad de páginas: +document_properties_close=Cerrar + +print_progress_message=Preparando documento para impresión… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Barra lateral +toggle_sidebar_label=Mostrar u ocultar la barra lateral +document_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos) +document_outline_label=Esquema del documento +attachments.title=Mostrar adjuntos +attachments_label=Adjuntos +thumbs.title=Mostrar miniaturas +thumbs_label=Miniaturas +findbar.title=Buscar en el documento +findbar_label=Buscar + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Página {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura de la página {{page}} + +# Find panel button title and messages +find_label=Buscar: +find_previous.title=Buscar la aparición anterior de la frase +find_previous_label=Previo +find_next.title=Buscar la siguiente aparición de la frase +find_next_label=Siguiente +find_highlight=Destacar todos +find_match_case_label=Coincidir mayús./minús. +find_reached_top=Se alcanzó el inicio del documento, continuando desde el final +find_reached_bottom=Se alcanzó el final del documento, continuando desde el inicio +find_not_found=Frase no encontrada + +# Error panel labels +error_more_info=Más información +error_less_info=Menos información +error_close=Cerrar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (compilación: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensaje: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Archivo: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Línea: {{line}} +rendering_error=Ha ocurrido un error al renderizar la página. + +# Predefined zoom values +page_scale_width=Ancho de página +page_scale_fit=Ajuste de página +page_scale_auto=Aumento automático +page_scale_actual=Tamaño actual +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Error +loading_error=Ha ocurrido un error al cargar el PDF. +invalid_file_error=Archivo PDF inválido o corrupto. +missing_file_error=Falta el archivo PDF. +unexpected_response_error=Respuesta del servidor inesperada. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Anotación] +password_label=Ingrese la contraseña para abrir este archivo PDF. +password_invalid=Contraseña inválida. Por favor, vuelve a intentarlo. +password_ok=Aceptar +password_cancel=Cancelar + +printing_not_supported=Advertencia: Imprimir no está soportado completamente por este navegador. +printing_not_ready=Advertencia: El PDF no está completamente cargado para ser impreso. +web_fonts_disabled=Las tipografías web están desactivadas: imposible usar las fuentes PDF embebidas. +document_colors_not_allowed=Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador. diff --git a/src/cps/static/locale/es-ES/viewer.properties b/src/cps/static/locale/es-ES/viewer.properties new file mode 100644 index 0000000..edbd31c --- /dev/null +++ b/src/cps/static/locale/es-ES/viewer.properties @@ -0,0 +1,115 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +previous.title = Página anterior +previous_label = Anterior +next.title = Página siguiente +next_label = Siguiente +page.title = Página +of_pages = de {{pagesCount}} +page_of_pages = ({{pageNumber}} de {{pagesCount}}) +zoom_out.title = Reducir +zoom_out_label = Reducir +zoom_in.title = Aumentar +zoom_in_label = Aumentar +zoom.title = Tamaño +presentation_mode.title = Cambiar al modo presentación +presentation_mode_label = Modo presentación +open_file.title = Abrir archivo +open_file_label = Abrir +print.title = Imprimir +print_label = Imprimir +download.title = Descargar +download_label = Descargar +bookmark.title = Vista actual (copiar o abrir en una nueva ventana) +bookmark_label = Vista actual +tools.title = Herramientas +tools_label = Herramientas +first_page.title = Ir a la primera página +first_page.label = Ir a la primera página +first_page_label = Ir a la primera página +last_page.title = Ir a la última página +last_page.label = Ir a la última página +last_page_label = Ir a la última página +page_rotate_cw.title = Rotar en sentido horario +page_rotate_cw.label = Rotar en sentido horario +page_rotate_cw_label = Rotar en sentido horario +page_rotate_ccw.title = Rotar en sentido antihorario +page_rotate_ccw.label = Rotar en sentido antihorario +page_rotate_ccw_label = Rotar en sentido antihorario +hand_tool_enable.title = Activar herramienta mano +hand_tool_enable_label = Activar herramienta mano +hand_tool_disable.title = Desactivar herramienta mano +hand_tool_disable_label = Desactivar herramienta mano +document_properties.title = Propiedades del documento… +document_properties_label = Propiedades del documento… +document_properties_file_name = Nombre de archivo: +document_properties_file_size = Tamaño de archivo: +document_properties_kb = {{size_kb}} KB ({{size_b}} bytes) +document_properties_mb = {{size_mb}} MB ({{size_b}} bytes) +document_properties_title = Título: +document_properties_author = Autor: +document_properties_subject = Asunto: +document_properties_keywords = Palabras clave: +document_properties_creation_date = Fecha de creación: +document_properties_modification_date = Fecha de modificación: +document_properties_date_string = {{date}}, {{time}} +document_properties_creator = Creador: +document_properties_producer = Productor PDF: +document_properties_version = Versión PDF: +document_properties_page_count = Número de páginas: +document_properties_close = Cerrar +print_progress_message = Preparando documento para impresión… +print_progress_percent = {{progress}}% +print_progress_close = Cancelar +toggle_sidebar.title = Cambiar barra lateral +toggle_sidebar_label = Cambiar barra lateral +document_outline.title = Mostrar resumen del documento (doble clic para expandir/contraer todos los elementos) +document_outline_label = Resumen de documento +attachments.title = Mostrar adjuntos +attachments_label = Adjuntos +thumbs.title = Mostrar miniaturas +thumbs_label = Miniaturas +findbar.title = Buscar en el documento +findbar_label = Buscar +thumb_page_title = Página {{page}} +thumb_page_canvas = Miniatura de la página {{page}} +find_label = Buscar: +find_previous.title = Encontrar la anterior aparición de la frase +find_previous_label = Anterior +find_next.title = Encontrar la siguiente aparición de esta frase +find_next_label = Siguiente +find_highlight = Resaltar todos +find_match_case_label = Coincidencia de mayús./minús. +find_reached_top = Se alcanzó el inicio del documento, se continúa desde el final +find_reached_bottom = Se alcanzó el final del documento, se continúa desde el inicio +find_not_found = Frase no encontrada +error_more_info = Más información +error_less_info = Menos información +error_close = Cerrar +error_version_info = PDF.js v{{version}} (build: {{build}}) +error_message = Mensaje: {{message}} +error_stack = Pila: {{stack}} +error_file = Archivo: {{file}} +error_line = Línea: {{line}} +rendering_error = Ocurrió un error al renderizar la página. +page_scale_width = Anchura de la página +page_scale_fit = Ajuste de la página +page_scale_auto = Tamaño automático +page_scale_actual = Tamaño real +page_scale_percent = {{scale}}% +loading_error_indicator = Error +loading_error = Ocurrió un error al cargar el PDF. +invalid_file_error = Fichero PDF no válido o corrupto. +missing_file_error = No hay fichero PDF. +unexpected_response_error = Respuesta inesperada del servidor. +text_annotation_type.alt = [Anotación {{type}}] +password_label = Introduzca la contraseña para abrir este archivo PDF. +password_invalid = Contraseña no válida. Vuelva a intentarlo. +password_ok = Aceptar +password_cancel = Cancelar +printing_not_supported = Advertencia: Imprimir no está totalmente soportado por este navegador. +printing_not_ready = Advertencia: Este PDF no se ha cargado completamente para poder imprimirse. +web_fonts_disabled = Las tipografías web están desactivadas: es imposible usar las tipografías PDF embebidas. +document_colors_not_allowed = Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las páginas elegir sus propios colores' está desactivado en el navegador. diff --git a/src/cps/static/locale/es-MX/viewer.properties b/src/cps/static/locale/es-MX/viewer.properties new file mode 100644 index 0000000..483b9a7 --- /dev/null +++ b/src/cps/static/locale/es-MX/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Página anterior +previous_label=Anterior +next.title=Página siguiente +next_label=Siguiente + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Página +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Reducir +zoom_out_label=Reducir +zoom_in.title=Aumentar +zoom_in_label=Aumentar +zoom.title=Zoom +presentation_mode.title=Cambiar al modo presentación +presentation_mode_label=Modo presentación +open_file.title=Abrir archivo +open_file_label=Abrir +print.title=Imprimir +print_label=Imprimir +download.title=Descargar +download_label=Descargar +bookmark.title=Vista actual (copiar o abrir en una nueva ventana) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Herramientas +tools_label=Herramientas +first_page.title=Ir a la primera página +first_page.label=Ir a la primera página +first_page_label=Ir a la primera página +last_page.title=Ir a la última página +last_page.label=Ir a la última página +last_page_label=Ir a la última página +page_rotate_cw.title=Girar a la derecha +page_rotate_cw.label=Girar a la derecha +page_rotate_cw_label=Girar a la derecha +page_rotate_ccw.title=Girar a la izquierda +page_rotate_ccw.label=Girar a la izquierda +page_rotate_ccw_label=Girar a la izquierda + +hand_tool_enable.title=Activar herramienta mano +hand_tool_enable_label=Activar herramienta mano +hand_tool_disable.title=Desactivar herramienta mano +hand_tool_disable_label=Desactivar herramienta mano + +# Document properties dialog box +document_properties.title=Propiedades del documento… +document_properties_label=Propiedades del documento… +document_properties_file_name=Nombre del archivo: +document_properties_file_size=Tamaño del archivo: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Título: +document_properties_author=Autor: +document_properties_subject=Asunto: +document_properties_keywords=Palabras claves: +document_properties_creation_date=Fecha de creación: +document_properties_modification_date=Fecha de modificación: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creador: +document_properties_producer=Productor PDF: +document_properties_version=Versión PDF: +document_properties_page_count=Número de páginas: +document_properties_close=Cerrar + +print_progress_message=Preparando documento para impresión… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Cambiar barra lateral +toggle_sidebar_label=Cambiar barra lateral +document_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos) +document_outline_label=Esquema del documento +attachments.title=Mostrar adjuntos +attachments_label=Adjuntos +thumbs.title=Mostrar miniaturas +thumbs_label=Miniaturas +findbar.title=Buscar en el documento +findbar_label=Buscar + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Página {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura de la página {{page}} + +# Find panel button title and messages +find_label=Encontrar: +find_previous.title=Ir a la anterior frase encontrada +find_previous_label=Anterior +find_next.title=Ir a la siguiente frase encontrada +find_next_label=Siguiente +find_highlight=Resaltar todo +find_match_case_label=Coincidir con mayúsculas y minúsculas +find_reached_top=Se alcanzó el inicio del documento, se buscará al final +find_reached_bottom=Se alcanzó el final del documento, se buscará al inicio +find_not_found=No se encontró la frase + +# Error panel labels +error_more_info=Más información +error_less_info=Menos información +error_close=Cerrar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensaje: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Archivo: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Línea: {{line}} +rendering_error=Un error ocurrió al renderizar la página. + +# Predefined zoom values +page_scale_width=Ancho de página +page_scale_fit=Ajustar página +page_scale_auto=Zoom automático +page_scale_actual=Tamaño real +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Error +loading_error=Un error ocurrió al cargar el PDF. +invalid_file_error=Archivo PDF invalido o dañado. +missing_file_error=Archivo PDF no encontrado. +unexpected_response_error=Respuesta inesperada del servidor. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} anotación] +password_label=Ingresa la contraseña para abrir este archivo PDF. +password_invalid=Contraseña inválida. Por favor intenta de nuevo. +password_ok=Aceptar +password_cancel=Cancelar + +printing_not_supported=Advertencia: La impresión no esta completamente soportada por este navegador. +printing_not_ready=Advertencia: El PDF no cargo completamente para impresión. +web_fonts_disabled=Las fuentes web están desactivadas: es imposible usar las fuentes PDF embebidas. +document_colors_not_allowed=Los documentos PDF no tienen permiso de usar sus propios colores: 'Permitir que las páginas elijan sus propios colores' esta desactivada en el navegador. diff --git a/src/cps/static/locale/et/viewer.properties b/src/cps/static/locale/et/viewer.properties new file mode 100644 index 0000000..1b52857 --- /dev/null +++ b/src/cps/static/locale/et/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Eelmine lehekülg +previous_label=Eelmine +next.title=Järgmine lehekülg +next_label=Järgmine + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Leht +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}}/{{pagesCount}}) + +zoom_out.title=Vähenda +zoom_out_label=Vähenda +zoom_in.title=Suurenda +zoom_in_label=Suurenda +zoom.title=Suurendamine +presentation_mode.title=Lülitu esitlusrežiimi +presentation_mode_label=Esitlusrežiim +open_file.title=Ava fail +open_file_label=Ava +print.title=Prindi +print_label=Prindi +download.title=Laadi alla +download_label=Laadi alla +bookmark.title=Praegune vaade (kopeeri või ava uues aknas) +bookmark_label=Praegune vaade + +# Secondary toolbar and context menu +tools.title=Tööriistad +tools_label=Tööriistad +first_page.title=Mine esimesele leheküljele +first_page.label=Mine esimesele leheküljele +first_page_label=Mine esimesele leheküljele +last_page.title=Mine viimasele leheküljele +last_page.label=Mine viimasele leheküljele +last_page_label=Mine viimasele leheküljele +page_rotate_cw.title=Pööra päripäeva +page_rotate_cw.label=Pööra päripäeva +page_rotate_cw_label=Pööra päripäeva +page_rotate_ccw.title=Pööra vastupäeva +page_rotate_ccw.label=Pööra vastupäeva +page_rotate_ccw_label=Pööra vastupäeva + +hand_tool_enable.title=Luba sirvimine +hand_tool_enable_label=Luba sirvimine +hand_tool_disable.title=Keela sirvimine +hand_tool_disable_label=Keela sirvimine + +# Document properties dialog box +document_properties.title=Dokumendi omadused… +document_properties_label=Dokumendi omadused… +document_properties_file_name=Faili nimi: +document_properties_file_size=Faili suurus: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KiB ({{size_b}} baiti) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MiB ({{size_b}} baiti) +document_properties_title=Pealkiri: +document_properties_author=Autor: +document_properties_subject=Teema: +document_properties_keywords=Märksõnad: +document_properties_creation_date=Loodud: +document_properties_modification_date=Muudetud: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}} {{time}} +document_properties_creator=Looja: +document_properties_producer=Generaator: +document_properties_version=Generaatori versioon: +document_properties_page_count=Lehekülgi: +document_properties_close=Sulge + +print_progress_message=Dokumendi ettevalmistamine printimiseks… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Loobu + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Näita külgriba +toggle_sidebar_label=Näita külgriba +document_outline.title=Näita sisukorda (kõigi punktide laiendamiseks/ahendamiseks topeltklõpsa) +document_outline_label=Näita sisukorda +attachments.title=Näita manuseid +attachments_label=Manused +thumbs.title=Näita pisipilte +thumbs_label=Pisipildid +findbar.title=Otsi dokumendist +findbar_label=Otsi + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}}. lehekülg +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}}. lehekülje pisipilt + +# Find panel button title and messages +find_label=Otsi: +find_previous.title=Otsi fraasi eelmine esinemiskoht +find_previous_label=Eelmine +find_next.title=Otsi fraasi järgmine esinemiskoht +find_next_label=Järgmine +find_highlight=Too kõik esile +find_match_case_label=Tõstutundlik +find_reached_top=Jõuti dokumendi algusesse, jätkati lõpust +find_reached_bottom=Jõuti dokumendi lõppu, jätkati algusest +find_not_found=Fraasi ei leitud + +# Error panel labels +error_more_info=Rohkem teavet +error_less_info=Vähem teavet +error_close=Sulge +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Teade: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fail: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rida: {{line}} +rendering_error=Lehe renderdamisel esines viga. + +# Predefined zoom values +page_scale_width=Mahuta laiusele +page_scale_fit=Mahuta leheküljele +page_scale_auto=Automaatne suurendamine +page_scale_actual=Tegelik suurus +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Viga +loading_error=PDFi laadimisel esines viga. +invalid_file_error=Vigane või rikutud PDF-fail. +missing_file_error=PDF-fail puudub. +unexpected_response_error=Ootamatu vastus serverilt. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=PDF-faili avamiseks sisesta parool. +password_invalid=Vigane parool. Palun proovi uuesti. +password_ok=Sobib +password_cancel=Loobu + +printing_not_supported=Hoiatus: printimine pole selle brauseri poolt täielikult toetatud. +printing_not_ready=Hoiatus: PDF pole printimiseks täielikult laaditud. +web_fonts_disabled=Veebifondid on keelatud: PDFiga kaasatud fonte pole võimalik kasutada. +document_colors_not_allowed=PDF-dokumentidel pole oma värvide kasutamine lubatud: “Veebilehtedel on lubatud kasutada oma värve” on brauseris deaktiveeritud. diff --git a/src/cps/static/locale/eu/viewer.properties b/src/cps/static/locale/eu/viewer.properties new file mode 100644 index 0000000..2054068 --- /dev/null +++ b/src/cps/static/locale/eu/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Aurreko orria +previous_label=Aurrekoa +next.title=Hurrengo orria +next_label=Hurrengoa + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Orria +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages={{pagesCount}})/({{pageNumber}} + +zoom_out.title=Urrundu zooma +zoom_out_label=Urrundu zooma +zoom_in.title=Gerturatu zooma +zoom_in_label=Gerturatu zooma +zoom.title=Zooma +presentation_mode.title=Aldatu aurkezpen modura +presentation_mode_label=Arkezpen modua +open_file.title=Ireki fitxategia +open_file_label=Ireki +print.title=Inprimatu +print_label=Inprimatu +download.title=Deskargatu +download_label=Deskargatu +bookmark.title=Uneko ikuspegia (kopiatu edo ireki leiho berrian) +bookmark_label=Uneko ikuspegia + +# Secondary toolbar and context menu +tools.title=Tresnak +tools_label=Tresnak +first_page.title=Joan lehen orrira +first_page.label=Joan lehen orrira +first_page_label=Joan lehen orrira +last_page.title=Joan azken orrira +last_page.label=Joan azken orrira +last_page_label=Joan azken orrira +page_rotate_cw.title=Biratu erlojuaren norantzan +page_rotate_cw.label=Biratu erlojuaren norantzan +page_rotate_cw_label=Biratu erlojuaren norantzan +page_rotate_ccw.title=Biratu erlojuaren aurkako norantzan +page_rotate_ccw.label=Biratu erlojuaren aurkako norantzan +page_rotate_ccw_label=Biratu erlojuaren aurkako norantzan + +hand_tool_enable.title=Gaitu eskuaren tresna +hand_tool_enable_label=Gaitu eskuaren tresna +hand_tool_disable.title=Desgaitu eskuaren tresna +hand_tool_disable_label=Desgaitu eskuaren tresna + +# Document properties dialog box +document_properties.title=Dokumentuaren propietateak… +document_properties_label=Dokumentuaren propietateak… +document_properties_file_name=Fitxategi-izena: +document_properties_file_size=Fitxategiaren tamaina: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} byte) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} byte) +document_properties_title=Izenburua: +document_properties_author=Egilea: +document_properties_subject=Gaia: +document_properties_keywords=Gako-hitzak: +document_properties_creation_date=Sortze-data: +document_properties_modification_date=Aldatze-data: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Sortzailea: +document_properties_producer=PDFaren ekoizlea: +document_properties_version=PDF bertsioa: +document_properties_page_count=Orrialde kopurua: +document_properties_close=Itxi + +print_progress_message=Dokumentua inprimatzeko prestatzen… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent=%{{progress}} +print_progress_close=Utzi + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Txandakatu alboko barra +toggle_sidebar_label=Txandakatu alboko barra +document_outline.title=Erakutsi dokumentuaren eskema (klik bikoitza elementu guztiak zabaltzeko/tolesteko) +document_outline_label=Dokumentuaren eskema +attachments.title=Erakutsi eranskinak +attachments_label=Eranskinak +thumbs.title=Erakutsi koadro txikiak +thumbs_label=Koadro txikiak +findbar.title=Bilatu dokumentuan +findbar_label=Bilatu + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}}. orria +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}}. orriaren koadro txikia + +# Find panel button title and messages +find_label=Bilatu: +find_previous.title=Bilatu esaldiaren aurreko parekatzea +find_previous_label=Aurrekoa +find_next.title=Bilatu esaldiaren hurrengo parekatzea +find_next_label=Hurrengoa +find_highlight=Nabarmendu guztia +find_match_case_label=Bat etorri maiuskulekin/minuskulekin +find_reached_top=Dokumentuaren hasierara heldu da, bukaeratik jarraitzen +find_reached_bottom=Dokumentuaren bukaerara heldu da, hasieratik jarraitzen +find_not_found=Esaldia ez da aurkitu + +# Error panel labels +error_more_info=Informazio gehiago +error_less_info=Informazio gutxiago +error_close=Itxi +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (eraikuntza: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mezua: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fitxategia: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Lerroa: {{line}} +rendering_error=Errorea gertatu da orria errendatzean. + +# Predefined zoom values +page_scale_width=Orriaren zabalera +page_scale_fit=Doitu orrira +page_scale_auto=Zoom automatikoa +page_scale_actual=Benetako tamaina +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent=%{{scale}} + +# Loading indicator messages +loading_error_indicator=Errorea +loading_error=Errorea gertatu da PDFa kargatzean. +invalid_file_error=PDF fitxategi baliogabe edo hondatua. +missing_file_error=PDF fitxategia falta da. +unexpected_response_error=Espero gabeko zerbitzariaren erantzuna. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} ohartarazpena] +password_label=Idatzi PDF fitxategi hau irekitzeko pasahitza. +password_invalid=Pasahitz baliogabea. Saiatu berriro mesedez. +password_ok=Ados +password_cancel=Utzi + +printing_not_supported=Abisua: inprimatzeko euskarria ez da erabatekoa nabigatzaile honetan. +printing_not_ready=Abisua: PDFa ez dago erabat kargatuta inprimatzeko. +web_fonts_disabled=Webeko letra-tipoak desgaituta daude: ezin dira kapsulatutako PDF letra-tipoak erabili. +document_colors_not_allowed=PDF dokumentuek ez dute beraien koloreak erabiltzeko baimenik: 'Baimendu orriak beraien letra-tipoak aukeratzea' desaktibatuta dago nabigatzailean. diff --git a/src/cps/static/locale/fa/viewer.properties b/src/cps/static/locale/fa/viewer.properties new file mode 100644 index 0000000..50815a7 --- /dev/null +++ b/src/cps/static/locale/fa/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=صفحهٔ قبلی +previous_label=قبلی +next.title=صفحهٔ بعدی +next_label=بعدی + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=صفحه +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=از {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}}از {{pagesCount}}) + +zoom_out.title=کوچک‌نمایی +zoom_out_label=کوچک‌نمایی +zoom_in.title=بزرگ‌نمایی +zoom_in_label=بزرگ‌نمایی +zoom.title=زوم +presentation_mode.title=تغییر به حالت ارائه +presentation_mode_label=حالت ارائه +open_file.title=باز کردن پرونده +open_file_label=باز کردن +print.title=چاپ +print_label=چاپ +download.title=بارگیری +download_label=بارگیری +bookmark.title=نمای فعلی (رونوشت و یا نشان دادن در پنجره جدید) +bookmark_label=نمای فعلی + +# Secondary toolbar and context menu +tools.title=ابزارها +tools_label=ابزارها +first_page.title=برو به اولین صفحه +first_page.label=برو یه اولین صفحه +first_page_label=برو به اولین صفحه +last_page.title=برو به آخرین صفحه +last_page.label=برو به آخرین صفحه +last_page_label=برو به آخرین صفحه +page_rotate_cw.title=چرخش ساعتگرد +page_rotate_cw.label=چرخش ساعتگرد +page_rotate_cw_label=چرخش ساعتگرد +page_rotate_ccw.title=چرخش پاد ساعتگرد +page_rotate_ccw.label=چرخش پاد ساعتگرد +page_rotate_ccw_label=چرخش پاد ساعتگرد + +hand_tool_enable.title=فعال سازی ابزار دست +hand_tool_enable_label=فعال سازی ابزار دست +hand_tool_disable.title=غیر‌فعال سازی ابزار دست +hand_tool_disable_label=غیر‌فعال سازی ابزار دست + +# Document properties dialog box +document_properties.title=خصوصیات سند... +document_properties_label=خصوصیات سند... +document_properties_file_name=نام فایل: +document_properties_file_size=حجم پرونده: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} کیلوبایت ({{size_b}} بایت) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} مگابایت ({{size_b}} بایت) +document_properties_title=عنوان: +document_properties_author=نویسنده: +document_properties_subject=موضوع: +document_properties_keywords=کلیدواژه‌ها: +document_properties_creation_date=تاریخ ایجاد: +document_properties_modification_date=تاریخ ویرایش: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}، {{time}} +document_properties_creator=ایجاد کننده: +document_properties_producer=ایجاد کننده PDF: +document_properties_version=نسخه PDF: +document_properties_page_count=تعداد صفحات: +document_properties_close=بستن + +print_progress_message=آماده سازی مدارک برای چاپ کردن… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=لغو + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=باز و بسته کردن نوار کناری +toggle_sidebar_label=تغییرحالت نوارکناری +document_outline.title=نمایش رئوس مطالب مدارک(برای بازشدن/جمع شدن همه موارد دوبار کلیک کنید) +document_outline_label=طرح نوشتار +attachments.title=نمایش پیوست‌ها +attachments_label=پیوست‌ها +thumbs.title=نمایش تصاویر بندانگشتی +thumbs_label=تصاویر بندانگشتی +findbar.title=جستجو در سند +findbar_label=پیدا کردن + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=صفحه {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=تصویر بند‌ انگشتی صفحه {{page}} + +# Find panel button title and messages +find_label=جستجو: +find_previous.title=پیدا کردن رخداد قبلی عبارت +find_previous_label=قبلی +find_next.title=پیدا کردن رخداد بعدی عبارت +find_next_label=بعدی +find_highlight=برجسته و هایلایت کردن همه موارد +find_match_case_label=تطبیق کوچکی و بزرگی حروف +find_reached_top=به بالای صفحه رسیدیم، از پایین ادامه می‌دهیم +find_reached_bottom=به آخر صفحه رسیدیم، از بالا ادامه می‌دهیم +find_not_found=عبارت پیدا نشد + +# Error panel labels +error_more_info=اطلاعات بیشتر +error_less_info=اطلاعات کمتر +error_close=بستن +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=‏PDF.js ورژن{{version}} ‏(ساخت: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=پیام: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=توده: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=پرونده: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=سطر: {{line}} +rendering_error=هنگام بارگیری صفحه خطایی رخ داد. + +# Predefined zoom values +page_scale_width=عرض صفحه +page_scale_fit=اندازه کردن صفحه +page_scale_auto=بزرگنمایی خودکار +page_scale_actual=اندازه واقعی‌ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=خطا +loading_error=هنگام بارگیری پرونده PDF خطایی رخ داد. +invalid_file_error=پرونده PDF نامعتبر یامعیوب می‌باشد. +missing_file_error=پرونده PDF یافت نشد. +unexpected_response_error=پاسخ پیش بینی نشده سرور + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=جهت باز کردن پرونده PDF گذرواژه را وارد نمائید. +password_invalid=گذرواژه نامعتبر. لطفا مجددا تلاش کنید. +password_ok=تأیید +password_cancel=لغو + +printing_not_supported=هشدار: قابلیت چاپ به‌طور کامل در این مرورگر پشتیبانی نمی‌شود. +printing_not_ready=اخطار: پرونده PDF بطور کامل بارگیری نشده و امکان چاپ وجود ندارد. +web_fonts_disabled=فونت های تحت وب غیر فعال شده اند: امکان استفاده از نمایش دهنده داخلی PDF وجود ندارد. +document_colors_not_allowed=فایلهای PDF اجازه ندارند تا از رنگ‌های خود استفاده کنند: گزینه «به صفحات اجازه بده تا از رنگ‌های خود استفاده کنند» در مرورگر غیر فعال است. diff --git a/src/cps/static/locale/ff/viewer.properties b/src/cps/static/locale/ff/viewer.properties new file mode 100644 index 0000000..c73fc96 --- /dev/null +++ b/src/cps/static/locale/ff/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Hello Ɓennungo +previous_label=Ɓennuɗo +next.title=Hello faango +next_label=Yeeso + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Hello +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=e nder {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} of {{pagesCount}}) + +zoom_out.title=Lonngo Woɗɗa +zoom_out_label=Lonngo Woɗɗa +zoom_in.title=Lonngo Ara +zoom_in_label=Lonngo Ara +zoom.title=Lonngo +presentation_mode.title=Faytu to Presentation Mode +presentation_mode_label=Presentation Mode +open_file.title=Uddit Fiilde +open_file_label=Uddit +print.title=Winndito +print_label=Winndito +download.title=Aawto +download_label=Aawto +bookmark.title=Jiytol gonangol (natto walla uddit e henorde) +bookmark_label=Jiytol Gonangol + +# Secondary toolbar and context menu +tools.title=Kuutorɗe +tools_label=Kuutorɗe +first_page.title=Yah to hello adanngo +first_page.label=Yah to hello adanngo +first_page_label=Yah to hello adanngo +last_page.title=Yah to hello wattindiingo +last_page.label=Yah to hello wattindiingo +last_page_label=Yah to hello wattindiingo +page_rotate_cw.title=Yiiltu Faya Ñaamo +page_rotate_cw.label=Yiiltu Faya Ñaamo +page_rotate_cw_label=Yiiltu Faya Ñaamo +page_rotate_ccw.title=Yiiltu Faya Nano +page_rotate_ccw.label=Yiiltu Faya Nano +page_rotate_ccw_label=Yiiltu Faya Nano + +hand_tool_enable.title=Hurmin kuutorgal junngo +hand_tool_enable_label=Hurmin kuutorgal junngo +hand_tool_disable.title=Daaƴ kuutorgal junngo +hand_tool_disable_label=Daaƴ kuutorgal junngo + +# Document properties dialog box +document_properties.title=Keeroraaɗi Winndannde… +document_properties_label=Keeroraaɗi Winndannde… +document_properties_file_name=Innde fiilde: +document_properties_file_size=Ɓetol fiilde: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bite) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bite) +document_properties_title=Tiitoonde: +document_properties_author=Binnduɗo: +document_properties_subject=Toɓɓere: +document_properties_keywords=Kelmekele jiytirɗe: +document_properties_creation_date=Ñalnde Sosaa: +document_properties_modification_date=Ñalnde Waylaa: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Cosɗo: +document_properties_producer=Paggiiɗo PDF: +document_properties_version=Yamre PDF: +document_properties_page_count=Limoore Kelle: +document_properties_close=Uddu + +print_progress_message=Nana heboo winnditaade fiilannde… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Haaytu + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toggilo Palal Sawndo +toggle_sidebar_label=Toggilo Palal Sawndo +document_outline.title=Hollu Ƴiyal Fiilannde (dobdobo ngam wertude/taggude teme fof) +document_outline_label=Toɓɓe Fiilannde +attachments.title=Hollu Ɗisanɗe +attachments_label=Ɗisanɗe +thumbs.title=Hollu Dooɓe +thumbs_label=Dooɓe +findbar.title=Yiylo e fiilannde +findbar_label=Yiytu + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Hello {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Dooɓre Hello {{page}} + +# Find panel button title and messages +find_label=Yiytu: +find_previous.title=Yiylo cilol ɓennugol konngol ngol +find_previous_label=Ɓennuɗo +find_next.title=Yiylo cilol garowol konngol ngol +find_next_label=Yeeso +find_highlight=Jalbin fof +find_match_case_label=Jaaɓnu darnde +find_reached_top=Heɓii fuɗɗorde fiilannde, jokku faya les +find_reached_bottom=Heɓii hoore fiilannde, jokku faya les +find_not_found=Konngi njiyataa + +# Error panel labels +error_more_info=Ɓeydu Humpito +error_less_info=Ustu Humpito +error_close=Uddu +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Ɓatakuure: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fiilde: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Gorol: {{line}} +rendering_error=Juumre waɗii tuma nde yoŋkittoo hello. + +# Predefined zoom values +page_scale_width=Njaajeendi Hello +page_scale_fit=Keƴeendi Hello +page_scale_auto=Loongorde Jaajol +page_scale_actual=Ɓetol Jaati +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Juumre +loading_error=Juumre waɗii tuma nde loowata PDF oo. +invalid_file_error=Fiilde PDF moƴƴaani walla jiibii. +missing_file_error=Fiilde PDF ena ŋakki. +unexpected_response_error=Jaabtol sarworde tijjinooka. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Siiftannde] +password_label=Naatu finnde ngam uddite ndee fiilde PDF. +password_invalid=Finnde moƴƴaani. Tiiɗno eto kadi. +password_ok=OK +password_cancel=Haaytu + +printing_not_supported=Reentino: Winnditagol tammbitaaka no feewi e ndee wanngorde. +printing_not_ready=Reentino: PDF oo loowaaki haa timmi ngam winnditagol. +web_fonts_disabled=Ponte geese ko daaƴaaɗe: horiima huutoraade ponte PDF coomtoraaɗe. +document_colors_not_allowed=Piilanɗe PDF njamiraaka yoo kuutoro goobuuji mum'en keeriiɗi: 'Yamir kello yoo kuutoro goobuuki keeriiɗi' koko daaƴaa e wanngorde ndee. diff --git a/src/cps/static/locale/fi/viewer.properties b/src/cps/static/locale/fi/viewer.properties new file mode 100644 index 0000000..86671ad --- /dev/null +++ b/src/cps/static/locale/fi/viewer.properties @@ -0,0 +1,180 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Edellinen sivu +previous_label=Edellinen +next.title=Seuraava sivu +next_label=Seuraava + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Sivu +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} / {{pagesCount}}) + +zoom_out.title=Loitonna +zoom_out_label=Loitonna +zoom_in.title=Lähennä +zoom_in_label=Lähennä +zoom.title=Suurennus +presentation_mode.title=Siirry esitystilaan +presentation_mode_label=Esitystila +open_file.title=Avaa tiedosto +open_file_label=Avaa +print.title=Tulosta +print_label=Tulosta +download.title=Lataa +download_label=Lataa +bookmark.title=Avoin ikkuna (kopioi tai avaa uuteen ikkunaan) +bookmark_label=Avoin ikkuna + +# Secondary toolbar and context menu +tools.title=Tools +tools_label=Tools +first_page.title=Siirry ensimmäiselle sivulle +first_page.label=Siirry ensimmäiselle sivulle +first_page_label=Siirry ensimmäiselle sivulle +last_page.title=Siirry viimeiselle sivulle +last_page.label=Siirry viimeiselle sivulle +last_page_label=Siirry viimeiselle sivulle +page_rotate_cw.title=Kierrä oikealle +page_rotate_cw.label=Kierrä oikealle +page_rotate_cw_label=Kierrä oikealle +page_rotate_ccw.title=Kierrä vasemmalle +page_rotate_ccw.label=Kierrä vasemmalle +page_rotate_ccw_label=Kierrä vasemmalle + +hand_tool_enable.title=Käytä käsityökalua +hand_tool_enable_label=Käytä käsityökalua +hand_tool_disable.title=Poista käsityökalu käytöstä +hand_tool_disable_label=Poista käsityökalu käytöstä + +# Document properties dialog box +document_properties.title=Dokumentin ominaisuudet… +document_properties_label=Dokumentin ominaisuudet… +document_properties_file_name=Tiedostonimi: +document_properties_file_size=Tiedoston koko: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kt ({{size_b}} tavua) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} Mt ({{size_b}} tavua) +document_properties_title=Otsikko: +document_properties_author=Tekijä: +document_properties_subject=Aihe: +document_properties_keywords=Avainsanat: +document_properties_creation_date=Luomispäivämäärä: +document_properties_modification_date=Muokkauspäivämäärä: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Luoja: +document_properties_producer=PDF-tuottaja: +document_properties_version=PDF-versio: +document_properties_page_count=Sivujen määrä: +document_properties_close=Sulje + +print_progress_message=Valmistellaan dokumenttia tulostamista varten… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}} % +print_progress_close=Peruuta + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Näytä/piilota sivupaneeli +toggle_sidebar_label=Näytä/piilota sivupaneeli +attachments.title=Näytä liitteet +attachments_label=Liitteet +thumbs.title=Näytä pienoiskuvat +thumbs_label=Pienoiskuvat +findbar.title=Etsi dokumentista +findbar_label=Etsi + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Sivu {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Pienoiskuva sivusta {{page}} + +# Find panel button title and messages +find_label=Etsi: +find_previous.title=Etsi hakusanan edellinen osuma +find_previous_label=Edellinen +find_next.title=Etsi hakusanan seuraava osuma +find_next_label=Seuraava +find_highlight=Korosta kaikki +find_match_case_label=Huomioi kirjainkoko +find_reached_top=Päästiin dokumentin alkuun, jatketaan lopusta +find_reached_bottom=Päästiin dokumentin loppuun, continued from top +find_not_found=Hakusanaa ei löytynyt + +# Error panel labels +error_more_info=Lisätietoja +error_less_info=Lisätietoja +error_close=Sulje +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (kooste: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Virheilmoitus: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pino: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Tiedosto: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rivi: {{line}} +rendering_error=Tapahtui virhe piirrettäessä sivua. + +# Predefined zoom values +page_scale_width=Sivun leveys +page_scale_fit=Koko sivu +page_scale_auto=Automaattinen suurennus +page_scale_actual=Todellinen koko +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}} % + +# Loading indicator messages +loading_error_indicator=Virhe +loading_error=Tapahtui virhe ladattaessa PDF-tiedostoa. +invalid_file_error=Virheellinen tai vioittunut PDF-tiedosto. +missing_file_error=Puuttuva PDF-tiedosto. +unexpected_response_error=Odottamaton vastaus palvelimelta. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=Kirjoita PDF-tiedoston salasana. +password_invalid=Virheellinen salasana. Yritä uudestaan. +password_ok=OK +password_cancel=Peruuta + +printing_not_supported=Varoitus: Selain ei tue kaikkia tulostustapoja. +printing_not_ready=Varoitus: PDF-tiedosto ei ole vielä latautunut kokonaan, eikä sitä voi vielä tulostaa. +web_fonts_disabled=Verkkosivujen omat kirjasinlajit on estetty: ei voida käyttää upotettuja PDF-kirjasinlajeja. +document_colors_not_allowed=PDF-dokumenttien ei ole sallittua käyttää omia värejään: Asetusta ”Sivut saavat käyttää omia värejään oletusten sijaan” ei ole valittu selaimen asetuksissa. diff --git a/src/cps/static/locale/fr/viewer.properties b/src/cps/static/locale/fr/viewer.properties new file mode 100644 index 0000000..bedc821 --- /dev/null +++ b/src/cps/static/locale/fr/viewer.properties @@ -0,0 +1,176 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Page précédente +previous_label=Précédent +next.title=Page suivante +next_label=Suivant + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Page +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=sur {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} sur {{pagesCount}}) + +zoom_out.title=Zoom arrière +zoom_out_label=Zoom arrière +zoom_in.title=Zoom avant +zoom_in_label=Zoom avant +zoom.title=Zoom +presentation_mode.title=Basculer en mode présentation +presentation_mode_label=Mode présentation +open_file.title=Ouvrir le fichier +open_file_label=Ouvrir le fichier +print.title=Imprimer +print_label=Imprimer +download.title=Télécharger +download_label=Télécharger +bookmark.title=Affichage courant (copier ou ouvrir dans une nouvelle fenêtre) +bookmark_label=Affichage actuel + +# Secondary toolbar and context menu +tools.title=Outils +tools_label=Outils +first_page.title=Aller à la première page +first_page.label=Aller à la première page +first_page_label=Aller à la première page +last_page.title=Aller à la dernière page +last_page.label=Aller à la dernière page +last_page_label=Aller à la dernière page +page_rotate_cw.title=Rotation horaire +page_rotate_cw.label=Rotation horaire +page_rotate_cw_label=Rotation horaire +page_rotate_ccw.title=Rotation anti-horaire +page_rotate_ccw.label=Rotation anti-horaire +page_rotate_ccw_label=Rotation anti-horaire + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Afficher/Masquer le panneau latéral +toggle_sidebar_label=Afficher/Masquer le panneau latéral +document_outline.title=Afficher les signets du document (double-cliquer pour développer/réduire tous les éléments) +document_outline_label=Signets du document +attachments.title=Afficher les pièces jointes +attachments_label=Pièces jointes +thumbs.title=Afficher les vignettes +thumbs_label=Vignettes +findbar.title=Rechercher dans le document +findbar_label=Rechercher + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Page {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Vignette de la page {{page}} + +hand_tool_enable.title=Activer l’outil main +hand_tool_enable_label=Activer l’outil main +hand_tool_disable.title=Désactiver l’outil main +hand_tool_disable_label=Désactiver l’outil main + +# Document properties dialog box +document_properties.title=Propriétés du document… +document_properties_label=Propriétés du document… +document_properties_file_name=Nom du fichier : +document_properties_file_size=Taille du fichier : +document_properties_kb={{size_kb}} Ko ({{size_b}} octets) +document_properties_mb={{size_mb}} Mo ({{size_b}} octets) +document_properties_title=Titre : +document_properties_author=Auteur : +document_properties_subject=Sujet : +document_properties_keywords=Mots-clés : +document_properties_creation_date=Date de création : +document_properties_modification_date=Modifié le : +document_properties_date_string={{date}} à {{time}} +document_properties_creator=Créé par : +document_properties_producer=Outil de conversion PDF : +document_properties_version=Version PDF : +document_properties_page_count=Nombre de pages : +document_properties_close=Fermer + +print_progress_message=Préparation du document pour l’impression… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}} % +print_progress_close=Annuler + +# Find panel button title and messages +find_label=Rechercher : +find_previous.title=Trouver l’occurrence précédente de la phrase +find_previous_label=Précédent +find_next.title=Trouver la prochaine occurrence de la phrase +find_next_label=Suivant +find_highlight=Tout surligner +find_match_case_label=Respecter la casse +find_reached_top=Haut de la page atteint, poursuite depuis la fin +find_reached_bottom=Bas de la page atteint, poursuite au début +find_not_found=Phrase introuvable + +# Error panel labels +error_more_info=Plus d’informations +error_less_info=Moins d’informations +error_close=Fermer +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (identifiant de compilation : {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Message : {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pile : {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fichier : {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Ligne : {{line}} +rendering_error=Une erreur s’est produite lors de l’affichage de la page. + +# Predefined zoom values +page_scale_width=Pleine largeur +page_scale_fit=Page entière +page_scale_auto=Zoom automatique +page_scale_actual=Taille réelle +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}} % + +# Loading indicator messages +loading_error_indicator=Erreur +loading_error=Une erreur s’est produite lors du chargement du fichier PDF. +invalid_file_error=Fichier PDF invalide ou corrompu. +missing_file_error=Fichier PDF manquant. +unexpected_response_error=Réponse inattendue du serveur. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Annotation {{type}}] +password_label=Veuillez saisir le mot de passe pour ouvrir ce fichier PDF. +password_invalid=Mot de passe incorrect. Veuillez réessayer. +password_ok=OK +password_cancel=Annuler + +printing_not_supported=Attention : l’impression n’est pas totalement prise en charge par ce navigateur. +printing_not_ready=Attention : le PDF n’est pas entièrement chargé pour pouvoir l’imprimer. +web_fonts_disabled=Les polices web sont désactivées : impossible d’utiliser les polices intégrées au PDF. +document_colors_not_allowed=Les documents PDF ne peuvent pas utiliser leurs propres couleurs : « Autoriser les pages web à utiliser leurs propres couleurs » est désactivé dans le navigateur. diff --git a/src/cps/static/locale/fy-NL/viewer.properties b/src/cps/static/locale/fy-NL/viewer.properties new file mode 100644 index 0000000..ed82764 --- /dev/null +++ b/src/cps/static/locale/fy-NL/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Foarige side +previous_label=Foarige +next.title=Folgjende side +next_label=Folgjende + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Side +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=fa {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} fan {{pagesCount}}) + +zoom_out.title=Utzoome +zoom_out_label=Utzoome +zoom_in.title=Ynzoome +zoom_in_label=Ynzoome +zoom.title=Zoome +presentation_mode.title=Wikselje nei presintaasjemodus +presentation_mode_label=Presintaasjemodus +open_file.title=Bestân iepenje +open_file_label=Iepenje +print.title=Ofdrukke +print_label=Ofdrukke +download.title=Downloade +download_label=Downloade +bookmark.title=Aktuele finster (kopiearje of iepenje yn nij finster) +bookmark_label=Aktuele finster + +# Secondary toolbar and context menu +tools.title=Ark +tools_label=Ark +first_page.title=Gean nei earste side +first_page.label=Nei earste side gean +first_page_label=Gean nei earste side +last_page.title=Gean nei lêste side +last_page.label=Nei lêste side gean +last_page_label=Gean nei lêste side +page_rotate_cw.title=Rjochtsom draaie +page_rotate_cw.label=Rjochtsom draaie +page_rotate_cw_label=Rjochtsom draaie +page_rotate_ccw.title=Loftsom draaie +page_rotate_ccw.label=Loftsom draaie +page_rotate_ccw_label=Loftsom draaie + +hand_tool_enable.title=Hânark ynskeakelje +hand_tool_enable_label=Hânark ynskeakelje +hand_tool_disable.title=Hânark úyskeakelje +hand_tool_disable_label=Hânark úyskeakelje + +# Document properties dialog box +document_properties.title=Dokuminteigenskippen… +document_properties_label=Dokuminteigenskippen… +document_properties_file_name=Bestânsnamme: +document_properties_file_size=Bestânsgrutte: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titel: +document_properties_author=Auteur: +document_properties_subject=Underwerp: +document_properties_keywords=Kaaiwurden: +document_properties_creation_date=Oanmaakdatum: +document_properties_modification_date=Bewurkingsdatum: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Makker: +document_properties_producer=PDF-makker: +document_properties_version=PDF-ferzje: +document_properties_page_count=Siden: +document_properties_close=Slute + +print_progress_message=Dokumint tariede oar ôfdrukken… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Annulearje + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Sidebalke yn-/útskeakelje +toggle_sidebar_label=Sidebalke yn-/útskeakelje +document_outline.title=Dokumintoersjoch toane (dûbelklik om alle items út/yn te klappen) +document_outline_label=Dokumintoersjoch +attachments.title=Bylagen toane +attachments_label=Bylagen +thumbs.title=Foarbylden toane +thumbs_label=Foarbylden +findbar.title=Sykje yn dokumint +findbar_label=Sykje + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Side {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Foarbyld fan side {{page}} + +# Find panel button title and messages +find_label=Sykje: +find_previous.title=It foarige foarkommen fan de tekst sykje +find_previous_label=Foarige +find_next.title=It folgjende foarkommen fan de tekst sykje +find_next_label=Folgjende +find_highlight=Alles markearje +find_match_case_label=Haadlettergefoelich +find_reached_top=Boppekant fan dokumint berikt, trochgien fan ûnder ôf +find_reached_bottom=Ein fan dokumint berikt, trochgien fan boppe ôf +find_not_found=Tekst net fûn + +# Error panel labels +error_more_info=Mear ynformaasje +error_less_info=Minder ynformaasje +error_close=Slute +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js f{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Berjocht: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Bestân: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rigel: {{line}} +rendering_error=Der is in flater bard by it renderjen fan de side. + +# Predefined zoom values +page_scale_width=Sidebreedte +page_scale_fit=Hiele side +page_scale_auto=Automatysk zoome +page_scale_actual=Werklike grutte +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Flater +loading_error=Der is in flater bard by it laden fan de PDF. +invalid_file_error=Ynfalide of korruptearre PDF-bestân. +missing_file_error=PDF-bestân ûntbrekt. +unexpected_response_error=Unferwacht serverantwurd. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}}-annotaasje] +password_label=Jou it wachtwurd om dit PDF-bestân te iepenjen. +password_invalid=Ferkeard wachtwurd. Probearje opnij. +password_ok=OK +password_cancel=Annulearje + +printing_not_supported=Warning: Printen is net folslein stipe troch dizze browser. +printing_not_ready=Warning: PDF is net folslein laden om ôf te drukken. +web_fonts_disabled=Weblettertypen binne útskeakele: gebrûk fan ynsluten PDF-lettertypen is net mooglik. +document_colors_not_allowed=PDF-dokuminten meie harren eigen kleuren net brûke: ‘Siden tastean om harren eigen kleuren te kiezen’ is útskeakele yn de browser. diff --git a/src/cps/static/locale/ga-IE/viewer.properties b/src/cps/static/locale/ga-IE/viewer.properties new file mode 100644 index 0000000..28a0bb1 --- /dev/null +++ b/src/cps/static/locale/ga-IE/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=An Leathanach Roimhe Seo +previous_label=Roimhe Seo +next.title=An Chéad Leathanach Eile +next_label=Ar Aghaidh + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Leathanach +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=as {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} as {{pagesCount}}) + +zoom_out.title=Súmáil Amach +zoom_out_label=Súmáil Amach +zoom_in.title=Súmáil Isteach +zoom_in_label=Súmáil Isteach +zoom.title=Súmáil +presentation_mode.title=Úsáid an Mód Láithreoireachta +presentation_mode_label=Mód Láithreoireachta +open_file.title=Oscail Comhad +open_file_label=Oscail +print.title=Priontáil +print_label=Priontáil +download.title=Íosluchtaigh +download_label=Íosluchtaigh +bookmark.title=An t-amharc reatha (cóipeáil nó oscail i bhfuinneog nua) +bookmark_label=An tAmharc Reatha + +# Secondary toolbar and context menu +tools.title=Uirlisí +tools_label=Uirlisí +first_page.title=Go dtí an chéad leathanach +first_page.label=Go dtí an chéad leathanach +first_page_label=Go dtí an chéad leathanach +last_page.title=Go dtí an leathanach deiridh +last_page.label=Go dtí an leathanach deiridh +last_page_label=Go dtí an leathanach deiridh +page_rotate_cw.title=Rothlaigh ar deiseal +page_rotate_cw.label=Rothlaigh ar deiseal +page_rotate_cw_label=Rothlaigh ar deiseal +page_rotate_ccw.title=Rothlaigh ar tuathal +page_rotate_ccw.label=Rothlaigh ar tuathal +page_rotate_ccw_label=Rothlaigh ar tuathal + +hand_tool_enable.title=Cumasaigh uirlis láimhe +hand_tool_enable_label=Cumasaigh uirlis láimhe +hand_tool_disable.title=Díchumasaigh uirlis láimhe +hand_tool_disable_label=Díchumasaigh uirlis láimhe + +# Document properties dialog box +document_properties.title=Airíonna na Cáipéise… +document_properties_label=Airíonna na Cáipéise… +document_properties_file_name=Ainm an chomhaid: +document_properties_file_size=Méid an chomhaid: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kB ({{size_b}} beart) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} beart) +document_properties_title=Teideal: +document_properties_author=Údar: +document_properties_subject=Ábhar: +document_properties_keywords=Eochairfhocail: +document_properties_creation_date=Dáta Cruthaithe: +document_properties_modification_date=Dáta Athraithe: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Cruthaitheoir: +document_properties_producer=Cruthaitheoir an PDF: +document_properties_version=Leagan PDF: +document_properties_page_count=Líon Leathanach: +document_properties_close=Dún + +print_progress_message=Cáipéis á hullmhú le priontáil… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cealaigh + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Scoránaigh an Barra Taoibh +toggle_sidebar_label=Scoránaigh an Barra Taoibh +document_outline.title=Taispeáin Imlíne na Cáipéise (déchliceáil chun chuile rud a leathnú nó a laghdú) +document_outline_label=Creatlach na Cáipéise +attachments.title=Taispeáin Iatáin +attachments_label=Iatáin +thumbs.title=Taispeáin Mionsamhlacha +thumbs_label=Mionsamhlacha +findbar.title=Aimsigh sa Cháipéis +findbar_label=Aimsigh + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Leathanach {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Mionsamhail Leathanaigh {{page}} + +# Find panel button title and messages +find_label=Aimsigh: +find_previous.title=Aimsigh an sampla roimhe seo den nath seo +find_previous_label=Roimhe seo +find_next.title=Aimsigh an chéad sampla eile den nath sin +find_next_label=Ar aghaidh +find_highlight=Aibhsigh uile +find_match_case_label=Cásíogair +find_reached_top=Ag barr na cáipéise, ag leanúint ón mbun +find_reached_bottom=Ag bun na cáipéise, ag leanúint ón mbarr +find_not_found=Abairtín gan aimsiú + +# Error panel labels +error_more_info=Tuilleadh Eolais +error_less_info=Níos Lú Eolais +error_close=Dún +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Teachtaireacht: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Cruach: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Comhad: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Líne: {{line}} +rendering_error=Tharla earráid agus an leathanach á leagan amach. + +# Predefined zoom values +page_scale_width=Leithead Leathanaigh +page_scale_fit=Laghdaigh go dtí an Leathanach +page_scale_auto=Súmáil Uathoibríoch +page_scale_actual=Fíormhéid +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Earráid +loading_error=Tharla earráid agus an cháipéis PDF á luchtú. +invalid_file_error=Comhad neamhbhailí nó truaillithe PDF. +missing_file_error=Comhad PDF ar iarraidh. +unexpected_response_error=Freagra ón bhfreastalaí nach rabhthas ag súil leis. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anótáil {{type}}] +password_label=Cuir an focal faire isteach chun an comhad PDF seo a oscailt. +password_invalid=Focal faire mícheart. Déan iarracht eile. +password_ok=OK +password_cancel=Cealaigh + +printing_not_supported=Rabhadh: Ní thacaíonn an brabhsálaí le priontáil go hiomlán. +printing_not_ready=Rabhadh: Ní féidir an PDF a phriontáil go dtí go mbeidh an cháipéis iomlán luchtaithe. +web_fonts_disabled=Tá clófhoirne Gréasáin díchumasaithe: ní féidir clófhoirne leabaithe PDF a úsáid. +document_colors_not_allowed=Níl cead ag cáipéisí PDF a ndathanna féin a roghnú: tá “Tabhair cead do leathanaigh a ndathanna féin a roghnú” díchumasaithe sa mbrabhsálaí. diff --git a/src/cps/static/locale/gd/viewer.properties b/src/cps/static/locale/gd/viewer.properties new file mode 100644 index 0000000..bfad09b --- /dev/null +++ b/src/cps/static/locale/gd/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=An duilleag roimhe +previous_label=Air ais +next.title=An ath-dhuilleag +next_label=Air adhart + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Duilleag +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=à {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} à {{pagesCount}}) + +zoom_out.title=Sùm a-mach +zoom_out_label=Sùm a-mach +zoom_in.title=Sùm a-steach +zoom_in_label=Sùm a-steach +zoom.title=Sùm +presentation_mode.title=Gearr leum dhan mhodh taisbeanaidh +presentation_mode_label=Am modh taisbeanaidh +open_file.title=Fosgail faidhle +open_file_label=Fosgail +print.title=Clò-bhuail +print_label=Clò-bhuail +download.title=Luchdaich a-nuas +download_label=Luchdaich a-nuas +bookmark.title=An sealladh làithreach (dèan lethbhreac no fosgail e ann an uinneag ùr) +bookmark_label=An sealladh làithreach + +# Secondary toolbar and context menu +tools.title=Innealan +tools_label=Innealan +first_page.title=Rach gun chiad duilleag +first_page.label=Rach gun chiad duilleag +first_page_label=Rach gun chiad duilleag +last_page.title=Rach gun duilleag mu dheireadh +last_page.label=Rach gun duilleag mu dheireadh +last_page_label=Rach gun duilleag mu dheireadh +page_rotate_cw.title=Cuairtich gu deiseil +page_rotate_cw.label=Cuairtich gu deiseil +page_rotate_cw_label=Cuairtich gu deiseil +page_rotate_ccw.title=Cuairtich gu tuathail +page_rotate_ccw.label=Cuairtich gu tuathail +page_rotate_ccw_label=Cuairtich gu tuathail + +hand_tool_enable.title=Cuir inneal na làimhe an comas +hand_tool_enable_label=Cuir inneal na làimhe an comas +hand_tool_disable.title=Cuir inneal na làimhe à comas +hand_tool_disable_label=Cuir à comas inneal na làimhe + +# Document properties dialog box +document_properties.title=Roghainnean na sgrìobhainne… +document_properties_label=Roghainnean na sgrìobhainne… +document_properties_file_name=Ainm an fhaidhle: +document_properties_file_size=Meud an fhaidhle: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Tiotal: +document_properties_author=Ùghdar: +document_properties_subject=Cuspair: +document_properties_keywords=Faclan-luirg: +document_properties_creation_date=Latha a chruthachaidh: +document_properties_modification_date=Latha atharrachaidh: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Cruthadair: +document_properties_producer=Saothraiche a' PDF: +document_properties_version=Tionndadh a' PDF: +document_properties_page_count=Àireamh de dhuilleagan: +document_properties_close=Dùin + +print_progress_message=Ag ullachadh na sgrìobhainn airson clò-bhualadh… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Sguir dheth + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Toglaich am bàr-taoibh +toggle_sidebar_label=Toglaich am bàr-taoibh +document_outline.title=Seall oir-loidhne na sgrìobhainn (dèan briogadh dùbailte airson a h-uile nì a leudachadh/a cho-theannadh) +document_outline_label=Oir-loidhne na sgrìobhainne +attachments.title=Seall na ceanglachain +attachments_label=Ceanglachain +thumbs.title=Seall na dealbhagan +thumbs_label=Dealbhagan +findbar.title=Lorg san sgrìobhainn +findbar_label=Lorg + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Duilleag a {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Dealbhag duilleag a {{page}} + +# Find panel button title and messages +find_label=Lorg: +find_previous.title=Lorg làthair roimhe na h-abairt seo +find_previous_label=Air ais +find_next.title=Lorg ath-làthair na h-abairt seo +find_next_label=Air adhart +find_highlight=Soillsich a h-uile +find_match_case_label=Aire do litrichean mòra is beaga +find_reached_top=Ràinig sinn barr na duilleige, a' leantainn air adhart o bhonn na duilleige +find_reached_bottom=Ràinig sinn bonn na duilleige, a' leantainn air adhart o bharr na duilleige +find_not_found=Cha deach an abairt a lorg + +# Error panel labels +error_more_info=Barrachd fiosrachaidh +error_less_info=Nas lugha de dh'fhiosrachadh +error_close=Dùin +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Teachdaireachd: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stac: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Faidhle: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Loidhne: {{line}} +rendering_error=Thachair mearachd rè reandaradh na duilleige. + +# Predefined zoom values +page_scale_width=Leud na duilleige +page_scale_fit=Freagair ri meud na duilleige +page_scale_auto=Sùm fèin-obrachail +page_scale_actual=Am fìor-mheud +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Mearachd +loading_error=Thachair mearachd rè luchdadh a' PDF. +invalid_file_error=Faidhle PDF a tha mì-dhligheach no coirbte. +missing_file_error=Faidhle PDF a tha a dhìth. +unexpected_response_error=Freagairt on fhrithealaiche ris nach robh dùil. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Nòtachadh {{type}}] +password_label=Cuir a-steach am facal-faire gus am faidhle PDF seo fhosgladh. +password_invalid=Tha am facal-faire cearr. Nach fheuch thu ris a-rithist? +password_ok=Ceart ma-tha +password_cancel=Sguir dheth + +printing_not_supported=Rabhadh: Chan eil am brabhsair seo a' cur làn-taic ri clò-bhualadh. +printing_not_ready=Rabhadh: Cha deach am PDF a luchdadh gu tur airson clò-bhualadh. +web_fonts_disabled=Tha cruthan-clò lìn à comas: Chan urrainn dhuinn cruthan-clò PDF leabaichte a chleachdadh. +document_colors_not_allowed=Chan fhaod sgrìobhainnean PDF na dathan aca fhèin a chleachdadh: Tha “Leig le duilleagan na dathan aca fhèin a chleachdadh” à comas sa bhrabhsair. diff --git a/src/cps/static/locale/gl/viewer.properties b/src/cps/static/locale/gl/viewer.properties new file mode 100644 index 0000000..ac088ae --- /dev/null +++ b/src/cps/static/locale/gl/viewer.properties @@ -0,0 +1,173 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Páxina anterior +previous_label=Anterior +next.title=Seguinte páxina +next_label=Seguinte + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Reducir +zoom_out_label=Reducir +zoom_in.title=Ampliar +zoom_in_label=Ampliar +zoom.title=Zoom +presentation_mode.title=Cambiar ao modo presentación +presentation_mode_label=Modo presentación +open_file.title=Abrir ficheiro +open_file_label=Abrir +print.title=Imprimir +print_label=Imprimir +download.title=Descargar +download_label=Descargar +bookmark.title=Vista actual (copiar ou abrir nunha nova xanela) +bookmark_label=Vista actual + +# Secondary toolbar and context menu +tools.title=Ferramentas +tools_label=Ferramentas +first_page.title=Ir á primeira páxina +first_page.label=Ir á primeira páxina +first_page_label=Ir á primeira páxina +last_page.title=Ir á última páxina +last_page.label=Ir á última páxina +last_page_label=Ir á última páxina +page_rotate_cw.title=Rotar no sentido das agullas do reloxo +page_rotate_cw.label=Rotar no sentido das agullas do reloxo +page_rotate_cw_label=Rotar no sentido das agullas do reloxo +page_rotate_ccw.title=Rotar no sentido contrario ás agullas do reloxo +page_rotate_ccw.label=Rotar no sentido contrario ás agullas do reloxo +page_rotate_ccw_label=Rotar no sentido contrario ás agullas do reloxo + +hand_tool_enable.title=Activar ferramenta man +hand_tool_enable_label=Activar ferramenta man +hand_tool_disable.title=Desactivar ferramenta man +hand_tool_disable_label=Desactivar ferramenta man + +# Document properties dialog box +document_properties.title=Propiedades do documento… +document_properties_label=Propiedades do documento… +document_properties_file_name=Nome do ficheiro: +document_properties_file_size=Tamaño do ficheiro: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Título: +document_properties_author=Autor: +document_properties_subject=Asunto: +document_properties_keywords=Palabras clave: +document_properties_creation_date=Data de creación: +document_properties_modification_date=Data de modificación: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creado por: +document_properties_producer=Xenerador do PDF: +document_properties_version=Versión de PDF: +document_properties_page_count=Número de páxinas: +document_properties_close=Pechar + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Amosar/agochar a barra lateral +toggle_sidebar_label=Amosar/agochar a barra lateral +attachments.title=Amosar anexos +attachments_label=Anexos +thumbs.title=Amosar miniaturas +thumbs_label=Miniaturas +findbar.title=Atopar no documento +findbar_label=Atopar + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Páxina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura da páxina {{page}} + +# Find panel button title and messages +find_label=Atopar: +find_previous.title=Atopar a anterior aparición da frase +find_previous_label=Anterior +find_next.title=Atopar a seguinte aparición da frase +find_next_label=Seguinte +find_highlight=Realzar todo +find_match_case_label=Diferenciar maiúsculas de minúsculas +find_reached_top=Chegouse ao inicio do documento, continuar desde o final +find_reached_bottom=Chegouse ao final do documento, continuar desde o inicio +find_not_found=Non se atopou a frase + +# Error panel labels +error_more_info=Máis información +error_less_info=Menos información +error_close=Pechar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (Identificador da compilación: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensaxe: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Ficheiro: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Liña: {{line}} +rendering_error=Produciuse un erro ao representar a páxina. + +# Predefined zoom values +page_scale_width=Largura da páxina +page_scale_fit=Axuste de páxina +page_scale_auto=Zoom automático +page_scale_actual=Tamaño actual +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Erro +loading_error=Produciuse un erro ao cargar o PDF. +invalid_file_error=Ficheiro PDF danado ou incorrecto. +missing_file_error=Falta o ficheiro PDF. +unexpected_response_error=Resposta inesperada do servidor. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotación {{type}}] +password_label=Escriba o contrasinal para abrir este ficheiro PDF. +password_invalid=Contrasinal incorrecto. Tente de novo. +password_ok=Aceptar +password_cancel=Cancelar + +printing_not_supported=Aviso: A impresión non é compatíbel de todo con este navegador. +printing_not_ready=Aviso: O PDF non se cargou completamente para imprimirse. +web_fonts_disabled=Desactiváronse as fontes web: foi imposíbel usar as fontes incrustadas no PDF. diff --git a/src/cps/static/locale/gu-IN/viewer.properties b/src/cps/static/locale/gu-IN/viewer.properties new file mode 100644 index 0000000..9e69f5a --- /dev/null +++ b/src/cps/static/locale/gu-IN/viewer.properties @@ -0,0 +1,168 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=પહેલાનુ પાનું +previous_label=પહેલાનુ +next.title=આગળનુ પાનું +next_label=આગળનું + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=મોટુ કરો +zoom_out_label=મોટુ કરો +zoom_in.title=નાનું કરો +zoom_in_label=નાનું કરો +zoom.title=નાનું મોટુ કરો +presentation_mode.title=રજૂઆત સ્થિતિમાં જાવ +presentation_mode_label=રજૂઆત સ્થિતિ +open_file.title=ફાઇલ ખોલો +open_file_label=ખોલો +print.title=છાપો +print_label=છારો +download.title=ડાઉનલોડ +download_label=ડાઉનલોડ +bookmark.title=વર્તમાન દૃશ્ય (નવી વિન્ડોમાં નકલ કરો અથવા ખોલો) +bookmark_label=વર્તમાન દૃશ્ય + +# Secondary toolbar and context menu +tools.title=સાધનો +tools_label=સાધનો +first_page.label=પહેલાં પાનામાં જાવ +first_page_label=પ્રથમ પાનાં પર જાવ +last_page.label=છેલ્લા પાનામાં જાવ +last_page_label=છેલ્લા પાનાં પર જાવ +page_rotate_cw.label=ઘડિયાળનાં કાંટાની જેમ ફેરવો +page_rotate_cw_label=ઘડિયાળનાં કાંટા તરફ ફેરવો +page_rotate_ccw.label=ઘડિયાળનાં કાંટાની ઉલટી દિશામાં ફેરવો +page_rotate_ccw_label=ઘડિયાળનાં કાંટાની વિરુદ્દ ફેરવો + +hand_tool_enable.title=હાથનાં સાધનને સક્રિય કરો +hand_tool_enable_label=હાથનાં સાધનને સક્રિય કરો +hand_tool_disable.title=હાથનાં સાધનને નિષ્ક્રિય કરો +hand_tool_disable_label=હાથનાં સાધનને નિષ્ક્રિય કરો + +# Document properties dialog box +document_properties.title=દસ્તાવેજ ગુણધર્મો… +document_properties_label=દસ્તાવેજ ગુણધર્મો… +document_properties_file_name=ફાઇલ નામ: +document_properties_file_size=ફાઇલ માપ: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} બાઇટ) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} બાઇટ) +document_properties_title=શીર્ષક: +document_properties_author=લેખક: +document_properties_subject=વિષય: +document_properties_keywords=કિવર્ડ: +document_properties_creation_date=નિર્માણ તારીખ: +document_properties_modification_date=ફેરફાર તારીખ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=નિર્માતા: +document_properties_producer=PDF નિર્માતા: +document_properties_version=PDF આવૃત્તિ: +document_properties_page_count=પાનાં ગણતરી: +document_properties_close=બંધ કરો + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=ટૉગલ બાજુપટ્ટી +toggle_sidebar_label=ટૉગલ બાજુપટ્ટી +document_outline_label=દસ્તાવેજ રૂપરેખા +attachments.title=જોડાણોને બતાવો +attachments_label=જોડાણો +thumbs.title=થંબનેલ્સ બતાવો +thumbs_label=થંબનેલ્સ +findbar.title=દસ્તાવેજમાં શોધો +findbar_label=શોધો + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=પાનું {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=પાનાં {{page}} નું થંબનેલ્સ + +# Find panel button title and messages +find_label=શોધો: +find_previous.title=શબ્દસમૂહની પાછલી ઘટનાને શોધો +find_previous_label=પહેલાંનુ +find_next.title=શબ્દસમૂહની આગળની ઘટનાને શોધો +find_next_label=આગળનું +find_highlight=બધુ પ્રકાશિત કરો +find_match_case_label=કેસ બંધબેસાડો +find_reached_top=દસ્તાવેજનાં ટોચે પહોંચી ગયા, તળિયેથી ચાલુ કરેલ હતુ +find_reached_bottom=દસ્તાવેજનાં અંતે પહોંચી ગયા, ઉપરથી ચાલુ કરેલ હતુ +find_not_found=શબ્દસમૂહ મળ્યુ નથી + +# Error panel labels +error_more_info=વધારે જાણકારી +error_less_info=ઓછી જાણકારી +error_close=બંધ કરો +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=સંદેશો: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=સ્ટેક: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ફાઇલ: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=વાક્ય: {{line}} +rendering_error=ભૂલ ઉદ્ભવી જ્યારે પાનાંનુ રેન્ડ કરી રહ્યા હોય. + +# Predefined zoom values +page_scale_width=પાનાની પહોળાઇ +page_scale_fit=પાનું બંધબેસતુ +page_scale_auto=આપમેળે નાનુંમોટુ કરો +page_scale_actual=ચોક્કસ માપ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=ભૂલ +loading_error=ભૂલ ઉદ્ભવી જ્યારે PDF ને લાવી રહ્યા હોય. +invalid_file_error=અયોગ્ય અથવા ભાંગેલ PDF ફાઇલ. +missing_file_error=ગુમ થયેલ PDF ફાઇલ. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=આ PDF ફાઇલને ખોલવા પાસવર્ડને દાખલ કરો. +password_invalid=અયોગ્ય પાસવર્ડ. મહેરબાની કરીને ફરી પ્રયત્ન કરો. +password_ok=બરાબર + +printing_not_supported=ચેતવણી: છાપવાનું આ બ્રાઉઝર દ્દારા સંપૂર્ણપણે આધારભૂત નથી. +printing_not_ready=Warning: PDF એ છાપવા માટે સંપૂર્ણપણે લાવેલ છે. +web_fonts_disabled=વેબ ફોન્ટ નિષ્ક્રિય થયેલ છે: ઍમ્બેડ થયેલ PDF ફોન્ટને વાપરવાનું અસમર્થ. +document_colors_not_allowed=PDF દસ્તાવેજો તેનાં પોતાના રંગોને વાપરવા પરવાનગી આપતા નથી: 'તેનાં પોતાનાં રંગોને પસંદ કરવા માટે પાનાંને પરવાનગી આપો' બ્રાઉઝરમાં નિષ્ક્રિય થયેલ છે. diff --git a/src/cps/static/locale/he/viewer.properties b/src/cps/static/locale/he/viewer.properties new file mode 100644 index 0000000..ed8c1ce --- /dev/null +++ b/src/cps/static/locale/he/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=דף קודם +previous_label=קודם +next.title=דף הבא +next_label=הבא + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=דף +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=מתוך {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} מתוך {{pagesCount}}) + +zoom_out.title=התרחקות +zoom_out_label=התרחקות +zoom_in.title=התקרבות +zoom_in_label=התקרבות +zoom.title=מרחק מתצוגה +presentation_mode.title=מעבר למצב מצגת +presentation_mode_label=מצב מצגת +open_file.title=פתיחת קובץ +open_file_label=פתיחה +print.title=הדפסה +print_label=הדפסה +download.title=הורדה +download_label=הורדה +bookmark.title=תצוגה נוכחית (העתקה או פתיחה בחלון חדש) +bookmark_label=תצוגה נוכחית + +# Secondary toolbar and context menu +tools.title=כלים +tools_label=כלים +first_page.title=מעבר לעמוד הראשון +first_page.label=מעבר לעמוד הראשון +first_page_label=מעבר לעמוד הראשון +last_page.title=מעבר לעמוד האחרון +last_page.label=מעבר לעמוד האחרון +last_page_label=מעבר לעמוד האחרון +page_rotate_cw.title=הטיה עם כיוון השעון +page_rotate_cw.label=הטיה עם כיוון השעון +page_rotate_cw_label=הטיה עם כיוון השעון +page_rotate_ccw.title=הטיה כנגד כיוון השעון +page_rotate_ccw.label=הטיה כנגד כיוון השעון +page_rotate_ccw_label=הטיה כנגד כיוון השעון + +hand_tool_enable.title=הפעלת כלי היד +hand_tool_enable_label=הפעלת כלי היד +hand_tool_disable.title=נטרול כלי היד +hand_tool_disable_label=נטרול כלי היד + +# Document properties dialog box +document_properties.title=מאפייני מסמך… +document_properties_label=מאפייני מסמך… +document_properties_file_name=שם קובץ: +document_properties_file_size=גודל הקובץ: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} ק״ב ({{size_b}} בתים) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} מ״ב ({{size_b}} בתים) +document_properties_title=כותרת: +document_properties_author=מחבר: +document_properties_subject=נושא: +document_properties_keywords=מילות מפתח: +document_properties_creation_date=תאריך יצירה: +document_properties_modification_date=תאריך שינוי: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=יוצר: +document_properties_producer=יצרן PDF: +document_properties_version=גרסת PDF: +document_properties_page_count=מספר דפים: +document_properties_close=סגירה + +print_progress_message=מסמך בהכנה להדפסה… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=ביטול + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=הצגה/הסתרה של סרגל הצד +toggle_sidebar_label=הצגה/הסתרה של סרגל הצד +document_outline.title=הצגת מתאר מסמך (לחיצה כפולה כדי להרחיב או לצמצם את כל הפריטים) +document_outline_label=מתאר מסמך +attachments.title=הצגת צרופות +attachments_label=צרופות +thumbs.title=הצגת תצוגה מקדימה +thumbs_label=תצוגה מקדימה +findbar.title=חיפוש במסמך +findbar_label=חיפוש + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=עמוד {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=תצוגה מקדימה של עמוד {{page}} + +# Find panel button title and messages +find_label=חיפוש: +find_previous.title=חיפוש מופע קודם של הביטוי +find_previous_label=קודם +find_next.title=חיפוש המופע הבא של הביטוי +find_next_label=הבא +find_highlight=הדגשת הכול +find_match_case_label=התאמת אותיות +find_reached_top=הגיע לראש הדף, ממשיך מלמטה +find_reached_bottom=הגיע לסוף הדף, ממשיך מלמעלה +find_not_found=ביטוי לא נמצא + +# Error panel labels +error_more_info=מידע נוסף +error_less_info=פחות מידע +error_close=סגירה +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js גרסה {{version}} (בנייה: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=הודעה: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=תוכן מחסנית: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=קובץ: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=שורה: {{line}} +rendering_error=אירעה שגיאה בעת עיבוד הדף. + +# Predefined zoom values +page_scale_width=רוחב העמוד +page_scale_fit=התאמה לעמוד +page_scale_auto=מרחק מתצוגה אוטומטי +page_scale_actual=גודל אמתי +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=שגיאה +loading_error=אירעה שגיאה בעת טעינת ה־PDF. +invalid_file_error=קובץ PDF פגום או לא תקין. +missing_file_error=קובץ PDF חסר. +unexpected_response_error=תגובת שרת לא צפויה. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[הערת {{type}}] +password_label=נא להכניס את הססמה לפתיחת קובץ PDF זה. +password_invalid=ססמה שגויה. נא לנסות שנית. +password_ok=אישור +password_cancel=ביטול + +printing_not_supported=אזהרה: הדפסה אינה נתמכת במלואה בדפדפן זה. +printing_not_ready=אזהרה: ה־PDF לא ניתן לחלוטין עד מצב שמאפשר הדפסה. +web_fonts_disabled=גופני רשת מנוטרלים: לא ניתן להשתמש בגופני PDF מוטבעים. +document_colors_not_allowed=מסמכי PDF אינם מורשים להשתמש בצבעים משלהם: האפשרות „אפשר לעמודים לבחור צבעים משלהם” אינה פעילה בדפדפן. diff --git a/src/cps/static/locale/hi-IN/viewer.properties b/src/cps/static/locale/hi-IN/viewer.properties new file mode 100644 index 0000000..e5f6f97 --- /dev/null +++ b/src/cps/static/locale/hi-IN/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=पिछला पृष्ठ +previous_label=पिछला +next.title=अगला पृष्ठ +next_label=आगे + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=पृष्ठ: +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} का +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} of {{pagesCount}}) + +zoom_out.title=\u0020छोटा करें +zoom_out_label=\u0020छोटा करें +zoom_in.title=बड़ा करें +zoom_in_label=बड़ा करें +zoom.title=बड़ा-छोटा करें +presentation_mode.title=प्रस्तुति अवस्था में जाएँ +presentation_mode_label=\u0020प्रस्तुति अवस्था +open_file.title=फ़ाइल खोलें +open_file_label=\u0020खोलें +print.title=छापें +print_label=\u0020छापें +download.title=डाउनलोड +download_label=डाउनलोड +bookmark.title=मौजूदा दृश्य (नए विंडो में नक़ल लें या खोलें) +bookmark_label=\u0020मौजूदा दृश्य + +# Secondary toolbar and context menu +tools.title=औज़ार +tools_label=औज़ार +first_page.title=प्रथम पृष्ठ पर जाएँ +first_page.label=\u0020प्रथम पृष्ठ पर जाएँ +first_page_label=प्रथम पृष्ठ पर जाएँ +last_page.title=अंतिम पृष्ठ पर जाएँ +last_page.label=\u0020अंतिम पृष्ठ पर जाएँ +last_page_label=\u0020अंतिम पृष्ठ पर जाएँ +page_rotate_cw.title=घड़ी की दिशा में घुमाएँ +page_rotate_cw.label=घड़ी की दिशा में घुमाएँ +page_rotate_cw_label=घड़ी की दिशा में घुमाएँ +page_rotate_ccw.title=घड़ी की दिशा से उल्टा घुमाएँ +page_rotate_ccw.label=घड़ी की दिशा से उल्टा घुमाएँ +page_rotate_ccw_label=\u0020घड़ी की दिशा से उल्टा घुमाएँ + +hand_tool_enable.title=हाथ औजार सक्रिय करें +hand_tool_enable_label=हाथ औजार सक्रिय करें +hand_tool_disable.title=हाथ औजार निष्क्रिय करना +hand_tool_disable_label=हाथ औजार निष्क्रिय करना + +# Document properties dialog box +document_properties.title=दस्तावेज़ विशेषता... +document_properties_label=दस्तावेज़ विशेषता... +document_properties_file_name=फ़ाइल नाम: +document_properties_file_size=फाइल आकारः +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=शीर्षक: +document_properties_author=लेखकः +document_properties_subject=विषय: +document_properties_keywords=कुंजी-शब्द: +document_properties_creation_date=निर्माण दिनांक: +document_properties_modification_date=संशोधन दिनांक: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=निर्माता: +document_properties_producer=PDF उत्पादक: +document_properties_version=PDF संस्करण: +document_properties_page_count=पृष्ठ गिनती: +document_properties_close=बंद करें + +print_progress_message=छपाई के लिए दस्तावेज़ को तैयार किया जा रहा है... +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=रद्द करें + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=\u0020स्लाइडर टॉगल करें +toggle_sidebar_label=स्लाइडर टॉगल करें +document_outline.title=दस्तावेज़ की रूपरेखा दिखाइए (सारी वस्तुओं को फलने अथवा समेटने के लिए दो बार क्लिक करें) +document_outline_label=दस्तावेज़ आउटलाइन +attachments.title=संलग्नक दिखायें +attachments_label=संलग्नक +thumbs.title=लघुछवियाँ दिखाएँ +thumbs_label=लघु छवि +findbar.title=\u0020दस्तावेज़ में ढूँढ़ें +findbar_label=ढूँढ़ें + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=पृष्ठ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=पृष्ठ {{page}} की लघु-छवि + +# Find panel button title and messages +find_label=ढूंढें: +find_previous.title=वाक्यांश की पिछली उपस्थिति ढूँढ़ें +find_previous_label=पिछला +find_next.title=वाक्यांश की अगली उपस्थिति ढूँढ़ें +find_next_label=आगे +find_highlight=\u0020सभी आलोकित करें +find_match_case_label=मिलान स्थिति +find_reached_top=पृष्ठ के ऊपर पहुंच गया, नीचे से जारी रखें +find_reached_bottom=पृष्ठ के नीचे में जा पहुँचा, ऊपर से जारी +find_not_found=वाक्यांश नहीं मिला + +# Error panel labels +error_more_info=अधिक सूचना +error_less_info=कम सूचना +error_close=बंद करें +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=\u0020संदेश: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=स्टैक: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=फ़ाइल: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=पंक्ति: {{line}} +rendering_error=पृष्ठ रेंडरिंग के दौरान त्रुटि आई. + +# Predefined zoom values +page_scale_width=\u0020पृष्ठ चौड़ाई +page_scale_fit=पृष्ठ फिट +page_scale_auto=स्वचालित जूम +page_scale_actual=वास्तविक आकार +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=त्रुटि +loading_error=PDF लोड करते समय एक त्रुटि हुई. +invalid_file_error=अमान्य या भ्रष्ट PDF फ़ाइल. +missing_file_error=\u0020अनुपस्थित PDF फ़ाइल. +unexpected_response_error=अप्रत्याशित सर्वर प्रतिक्रिया. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=\u0020[{{type}} Annotation] +password_label=इस PDF फ़ाइल को खोलने के लिए कृपया कूटशब्द भरें. +password_invalid=अवैध कूटशब्द, कृपया फिर कोशिश करें. +password_ok=OK +password_cancel=रद्द करें + +printing_not_supported=चेतावनी: इस ब्राउज़र पर छपाई पूरी तरह से समर्थित नहीं है. +printing_not_ready=चेतावनी: PDF छपाई के लिए पूरी तरह से लोड नहीं है. +web_fonts_disabled=वेब फॉन्ट्स निष्क्रिय हैं: अंतःस्थापित PDF फॉन्टस के उपयोग में असमर्थ. +document_colors_not_allowed=PDF दस्तावेज़ उनके अपने रंग को उपयोग करने के लिए अनुमति प्राप्त नहीं है: "पृष्ठों को उनके अपने रंग को चुनने के लिए स्वीकृति दें" कि वह उस ब्राउज़र में निष्क्रिय है. diff --git a/src/cps/static/locale/hr/viewer.properties b/src/cps/static/locale/hr/viewer.properties new file mode 100644 index 0000000..6503d99 --- /dev/null +++ b/src/cps/static/locale/hr/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Prethodna stranica +previous_label=Prethodna +next.title=Sljedeća stranica +next_label=Sljedeća + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Stranica +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=od {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} od {{pagesCount}}) + +zoom_out.title=Uvećaj +zoom_out_label=Smanji +zoom_in.title=Uvećaj +zoom_in_label=Smanji +zoom.title=Uvećanje +presentation_mode.title=Prebaci u prezentacijski način rada +presentation_mode_label=Prezentacijski način rada +open_file.title=Otvori datoteku +open_file_label=Otvori +print.title=Ispis +print_label=Ispis +download.title=Preuzmi +download_label=Preuzmi +bookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru) +bookmark_label=Trenutni prikaz + +# Secondary toolbar and context menu +tools.title=Alati +tools_label=Alati +first_page.title=Idi na prvu stranicu +first_page.label=Idi na prvu stranicu +first_page_label=Idi na prvu stranicu +last_page.title=Idi na posljednju stranicu +last_page.label=Idi na posljednju stranicu +last_page_label=Idi na posljednju stranicu +page_rotate_cw.title=Rotiraj u smjeru kazaljke na satu +page_rotate_cw.label=Rotiraj u smjeru kazaljke na satu +page_rotate_cw_label=Rotiraj u smjeru kazaljke na satu +page_rotate_ccw.title=Rotiraj obrnutno od smjera kazaljke na satu +page_rotate_ccw.label=Rotiraj obrnutno od smjera kazaljke na satu +page_rotate_ccw_label=Rotiraj obrnutno od smjera kazaljke na satu + +hand_tool_enable.title=Omogući ručni alat +hand_tool_enable_label=Omogući ručni alat +hand_tool_disable.title=Onemogući ručni alat +hand_tool_disable_label=Onemogući ručni alat + +# Document properties dialog box +document_properties.title=Svojstva dokumenta... +document_properties_label=Svojstva dokumenta... +document_properties_file_name=Naziv datoteke: +document_properties_file_size=Veličina datoteke: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bajtova) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajtova) +document_properties_title=Naslov: +document_properties_author=Autor: +document_properties_subject=Predmet: +document_properties_keywords=Ključne riječi: +document_properties_creation_date=Datum stvaranja: +document_properties_modification_date=Datum promjene: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Stvaratelj: +document_properties_producer=PDF stvaratelj: +document_properties_version=PDF inačica: +document_properties_page_count=Broj stranica: +document_properties_close=Zatvori + +print_progress_message=Pripremanje dokumenta za ispis… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Odustani + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Prikaži/sakrij bočnu traku +toggle_sidebar_label=Prikaži/sakrij bočnu traku +document_outline.title=Prikaži obris dokumenta (dvostruki klik za proširivanje/skupljanje svih stavki) +document_outline_label=Obris dokumenta +attachments.title=Prikaži privitke +attachments_label=Privitci +thumbs.title=Prikaži sličice +thumbs_label=Sličice +findbar.title=Traži u dokumentu +findbar_label=Traži + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Stranica {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Sličica stranice {{page}} + +# Find panel button title and messages +find_label=Traži: +find_previous.title=Pronađi prethodno javljanje ovog izraza +find_previous_label=Prethodno +find_next.title=Pronađi iduće javljanje ovog izraza +find_next_label=Sljedeće +find_highlight=Istankni sve +find_match_case_label=Slučaj podudaranja +find_reached_top=Dosegnut vrh dokumenta, nastavak od dna +find_reached_bottom=Dosegnut vrh dokumenta, nastavak od vrha +find_not_found=Izraz nije pronađen + +# Error panel labels +error_more_info=Više informacija +error_less_info=Manje informacija +error_close=Zatvori +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Poruka: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stog: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Datoteka: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Redak: {{line}} +rendering_error=Došlo je do greške prilikom iscrtavanja stranice. + +# Predefined zoom values +page_scale_width=Širina stranice +page_scale_fit=Pristajanje stranici +page_scale_auto=Automatsko uvećanje +page_scale_actual=Prava veličina +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Greška +loading_error=Došlo je do greške pri učitavanju PDF-a. +invalid_file_error=Kriva ili oštećena PDF datoteka. +missing_file_error=Nedostaje PDF datoteka. +unexpected_response_error=Neočekivani odgovor poslužitelja. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Bilješka] +password_label=Upišite lozinku da biste otvorili ovu PDF datoteku. +password_invalid=Neispravna lozinka. Pokušajte ponovo. +password_ok=U redu +password_cancel=Odustani + +printing_not_supported=Upozorenje: Ispisivanje nije potpuno podržano u ovom pregledniku. +printing_not_ready=Upozorenje: PDF nije u potpunosti učitan za ispis. +web_fonts_disabled=Web fontovi su onemogućeni: nije moguće koristiti umetnute PDF fontove. +document_colors_not_allowed=PDF dokumenti nemaju dopuštene koristiti vlastite boje: opcija 'Dopusti stranicama da koriste vlastite boje' je deaktivirana. diff --git a/src/cps/static/locale/hu/viewer.properties b/src/cps/static/locale/hu/viewer.properties new file mode 100644 index 0000000..b244f41 --- /dev/null +++ b/src/cps/static/locale/hu/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Előző oldal +previous_label=Előző +next.title=Következő oldal +next_label=Tovább + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Oldal +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=összesen: {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} / {{pagesCount}}) + +zoom_out.title=Kicsinyítés +zoom_out_label=Kicsinyítés +zoom_in.title=Nagyítás +zoom_in_label=Nagyítás +zoom.title=Nagyítás +presentation_mode.title=Váltás bemutató módba +presentation_mode_label=Bemutató mód +open_file.title=Fájl megnyitása +open_file_label=Megnyitás +print.title=Nyomtatás +print_label=Nyomtatás +download.title=Letöltés +download_label=Letöltés +bookmark.title=Jelenlegi nézet (másolás vagy megnyitás új ablakban) +bookmark_label=Aktuális nézet + +# Secondary toolbar and context menu +tools.title=Eszközök +tools_label=Eszközök +first_page.title=Ugrás az első oldalra +first_page.label=Ugrás az első oldalra +first_page_label=Ugrás az első oldalra +last_page.title=Ugrás az utolsó oldalra +last_page.label=Ugrás az utolsó oldalra +last_page_label=Ugrás az utolsó oldalra +page_rotate_cw.title=Forgatás az óramutató járásával egyezően +page_rotate_cw.label=Forgatás az óramutató járásával egyezően +page_rotate_cw_label=Forgatás az óramutató járásával egyezően +page_rotate_ccw.title=Forgatás az óramutató járásával ellentétesen +page_rotate_ccw.label=Forgatás az óramutató járásával ellentétesen +page_rotate_ccw_label=Forgatás az óramutató járásával ellentétesen + +hand_tool_enable.title=Kéz eszköz bekapcsolása +hand_tool_enable_label=Kéz eszköz bekapcsolása +hand_tool_disable.title=Kéz eszköz kikapcsolása +hand_tool_disable_label=Kéz eszköz kikapcsolása + +# Document properties dialog box +document_properties.title=Dokumentum tulajdonságai… +document_properties_label=Dokumentum tulajdonságai… +document_properties_file_name=Fájlnév: +document_properties_file_size=Fájlméret: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bájt) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bájt) +document_properties_title=Cím: +document_properties_author=Szerző: +document_properties_subject=Tárgy: +document_properties_keywords=Kulcsszavak: +document_properties_creation_date=Létrehozás dátuma: +document_properties_modification_date=Módosítás dátuma: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Létrehozta: +document_properties_producer=PDF előállító: +document_properties_version=PDF verzió: +document_properties_page_count=Oldalszám: +document_properties_close=Bezárás + +print_progress_message=Dokumentum előkészítése nyomtatáshoz… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Mégse + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Oldalsáv be/ki +toggle_sidebar_label=Oldalsáv be/ki +document_outline.title=Dokumentum megjelenítése online (dupla kattintás minden elem kinyitásához/összecsukásához) +document_outline_label=Dokumentumvázlat +attachments.title=Mellékletek megjelenítése +attachments_label=Van melléklet +thumbs.title=Bélyegképek megjelenítése +thumbs_label=Bélyegképek +findbar.title=Keresés a dokumentumban +findbar_label=Keresés + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}}. oldal +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}}. oldal bélyegképe + +# Find panel button title and messages +find_label=Keresés: +find_previous.title=A kifejezés előző előfordulásának keresése +find_previous_label=Előző +find_next.title=A kifejezés következő előfordulásának keresése +find_next_label=Tovább +find_highlight=Összes kiemelése +find_match_case_label=Kis- és nagybetűk megkülönböztetése +find_reached_top=A dokumentum eleje elérve, folytatás a végétől +find_reached_bottom=A dokumentum vége elérve, folytatás az elejétől +find_not_found=A kifejezés nem található + +# Error panel labels +error_more_info=További tudnivalók +error_less_info=Kevesebb információ +error_close=Bezárás +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Üzenet: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Nyomkövetés: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fájl: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Sor: {{line}} +rendering_error=Hiba történt az oldal feldolgozása közben. + +# Predefined zoom values +page_scale_width=Oldalszélesség +page_scale_fit=Teljes oldal +page_scale_auto=Automatikus nagyítás +page_scale_actual=Valódi méret +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Hiba +loading_error=Hiba történt a PDF betöltésekor. +invalid_file_error=Érvénytelen vagy sérült PDF fájl. +missing_file_error=Hiányzó PDF fájl. +unexpected_response_error=Váratlan kiszolgálóválasz. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} megjegyzés] +password_label=Adja meg a jelszót a PDF fájl megnyitásához. +password_invalid=Helytelen jelszó. Próbálja újra. +password_ok=OK +password_cancel=Mégse + +printing_not_supported=Figyelmeztetés: Ez a böngésző nem teljesen támogatja a nyomtatást. +printing_not_ready=Figyelmeztetés: A PDF nincs teljesen betöltve a nyomtatáshoz. +web_fonts_disabled=Webes betűkészletek letiltva: nem használhatók a beágyazott PDF betűkészletek. +document_colors_not_allowed=A PDF dokumentumok nem használhatják saját színeiket: „Az oldalak a saját maguk által kiválasztott színeket használhatják” beállítás ki van kapcsolva a böngészőben. diff --git a/src/cps/static/locale/hy-AM/viewer.properties b/src/cps/static/locale/hy-AM/viewer.properties new file mode 100644 index 0000000..1c02974 --- /dev/null +++ b/src/cps/static/locale/hy-AM/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Նախորդ էջը +previous_label=Նախորդը +next.title=Հաջորդ էջը +next_label=Հաջորդը + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Էջ. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}}-ից\u0020 +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}}-ը {{pagesCount}})-ից + +zoom_out.title=Փոքրացնել +zoom_out_label=Փոքրացնել +zoom_in.title=Խոշորացնել +zoom_in_label=Խոշորացնել +zoom.title=Մասշտաբը\u0020 +presentation_mode.title=Անցնել Ներկայացման եղանակին +presentation_mode_label=Ներկայացման եղանակ +open_file.title=Բացել Ֆայլ +open_file_label=Բացել +print.title=Տպել +print_label=Տպել +download.title=Բեռնել +download_label=Բեռնել +bookmark.title=Ընթացիկ տեսքով (պատճենել կամ բացել նոր պատուհանում) +bookmark_label=Ընթացիկ տեսքը + +# Secondary toolbar and context menu +tools.title=Գործիքներ +tools_label=Գործիքներ +first_page.title=Անցնել առաջին էջին +first_page.label=Անցնել առաջին էջին +first_page_label=Անցնել առաջին էջին +last_page.title=Անցնել վերջին էջին +last_page.label=Անցնել վերջին էջին +last_page_label=Անցնել վերջին էջին +page_rotate_cw.title=Պտտել ըստ ժամացույցի սլաքի +page_rotate_cw.label=Պտտել ըստ ժամացույցի սլաքի +page_rotate_cw_label=Պտտել ըստ ժամացույցի սլաքի +page_rotate_ccw.title=Պտտել հակառակ ժամացույցի սլաքի +page_rotate_ccw.label=Պտտել հակառակ ժամացույցի սլաքի +page_rotate_ccw_label=Պտտել հակառակ ժամացույցի սլաքի + +hand_tool_enable.title=Միացնել ձեռքի գործիքը +hand_tool_enable_label=Միացնել ձեռքի գործիքը +hand_tool_disable.title=Անջատել ձեռքի գործիքը +hand_tool_disable_label=ԱՆջատել ձեռքի գործիքը + +# Document properties dialog box +document_properties.title=Փաստաթղթի հատկությունները... +document_properties_label=Փաստաթղթի հատկությունները... +document_properties_file_name=Ֆայլի անունը. +document_properties_file_size=Ֆայլի չափը. +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} ԿԲ ({{size_b}} բայթ) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} ՄԲ ({{size_b}} բայթ) +document_properties_title=Վերնագիր. +document_properties_author=Հեղինակ․ +document_properties_subject=Վերնագիր. +document_properties_keywords=Հիմնաբառ. +document_properties_creation_date=Ստեղծելու ամսաթիվը. +document_properties_modification_date=Փոփոխելու ամսաթիվը. +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Ստեղծող. +document_properties_producer=PDF-ի հեղինակը. +document_properties_version=PDF-ի տարբերակը. +document_properties_page_count=Էջերի քանակը. +document_properties_close=Փակել + +print_progress_message=Նախապատրաստում է փաստաթուղթը տպելուն... +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Չեղարկել + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Բացել/Փակել Կողային վահանակը +toggle_sidebar_label=Բացել/Փակել Կողային վահանակը +document_outline.title=Ցուցադրել փաստաթղթի ուրվագիծը (կրկնակի սեղմեք՝ միույթները ընդարձակելու/կոծկելու համար) +document_outline_label=Փաստաթղթի բովանդակությունը +attachments.title=Ցուցադրել կցորդները +attachments_label=Կցորդներ +thumbs.title=Ցուցադրել Մանրապատկերը +thumbs_label=Մանրապատկերը +findbar.title=Գտնել փաստաթղթում +findbar_label=Որոնում + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Էջը {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Էջի մանրապատկերը {{page}} + +# Find panel button title and messages +find_label=Գտնել` +find_previous.title=Գտնել անրահայտության նախորդ հանդիպումը +find_previous_label=Նախորդը +find_next.title=Գտիր արտահայտության հաջորդ հանդիպումը +find_next_label=Հաջորդը +find_highlight=Գունանշել բոլորը +find_match_case_label=Մեծ(փոքր)ատառ հաշվի առնել +find_reached_top=Հասել եք փաստաթղթի վերևին, կշարունակվի ներքևից +find_reached_bottom=Հասել եք փաստաթղթի վերջին, կշարունակվի վերևից +find_not_found=Արտահայտությունը չգտնվեց + +# Error panel labels +error_more_info=Ավելի շատ տեղեկություն +error_less_info=Քիչ տեղեկություն +error_close=Փակել +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (կառուցումը. {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Գրությունը. {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Շեղջ. {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Ֆայլ. {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Տողը. {{line}} +rendering_error=Սխալ՝ էջը ստեղծելիս: + +# Predefined zoom values +page_scale_width=Էջի լայնքը +page_scale_fit=Ձգել էջը +page_scale_auto=Ինքնաշխատ +page_scale_actual=Իրական չափը +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Սխալ +loading_error=Սխալ՝ PDF ֆայլը բացելիս։ +invalid_file_error=Սխալ կամ բնասված PDF ֆայլ: +missing_file_error=PDF ֆայլը բացակայում է: +unexpected_response_error=Սպասարկիչի անսպասելի պատասխան: + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Ծանոթություն] +password_label=Մուտքագրեք PDF-ի գաղտնաբառը: +password_invalid=Գաղտնաբառը սխալ է: Կրկին փորձեք: +password_ok=Լավ +password_cancel=Չեղարկել + +printing_not_supported=Զգուշացում. Տպելը ամբողջությամբ չի աջակցվում դիտարկիչի կողմից։ +printing_not_ready=Զգուշացում. PDF-ը ամբողջությամբ չի բեռնավորվել տպելու համար: +web_fonts_disabled=Վեբ-տառատեսակները անջատված են. հնարավոր չէ օգտագործել ներկառուցված PDF տառատեսակները: +document_colors_not_allowed=PDF փաստաթղթերին թույլատրված չէ օգտագործել իրենց սեփական գույները: “Թույլատրել էջերին ընտրել իրենց սեփական գույները“ ընտրանքը անջատված է դիտարկիչում: diff --git a/src/cps/static/locale/id/viewer.properties b/src/cps/static/locale/id/viewer.properties new file mode 100644 index 0000000..2641b87 --- /dev/null +++ b/src/cps/static/locale/id/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Laman Sebelumnya +previous_label=Sebelumnya +next.title=Laman Selanjutnya +next_label=Selanjutnya + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Halaman +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=dari {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} dari {{pagesCount}}) + +zoom_out.title=Perkecil +zoom_out_label=Perkecil +zoom_in.title=Perbesar +zoom_in_label=Perbesar +zoom.title=Perbesaran +presentation_mode.title=Ganti ke Mode Presentasi +presentation_mode_label=Mode Presentasi +open_file.title=Buka Berkas +open_file_label=Buka +print.title=Cetak +print_label=Cetak +download.title=Unduh +download_label=Unduh +bookmark.title=Tampilan Sekarang (salin atau buka di jendela baru) +bookmark_label=Tampilan Sekarang + +# Secondary toolbar and context menu +tools.title=Alat +tools_label=Alat +first_page.title=Buka Halaman Pertama +first_page.label=Ke Halaman Pertama +first_page_label=Buka Halaman Pertama +last_page.title=Buka Halaman Terakhir +last_page.label=Ke Halaman Terakhir +last_page_label=Buka Halaman Terakhir +page_rotate_cw.title=Putar Searah Jarum Jam +page_rotate_cw.label=Putar Searah Jarum Jam +page_rotate_cw_label=Putar Searah Jarum Jam +page_rotate_ccw.title=Putar Berlawanan Arah Jarum Jam +page_rotate_ccw.label=Putar Berlawanan Arah Jarum Jam +page_rotate_ccw_label=Putar Berlawanan Arah Jarum Jam + +hand_tool_enable.title=Aktifkan alat tangan +hand_tool_enable_label=Aktifkan alat tangan +hand_tool_disable.title=Nonaktifkan alat tangan +hand_tool_disable_label=Nonaktifkan alat tangan + +# Document properties dialog box +document_properties.title=Properti Dokumen… +document_properties_label=Properti Dokumen… +document_properties_file_name=Nama berkas: +document_properties_file_size=Ukuran berkas: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} byte) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} byte) +document_properties_title=Judul: +document_properties_author=Penyusun: +document_properties_subject=Subjek: +document_properties_keywords=Kata Kunci: +document_properties_creation_date=Tanggal Dibuat: +document_properties_modification_date=Tanggal Dimodifikasi: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Pembuat: +document_properties_producer=Pemroduksi PDF: +document_properties_version=Versi PDF: +document_properties_page_count=Jumlah Halaman: +document_properties_close=Tutup + +print_progress_message=Menyiapkan dokumen untuk pencetakan… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Batalkan + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Aktif/Nonaktifkan Bilah Samping +toggle_sidebar_label=Aktif/Nonaktifkan Bilah Samping +document_outline.title=Tampilkan Kerangka Dokumen (klik ganda untuk membentangkan/menciutkan semua item) +document_outline_label=Kerangka Dokumen +attachments.title=Tampilkan Lampiran +attachments_label=Lampiran +thumbs.title=Tampilkan Miniatur +thumbs_label=Miniatur +findbar.title=Temukan di Dokumen +findbar_label=Temukan + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Laman {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatur Laman {{page}} + +# Find panel button title and messages +find_label=Temukan: +find_previous.title=Temukan kata sebelumnya +find_previous_label=Sebelumnya +find_next.title=Temukan lebih lanjut +find_next_label=Selanjutnya +find_highlight=Sorot semuanya +find_match_case_label=Cocokkan BESAR/kecil +find_reached_top=Sampai di awal dokumen, dilanjutkan dari bawah +find_reached_bottom=Sampai di akhir dokumen, dilanjutkan dari atas +find_not_found=Frasa tidak ditemukan + +# Error panel labels +error_more_info=Lebih Banyak Informasi +error_less_info=Lebih Sedikit Informasi +error_close=Tutup +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Pesan: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Berkas: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Baris: {{line}} +rendering_error=Galat terjadi saat merender laman. + +# Predefined zoom values +page_scale_width=Lebar Laman +page_scale_fit=Muat Laman +page_scale_auto=Perbesaran Otomatis +page_scale_actual=Ukuran Asli +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Galat +loading_error=Galat terjadi saat memuat PDF. +invalid_file_error=Berkas PDF tidak valid atau rusak. +missing_file_error=Berkas PDF tidak ada. +unexpected_response_error=Balasan server yang tidak diharapkan. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotasi {{type}}] +password_label=Masukkan sandi untuk membuka berkas PDF ini. +password_invalid=Sandi tidak valid. Silakan coba lagi. +password_ok=Oke +password_cancel=Batal + +printing_not_supported=Peringatan: Pencetakan tidak didukung secara lengkap pada peramban ini. +printing_not_ready=Peringatan: Berkas PDF masih belum dimuat secara lengkap untuk dapat dicetak. +web_fonts_disabled=Font web dinonaktifkan: tidak dapat menggunakan font PDF yang tersemat. +document_colors_not_allowed=Dokumen PDF tidak diizinkan untuk menggunakan warnanya sendiri karena setelan 'Izinkan laman memilih warna sendiri' dinonaktifkan pada pengaturan. diff --git a/src/cps/static/locale/is/viewer.properties b/src/cps/static/locale/is/viewer.properties new file mode 100644 index 0000000..d80a182 --- /dev/null +++ b/src/cps/static/locale/is/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Fyrri síða +previous_label=Fyrri +next.title=Næsta síða +next_label=Næsti + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Síða +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=af {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} af {{pagesCount}}) + +zoom_out.title=Minnka +zoom_out_label=Minnka +zoom_in.title=Stækka +zoom_in_label=Stækka +zoom.title=Aðdráttur +presentation_mode.title=Skipta yfir á kynningarham +presentation_mode_label=Kynningarhamur +open_file.title=Opna skrá +open_file_label=Opna +print.title=Prenta +print_label=Prenta +download.title=Hala niður +download_label=Hala niður +bookmark.title=Núverandi sýn (afritaðu eða opnaðu í nýjum glugga) +bookmark_label=Núverandi sýn + +# Secondary toolbar and context menu +tools.title=Verkfæri +tools_label=Verkfæri +first_page.title=Fara á fyrstu síðu +first_page.label=Fara á fyrstu síðu +first_page_label=Fara á fyrstu síðu +last_page.title=Fara á síðustu síðu +last_page.label=Fara á síðustu síðu +last_page_label=Fara á síðustu síðu +page_rotate_cw.title=Snúa réttsælis +page_rotate_cw.label=Snúa réttsælis +page_rotate_cw_label=Snúa réttsælis +page_rotate_ccw.title=Snúa rangsælis +page_rotate_ccw.label=Snúa rangsælis +page_rotate_ccw_label=Snúa rangsælis + +hand_tool_enable.title=Virkja handarverkfæri +hand_tool_enable_label=Virkja handarverkfæri +hand_tool_disable.title=Gera handarverkfæri óvirkt +hand_tool_disable_label=Gera handarverkfæri óvirkt + +# Document properties dialog box +document_properties.title=Eiginleikar skjals… +document_properties_label=Eiginleikar skjals… +document_properties_file_name=Skráarnafn: +document_properties_file_size=Skrárstærð: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titill: +document_properties_author=Hönnuður: +document_properties_subject=Efni: +document_properties_keywords=Stikkorð: +document_properties_creation_date=Búið til: +document_properties_modification_date=Dags breytingar: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Höfundur: +document_properties_producer=PDF framleiðandi: +document_properties_version=PDF útgáfa: +document_properties_page_count=Blaðsíðufjöldi: +document_properties_close=Loka + +print_progress_message=Undirbý skjal fyrir prentun… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Hætta við + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Víxla hliðslá +toggle_sidebar_label=Víxla hliðslá +document_outline.title=Sýna yfirlit skjals (tvísmelltu til að opna/loka öllum hlutum) +document_outline_label=Efnisskipan skjals +attachments.title=Sýna viðhengi +attachments_label=Viðhengi +thumbs.title=Sýna smámyndir +thumbs_label=Smámyndir +findbar.title=Leita í skjali +findbar_label=Leita + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Síða {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Smámynd af síðu {{page}} + +# Find panel button title and messages +find_label=Leita: +find_previous.title=Leita að fyrra tilfelli þessara orða +find_previous_label=Fyrri +find_next.title=Leita að næsta tilfelli þessara orða +find_next_label=Næsti +find_highlight=Lita allt +find_match_case_label=Passa við stafstöðu +find_reached_top=Náði efst í skjal, held áfram neðst +find_reached_bottom=Náði enda skjals, held áfram efst +find_not_found=Fann ekki orðið + +# Error panel labels +error_more_info=Meiri upplýsingar +error_less_info=Minni upplýsingar +error_close=Loka +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Skilaboð: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stafli: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Skrá: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Lína: {{line}} +rendering_error=Upp kom villa við að birta síðuna. + +# Predefined zoom values +page_scale_width=Síðubreidd +page_scale_fit=Passa á síðu +page_scale_auto=Sjálfvirkur aðdráttur +page_scale_actual=Raunstærð +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Villa +loading_error=Villa kom upp við að hlaða inn PDF. +invalid_file_error=Ógild eða skemmd PDF skrá. +missing_file_error=Vantar PDF skrá. +unexpected_response_error=Óvænt svar frá netþjóni. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Skýring] +password_label=Sláðu inn lykilorð til að opna þessa PDF skrá. +password_invalid=Ógilt lykilorð. Reyndu aftur. +password_ok=Í lagi +password_cancel=Hætta við + +printing_not_supported=Aðvörun: Prentun er ekki með fyllilegan stuðning á þessum vafra. +printing_not_ready=Aðvörun: Ekki er búið að hlaða inn allri PDF skránni fyrir prentun. +web_fonts_disabled=Vef leturgerðir eru óvirkar: get ekki notað innbyggðar PDF leturgerðir. +document_colors_not_allowed=PDF skjöl hafa ekki leyfi til að nota sína eigin liti: “Leyfa síðum að velja eigin liti” er óvirkt í vafranum. diff --git a/src/cps/static/locale/it/viewer.properties b/src/cps/static/locale/it/viewer.properties new file mode 100644 index 0000000..df6375f --- /dev/null +++ b/src/cps/static/locale/it/viewer.properties @@ -0,0 +1,115 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +previous.title = Pagina precedente +previous_label = Precedente +next.title = Pagina successiva +next_label = Successiva +page.title = Pagina +of_pages = di {{pagesCount}} +page_of_pages = ({{pageNumber}} di {{pagesCount}}) +zoom_out.title = Riduci zoom +zoom_out_label = Riduci zoom +zoom_in.title = Aumenta zoom +zoom_in_label = Aumenta zoom +zoom.title = Zoom +presentation_mode.title = Passa alla modalità presentazione +presentation_mode_label = Modalità presentazione +open_file.title = Apri file +open_file_label = Apri +print.title = Stampa +print_label = Stampa +download.title = Scarica questo documento +download_label = Download +bookmark.title = Visualizzazione corrente (copia o apri in una nuova finestra) +bookmark_label = Visualizzazione corrente +tools.title = Strumenti +tools_label = Strumenti +first_page.title = Vai alla prima pagina +first_page.label = Vai alla prima pagina +first_page_label = Vai alla prima pagina +last_page.title = Vai all’ultima pagina +last_page.label = Vai all’ultima pagina +last_page_label = Vai all’ultima pagina +page_rotate_cw.title = Ruota in senso orario +page_rotate_cw.label = Ruota in senso orario +page_rotate_cw_label = Ruota in senso orario +page_rotate_ccw.title = Ruota in senso antiorario +page_rotate_ccw.label = Ruota in senso antiorario +page_rotate_ccw_label = Ruota in senso antiorario +hand_tool_enable.title = Attiva strumento mano +hand_tool_enable_label = Attiva strumento mano +hand_tool_disable.title = Disattiva strumento mano +hand_tool_disable_label = Disattiva strumento mano +document_properties.title = Proprietà del documento… +document_properties_label = Proprietà del documento… +document_properties_file_name = Nome file: +document_properties_file_size = Dimensione file: +document_properties_kb = {{size_kb}} kB ({{size_b}} byte) +document_properties_mb = {{size_mb}} MB ({{size_b}} byte) +document_properties_title = Titolo: +document_properties_author = Autore: +document_properties_subject = Oggetto: +document_properties_keywords = Parole chiave: +document_properties_creation_date = Data creazione: +document_properties_modification_date = Data modifica: +document_properties_date_string = {{date}}, {{time}} +document_properties_creator = Autore originale: +document_properties_producer = Produttore PDF: +document_properties_version = Versione PDF: +document_properties_page_count = Conteggio pagine: +document_properties_close = Chiudi +print_progress_message = Preparazione documento per la stampa… +print_progress_percent = {{progress}}% +print_progress_close = Annulla +toggle_sidebar.title = Attiva/disattiva barra laterale +toggle_sidebar_label = Attiva/disattiva barra laterale +document_outline.title = Visualizza la struttura del documento (doppio clic per visualizzare/nascondere tutti gli elementi) +document_outline_label = Struttura documento +attachments.title = Visualizza allegati +attachments_label = Allegati +thumbs.title = Mostra le miniature +thumbs_label = Miniature +findbar.title = Trova nel documento +findbar_label = Trova +thumb_page_title = Pagina {{page}} +thumb_page_canvas = Miniatura della pagina {{page}} +find_label = Trova: +find_previous.title = Trova l’occorrenza precedente del testo da cercare +find_previous_label = Precedente +find_next.title = Trova l’occorrenza successiva del testo da cercare +find_next_label = Successivo +find_highlight = Evidenzia +find_match_case_label = Maiuscole/minuscole +find_reached_top = Raggiunto l’inizio della pagina, continua dalla fine +find_reached_bottom = Raggiunta la fine della pagina, continua dall’inizio +find_not_found = Testo non trovato +error_more_info = Ulteriori informazioni +error_less_info = Nascondi dettagli +error_close = Chiudi +error_version_info = PDF.js v{{version}} (build: {{build}}) +error_message = Messaggio: {{message}} +error_stack = Stack: {{stack}} +error_file = File: {{file}} +error_line = Riga: {{line}} +rendering_error = Si è verificato un errore durante il rendering della pagina. +page_scale_width = Larghezza pagina +page_scale_fit = Adatta a una pagina +page_scale_auto = Zoom automatico +page_scale_actual = Dimensioni effettive +page_scale_percent = {{scale}}% +loading_error_indicator = Errore +loading_error = Si è verificato un errore durante il caricamento del PDF. +invalid_file_error = File PDF non valido o danneggiato. +missing_file_error = File PDF non disponibile. +unexpected_response_error = Risposta imprevista del server +text_annotation_type.alt = [Annotazione: {{type}}] +password_label = Inserire la password per aprire questo file PDF. +password_invalid = Password non corretta. Riprovare. +password_ok = OK +password_cancel = Annulla +printing_not_supported = Attenzione: la stampa non è completamente supportata da questo browser. +printing_not_ready = Attenzione: il PDF non è ancora stato caricato completamente per la stampa. +web_fonts_disabled = I web font risultano disattivati: impossibile utilizzare i caratteri inclusi nel PDF. +document_colors_not_allowed = Non è possibile visualizzare i colori originali definiti nel file PDF: l’opzione del browser “Consenti alle pagine di scegliere i propri colori invece di quelli impostati” è disattivata. diff --git a/src/cps/static/locale/ja/viewer.properties b/src/cps/static/locale/ja/viewer.properties new file mode 100644 index 0000000..5d022ae --- /dev/null +++ b/src/cps/static/locale/ja/viewer.properties @@ -0,0 +1,167 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=前のページへ戻ります +previous_label=前へ +next.title=次のページへ進みます +next_label=次へ + +# LOCALIZATION NOTE (page_label, page_of): +# These strings are concatenated to form the "Page: X of Y" string. +# Do not translate "{{pageCount}}", it will be substituted with a number +# representing the total number of pages. +page_label=ページ: +page_of=/ {{pageCount}} + +zoom_out.title=表示を縮小します +zoom_out_label=縮小 +zoom_in.title=表示を拡大します +zoom_in_label=拡大 +zoom.title=拡大/縮小 +presentation_mode.title=プレゼンテーションモードに切り替えます +presentation_mode_label=プレゼンテーションモード +open_file.title=ファイルを指定して開きます +open_file_label=開く +print.title=印刷します +print_label=印刷 +download.title=ダウンロードします +download_label=ダウンロード +bookmark.title=現在のビューの URL です (コピーまたは新しいウィンドウに開く) +bookmark_label=現在のビュー + +# Secondary toolbar and context menu +tools.title=ツール +tools_label=ツール +first_page.title=最初のページへ移動します +first_page.label=最初のページへ移動 +first_page_label=最初のページへ移動 +last_page.title=最後のページへ移動します +last_page.label=最後のページへ移動 +last_page_label=最後のページへ移動 +page_rotate_cw.title=ページを右へ回転します +page_rotate_cw.label=右回転 +page_rotate_cw_label=右回転 +page_rotate_ccw.title=ページを左へ回転します +page_rotate_ccw.label=左回転 +page_rotate_ccw_label=左回転 + +hand_tool_enable.title=手のひらツールを有効にします +hand_tool_enable_label=手のひらツールを有効にする +hand_tool_disable.title=手のひらツールを無効にします +hand_tool_disable_label=手のひらツールを無効にする + +# Document properties dialog box +document_properties.title=文書のプロパティ... +document_properties_label=文書のプロパティ... +document_properties_file_name=ファイル名: +document_properties_file_size=ファイルサイズ: +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=タイトル: +document_properties_author=作成者: +document_properties_subject=件名: +document_properties_keywords=キーワード: +document_properties_creation_date=作成日: +document_properties_modification_date=更新日: +document_properties_date_string={{date}}, {{time}} +document_properties_creator=アプリケーション: +document_properties_producer=PDF 作成: +document_properties_version=PDF のバージョン: +document_properties_page_count=ページ数: +document_properties_close=閉じる + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=サイドバー表示を切り替えます +toggle_sidebar_label=サイドバーの切り替え +outline.title=文書の目次を表示します +outline_label=文書の目次 +attachments.title=添付ファイルを表示します +attachments_label=添付ファイル +thumbs.title=縮小版を表示します +thumbs_label=縮小版 +findbar.title=文書内を検索します +findbar_label=検索 + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}} ページ +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=ページの縮小版 {{page}} + +# Find panel button title and messages +find_label=検索: +find_previous.title=指定文字列に一致する 1 つ前の部分を検索します +find_previous_label=前へ +find_next.title=指定文字列に一致する次の部分を検索します +find_next_label=次へ +find_highlight=すべて強調表示 +find_match_case_label=大文字/小文字を区別 +find_reached_top=文書先頭に到達したので末尾に戻って検索しました。 +find_reached_bottom=文書末尾に到達したので先頭に戻って検索しました。 +find_not_found=見つかりませんでした。 + +# Error panel labels +error_more_info=詳細情報 +error_less_info=詳細情報の非表示 +error_close=閉じる +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (ビルド: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=メッセージ: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=スタック: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ファイル: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=行: {{line}} +rendering_error=ページのレンダリング中にエラーが発生しました + +# Predefined zoom values +page_scale_width=幅に合わせる +page_scale_fit=ページのサイズに合わせる +page_scale_auto=自動ズーム +page_scale_actual=実際のサイズ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=エラー +loading_error=PDF の読み込み中にエラーが発生しました +invalid_file_error=無効または破損した PDF ファイル +missing_file_error=PDF ファイルが見つかりません。 +unexpected_response_error=サーバーから予期せぬ応答がありました。 + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} 注釈] +password_label=この PDF ファイルを開くためのパスワードを入力してください。 +password_invalid=無効なパスワードです。もう一度やり直してください。 +password_ok=OK +password_cancel=キャンセル + +printing_not_supported=警告: このブラウザーでは印刷が完全にサポートされていません +printing_not_ready=警告: PDF を印刷するための読み込みが終了していません +web_fonts_disabled=ウェブフォントが無効になっています: 埋め込まれた PDF のフォントを使用できません +document_colors_not_allowed=PDF 文書は、ウェブページが指定した配色を使用することができません: 'ウェブページが指定した配色' はブラウザーで無効になっています。 diff --git a/src/cps/static/locale/ka/viewer.properties b/src/cps/static/locale/ka/viewer.properties new file mode 100644 index 0000000..ee3391e --- /dev/null +++ b/src/cps/static/locale/ka/viewer.properties @@ -0,0 +1,174 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=წინა გვერდი +previous_label=წინა +next.title=შემდეგი გვერდი +next_label=შემდეგი + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=დაშორება +zoom_out_label=დაშორება +zoom_in.title=მიახლოება +zoom_in_label=მიახლოება +zoom.title=მასშტაბი +presentation_mode.title=პრეზენტაციის რეჟიმზე გადართვა +presentation_mode_label=პრეზენტაციის რეჟიმი +open_file.title=ფაილის გახსნა +open_file_label=გახსნა +print.title=დაბეჭდვა +print_label=დაბეჭდვა +download.title=ჩამოტვირთვა +download_label=ჩამოტვირთვა +bookmark.title=მიმდინარე ხედი (კოპირება ან გახსნა ახალ ფანჯარაში) +bookmark_label=მიმდინარე ხედი + +# Secondary toolbar and context menu +tools.title=ხელსაწყოები +tools_label=ხელსაწყოები +first_page.title=პირველ გვერდზე გადასვლა +first_page.label=პირველ გვერდზე გადასვლა +first_page_label=პირველ გვერდზე გადასვლა +last_page.title=ბოლო გვერდზე გადასვლა +last_page.label=ბოლო გვერდზე გადასვლა +last_page_label=ბოლო გვერდზე გადასვლა +page_rotate_cw.title=ისრის მიმართულებით შებრუნება +page_rotate_cw.label=ისრის მიმართულებით შებრუნება +page_rotate_cw_label=ისრის მიმართულებით შებრუნება +page_rotate_ccw.title=ისრის საპირისპიროდ შებრუნება +page_rotate_ccw.label=ისრის საპირისპიროდ შებრუნება +page_rotate_ccw_label=ისრის საპირისპიროდ შებრუნება + +hand_tool_enable.title=ხელის ხელსაწყოს ჩართვა +hand_tool_enable_label=ხელის ხელსაწყოს ჩართვა +hand_tool_disable.title=ხელის ხელსაწყოს გამორთვა +hand_tool_disable_label=ხელის ხელსაწყოს გამორთვა + +# Document properties dialog box +document_properties.title=დოკუმენტის თვისებები… +document_properties_label=დოკუმენტის თვისებები… +document_properties_file_name=ფაილის სახელი: +document_properties_file_size=ფაილის ზომა: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} კბ ({{size_b}} ბაიტი) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} მბ ({{size_b}} ბაიტი) +document_properties_title=სათაური: +document_properties_author=ავტორი: +document_properties_subject=თემა: +document_properties_keywords=საკვანძო სიტყვები: +document_properties_creation_date=შექმნის თარიღი: +document_properties_modification_date=სახეცვალების თარიღი: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=შემქმნელი: +document_properties_producer=PDF მწარმოებელი: +document_properties_version=PDF ვერსია: +document_properties_page_count=გვერდების რაოდენობა: +document_properties_close=დახურვა + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=გვერდითა ზოლის ბერკეტი +toggle_sidebar_label=გვერდითა ზოლის ბერკეტი +attachments.title=დანართების ჩვენება +attachments_label=დანართები +thumbs.title=ესკიზების ჩვენება +thumbs_label=ესკიზები +findbar.title=პოვნა დოკუმენტში +findbar_label=პოვნა + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=გვერდი {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=გვერდის ესკიზი {{page}} + +# Find panel button title and messages +find_label=პოვნა: +find_previous.title=ფრაზის წინა კონტექსტის პოვნა +find_previous_label=წინა +find_next.title=ფრაზის შემდეგი კონტექსტის პოვნა +find_next_label=შემდეგი +find_highlight=ყველას მონიშვნა +find_match_case_label=მთავრულის გათვალისწინება +find_reached_top=მიღწეულია დოკუმენტის უმაღლესი წერტილი, გრძელდება ქვემოდან +find_reached_bottom=მიღწეულია დოკუმენტის ბოლი, გრძელდება ზემოდან +find_not_found=კონტექსტი ვერ მოიძებნა + +# Error panel labels +error_more_info=დამატებითი ინფორმაცია +error_less_info=ნაკლები ინფორმაცია +error_close=დახურვა +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=შეტყობინება: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=სტეკი: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ფაილი: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=ხაზი: {{line}} +rendering_error=გვერდის რენდერისას დაფიქსირდა შეცდომა. + +# Predefined zoom values +page_scale_width=გვერდის სიგანე +page_scale_fit=გვერდის მორგება +page_scale_auto=ავტომატური მასშტაბი +page_scale_actual=აქტუალური ზომა +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=შეცდომა +loading_error=PDF-ის ჩატვირთვისას დაფიქსირდა შეცდომა. +invalid_file_error=არამართებული ან დაზიანებული PDF ფაილი. +missing_file_error=ნაკლული PDF ფაილი. +unexpected_response_error=სერვერის მოულოდნელი პასუხი. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} ანოტაცია] +password_label=შეიყვანეთ პაროლი, რათა გახსნათ ეს PDF ფაილი. +password_invalid=არასწორი პაროლი. გთხოვთ, სცადეთ ხელახლა. +password_ok=კარგი +password_cancel=გაუქმება + +printing_not_supported=გაფრთხილება: ამ ბრაუზერის მიერ დაბეჭდვა ბოლომდე მხარდაჭერილი არაა. +printing_not_ready=გაფრთხილება: PDF ამობეჭდვისთვის ბოლომდე ჩატვირთული არაა. +web_fonts_disabled=ვებ-შრიფტები გამორთულია: ჩაშენებული PDF შრიფტების გამოყენება ვერ ხერხდება. +document_colors_not_allowed=PDF დოკუმენტებს არ აქვთ საკუთარი ფერების გამოყენების უფლება: ბრაუზერში გამორთულია "გვერდებისთვის საკუთარი ფერების გამოყენების უფლება". diff --git a/src/cps/static/locale/kk/viewer.properties b/src/cps/static/locale/kk/viewer.properties new file mode 100644 index 0000000..9860ce2 --- /dev/null +++ b/src/cps/static/locale/kk/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Алдыңғы парақ +previous_label=Алдыңғысы +next.title=Келесі парақ +next_label=Келесі + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Парақ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} ішінен +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=(парақ {{pageNumber}}, {{pagesCount}} ішінен) + +zoom_out.title=Кішірейту +zoom_out_label=Кішірейту +zoom_in.title=Үлкейту +zoom_in_label=Үлкейту +zoom.title=Масштаб +presentation_mode.title=Презентация режиміне ауысу +presentation_mode_label=Презентация режимі +open_file.title=Файлды ашу +open_file_label=Ашу +print.title=Баспаға шығару +print_label=Баспаға шығару +download.title=Жүктеп алу +download_label=Жүктеп алу +bookmark.title=Ағымдағы көрініс (көшіру не жаңа терезеде ашу) +bookmark_label=Ағымдағы көрініс + +# Secondary toolbar and context menu +tools.title=Саймандар +tools_label=Саймандар +first_page.title=Алғашқы параққа өту +first_page.label=Алғашқы параққа өту +first_page_label=Алғашқы параққа өту +last_page.title=Соңғы параққа өту +last_page.label=Соңғы параққа өту +last_page_label=Соңғы параққа өту +page_rotate_cw.title=Сағат тілі бағытымен айналдыру +page_rotate_cw.label=Сағат тілі бағытымен бұру +page_rotate_cw_label=Сағат тілі бағытымен бұру +page_rotate_ccw.title=Сағат тілі бағытына қарсы бұру +page_rotate_ccw.label=Сағат тілі бағытына қарсы бұру +page_rotate_ccw_label=Сағат тілі бағытына қарсы бұру + +hand_tool_enable.title=Қол сайманын іске қосу +hand_tool_enable_label=Қол сайманын іске қосу +hand_tool_disable.title=Қол сайманын сөндіру +hand_tool_disable_label=Қол сайманын сөндіру + +# Document properties dialog box +document_properties.title=Құжат қасиеттері… +document_properties_label=Құжат қасиеттері… +document_properties_file_name=Файл аты: +document_properties_file_size=Файл өлшемі: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} КБ ({{size_b}} байт) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} МБ ({{size_b}} байт) +document_properties_title=Тақырыбы... +document_properties_author=Авторы: +document_properties_subject=Тақырыбы: +document_properties_keywords=Кілт сөздер: +document_properties_creation_date=Жасалған күні: +document_properties_modification_date=Түзету күні: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Жасаған: +document_properties_producer=PDF өндірген: +document_properties_version=PDF нұсқасы: +document_properties_page_count=Беттер саны: +document_properties_close=Жабу + +print_progress_message=Құжатты баспаға шығару үшін дайындау… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Бас тарту + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Бүйір панелін көрсету/жасыру +toggle_sidebar_label=Бүйір панелін көрсету/жасыру +document_outline.title=Құжат құрылымын көрсету (барлық нәрселерді жазық қылу/жинау үшін қос шерту керек) +document_outline_label=Құжат құрамасы +attachments.title=Салынымдарды көрсету +attachments_label=Салынымдар +thumbs.title=Кіші көріністерді көрсету +thumbs_label=Кіші көріністер +findbar.title=Құжаттан табу +findbar_label=Табу + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}} парағы +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} парағы үшін кіші көрінісі + +# Find panel button title and messages +find_label=Табу: +find_previous.title=Осы сөздердің мәтіннен алдыңғы кездесуін табу +find_previous_label=Алдыңғысы +find_next.title=Осы сөздердің мәтіннен келесі кездесуін табу +find_next_label=Келесі +find_highlight=Барлығын түспен ерекшелеу +find_match_case_label=Регистрді ескеру +find_reached_top=Құжаттың басына жеттік, соңынан бастап жалғастырамыз +find_reached_bottom=Құжаттың соңына жеттік, басынан бастап жалғастырамыз +find_not_found=Сөз(дер) табылмады + +# Error panel labels +error_more_info=Көбірек ақпарат +error_less_info=Азырақ ақпарат +error_close=Жабу +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (жинақ: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Хабарлама: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Стек: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Файл: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Жол: {{line}} +rendering_error=Парақты өңдеу кезінде қате кетті. + +# Predefined zoom values +page_scale_width=Парақ ені +page_scale_fit=Парақты сыйдыру +page_scale_auto=Автомасштабтау +page_scale_actual=Нақты өлшемі +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Қате +loading_error=PDF жүктеу кезінде қате кетті. +invalid_file_error=Зақымдалған немесе қате PDF файл. +missing_file_error=PDF файлы жоқ. +unexpected_response_error=Сервердің күтпеген жауабы. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} аңдатпасы] +password_label=Бұл PDF файлын ашу үшін парольді енгізіңіз. +password_invalid=Пароль дұрыс емес. Қайталап көріңіз. +password_ok=ОК +password_cancel=Бас тарту + +printing_not_supported=Ескерту: Баспаға шығаруды бұл браузер толығымен қолдамайды. +printing_not_ready=Ескерту: Баспаға шығару үшін, бұл PDF толығымен жүктеліп алынбады. +web_fonts_disabled=Веб қаріптері сөндірілген: құрамына енгізілген PDF қаріптерін қолдану мүмкін емес. +document_colors_not_allowed=PDF құжаттарына өздік түстерді қолдану рұқсат етілмеген: бұл браузерде 'Веб-сайттарға өздерінің түстерін қолдануға рұқсат беру' мүмкіндігі сөндірулі тұр. diff --git a/src/cps/static/locale/km/viewer.properties b/src/cps/static/locale/km/viewer.properties new file mode 100644 index 0000000..9010963 --- /dev/null +++ b/src/cps/static/locale/km/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=ទំព័រ​មុន +previous_label=មុន +next.title=ទំព័រ​បន្ទាប់ +next_label=បន្ទាប់ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=ទំព័រ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=នៃ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} នៃ {{pagesCount}}) + +zoom_out.title=​បង្រួម +zoom_out_label=​បង្រួម +zoom_in.title=​ពង្រីក +zoom_in_label=​ពង្រីក +zoom.title=ពង្រីក +presentation_mode.title=ប្ដូរ​ទៅ​របៀប​បទ​បង្ហាញ +presentation_mode_label=របៀប​បទ​បង្ហាញ +open_file.title=បើក​ឯកសារ +open_file_label=បើក +print.title=បោះពុម្ព +print_label=បោះពុម្ព +download.title=ទាញ​យក +download_label=ទាញ​យក +bookmark.title=ទិដ្ឋភាព​បច្ចុប្បន្ន (ចម្លង ឬ​បើក​នៅ​ក្នុង​បង្អួច​ថ្មី) +bookmark_label=ទិដ្ឋភាព​បច្ចុប្បន្ន + +# Secondary toolbar and context menu +tools.title=ឧបករណ៍ +tools_label=ឧបករណ៍ +first_page.title=ទៅកាន់​ទំព័រ​ដំបូង​ +first_page.label=ទៅកាន់​ទំព័រ​ដំបូង​ +first_page_label=ទៅកាន់​ទំព័រ​ដំបូង​ +last_page.title=ទៅកាន់​ទំព័រ​ចុងក្រោយ​ +last_page.label=ទៅកាន់​ទំព័រ​ចុងក្រោយ​ +last_page_label=ទៅកាន់​ទំព័រ​ចុងក្រោយ +page_rotate_cw.title=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា +page_rotate_cw.label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា +page_rotate_cw_label=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា +page_rotate_ccw.title=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​ +page_rotate_ccw.label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​ +page_rotate_ccw_label=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា​​ + +hand_tool_enable.title=បើក​ឧបករណ៍​ដោយ​ដៃ +hand_tool_enable_label=បើក​ឧបករណ៍​ដោយ​ដៃ +hand_tool_disable.title=បិទ​ឧបករណ៍​ប្រើ​ដៃ +hand_tool_disable_label=បិទ​ឧបករណ៍​ប្រើ​ដៃ + +# Document properties dialog box +document_properties.title=លក្ខណ​សម្បត្តិ​ឯកសារ… +document_properties_label=លក្ខណ​សម្បត្តិ​ឯកសារ… +document_properties_file_name=ឈ្មោះ​ឯកសារ៖ +document_properties_file_size=ទំហំ​ឯកសារ៖ +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=ចំណងជើង៖ +document_properties_author=អ្នក​និពន្ធ៖ +document_properties_subject=ប្រធានបទ៖ +document_properties_keywords=ពាក្យ​គន្លឹះ៖ +document_properties_creation_date=កាលបរិច្ឆេទ​បង្កើត៖ +document_properties_modification_date=កាលបរិច្ឆេទ​កែប្រែ៖ +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=អ្នក​បង្កើត៖ +document_properties_producer=កម្មវិធី​បង្កើត PDF ៖ +document_properties_version=កំណែ PDF ៖ +document_properties_page_count=ចំនួន​ទំព័រ៖ +document_properties_close=បិទ + +print_progress_message=កំពុង​រៀបចំ​ឯកសារ​សម្រាប់​បោះពុម្ព… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=បោះបង់ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=បិទ/បើក​គ្រាប់​រំកិល +toggle_sidebar_label=បិទ/បើក​គ្រាប់​រំកិល +document_outline.title=បង្ហាញ​គ្រោង​ឯកសារ (ចុច​ទ្វេ​ដង​ដើម្បី​ពង្រីក/បង្រួម​ធាតុ​ទាំងអស់) +document_outline_label=គ្រោង​ឯកសារ +attachments.title=បង្ហាញ​ឯកសារ​ភ្ជាប់ +attachments_label=ឯកសារ​ភ្ជាប់ +thumbs.title=បង្ហាញ​រូបភាព​តូចៗ +thumbs_label=រួបភាព​តូចៗ +findbar.title=រក​នៅ​ក្នុង​ឯកសារ +findbar_label=រក + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=ទំព័រ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=រូបភាព​តូច​របស់​ទំព័រ {{page}} + +# Find panel button title and messages +find_label=រក ៖ +find_previous.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​មុន +find_previous_label=មុន +find_next.title=រក​ពាក្យ ឬ​ឃ្លា​ដែល​បាន​ជួប​បន្ទាប់ +find_next_label=បន្ទាប់ +find_highlight=បន្លិច​ទាំងអស់ +find_match_case_label=ករណី​ដំណូច +find_reached_top=បាន​បន្ត​ពី​ខាង​ក្រោម ទៅ​ដល់​ខាង​​លើ​នៃ​ឯកសារ +find_reached_bottom=បាន​បន្ត​ពី​ខាងលើ ទៅដល់​ចុង​​នៃ​ឯកសារ +find_not_found=រក​មិន​ឃើញ​ពាក្យ ឬ​ឃ្លា + +# Error panel labels +error_more_info=ព័ត៌មាន​បន្ថែម +error_less_info=ព័ត៌មាន​តិចតួច +error_close=បិទ +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=សារ ៖ {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=ជង់ ៖ {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ឯកសារ ៖ {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=ជួរ ៖ {{line}} +rendering_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​បង្ហាញ​ទំព័រ ។ + +# Predefined zoom values +page_scale_width=ទទឹង​ទំព័រ +page_scale_fit=សម​ទំព័រ +page_scale_auto=ពង្រីក​ស្វ័យប្រវត្តិ +page_scale_actual=ទំហំ​ជាក់ស្ដែង +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=កំហុស +loading_error=មាន​កំហុស​បាន​កើតឡើង​ពេល​កំពុង​ផ្ទុក PDF ។ +invalid_file_error=ឯកសារ PDF ខូច ឬ​មិន​ត្រឹមត្រូវ ។ +missing_file_error=បាត់​ឯកសារ PDF +unexpected_response_error=ការ​ឆ្លើយ​តម​ម៉ាស៊ីន​មេ​ដែល​មិន​បាន​រំពឹង។ + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} ចំណារ​ពន្យល់] +password_label=បញ្ចូល​ពាក្យសម្ងាត់​ដើម្បី​បើក​ឯកសារ PDF នេះ។ +password_invalid=ពាក្យសម្ងាត់​មិន​ត្រឹមត្រូវ។ សូម​ព្យាយាម​ម្ដងទៀត។ +password_ok=យល់​ព្រម +password_cancel=បោះបង់ + +printing_not_supported=ការ​ព្រមាន ៖ កា​រ​បោះពុម្ព​មិន​ត្រូវ​បាន​គាំទ្រ​ពេញលេញ​ដោយ​កម្មវិធី​រុករក​នេះ​ទេ ។ +printing_not_ready=ព្រមាន៖ PDF មិន​ត្រូវ​បាន​ផ្ទុក​ទាំងស្រុង​ដើម្បី​បោះពុម្ព​ទេ។ +web_fonts_disabled=បាន​បិទ​ពុម្ពអក្សរ​បណ្ដាញ ៖ មិន​អាច​ប្រើ​ពុម្ពអក្សរ PDF ដែល​បាន​បង្កប់​បាន​ទេ ។ +document_colors_not_allowed=ឯកសារ PDF មិន​ត្រូវ​បាន​អនុញ្ញាត​ឲ្យ​ប្រើ​ពណ៌​ផ្ទាល់​របស់​វា​ទេ៖ 'អនុញ្ញាត​​ឲ្យ​ទំព័រ​ជ្រើស​ពណ៌​ផ្ទាល់​ខ្លួន' ត្រូវ​បាន​ធ្វើ​ឲ្យ​អសកម្ម​ក្នុង​​កម្មវិធី​រុករក។ diff --git a/src/cps/static/locale/kn/viewer.properties b/src/cps/static/locale/kn/viewer.properties new file mode 100644 index 0000000..620c805 --- /dev/null +++ b/src/cps/static/locale/kn/viewer.properties @@ -0,0 +1,175 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=ಹಿಂದಿನ ಪುಟ +previous_label=ಹಿಂದಿನ +next.title=ಮುಂದಿನ ಪುಟ +next_label=ಮುಂದಿನ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} ರಲ್ಲಿ +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=ಕಿರಿದಾಗಿಸು +zoom_out_label=ಕಿರಿದಾಗಿಸಿ +zoom_in.title=ಹಿರಿದಾಗಿಸು +zoom_in_label=ಹಿರಿದಾಗಿಸಿ +zoom.title=ಗಾತ್ರಬದಲಿಸು +presentation_mode.title=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮಕ್ಕೆ ಬದಲಾಯಿಸು +presentation_mode_label=ಪ್ರಸ್ತುತಿ (ಪ್ರಸೆಂಟೇಶನ್) ಕ್ರಮ +open_file.title=ಕಡತವನ್ನು ತೆರೆ +open_file_label=ತೆರೆಯಿರಿ +print.title=ಮುದ್ರಿಸು +print_label=ಮುದ್ರಿಸಿ +download.title=ಇಳಿಸು +download_label=ಇಳಿಸಿಕೊಳ್ಳಿ +bookmark.title=ಪ್ರಸಕ್ತ ನೋಟ (ಪ್ರತಿ ಮಾಡು ಅಥವ ಹೊಸ ಕಿಟಕಿಯಲ್ಲಿ ತೆರೆ) +bookmark_label=ಪ್ರಸಕ್ತ ನೋಟ + +# Secondary toolbar and context menu +tools.title=ಉಪಕರಣಗಳು +tools_label=ಉಪಕರಣಗಳು +first_page.title=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು +first_page.label=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು +first_page_label=ಮೊದಲ ಪುಟಕ್ಕೆ ತೆರಳು +last_page.title=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು +last_page.label=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು +last_page_label=ಕೊನೆಯ ಪುಟಕ್ಕೆ ತೆರಳು +page_rotate_cw.title=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು +page_rotate_cw.label=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು +page_rotate_cw_label=ಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು +page_rotate_ccw.title=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು +page_rotate_ccw.label=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು +page_rotate_ccw_label=ಅಪ್ರದಕ್ಷಿಣೆಯಲ್ಲಿ ತಿರುಗಿಸು + +hand_tool_enable.title=ಕೈ ಉಪಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸು +hand_tool_enable_label=ಕೈ ಉಪಕರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸು +hand_tool_disable.title=ಕೈ ಉಪಕರಣವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸು +hand_tool_disable_label=ಕೈ ಉಪಕರಣವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸು + +# Document properties dialog box +document_properties.title=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು... +document_properties_label=ಡಾಕ್ಯುಮೆಂಟ್‌ ಗುಣಗಳು... +document_properties_file_name=ಕಡತದ ಹೆಸರು: +document_properties_file_size=ಕಡತದ ಗಾತ್ರ: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} ಬೈಟ್‍ಗಳು) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} ಬೈಟ್‍ಗಳು) +document_properties_title=ಶೀರ್ಷಿಕೆ: +document_properties_author=ಕರ್ತೃ: +document_properties_subject=ವಿಷಯ: +document_properties_keywords=ಮುಖ್ಯಪದಗಳು: +document_properties_creation_date=ರಚಿಸಿದ ದಿನಾಂಕ: +document_properties_modification_date=ಮಾರ್ಪಡಿಸಲಾದ ದಿನಾಂಕ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=ರಚಿಸಿದವರು: +document_properties_producer=PDF ಉತ್ಪಾದಕ: +document_properties_version=PDF ಆವೃತ್ತಿ: +document_properties_page_count=ಪುಟದ ಎಣಿಕೆ: +document_properties_close=ಮುಚ್ಚು + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು +toggle_sidebar_label=ಬದಿಪಟ್ಟಿಯನ್ನು ಹೊರಳಿಸು +document_outline_label=ದಸ್ತಾವೇಜಿನ ಹೊರರೇಖೆ +attachments.title=ಲಗತ್ತುಗಳನ್ನು ತೋರಿಸು +attachments_label=ಲಗತ್ತುಗಳು +thumbs.title=ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು +thumbs_label=ಚಿಕ್ಕಚಿತ್ರಗಳು +findbar.title=ದಸ್ತಾವೇಜಿನಲ್ಲಿ ಹುಡುಕು +findbar_label=ಹುಡುಕು + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=ಪುಟ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=ಪುಟವನ್ನು ಚಿಕ್ಕಚಿತ್ರದಂತೆ ತೋರಿಸು {{page}} + +# Find panel button title and messages +find_label=ಹುಡುಕು: +find_previous.title=ವಾಕ್ಯದ ಹಿಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು +find_previous_label=ಹಿಂದಿನ +find_next.title=ವಾಕ್ಯದ ಮುಂದಿನ ಇರುವಿಕೆಯನ್ನು ಹುಡುಕು +find_next_label=ಮುಂದಿನ +find_highlight=ಎಲ್ಲವನ್ನು ಹೈಲೈಟ್ ಮಾಡು +find_match_case_label=ಕೇಸನ್ನು ಹೊಂದಿಸು +find_reached_top=ದಸ್ತಾವೇಜಿನ ಮೇಲ್ಭಾಗವನ್ನು ತಲುಪಿದೆ, ಕೆಳಗಿನಿಂದ ಆರಂಭಿಸು +find_reached_bottom=ದಸ್ತಾವೇಜಿನ ಕೊನೆಯನ್ನು ತಲುಪಿದೆ, ಮೇಲಿನಿಂದ ಆರಂಭಿಸು +find_not_found=ವಾಕ್ಯವು ಕಂಡು ಬಂದಿಲ್ಲ + +# Error panel labels +error_more_info=ಹೆಚ್ಚಿನ ಮಾಹಿತಿ +error_less_info=ಕಡಿಮೆ ಮಾಹಿತಿ +error_close=ಮುಚ್ಚು +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=ಸಂದೇಶ: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=ರಾಶಿ: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ಕಡತ: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=ಸಾಲು: {{line}} +rendering_error=ಪುಟವನ್ನು ನಿರೂಪಿಸುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ. + +# Predefined zoom values +page_scale_width=ಪುಟದ ಅಗಲ +page_scale_fit=ಪುಟದ ಸರಿಹೊಂದಿಕೆ +page_scale_auto=ಸ್ವಯಂಚಾಲಿತ ಗಾತ್ರಬದಲಾವಣೆ +page_scale_actual=ನಿಜವಾದ ಗಾತ್ರ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=ದೋಷ +loading_error=PDF ಅನ್ನು ಲೋಡ್ ಮಾಡುವಾಗ ಒಂದು ದೋಷ ಎದುರಾಗಿದೆ. +invalid_file_error=ಅಮಾನ್ಯವಾದ ಅಥವ ಹಾಳಾದ PDF ಕಡತ. +missing_file_error=PDF ಕಡತ ಇಲ್ಲ. +unexpected_response_error=ಅನಿರೀಕ್ಷಿತವಾದ ಪೂರೈಕೆಗಣಕದ ಪ್ರತಿಕ್ರಿಯೆ. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} ಟಿಪ್ಪಣಿ] +password_label=PDF ಅನ್ನು ತೆರೆಯಲು ಗುಪ್ತಪದವನ್ನು ನಮೂದಿಸಿ. +password_invalid=ಅಮಾನ್ಯವಾದ ಗುಪ್ತಪದ, ದಯವಿಟ್ಟು ಇನ್ನೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ. +password_ok=OK + +printing_not_supported=ಎಚ್ಚರಿಕೆ: ಈ ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ಮುದ್ರಣಕ್ಕೆ ಸಂಪೂರ್ಣ ಬೆಂಬಲವಿಲ್ಲ. +printing_not_ready=ಎಚ್ಚರಿಕೆ: PDF ಕಡತವು ಮುದ್ರಿಸಲು ಸಂಪೂರ್ಣವಾಗಿ ಲೋಡ್ ಆಗಿಲ್ಲ. +web_fonts_disabled=ಜಾಲ ಅಕ್ಷರಶೈಲಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ: ಅಡಕಗೊಳಿಸಿದ PDF ಅಕ್ಷರಶೈಲಿಗಳನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ. +document_colors_not_allowed=PDF ದಸ್ತಾವೇಜುಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣಗಳನ್ನು ಬಳಸಲು ಅನುಮತಿ ಇರುವುದಿಲ್ಲ: 'ಪುಟಗಳು ತಮ್ಮದೆ ಆದ ಬಣ್ಣವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಅನುಮತಿಸು' ಅನ್ನು ಜಾಲವೀಕ್ಷಕದಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿರುತ್ತದೆ. diff --git a/src/cps/static/locale/ko/viewer.properties b/src/cps/static/locale/ko/viewer.properties new file mode 100644 index 0000000..beea3d4 --- /dev/null +++ b/src/cps/static/locale/ko/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=이전 페이지 +previous_label=이전 +next.title=다음 페이지 +next_label=다음 + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=페이지 +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=전체 {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pagesCount}} 중 {{pageNumber}}) + +zoom_out.title=축소 +zoom_out_label=축소 +zoom_in.title=확대 +zoom_in_label=확대 +zoom.title=크기 +presentation_mode.title=발표 모드로 전환 +presentation_mode_label=발표 모드 +open_file.title=파일 열기 +open_file_label=열기 +print.title=인쇄 +print_label=인쇄 +download.title=다운로드 +download_label=다운로드 +bookmark.title=지금 보이는 그대로 (복사하거나 새 창에 열기) +bookmark_label=지금 보이는 그대로 + +# Secondary toolbar and context menu +tools.title=도구 +tools_label=도구 +first_page.title=첫 페이지로 이동 +first_page.label=첫 페이지로 이동 +first_page_label=첫 페이지로 이동 +last_page.title=마지막 페이지로 이동 +last_page.label=마지막 페이지로 이동 +last_page_label=마지막 페이지로 이동 +page_rotate_cw.title=시계방향으로 회전 +page_rotate_cw.label=시계방향으로 회전 +page_rotate_cw_label=시계방향으로 회전 +page_rotate_ccw.title=시계 반대방향으로 회전 +page_rotate_ccw.label=시계 반대방향으로 회전 +page_rotate_ccw_label=시계 반대방향으로 회전 + +hand_tool_enable.title=손 도구 켜기 +hand_tool_enable_label=손 도구 켜기 +hand_tool_disable.title=손 도구 끄기 +hand_tool_disable_label=손 도구 끄기 + +# Document properties dialog box +document_properties.title=문서 속성… +document_properties_label=문서 속성… +document_properties_file_name=파일 이름: +document_properties_file_size=파일 사이즈: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}}바이트) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}}바이트) +document_properties_title=제목: +document_properties_author=저자: +document_properties_subject=주제: +document_properties_keywords=키워드: +document_properties_creation_date=생성일: +document_properties_modification_date=수정일: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=생성자: +document_properties_producer=PDF 생성기: +document_properties_version=PDF 버전: +document_properties_page_count=총 페이지: +document_properties_close=닫기 + +print_progress_message=문서 출력 준비중… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=취소 + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=탐색창 열고 닫기 +toggle_sidebar_label=탐색창 열고 닫기 +document_outline.title=문서 아웃라인 보기(더블 클릭해서 모든 항목 열고 닫기) +document_outline_label=문서 아웃라인 +attachments.title=첨부파일 보기 +attachments_label=첨부파일 +thumbs.title=미리보기 +thumbs_label=미리보기 +findbar.title=검색 +findbar_label=검색 + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}}쪽 +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}}쪽 미리보기 + +# Find panel button title and messages +find_label=검색: +find_previous.title=지정 문자열에 일치하는 1개 부분을 검색 +find_previous_label=이전 +find_next.title=지정 문자열에 일치하는 다음 부분을 검색 +find_next_label=다음 +find_highlight=모두 강조 표시 +find_match_case_label=대문자/소문자 구별 +find_reached_top=문서 처음까지 검색하고 끝으로 돌아와 검색했습니다. +find_reached_bottom=문서 끝까지 검색하고 앞으로 돌아와 검색했습니다. +find_not_found=검색 결과 없음 + +# Error panel labels +error_more_info=정보 더 보기 +error_less_info=정보 간단히 보기 +error_close=닫기 +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (빌드: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=메시지: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=스택: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=파일: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=줄 번호: {{line}} +rendering_error=페이지를 렌더링하다 오류가 났습니다. + +# Predefined zoom values +page_scale_width=페이지 너비에 맞춤 +page_scale_fit=페이지에 맞춤 +page_scale_auto=알아서 맞춤 +page_scale_actual=실제 크기에 맞춤 +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=오류 +loading_error=PDF를 읽는 중 오류가 생겼습니다. +invalid_file_error=유효하지 않거나 파손된 PDF 파일 +missing_file_error=PDF 파일이 없습니다. +unexpected_response_error=알 수 없는 서버 응답입니다. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} 주석] +password_label=이 PDF 파일을 열 수 있는 암호를 입력하십시오. +password_invalid=잘못된 암호입니다. 다시 시도해 주십시오. +password_ok=확인 +password_cancel=취소 + +printing_not_supported=경고: 이 브라우저는 인쇄를 완전히 지원하지 않습니다. +printing_not_ready=경고: 이 PDF를 인쇄를 할 수 있을 정도로 읽어들이지 못했습니다. +web_fonts_disabled=웹 폰트가 꺼져있음: 내장된 PDF 글꼴을 쓸 수 없습니다. +document_colors_not_allowed=PDF 문서의 색상을 쓰지 못하게 되어 있음: '웹 페이지 자체 색상 사용 허용'이 브라우저에서 꺼져 있습니다. diff --git a/src/cps/static/locale/ku/viewer.properties b/src/cps/static/locale/ku/viewer.properties new file mode 100644 index 0000000..6af3ec0 --- /dev/null +++ b/src/cps/static/locale/ku/viewer.properties @@ -0,0 +1,148 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Rûpela berê +previous_label=Paşve +next.title=Rûpela pêş +next_label=Pêş + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Dûr bike +zoom_out_label=Dûr bike +zoom_in.title=Nêzîk bike +zoom_in_label=Nêzîk bike +zoom.title=Nêzîk Bike +presentation_mode.title=Derbasî mûda pêşkêşkariyê bibe +presentation_mode_label=Moda Pêşkêşkariyê +open_file.title=Pelî veke +open_file_label=Veke +print.title=Çap bike +print_label=Çap bike +download.title=Jêbar bike +download_label=Jêbar bike +bookmark.title=Xuyakirina niha (kopî yan jî di pencereyeke nû de veke) +bookmark_label=Xuyakirina niha + +# Secondary toolbar and context menu +tools.title=Amûr +tools_label=Amûr +first_page.title=Here rûpela yekemîn +first_page.label=Here rûpela yekemîn +first_page_label=Here rûpela yekemîn +last_page.title=Here rûpela dawîn +last_page.label=Here rûpela dawîn +last_page_label=Here rûpela dawîn +page_rotate_cw.title=Bi aliyê saetê ve bizivirîne +page_rotate_cw.label=Bi aliyê saetê ve bizivirîne +page_rotate_cw_label=Bi aliyê saetê ve bizivirîne +page_rotate_ccw.title=Berevajî aliyê saetê ve bizivirîne +page_rotate_ccw.label=Berevajî aliyê saetê ve bizivirîne +page_rotate_ccw_label=Berevajî aliyê saetê ve bizivirîne + + +# Document properties dialog box +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_title=Sernav: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Darikê kêlekê veke/bigire +toggle_sidebar_label=Darikê kêlekê veke/bigire +document_outline_label=Şemaya belgeyê +thumbs.title=Wênekokan nîşan bide +thumbs_label=Wênekok +findbar.title=Di belgeyê de bibîne +findbar_label=Bibîne + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Rûpel {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Wênekoka rûpelê {{page}} + +# Find panel button title and messages +find_label=Bibîne: +find_previous.title=Peyva berê bibîne +find_previous_label=Paşve +find_next.title=Peyya pêş bibîne +find_next_label=Pêşve +find_highlight=Tevî beloq bike +find_match_case_label=Ji bo tîpên hûrdek-girdek bihîstyar +find_reached_top=Gihîşt serê rûpelê, ji dawiya rûpelê bidomîne +find_reached_bottom=Gihîşt dawiya rûpelê, ji serê rûpelê bidomîne +find_not_found=Peyv nehat dîtin + +# Error panel labels +error_more_info=Zêdetir agahî +error_less_info=Zêdetir agahî +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js versiyon {{version}} (avanî: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Peyam: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Komik: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Pel: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rêzik: {{line}} +rendering_error=Di vehûrandina rûpelê de çewtî çêbû. + +# Predefined zoom values +page_scale_width=Firehiya rûpelê +page_scale_fit=Di rûpelê de bicî bike +page_scale_auto=Xweber nêzîk bike +page_scale_actual=Mezinahiya rastîn +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=Xeletî +loading_error=Dema ku PDF dihat barkirin çewtiyek çêbû. +invalid_file_error=Pelê PDFê nederbasdar yan jî xirabe ye. +missing_file_error=Pelê PDFê kêm e. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Nîşaneya {{type}}ê] +password_label=Ji bo PDFê vekî şîfreyê binivîse. +password_invalid=Şîfre çewt e. Tika ye dîsa biceribîne. +password_ok=Temam + +printing_not_supported=Hişyarî: Çapkirin ji hêla vê gerokê ve bi temamî nayê destekirin. +printing_not_ready=Hişyarî: PDF bi temamî nehat barkirin û ji bo çapê ne amade ye. +web_fonts_disabled=Fontên Webê neçalak in: Fontên PDFê yên veşartî nayên bikaranîn. +document_colors_not_allowed=Destûr tune ye ku belgeyên PDFê rengên xwe bi kar bînin: Di gerokê de 'destûrê bide rûpelan ku rengên xwe bi kar bînin' nehatiye çalakirin. diff --git a/src/cps/static/locale/lg/viewer.properties b/src/cps/static/locale/lg/viewer.properties new file mode 100644 index 0000000..e333c4f --- /dev/null +++ b/src/cps/static/locale/lg/viewer.properties @@ -0,0 +1,113 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Omuko Ogubadewo +next.title=Omuko Oguddako + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=ku {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Zimbulukusa +zoom_out_label=Zimbulukusa +zoom_in.title=Funza Munda +zoom_in_label=Funza Munda +zoom.title=Gezzamu +open_file.title=Bikula Fayiro +open_file_label=Ggulawo +print.title=Fulumya +print_label=Fulumya +download.title=Tikula +download_label=Tikula +bookmark.title=Endabika eriwo (koppa oba gulawo mu diriisa epya) +bookmark_label=Endabika Eriwo + +# Secondary toolbar and context menu + + +# Document properties dialog box +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +document_outline_label=Ensalo ze Ekiwandiko +thumbs.title=Laga Ekifanyi Mubufunze +thumbs_label=Ekifanyi Mubufunze +findbar_label=Zuula + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Omuko {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Ekifananyi kyo Omuko Mubufunze {{page}} + +# Find panel button title and messages +find_previous.title=Zuula awayise mukweddamu mumiteddera +find_next.title=Zuula ekidako mukweddamu mumiteddera +find_highlight=Londa byonna +find_not_found=Emiteddera tezuuliddwa + +# Error panel labels +error_more_info=Ebisingawo +error_less_info=Mubumpimpi +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Obubaaka: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Ebipangiddwa: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fayiro {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Layini: {{line}} +rendering_error=Wabadewo ensobi muku tekawo omuko. + +# Predefined zoom values +page_scale_width=Obugazi bwo Omuko +page_scale_fit=Okutuka kwo Omuko +page_scale_auto=Okwefunza no Kwegeza +page_scale_actual=Obunene Obutufu +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=Ensobi +loading_error=Wabadewo ensobi mukutika PDF. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Enyonyola] +password_ok=OK + +printing_not_supported=Okulaabula: Okulumya empapula tekuwagirwa enonyeso enno. diff --git a/src/cps/static/locale/lij/viewer.properties b/src/cps/static/locale/lij/viewer.properties new file mode 100644 index 0000000..ee2a585 --- /dev/null +++ b/src/cps/static/locale/lij/viewer.properties @@ -0,0 +1,174 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pagina precedente +previous_label=Precedente +next.title=Pagina dòppo +next_label=Pròscima + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Diminoisci zoom +zoom_out_label=Diminoisci zoom +zoom_in.title=Aomenta zoom +zoom_in_label=Aomenta zoom +zoom.title=Zoom +presentation_mode.title=Vanni into mòddo de prezentaçion +presentation_mode_label=Mòddo de prezentaçion +open_file.title=Arvi file +open_file_label=Arvi +print.title=Stanpa +print_label=Stanpa +download.title=Descaregamento +download_label=Descaregamento +bookmark.title=Vixon corente (còpia ò arvi inte 'n neuvo barcon) +bookmark_label=Vixon corente + +# Secondary toolbar and context menu +tools.title=Strumenti +tools_label=Strumenti +first_page.title=Vanni a-a primma pagina +first_page.label=Vanni a-a primma pagina +first_page_label=Vanni a-a primma pagina +last_page.title=Vanni a l'urtima pagina +last_page.label=Vanni a l'urtima pagina +last_page_label=Vanni a l'urtima pagina +page_rotate_cw.title=Gia into verso oraio +page_rotate_cw.label=Gia in senso do releuio +page_rotate_cw_label=Gia into verso oraio +page_rotate_ccw.title=Gia into verso antioraio +page_rotate_ccw.label=Gia in senso do releuio a-a reversa +page_rotate_ccw_label=Gia into verso antioraio + +hand_tool_enable.title=Ativa strumento man +hand_tool_enable_label=Ativa strumento man +hand_tool_disable.title=Dizativa strumento man +hand_tool_disable_label=Dizativa strumento man + +# Document properties dialog box +document_properties.title=Propietæ do documento… +document_properties_label=Propietæ do documento… +document_properties_file_name=Nomme file: +document_properties_file_size=Dimenscion file: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kB ({{size_b}} byte) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_kb}} MB ({{size_b}} byte) +document_properties_title=Titolo: +document_properties_author=Aoto: +document_properties_subject=Ogetto: +document_properties_keywords=Paròlle ciave: +document_properties_creation_date=Dæta creaçion: +document_properties_modification_date=Dæta cangiamento: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Aotô originale: +document_properties_producer=Produtô PDF: +document_properties_version=Verscion PDF: +document_properties_page_count=Contezzo pagine: +document_properties_close=Særa + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Ativa/dizativa bara de scianco +toggle_sidebar_label=Ativa/dizativa bara de scianco +attachments.title=Fanni vedde alegæ +attachments_label=Alegæ +thumbs.title=Mostra miniatue +thumbs_label=Miniatue +findbar.title=Treuva into documento +findbar_label=Treuva + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pagina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatua da pagina {{page}} + +# Find panel button title and messages +find_label=Treuva: +find_previous.title=Treuva a ripetiçion precedente do testo da çercâ +find_previous_label=Precedente +find_next.title=Treuva a ripetiçion dòppo do testo da çercâ +find_next_label=Segoente +find_highlight=Evidençia +find_match_case_label=Maioscole/minoscole +find_reached_top=Razonto a fin da pagina, continoa da l'iniçio +find_reached_bottom=Razonto l'iniçio da pagina, continoa da-a fin +find_not_found=Testo no trovou + +# Error panel labels +error_more_info=Ciù informaçioin +error_less_info=Meno informaçioin +error_close=Særa +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mesaggio: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linia: {{line}} +rendering_error=Gh'é stæto 'n'erô itno rendering da pagina. + +# Predefined zoom values +page_scale_width=Larghessa pagina +page_scale_fit=Adatta a una pagina +page_scale_auto=Zoom aotomatico +page_scale_actual=Dimenscioin efetive +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Erô +loading_error=S'é verificou 'n'erô itno caregamento do PDF. +invalid_file_error=O file PDF o l'é no valido ò aroinou. +missing_file_error=O file PDF o no gh'é. +unexpected_response_error=Risposta inprevista do-u server + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotaçion: {{type}}] +password_label=Dimme a paròlla segreta pe arvî sto file PDF. +password_invalid=Paròlla segreta sbalia. Preuva torna. +password_ok=Va ben +password_cancel=Anulla + +printing_not_supported=Atençion: a stanpa a no l'é conpletamente soportâ da sto navegatô. +printing_not_ready=Atençion: o PDF o no l'é ancon caregou conpletamente pe-a stanpa. +web_fonts_disabled=I font do web en dizativæ: inposcibile adeuviâ i carateri do PDF. +document_colors_not_allowed=No l'é poscibile adeuviâ i pròpi coî pe-i documenti PDF: l'opçion do navegatô “Permetti a-e pagine de çerne i pròpi coî in cangio de quelli inpostæ” a l'é dizativâ. diff --git a/src/cps/static/locale/locale.properties b/src/cps/static/locale/locale.properties new file mode 100644 index 0000000..9aded1b --- /dev/null +++ b/src/cps/static/locale/locale.properties @@ -0,0 +1,312 @@ +[ach] +@import url(ach/viewer.properties) + +[af] +@import url(af/viewer.properties) + +[ak] +@import url(ak/viewer.properties) + +[an] +@import url(an/viewer.properties) + +[ar] +@import url(ar/viewer.properties) + +[as] +@import url(as/viewer.properties) + +[ast] +@import url(ast/viewer.properties) + +[az] +@import url(az/viewer.properties) + +[be] +@import url(be/viewer.properties) + +[bg] +@import url(bg/viewer.properties) + +[bn-BD] +@import url(bn-BD/viewer.properties) + +[bn-IN] +@import url(bn-IN/viewer.properties) + +[br] +@import url(br/viewer.properties) + +[bs] +@import url(bs/viewer.properties) + +[ca] +@import url(ca/viewer.properties) + +[cs] +@import url(cs/viewer.properties) + +[csb] +@import url(csb/viewer.properties) + +[cy] +@import url(cy/viewer.properties) + +[da] +@import url(da/viewer.properties) + +[de] +@import url(de/viewer.properties) + +[el] +@import url(el/viewer.properties) + +[en-GB] +@import url(en-GB/viewer.properties) + +[en-US] +@import url(en-US/viewer.properties) + +[en-ZA] +@import url(en-ZA/viewer.properties) + +[eo] +@import url(eo/viewer.properties) + +[es-AR] +@import url(es-AR/viewer.properties) + +[es-CL] +@import url(es-CL/viewer.properties) + +[es-ES] +@import url(es-ES/viewer.properties) + +[es-MX] +@import url(es-MX/viewer.properties) + +[et] +@import url(et/viewer.properties) + +[eu] +@import url(eu/viewer.properties) + +[fa] +@import url(fa/viewer.properties) + +[ff] +@import url(ff/viewer.properties) + +[fi] +@import url(fi/viewer.properties) + +[fr] +@import url(fr/viewer.properties) + +[fy-NL] +@import url(fy-NL/viewer.properties) + +[ga-IE] +@import url(ga-IE/viewer.properties) + +[gd] +@import url(gd/viewer.properties) + +[gl] +@import url(gl/viewer.properties) + +[gu-IN] +@import url(gu-IN/viewer.properties) + +[he] +@import url(he/viewer.properties) + +[hi-IN] +@import url(hi-IN/viewer.properties) + +[hr] +@import url(hr/viewer.properties) + +[hu] +@import url(hu/viewer.properties) + +[hy-AM] +@import url(hy-AM/viewer.properties) + +[id] +@import url(id/viewer.properties) + +[is] +@import url(is/viewer.properties) + +[it] +@import url(it/viewer.properties) + +[ja] +@import url(ja/viewer.properties) + +[ka] +@import url(ka/viewer.properties) + +[kk] +@import url(kk/viewer.properties) + +[km] +@import url(km/viewer.properties) + +[kn] +@import url(kn/viewer.properties) + +[ko] +@import url(ko/viewer.properties) + +[ku] +@import url(ku/viewer.properties) + +[lg] +@import url(lg/viewer.properties) + +[lij] +@import url(lij/viewer.properties) + +[lt] +@import url(lt/viewer.properties) + +[lv] +@import url(lv/viewer.properties) + +[mai] +@import url(mai/viewer.properties) + +[mk] +@import url(mk/viewer.properties) + +[ml] +@import url(ml/viewer.properties) + +[mn] +@import url(mn/viewer.properties) + +[mr] +@import url(mr/viewer.properties) + +[ms] +@import url(ms/viewer.properties) + +[my] +@import url(my/viewer.properties) + +[nb-NO] +@import url(nb-NO/viewer.properties) + +[nl] +@import url(nl/viewer.properties) + +[nn-NO] +@import url(nn-NO/viewer.properties) + +[nso] +@import url(nso/viewer.properties) + +[oc] +@import url(oc/viewer.properties) + +[or] +@import url(or/viewer.properties) + +[pa-IN] +@import url(pa-IN/viewer.properties) + +[pl] +@import url(pl/viewer.properties) + +[pt-BR] +@import url(pt-BR/viewer.properties) + +[pt-PT] +@import url(pt-PT/viewer.properties) + +[rm] +@import url(rm/viewer.properties) + +[ro] +@import url(ro/viewer.properties) + +[ru] +@import url(ru/viewer.properties) + +[rw] +@import url(rw/viewer.properties) + +[sah] +@import url(sah/viewer.properties) + +[si] +@import url(si/viewer.properties) + +[sk] +@import url(sk/viewer.properties) + +[sl] +@import url(sl/viewer.properties) + +[son] +@import url(son/viewer.properties) + +[sq] +@import url(sq/viewer.properties) + +[sr] +@import url(sr/viewer.properties) + +[sv-SE] +@import url(sv-SE/viewer.properties) + +[sw] +@import url(sw/viewer.properties) + +[ta] +@import url(ta/viewer.properties) + +[ta-LK] +@import url(ta-LK/viewer.properties) + +[te] +@import url(te/viewer.properties) + +[th] +@import url(th/viewer.properties) + +[tl] +@import url(tl/viewer.properties) + +[tn] +@import url(tn/viewer.properties) + +[tr] +@import url(tr/viewer.properties) + +[uk] +@import url(uk/viewer.properties) + +[ur] +@import url(ur/viewer.properties) + +[vi] +@import url(vi/viewer.properties) + +[wo] +@import url(wo/viewer.properties) + +[xh] +@import url(xh/viewer.properties) + +[zh-CN] +@import url(zh-CN/viewer.properties) + +[zh-TW] +@import url(zh-TW/viewer.properties) + +[zu] +@import url(zu/viewer.properties) + diff --git a/src/cps/static/locale/lt/viewer.properties b/src/cps/static/locale/lt/viewer.properties new file mode 100644 index 0000000..e203dee --- /dev/null +++ b/src/cps/static/locale/lt/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Ankstesnis puslapis +previous_label=Ankstesnis +next.title=Kitas puslapis +next_label=Kitas + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Puslapis +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=iš {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} iš {{pagesCount}}) + +zoom_out.title=Sumažinti +zoom_out_label=Sumažinti +zoom_in.title=Padidinti +zoom_in_label=Padidinti +zoom.title=Mastelis +presentation_mode.title=Pereiti į pateikties veikseną +presentation_mode_label=Pateikties veiksena +open_file.title=Atverti failą +open_file_label=Atverti +print.title=Spausdinti +print_label=Spausdinti +download.title=Parsiųsti +download_label=Parsiųsti +bookmark.title=Esamojo rodinio saitas (kopijavimui ar atvėrimui kitame lange) +bookmark_label=Esamasis rodinys + +# Secondary toolbar and context menu +tools.title=Priemonės +tools_label=Priemonės +first_page.title=Eiti į pirmą puslapį +first_page.label=Eiti į pirmą puslapį +first_page_label=Eiti į pirmą puslapį +last_page.title=Eiti į paskutinį puslapį +last_page.label=Eiti į paskutinį puslapį +last_page_label=Eiti į paskutinį puslapį +page_rotate_cw.title=Pasukti pagal laikrodžio rodyklę +page_rotate_cw.label=Pasukti pagal laikrodžio rodyklę +page_rotate_cw_label=Pasukti pagal laikrodžio rodyklę +page_rotate_ccw.title=Pasukti prieš laikrodžio rodyklę +page_rotate_ccw.label=Pasukti prieš laikrodžio rodyklę +page_rotate_ccw_label=Pasukti prieš laikrodžio rodyklę + +hand_tool_enable.title=Įgalinti vilkimo veikseną +hand_tool_enable_label=Įgalinti vilkimo veikseną +hand_tool_disable.title=Išjungti vilkimo veikseną +hand_tool_disable_label=Išjungti vilkimo veikseną + +# Document properties dialog box +document_properties.title=Dokumento savybės… +document_properties_label=Dokumento savybės… +document_properties_file_name=Failo vardas: +document_properties_file_size=Failo dydis: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} B) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} B) +document_properties_title=Antraštė: +document_properties_author=Autorius: +document_properties_subject=Tema: +document_properties_keywords=Reikšminiai žodžiai: +document_properties_creation_date=Sukūrimo data: +document_properties_modification_date=Modifikavimo data: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Kūrėjas: +document_properties_producer=PDF generatorius: +document_properties_version=PDF versija: +document_properties_page_count=Puslapių skaičius: +document_properties_close=Užverti + +print_progress_message=Dokumentas ruošiamas spausdinimui… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Atsisakyti + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Rodyti / slėpti šoninį polangį +toggle_sidebar_label=Šoninis polangis +document_outline.title=Rodyti dokumento struktūrą (spustelėkite dukart norėdami išplėsti/suskleisti visus elementus) +document_outline_label=Dokumento struktūra +attachments.title=Rodyti priedus +attachments_label=Priedai +thumbs.title=Rodyti puslapių miniatiūras +thumbs_label=Miniatiūros +findbar.title=Ieškoti dokumente +findbar_label=Ieškoti + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}} puslapis +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} puslapio miniatiūra + +# Find panel button title and messages +find_label=Ieškoti: +find_previous.title=Ieškoti ankstesnio frazės egzemplioriaus +find_previous_label=Ankstesnis +find_next.title=Ieškoti tolesnio frazės egzemplioriaus +find_next_label=Tolesnis +find_highlight=Viską paryškinti +find_match_case_label=Skirti didžiąsias ir mažąsias raides +find_reached_top=Pasiekus dokumento pradžią, paieška pratęsta nuo pabaigos +find_reached_bottom=Pasiekus dokumento pabaigą, paieška pratęsta nuo pradžios +find_not_found=Ieškoma frazė nerasta + +# Error panel labels +error_more_info=Išsamiau +error_less_info=Glausčiau +error_close=Užverti +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v. {{version}} (darinys: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Pranešimas: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Dėklas: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Failas: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Eilutė: {{line}} +rendering_error=Atvaizduojant puslapį įvyko klaida. + +# Predefined zoom values +page_scale_width=Priderinti prie lapo pločio +page_scale_fit=Pritaikyti prie lapo dydžio +page_scale_auto=Automatinis mastelis +page_scale_actual=Tikras dydis +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Klaida +loading_error=Įkeliant PDF failą įvyko klaida. +invalid_file_error=Tai nėra PDF failas arba jis yra sugadintas. +missing_file_error=PDF failas nerastas. +unexpected_response_error=Netikėtas serverio atsakas. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[„{{type}}“ tipo anotacija] +password_label=Įveskite slaptažodį šiam PDF failui atverti. +password_invalid=Slaptažodis neteisingas. Bandykite dar kartą. +password_ok=Gerai +password_cancel=Atsisakyti + +printing_not_supported=Dėmesio! Spausdinimas šioje naršyklėje nėra pilnai realizuotas. +printing_not_ready=Dėmesio! PDF failas dar nėra pilnai įkeltas spausdinimui. +web_fonts_disabled=Saityno šriftai išjungti – PDF faile esančių šriftų naudoti negalima. +document_colors_not_allowed=PDF dokumentams neleidžiama nurodyti savo spalvų, nes išjungta naršyklės nuostata „Leisti tinklalapiams nurodyti spalvas“. diff --git a/src/cps/static/locale/lv/viewer.properties b/src/cps/static/locale/lv/viewer.properties new file mode 100644 index 0000000..9da1fce --- /dev/null +++ b/src/cps/static/locale/lv/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Iepriekšējā lapa +previous_label=Iepriekšējā +next.title=Nākamā lapa +next_label=Nākamā + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Lapa +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=no {{pageCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} no {{pagesCount}}) + +zoom_out.title=Attālināt\u0020 +zoom_out_label=Attālināt +zoom_in.title=Pietuvināt +zoom_in_label=Pietuvināt +zoom.title=Palielinājums +presentation_mode.title=Pārslēgties uz Prezentācijas režīmu +presentation_mode_label=Prezentācijas režīms +open_file.title=Atvērt failu +open_file_label=Atvērt +print.title=Drukāšana +print_label=Drukāt +download.title=Lejupielāde +download_label=Lejupielādēt +bookmark.title=Pašreizējais skats (kopēt vai atvērt jaunā logā) +bookmark_label=Pašreizējais skats + +# Secondary toolbar and context menu +tools.title=Rīki +tools_label=Rīki +first_page.title=Iet uz pirmo lapu +first_page.label=Iet uz pirmo lapu +first_page_label=Iet uz pirmo lapu +last_page.title=Iet uz pēdējo lapu +last_page.label=Iet uz pēdējo lapu +last_page_label=Iet uz pēdējo lapu +page_rotate_cw.title=Pagriezt pa pulksteni +page_rotate_cw.label=Pagriezt pa pulksteni +page_rotate_cw_label=Pagriezt pa pulksteni +page_rotate_ccw.title=Pagriezt pret pulksteni +page_rotate_ccw.label=Pagriezt pret pulksteni +page_rotate_ccw_label=Pagriezt pret pulksteni + +hand_tool_enable.title=Aktivēt rokas rīku +hand_tool_enable_label=Aktivēt rokas rīku +hand_tool_disable.title=Deaktivēt rokas rīku +hand_tool_disable_label=Deaktivēt rokas rīku + +# Document properties dialog box +document_properties.title=Dokumenta iestatījumi… +document_properties_label=Dokumenta iestatījumi… +document_properties_file_name=Faila nosaukums: +document_properties_file_size=Faila izmērs: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} biti) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} biti) +document_properties_title=Nosaukums: +document_properties_author=Autors: +document_properties_subject=Tēma: +document_properties_keywords=Atslēgas vārdi: +document_properties_creation_date=Izveides datums: +document_properties_modification_date=LAbošanas datums: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Radītājs: +document_properties_producer=PDF producents: +document_properties_version=PDF versija: +document_properties_page_count=Lapu skaits: +document_properties_close=Aizvērt + +print_progress_message=Gatavo dokumentu drukāšanai... +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Atcelt + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Pārslēgt sānu joslu +toggle_sidebar_label=Pārslēgt sānu joslu +document_outline.title=Rādīt dokumenta struktūru (veiciet dubultklikšķi lai izvērstu/sakļautu visus vienumus) +document_outline_label=Dokumenta saturs +attachments.title=Rādīt pielikumus +attachments_label=Pielikumi +thumbs.title=Parādīt sīktēlus +thumbs_label=Sīktēli +findbar.title=Meklēt dokumentā +findbar_label=Meklēt + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Lapa {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Lapas {{page}} sīktēls + +# Find panel button title and messages +find_label=Meklēt: +find_previous.title=Atrast iepriekšējo +find_previous_label=Iepriekšējā +find_next.title=Atrast nākamo +find_next_label=Nākamā +find_highlight=Iekrāsot visas +find_match_case_label=Lielo, mazo burtu jutīgs +find_reached_top=Sasniegts dokumenta sākums, turpinām no beigām +find_reached_bottom=Sasniegtas dokumenta beigas, turpinām no sākuma +find_not_found=Frāze nav atrasta + +# Error panel labels +error_more_info=Vairāk informācijas +error_less_info=MAzāk informācijas +error_close=Close +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Ziņojums: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Steks: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=File: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rindiņa: {{line}} +rendering_error=Attēlojot lapu radās kļūda + +# Predefined zoom values +page_scale_width=Lapas platumā +page_scale_fit=Ietilpinot lapu +page_scale_auto=Automātiskais izmērs +page_scale_actual=Patiesais izmērs +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Kļūda +loading_error=Ielādējot PDF notika kļūda. +invalid_file_error=Nederīgs vai bojāts PDF fails. +missing_file_error=PDF fails nav atrasts. +unexpected_response_error=Negaidīa servera atbilde. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} anotācija] +password_label=Ievadiet paroli, lai atvērtu PDF failu. +password_invalid=Nepareiza parole, mēģiniet vēlreiz. +password_ok=Labi +password_cancel=Atcelt + +printing_not_supported=Uzmanību: Drukāšana no šī pārlūka darbojas tikai daļēji. +printing_not_ready=Uzmanību: PDF nav pilnībā ielādēts drukāšanai. +web_fonts_disabled=Tīmekļa fonti nav aktivizēti: Nevar iegult PDF fontus. +document_colors_not_allowed=PDF dokumentiem nav atļauts izmantot pašiem savas krāsas: „Atļaut lapām izvēlēties pašām savas krāsas“ ir deaktivēts pārlūkā. diff --git a/src/cps/static/locale/mai/viewer.properties b/src/cps/static/locale/mai/viewer.properties new file mode 100644 index 0000000..022d56a --- /dev/null +++ b/src/cps/static/locale/mai/viewer.properties @@ -0,0 +1,174 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=पछिला पृष्ठ +previous_label=पछिला +next.title=अगिला पृष्ठ +next_label=आगाँ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=छोट करू +zoom_out_label=छोट करू +zoom_in.title=पैघ करू +zoom_in_label=जूम इन +zoom.title=छोट-पैघ करू\u0020 +presentation_mode.title=प्रस्तुति अवस्थामे जाउ +presentation_mode_label=प्रस्तुति अवस्था +open_file.title=फाइल खोलू +open_file_label=खोलू +print.title=छापू +print_label=छापू +download.title=डाउनलोड +download_label=डाउनलोड +bookmark.title=मोजुदा दृश्य (नव विंडोमे नकल लिअ अथवा खोलू) +bookmark_label=वर्तमान दृश्य + +# Secondary toolbar and context menu +tools.title=अओजार +tools_label=अओजार +first_page.title=प्रथम पृष्ठ पर जाउ +first_page.label=प्रथम पृष्ठ पर जाउ +first_page_label=प्रथम पृष्ठ पर जाउ +last_page.title=अंतिम पृष्ठ पर जाउ +last_page.label=अंतिम पृष्ठ पर जाउ +last_page_label=अंतिम पृष्ठ पर जाउ +page_rotate_cw.title=घड़ीक दिशा मे घुमाउ +page_rotate_cw.label=घड़ीक दिशा मे घुमाउ +page_rotate_cw_label=घड़ीक दिशा मे घुमाउ +page_rotate_ccw.title=घड़ीक दिशा सँ उनटा घुमाउ +page_rotate_ccw.label=घड़ीक दिशा सँ उनटा घुमाउ +page_rotate_ccw_label=घड़ीक दिशा सँ उनटा घुमाउ + +hand_tool_enable.title=हाथ अओजार सक्रिय करू +hand_tool_enable_label=हाथ अओजार सक्रिय करू +hand_tool_disable.title=हाथ अओजार निष्क्रिय कएनाइ +hand_tool_disable_label=हाथ अओजार निष्क्रिय कएनाइ + +# Document properties dialog box +document_properties.title=दस्तावेज़ विशेषता... +document_properties_label=दस्तावेज़ विशेषता... +document_properties_file_name=फाइल नाम: +document_properties_file_size=फ़ाइल आकार: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} बाइट) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} बाइट) +document_properties_title=शीर्षक: +document_properties_author=लेखकः +document_properties_subject=विषय +document_properties_keywords=बीजशब्द +document_properties_creation_date=निर्माण तिथि: +document_properties_modification_date=संशोधन दिनांक: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=सृजक: +document_properties_producer=PDF उत्पादक: +document_properties_version=PDF संस्करण: +document_properties_page_count=पृष्ठ गिनती: +document_properties_close=बन्न करू + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=स्लाइडर टागल +toggle_sidebar_label=स्लाइडर टागल +document_outline_label=दस्तावेज खाका +attachments.title=संलग्नक देखाबू +attachments_label=संलग्नक +thumbs.title=लघु-छवि देखाउ +thumbs_label=लघु छवि +findbar.title=दस्तावेजमे ढूँढू +findbar_label=ताकू + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=पृष्ठ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=पृष्ठ {{page}} का लघु-चित्र + +# Find panel button title and messages +find_label=ताकू: +find_previous.title=खोजक पछिला उपस्थिति ताकू +find_previous_label=पछिला +find_next.title=खोजक अगिला उपस्थिति ताकू +find_next_label=आगाँ +find_highlight=सभटा आलोकित करू +find_match_case_label=मिलान स्थिति +find_reached_top=पृष्ठक शीर्ष जाए पहुँचल, तल सँ जारी +find_reached_bottom=पृष्ठक तल मे जाए पहुँचल, शीर्ष सँ जारी +find_not_found=वाकींश नहि भेटल + +# Error panel labels +error_more_info=बेसी सूचना +error_less_info=कम सूचना +error_close=बन्न करू +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=संदेश: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=स्टैक: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=फ़ाइल: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=पंक्ति: {{line}} +rendering_error=पृष्ठ रेंडरिंगक समय त्रुटि आएल. + +# Predefined zoom values +page_scale_width=पृष्ठ चओड़ाइ +page_scale_fit=पृष्ठ फिट +page_scale_auto=स्वचालित जूम +page_scale_actual=सही आकार +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=त्रुटि +loading_error=पीडीएफ लोड करैत समय एकटा त्रुटि भेल. +invalid_file_error=अमान्य अथवा भ्रष्ट PDF फाइल. +missing_file_error=अनुपस्थित PDF फाइल. +unexpected_response_error=सर्वर सँ अप्रत्याशित प्रतिक्रिया. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=एहि पीडीएफ फ़ाइल केँ खोलबाक लेल कृपया कूटशब्द भरू. +password_invalid=अवैध कूटशब्द, कृपया फिनु कोशिश करू. +password_ok=बेस + +printing_not_supported=चेतावनी: ई ब्राउजर पर छपाइ पूर्ण तरह सँ समर्थित नहि अछि. +printing_not_ready=चेतावनी: पीडीएफ छपाइक लेल पूर्ण तरह सँ लोड नहि अछि. +web_fonts_disabled=वेब फॉन्ट्स निष्क्रिय अछि: अंतःस्थापित PDF फान्टसक उपयोगमे असमर्थ. +document_colors_not_allowed=PDF दस्तावेज़ हुकर अपन रंग केँ उपयोग करबाक लेल अनुमति प्राप्त नहि अछि: 'पृष्ठ केँ हुकर अपन रंग केँ चुनबाक लेल स्वीकृति दिअ जे ओ ओहि ब्राउज़र मे निष्क्रिय अछि. diff --git a/src/cps/static/locale/mk/viewer.properties b/src/cps/static/locale/mk/viewer.properties new file mode 100644 index 0000000..6200587 --- /dev/null +++ b/src/cps/static/locale/mk/viewer.properties @@ -0,0 +1,134 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Претходна страница +previous_label=Претходна +next.title=Следна страница +next_label=Следна + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Намалување +zoom_out_label=Намали +zoom_in.title=Зголемување +zoom_in_label=Зголеми +zoom.title=Променување на големина +presentation_mode.title=Премини во презентациски режим +presentation_mode_label=Презентациски режим +open_file.title=Отворање датотека +open_file_label=Отвори +print.title=Печатење +print_label=Печати +download.title=Преземање +download_label=Преземи +bookmark.title=Овој преглед (копирај или отвори во нов прозорец) +bookmark_label=Овој преглед + +# Secondary toolbar and context menu +tools.title=Алатки +first_page.label=Оди до првата страница +last_page.label=Оди до последната страница +page_rotate_cw.label=Ротирај по стрелките на часовникот +page_rotate_ccw.label=Ротирај спротивно од стрелките на часовникот + + +# Document properties dialog box +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Вклучи странична лента +toggle_sidebar_label=Вклучи странична лента +thumbs.title=Прикажување на икони +thumbs_label=Икони +findbar.title=Најди во документот +findbar_label=Најди + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Страница {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Икона од страница {{page}} + +# Find panel button title and messages +find_label=Најди: +find_previous.title=Најди ја предходната појава на фразата +find_previous_label=Претходно +find_next.title=Најди ја следната појава на фразата +find_next_label=Следно +find_highlight=Означи сѐ +find_match_case_label=Токму така +find_reached_top=Барањето стигна до почетокот на документот и почнува од крајот +find_reached_bottom=Барањето стигна до крајот на документот и почнува од почеток +find_not_found=Фразата не е пронајдена + +# Error panel labels +error_more_info=Повеќе информации +error_less_info=Помалку информации +error_close=Затвори +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Порака: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Датотека: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Линија: {{line}} +rendering_error=Настана грешка при прикажувањето на страницата. + +# Predefined zoom values +page_scale_width=Ширина на страница +page_scale_fit=Цела страница +page_scale_auto=Автоматска големина +page_scale_actual=Вистинска големина +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=Грешка +loading_error=Настана грешка при вчитувањето на PDF-от. +invalid_file_error=Невалидна или корумпирана PDF датотека. +missing_file_error=Недостасува PDF документ. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" + +printing_not_supported=Предупредување: Печатењето не е целосно поддржано во овој прелистувач. +printing_not_ready=Предупредување: PDF документот не е целосно вчитан за печатење. +web_fonts_disabled=Интернет фонтовите се оневозможени: не може да се користат вградените PDF фонтови. +document_colors_not_allowed=PDF-документите немаат дозвола да користат сопствени бои: Поставката „Дозволи страниците сами да ги избираат своите бои“ е деактивирана од прелистувачот. diff --git a/src/cps/static/locale/ml/viewer.properties b/src/cps/static/locale/ml/viewer.properties new file mode 100644 index 0000000..d77d34c --- /dev/null +++ b/src/cps/static/locale/ml/viewer.properties @@ -0,0 +1,174 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=മുമ്പുള്ള താള്‍ +previous_label=മുമ്പു് +next.title=അടുത്ത താള്‍ +next_label=അടുത്തതു് + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=ചെറുതാക്കുക +zoom_out_label=ചെറുതാക്കുക +zoom_in.title=വലുതാക്കുക +zoom_in_label=വലുതാക്കുക +zoom.title=വ്യാപ്തി മാറ്റുക +presentation_mode.title=പ്രസന്റേഷന്‍ രീതിയിലേക്കു് മാറ്റുക +presentation_mode_label=പ്രസന്റേഷന്‍ രീതി +open_file.title=ഫയല്‍ തുറക്കുക +open_file_label=തുറക്കുക +print.title=പ്രിന്റ് ചെയ്യുക +print_label=പ്രിന്റ് ചെയ്യുക +download.title=ഡൌണ്‍ലോഡ് ചെയ്യുക +download_label=ഡൌണ്‍ലോഡ് ചെയ്യുക +bookmark.title=നിലവിലുള്ള കാഴ്ച (പുതിയ ജാലകത്തില്‍ പകര്‍ത്തുക അല്ലെങ്കില്‍ തുറക്കുക) +bookmark_label=നിലവിലുള്ള കാഴ്ച + +# Secondary toolbar and context menu +tools.title=ഉപകരണങ്ങള്‍ +tools_label=ഉപകരണങ്ങള്‍ +first_page.title=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക +first_page.label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക +first_page_label=ആദ്യത്തെ താളിലേയ്ക്കു് പോകുക +last_page.title=അവസാന താളിലേയ്ക്കു് പോകുക +last_page.label=അവസാന താളിലേയ്ക്കു് പോകുക +last_page_label=അവസാന താളിലേയ്ക്കു് പോകുക +page_rotate_cw.title=ഘടികാരദിശയില്‍ കറക്കുക +page_rotate_cw.label=ഘടികാരദിശയില്‍ കറക്കുക +page_rotate_cw_label=ഘടികാരദിശയില്‍ കറക്കുക +page_rotate_ccw.title=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക +page_rotate_ccw.label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക +page_rotate_ccw_label=ഘടികാര ദിശയ്ക്കു് വിപരീതമായി കറക്കുക + +hand_tool_enable.title=ഹാന്‍ഡ് ടൂള്‍ പ്രവര്‍ത്തന സജ്ജമാക്കുക +hand_tool_enable_label=ഹാന്‍ഡ് ടൂള്‍ പ്രവര്‍ത്തന സജ്ജമാക്കുക +hand_tool_disable.title=ഹാന്‍ഡ് ടൂള്‍ പ്രവര്‍ത്തന രഹിതമാക്കുക +hand_tool_disable_label=ഹാന്‍ഡ് ടൂള്‍ പ്രവര്‍ത്തന രഹിതമാക്കുക + +# Document properties dialog box +document_properties.title=രേഖയുടെ വിശേഷതകള്‍... +document_properties_label=രേഖയുടെ വിശേഷതകള്‍... +document_properties_file_name=ഫയലിന്റെ പേര്‌: +document_properties_file_size=ഫയലിന്റെ വലിപ്പം:‌‌ +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} കെബി ({{size_b}} ബൈറ്റുകള്‍) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} എംബി ({{size_b}} ബൈറ്റുകള്‍) +document_properties_title=തലക്കെട്ട്‌\u0020 +document_properties_author=രചയിതാവ്: +document_properties_subject=വിഷയം: +document_properties_keywords=കീവേര്‍ഡുകള്‍: +document_properties_creation_date=പൂര്‍ത്തിയാകുന്ന തീയതി: +document_properties_modification_date=മാറ്റം വരുത്തിയ തീയതി: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=സൃഷ്ടികര്‍ത്താവ്: +document_properties_producer=പിഡിഎഫ് പ്രൊഡ്യൂസര്‍: +document_properties_version=പിഡിഎഫ് പതിപ്പ്: +document_properties_page_count=താളിന്റെ എണ്ണം: +document_properties_close=അടയ്ക്കുക + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=സൈഡ് ബാറിലേക്കു് മാറ്റുക +toggle_sidebar_label=സൈഡ് ബാറിലേക്കു് മാറ്റുക +document_outline_label=രേഖയുടെ ഔട്ട്ലൈന്‍ +attachments.title=അറ്റാച്മെന്റുകള്‍ കാണിയ്ക്കുക +attachments_label=അറ്റാച്മെന്റുകള്‍ +thumbs.title=തംബ്നെയിലുകള്‍ കാണിയ്ക്കുക +thumbs_label=തംബ്നെയിലുകള്‍ +findbar.title=രേഖയില്‍ കണ്ടുപിടിയ്ക്കുക +findbar_label=കണ്ടെത്തുക\u0020 + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=താള്‍ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} താളിനുള്ള തംബ്നെയില്‍ + +# Find panel button title and messages +find_label=കണ്ടെത്തുക +find_previous.title=വാചകം ഇതിനു മുന്‍പ്‌ ആവര്‍ത്തിച്ചത്‌ കണ്ടെത്തുക\u0020 +find_previous_label=മുമ്പു് +find_next.title=വാചകം വീണ്ടും ആവര്‍ത്തിക്കുന്നത്‌ കണ്ടെത്തുക\u0020 +find_next_label=അടുത്തതു് +find_highlight=എല്ലാം എടുത്തുകാണിയ്ക്കുക +find_match_case_label=അക്ഷരങ്ങള്‍ ഒത്തുനോക്കുക +find_reached_top=രേഖയുടെ മുകളില്‍ എത്തിയിരിക്കുന്നു, താഴെ നിന്നും തുടരുന്നു +find_reached_bottom=രേഖയുടെ അവസാനം വരെ എത്തിയിരിക്കുന്നു, മുകളില്‍ നിന്നും തുടരുന്നു\u0020 +find_not_found=വാചകം കണ്ടെത്താനായില്ല\u0020 + +# Error panel labels +error_more_info=കൂടുതല്‍ വിവരം +error_less_info=കുറച്ച് വിവരം +error_close=അടയ്ക്കുക +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=സന്ദേശം: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=സ്റ്റാക്ക്: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ഫയല്‍: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=വരി: {{line}} +rendering_error=താള്‍ റെണ്ടര്‍ ചെയ്യുമ്പോള്‍‌ പിശകുണ്ടായിരിയ്ക്കുന്നു. + +# Predefined zoom values +page_scale_width=താളിന്റെ വീതി +page_scale_fit=താള്‍ പാകത്തിനാക്കുക +page_scale_auto=സ്വയമായി വലുതാക്കുക +page_scale_actual=യഥാര്‍ത്ഥ വ്യാപ്തി +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=പിശക് +loading_error=പിഡിഎഫ് ലഭ്യമാക്കുമ്പോള്‍ പിശക് ഉണ്ടായിരിയ്ക്കുന്നു. +invalid_file_error=തെറ്റായ അല്ലെങ്കില്‍ തകരാറുള്ള പിഡിഎഫ് ഫയല്‍. +missing_file_error=പിഡിഎഫ് ഫയല്‍ ലഭ്യമല്ല. +unexpected_response_error=പ്രതീക്ഷിക്കാത്ത സെര്‍വര്‍ മറുപടി. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=ഈ പിഡിഎഫ് ഫയല്‍ തുറക്കുന്നതിനു് രഹസ്യവാക്ക് നല്‍കുക. +password_invalid=തെറ്റായ രഹസ്യവാക്ക്, ദയവായി വീണ്ടും ശ്രമിയ്ക്കുക. +password_ok=ശരി + +printing_not_supported=മുന്നറിയിപ്പു്: ഈ ബ്രൌസര്‍ പൂര്‍ണ്ണമായി പ്രിന്റിങ് പിന്തുണയ്ക്കുന്നില്ല. +printing_not_ready=മുന്നറിയിപ്പു്: പ്രിന്റ് ചെയ്യുന്നതിനു് പിഡിഎഫ് പൂര്‍ണ്ണമായി ലഭ്യമല്ല. +web_fonts_disabled=വെബിനുള്ള അക്ഷരസഞ്ചയങ്ങള്‍ പ്രവര്‍ത്തന രഹിതം: എംബഡ്ഡ് ചെയ്ത പിഡിഎഫ് അക്ഷരസഞ്ചയങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ സാധ്യമല്ല. +document_colors_not_allowed=സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ പിഡിഎഫ് രേഖകള്‍ക്കു് അനുവാദമില്ല: 'സ്വന്തം നിറങ്ങള്‍ ഉപയോഗിയ്ക്കുവാന്‍ താളുകളെ അനുവദിയ്ക്കുക' എന്നതു് ബ്രൌസറില്‍ നിര്‍ജീവമാണു്. diff --git a/src/cps/static/locale/mn/viewer.properties b/src/cps/static/locale/mn/viewer.properties new file mode 100644 index 0000000..138ce3c --- /dev/null +++ b/src/cps/static/locale/mn/viewer.properties @@ -0,0 +1,83 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom.title=Тэлэлт +open_file.title=Файл нээ +open_file_label=Нээ + +# Secondary toolbar and context menu + + +# Document properties dialog box +document_properties_file_name=Файлын нэр: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_title=Гарчиг: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +findbar_label=Ол + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. + +# Find panel button title and messages +find_previous.title=Хайлтын өмнөх олдцыг харуулна +find_next.title=Хайлтын дараагийн олдцыг харуулна +find_not_found=Олдсонгүй + +# Error panel labels +error_more_info=Нэмэлт мэдээлэл +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number + +# Predefined zoom values +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=Алдаа + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +password_ok=OK + diff --git a/src/cps/static/locale/mr/viewer.properties b/src/cps/static/locale/mr/viewer.properties new file mode 100644 index 0000000..f3e9e67 --- /dev/null +++ b/src/cps/static/locale/mr/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=मागील पृष्ठ +previous_label=मागील +next.title=पुढील पृष्ठ +next_label=पुढील + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=पृष्ठ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pageCount}}पैकी +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pagesCount}} पैकी {{pageNumber}}) + +zoom_out.title=छोटे करा +zoom_out_label=छोटे करा +zoom_in.title=मोठे करा +zoom_in_label=मोठे करा +zoom.title=लहान किंवा मोठे करा +presentation_mode.title=प्रस्तुतिकरण मोडचा वापर करा +presentation_mode_label=प्रस्तुतिकरण मोड +open_file.title=फाइल उघडा +open_file_label=उघडा +print.title=छपाई करा +print_label=छपाई करा +download.title=डाउनलोड करा +download_label=डाउनलोड करा +bookmark.title=सध्याचे अवलोकन (नवीन पटलात प्रत बनवा किंवा उघडा) +bookmark_label=सध्याचे अवलोकन + +# Secondary toolbar and context menu +tools.title=साधने +tools_label=साधने +first_page.title=पहिल्या पृष्ठावर जा +first_page.label=पहिल्या पृष्ठावर जा +first_page_label=पहिल्या पृष्ठावर जा +last_page.title=शेवटच्या पृष्ठावर जा +last_page.label=शेवटच्या पृष्ठावर जा +last_page_label=शेवटच्या पृष्ठावर जा +page_rotate_cw.title=घड्याळाच्या काट्याच्या दिशेने फिरवा +page_rotate_cw.label=घड्याळाच्या काट्याच्या दिशेने फिरवा +page_rotate_cw_label=घड्याळाच्या काट्याच्या दिशेने फिरवा +page_rotate_ccw.title=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा +page_rotate_ccw.label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा +page_rotate_ccw_label=घड्याळाच्या काट्याच्या उलट दिशेने फिरवा + +hand_tool_enable.title=हात साधन सुरू करा +hand_tool_enable_label=हात साधन सुरू करा +hand_tool_disable.title=हात साधन बंद करा +hand_tool_disable_label=हात साधन बंद करा + +# Document properties dialog box +document_properties.title=दस्तऐवज गुणधर्म… +document_properties_label=दस्तऐवज गुणधर्म… +document_properties_file_name=फाइलचे नाव: +document_properties_file_size=फाइल आकार: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} बाइट्स) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} बाइट्स) +document_properties_title=शिर्षक: +document_properties_author=लेखक: +document_properties_subject=विषय: +document_properties_keywords=मुख्यशब्द: +document_properties_creation_date=निर्माण दिनांक: +document_properties_modification_date=दुरूस्ती दिनांक: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=निर्माता: +document_properties_producer=PDF निर्माता: +document_properties_version=PDF आवृत्ती: +document_properties_page_count=पृष्ठ संख्या: +document_properties_close=बंद करा + +print_progress_message=छपाई करीता पृष्ठ तयार करीत आहे… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=रद्द करा + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=बाजूचीपट्टी टॉगल करा +toggle_sidebar_label=बाजूचीपट्टी टॉगल करा +document_outline.title=दस्तऐवज बाह्यरेखा दर्शवा (विस्तृत करण्यासाठी दोनवेळा क्लिक करा /सर्व घटक दाखवा) +document_outline_label=दस्तऐवज रूपरेषा +attachments.title=जोडपत्र दाखवा +attachments_label=जोडपत्र +thumbs.title=थंबनेल्स् दाखवा +thumbs_label=थंबनेल्स् +findbar.title=दस्तऐवजात शोधा +findbar_label=शोधा + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=पृष्ठ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=पृष्ठाचे थंबनेल {{page}} + +# Find panel button title and messages +find_label=शोधा: +find_previous.title=वाकप्रयोगची मागील घटना शोधा +find_previous_label=मागील +find_next.title=वाकप्रयोगची पुढील घटना शोधा +find_next_label=पुढील +find_highlight=सर्व ठळक करा +find_match_case_label=आकार जुळवा +find_reached_top=दस्तऐवजाच्या शीर्षकास पोहचले, तळपासून पुढे +find_reached_bottom=दस्तऐवजाच्या तळाला पोहचले, शीर्षकापासून पुढे +find_not_found=वाकप्रयोग आढळले नाही + +# Error panel labels +error_more_info=आणखी माहिती +error_less_info=कमी माहिती +error_close=बंद करा +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=संदेश: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=स्टॅक: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=फाइल: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=रेष: {{line}} +rendering_error=पृष्ठ दाखवतेवेळी त्रुटी आढळली. + +# Predefined zoom values +page_scale_width=पृष्ठाची रूंदी +page_scale_fit=पृष्ठ बसवा +page_scale_auto=स्वयं लाहन किंवा मोठे करणे +page_scale_actual=प्रत्यक्ष आकार +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=त्रुटी +loading_error=PDF लोड करतेवेळी त्रुटी आढळली. +invalid_file_error=अवैध किंवा दोषीत PDF फाइल. +missing_file_error=न आढळणारी PDF फाइल. +unexpected_response_error=अनपेक्षित सर्व्हर प्रतिसाद. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} टिपण्णी] +password_label=ही PDF फाइल उघडण्याकरिता पासवर्ड द्या. +password_invalid=अवैध पासवर्ड. कृपया पुन्हा प्रयत्न करा. +password_ok=ठीक आहे +password_cancel=रद्द करा + +printing_not_supported=सावधानता: या ब्राउझरतर्फे छपाइ पूर्णपणे समर्थीत नाही. +printing_not_ready=सावधानता: छपाईकरिता PDF पूर्णतया लोड झाले नाही. +web_fonts_disabled=वेब टंक असमर्थीत आहेत: एम्बेडेड PDF टंक वापर अशक्य. +document_colors_not_allowed=PDF दस्तऐवजांना त्यांचे रंग वापरण्यास अनुमती नाही: ब्राउझरमध्ये ' पृष्ठांना त्यांचे रंग निवडण्यास अनुमती द्या' बंद केले आहे. diff --git a/src/cps/static/locale/ms/viewer.properties b/src/cps/static/locale/ms/viewer.properties new file mode 100644 index 0000000..c99affd --- /dev/null +++ b/src/cps/static/locale/ms/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Halaman Sebelum +previous_label=Terdahulu +next.title=Halaman Seterusnya +next_label=Berikut + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Halaman +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=daripada {{pageCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} daripada {{pagesCount}}) + +zoom_out.title=Zum Keluar +zoom_out_label=Zum Keluar +zoom_in.title=Zum Masuk +zoom_in_label=Zum Masuk +zoom.title=Zum +presentation_mode.title=Tukar ke Mod Persembahan +presentation_mode_label=Mod Persembahan +open_file.title=Buka Fail +open_file_label=Buka +print.title=Cetak +print_label=Cetak +download.title=Muat turun +download_label=Muat turun +bookmark.title=Paparan semasa (salin atau buka dalam tetingkap baru) +bookmark_label=Paparan Semasa + +# Secondary toolbar and context menu +tools.title=Alatan +tools_label=Alatan +first_page.title=Pergi ke Halaman Pertama +first_page.label=Pergi ke Halaman Pertama +first_page_label=Pergi ke Halaman Pertama +last_page.title=Pergi ke Halaman Terakhir +last_page.label=Pergi ke Halaman Terakhir +last_page_label=Pergi ke Halaman Terakhir +page_rotate_cw.title=Berputar ikut arah Jam +page_rotate_cw.label=Berputar ikut arah Jam +page_rotate_cw_label=Berputar ikut arah Jam +page_rotate_ccw.title=Pusing berlawan arah jam +page_rotate_ccw.label=Pusing berlawan arah jam +page_rotate_ccw_label=Pusing berlawan arah jam + +hand_tool_enable.title=Dayakan alatan tangan +hand_tool_enable_label=Dayakan alatan tangan +hand_tool_disable.title=Nyahdayakan alat tangan +hand_tool_disable_label=Nyahdayakan alat tangan + +# Document properties dialog box +document_properties.title=Sifat Dokumen… +document_properties_label=Sifat Dokumen… +document_properties_file_name=Nama fail: +document_properties_file_size=Saiz fail: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bait) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bait) +document_properties_title=Tajuk: +document_properties_author=Pengarang: +document_properties_subject=Subjek: +document_properties_keywords=Kata kunci: +document_properties_creation_date=Masa Dicipta: +document_properties_modification_date=Tarikh Ubahsuai: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Pencipta: +document_properties_producer=Pengeluar PDF: +document_properties_version=Versi PDF: +document_properties_page_count=Kiraan Laman: +document_properties_close=Tutup + +print_progress_message=Menyediakan dokumen untuk dicetak… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Batal + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Togol Bar Sisi +toggle_sidebar_label=Togol Bar Sisi +document_outline.title=Papar Rangka Dokumen (klik-dua-kali untuk kembangkan/kolaps semua item) +document_outline_label=Rangka Dokumen +attachments.title=Papar Lampiran +attachments_label=Lampiran +thumbs.title=Papar Thumbnails +thumbs_label=Imej kecil +findbar.title=Cari didalam Dokumen +findbar_label=Cari + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Halaman {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Halaman Imej kecil {{page}} + +# Find panel button title and messages +find_label=Cari: +find_previous.title=Cari teks frasa berkenaan yang terdahulu +find_previous_label=Sebelumnya +find_next.title=Cari teks frasa berkenaan yang berikut +find_next_label=Berikut +find_highlight=Serlahkan semua +find_match_case_label=Kes Sepadan +find_reached_top=Mencapai teratas daripada dokumen, sambungan daripada bawah +find_reached_bottom=Mencapai terakhir daripada dokumen, sambungan daripada atas +find_not_found=Frasa tidak ditemui + +# Error panel labels +error_more_info=Maklumat lanjut +error_less_info=Kurang Informasi +error_close=Tutup +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mesej: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Timbun: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fail: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Garis: {{line}} +rendering_error=Ralat berlaku ketika memberikan halaman. + +# Predefined zoom values +page_scale_width=Lebar Halaman +page_scale_fit=Muat Halaman +page_scale_auto=Zoom Automatik +page_scale_actual=Saiz Sebenar +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Ralat +loading_error=Masalah berlaku semasa menuatkan sebuah PDF. +invalid_file_error=Tidak sah atau fail PDF rosak. +missing_file_error=Fail PDF Hilang. +unexpected_response_error=Respon pelayan yang tidak dijangka. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Anotasi] +password_label=Masukan kata kunci untuk membuka fail PDF ini. +password_invalid=Kata laluan salah. Cuba lagi. +password_ok=OK +password_cancel=Batal + +printing_not_supported=Amaran: Cetakan ini tidak sepenuhnya disokong oleh pelayar ini. +printing_not_ready=Amaran: PDF tidak sepenuhnya dimuatkan untuk dicetak. +web_fonts_disabled=Fon web dinyahdayakan: tidak dapat menggunakan fon terbenam PDF. +document_colors_not_allowed=Dokumen PDF tidak dibenarkan untuk menggunakan warna sendiri: “Izinkan halaman untuk memilih warna sendiri” telah dinyahaktifkan dalam pelayar. diff --git a/src/cps/static/locale/my/viewer.properties b/src/cps/static/locale/my/viewer.properties new file mode 100644 index 0000000..a4a30a9 --- /dev/null +++ b/src/cps/static/locale/my/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=အရင် စာမျက်နှာ +previous_label=အရင်နေရာ +next.title=ရှေ့ စာမျက်နှာ +next_label=နောက်တခု + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=စာမျက်နှာ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} ၏ +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pagesCount}} ၏ {{pageNumber}}) + +zoom_out.title=ချုံ့ပါ +zoom_out_label=ချုံ့ပါ +zoom_in.title=ချဲ့ပါ +zoom_in_label=ချဲ့ပါ +zoom.title=ချုံ့/ချဲ့ပါ +presentation_mode.title=ဆွေးနွေးတင်ပြစနစ်သို့ ကူးပြောင်းပါ +presentation_mode_label=ဆွေးနွေးတင်ပြစနစ် +open_file.title=ဖိုင်အားဖွင့်ပါ။ +open_file_label=ဖွင့်ပါ +print.title=ပုံနှိုပ်ပါ +print_label=ပုံနှိုပ်ပါ +download.title=ကူးဆွဲ +download_label=ကူးဆွဲ +bookmark.title=လက်ရှိ မြင်ကွင်း (ဝင်းဒိုးအသစ်မှာ ကူးပါ သို့မဟုတ် ဖွင့်ပါ) +bookmark_label=လက်ရှိ မြင်ကွင်း + +# Secondary toolbar and context menu +tools.title=ကိရိယာများ +tools_label=ကိရိယာများ +first_page.title=ပထမ စာမျက်နှာသို့ +first_page.label=ပထမ စာမျက်နှာသို့ +first_page_label=ပထမ စာမျက်နှာသို့ +last_page.title=နောက်ဆုံး စာမျက်နှာသို့ +last_page.label=နောက်ဆုံး စာမျက်နှာသို့ +last_page_label=နောက်ဆုံး စာမျက်နှာသို့ +page_rotate_cw.title=နာရီလက်တံ အတိုင်း +page_rotate_cw.label=နာရီလက်တံ အတိုင်း +page_rotate_cw_label=နာရီလက်တံ အတိုင်း +page_rotate_ccw.title=နာရီလက်တံ ပြောင်းပြန် +page_rotate_ccw.label=နာရီလက်တံ ပြောင်းပြန် +page_rotate_ccw_label=နာရီလက်တံ ပြောင်းပြန် + +hand_tool_enable.title=လက်ကိုင် ကိရိယာအားသုံး +hand_tool_enable_label=လက်ကိုင် ကိရိယာဖွင့် +hand_tool_disable.title=လက်ကိုင် ကိရိယာအားပိတ် +hand_tool_disable_label=လက်ကိုင်ကိရိယာ အားပိတ် + +# Document properties dialog box +document_properties.title=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ +document_properties_label=မှတ်တမ်းမှတ်ရာ ဂုဏ်သတ္တိများ +document_properties_file_name=ဖိုင် : +document_properties_file_size=ဖိုင်ဆိုဒ် : +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} ကီလိုဘိုတ် ({size_kb}}ဘိုတ်) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=ခေါင်းစဉ်‌ - +document_properties_author=ရေးသားသူ: +document_properties_subject=အကြောင်းအရာ:\u0020 +document_properties_keywords=သော့ချက် စာလုံး: +document_properties_creation_date=ထုတ်လုပ်ရက်စွဲ: +document_properties_modification_date=ပြင်ဆင်ရက်စွဲ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=ဖန်တီးသူ: +document_properties_producer=PDF ထုတ်လုပ်သူ: +document_properties_version=PDF ဗားရှင်း: +document_properties_page_count=စာမျက်နှာအရေအတွက်: +document_properties_close=ပိတ် + +print_progress_message=Preparing document for printing… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=ပယ်​ဖျက်ပါ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=ဘေးတန်းဖွင့်ပိတ် +toggle_sidebar_label=ဖွင့်ပိတ် ဆလိုက်ဒါ +document_outline.title=စာတမ်းအကျဉ်းချုပ်ကို ပြပါ (စာရင်းအားလုံးကို ချုံ့/ချဲ့ရန် ကလစ်နှစ်ချက်နှိပ်ပါ) +document_outline_label=စာတမ်းအကျဉ်းချုပ် +attachments.title=တွဲချက်များ ပြပါ +attachments_label=တွဲထားချက်များ +thumbs.title=ပုံရိပ်ငယ်များကို ပြပါ +thumbs_label=ပုံရိပ်ငယ်များ +findbar.title=Find in Document +findbar_label=ရှာဖွေပါ + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=စာမျက်နှာ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=စာမျက်နှာရဲ့ ပုံရိပ်ငယ် {{page}} + +# Find panel button title and messages +find_label=ရှာဖွေပါ - +find_previous.title=စကားစုရဲ့ အရင် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ +find_previous_label=နောက်သို့ +find_next.title=စကားစုရဲ့ နောက်ထပ် ​ဖြစ်ပွားမှုကို ရှာဖွေပါ +find_next_label=ရှေ့သို့ +find_highlight=အားလုံးကို မျဉ်းသားပါ +find_match_case_label=စာလုံး တိုက်ဆိုင်ပါ +find_reached_top=စာမျက်နှာထိပ် ရောက်နေပြီ၊ အဆုံးကနေ ပြန်စပါ +find_reached_bottom=စာမျက်နှာအဆုံး ရောက်နေပြီ၊ ထိပ်ကနေ ပြန်စပါ +find_not_found=စကားစု မတွေ့ရဘူး + +# Error panel labels +error_more_info=နောက်ထပ်အချက်အလက်များ +error_less_info=အနည်းငယ်မျှသော သတင်းအချက်အလက် +error_close=ပိတ် +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=မက်ဆေ့ - {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=အထပ် - {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ဖိုင် {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=လိုင်း - {{line}} +rendering_error=စာမျက်နှာကို ပုံဖော်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။ + +# Predefined zoom values +page_scale_width=စာမျက်နှာ အကျယ် +page_scale_fit=စာမျက်နှာ ကွက်တိ +page_scale_auto=အလိုအလျောက် ချုံ့ချဲ့ +page_scale_actual=အမှန်တကယ်ရှိတဲ့ အရွယ် +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=အမှား +loading_error=PDF ဖိုင် ကိုဆွဲတင်နေချိန်မှာ အမှားတစ်ခုတွေ့ရပါတယ်။ +invalid_file_error=မရသော သို့ ပျက်နေသော PDF ဖိုင် +missing_file_error=PDF ပျောက်ဆုံး +unexpected_response_error=မမျှော်လင့်ထားသော ဆာဗာမှ ပြန်ကြားချက် + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} အဓိပ္ပာယ်ဖွင့်ဆိုချက်] +password_label=PDF အားဖွင့်ရန် ပတ်စ်ဝတ်အားထည့်ပါ +password_invalid=စာဝှက် မှားသည်။ ထပ်ကြိုးစားကြည့်ပါ။ +password_ok=OK +password_cancel=ပယ်​ဖျက်ပါ + +printing_not_supported=သတိပေးချက်၊ပရင့်ထုတ်ခြင်းကိုဤဘယောက်ဆာသည် ပြည့်ဝစွာထောက်ပံ့မထားပါ ။ +printing_not_ready=သတိပေးချက်: ယခု PDF ဖိုင်သည် ပုံနှိပ်ရန် မပြည့်စုံပါ +web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts. +document_colors_not_allowed=PDF ဖိုင်အား ၎င်းဤ ကိုယ်ပိုင်အရောင်များကို အသုံးပြုခွင့်မပေးထားပါ ။ 'စာမျက်နှာအားလုံးအားအရောင်ရွေးချယ်ခွင့်' အား ယခု ဘယောက်ဆာတွင် ပိတ်ထားခြင်းကြောင့်ဖြစ် သှ် diff --git a/src/cps/static/locale/nb-NO/viewer.properties b/src/cps/static/locale/nb-NO/viewer.properties new file mode 100644 index 0000000..0be0acb --- /dev/null +++ b/src/cps/static/locale/nb-NO/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Forrige side +previous_label=Forrige +next.title=Neste side +next_label=Neste + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Side +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=av {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} av {{pagesCount}}) + +zoom_out.title=Zoom ut +zoom_out_label=Zoom ut +zoom_in.title=Zoom inn +zoom_in_label=Zoom inn +zoom.title=Zoom +presentation_mode.title=Bytt til presentasjonsmodus +presentation_mode_label=Presentasjonsmodus +open_file.title=Åpne fil +open_file_label=Åpne +print.title=Skriv ut +print_label=Skriv ut +download.title=Last ned +download_label=Last ned +bookmark.title=Nåværende visning (kopier eller åpne i et nytt vindu) +bookmark_label=Nåværende visning + +# Secondary toolbar and context menu +tools.title=Verktøy +tools_label=Verktøy +first_page.title=Gå til første side +first_page.label=Gå til første side +first_page_label=Gå til første side +last_page.title=Gå til siste side +last_page.label=Gå til siste side +last_page_label=Gå til siste side +page_rotate_cw.title=Roter med klokken +page_rotate_cw.label=Roter med klokken +page_rotate_cw_label=Roter med klokken +page_rotate_ccw.title=Roter mot klokken +page_rotate_ccw.label=Roter mot klokken +page_rotate_ccw_label=Roter mot klokken + +hand_tool_enable.title=Slå på hånd-verktøy +hand_tool_enable_label=Slå på hånd-verktøy +hand_tool_disable.title=Slå av hånd-verktøy +hand_tool_disable_label=Slå av hånd-verktøy + +# Document properties dialog box +document_properties.title=Dokumentegenskaper … +document_properties_label=Dokumentegenskaper … +document_properties_file_name=Filnavn: +document_properties_file_size=Filstørrelse: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Dokumentegenskaper … +document_properties_author=Forfatter: +document_properties_subject=Emne: +document_properties_keywords=Nøkkelord: +document_properties_creation_date=Opprettet dato: +document_properties_modification_date=Endret dato: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Opprettet av: +document_properties_producer=PDF-verktøy: +document_properties_version=PDF-versjon: +document_properties_page_count=Sideantall: +document_properties_close=Lukk + +print_progress_message=Forbereder dokument for utskrift … +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Avbryt + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Slå av/på sidestolpe +toggle_sidebar_label=Slå av/på sidestolpe +document_outline.title=Vis dokumentdisposisjonen (dobbeltklikk for å utvide/skjule alle elementer) +document_outline_label=Dokumentdisposisjon +attachments.title=Vis vedlegg +attachments_label=Vedlegg +thumbs.title=Vis miniatyrbilde +thumbs_label=Miniatyrbilde +findbar.title=Finn i dokumentet +findbar_label=Finn + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Side {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatyrbilde av side {{page}} + +# Find panel button title and messages +find_label=Finn: +find_previous.title=Finn forrige forekomst av frasen +find_previous_label=Forrige +find_next.title=Finn neste forekomst av frasen +find_next_label=Neste +find_highlight=Uthev alle +find_match_case_label=Skill store/små bokstaver +find_reached_top=Nådde toppen av dokumentet, fortsetter fra bunnen +find_reached_bottom=Nådde bunnen av dokumentet, fortsetter fra toppen +find_not_found=Fant ikke teksten + +# Error panel labels +error_more_info=Mer info +error_less_info=Mindre info +error_close=Lukk +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (bygg: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Melding: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stakk: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fil: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linje: {{line}} +rendering_error=En feil oppstod ved opptegning av siden. + +# Predefined zoom values +page_scale_width=Sidebredde +page_scale_fit=Tilpass til siden +page_scale_auto=Automatisk zoom +page_scale_actual=Virkelig størrelse +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}} % + +# Loading indicator messages +loading_error_indicator=Feil +loading_error=En feil oppstod ved lasting av PDF. +invalid_file_error=Ugyldig eller skadet PDF-fil. +missing_file_error=Manglende PDF-fil. +unexpected_response_error=Uventet serverrespons. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} annotasjon] +password_label=Skriv inn passordet for å åpne denne PDF-filen. +password_invalid=Ugyldig passord. Prøv igjen. +password_ok=OK +password_cancel=Avbryt + +printing_not_supported=Advarsel: Utskrift er ikke fullstendig støttet av denne nettleseren. +printing_not_ready=Advarsel: PDF er ikke fullstendig innlastet for utskrift. +web_fonts_disabled=Web-fonter er avslått: Kan ikke bruke innbundne PDF-fonter. +document_colors_not_allowed=PDF-dokumenter tillates ikke å bruke deres egne farger: "Tillat sider å velge egne farger" er deaktivert i nettleseren. diff --git a/src/cps/static/locale/nl/viewer.properties b/src/cps/static/locale/nl/viewer.properties new file mode 100644 index 0000000..fedc5fa --- /dev/null +++ b/src/cps/static/locale/nl/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Vorige pagina +previous_label=Vorige +next.title=Volgende pagina +next_label=Volgende + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pagina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=van {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} van {{pagesCount}}) + +zoom_out.title=Uitzoomen +zoom_out_label=Uitzoomen +zoom_in.title=Inzoomen +zoom_in_label=Inzoomen +zoom.title=Zoomen +presentation_mode.title=Wisselen naar presentatiemodus +presentation_mode_label=Presentatiemodus +open_file.title=Bestand openen +open_file_label=Openen +print.title=Afdrukken +print_label=Afdrukken +download.title=Downloaden +download_label=Downloaden +bookmark.title=Huidige weergave (kopiëren of openen in nieuw venster) +bookmark_label=Huidige weergave + +# Secondary toolbar and context menu +tools.title=Hulpmiddelen +tools_label=Hulpmiddelen +first_page.title=Naar eerste pagina gaan +first_page.label=Naar eerste pagina gaan +first_page_label=Naar eerste pagina gaan +last_page.title=Naar laatste pagina gaan +last_page.label=Naar laatste pagina gaan +last_page_label=Naar laatste pagina gaan +page_rotate_cw.title=Rechtsom draaien +page_rotate_cw.label=Rechtsom draaien +page_rotate_cw_label=Rechtsom draaien +page_rotate_ccw.title=Linksom draaien +page_rotate_ccw.label=Linksom draaien +page_rotate_ccw_label=Linksom draaien + +hand_tool_enable.title=Handhulpmiddel inschakelen +hand_tool_enable_label=Handhulpmiddel inschakelen +hand_tool_disable.title=Handhulpmiddel uitschakelen +hand_tool_disable_label=Handhulpmiddel uitschakelen + +# Document properties dialog box +document_properties.title=Documenteigenschappen… +document_properties_label=Documenteigenschappen… +document_properties_file_name=Bestandsnaam: +document_properties_file_size=Bestandsgrootte: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titel: +document_properties_author=Auteur: +document_properties_subject=Onderwerp: +document_properties_keywords=Trefwoorden: +document_properties_creation_date=Aanmaakdatum: +document_properties_modification_date=Wijzigingsdatum: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Auteur: +document_properties_producer=PDF-producent: +document_properties_version=PDF-versie: +document_properties_page_count=Aantal pagina’s: +document_properties_close=Sluiten + +print_progress_message=Document voorbereiden voor afdrukken… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Annuleren + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Zijbalk in-/uitschakelen +toggle_sidebar_label=Zijbalk in-/uitschakelen +document_outline.title=Documentoverzicht tonen (dubbelklik om alle items uit/samen te vouwen) +document_outline_label=Documentoverzicht +attachments.title=Bijlagen tonen +attachments_label=Bijlagen +thumbs.title=Miniaturen tonen +thumbs_label=Miniaturen +findbar.title=Zoeken in document +findbar_label=Zoeken + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pagina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatuur van pagina {{page}} + +# Find panel button title and messages +find_label=Zoeken: +find_previous.title=De vorige overeenkomst van de tekst zoeken +find_previous_label=Vorige +find_next.title=De volgende overeenkomst van de tekst zoeken +find_next_label=Volgende +find_highlight=Alles markeren +find_match_case_label=Hoofdlettergevoelig +find_reached_top=Bovenkant van document bereikt, doorgegaan vanaf onderkant +find_reached_bottom=Onderkant van document bereikt, doorgegaan vanaf bovenkant +find_not_found=Tekst niet gevonden + +# Error panel labels +error_more_info=Meer informatie +error_less_info=Minder informatie +error_close=Sluiten +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Bericht: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Bestand: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Regel: {{line}} +rendering_error=Er is een fout opgetreden bij het weergeven van de pagina. + +# Predefined zoom values +page_scale_width=Paginabreedte +page_scale_fit=Hele pagina +page_scale_auto=Automatisch zoomen +page_scale_actual=Werkelijke grootte +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Fout +loading_error=Er is een fout opgetreden bij het laden van de PDF. +invalid_file_error=Ongeldig of beschadigd PDF-bestand. +missing_file_error=PDF-bestand ontbreekt. +unexpected_response_error=Onverwacht serverantwoord. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}}-aantekening] +password_label=Voer het wachtwoord in om dit PDF-bestand te openen. +password_invalid=Ongeldig wachtwoord. Probeer het opnieuw. +password_ok=OK +password_cancel=Annuleren + +printing_not_supported=Waarschuwing: afdrukken wordt niet volledig ondersteund door deze browser. +printing_not_ready=Waarschuwing: de PDF is niet volledig geladen voor afdrukken. +web_fonts_disabled=Weblettertypen zijn uitgeschakeld: gebruik van ingebedde PDF-lettertypen is niet mogelijk. +document_colors_not_allowed=PDF-documenten mogen hun eigen kleuren niet gebruiken: ‘Pagina’s toestaan om hun eigen kleuren te kiezen’ is uitgeschakeld in de browser. diff --git a/src/cps/static/locale/nn-NO/viewer.properties b/src/cps/static/locale/nn-NO/viewer.properties new file mode 100644 index 0000000..298b635 --- /dev/null +++ b/src/cps/static/locale/nn-NO/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Førre side +previous_label=Førre +next.title=Neste side +next_label=Neste + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Side +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=av {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} av {{pagesCount}}) + +zoom_out.title=Mindre +zoom_out_label=Mindre +zoom_in.title=Større +zoom_in_label=Større +zoom.title=Skalering +presentation_mode.title=Byt til presentasjonsmodus +presentation_mode_label=Presentasjonsmodus +open_file.title=Opna fil +open_file_label=Opna +print.title=Skriv ut +print_label=Skriv ut +download.title=Last ned +download_label=Last ned +bookmark.title=Gjeldande vising (kopier eller opna i nytt vindauge) +bookmark_label=Gjeldande vising + +# Secondary toolbar and context menu +tools.title=Verktøy +tools_label=Verktøy +first_page.title=Gå til fyrstesida +first_page.label=Gå til fyrstesida +first_page_label=Gå til fyrstesida +last_page.title=Gå til siste side +last_page.label=Gå til siste side +last_page_label=Gå til siste side +page_rotate_cw.title=Roter med klokka +page_rotate_cw.label=Roter med klokka +page_rotate_cw_label=Roter med klokka +page_rotate_ccw.title=Roter mot klokka +page_rotate_ccw.label=Roter mot klokka +page_rotate_ccw_label=Roter mot klokka + +hand_tool_enable.title=Slå på handverktøy +hand_tool_enable_label=Slå på handverktøy +hand_tool_disable.title=Så av handverktøy +hand_tool_disable_label=Slå av handverktøy + +# Document properties dialog box +document_properties.title=Dokumenteigenskapar … +document_properties_label=Dokumenteigenskapar … +document_properties_file_name=Filnamn: +document_properties_file_size=Filstorleik: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Dokumenteigenskapar … +document_properties_author=Forfattar: +document_properties_subject=Emne: +document_properties_keywords=Stikkord: +document_properties_creation_date=Dato oppretta: +document_properties_modification_date=Dato endra: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Oppretta av: +document_properties_producer=PDF-verktøy: +document_properties_version=PDF-versjon: +document_properties_page_count=Sidetal: +document_properties_close=Lukk + +print_progress_message=Førebur dokumentet for utskrift… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Avbryt + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Slå av/på sidestolpe +toggle_sidebar_label=Slå av/på sidestolpe +document_outline.title=Vis dokumentdisposisjonen (dobbelklikk for å utvida/skjula alle elementa) +document_outline_label=Dokumentdisposisjon +attachments.title=Vis vedlegg +attachments_label=Vedlegg +thumbs.title=Vis miniatyrbilde +thumbs_label=Miniatyrbilde +findbar.title=Finn i dokumentet +findbar_label=Finn + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Side {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatyrbilde av side {{page}} + +# Find panel button title and messages +find_label=Finn: +find_previous.title=Finn tidlegare førekomst av frasen +find_previous_label=Førre +find_next.title=Finn neste førekomst av frasen +find_next_label=Neste +find_highlight=Uthev alle +find_match_case_label=Skil store/små bokstavar +find_reached_top=Nådde toppen av dokumentet, held fram frå botnen +find_reached_bottom=Nådde botnen av dokumentet, held fram frå toppen +find_not_found=Fann ikkje teksten + +# Error panel labels +error_more_info=Meir info +error_less_info=Mindre info +error_close=Lukk +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (bygg: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Melding: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stakk: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fil: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linje: {{line}} +rendering_error=Ein feil oppstod ved oppteikning av sida. + +# Predefined zoom values +page_scale_width=Sidebreidde +page_scale_fit=Tilpass til sida +page_scale_auto=Automatisk skalering +page_scale_actual=Verkeleg storleik +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Feil +loading_error=Ein feil oppstod ved lasting av PDF. +invalid_file_error=Ugyldig eller korrupt PDF-fil. +missing_file_error=Manglande PDF-fil. +unexpected_response_error=Uventa tenarrespons. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} annotasjon] +password_label=Skriv inn passordet for å opna denne PDF-fila. +password_invalid=Ugyldig passord. Prøv igjen. +password_ok=OK +password_cancel=Avbryt + +printing_not_supported=Åtvaring: Utskrift er ikkje fullstendig støtta av denne nettlesaren. +printing_not_ready=Åtvaring: PDF ikkje fullstendig innlasta for utskrift. +web_fonts_disabled=Vev-skrifter er slått av: Kan ikkje bruka innbundne PDF-skrifter. +document_colors_not_allowed=PDF-dokument kan ikkje bruka eigne fargar: "Tillat sider å velja eigne fargar" er deaktivert i nettlesaren. diff --git a/src/cps/static/locale/nso/viewer.properties b/src/cps/static/locale/nso/viewer.properties new file mode 100644 index 0000000..c36b70a --- /dev/null +++ b/src/cps/static/locale/nso/viewer.properties @@ -0,0 +1,132 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Letlakala le fetilego +previous_label=Fetilego +next.title=Letlakala le latelago +next_label=Latelago + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Bušetša ka gare +zoom_out_label=Bušetša ka gare +zoom_in.title=Godišetša ka ntle +zoom_in_label=Godišetša ka ntle +zoom.title=Godiša +presentation_mode.title=Fetogela go mokgwa wa tlhagišo +presentation_mode_label=Mokgwa wa tlhagišo +open_file.title=Bula faele +open_file_label=Bula +print.title=Gatiša +print_label=Gatiša +download.title=Laolla +download_label=Laolla +bookmark.title=Pono ya bjale (kopiša le go bula lefasetereng le leswa) +bookmark_label=Tebelelo ya gona bjale + +# Secondary toolbar and context menu + + +# Document properties dialog box +document_properties_file_name=Leina la faele: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_title=Thaetlele: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Šielanya para ya ka thoko +toggle_sidebar_label=Šielanya para ya ka thoko +document_outline_label=Kakaretšo ya tokumente +thumbs.title=Laetša dikhutšofatšo +thumbs_label=Dikhutšofatšo +findbar.title=Hwetša go tokumente +findbar_label=Hwetša + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Letlakala {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Khutšofatšo ya letlakala {{page}} + +# Find panel button title and messages +find_label=Hwetša: +find_previous.title=Hwetša tiragalo e fetilego ya sekafoko +find_previous_label=Fetilego +find_next.title=Hwetša tiragalo e latelago ya sekafoko +find_next_label=Latelago +find_highlight=Bonagatša tšohle +find_match_case_label=Swantšha kheisi +find_reached_top=Fihlile godimo ga tokumente, go tšwetšwe pele go tloga tlase +find_reached_bottom=Fihlile mafelelong a tokumente, go tšwetšwe pele go tloga godimo +find_not_found=Sekafoko ga sa hwetšwa + +# Error panel labels +error_more_info=Tshedimošo e oketšegilego +error_less_info=Tshedimošo ya tlasana +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Molaetša: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Mokgobo: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Faele: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Mothaladi: {{line}} +rendering_error=Go diregile phošo ge go be go gafelwa letlakala. + +# Predefined zoom values +page_scale_width=Bophara bja letlakala +page_scale_fit=Go lekana ga letlakala +page_scale_auto=Kgodišo ya maitirišo +page_scale_actual=Bogolo bja kgonthe +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=Phošo +loading_error=Go diregile phošo ge go hlahlelwa PDF. +invalid_file_error=Faele ye e sa šomego goba e senyegilego ya PDF. +missing_file_error=Faele yeo e sego gona ya PDF. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Tlhaloso] +password_ok=LOKILE + +printing_not_supported=Temošo: Go gatiša ga go thekgwe ke praosara ye ka botlalo. +printing_not_ready=Temošo: PDF ga ya hlahlelwa ka botlalo bakeng sa go gatišwa. +web_fonts_disabled=Difonte tša wepe di šitišitšwe: ga e kgone go diriša difonte tša PDF tše khutišitšwego. diff --git a/src/cps/static/locale/oc/viewer.properties b/src/cps/static/locale/oc/viewer.properties new file mode 100644 index 0000000..1b55726 --- /dev/null +++ b/src/cps/static/locale/oc/viewer.properties @@ -0,0 +1,176 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pagina precedenta +previous_label=Precedent +next.title=Pagina seguenta +next_label=Seguent + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pagina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=sus {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Zoom arrièr +zoom_out_label=Zoom arrièr +zoom_in.title=Zoom avant +zoom_in_label=Zoom avant +zoom.title=Zoom +presentation_mode.title=Bascular en mòde presentacion +presentation_mode_label=Mòde Presentacion +open_file.title=Dobrir lo fichièr +open_file_label=Dobrir +print.title=Imprimir +print_label=Imprimir +download.title=Telecargar +download_label=Telecargar +bookmark.title=Afichatge corrent (copiar o dobrir dins una fenèstra novèla) +bookmark_label=Afichatge actual + +# Secondary toolbar and context menu +tools.title=Aisinas +tools_label=Aisinas +first_page.title=Anar a la primièra pagina +first_page.label=Anar a la primièra pagina +first_page_label=Anar a la primièra pagina +last_page.title=Anar a la darrièra pagina +last_page.label=Anar a la darrièra pagina +last_page_label=Anar a la darrièra pagina +page_rotate_cw.title=Rotacion orària +page_rotate_cw.label=Rotacion orària +page_rotate_cw_label=Rotacion orària +page_rotate_ccw.title=Rotacion antiorària +page_rotate_ccw.label=Rotacion antiorària +page_rotate_ccw_label=Rotacion antiorària + +hand_tool_enable.title=Activar l'aisina man +hand_tool_enable_label=Activar l'aisina man +hand_tool_disable.title=Desactivar l'aisina man +hand_tool_disable_label=Desactivar l'aisina man + +# Document properties dialog box +document_properties.title=Proprietats del document... +document_properties_label=Proprietats del document... +document_properties_file_name=Nom del fichièr : +document_properties_file_size=Talha del fichièr : +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} Ko ({{size_b}} octets) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} Mo ({{size_b}} octets) +document_properties_title=Títol : +document_properties_author=Autor : +document_properties_subject=Subjècte : +document_properties_keywords=Mots claus : +document_properties_creation_date=Data de creacion : +document_properties_modification_date=Data de modificacion : +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Creator : +document_properties_producer=Aisina de conversion PDF : +document_properties_version=Version PDF : +document_properties_page_count=Nombre de paginas : +document_properties_close=Tampar + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_close=Anullar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Afichar/amagar lo panèl lateral +toggle_sidebar_label=Afichar/amagar lo panèl lateral +document_outline_label=Marcapaginas del document +attachments.title=Visualizar las pèças juntas +attachments_label=Pèças juntas +thumbs.title=Afichar las vinhetas +thumbs_label=Vinhetas +findbar.title=Trobar dins lo document +findbar_label=Recercar + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pagina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Vinheta de la pagina {{page}} + +# Find panel button title and messages +find_label=Recercar +find_previous.title=Tròba l'ocurréncia precedenta de la frasa +find_previous_label=Precedent +find_next.title=Tròba l'ocurréncia venenta de la frasa +find_next_label=Seguent +find_highlight=Suslinhar tot +find_match_case_label=Respectar la cassa +find_reached_top=Naut de la pagina atench, perseguida dempuèi lo bas +find_reached_bottom=Bas de la pagina atench, perseguida al començament +find_not_found=Frasa pas trobada + +# Error panel labels +error_more_info=Mai de detalhs +error_less_info=Mens d'informacions +error_close=Tampar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (identificant de compilacion : {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Messatge : {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pila : {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fichièr : {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linha : {{line}} +rendering_error=Una error s'es produita pendent l'afichatge de la pagina. + +# Predefined zoom values +page_scale_width=Largor plena +page_scale_fit=Pagina entièra +page_scale_auto=Zoom automatic +page_scale_actual=Talha vertadièra +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=Error +loading_error=Una error s'es produita pendent lo cargament del fichièr PDF. +invalid_file_error=Fichièr PDF invalid o corromput. +missing_file_error=Fichièr PDF mancant. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotacion {{type}}] +password_label=Picatz lo senhal per dobrir aqueste fichièr PDF. +password_invalid=Senhal incorrècte. Tornatz ensajar. +password_ok=D'acòrdi +password_cancel=Anullar + +printing_not_supported=Atencion : l'impression es pas completament gerit per aqueste navigador. +printing_not_ready=Atencion : lo PDF es pas entièrament cargat per lo poder imprimir. +web_fonts_disabled=Las poliças web son desactivadas : impossible d'utilizar las poliças integradas al PDF. +document_colors_not_allowed=Los documents PDF pòdon pas utilizar lors pròprias colors : « Autorizar las paginas web d'utilizar lors pròprias colors » es desactivat dins lo navigador. diff --git a/src/cps/static/locale/or/viewer.properties b/src/cps/static/locale/or/viewer.properties new file mode 100644 index 0000000..8d2e240 --- /dev/null +++ b/src/cps/static/locale/or/viewer.properties @@ -0,0 +1,173 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=ପୂର୍ବ ପୃଷ୍ଠା +previous_label=ପୂର୍ବ +next.title=ପର ପୃଷ୍ଠା +next_label=ପର + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=ଛୋଟ କରନ୍ତୁ +zoom_out_label=ଛୋଟ କରନ୍ତୁ +zoom_in.title=ବଡ଼ କରନ୍ତୁ +zoom_in_label=ବଡ଼ କରନ୍ତୁ +zoom.title=ଛୋଟ ବଡ଼ କରନ୍ତୁ +presentation_mode.title=ଉପସ୍ଥାପନ ଧାରାକୁ ବଦଳାନ୍ତୁ +presentation_mode_label=ଉପସ୍ଥାପନ ଧାରା +open_file.title=ଫାଇଲ ଖୋଲନ୍ତୁ +open_file_label=ଖୋଲନ୍ତୁ +print.title=ମୁଦ୍ରଣ +print_label=ମୁଦ୍ରଣ +download.title=ଆହରଣ +download_label=ଆହରଣ +bookmark.title=ପ୍ରଚଳିତ ଦୃଶ୍ୟ (ନକଲ କରନ୍ତୁ କିମ୍ବା ଏକ ନୂତନ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ) +bookmark_label=ପ୍ରଚଳିତ ଦୃଶ୍ୟ + +# Secondary toolbar and context menu +tools.title=ସାଧନଗୁଡ଼ିକ +tools_label=ସାଧନଗୁଡ଼ିକ +first_page.title=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ +first_page.label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ +first_page_label=ପ୍ରଥମ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ +last_page.title=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ +last_page.label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ +last_page_label=ଶେଷ ପୃଷ୍ଠାକୁ ଯାଆନ୍ତୁ +page_rotate_cw.title=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ +page_rotate_cw.label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ +page_rotate_cw_label=ଦକ୍ଷିଣାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ +page_rotate_ccw.title=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ +page_rotate_ccw.label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ +page_rotate_ccw_label=ବାମାବର୍ତ୍ତୀ ଘୁରାନ୍ତୁ + +hand_tool_enable.title=ହସ୍ତକୃତ ସାଧନକୁ ସକ୍ରିୟ କରନ୍ତୁ +hand_tool_enable_label=ହସ୍ତକୃତ ସାଧନକୁ ସକ୍ରିୟ କରନ୍ତୁ +hand_tool_disable.title=ହସ୍ତକୃତ ସାଧନକୁ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ +hand_tool_disable_label=ହସ୍ତକୃତ ସାଧନକୁ ନିଷ୍କ୍ରିୟ କରନ୍ତୁ + +# Document properties dialog box +document_properties.title=ଦଲିଲ ଗୁଣଧର୍ମ… +document_properties_label=ଦଲିଲ ଗୁଣଧର୍ମ… +document_properties_file_name=ଫାଇଲ ନାମ: +document_properties_file_size=ଫାଇଲ ଆକାର: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=ଶୀର୍ଷକ: +document_properties_author=ଲେଖକ: +document_properties_subject=ବିଷୟ: +document_properties_keywords=ସୂଚକ ଶବ୍ଦ: +document_properties_creation_date=ନିର୍ମାଣ ତାରିଖ: +document_properties_modification_date=ପରିବର୍ତ୍ତନ ତାରିଖ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=ନିର୍ମାତା: +document_properties_producer=PDF ପ୍ରଯୋଜକ: +document_properties_version=PDF ସଂସ୍କରଣ: +document_properties_page_count=ପୃଷ୍ଠା ଗଣନା: +document_properties_close=ବନ୍ଦ କରନ୍ତୁ + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ +toggle_sidebar_label=ପାର୍ଶ୍ୱପଟିକୁ ଆଗପଛ କରନ୍ତୁ +document_outline_label=ଦଲିଲ ସାରାଂଶ +attachments.title=ସଂଲଗ୍ନକଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ +attachments_label=ସଲଗ୍ନକଗୁଡିକ +thumbs.title=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ ଦର୍ଶାନ୍ତୁ +thumbs_label=ସଂକ୍ଷିପ୍ତ ବିବରଣୀ +findbar.title=ଦଲିଲରେ ଖୋଜନ୍ତୁ +findbar_label=ଖୋଜନ୍ତୁ + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=ପୃଷ୍ଠା {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=ପୃଷ୍ଠାର ସଂକ୍ଷିପ୍ତ ବିବରଣୀ {{page}} + +# Find panel button title and messages +find_label=ଖୋଜନ୍ତୁ: +find_previous.title=ଏହି ବାକ୍ୟାଂଶର ପୂର୍ବ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ +find_previous_label=ପୂର୍ବବର୍ତ୍ତୀ +find_next.title=ଏହି ବାକ୍ୟାଂଶର ପରବର୍ତ୍ତୀ ଉପସ୍ଥିତିକୁ ଖୋଜନ୍ତୁ +find_next_label=ପରବର୍ତ୍ତୀ\u0020 +find_highlight=ସମସ୍ତଙ୍କୁ ଆଲୋକିତ କରନ୍ତୁ +find_match_case_label=ଅକ୍ଷର ମେଳାନ୍ତୁ +find_reached_top=ତଳୁ ଉପରକୁ ଗତି କରି ଦଲିଲର ଉପର ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି +find_reached_bottom=ଉପରୁ ତଳକୁ ଗତି କରି ଦଲିଲର ଶେଷ ଭାଗରେ ପହଞ୍ଚି ଯାଇଛି +find_not_found=ବାକ୍ୟାଂଶ ମିଳିଲା ନାହିଁ + +# Error panel labels +error_more_info=ଅଧିକ ସୂଚନା +error_less_info=ସ୍ୱଳ୍ପ ସୂଚନା +error_close=ବନ୍ଦ କରନ୍ତୁ +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=ସନ୍ଦେଶ: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=ଷ୍ଟାକ: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ଫାଇଲ: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=ଧାଡ଼ି: {{line}} +rendering_error=ପୃଷ୍ଠା ଚିତ୍ରଣ କରିବା ସମୟରେ ତ୍ରୁଟି ଘଟିଲା। + +# Predefined zoom values +page_scale_width=ପୃଷ୍ଠା ଓସାର +page_scale_fit=ପୃଷ୍ଠା ମେଳନ +page_scale_auto=ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଛୋଟବଡ଼ କରିବା +page_scale_actual=ପ୍ରକୃତ ଆକାର +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=ତ୍ରୁଟି +loading_error=PDF ଧାରଣ କରିବା ସମୟରେ ଏକ ତ୍ରୁଟି ଘଟିଲା। +invalid_file_error=ଅବୈଧ କିମ୍ବା ତ୍ରୁଟିଯୁକ୍ତ PDF ଫାଇଲ। +missing_file_error=ହଜିଯାଇଥିବା PDF ଫାଇଲ। +unexpected_response_error=ଅପ୍ରତ୍ୟାଶିତ ସର୍ଭର ଉତ୍ତର। + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Annotation] +password_label=ଏହି PDF ଫାଇଲକୁ ଖୋଲିବା ପାଇଁ ପ୍ରବେଶ ସଂକେତ ଭରଣ କରନ୍ତୁ। +password_invalid=ଭୁଲ ପ୍ରବେଶ ସଂକେତ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ। +password_ok=ଠିକ ଅଛି + +printing_not_supported=ଚେତାବନୀ: ଏହି ବ୍ରାଉଜର ଦ୍ୱାରା ମୁଦ୍ରଣ କ୍ରିୟା ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ସହାୟତା ପ୍ରାପ୍ତ ନୁହଁ। +printing_not_ready=ଚେତାବନୀ: PDF ଟି ମୁଦ୍ରଣ ପାଇଁ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ଧାରଣ ହୋଇ ନାହିଁ। +web_fonts_disabled=ୱେବ ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି: ସନ୍ନିହିତ PDF ଅକ୍ଷରରୂପଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିବାରେ ଅସମର୍ଥ। +document_colors_not_allowed=PDF ଦଲିଲଗୁଡ଼ିକ ସେମାନଙ୍କର ନିଜର ରଙ୍ଗ ବ୍ୟବହାର କରିବା ପାଇଁ ଅନୁମତି ପ୍ରାପ୍ତ ନୁହଁ: 'ସେମାନଙ୍କର ନିଜ ରଙ୍ଗ ବାଛିବା ପାଇଁ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ' କୁ ବ୍ରାଉଜରରେ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି। diff --git a/src/cps/static/locale/pa-IN/viewer.properties b/src/cps/static/locale/pa-IN/viewer.properties new file mode 100644 index 0000000..d9be404 --- /dev/null +++ b/src/cps/static/locale/pa-IN/viewer.properties @@ -0,0 +1,174 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=ਸਫ਼ਾ ਪਿੱਛੇ +previous_label=ਪਿੱਛੇ +next.title=ਸਫ਼ਾ ਅੱਗੇ +next_label=ਅੱਗੇ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=ਜ਼ੂਮ ਆਉਟ +zoom_out_label=ਜ਼ੂਮ ਆਉਟ +zoom_in.title=ਜ਼ੂਮ ਇਨ +zoom_in_label=ਜ਼ੂਮ ਇਨ +zoom.title=ਜ਼ੂਨ +presentation_mode.title=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ ਵਿੱਚ ਜਾਓ +presentation_mode_label=ਪਰਿਜੈਂਟੇਸ਼ਨ ਮੋਡ +open_file.title=ਫਾਈਲ ਨੂੰ ਖੋਲ੍ਹੋ +open_file_label=ਖੋਲ੍ਹੋ +print.title=ਪਰਿੰਟ +print_label=ਪਰਿੰਟ +download.title=ਡਾਊਨਲੋਡ +download_label=ਡਾਊਨਲੋਡ +bookmark.title=ਮੌਜੂਦਾ ਝਲਕ (ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਕਾਪੀ ਕਰੋ ਜਾਂ ਖੋਲ੍ਹੋ) +bookmark_label=ਮੌਜੂਦਾ ਝਲਕ + +# Secondary toolbar and context menu +tools.title=ਟੂਲ +tools_label=ਟੂਲ +first_page.title=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +first_page.label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +first_page_label=ਪਹਿਲੇ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +last_page.title=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +last_page.label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +last_page_label=ਆਖਰੀ ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ +page_rotate_cw.title=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ +page_rotate_cw.label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਉ +page_rotate_cw_label=ਸੱਜੇ ਦਾਅ ਘੁੰਮਾਓ +page_rotate_ccw.title=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ +page_rotate_ccw.label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਉ +page_rotate_ccw_label=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ + +hand_tool_enable.title=ਹੱਥ ਟੂਲ ਨੂੰ ਚਾਲੂ ਕਰੋ +hand_tool_enable_label=ਹੱਥ ਟੂਲ ਨੂੰ ਚਾਲੂ ਕਰੋ +hand_tool_disable.title=ਹੱਥ ਟੂਲ ਨੂੰ ਬੰਦ ਕਰੋ +hand_tool_disable_label=ਹੱਥ ਟੂਲ ਨੂੰ ਬੰਦ ਕਰੋ + +# Document properties dialog box +document_properties.title=…ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ +document_properties_label=…ਦਸਤਾਵੇਜ਼ ਦੀ ਵਿਸ਼ੇਸ਼ਤਾ +document_properties_file_name=ਫਾਈਲ ਦਾ ਨਾਂ: +document_properties_file_size=ਫਾਈਲ ਦਾ ਆਕਾਰ: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} ਬਾਈਟ) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} ਬਾਈਟ) +document_properties_title=ਟਾਈਟਲ: +document_properties_author=ਲੇਖਕ: +document_properties_subject=ਵਿਸ਼ਾ: +document_properties_keywords=ਸ਼ਬਦ: +document_properties_creation_date=ਬਣਾਉਣ ਦੀ ਮਿਤੀ: +document_properties_modification_date=ਸੋਧ ਦੀ ਮਿਤੀ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=ਨਿਰਮਾਤਾ: +document_properties_producer=PDF ਪ੍ਰੋਡਿਊਸਰ: +document_properties_version=PDF ਵਰਜਨ: +document_properties_page_count=ਸਫ਼ੇ ਦੀ ਗਿਣਤੀ: +document_properties_close=ਬੰਦ ਕਰੋ + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=ਬਾਹੀ ਬਦਲੋ +toggle_sidebar_label=ਬਾਹੀ ਬਦਲੋ +attachments.title=ਅਟੈਚਮੈਂਟ ਨੂੰ ਵੇਖਾਓ +attachments_label=ਅਟੈਚਮੈਂਟ +thumbs.title=ਥੰਮਨੇਲ ਨੂੰ ਵੇਖਾਓ +thumbs_label=ਥੰਮਨੇਲ +findbar.title=ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਲੱਭੋ +findbar_label=ਲੱਭੋ + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=ਸਫ਼ਾ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}} ਸਫ਼ੇ ਦਾ ਥੰਮਨੇਲ + +# Find panel button title and messages +find_label=ਲੱਭੋ: +find_previous.title=ਵਾਕ ਦੀ ਪਿਛਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ +find_previous_label=ਪਿੱਛੇ +find_next.title=ਵਾਕ ਦੀ ਅਗਲੀ ਮੌਜੂਦਗੀ ਲੱਭੋ +find_next_label=ਅੱਗੇ +find_highlight=ਸਭ ਉਭਾਰੋ +find_match_case_label=ਅੱਖਰ ਆਕਾਰ ਨੂੰ ਮਿਲਾਉ +find_reached_top=ਦਸਤਾਵੇਜ਼ ਦੇ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਥੱਲੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ +find_reached_bottom=ਦਸਤਾਵੇਜ਼ ਦੇ ਅੰਤ ਉੱਤੇ ਆ ਗਏ ਹਾਂ, ਉੱਤੇ ਤੋਂ ਜਾਰੀ ਰੱਖਿਆ ਹੈ +find_not_found=ਵਾਕ ਨਹੀਂ ਲੱਭਿਆ + +# Error panel labels +error_more_info=ਹੋਰ ਜਾਣਕਾਰੀ +error_less_info=ਘੱਟ ਜਾਣਕਾਰੀ +error_close=ਬੰਦ ਕਰੋ +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (ਬਿਲਡ: {{build}} +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=ਸੁਨੇਹਾ: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=ਸਟੈਕ: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ਫਾਈਲ: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=ਲਾਈਨ: {{line}} +rendering_error=ਸਫ਼ਾ ਰੈਡਰ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ। + +# Predefined zoom values +page_scale_width=ਸਫ਼ੇ ਦੀ ਚੌੜਾਈ +page_scale_fit=ਸਫ਼ਾ ਫਿੱਟ +page_scale_auto=ਆਟੋਮੈਟਿਕ ਜ਼ੂਮ ਕਰੋ +page_scale_actual=ਆਟੋਮੈਟਿਕ ਆਕਾਰ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=ਗਲਤੀ +loading_error=PDF ਲੋਡ ਕਰਨ ਦੇ ਦੌਰਾਨ ਗਲਤੀ ਆਈ ਹੈ। +invalid_file_error=ਗਲਤ ਜਾਂ ਨਿਕਾਰਾ PDF ਫਾਈਲ ਹੈ। +missing_file_error=ਨਾ-ਮੌਜੂਦ PDF ਫਾਈਲ। +unexpected_response_error=ਅਣਜਾਣ ਸਰਵਰ ਜਵਾਬ। + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} ਵਿਆਖਿਆ] +password_label=ਇਹ PDF ਫਾਈਲ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਪਾਸਵਰਡ ਦਿਉ। +password_invalid=ਗਲਤ ਪਾਸਵਰਡ। ਫੇਰ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜੀ। +password_ok=ਠੀਕ ਹੈ +password_cancel=ਰੱਦ ਕਰੋ + +printing_not_supported=ਸਾਵਧਾਨ: ਇਹ ਬਰਾਊਜ਼ਰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ। +printing_not_ready=ਸਾਵਧਾਨ: PDF ਨੂੰ ਪਰਿੰਟ ਕਰਨ ਲਈ ਪੂਰੀ ਤਰ੍ਹਾਂ ਲੋਡ ਨਹੀਂ ਹੈ। +web_fonts_disabled=ਵੈਬ ਫੋਂਟ ਬੰਦ ਹਨ: ਇੰਬੈਡ PDF ਫੋਂਟ ਨੂੰ ਵਰਤਣ ਲਈ ਅਸਮਰੱਥ ਹੈ। +document_colors_not_allowed=PDF ਦਸਤਾਵੇਜ਼ਾਂ ਨੂੰ ਆਪਣੇ ਰੰਗ ਵਰਤਣ ਦੀ ਇਜ਼ਾਜ਼ਤ ਨਹੀਂ ਹੈ।: ਬਰਾਊਜ਼ਰ ਵਿੱਚ “ਸਫ਼ਿਆਂ ਨੂੰ ਆਪਣੇ ਰੰਗ ਚੁਣਨ ਦੀ ਇਜ਼ਾਜ਼ਤ ਦਿਓ” ਨਾ-ਸਰਗਰਮ ਹੈ। diff --git a/src/cps/static/locale/pl/viewer.properties b/src/cps/static/locale/pl/viewer.properties new file mode 100644 index 0000000..8be7774 --- /dev/null +++ b/src/cps/static/locale/pl/viewer.properties @@ -0,0 +1,129 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +previous.title=Poprzednia strona +previous_label=Poprzednia +next.title=Następna strona +next_label=Następna + +page.title==Strona: +of_pages=z {{pagesCount}} +page_of_pages=({{pageNumber}} z {{pagesCount}}) + +zoom_out.title=Pomniejszenie +zoom_out_label=Pomniejsz +zoom_in.title=Powiększenie +zoom_in_label=Powiększ +zoom.title=Skala +presentation_mode.title=Przełącz na tryb prezentacji +presentation_mode_label=Tryb prezentacji +open_file.title=Otwieranie pliku +open_file_label=Otwórz +print.title=Drukowanie +print_label=Drukuj +download.title=Pobieranie +download_label=Pobierz +bookmark.title=Bieżąca pozycja (skopiuj lub otwórz jako odnośnik w nowym oknie) +bookmark_label=Bieżąca pozycja + +tools.title=Narzędzia +tools_label=Narzędzia +first_page.title=Przechodzenie do pierwszej strony +first_page.label=Przejdź do pierwszej strony +first_page_label=Przejdź do pierwszej strony +last_page.title=Przechodzenie do ostatniej strony +last_page.label=Przejdź do ostatniej strony +last_page_label=Przejdź do ostatniej strony +page_rotate_cw.title=Obracanie zgodnie z ruchem wskazówek zegara +page_rotate_cw.label=Obróć zgodnie z ruchem wskazówek zegara +page_rotate_cw_label=Obróć zgodnie z ruchem wskazówek zegara +page_rotate_ccw.title=Obracanie przeciwnie do ruchu wskazówek zegara +page_rotate_ccw.label=Obróć przeciwnie do ruchu wskazówek zegara +page_rotate_ccw_label=Obróć przeciwnie do ruchu wskazówek zegara + +hand_tool_enable.title=Włączanie narzędzia rączka +hand_tool_enable_label=Włącz narzędzie rączka +hand_tool_disable.title=Wyłączanie narzędzia rączka +hand_tool_disable_label=Wyłącz narzędzie rączka + +document_properties.title=Właściwości dokumentu… +document_properties_label=Właściwości dokumentu… +document_properties_file_name=Nazwa pliku: +document_properties_file_size=Rozmiar pliku: +document_properties_kb={{size_kb}} KB ({{size_b}} b) +document_properties_mb={{size_mb}} MB ({{size_b}} b) +document_properties_title=Tytuł: +document_properties_author=Autor: +document_properties_subject=Temat: +document_properties_keywords=Słowa kluczowe: +document_properties_creation_date=Data utworzenia: +document_properties_modification_date=Data modyfikacji: +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Utworzony przez: +document_properties_producer=PDF wyprodukowany przez: +document_properties_version=Wersja PDF: +document_properties_page_count=Liczba stron: +document_properties_close=Zamknij + +print_progress_message=Przygotowywanie dokumentu do druku… +print_progress_percent={{progress}}% +print_progress_close=Anuluj + +toggle_sidebar.title=Przełączanie panelu bocznego +toggle_sidebar_label=Przełącz panel boczny +document_outline.title=Wyświetlanie zarysu dokumentu (podwójne kliknięcie rozwija lub zwija wszystkie pozycje) +document_outline_label=Zarys dokumentu +attachments.title=Wyświetlanie załączników +attachments_label=Załączniki +thumbs.title=Wyświetlanie miniaturek +thumbs_label=Miniaturki +findbar.title=Znajdź w dokumencie +findbar_label=Znajdź + +thumb_page_title=Strona {{page}} +thumb_page_canvas=Miniaturka strony {{page}} + +find_label=Znajdź: +find_previous.title=Znajdź poprzednie wystąpienie tekstu +find_previous_label=Poprzednie +find_next.title=Znajdź następne wystąpienie tekstu +find_next_label=Następne +find_highlight=Podświetl wszystkie +find_match_case_label=Rozróżniaj wielkość znaków +find_reached_top=Osiągnięto początek dokumentu, kontynuacja od końca +find_reached_bottom=Osiągnięto koniec dokumentu, kontynuacja od początku +find_not_found=Tekst nieznaleziony + +error_more_info=Więcej informacji +error_less_info=Mniej informacji +error_close=Zamknij +error_version_info=PDF.js v{{version}} (kompilacja: {{build}}) +error_message=Wiadomość: {{message}} +error_stack=Stos: {{stack}} +error_file=Plik: {{file}} +error_line=Wiersz: {{line}} +rendering_error=Podczas renderowania strony wystąpił błąd. + +page_scale_width=Szerokość strony +page_scale_fit=Dopasowanie strony +page_scale_auto=Skala automatyczna +page_scale_actual=Rozmiar rzeczywisty +page_scale_percent={{scale}}% + +loading_error_indicator=Błąd +loading_error=Podczas wczytywania dokumentu PDF wystąpił błąd. +invalid_file_error=Nieprawidłowy lub uszkodzony plik PDF. +missing_file_error=Brak pliku PDF. +unexpected_response_error=Nieoczekiwana odpowiedź serwera. + +text_annotation_type.alt=[Adnotacja: {{type}}] +password_label=Wprowadź hasło, aby otworzyć ten dokument PDF. +password_invalid=Nieprawidłowe hasło. Proszę spróbować ponownie. +password_ok=OK +password_cancel=Anuluj + +printing_not_supported=Ostrzeżenie: Drukowanie nie jest w pełni obsługiwane przez przeglądarkę. +printing_not_ready=Ostrzeżenie: Dokument PDF nie jest całkowicie wczytany, więc nie można go wydrukować. +web_fonts_disabled=Czcionki sieciowe są wyłączone: nie można użyć osadzonych czcionek PDF. +document_colors_not_allowed=Dokumenty PDF nie mogą używać własnych kolorów: Opcja „Pozwalaj stronom stosować inne kolory” w przeglądarce jest nieaktywna. diff --git a/src/cps/static/locale/pt-BR/viewer.properties b/src/cps/static/locale/pt-BR/viewer.properties new file mode 100644 index 0000000..9bd9fc7 --- /dev/null +++ b/src/cps/static/locale/pt-BR/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Página anterior +previous_label=Anterior +next.title=Próxima página +next_label=Próxima + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Página +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Reduzir +zoom_out_label=Reduzir +zoom_in.title=Ampliar +zoom_in_label=Ampliar +zoom.title=Zoom +presentation_mode.title=Alternar para o modo de apresentação +presentation_mode_label=Modo de apresentação +open_file.title=Abrir arquivo +open_file_label=Abrir +print.title=Imprimir +print_label=Imprimir +download.title=Download +download_label=Download +bookmark.title=Visualização atual (copiar ou abrir em uma nova janela) +bookmark_label=Visualização atual + +# Secondary toolbar and context menu +tools.title=Ferramentas +tools_label=Ferramentas +first_page.title=Ir para a primeira página +first_page.label=Ir para a primeira página +first_page_label=Ir para a primeira página +last_page.title=Ir para a última página +last_page.label=Ir para a última página +last_page_label=Ir para a última página +page_rotate_cw.title=Girar no sentido horário +page_rotate_cw.label=Girar no sentido horário +page_rotate_cw_label=Girar no sentido horário +page_rotate_ccw.title=Girar no sentido anti-horário +page_rotate_ccw.label=Girar no sentido anti-horário +page_rotate_ccw_label=Girar no sentido anti-horário + +hand_tool_enable.title=Habilitar ferramenta de mão +hand_tool_enable_label=Habilitar ferramenta de mão +hand_tool_disable.title=Desabilitar ferramenta de mão +hand_tool_disable_label=Desabilitar ferramenta de mão + +# Document properties dialog box +document_properties.title=Propriedades do documento… +document_properties_label=Propriedades do documento… +document_properties_file_name=Nome do arquivo: +document_properties_file_size=Tamanho do arquivo: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Título: +document_properties_author=Autor: +document_properties_subject=Assunto: +document_properties_keywords=Palavras-chave: +document_properties_creation_date=Data da criação: +document_properties_modification_date=Data da modificação: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Criação: +document_properties_producer=Criador do PDF: +document_properties_version=Versão do PDF: +document_properties_page_count=Número de páginas: +document_properties_close=Fechar + +print_progress_message=Preparando documento para impressão… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}} % +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Alternar painel +toggle_sidebar_label=Alternar painel +document_outline.title=Mostrar a estrutura do documento (duplo-clique para expandir/recolher todos os ítens) +document_outline_label=Estrutura do documento +attachments.title=Mostrar anexos +attachments_label=Anexos +thumbs.title=Mostrar miniaturas +thumbs_label=Miniaturas +findbar.title=Localizar no documento +findbar_label=Localizar + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Página {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura da página {{page}} + +# Find panel button title and messages +find_label=Localizar: +find_previous.title=Localizar a ocorrência anterior da frase +find_previous_label=Anterior +find_next.title=Localizar a próxima ocorrência da frase +find_next_label=Próxima +find_highlight=Realçar tudo +find_match_case_label=Diferenciar maiúsculas/minúsculas +find_reached_top=Início do documento alcançado, continuando do fim +find_reached_bottom=Fim do documento alcançado, continuando do início +find_not_found=Frase não encontrada + +# Error panel labels +error_more_info=Mais informações +error_less_info=Menos informações +error_close=Fechar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (compilação: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensagem: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pilha: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Arquivo: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linha: {{line}} +rendering_error=Ocorreu um erro ao renderizar a página. + +# Predefined zoom values +page_scale_width=Largura da página +page_scale_fit=Ajustar à janela +page_scale_auto=Zoom automático +page_scale_actual=Tamanho real +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Erro +loading_error=Ocorreu um erro ao carregar o PDF. +invalid_file_error=Arquivo PDF corrompido ou inválido. +missing_file_error=Arquivo PDF ausente. +unexpected_response_error=Resposta inesperada do servidor. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotação {{type}}] +password_label=Forneça a senha para abrir este arquivo PDF. +password_invalid=Senha inválida. Por favor, tentar de novo. +password_ok=OK +password_cancel=Cancelar + +printing_not_supported=Aviso: a impressão não é totalmente suportada neste navegador. +printing_not_ready=Aviso: o PDF não está totalmente carregado para impressão. +web_fonts_disabled=As fontes web estão desabilitadas: não foi possível usar fontes incorporadas do PDF. +document_colors_not_allowed=Os documentos em PDF não estão autorizados a usar suas próprias cores: “Permitir que as páginas escolham suas próprias cores” está desabilitado no navegador. diff --git a/src/cps/static/locale/pt-PT/viewer.properties b/src/cps/static/locale/pt-PT/viewer.properties new file mode 100644 index 0000000..5f38409 --- /dev/null +++ b/src/cps/static/locale/pt-PT/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Página anterior +previous_label=Anterior +next.title=Página seguinte +next_label=Seguinte + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Página +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=de {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} de {{pagesCount}}) + +zoom_out.title=Reduzir +zoom_out_label=Reduzir +zoom_in.title=Ampliar +zoom_in_label=Ampliar +zoom.title=Ampliação +presentation_mode.title=Mudar para modo de apresentação +presentation_mode_label=Modo de apresentação +open_file.title=Abrir ficheiro +open_file_label=Abrir +print.title=Imprimir +print_label=Imprimir +download.title=Descarregar +download_label=Descarregar +bookmark.title=Visão atual (copiar ou abrir em nova janela) +bookmark_label=Visão atual + +# Secondary toolbar and context menu +tools.title=Ferramentas +tools_label=Ferramentas +first_page.title=Ir para a primeira página +first_page.label=Ir para a primeira página +first_page_label=Ir para a primeira página +last_page.title=Ir para a última página +last_page.label=Ir para a última página +last_page_label=Ir para a última página +page_rotate_cw.title=Rodar à direita +page_rotate_cw.label=Rodar à direita +page_rotate_cw_label=Rodar à direita +page_rotate_ccw.title=Rodar à esquerda +page_rotate_ccw.label=Rodar à esquerda +page_rotate_ccw_label=Rodar à esquerda + +hand_tool_enable.title=Ativar ferramenta de mão +hand_tool_enable_label=Ativar ferramenta de mão +hand_tool_disable.title=Desativar ferramenta de mão +hand_tool_disable_label=Desativar ferramenta de mão + +# Document properties dialog box +document_properties.title=Propriedades do documento… +document_properties_label=Propriedades do documento… +document_properties_file_name=Nome do ficheiro: +document_properties_file_size=Tamanho do ficheiro: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Título: +document_properties_author=Autor: +document_properties_subject=Assunto: +document_properties_keywords=Palavras-chave: +document_properties_creation_date=Data de criação: +document_properties_modification_date=Data de modificação: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Criador: +document_properties_producer=Produtor de PDF: +document_properties_version=Versão do PDF: +document_properties_page_count=N.º de páginas: +document_properties_close=Fechar + +print_progress_message=A preparar o documento para impressão… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Cancelar + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Comutar barra lateral +toggle_sidebar_label=Comutar barra lateral +document_outline.title=Mostrar limite do documento (duplo clique para expandir/colapsar todos os itens) +document_outline_label=Estrutura do documento +attachments.title=Mostrar anexos +attachments_label=Anexos +thumbs.title=Mostrar miniaturas +thumbs_label=Miniaturas +findbar.title=Localizar no documento +findbar_label=Localizar + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Página {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura da página {{page}} + +# Find panel button title and messages +find_label=Localizar: +find_previous.title=Localizar ocorrência anterior da frase +find_previous_label=Anterior +find_next.title=Localizar ocorrência seguinte da frase +find_next_label=Seguinte +find_highlight=Destacar tudo +find_match_case_label=Correspondência +find_reached_top=Início de documento atingido, a continuar do fim +find_reached_bottom=Fim da página atingido, a continuar do início +find_not_found=Frase não encontrada + +# Error panel labels +error_more_info=Mais informação +error_less_info=Menos informação +error_close=Fechar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (compilação: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensagem: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Pilha: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Ficheiro: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linha: {{line}} +rendering_error=Ocorreu um erro ao processar a página. + +# Predefined zoom values +page_scale_width=Ajustar à largura +page_scale_fit=Ajustar à página +page_scale_auto=Tamanho automático +page_scale_actual=Tamanho real +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Erro +loading_error=Ocorreu um erro ao carregar o PDF. +invalid_file_error=Ficheiro PDF inválido ou danificado. +missing_file_error=Ficheiro PDF inexistente. +unexpected_response_error=Resposta inesperada do servidor. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotação {{type}}] +password_label=Digite a palavra-passe para abrir este ficheiro PDF. +password_invalid=Palavra-passe inválida. Por favor, tente novamente. +password_ok=OK +password_cancel=Cancelar + +printing_not_supported=Aviso: a impressão não é totalmente suportada por este navegador. +printing_not_ready=Aviso: o PDF ainda não está totalmente carregado. +web_fonts_disabled=Os tipos de letra web estão desativados: não é possível utilizar os tipos de letra PDF incorporados. +document_colors_not_allowed=Os documentos PDF não permitem a utilização das suas próprias cores: “Autorizar as páginas a escolher as suas próprias cores” está desativado no navegador. diff --git a/src/cps/static/locale/rm/viewer.properties b/src/cps/static/locale/rm/viewer.properties new file mode 100644 index 0000000..2a93dd6 --- /dev/null +++ b/src/cps/static/locale/rm/viewer.properties @@ -0,0 +1,174 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pagina precedenta +previous_label=Enavos +next.title=Proxima pagina +next_label=Enavant + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Empitschnir +zoom_out_label=Empitschnir +zoom_in.title=Engrondir +zoom_in_label=Engrondir +zoom.title=Zoom +presentation_mode.title=Midar en il modus da preschentaziun +presentation_mode_label=Modus da preschentaziun +open_file.title=Avrir datoteca +open_file_label=Avrir +print.title=Stampar +print_label=Stampar +download.title=Telechargiar +download_label=Telechargiar +bookmark.title=Vista actuala (copiar u avrir en ina nova fanestra) +bookmark_label=Vista actuala + +# Secondary toolbar and context menu +tools.title=Utensils +tools_label=Utensils +first_page.title=Siglir a l'emprima pagina +first_page.label=Siglir a l'emprima pagina +first_page_label=Siglir a l'emprima pagina +last_page.title=Siglir a la davosa pagina +last_page.label=Siglir a la davosa pagina +last_page_label=Siglir a la davosa pagina +page_rotate_cw.title=Rotar en direcziun da l'ura +page_rotate_cw.label=Rotar en direcziun da l'ura +page_rotate_cw_label=Rotar en direcziun da l'ura +page_rotate_ccw.title=Rotar en direcziun cuntraria a l'ura +page_rotate_ccw.label=Rotar en direcziun cuntraria a l'ura +page_rotate_ccw_label=Rotar en direcziun cuntraria a l'ura + +hand_tool_enable.title=Activar l'utensil da maun +hand_tool_enable_label=Activar l'utensil da maun +hand_tool_disable.title=Deactivar l'utensil da maun +hand_tool_disable_label=Deactivar l'utensil da maun + +# Document properties dialog box +document_properties.title=Caracteristicas dal document… +document_properties_label=Caracteristicas dal document… +document_properties_file_name=Num da la datoteca: +document_properties_file_size=Grondezza da la datoteca: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=Titel: +document_properties_author=Autur: +document_properties_subject=Tema: +document_properties_keywords=Chavazzins: +document_properties_creation_date=Data da creaziun: +document_properties_modification_date=Data da modificaziun: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}} {{time}} +document_properties_creator=Creà da: +document_properties_producer=Creà il PDF cun: +document_properties_version=Versiun da PDF: +document_properties_page_count=Dumber da paginas: +document_properties_close=Serrar + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Activar/deactivar la trav laterala +toggle_sidebar_label=Activar/deactivar la trav laterala +attachments.title=Mussar agiuntas +attachments_label=Agiuntas +thumbs.title=Mussar las miniaturas +thumbs_label=Miniaturas +findbar.title=Tschertgar en il document +findbar_label=Tschertgar + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pagina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura da la pagina {{page}} + +# Find panel button title and messages +find_label=Tschertgar: +find_previous.title=Tschertgar la posiziun precedenta da l'expressiun +find_previous_label=Enavos +find_next.title=Tschertgar la proxima posiziun da l'expressiun +find_next_label=Enavant +find_highlight=Relevar tuts +find_match_case_label=Resguardar maiusclas/minusclas +find_reached_top=Il cumenzament dal document è cuntanschì, la tschertga cuntinuescha a la fin dal document +find_reached_bottom=La fin dal document è cuntanschì, la tschertga cuntinuescha al cumenzament dal document +find_not_found=Impussibel da chattar l'expressiun + +# Error panel labels +error_more_info=Dapli infurmaziuns +error_less_info=Damain infurmaziuns +error_close=Serrar +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Messadi: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Datoteca: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Lingia: {{line}} +rendering_error=Ina errur è cumparida cun visualisar questa pagina. + +# Predefined zoom values +page_scale_width=Ladezza da la pagina +page_scale_fit=Entira pagina +page_scale_auto=Zoom automatic +page_scale_actual=Grondezza actuala +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Errur +loading_error=Ina errur è cumparida cun chargiar il PDF. +invalid_file_error=Datoteca PDF nunvalida u donnegiada. +missing_file_error=Datoteca PDF manconta. +unexpected_response_error=Resposta nunspetgada dal server. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Annotaziun da {{type}}] +password_label=Endatescha il pled-clav per avrir questa datoteca da PDF. +password_invalid=Pled-clav nunvalid. Emprova anc ina giada. +password_ok=OK +password_cancel=Interrumper + +printing_not_supported=Attenziun: Il stampar na funcziunescha anc betg dal tut en quest navigatur. +printing_not_ready=Attenziun: Il PDF n'è betg chargià cumplettamain per stampar. +web_fonts_disabled=Scrittiras dal web èn deactivadas: impussibel dad utilisar las scrittiras integradas en il PDF. +document_colors_not_allowed=Documents da PDF na dastgan betg duvrar las atgnas colurs: 'Permetter a paginas da tscherner lur atgna colur' è deactivà en il navigatur. diff --git a/src/cps/static/locale/ro/viewer.properties b/src/cps/static/locale/ro/viewer.properties new file mode 100644 index 0000000..77cc49d --- /dev/null +++ b/src/cps/static/locale/ro/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Pagina precedentă +previous_label=Înapoi +next.title=Pagina următoare +next_label=Înainte + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Pagina +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=din {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} din {{pagesCount}}) + +zoom_out.title=Micșorează +zoom_out_label=Micșorează +zoom_in.title=Mărește +zoom_in_label=Mărește +zoom.title=Scalare +presentation_mode.title=Schimbă la modul de prezentare +presentation_mode_label=Mod de prezentare +open_file.title=Deschide un fișier +open_file_label=Deschide +print.title=Tipărește +print_label=Tipărește +download.title=Descarcă +download_label=Descarcă +bookmark.title=Vizualizare actuală (copiați sau deschideți într-o fereastră nouă) +bookmark_label=Vizualizare actuală + +# Secondary toolbar and context menu +tools.title=Unelte +tools_label=Unelte +first_page.title=Mergi la prima pagină +first_page.label=Mergeți la prima pagină +first_page_label=Mergi la prima pagină +last_page.title=Mergi la ultima pagină +last_page.label=Mergi la ultima pagină +last_page_label=Mergi la ultima pagină +page_rotate_cw.title=Rotește în sensul acelor de ceasornic +page_rotate_cw.label=Rotește în sensul acelor de ceasornic +page_rotate_cw_label=Rotește în sensul acelor de ceasornic +page_rotate_ccw.title=Rotește în sens invers al acelor de ceasornic +page_rotate_ccw.label=Rotate Counter-Clockwise +page_rotate_ccw_label=Rotește în sens invers acelor de ceasornic + +hand_tool_enable.title=Activează instrumentul mână +hand_tool_enable_label=Activează instrumentul mână +hand_tool_disable.title=Dezactivează instrumentul mână +hand_tool_disable_label=Dezactivează instrumentul mână + +# Document properties dialog box +document_properties.title=Proprietățile documentului… +document_properties_label=Proprietățile documentului… +document_properties_file_name=Nume fișier: +document_properties_file_size=Dimensiune fișier: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} byți) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} byți) +document_properties_title=Titlu: +document_properties_author=Autor: +document_properties_subject=Subiect: +document_properties_keywords=Cuvinte cheie: +document_properties_creation_date=Data creării: +document_properties_modification_date=Data modificării: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Autor: +document_properties_producer=Producător PDF: +document_properties_version=Versiune PDF: +document_properties_page_count=Număr de pagini: +document_properties_close=Închide + +print_progress_message=Se pregătește documentul pentru imprimare… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Renunță + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Comută bara laterală +toggle_sidebar_label=Comută bara laterală +document_outline.title=Arată schița documentului (dublu-clic pentru a expanda/colapsa toate elementele +document_outline_label=Schiță document +attachments.title=Afișează atașamentele +attachments_label=Atașamente +thumbs.title=Arată miniaturi +thumbs_label=Miniaturi +findbar.title=Găsește în document +findbar_label=Găsește + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pagina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatura paginii {{page}} + +# Find panel button title and messages +find_label=Găsește: +find_previous.title=Găsește instanța anterioară în frază +find_previous_label=Anterior +find_next.title=Găsește instanța următoare în frază +find_next_label=Următor +find_highlight=Evidențiază aparițiile +find_match_case_label=Potrivește literele mari și mici +find_reached_top=Am ajuns la începutul documentului, continuă de la sfârșit +find_reached_bottom=Am ajuns la sfârșitul documentului, continuă de la început +find_not_found=Nu s-a găsit textul + +# Error panel labels +error_more_info=Mai multe informații +error_less_info=Mai puține informații +error_close=Închide +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (varianta: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mesaj: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stivă: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fișier: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linie: {{line}} +rendering_error=A intervenit o eroare la afișarea paginii. + +# Predefined zoom values +page_scale_width=Lățime pagină +page_scale_fit=Potrivire la pagină +page_scale_auto=Dimensiune automată +page_scale_actual=Dimensiune reală +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Eroare +loading_error=A intervenit o eroare la încărcarea fișierului PDF. +invalid_file_error=Fișier PDF invalid sau deteriorat. +missing_file_error=Fișier PDF lipsă. +unexpected_response_error=Răspuns neașteptat de la server. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Adnotare] +password_label=Introduceți parola pentru a deschide acest fișier PDF. +password_invalid=Parolă greșită. Vă rugăm să încercați din nou. +password_ok=Ok +password_cancel=Renunță + +printing_not_supported=Avertisment: Tipărirea nu este suportată în totalitate de acest browser. +printing_not_ready=Avertisment: Fișierul PDF nu este încărcat complet pentru tipărire. +web_fonts_disabled=Fonturile web sunt dezactivate: nu pot utiliza fonturile PDF încorporate. +document_colors_not_allowed=Documentele PDF nu sunt autorizate să folosească propriile culori: 'Permite paginilor să aleagă propriile culori' este dezactivată în browser. diff --git a/src/cps/static/locale/ru/viewer.properties b/src/cps/static/locale/ru/viewer.properties new file mode 100644 index 0000000..01a5ea4 --- /dev/null +++ b/src/cps/static/locale/ru/viewer.properties @@ -0,0 +1,115 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +previous.title = Предыдущая страница +previous_label = Предыдущая +next.title = Следующая страница +next_label = Следующая +page.title = Страница +of_pages = из {{pagesCount}} +page_of_pages = ({{pageNumber}} из {{pagesCount}}) +zoom_out.title = Уменьшить +zoom_out_label = Уменьшить +zoom_in.title = Увеличить +zoom_in_label = Увеличить +zoom.title = Масштаб +presentation_mode.title = Перейти в режим презентации +presentation_mode_label = Режим презентации +open_file.title = Открыть файл +open_file_label = Открыть +print.title = Печать +print_label = Печать +download.title = Загрузить +download_label = Загрузить +bookmark.title = Ссылка на текущий вид (скопировать или открыть в новом окне) +bookmark_label = Текущий вид +tools.title = Инструменты +tools_label = Инструменты +first_page.title = Перейти на первую страницу +first_page.label = Перейти на первую страницу +first_page_label = Перейти на первую страницу +last_page.title = Перейти на последнюю страницу +last_page.label = Перейти на последнюю страницу +last_page_label = Перейти на последнюю страницу +page_rotate_cw.title = Повернуть по часовой стрелке +page_rotate_cw.label = Повернуть по часовой стрелке +page_rotate_cw_label = Повернуть по часовой стрелке +page_rotate_ccw.title = Повернуть против часовой стрелки +page_rotate_ccw.label = Повернуть против часовой стрелки +page_rotate_ccw_label = Повернуть против часовой стрелки +hand_tool_enable.title = Включить Инструмент «Рука» +hand_tool_enable_label = Включить Инструмент «Рука» +hand_tool_disable.title = Отключить Инструмент «Рука» +hand_tool_disable_label = Отключить Инструмент «Рука» +document_properties.title = Свойства документа… +document_properties_label = Свойства документа… +document_properties_file_name = Имя файла: +document_properties_file_size = Размер файла: +document_properties_kb = {{size_kb}} КБ ({{size_b}} байт) +document_properties_mb = {{size_mb}} МБ ({{size_b}} байт) +document_properties_title = Заголовок: +document_properties_author = Автор: +document_properties_subject = Тема: +document_properties_keywords = Ключевые слова: +document_properties_creation_date = Дата создания: +document_properties_modification_date = Дата изменения: +document_properties_date_string = {{date}}, {{time}} +document_properties_creator = Приложение: +document_properties_producer = Производитель PDF: +document_properties_version = Версия PDF: +document_properties_page_count = Число страниц: +document_properties_close = Закрыть +print_progress_message = Подготовка документа к печати… +print_progress_percent = {{progress}}% +print_progress_close = Отмена +toggle_sidebar.title = Открыть/закрыть боковую панель +toggle_sidebar_label = Открыть/закрыть боковую панель +document_outline.title = Показать содержание документа (двойной щелчок, чтобы развернуть/свернуть все элементы) +document_outline_label = Содержание документа +attachments.title = Показать вложения +attachments_label = Вложения +thumbs.title = Показать миниатюры +thumbs_label = Миниатюры +findbar.title = Найти в документе +findbar_label = Найти +thumb_page_title = Страница {{page}} +thumb_page_canvas = Миниатюра страницы {{page}} +find_label = Найти: +find_previous.title = Найти предыдущее вхождение фразы в текст +find_previous_label = Назад +find_next.title = Найти следующее вхождение фразы в текст +find_next_label = Далее +find_highlight = Подсветить все +find_match_case_label = С учётом регистра +find_reached_top = Достигнут верх документа, продолжено снизу +find_reached_bottom = Достигнут конец документа, продолжено сверху +find_not_found = Фраза не найдена +error_more_info = Детали +error_less_info = Скрыть детали +error_close = Закрыть +error_version_info = PDF.js v{{version}} (сборка: {{build}}) +error_message = Сообщение: {{message}} +error_stack = Стeк: {{stack}} +error_file = Файл: {{file}} +error_line = Строка: {{line}} +rendering_error = При создании страницы произошла ошибка. +page_scale_width = По ширине страницы +page_scale_fit = По размеру страницы +page_scale_auto = Автоматически +page_scale_actual = Реальный размер +page_scale_percent = {{scale}}% +loading_error_indicator = Ошибка +loading_error = При загрузке PDF произошла ошибка. +invalid_file_error = Некорректный или повреждённый PDF-файл. +missing_file_error = PDF-файл отсутствует. +unexpected_response_error = Неожиданный ответ сервера. +text_annotation_type.alt = [Аннотация {{type}}] +password_label = Введите пароль, чтобы открыть этот PDF-файл. +password_invalid = Неверный пароль. Пожалуйста, попробуйте снова. +password_ok = OK +password_cancel = Отмена +printing_not_supported = Предупреждение: В этом браузере не полностью поддерживается печать. +printing_not_ready = Предупреждение: PDF не полностью загружен для печати. +web_fonts_disabled = Веб-шрифты отключены: невозможно использовать встроенные PDF-шрифты. +document_colors_not_allowed = PDF-документам не разрешено использовать свои цвета: в браузере отключён параметр «Разрешить веб-сайтам использовать свои цвета». diff --git a/src/cps/static/locale/rw/viewer.properties b/src/cps/static/locale/rw/viewer.properties new file mode 100644 index 0000000..0488932 --- /dev/null +++ b/src/cps/static/locale/rw/viewer.properties @@ -0,0 +1,83 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom.title=Ihindurangano +open_file.title=Gufungura Dosiye +open_file_label=Gufungura + +# Secondary toolbar and context menu + + +# Document properties dialog box +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_title=Umutwe: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +findbar_label=Gushakisha + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. + +# Find panel button title and messages +find_label="Gushaka:" +find_previous.title=Gushaka aho uyu murongo ugaruka mbere y'aha +find_next.title=Gushaka aho uyu murongo wongera kugaruka +find_not_found=Umurongo ntubonetse + +# Error panel labels +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number + +# Predefined zoom values +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=Ikosa + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +password_invalid=Ijambo ry'ibanga ridahari. Wakongera ukagerageza +password_ok=YEGO + diff --git a/src/cps/static/locale/sah/viewer.properties b/src/cps/static/locale/sah/viewer.properties new file mode 100644 index 0000000..0a9d2a8 --- /dev/null +++ b/src/cps/static/locale/sah/viewer.properties @@ -0,0 +1,172 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Инники сирэй +previous_label=Иннинээҕи +next.title=Аныгыскы сирэй +next_label=Аныгыскы + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Куччат +zoom_out_label=Куччат +zoom_in.title=Улаатыннар +zoom_in_label=Улаатыннар +zoom.title=Улаатыннар +presentation_mode.title=Көрдөрөр эрэсиимҥэ +presentation_mode_label=Көрдөрөр эрэсиим +open_file.title=Билэни арый +open_file_label=Ас +print.title=Бэчээт +print_label=Бэчээт +download.title=Хачайдааһын +download_label=Хачайдааһын +bookmark.title=Билиҥҥи көстүүтэ (хатылаа эбэтэр саҥа түннүккэ арый) +bookmark_label=Билиҥҥи көстүүтэ + +# Secondary toolbar and context menu +tools.title=Тэриллэр +tools_label=Тэриллэр +first_page.title=Бастакы сирэйгэ көс +first_page.label=Бастакы сирэйгэ көс +first_page_label=Бастакы сирэйгэ көс +last_page.title=Тиһэх сирэйгэ көс +last_page.label=Тиһэх сирэйгэ көс +last_page_label=Тиһэх сирэйгэ көс +page_rotate_cw.title=Чаһы хоту эргит +page_rotate_cw.label=Чаһы хоту эргит +page_rotate_cw_label=Чаһы хоту эргит +page_rotate_ccw.title=Чаһы утары эргит +page_rotate_ccw.label=Чаһы утары эргит +page_rotate_ccw_label=Чаһы утары эргит + +hand_tool_enable.title=«Илии» диэн тэрили холбоо +hand_tool_enable_label=«Илии» диэн тэрили холбоо +hand_tool_disable.title=«Илии» диэн тэрили араар +hand_tool_disable_label=«Илии» диэн тэрили араар + +# Document properties dialog box +document_properties.title=Докумуон туруоруулара... +document_properties_label=Докумуон туруоруулара...\u0020 +document_properties_file_name=Билэ аата: +document_properties_file_size=Билэ кээмэйэ: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} КБ ({{size_b}} баайт) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} МБ ({{size_b}} баайт) +document_properties_title=Баһа: +document_properties_author=Ааптар: +document_properties_subject=Тиэмэ: +document_properties_keywords=Күлүүс тыл: +document_properties_creation_date=Оҥоһуллубут кэмэ: +document_properties_modification_date=Уларытыллыбыт кэмэ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_producer=PDF оҥорооччу: +document_properties_version=PDF барыла: +document_properties_page_count=Сирэй ахсаана: +document_properties_close=Сап + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Ойоҕос хапталы арый/сап +toggle_sidebar_label=Ойоҕос хапталы арый/сап +document_outline_label=Дөкүмүөн иһинээҕитэ +attachments.title=Кыбытыктары көрдөр +attachments_label=Кыбытык +thumbs.title=Ойуучааннары көрдөр +thumbs_label=Ойуучааннар +findbar.title=Дөкүмүөнтэн бул +findbar_label=Бул + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Сирэй {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Сирэй ойуучаана {{page}} + +# Find panel button title and messages +find_label=Бул: +find_previous.title=Этии тиэкискэ бу иннинээҕи киириитин бул +find_previous_label=Иннинээҕи +find_next.title=Этии тиэкискэ бу кэннинээҕи киириитин бул +find_next_label=Аныгыскы +find_highlight=Барытын сырдатан көрдөр +find_match_case_label=Буукуба улаханын-кыратын араар +find_reached_top=Сирэй үрдүгэр тиийдиҥ, салгыыта аллара +find_reached_bottom=Сирэй бүттэ, үөһэ салҕанна +find_not_found=Этии көстүбэтэ + +# Error panel labels +error_more_info=Сиһилии +error_less_info=Сиһилиитин кистээ +error_close=Сап +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (хомуйуута: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Этии: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Стeк: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Билэ: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Устуруока: {{line}} +rendering_error=Сирэйи айарга алҕас таҕыста. + +# Predefined zoom values +page_scale_width=Сирэй кэтитинэн +page_scale_fit=Сирэй кээмэйинэн +page_scale_auto=Аптамаатынан +page_scale_actual=Дьиҥнээх кээмэйэ +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=Алҕас +loading_error=PDF-билэни хачайдыырга алҕас таҕыста. +invalid_file_error=Туох эрэ алҕастаах эбэтэр алдьаммыт PDF-билэ. +missing_file_error=PDF-билэ суох. +unexpected_response_error=Сиэрбэр хоруйдаабат. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} туһунан] +password_label=Бу PDF-билэни арыйарга көмүскэл тылы киллэриэхтээхин. +password_invalid=Киирии тыл алҕастаах. Бука диэн, хатылаан көр. +password_ok=СӨП + +printing_not_supported=Сэрэтии: Бу браузер бэчээттиири толору өйөөбөт. +printing_not_ready=Сэрэтии: PDF бэчээттииргэ толору хачайдана илик. +web_fonts_disabled=Ситим-бичиктэр араарыллыахтара: PDF бичиктэрэ кыайан көстүбэттэр. +document_colors_not_allowed=PDF-дөкүмүөүннэргэ бэйэлэрин өҥнөрүн туттар көҥүллэммэтэ: "Ситим-сирдэр бэйэлэрин өҥнөрүн тутталларын көҥүллүүргэ" диэн браузерга арахса сылдьар эбит. diff --git a/src/cps/static/locale/si/viewer.properties b/src/cps/static/locale/si/viewer.properties new file mode 100644 index 0000000..ba54b71 --- /dev/null +++ b/src/cps/static/locale/si/viewer.properties @@ -0,0 +1,173 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=මීට පෙර පිටුව +previous_label=පෙර +next.title=මීළඟ පිටුව +next_label=මීළඟ + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=කුඩා කරන්න +zoom_out_label=කුඩා කරන්න +zoom_in.title=විශාල කරන්න +zoom_in_label=විශාල කරන්න +zoom.title=විශාලණය +presentation_mode.title=ඉදිරිපත්කිරීම් ප්‍රකාරය වෙත මාරුවන්න +presentation_mode_label=ඉදිරිපත්කිරීම් ප්‍රකාරය +open_file.title=ගොනුව විවෘත කරන්න +open_file_label=විවෘත කරන්න +print.title=මුද්‍රණය +print_label=මුද්‍රණය +download.title=බාගන්න +download_label=බාගන්න +bookmark.title=දැනට ඇති දසුන (පිටපත් කරන්න හෝ නව කවුළුවක විවෘත කරන්න) +bookmark_label=දැනට ඇති දසුන + +# Secondary toolbar and context menu +tools.title=මෙවලම් +tools_label=මෙවලම් +first_page.title=මුල් පිටුවට යන්න +first_page.label=මුල් පිටුවට යන්න +first_page_label=මුල් පිටුවට යන්න +last_page.title=අවසන් පිටුවට යන්න +last_page.label=අවසන් පිටුවට යන්න +last_page_label=අවසන් පිටුවට යන්න +page_rotate_cw.title=දක්ශිණාවර්තව භ්‍රමණය +page_rotate_cw.label=දක්ශිණාවර්තව භ්‍රමණය +page_rotate_cw_label=දක්ශිණාවර්තව භ්‍රමණය +page_rotate_ccw.title=වාමාවර්තව භ්‍රමණය +page_rotate_ccw.label=වාමාවර්තව භ්‍රමණය +page_rotate_ccw_label=වාමාවර්තව භ්‍රමණය + +hand_tool_enable.title=හස්ත මෙවලම සක්‍රීය +hand_tool_enable_label=හස්ත මෙවලම සක්‍රීය +hand_tool_disable.title=හස්ත මෙවලම අක්‍රීය +hand_tool_disable_label=හස්ත මෙවලම අක්‍රීය + +# Document properties dialog box +document_properties.title=ලේඛන වත්කම්... +document_properties_label=ලේඛන වත්කම්... +document_properties_file_name=ගොනු නම: +document_properties_file_size=ගොනු ප්‍රමාණය: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} බයිට) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} බයිට) +document_properties_title=සිරස්තලය: +document_properties_author=කතෲ +document_properties_subject=මාතෘකාව: +document_properties_keywords=යතුරු වදන්: +document_properties_creation_date=නිර්මිත දිනය: +document_properties_modification_date=වෙනස්කල දිනය: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=නිර්මාපක: +document_properties_producer=PDF නිශ්පාදක: +document_properties_version=PDF නිකුතුව: +document_properties_page_count=පිටු ගණන: +document_properties_close=වසන්න + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=පැති තීරුවට මාරුවන්න +toggle_sidebar_label=පැති තීරුවට මාරුවන්න +attachments.title=ඇමිණුම් පෙන්වන්න +attachments_label=ඇමිණුම් +thumbs.title=සිඟිති රූ පෙන්වන්න +thumbs_label=සිඟිති රූ +findbar.title=ලේඛනය තුළ සොයන්න +findbar_label=සොයන්න + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=පිටුව {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=පිටුවෙ සිඟිත රූව {{page}} + +# Find panel button title and messages +find_label=සොයන්න: +find_previous.title=මේ වාක්‍ය ඛණ්ඩය මීට පෙර යෙදුණු ස්ථානය සොයන්න +find_previous_label=පෙර: +find_next.title=මේ වාක්‍ය ඛණ්ඩය මීළඟට යෙදෙන ස්ථානය සොයන්න +find_next_label=මීළඟ +find_highlight=සියල්ල උද්දීපනය +find_match_case_label=අකුරු ගළපන්න +find_reached_top=පිටුවේ ඉහළ කෙළවරට ලගාවිය, පහළ සිට ඉදිරියට යමින් +find_reached_bottom=පිටුවේ පහළ කෙළවරට ලගාවිය, ඉහළ සිට ඉදිරියට යමින් +find_not_found=ඔබ සෙව් වචන හමු නොවීය + +# Error panel labels +error_more_info=බොහෝ තොරතුරු +error_less_info=අවම තොරතුරු +error_close=වසන්න +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (නිකුතුව: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=පණිවිඩය: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ගොනුව: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=පේළිය: {{line}} +rendering_error=පිටුව රෙන්ඩර් විමේදි ගැටලුවක් හට ගැනුණි. + +# Predefined zoom values +page_scale_width=පිටුවේ පළල +page_scale_fit=පිටුවට සුදුසු ලෙස +page_scale_auto=ස්වයංක්‍රීය විශාලණය +page_scale_actual=නියමිත ප්‍රමාණය +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=දෝෂය +loading_error=PDF පූරණය විමේදි දෝෂයක් හට ගැනුණි. +invalid_file_error=දූශිත හෝ සාවද්‍ය PDF ගොනුව. +missing_file_error=නැතිවූ PDF ගොනුව. +unexpected_response_error=බලාපොරොත්තු නොවූ සේවාදායක ප්‍රතිචාරය. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} විස්තරය] +password_label=මෙම PDF ගොනුව විවෘත කිරීමට මුරපදය ඇතුළත් කරන්න. +password_invalid=වැරදි මුරපදයක්. කරුණාකර නැවත උත්සහ කරන්න. +password_ok=හරි +password_cancel=එපා + +printing_not_supported=අවවාදයයි: මෙම ගවේශකය මුද්‍රණය සඳහා සම්පූර්ණයෙන් සහය නොදක්වයි. +printing_not_ready=අවවාදයයි: මුද්‍රණය සඳහා PDF සම්පූර්ණයෙන් පූර්ණය වී නොමැත. +web_fonts_disabled=ජාල අකුරු අක්‍රීයයි: තිළැලි PDF අකුරු භාවිත කළ නොහැක. diff --git a/src/cps/static/locale/sk/viewer.properties b/src/cps/static/locale/sk/viewer.properties new file mode 100644 index 0000000..267540c --- /dev/null +++ b/src/cps/static/locale/sk/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Predchádzajúca strana +previous_label=Predchádzajúca +next.title=Nasledujúca strana +next_label=Nasledujúca + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Strana +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=z {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} z {{pagesCount}}) + +zoom_out.title=Vzdialiť +zoom_out_label=Vzdialiť +zoom_in.title=Priblížiť +zoom_in_label=Priblížiť +zoom.title=Lupa +presentation_mode.title=Prepnúť na režim Prezentácia +presentation_mode_label=Režim Prezentácia +open_file.title=Otvoriť súbor +open_file_label=Otvoriť +print.title=Tlačiť +print_label=Tlačiť +download.title=Prevziať +download_label=Prevziať +bookmark.title=Aktuálne zobrazenie (kopírovať alebo otvoriť v novom okne) +bookmark_label=Aktuálne zobrazenie + +# Secondary toolbar and context menu +tools.title=Nástroje +tools_label=Nástroje +first_page.title=Prejsť na prvú stranu +first_page.label=Prejsť na prvú stranu +first_page_label=Prejsť na prvú stranu +last_page.title=Prejsť na poslednú stranu +last_page.label=Prejsť na poslednú stranu +last_page_label=Prejsť na poslednú stranu +page_rotate_cw.title=Otočiť v smere hodinových ručičiek +page_rotate_cw.label=Otočiť v smere hodinových ručičiek +page_rotate_cw_label=Otočiť v smere hodinových ručičiek +page_rotate_ccw.title=Otočiť proti smeru hodinových ručičiek +page_rotate_ccw.label=Otočiť proti smeru hodinových ručičiek +page_rotate_ccw_label=Otočiť proti smeru hodinových ručičiek + +hand_tool_enable.title=Zapnúť nástroj Ruka +hand_tool_enable_label=Zapnúť nástroj Ruka +hand_tool_disable.title=Vypnúť nástroj Ruka +hand_tool_disable_label=Vypnúť nástroj Ruka + +# Document properties dialog box +document_properties.title=Vlastnosti dokumentu… +document_properties_label=Vlastnosti dokumentu… +document_properties_file_name=Názov súboru: +document_properties_file_size=Veľkosť súboru: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kB ({{size_b}} bajtov) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajtov) +document_properties_title=Názov: +document_properties_author=Autor: +document_properties_subject=Predmet: +document_properties_keywords=Kľúčové slová: +document_properties_creation_date=Dátum vytvorenia: +document_properties_modification_date=Dátum úpravy: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Vytvoril: +document_properties_producer=Tvorca PDF: +document_properties_version=Verzia PDF: +document_properties_page_count=Počet strán: +document_properties_close=Zavrieť + +print_progress_message=Príprava dokumentu na tlač… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Zrušiť + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Prepnúť bočný panel +toggle_sidebar_label=Prepnúť bočný panel +document_outline.title=Zobraziť prehľad dokumentu (dvojitým kliknutím rozbalíte/zbalíte všetky položky) +document_outline_label=Prehľad dokumentu +attachments.title=Zobraziť prílohy +attachments_label=Prílohy +thumbs.title=Zobraziť miniatúry +thumbs_label=Miniatúry +findbar.title=Hľadať v dokumente +findbar_label=Hľadať + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Strana {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatúra strany {{page}} + +# Find panel button title and messages +find_label=Hľadať: +find_previous.title=Vyhľadať predchádzajúci výskyt reťazca +find_previous_label=Predchádzajúce +find_next.title=Vyhľadať ďalší výskyt reťazca +find_next_label=Ďalšie +find_highlight=Zvýrazniť všetky +find_match_case_label=Rozlišovať malé/veľké písmená +find_reached_top=Bol dosiahnutý začiatok stránky, pokračuje sa od konca +find_reached_bottom=Bol dosiahnutý koniec stránky, pokračuje sa od začiatku +find_not_found=Výraz nebol nájdený + +# Error panel labels +error_more_info=Viac informácií +error_less_info=Menej informácií +error_close=Zavrieť +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (zostavenie: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Správa: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Zásobník: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Súbor: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Riadok: {{line}} +rendering_error=Pri vykresľovaní stránky sa vyskytla chyba. + +# Predefined zoom values +page_scale_width=Na šírku strany +page_scale_fit=Na veľkosť strany +page_scale_auto=Automatická veľkosť +page_scale_actual=Skutočná veľkosť +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Chyba +loading_error=Počas načítavania dokumentu PDF sa vyskytla chyba. +invalid_file_error=Neplatný alebo poškodený súbor PDF. +missing_file_error=Chýbajúci súbor PDF. +unexpected_response_error=Neočakávaná odpoveď zo servera. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Anotácia typu {{type}}] +password_label=Ak chcete otvoriť tento súbor PDF, zadajte jeho heslo. +password_invalid=Heslo nie je platné. Skúste to znova. +password_ok=OK +password_cancel=Zrušiť + +printing_not_supported=Upozornenie: tlač nie je v tomto prehliadači plne podporovaná. +printing_not_ready=Upozornenie: súbor PDF nie je plne načítaný pre tlač. +web_fonts_disabled=Webové písma sú vypnuté: nie je možné použiť písma vložené do súboru PDF. +document_colors_not_allowed=Dokumenty PDF nemajú povolené používať vlastné farby, pretože voľba "Povoliť stránkam používať vlastné farby" je v nastaveniach prehliadača vypnutá. diff --git a/src/cps/static/locale/sl/viewer.properties b/src/cps/static/locale/sl/viewer.properties new file mode 100644 index 0000000..b4dac95 --- /dev/null +++ b/src/cps/static/locale/sl/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Prejšnja stran +previous_label=Nazaj +next.title=Naslednja stran +next_label=Naprej + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Stran +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=od {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} od {{pagesCount}}) + +zoom_out.title=Pomanjšaj +zoom_out_label=Pomanjšaj +zoom_in.title=Povečaj +zoom_in_label=Povečaj +zoom.title=Povečava +presentation_mode.title=Preklopi v način predstavitve +presentation_mode_label=Način predstavitve +open_file.title=Odpri datoteko +open_file_label=Odpri +print.title=Natisni +print_label=Natisni +download.title=Prenesi +download_label=Prenesi +bookmark.title=Trenutni pogled (kopiraj ali odpri v novem oknu) +bookmark_label=Trenutni pogled + +# Secondary toolbar and context menu +tools.title=Orodja +tools_label=Orodja +first_page.title=Pojdi na prvo stran +first_page.label=Pojdi na prvo stran +first_page_label=Pojdi na prvo stran +last_page.title=Pojdi na zadnjo stran +last_page.label=Pojdi na zadnjo stran +last_page_label=Pojdi na zadnjo stran +page_rotate_cw.title=Zavrti v smeri urninega kazalca +page_rotate_cw.label=Zavrti v smeri urninega kazalca +page_rotate_cw_label=Zavrti v smeri urninega kazalca +page_rotate_ccw.title=Zavrti v nasprotni smeri urninega kazalca +page_rotate_ccw.label=Zavrti v nasprotni smeri urninega kazalca +page_rotate_ccw_label=Zavrti v nasprotni smeri urninega kazalca + +hand_tool_enable.title=Omogoči roko +hand_tool_enable_label=Omogoči roko +hand_tool_disable.title=Onemogoči roko +hand_tool_disable_label=Onemogoči roko + +# Document properties dialog box +document_properties.title=Lastnosti dokumenta … +document_properties_label=Lastnosti dokumenta … +document_properties_file_name=Ime datoteke: +document_properties_file_size=Velikost datoteke: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bajtov) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajtov) +document_properties_title=Ime: +document_properties_author=Avtor: +document_properties_subject=Tema: +document_properties_keywords=Ključne besede: +document_properties_creation_date=Datum nastanka: +document_properties_modification_date=Datum spremembe: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Ustvaril: +document_properties_producer=Izdelovalec PDF: +document_properties_version=Različica PDF: +document_properties_page_count=Število strani: +document_properties_close=Zapri + +print_progress_message=Priprava dokumenta na tiskanje … +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}} % +print_progress_close=Prekliči + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Preklopi stransko vrstico +toggle_sidebar_label=Preklopi stransko vrstico +document_outline.title=Prikaži oris dokumenta (dvokliknite za razširitev/strnitev vseh predmetov) +document_outline_label=Oris dokumenta +attachments.title=Prikaži priponke +attachments_label=Priponke +thumbs.title=Prikaži sličice +thumbs_label=Sličice +findbar.title=Iskanje po dokumentu +findbar_label=Iskanje + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Stran {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Sličica strani {{page}} + +# Find panel button title and messages +find_label=Najdi: +find_previous.title=Najdi prejšnjo ponovitev iskanega +find_previous_label=Najdi nazaj +find_next.title=Najdi naslednjo ponovitev iskanega +find_next_label=Najdi naprej +find_highlight=Označi vse +find_match_case_label=Razlikuj velike/male črke +find_reached_top=Dosežen začetek dokumenta iz smeri konca +find_reached_bottom=Doseženo konec dokumenta iz smeri začetka +find_not_found=Iskanega ni mogoče najti + +# Error panel labels +error_more_info=Več informacij +error_less_info=Manj informacij +error_close=Zapri +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js r{{version}} (graditev: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Sporočilo: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Sklad: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Datoteka: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Vrstica: {{line}} +rendering_error=Med pripravljanjem strani je prišlo do napake! + +# Predefined zoom values +page_scale_width=Širina strani +page_scale_fit=Prilagodi stran +page_scale_auto=Samodejno +page_scale_actual=Dejanska velikost +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}} % + +# Loading indicator messages +loading_error_indicator=Napaka +loading_error=Med nalaganjem datoteke PDF je prišlo do napake. +invalid_file_error=Neveljavna ali pokvarjena datoteka PDF. +missing_file_error=Ni datoteke PDF. +unexpected_response_error=Nepričakovan odgovor strežnika. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Opomba vrste {{type}}] +password_label=Vnesite geslo za odpiranje te datoteke PDF. +password_invalid=Neveljavno geslo. Poskusite znova. +password_ok=V redu +password_cancel=Prekliči + +printing_not_supported=Opozorilo: ta brskalnik ne podpira vseh možnosti tiskanja. +printing_not_ready=Opozorilo: PDF ni v celoti naložen za tiskanje. +web_fonts_disabled=Spletne pisave so onemogočene: vgradnih pisav za PDF ni mogoče uporabiti. +document_colors_not_allowed=Dokumenti PDF ne smejo uporabljati svojih lastnih barv: možnost 'Dovoli stranem uporabo lastnih barv' je v brskalniku onemogočena. diff --git a/src/cps/static/locale/son/viewer.properties b/src/cps/static/locale/son/viewer.properties new file mode 100644 index 0000000..da4d47f --- /dev/null +++ b/src/cps/static/locale/son/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Moo bisante +previous_label=Bisante +next.title=Jinehere moo +next_label=Jine + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Moo +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} ra +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} ka hun {{pagesCount}}) ra + +zoom_out.title=Nakasandi +zoom_out_label=Nakasandi +zoom_in.title=Bebbeerandi +zoom_in_label=Bebbeerandi +zoom.title=Bebbeerandi +presentation_mode.title=Bere cebeyan alhaali +presentation_mode_label=Cebeyan alhaali +open_file.title=Tuku feeri +open_file_label=Feeri +print.title=Kar +print_label=Kar +download.title=Zumandi +download_label=Zumandi +bookmark.title=Sohõ gunarro (bere wala feeri zanfun taaga ra) +bookmark_label=Sohõ gunaroo + +# Secondary toolbar and context menu +tools.title=Goyjinawey +tools_label=Goyjinawey +first_page.title=Koy moo jinaa ga +first_page.label=Koy moo jinaa ga +first_page_label=Koy moo jinaa ga +last_page.title=Koy moo koraa ga +last_page.label=Koy moo koraa ga +last_page_label=Koy moo koraa ga +page_rotate_cw.title=Kuubi kanbe guma here +page_rotate_cw.label=Kuubi kanbe guma here +page_rotate_cw_label=Kuubi kanbe guma here +page_rotate_ccw.title=Kuubi kanbe wowa here +page_rotate_ccw.label=Kuubi kanbe wowa here +page_rotate_ccw_label=Kuubi kanbe wowa here + +hand_tool_enable.title=Kanbe goyjinay tunandi +hand_tool_enable_label=Kanbe goyjinay tunandi +hand_tool_disable.title=Kanbe joyjinay kaa +hand_tool_disable_label=Kanbe goyjinay kaa + +# Document properties dialog box +document_properties.title=Takadda mayrawey… +document_properties_label=Takadda mayrawey… +document_properties_file_name=Tuku maa: +document_properties_file_size=Tuku adadu: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb=KB {{size_kb}} (cebsu-ize {{size_b}}) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb=MB {{size_mb}} (cebsu-ize {{size_b}}) +document_properties_title=Tiiramaa: +document_properties_author=Hantumkaw: +document_properties_subject=Dalil: +document_properties_keywords=Kufalkalimawey: +document_properties_creation_date=Teeyan han: +document_properties_modification_date=Barmayan han: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Teekaw: +document_properties_producer=PDF berandikaw: +document_properties_version=PDF dumi: +document_properties_page_count=Moo hinna: +document_properties_close=Daabu + +print_progress_message=Goo ma takaddaa soolu k'a kar se… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Naŋ + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Kanjari ceraw zuu +toggle_sidebar_label=Kanjari ceraw zuu +document_outline.title=Takaddaa korfur alhaaloo cebe (naagu cee hinka ka haya-izey kul hayandi/kankamandi) +document_outline_label=Takadda filla-boŋ +attachments.title=Hangarey cebe +attachments_label=Hangarey +thumbs.title=Kabeboy biyey cebe +thumbs_label=Kabeboy biyey +findbar.title=Ceeci takaddaa ra +findbar_label=Ceeci + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title={{page}} moo +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Kabeboy bii {{page}} moo še + +# Find panel button title and messages +find_label=Ceeci: +find_previous.title=Kalimaɲaŋoo bangayri bisantaa ceeci +find_previous_label=Bisante +find_next.title=Kalimaɲaŋoo hiino bangayroo ceeci +find_next_label=Jine +find_highlight=Ikul šilbay +find_match_case_label=Harfu-beeriyan hawgay +find_reached_top=A too moŋoo boŋoo, koy jine ka šinitin nda cewoo +find_reached_bottom=A too moɲoo cewoo, koy jine šintioo ga +find_not_found=Kalimaɲaa mana duwandi + +# Error panel labels +error_more_info=Alhabar tontoni +error_less_info=Alhabar tontoni +error_close=Daabu +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Alhabar: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Dekeri: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Tuku: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Žeeri: {{line}} +rendering_error=Firka bangay kaŋ moɲoo goo ma willandi. + +# Predefined zoom values +page_scale_width=Mooo hayyan +page_scale_fit=Moo sawayan +page_scale_auto=Boŋše azzaati barmayyan +page_scale_actual=Adadu cimi +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Firka +loading_error=Firka bangay kaŋ PDF goo ma zumandi. +invalid_file_error=PDF tuku laala wala laybante. +missing_file_error=PDF tuku kumante. +unexpected_response_error=Manti feršikaw tuuruyan maatante. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt={{type}} maasa-caw] +password_label=Šennikufal dam ka PDF tukoo woo feeri. +password_invalid=Šennikufal laalo. Ceeci koyne taare. +password_ok=Ayyo +password_cancel=Naŋ + +printing_not_supported=Yaamar: Karyan ši tee ka timme nda ceecikaa woo. +printing_not_ready=Yaamar: PDF ši zunbu ka timme karyan še. +web_fonts_disabled=Interneti šigirawey kay: ši hin ka goy nda PDF šigira hurantey. +document_colors_not_allowed=PDF takaddawey ši duu fondo ka ngey boŋ noonawey zaa: “Naŋ moɲey ma ngey boŋ noonawey suuba” ši dira ceecikaa ga. diff --git a/src/cps/static/locale/sq/viewer.properties b/src/cps/static/locale/sq/viewer.properties new file mode 100644 index 0000000..10a7b8b --- /dev/null +++ b/src/cps/static/locale/sq/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Faqja e Mëparshme +previous_label=E mëparshmja +next.title=Faqja Pasuese +next_label=Pasuesja + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Faqe +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=nga {{pagesCount}} gjithsej +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} nga {{pagesCount}}) + +zoom_out.title=Zmadhim +zoom_out_label=Zmadhoji +zoom_in.title=Zvogëlim +zoom_in_label=Zvogëloji +zoom.title=Zoom +presentation_mode.title=Kalo te Mënyra Paraqitje +presentation_mode_label=Mënyra Paraqitje +open_file.title=Hapni Kartelë +open_file_label=Hape +print.title=Shtypje +print_label=Shtype +download.title=Shkarkim +download_label=Shkarkoje +bookmark.title=Pamja e tanishme (kopjojeni ose hapeni në dritare të re) +bookmark_label=Pamja e Tanishme + +# Secondary toolbar and context menu +tools.title=Mjete +tools_label=Mjete +first_page.title=Kaloni te Faqja e Parë +first_page.label=Kalo te Faqja e Parë +first_page_label=Kalo te Faqja e Parë +last_page.title=Kaloni te Faqja e Fundit +last_page.label=Kalo te Faqja e Fundit +last_page_label=Kalo te Faqja e Fundit +page_rotate_cw.title=Rrotullojeni Në Kahun Orar +page_rotate_cw.label=Rrotulloje Në Kahun Orar +page_rotate_cw_label=Rrotulloje Në Kahun Orar +page_rotate_ccw.title=Rrotullojeni Në Kahun Kundërorar +page_rotate_ccw.label=Rrotulloje Në Kahun Kundërorar +page_rotate_ccw_label=Rrotulloje Në Kahun Kundërorar + +hand_tool_enable.title=Aktivizoni mjetin dorë +hand_tool_enable_label=Aktivizo mjetin dorë +hand_tool_disable.title=Çaktivizoni mjetin dorë +hand_tool_disable_label=Çaktivizo mjetin dorë + +# Document properties dialog box +document_properties.title=Veti Dokumenti… +document_properties_label=Veti Dokumenti… +document_properties_file_name=Emër kartele: +document_properties_file_size=Madhësi kartele: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bajte) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bajte) +document_properties_title=Titull: +document_properties_author=Autor: +document_properties_subject=Subjekt: +document_properties_keywords=Fjalëkyçe: +document_properties_creation_date=Datë Krijimi: +document_properties_modification_date=Datë Ndryshimi: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Krijues: +document_properties_producer=Prodhues PDF-je: +document_properties_version=Version PDF-je: +document_properties_page_count=Numër Faqesh: +document_properties_close=Mbylle + +print_progress_message=Po përgatitet dokumenti për shtypje… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Anuloje + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Shfaqni/Fshihni Anështyllën +toggle_sidebar_label=Shfaq/Fshih Anështyllën +document_outline.title=Shfaqni Përvijim Dokumenti (dyklikoni që të shfaqen/fshihen krejt elementët) +document_outline_label=Përvijim Dokumenti +attachments.title=Shfaqni Bashkëngjitje +attachments_label=Bashkëngjitje +thumbs.title=Shfaqni Miniatura +thumbs_label=Miniatura +findbar.title=Gjeni në Dokument +findbar_label=Gjej + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Faqja {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniaturë e Faqes {{page}} + +# Find panel button title and messages +find_label=Gjej: +find_previous.title=Gjeni hasjen e mëparshme të togfjalëshit +find_previous_label=E mëparshmja +find_next.title=Gjeni hasjen pasuese të togfjalëshit +find_next_label=Pasuesja +find_highlight=Theksoji të tëra +find_match_case_label=Siç është shkruar +find_reached_top=U mbërrit në krye të dokumentit, vazhduar prej fundit +find_reached_bottom=U mbërrit në fund të dokumentit, vazhduar prej kreut +find_not_found=S’u gjet togfjalëshi + +# Error panel labels +error_more_info=Më Tepër të Dhëna +error_less_info=Më Pak të Dhëna +error_close=Mbylle +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mesazh: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Kartelë: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rresht: {{line}} +rendering_error=Ndodhi një gabim gjatë riprodhimit të faqes. + +# Predefined zoom values +page_scale_width=Gjerësi Faqeje +page_scale_fit=Sa Nxë Faqja +page_scale_auto=Zoom i Vetvetishëm +page_scale_actual=Madhësia Faktike +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Gabim +loading_error=Ndodhi një gabim gjatë ngarkimit të PDF-së. +invalid_file_error=Kartelë PDF e pavlefshme ose e dëmtuar. +missing_file_error=Kartelë PDF që mungon. +unexpected_response_error=Përgjigje shërbyesi e papritur. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Nënvizim {{type}}] +password_label=Jepni fjalëkalimin që të hapet kjo kartelë PDF. +password_invalid=Fjalëkalim i pavlefshëm. Ju lutemi, riprovoni. +password_ok=OK +password_cancel=Anuloje + +printing_not_supported=Kujdes: Shtypja s’mbulohet plotësisht nga ky shfletues. +printing_not_ready=Kujdes: PDF-ja s’është ngarkuar plotësisht që ta shtypni. +web_fonts_disabled=Shkronjat Web janë të çaktivizuara: s’arrihet të përdoren shkronja të trupëzuara në PDF. +document_colors_not_allowed=Dokumenteve PDF s’u lejohet të përdorin ngjyrat e tyre: 'Lejoji faqet t’i zgjedhin vetë ngjyrat' është e çaktivizuar te shfletuesi. diff --git a/src/cps/static/locale/sr/viewer.properties b/src/cps/static/locale/sr/viewer.properties new file mode 100644 index 0000000..7f9d9f8 --- /dev/null +++ b/src/cps/static/locale/sr/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Претходна страница +previous_label=Претходна +next.title=Следећа страница +next_label=Следећа + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Страница +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=од {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} од {{pagesCount}}) + +zoom_out.title=Умањи +zoom_out_label=Умањи +zoom_in.title=Увеличај +zoom_in_label=Увеличај +zoom.title=Увеличавање +presentation_mode.title=Промени на приказ у режиму презентације +presentation_mode_label=Режим презентације +open_file.title=Отвори датотеку +open_file_label=Отвори +print.title=Штампај +print_label=Штампај +download.title=Преузми +download_label=Преузми +bookmark.title=Тренутни приказ (копирај или отвори нови прозор) +bookmark_label=Тренутни приказ + +# Secondary toolbar and context menu +tools.title=Алатке +tools_label=Алатке +first_page.title=Иди на прву страницу +first_page.label=Иди на прву страницу +first_page_label=Иди на прву страницу +last_page.title=Иди на последњу страницу +last_page.label=Иди на последњу страницу +last_page_label=Иди на последњу страницу +page_rotate_cw.title=Ротирај у смеру казаљке на сату +page_rotate_cw.label=Ротирај у смеру казаљке на сату +page_rotate_cw_label=Ротирај у смеру казаљке на сату +page_rotate_ccw.title=Ротирај у смеру супротном од казаљке на сату +page_rotate_ccw.label=Ротирај у смеру супротном од казаљке на сату +page_rotate_ccw_label=Ротирај у смеру супротном од казаљке на сату + +hand_tool_enable.title=Омогући алатку за померање +hand_tool_enable_label=Омогући алатку за померање +hand_tool_disable.title=Онемогући алатку за померање +hand_tool_disable_label=Онемогући алатку за померање + +# Document properties dialog box +document_properties.title=Параметри документа… +document_properties_label=Параметри документа… +document_properties_file_name=Име датотеке: +document_properties_file_size=Величина датотеке: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} B) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} B) +document_properties_title=Наслов: +document_properties_author=Аутор: +document_properties_subject=Тема: +document_properties_keywords=Кључне речи: +document_properties_creation_date=Датум креирања: +document_properties_modification_date=Датум модификације: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Стваралац: +document_properties_producer=PDF произвођач: +document_properties_version=PDF верзија: +document_properties_page_count=Број страница: +document_properties_close=Затвори + +print_progress_message=Припремам документ за штампање… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Откажи + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Прикажи додатну палету +toggle_sidebar_label=Прикажи додатну палету +document_outline.title=Прикажи контуру документа (дупли клик за проширење/скупљање елемената) +document_outline_label=Контура документа +attachments.title=Прикажи прилоге +attachments_label=Прилози +thumbs.title=Прикажи сличице +thumbs_label=Сличице +findbar.title=Пронађи у документу +findbar_label=Пронађи + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Страница {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Сличица од странице {{page}} + +# Find panel button title and messages +find_label=Пронађи: +find_previous.title=Пронађи претходну појаву фразе +find_previous_label=Претходна +find_next.title=Пронађи следећу појаву фразе +find_next_label=Следећа +find_highlight=Истакнути све +find_match_case_label=Подударања +find_reached_top=Достигнут врх документа, наставио са дна +find_reached_bottom=Достигнуто дно документа, наставио са врха +find_not_found=Фраза није пронађена + +# Error panel labels +error_more_info=Више информација +error_less_info=Мање информација +error_close=Затвори +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Порука: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Стек: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Датотека: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Линија: {{line}} +rendering_error=Дошло је до грешке приликом рендеровања ове странице. + +# Predefined zoom values +page_scale_width=Ширина странице +page_scale_fit=Прилагоди страницу +page_scale_auto=Аутоматско увеличавање +page_scale_actual=Стварна величина +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Грешка +loading_error=Дошло је до грешке приликом учитавања PDF-а. +invalid_file_error=PDF датотека је оштећена или је неисправна. +missing_file_error=PDF датотека није пронађена. +unexpected_response_error=Неочекиван одговор од сервера. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} коментар] +password_label=Унесите лозинку да бисте отворили овај PDF докуменат. +password_invalid=Неисправна лозинка. Покушајте поново. +password_ok=У реду +password_cancel=Откажи + +printing_not_supported=Упозорење: Штампање није у потпуности подржано у овом прегледачу. +printing_not_ready=Упозорење: PDF није у потпуности учитан за штампу. +web_fonts_disabled=Веб фонтови су онемогућени: не могу користити уграђене PDF фонтове. +document_colors_not_allowed=PDF документи не могу да користе сопствене боје: “Дозволи страницама да изаберу своје боје” је деактивирано у прегледачу. diff --git a/src/cps/static/locale/sv-SE/viewer.properties b/src/cps/static/locale/sv-SE/viewer.properties new file mode 100644 index 0000000..6edaacb --- /dev/null +++ b/src/cps/static/locale/sv-SE/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Föregående sida +previous_label=Föregående +next.title=Nästa sida +next_label=Nästa + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Sida +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=av {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} av {{pagesCount}}) + +zoom_out.title=Zooma ut +zoom_out_label=Zooma ut +zoom_in.title=Zooma in +zoom_in_label=Zooma in +zoom.title=Zoom +presentation_mode.title=Byt till presentationsläge +presentation_mode_label=Presentationsläge +open_file.title=Öppna fil +open_file_label=Öppna +print.title=Skriv ut +print_label=Skriv ut +download.title=Hämta +download_label=Hämta +bookmark.title=Aktuell vy (kopiera eller öppna i nytt fönster) +bookmark_label=Aktuell vy + +# Secondary toolbar and context menu +tools.title=Verktyg +tools_label=Verktyg +first_page.title=Gå till första sidan +first_page.label=Gå till första sidan +first_page_label=Gå till första sidan +last_page.title=Gå till sista sidan +last_page.label=Gå till sista sidan +last_page_label=Gå till sista sidan +page_rotate_cw.title=Rotera medurs +page_rotate_cw.label=Rotera medurs +page_rotate_cw_label=Rotera medurs +page_rotate_ccw.title=Rotera moturs +page_rotate_ccw.label=Rotera moturs +page_rotate_ccw_label=Rotera moturs + +hand_tool_enable.title=Aktivera handverktyg +hand_tool_enable_label=Aktivera handverktyg +hand_tool_disable.title=Inaktivera handverktyg +hand_tool_disable_label=Inaktivera handverktyg + +# Document properties dialog box +document_properties.title=Dokumentegenskaper… +document_properties_label=Dokumentegenskaper… +document_properties_file_name=Filnamn: +document_properties_file_size=Filstorlek: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} kB ({{size_b}} byte) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} byte) +document_properties_title=Titel: +document_properties_author=Författare: +document_properties_subject=Ämne: +document_properties_keywords=Nyckelord: +document_properties_creation_date=Skapades: +document_properties_modification_date=Ändrades: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Skapare: +document_properties_producer=PDF-producent: +document_properties_version=PDF-version: +document_properties_page_count=Sidantal: +document_properties_close=Stäng + +print_progress_message=Förbereder sidor för utskrift… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Avbryt + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Visa/dölj sidofält +toggle_sidebar_label=Visa/dölj sidofält +document_outline.title=Visa dokumentdisposition (dubbelklicka för att expandera/komprimera alla objekt) +document_outline_label=Dokumentöversikt +attachments.title=Visa Bilagor +attachments_label=Bilagor +thumbs.title=Visa miniatyrer +thumbs_label=Miniatyrer +findbar.title=Sök i dokument +findbar_label=Sök + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Sida {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Miniatyr av sida {{page}} + +# Find panel button title and messages +find_label=Sök: +find_previous.title=Hitta föregående förekomst av frasen +find_previous_label=Föregående +find_next.title=Hitta nästa förekomst av frasen +find_next_label=Nästa +find_highlight=Markera alla +find_match_case_label=Matcha versal/gemen +find_reached_top=Nådde början av dokumentet, började från slutet +find_reached_bottom=Nådde slutet på dokumentet, började från början +find_not_found=Frasen hittades inte + +# Error panel labels +error_more_info=Mer information +error_less_info=Mindre information +error_close=Stäng +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Meddelande: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Fil: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rad: {{line}} +rendering_error=Ett fel uppstod vid visning av sidan. + +# Predefined zoom values +page_scale_width=Sidbredd +page_scale_fit=Anpassa sida +page_scale_auto=Automatisk zoom +page_scale_actual=Verklig storlek +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Fel +loading_error=Ett fel uppstod vid laddning av PDF-filen. +invalid_file_error=Ogiltig eller korrupt PDF-fil. +missing_file_error=Saknad PDF-fil. +unexpected_response_error=Oväntat svar från servern. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}}-annotering] +password_label=Skriv in lösenordet för att öppna PDF-filen. +password_invalid=Ogiltigt lösenord. Försök igen. +password_ok=OK +password_cancel=Avbryt + +printing_not_supported=Varning: Utskrifter stöds inte helt av den här webbläsaren. +printing_not_ready=Varning: PDF:en är inte klar för utskrift. +web_fonts_disabled=Webbtypsnitt är inaktiverade: kan inte använda inbäddade PDF-typsnitt. +document_colors_not_allowed=PDF-dokument tillåts inte använda egna färger: “Låt sidor använda egna färger” är inaktiverat i webbläsaren. diff --git a/src/cps/static/locale/sw/viewer.properties b/src/cps/static/locale/sw/viewer.properties new file mode 100644 index 0000000..4df8285 --- /dev/null +++ b/src/cps/static/locale/sw/viewer.properties @@ -0,0 +1,130 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Ukurasa Uliotangulia +previous_label=Iliyotangulia +next.title=Ukurasa Ufuatao +next_label=Ifuatayo + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Kuza Nje +zoom_out_label=Kuza Nje +zoom_in.title=Kuza Ndani +zoom_in_label=Kuza Ndani +zoom.title=Kuza +presentation_mode.title=Badili kwa Hali ya Uwasilishaji +presentation_mode_label=Hali ya Uwasilishaji +open_file.title=Fungua Faili +open_file_label=Fungua +print.title=Chapisha +print_label=Chapisha +download.title=Pakua +download_label=Pakua +bookmark.title=Mwonekano wa sasa (nakili au ufungue katika dirisha mpya) +bookmark_label=Mwonekano wa Sasa + +# Secondary toolbar and context menu + + +# Document properties dialog box +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_title=Kichwa: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Kibiano cha Upau wa Kando +toggle_sidebar_label=Kibiano cha Upau wa Kando +document_outline_label=Ufupisho wa Waraka +thumbs.title=Onyesha Kijipicha +thumbs_label=Vijipicha +findbar.title=Pata katika Waraka +findbar_label=Tafuta + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Ukurasa {{ukurasa}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Kijipicha cha ukurasa {{ukurasa}} + +# Find panel button title and messages +find_label=Tafuta: +find_previous.title=Tafuta tukio kabla ya msemo huu +find_previous_label=Iliyotangulia +find_next.title=Tafuta tukio linalofuata la msemo +find_next_label=Ifuatayo +find_highlight=Angazia yote +find_match_case_label=Linganisha herufi +find_reached_top=Imefika juu ya waraka, imeendelea kutoka chini +find_reached_bottom=Imefika mwisho wa waraka, imeendelea kutoka juu +find_not_found=Msemo hukupatikana + +# Error panel labels +error_more_info=Maelezo Zaidi +error_less_info=Maelezo Kidogo +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (jenga: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Ujumbe: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Panganya: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Faili: {{faili}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Laini: {{laini}} +rendering_error=Hitilafu lilitokea wajati wa kutoa ukurasa + +# Predefined zoom values +page_scale_width=Upana wa Ukurasa +page_scale_fit=Usawa wa Ukurasa +page_scale_auto=Ukuzaji wa Kiotomatiki +page_scale_actual=Ukubwa Halisi +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=Hitilafu +loading_error=Hitilafu lilitokea wakati wa kupakia PDF. +invalid_file_error=Faili ya PDF isiyohalali au potofu. +missing_file_error=Faili ya PDF isiyopo. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Ufafanuzi] +password_ok=SAWA + +printing_not_supported=Onyo: Uchapishaji hauauniwi kabisa kwa kivinjari hiki. +web_fonts_disabled=Fonti za tovuti zimelemazwa: haziwezi kutumia fonti za PDF zilizopachikwa. diff --git a/src/cps/static/locale/ta-LK/viewer.properties b/src/cps/static/locale/ta-LK/viewer.properties new file mode 100644 index 0000000..f0b1f43 --- /dev/null +++ b/src/cps/static/locale/ta-LK/viewer.properties @@ -0,0 +1,77 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom.title=அளவு +open_file.title=கோப்பினைத் திறக்க +open_file_label=திறக்க + +# Secondary toolbar and context menu + + +# Document properties dialog box +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. + +# Find panel button title and messages +find_previous.title=இந்த சொற்றொடரின் முன்னைய நிகழ்வை தேடு +find_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வைத் தேடு + +# Error panel labels +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number + +# Predefined zoom values +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +password_ok=ஆம் + diff --git a/src/cps/static/locale/ta/viewer.properties b/src/cps/static/locale/ta/viewer.properties new file mode 100644 index 0000000..fe49ab7 --- /dev/null +++ b/src/cps/static/locale/ta/viewer.properties @@ -0,0 +1,179 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=முந்தைய பக்கம் +previous_label=முந்தையது +next.title=அடுத்த பக்கம் +next_label=அடுத்து + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} இல் +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages={{pagesCount}}) இல் ({{pageNumber}} + +zoom_out.title=சிறிதாக்கு +zoom_out_label=சிறிதாக்கு +zoom_in.title=பெரிதாக்கு +zoom_in_label=பெரிதாக்கு +zoom.title=பெரிதாக்கு +presentation_mode.title=விளக்ககாட்சி பயன்முறைக்கு மாறு +presentation_mode_label=விளக்ககாட்சி பயன்முறை +open_file.title=கோப்பினை திற +open_file_label=திற +print.title=அச்சிடு +print_label=அச்சிடு +download.title=பதிவிறக்கு +download_label=பதிவிறக்கு +bookmark.title=தற்போதைய காட்சி (புதிய சாளரத்திற்கு நகலெடு அல்லது புதிய சாளரத்தில் திற) +bookmark_label=தற்போதைய காட்சி + +# Secondary toolbar and context menu +tools.title=கருவிகள் +tools_label=கருவிகள் +first_page.title=முதல் பக்கத்திற்கு செல்லவும் +first_page.label=முதல் பக்கத்திற்கு செல்லவும் +first_page_label=முதல் பக்கத்திற்கு செல்லவும் +last_page.title=கடைசி பக்கத்திற்கு செல்லவும் +last_page.label=கடைசி பக்கத்திற்கு செல்லவும் +last_page_label=கடைசி பக்கத்திற்கு செல்லவும் +page_rotate_cw.title=வலஞ்சுழியாக சுழற்று +page_rotate_cw.label=வலஞ்சுழியாக சுழற்று +page_rotate_cw_label=வலஞ்சுழியாக சுழற்று +page_rotate_ccw.title=இடஞ்சுழியாக சுழற்று +page_rotate_ccw.label=இடஞ்சுழியாக சுழற்று +page_rotate_ccw_label=இடஞ்சுழியாக சுழற்று + +hand_tool_enable.title=கை கருவியை செயலாக்கு +hand_tool_enable_label=கை கருவியை செயலாக்கு +hand_tool_disable.title=கை கருவியை முடக்கு +hand_tool_disable_label=கை கருவியை முடக்கு + +# Document properties dialog box +document_properties.title=ஆவண பண்புகள்... +document_properties_label=ஆவண பண்புகள்... +document_properties_file_name=கோப்பு பெயர்: +document_properties_file_size=கோப்பின் அளவு: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} கிபை ({{size_b}} பைட்டுகள்) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} மெபை ({{size_b}} பைட்டுகள்) +document_properties_title=தலைப்பு: +document_properties_author=எழுதியவர் +document_properties_subject=பொருள்: +document_properties_keywords=முக்கிய வார்த்தைகள்: +document_properties_creation_date=படைத்த தேதி : +document_properties_modification_date=திருத்திய தேதி: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=உருவாக்குபவர்: +document_properties_producer=பிடிஎஃப் தயாரிப்பாளர்: +document_properties_version=PDF பதிப்பு: +document_properties_page_count=பக்க எண்ணிக்கை: +document_properties_close=மூடுக + +print_progress_message=அச்சிடுவதற்கான ஆவணம் தயாராகிறது... +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=பக்கப் பட்டியை நிலைமாற்று +toggle_sidebar_label=பக்கப் பட்டியை நிலைமாற்று +document_outline.title=ஆவண அடக்கத்தைக் காட்டு (இருமுறைச் சொடுக்கி அனைத்து உறுப்பிடிகளையும் விரி/சேர்) +document_outline_label=ஆவண வெளிவரை +attachments.title=இணைப்புகளை காண்பி +attachments_label=இணைப்புகள் +thumbs.title=சிறுபடங்களைக் காண்பி +thumbs_label=சிறுபடங்கள் +findbar.title=ஆவணத்தில் கண்டறி +findbar_label=கண்டுபிடி + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=பக்கம் {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=பக்கத்தின் சிறுபடம் {{page}} + +# Find panel button title and messages +find_label=கண்டறி: +find_previous.title=இந்த சொற்றொடரின் முந்தைய நிகழ்வை தேடு +find_previous_label=முந்தையது +find_next.title=இந்த சொற்றொடரின் அடுத்த நிகழ்வை தேடு +find_next_label=அடுத்து +find_highlight=அனைத்தையும் தனிப்படுத்து +find_match_case_label=பேரெழுத்தாக்கத்தை உணர் +find_reached_top=ஆவணத்தின் மேல் பகுதியை அடைந்தது, அடிப்பக்கத்திலிருந்து தொடர்ந்தது +find_reached_bottom=ஆவணத்தின் முடிவை அடைந்தது, மேலிருந்து தொடர்ந்தது +find_not_found=சொற்றொடர் காணவில்லை + +# Error panel labels +error_more_info=கூடுதல் தகவல் +error_less_info=குறைந்த தகவல் +error_close=மூடுக +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=செய்தி: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=ஸ்டேக்: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=கோப்பு: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=வரி: {{line}} +rendering_error=இந்தப் பக்கத்தை காட்சிப்படுத்தும் போது ஒரு பிழை ஏற்பட்டது. + +# Predefined zoom values +page_scale_width=பக்க அகலம் +page_scale_fit=பக்கப் பொருத்தம் +page_scale_auto=தானியக்க பெரிதாக்கல் +page_scale_actual=உண்மையான அளவு +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=பிழை +loading_error=PDF ஐ ஏற்றும் போது ஒரு பிழை ஏற்பட்டது. +invalid_file_error=செல்லுபடியாகாத அல்லது சிதைந்த PDF கோப்பு. +missing_file_error=PDF கோப்பு காணவில்லை. +unexpected_response_error=சேவகன் பதில் எதிர்பாரதது. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} விளக்கம்] +password_label=இந்த PDF கோப்பை திறக்க கடவுச்சொல்லை உள்ளிடவும். +password_invalid=செல்லுபடியாகாத கடவுச்சொல், தயை செய்து மீண்டும் முயற்சி செய்க. +password_ok=சரி + +printing_not_supported=எச்சரிக்கை: இந்த உலாவி அச்சிடுதலை முழுமையாக ஆதரிக்கவில்லை. +printing_not_ready=எச்சரிக்கை: PDF அச்சிட முழுவதுமாக ஏற்றப்படவில்லை. +web_fonts_disabled=வலை எழுத்துருக்கள் முடக்கப்பட்டுள்ளன: உட்பொதிக்கப்பட்ட PDF எழுத்துருக்களைப் பயன்படுத்த முடியவில்லை. +document_colors_not_allowed=PDF ஆவணங்களுக்குச் சொந்த நிறங்களைப் பயன்படுத்த அனுமதியில்லை: உலாவியில் "பக்கங்கள் தங்கள் சொந்த நிறங்களைத் தேர்வு செய்துகொள்ள அனுமதி" என்னும் விருப்பம் முடக்கப்பட்டுள்ளது. diff --git a/src/cps/static/locale/te/viewer.properties b/src/cps/static/locale/te/viewer.properties new file mode 100644 index 0000000..055ea1e --- /dev/null +++ b/src/cps/static/locale/te/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=మునుపటి పేజీ +previous_label=క్రితం +next.title=తరువాత పేజీ +next_label=తరువాత + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=పేజీ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=మొత్తం {{pageCount}} లో +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=(మొత్తం {{pagesCount}} లో {{pageNumber}}వది) + +zoom_out.title=జూమ్ తగ్గించు +zoom_out_label=జూమ్ తగ్గించు +zoom_in.title=జూమ్ చేయి +zoom_in_label=జూమ్ చేయి +zoom.title=జూమ్ +presentation_mode.title=ప్రదర్శనా రీతికి మారు +presentation_mode_label=ప్రదర్శనా రీతి +open_file.title=ఫైల్ తెరువు +open_file_label=తెరువు +print.title=ముద్రించు +print_label=ముద్రించు +download.title=డౌనులోడు +download_label=డౌనులోడు +bookmark.title=ప్రస్తుత దర్శనం (కాపీ చేయి లేదా కొత్త విండోలో తెరువు) +bookmark_label=ప్రస్తుత దర్శనం + +# Secondary toolbar and context menu +tools.title=పనిముట్లు +tools_label=పనిముట్లు +first_page.title=మొదటి పేజీకి వెళ్ళు +first_page.label=మొదటి పేజీకి వెళ్ళు +first_page_label=మొదటి పేజీకి వెళ్ళు +last_page.title=చివరి పేజీకి వెళ్ళు +last_page.label=చివరి పేజీకి వెళ్ళు +last_page_label=చివరి పేజీకి వెళ్ళు +page_rotate_cw.title=సవ్యదిశలో తిప్పు +page_rotate_cw.label=సవ్యదిశలో తిప్పు +page_rotate_cw_label=సవ్యదిశలో తిప్పు +page_rotate_ccw.title=అపసవ్యదిశలో తిప్పు +page_rotate_ccw.label=అపసవ్యదిశలో తిప్పు +page_rotate_ccw_label=అపసవ్యదిశలో తిప్పు + +hand_tool_enable.title=చేతి సాధనం చేతనించు +hand_tool_enable_label=చేతి సాధనం చేతనించు +hand_tool_disable.title=చేతి సాధనం అచేతనించు +hand_tool_disable_label=చేతి సాధనం అచేతనించు + +# Document properties dialog box +document_properties.title=పత్రము లక్షణాలు... +document_properties_label=పత్రము లక్షణాలు... +document_properties_file_name=దస్త్రం పేరు: +document_properties_file_size=దస్త్రం పరిమాణం: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=శీర్షిక: +document_properties_author=మూలకర్త: +document_properties_subject=విషయం: +document_properties_keywords=కీ పదాలు: +document_properties_creation_date=సృష్టించిన తేదీ: +document_properties_modification_date=సవరించిన తేదీ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=సృష్టికర్త: +document_properties_producer=PDF ఉత్పాదకి: +document_properties_version=PDF వర్షన్: +document_properties_page_count=పేజీల సంఖ్య: +document_properties_close=మూసివేయి + +print_progress_message=ముద్రించడానికి పత్రము సిద్ధమవుతున్నది… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=రద్దుచేయి + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=పక్కపట్టీ మార్చు +toggle_sidebar_label=పక్కపట్టీ మార్చు +document_outline.title=పత్రము రూపము చూపించు (డబుల్ క్లిక్ చేసి అన్ని అంశాలను విస్తరించు/కూల్చు) +document_outline_label=పత్రము అవుట్‌లైన్ +attachments.title=అనుబంధాలు చూపు +attachments_label=అనుబంధాలు +thumbs.title=థంబ్‌నైల్స్ చూపు +thumbs_label=థంబ్‌నైల్స్ +findbar.title=పత్రములో కనుగొనుము +findbar_label=కనుగొను + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=పేజీ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=పేజీ {{page}} యొక్క థంబ్‌నైల్ + +# Find panel button title and messages +find_label=కనుగొను: +find_previous.title=పదం యొక్క ముందు సంభవాన్ని కనుగొను +find_previous_label=మునుపటి +find_next.title=పదం యొక్క తర్వాతి సంభవాన్ని కనుగొను +find_next_label=తరువాత +find_highlight=అన్నిటిని ఉద్దీపనం చేయుము +find_match_case_label=అక్షరముల తేడాతో పోల్చు +find_reached_top=పేజీ పైకి చేరుకున్నది, క్రింది నుండి కొనసాగించండి +find_reached_bottom=పేజీ చివరకు చేరుకున్నది, పైనుండి కొనసాగించండి +find_not_found=పదం కనబడలేదు + +# Error panel labels +error_more_info=మరింత సమాచారం +error_less_info=తక్కువ సమాచారం +error_close=మూసివేయి +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=సందేశం: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=స్టాక్: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ఫైలు: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=వరుస: {{line}} +rendering_error=పేజీను రెండర్ చేయుటలో ఒక దోషం ఎదురైంది. + +# Predefined zoom values +page_scale_width=పేజీ వెడల్పు +page_scale_fit=పేజీ అమర్పు +page_scale_auto=స్వయంచాలక జూమ్ +page_scale_actual=యథార్ధ పరిమాణం +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=దోషం +loading_error=PDF లోడవుచున్నప్పుడు ఒక దోషం ఎదురైంది. +invalid_file_error=చెల్లని లేదా పాడైన PDF ఫైలు. +missing_file_error=దొరకని PDF ఫైలు. +unexpected_response_error=అనుకోని సర్వర్ స్పందన. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} టీకా] +password_label=ఈ PDF ఫైల్ తెరుచుటకు సంకేతపదం ప్రవేశపెట్టుము. +password_invalid=సంకేతపదం చెల్లదు. దయచేసి మళ్ళీ ప్రయత్నించండి. +password_ok=సరే +password_cancel=రద్దుచేయి + +printing_not_supported=హెచ్చరిక: ఈ విహారిణి చేత ముద్రణ పూర్తిగా తోడ్పాటు లేదు. +printing_not_ready=హెచ్చరిక: ముద్రణ కొరకు ఈ PDF పూర్తిగా లోడవలేదు. +web_fonts_disabled=వెబ్ ఫాంట్లు అచేతనించబడెను: ఎంబెడెడ్ PDF ఫాంట్లు ఉపయోగించలేక పోయింది. +document_colors_not_allowed=PDF పత్రాలు వాటి స్వంత రంగులను ఉపయోగించుకొనుటకు అనుమతించబడవు: విహరణి నందు “పేజీలను వాటి స్వంత రంగులను ఎంచుకొనుటకు అనుమతించు” అచేతనం చేయబడివుంది. diff --git a/src/cps/static/locale/th/viewer.properties b/src/cps/static/locale/th/viewer.properties new file mode 100644 index 0000000..ccfec59 --- /dev/null +++ b/src/cps/static/locale/th/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=หน้าก่อนหน้า +previous_label=ก่อนหน้า +next.title=หน้าถัดไป +next_label=ถัดไป + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=หน้า +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=จาก {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} จาก {{pagesCount}}) + +zoom_out.title=ซูมออก +zoom_out_label=ซูมออก +zoom_in.title=ซูมเข้า +zoom_in_label=ซูมเข้า +zoom.title=ซูม +presentation_mode.title=สลับเป็นโหมดการนำเสนอ +presentation_mode_label=โหมดการนำเสนอ +open_file.title=เปิดไฟล์ +open_file_label=เปิด +print.title=พิมพ์ +print_label=พิมพ์ +download.title=ดาวน์โหลด +download_label=ดาวน์โหลด +bookmark.title=มุมมองปัจจุบัน (คัดลอกหรือเปิดในหน้าต่างใหม่) +bookmark_label=มุมมองปัจจุบัน + +# Secondary toolbar and context menu +tools.title=เครื่องมือ +tools_label=เครื่องมือ +first_page.title=ไปยังหน้าแรก +first_page.label=ไปยังหน้าแรก +first_page_label=ไปยังหน้าแรก +last_page.title=ไปยังหน้าสุดท้าย +last_page.label=ไปยังหน้าสุดท้าย +last_page_label=ไปยังหน้าสุดท้าย +page_rotate_cw.title=หมุนตามเข็มนาฬิกา +page_rotate_cw.label=หมุนตามเข็มนาฬิกา +page_rotate_cw_label=หมุนตามเข็มนาฬิกา +page_rotate_ccw.title=หมุนทวนเข็มนาฬิกา +page_rotate_ccw.label=หมุนทวนเข็มนาฬิกา +page_rotate_ccw_label=หมุนทวนเข็มนาฬิกา + +hand_tool_enable.title=เปิดใช้งานเครื่องมือรูปมือ +hand_tool_enable_label=เปิดใช้งานเครื่องมือรูปมือ +hand_tool_disable.title=ปิดใช้งานเครื่องมือรูปมือ +hand_tool_disable_label=ปิดใช้งานเครื่องมือรูปมือ + +# Document properties dialog box +document_properties.title=คุณสมบัติเอกสาร… +document_properties_label=คุณสมบัติเอกสาร… +document_properties_file_name=ชื่อไฟล์: +document_properties_file_size=ขนาดไฟล์: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} กิโลไบต์ ({{size_b}} ไบต์) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} เมกะไบต์ ({{size_b}} ไบต์) +document_properties_title=หัวข้อ: +document_properties_author=ผู้สร้าง: +document_properties_subject=ชื่อเรื่อง: +document_properties_keywords=คำสำคัญ: +document_properties_creation_date=วันที่สร้าง: +document_properties_modification_date=วันที่แก้ไข: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=ผู้สร้าง: +document_properties_producer=ผู้ผลิต PDF: +document_properties_version=รุ่น PDF: +document_properties_page_count=จำนวนหน้า: +document_properties_close=ปิด + +print_progress_message=กำลังเตรียมเอกสารสำหรับการพิมพ์… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=ยกเลิก + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=เปิด/ปิดแถบข้าง +toggle_sidebar_label=เปิด/ปิดแถบข้าง +document_outline.title=แสดงเค้าร่างเอกสาร (คลิกสองครั้งเพื่อขยาย/ยุบรายการทั้งหมด) +document_outline_label=เค้าร่างเอกสาร +attachments.title=แสดงไฟล์แนบ +attachments_label=ไฟล์แนบ +thumbs.title=แสดงภาพขนาดย่อ +thumbs_label=ภาพขนาดย่อ +findbar.title=ค้นหาในเอกสาร +findbar_label=ค้นหา + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=หน้า {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=ภาพขนาดย่อของหน้า {{page}} + +# Find panel button title and messages +find_label=ค้นหา: +find_previous.title=หาตำแหน่งก่อนหน้าของวลี +find_previous_label=ก่อนหน้า +find_next.title=หาตำแหน่งถัดไปของวลี +find_next_label=ถัดไป +find_highlight=เน้นสีทั้งหมด +find_match_case_label=ตัวพิมพ์ใหญ่เล็กตรงกัน +find_reached_top=ค้นหาถึงจุดเริ่มต้นของหน้า เริ่มค้นต่อจากด้านล่าง +find_reached_bottom=ค้นหาถึงจุดสิ้นสุดหน้า เริ่มค้นต่อจากด้านบน +find_not_found=ไม่พบวลี + +# Error panel labels +error_more_info=ข้อมูลเพิ่มเติม +error_less_info=ข้อมูลน้อยลง +error_close=ปิด +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=ข้อความ: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=สแต็ก: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=ไฟล์: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=บรรทัด: {{line}} +rendering_error=เกิดข้อผิดพลาดขณะกำลังเรนเดอร์หน้า + +# Predefined zoom values +page_scale_width=ความกว้างหน้า +page_scale_fit=พอดีหน้า +page_scale_auto=ซูมอัตโนมัติ +page_scale_actual=ขนาดจริง +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=ข้อผิดพลาด +loading_error=เกิดข้อผิดพลาดขณะกำลังโหลด PDF +invalid_file_error=ไฟล์ PDF ไม่ถูกต้องหรือเสียหาย +missing_file_error=ไฟล์ PDF ขาดหาย +unexpected_response_error=การตอบสนองของเซิร์ฟเวอร์ที่ไม่คาดคิด + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[คำอธิบายประกอบ {{type}}] +password_label=ป้อนรหัสผ่านเพื่อเปิดไฟล์ PDF นี้ +password_invalid=รหัสผ่านไม่ถูกต้อง โปรดลองอีกครั้ง +password_ok=ตกลง +password_cancel=ยกเลิก + +printing_not_supported=คำเตือน: เบราว์เซอร์นี้ไม่ได้สนับสนุนการพิมพ์อย่างเต็มที่ +printing_not_ready=คำเตือน: PDF ไม่ได้รับการโหลดอย่างเต็มที่สำหรับการพิมพ์ +web_fonts_disabled=แบบอักษรเว็บถูกปิดการใช้งาน: ไม่สามารถใช้แบบอักษรฝังตัวใน PDF +document_colors_not_allowed=เอกสาร PDF ไม่ได้รับอนุญาตให้ใช้สีของตัวเอง: "อนุญาตให้หน้าเอกสารสามารถเลือกสีของตัวเอง" ถูกปิดใช้งานในเบราว์เซอร์ diff --git a/src/cps/static/locale/tl/viewer.properties b/src/cps/static/locale/tl/viewer.properties new file mode 100644 index 0000000..6385687 --- /dev/null +++ b/src/cps/static/locale/tl/viewer.properties @@ -0,0 +1,95 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Naunang Pahina +next.title=Sunod na Pahina + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +open_file.title=Magbukas ng file +open_file_label=Buksan +bookmark.title=Kasalukuyang tingin (kopyahin o buksan sa bagong window) +bookmark_label=Kasalukuyang tingin + +# Secondary toolbar and context menu +tools.title=Mga Tool +tools_label=Mga Tool + + +# Document properties dialog box +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_title=Pamagat: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +thumbs.title=Ipakita ang mga Thumbnails +findbar_label=Hanapin + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Pahina {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Thumbnail ng Pahina {{page}} + +# Find panel button title and messages +find_highlight=I-highlight lahat + +# Error panel labels +error_more_info=Maraming Inpormasyon +error_less_info=Maikling Inpormasyon +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Mensahe: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Linya: {{line}} +rendering_error=May naganap na pagkakamali habang pagsasalin sa pahina. + +# Predefined zoom values +page_scale_width=Haba ng Pahina +page_scale_fit=ang pahina ay angkop +page_scale_auto=awtomatikong pag-imbulog +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error=May maling nangyari habang kinakarga ang PDF. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +password_ok=OK + diff --git a/src/cps/static/locale/tn/viewer.properties b/src/cps/static/locale/tn/viewer.properties new file mode 100644 index 0000000..6ce5eb4 --- /dev/null +++ b/src/cps/static/locale/tn/viewer.properties @@ -0,0 +1,86 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom.title=Zuma/gogela +open_file.title=Bula Faele +open_file_label=Bula + +# Secondary toolbar and context menu + +hand_tool_disable.title=Thibela go dira ga sediriswa sa seatla +hand_tool_disable_label=Thibela go dira ga sediriswa sa seatla + +# Document properties dialog box +document_properties_file_name=Leina la faele: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_title=Leina: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +findbar_label=Batla + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. + +# Find panel button title and messages +find_previous.title=Batla tiragalo e e fetileng ya setlhopha sa mafoko +find_next.title=Batla tiragalo e e latelang ya setlhopha sa mafoko +find_not_found=Setlhopha sa mafoko ga se a bonwa + +# Error panel labels +error_more_info=Tshedimosetso e Nngwe +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number + +# Predefined zoom values +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=Phoso + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +password_ok=Siame + +web_fonts_disabled=Mefutatlhaka ya Webo ga e dire: ga e kgone go dirisa mofutatlhaka wa PDF o tsentsweng. diff --git a/src/cps/static/locale/tr/viewer.properties b/src/cps/static/locale/tr/viewer.properties new file mode 100644 index 0000000..54fc348 --- /dev/null +++ b/src/cps/static/locale/tr/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Önceki sayfa +previous_label=Önceki +next.title=Sonraki sayfa +next_label=Sonraki + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Sayfa +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} / {{pagesCount}}) + +zoom_out.title=Uzaklaș +zoom_out_label=Uzaklaș +zoom_in.title=Yaklaş +zoom_in_label=Yaklaş +zoom.title=Yakınlaştırma +presentation_mode.title=Sunum moduna geç +presentation_mode_label=Sunum Modu +open_file.title=Dosya aç +open_file_label=Aç +print.title=Yazdır +print_label=Yazdır +download.title=İndir +download_label=İndir +bookmark.title=Geçerli görünüm (kopyala veya yeni pencerede aç) +bookmark_label=Geçerli görünüm + +# Secondary toolbar and context menu +tools.title=Araçlar +tools_label=Araçlar +first_page.title=İlk sayfaya git +first_page.label=İlk sayfaya git +first_page_label=İlk sayfaya git +last_page.title=Son sayfaya git +last_page.label=Son sayfaya git +last_page_label=Son sayfaya git +page_rotate_cw.title=Saat yönünde döndür +page_rotate_cw.label=Saat yönünde döndür +page_rotate_cw_label=Saat yönünde döndür +page_rotate_ccw.title=Saat yönünün tersine döndür +page_rotate_ccw.label=Saat yönünün tersine döndür +page_rotate_ccw_label=Saat yönünün tersine döndür + +hand_tool_enable.title=El aracını etkinleştir +hand_tool_enable_label=El aracını etkinleştir +hand_tool_disable.title=El aracını kapat +hand_tool_disable_label=El aracını kapat + +# Document properties dialog box +document_properties.title=Belge özellikleri… +document_properties_label=Belge özellikleri… +document_properties_file_name=Dosya adı: +document_properties_file_size=Dosya boyutu: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bayt) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bayt) +document_properties_title=Başlık: +document_properties_author=Yazar: +document_properties_subject=Konu: +document_properties_keywords=Anahtar kelimeler: +document_properties_creation_date=Oluturma tarihi: +document_properties_modification_date=Değiştirme tarihi: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}} {{time}} +document_properties_creator=Oluşturan: +document_properties_producer=PDF üreticisi: +document_properties_version=PDF sürümü: +document_properties_page_count=Sayfa sayısı: +document_properties_close=Kapat + +print_progress_message=Belge yazdırılmaya hazırlanıyor… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent=%{{progress}} +print_progress_close=İptal + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Kenar çubuğunu aç/kapat +toggle_sidebar_label=Kenar çubuğunu aç/kapat +document_outline.title=Belge şemasını göster (Tüm öğeleri genişletmek/daraltmak için çift tıklayın) +document_outline_label=Belge şeması +attachments.title=Ekleri göster +attachments_label=Ekler +thumbs.title=Küçük resimleri göster +thumbs_label=Küçük resimler +findbar.title=Belgede bul +findbar_label=Bul + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Sayfa {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas={{page}}. sayfanın küçük hâli + +# Find panel button title and messages +find_label=Bul: +find_previous.title=Önceki eşleşmeyi bul +find_previous_label=Önceki +find_next.title=Sonraki eşleşmeyi bul +find_next_label=Sonraki +find_highlight=Tümünü vurgula +find_match_case_label=Büyük-küçük harf eşleştir +find_reached_top=Belgenin başına ulaşıldı, sonundan devam edildi +find_reached_bottom=Belgenin sonuna ulaşıldı, başından devam edildi +find_not_found=Eşleşme bulunamadı + +# Error panel labels +error_more_info=Daha fazla bilgi al +error_less_info=Daha az bilgi +error_close=Kapat +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js sürüm {{version}} (yapı: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=İleti: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Yığın: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Dosya: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Satır: {{line}} +rendering_error=Sayfa yorumlanırken bir hata oluştu. + +# Predefined zoom values +page_scale_width=Sayfa genişliği +page_scale_fit=Sayfayı sığdır +page_scale_auto=Otomatik yakınlaştır +page_scale_actual=Gerçek boyut +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent=%{{scale}} + +# Loading indicator messages +loading_error_indicator=Hata +loading_error=PDF yüklenirken bir hata oluştu. +invalid_file_error=Geçersiz veya bozulmuş PDF dosyası. +missing_file_error=PDF dosyası eksik. +unexpected_response_error=Beklenmeyen sunucu yanıtı. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} işareti] +password_label=Bu PDF dosyasını açmak için parolasını yazın. +password_invalid=Geçersiz parola. Lütfen tekrar deneyin. +password_ok=Tamam +password_cancel=İptal + +printing_not_supported=Uyarı: Yazdırma bu tarayıcı tarafından tam olarak desteklenmemektedir. +printing_not_ready=Uyarı: PDF tamamen yüklenmedi ve yazdırmaya hazır değil. +web_fonts_disabled=Web fontları devre dışı: Gömülü PDF fontları kullanılamıyor. +document_colors_not_allowed=PDF belgelerinin kendi renklerini kullanması için izin verilmiyor: “Sayfalara kendi renklerini seçmesi için izin ver” tarayıcıda etkinleştirilmemiş. diff --git a/src/cps/static/locale/uk/viewer.properties b/src/cps/static/locale/uk/viewer.properties new file mode 100644 index 0000000..f8b7990 --- /dev/null +++ b/src/cps/static/locale/uk/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Попередня сторінка +previous_label=Попередня +next.title=Наступна сторінка +next_label=Наступна + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Сторінка +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=із {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} із {{pagesCount}}) + +zoom_out.title=Зменшити +zoom_out_label=Зменшити +zoom_in.title=Збільшити +zoom_in_label=Збільшити +zoom.title=Масштаб +presentation_mode.title=Перейти в режим презентації +presentation_mode_label=Режим презентації +open_file.title=Відкрити файл +open_file_label=Відкрити +print.title=Друк +print_label=Друк +download.title=Завантажити +download_label=Завантажити +bookmark.title=Поточний вигляд (копіювати чи відкрити у новому вікні) +bookmark_label=Поточний вигляд + +# Secondary toolbar and context menu +tools.title=Інструменти +tools_label=Інструменти +first_page.title=На першу сторінку +first_page.label=На першу сторінку +first_page_label=На першу сторінку +last_page.title=На останню сторінку +last_page.label=На останню сторінку +last_page_label=На останню сторінку +page_rotate_cw.title=Повернути за годинниковою стрілкою +page_rotate_cw.label=Повернути за годинниковою стрілкою +page_rotate_cw_label=Повернути за годинниковою стрілкою +page_rotate_ccw.title=Повернути проти годинникової стрілки +page_rotate_ccw.label=Повернути проти годинникової стрілки +page_rotate_ccw_label=Повернути проти годинникової стрілки + +hand_tool_enable.title=Увімкнути інструмент «Рука» +hand_tool_enable_label=Увімкнути інструмент «Рука» +hand_tool_disable.title=Вимкнути інструмент «Рука» +hand_tool_disable_label=Вимкнути інструмент «Рука» + +# Document properties dialog box +document_properties.title=Властивості документа… +document_properties_label=Властивості документа… +document_properties_file_name=Назва файла: +document_properties_file_size=Розмір файла: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} КБ ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} МБ ({{size_b}} bytes) +document_properties_title=Заголовок: +document_properties_author=Автор: +document_properties_subject=Тема: +document_properties_keywords=Ключові слова: +document_properties_creation_date=Дата створення: +document_properties_modification_date=Дата зміни: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Створено: +document_properties_producer=Виробник PDF: +document_properties_version=Версія PDF: +document_properties_page_count=Кількість сторінок: +document_properties_close=Закрити + +print_progress_message=Підготовка документу до друку… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=Скасувати + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Бічна панель +toggle_sidebar_label=Перемкнути бічну панель +document_outline.title=Показати схему документу (подвійний клік для розгортання/згортання елементів) +document_outline_label=Схема документа +attachments.title=Показати прикріплення +attachments_label=Прикріплення +thumbs.title=Показувати ескізи +thumbs_label=Ескізи +findbar.title=Шукати в документі +findbar_label=Пошук + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Сторінка {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Ескіз сторінки {{page}} + +# Find panel button title and messages +find_label=Знайти: +find_previous.title=Знайти попереднє входження фрази +find_previous_label=Попереднє +find_next.title=Знайти наступне входження фрази +find_next_label=Наступне +find_highlight=Підсвітити все +find_match_case_label=З урахуванням регістру +find_reached_top=Досягнуто початку документу, продовжено з кінця +find_reached_bottom=Досягнуто кінця документу, продовжено з початку +find_not_found=Фразу не знайдено + +# Error panel labels +error_more_info=Більше інформації +error_less_info=Менше інформації +error_close=Закрити +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Повідомлення: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Стек: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Файл: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Рядок: {{line}} +rendering_error=Під час виведення сторінки сталася помилка. + +# Predefined zoom values +page_scale_width=За шириною +page_scale_fit=Умістити +page_scale_auto=Авто-масштаб +page_scale_actual=Дійсний розмір +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Помилка +loading_error=Під час завантаження PDF сталася помилка. +invalid_file_error=Недійсний або пошкоджений PDF-файл. +missing_file_error=Відсутній PDF-файл. +unexpected_response_error=Неочікувана відповідь сервера. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}}-аннотація] +password_label=Введіть пароль для відкриття цього PDF-файла. +password_invalid=Невірний пароль. Спробуйте ще. +password_ok=Гаразд +password_cancel=Скасувати + +printing_not_supported=Попередження: Цей браузер не повністю підтримує друк. +printing_not_ready=Попередження: PDF не повністю завантажений для друку. +web_fonts_disabled=Веб-шрифти вимкнено: неможливо використати вбудовані у PDF шрифти. +document_colors_not_allowed=PDF-документам не дозволено використовувати власні кольори: в браузері вимкнено параметр «Дозволити сторінкам використовувати власні кольори». diff --git a/src/cps/static/locale/ur/viewer.properties b/src/cps/static/locale/ur/viewer.properties new file mode 100644 index 0000000..e9c3802 --- /dev/null +++ b/src/cps/static/locale/ur/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=پچھلا صفحہ +previous_label=پچھلا +next.title=اگلا صفحہ +next_label=آگے + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=صفحہ +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages={{pagesCount}} کا +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} کا {{pagesCount}}) + +zoom_out.title=باہر زوم کریں +zoom_out_label=باہر زوم کریں +zoom_in.title=اندر زوم کریں +zoom_in_label=اندر زوم کریں +zoom.title=زوم +presentation_mode.title=پیشکش موڈ میں چلے جائیں +presentation_mode_label=پیشکش موڈ +open_file.title=مسل کھولیں +open_file_label=کھولیں +print.title=چھاپیں +print_label=چھاپیں +download.title=ڈاؤن لوڈ +download_label=ڈاؤن لوڈ +bookmark.title=حالیہ نظارہ (نۓ دریچہ میں نقل کریں یا کھولیں) +bookmark_label=حالیہ نظارہ + +# Secondary toolbar and context menu +tools.title=آلات +tools_label=آلات +first_page.title=پہلے صفحہ پر جائیں +first_page.label=پہلے صفحہ پر جائیں +first_page_label=پہلے صفحہ پر جائیں +last_page.title=آخری صفحہ پر جائیں +last_page.label=آخری صفحہ پر جائیں +last_page_label=آخری صفحہ پر جائیں +page_rotate_cw.title=گھڑی وار گھمائیں +page_rotate_cw.label=گھڑی وار گھمائیں +page_rotate_cw_label=گھڑی وار گھمائیں +page_rotate_ccw.title=ضد گھڑی وار گھمائیں +page_rotate_ccw.label=ضد گھڑی وار گھمائیں +page_rotate_ccw_label=ضد گھڑی وار گھمائیں + +hand_tool_enable.title=ہاتھ ٹول اہل بنائیں +hand_tool_enable_label=ہاتھ ٹول اہل بنائیں +hand_tool_disable.title=ہاتھ ٹول nنااہل بنائیں\u0020 +hand_tool_disable_label=ہاتھ ٹول نااہل بنائیں + +# Document properties dialog box +document_properties.title=دستاویز خواص… +document_properties_label=دستاویز خواص…\u0020 +document_properties_file_name=نام مسل: +document_properties_file_size=مسل سائز: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} bytes) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} bytes) +document_properties_title=عنوان: +document_properties_author=تخلیق کار: +document_properties_subject=موضوع: +document_properties_keywords=کلیدی الفاظ: +document_properties_creation_date=تخلیق کی تاریخ: +document_properties_modification_date=ترمیم کی تاریخ: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}، {{time}} +document_properties_creator=تخلیق کار: +document_properties_producer=PDF پیدا کار: +document_properties_version=PDF ورژن: +document_properties_page_count=صفحہ شمار: +document_properties_close=بند کریں + +print_progress_message=چھاپنے کرنے کے لیے دستاویز تیار کیے جا رھے ھیں +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent=*{{progress}}%* +print_progress_close=منسوخ کریں + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=سلائیڈ ٹوگل کریں +toggle_sidebar_label=سلائیڈ ٹوگل کریں +document_outline.title=دستاویز کی سرخیاں دکھایں (تمام اشیاء وسیع / غائب کرنے کے لیے ڈبل کلک کریں) +document_outline_label=دستاویز آؤٹ لائن +attachments.title=منسلکات دکھائیں +attachments_label=منسلکات +thumbs.title=تھمبنیل دکھائیں +thumbs_label=مجمل +findbar.title=دستاویز میں ڈھونڈیں +findbar_label=ڈھونڈیں + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=صفحہ {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=صفحے کا مجمل {{page}} + +# Find panel button title and messages +find_label=ڈھونڈیں: +find_previous.title=فقرے کا پچھلا وقوع ڈھونڈیں +find_previous_label=پچھلا +find_next.title=فقرے کا اگلہ وقوع ڈھونڈیں +find_next_label=آگے +find_highlight=تمام نمایاں کریں +find_match_case_label=حروف مشابہ کریں +find_reached_top=صفحہ کے شروع پر پہنچ گیا، نیچے سے جاری کیا +find_reached_bottom=صفحہ کے اختتام پر پہنچ گیا، اوپر سے جاری کیا +find_not_found=فقرا نہیں ملا + +# Error panel labels +error_more_info=مزید معلومات +error_less_info=کم معلومات +error_close=بند کریں +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=پیغام: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=سٹیک: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=مسل: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=لائن: {{line}} +rendering_error=صفحہ بناتے ہوئے نقص آ گیا۔ + +# Predefined zoom values +page_scale_width=صفحہ چوڑائی +page_scale_fit=صفحہ فٹنگ +page_scale_auto=خودکار زوم +page_scale_actual=اصل سائز +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=نقص +loading_error=PDF لوڈ کرتے وقت نقص آ گیا۔ +invalid_file_error=ناجائز یا خراب PDF مسل +missing_file_error=PDF مسل غائب ہے۔ +unexpected_response_error=غیرمتوقع پیش کار جواب + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} نوٹ] +password_label=PDF مسل کھولنے کے لیے پاس ورڈ داخل کریں. +password_invalid=ناجائز پاس ورڈ. براےؑ کرم دوبارہ کوشش کریں. +password_ok=سہی +password_cancel=منسوخ کریں + +printing_not_supported=تنبیہ:چھاپنا اس براؤزر پر پوری طرح معاونت شدہ نہیں ہے۔ +printing_not_ready=تنبیہ: PDF چھپائی کے لیے پوری طرح لوڈ نہیں ہوئی۔ +web_fonts_disabled=ویب فانٹ نا اہل ہیں: شامل PDF فانٹ استعمال کرنے میں ناکام۔ +document_colors_not_allowed=PDF دستاویزات کو اپنے رنگ استعمال کرنے کی اجازت نہیں: 'صفحات کو اپنے رنگ چنیں' کی اِجازت براؤزر میں بے عمل ہے۔ diff --git a/src/cps/static/locale/vi/viewer.properties b/src/cps/static/locale/vi/viewer.properties new file mode 100644 index 0000000..1c307c1 --- /dev/null +++ b/src/cps/static/locale/vi/viewer.properties @@ -0,0 +1,174 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Trang Trước +previous_label=Trước +next.title=Trang Sau +next_label=Tiếp + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Thu nhỏ +zoom_out_label=Thu nhỏ +zoom_in.title=Phóng to +zoom_in_label=Phóng to +zoom.title=Chỉnh kích thước +presentation_mode.title=Chuyển sang chế độ trình chiếu +presentation_mode_label=Chế độ trình chiếu +open_file.title=Mở tập tin +open_file_label=Mở tập tin +print.title=In +print_label=In +download.title=Tải xuống +download_label=Tải xuống +bookmark.title=Góc nhìn hiện tại (copy hoặc mở trong cửa sổ mới) +bookmark_label=Chế độ xem hiện tại + +# Secondary toolbar and context menu +tools.title=Công cụ +tools_label=Công cụ +first_page.title=Về trang đầu +first_page.label=Về trang đầu +first_page_label=Về trang đầu +last_page.title=Đến trang cuối +last_page.label=Đến trang cuối +last_page_label=Đến trang cuối +page_rotate_cw.title=Xoay theo chiều kim đồng hồ +page_rotate_cw.label=Xoay theo chiều kim đồng hồ +page_rotate_cw_label=Xoay theo chiều kim đồng hồ +page_rotate_ccw.title=Xoay ngược chiều kim đồng hồ +page_rotate_ccw.label=Xoay ngược chiều kim đồng hồ +page_rotate_ccw_label=Xoay ngược chiều kim đồng hồ + +hand_tool_enable.title=Cho phép kéo để cuộn trang +hand_tool_enable_label=Cho phép kéo để cuộn trang +hand_tool_disable.title=Tắt kéo để cuộn trang +hand_tool_disable_label=Tắt kéo để cuộn trang + +# Document properties dialog box +document_properties.title=Thuộc tính của tài liệu… +document_properties_label=Thuộc tính của tài liệu… +document_properties_file_name=Tên tập tin: +document_properties_file_size=Kích thước: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} byte) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} byte) +document_properties_title=Tiêu đề: +document_properties_author=Tác giả: +document_properties_subject=Chủ đề: +document_properties_keywords=Từ khóa: +document_properties_creation_date=Ngày tạo: +document_properties_modification_date=Ngày sửa đổi: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Người tạo: +document_properties_producer=Phần mềm tạo PDF: +document_properties_version=Phiên bản PDF: +document_properties_page_count=Tổng số trang: +document_properties_close=Ðóng + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Bật/Tắt thanh lề +toggle_sidebar_label=Bật/Tắt thanh lề +document_outline_label=Bản phác tài liệu +attachments.title=Hiện nội dung đính kèm +attachments_label=Nội dung đính kèm +thumbs.title=Hiển thị ảnh thu nhỏ +thumbs_label=Ảnh thu nhỏ +findbar.title=Tìm trong tài liệu +findbar_label=Tìm + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Trang {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Ảnh thu nhỏ của trang {{page}} + +# Find panel button title and messages +find_label=Tìm: +find_previous.title=Tìm cụm từ ở phần trước +find_previous_label=Trước +find_next.title=Tìm cụm từ ở phần sau +find_next_label=Tiếp +find_highlight=Tô sáng tất cả +find_match_case_label=Phân biệt hoa, thường +find_reached_top=Đã đến phần đầu tài liệu, quay trở lại từ cuối +find_reached_bottom=Đã đến phần cuối của tài liệu, quay trở lại từ đầu +find_not_found=Không tìm thấy cụm từ này + +# Error panel labels +error_more_info=Thông tin thêm +error_less_info=Hiển thị ít thông tin hơn +error_close=Đóng +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Thông điệp: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Stack: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Tập tin: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Dòng: {{line}} +rendering_error=Lỗi khi hiển thị trang. + +# Predefined zoom values +page_scale_width=Vừa chiều rộng +page_scale_fit=Vừa chiều cao +page_scale_auto=Tự động chọn kích thước +page_scale_actual=Kích thước thực +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Lỗi +loading_error=Lỗi khi tải tài liệu PDF. +invalid_file_error=Tập tin PDF hỏng hoặc không hợp lệ. +missing_file_error=Thiếu tập tin PDF. +unexpected_response_error=Máy chủ có phản hồi lạ. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Chú thích] +password_label=Nhập mật khẩu để mở tập tin PDF này. +password_invalid=Mật khẩu không đúng. Vui lòng thử lại. +password_ok=OK + +printing_not_supported=Cảnh báo: In ấn không được hỗ trợ đầy đủ ở trình duyệt này. +printing_not_ready=Cảnh báo: PDF chưa được tải hết để in. +web_fonts_disabled=Phông chữ Web bị vô hiệu hóa: không thể sử dụng các phông chữ PDF được nhúng. +document_colors_not_allowed=Tài liệu PDF không được cho phép dùng màu riêng: 'Cho phép trang chọn màu riêng' đã bị tắt trên trình duyệt. diff --git a/src/cps/static/locale/wo/viewer.properties b/src/cps/static/locale/wo/viewer.properties new file mode 100644 index 0000000..ee79d82 --- /dev/null +++ b/src/cps/static/locale/wo/viewer.properties @@ -0,0 +1,125 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Xët wi jiitu +previous_label=Bi jiitu +next.title=Xët wi ci topp +next_label=Bi ci topp + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Wàññi +zoom_out_label=Wàññi +zoom_in.title=Yaatal +zoom_in_label=Yaatal +zoom.title=Yambalaŋ +presentation_mode.title=Wañarñil ci anamu wone +presentation_mode_label=Anamu Wone +open_file.title=Ubbi benn dencukaay +open_file_label=Ubbi +print.title=Móol +print_label=Móol +download.title=Yeb yi +download_label=Yeb yi +bookmark.title=Wone bi taxaw (duppi walla ubbi palanteer bu bees) +bookmark_label=Wone bi feeñ + +# Secondary toolbar and context menu + + +# Document properties dialog box +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_title=Bopp: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +thumbs.title=Wone nataal yu ndaw yi +thumbs_label=Nataal yu ndaw yi +findbar.title=Gis ci biir jukki bi +findbar_label=Wut + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Xët {{xët}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Wiñet bu xët{{xët}} + +# Find panel button title and messages +find_label=Wut: +find_previous.title=Seet beneen kaddu bu ni mel te jiitu +find_previous_label=Bi jiitu +find_next.title=Seet beneen kaddu bu ni mel +find_next_label=Bi ci topp +find_highlight=Melaxal lépp +find_match_case_label=Sàmm jëmmalin wi +find_reached_top=Jot nañu ndorteel xët wi, kontine dale ko ci suuf +find_reached_bottom=Jot nañu jeexitalu xët wi, kontine ci ndorte +find_not_found=Gisiñu kaddu gi + +# Error panel labels +error_more_info=Xibaar yu gën bari +error_less_info=Xibaar yu gën bari +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Bataaxal: {{bataaxal}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Juug: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Dencukaay: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Rëdd : {{line}} +rendering_error=Am njumte bu am bi xët bi di wonewu. + +# Predefined zoom values +page_scale_width=Yaatuwaay bu mët +page_scale_fit=Xët lëmm +page_scale_auto=Yambalaŋ ci saa si +page_scale_actual=Dayo bi am +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=Njumte +loading_error=Am na njumte ci yebum dencukaay PDF bi. +invalid_file_error=Dencukaay PDF bi baaxul walla mu sankar. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Karmat {{type}}] +password_ok=OK +password_cancel=Neenal + +printing_not_supported=Artu: Joowkat bii nanguwul lool mool. diff --git a/src/cps/static/locale/xh/viewer.properties b/src/cps/static/locale/xh/viewer.properties new file mode 100644 index 0000000..29568be --- /dev/null +++ b/src/cps/static/locale/xh/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Iphepha langaphambili +previous_label=Okwangaphambili +next.title=Iphepha elilandelayo +next_label=Okulandelayo + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=Iphepha +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=kwali- {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} kwali {{pagesCount}}) + +zoom_out.title=Bhekelisela Kudana +zoom_out_label=Bhekelisela Kudana +zoom_in.title=Sondeza Kufuphi +zoom_in_label=Sondeza Kufuphi +zoom.title=Yandisa / Nciphisa +presentation_mode.title=Tshintshela kwimo yonikezelo +presentation_mode_label=Imo yonikezelo +open_file.title=Vula Ifayile +open_file_label=Vula +print.title=Printa +print_label=Printa +download.title=Khuphela +download_label=Khuphela +bookmark.title=Imbonakalo ekhoyo (kopa okanye vula kwifestile entsha) +bookmark_label=Imbonakalo ekhoyo + +# Secondary toolbar and context menu +tools.title=Izixhobo zemiyalelo +tools_label=Izixhobo zemiyalelo +first_page.title=Yiya kwiphepha lokuqala +first_page.label=Yiya kwiphepha lokuqala +first_page_label=Yiya kwiphepha lokuqala +last_page.title=Yiya kwiphepha lokugqibela +last_page.label=Yiya kwiphepha lokugqibela +last_page_label=Yiya kwiphepha lokugqibela +page_rotate_cw.title=Jikelisa ngasekunene +page_rotate_cw.label=Jikelisa ngasekunene +page_rotate_cw_label=Jikelisa ngasekunene +page_rotate_ccw.title=Jikelisa ngasekhohlo +page_rotate_ccw.label=Jikelisa ngasekhohlo +page_rotate_ccw_label=Jikelisa ngasekhohlo + +hand_tool_enable.title=Yenza isixhobo sesandla sisebenze +hand_tool_enable_label=Yenza isixhobo sesandla sisebenze +hand_tool_disable.title=Yenza isixhobo sesandla singasebenzi +hand_tool_disable_label=Yenza isixhobo sesandla singasebenzi + +# Document properties dialog box +document_properties.title=Iipropati zoxwebhu… +document_properties_label=Iipropati zoxwebhu… +document_properties_file_name=Igama lefayile: +document_properties_file_size=Isayizi yefayile: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB (iibhayiti{{size_b}}) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB (iibhayithi{{size_b}}) +document_properties_title=Umxholo: +document_properties_author=Umbhali: +document_properties_subject=Umbandela: +document_properties_keywords=Amagama aphambili: +document_properties_creation_date=Umhla wokwenziwa kwayo: +document_properties_modification_date=Umhla wokulungiswa kwayo: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=Umntu oyenzileyo: +document_properties_producer=Umvelisi we-PDF: +document_properties_version=Uhlelo lwe-PDF: +document_properties_page_count=Inani lamaphepha: +document_properties_close=Vala + +print_progress_message=Ilungisa uxwebhu ukuze iprinte… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{inkqubela}}% +print_progress_close=Rhoxisa + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=Togola ngebha eseCaleni +toggle_sidebar_label=Togola ngebha eseCaleni +document_outline.title=Bonisa uLwandlalo loXwebhu (cofa kabini ukuze wandise/diliza zonke izinto) +document_outline_label=Isishwankathelo soxwebhu +attachments.title=Bonisa iziqhotyoshelwa +attachments_label=Iziqhoboshelo +thumbs.title=Bonisa ukrobiso kumfanekiso +thumbs_label=Ukrobiso kumfanekiso +findbar.title=Fumana kuXwebhu +findbar_label=Fumana + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Iphepha {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Ukrobiso kumfanekiso wephepha {{page}} + +# Find panel button title and messages +find_label=Fumanisa: +find_previous.title=Fumanisa isenzeko sangaphambili sebinzana lamagama +find_previous_label=Okwangaphambili +find_next.title=Fumanisa isenzeko esilandelayo sebinzana lamagama +find_next_label=Okulandelayo +find_highlight=Qaqambisa konke +find_match_case_label=Tshatisa ngobukhulu bukanobumba +find_reached_top=Ufike ngaphezulu ephepheni, kusukwa ngezantsi +find_reached_bottom=Ufike ekupheleni kwephepha, kusukwa ngaphezulu +find_not_found=Ibinzana alifunyenwanga + +# Error panel labels +error_more_info=Inkcazelo Engakumbi +error_less_info=Inkcazelo Encinane +error_close=Vala +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=I-PDF.js v{{version}} (yakha: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Umyalezo: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Imfumba: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Ifayile: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Umgca: {{line}} +rendering_error=Imposiso yenzekile xa bekunikezelwa iphepha. + +# Predefined zoom values +page_scale_width=Ububanzi bephepha +page_scale_fit=Ukulinganiswa kwephepha +page_scale_auto=Ukwandisa/Ukunciphisa Ngokwayo +page_scale_actual=Ubungakanani bokwenene +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=Imposiso +loading_error=Imposiso yenzekile xa kulayishwa i-PDF. +invalid_file_error=Ifayile ye-PDF engeyiyo okanye eyonakalisiweyo. +missing_file_error=Ifayile ye-PDF edukileyo. +unexpected_response_error=Impendulo yeseva engalindelekanga. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} Ubhalo-nqaku] +password_label=Faka ipasiwedi ukuze uvule le fayile yePDF. +password_invalid=Ipasiwedi ayisebenzi. Nceda uzame kwakhona. +password_ok=KULUNGILE +password_cancel=Rhoxisa + +printing_not_supported=Isilumkiso: Ukuprinta akuxhaswa ngokupheleleyo yile bhrawuza. +printing_not_ready=Isilumkiso: IPDF ayihlohlwanga ngokupheleleyo ukwenzela ukuprinta. +web_fonts_disabled=Iifonti zewebhu ziqhwalelisiwe: ayikwazi ukusebenzisa iifonti ze-PDF ezincanyathelisiweyo. +document_colors_not_allowed=Amaxwebhu ePDF akavumelekanga ukuba asebenzise imibala yawo: 'Ukuvumela amaphepha ukuba asebenzise eyawo imibala' kuvaliwe ukuba kungasebenzi kwibhrawuza. diff --git a/src/cps/static/locale/zh-CN/viewer.properties b/src/cps/static/locale/zh-CN/viewer.properties new file mode 100644 index 0000000..cab3094 --- /dev/null +++ b/src/cps/static/locale/zh-CN/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=上一页 +previous_label=上一页 +next.title=下一页 +next_label=下一页 + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=页面 +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=/ {{pagesCount}} +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=({{pageNumber}} / {{pagesCount}}) + +zoom_out.title=缩小 +zoom_out_label=缩小 +zoom_in.title=放大 +zoom_in_label=放大 +zoom.title=缩放 +presentation_mode.title=切换到演示模式 +presentation_mode_label=演示模式 +open_file.title=打开文件 +open_file_label=打开 +print.title=打印 +print_label=打印 +download.title=下载 +download_label=下载 +bookmark.title=当前在看的内容(复制或在新窗口中打开) +bookmark_label=当前在看 + +# Secondary toolbar and context menu +tools.title=工具 +tools_label=工具 +first_page.title=转到第一页 +first_page.label=转到第一页 +first_page_label=转到第一页 +last_page.title=转到最后一页 +last_page.label=转到最后一页 +last_page_label=转到最后一页 +page_rotate_cw.title=顺时针旋转 +page_rotate_cw.label=顺时针旋转 +page_rotate_cw_label=顺时针旋转 +page_rotate_ccw.title=逆时针旋转 +page_rotate_ccw.label=逆时针旋转 +page_rotate_ccw_label=逆时针旋转 + +hand_tool_enable.title=启用手形工具 +hand_tool_enable_label=启用手形工具 +hand_tool_disable.title=禁用手形工具 +hand_tool_disable_label=禁用手形工具 + +# Document properties dialog box +document_properties.title=文档属性… +document_properties_label=文档属性… +document_properties_file_name=文件名: +document_properties_file_size=文件大小: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB ({{size_b}} 字节) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB ({{size_b}} 字节) +document_properties_title=标题: +document_properties_author=作者: +document_properties_subject=主题: +document_properties_keywords=关键词: +document_properties_creation_date=创建日期: +document_properties_modification_date=修改日期: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=创建者: +document_properties_producer=PDF 制作者: +document_properties_version=PDF 版本: +document_properties_page_count=页数: +document_properties_close=关闭 + +print_progress_message=正在准备打印文档… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=取消 + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=切换侧栏 +toggle_sidebar_label=切换侧栏 +document_outline.title=显示文档大纲(双击展开/折叠所有项) +document_outline_label=文档大纲 +attachments.title=显示附件 +attachments_label=附件 +thumbs.title=显示缩略图 +thumbs_label=缩略图 +findbar.title=在文档中查找 +findbar_label=查找 + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=页码 {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=页面 {{page}} 的缩略图 + +# Find panel button title and messages +find_label=查找: +find_previous.title=查找词语上一次出现的位置 +find_previous_label=上一页 +find_next.title=查找词语后一次出现的位置 +find_next_label=下一页 +find_highlight=全部高亮显示 +find_match_case_label=区分大小写 +find_reached_top=到达文档开头,从末尾继续 +find_reached_bottom=到达文档末尾,从开头继续 +find_not_found=找不到指定词语 + +# Error panel labels +error_more_info=更多信息 +error_less_info=更少信息 +error_close=关闭 +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=信息:{{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=堆栈:{{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=文件:{{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=行号:{{line}} +rendering_error=渲染页面时发生错误。 + +# Predefined zoom values +page_scale_width=适合页宽 +page_scale_fit=适合页面 +page_scale_auto=自动缩放 +page_scale_actual=实际大小 +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=错误 +loading_error=载入PDF时发生错误。 +invalid_file_error=无效或损坏的PDF文件。 +missing_file_error=缺少PDF文件。 +unexpected_response_error=意外的服务器响应。 + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} 注解] +password_label=输入密码以打开此 PDF 文件。 +password_invalid=密码无效。请重试。 +password_ok=确定 +password_cancel=取消 + +printing_not_supported=警告:打印功能不完全支持此浏览器。 +printing_not_ready=警告:该 PDF 未完全加载以供打印。 +web_fonts_disabled=Web 字体已被禁用:无法使用嵌入的PDF字体。 +document_colors_not_allowed=不允许 PDF 文档使用自己的颜色:浏览器中“允许页面选择自己的颜色”的选项已停用。 diff --git a/src/cps/static/locale/zh-TW/viewer.properties b/src/cps/static/locale/zh-TW/viewer.properties new file mode 100644 index 0000000..c273767 --- /dev/null +++ b/src/cps/static/locale/zh-TW/viewer.properties @@ -0,0 +1,182 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=上一頁 +previous_label=上一頁 +next.title=下一頁 +next_label=下一頁 + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +page.title=第 +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +of_pages=頁,共 {{pagesCount}} 頁 +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. +page_of_pages=(第 {{pageNumber}} 頁,共 {{pagesCount}} 頁) + +zoom_out.title=縮小 +zoom_out_label=縮小 +zoom_in.title=放大 +zoom_in_label=放大 +zoom.title=縮放 +presentation_mode.title=切換至簡報模式 +presentation_mode_label=簡報模式 +open_file.title=開啟檔案 +open_file_label=開啟 +print.title=列印 +print_label=列印 +download.title=下載 +download_label=下載 +bookmark.title=目前檢視的內容(複製或開啟於新視窗) +bookmark_label=目前檢視 + +# Secondary toolbar and context menu +tools.title=工具 +tools_label=工具 +first_page.title=跳到第一頁 +first_page.label=跳到第一頁 +first_page_label=跳到第一頁 +last_page.title=跳到最後一頁 +last_page.label=跳到最後一頁 +last_page_label=跳到最後一頁 +page_rotate_cw.title=順時針旋轉 +page_rotate_cw.label=順時針旋轉 +page_rotate_cw_label=順時針旋轉 +page_rotate_ccw.title=逆時針旋轉 +page_rotate_ccw.label=逆時針旋轉 +page_rotate_ccw_label=逆時針旋轉 + +hand_tool_enable.title=啟用掌型工具 +hand_tool_enable_label=啟用掌型工具 +hand_tool_disable.title=停用掌型工具 +hand_tool_disable_label=停用掌型工具 + +# Document properties dialog box +document_properties.title=文件內容… +document_properties_label=文件內容… +document_properties_file_name=檔案名稱: +document_properties_file_size=檔案大小: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +document_properties_kb={{size_kb}} KB({{size_b}} 位元組) +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_mb={{size_mb}} MB({{size_b}} 位元組) +document_properties_title=標題: +document_properties_author=作者: +document_properties_subject=主旨: +document_properties_keywords=關鍵字: +document_properties_creation_date=建立日期: +document_properties_modification_date=修改日期: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. +document_properties_date_string={{date}}, {{time}} +document_properties_creator=建立者: +document_properties_producer=PDF 產生器: +document_properties_version=PDF 版本: +document_properties_page_count=頁數: +document_properties_close=關閉 + +print_progress_message=正在準備列印文件… +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. +print_progress_percent={{progress}}% +print_progress_close=取消 + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=切換側邊欄 +toggle_sidebar_label=切換側邊欄 +document_outline.title=顯示文件大綱(雙擊展開/摺疊所有項目) +document_outline_label=文件大綱 +attachments.title=顯示附件 +attachments_label=附件 +thumbs.title=顯示縮圖 +thumbs_label=縮圖 +findbar.title=在文件中尋找 +findbar_label=尋找 + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=頁 {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=頁 {{page}} 的縮圖 + +# Find panel button title and messages +find_label=尋找: +find_previous.title=尋找文字前次出現的位置 +find_previous_label=上一個 +find_next.title=尋找文字下次出現的位置 +find_next_label=下一個 +find_highlight=全部強調標示 +find_match_case_label=區分大小寫 +find_reached_top=已搜尋至文件頂端,自底端繼續搜尋 +find_reached_bottom=已搜尋至文件底端,自頂端繼續搜尋 +find_not_found=找不到指定文字 + +# Error panel labels +error_more_info=更多資訊 +error_less_info=更少資訊 +error_close=關閉 +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=訊息: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=堆疊: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=檔案: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=行: {{line}} +rendering_error=描繪頁面時發生錯誤。 + +# Predefined zoom values +page_scale_width=頁面寬度 +page_scale_fit=縮放至頁面大小 +page_scale_auto=自動縮放 +page_scale_actual=實際大小 +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. +page_scale_percent={{scale}}% + +# Loading indicator messages +loading_error_indicator=錯誤 +loading_error=載入 PDF 時發生錯誤。 +invalid_file_error=無效或毀損的 PDF 檔案。 +missing_file_error=找不到 PDF 檔案。 +unexpected_response_error=伺服器回應未預期的內容。 + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[{{type}} 註解] +password_label=請輸入用來開啟此 PDF 檔案的密碼。 +password_invalid=密碼不正確,請再試一次。 +password_ok=確定 +password_cancel=取消 + +printing_not_supported=警告: 此瀏覽器未完整支援列印功能。 +printing_not_ready=警告: 此 PDF 未完成下載以供列印。 +web_fonts_disabled=已停用網路字型 (Web fonts): 無法使用 PDF 內嵌字型。 +document_colors_not_allowed=瀏覽器的「優先使用網頁指定的色彩」未被勾選,PDF 文件無法使用自己的色彩。 diff --git a/src/cps/static/locale/zu/viewer.properties b/src/cps/static/locale/zu/viewer.properties new file mode 100644 index 0000000..2e49fa8 --- /dev/null +++ b/src/cps/static/locale/zu/viewer.properties @@ -0,0 +1,133 @@ +# Copyright 2012 Mozilla Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Main toolbar buttons (tooltips and alt text for images) +previous.title=Ikhasi eledlule +previous_label=Okudlule +next.title=Ikhasi elilandelayo +next_label=Okulandelayo + +# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input. +# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number +# representing the total number of pages in the document. +# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}" +# will be replaced by a number representing the currently visible page, +# respectively a number representing the total number of pages in the document. + +zoom_out.title=Hlehlisela emuva +zoom_out_label=Hlehlisela emuva +zoom_in.title=Sondeza eduze +zoom_in_label=Sondeza eduze +zoom.title=Lwiza +presentation_mode.title=Guqulela kwindlela yesethulo +presentation_mode_label=Indlelo yesethulo +open_file.title=Vula ifayela +open_file_label=Vula +print.title=Phrinta +print_label=Phrinta +download.title=Landa +download_label=Landa +bookmark.title=Ukubuka kwamanje (kopisha noma vula kwifasitela elisha) +bookmark_label=Ukubuka kwamanje + +# Secondary toolbar and context menu + + +# Document properties dialog box +document_properties_file_name=Igama lefayela: +# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}" +# will be replaced by the PDF file size in kilobytes, respectively in bytes. +# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}" +# will be replaced by the PDF file size in megabytes, respectively in bytes. +document_properties_title=Isihloko: +# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}" +# will be replaced by the creation/modification date, and time, of the PDF file. + +# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by +# a numerical per cent value. + +# Tooltips and alt text for side panel toolbar buttons +# (the _label strings are alt text for the buttons, the .title strings are +# tooltips) +toggle_sidebar.title=I-toggle yebha yaseceleni +toggle_sidebar_label=i-toggle yebha yaseceleni +document_outline_label=Umugqa waseceleni wedokhumenti +thumbs.title=Bonisa izithombe ezincane +thumbs_label=Izithonjana +findbar.title=Thola kwidokhumenti +findbar_label=Thola + +# Thumbnails panel item (tooltip and alt text for images) +# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page +# number. +thumb_page_title=Ikhasi {{page}} +# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page +# number. +thumb_page_canvas=Isithonjana sekhasi {{page}} + +# Find panel button title and messages +find_label=Thola +find_previous.title=Thola indawo eyandulelayo okuvela kuyo lomshwana +find_previous_label=Okudlulile +find_next.title=Thola enye indawo okuvela kuyo lomshwana +find_next_label=Okulandelayo +find_highlight=Gqamisa konke +find_match_case_label=Fanisa ikheyisi +find_reached_top=Finyelele phezulu kwidokhumenti, qhubeka kusukaphansi +find_reached_bottom=Ifinyelele ekupheleni kwedokhumenti, qhubeka kusukaphezulu +find_not_found=Umshwana awutholakali + +# Error panel labels +error_more_info=Ukwaziswa Okwengeziwe +error_less_info=Ukwazi okuncane +# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be +# replaced by the PDF.JS version and build ID. +error_version_info=PDF.js v{{version}} (build: {{build}}) +# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an +# english string describing the error. +error_message=Umlayezo: {{message}} +# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack +# trace. +error_stack=Isitaki: {{stack}} +# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename +error_file=Ifayela: {{file}} +# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number +error_line=Umugqa: {{line}} +rendering_error=Iphutha lenzekile uma kunikwa ikhasi. + +# Predefined zoom values +page_scale_width=Ububanzi bekhasi +page_scale_fit=Ukulingana kwekhasi +page_scale_auto=Ukulwiza okuzenzekalelayo +page_scale_actual=Usayizi Wangempela +# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a +# numerical scale value. + +# Loading indicator messages +loading_error_indicator=Iphutha +loading_error=Kwenzeke iphutha uma kulayishwa i-PDF. +invalid_file_error=Ifayela le-PDF elingavumelekile noma elonakele. +missing_file_error=Ifayela le-PDF elilahlekile. + +# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip. +# "{{type}}" will be replaced with an annotation type from a list defined in +# the PDF spec (32000-1:2008 Table 169 – Annotation types). +# Some common types are e.g.: "Check", "Text", "Comment", "Note" +text_annotation_type.alt=[Amazwibela e-{{type}}] +password_ok=Kulungile + +printing_not_supported=Isixwayiso: Ukuphrinta akuxhasiwe yilesisiphequluli ngokugcwele. +printing_not_ready=Isixwayiso: I-PDF ayikalayishwa ngokuphelele yiPhrinta. +web_fonts_disabled=Amafonti e-webhu akutshaziwe: ayikwazi ukusebenzisa amafonti abekiwe e-PDF.\u0020 +document_colors_not_allowed=Amadokhumenti we-PDF awavumelekile ukusebenzisa imibalo yayo: 'Vumela amakhasi ukukhetha imibala yayo' ayisebenzi kusiphequluli. diff --git a/src/cps/templates/admin.html b/src/cps/templates/admin.html new file mode 100644 index 0000000..b7d23db --- /dev/null +++ b/src/cps/templates/admin.html @@ -0,0 +1,189 @@ +{% extends "layout.html" %} +{% block body %} +
      +
      +
      +

      {{_('User list')}}

      + + + + + + + + + + + + {% for user in content %} + {% if not user.role_anonymous() or config.config_anonbrowse %} + + + + + + + + + + + {% endif %} + {% endfor %} +
      {{_('Nickname')}}{{_('E-mail')}}{{_('Kindle')}}{{_('DLS')}}
      {{user.nickname}}{{user.email}}{{user.kindle_mail}}{{user.downloads.count()}}
      + +
      +
      + +
      +
      +

      {{_('SMTP e-mail server settings')}}

      + + + + + + + + + + + + + + + +
      {{_('SMTP hostname')}}{{_('SMTP port')}}{{_('SSL')}}{{_('SMTP login')}}
      {{email.mail_server}}{{email.mail_port}}{% if email.mail_use_ssl %}{% else %}{% endif %}{{email.mail_login}}
      + +
      +
      + +
      +
      +

      {{_('Configuration')}}

      +
      +
      +
      {{_('Calibre DB dir')}}
      +
      {{config.config_calibre_dir}}
      +
      +
      +
      {{_('Log level')}}
      +
      {{config.get_Log_Level()}}
      +
      +
      +
      {{_('Port')}}
      +
      {{config.config_port}}
      +
      +
      +
      +
      +
      {{_('Books per page')}}
      +
      {{config.config_books_per_page}}
      +
      +
      +
      {{_('Uploading')}}
      +
      {% if config.config_uploading %}{% else %}{% endif %}
      +
      +
      +
      {{_('Anonymous browsing')}}
      +
      {% if config.config_anonbrowse %}{% else %}{% endif %}
      +
      +
      +
      {{_('Public registration')}}
      +
      {% if config.config_public_reg %}{% else %}{% endif %}
      +
      +
      +
      {{_('Remote login')}}
      +
      {% if config.config_remote_login %}{% else %}{% endif %}
      +
      +
      + + +
      +
      + +
      +
      +

      {{_('Administration')}}

      +
      {{_('Reconnect to Calibre DB')}}
      +
      {{_('Restart Calibre-Web')}}
      +
      {{_('Stop Calibre-Web')}}
      +
      +
      + +
      +
      +

      {{_('Update')}}

      + + + + + + + + + + + + + +
      {{_('Version')}}{{_('Details')}}
      {{commit}} {{_('Current version')}}
      + + +
      {{_('Check for update')}}
      + +
      +
      +
      + + + + + +{% endblock %} diff --git a/src/cps/templates/author.html b/src/cps/templates/author.html new file mode 100644 index 0000000..14dd94e --- /dev/null +++ b/src/cps/templates/author.html @@ -0,0 +1,112 @@ +{% extends "layout.html" %} +{% block body %} +

      {{title}}

      + +{% if author is not none %} +
      + {%if author.image_url is not none %} + {{author.name|safe}} + {% endif %} + + {%if author.about is not none %} +

      {{author.about|safe}}

      + {% endif %} + + - {{_("via")}} Goodreads +
      + +
      +{% endif %} + +
      + {% if author is not none %} +

      {{_("In Library")}}

      + {% endif %} +
      + {% if entries[0] %} + {% for entry in entries %} +
      + +
      + +

      {{entry.title|shortentitle}}

      +
      +

      + {% for author in entry.authors %} + {{author.name.replace('|',',')}} + {% if not loop.last %} + & + {% endif %} + {% endfor %} +

      + {% if entry.ratings.__len__() > 0 %} +
      + {% for number in range((entry.ratings[0].rating/2)|int(2)) %} + + {% if loop.last and loop.index < 5 %} + {% for numer in range(5 - loop.index) %} + + {% endfor %} + {% endif %} + {% endfor %} +
      + {% endif %} +
      +
      + {% endfor %} + {% endif %} +
      +
      + +{% if other_books %} +
      +

      {{_("More by")}} {{ author.name.replace('|',',')|safe }}

      +
      + {% for entry in other_books %} +
      +
      + + + +
      +
      +

      {{entry.title|shortentitle}}

      +

      + {% for author in entry.authors %} + + {{author.name.replace('|',',')}} + + {% if not loop.last %} + & + {% endif %} + {% endfor %} +

      +
      + {% for number in range((entry.average_rating)|float|round|int(2)) %} + + {% if loop.last and loop.index < 5 %} + {% for numer in range(5 - loop.index) %} + + {% endfor %} + {% endif %} + {% endfor %} +
      +
      +
      + {% endfor %} +
      + + + Goodreads + +
      +{% endif %} +{% endblock %} diff --git a/src/cps/templates/book_edit.html b/src/cps/templates/book_edit.html new file mode 100644 index 0000000..5ba021c --- /dev/null +++ b/src/cps/templates/book_edit.html @@ -0,0 +1,297 @@ +{% extends "layout.html" %} +{% block body %} +{% if book %} + + +
      +
      + {% if book.has_cover %} + {{ book.title }} + {% else %} + {{ book.title }} + {% endif %} +
      +{% if g.user.role_delete_books() %} +
      + +
      + {% if book.data|length > 1 %} +

      {{_('Delete formats:')}}

      + {% for file in book.data %} + + {% endfor %} +
      + {% endif %} +{% endif %} + +{% if source_formats|length > 0 and conversion_formats|length > 0 %} +

      {{_('Convert book format:')}}

      +
      +
      +
      + + + + +
      +
      + +
      +
      +{% endif %} + +
      +
      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + +
      + +
      +
      + +
      + + +
      +
      +
      + + +
      +
      + + +
      + {% if cc|length > 0 %} + {% for c in cc %} +
      + + {% if c.datatype == 'bool' %} + + {% endif %} + + {% if c.datatype == 'int' %} + + {% endif %} + + {% if c.datatype in ['text', 'series'] and not c.is_multiple %} + 0 %} + value="{{ book['custom_column_' ~ c.id][0].value }}" + {% endif %}> + {% endif %} + + {% if c.datatype in ['text', 'series'] and c.is_multiple %} + 0 %} + value="{% for column in book['custom_column_' ~ c.id] %}{{ column.value.strip() }}{% if not loop.last %}, {% endif %}{% endfor %}"{% endif %}> + {% endif %} + + {% if c.datatype == 'enumeration' %} + + {% endif %} + + {% if c.datatype == 'rating' %} + 0 %} + value="{{ '%d' % (book['custom_column_' ~ c.id][0].value / 2) }}" + {% endif %}> + {% endif %} +
      + {% endfor %} + {% endif %} + {% if g.user.role_upload() or g.user.role_admin()%} + {% if g.allow_upload %} +
      + +
      + +
      + {% endif %} + {% endif %} + +
      + +
      + {{_('Get metadata')}} + + {{_('Back')}} +
      +
      + +{% endif %} +{% endblock %} + +{% block modal %} +{% if g.user.role_delete_books() %} + +{% endif %} + + +{% endblock %} + +{% block js %} + + + + + + + +{% if not g.user.locale == 'en' %} + +{% endif %} + +{% endblock %} +{% block header %} + + +{% endblock %} diff --git a/src/cps/templates/config_edit.html b/src/cps/templates/config_edit.html new file mode 100644 index 0000000..b2826b3 --- /dev/null +++ b/src/cps/templates/config_edit.html @@ -0,0 +1,232 @@ +{% extends "layout.html" %} +{% block body %} +
      +

      {{title}}

      +
      +
      +
      + +
      +
      +
      + + +
      +
      + + +
      +
      + {% if gdriveError %} +
      + +
      + {% else %} + {% if show_authenticate_google_drive and g.user.is_authenticated %} + + {% else %} + {% if show_authenticate_google_drive and not g.user.is_authenticated %} +
      {{_('Please finish Google Drive setup after login')}}
      + {% endif %} + {% if not show_authenticate_google_drive %} +
      + + +
      + {% if content.config_google_drive_watch_changes_response %} + + + {% else %} + Enable watch of metadata.db + {% endif %} + {% endif %} + {% endif %} + {% endif %} +
      +
      +
      +
      + +
      + +
      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      + +
      +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      + +
      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      + {% if goodreads %} +
      + + + {{_('Obtain an API Key')}} +
      +
      +
      + + +
      +
      + + +
      +
      + {% endif %} +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + +
      +
      + + +
      +
      + {% if rarfile_support %} +
      + + +
      + {% endif %} +
      +
      +
      +
      + + +
      + + {% if not origin %} + {{_('Back')}} + {% endif %} + {% if success %} + {{_('Login')}} + {% endif %} +
      +
      +
      +{% endblock %} +{% block js %} + +{% endblock %} diff --git a/src/cps/templates/config_view_edit.html b/src/cps/templates/config_view_edit.html new file mode 100644 index 0000000..88c4a4b --- /dev/null +++ b/src/cps/templates/config_view_edit.html @@ -0,0 +1,181 @@ +{% extends "layout.html" %} +{% block body %} +
      +

      {{title}}

      +
      +
      +
      + +
      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      + +
      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      + +
      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      +
      +
      +
      +
      + + {{_('Back')}} +
      +
      +
      +{% endblock %} +{% block js %} + +{% endblock %} diff --git a/src/cps/templates/detail.html b/src/cps/templates/detail.html new file mode 100644 index 0000000..7631ce2 --- /dev/null +++ b/src/cps/templates/detail.html @@ -0,0 +1,294 @@ +{% extends is_xhr|yesno("fragment.html", "layout.html") %} +{% block body %} +
      +
      +
      +
      + {% if entry.has_cover %} + {{ entry.title }} + {% else %} + {{ entry.title }} + {% endif %} +
      +
      +
      + +

      {{entry.title|shortentitle(40)}}

      +

      + {% for author in entry.authors %} + {{author.name.replace('|',',')}} + {% if not loop.last %} + & + {% endif %} + {% endfor %} +

      + {% if entry.ratings.__len__() > 0 %} +
      +

      + {% for number in range((entry.ratings[0].rating/2)|int(2)) %} + + {% if loop.last and loop.index < 5 %} + {% for numer in range(5 - loop.index) %} + + {% endfor %} + {% endif %} + {% endfor %} +

      +
      + {% endif %} + + {% if entry.series|length > 0 %} +

      {{_('Book')}} {{entry.series_index}} {{_('of')}} {{entry.series[0].name}}

      + {% endif %} + + {% if entry.languages.__len__() > 0 %} +
      +

      + {{_('language')}}: {% for language in entry.languages %} {{language.language_name}}{% if not loop.last %},{% endif %}{% endfor %} +

      +
      + {% endif %} + + {% if entry.identifiers|length > 0 %} +
      +

      + + {% for identifier in entry.identifiers %} + {{identifier.formatType()}} + {%endfor%} +

      +
      + {% endif %} + + {% if entry.tags|length > 0 %} + +
      +

      + + + {% for tag in entry.tags %} + {{tag.name}} + {%endfor%} +

      + +
      + {% endif %} + + {% if entry.publishers|length > 0 %} +
      +

      + {{_('Publisher')}}: + {{entry.publishers[0].name}} + +

      +
      + {% endif %} + + {% if entry.pubdate[:10] != '0101-01-01' %} +

      {{_('Publishing date')}}: {{entry.pubdate|formatdate}}

      + {% endif %} + {% if cc|length > 0 %} + +
      +

      + {% for c in cc %} + {% if entry['custom_column_' ~ c.id]|length > 0 %} + {{ c.name }}: + {% for column in entry['custom_column_' ~ c.id] %} + {% if c.datatype == 'rating' %} + {{ '%d' % (column.value / 2) }} + {% else %} + {% if c.datatype == 'bool' %} + {% if column.value == true %} + + {% else %} + + {% endif %} + {% else %} + {{ column.value }} + {% endif %} + {% endif %} + {% endfor %} +
      + {% endif %} + {% endfor %} +

      +
      + {% endif %} + {% if not g.user.is_anonymous %} + +
      +

      +

      + +
      +

      +
      + {% endif %} + + + {% if entry.comments|length > 0 and entry.comments[0].text|length > 0%} +
      +

      {{_('Description:')}}

      + {{entry.comments[0].text|safe}} +
      + {% endif %} + + +
      + + {% if g.user.is_authenticated %} + {% if g.user.shelf.all() or g.public_shelfes %} + + {% endif %} + + {% endif %} + {% if g.user.role_edit() %} + + {% endif %} +
      + +
      +
      +
      +{% endblock %} + +{% block js %} + + + +{% endblock %} diff --git a/src/cps/templates/discover.html b/src/cps/templates/discover.html new file mode 100644 index 0000000..13dacb4 --- /dev/null +++ b/src/cps/templates/discover.html @@ -0,0 +1,45 @@ +{% extends "layout.html" %} +{% block body %} +
      +

      {{title}}

      +
      + + {% for entry in entries %} +
      +
      + {% if entry.has_cover is defined %} + + {{ entry.title }} + + {% endif %} +
      +
      + +

      {{entry.title|shortentitle}}

      +
      +

      + {% for author in entry.authors %} + {{author.name.replace('|',',')|shortentitle(30)}} + {% if not loop.last %} + & + {% endif %} + {% endfor %} +

      + {% if entry.ratings.__len__() > 0 %} +
      + {% for number in range((entry.ratings[0].rating/2)|int(2)) %} + + {% if loop.last and loop.index < 5 %} + {% for numer in range(5 - loop.index) %} + + {% endfor %} + {% endif %} + {% endfor %} +
      + {% endif %} +
      +
      + {% endfor %} +
      +
      +{% endblock %} diff --git a/src/cps/templates/email_edit.html b/src/cps/templates/email_edit.html new file mode 100644 index 0000000..0af404b --- /dev/null +++ b/src/cps/templates/email_edit.html @@ -0,0 +1,90 @@ +{% extends "layout.html" %} +{% block header %} + + +{% endblock %} +{% block body %} +
      +

      {{title}}

      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      + + + {{_('Back')}} +
      + {% if g.allow_registration %} +

      {{_('Allowed domains for registering')}}

      + + + + + + + + +
      +
      +
      + + +
      + +
      + {% endif %} +
      +{% endblock %} +{% block modal %} +{% if g.allow_registration %} + +{% endif %} +{% endblock %} +{% block js %} +{% if g.allow_registration %} + + + + +{% endif %} +{% endblock %} + diff --git a/src/cps/templates/feed.xml b/src/cps/templates/feed.xml new file mode 100644 index 0000000..540f57e --- /dev/null +++ b/src/cps/templates/feed.xml @@ -0,0 +1,81 @@ + + + urn:uuid:2853dacf-ed79-42f5-8e8a-a7bb3d1ae6a2 + {{ current_time }} + + + +{% if pagination.has_prev %} + +{% endif %} +{% if pagination.has_next %} + +{% endif %} +{% if pagination.has_prev %} + +{% endif %} + + + {{instance}} + + {{instance}} + https://github.com/janeczku/calibre-web + + + {% if entries and entries[0] %} + {% for entry in entries %} + + {{entry.title}} + {{entry.uuid}} + {{entry.atom_timestamp}} + {% if entry.authors.__len__() > 0 %} + + {{entry.authors[0].name}} + + {% endif %} + {% if entry.publishers.__len__() > 0 %} + + {{entry.publishers[0].name}} + + {% endif %} + {{entry.language}} + {% for tag in entry.tags %} + + {% endfor %} + {% if entry.comments[0] %}{{entry.comments[0].text|striptags}}{% endif %} + {% if entry.has_cover %} + + + {% endif %} + {% for format in entry.data %} + + {% endfor %} + + {% endfor %} + {% endif %} + {% for entry in listelements %} + + {{entry.name}} + {{ url_for(folder, book_id=entry.id) }} + + + {% endfor %} + diff --git a/src/cps/templates/fragment.html b/src/cps/templates/fragment.html new file mode 100644 index 0000000..1421ea6 --- /dev/null +++ b/src/cps/templates/fragment.html @@ -0,0 +1,4 @@ +
      + {% block body %}{% endblock %} +
      +{% block js %}{% endblock %} diff --git a/src/cps/templates/http_error.html b/src/cps/templates/http_error.html new file mode 100644 index 0000000..8167ddf --- /dev/null +++ b/src/cps/templates/http_error.html @@ -0,0 +1,26 @@ + + + + {{ instance }} | HTTP Error ({{ error_code }}) + + + + + + + + + + + {% if g.user.get_theme == 1 %} + + {% endif %} + + +
      +

      {{ error_code }}

      +

      {{ error_name }}

      + {{_('Back to home')}} +
      + + diff --git a/src/cps/templates/index.html b/src/cps/templates/index.html new file mode 100755 index 0000000..12fbd71 --- /dev/null +++ b/src/cps/templates/index.html @@ -0,0 +1,94 @@ +{% extends "layout.html" %} +{% block body %} +{% if g.user.show_detail_random() %} +
      +

      {{_('Discover (Random Books)')}}

      +
      + + {% for entry in random %} +
      + +
      + +

      {{entry.title|shortentitle}}

      +
      +

      + {% for author in entry.authors %} + {{author.name.replace('|',',')|shortentitle(30)}} + {% if not loop.last %} + & + {% endif %} + {% endfor %} +

      + {% if entry.ratings.__len__() > 0 %} +
      + {% for number in range((entry.ratings[0].rating/2)|int(2)) %} + + {% if loop.last and loop.index < 5 %} + {% for numer in range(5 - loop.index) %} + + {% endfor %} + {% endif %} + {% endfor %} +
      + {% endif %} +
      +
      + {% endfor %} +
      +
      +{% endif %} +
      +

      {{title}}

      +
      + {% if entries[0] %} + {% for entry in entries %} +
      + +
      + +

      {{entry.title|shortentitle}}

      +
      +

      + {% for author in entry.authors %} + {{author.name.replace('|',',')|shortentitle(30)}} + {% if not loop.last %} + & + {% endif %} + {% endfor %} +

      + {% if entry.ratings.__len__() > 0 %} +
      + {% for number in range((entry.ratings[0].rating/2)|int(2)) %} + + {% if loop.last and loop.index < 5 %} + {% for numer in range(5 - loop.index) %} + + {% endfor %} + {% endif %} + {% endfor %} +
      + {% endif %} +
      +
      + {% endfor %} + {% endif %} +
      +
      +{% endblock %} diff --git a/src/cps/templates/index.xml b/src/cps/templates/index.xml new file mode 100644 index 0000000..7ab305a --- /dev/null +++ b/src/cps/templates/index.xml @@ -0,0 +1,105 @@ + + + urn:uuid:2853dacf-ed79-42f5-8e8a-a7bb3d1ae6a2 + {{ current_time }} + + + + + {{instance}} + + {{instance}} + https://github.com/janeczku/calibre-web + + + {{_('Hot Books')}} + + {{url_for('feed_hot')}} + {{ current_time }} + {{_('Popular publications from this catalog based on Downloads.')}} + + + {{_('Best rated Books')}} + + {{url_for('feed_best_rated')}} + {{ current_time }} + {{_('Popular publications from this catalog based on Rating.')}} + + + {{_('New Books')}} + + {{url_for('feed_new')}} + {{ current_time }} + {{_('The latest Books')}} + + + {{_('Random Books')}} + + {{url_for('feed_discover')}} + {{ current_time }} + {{_('Show Random Books')}} + + {% if not current_user.is_anonymous %} + + {{_('Read Books')}} + + {{url_for('feed_read_books')}} + {{ current_time }} + {{_('Read Books')}} + + {% endif %} + + {{_('Unread Books')}} + + {{url_for('feed_unread_books')}} + {{ current_time }} + {{_('Unread Books')}} + + + {{_('Authors')}} + + {{url_for('feed_authorindex')}} + {{ current_time }} + {{_('Books ordered by Author')}} + + + {{_('Publishers')}} + + {{url_for('feed_publisherindex')}} + {{ current_time }} + {{_('Books ordered by publisher')}} + + + {{_('Category list')}} + + {{url_for('feed_categoryindex')}} + {{ current_time }} + {{_('Books ordered by category')}} + + + {{_('Series list')}} + + {{url_for('feed_seriesindex')}} + {{ current_time }} + {{_('Books ordered by series')}} + + + {{_('Public Shelves')}} + + {{url_for('feed_shelfindex', public="public")}} + {{ current_time }} + {{_('Books organized in public shelfs, visible to everyone')}} + + {% if not current_user.is_anonymous %} + + {{_('Your Shelves')}} + + {{url_for('feed_shelfindex')}} + {{ current_time }} + {{_("User's own shelfs, only visible to the current user himself")}} + + {% endif %} + diff --git a/src/cps/templates/json.txt b/src/cps/templates/json.txt new file mode 100644 index 0000000..fa5239b --- /dev/null +++ b/src/cps/templates/json.txt @@ -0,0 +1,54 @@ +{ + "pubdate": "{{entry.pubdate}}", + "title": "{{entry.title}}", + "format_metadata": { + {% for format in entry.data %} + "{{format.format}}": { + "mtime": "{{entry.last_modified}}", + "size": {{format.uncompressed_size}}, + "path": "" + }{% if not loop.last %},{% endif %} + {% endfor %} + }, + "formats": [ + {% for format in entry.data %} + "{{format.format}}"{% if not loop.last %},{% endif %} + {% endfor %} + ], + "series": null, + "cover": "{{url_for('feed_get_cover', book_id=entry.id)}}", + "languages": [ + {% for lang in entry.languages %} + "{{lang.lang_code}}"{% if not loop.last %},{% endif %} + {% endfor %} + ], + "comments": "{% if entry.comments|length > 0 %}{{entry.comments[0].text.replace('"', '\\"')|safe}}{% endif %}", + "tags": [ + {% for tag in entry.tags %} + "{{tag.name}}"{% if not loop.last %},{% endif %} + {% endfor %} + ], + "application_id": {{entry.id}}, + "series_index": {% if entry.series|length > 0 %}"{{entry.series_index}}"{% else %}null{% endif %}, + "last_modified": "{{entry.last_modified}}", + "author_sort": "{{entry.author_sort}}", + "uuid": "{{entry.uuid}}", + "timestamp": "{{entry.timestamp}}", + "thumbnail": "{{url_for('feed_get_cover', book_id=entry.id)}}", + "main_format": { + "{{entry.data[0].format|lower}}": "{{ url_for('get_opds_download_link', book_id=entry.id, book_format=entry.data[0].format|lower)}}" + }, + "rating":{% if entry.ratings.__len__() > 0 %} "{{entry.ratings[0].rating}}.0"{% else %}0.0{% endif %}, + "authors": [ + {% for author in entry.authors %} + "{{author.name.replace('|',',')}}"{% if not loop.last %},{% endif %} + {% endfor %} + ], + "other_formats": { + {% if entry.data.__len__() > 1 %} + {% for format in entry.data[1:] %} + "{{format.format|lower}}": "{{ url_for('get_opds_download_link', book_id=entry.id, book_format=format.format|lower)}}"{% if not loop.last %},{% endif %} + {% endfor %} + {% endif %} }, + "title_sort": "{{entry.sort}}" +} diff --git a/src/cps/templates/languages.html b/src/cps/templates/languages.html new file mode 100644 index 0000000..4c582d2 --- /dev/null +++ b/src/cps/templates/languages.html @@ -0,0 +1,18 @@ +{% extends "layout.html" %} +{% block body %} +

      {{title}}

      +
      +
      + {% for lang in languages %} + {% if loop.index0 == (loop.length/2)|int and loop.length > 20 %} +
      +
      + {% endif %} +
      +
      {{lang_counter[loop.index0].bookcount}}
      + +
      + {% endfor %} +
      +
      +{% endblock %} diff --git a/src/cps/templates/layout.html b/src/cps/templates/layout.html new file mode 100644 index 0000000..d0f6469 --- /dev/null +++ b/src/cps/templates/layout.html @@ -0,0 +1,254 @@ + + + + {{instance}} | {{title}} + + + + + + + + + + + {% if g.user.get_theme == 1 %} + + {% endif %} + + + + + {% block header %}{% endblock %} + + + + + {% for message in get_flashed_messages(with_categories=True) %} + {%if message[0] == "error" %} +
      +
      {{ message[1] }}
      +
      + {%endif%} + {%if message[0] == "info" %} +
      +
      {{ message[1] }}
      +
      + {%endif%} + {%if message[0] == "success" %} +
      +
      {{ message[1] }}
      +
      + {%endif%} + {% endfor %} + +
      +
      + {% if g.user.is_authenticated or g.user.is_anonymous %} +
      + +
      + {% endif %} +
      + {% block body %}{% endblock %} + {% if pagination and (pagination.has_next or pagination.has_prev) %} + + {% endif %} +
      +
      +
      + + {% block modal %}{% endblock %} + + + + + + + + + + + + + + + + {% block js %}{% endblock %} + + diff --git a/src/cps/templates/list.html b/src/cps/templates/list.html new file mode 100644 index 0000000..483738e --- /dev/null +++ b/src/cps/templates/list.html @@ -0,0 +1,18 @@ +{% extends "layout.html" %} +{% block body %} +

      {{title}}

      +
      +
      + {% for entry in entries %} + {% if loop.index0 == (loop.length/2)|int and loop.length > 20 %} +
      +
      + {% endif %} +
      +
      {{entry.count}}
      + +
      + {% endfor %} +
      +
      +{% endblock %} diff --git a/src/cps/templates/login.html b/src/cps/templates/login.html new file mode 100644 index 0000000..3e8ebe1 --- /dev/null +++ b/src/cps/templates/login.html @@ -0,0 +1,31 @@ +{% extends "layout.html" %} +{% block body %} +
      +

      {{_('Login')}}

      +
      + +
      + + +
      +
      + + +
      +
      + +
      + + {% if remote_login %} + {{_('Log in with magic link')}} + {% endif %} +
      +
      + {% if error %} +
      +
      {{error}}
      +
      + {% endif %} +{% endblock %} diff --git a/src/cps/templates/osd.xml b/src/cps/templates/osd.xml new file mode 100644 index 0000000..b88e682 --- /dev/null +++ b/src/cps/templates/osd.xml @@ -0,0 +1,16 @@ + + + {{instance}} + {{instance}} + {{_('Calibre-Web ebook catalog')}} + Janeczku + https://github.com/janeczku/calibre-web + + + open + {{lang}} + UTF-8 + UTF-8 + diff --git a/src/cps/templates/read.html b/src/cps/templates/read.html new file mode 100644 index 0000000..380e106 --- /dev/null +++ b/src/cps/templates/read.html @@ -0,0 +1,99 @@ + + + + + + ePubJS Reader + + + + + + + + + + +
      + +
      +
      + Menu +
      +
      + +   –   + +
      + +
      + +
      + +
      + + +
      +
      + +
      + + + + + + + + + + + + diff --git a/src/cps/templates/readcbr.html b/src/cps/templates/readcbr.html new file mode 100644 index 0000000..bdc2a3e --- /dev/null +++ b/src/cps/templates/readcbr.html @@ -0,0 +1,157 @@ + + + + + + Comic Reader + + + + + + + + + + + + + + + + + +
      +
      +
      + Menu +
      +
      + {{ title | shortentitle }} +   –   + +
      + +
      +
      +
      + Loading... +
      +
      +
      +
      +
      +
      +
      + +
      + + +
      + + +
      + + +
      + + + diff --git a/src/cps/templates/readpdf.html b/src/cps/templates/readpdf.html new file mode 100644 index 0000000..abd5df6 --- /dev/null +++ b/src/cps/templates/readpdf.html @@ -0,0 +1,437 @@ + + + + + + + + + {{_('PDF.js viewer')}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + +
      +
      +
      + + + +
      +
      +
      +
      +
      + + +
      +
      + +
      + + + + +
      +
      +
      +
      + +
      + +
      + +
      + +
      + + + +
      +
      + + + + + + + + + Current View + + +
      + + +
      +
      +
      +
      + +
      + +
      + + + +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      +
      + + + + + + + + +
      +
      +
      + + +
      + + + +
      +
      + + + + + diff --git a/src/cps/templates/readtxt.html b/src/cps/templates/readtxt.html new file mode 100644 index 0000000..f45bd70 --- /dev/null +++ b/src/cps/templates/readtxt.html @@ -0,0 +1,165 @@ + + + + + + {{_('Basic txt Reader')}} + + + + + + + + + + + + + + +
      + +
      + +
      + + + + \ No newline at end of file diff --git a/src/cps/templates/register.html b/src/cps/templates/register.html new file mode 100644 index 0000000..70bd10c --- /dev/null +++ b/src/cps/templates/register.html @@ -0,0 +1,22 @@ +{% extends "layout.html" %} +{% block body %} +
      +

      {{_('Register a new account')}}

      +
      +
      + + +
      +
      + + +
      + +
      +
      + {% if error %} +
      +
      {{error}}
      +
      + {% endif %} +{% endblock %} diff --git a/src/cps/templates/remote_login.html b/src/cps/templates/remote_login.html new file mode 100644 index 0000000..8e6e4ae --- /dev/null +++ b/src/cps/templates/remote_login.html @@ -0,0 +1,40 @@ +{% extends "layout.html" %} +{% block body %} +
      +

      {{_('Remote login')}}

      +

      + {{_('Using your another device, visit')}} {{verify_url}} {{_('and log in')}}. +

      +

      + {{_('Once you do so, you will automatically get logged in on this device.')}} +

      +

      + {{_('The link will expire after %s minutes.' % 10)}} +

      +
      +{% endblock %} + +{% block js %} + +{% endblock %} diff --git a/src/cps/templates/search.html b/src/cps/templates/search.html new file mode 100644 index 0000000..79bd1e9 --- /dev/null +++ b/src/cps/templates/search.html @@ -0,0 +1,72 @@ +{% extends "layout.html" %} +{% block body %} +
      + {% if entries|length < 1 %} +

      {{_('No Results for:')}} {{searchterm}}

      +

      {{_('Please try a different search')}}

      + {% else %} +

      {{entries|length}} {{_('Results for:')}} {{searchterm}}

      + {% if g.user.is_authenticated %} + {% if g.user.shelf.all() or g.public_shelfes %} + + {% endif %} + {% endif %} + {% endif %} + +
      + {% for entry in entries %} +
      +
      + {% if entry.has_cover is defined %} + + {{ entry.title }} + + {% endif %} +
      +
      + +

      {{entry.title|shortentitle}}

      +
      +

      + {% for author in entry.authors %} + {{author.name.replace('|',',')}} + {% if not loop.last %} + & + {% endif %} + {% endfor %} +

      + {% if entry.ratings.__len__() > 0 %} +
      + {% for number in range((entry.ratings[0].rating/2)|int(2)) %} + + {% if loop.last and loop.index < 5 %} + {% for numer in range(5 - loop.index) %} + + {% endfor %} + {% endif %} + {% endfor %} +
      + {% endif %} +
      +
      + {% endfor %} +
      +
      +{% endblock %} diff --git a/src/cps/templates/search_form.html b/src/cps/templates/search_form.html new file mode 100644 index 0000000..a665f65 --- /dev/null +++ b/src/cps/templates/search_form.html @@ -0,0 +1,176 @@ +{% extends "layout.html" %} +{% block body %} +
      + +
      +{% endblock %} + +{% block js %} + + + +{% if not g.user.locale == 'en' %} + +{% endif %} + + + + +{% endblock %} +{% block header %} + + +{% endblock %} diff --git a/src/cps/templates/shelf.html b/src/cps/templates/shelf.html new file mode 100644 index 0000000..a317c14 --- /dev/null +++ b/src/cps/templates/shelf.html @@ -0,0 +1,70 @@ +{% extends "layout.html" %} +{% block body %} +
      +

      {{title}}

      + {% if g.user.is_authenticated %} + {% if (g.user.role_edit_shelfs() and shelf.is_public ) or not shelf.is_public %} +
      {{ _('Delete this Shelf') }}
      + {{ _('Edit Shelf') }} + {{ _('Change order') }} + {% endif %} + {% endif %} +
      + + {% for entry in entries %} +
      + +
      + +

      {{entry.title|shortentitle}}

      +
      +

      + {% for author in entry.authors %} + {{author.name.replace('|',',')}} + {% if not loop.last %} + & + {% endif %} + {% endfor %} +

      + {% if entry.ratings.__len__() > 0 %} +
      + {% for number in range((entry.ratings[0].rating/2)|int(2)) %} + + {% if loop.last and loop.index < 5 %} + {% for numer in range(5 - loop.index) %} + + {% endfor %} + {% endif %} + {% endfor %} +
      + {% endif %} +
      +
      + {% endfor %} +
      +
      + + +{% endblock %} diff --git a/src/cps/templates/shelf_edit.html b/src/cps/templates/shelf_edit.html new file mode 100644 index 0000000..e9bc152 --- /dev/null +++ b/src/cps/templates/shelf_edit.html @@ -0,0 +1,23 @@ +{% extends "layout.html" %} +{% block body %} +
      +

      {{title}}

      +
      +
      + + +
      + {% if g.user.role_edit_shelfs() %} +
      + +
      + {% endif %} + + {% if shelf.id != None %} + {{_('Back')}} + {% endif %} +
      +
      +{% endblock %} diff --git a/src/cps/templates/shelf_order.html b/src/cps/templates/shelf_order.html new file mode 100644 index 0000000..d4d44a6 --- /dev/null +++ b/src/cps/templates/shelf_order.html @@ -0,0 +1,22 @@ +{% extends "layout.html" %} +{% block body %} +
      +

      {{title}}

      +
      {{_('Drag \'n drop to rearrange order')}}
      +
      + {% for entry in entries %} +
      {{entry.title}}
      + {% endfor %} +
      + + {{_('Back')}} +
      +{% endblock %} + +{% block js %} + + +{% endblock %} + + + diff --git a/src/cps/templates/stats.html b/src/cps/templates/stats.html new file mode 100644 index 0000000..7f941ac --- /dev/null +++ b/src/cps/templates/stats.html @@ -0,0 +1,45 @@ +{% extends "layout.html" %} +{% block body %} +

      {{_('About')}}

      +

      {{instance}} powered by +Calibre-Web. +

      +

      {{_('Calibre library statistics')}}

      + + + + + + + + + + + + + + + + + + + +
      {{bookcounter}}{{_('Books in this Library')}}
      {{authorcounter}}{{_('Authors in this Library')}}
      {{categorycounter}}{{_('Categories in this Library')}}
      {{seriecounter}}{{_('Series in this Library')}}
      +

      {{_('Linked libraries')}}

      + + + + + + + + + {% for library,version in versions.items() %} + + + + + {% endfor %} + +
      {{_('Program library')}}{{_('Installed Version')}}
      {{library}}{{version}}
      +{% endblock %} diff --git a/src/cps/templates/tasks.html b/src/cps/templates/tasks.html new file mode 100644 index 0000000..4cf13c9 --- /dev/null +++ b/src/cps/templates/tasks.html @@ -0,0 +1,58 @@ +{% extends "layout.html" %} +{% block header %} + +{% endblock %} +{% block body %} +
      +

      {{_('Tasks list')}}

      + + + + {% if g.user.role_admin() %} + + {% endif %} + + + + + + + + + +
      {{_('User')}}{{_('Task')}}{{_('Status')}}{{_('Progress')}}{{_('Runtime')}}{{_('Starttime')}}
      + +
      +{% endblock %} +{% block js %} + + + +{% endblock %} diff --git a/src/cps/templates/user_edit.html b/src/cps/templates/user_edit.html new file mode 100644 index 0000000..48630ce --- /dev/null +++ b/src/cps/templates/user_edit.html @@ -0,0 +1,173 @@ +{% extends "layout.html" %} +{% block body %} +
      +

      {{title}}

      +
      + {% if g.user and g.user.role_admin() and new_user %} +
      + + +
      + {% endif %} +
      + + +
      + {% if ( g.user and g.user.role_passwd() or g.user.role_admin() ) and not content.role_anonymous() %} + {% if g.user and g.user.role_admin() and g.allow_registration and not new_user and not profile %} + + {% else %} +
      + + +
      + {% endif %} + {% endif %} +
      + + +
      +
      + + +
      +
      + + +
      + +
      + + +
      +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      +
      + {% if g.user and g.user.role_admin() and not profile %} + {% if not content.role_anonymous() %} +
      + + +
      + {% endif %} +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      +
      + + +
      + {% if not content.role_anonymous() %} +
      + + +
      +
      + + +
      + {% endif %} + {% endif %} + {% if g.user and g.user.role_admin() and not profile and not new_user and not content.role_anonymous() %} +
      + +
      + {% endif %} +
      +
      + + {% if not profile %} + {{_('Back')}} + {% endif %} +
      +
      + + {% if downloads %} +
      +

      {{_('Recent Downloads')}}

      + {% for entry in downloads %} +
      + + ... + +
      + {% endfor %} +
      + {% endif %} +
      +{% endblock %} diff --git a/src/cps/translations/de/LC_MESSAGES/messages.mo b/src/cps/translations/de/LC_MESSAGES/messages.mo new file mode 100644 index 0000000..5d20a5b Binary files /dev/null and b/src/cps/translations/de/LC_MESSAGES/messages.mo differ diff --git a/src/cps/translations/de/LC_MESSAGES/messages.po b/src/cps/translations/de/LC_MESSAGES/messages.po new file mode 100644 index 0000000..c319cb7 --- /dev/null +++ b/src/cps/translations/de/LC_MESSAGES/messages.po @@ -0,0 +1,1944 @@ +# German translations for Calibre-Web. +# Copyright (C) 2016 Ozzie Isaacs +# This file is distributed under the same license as the Calibre-Web +# project. +# FIRST AUTHOR OzzieIsaacs, 2016. +msgid "" +msgstr "" +"Project-Id-Version: Calibre-Web\n" +"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" +"POT-Creation-Date: 2018-11-03 14:03+0100\n" +"PO-Revision-Date: 2016-07-12 19:54+0200\n" +"Last-Translator: Ozzie Isaacs\n" +"Language: de\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134 +#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27 +msgid "not installed" +msgstr "Nicht installiert" + +#: cps/converter.py:22 cps/converter.py:38 +msgid "Excecution permissions missing" +msgstr "Ausführungsberechtigung nicht vorhanden" + +#: cps/converter.py:48 +msgid "not configured" +msgstr "Nicht konfiguriert" + +#: cps/helper.py:58 +#, python-format +msgid "%(format)s format not found for book id: %(book)d" +msgstr "%(format)s Format nicht gefunden bei Buch ID %(book)d" + +#: cps/helper.py:70 +#, python-format +msgid "%(format)s not found on Google Drive: %(fn)s" +msgstr "%(format)s von Buch %(fn)s nicht auf Google Drive gefunden" + +#: cps/helper.py:77 cps/helper.py:147 cps/templates/detail.html:44 +msgid "Send to Kindle" +msgstr "An Kindle senden" + +#: cps/helper.py:78 cps/helper.py:96 +msgid "This e-mail has been sent via Calibre-Web." +msgstr "Diese E-Mail wurde durch Calibre-Web versendet." + +#: cps/helper.py:89 +#, python-format +msgid "%(format)s not found: %(fn)s" +msgstr "%(format)s nicht gefunden: %(fn)s" + +#: cps/helper.py:94 +msgid "Calibre-Web test e-mail" +msgstr "Calibre-Web Test E-Mail" + +#: cps/helper.py:95 +msgid "Test e-mail" +msgstr "Test E-Mail" + +#: cps/helper.py:111 +msgid "Get Started with Calibre-Web" +msgstr "Loslegen mit Calibre-Web" + +#: cps/helper.py:112 +#, python-format +msgid "Registration e-mail for user: %(name)s" +msgstr "Registrierungs E-Mail für Benutzer %(name)s" + +#: cps/helper.py:135 cps/helper.py:145 +msgid "Could not find any formats suitable for sending by e-mail" +msgstr "Es konnten keine passenden Formate für das Versenden per E-Mail gefunden werden" + +#: cps/helper.py:148 +#, python-format +msgid "E-mail: %(book)s" +msgstr "E-Mail: %(book)s" + +#: cps/helper.py:150 +msgid "The requested file could not be read. Maybe wrong permissions?" +msgstr "Die angeforderte Datei konnte nicht gelesen werden. Evtl. falsche Zugriffsrechte?" + +#: cps/helper.py:250 +#, python-format +msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "Umbenennen des Titelpfades '%(src)s' nach '%(dest)s' schlug fehl: %(error)s" + +#: cps/helper.py:259 +#, python-format +msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "Umbenennen des Authorpfades '%(src)s' nach '%(dest)s' schlug fehl: %(error)s" + +#: cps/helper.py:281 cps/helper.py:290 +#, python-format +msgid "File %(file)s not found on Google Drive" +msgstr "Datei %(file)s wurde nicht auf Google Drive gefunden" + +#: cps/helper.py:308 +#, python-format +msgid "Book path %(path)s not found on Google Drive" +msgstr "Buchpfad %(path)s wurde nicht auf Google Drive gefunden" + +#: cps/helper.py:565 +msgid "Error excecuting UnRar" +msgstr "Fehler bei der Ausführung von UnRar" + +#: cps/helper.py:567 +msgid "Unrar binary file not found" +msgstr "UnRar Datei nicht gefunden" + +#: cps/helper.py:609 +msgid "Waiting" +msgstr "Wartend" + +#: cps/helper.py:611 +msgid "Failed" +msgstr "Fehlgeschlagen" + +#: cps/helper.py:613 +msgid "Started" +msgstr "Gestartet" + +#: cps/helper.py:615 +msgid "Finished" +msgstr "Beendet" + +#: cps/helper.py:617 +msgid "Unknown Status" +msgstr "Unbekannter Status" + +#: cps/helper.py:622 +msgid "E-mail: " +msgstr "E-Mail: " + +#: cps/helper.py:624 cps/helper.py:628 +msgid "Convert: " +msgstr "Konvertiere: " + +#: cps/helper.py:626 +msgid "Upload: " +msgstr "Upload: " + +#: cps/helper.py:630 +msgid "Unknown Task: " +msgstr "Unbekannte Aufgabe" + +#: cps/web.py:1132 cps/web.py:2842 +msgid "Unknown" +msgstr "Unbekannt" + +#: cps/web.py:1141 cps/web.py:1172 cps/web.py:1257 +msgid "HTTP Error" +msgstr "HTTP Fehler" + +#: cps/web.py:1143 cps/web.py:1174 cps/web.py:1258 +msgid "Connection error" +msgstr "Verbindungsfehler" + +#: cps/web.py:1145 cps/web.py:1176 cps/web.py:1259 +msgid "Timeout while establishing connection" +msgstr "Timeout beim Verbindungsaufbau" + +#: cps/web.py:1147 cps/web.py:1178 cps/web.py:1260 +msgid "General error" +msgstr "Allgemeiner Fehler" + +#: cps/web.py:1153 +msgid "Unexpected data while reading update information" +msgstr "Updateinformationen enthalten unbekannte Daten" + +#: cps/web.py:1160 +msgid "No update available. You already have the latest version installed" +msgstr "Kein Update verfügbar. Es ist bereits die aktuellste Version installiert" + +#: cps/web.py:1185 +msgid "A new update is available. Click on the button below to update to the latest version." +msgstr "Es sind Updates verfügbar. Klicke auf den Button unten, um auf die aktuelle Version zu aktualisieren." + +#: cps/web.py:1235 +msgid "Could not fetch update information" +msgstr "Update Informationen konnten nicht geladen werden" + +#: cps/web.py:1250 +msgid "Requesting update package" +msgstr "Frage Update Paket an" + +#: cps/web.py:1251 +msgid "Downloading update package" +msgstr "Lade Update Paket herunter" + +#: cps/web.py:1252 +msgid "Unzipping update package" +msgstr "Entpacke Update Paket" + +#: cps/web.py:1253 +msgid "Replacing files" +msgstr "Ersetze Dateien" + +#: cps/web.py:1254 +msgid "Database connections are closed" +msgstr "Schließe Datenbankverbindungen" + +#: cps/web.py:1255 +msgid "Stopping server" +msgstr "Stoppe Server" + +#: cps/web.py:1256 +msgid "Update finished, please press okay and reload page" +msgstr "Update abgeschlossen, bitte okay drücken und Seite neu laden" + +#: cps/web.py:1257 cps/web.py:1258 cps/web.py:1259 cps/web.py:1260 +msgid "Update failed:" +msgstr "Update fehlgeschlagen:" + +#: cps/web.py:1283 +msgid "Recently Added Books" +msgstr "Kürzlich hinzugefügte Bücher" + +#: cps/web.py:1293 +msgid "Newest Books" +msgstr "Neueste Bücher" + +#: cps/web.py:1305 +msgid "Oldest Books" +msgstr "Älteste Bücher" + +#: cps/web.py:1317 +msgid "Books (A-Z)" +msgstr "Bücher (A-Z)" + +#: cps/web.py:1328 +msgid "Books (Z-A)" +msgstr "Bücher (Z-A)" + +#: cps/web.py:1357 +msgid "Hot Books (most downloaded)" +msgstr "Beliebte Bücher (die meisten Downloads)" + +#: cps/web.py:1370 +msgid "Best rated books" +msgstr "Best bewertete Bücher" + +#: cps/templates/index.xml:39 cps/web.py:1383 +msgid "Random Books" +msgstr "Zufällige Bücher" + +#: cps/web.py:1398 +msgid "Author list" +msgstr "Autorenliste" + +#: cps/web.py:1410 cps/web.py:1501 cps/web.py:1663 cps/web.py:2206 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "Buch öffnen fehlgeschlagen. Datei existiert nicht, oder ist nicht zugänglich." + +#: cps/web.py:1438 +msgid "Publisher list" +msgstr "Verlegerliste" + +#: cps/web.py:1452 +#, python-format +msgid "Publisher: %(name)s" +msgstr "Verleger: %(name)s" + +#: cps/templates/index.xml:83 cps/web.py:1484 +msgid "Series list" +msgstr "Liste Serien" + +#: cps/web.py:1499 +#, python-format +msgid "Series: %(serie)s" +msgstr "Serie: %(serie)s" + +#: cps/web.py:1528 +msgid "Available languages" +msgstr "Verfügbare Sprachen" + +#: cps/web.py:1548 +#, python-format +msgid "Language: %(name)s" +msgstr "Sprache: %(name)s" + +#: cps/templates/index.xml:76 cps/web.py:1559 +msgid "Category list" +msgstr "Kategorieliste" + +#: cps/web.py:1573 +#, python-format +msgid "Category: %(name)s" +msgstr "Kategorie: %(name)s" + +#: cps/templates/layout.html:71 cps/web.py:1699 +msgid "Tasks" +msgstr "Aufgaben" + +#: cps/web.py:1733 +msgid "Statistics" +msgstr "Statistiken" + +#: cps/web.py:1840 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "Callback Domain ist nicht verifiziert, bitte Domain in der Google Developer Console verifizieren" + +#: cps/web.py:1915 +msgid "Server restarted, please reload page" +msgstr "Server neu gestartet,bitte Seite neu laden" + +#: cps/web.py:1918 +msgid "Performing shutdown of server, please close window" +msgstr "Server wird runtergefahren, bitte Fenster schließen" + +#: cps/web.py:1937 +msgid "Update done" +msgstr "Update durchgeführt" + +#: cps/web.py:2007 +msgid "Published after " +msgstr "Herausgegeben nach dem " + +#: cps/web.py:2014 +msgid "Published before " +msgstr "Herausgegeben vor dem " + +#: cps/web.py:2028 +#, python-format +msgid "Rating <= %(rating)s" +msgstr "Bewertung <= %(rating)s" + +#: cps/web.py:2030 +#, python-format +msgid "Rating >= %(rating)s" +msgstr "Bewertung >= %(rating)s" + +#: cps/web.py:2089 cps/web.py:2098 +msgid "search" +msgstr "Suche" + +#: cps/templates/index.xml:47 cps/templates/index.xml:51 +#: cps/templates/layout.html:146 cps/web.py:2165 +msgid "Read Books" +msgstr "Gelesene Bücher" + +#: cps/templates/index.xml:55 cps/templates/index.xml:59 +#: cps/templates/layout.html:148 cps/web.py:2168 +msgid "Unread Books" +msgstr "Ungelesene Bücher" + +#: cps/web.py:2216 cps/web.py:2218 cps/web.py:2220 cps/web.py:2232 +msgid "Read a Book" +msgstr "Lese ein Buch" + +#: cps/web.py:2298 cps/web.py:3201 +msgid "Please fill out all fields!" +msgstr "Bitte alle Felder ausfüllen!" + +#: cps/web.py:2299 cps/web.py:2320 cps/web.py:2324 cps/web.py:2329 +#: cps/web.py:2331 +msgid "register" +msgstr "Registieren" + +#: cps/web.py:2319 cps/web.py:3417 +msgid "An unknown error occurred. Please try again later." +msgstr "Es ist ein unbekannter Fehler aufgetreten. Bitte später erneut versuchen." + +#: cps/web.py:2322 +msgid "Your e-mail is not allowed to register" +msgstr "Diese E-Mail ist nicht für die Registrierung zugelassen" + +#: cps/web.py:2325 +msgid "Confirmation e-mail was send to your e-mail account." +msgstr "Eine Bestätigungs E-Mail wurde an den E-Mail Account versendet" + +#: cps/web.py:2328 +msgid "This username or e-mail address is already in use." +msgstr "Benutzername oder E-Mailadresse ist bereits in Verwendung." + +#: cps/web.py:2345 cps/web.py:2441 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "Du bist nun eingeloggt als '%(nickname)s'" + +#: cps/web.py:2350 +msgid "Wrong Username or Password" +msgstr "Falscher Benutzername oder Passwort" + +#: cps/web.py:2356 cps/web.py:2377 +msgid "login" +msgstr "Login" + +#: cps/web.py:2389 cps/web.py:2420 +msgid "Token not found" +msgstr "Token wurde nicht gefunden" + +#: cps/web.py:2397 cps/web.py:2428 +msgid "Token has expired" +msgstr "Das Token ist abgelaufen" + +#: cps/web.py:2405 +msgid "Success! Please return to your device" +msgstr "Erfolg! Bitte zum Gerät zurückkehren" + +#: cps/web.py:2455 +msgid "Please configure the SMTP mail settings first..." +msgstr "Bitte zuerst die SMTP Mail Einstellung konfigurieren ..." + +#: cps/web.py:2459 +#, python-format +msgid "Book successfully queued for sending to %(kindlemail)s" +msgstr "Buch erfolgreich zum Senden an %(kindlemail)s eingereiht" + +#: cps/web.py:2463 +#, python-format +msgid "There was an error sending this book: %(res)s" +msgstr "Beim Senden des Buchs trat ein Fehler auf: %(res)s" + +#: cps/web.py:2465 cps/web.py:3255 +msgid "Please configure your kindle e-mail address first..." +msgstr "Bitte zuerst die Kindle E-Mailadresse konfigurieren..." + +#: cps/web.py:2476 cps/web.py:2528 +msgid "Invalid shelf specified" +msgstr "Ungültiges Bücherregal angegeben" + +#: cps/web.py:2483 +#, python-format +msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" +msgstr "Keine Erlaubnis ein Buch zum Bücherregale %(shelfname)s hinzuzufügen vorhanden" + +#: cps/web.py:2491 +msgid "You are not allowed to edit public shelves" +msgstr "Keine Erlaubnis öffentliche Bücherregale zu editieren vorhanden" + +#: cps/web.py:2500 +#, python-format +msgid "Book is already part of the shelf: %(shelfname)s" +msgstr "Buch ist bereits Teil des Bücherregals %(shelfname)s" + +#: cps/web.py:2514 +#, python-format +msgid "Book has been added to shelf: %(sname)s" +msgstr "Das Buch wurde dem Bücherregal: %(sname)s hinzugefügt" + +#: cps/web.py:2533 +#, python-format +msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgstr "Keine Erlaubnis ein Buch zum Bücherregal %(name)s hinzuzufügen" + +#: cps/web.py:2538 +msgid "User is not allowed to edit public shelves" +msgstr "Benutzer hat keine Erlaubnis öffentliche Bücherregale zu editieren" + +#: cps/web.py:2556 +#, python-format +msgid "Books are already part of the shelf: %(name)s" +msgstr "Bücher sind bereits Teil des Bücherregals %(name)s" + +#: cps/web.py:2570 +#, python-format +msgid "Books have been added to shelf: %(sname)s" +msgstr "Bücher wurden zum Bücherregal %(sname)s hinzugefügt" + +#: cps/web.py:2572 +#, python-format +msgid "Could not add books to shelf: %(sname)s" +msgstr "Bücher konnten nicht zum Bücherregal %(sname)s hinzugefügt werden" + +#: cps/web.py:2609 +#, python-format +msgid "Book has been removed from shelf: %(sname)s" +msgstr "Das Buch wurde aus dem Bücherregal: %(sname)s entfernt" + +#: cps/web.py:2615 +#, python-format +msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgstr "Keine Erlaubnis das Buch aus dem Bücherregal %(sname)s zu entfernen" + +#: cps/web.py:2635 cps/web.py:2659 +#, python-format +msgid "A shelf with the name '%(title)s' already exists." +msgstr "Es existiert bereits ein Bücheregal mit dem Titel '%(title)s'" + +#: cps/web.py:2640 +#, python-format +msgid "Shelf %(title)s created" +msgstr "Bücherregal %(title)s erzeugt" + +#: cps/web.py:2642 cps/web.py:2670 +msgid "There was an error" +msgstr "Es trat ein Fehler auf" + +#: cps/web.py:2643 cps/web.py:2645 +msgid "create a shelf" +msgstr "Bücherregal erzeugen" + +#: cps/web.py:2668 +#, python-format +msgid "Shelf %(title)s changed" +msgstr "Bücherregal %(title)s verändert" + +#: cps/web.py:2671 cps/web.py:2673 +msgid "Edit a shelf" +msgstr "Bücherregal editieren" + +#: cps/web.py:2694 +#, python-format +msgid "successfully deleted shelf %(name)s" +msgstr "Bücherregal %(name)s erfolgreich gelöscht" + +#: cps/web.py:2721 +#, python-format +msgid "Shelf: '%(name)s'" +msgstr "Bücherregal: '%(name)s'" + +#: cps/web.py:2724 +msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "Fehler beim Öffnen. Bücherregel exisitert nicht oder ist nicht zugänglich" + +#: cps/web.py:2755 +#, python-format +msgid "Change order of Shelf: '%(name)s'" +msgstr "Reihenfolge in Bücherregal '%(name)s' verändern" + +#: cps/web.py:2784 cps/web.py:3207 +msgid "E-mail is not from valid domain" +msgstr "E-Mail ist nicht Teil einer gültigen Domain" + +#: cps/web.py:2786 cps/web.py:2829 cps/web.py:2832 +#, python-format +msgid "%(name)s's profile" +msgstr "%(name)s's Profil" + +#: cps/web.py:2827 +msgid "Found an existing account for this e-mail address." +msgstr "Es exisitert bereits ein Benutzer für diese E-Mailadresse" + +#: cps/web.py:2830 +msgid "Profile updated" +msgstr "Profil aktualisiert" + +#: cps/web.py:2858 +msgid "Admin page" +msgstr "Admin Seite" + +#: cps/web.py:2938 cps/web.py:3112 +msgid "Calibre-Web configuration updated" +msgstr "Calibre-Web Konfiguration wurde aktualisiert" + +#: cps/templates/admin.html:100 cps/web.py:2951 +msgid "UI Configuration" +msgstr "Konfiguration Benutzeroberfläche" + +#: cps/web.py:2969 +msgid "Import of optional Google Drive requirements missing" +msgstr "Optionale Abhängigkeiten für Google Drive fehlen" + +#: cps/web.py:2972 +msgid "client_secrets.json is missing or not readable" +msgstr "client_secrets.json nicht vorhanden, oder nicht lesbar" + +#: cps/web.py:2977 cps/web.py:3004 +msgid "client_secrets.json is not configured for web application" +msgstr "client_secrets.json nicht als Webapplication konfiguriert" + +#: cps/templates/admin.html:99 cps/web.py:3007 cps/web.py:3033 cps/web.py:3045 +#: cps/web.py:3088 cps/web.py:3103 cps/web.py:3120 cps/web.py:3127 +#: cps/web.py:3142 +msgid "Basic Configuration" +msgstr "Basis Konfiguration" + +#: cps/web.py:3030 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "SSL-Keydatei Speicherort ist ungültig, bitte gültigen Pfad angeben" + +#: cps/web.py:3042 +msgid "Certfile location is not valid, please enter correct path" +msgstr "SSL-Certdatei Speicherort ist ungültig, bitte gültigen Pfad angeben" + +#: cps/web.py:3085 +msgid "Logfile location is not valid, please enter correct path" +msgstr "Speicherort Logdatei ist ungültig, bitte Pfad korrigieren" + +#: cps/web.py:3124 +msgid "DB location is not valid, please enter correct path" +msgstr "DB Speicherort ist ungültig, bitte Pfad korrigieren" + +#: cps/templates/admin.html:33 cps/web.py:3203 cps/web.py:3209 cps/web.py:3225 +msgid "Add new user" +msgstr "Neuen Benutzer hinzufügen" + +#: cps/web.py:3215 +#, python-format +msgid "User '%(user)s' created" +msgstr "Benutzer '%(user)s' angelegt" + +#: cps/web.py:3219 +msgid "Found an existing account for this e-mail address or nickname." +msgstr "Es exisitert bereits ein Account für diese E-Mailadresse oder Benutzernamen" + +#: cps/web.py:3243 cps/web.py:3257 +msgid "E-mail server settings updated" +msgstr "E-Mail Server Einstellungen aktualisiert" + +#: cps/web.py:3250 +#, python-format +msgid "Test e-mail successfully send to %(kindlemail)s" +msgstr "Test E-Mail wurde erfolgreich an %(kindlemail)s versendet" + +#: cps/web.py:3253 +#, python-format +msgid "There was an error sending the Test e-mail: %(res)s" +msgstr "Es trat ein Fehler beim Versenden der Test E-Mail auf: %(res)s" + +#: cps/web.py:3258 +msgid "Edit e-mail server settings" +msgstr "E-Mail Server Einstellungen bearbeiten" + +#: cps/web.py:3283 +#, python-format +msgid "User '%(nick)s' deleted" +msgstr "Benutzer '%(nick)s' gelöscht" + +#: cps/web.py:3392 +#, python-format +msgid "User '%(nick)s' updated" +msgstr "Benutzer '%(nick)s' aktualisiert" + +#: cps/web.py:3395 +msgid "An unknown error occured." +msgstr "Es ist ein unbekanter Fehler aufgetreten" + +#: cps/web.py:3397 +#, python-format +msgid "Edit User %(nick)s" +msgstr "Benutzer %(nick)s bearbeiten" + +#: cps/web.py:3414 +#, python-format +msgid "Password for user %(user)s reset" +msgstr "Passwort für Benutzer %(user)s wurde zurückgesetzt" + +#: cps/web.py:3428 cps/web.py:3629 +msgid "Error opening eBook. File does not exist or file is not accessible" +msgstr "Buch öffnen fehlgeschlagen. Datei existiert nicht, oder ist nicht zugänglich" + +#: cps/web.py:3453 cps/web.py:3912 +msgid "edit metadata" +msgstr "Metadaten editieren" + +#: cps/web.py:3546 cps/web.py:3782 +#, python-format +msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" +msgstr "Dateiendung '%(ext)s' kann nicht auf diesen Server hochgeladen werden" + +#: cps/web.py:3550 cps/web.py:3786 +msgid "File to be uploaded must have an extension" +msgstr "Dateien müssen eine Erweiterung haben, um hochgeladen zu werden" + +#: cps/web.py:3562 cps/web.py:3806 +#, python-format +msgid "Failed to create path %(path)s (Permission denied)." +msgstr "Fehler beim Erzeugen des Pfads %(path)s (Zugriff verweigert)" + +#: cps/web.py:3567 +#, python-format +msgid "Failed to store file %(file)s." +msgstr "Fehler beim speichern der Datei %(file)s." + +#: cps/web.py:3583 +#, python-format +msgid "File format %(ext)s added to %(book)s" +msgstr "Dateiformat %(ext)s zu %(book)s hinzugefügt" + +#: cps/web.py:3601 +#, python-format +msgid "Failed to create path for cover %(path)s (Permission denied)." +msgstr "Fehler beim Erzeugen des Pfads für das Cover %(path)s (Zugriff verweigert)" + +#: cps/web.py:3608 +#, python-format +msgid "Failed to store cover-file %(cover)s." +msgstr "Fehler beim Speichern des Covers %(cover)s." + +#: cps/web.py:3611 +msgid "Cover-file is not a valid image file" +msgstr "Cover-Datei ist keine gültige Bilddatei" + +#: cps/web.py:3641 cps/web.py:3650 cps/web.py:3654 +msgid "unknown" +msgstr "Unbekannt" + +#: cps/web.py:3673 +msgid "Cover is not a jpg file, can't save" +msgstr "Cover ist keine JPG Datei, konnte nicht gespeichert werden" + +#: cps/web.py:3721 +#, python-format +msgid "%(langname)s is not a valid language" +msgstr "%(langname)s ist keine gültige Sprache" + +#: cps/web.py:3752 +msgid "Metadata successfully updated" +msgstr "Metadaten wurden erfolgreich aktualisiert" + +#: cps/web.py:3761 +msgid "Error editing book, please check logfile for details" +msgstr "Fehler beim Editieren des Buchs, Details im Logfile" + +#: cps/web.py:3811 +#, python-format +msgid "Failed to store file %(file)s (Permission denied)." +msgstr "Fehler beim speichern der Datei %(file)s (Zugriff verweigert)" + +#: cps/web.py:3816 +#, python-format +msgid "Failed to delete file %(file)s (Permission denied)." +msgstr "Fehler beim Löschen von Datei %(file)s (Zugriff verweigert)" + +#: cps/web.py:3898 +#, python-format +msgid "File %(file)s uploaded" +msgstr "Datei %(file)s hochgeladen" + +#: cps/web.py:3928 +msgid "Source or destination format for conversion missing" +msgstr "Quell- oder Zielformat für Konvertierung fehlt" + +#: cps/web.py:3938 +#, python-format +msgid "Book successfully queued for converting to %(book_format)s" +msgstr "Buch wurde erfolgreich für die Konvertierung in das %(book_format)s Format eingereiht" + +#: cps/web.py:3942 +#, python-format +msgid "There was an error converting this book: %(res)s" +msgstr "Es trat ein Fehlker beim Konvertieren des Buches auf: %(res)s" + +#: cps/worker.py:287 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Fehler EBook-converter: %(error)s" + +#: cps/worker.py:298 +#, python-format +msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" +msgstr "Kindlegen Aufruf mit Fehler %(error)s. Text: %(message)s fehlgeschlagen " + +#: cps/templates/admin.html:6 +msgid "User list" +msgstr "Benutzerliste" + +#: cps/templates/admin.html:9 +msgid "Nickname" +msgstr "Benutzername" + +#: cps/templates/admin.html:10 +msgid "E-mail" +msgstr "E-Mail" + +#: cps/templates/admin.html:11 +msgid "Kindle" +msgstr "Kindle" + +#: cps/templates/admin.html:12 +msgid "DLS" +msgstr "DLS" + +#: cps/templates/admin.html:13 cps/templates/layout.html:74 +msgid "Admin" +msgstr "Admin" + +#: cps/templates/admin.html:14 cps/templates/detail.html:22 +#: cps/templates/detail.html:31 +msgid "Download" +msgstr "Download" + +#: cps/templates/admin.html:15 cps/templates/layout.html:64 +msgid "Upload" +msgstr "Hochladen" + +#: cps/templates/admin.html:16 +msgid "Edit" +msgstr "Editieren" + +#: cps/templates/admin.html:39 +msgid "SMTP e-mail server settings" +msgstr "SMTP E-Mail Server Einstellungen" + +#: cps/templates/admin.html:42 cps/templates/email_edit.html:11 +msgid "SMTP hostname" +msgstr "SMTP Hostname" + +#: cps/templates/admin.html:43 +msgid "SMTP port" +msgstr "SMTP Port" + +#: cps/templates/admin.html:44 +msgid "SSL" +msgstr "SSL" + +#: cps/templates/admin.html:45 cps/templates/email_edit.html:27 +msgid "SMTP login" +msgstr "SMTP Login" + +#: cps/templates/admin.html:46 +msgid "From mail" +msgstr "Absenderadresse" + +#: cps/templates/admin.html:56 +msgid "Change SMTP settings" +msgstr "SMTP Einstellungen ändern" + +#: cps/templates/admin.html:62 +msgid "Configuration" +msgstr "Konfiguration" + +#: cps/templates/admin.html:65 +msgid "Calibre DB dir" +msgstr "Calibre DB Pfad" + +#: cps/templates/admin.html:69 +msgid "Log level" +msgstr "Log Level" + +#: cps/templates/admin.html:73 +msgid "Port" +msgstr "Port" + +#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23 +msgid "Books per page" +msgstr "Bücher pro Seite" + +#: cps/templates/admin.html:83 +msgid "Uploading" +msgstr "Hochladen" + +#: cps/templates/admin.html:87 +msgid "Anonymous browsing" +msgstr "Anonymes Browsen" + +#: cps/templates/admin.html:91 +msgid "Public registration" +msgstr "Öffentliche Registrierung" + +#: cps/templates/admin.html:95 cps/templates/remote_login.html:4 +msgid "Remote login" +msgstr "Remote Login" + +#: cps/templates/admin.html:106 +msgid "Administration" +msgstr "Administration" + +#: cps/templates/admin.html:107 +msgid "Reconnect to Calibre DB" +msgstr "Calibre-DB neu verbinden" + +#: cps/templates/admin.html:108 +msgid "Restart Calibre-Web" +msgstr "Calibre-Web Neustarten" + +#: cps/templates/admin.html:109 +msgid "Stop Calibre-Web" +msgstr "Stoppe Calibre-Web" + +#: cps/templates/admin.html:115 +msgid "Update" +msgstr "Update" + +#: cps/templates/admin.html:119 +msgid "Version" +msgstr "Version" + +#: cps/templates/admin.html:120 +msgid "Details" +msgstr "Details" + +#: cps/templates/admin.html:126 +msgid "Current version" +msgstr "Aktuelle Version" + +#: cps/templates/admin.html:132 +msgid "Check for update" +msgstr "Suche nach Update" + +#: cps/templates/admin.html:133 +msgid "Perform Update" +msgstr "Update durchführen" + +#: cps/templates/admin.html:145 +msgid "Do you really want to restart Calibre-Web?" +msgstr "Calibre-Web wirklich neustarten?" + +#: cps/templates/admin.html:150 cps/templates/admin.html:164 +#: cps/templates/admin.html:184 cps/templates/shelf.html:61 +msgid "Ok" +msgstr "Ok" + +#: cps/templates/admin.html:151 cps/templates/admin.html:165 +#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200 +#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168 +#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75 +#: cps/templates/shelf.html:62 cps/templates/shelf_edit.html:19 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155 +msgid "Back" +msgstr "Zurück" + +#: cps/templates/admin.html:163 +msgid "Do you really want to stop Calibre-Web?" +msgstr "Calibre-Web wirklich stoppen" + +#: cps/templates/admin.html:175 +msgid "Updating, please do not reload page" +msgstr "Updatevorgang, bitte Seite nicht neu laden" + +#: cps/templates/author.html:15 +msgid "via" +msgstr "via" + +#: cps/templates/author.html:23 +msgid "In Library" +msgstr "In Bibliothek" + +#: cps/templates/author.html:69 +msgid "More by" +msgstr "Mehr von" + +#: cps/templates/book_edit.html:16 +msgid "Delete Book" +msgstr "Buch löschen" + +#: cps/templates/book_edit.html:19 +msgid "Delete formats:" +msgstr "Lösche Formate:" + +#: cps/templates/book_edit.html:22 cps/templates/book_edit.html:199 +#: cps/templates/email_edit.html:73 cps/templates/email_edit.html:74 +msgid "Delete" +msgstr "Löschen" + +#: cps/templates/book_edit.html:30 +msgid "Convert book format:" +msgstr "Konvertiere Buch Format:" + +#: cps/templates/book_edit.html:34 +msgid "Convert from:" +msgstr "Konvertiere von:" + +#: cps/templates/book_edit.html:36 cps/templates/book_edit.html:43 +msgid "select an option" +msgstr "Wähle eine Option" + +#: cps/templates/book_edit.html:41 +msgid "Convert to:" +msgstr "Konvertiere nach" + +#: cps/templates/book_edit.html:50 +msgid "Convert book" +msgstr "Konvertiere Buch" + +#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6 +msgid "Book Title" +msgstr "Buchtitel" + +#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:259 +#: cps/templates/book_edit.html:277 cps/templates/search_form.html:10 +msgid "Author" +msgstr "Autor" + +#: cps/templates/book_edit.html:67 cps/templates/book_edit.html:264 +#: cps/templates/book_edit.html:279 cps/templates/search_form.html:106 +msgid "Description" +msgstr "Beschreibung" + +#: cps/templates/book_edit.html:71 cps/templates/search_form.html:33 +msgid "Tags" +msgstr "Tags" + +#: cps/templates/book_edit.html:75 cps/templates/layout.html:157 +#: cps/templates/search_form.html:53 +msgid "Series" +msgstr "Serien" + +#: cps/templates/book_edit.html:79 +msgid "Series id" +msgstr "Serien ID" + +#: cps/templates/book_edit.html:83 +msgid "Rating" +msgstr "Bewertung" + +#: cps/templates/book_edit.html:87 +msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +msgstr "Cover URL (jpg, Cover wird heruntergeladen und in der Datenbank gespeichert, Feld erscheint anschließend wieder leer)" + +#: cps/templates/book_edit.html:91 +msgid "Upload Cover from local drive" +msgstr "Cover von lokalem Laufwerk hinzufügen" + +#: cps/templates/book_edit.html:96 cps/templates/detail.html:135 +msgid "Publishing date" +msgstr "Herausgabedatum" + +#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:278 cps/templates/detail.html:127 +#: cps/templates/search_form.html:14 +msgid "Publisher" +msgstr "Herausgeber" + +#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31 +msgid "Language" +msgstr "Sprache" + +#: cps/templates/book_edit.html:117 cps/templates/search_form.html:117 +msgid "Yes" +msgstr "Ja" + +#: cps/templates/book_edit.html:118 cps/templates/search_form.html:118 +msgid "No" +msgstr "Nein" + +#: cps/templates/book_edit.html:164 +msgid "Upload format" +msgstr "Format hochladen" + +#: cps/templates/book_edit.html:173 +msgid "view book after edit" +msgstr "Buch nach Bearbeitung ansehen" + +#: cps/templates/book_edit.html:176 cps/templates/book_edit.html:212 +msgid "Get metadata" +msgstr "Metadaten laden" + +#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210 +#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20 +#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17 +#: cps/templates/user_edit.html:153 +msgid "Submit" +msgstr "Abschicken" + +#: cps/templates/book_edit.html:191 +msgid "Are you really sure?" +msgstr "Sicher?" + +#: cps/templates/book_edit.html:194 +msgid "Book will be deleted from Calibre database" +msgstr "Das Buch wird aus der Calibre Datenbank" + +#: cps/templates/book_edit.html:195 +msgid "and from hard disk" +msgstr "und von der Festplatte gelöscht" + +#: cps/templates/book_edit.html:215 +msgid "Keyword" +msgstr "Suchbegriff" + +#: cps/templates/book_edit.html:216 +msgid " Search keyword " +msgstr "Suchbegriff" + +#: cps/templates/book_edit.html:218 cps/templates/layout.html:46 +msgid "Go!" +msgstr "Los!" + +#: cps/templates/book_edit.html:222 +msgid "Click the cover to load metadata to the form" +msgstr "Klicke auf das Bild um die Metadaten zu übertragen" + +#: cps/templates/book_edit.html:234 cps/templates/book_edit.html:274 +msgid "Loading..." +msgstr "Lade..." + +#: cps/templates/book_edit.html:239 cps/templates/layout.html:224 +msgid "Close" +msgstr "Schließen" + +#: cps/templates/book_edit.html:266 cps/templates/book_edit.html:280 +msgid "Source" +msgstr "Quelle" + +#: cps/templates/book_edit.html:275 +msgid "Search error!" +msgstr "Fehler bei Suche!" + +#: cps/templates/book_edit.html:276 +msgid "No Result(s) found! Please try aonther keyword." +msgstr "Keine Ergebnisse gefunden! Bitte ein anderes Schlüsselwort benutzen" + +#: cps/templates/config_edit.html:12 +msgid "Library Configuration" +msgstr "Bibliothekskonfiguration" + +#: cps/templates/config_edit.html:19 +msgid "Location of Calibre database" +msgstr "Speicherort der Calibre Datenbank" + +#: cps/templates/config_edit.html:24 +msgid "Use Google Drive?" +msgstr "Google Drive benutzen" + +#: cps/templates/config_edit.html:30 +msgid "Google Drive config problem" +msgstr "Google Drive Konfigurationsproblem" + +#: cps/templates/config_edit.html:36 +msgid "Authenticate Google Drive" +msgstr "Google Drive authentifizieren" + +#: cps/templates/config_edit.html:40 +msgid "Please finish Google Drive setup after login" +msgstr "Bitte Google Drive Konfiguration nach Login beenden" + +#: cps/templates/config_edit.html:44 +msgid "Google Drive Calibre folder" +msgstr "Google Drive Calibre Ordner" + +#: cps/templates/config_edit.html:52 +msgid "Metadata Watch Channel ID" +msgstr "Matadata Überwachungs-ID" + +#: cps/templates/config_edit.html:55 +msgid "Revoke" +msgstr "Widerrufen" + +#: cps/templates/config_edit.html:73 +msgid "Server Configuration" +msgstr "Server Konfiguration" + +#: cps/templates/config_edit.html:80 +msgid "Server Port" +msgstr "Server Port" + +#: cps/templates/config_edit.html:84 +msgid "SSL certfile location (leave it empty for non-SSL Servers)" +msgstr "SSL Certdatei Speicherort (leerlassen für nicht SSL Server)" + +#: cps/templates/config_edit.html:88 +msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" +msgstr "SSL Keydatei Speicherort (leerlassen für nicht SSL Server)" + +#: cps/templates/config_edit.html:99 +msgid "Logfile Configuration" +msgstr "Konfiguration Logdatei" + +#: cps/templates/config_edit.html:106 +msgid "Log Level" +msgstr "Log Level" + +#: cps/templates/config_edit.html:115 +msgid "Location and name of logfile (calibre-web.log for no entry)" +msgstr "Position und Name des Logfiles (calibre-web.log bei keinem Eintrag)" + +#: cps/templates/config_edit.html:126 +msgid "Feature Configuration" +msgstr "Feature Konfiguration" + +#: cps/templates/config_edit.html:134 +msgid "Enable uploading" +msgstr "Hochladen aktivieren" + +#: cps/templates/config_edit.html:138 +msgid "Enable anonymous browsing" +msgstr "Anonymes Browsen aktivieren" + +#: cps/templates/config_edit.html:142 +msgid "Enable public registration" +msgstr "Öffentliche Registrierung aktivieren" + +#: cps/templates/config_edit.html:146 +msgid "Enable remote login (\"magic link\")" +msgstr "Remote Login aktivieren ('Magischer Link')" + +#: cps/templates/config_edit.html:151 +msgid "Use" +msgstr "Benutze" + +#: cps/templates/config_edit.html:152 +msgid "Obtain an API Key" +msgstr "Einen API Schlüssel erhalten" + +#: cps/templates/config_edit.html:156 +msgid "Goodreads API Key" +msgstr "Öffentlicher Goodreads API Schlüssel" + +#: cps/templates/config_edit.html:160 +msgid "Goodreads API Secret" +msgstr "eheimer Goodreads API Schlüssel" + +#: cps/templates/config_edit.html:173 +msgid "External binaries" +msgstr "Externe Programme" + +#: cps/templates/config_edit.html:181 +msgid "No converter" +msgstr "Kein Konverter" + +#: cps/templates/config_edit.html:183 +msgid "Use Kindlegen" +msgstr "Kindlegen benutzen" + +#: cps/templates/config_edit.html:185 +msgid "Use calibre's ebook converter" +msgstr "Benutze Calibre's Ebook Konverter" + +#: cps/templates/config_edit.html:189 +msgid "E-Book converter settings" +msgstr "E-Book Konverter Einstellungen" + +#: cps/templates/config_edit.html:193 +msgid "Path to convertertool" +msgstr "Pfad zu Konvertertool" + +#: cps/templates/config_edit.html:199 +msgid "Location of Unrar binary" +msgstr "Pfad zum UnRar Programm" + +#: cps/templates/config_edit.html:215 cps/templates/layout.html:82 +#: cps/templates/login.html:4 +msgid "Login" +msgstr "Login" + +#: cps/templates/config_view_edit.html:12 +msgid "View Configuration" +msgstr "Ansichtskonfiguration" + +#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 +#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 +msgid "Title" +msgstr "Titel" + +#: cps/templates/config_view_edit.html:27 +msgid "No. of random books to show" +msgstr "Anzahl Anzeige zufällige Bücher" + +#: cps/templates/config_view_edit.html:31 +msgid "Regular expression for ignoring columns" +msgstr "Regulärer Ausdruck um Spalten zu ignorien" + +#: cps/templates/config_view_edit.html:35 +msgid "Link read/unread status to Calibre column" +msgstr "Verknüpfe Gelesen Status mit Calibre Spalte" + +#: cps/templates/config_view_edit.html:44 +msgid "Regular expression for title sorting" +msgstr "Regulärer Ausdruck für Titelsortierung" + +#: cps/templates/config_view_edit.html:48 +msgid "Tags for Mature Content" +msgstr "Kategorien für Erwachsenencontent" + +#: cps/templates/config_view_edit.html:62 +msgid "Default settings for new users" +msgstr "Default Einstellungen für neue Benutzer" + +#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110 +msgid "Admin user" +msgstr "Admin Benutzer" + +#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119 +msgid "Allow Downloads" +msgstr "Downloads erlauben" + +#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123 +msgid "Allow Uploads" +msgstr "Uploads erlauben" + +#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127 +msgid "Allow Edit" +msgstr "Bearbeiten erlauben" + +#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131 +msgid "Allow Delete books" +msgstr "Bücher löschen erlauben" + +#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136 +msgid "Allow Changing Password" +msgstr "Passwort ändern erlauben" + +#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140 +msgid "Allow Editing Public Shelfs" +msgstr "Öffentliche Bücherregale editieren erlauben" + +#: cps/templates/config_view_edit.html:104 +msgid "Default visibilities for new users" +msgstr "Default Sichtbarkeiten für neue Benutzer" + +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58 +msgid "Show random books" +msgstr "Zeige Zufällige Bücher" + +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62 +msgid "Show recent books" +msgstr "Zeige kürzlich hinzugefügte Bücher" + +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66 +msgid "Show sorted books" +msgstr "Zeige Bücher sortiert" + +#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70 +msgid "Show hot books" +msgstr "Zeige Auswahl Beliebte Bücher" + +#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74 +msgid "Show best rated books" +msgstr "Zeige am besten bewertete Bücher" + +#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78 +msgid "Show language selection" +msgstr "Zeige Sprachauswahl" + +#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82 +msgid "Show series selection" +msgstr "Zeige Serienauswahl" + +#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86 +msgid "Show category selection" +msgstr "Zeige Kategorienauswahl" + +#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90 +msgid "Show author selection" +msgstr "Zeige Autorenauswahl" + +#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94 +msgid "Show publisher selection" +msgstr "Zeige Verleger Auswahl" + +#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98 +msgid "Show read and unread" +msgstr "Zeige Gelesen/Ungelesen Auswahl" + +#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102 +msgid "Show random books in detail view" +msgstr "Zeige zufällige Bücher in der Detailansicht" + +#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115 +msgid "Show mature content" +msgstr "Erwachsenencontent anzeigen" + +#: cps/templates/detail.html:49 +msgid "Read in browser" +msgstr "Im Browser lesen" + +#: cps/templates/detail.html:88 +msgid "Book" +msgstr "Buch" + +#: cps/templates/detail.html:88 +msgid "of" +msgstr "von" + +#: cps/templates/detail.html:94 +msgid "language" +msgstr "Sprache" + +#: cps/templates/detail.html:172 +msgid "Read" +msgstr "Gelesen" + +#: cps/templates/detail.html:182 +msgid "Description:" +msgstr "Beschreibung" + +#: cps/templates/detail.html:195 cps/templates/search.html:14 +msgid "Add to shelf" +msgstr "Zu Bücherregal hinzufügen" + +#: cps/templates/detail.html:257 +msgid "Edit metadata" +msgstr "Metadaten bearbeiten" + +#: cps/templates/email_edit.html:15 +msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +msgstr "SMTP port (normalerweise 25 für unverschlüsseltes SMTP, 465 für SSL und 587 für STARTTLS" + +#: cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "Verschlüsselung" + +#: cps/templates/email_edit.html:21 +msgid "None" +msgstr "Keine" + +#: cps/templates/email_edit.html:22 +msgid "STARTTLS" +msgstr "STARTTLS" + +#: cps/templates/email_edit.html:23 +msgid "SSL/TLS" +msgstr "SSL/TLS" + +#: cps/templates/email_edit.html:31 +msgid "SMTP password" +msgstr "SMTP Passwort" + +#: cps/templates/email_edit.html:35 +msgid "From e-mail" +msgstr "Absenderadresse" + +#: cps/templates/email_edit.html:38 +msgid "Save settings" +msgstr "Einstellungen speichern" + +#: cps/templates/email_edit.html:39 +msgid "Save settings and send Test E-Mail" +msgstr "Einstellungen speichern und Test E-Mail versenden" + +#: cps/templates/email_edit.html:43 +msgid "Allowed domains for registering" +msgstr "Erlaubte Domains für eine Registrierung" + +#: cps/templates/email_edit.html:47 +msgid "Enter domainname" +msgstr "Domainnamen eingeben" + +#: cps/templates/email_edit.html:55 +msgid "Add Domain" +msgstr "Domain hinzufügen" + +#: cps/templates/email_edit.html:58 +msgid "Add" +msgstr "Hinzufügen" + +#: cps/templates/email_edit.html:72 +msgid "Do you really want to delete this domain rule?" +msgstr "Soll diese Domain Regel wirklich gelöscht werden?" + +#: cps/templates/feed.xml:21 cps/templates/layout.html:208 +msgid "Next" +msgstr "Nächste" + +#: cps/templates/feed.xml:33 cps/templates/index.xml:11 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 +msgid "Search" +msgstr "Suche" + +#: cps/templates/index.html:5 +msgid "Discover (Random Books)" +msgstr "Entdecke (Zufälliges Buch)" + +#: cps/templates/index.xml:6 +msgid "Start" +msgstr "Start" + +#: cps/templates/index.xml:18 cps/templates/layout.html:139 +msgid "Hot Books" +msgstr "Beliebte Bücher" + +#: cps/templates/index.xml:22 +msgid "Popular publications from this catalog based on Downloads." +msgstr "Beliebte Publikationen aus dieser Bibliothek basierend auf Downloadzahlen" + +#: cps/templates/index.xml:25 cps/templates/layout.html:142 +msgid "Best rated Books" +msgstr "Best bewertete Bücher" + +#: cps/templates/index.xml:29 +msgid "Popular publications from this catalog based on Rating." +msgstr "Beliebte Veröffentlichungen dieses Katalogs basierend auf Bewertungen" + +#: cps/templates/index.xml:32 +msgid "New Books" +msgstr "Neue Bücher" + +#: cps/templates/index.xml:36 +msgid "The latest Books" +msgstr "Die neuesten Bücher" + +#: cps/templates/index.xml:43 +msgid "Show Random Books" +msgstr "Zeige zufällige Bücher" + +#: cps/templates/index.xml:62 cps/templates/layout.html:160 +msgid "Authors" +msgstr "Autoren" + +#: cps/templates/index.xml:66 +msgid "Books ordered by Author" +msgstr "Bücher nach Autoren sortiert" + +#: cps/templates/index.xml:69 cps/templates/layout.html:163 +msgid "Publishers" +msgstr "Verleger" + +#: cps/templates/index.xml:73 +msgid "Books ordered by publisher" +msgstr "Bücher nach Verlegern geordnet" + +#: cps/templates/index.xml:80 +msgid "Books ordered by category" +msgstr "Bücher nach Kategorien sortiert" + +#: cps/templates/index.xml:87 +msgid "Books ordered by series" +msgstr "Bücher nach Reihen geordnet" + +#: cps/templates/index.xml:90 cps/templates/layout.html:169 +msgid "Public Shelves" +msgstr "Öffentliche Bücherregale" + +#: cps/templates/index.xml:94 +msgid "Books organized in public shelfs, visible to everyone" +msgstr "Bücher organisiert in öffentlichem Bücherregal, sichtbar für jedermann" + +#: cps/templates/index.xml:98 cps/templates/layout.html:173 +msgid "Your Shelves" +msgstr "Deine Bücherregale" + +#: cps/templates/index.xml:102 +msgid "User's own shelfs, only visible to the current user himself" +msgstr "Persönliches Bücherregal des Benutzers, nur sichtbar für den aktuellen Benutzer" + +#: cps/templates/layout.html:33 +msgid "Toggle navigation" +msgstr "Nagivation umschalten" + +#: cps/templates/layout.html:54 +msgid "Advanced Search" +msgstr "Erweiterte Suche" + +#: cps/templates/layout.html:78 +msgid "Logout" +msgstr "Logout" + +#: cps/templates/layout.html:83 cps/templates/register.html:14 +msgid "Register" +msgstr "Registrieren" + +#: cps/templates/layout.html:108 +msgid "Uploading..." +msgstr "Hochladen..." + +#: cps/templates/layout.html:109 +msgid "please don't refresh the page" +msgstr "Bitte die Seite nicht neu laden" + +#: cps/templates/layout.html:120 +msgid "Browse" +msgstr "Browsen" + +#: cps/templates/layout.html:122 +msgid "Recently Added" +msgstr "Kürzlich hinzugefügt" + +#: cps/templates/layout.html:127 +msgid "Sorted Books" +msgstr "Bücher Sortiert" + +#: cps/templates/layout.html:131 cps/templates/layout.html:132 +#: cps/templates/layout.html:133 cps/templates/layout.html:134 +msgid "Sort By" +msgstr "Sortiert nach" + +#: cps/templates/layout.html:131 +msgid "Newest" +msgstr "Neueste" + +#: cps/templates/layout.html:132 +msgid "Oldest" +msgstr "Älteste" + +#: cps/templates/layout.html:133 +msgid "Ascending" +msgstr "Aufsteigend" + +#: cps/templates/layout.html:134 +msgid "Descending" +msgstr "Absteigend" + +#: cps/templates/layout.html:151 +msgid "Discover" +msgstr "Entdecke" + +#: cps/templates/layout.html:154 +msgid "Categories" +msgstr "Kategorien" + +#: cps/templates/layout.html:166 cps/templates/search_form.html:74 +msgid "Languages" +msgstr "Sprachen" + +#: cps/templates/layout.html:178 +msgid "Create a Shelf" +msgstr "Bücherregal erzeugen" + +#: cps/templates/layout.html:179 cps/templates/stats.html:3 +msgid "About" +msgstr "Über" + +#: cps/templates/layout.html:193 +msgid "Previous" +msgstr "Vorheriger" + +#: cps/templates/layout.html:220 +msgid "Book Details" +msgstr "Buchdetails" + +#: cps/templates/login.html:8 cps/templates/login.html:9 +#: cps/templates/register.html:7 cps/templates/user_edit.html:8 +msgid "Username" +msgstr "Benutzername" + +#: cps/templates/login.html:12 cps/templates/login.html:13 +#: cps/templates/user_edit.html:21 +msgid "Password" +msgstr "Passwort" + +#: cps/templates/login.html:17 +msgid "Remember me" +msgstr "Merken" + +#: cps/templates/login.html:22 +msgid "Log in with magic link" +msgstr "Einloggen mit magischem Link" + +#: cps/templates/osd.xml:5 +msgid "Calibre-Web ebook catalog" +msgstr "Calibre-Web E-Book Katalog" + +#: cps/templates/read.html:69 cps/templates/readcbr.html:79 +#: cps/templates/readcbr.html:103 +msgid "Settings" +msgstr "Einstellungen" + +#: cps/templates/read.html:72 +msgid "Reflow text when sidebars are open." +msgstr "Text umbrechen wenn Seitenleiste geöffnet ist" + +#: cps/templates/readcbr.html:84 +msgid "Keyboard Shortcuts" +msgstr "Tastatur Kürzel" + +#: cps/templates/readcbr.html:87 +msgid "Previous Page" +msgstr "Vorherige Seite" + +#: cps/templates/readcbr.html:88 +msgid "Next Page" +msgstr "Nächste Seite" + +#: cps/templates/readcbr.html:89 +msgid "Scale to Best" +msgstr "Optimale Skalierung" + +#: cps/templates/readcbr.html:90 +msgid "Scale to Width" +msgstr "Skaliere auf Breite" + +#: cps/templates/readcbr.html:91 +msgid "Scale to Height" +msgstr "Skaliere auf Höhe" + +#: cps/templates/readcbr.html:92 +msgid "Scale to Native" +msgstr "Skaliere 1:1" + +#: cps/templates/readcbr.html:93 +msgid "Rotate Right" +msgstr "Rechts rotieren" + +#: cps/templates/readcbr.html:94 +msgid "Rotate Left" +msgstr "Links rotieren" + +#: cps/templates/readcbr.html:95 +msgid "Flip Image" +msgstr "Bild umdrehen" + +#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39 +msgid "Theme" +msgstr "Theme" + +#: cps/templates/readcbr.html:111 +msgid "Light" +msgstr "Hell" + +#: cps/templates/readcbr.html:112 +msgid "Dark" +msgstr "Dunkel" + +#: cps/templates/readcbr.html:117 +msgid "Scale" +msgstr "Skalierung" + +#: cps/templates/readcbr.html:120 +msgid "Best" +msgstr "Beste" + +#: cps/templates/readcbr.html:121 +msgid "Width" +msgstr "Breite" + +#: cps/templates/readcbr.html:122 +msgid "Height" +msgstr "Höhe" + +#: cps/templates/readcbr.html:123 +msgid "Native" +msgstr "1:1" + +#: cps/templates/readcbr.html:128 +msgid "Rotate" +msgstr "Rotieren" + +#: cps/templates/readcbr.html:139 +msgid "Flip" +msgstr "Umdrehen" + +#: cps/templates/readcbr.html:142 +msgid "Horizontal" +msgstr "Horizontal" + +#: cps/templates/readcbr.html:143 +msgid "Vertical" +msgstr "Vertikal" + +#: cps/templates/readpdf.html:29 +msgid "PDF.js viewer" +msgstr "PDF.js Viewer" + +#: cps/templates/readtxt.html:6 +msgid "Basic txt Reader" +msgstr "Basis Txt Reader" + +#: cps/templates/register.html:4 +msgid "Register a new account" +msgstr "Neues Benutzerkonto erzeugen" + +#: cps/templates/register.html:8 +msgid "Choose a username" +msgstr "Wähle einen Benutzernamen" + +#: cps/templates/register.html:11 cps/templates/user_edit.html:13 +msgid "E-mail address" +msgstr "E-Mail Adresse" + +#: cps/templates/register.html:12 +msgid "Your email address" +msgstr "Deine E-Mail Adresse" + +#: cps/templates/remote_login.html:6 +msgid "Using your another device, visit" +msgstr "Benutze das andere Gerät und besuche" + +#: cps/templates/remote_login.html:6 +msgid "and log in" +msgstr "und logge Dich ein" + +#: cps/templates/remote_login.html:9 +msgid "Once you do so, you will automatically get logged in on this device." +msgstr "Danach wirst Du automatisch auf diesem Gerät eingeloggt sein" + +#: cps/templates/search.html:5 +msgid "No Results for:" +msgstr "Keine Ergebnisse für:" + +#: cps/templates/search.html:6 +msgid "Please try a different search" +msgstr "Versuche eine andere Suche" + +#: cps/templates/search.html:8 +msgid "Results for:" +msgstr "Ergebnisse für:" + +#: cps/templates/search_form.html:19 +msgid "Publishing date from" +msgstr "Herausgabedatum von" + +#: cps/templates/search_form.html:26 +msgid "Publishing date to" +msgstr "Herausgabedatum bis" + +#: cps/templates/search_form.html:43 +msgid "Exclude Tags" +msgstr "Tags ausschließen" + +#: cps/templates/search_form.html:63 +msgid "Exclude Series" +msgstr "Serie ausschließen" + +#: cps/templates/search_form.html:84 +msgid "Exclude Languages" +msgstr "Sprache ausschließen" + +#: cps/templates/search_form.html:97 +msgid "Rating bigger than" +msgstr "Bewertungen größer als" + +#: cps/templates/search_form.html:101 +msgid "Rating less than" +msgstr "Bewertungen kleiner als" + +#: cps/templates/shelf.html:7 +msgid "Delete this Shelf" +msgstr "Lösche dieses Bücherregal" + +#: cps/templates/shelf.html:8 +msgid "Edit Shelf" +msgstr "Bücherregal editieren" + +#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11 +msgid "Change order" +msgstr "Reihenfolge ändern" + +#: cps/templates/shelf.html:56 +msgid "Do you really want to delete the shelf?" +msgstr "Wirklich das Bücherregal löschen?" + +#: cps/templates/shelf.html:59 +msgid "Shelf will be lost for everybody and forever!" +msgstr "Das Bücherregal wird für alle und für immer gelöscht" + +#: cps/templates/shelf_edit.html:13 +msgid "should the shelf be public?" +msgstr "Soll das Bücherregal öffentlich sein?" + +#: cps/templates/shelf_order.html:5 +msgid "Drag 'n drop to rearrange order" +msgstr "Drag 'n drop um Reihenfolge zu ändern" + +#: cps/templates/stats.html:7 +msgid "Calibre library statistics" +msgstr "Calibre Bibliothek Statistiken" + +#: cps/templates/stats.html:12 +msgid "Books in this Library" +msgstr "Bücher in dieser Bibliothek" + +#: cps/templates/stats.html:16 +msgid "Authors in this Library" +msgstr "Autoren in dieser Bibliothek" + +#: cps/templates/stats.html:20 +msgid "Categories in this Library" +msgstr "Kategorien in dieser Bibliothek" + +#: cps/templates/stats.html:24 +msgid "Series in this Library" +msgstr "Serien in dieser Bibliothek" + +#: cps/templates/stats.html:28 +msgid "Linked libraries" +msgstr "Dynamische Bibliotheken" + +#: cps/templates/stats.html:32 +msgid "Program library" +msgstr "Programm Bibliotheken" + +#: cps/templates/stats.html:33 +msgid "Installed Version" +msgstr "Installierte Version" + +#: cps/templates/tasks.html:7 +msgid "Tasks list" +msgstr "Aufgabenliste" + +#: cps/templates/tasks.html:12 +msgid "User" +msgstr "Benutzer" + +#: cps/templates/tasks.html:14 +msgid "Task" +msgstr "Aufgabe" + +#: cps/templates/tasks.html:15 +msgid "Status" +msgstr "Status" + +#: cps/templates/tasks.html:16 +msgid "Progress" +msgstr "Fortschritt" + +#: cps/templates/tasks.html:17 +msgid "Runtime" +msgstr "Laufzeit" + +#: cps/templates/tasks.html:18 +msgid "Starttime" +msgstr "Startzeitpunkt" + +#: cps/templates/tasks.html:24 +msgid "Delete finished tasks" +msgstr "Lösche beendete Aufgaben" + +#: cps/templates/tasks.html:25 +msgid "Hide all tasks" +msgstr "Alle Aufgaben verstecken" + +#: cps/templates/user_edit.html:18 +msgid "Reset user Password" +msgstr "Benutzer Passwort zurücksetzen" + +#: cps/templates/user_edit.html:27 +msgid "Kindle E-Mail" +msgstr "Kindle E-Mail" + +#: cps/templates/user_edit.html:41 +msgid "Standard Theme" +msgstr "Standard Theme" + +#: cps/templates/user_edit.html:42 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "caliBlur! Dunkles Theme (Beta)" + +#: cps/templates/user_edit.html:47 +msgid "Show books with language" +msgstr "Zeige nur Bücher mit dieser Sprache" + +#: cps/templates/user_edit.html:49 +msgid "Show all" +msgstr "Zeige alle" + +#: cps/templates/user_edit.html:147 +msgid "Delete this user" +msgstr "Benutzer löschen" + +#: cps/templates/user_edit.html:162 +msgid "Recent Downloads" +msgstr "Letzte Downloads" + +#~ msgid "Current commit timestamp" +#~ msgstr "Aktuelles Commit Datum" + +#~ msgid "Newest commit timestamp" +#~ msgstr "Neuestes Commit Datum" + +#~ msgid "Convert: %(book)s" +#~ msgstr "Konvertiere: %(book)s" + +#~ msgid "Convert to %(format)s: %(book)s" +#~ msgstr "Konvertiere %(book)s in %(format)s: " + +#~ msgid "Files are replaced" +#~ msgstr "Ersetze Dateien" + +#~ msgid "Server is stopped" +#~ msgstr "Stoppe Server" + +#~ msgid "Convertertool %(converter)s not found" +#~ msgstr "Konvertertool %(converter)s nicht gefunden" + +#~ msgid "Choose a password" +#~ msgstr "Wähle ein Passwort" + diff --git a/src/cps/translations/es/LC_MESSAGES/messages.mo b/src/cps/translations/es/LC_MESSAGES/messages.mo new file mode 100644 index 0000000..0c96115 Binary files /dev/null and b/src/cps/translations/es/LC_MESSAGES/messages.mo differ diff --git a/src/cps/translations/es/LC_MESSAGES/messages.po b/src/cps/translations/es/LC_MESSAGES/messages.po new file mode 100644 index 0000000..785838a --- /dev/null +++ b/src/cps/translations/es/LC_MESSAGES/messages.po @@ -0,0 +1,1977 @@ +# Traducción al Español for Calibre-Web. +# Copyright (C) 2016 Smart Cities Community +# This file is distributed under the same license as the Calibre-Web +# Juan F. Villa , 2016. +# victorhck , 2018. +msgid "" +msgstr "" +"Project-Id-Version: Calibre-Web\n" +"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" +"POT-Creation-Date: 2018-11-03 14:03+0100\n" +"PO-Revision-Date: 2018-10-05 11:27+0100\n" +"Last-Translator: victorhck \n" +"Language: es\n" +"Language-Team: Spanish <>\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134 +#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27 +msgid "not installed" +msgstr "No instalado" + +#: cps/converter.py:22 cps/converter.py:38 +msgid "Excecution permissions missing" +msgstr "Permisos de ejecución ausentes" + +#: cps/converter.py:48 +msgid "not configured" +msgstr "" + +#: cps/helper.py:58 +#, python-format +msgid "%(format)s format not found for book id: %(book)d" +msgstr "%(format)s formato no encontrado para el id del libro: %(book)d" + +#: cps/helper.py:70 +#, python-format +msgid "%(format)s not found on Google Drive: %(fn)s" +msgstr "%(format)s no encontrado en Google Drive: %(fn)s" + +#: cps/helper.py:77 cps/helper.py:147 cps/templates/detail.html:44 +msgid "Send to Kindle" +msgstr "Enviar a Kindle" + +#: cps/helper.py:78 cps/helper.py:96 +msgid "This e-mail has been sent via Calibre-Web." +msgstr "Este correo electrónico ha sido enviado por Calibre-Web." + +#: cps/helper.py:89 +#, python-format +msgid "%(format)s not found: %(fn)s" +msgstr "%(format)s no encontrado: %(fn)s" + +#: cps/helper.py:94 +msgid "Calibre-Web test e-mail" +msgstr "Calibre-Web comprobar correo electrónico" + +#: cps/helper.py:95 +msgid "Test e-mail" +msgstr "Comprobar correo electrónico" + +#: cps/helper.py:111 +msgid "Get Started with Calibre-Web" +msgstr "Primeros pasos con Calibre-Web" + +#: cps/helper.py:112 +#, python-format +msgid "Registration e-mail for user: %(name)s" +msgstr "Registrar un correo electrónico para el usuario: %(name)s" + +#: cps/helper.py:135 cps/helper.py:145 +msgid "Could not find any formats suitable for sending by e-mail" +msgstr "No se pudo encontrar ningún formato adecuado para enviar por correo electrónico." + +#: cps/helper.py:148 +#, python-format +msgid "E-mail: %(book)s" +msgstr "Correo electrónico: %(book)s" + +#: cps/helper.py:150 +msgid "The requested file could not be read. Maybe wrong permissions?" +msgstr "El fichero solicitado no puede ser leído. ¿Quizás existen problemas con los permisos?" + +#: cps/helper.py:250 +#, python-format +msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "El renombrado del título de: '%(src)s' a '%(dest)s' falló con errores: %(error)s" + +#: cps/helper.py:259 +#, python-format +msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "El renombrado del autor de: '%(src)s' a '%(dest)s' falló con errores: %(error)s" + +#: cps/helper.py:281 cps/helper.py:290 +#, python-format +msgid "File %(file)s not found on Google Drive" +msgstr "Fichero %(file)s no encontrado en Google Drive" + +#: cps/helper.py:308 +#, python-format +msgid "Book path %(path)s not found on Google Drive" +msgstr "La ruta %(path)s del libro no fue encontrada en Google Drive" + +#: cps/helper.py:565 +msgid "Error excecuting UnRar" +msgstr "Error ejecutando UnRar" + +#: cps/helper.py:567 +msgid "Unrar binary file not found" +msgstr "Fichero binario Unrar no encontrado" + +#: cps/helper.py:609 +msgid "Waiting" +msgstr "Esperando" + +#: cps/helper.py:611 +msgid "Failed" +msgstr "Fallido" + +#: cps/helper.py:613 +msgid "Started" +msgstr "Comenzado" + +#: cps/helper.py:615 +msgid "Finished" +msgstr "Finalizado" + +#: cps/helper.py:617 +msgid "Unknown Status" +msgstr "" + +#: cps/helper.py:622 +msgid "E-mail: " +msgstr "" + +#: cps/helper.py:624 cps/helper.py:628 +msgid "Convert: " +msgstr "" + +#: cps/helper.py:626 +msgid "Upload: " +msgstr "" + +#: cps/helper.py:630 +msgid "Unknown Task: " +msgstr "" + +#: cps/web.py:1132 cps/web.py:2842 +msgid "Unknown" +msgstr "Desconocido" + +#: cps/web.py:1141 cps/web.py:1172 cps/web.py:1257 +msgid "HTTP Error" +msgstr "Error HTTP" + +#: cps/web.py:1143 cps/web.py:1174 cps/web.py:1258 +msgid "Connection error" +msgstr "Error de conexión" + +#: cps/web.py:1145 cps/web.py:1176 cps/web.py:1259 +msgid "Timeout while establishing connection" +msgstr "Tiempo agotado mientras se trataba de establecer la conexión" + +#: cps/web.py:1147 cps/web.py:1178 cps/web.py:1260 +msgid "General error" +msgstr "Error general" + +#: cps/web.py:1153 +msgid "Unexpected data while reading update information" +msgstr "Dato inesperado mientras se leía la información de actualización" + +#: cps/web.py:1160 +msgid "No update available. You already have the latest version installed" +msgstr "Actualización no disponible. Ya tienes la versión más reciente instalada" + +#: cps/web.py:1185 +msgid "A new update is available. Click on the button below to update to the latest version." +msgstr "Una nueva actualización está disponible. Haz clic en el botón inferior para actualizar a la versión más reciente." + +#: cps/web.py:1235 +msgid "Could not fetch update information" +msgstr "No se puede conseguir información sobre la actualización" + +#: cps/web.py:1250 +msgid "Requesting update package" +msgstr "Solicitando paquete de actualización" + +#: cps/web.py:1251 +msgid "Downloading update package" +msgstr "Descargando paquete de actualización" + +#: cps/web.py:1252 +msgid "Unzipping update package" +msgstr "Descomprimiendo paquete de actualización" + +#: cps/web.py:1253 +msgid "Replacing files" +msgstr "" + +#: cps/web.py:1254 +msgid "Database connections are closed" +msgstr "Los conexiones de base datos están cerradas" + +#: cps/web.py:1255 +msgid "Stopping server" +msgstr "" + +#: cps/web.py:1256 +msgid "Update finished, please press okay and reload page" +msgstr "Actualización finalizada. Por favor, pulse OK y recargue la página" + +#: cps/web.py:1257 cps/web.py:1258 cps/web.py:1259 cps/web.py:1260 +msgid "Update failed:" +msgstr "" + +#: cps/web.py:1283 +msgid "Recently Added Books" +msgstr "Libros recientemente añadidos" + +#: cps/web.py:1293 +msgid "Newest Books" +msgstr "Libros más nuevos" + +#: cps/web.py:1305 +msgid "Oldest Books" +msgstr "Libros más antiguos" + +#: cps/web.py:1317 +msgid "Books (A-Z)" +msgstr "Libros (A-Z)" + +#: cps/web.py:1328 +msgid "Books (Z-A)" +msgstr "Libros (Z-A)" + +#: cps/web.py:1357 +msgid "Hot Books (most downloaded)" +msgstr "Libros populares (los mas descargados)" + +#: cps/web.py:1370 +msgid "Best rated books" +msgstr "Libros mejor valorados" + +#: cps/templates/index.xml:39 cps/web.py:1383 +msgid "Random Books" +msgstr "Libros al azar" + +#: cps/web.py:1398 +msgid "Author list" +msgstr "Lista de autores" + +#: cps/web.py:1410 cps/web.py:1501 cps/web.py:1663 cps/web.py:2206 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "Error en la apertura del eBook. El archivo no existe o no es accesible:" + +#: cps/web.py:1438 +msgid "Publisher list" +msgstr "" + +#: cps/web.py:1452 +#, python-format +msgid "Publisher: %(name)s" +msgstr "" + +#: cps/templates/index.xml:83 cps/web.py:1484 +msgid "Series list" +msgstr "Lista de series" + +#: cps/web.py:1499 +#, python-format +msgid "Series: %(serie)s" +msgstr "Series : %(serie)s" + +#: cps/web.py:1528 +msgid "Available languages" +msgstr "Idiomas disponibles" + +#: cps/web.py:1548 +#, python-format +msgid "Language: %(name)s" +msgstr "Idioma: %(name)s" + +#: cps/templates/index.xml:76 cps/web.py:1559 +msgid "Category list" +msgstr "Lista de categorías" + +#: cps/web.py:1573 +#, python-format +msgid "Category: %(name)s" +msgstr "Categoría : %(name)s" + +#: cps/templates/layout.html:71 cps/web.py:1699 +msgid "Tasks" +msgstr "Tareas" + +#: cps/web.py:1733 +msgid "Statistics" +msgstr "Estadísticas" + +#: cps/web.py:1840 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "El dominio de devolución de llamada no se ha verificado, siga los pasos para verificar el dominio en la consola de desarrollador de Google" + +#: cps/web.py:1915 +msgid "Server restarted, please reload page" +msgstr "Servidor reiniciado. Por favor, recargue la página" + +#: cps/web.py:1918 +msgid "Performing shutdown of server, please close window" +msgstr "Servidor en proceso de apagado. Por favor, cierre la ventana." + +#: cps/web.py:1937 +msgid "Update done" +msgstr "Actualización realizada" + +#: cps/web.py:2007 +msgid "Published after " +msgstr "Publicado antes de" + +#: cps/web.py:2014 +msgid "Published before " +msgstr "Publicado después de" + +#: cps/web.py:2028 +#, python-format +msgid "Rating <= %(rating)s" +msgstr "Clasificación <= %(rating)s" + +#: cps/web.py:2030 +#, python-format +msgid "Rating >= %(rating)s" +msgstr "Clasificación >= %(rating)s" + +#: cps/web.py:2089 cps/web.py:2098 +msgid "search" +msgstr "búsqueda" + +#: cps/templates/index.xml:47 cps/templates/index.xml:51 +#: cps/templates/layout.html:146 cps/web.py:2165 +msgid "Read Books" +msgstr "Libros leídos" + +#: cps/templates/index.xml:55 cps/templates/index.xml:59 +#: cps/templates/layout.html:148 cps/web.py:2168 +msgid "Unread Books" +msgstr "Libros no leídos" + +#: cps/web.py:2216 cps/web.py:2218 cps/web.py:2220 cps/web.py:2232 +msgid "Read a Book" +msgstr "Leer un libro" + +#: cps/web.py:2298 cps/web.py:3201 +msgid "Please fill out all fields!" +msgstr "¡Por favor completar todos los campos!" + +#: cps/web.py:2299 cps/web.py:2320 cps/web.py:2324 cps/web.py:2329 +#: cps/web.py:2331 +msgid "register" +msgstr "registrarse" + +#: cps/web.py:2319 cps/web.py:3417 +msgid "An unknown error occurred. Please try again later." +msgstr "Ha ocurrido un error desconocido. Por favor vuelva a intentarlo más tarde." + +#: cps/web.py:2322 +msgid "Your e-mail is not allowed to register" +msgstr "Su correo electrónico no está permitido para registrarse" + +#: cps/web.py:2325 +msgid "Confirmation e-mail was send to your e-mail account." +msgstr "Se ha enviado un correo electrónico de verificación a su cuenta de correo electrónico." + +#: cps/web.py:2328 +msgid "This username or e-mail address is already in use." +msgstr "Este nombre de usuario o correo electrónico ya están en uso." + +#: cps/web.py:2345 cps/web.py:2441 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "Sesión iniciada como : '%(nickname)s'" + +#: cps/web.py:2350 +msgid "Wrong Username or Password" +msgstr "Usuario o contraseña inválido" + +#: cps/web.py:2356 cps/web.py:2377 +msgid "login" +msgstr "Iniciar sesión" + +#: cps/web.py:2389 cps/web.py:2420 +msgid "Token not found" +msgstr "Token no encontrado" + +#: cps/web.py:2397 cps/web.py:2428 +msgid "Token has expired" +msgstr "El token ha expirado" + +#: cps/web.py:2405 +msgid "Success! Please return to your device" +msgstr "¡Correcto! Por favor regrese a su dispositivo" + +#: cps/web.py:2455 +msgid "Please configure the SMTP mail settings first..." +msgstr "Configurar primero los parámetros SMTP por favor..." + +#: cps/web.py:2459 +#, python-format +msgid "Book successfully queued for sending to %(kindlemail)s" +msgstr "Libro puesto en la cola de envío a %(kindlemail)s" + +#: cps/web.py:2463 +#, python-format +msgid "There was an error sending this book: %(res)s" +msgstr "Ha sucedido un error en el envío del libro: %(res)s" + +#: cps/web.py:2465 cps/web.py:3255 +msgid "Please configure your kindle e-mail address first..." +msgstr "Por favor configure primero la dirección de correo de su kindle..." + +#: cps/web.py:2476 cps/web.py:2528 +msgid "Invalid shelf specified" +msgstr "Estante especificado inválido" + +#: cps/web.py:2483 +#, python-format +msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2491 +msgid "You are not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2500 +#, python-format +msgid "Book is already part of the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2514 +#, python-format +msgid "Book has been added to shelf: %(sname)s" +msgstr "El libro fue agregado a el estante: %(sname)s" + +#: cps/web.py:2533 +#, python-format +msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgstr "No tiene permiso para añadir un libro a el estante: %(name)s" + +#: cps/web.py:2538 +msgid "User is not allowed to edit public shelves" +msgstr "El usuario no tiene permiso para editar estantes públicos" + +#: cps/web.py:2556 +#, python-format +msgid "Books are already part of the shelf: %(name)s" +msgstr "Los libros ya forman parte del estante: %(name)s" + +#: cps/web.py:2570 +#, python-format +msgid "Books have been added to shelf: %(sname)s" +msgstr "Los libros han sido añadidos al estante: %(sname)s" + +#: cps/web.py:2572 +#, python-format +msgid "Could not add books to shelf: %(sname)s" +msgstr "No se pudieron agregar libros al estante: %(sname)s" + +#: cps/web.py:2609 +#, python-format +msgid "Book has been removed from shelf: %(sname)s" +msgstr "El libro fue eliminado del estante: %(sname)s" + +#: cps/web.py:2615 +#, python-format +msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgstr "Lo siento, no tiene permiso para eliminar un libro del estante: %(sname)s" + +#: cps/web.py:2635 cps/web.py:2659 +#, python-format +msgid "A shelf with the name '%(title)s' already exists." +msgstr "Un estante con el nombre '%(title)s' ya existe." + +#: cps/web.py:2640 +#, python-format +msgid "Shelf %(title)s created" +msgstr "Estante %(title)s creado" + +#: cps/web.py:2642 cps/web.py:2670 +msgid "There was an error" +msgstr "Ha sucedido un error" + +#: cps/web.py:2643 cps/web.py:2645 +msgid "create a shelf" +msgstr "crear un estante" + +#: cps/web.py:2668 +#, python-format +msgid "Shelf %(title)s changed" +msgstr "Estante %(title)s cambiado" + +#: cps/web.py:2671 cps/web.py:2673 +msgid "Edit a shelf" +msgstr "Editar un estante" + +#: cps/web.py:2694 +#, python-format +msgid "successfully deleted shelf %(name)s" +msgstr "Estante %(name)s fue borrado correctamente" + +#: cps/web.py:2721 +#, python-format +msgid "Shelf: '%(name)s'" +msgstr "Estante: '%(name)s'" + +#: cps/web.py:2724 +msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "Error al abrir un estante. El estante no existe o no es accesible" + +#: cps/web.py:2755 +#, python-format +msgid "Change order of Shelf: '%(name)s'" +msgstr "Cambiar orden del estante: '%(name)s'" + +#: cps/web.py:2784 cps/web.py:3207 +msgid "E-mail is not from valid domain" +msgstr "El correo electrónico no tiene un nombre de dominio válido" + +#: cps/web.py:2786 cps/web.py:2829 cps/web.py:2832 +#, python-format +msgid "%(name)s's profile" +msgstr "Perfil de %(name)s" + +#: cps/web.py:2827 +msgid "Found an existing account for this e-mail address." +msgstr "Encontrada una cuenta existente para esa dirección de correo electrónico." + +#: cps/web.py:2830 +msgid "Profile updated" +msgstr "Perfil actualizado" + +#: cps/web.py:2858 +msgid "Admin page" +msgstr "Página de administración" + +#: cps/web.py:2938 cps/web.py:3112 +msgid "Calibre-Web configuration updated" +msgstr "Configuración de Calibre-Web actualizada" + +#: cps/templates/admin.html:100 cps/web.py:2951 +msgid "UI Configuration" +msgstr "Configuración de la interfaz del usuario" + +#: cps/web.py:2969 +msgid "Import of optional Google Drive requirements missing" +msgstr "Falta la importación de requisitos opcionales de Google Drive" + +#: cps/web.py:2972 +msgid "client_secrets.json is missing or not readable" +msgstr "client_secrets.json está desaparecido o no se puede leer" + +#: cps/web.py:2977 cps/web.py:3004 +msgid "client_secrets.json is not configured for web application" +msgstr "client_secrets.json no está configurado para la aplicación web" + +#: cps/templates/admin.html:99 cps/web.py:3007 cps/web.py:3033 cps/web.py:3045 +#: cps/web.py:3088 cps/web.py:3103 cps/web.py:3120 cps/web.py:3127 +#: cps/web.py:3142 +msgid "Basic Configuration" +msgstr "Configuración básica" + +#: cps/web.py:3030 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "La ubicación del fichero clave (Keyfile) no es válida, por favor introduzca la ruta correcta" + +#: cps/web.py:3042 +msgid "Certfile location is not valid, please enter correct path" +msgstr "La ubicación del fichero de certificado (Certfile) no es válida, por favor introduzca la ruta correcta" + +#: cps/web.py:3085 +msgid "Logfile location is not valid, please enter correct path" +msgstr "La ubicación del fichero de registro (Logfile) no es válida, por favor introduzca la ruta correcta" + +#: cps/web.py:3124 +msgid "DB location is not valid, please enter correct path" +msgstr "Localización de la BD inválida, por favor introduzca la ruta correcta" + +#: cps/templates/admin.html:33 cps/web.py:3203 cps/web.py:3209 cps/web.py:3225 +msgid "Add new user" +msgstr "Agregar un nuevo usuario" + +#: cps/web.py:3215 +#, python-format +msgid "User '%(user)s' created" +msgstr "Usuario '%(user)s' creado" + +#: cps/web.py:3219 +msgid "Found an existing account for this e-mail address or nickname." +msgstr "Encontrada una cuenta existente para este correo electrónico o nombre de usuario." + +#: cps/web.py:3243 cps/web.py:3257 +msgid "E-mail server settings updated" +msgstr "Actualizados los ajustes del servidor de correo electrónico" + +#: cps/web.py:3250 +#, python-format +msgid "Test e-mail successfully send to %(kindlemail)s" +msgstr "Correo electrónico de prueba enviado con éxito a %(kindlemail)s" + +#: cps/web.py:3253 +#, python-format +msgid "There was an error sending the Test e-mail: %(res)s" +msgstr "Ocurrió un error enviando el correo electrónico de prueba: %(res)s" + +#: cps/web.py:3258 +msgid "Edit e-mail server settings" +msgstr "Editar los ajustes del servidor de correo electrónico" + +#: cps/web.py:3283 +#, python-format +msgid "User '%(nick)s' deleted" +msgstr "Usuario '%(nick)s' borrado" + +#: cps/web.py:3392 +#, python-format +msgid "User '%(nick)s' updated" +msgstr "Usuario '%(nick)s' actualizado" + +#: cps/web.py:3395 +msgid "An unknown error occured." +msgstr "Ocurrió un error inesperado." + +#: cps/web.py:3397 +#, python-format +msgid "Edit User %(nick)s" +msgstr "Editar Usuario %(nick)s" + +#: cps/web.py:3414 +#, python-format +msgid "Password for user %(user)s reset" +msgstr "Contraseña para el usuario %(user)s reinicializada" + +#: cps/web.py:3428 cps/web.py:3629 +msgid "Error opening eBook. File does not exist or file is not accessible" +msgstr "Error abriendo un eBook. El archivo no existe o no es accesible" + +#: cps/web.py:3453 cps/web.py:3912 +msgid "edit metadata" +msgstr "editar metadatos" + +#: cps/web.py:3546 cps/web.py:3782 +#, python-format +msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" +msgstr "No se permite subir archivos con la extensión '%(ext)s' a este servidor" + +#: cps/web.py:3550 cps/web.py:3786 +msgid "File to be uploaded must have an extension" +msgstr "El archivo a subir debe tener una extensión" + +#: cps/web.py:3562 cps/web.py:3806 +#, python-format +msgid "Failed to create path %(path)s (Permission denied)." +msgstr "Fallo al crear la ruta %(path)s (permiso denegado)" + +#: cps/web.py:3567 +#, python-format +msgid "Failed to store file %(file)s." +msgstr "Falla al guardar el archivo %(file)s." + +#: cps/web.py:3583 +#, python-format +msgid "File format %(ext)s added to %(book)s" +msgstr "Fichero con formato %(ext)s añadido a %(book)s" + +#: cps/web.py:3601 +#, python-format +msgid "Failed to create path for cover %(path)s (Permission denied)." +msgstr "Fallo al crear la ruta para la cubierta %(path)s (Permiso denegado)." + +#: cps/web.py:3608 +#, python-format +msgid "Failed to store cover-file %(cover)s." +msgstr "Fallo al guardar el archivo de cubierta %(cover)s." + +#: cps/web.py:3611 +msgid "Cover-file is not a valid image file" +msgstr "El archivo de imagen de la portada no es válido" + +#: cps/web.py:3641 cps/web.py:3650 cps/web.py:3654 +msgid "unknown" +msgstr "desconocido" + +#: cps/web.py:3673 +msgid "Cover is not a jpg file, can't save" +msgstr "La cubierta no es un archivo jpg, no se puede guardar" + +#: cps/web.py:3721 +#, python-format +msgid "%(langname)s is not a valid language" +msgstr "%(langname)s no es un idioma válido" + +#: cps/web.py:3752 +msgid "Metadata successfully updated" +msgstr "" + +#: cps/web.py:3761 +msgid "Error editing book, please check logfile for details" +msgstr "Error al editar el libro, por favor compruebe el fichero de registro (logfile) para tener más detalles" + +#: cps/web.py:3811 +#, python-format +msgid "Failed to store file %(file)s (Permission denied)." +msgstr "Fallo al guardar el archivo %(file)s (permiso denegado)" + +#: cps/web.py:3816 +#, python-format +msgid "Failed to delete file %(file)s (Permission denied)." +msgstr "Fallo al borrar el archivo %(file)s (permiso denegado)" + +#: cps/web.py:3898 +#, python-format +msgid "File %(file)s uploaded" +msgstr "Fichero %(file)s subido" + +#: cps/web.py:3928 +msgid "Source or destination format for conversion missing" +msgstr "Falta la fuente o el formato de destino para la conversión" + +#: cps/web.py:3938 +#, python-format +msgid "Book successfully queued for converting to %(book_format)s" +msgstr "Libro puesto a la cola con éxito para convertirlo a %(book_format)s" + +#: cps/web.py:3942 +#, python-format +msgid "There was an error converting this book: %(res)s" +msgstr "Ocurrió un error al convertir este libro: %(res)s" + +#: cps/worker.py:287 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Falló Ebook-converter: %(error)s" + +#: cps/worker.py:298 +#, python-format +msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" +msgstr "Kindlegen falló con error %(error)s. Mensaje: %(message)s" + +#: cps/templates/admin.html:6 +msgid "User list" +msgstr "Lista de usuarios" + +#: cps/templates/admin.html:9 +msgid "Nickname" +msgstr "Nickname" + +#: cps/templates/admin.html:10 +msgid "E-mail" +msgstr "Correo electrónico" + +#: cps/templates/admin.html:11 +msgid "Kindle" +msgstr "Kindle" + +#: cps/templates/admin.html:12 +msgid "DLS" +msgstr "DLS" + +#: cps/templates/admin.html:13 cps/templates/layout.html:74 +msgid "Admin" +msgstr "Administración" + +#: cps/templates/admin.html:14 cps/templates/detail.html:22 +#: cps/templates/detail.html:31 +msgid "Download" +msgstr "Descargar" + +#: cps/templates/admin.html:15 cps/templates/layout.html:64 +msgid "Upload" +msgstr "Subir archivo" + +#: cps/templates/admin.html:16 +msgid "Edit" +msgstr "Editar" + +#: cps/templates/admin.html:39 +msgid "SMTP e-mail server settings" +msgstr "Ajustes SMTP del servidor de correo electrónico" + +#: cps/templates/admin.html:42 cps/templates/email_edit.html:11 +msgid "SMTP hostname" +msgstr "Servidor SMTP" + +#: cps/templates/admin.html:43 +msgid "SMTP port" +msgstr "Puerto SMTP" + +#: cps/templates/admin.html:44 +msgid "SSL" +msgstr "SSL" + +#: cps/templates/admin.html:45 cps/templates/email_edit.html:27 +msgid "SMTP login" +msgstr "Login SMTP" + +#: cps/templates/admin.html:46 +msgid "From mail" +msgstr "Desde el correo" + +#: cps/templates/admin.html:56 +msgid "Change SMTP settings" +msgstr "Cambiar parámetros SMTP" + +#: cps/templates/admin.html:62 +msgid "Configuration" +msgstr "Configuración" + +#: cps/templates/admin.html:65 +msgid "Calibre DB dir" +msgstr "Dir DB Calibre" + +#: cps/templates/admin.html:69 +msgid "Log level" +msgstr "Nivel de registro" + +#: cps/templates/admin.html:73 +msgid "Port" +msgstr "Puerto" + +#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23 +msgid "Books per page" +msgstr "Libros por página" + +#: cps/templates/admin.html:83 +msgid "Uploading" +msgstr "Subiendo" + +#: cps/templates/admin.html:87 +msgid "Anonymous browsing" +msgstr "Navegación anónima" + +#: cps/templates/admin.html:91 +msgid "Public registration" +msgstr "Registro público" + +#: cps/templates/admin.html:95 cps/templates/remote_login.html:4 +msgid "Remote login" +msgstr "Inicio de sesión remoto" + +#: cps/templates/admin.html:106 +msgid "Administration" +msgstr "Administración" + +#: cps/templates/admin.html:107 +msgid "Reconnect to Calibre DB" +msgstr "Reconectar a la BD Calibre" + +#: cps/templates/admin.html:108 +msgid "Restart Calibre-Web" +msgstr "Reiniciar Calibre-Web" + +#: cps/templates/admin.html:109 +msgid "Stop Calibre-Web" +msgstr "Detener Calibre-Web" + +#: cps/templates/admin.html:115 +msgid "Update" +msgstr "Actualizar" + +#: cps/templates/admin.html:119 +msgid "Version" +msgstr "Versión" + +#: cps/templates/admin.html:120 +msgid "Details" +msgstr "Detalles" + +#: cps/templates/admin.html:126 +msgid "Current version" +msgstr "Versión actual" + +#: cps/templates/admin.html:132 +msgid "Check for update" +msgstr "Comprobar actualizaciones" + +#: cps/templates/admin.html:133 +msgid "Perform Update" +msgstr "Realizar actualización" + +#: cps/templates/admin.html:145 +msgid "Do you really want to restart Calibre-Web?" +msgstr "¿Realmente quiere reiniciar Calibre-Web?" + +#: cps/templates/admin.html:150 cps/templates/admin.html:164 +#: cps/templates/admin.html:184 cps/templates/shelf.html:61 +msgid "Ok" +msgstr "Ok" + +#: cps/templates/admin.html:151 cps/templates/admin.html:165 +#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200 +#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168 +#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75 +#: cps/templates/shelf.html:62 cps/templates/shelf_edit.html:19 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155 +msgid "Back" +msgstr "Regresar" + +#: cps/templates/admin.html:163 +msgid "Do you really want to stop Calibre-Web?" +msgstr "¿Realmente quiere detener Calibre-Web?" + +#: cps/templates/admin.html:175 +msgid "Updating, please do not reload page" +msgstr "Actualizando. Por favor, no recargue la página" + +#: cps/templates/author.html:15 +msgid "via" +msgstr "via" + +#: cps/templates/author.html:23 +msgid "In Library" +msgstr "en Library" + +#: cps/templates/author.html:69 +msgid "More by" +msgstr "Más por" + +#: cps/templates/book_edit.html:16 +msgid "Delete Book" +msgstr "Borrar libro" + +#: cps/templates/book_edit.html:19 +msgid "Delete formats:" +msgstr "Borrar formatos:" + +#: cps/templates/book_edit.html:22 cps/templates/book_edit.html:199 +#: cps/templates/email_edit.html:73 cps/templates/email_edit.html:74 +msgid "Delete" +msgstr "Borrar" + +#: cps/templates/book_edit.html:30 +msgid "Convert book format:" +msgstr "Convertir formato de libro:" + +#: cps/templates/book_edit.html:34 +msgid "Convert from:" +msgstr "Convertir desde:" + +#: cps/templates/book_edit.html:36 cps/templates/book_edit.html:43 +msgid "select an option" +msgstr "seleccionar una opción" + +#: cps/templates/book_edit.html:41 +msgid "Convert to:" +msgstr "Convertir a:" + +#: cps/templates/book_edit.html:50 +msgid "Convert book" +msgstr "Convertir libro" + +#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6 +msgid "Book Title" +msgstr "Título del libro" + +#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:259 +#: cps/templates/book_edit.html:277 cps/templates/search_form.html:10 +msgid "Author" +msgstr "Autor" + +#: cps/templates/book_edit.html:67 cps/templates/book_edit.html:264 +#: cps/templates/book_edit.html:279 cps/templates/search_form.html:106 +msgid "Description" +msgstr "Descripción" + +#: cps/templates/book_edit.html:71 cps/templates/search_form.html:33 +msgid "Tags" +msgstr "Etiquetas" + +#: cps/templates/book_edit.html:75 cps/templates/layout.html:157 +#: cps/templates/search_form.html:53 +msgid "Series" +msgstr "Series" + +#: cps/templates/book_edit.html:79 +msgid "Series id" +msgstr "Id de las series" + +#: cps/templates/book_edit.html:83 +msgid "Rating" +msgstr "Clasificación" + +#: cps/templates/book_edit.html:87 +msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +msgstr "URL de la portada (jpg, la portada es descargada y almacenada en la base de datos, el campo está vacío de nuevo)" + +#: cps/templates/book_edit.html:91 +msgid "Upload Cover from local drive" +msgstr "Subir portada desde un medio de almacenamiento local" + +#: cps/templates/book_edit.html:96 cps/templates/detail.html:135 +msgid "Publishing date" +msgstr "Fecha de publicación" + +#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:278 cps/templates/detail.html:127 +#: cps/templates/search_form.html:14 +msgid "Publisher" +msgstr "Editor" + +#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31 +msgid "Language" +msgstr "Idioma" + +#: cps/templates/book_edit.html:117 cps/templates/search_form.html:117 +msgid "Yes" +msgstr "Sí" + +#: cps/templates/book_edit.html:118 cps/templates/search_form.html:118 +msgid "No" +msgstr "No" + +#: cps/templates/book_edit.html:164 +msgid "Upload format" +msgstr "Subir formato" + +#: cps/templates/book_edit.html:173 +msgid "view book after edit" +msgstr "ver libro tras la edición" + +#: cps/templates/book_edit.html:176 cps/templates/book_edit.html:212 +msgid "Get metadata" +msgstr "Obtener metadatos" + +#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210 +#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20 +#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17 +#: cps/templates/user_edit.html:153 +msgid "Submit" +msgstr "Enviar" + +#: cps/templates/book_edit.html:191 +msgid "Are you really sure?" +msgstr "¿Estás realmente seguro?" + +#: cps/templates/book_edit.html:194 +msgid "Book will be deleted from Calibre database" +msgstr "El libro será eliminado de la base de datos de Calibre" + +#: cps/templates/book_edit.html:195 +msgid "and from hard disk" +msgstr "y del disco duro" + +#: cps/templates/book_edit.html:215 +msgid "Keyword" +msgstr "Palabra clave" + +#: cps/templates/book_edit.html:216 +msgid " Search keyword " +msgstr "Buscar palabras clave" + +#: cps/templates/book_edit.html:218 cps/templates/layout.html:46 +msgid "Go!" +msgstr "¡Vamos!" + +#: cps/templates/book_edit.html:222 +msgid "Click the cover to load metadata to the form" +msgstr "Haga clic en la portada para cargar los metadatos en el formulario" + +#: cps/templates/book_edit.html:234 cps/templates/book_edit.html:274 +msgid "Loading..." +msgstr "Cargando..." + +#: cps/templates/book_edit.html:239 cps/templates/layout.html:224 +msgid "Close" +msgstr "Cerrar" + +#: cps/templates/book_edit.html:266 cps/templates/book_edit.html:280 +msgid "Source" +msgstr "Origen" + +#: cps/templates/book_edit.html:275 +msgid "Search error!" +msgstr "¡Error en la búsqueda!" + +#: cps/templates/book_edit.html:276 +msgid "No Result(s) found! Please try aonther keyword." +msgstr "¡No se encontraron resultados! Por favor intente otra palabra clave." + +#: cps/templates/config_edit.html:12 +msgid "Library Configuration" +msgstr "Configuración de la librería" + +#: cps/templates/config_edit.html:19 +msgid "Location of Calibre database" +msgstr "Ubicación de la base de datos de Calibre" + +#: cps/templates/config_edit.html:24 +msgid "Use Google Drive?" +msgstr "¿Utiliza Google Drive?" + +#: cps/templates/config_edit.html:30 +msgid "Google Drive config problem" +msgstr "Problema con la configuración de Google Drive" + +#: cps/templates/config_edit.html:36 +msgid "Authenticate Google Drive" +msgstr "Autentificar Google Drive" + +#: cps/templates/config_edit.html:40 +msgid "Please finish Google Drive setup after login" +msgstr "Por favor finalice el ajuste de Google Drive después de iniciar sesión" + +#: cps/templates/config_edit.html:44 +msgid "Google Drive Calibre folder" +msgstr "Carpeta de Google Drive para Calibre" + +#: cps/templates/config_edit.html:52 +msgid "Metadata Watch Channel ID" +msgstr "Metadata Watch Channel ID" + +#: cps/templates/config_edit.html:55 +msgid "Revoke" +msgstr "Revocar" + +#: cps/templates/config_edit.html:73 +msgid "Server Configuration" +msgstr "Configuración del servidor" + +#: cps/templates/config_edit.html:80 +msgid "Server Port" +msgstr "Puerto del servidor" + +#: cps/templates/config_edit.html:84 +msgid "SSL certfile location (leave it empty for non-SSL Servers)" +msgstr "Ubicación del archivo de certificado SSL (dejar en blanco si no hay un servidor SSL)" + +#: cps/templates/config_edit.html:88 +msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" +msgstr "Ubicación del archivo clave SSL (dejar en blanco si no hay un servidor SSL)" + +#: cps/templates/config_edit.html:99 +msgid "Logfile Configuration" +msgstr "Configuración del archivo de registro" + +#: cps/templates/config_edit.html:106 +msgid "Log Level" +msgstr "Nivel de registro" + +#: cps/templates/config_edit.html:115 +msgid "Location and name of logfile (calibre-web.log for no entry)" +msgstr "Ubicación y nombre del archivo de registro (si no se especifica será calibre-web.log)" + +#: cps/templates/config_edit.html:126 +msgid "Feature Configuration" +msgstr "Configuración de características" + +#: cps/templates/config_edit.html:134 +msgid "Enable uploading" +msgstr "Permitir subida" + +#: cps/templates/config_edit.html:138 +msgid "Enable anonymous browsing" +msgstr "Permitir navegación anónima" + +#: cps/templates/config_edit.html:142 +msgid "Enable public registration" +msgstr "Permitir registro público" + +#: cps/templates/config_edit.html:146 +msgid "Enable remote login (\"magic link\")" +msgstr "Permitir inicio de sesión remoto (\"magic link\")" + +#: cps/templates/config_edit.html:151 +msgid "Use" +msgstr "Usar" + +#: cps/templates/config_edit.html:152 +msgid "Obtain an API Key" +msgstr "Obtener una API Key" + +#: cps/templates/config_edit.html:156 +msgid "Goodreads API Key" +msgstr "Goodreads API Key" + +#: cps/templates/config_edit.html:160 +msgid "Goodreads API Secret" +msgstr "Goodreads API Secret" + +#: cps/templates/config_edit.html:173 +msgid "External binaries" +msgstr "Binarios externos" + +#: cps/templates/config_edit.html:181 +msgid "No converter" +msgstr "No convertir" + +#: cps/templates/config_edit.html:183 +msgid "Use Kindlegen" +msgstr "Utilizar Kindlegen" + +#: cps/templates/config_edit.html:185 +msgid "Use calibre's ebook converter" +msgstr "Utilizar el convertidor de libros de Calibre" + +#: cps/templates/config_edit.html:189 +msgid "E-Book converter settings" +msgstr "Ajustes del convertidos E-Book" + +#: cps/templates/config_edit.html:193 +msgid "Path to convertertool" +msgstr "Ruta para convertertool" + +#: cps/templates/config_edit.html:199 +msgid "Location of Unrar binary" +msgstr "Ubicación del binario de Unrar" + +#: cps/templates/config_edit.html:215 cps/templates/layout.html:82 +#: cps/templates/login.html:4 +msgid "Login" +msgstr "Inicio de sesión" + +#: cps/templates/config_view_edit.html:12 +msgid "View Configuration" +msgstr "Ver configuración" + +#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 +#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 +msgid "Title" +msgstr "Título" + +#: cps/templates/config_view_edit.html:27 +msgid "No. of random books to show" +msgstr "Número de libros aleatorios a mostrar" + +#: cps/templates/config_view_edit.html:31 +msgid "Regular expression for ignoring columns" +msgstr "Expresión regular para ignorar columnas" + +#: cps/templates/config_view_edit.html:35 +msgid "Link read/unread status to Calibre column" +msgstr "Enlace del estado de la columna de Calibre de leído/sin leer" + +#: cps/templates/config_view_edit.html:44 +msgid "Regular expression for title sorting" +msgstr "Expresión regular para ordenar títulos" + +#: cps/templates/config_view_edit.html:48 +msgid "Tags for Mature Content" +msgstr "Etiquetas para contenido para adultos" + +#: cps/templates/config_view_edit.html:62 +msgid "Default settings for new users" +msgstr "Ajustes por defecto para nuevos usuarios" + +#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110 +msgid "Admin user" +msgstr "Usuario administrador" + +#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119 +msgid "Allow Downloads" +msgstr "Permitir descargas" + +#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123 +msgid "Allow Uploads" +msgstr "Permitir subidas de archivos" + +#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127 +msgid "Allow Edit" +msgstr "Permitir editar" + +#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131 +msgid "Allow Delete books" +msgstr "Permitir eliminar libros" + +#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136 +msgid "Allow Changing Password" +msgstr "Permitir cambiar la contraseña" + +#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140 +msgid "Allow Editing Public Shelfs" +msgstr "Permitir editar estantes públicos" + +#: cps/templates/config_view_edit.html:104 +msgid "Default visibilities for new users" +msgstr "Visibilidad predeterminada para nuevos usuarios" + +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58 +msgid "Show random books" +msgstr "Mostrar libros al azar" + +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62 +msgid "Show recent books" +msgstr "Mostrar libros recientes" + +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66 +msgid "Show sorted books" +msgstr "Mostrar libros ordenados" + +#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70 +msgid "Show hot books" +msgstr "Mostrar libros populares" + +#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74 +msgid "Show best rated books" +msgstr "Mostrar libros mejor valorados" + +#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78 +msgid "Show language selection" +msgstr "Mostrar idioma seleccionado" + +#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82 +msgid "Show series selection" +msgstr "Mostrar series seleccionadas" + +#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86 +msgid "Show category selection" +msgstr "Mostrar categorías elegidas" + +#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90 +msgid "Show author selection" +msgstr "Mostrar selección de autores" + +#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94 +msgid "Show publisher selection" +msgstr "" + +#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98 +msgid "Show read and unread" +msgstr "Mostrar leídos y no leídos" + +#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102 +msgid "Show random books in detail view" +msgstr "Mostrar libros aleatorios con vista detallada" + +#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115 +msgid "Show mature content" +msgstr "Mostrar contenido para adulto" + +#: cps/templates/detail.html:49 +msgid "Read in browser" +msgstr "Ver en el navegador" + +#: cps/templates/detail.html:88 +msgid "Book" +msgstr "Libro" + +#: cps/templates/detail.html:88 +msgid "of" +msgstr "de" + +#: cps/templates/detail.html:94 +msgid "language" +msgstr "idioma" + +#: cps/templates/detail.html:172 +msgid "Read" +msgstr "Leer" + +#: cps/templates/detail.html:182 +msgid "Description:" +msgstr "Descripción:" + +#: cps/templates/detail.html:195 cps/templates/search.html:14 +msgid "Add to shelf" +msgstr "Agregar al estante" + +#: cps/templates/detail.html:257 +msgid "Edit metadata" +msgstr "Editar metadatos" + +#: cps/templates/email_edit.html:15 +msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +msgstr "Puerto SMTP (por lo general 25 para SMTP plano, 465 para SSL y 587 para STARTTLS)" + +#: cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "Cifrado" + +#: cps/templates/email_edit.html:21 +msgid "None" +msgstr "Ninguno" + +#: cps/templates/email_edit.html:22 +msgid "STARTTLS" +msgstr "STATRTTLS" + +#: cps/templates/email_edit.html:23 +msgid "SSL/TLS" +msgstr "SSL/TLS" + +#: cps/templates/email_edit.html:31 +msgid "SMTP password" +msgstr "Contraseña SMTP" + +#: cps/templates/email_edit.html:35 +msgid "From e-mail" +msgstr "Desde el correo electrónico" + +#: cps/templates/email_edit.html:38 +msgid "Save settings" +msgstr "Guardar ajustes" + +#: cps/templates/email_edit.html:39 +msgid "Save settings and send Test E-Mail" +msgstr "Guardar ajustes y enviar un correo electrónico de prueba" + +#: cps/templates/email_edit.html:43 +msgid "Allowed domains for registering" +msgstr "Permitir dominios para registrarse" + +#: cps/templates/email_edit.html:47 +msgid "Enter domainname" +msgstr "Introducir nombre de dominio" + +#: cps/templates/email_edit.html:55 +msgid "Add Domain" +msgstr "Añadir dominio" + +#: cps/templates/email_edit.html:58 +msgid "Add" +msgstr "Añadir" + +#: cps/templates/email_edit.html:72 +msgid "Do you really want to delete this domain rule?" +msgstr "¿Realmente quiere eliminar esta regla de dominio?" + +#: cps/templates/feed.xml:21 cps/templates/layout.html:208 +msgid "Next" +msgstr "Siguiente" + +#: cps/templates/feed.xml:33 cps/templates/index.xml:11 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 +msgid "Search" +msgstr "Buscar" + +#: cps/templates/index.html:5 +msgid "Discover (Random Books)" +msgstr "Descubrir (Libros al azar)" + +#: cps/templates/index.xml:6 +msgid "Start" +msgstr "Iniciar" + +#: cps/templates/index.xml:18 cps/templates/layout.html:139 +msgid "Hot Books" +msgstr "Libros populares" + +#: cps/templates/index.xml:22 +msgid "Popular publications from this catalog based on Downloads." +msgstr "Publicaciones mas populares para este catálogo basadas en las descargas." + +#: cps/templates/index.xml:25 cps/templates/layout.html:142 +msgid "Best rated Books" +msgstr "Libros mejor valorados" + +#: cps/templates/index.xml:29 +msgid "Popular publications from this catalog based on Rating." +msgstr "Publicaciones populares del catálogo basados en la clasificación." + +#: cps/templates/index.xml:32 +msgid "New Books" +msgstr "Libros nuevos" + +#: cps/templates/index.xml:36 +msgid "The latest Books" +msgstr "Libros recientes" + +#: cps/templates/index.xml:43 +msgid "Show Random Books" +msgstr "Mostrar libros al azar" + +#: cps/templates/index.xml:62 cps/templates/layout.html:160 +msgid "Authors" +msgstr "Autores" + +#: cps/templates/index.xml:66 +msgid "Books ordered by Author" +msgstr "Libros ordenados por autor" + +#: cps/templates/index.xml:69 cps/templates/layout.html:163 +msgid "Publishers" +msgstr "" + +#: cps/templates/index.xml:73 +msgid "Books ordered by publisher" +msgstr "" + +#: cps/templates/index.xml:80 +msgid "Books ordered by category" +msgstr "Libros ordenados por categorías" + +#: cps/templates/index.xml:87 +msgid "Books ordered by series" +msgstr "Libros ordenados por series" + +#: cps/templates/index.xml:90 cps/templates/layout.html:169 +msgid "Public Shelves" +msgstr "Estantes públicos" + +#: cps/templates/index.xml:94 +msgid "Books organized in public shelfs, visible to everyone" +msgstr "Libros organizados en estantes públicos, visibles para todo el mundo" + +#: cps/templates/index.xml:98 cps/templates/layout.html:173 +msgid "Your Shelves" +msgstr "Sus estantes" + +#: cps/templates/index.xml:102 +msgid "User's own shelfs, only visible to the current user himself" +msgstr "Los estantes propios del usuario, solo visibles para el propio usuario actual" + +#: cps/templates/layout.html:33 +msgid "Toggle navigation" +msgstr "Alternar navegación" + +#: cps/templates/layout.html:54 +msgid "Advanced Search" +msgstr "Búsqueda avanzada" + +#: cps/templates/layout.html:78 +msgid "Logout" +msgstr "Cerrar sesión" + +#: cps/templates/layout.html:83 cps/templates/register.html:14 +msgid "Register" +msgstr "Registro" + +#: cps/templates/layout.html:108 +msgid "Uploading..." +msgstr "Cargando..." + +#: cps/templates/layout.html:109 +msgid "please don't refresh the page" +msgstr "por favor no recargue la página" + +#: cps/templates/layout.html:120 +msgid "Browse" +msgstr "Navegar" + +#: cps/templates/layout.html:122 +msgid "Recently Added" +msgstr "Añadido recientemente" + +#: cps/templates/layout.html:127 +msgid "Sorted Books" +msgstr "Libros ordenados" + +#: cps/templates/layout.html:131 cps/templates/layout.html:132 +#: cps/templates/layout.html:133 cps/templates/layout.html:134 +msgid "Sort By" +msgstr "Ordenar por" + +#: cps/templates/layout.html:131 +msgid "Newest" +msgstr "Más nuevos" + +#: cps/templates/layout.html:132 +msgid "Oldest" +msgstr "Más antiguos" + +#: cps/templates/layout.html:133 +msgid "Ascending" +msgstr "Ascendente" + +#: cps/templates/layout.html:134 +msgid "Descending" +msgstr "Descendente" + +#: cps/templates/layout.html:151 +msgid "Discover" +msgstr "Descubrir" + +#: cps/templates/layout.html:154 +msgid "Categories" +msgstr "Categorías" + +#: cps/templates/layout.html:166 cps/templates/search_form.html:74 +msgid "Languages" +msgstr "Idioma" + +#: cps/templates/layout.html:178 +msgid "Create a Shelf" +msgstr "Crear un estante" + +#: cps/templates/layout.html:179 cps/templates/stats.html:3 +msgid "About" +msgstr "Acerca de" + +#: cps/templates/layout.html:193 +msgid "Previous" +msgstr "Previo" + +#: cps/templates/layout.html:220 +msgid "Book Details" +msgstr "Detalles del libro" + +#: cps/templates/login.html:8 cps/templates/login.html:9 +#: cps/templates/register.html:7 cps/templates/user_edit.html:8 +msgid "Username" +msgstr "Nombre de usuario" + +#: cps/templates/login.html:12 cps/templates/login.html:13 +#: cps/templates/user_edit.html:21 +msgid "Password" +msgstr "Contraseña" + +#: cps/templates/login.html:17 +msgid "Remember me" +msgstr "Recordarme" + +#: cps/templates/login.html:22 +msgid "Log in with magic link" +msgstr "Iniciar sesión con \"magic link\"" + +#: cps/templates/osd.xml:5 +msgid "Calibre-Web ebook catalog" +msgstr "Cátalogo de ebook de Calibre-Web" + +#: cps/templates/read.html:69 cps/templates/readcbr.html:79 +#: cps/templates/readcbr.html:103 +msgid "Settings" +msgstr "Ajustes" + +#: cps/templates/read.html:72 +msgid "Reflow text when sidebars are open." +msgstr "Redimensionar el texto cuando las barras laterales están abiertas." + +#: cps/templates/readcbr.html:84 +msgid "Keyboard Shortcuts" +msgstr "Atajos de teclado" + +#: cps/templates/readcbr.html:87 +msgid "Previous Page" +msgstr "Página previa" + +#: cps/templates/readcbr.html:88 +msgid "Next Page" +msgstr "Página siguiente" + +#: cps/templates/readcbr.html:89 +msgid "Scale to Best" +msgstr "Escalar a mejor" + +#: cps/templates/readcbr.html:90 +msgid "Scale to Width" +msgstr "Escalar a la ancho" + +#: cps/templates/readcbr.html:91 +msgid "Scale to Height" +msgstr "Escalar a lo alto" + +#: cps/templates/readcbr.html:92 +msgid "Scale to Native" +msgstr "Escalado nativo" + +#: cps/templates/readcbr.html:93 +msgid "Rotate Right" +msgstr "Rotar hacia la derecha" + +#: cps/templates/readcbr.html:94 +msgid "Rotate Left" +msgstr "Rotar hacia la izquierda" + +#: cps/templates/readcbr.html:95 +msgid "Flip Image" +msgstr "Voltear imagen" + +#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39 +msgid "Theme" +msgstr "Tema" + +#: cps/templates/readcbr.html:111 +msgid "Light" +msgstr "Claro" + +#: cps/templates/readcbr.html:112 +msgid "Dark" +msgstr "Oscuro" + +#: cps/templates/readcbr.html:117 +msgid "Scale" +msgstr "Escalar" + +#: cps/templates/readcbr.html:120 +msgid "Best" +msgstr "Mejor" + +#: cps/templates/readcbr.html:121 +msgid "Width" +msgstr "Ancho" + +#: cps/templates/readcbr.html:122 +msgid "Height" +msgstr "Alto" + +#: cps/templates/readcbr.html:123 +msgid "Native" +msgstr "Nativo" + +#: cps/templates/readcbr.html:128 +msgid "Rotate" +msgstr "Rotar" + +#: cps/templates/readcbr.html:139 +msgid "Flip" +msgstr "Voltear" + +#: cps/templates/readcbr.html:142 +msgid "Horizontal" +msgstr "Horizontal" + +#: cps/templates/readcbr.html:143 +msgid "Vertical" +msgstr "Vertical" + +#: cps/templates/readpdf.html:29 +msgid "PDF.js viewer" +msgstr "Visor PDF.js" + +#: cps/templates/readtxt.html:6 +msgid "Basic txt Reader" +msgstr "Lector básico de txt" + +#: cps/templates/register.html:4 +msgid "Register a new account" +msgstr "Registre una cuenta nueva" + +#: cps/templates/register.html:8 +msgid "Choose a username" +msgstr "Escoger un nombre de usuario" + +#: cps/templates/register.html:11 cps/templates/user_edit.html:13 +msgid "E-mail address" +msgstr "Dirección de correo electrónico" + +#: cps/templates/register.html:12 +msgid "Your email address" +msgstr "Tu dirección de correo" + +#: cps/templates/remote_login.html:6 +msgid "Using your another device, visit" +msgstr "Utilizando tu otro dispositivo, visitar" + +#: cps/templates/remote_login.html:6 +msgid "and log in" +msgstr "e iniciar sesión" + +#: cps/templates/remote_login.html:9 +msgid "Once you do so, you will automatically get logged in on this device." +msgstr "Una vez que lo realice, iniciará sesión automáticamente en ese dispositivo." + +#: cps/templates/search.html:5 +msgid "No Results for:" +msgstr "Sin resultados para:" + +#: cps/templates/search.html:6 +msgid "Please try a different search" +msgstr "Intente una búsqueda diferente" + +#: cps/templates/search.html:8 +msgid "Results for:" +msgstr "Resultados para:" + +#: cps/templates/search_form.html:19 +msgid "Publishing date from" +msgstr "Fecha de publicación desde" + +#: cps/templates/search_form.html:26 +msgid "Publishing date to" +msgstr "Fecha de publicación hasta" + +#: cps/templates/search_form.html:43 +msgid "Exclude Tags" +msgstr "Excluir etiquetas" + +#: cps/templates/search_form.html:63 +msgid "Exclude Series" +msgstr "Excluir series" + +#: cps/templates/search_form.html:84 +msgid "Exclude Languages" +msgstr "Excluir idiomas" + +#: cps/templates/search_form.html:97 +msgid "Rating bigger than" +msgstr "Clasificación mayor que" + +#: cps/templates/search_form.html:101 +msgid "Rating less than" +msgstr "Clasificación menor que" + +#: cps/templates/shelf.html:7 +msgid "Delete this Shelf" +msgstr "Borrar este estante" + +#: cps/templates/shelf.html:8 +msgid "Edit Shelf" +msgstr "Editar estante" + +#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11 +msgid "Change order" +msgstr "Cambiar orden" + +#: cps/templates/shelf.html:56 +msgid "Do you really want to delete the shelf?" +msgstr "¿Realmente quiere eliminar este estante?" + +#: cps/templates/shelf.html:59 +msgid "Shelf will be lost for everybody and forever!" +msgstr "¡El estante se perderá para todo el mundo y para siempre!" + +#: cps/templates/shelf_edit.html:13 +msgid "should the shelf be public?" +msgstr "¿Hacer público el estante?" + +#: cps/templates/shelf_order.html:5 +msgid "Drag 'n drop to rearrange order" +msgstr "Pinchar y arrastrar para reordenar" + +#: cps/templates/stats.html:7 +msgid "Calibre library statistics" +msgstr "Estadísticas de la Biblioteca" + +#: cps/templates/stats.html:12 +msgid "Books in this Library" +msgstr "Libros en esta biblioteca" + +#: cps/templates/stats.html:16 +msgid "Authors in this Library" +msgstr "Autores en esta biblioteca" + +#: cps/templates/stats.html:20 +msgid "Categories in this Library" +msgstr "Categorías en esta biblioteca" + +#: cps/templates/stats.html:24 +msgid "Series in this Library" +msgstr "Series en esta biblioteca" + +#: cps/templates/stats.html:28 +msgid "Linked libraries" +msgstr "Bibliotecas vinculadas" + +#: cps/templates/stats.html:32 +msgid "Program library" +msgstr "Bibliotecas del programa" + +#: cps/templates/stats.html:33 +msgid "Installed Version" +msgstr "Versión instalada" + +#: cps/templates/tasks.html:7 +msgid "Tasks list" +msgstr "Lista de tareas" + +#: cps/templates/tasks.html:12 +msgid "User" +msgstr "Usuario" + +#: cps/templates/tasks.html:14 +msgid "Task" +msgstr "Tarea" + +#: cps/templates/tasks.html:15 +msgid "Status" +msgstr "Estado" + +#: cps/templates/tasks.html:16 +msgid "Progress" +msgstr "Progreso" + +#: cps/templates/tasks.html:17 +msgid "Runtime" +msgstr "Tiempo de ejecución" + +#: cps/templates/tasks.html:18 +msgid "Starttime" +msgstr "Fecha de inicio" + +#: cps/templates/tasks.html:24 +msgid "Delete finished tasks" +msgstr "Eliminar tareas finalizadas" + +#: cps/templates/tasks.html:25 +msgid "Hide all tasks" +msgstr "Ocultar todas las tareas" + +#: cps/templates/user_edit.html:18 +msgid "Reset user Password" +msgstr "Resetear contraseña de usuario" + +#: cps/templates/user_edit.html:27 +msgid "Kindle E-Mail" +msgstr "Correo del Kindle" + +#: cps/templates/user_edit.html:41 +msgid "Standard Theme" +msgstr "Tema estándar" + +#: cps/templates/user_edit.html:42 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "caliBlur! Dark Theme (Beta)" + +#: cps/templates/user_edit.html:47 +msgid "Show books with language" +msgstr "Mostrar libros con idioma" + +#: cps/templates/user_edit.html:49 +msgid "Show all" +msgstr "Mostrar todo" + +#: cps/templates/user_edit.html:147 +msgid "Delete this user" +msgstr "Borrar este usuario" + +#: cps/templates/user_edit.html:162 +msgid "Recent Downloads" +msgstr "Descargas recientes" + +#~ msgid "%s: %s" +#~ msgstr "" + +#~ msgid "E-Mail: %(book)s" +#~ msgstr "" + +#~ msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Password for user %(user)s reset" +#~ msgstr "" + +#~ msgid "Password for user %s reset" +#~ msgstr "" + +#~ msgid "Rename title from: '%(src)s' to '%(src)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Rename author from: '%(src)s' to '%(src)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Failed to create path for cover %(cover)s (Permission denied)." +#~ msgstr "" + +#~ msgid "File extension '%s' is not allowed to be uploaded to this server" +#~ msgstr "" + +#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server" +#~ msgstr "No se permite subir archivos con la extensión \"%(ext)s\" a este servidor" + +#~ msgid "Current commit timestamp" +#~ msgstr "Marca temporal del commit actual" + +#~ msgid "Newest commit timestamp" +#~ msgstr "Marca temporal del commit más reciente" + +#~ msgid "Choose a password" +#~ msgstr "Escoger una contraseña" + +#~ msgid "Convert: %(book)s" +#~ msgstr "Convertir: %(book)s" + +#~ msgid "Convert to %(format)s: %(book)s" +#~ msgstr "Convertir a %(format)s: %(book)s" + +#~ msgid "Files are replaced" +#~ msgstr "Ficheros sustituidos" + +#~ msgid "Server is stopped" +#~ msgstr "El servidor está detenido" + +#~ msgid "Convertertool %(converter)s not found" +#~ msgstr "Convertertool %(converter)s no encontrado" + diff --git a/src/cps/translations/fr/LC_MESSAGES/messages.mo b/src/cps/translations/fr/LC_MESSAGES/messages.mo new file mode 100644 index 0000000..15a0d40 Binary files /dev/null and b/src/cps/translations/fr/LC_MESSAGES/messages.mo differ diff --git a/src/cps/translations/fr/LC_MESSAGES/messages.po b/src/cps/translations/fr/LC_MESSAGES/messages.po new file mode 100644 index 0000000..c97506c --- /dev/null +++ b/src/cps/translations/fr/LC_MESSAGES/messages.po @@ -0,0 +1,1944 @@ +# French translations for Calibre-Web. +# Copyright (C) 2016 Calibre-Web +# This file is distributed under the same license as the Calibre-Web +# project. +# FIRST AUTHOR , 2016. +msgid "" +msgstr "" +"Project-Id-Version: Calibre-Web\n" +"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" +"POT-Creation-Date: 2018-11-03 14:03+0100\n" +"PO-Revision-Date: 2018-09-16 00:46+0200\n" +"Last-Translator: Nicolas Roudninski \n" +"Language: fr\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134 +#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27 +msgid "not installed" +msgstr "non installé" + +#: cps/converter.py:22 cps/converter.py:38 +msgid "Excecution permissions missing" +msgstr "Permission d’exécution manquante" + +#: cps/converter.py:48 +msgid "not configured" +msgstr "" + +#: cps/helper.py:58 +#, python-format +msgid "%(format)s format not found for book id: %(book)d" +msgstr "le format %(format)s est introuvable pour le livre : %(book)d" + +#: cps/helper.py:70 +#, python-format +msgid "%(format)s not found on Google Drive: %(fn)s" +msgstr "le %(format)s est introuvable sur Google Drive : %(fn)s" + +#: cps/helper.py:77 cps/helper.py:147 cps/templates/detail.html:44 +msgid "Send to Kindle" +msgstr "Envoyer vers Kindle" + +#: cps/helper.py:78 cps/helper.py:96 +msgid "This e-mail has been sent via Calibre-Web." +msgstr "Ce courriel a été envoyé depuis Calibre-Web" + +#: cps/helper.py:89 +#, python-format +msgid "%(format)s not found: %(fn)s" +msgstr "%(format)s introuvable : %(fn)s" + +#: cps/helper.py:94 +msgid "Calibre-Web test e-mail" +msgstr "Courriel de test de Calibre-Web" + +#: cps/helper.py:95 +msgid "Test e-mail" +msgstr "Courriel de test" + +#: cps/helper.py:111 +msgid "Get Started with Calibre-Web" +msgstr "Bien démarrer avec Calibre-Web" + +#: cps/helper.py:112 +#, python-format +msgid "Registration e-mail for user: %(name)s" +msgstr "Courriel d’inscription pour l’utilisateur : %(name)s" + +#: cps/helper.py:135 cps/helper.py:145 +msgid "Could not find any formats suitable for sending by e-mail" +msgstr "Aucun format supporté pour l’envois par courriel n’a été trouvé" + +#: cps/helper.py:148 +#, python-format +msgid "E-mail: %(book)s" +msgstr "Courriel : %(book)s" + +#: cps/helper.py:150 +msgid "The requested file could not be read. Maybe wrong permissions?" +msgstr "Le fichier demandé n’a pu être lu. Problème de permission d’accès ?" + +#: cps/helper.py:250 +#, python-format +msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "Renommer le titre de : '%(src)s' à '%(dest)s' a échoué avec l’erreur : %(error)s" + +#: cps/helper.py:259 +#, python-format +msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "Renommer l’auteur de : '%(src)s' à '%(dest)s' a échoué avec l’erreur : %(error)s" + +#: cps/helper.py:281 cps/helper.py:290 +#, python-format +msgid "File %(file)s not found on Google Drive" +msgstr "Le fichier %(file)s est introuvable sur Google Drive" + +#: cps/helper.py:308 +#, python-format +msgid "Book path %(path)s not found on Google Drive" +msgstr "Le chemin d’accès %(path)s du livre est introuvable sur Google Drive" + +#: cps/helper.py:565 +msgid "Error excecuting UnRar" +msgstr "Erreur d’exécution de la commande UnRar" + +#: cps/helper.py:567 +msgid "Unrar binary file not found" +msgstr "Le fichier exécutable UnRar est introuvable" + +#: cps/helper.py:609 +msgid "Waiting" +msgstr "En attente" + +#: cps/helper.py:611 +msgid "Failed" +msgstr "Echec" + +#: cps/helper.py:613 +msgid "Started" +msgstr "Démarré" + +#: cps/helper.py:615 +msgid "Finished" +msgstr "Terminé" + +#: cps/helper.py:617 +msgid "Unknown Status" +msgstr "" + +#: cps/helper.py:622 +msgid "E-mail: " +msgstr "" + +#: cps/helper.py:624 cps/helper.py:628 +msgid "Convert: " +msgstr "" + +#: cps/helper.py:626 +msgid "Upload: " +msgstr "" + +#: cps/helper.py:630 +msgid "Unknown Task: " +msgstr "" + +#: cps/web.py:1132 cps/web.py:2842 +msgid "Unknown" +msgstr "Inconnu" + +#: cps/web.py:1141 cps/web.py:1172 cps/web.py:1257 +msgid "HTTP Error" +msgstr "Erreur HTTP" + +#: cps/web.py:1143 cps/web.py:1174 cps/web.py:1258 +msgid "Connection error" +msgstr "Erreur de connexion" + +#: cps/web.py:1145 cps/web.py:1176 cps/web.py:1259 +msgid "Timeout while establishing connection" +msgstr "Délai d'attente dépassé lors de l'établissement de connexion" + +#: cps/web.py:1147 cps/web.py:1178 cps/web.py:1260 +msgid "General error" +msgstr "Erreur générale" + +#: cps/web.py:1153 +msgid "Unexpected data while reading update information" +msgstr "Données inattendues lors de la lecture des informations de mise à jour" + +#: cps/web.py:1160 +msgid "No update available. You already have the latest version installed" +msgstr "Aucune mise à jour disponible. Vous avez déjà la dernière version installée" + +#: cps/web.py:1185 +msgid "A new update is available. Click on the button below to update to the latest version." +msgstr "Une nouvelle mise à jour est disponible. Cliquez sur le bouton ci-dessous pour charger la dernière version." + +#: cps/web.py:1235 +msgid "Could not fetch update information" +msgstr "Impossible d'extraire les informations de mise à jour" + +#: cps/web.py:1250 +msgid "Requesting update package" +msgstr "Demander une mise à jour" + +#: cps/web.py:1251 +msgid "Downloading update package" +msgstr "Téléchargement la mise à jour" + +#: cps/web.py:1252 +msgid "Unzipping update package" +msgstr "Décompression de la mise à jour" + +#: cps/web.py:1253 +msgid "Replacing files" +msgstr "" + +#: cps/web.py:1254 +msgid "Database connections are closed" +msgstr "Connexion à la base de donnée fermée" + +#: cps/web.py:1255 +msgid "Stopping server" +msgstr "" + +#: cps/web.py:1256 +msgid "Update finished, please press okay and reload page" +msgstr "Mise à jour terminée, merci d’appuyer sur okay et de rafraîchir la page" + +#: cps/web.py:1257 cps/web.py:1258 cps/web.py:1259 cps/web.py:1260 +msgid "Update failed:" +msgstr "" + +#: cps/web.py:1283 +msgid "Recently Added Books" +msgstr "Ajouts récents" + +#: cps/web.py:1293 +msgid "Newest Books" +msgstr "Livres récents" + +#: cps/web.py:1305 +msgid "Oldest Books" +msgstr "Anciens livres" + +#: cps/web.py:1317 +msgid "Books (A-Z)" +msgstr "Livres (A-Z)" + +#: cps/web.py:1328 +msgid "Books (Z-A)" +msgstr "Livres (Z-A)" + +#: cps/web.py:1357 +msgid "Hot Books (most downloaded)" +msgstr "Livres populaires (les plus téléchargés)" + +#: cps/web.py:1370 +msgid "Best rated books" +msgstr "Livres les mieux notés" + +#: cps/templates/index.xml:39 cps/web.py:1383 +msgid "Random Books" +msgstr "Livres au hasard" + +#: cps/web.py:1398 +msgid "Author list" +msgstr "Liste des auteurs" + +#: cps/web.py:1410 cps/web.py:1501 cps/web.py:1663 cps/web.py:2206 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "Erreur d'ouverture du livre numérique. Le fichier n'existe pas ou n'est pas accessible :" + +#: cps/web.py:1438 +msgid "Publisher list" +msgstr "" + +#: cps/web.py:1452 +#, python-format +msgid "Publisher: %(name)s" +msgstr "" + +#: cps/templates/index.xml:83 cps/web.py:1484 +msgid "Series list" +msgstr "Liste des séries" + +#: cps/web.py:1499 +#, python-format +msgid "Series: %(serie)s" +msgstr "Séries : %(serie)s" + +#: cps/web.py:1528 +msgid "Available languages" +msgstr "Langues disponibles" + +#: cps/web.py:1548 +#, python-format +msgid "Language: %(name)s" +msgstr "Langue : %(name)s" + +#: cps/templates/index.xml:76 cps/web.py:1559 +msgid "Category list" +msgstr "Liste des catégories" + +#: cps/web.py:1573 +#, python-format +msgid "Category: %(name)s" +msgstr "Catégorie : %(name)s" + +#: cps/templates/layout.html:71 cps/web.py:1699 +msgid "Tasks" +msgstr "Tâches" + +#: cps/web.py:1733 +msgid "Statistics" +msgstr "Statistiques" + +#: cps/web.py:1840 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "Le domaine de retour d’appel (Callback domain) est non vérifié, Veuillez suivre les étapes nécessaires pour vérifier le domaine dans la console de développement de Google" + +#: cps/web.py:1915 +msgid "Server restarted, please reload page" +msgstr "Serveur redémarré, merci de rafraîchir la page" + +#: cps/web.py:1918 +msgid "Performing shutdown of server, please close window" +msgstr "Arrêt du serveur en cours, merci de fermer la fenêtre" + +#: cps/web.py:1937 +msgid "Update done" +msgstr "Mise à jour effectuée" + +#: cps/web.py:2007 +msgid "Published after " +msgstr "Publié après le " + +#: cps/web.py:2014 +msgid "Published before " +msgstr "Publié avant le " + +#: cps/web.py:2028 +#, python-format +msgid "Rating <= %(rating)s" +msgstr "Évaluation <= %(rating)s" + +#: cps/web.py:2030 +#, python-format +msgid "Rating >= %(rating)s" +msgstr "Évaluation >= %(rating)s" + +#: cps/web.py:2089 cps/web.py:2098 +msgid "search" +msgstr "recherche" + +#: cps/templates/index.xml:47 cps/templates/index.xml:51 +#: cps/templates/layout.html:146 cps/web.py:2165 +msgid "Read Books" +msgstr "Livres lus" + +#: cps/templates/index.xml:55 cps/templates/index.xml:59 +#: cps/templates/layout.html:148 cps/web.py:2168 +msgid "Unread Books" +msgstr "Livres non-lus" + +#: cps/web.py:2216 cps/web.py:2218 cps/web.py:2220 cps/web.py:2232 +msgid "Read a Book" +msgstr "Lire un livre" + +#: cps/web.py:2298 cps/web.py:3201 +msgid "Please fill out all fields!" +msgstr "SVP, complétez tous les champs !" + +#: cps/web.py:2299 cps/web.py:2320 cps/web.py:2324 cps/web.py:2329 +#: cps/web.py:2331 +msgid "register" +msgstr "s’enregistrer" + +#: cps/web.py:2319 cps/web.py:3417 +msgid "An unknown error occurred. Please try again later." +msgstr "Une erreur inconnue est survenue. Veuillez réessayer plus tard." + +#: cps/web.py:2322 +msgid "Your e-mail is not allowed to register" +msgstr "Votre adresse de courriel n’est pas autorisé pour une inscription" + +#: cps/web.py:2325 +msgid "Confirmation e-mail was send to your e-mail account." +msgstr "Le courriel de confirmation a été envoyé à votre adresse." + +#: cps/web.py:2328 +msgid "This username or e-mail address is already in use." +msgstr "Ce nom d’utilisateur ou cette adresse de courriel sont déjà utilisés." + +#: cps/web.py:2345 cps/web.py:2441 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "Vous êtes maintenant connecté sous : '%(nickname)s'" + +#: cps/web.py:2350 +msgid "Wrong Username or Password" +msgstr "Mauvais nom d'utilisateur ou mot de passe" + +#: cps/web.py:2356 cps/web.py:2377 +msgid "login" +msgstr "connexion" + +#: cps/web.py:2389 cps/web.py:2420 +msgid "Token not found" +msgstr "Jeton non trouvé" + +#: cps/web.py:2397 cps/web.py:2428 +msgid "Token has expired" +msgstr "Jeton expiré" + +#: cps/web.py:2405 +msgid "Success! Please return to your device" +msgstr "Réussite! Merci de vous tourner vers votre appareil" + +#: cps/web.py:2455 +msgid "Please configure the SMTP mail settings first..." +msgstr "Veuillez configurer les paramètres SMTP au préalable…" + +#: cps/web.py:2459 +#, python-format +msgid "Book successfully queued for sending to %(kindlemail)s" +msgstr "Le livre a été mis en file de traitement avec succès pour un envois vers %(kindlemail)s" + +#: cps/web.py:2463 +#, python-format +msgid "There was an error sending this book: %(res)s" +msgstr "Il y a eu une erreur en envoyant ce livre : %(res)s" + +#: cps/web.py:2465 cps/web.py:3255 +msgid "Please configure your kindle e-mail address first..." +msgstr "Veuillez configurer votre adresse de courriel Kindle en premier lieu…" + +#: cps/web.py:2476 cps/web.py:2528 +msgid "Invalid shelf specified" +msgstr "L’étagère indiquée est invalide" + +#: cps/web.py:2483 +#, python-format +msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2491 +msgid "You are not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2500 +#, python-format +msgid "Book is already part of the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2514 +#, python-format +msgid "Book has been added to shelf: %(sname)s" +msgstr "Le livre a bien été ajouté à l'étagère : %(sname)s" + +#: cps/web.py:2533 +#, python-format +msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgstr "Vous n’êtes pas autorisé à ajouter un livre dans l’étagère %(name)s" + +#: cps/web.py:2538 +msgid "User is not allowed to edit public shelves" +msgstr "L’utilisateur n’est pas autorisé à éditer les étagères publiques" + +#: cps/web.py:2556 +#, python-format +msgid "Books are already part of the shelf: %(name)s" +msgstr "Ces livres sont déjà sur l’étagère : %(name)s" + +#: cps/web.py:2570 +#, python-format +msgid "Books have been added to shelf: %(sname)s" +msgstr "Les livres ont été ajoutés à l’étagère : %(sname)s" + +#: cps/web.py:2572 +#, python-format +msgid "Could not add books to shelf: %(sname)s" +msgstr "Impossible d’ajouter les livres à l’étagère : %(sname)s" + +#: cps/web.py:2609 +#, python-format +msgid "Book has been removed from shelf: %(sname)s" +msgstr "Le livre a été supprimé de l'étagère %(sname)s" + +#: cps/web.py:2615 +#, python-format +msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgstr "Désolé, vous n’êtes pas autorisé à enlever un livre de cette étagère : %(sname)s" + +#: cps/web.py:2635 cps/web.py:2659 +#, python-format +msgid "A shelf with the name '%(title)s' already exists." +msgstr "Une étagère de ce nom '%(title)s' existe déjà." + +#: cps/web.py:2640 +#, python-format +msgid "Shelf %(title)s created" +msgstr "Étagère %(title)s créée" + +#: cps/web.py:2642 cps/web.py:2670 +msgid "There was an error" +msgstr "Il y a eu une erreur" + +#: cps/web.py:2643 cps/web.py:2645 +msgid "create a shelf" +msgstr "Créer une étagère" + +#: cps/web.py:2668 +#, python-format +msgid "Shelf %(title)s changed" +msgstr "L’étagère %(title)s a été modifiée" + +#: cps/web.py:2671 cps/web.py:2673 +msgid "Edit a shelf" +msgstr "Modifier une étagère" + +#: cps/web.py:2694 +#, python-format +msgid "successfully deleted shelf %(name)s" +msgstr "l’étagère %(name)s a été supprimé avec succès" + +#: cps/web.py:2721 +#, python-format +msgid "Shelf: '%(name)s'" +msgstr "Étagère : '%(name)s'" + +#: cps/web.py:2724 +msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "Erreur à l’ouverture de l’étagère. Elle n’existe plus ou n’est plus accessible." + +#: cps/web.py:2755 +#, python-format +msgid "Change order of Shelf: '%(name)s'" +msgstr "Modifier l’arrangement de l’étagère : ‘%(name)s’" + +#: cps/web.py:2784 cps/web.py:3207 +msgid "E-mail is not from valid domain" +msgstr "Cette adresse de courriel n’appartient pas à un domaine valide" + +#: cps/web.py:2786 cps/web.py:2829 cps/web.py:2832 +#, python-format +msgid "%(name)s's profile" +msgstr "Profil de %(name)s" + +#: cps/web.py:2827 +msgid "Found an existing account for this e-mail address." +msgstr "Un compte existant a été trouvé pour cette adresse de courriel" + +#: cps/web.py:2830 +msgid "Profile updated" +msgstr "Profil mis à jour" + +#: cps/web.py:2858 +msgid "Admin page" +msgstr "Page administrateur" + +#: cps/web.py:2938 cps/web.py:3112 +msgid "Calibre-Web configuration updated" +msgstr "Configuration de Calibre-Web mise à jour" + +#: cps/templates/admin.html:100 cps/web.py:2951 +msgid "UI Configuration" +msgstr "Configuration de l’interface utilisateur" + +#: cps/web.py:2969 +msgid "Import of optional Google Drive requirements missing" +msgstr "L’import des pré-requis optionnels pour Google Drive est manquant" + +#: cps/web.py:2972 +msgid "client_secrets.json is missing or not readable" +msgstr "client_secrets.json est manquant ou ne peut être lu" + +#: cps/web.py:2977 cps/web.py:3004 +msgid "client_secrets.json is not configured for web application" +msgstr "client_secrets.json n’est pas configuré pour une application web" + +#: cps/templates/admin.html:99 cps/web.py:3007 cps/web.py:3033 cps/web.py:3045 +#: cps/web.py:3088 cps/web.py:3103 cps/web.py:3120 cps/web.py:3127 +#: cps/web.py:3142 +msgid "Basic Configuration" +msgstr "Configuration principale" + +#: cps/web.py:3030 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "L’emplacement du fichier de la clé de chiffrement (keyfile) n’est pas valide, veuillez saisir un chemin d’accès correct" + +#: cps/web.py:3042 +msgid "Certfile location is not valid, please enter correct path" +msgstr "L’emplacement du fichier de certificat (cert) n’est pas valide, veuillez saisir un chemin d’accès correct" + +#: cps/web.py:3085 +msgid "Logfile location is not valid, please enter correct path" +msgstr "L’emplacement du fichier de Log n’est pas valide, veuillez saisir un chemin d’accès correct" + +#: cps/web.py:3124 +msgid "DB location is not valid, please enter correct path" +msgstr "L’emplacement du fichier de base de donnée (DB) n’est pas valide, veuillez saisir un chemin d’accès correct" + +#: cps/templates/admin.html:33 cps/web.py:3203 cps/web.py:3209 cps/web.py:3225 +msgid "Add new user" +msgstr "Ajouter un nouvel utilisateur" + +#: cps/web.py:3215 +#, python-format +msgid "User '%(user)s' created" +msgstr "Utilisateur '%(user)s' créé" + +#: cps/web.py:3219 +msgid "Found an existing account for this e-mail address or nickname." +msgstr "Un compte existant a été trouvé pour cette adresse de courriel ou pour ce surnom." + +#: cps/web.py:3243 cps/web.py:3257 +msgid "E-mail server settings updated" +msgstr "Les paramètres du serveur de courriels ont été mis à jour" + +#: cps/web.py:3250 +#, python-format +msgid "Test e-mail successfully send to %(kindlemail)s" +msgstr "Courriel de test envoyé avec succès sur %(kindlemail)s" + +#: cps/web.py:3253 +#, python-format +msgid "There was an error sending the Test e-mail: %(res)s" +msgstr "Il y a eu une erreur pendant l’envoi du courriel de test : %(res)s" + +#: cps/web.py:3258 +msgid "Edit e-mail server settings" +msgstr "Modifier les paramètres du serveur de courriels" + +#: cps/web.py:3283 +#, python-format +msgid "User '%(nick)s' deleted" +msgstr "Utilisateur '%(nick)s' supprimé" + +#: cps/web.py:3392 +#, python-format +msgid "User '%(nick)s' updated" +msgstr "Utilisateur '%(nick)s' mis à jour" + +#: cps/web.py:3395 +msgid "An unknown error occured." +msgstr "Oups ! Une erreur inconnue a eu lieu." + +#: cps/web.py:3397 +#, python-format +msgid "Edit User %(nick)s" +msgstr "Éditer l'utilisateur %(nick)s" + +#: cps/web.py:3414 +#, python-format +msgid "Password for user %(user)s reset" +msgstr "Le mot de passe de l’utilisateur %(user)s a été réinitialisé" + +#: cps/web.py:3428 cps/web.py:3629 +msgid "Error opening eBook. File does not exist or file is not accessible" +msgstr "Erreur à l’ouverture du livre. Le fichier n’existe pas ou n’est pas accessible" + +#: cps/web.py:3453 cps/web.py:3912 +msgid "edit metadata" +msgstr "modifier les métadonnées" + +#: cps/web.py:3546 cps/web.py:3782 +#, python-format +msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" +msgstr "L’extension de fichier '%(ext)s' n’est pas autorisée pour être déposée sur ce serveur" + +#: cps/web.py:3550 cps/web.py:3786 +msgid "File to be uploaded must have an extension" +msgstr "Pour être déposé le fichier doit avoir une extension" + +#: cps/web.py:3562 cps/web.py:3806 +#, python-format +msgid "Failed to create path %(path)s (Permission denied)." +msgstr "Impossible de créer le chemin %(path)s (permission refusée)" + +#: cps/web.py:3567 +#, python-format +msgid "Failed to store file %(file)s." +msgstr "Echec de la sauvegarde du fichier %(file)s." + +#: cps/web.py:3583 +#, python-format +msgid "File format %(ext)s added to %(book)s" +msgstr "Le format de fichier %(ext)s a été ajouté à %(book)s" + +#: cps/web.py:3601 +#, python-format +msgid "Failed to create path for cover %(path)s (Permission denied)." +msgstr "Impossible de créer le chemin d’accès pour la couverture %(path)s (Autorisation refusée)" + +#: cps/web.py:3608 +#, python-format +msgid "Failed to store cover-file %(cover)s." +msgstr "Echec de la sauvegarde du fichier de couverture %(cover)s." + +#: cps/web.py:3611 +msgid "Cover-file is not a valid image file" +msgstr "Le fichier de couverture n’est pas un fichier d’image valide" + +#: cps/web.py:3641 cps/web.py:3650 cps/web.py:3654 +msgid "unknown" +msgstr "inconnu" + +#: cps/web.py:3673 +msgid "Cover is not a jpg file, can't save" +msgstr "Le fichier de couverture n’est pas au format jpg, impossible de sauvegarder" + +#: cps/web.py:3721 +#, python-format +msgid "%(langname)s is not a valid language" +msgstr "%(langname)s n'est pas une langue valide" + +#: cps/web.py:3752 +msgid "Metadata successfully updated" +msgstr "" + +#: cps/web.py:3761 +msgid "Error editing book, please check logfile for details" +msgstr "Erreur d’édition du livre, veuillez consulter le journal (log) pour plus de détails" + +#: cps/web.py:3811 +#, python-format +msgid "Failed to store file %(file)s (Permission denied)." +msgstr "Impossible d'enregistrer le fichier %(file)s (permission refusée)" + +#: cps/web.py:3816 +#, python-format +msgid "Failed to delete file %(file)s (Permission denied)." +msgstr "Impossible de supprimer le fichier %(file)s (permission refusée)" + +#: cps/web.py:3898 +#, python-format +msgid "File %(file)s uploaded" +msgstr "Fichier %(file)s déposé" + +#: cps/web.py:3928 +msgid "Source or destination format for conversion missing" +msgstr "Le format de conversion de la source ou de la destination est manquant" + +#: cps/web.py:3938 +#, python-format +msgid "Book successfully queued for converting to %(book_format)s" +msgstr "Le livre a été mis avec succès en file de traitement pour conversion vers %(book_format)s" + +#: cps/web.py:3942 +#, python-format +msgid "There was an error converting this book: %(res)s" +msgstr "Une erreur est survenue au cours de la conversion du livre : %(res)s" + +#: cps/worker.py:287 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "La commande ebook-convert a échouée : %(error)s" + +#: cps/worker.py:298 +#, python-format +msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" +msgstr "La commande Kindlegen a échouée avec le code d’erreur : %(error)s et le message : %(message)s" + +#: cps/templates/admin.html:6 +msgid "User list" +msgstr "Liste des utilisateurs" + +#: cps/templates/admin.html:9 +msgid "Nickname" +msgstr "Surnom" + +#: cps/templates/admin.html:10 +msgid "E-mail" +msgstr "Courriel" + +#: cps/templates/admin.html:11 +msgid "Kindle" +msgstr "Kindle" + +#: cps/templates/admin.html:12 +msgid "DLS" +msgstr "DLS" + +#: cps/templates/admin.html:13 cps/templates/layout.html:74 +msgid "Admin" +msgstr "Administration" + +#: cps/templates/admin.html:14 cps/templates/detail.html:22 +#: cps/templates/detail.html:31 +msgid "Download" +msgstr "Télécharger" + +#: cps/templates/admin.html:15 cps/templates/layout.html:64 +msgid "Upload" +msgstr "Déposer" + +#: cps/templates/admin.html:16 +msgid "Edit" +msgstr "Éditer" + +#: cps/templates/admin.html:39 +msgid "SMTP e-mail server settings" +msgstr "Paramètres du serveur SMTP" + +#: cps/templates/admin.html:42 cps/templates/email_edit.html:11 +msgid "SMTP hostname" +msgstr "Adresse du serveur SMTP" + +#: cps/templates/admin.html:43 +msgid "SMTP port" +msgstr "Port du serveur SMTP" + +#: cps/templates/admin.html:44 +msgid "SSL" +msgstr "SSL" + +#: cps/templates/admin.html:45 cps/templates/email_edit.html:27 +msgid "SMTP login" +msgstr "Compte utilisateur SMTP" + +#: cps/templates/admin.html:46 +msgid "From mail" +msgstr "Expéditeur des courriels" + +#: cps/templates/admin.html:56 +msgid "Change SMTP settings" +msgstr "Modifier les paramètres SMTP" + +#: cps/templates/admin.html:62 +msgid "Configuration" +msgstr "Configuration" + +#: cps/templates/admin.html:65 +msgid "Calibre DB dir" +msgstr "Répertoire de la base de donnée Calibre" + +#: cps/templates/admin.html:69 +msgid "Log level" +msgstr "Niveau de journalisation" + +#: cps/templates/admin.html:73 +msgid "Port" +msgstr "Port" + +#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23 +msgid "Books per page" +msgstr "Livres par page" + +#: cps/templates/admin.html:83 +msgid "Uploading" +msgstr "Dépôt de fichier" + +#: cps/templates/admin.html:87 +msgid "Anonymous browsing" +msgstr "Navigation anonyme" + +#: cps/templates/admin.html:91 +msgid "Public registration" +msgstr "Inscription public" + +#: cps/templates/admin.html:95 cps/templates/remote_login.html:4 +msgid "Remote login" +msgstr "Connexion (\"magic link\")" + +#: cps/templates/admin.html:106 +msgid "Administration" +msgstr "Administration" + +#: cps/templates/admin.html:107 +msgid "Reconnect to Calibre DB" +msgstr "Se reconnecter à Calibre-Web" + +#: cps/templates/admin.html:108 +msgid "Restart Calibre-Web" +msgstr "Redémarrer Calibre-Web" + +#: cps/templates/admin.html:109 +msgid "Stop Calibre-Web" +msgstr "Arrêter Calibre-Web" + +#: cps/templates/admin.html:115 +msgid "Update" +msgstr "Mise à jour de Calibre-Web" + +#: cps/templates/admin.html:119 +msgid "Version" +msgstr "Version" + +#: cps/templates/admin.html:120 +msgid "Details" +msgstr "Détails" + +#: cps/templates/admin.html:126 +msgid "Current version" +msgstr "Version actuellement installée" + +#: cps/templates/admin.html:132 +msgid "Check for update" +msgstr "Rechercher les mise à jour" + +#: cps/templates/admin.html:133 +msgid "Perform Update" +msgstr "Effectuer la mise à jour" + +#: cps/templates/admin.html:145 +msgid "Do you really want to restart Calibre-Web?" +msgstr "Voulez-vous vraiment redémarrer Calibre-Web?" + +#: cps/templates/admin.html:150 cps/templates/admin.html:164 +#: cps/templates/admin.html:184 cps/templates/shelf.html:61 +msgid "Ok" +msgstr "D’accord" + +#: cps/templates/admin.html:151 cps/templates/admin.html:165 +#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200 +#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168 +#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75 +#: cps/templates/shelf.html:62 cps/templates/shelf_edit.html:19 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155 +msgid "Back" +msgstr "Retour" + +#: cps/templates/admin.html:163 +msgid "Do you really want to stop Calibre-Web?" +msgstr "Voulez-Vous vraiment arrêter Calibre-Web?" + +#: cps/templates/admin.html:175 +msgid "Updating, please do not reload page" +msgstr "Mise à jour en cours, ne pas rafraîchir la page" + +#: cps/templates/author.html:15 +msgid "via" +msgstr "via" + +#: cps/templates/author.html:23 +msgid "In Library" +msgstr "Dans la librairie" + +#: cps/templates/author.html:69 +msgid "More by" +msgstr "Plus de" + +#: cps/templates/book_edit.html:16 +msgid "Delete Book" +msgstr "Effacer le livre" + +#: cps/templates/book_edit.html:19 +msgid "Delete formats:" +msgstr "Supprimer les formats :" + +#: cps/templates/book_edit.html:22 cps/templates/book_edit.html:199 +#: cps/templates/email_edit.html:73 cps/templates/email_edit.html:74 +msgid "Delete" +msgstr "Supprimer" + +#: cps/templates/book_edit.html:30 +msgid "Convert book format:" +msgstr "Convertir le format du livre :" + +#: cps/templates/book_edit.html:34 +msgid "Convert from:" +msgstr "Convertir depuis :" + +#: cps/templates/book_edit.html:36 cps/templates/book_edit.html:43 +msgid "select an option" +msgstr "Choisissez un format" + +#: cps/templates/book_edit.html:41 +msgid "Convert to:" +msgstr "Convertir vers :" + +#: cps/templates/book_edit.html:50 +msgid "Convert book" +msgstr "Convertir le livre" + +#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6 +msgid "Book Title" +msgstr "Titre du livre" + +#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:259 +#: cps/templates/book_edit.html:277 cps/templates/search_form.html:10 +msgid "Author" +msgstr "Auteur" + +#: cps/templates/book_edit.html:67 cps/templates/book_edit.html:264 +#: cps/templates/book_edit.html:279 cps/templates/search_form.html:106 +msgid "Description" +msgstr "Description" + +#: cps/templates/book_edit.html:71 cps/templates/search_form.html:33 +msgid "Tags" +msgstr "Étiquette" + +#: cps/templates/book_edit.html:75 cps/templates/layout.html:157 +#: cps/templates/search_form.html:53 +msgid "Series" +msgstr "Séries" + +#: cps/templates/book_edit.html:79 +msgid "Series id" +msgstr "Numéro dans la série" + +#: cps/templates/book_edit.html:83 +msgid "Rating" +msgstr "Évaluation" + +#: cps/templates/book_edit.html:87 +msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +msgstr "URL de la couverture (jpg, la couverture est déposée sur le serveur et sauvegardée en base, ce champ est ensuite remis à vide)" + +#: cps/templates/book_edit.html:91 +msgid "Upload Cover from local drive" +msgstr "Déposer la couverture depuis un fichier en local…" + +#: cps/templates/book_edit.html:96 cps/templates/detail.html:135 +msgid "Publishing date" +msgstr "Date de publication " + +#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:278 cps/templates/detail.html:127 +#: cps/templates/search_form.html:14 +msgid "Publisher" +msgstr "Editeur " + +#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31 +msgid "Language" +msgstr "Langue" + +#: cps/templates/book_edit.html:117 cps/templates/search_form.html:117 +msgid "Yes" +msgstr "Oui" + +#: cps/templates/book_edit.html:118 cps/templates/search_form.html:118 +msgid "No" +msgstr "Non" + +#: cps/templates/book_edit.html:164 +msgid "Upload format" +msgstr "Format du fichier déposé" + +#: cps/templates/book_edit.html:173 +msgid "view book after edit" +msgstr "voir le livre après l'édition" + +#: cps/templates/book_edit.html:176 cps/templates/book_edit.html:212 +msgid "Get metadata" +msgstr "Obtenir les métadonnées" + +#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210 +#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20 +#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17 +#: cps/templates/user_edit.html:153 +msgid "Submit" +msgstr "Soumettre" + +#: cps/templates/book_edit.html:191 +msgid "Are you really sure?" +msgstr "Etes-vous vraiment sur?" + +#: cps/templates/book_edit.html:194 +msgid "Book will be deleted from Calibre database" +msgstr "Le livre va être supprimé de la base de données de Calibre" + +#: cps/templates/book_edit.html:195 +msgid "and from hard disk" +msgstr "et du disque dur" + +#: cps/templates/book_edit.html:215 +msgid "Keyword" +msgstr "Mot-clé" + +#: cps/templates/book_edit.html:216 +msgid " Search keyword " +msgstr " Rechercher le mot-clé " + +#: cps/templates/book_edit.html:218 cps/templates/layout.html:46 +msgid "Go!" +msgstr "Allez !" + +#: cps/templates/book_edit.html:222 +msgid "Click the cover to load metadata to the form" +msgstr "Cliquer sur la couverture pour importer les métadonnées dans le formulaire" + +#: cps/templates/book_edit.html:234 cps/templates/book_edit.html:274 +msgid "Loading..." +msgstr "Chargement…" + +#: cps/templates/book_edit.html:239 cps/templates/layout.html:224 +msgid "Close" +msgstr "Fermer" + +#: cps/templates/book_edit.html:266 cps/templates/book_edit.html:280 +msgid "Source" +msgstr "Source" + +#: cps/templates/book_edit.html:275 +msgid "Search error!" +msgstr "Rechercher les erreur!" + +#: cps/templates/book_edit.html:276 +msgid "No Result(s) found! Please try aonther keyword." +msgstr "Aucun résultat. Veuillez essayer avec un nouveau mot clé." + +#: cps/templates/config_edit.html:12 +msgid "Library Configuration" +msgstr "Configuration de la Bibliothèque" + +#: cps/templates/config_edit.html:19 +msgid "Location of Calibre database" +msgstr "Emplacement de la base de donnée Calibre" + +#: cps/templates/config_edit.html:24 +msgid "Use Google Drive?" +msgstr "Utiliser Google Drive ?" + +#: cps/templates/config_edit.html:30 +msgid "Google Drive config problem" +msgstr "Problème avec la configuration Google Drive" + +#: cps/templates/config_edit.html:36 +msgid "Authenticate Google Drive" +msgstr "Authentification Google Drive" + +#: cps/templates/config_edit.html:40 +msgid "Please finish Google Drive setup after login" +msgstr "Veuillez terminer la configuration de Google Drive après la connexion" + +#: cps/templates/config_edit.html:44 +msgid "Google Drive Calibre folder" +msgstr "Répertoire Google Drive pour Calibre" + +#: cps/templates/config_edit.html:52 +msgid "Metadata Watch Channel ID" +msgstr "Metadata Watch Channel ID" + +#: cps/templates/config_edit.html:55 +msgid "Revoke" +msgstr "Révoquer" + +#: cps/templates/config_edit.html:73 +msgid "Server Configuration" +msgstr "Configuration réseau du serveur" + +#: cps/templates/config_edit.html:80 +msgid "Server Port" +msgstr "Numéro de port" + +#: cps/templates/config_edit.html:84 +msgid "SSL certfile location (leave it empty for non-SSL Servers)" +msgstr "Emplacement du certificat SSL (laisser vide pour les serveurs non SSL)" + +#: cps/templates/config_edit.html:88 +msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" +msgstr "Emplacement de la clé de chiffrement SSL (laisser vide pour les serveurs non SSL)" + +#: cps/templates/config_edit.html:99 +msgid "Logfile Configuration" +msgstr "Configuration du journal d’évenements" + +#: cps/templates/config_edit.html:106 +msgid "Log Level" +msgstr "Niveau de journalisation" + +#: cps/templates/config_edit.html:115 +msgid "Location and name of logfile (calibre-web.log for no entry)" +msgstr "Emplacement et nom du fichier journal (sera calibre-web.log si vide)" + +#: cps/templates/config_edit.html:126 +msgid "Feature Configuration" +msgstr "Configuration des options" + +#: cps/templates/config_edit.html:134 +msgid "Enable uploading" +msgstr "Autoriser le dépôt de fichier" + +#: cps/templates/config_edit.html:138 +msgid "Enable anonymous browsing" +msgstr "Autoriser la navigation anonyme" + +#: cps/templates/config_edit.html:142 +msgid "Enable public registration" +msgstr "Autoriser l’inscription publique" + +#: cps/templates/config_edit.html:146 +msgid "Enable remote login (\"magic link\")" +msgstr "Activer la connexion (\"magic link\")" + +#: cps/templates/config_edit.html:151 +msgid "Use" +msgstr "Utiliser" + +#: cps/templates/config_edit.html:152 +msgid "Obtain an API Key" +msgstr "Obtenir la clé API" + +#: cps/templates/config_edit.html:156 +msgid "Goodreads API Key" +msgstr "Clé de l’API Goodreads" + +#: cps/templates/config_edit.html:160 +msgid "Goodreads API Secret" +msgstr "Secret de l’API Goodreads" + +#: cps/templates/config_edit.html:173 +msgid "External binaries" +msgstr "Configuration des outils de conversion externes" + +#: cps/templates/config_edit.html:181 +msgid "No converter" +msgstr "Pas de convertisseur" + +#: cps/templates/config_edit.html:183 +msgid "Use Kindlegen" +msgstr "Utiliser Kindlegen" + +#: cps/templates/config_edit.html:185 +msgid "Use calibre's ebook converter" +msgstr "Utiliser Calibre ebook-convert" + +#: cps/templates/config_edit.html:189 +msgid "E-Book converter settings" +msgstr "Paramètres de la commande de conversion de livres" + +#: cps/templates/config_edit.html:193 +msgid "Path to convertertool" +msgstr "Chemin d’accès à la commande de conversion" + +#: cps/templates/config_edit.html:199 +msgid "Location of Unrar binary" +msgstr "Chemin d’accès à la commande UnRar" + +#: cps/templates/config_edit.html:215 cps/templates/layout.html:82 +#: cps/templates/login.html:4 +msgid "Login" +msgstr "Connexion" + +#: cps/templates/config_view_edit.html:12 +msgid "View Configuration" +msgstr "Configuration du mode d’affichage" + +#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 +#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 +msgid "Title" +msgstr "Titre" + +#: cps/templates/config_view_edit.html:27 +msgid "No. of random books to show" +msgstr "Nombre de livres choisis au hasard à afficher" + +#: cps/templates/config_view_edit.html:31 +msgid "Regular expression for ignoring columns" +msgstr "Expression régulière à utiliser pour filtrer les colonnes" + +#: cps/templates/config_view_edit.html:35 +msgid "Link read/unread status to Calibre column" +msgstr "Lier le statut lu/non lu à la colonne équivalente dans Calibre" + +#: cps/templates/config_view_edit.html:44 +msgid "Regular expression for title sorting" +msgstr "Expression régulière à utiliser pour trier les titres" + +#: cps/templates/config_view_edit.html:48 +msgid "Tags for Mature Content" +msgstr "Mots clés pour contenue pour adulte" + +#: cps/templates/config_view_edit.html:62 +msgid "Default settings for new users" +msgstr "Réglages par défaut pour les nouveaux utilisateurs" + +#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110 +msgid "Admin user" +msgstr "Utilisateur admin" + +#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119 +msgid "Allow Downloads" +msgstr "Permettre les téléchargements" + +#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123 +msgid "Allow Uploads" +msgstr "Permettre le dépôt de fichiers" + +#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127 +msgid "Allow Edit" +msgstr "Permettre l'édition" + +#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131 +msgid "Allow Delete books" +msgstr "Autoriser la suppression des livres" + +#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136 +msgid "Allow Changing Password" +msgstr "Permettre le changement de mot de passe" + +#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140 +msgid "Allow Editing Public Shelfs" +msgstr "Autoriser la modification d’étagères publiques" + +#: cps/templates/config_view_edit.html:104 +msgid "Default visibilities for new users" +msgstr "Mode de visualisation par défaut pour les nouveaux utulisateurs" + +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58 +msgid "Show random books" +msgstr "Montrer des livres au hasard" + +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62 +msgid "Show recent books" +msgstr "Afficher les livres récents" + +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66 +msgid "Show sorted books" +msgstr "Afficher les livres triés" + +#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70 +msgid "Show hot books" +msgstr "Montrer les livres populaires" + +#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74 +msgid "Show best rated books" +msgstr "Montrer les livres les mieux notés" + +#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78 +msgid "Show language selection" +msgstr "Montrer la sélection par langue" + +#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82 +msgid "Show series selection" +msgstr "Montrer la sélection par séries" + +#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86 +msgid "Show category selection" +msgstr "Montrer la sélection par catégories" + +#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90 +msgid "Show author selection" +msgstr "Montrer la sélection par auteur" + +#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94 +msgid "Show publisher selection" +msgstr "" + +#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98 +msgid "Show read and unread" +msgstr "Montrer lu et non-lu" + +#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102 +msgid "Show random books in detail view" +msgstr "Montrer aléatoirement des livres dans la vue détaillée" + +#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115 +msgid "Show mature content" +msgstr "Montrer le contenu pour adulte" + +#: cps/templates/detail.html:49 +msgid "Read in browser" +msgstr "Lire dans le navigateur" + +#: cps/templates/detail.html:88 +msgid "Book" +msgstr "Livre" + +#: cps/templates/detail.html:88 +msgid "of" +msgstr "de" + +#: cps/templates/detail.html:94 +msgid "language" +msgstr "langue" + +#: cps/templates/detail.html:172 +msgid "Read" +msgstr "Lu" + +#: cps/templates/detail.html:182 +msgid "Description:" +msgstr "Description :" + +#: cps/templates/detail.html:195 cps/templates/search.html:14 +msgid "Add to shelf" +msgstr "Ajouter à l'étagère" + +#: cps/templates/detail.html:257 +msgid "Edit metadata" +msgstr "Éditer les métadonnées" + +#: cps/templates/email_edit.html:15 +msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +msgstr "Port SMTP (habituellement 25 pour strict SMTP et 465 pour SSL et 587 pour STARTTLS)" + +#: cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "Type de chiffrement" + +#: cps/templates/email_edit.html:21 +msgid "None" +msgstr "Aucun" + +#: cps/templates/email_edit.html:22 +msgid "STARTTLS" +msgstr "STARTTLS" + +#: cps/templates/email_edit.html:23 +msgid "SSL/TLS" +msgstr "SSL/TLS" + +#: cps/templates/email_edit.html:31 +msgid "SMTP password" +msgstr "Mot de passe utilisateur SMTP" + +#: cps/templates/email_edit.html:35 +msgid "From e-mail" +msgstr "Adresse de l’expéditeur des courriels" + +#: cps/templates/email_edit.html:38 +msgid "Save settings" +msgstr "Sauvegarder les réglages" + +#: cps/templates/email_edit.html:39 +msgid "Save settings and send Test E-Mail" +msgstr "Sauvegarder les réglages et tester l’envoi d’un courriel" + +#: cps/templates/email_edit.html:43 +msgid "Allowed domains for registering" +msgstr "Domaines autorisés pour l’inscription" + +#: cps/templates/email_edit.html:47 +msgid "Enter domainname" +msgstr "Saisir le nom du domaine" + +#: cps/templates/email_edit.html:55 +msgid "Add Domain" +msgstr "Ajouter un domaine" + +#: cps/templates/email_edit.html:58 +msgid "Add" +msgstr "Ajouter" + +#: cps/templates/email_edit.html:72 +msgid "Do you really want to delete this domain rule?" +msgstr "Souhaitez-vous vraiment supprimer cette règle de domaine ?" + +#: cps/templates/feed.xml:21 cps/templates/layout.html:208 +msgid "Next" +msgstr "Suivant" + +#: cps/templates/feed.xml:33 cps/templates/index.xml:11 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 +msgid "Search" +msgstr "Chercher" + +#: cps/templates/index.html:5 +msgid "Discover (Random Books)" +msgstr "Découverte (livres au hasard)" + +#: cps/templates/index.xml:6 +msgid "Start" +msgstr "Démarrer" + +#: cps/templates/index.xml:18 cps/templates/layout.html:139 +msgid "Hot Books" +msgstr "Livres populaires" + +#: cps/templates/index.xml:22 +msgid "Popular publications from this catalog based on Downloads." +msgstr "Publications populaires depuis le catalogue basées sur les téléchargements." + +#: cps/templates/index.xml:25 cps/templates/layout.html:142 +msgid "Best rated Books" +msgstr "Livres les mieux notés" + +#: cps/templates/index.xml:29 +msgid "Popular publications from this catalog based on Rating." +msgstr "Publications populaires de ce catalogue sur la base de notes." + +#: cps/templates/index.xml:32 +msgid "New Books" +msgstr "Nouveaux livres" + +#: cps/templates/index.xml:36 +msgid "The latest Books" +msgstr "Les derniers livres" + +#: cps/templates/index.xml:43 +msgid "Show Random Books" +msgstr "Montrer des livres au hasard" + +#: cps/templates/index.xml:62 cps/templates/layout.html:160 +msgid "Authors" +msgstr "Auteurs" + +#: cps/templates/index.xml:66 +msgid "Books ordered by Author" +msgstr "Livres classés par auteur" + +#: cps/templates/index.xml:69 cps/templates/layout.html:163 +msgid "Publishers" +msgstr "" + +#: cps/templates/index.xml:73 +msgid "Books ordered by publisher" +msgstr "" + +#: cps/templates/index.xml:80 +msgid "Books ordered by category" +msgstr "Livres classés par catégorie" + +#: cps/templates/index.xml:87 +msgid "Books ordered by series" +msgstr "Livres classés par série" + +#: cps/templates/index.xml:90 cps/templates/layout.html:169 +msgid "Public Shelves" +msgstr "Étagères publiques" + +#: cps/templates/index.xml:94 +msgid "Books organized in public shelfs, visible to everyone" +msgstr "Livres disponibles dans les étagères publiques, visibles par tous" + +#: cps/templates/index.xml:98 cps/templates/layout.html:173 +msgid "Your Shelves" +msgstr "Vos étagères" + +#: cps/templates/index.xml:102 +msgid "User's own shelfs, only visible to the current user himself" +msgstr "Etagères personnelles, seulement visible de l’utilisateur propréitaire" + +#: cps/templates/layout.html:33 +msgid "Toggle navigation" +msgstr "Basculer la navigation" + +#: cps/templates/layout.html:54 +msgid "Advanced Search" +msgstr "Recherche avancée" + +#: cps/templates/layout.html:78 +msgid "Logout" +msgstr "Déconnexion" + +#: cps/templates/layout.html:83 cps/templates/register.html:14 +msgid "Register" +msgstr "S'enregistrer" + +#: cps/templates/layout.html:108 +msgid "Uploading..." +msgstr "Dépôt en cours…" + +#: cps/templates/layout.html:109 +msgid "please don't refresh the page" +msgstr "Veuillez ne PAS rafraîchir la page" + +#: cps/templates/layout.html:120 +msgid "Browse" +msgstr "Explorer" + +#: cps/templates/layout.html:122 +msgid "Recently Added" +msgstr "Ajouts récents" + +#: cps/templates/layout.html:127 +msgid "Sorted Books" +msgstr "Classer les livres" + +#: cps/templates/layout.html:131 cps/templates/layout.html:132 +#: cps/templates/layout.html:133 cps/templates/layout.html:134 +msgid "Sort By" +msgstr "Classer par" + +#: cps/templates/layout.html:131 +msgid "Newest" +msgstr "Récents" + +#: cps/templates/layout.html:132 +msgid "Oldest" +msgstr "Anciens" + +#: cps/templates/layout.html:133 +msgid "Ascending" +msgstr "Ascendant" + +#: cps/templates/layout.html:134 +msgid "Descending" +msgstr "Descendant" + +#: cps/templates/layout.html:151 +msgid "Discover" +msgstr "Découvrir" + +#: cps/templates/layout.html:154 +msgid "Categories" +msgstr "Catégories" + +#: cps/templates/layout.html:166 cps/templates/search_form.html:74 +msgid "Languages" +msgstr "Langues" + +#: cps/templates/layout.html:178 +msgid "Create a Shelf" +msgstr "Créer une étagère" + +#: cps/templates/layout.html:179 cps/templates/stats.html:3 +msgid "About" +msgstr "À propos" + +#: cps/templates/layout.html:193 +msgid "Previous" +msgstr "Précédent" + +#: cps/templates/layout.html:220 +msgid "Book Details" +msgstr "Détails du livre" + +#: cps/templates/login.html:8 cps/templates/login.html:9 +#: cps/templates/register.html:7 cps/templates/user_edit.html:8 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: cps/templates/login.html:12 cps/templates/login.html:13 +#: cps/templates/user_edit.html:21 +msgid "Password" +msgstr "Mot de passe" + +#: cps/templates/login.html:17 +msgid "Remember me" +msgstr "Se rappeler de moi" + +#: cps/templates/login.html:22 +msgid "Log in with magic link" +msgstr "Se connecter avec le (\"magic link\")" + +#: cps/templates/osd.xml:5 +msgid "Calibre-Web ebook catalog" +msgstr "Catalogue de livres électroniques Calibre-Web" + +#: cps/templates/read.html:69 cps/templates/readcbr.html:79 +#: cps/templates/readcbr.html:103 +msgid "Settings" +msgstr "Paramètres" + +#: cps/templates/read.html:72 +msgid "Reflow text when sidebars are open." +msgstr "Mettre à jour la mise en page du texte quand les bandeaux latéraux sont ouverts" + +#: cps/templates/readcbr.html:84 +msgid "Keyboard Shortcuts" +msgstr "Raccourcis clavier" + +#: cps/templates/readcbr.html:87 +msgid "Previous Page" +msgstr "Page précédente" + +#: cps/templates/readcbr.html:88 +msgid "Next Page" +msgstr "Page suivante" + +#: cps/templates/readcbr.html:89 +msgid "Scale to Best" +msgstr "Mise à l’échelle optimale" + +#: cps/templates/readcbr.html:90 +msgid "Scale to Width" +msgstr "Mise à l’échelle sur la largeur" + +#: cps/templates/readcbr.html:91 +msgid "Scale to Height" +msgstr "Mise à l’échelle sur la hauteur" + +#: cps/templates/readcbr.html:92 +msgid "Scale to Native" +msgstr "Mise à l’échelle d’origine" + +#: cps/templates/readcbr.html:93 +msgid "Rotate Right" +msgstr "Rotation droite" + +#: cps/templates/readcbr.html:94 +msgid "Rotate Left" +msgstr "Rotation gauche" + +#: cps/templates/readcbr.html:95 +msgid "Flip Image" +msgstr "Inverser l’image" + +#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39 +msgid "Theme" +msgstr "Thème" + +#: cps/templates/readcbr.html:111 +msgid "Light" +msgstr "Clair" + +#: cps/templates/readcbr.html:112 +msgid "Dark" +msgstr "Sombre" + +#: cps/templates/readcbr.html:117 +msgid "Scale" +msgstr "Echelle" + +#: cps/templates/readcbr.html:120 +msgid "Best" +msgstr "Optimal" + +#: cps/templates/readcbr.html:121 +msgid "Width" +msgstr "Largeur" + +#: cps/templates/readcbr.html:122 +msgid "Height" +msgstr "Hauteur" + +#: cps/templates/readcbr.html:123 +msgid "Native" +msgstr "Origine" + +#: cps/templates/readcbr.html:128 +msgid "Rotate" +msgstr "Rotation" + +#: cps/templates/readcbr.html:139 +msgid "Flip" +msgstr "Inverser" + +#: cps/templates/readcbr.html:142 +msgid "Horizontal" +msgstr "Horizontal" + +#: cps/templates/readcbr.html:143 +msgid "Vertical" +msgstr "Vertical" + +#: cps/templates/readpdf.html:29 +msgid "PDF.js viewer" +msgstr "Visionneuse PDF.js" + +#: cps/templates/readtxt.html:6 +msgid "Basic txt Reader" +msgstr "Lecteur de texte simple" + +#: cps/templates/register.html:4 +msgid "Register a new account" +msgstr "Enregistrer un nouveau compte" + +#: cps/templates/register.html:8 +msgid "Choose a username" +msgstr "Choisissez un nom d'utilisateur" + +#: cps/templates/register.html:11 cps/templates/user_edit.html:13 +msgid "E-mail address" +msgstr "Adresse de courriel" + +#: cps/templates/register.html:12 +msgid "Your email address" +msgstr "Votre adresse de courriel" + +#: cps/templates/remote_login.html:6 +msgid "Using your another device, visit" +msgstr "Utilisez votre autre dispositif, visitez" + +#: cps/templates/remote_login.html:6 +msgid "and log in" +msgstr "et s’authentifier" + +#: cps/templates/remote_login.html:9 +msgid "Once you do so, you will automatically get logged in on this device." +msgstr "Une fois fait, vous serez automatiquement connecté à cet appareil." + +#: cps/templates/search.html:5 +msgid "No Results for:" +msgstr "Aucun résultat pour :" + +#: cps/templates/search.html:6 +msgid "Please try a different search" +msgstr "Essayer une recherche différente" + +#: cps/templates/search.html:8 +msgid "Results for:" +msgstr "Résultats pour :" + +#: cps/templates/search_form.html:19 +msgid "Publishing date from" +msgstr "Date de publication (depuis)" + +#: cps/templates/search_form.html:26 +msgid "Publishing date to" +msgstr "Date de publication (jusqu’à)" + +#: cps/templates/search_form.html:43 +msgid "Exclude Tags" +msgstr "Exclure des étiquettes" + +#: cps/templates/search_form.html:63 +msgid "Exclude Series" +msgstr "Exclure les séries" + +#: cps/templates/search_form.html:84 +msgid "Exclude Languages" +msgstr "Exclure les langues" + +#: cps/templates/search_form.html:97 +msgid "Rating bigger than" +msgstr "Évaluation supérieure à" + +#: cps/templates/search_form.html:101 +msgid "Rating less than" +msgstr "Évaluation inférieure à" + +#: cps/templates/shelf.html:7 +msgid "Delete this Shelf" +msgstr "Supprimer cette étagère" + +#: cps/templates/shelf.html:8 +msgid "Edit Shelf" +msgstr "Modifier l’étagère" + +#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11 +msgid "Change order" +msgstr "Modifier l’ordre" + +#: cps/templates/shelf.html:56 +msgid "Do you really want to delete the shelf?" +msgstr "Voulez-vous vraiment supprimer l’étagère?" + +#: cps/templates/shelf.html:59 +msgid "Shelf will be lost for everybody and forever!" +msgstr "L’étagère sera supprimée pour tout le monde et de façon définitive !" + +#: cps/templates/shelf_edit.html:13 +msgid "should the shelf be public?" +msgstr "cette étagère doit-elle être publique ?" + +#: cps/templates/shelf_order.html:5 +msgid "Drag 'n drop to rearrange order" +msgstr "Glisser-déposer pour modifier l’ordre" + +#: cps/templates/stats.html:7 +msgid "Calibre library statistics" +msgstr "Statistiques de la librairie Calibre" + +#: cps/templates/stats.html:12 +msgid "Books in this Library" +msgstr "Livres dans la bibiothèque" + +#: cps/templates/stats.html:16 +msgid "Authors in this Library" +msgstr "Auteurs dans la bibliothèque" + +#: cps/templates/stats.html:20 +msgid "Categories in this Library" +msgstr "Catégories dans la librairie" + +#: cps/templates/stats.html:24 +msgid "Series in this Library" +msgstr "Séries dans la librairie" + +#: cps/templates/stats.html:28 +msgid "Linked libraries" +msgstr "Librairies liées" + +#: cps/templates/stats.html:32 +msgid "Program library" +msgstr "Bibliothèque logiciel" + +#: cps/templates/stats.html:33 +msgid "Installed Version" +msgstr "Version installée" + +#: cps/templates/tasks.html:7 +msgid "Tasks list" +msgstr "Liste des tâches" + +#: cps/templates/tasks.html:12 +msgid "User" +msgstr "Utilisateur" + +#: cps/templates/tasks.html:14 +msgid "Task" +msgstr "Tâche" + +#: cps/templates/tasks.html:15 +msgid "Status" +msgstr "Statut" + +#: cps/templates/tasks.html:16 +msgid "Progress" +msgstr "Avancement" + +#: cps/templates/tasks.html:17 +msgid "Runtime" +msgstr "Durée" + +#: cps/templates/tasks.html:18 +msgid "Starttime" +msgstr "Démarrage" + +#: cps/templates/tasks.html:24 +msgid "Delete finished tasks" +msgstr "Supprimer les tâches terminées" + +#: cps/templates/tasks.html:25 +msgid "Hide all tasks" +msgstr "Masquer toutes les tâches" + +#: cps/templates/user_edit.html:18 +msgid "Reset user Password" +msgstr "Réinitialiser le mot de passe de l’utilisateur" + +#: cps/templates/user_edit.html:27 +msgid "Kindle E-Mail" +msgstr "Adresse de courriel Kindle" + +#: cps/templates/user_edit.html:41 +msgid "Standard Theme" +msgstr "Thème par défaut" + +#: cps/templates/user_edit.html:42 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "Thème caliBur! Dark Theme (Beta)" + +#: cps/templates/user_edit.html:47 +msgid "Show books with language" +msgstr "Montrer les livres dans la langue" + +#: cps/templates/user_edit.html:49 +msgid "Show all" +msgstr "Montrer tout" + +#: cps/templates/user_edit.html:147 +msgid "Delete this user" +msgstr "Supprimer cet utilisateur" + +#: cps/templates/user_edit.html:162 +msgid "Recent Downloads" +msgstr "Téléchargements récents" + +#~ msgid "Current commit timestamp" +#~ msgstr "Horodatage de la version actuelle " + +#~ msgid "Newest commit timestamp" +#~ msgstr "Horodatage de la version la plus récente " + +#~ msgid "Convert: %(book)s" +#~ msgstr "Conversion : %(book)s" + +#~ msgid "Convert to %(format)s: %(book)s" +#~ msgstr "Conversion vers %(format)s : %(book)s" + +#~ msgid "Files are replaced" +#~ msgstr "Fichiers remplacés" + +#~ msgid "Server is stopped" +#~ msgstr "Serveur arrêté" + +#~ msgid "Convertertool %(converter)s not found" +#~ msgstr "Outil de conversion %(converter)s introuvable" + +#~ msgid "Choose a password" +#~ msgstr "Choisissez un mot de passe" + diff --git a/src/cps/translations/hu/LC_MESSAGES/messages.mo b/src/cps/translations/hu/LC_MESSAGES/messages.mo new file mode 100644 index 0000000..2a44d29 Binary files /dev/null and b/src/cps/translations/hu/LC_MESSAGES/messages.mo differ diff --git a/src/cps/translations/hu/LC_MESSAGES/messages.po b/src/cps/translations/hu/LC_MESSAGES/messages.po new file mode 100644 index 0000000..2755018 --- /dev/null +++ b/src/cps/translations/hu/LC_MESSAGES/messages.po @@ -0,0 +1,1938 @@ +# Hungarian translations for PROJECT. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2018-11-03 14:03+0100\n" +"PO-Revision-Date: 2018-10-11 18:13+0200\n" +"Last-Translator: \n" +"Language: hu\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134 +#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27 +msgid "not installed" +msgstr "nincs telepítve" + +#: cps/converter.py:22 cps/converter.py:38 +msgid "Excecution permissions missing" +msgstr "Nincs jogosultság a futtatáshoz" + +#: cps/converter.py:48 +msgid "not configured" +msgstr "" + +#: cps/helper.py:58 +#, python-format +msgid "%(format)s format not found for book id: %(book)d" +msgstr "A(z) %(format)s formátum nem található a következő könyvhöz: %(book)d" + +#: cps/helper.py:70 +#, python-format +msgid "%(format)s not found on Google Drive: %(fn)s" +msgstr "%(format)s nem található a Google Drive-on: %(fn)s" + +#: cps/helper.py:77 cps/helper.py:147 cps/templates/detail.html:44 +msgid "Send to Kindle" +msgstr "Küldés Kindle-re" + +#: cps/helper.py:78 cps/helper.py:96 +msgid "This e-mail has been sent via Calibre-Web." +msgstr "Ez az e-mail a Calibre-Web-en keresztül lett küldve." + +#: cps/helper.py:89 +#, python-format +msgid "%(format)s not found: %(fn)s" +msgstr "%(format)s nem található: %(fn)s" + +#: cps/helper.py:94 +msgid "Calibre-Web test e-mail" +msgstr "Calibre-Web teszt e-mail" + +#: cps/helper.py:95 +msgid "Test e-mail" +msgstr "Teszt e-mail" + +#: cps/helper.py:111 +msgid "Get Started with Calibre-Web" +msgstr "Kezdő lépések a Calibre-Web-bel" + +#: cps/helper.py:112 +#, python-format +msgid "Registration e-mail for user: %(name)s" +msgstr "Regisztrációs e-mail a következő felhasználóhoz: %(name)s" + +#: cps/helper.py:135 cps/helper.py:145 +msgid "Could not find any formats suitable for sending by e-mail" +msgstr "Az e-mail küldéséhez nem található megfelelő formátum" + +#: cps/helper.py:148 +#, python-format +msgid "E-mail: %(book)s" +msgstr "E-mail: %(book)s" + +#: cps/helper.py:150 +msgid "The requested file could not be read. Maybe wrong permissions?" +msgstr "A kért fájl nem olvasható. Esetleg jogosultsági probléma lenne?" + +#: cps/helper.py:250 +#, python-format +msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "A cím átnevezése \"%(src)s\"-ról \"%(dest)s\"-ra nem sikerült a következő hiba miatt: %(error)s" + +#: cps/helper.py:259 +#, python-format +msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "A szerző átnevezése \"%(src)s\"-ról \"%(dest)s\"-ra nem sikerült a következő hiba miatt: %(error)s" + +#: cps/helper.py:281 cps/helper.py:290 +#, python-format +msgid "File %(file)s not found on Google Drive" +msgstr "A \"%(file)s\" fájl nem található a Google Drive-on" + +#: cps/helper.py:308 +#, python-format +msgid "Book path %(path)s not found on Google Drive" +msgstr "A könyv elérési útja (\"%(path)s\") nem található a Google Drive-on" + +#: cps/helper.py:565 +msgid "Error excecuting UnRar" +msgstr "Hiba az UnRar futtatásakor" + +#: cps/helper.py:567 +msgid "Unrar binary file not found" +msgstr "Az Unrar futtatható állománya nem található" + +#: cps/helper.py:609 +msgid "Waiting" +msgstr "Várakozás" + +#: cps/helper.py:611 +msgid "Failed" +msgstr "Nem sikerült" + +#: cps/helper.py:613 +msgid "Started" +msgstr "Elindítva" + +#: cps/helper.py:615 +msgid "Finished" +msgstr "Végrehajtva" + +#: cps/helper.py:617 +msgid "Unknown Status" +msgstr "" + +#: cps/helper.py:622 +msgid "E-mail: " +msgstr "" + +#: cps/helper.py:624 cps/helper.py:628 +msgid "Convert: " +msgstr "" + +#: cps/helper.py:626 +msgid "Upload: " +msgstr "" + +#: cps/helper.py:630 +msgid "Unknown Task: " +msgstr "" + +#: cps/web.py:1132 cps/web.py:2842 +msgid "Unknown" +msgstr "Ismeretlen" + +#: cps/web.py:1141 cps/web.py:1172 cps/web.py:1257 +msgid "HTTP Error" +msgstr "HTTP hiba" + +#: cps/web.py:1143 cps/web.py:1174 cps/web.py:1258 +msgid "Connection error" +msgstr "Kapcsolódási hiba" + +#: cps/web.py:1145 cps/web.py:1176 cps/web.py:1259 +msgid "Timeout while establishing connection" +msgstr "Időtúllépés a kapcsolódás során" + +#: cps/web.py:1147 cps/web.py:1178 cps/web.py:1260 +msgid "General error" +msgstr "Általános hiba" + +#: cps/web.py:1153 +msgid "Unexpected data while reading update information" +msgstr "Ismeretlen adat a frissítési információk olvasásakor" + +#: cps/web.py:1160 +msgid "No update available. You already have the latest version installed" +msgstr "Nem érhető el újabb frissítés. Már a legújabb verzió van telepítve." + +#: cps/web.py:1185 +msgid "A new update is available. Click on the button below to update to the latest version." +msgstr "Egy új frissítés érhető el. Kattints a lenti gombra a legújabb verzió frissítésére" + +#: cps/web.py:1235 +msgid "Could not fetch update information" +msgstr "Nem lehetett begyűjteni a frissítési információkat" + +#: cps/web.py:1250 +msgid "Requesting update package" +msgstr "Frissítési csomag kérése" + +#: cps/web.py:1251 +msgid "Downloading update package" +msgstr "Frissítési csomag letöltése" + +#: cps/web.py:1252 +msgid "Unzipping update package" +msgstr "Frissítési csomag kitömörítése" + +#: cps/web.py:1253 +msgid "Replacing files" +msgstr "" + +#: cps/web.py:1254 +msgid "Database connections are closed" +msgstr "Adatbázis kapcsolatok lezárva" + +#: cps/web.py:1255 +msgid "Stopping server" +msgstr "" + +#: cps/web.py:1256 +msgid "Update finished, please press okay and reload page" +msgstr "A frissítés települt, kattints az OK-ra és újra tölt az oldal" + +#: cps/web.py:1257 cps/web.py:1258 cps/web.py:1259 cps/web.py:1260 +msgid "Update failed:" +msgstr "" + +#: cps/web.py:1283 +msgid "Recently Added Books" +msgstr "Legutóbb hozzáadott könyvek" + +#: cps/web.py:1293 +msgid "Newest Books" +msgstr "Legújabb könyvek" + +#: cps/web.py:1305 +msgid "Oldest Books" +msgstr "Legrégebbi könyvek" + +#: cps/web.py:1317 +msgid "Books (A-Z)" +msgstr "Könyvek (A-Zs)" + +#: cps/web.py:1328 +msgid "Books (Z-A)" +msgstr "Könyvek (Zs-A)" + +#: cps/web.py:1357 +msgid "Hot Books (most downloaded)" +msgstr "Kelendő könyvek (legtöbbet letöltöttek)" + +#: cps/web.py:1370 +msgid "Best rated books" +msgstr "Legjobbra értékelt könyvek" + +#: cps/templates/index.xml:39 cps/web.py:1383 +msgid "Random Books" +msgstr "Könyvek találomra" + +#: cps/web.py:1398 +msgid "Author list" +msgstr "Szerzők listája" + +#: cps/web.py:1410 cps/web.py:1501 cps/web.py:1663 cps/web.py:2206 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "Hiba történt az e-könyv megnyitásakor. A fájl nem létezik vagy nem érhető el:" + +#: cps/web.py:1438 +msgid "Publisher list" +msgstr "" + +#: cps/web.py:1452 +#, python-format +msgid "Publisher: %(name)s" +msgstr "" + +#: cps/templates/index.xml:83 cps/web.py:1484 +msgid "Series list" +msgstr "Sorozatok listája" + +#: cps/web.py:1499 +#, python-format +msgid "Series: %(serie)s" +msgstr "Sorozat: %(serie)s" + +#: cps/web.py:1528 +msgid "Available languages" +msgstr "Elérhető nyelvek" + +#: cps/web.py:1548 +#, python-format +msgid "Language: %(name)s" +msgstr "Nyelv: %(name)s" + +#: cps/templates/index.xml:76 cps/web.py:1559 +msgid "Category list" +msgstr "Címkék listája" + +#: cps/web.py:1573 +#, python-format +msgid "Category: %(name)s" +msgstr "Címke: %(name)s" + +#: cps/templates/layout.html:71 cps/web.py:1699 +msgid "Tasks" +msgstr "Feladatok" + +#: cps/web.py:1733 +msgid "Statistics" +msgstr "Statisztika" + +#: cps/web.py:1840 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "A visszahívási tartomány nem ellenőrzött, kövesd az alábbi lépéseket a tartomány ellenőrzéséhez a Google Developer Console-ban:" + +#: cps/web.py:1915 +msgid "Server restarted, please reload page" +msgstr "A kiszolgáló újraindult, tölts be újra az oldalt!" + +#: cps/web.py:1918 +msgid "Performing shutdown of server, please close window" +msgstr "A kiszolgáló leállítása folyamatban, zárd be ezt az ablakot" + +#: cps/web.py:1937 +msgid "Update done" +msgstr "A frissítés kész" + +#: cps/web.py:2007 +msgid "Published after " +msgstr "Kiadva ezután: " + +#: cps/web.py:2014 +msgid "Published before " +msgstr "Kiadva ezelőtt: " + +#: cps/web.py:2028 +#, python-format +msgid "Rating <= %(rating)s" +msgstr "Értékelés <= %(rating)s" + +#: cps/web.py:2030 +#, python-format +msgid "Rating >= %(rating)s" +msgstr "Értékelés <= %(rating)s" + +#: cps/web.py:2089 cps/web.py:2098 +msgid "search" +msgstr "keresés" + +#: cps/templates/index.xml:47 cps/templates/index.xml:51 +#: cps/templates/layout.html:146 cps/web.py:2165 +msgid "Read Books" +msgstr "Olvasott könyvek" + +#: cps/templates/index.xml:55 cps/templates/index.xml:59 +#: cps/templates/layout.html:148 cps/web.py:2168 +msgid "Unread Books" +msgstr "Olvasatlan könyvek" + +#: cps/web.py:2216 cps/web.py:2218 cps/web.py:2220 cps/web.py:2232 +msgid "Read a Book" +msgstr "Egy olvasott könyv" + +#: cps/web.py:2298 cps/web.py:3201 +msgid "Please fill out all fields!" +msgstr "Az összes mezőt ki kell tölteni!" + +#: cps/web.py:2299 cps/web.py:2320 cps/web.py:2324 cps/web.py:2329 +#: cps/web.py:2331 +msgid "register" +msgstr "regisztrálás" + +#: cps/web.py:2319 cps/web.py:3417 +msgid "An unknown error occurred. Please try again later." +msgstr "Ismeretlen hiba történt. Próbáld újra később!" + +#: cps/web.py:2322 +msgid "Your e-mail is not allowed to register" +msgstr "Nem engedélyezett a megadott e-mail cím bejegyzése" + +#: cps/web.py:2325 +msgid "Confirmation e-mail was send to your e-mail account." +msgstr "Jóváhagyó levél elküldve az email címedre." + +#: cps/web.py:2328 +msgid "This username or e-mail address is already in use." +msgstr "Ez a felhasználónév vagy e-mail cím már használatban van." + +#: cps/web.py:2345 cps/web.py:2441 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "Be vagy jelentkezve mint: %(nickname)s" + +#: cps/web.py:2350 +msgid "Wrong Username or Password" +msgstr "Rossz felhasználó név vagy jelszó!" + +#: cps/web.py:2356 cps/web.py:2377 +msgid "login" +msgstr "belépés" + +#: cps/web.py:2389 cps/web.py:2420 +msgid "Token not found" +msgstr "A token nem található." + +#: cps/web.py:2397 cps/web.py:2428 +msgid "Token has expired" +msgstr "A token érvényessége lejárt." + +#: cps/web.py:2405 +msgid "Success! Please return to your device" +msgstr "Sikerült! Újra használható az eszköz." + +#: cps/web.py:2455 +msgid "Please configure the SMTP mail settings first..." +msgstr "Először be kell állítani az SMTP levelező beállításokat..." + +#: cps/web.py:2459 +#, python-format +msgid "Book successfully queued for sending to %(kindlemail)s" +msgstr "A könyv sikeresen küldésre lett jelölve a következő címre: %(kindlemail)s" + +#: cps/web.py:2463 +#, python-format +msgid "There was an error sending this book: %(res)s" +msgstr "Hiba történt a könyv küldésekor: %(res)s" + +#: cps/web.py:2465 cps/web.py:3255 +msgid "Please configure your kindle e-mail address first..." +msgstr "Először be kell állítani a kindle e-mail címet..." + +#: cps/web.py:2476 cps/web.py:2528 +msgid "Invalid shelf specified" +msgstr "A megadott polc érvénytelen!" + +#: cps/web.py:2483 +#, python-format +msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2491 +msgid "You are not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2500 +#, python-format +msgid "Book is already part of the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2514 +#, python-format +msgid "Book has been added to shelf: %(sname)s" +msgstr "A könyv hozzá lett adva a következő polchoz: %(sname)s" + +#: cps/web.py:2533 +#, python-format +msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgstr "Nincs jogosultságod könyvet tenni a következő polcra: %(name)s." + +#: cps/web.py:2538 +msgid "User is not allowed to edit public shelves" +msgstr "A felhasználó nem szerkeszthet nyilvános polcokat" + +#: cps/web.py:2556 +#, python-format +msgid "Books are already part of the shelf: %(name)s" +msgstr "A könyvek már a következő polcon vannak: %(name)s" + +#: cps/web.py:2570 +#, python-format +msgid "Books have been added to shelf: %(sname)s" +msgstr "A könyvek hozzá lettek adva a következő polchoz: %(sname)s" + +#: cps/web.py:2572 +#, python-format +msgid "Could not add books to shelf: %(sname)s" +msgstr "Nem sikerült hozzáadni a könyveket a polchoz: %(sname)s" + +#: cps/web.py:2609 +#, python-format +msgid "Book has been removed from shelf: %(sname)s" +msgstr "A könyv el lett távolítva a polcról: %(sname)s" + +#: cps/web.py:2615 +#, python-format +msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgstr "Sajnálom, nincs jogosultságot eltávolítani könyvet erről a polcról: %(sname)s" + +#: cps/web.py:2635 cps/web.py:2659 +#, python-format +msgid "A shelf with the name '%(title)s' already exists." +msgstr "Már létezik \"%(title)s\" nevű polc!" + +#: cps/web.py:2640 +#, python-format +msgid "Shelf %(title)s created" +msgstr "A következő polc létre lett hozva: %(title)s" + +#: cps/web.py:2642 cps/web.py:2670 +msgid "There was an error" +msgstr "Hiba történt" + +#: cps/web.py:2643 cps/web.py:2645 +msgid "create a shelf" +msgstr "Polc készítése" + +#: cps/web.py:2668 +#, python-format +msgid "Shelf %(title)s changed" +msgstr "A következő polc megváltoztatva: %(title)s" + +#: cps/web.py:2671 cps/web.py:2673 +msgid "Edit a shelf" +msgstr "Polc szerkesztése" + +#: cps/web.py:2694 +#, python-format +msgid "successfully deleted shelf %(name)s" +msgstr "A következő polc sikeresen törölve: %(name)s" + +#: cps/web.py:2721 +#, python-format +msgid "Shelf: '%(name)s'" +msgstr "Polc: '%(name)s'" + +#: cps/web.py:2724 +msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "Hiba a polc megnyitásakor. A polc nem létezik vagy nem elérhető." + +#: cps/web.py:2755 +#, python-format +msgid "Change order of Shelf: '%(name)s'" +msgstr "A következő polc átrendezése: %(name)s" + +#: cps/web.py:2784 cps/web.py:3207 +msgid "E-mail is not from valid domain" +msgstr "Az e-mail tartománya nem érvényes." + +#: cps/web.py:2786 cps/web.py:2829 cps/web.py:2832 +#, python-format +msgid "%(name)s's profile" +msgstr "%(name)s profilja" + +#: cps/web.py:2827 +msgid "Found an existing account for this e-mail address." +msgstr "Már létezik felhasználó ehhez az e-mail címhez." + +#: cps/web.py:2830 +msgid "Profile updated" +msgstr "A profil frissítve." + +#: cps/web.py:2858 +msgid "Admin page" +msgstr "Rendszergazda oldala" + +#: cps/web.py:2938 cps/web.py:3112 +msgid "Calibre-Web configuration updated" +msgstr "A Calibre-Web konfigurációja frissítve." + +#: cps/templates/admin.html:100 cps/web.py:2951 +msgid "UI Configuration" +msgstr "Felhasználói felület beállításai" + +#: cps/web.py:2969 +msgid "Import of optional Google Drive requirements missing" +msgstr "Hiányzanak a Google Drive használatához szükséges komponensek" + +#: cps/web.py:2972 +msgid "client_secrets.json is missing or not readable" +msgstr "A client_secrets.json hiányzik vagy nem olvasható." + +#: cps/web.py:2977 cps/web.py:3004 +msgid "client_secrets.json is not configured for web application" +msgstr "A client_secrets.json nincs beállítva a web alkalmazáshoz." + +#: cps/templates/admin.html:99 cps/web.py:3007 cps/web.py:3033 cps/web.py:3045 +#: cps/web.py:3088 cps/web.py:3103 cps/web.py:3120 cps/web.py:3127 +#: cps/web.py:3142 +msgid "Basic Configuration" +msgstr "Alapvető beállítások" + +#: cps/web.py:3030 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "A kulcsfájl helye nem érvényes, adj meg érvényes elérési utat" + +#: cps/web.py:3042 +msgid "Certfile location is not valid, please enter correct path" +msgstr "A tanusítványfájl helye nem érvényes, adj meg érvényes elérési utat" + +#: cps/web.py:3085 +msgid "Logfile location is not valid, please enter correct path" +msgstr "A naplófájl helye nem érvényes, adj meg érvényes elérési utat" + +#: cps/web.py:3124 +msgid "DB location is not valid, please enter correct path" +msgstr "Az adatbázis helye nem érvényes, adj meg érvényes elérési utat" + +#: cps/templates/admin.html:33 cps/web.py:3203 cps/web.py:3209 cps/web.py:3225 +msgid "Add new user" +msgstr "Új felhasználó hozzáadása" + +#: cps/web.py:3215 +#, python-format +msgid "User '%(user)s' created" +msgstr "A következő felhasználó létrehozva: %(user)s" + +#: cps/web.py:3219 +msgid "Found an existing account for this e-mail address or nickname." +msgstr "Már létezik felhasználó ehhez az e-mail címhez vagy felhasználói névhez." + +#: cps/web.py:3243 cps/web.py:3257 +msgid "E-mail server settings updated" +msgstr "Az e-mail kiszolgáló beállításai frissítve." + +#: cps/web.py:3250 +#, python-format +msgid "Test e-mail successfully send to %(kindlemail)s" +msgstr "A teszt levél sikeresen elküldve ide: %(kindlemail)s" + +#: cps/web.py:3253 +#, python-format +msgid "There was an error sending the Test e-mail: %(res)s" +msgstr "Hiba történt a teszt levél küldése során: %(res)s" + +#: cps/web.py:3258 +msgid "Edit e-mail server settings" +msgstr "Az e-mail kiszolgáló beállításainak módosítása" + +#: cps/web.py:3283 +#, python-format +msgid "User '%(nick)s' deleted" +msgstr "A felhasználó törölve: %(nick)s" + +#: cps/web.py:3392 +#, python-format +msgid "User '%(nick)s' updated" +msgstr "A felhasználó frissítve: %(nick)s" + +#: cps/web.py:3395 +msgid "An unknown error occured." +msgstr "Ismeretlen hiba történt." + +#: cps/web.py:3397 +#, python-format +msgid "Edit User %(nick)s" +msgstr " A felhasználó szerkesztése: %(nick)s" + +#: cps/web.py:3414 +#, python-format +msgid "Password for user %(user)s reset" +msgstr "A(z) %(user)s felhasználó jelszavának alaphelyzetbe állítása" + +#: cps/web.py:3428 cps/web.py:3629 +msgid "Error opening eBook. File does not exist or file is not accessible" +msgstr "Hiba az ekönyv megnyitásakor. A fájl nem létezik vagy nem elérhető." + +#: cps/web.py:3453 cps/web.py:3912 +msgid "edit metadata" +msgstr "Metaadatok szerkesztése" + +#: cps/web.py:3546 cps/web.py:3782 +#, python-format +msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" +msgstr "A(z) \"%(ext)s\" kiterjesztésű fájlok feltöltése nincs engedélyezve ezen a szerveren." + +#: cps/web.py:3550 cps/web.py:3786 +msgid "File to be uploaded must have an extension" +msgstr "A feltöltendő fájlnak kiterjesztéssel kell rendelkeznie!" + +#: cps/web.py:3562 cps/web.py:3806 +#, python-format +msgid "Failed to create path %(path)s (Permission denied)." +msgstr "Nem sikerült létrehozni az elérési utat (engedély megtagadva): %(path)s." + +#: cps/web.py:3567 +#, python-format +msgid "Failed to store file %(file)s." +msgstr "Nem sikerült elmenteni a %(file)s fájlt." + +#: cps/web.py:3583 +#, python-format +msgid "File format %(ext)s added to %(book)s" +msgstr "A(z) %(ext)s fájlformátum hozzáadva a könyvhez: %(book)s." + +#: cps/web.py:3601 +#, python-format +msgid "Failed to create path for cover %(path)s (Permission denied)." +msgstr "Nem sikerült létrehozni az elérési utat a borítóhoz (engedély megtagadva): %(path)s." + +#: cps/web.py:3608 +#, python-format +msgid "Failed to store cover-file %(cover)s." +msgstr "Nem sikerült elmenteni a borító-fájlt: %(cover)s." + +#: cps/web.py:3611 +msgid "Cover-file is not a valid image file" +msgstr "A borító-fájl nem érvényes képfájl!" + +#: cps/web.py:3641 cps/web.py:3650 cps/web.py:3654 +msgid "unknown" +msgstr "ismeretlen" + +#: cps/web.py:3673 +msgid "Cover is not a jpg file, can't save" +msgstr "A borító nem jpg fájl, nem lehet elmenteni." + +#: cps/web.py:3721 +#, python-format +msgid "%(langname)s is not a valid language" +msgstr "A(z) %(langname)s nem érvényes nyelv" + +#: cps/web.py:3752 +msgid "Metadata successfully updated" +msgstr "" + +#: cps/web.py:3761 +msgid "Error editing book, please check logfile for details" +msgstr "Hiba a könyv szerkesztése során, további részletek a naplófájlban." + +#: cps/web.py:3811 +#, python-format +msgid "Failed to store file %(file)s (Permission denied)." +msgstr "Nem sikerült elmenteni a %(file)s fájlt." + +#: cps/web.py:3816 +#, python-format +msgid "Failed to delete file %(file)s (Permission denied)." +msgstr "Nem sikerült törölni a %(file)s fájlt." + +#: cps/web.py:3898 +#, python-format +msgid "File %(file)s uploaded" +msgstr "A %(file)s fájl feltöltve." + +#: cps/web.py:3928 +msgid "Source or destination format for conversion missing" +msgstr "Az átalakításhoz hiányzik a forrás- vagy a célformátum!" + +#: cps/web.py:3938 +#, python-format +msgid "Book successfully queued for converting to %(book_format)s" +msgstr "A könyv sikeresen átalakításra lett jelölve a következő formátumra: %(book_format)s" + +#: cps/web.py:3942 +#, python-format +msgid "There was an error converting this book: %(res)s" +msgstr "Hiba történt a könyv átalakításakor: %(res)s" + +#: cps/worker.py:287 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Az e-könyv átalakítás nem sikerült: %(error)s" + +#: cps/worker.py:298 +#, python-format +msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" +msgstr "A Kindlegen futtatása nem sikerült a(z) %(error)s hiba miatt. Üzenet: %(message)s" + +#: cps/templates/admin.html:6 +msgid "User list" +msgstr "Felhasználók listája" + +#: cps/templates/admin.html:9 +msgid "Nickname" +msgstr "Felhasználói név" + +#: cps/templates/admin.html:10 +msgid "E-mail" +msgstr "E-mail" + +#: cps/templates/admin.html:11 +msgid "Kindle" +msgstr "Kindle" + +#: cps/templates/admin.html:12 +msgid "DLS" +msgstr "Letöltések" + +#: cps/templates/admin.html:13 cps/templates/layout.html:74 +msgid "Admin" +msgstr "Rendszergazda" + +#: cps/templates/admin.html:14 cps/templates/detail.html:22 +#: cps/templates/detail.html:31 +msgid "Download" +msgstr "Letöltés" + +#: cps/templates/admin.html:15 cps/templates/layout.html:64 +msgid "Upload" +msgstr "Feltöltés" + +#: cps/templates/admin.html:16 +msgid "Edit" +msgstr "Szerkesztés" + +#: cps/templates/admin.html:39 +msgid "SMTP e-mail server settings" +msgstr "SMTP e-mail kiszolgáló beállítások" + +#: cps/templates/admin.html:42 cps/templates/email_edit.html:11 +msgid "SMTP hostname" +msgstr "SMTP szervernév" + +#: cps/templates/admin.html:43 +msgid "SMTP port" +msgstr "SMTP port" + +#: cps/templates/admin.html:44 +msgid "SSL" +msgstr "SSL" + +#: cps/templates/admin.html:45 cps/templates/email_edit.html:27 +msgid "SMTP login" +msgstr "SMTP felhasználó" + +#: cps/templates/admin.html:46 +msgid "From mail" +msgstr "Küldő e-mail cím" + +#: cps/templates/admin.html:56 +msgid "Change SMTP settings" +msgstr "SMTP beállítások változtatása" + +#: cps/templates/admin.html:62 +msgid "Configuration" +msgstr "Konfiguráció" + +#: cps/templates/admin.html:65 +msgid "Calibre DB dir" +msgstr "Calibre adatbázis mappája:" + +#: cps/templates/admin.html:69 +msgid "Log level" +msgstr "Naplózás szintje:" + +#: cps/templates/admin.html:73 +msgid "Port" +msgstr "Port:" + +#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23 +msgid "Books per page" +msgstr "Könyvek oldalanként:" + +#: cps/templates/admin.html:83 +msgid "Uploading" +msgstr "Feltöltés:" + +#: cps/templates/admin.html:87 +msgid "Anonymous browsing" +msgstr "Böngészés bejelentkezés nélkül:" + +#: cps/templates/admin.html:91 +msgid "Public registration" +msgstr "Nyílvános regisztráció:" + +#: cps/templates/admin.html:95 cps/templates/remote_login.html:4 +msgid "Remote login" +msgstr "Távoli belépés:" + +#: cps/templates/admin.html:106 +msgid "Administration" +msgstr "Adminisztráció" + +#: cps/templates/admin.html:107 +msgid "Reconnect to Calibre DB" +msgstr "Újracsatlakozás a Calibre adatbázishoz" + +#: cps/templates/admin.html:108 +msgid "Restart Calibre-Web" +msgstr "A Calibre adatbázis újraindítása" + +#: cps/templates/admin.html:109 +msgid "Stop Calibre-Web" +msgstr "A Calibre adatbázis leállítása" + +#: cps/templates/admin.html:115 +msgid "Update" +msgstr "Frissítés" + +#: cps/templates/admin.html:119 +msgid "Version" +msgstr "Verzió" + +#: cps/templates/admin.html:120 +msgid "Details" +msgstr "Részletek" + +#: cps/templates/admin.html:126 +msgid "Current version" +msgstr "Jelenlegi verzió" + +#: cps/templates/admin.html:132 +msgid "Check for update" +msgstr "Frissítés keresése" + +#: cps/templates/admin.html:133 +msgid "Perform Update" +msgstr "Frissítés elkezdése" + +#: cps/templates/admin.html:145 +msgid "Do you really want to restart Calibre-Web?" +msgstr "Valóban újra akarod indítani a Calibre-Web-et?" + +#: cps/templates/admin.html:150 cps/templates/admin.html:164 +#: cps/templates/admin.html:184 cps/templates/shelf.html:61 +msgid "Ok" +msgstr "OK" + +#: cps/templates/admin.html:151 cps/templates/admin.html:165 +#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200 +#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168 +#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75 +#: cps/templates/shelf.html:62 cps/templates/shelf_edit.html:19 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155 +msgid "Back" +msgstr "Vissza" + +#: cps/templates/admin.html:163 +msgid "Do you really want to stop Calibre-Web?" +msgstr "Valóban le akarod állítani a Calibre-Web-et?" + +#: cps/templates/admin.html:175 +msgid "Updating, please do not reload page" +msgstr "Frissítés folyamatban, ne töltsd újra az oldalt" + +#: cps/templates/author.html:15 +msgid "via" +msgstr "keresztül" + +#: cps/templates/author.html:23 +msgid "In Library" +msgstr "Könyvtárban" + +#: cps/templates/author.html:69 +msgid "More by" +msgstr "Több eszerint:" + +#: cps/templates/book_edit.html:16 +msgid "Delete Book" +msgstr "Könyv törlése" + +#: cps/templates/book_edit.html:19 +msgid "Delete formats:" +msgstr "Formátumok törlése:" + +#: cps/templates/book_edit.html:22 cps/templates/book_edit.html:199 +#: cps/templates/email_edit.html:73 cps/templates/email_edit.html:74 +msgid "Delete" +msgstr "Törlés" + +#: cps/templates/book_edit.html:30 +msgid "Convert book format:" +msgstr "Könyvformátum átalakítása:" + +#: cps/templates/book_edit.html:34 +msgid "Convert from:" +msgstr "Konvertálás erről:" + +#: cps/templates/book_edit.html:36 cps/templates/book_edit.html:43 +msgid "select an option" +msgstr "Válassz egy lehetőséget" + +#: cps/templates/book_edit.html:41 +msgid "Convert to:" +msgstr "Konvertálás erre:" + +#: cps/templates/book_edit.html:50 +msgid "Convert book" +msgstr "Könyv konvertálása" + +#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6 +msgid "Book Title" +msgstr "Könyv címe" + +#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:259 +#: cps/templates/book_edit.html:277 cps/templates/search_form.html:10 +msgid "Author" +msgstr "Szerző" + +#: cps/templates/book_edit.html:67 cps/templates/book_edit.html:264 +#: cps/templates/book_edit.html:279 cps/templates/search_form.html:106 +msgid "Description" +msgstr "Leírás" + +#: cps/templates/book_edit.html:71 cps/templates/search_form.html:33 +msgid "Tags" +msgstr "Címkék" + +#: cps/templates/book_edit.html:75 cps/templates/layout.html:157 +#: cps/templates/search_form.html:53 +msgid "Series" +msgstr "Sorozatok" + +#: cps/templates/book_edit.html:79 +msgid "Series id" +msgstr "Sorozat azonosítója" + +#: cps/templates/book_edit.html:83 +msgid "Rating" +msgstr "Értékelés" + +#: cps/templates/book_edit.html:87 +msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +msgstr "Borító URL (jpg, borító letöltve és elmentve az adatbázisban, a mező újra üres lesz utána)" + +#: cps/templates/book_edit.html:91 +msgid "Upload Cover from local drive" +msgstr "Borító feltöltése helyi meghajtóról" + +#: cps/templates/book_edit.html:96 cps/templates/detail.html:135 +msgid "Publishing date" +msgstr "Kiadás éve" + +#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:278 cps/templates/detail.html:127 +#: cps/templates/search_form.html:14 +msgid "Publisher" +msgstr "Kiadó" + +#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31 +msgid "Language" +msgstr "Nyelv" + +#: cps/templates/book_edit.html:117 cps/templates/search_form.html:117 +msgid "Yes" +msgstr "Igen" + +#: cps/templates/book_edit.html:118 cps/templates/search_form.html:118 +msgid "No" +msgstr "Nem" + +#: cps/templates/book_edit.html:164 +msgid "Upload format" +msgstr "Feltöltés formátuma" + +#: cps/templates/book_edit.html:173 +msgid "view book after edit" +msgstr "Könyv megnézése szerkesztés után" + +#: cps/templates/book_edit.html:176 cps/templates/book_edit.html:212 +msgid "Get metadata" +msgstr "Metaadatok beszerzése" + +#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210 +#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20 +#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17 +#: cps/templates/user_edit.html:153 +msgid "Submit" +msgstr "Küldés" + +#: cps/templates/book_edit.html:191 +msgid "Are you really sure?" +msgstr "Biztosan?" + +#: cps/templates/book_edit.html:194 +msgid "Book will be deleted from Calibre database" +msgstr "A könyv törölve lesz a Calibre adatbázisból" + +#: cps/templates/book_edit.html:195 +msgid "and from hard disk" +msgstr " és a merevlemezről" + +#: cps/templates/book_edit.html:215 +msgid "Keyword" +msgstr "Kulcsszó" + +#: cps/templates/book_edit.html:216 +msgid " Search keyword " +msgstr " Keresési kulcsszó " + +#: cps/templates/book_edit.html:218 cps/templates/layout.html:46 +msgid "Go!" +msgstr "Rajta!" + +#: cps/templates/book_edit.html:222 +msgid "Click the cover to load metadata to the form" +msgstr "Kattints a borítóra a metadatok betöltésére" + +#: cps/templates/book_edit.html:234 cps/templates/book_edit.html:274 +msgid "Loading..." +msgstr "Betöltés..." + +#: cps/templates/book_edit.html:239 cps/templates/layout.html:224 +msgid "Close" +msgstr "Bezárás" + +#: cps/templates/book_edit.html:266 cps/templates/book_edit.html:280 +msgid "Source" +msgstr "Forrás" + +#: cps/templates/book_edit.html:275 +msgid "Search error!" +msgstr "Keresési hiba!" + +#: cps/templates/book_edit.html:276 +msgid "No Result(s) found! Please try aonther keyword." +msgstr "Nincs találat! Próbálj másik kulcsszót." + +#: cps/templates/config_edit.html:12 +msgid "Library Configuration" +msgstr "Könyvát beállításai" + +#: cps/templates/config_edit.html:19 +msgid "Location of Calibre database" +msgstr "Calibra adatbázis helye" + +#: cps/templates/config_edit.html:24 +msgid "Use Google Drive?" +msgstr "Használjon Google Drive-ot?" + +#: cps/templates/config_edit.html:30 +msgid "Google Drive config problem" +msgstr "Google Drive beállítási probléma" + +#: cps/templates/config_edit.html:36 +msgid "Authenticate Google Drive" +msgstr "Google Drive hitelesítés" + +#: cps/templates/config_edit.html:40 +msgid "Please finish Google Drive setup after login" +msgstr "Belépés után fejezd be a Google Drive beállítást" + +#: cps/templates/config_edit.html:44 +msgid "Google Drive Calibre folder" +msgstr "Google Drive Calibre mappa" + +#: cps/templates/config_edit.html:52 +msgid "Metadata Watch Channel ID" +msgstr "Metadata Watch Channel ID" + +#: cps/templates/config_edit.html:55 +msgid "Revoke" +msgstr "Visszavonás" + +#: cps/templates/config_edit.html:73 +msgid "Server Configuration" +msgstr "Szerver beállítások" + +#: cps/templates/config_edit.html:80 +msgid "Server Port" +msgstr "Szerver port" + +#: cps/templates/config_edit.html:84 +msgid "SSL certfile location (leave it empty for non-SSL Servers)" +msgstr "SSL hitelesítő fájl helye (nem SSL szerverekhez üresen kell hagyni)" + +#: cps/templates/config_edit.html:88 +msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" +msgstr "SSL kulcsfájl helye (nem SSL szerverekhez üresen kell hagyni)" + +#: cps/templates/config_edit.html:99 +msgid "Logfile Configuration" +msgstr "Naplózási beállítások" + +#: cps/templates/config_edit.html:106 +msgid "Log Level" +msgstr "Naplózás szintje" + +#: cps/templates/config_edit.html:115 +msgid "Location and name of logfile (calibre-web.log for no entry)" +msgstr "Naplófájl helye és neve (üresen hagyva calibre-web.log)" + +#: cps/templates/config_edit.html:126 +msgid "Feature Configuration" +msgstr "Funkciók beállítása" + +#: cps/templates/config_edit.html:134 +msgid "Enable uploading" +msgstr "Feltöltés engedélyezése" + +#: cps/templates/config_edit.html:138 +msgid "Enable anonymous browsing" +msgstr "Böngészés bejelentkezés nélkül engedélyezése" + +#: cps/templates/config_edit.html:142 +msgid "Enable public registration" +msgstr "Nyilvános regisztráció engedélyezése" + +#: cps/templates/config_edit.html:146 +msgid "Enable remote login (\"magic link\")" +msgstr "Távoli belépés engedélyezése (\"varázs-hivatkozás\")" + +#: cps/templates/config_edit.html:151 +msgid "Use" +msgstr "Engedélyezés" + +#: cps/templates/config_edit.html:152 +msgid "Obtain an API Key" +msgstr "API-kulcs beszerzése" + +#: cps/templates/config_edit.html:156 +msgid "Goodreads API Key" +msgstr "Goodreads API-kulcs" + +#: cps/templates/config_edit.html:160 +msgid "Goodreads API Secret" +msgstr "Goodreads API titkos kód" + +#: cps/templates/config_edit.html:173 +msgid "External binaries" +msgstr "Külső futtatható fájlok" + +#: cps/templates/config_edit.html:181 +msgid "No converter" +msgstr "Átalakítás nélkül" + +#: cps/templates/config_edit.html:183 +msgid "Use Kindlegen" +msgstr "Kindlegen használata" + +#: cps/templates/config_edit.html:185 +msgid "Use calibre's ebook converter" +msgstr "Calibre e-könyv átalakító használata" + +#: cps/templates/config_edit.html:189 +msgid "E-Book converter settings" +msgstr "E-könyv átalakító beállításai" + +#: cps/templates/config_edit.html:193 +msgid "Path to convertertool" +msgstr "Elérési út az átalakító-eszközhöz" + +#: cps/templates/config_edit.html:199 +msgid "Location of Unrar binary" +msgstr "Az Unrar futtatási állományának helye" + +#: cps/templates/config_edit.html:215 cps/templates/layout.html:82 +#: cps/templates/login.html:4 +msgid "Login" +msgstr "Belépés" + +#: cps/templates/config_view_edit.html:12 +msgid "View Configuration" +msgstr "Általános beállítások" + +#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 +#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 +msgid "Title" +msgstr "Név" + +#: cps/templates/config_view_edit.html:27 +msgid "No. of random books to show" +msgstr "Találomra mutatott könyvek száma" + +#: cps/templates/config_view_edit.html:31 +msgid "Regular expression for ignoring columns" +msgstr "Reguláris kifejezés oszlopok kihagyásához" + +#: cps/templates/config_view_edit.html:35 +msgid "Link read/unread status to Calibre column" +msgstr "Olvasva/olvasatlan állapot hozzárendelése Calibre oszlophoz" + +#: cps/templates/config_view_edit.html:44 +msgid "Regular expression for title sorting" +msgstr "Reguláris kifejezés címek sorbarendezéséhez" + +#: cps/templates/config_view_edit.html:48 +msgid "Tags for Mature Content" +msgstr "Felnőtt tartalom címkéi" + +#: cps/templates/config_view_edit.html:62 +msgid "Default settings for new users" +msgstr "Új felhasználók alapértelmezett beállításai" + +#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110 +msgid "Admin user" +msgstr "Rendszergazda felhasználó" + +#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119 +msgid "Allow Downloads" +msgstr "Letöltés engedélyezése" + +#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123 +msgid "Allow Uploads" +msgstr "Feltöltés engedélyezése" + +#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127 +msgid "Allow Edit" +msgstr "Szerkesztés engedélyezése" + +#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131 +msgid "Allow Delete books" +msgstr "Könyv törlés engedélyezése" + +#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136 +msgid "Allow Changing Password" +msgstr "Jelszó változtatásának engedélyezése" + +#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140 +msgid "Allow Editing Public Shelfs" +msgstr "Nyilvános polcok szerkesztésének engedélyezése" + +#: cps/templates/config_view_edit.html:104 +msgid "Default visibilities for new users" +msgstr "Új felhasználók alapértelmezett látható elemei" + +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58 +msgid "Show random books" +msgstr "Könyvek találomra mutatása" + +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62 +msgid "Show recent books" +msgstr "Legutóbbi könyvek mutatása" + +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66 +msgid "Show sorted books" +msgstr "Rendezett könyvek mutatása" + +#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70 +msgid "Show hot books" +msgstr "Kelendő könyvek mutatása" + +#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74 +msgid "Show best rated books" +msgstr "Legjobbra értékelt könyvek mutatása" + +#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78 +msgid "Show language selection" +msgstr "Nyelv választó mutatása" + +#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82 +msgid "Show series selection" +msgstr "Sorozat választó mutatása" + +#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86 +msgid "Show category selection" +msgstr "Címke választó mutatása" + +#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90 +msgid "Show author selection" +msgstr "Szerző választó mutatása" + +#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94 +msgid "Show publisher selection" +msgstr "" + +#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98 +msgid "Show read and unread" +msgstr "Mutassa az olvasva/olvasatlan állapotot" + +#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102 +msgid "Show random books in detail view" +msgstr "Mutasson könyveket találomra a részletes nézetben" + +#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115 +msgid "Show mature content" +msgstr "Mutassa a felnőtt tartalmat" + +#: cps/templates/detail.html:49 +msgid "Read in browser" +msgstr "Olvasás böngészőben" + +#: cps/templates/detail.html:88 +msgid "Book" +msgstr " " + +#: cps/templates/detail.html:88 +msgid "of" +msgstr "kötete a sorozatnak:" + +#: cps/templates/detail.html:94 +msgid "language" +msgstr "nyelv" + +#: cps/templates/detail.html:172 +msgid "Read" +msgstr "Olvasva" + +#: cps/templates/detail.html:182 +msgid "Description:" +msgstr "Ismertető:" + +#: cps/templates/detail.html:195 cps/templates/search.html:14 +msgid "Add to shelf" +msgstr "Hozzáadás polchoz" + +#: cps/templates/detail.html:257 +msgid "Edit metadata" +msgstr "Metaadatok szerkesztése" + +#: cps/templates/email_edit.html:15 +msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +msgstr "SMTP port (egyszerű SMTP-hez rendszerint 25, SSL-hez 465 és STARTTLS-hez 587)" + +#: cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "Titkosítás" + +#: cps/templates/email_edit.html:21 +msgid "None" +msgstr "Nincs" + +#: cps/templates/email_edit.html:22 +msgid "STARTTLS" +msgstr "STARTTLS" + +#: cps/templates/email_edit.html:23 +msgid "SSL/TLS" +msgstr "SSL/TLS" + +#: cps/templates/email_edit.html:31 +msgid "SMTP password" +msgstr "SMTP jelszó" + +#: cps/templates/email_edit.html:35 +msgid "From e-mail" +msgstr "E-mail-ből" + +#: cps/templates/email_edit.html:38 +msgid "Save settings" +msgstr "Beállítások mentése" + +#: cps/templates/email_edit.html:39 +msgid "Save settings and send Test E-Mail" +msgstr "Beállítások mentése és teszt e-mail küldése" + +#: cps/templates/email_edit.html:43 +msgid "Allowed domains for registering" +msgstr "Regisztráláshoz engedélyezett tartományok" + +#: cps/templates/email_edit.html:47 +msgid "Enter domainname" +msgstr "Tartomány megadása" + +#: cps/templates/email_edit.html:55 +msgid "Add Domain" +msgstr "Tartomány hozzáadása" + +#: cps/templates/email_edit.html:58 +msgid "Add" +msgstr "Hozzáadás" + +#: cps/templates/email_edit.html:72 +msgid "Do you really want to delete this domain rule?" +msgstr "Valóban törölni akarod ezt a tartomány-szabályt?" + +#: cps/templates/feed.xml:21 cps/templates/layout.html:208 +msgid "Next" +msgstr "Következő" + +#: cps/templates/feed.xml:33 cps/templates/index.xml:11 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 +msgid "Search" +msgstr "Keresés" + +#: cps/templates/index.html:5 +msgid "Discover (Random Books)" +msgstr "Felfedezés (könyvek találomra)" + +#: cps/templates/index.xml:6 +msgid "Start" +msgstr "Kezdés" + +#: cps/templates/index.xml:18 cps/templates/layout.html:139 +msgid "Hot Books" +msgstr "Kelendő könyvek" + +#: cps/templates/index.xml:22 +msgid "Popular publications from this catalog based on Downloads." +msgstr "Ebből a katalógusból származó népszerű kiadványok letöltések alapján." + +#: cps/templates/index.xml:25 cps/templates/layout.html:142 +msgid "Best rated Books" +msgstr "Legjobb könyvek" + +#: cps/templates/index.xml:29 +msgid "Popular publications from this catalog based on Rating." +msgstr "Ebből a katalógusból származó népszerű kiadványok értékelések alapján." + +#: cps/templates/index.xml:32 +msgid "New Books" +msgstr "Új könyvek" + +#: cps/templates/index.xml:36 +msgid "The latest Books" +msgstr "A legfrissebb könyvek" + +#: cps/templates/index.xml:43 +msgid "Show Random Books" +msgstr "Mutass könyveket találomra" + +#: cps/templates/index.xml:62 cps/templates/layout.html:160 +msgid "Authors" +msgstr "Szerzők" + +#: cps/templates/index.xml:66 +msgid "Books ordered by Author" +msgstr "Könyvek szerző szerint rendezve" + +#: cps/templates/index.xml:69 cps/templates/layout.html:163 +msgid "Publishers" +msgstr "" + +#: cps/templates/index.xml:73 +msgid "Books ordered by publisher" +msgstr "" + +#: cps/templates/index.xml:80 +msgid "Books ordered by category" +msgstr "Könyvek címke szerint rendezve" + +#: cps/templates/index.xml:87 +msgid "Books ordered by series" +msgstr "Könyvek sorozat szerint rendezve" + +#: cps/templates/index.xml:90 cps/templates/layout.html:169 +msgid "Public Shelves" +msgstr "Nyilvános polcok" + +#: cps/templates/index.xml:94 +msgid "Books organized in public shelfs, visible to everyone" +msgstr "Könyvek nyilvános polcokra rakva, mindenkinek látható" + +#: cps/templates/index.xml:98 cps/templates/layout.html:173 +msgid "Your Shelves" +msgstr "Saját polcok" + +#: cps/templates/index.xml:102 +msgid "User's own shelfs, only visible to the current user himself" +msgstr "A felhasználó saját polcai, csak a jelenlegi felhasználónak láthatóak" + +#: cps/templates/layout.html:33 +msgid "Toggle navigation" +msgstr "Navigáció átkapcsolása" + +#: cps/templates/layout.html:54 +msgid "Advanced Search" +msgstr "Részletes keresés" + +#: cps/templates/layout.html:78 +msgid "Logout" +msgstr "Kilépés" + +#: cps/templates/layout.html:83 cps/templates/register.html:14 +msgid "Register" +msgstr "Regisztrálás" + +#: cps/templates/layout.html:108 +msgid "Uploading..." +msgstr "Feltöltés..." + +#: cps/templates/layout.html:109 +msgid "please don't refresh the page" +msgstr "Ne frissítsd az oldalt!" + +#: cps/templates/layout.html:120 +msgid "Browse" +msgstr "Böngészés" + +#: cps/templates/layout.html:122 +msgid "Recently Added" +msgstr "Legutóbb hozzáadott" + +#: cps/templates/layout.html:127 +msgid "Sorted Books" +msgstr "Rendezett könyvek" + +#: cps/templates/layout.html:131 cps/templates/layout.html:132 +#: cps/templates/layout.html:133 cps/templates/layout.html:134 +msgid "Sort By" +msgstr "Sorbarendezés eszerint:" + +#: cps/templates/layout.html:131 +msgid "Newest" +msgstr "Legújabbak" + +#: cps/templates/layout.html:132 +msgid "Oldest" +msgstr "Legrégebbiek" + +#: cps/templates/layout.html:133 +msgid "Ascending" +msgstr "Növekvő" + +#: cps/templates/layout.html:134 +msgid "Descending" +msgstr "Csökkenő" + +#: cps/templates/layout.html:151 +msgid "Discover" +msgstr "Felfedezés" + +#: cps/templates/layout.html:154 +msgid "Categories" +msgstr "Címkék" + +#: cps/templates/layout.html:166 cps/templates/search_form.html:74 +msgid "Languages" +msgstr "Nyelvek" + +#: cps/templates/layout.html:178 +msgid "Create a Shelf" +msgstr "Polc készítése" + +#: cps/templates/layout.html:179 cps/templates/stats.html:3 +msgid "About" +msgstr "Névjegy" + +#: cps/templates/layout.html:193 +msgid "Previous" +msgstr "Előző" + +#: cps/templates/layout.html:220 +msgid "Book Details" +msgstr "Könyv részletei" + +#: cps/templates/login.html:8 cps/templates/login.html:9 +#: cps/templates/register.html:7 cps/templates/user_edit.html:8 +msgid "Username" +msgstr "Felhasználó név" + +#: cps/templates/login.html:12 cps/templates/login.html:13 +#: cps/templates/user_edit.html:21 +msgid "Password" +msgstr "Jelszó" + +#: cps/templates/login.html:17 +msgid "Remember me" +msgstr "Emlékezz rám" + +#: cps/templates/login.html:22 +msgid "Log in with magic link" +msgstr "Belépés varázshivatkozással" + +#: cps/templates/osd.xml:5 +msgid "Calibre-Web ebook catalog" +msgstr "Calibre-Web e-könyv katalógus" + +#: cps/templates/read.html:69 cps/templates/readcbr.html:79 +#: cps/templates/readcbr.html:103 +msgid "Settings" +msgstr "Beállítások" + +#: cps/templates/read.html:72 +msgid "Reflow text when sidebars are open." +msgstr "Szöveg újratördelése amikor az oldalsávok nyitva vannak" + +#: cps/templates/readcbr.html:84 +msgid "Keyboard Shortcuts" +msgstr "Gyorsbillentyűk" + +#: cps/templates/readcbr.html:87 +msgid "Previous Page" +msgstr "Előző oldal" + +#: cps/templates/readcbr.html:88 +msgid "Next Page" +msgstr "Következő oldal" + +#: cps/templates/readcbr.html:89 +msgid "Scale to Best" +msgstr "Méretezés a legjobbra" + +#: cps/templates/readcbr.html:90 +msgid "Scale to Width" +msgstr "Méretezés a szélességre" + +#: cps/templates/readcbr.html:91 +msgid "Scale to Height" +msgstr "Méretezés a magasságra" + +#: cps/templates/readcbr.html:92 +msgid "Scale to Native" +msgstr "Méretezés a natívra" + +#: cps/templates/readcbr.html:93 +msgid "Rotate Right" +msgstr "Forgatás balra" + +#: cps/templates/readcbr.html:94 +msgid "Rotate Left" +msgstr "Forgatás jobbra" + +#: cps/templates/readcbr.html:95 +msgid "Flip Image" +msgstr "Kép tükrözése" + +#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39 +msgid "Theme" +msgstr "Téma" + +#: cps/templates/readcbr.html:111 +msgid "Light" +msgstr "Világos" + +#: cps/templates/readcbr.html:112 +msgid "Dark" +msgstr "Sötét" + +#: cps/templates/readcbr.html:117 +msgid "Scale" +msgstr "Méretezés" + +#: cps/templates/readcbr.html:120 +msgid "Best" +msgstr "Legjobb" + +#: cps/templates/readcbr.html:121 +msgid "Width" +msgstr "Szélesség" + +#: cps/templates/readcbr.html:122 +msgid "Height" +msgstr "Magasság" + +#: cps/templates/readcbr.html:123 +msgid "Native" +msgstr "Natív" + +#: cps/templates/readcbr.html:128 +msgid "Rotate" +msgstr "Forgatás" + +#: cps/templates/readcbr.html:139 +msgid "Flip" +msgstr "Tökrözés" + +#: cps/templates/readcbr.html:142 +msgid "Horizontal" +msgstr "Vízszintes" + +#: cps/templates/readcbr.html:143 +msgid "Vertical" +msgstr "Függőleges" + +#: cps/templates/readpdf.html:29 +msgid "PDF.js viewer" +msgstr "PDF.js olvasó" + +#: cps/templates/readtxt.html:6 +msgid "Basic txt Reader" +msgstr "Egyszerű txt olvasó" + +#: cps/templates/register.html:4 +msgid "Register a new account" +msgstr "Új felhasználó regisztrálása" + +#: cps/templates/register.html:8 +msgid "Choose a username" +msgstr "Válassz egy felhasználónevet" + +#: cps/templates/register.html:11 cps/templates/user_edit.html:13 +msgid "E-mail address" +msgstr "E-mail cím" + +#: cps/templates/register.html:12 +msgid "Your email address" +msgstr "Az e-mail címed" + +#: cps/templates/remote_login.html:6 +msgid "Using your another device, visit" +msgstr "Másik eszköz használatához látogass el" + +#: cps/templates/remote_login.html:6 +msgid "and log in" +msgstr "és lépj be" + +#: cps/templates/remote_login.html:9 +msgid "Once you do so, you will automatically get logged in on this device." +msgstr "Az első belépés után automatikusan be leszel léptetve ezen az eszközön." + +#: cps/templates/search.html:5 +msgid "No Results for:" +msgstr "Nincs találatok a következőhöz:" + +#: cps/templates/search.html:6 +msgid "Please try a different search" +msgstr "Próbálj másik keresést!" + +#: cps/templates/search.html:8 +msgid "Results for:" +msgstr "Találatok a következőhöz:" + +#: cps/templates/search_form.html:19 +msgid "Publishing date from" +msgstr "Kiadás éve ettől: " + +#: cps/templates/search_form.html:26 +msgid "Publishing date to" +msgstr "Kiadás éve eddig: " + +#: cps/templates/search_form.html:43 +msgid "Exclude Tags" +msgstr "Cimkék kizárása" + +#: cps/templates/search_form.html:63 +msgid "Exclude Series" +msgstr "Sorozatok kizárása" + +#: cps/templates/search_form.html:84 +msgid "Exclude Languages" +msgstr "Nyelvek kizárása" + +#: cps/templates/search_form.html:97 +msgid "Rating bigger than" +msgstr "Értékelés nagyob mint" + +#: cps/templates/search_form.html:101 +msgid "Rating less than" +msgstr "Értékelés kisebb mint" + +#: cps/templates/shelf.html:7 +msgid "Delete this Shelf" +msgstr "Polc törlése" + +#: cps/templates/shelf.html:8 +msgid "Edit Shelf" +msgstr "Polc szerkesztése" + +#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11 +msgid "Change order" +msgstr "Sorrend változtatása" + +#: cps/templates/shelf.html:56 +msgid "Do you really want to delete the shelf?" +msgstr "Valóban törölni akarod a polcot?" + +#: cps/templates/shelf.html:59 +msgid "Shelf will be lost for everybody and forever!" +msgstr "A polc el fog tűnni mindenki számára és örökké!" + +#: cps/templates/shelf_edit.html:13 +msgid "should the shelf be public?" +msgstr "Nyilvános polc" + +#: cps/templates/shelf_order.html:5 +msgid "Drag 'n drop to rearrange order" +msgstr "Húzd és dob a sorrend változtatásához" + +#: cps/templates/stats.html:7 +msgid "Calibre library statistics" +msgstr "A Calibre könyvár statisztikái" + +#: cps/templates/stats.html:12 +msgid "Books in this Library" +msgstr "Könyvek ebben a könyvtárban" + +#: cps/templates/stats.html:16 +msgid "Authors in this Library" +msgstr "Szerzők ebben a könyvtárban" + +#: cps/templates/stats.html:20 +msgid "Categories in this Library" +msgstr "Címkék ebben a könyvtárban" + +#: cps/templates/stats.html:24 +msgid "Series in this Library" +msgstr "Sorozatok ebben a könyvtárban" + +#: cps/templates/stats.html:28 +msgid "Linked libraries" +msgstr "Hivatkozott könyvtárak" + +#: cps/templates/stats.html:32 +msgid "Program library" +msgstr "Alkalmazás könyvtár" + +#: cps/templates/stats.html:33 +msgid "Installed Version" +msgstr "Telepített verzió" + +#: cps/templates/tasks.html:7 +msgid "Tasks list" +msgstr "Feladatlista" + +#: cps/templates/tasks.html:12 +msgid "User" +msgstr "Felhasználó" + +#: cps/templates/tasks.html:14 +msgid "Task" +msgstr "Feladat" + +#: cps/templates/tasks.html:15 +msgid "Status" +msgstr "Állapot" + +#: cps/templates/tasks.html:16 +msgid "Progress" +msgstr "Állapot" + +#: cps/templates/tasks.html:17 +msgid "Runtime" +msgstr "Futásidő" + +#: cps/templates/tasks.html:18 +msgid "Starttime" +msgstr "Indítás ideje" + +#: cps/templates/tasks.html:24 +msgid "Delete finished tasks" +msgstr "Elvégzett feladatok törlése" + +#: cps/templates/tasks.html:25 +msgid "Hide all tasks" +msgstr "Összes feladat elrejtése" + +#: cps/templates/user_edit.html:18 +msgid "Reset user Password" +msgstr "Felhasználó jelszavának alaphelyzetbe állítása" + +#: cps/templates/user_edit.html:27 +msgid "Kindle E-Mail" +msgstr "Kindle e-mail" + +#: cps/templates/user_edit.html:41 +msgid "Standard Theme" +msgstr "Alapértelmezett téma" + +#: cps/templates/user_edit.html:42 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "caliBlur! sötét téma (béta)" + +#: cps/templates/user_edit.html:47 +msgid "Show books with language" +msgstr "Mutasd a könyveket a következő nyelvvel" + +#: cps/templates/user_edit.html:49 +msgid "Show all" +msgstr "Mindent mutass" + +#: cps/templates/user_edit.html:147 +msgid "Delete this user" +msgstr "A felhasználó törlése" + +#: cps/templates/user_edit.html:162 +msgid "Recent Downloads" +msgstr "Utolsó letöltések" + +#~ msgid "Convert: %(book)s" +#~ msgstr "Konvertálás: %(book)s" + +#~ msgid "Convert to %(format)s: %(book)s" +#~ msgstr "Konvertálás %(format)s-ba: %(book)s" + +#~ msgid "Files are replaced" +#~ msgstr "Fájlok cserélve" + +#~ msgid "Server is stopped" +#~ msgstr "A kiszolgáló leállt." + +#~ msgid "Convertertool %(converter)s not found" +#~ msgstr "Az átalakító-eszköz nem található: %(converter)s." + +#~ msgid "Choose a password" +#~ msgstr "Válassz egy jelszót" + diff --git a/src/cps/translations/iso639.pickle b/src/cps/translations/iso639.pickle new file mode 100644 index 0000000..7c95446 --- /dev/null +++ b/src/cps/translations/iso639.pickle @@ -0,0 +1,20105 @@ +(dp1 +S'ru' +p2 +(dp3 +Vroh +p4 +VRomansh +p5 +sVsco +p6 +V\u0428\u043e\u0442\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 +p7 +sVscn +p8 +V\u0421\u0438\u0446\u0438\u043b\u0438\u0439\u0441\u043a\u0438\u0439 +p9 +sVrom +p10 +V\u0426\u044b\u0433\u0430\u043d\u0441\u043a\u0438\u0439 +p11 +sVron +p12 +V\u0420\u0443\u043c\u044b\u043d\u0441\u043a\u0438\u0439 +p13 +sVoss +p14 +VOssetian +p15 +sVale +p16 +V\u0410\u043b\u0435\u0443\u0442\u0441\u043a\u0438\u0439 +p17 +sVmni +p18 +V\u041c\u0430\u043d\u0438\u043f\u0443\u0440\u0438 +p19 +sVnwc +p20 +VNewari; Old +p21 +sVosa +p22 +V\u041e\u0441\u0435\u0434\u0436\u0438 +p23 +sValt +p24 +VAltai; Southern +p25 +sVmnc +p26 +V\u041c\u0430\u043d\u0447\u0443 +p27 +sVmwr +p28 +V\u041c\u0430\u0440\u0432\u0430\u0440\u0438 +p29 +sVven +p30 +V\u0412\u0435\u043d\u0434\u0430 +p31 +sVuga +p32 +V\u0423\u0433\u0430\u0440\u0438\u0442\u0441\u043a\u0438\u0439 +p33 +sVmwl +p34 +V\u041c\u0438\u0440\u0430\u043d\u0434\u0441\u043a\u0438\u0435 +p35 +sVfas +p36 +V\u041f\u0435\u0440\u0441\u0438\u0434\u0441\u043a\u0438\u0439 +p37 +sVfat +p38 +V\u0424\u0430\u043d\u0442\u0438 +p39 +sVfan +p40 +VFang (Equatorial Guinea) +p41 +sVfao +p42 +V\u0424\u0430\u0440\u0435\u0440\u0441\u043a\u0438\u0439 +p43 +sVdin +p44 +V\u0414\u0438\u043d\u043a\u0430 +p45 +sVhye +p46 +V\u0410\u0440\u043c\u044f\u043d\u0441\u043a\u0438\u0439 +p47 +sVbla +p48 +V\u0421\u0438\u043a\u0441\u0438\u043a\u0430 +p49 +sVsrd +p50 +V\u0421\u0430\u0440\u0434\u0438\u043d\u0441\u043a\u0438\u0439 +p51 +sVcar +p52 +VCarib; Galibi +p53 +sVdiv +p54 +VDhivehi +p55 +sVtel +p56 +V\u0422\u0435\u043b\u0443\u0433\u0443 +p57 +sVtem +p58 +V\u0422\u0435\u043c\u043d\u0435 +p59 +sVnbl +p60 +V\u041d\u0434\u0435\u0431\u0435\u043b\u0435 \u044e\u0436\u043d\u044b\u0439 +p61 +sVter +p62 +V\u0422\u0435\u0440\u0435\u043d\u043e +p63 +sVtet +p64 +V\u0422\u0435\u0442\u0443\u043c\u0441\u043a\u0438\u0439 +p65 +sVsun +p66 +V\u0421\u0443\u043d\u0434\u0430\u043d\u0441\u043a\u0438\u0439 +p67 +sVkut +p68 +V\u041a\u0443\u0442\u0435\u043d\u0430\u0438 +p69 +sVsuk +p70 +V\u0421\u0443\u043a\u0443\u043c\u0430 +p71 +sVkur +p72 +V\u041a\u0443\u0440\u0434\u0441\u043a\u0438\u0439 +p73 +sVkum +p74 +V\u041a\u0443\u043c\u044b\u043a\u0441\u043a\u0438\u0439 +p75 +sVsus +p76 +V\u0421\u0443\u0441\u0443 +p77 +sVnew +p78 +VBhasa; Nepal +p79 +sVkua +p80 +V\u041a\u0438\u043d\u044c\u044f\u043c\u0430 +p81 +sVsux +p82 +V\u0428\u0443\u043c\u0435\u0440\u0441\u043a\u0438\u0439 +p83 +sVmen +p84 +VMende (Sierra Leone) +p85 +sVlez +p86 +V\u041b\u0435\u0437\u0433\u0438\u043d\u0441\u043a\u0438\u0439 +p87 +sVgla +p88 +VGaelic; Scottish +p89 +sVbos +p90 +V\u0411\u043e\u0441\u043d\u0438\u0439\u0441\u043a\u0438\u0439 +p91 +sVgle +p92 +V\u0418\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 +p93 +sVeka +p94 +V\u042d\u043a\u0430\u0434\u0436\u0443\u043a +p95 +sVglg +p96 +VGalician +p97 +sVakk +p98 +V\u0410\u043a\u043a\u0430\u0434\u0441\u043a\u0438\u0439 +p99 +sVaka +p100 +V\u0410\u043a\u0430\u043d +p101 +sVbod +p102 +V\u0422\u0438\u0431\u0435\u0442\u0441\u043a\u0438\u0439 +p103 +sVglv +p104 +V\u041c\u044d\u043d\u043a\u0441\u043a\u0438\u0439 +p105 +sVjrb +p106 +V\u0415\u0432\u0440\u0435\u0439\u0441\u043a\u043e-\u0430\u0440\u0430\u0431\u0441\u043a\u0438\u0439 +p107 +sVvie +p108 +V\u0412\u044c\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438\u0439 +p109 +sVipk +p110 +V\u0418\u043d\u0443\u043b\u0438\u0430\u043a +p111 +sVuzb +p112 +V\u0423\u0437\u0431\u0435\u043a\u0441\u043a\u0438\u0439 +p113 +sVsga +p114 +V\u0421\u0442\u0430\u0440\u043e\u0438\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 (\u043f\u043e 900) +p115 +sVbre +p116 +V\u0411\u0440\u0435\u0442\u043e\u043d\u0441\u043a\u0438\u0439 +p117 +sVbra +p118 +V\u0411\u0440\u0430\u0443\u043d +p119 +sVaym +p120 +V\u0410\u0439\u043c\u0430\u0440\u0430 +p121 +sVcha +p122 +V\u0427\u0430\u043c\u043e\u0440\u0440\u043e +p123 +sVchb +p124 +V\u0427\u0438\u0431\u0447\u0430 +p125 +sVche +p126 +V\u0427\u0435\u0447\u0435\u043d\u0441\u043a\u0438\u0439 +p127 +sVchg +p128 +V\u0427\u0430\u0433\u0430\u0442\u0430\u0439\u0441\u043a\u0438\u0439 +p129 +sVchk +p130 +V\u0422\u0440\u0443\u043a\u0441\u043a\u0438\u0439 +p131 +sVchm +p132 +V\u041c\u0430\u0440\u0438\u0439\u0441\u043a\u0438\u0439 (\u0420\u043e\u0441\u0441\u0438\u044f) +p133 +sVchn +p134 +V\u0427\u0438\u043d\u0443\u043a \u0436\u0430\u0440\u0433\u043e\u043d +p135 +sVcho +p136 +V\u0427\u043e\u043a\u0442\u0430\u0432 +p137 +sVchp +p138 +V\u0427\u0438\u043f\u0435\u0432\u0438\u0430\u043d\u0441\u043a\u0438\u0439 +p139 +sVchr +p140 +V\u0427\u0435\u0440\u043e\u043a\u0438 +p141 +sVchu +p142 +VSlavonic; Old +p143 +sVchv +p144 +V\u0427\u0443\u0432\u0430\u0448\u0441\u043a\u0438\u0439 +p145 +sVchy +p146 +V\u0427\u0435\u0439\u0435\u043d\u043d +p147 +sVmsa +p148 +VMalay (macrolanguage) +p149 +sViii +p150 +VYi; Sichuan +p151 +sVndo +p152 +V\u041d\u0434\u0443\u043d\u0433\u0430 +p153 +sVibo +p154 +V\u0418\u0433\u0431\u043e +p155 +sViba +p156 +V\u0418\u0431\u0430\u043d\u0441\u043a\u0438\u0439 +p157 +sVxho +p158 +V\u041a\u043e\u0441\u0430 +p159 +sVdeu +p160 +V\u041d\u0435\u043c\u0435\u0446\u043a\u0438\u0439 +p161 +sVcat +p162 +V\u041a\u0430\u0442\u0430\u043b\u0430\u043d\u0441\u043a\u0438\u0439 +p163 +sVdel +p164 +V\u0414\u0435\u043b\u0430\u0432\u0430\u0440\u0441\u043a\u0438\u0439 +p165 +sVden +p166 +V\u0410\u0442\u0430\u043f\u0430\u0447\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 +p167 +sVcad +p168 +V\u041a\u0430\u0434\u0434\u043e +p169 +sVtat +p170 +V\u0422\u0430\u0442\u0430\u0440\u0441\u043a\u0438\u0439 +p171 +sVsrn +p172 +VSranan Tongo +p173 +sVraj +p174 +V\u0420\u0430\u0434\u0436\u0430\u0441\u0442\u0445\u0430\u043d\u0438 +p175 +sVtam +p176 +V\u0422\u0430\u043c\u0438\u043b\u044c\u0441\u043a\u0438\u0439 +p177 +sVspa +p178 +V\u0418\u0441\u043f\u0430\u043d\u0441\u043a\u0438\u0439 +p179 +sVtah +p180 +V\u0422\u0430\u0438\u0442\u044f\u043d\u0441\u043a\u0438\u0439 +p181 +sVafh +p182 +V\u0410\u0444\u0440\u0438\u0445\u0438\u043b\u0438 +p183 +sVeng +p184 +V\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 +p185 +sVenm +p186 +V\u0421\u0440\u0435\u0434\u043d\u0435\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 (1100-1500) +p187 +sVcsb +p188 +V\u041a\u0430\u0448\u0443\u0431\u0438\u0430\u043d\u0441\u043a\u0438\u0439 +p189 +sVnyn +p190 +V\u041d\u044c\u044f\u043d\u043a\u043e\u043b\u0435 +p191 +sVnyo +p192 +V\u041d\u044c\u043e\u0440\u043e +p193 +sVsid +p194 +V\u0421\u0438\u0434\u0430\u043c\u0430 +p195 +sVnya +p196 +VNyanja +p197 +sVsin +p198 +V\u0421\u0438\u043d\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439 +p199 +sVafr +p200 +V\u0410\u0444\u0440\u0438\u043a\u0430\u0430\u043d\u0441 +p201 +sVlam +p202 +V\u041b\u0430\u043c\u0431\u0430 +p203 +sVsnd +p204 +V\u0421\u0438\u043d\u0434\u0445\u0438 +p205 +sVmar +p206 +V\u041c\u0430\u0440\u0430\u0442\u0445\u0438 +p207 +sVlah +p208 +V\u041b\u0430\u0445\u043d\u0434\u0430 +p209 +sVnym +p210 +V\u041d\u044c\u044f\u043c\u0432\u0435\u0437\u0438 +p211 +sVsna +p212 +V\u0428\u043e\u043d\u0430 +p213 +sVlad +p214 +V\u041b\u0430\u0434\u0438\u043d\u043e +p215 +sVsnk +p216 +V\u0421\u043e\u043d\u0438\u043d\u043a +p217 +sVmad +p218 +V\u041c\u0430\u0434\u0443\u0440\u0441\u043a\u0438\u0439 +p219 +sVmag +p220 +V\u041c\u0430\u0433\u0430\u0445\u0438 +p221 +sVmai +p222 +V\u041c\u0430\u0439\u0442\u0445\u0438\u043b\u0438 +p223 +sVmah +p224 +VMarshallese +p225 +sVlav +p226 +V\u041b\u0430\u0442\u0432\u0438\u0439\u0441\u043a\u0438\u0439 +p227 +sVmal +p228 +V\u041c\u0430\u043b\u0430\u044f\u043b\u0430\u043c +p229 +sVman +p230 +V\u041c\u0430\u043d\u0434\u0438\u043d\u0433\u043e +p231 +sVegy +p232 +V\u0414\u0440\u0435\u0432\u043d\u0435\u0435\u0433\u0438\u043f\u0435\u0442\u0441\u043a\u0438\u0439 +p233 +sVzen +p234 +V\u0417\u0435\u043d\u0430\u0433\u0441\u043a\u0438\u0439 +p235 +sVkbd +p236 +V\u041a\u0430\u0431\u0430\u0440\u0434\u0438\u043d\u0441\u043a\u0438\u0439 +p237 +sVita +p238 +V\u0418\u0442\u0430\u043b\u044c\u044f\u043d\u0441\u043a\u0438\u0439 +p239 +sVvai +p240 +V\u0412\u0430\u0438 +p241 +sVtsn +p242 +V\u0422\u0441\u0432\u0430\u043d\u0430 +p243 +sVtso +p244 +V\u0422\u0441\u043e\u043d\u0433\u0430 +p245 +sVtsi +p246 +V\u0426\u0438\u043c\u0448\u0438\u0430\u043d +p247 +sVbyn +p248 +VBilin +p249 +sVfij +p250 +V\u0424\u0438\u0434\u0436\u0438\u0439\u0441\u043a\u0438\u0439 +p251 +sVfin +p252 +V\u0424\u0438\u043d\u0441\u043a\u0438\u0439 +p253 +sVeus +p254 +V\u0411\u0430\u0441\u043a\u0441\u043a\u0438\u0439 +p255 +sVnon +p256 +V\u0421\u0442\u0430\u0440\u043e\u043d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439 +p257 +sVceb +p258 +V\u0421\u0435\u0431\u0443\u0430\u043d\u043e +p259 +sVdan +p260 +V\u0414\u0430\u0442\u0441\u043a\u0438\u0439 +p261 +sVnog +p262 +V\u041d\u043e\u0433\u0430\u0439\u0441\u043a\u0438\u0439 +p263 +sVnob +p264 +VNorwegian Bokml +p265 +sVdak +p266 +V\u0414\u0430\u043a\u043e\u0442\u0430 +p267 +sVces +p268 +V\u0427\u0435\u0448\u0441\u043a\u0438\u0439 +p269 +sVdar +p270 +V\u0414\u0430\u0440\u0433\u0432\u0430 +p271 +sVnor +p272 +V\u041d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439 +p273 +sVkpe +p274 +V\u041a\u043f\u0435\u043b\u043b\u0435 +p275 +sVguj +p276 +V\u0413\u0443\u0434\u0436\u0430\u0440\u0430\u0442\u0438 +p277 +sVmdf +p278 +V\u041c\u043e\u043a\u0448\u0430\u043d\u0441\u043a\u0438\u0439 +p279 +sVmas +p280 +V\u041c\u0430\u0441\u0430\u0438 +p281 +sVlao +p282 +V\u041b\u0430\u043e\u0441\u0441\u043a\u0438\u0439 +p283 +sVmdr +p284 +V\u041c\u0430\u043d\u0434\u0430\u0440\u0441\u043a\u0438\u0439 +p285 +sVgon +p286 +V\u0413\u043e\u043d\u0434\u0438 +p287 +sVgoh +p288 +VGerman; Old High (ca. 750-1050) +p289 +sVsms +p290 +VSami; Skolt +p291 +sVsmo +p292 +V\u0421\u0430\u043c\u043e\u0430\u043d\u0441\u043a\u0438\u0439 +p293 +sVsmn +p294 +VSami; Inari +p295 +sVsmj +p296 +V\u041b\u044e\u043b\u0435-\u0441\u0430\u0430\u043c\u0441\u043a\u0438\u0439 +p297 +sVgot +p298 +V\u0413\u043e\u0442\u0441\u043a\u0438\u0439 +p299 +sVsme +p300 +VSami; Northern +p301 +sVdsb +p302 +VSorbian; Lower +p303 +sVsma +p304 +VSami; Southern +p305 +sVgor +p306 +V\u0413\u043e\u0440\u043e\u043d\u0442\u0430\u043b\u043e +p307 +sVast +p308 +V\u0410\u0441\u0442\u0443\u0440\u0438\u0439\u0441\u043a\u0438\u0439 +p309 +sVorm +p310 +V\u041e\u0440\u043e\u043c\u043e +p311 +sVque +p312 +V\u041a\u0435\u0447\u0443\u0430 +p313 +sVori +p314 +V\u041e\u0440\u0438\u044f +p315 +sVcrh +p316 +VTurkish; Crimean +p317 +sVasm +p318 +V\u0410\u0441\u0441\u0430\u043c\u0441\u043a\u0438\u0439 +p319 +sVpus +p320 +V\u041f\u0443\u0448\u0442\u0443 +p321 +sVdgr +p322 +V\u0414\u043e\u0433\u0440\u0438\u0431 +p323 +sVltz +p324 +VLuxembourgish +p325 +sVgez +p326 +V\u0413\u0435\u044d\u0437 +p327 +sVisl +p328 +V\u0418\u0441\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 +p329 +sVlat +p330 +V\u041b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0439 +p331 +sVmak +p332 +V\u041c\u0430\u043a\u0430\u0441\u0441\u0430\u0440\u0441\u043a\u0438\u0439 +p333 +sVzap +p334 +V\u0421\u0430\u043f\u043e\u0442\u0435\u043a\u0441\u043a\u0438\u0439 +p335 +sVyid +p336 +V\u0418\u0434\u0438\u0448 +p337 +sVkok +p338 +VKonkani (macrolanguage) +p339 +sVkom +p340 +V\u041a\u043e\u043c\u0438 +p341 +sVkon +p342 +V\u041a\u043e\u043d\u0433\u043e +p343 +sVukr +p344 +V\u0423\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0438\u0439 +p345 +sVton +p346 +V\u0422\u043e\u043d\u0433\u0430 (\u043e\u0441\u0442\u0440\u043e\u0432\u0430 \u0422\u043e\u043d\u0433\u0430) +p347 +sVzxx +p348 +V\u041d\u0435\u0442 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e +p349 +sVkos +p350 +V\u041a\u043e\u0441\u0440\u0430\u0438\u043d\u0441\u043a\u0438\u0439 +p351 +sVkor +p352 +V\u041a\u043e\u0440\u0435\u0439\u0441\u043a\u0438\u0439 +p353 +sVtog +p354 +V\u0422\u043e\u043d\u0433\u0430 (\u041d\u044c\u044f\u0441\u0430) +p355 +sVhun +p356 +V\u0412\u0435\u043d\u0433\u0435\u0440\u0441\u043a\u0438\u0439 +p357 +sVhup +p358 +V\u0425\u0443\u043f\u0430 +p359 +sVcym +p360 +V\u0423\u044d\u043b\u044c\u0441\u043a\u0438\u0439 (\u0412\u0430\u043b\u043b\u0438\u0439\u0441\u043a\u0438\u0439) +p361 +sVudm +p362 +V\u0423\u0434\u043c\u0443\u0440\u0442\u0441\u043a\u0438\u0439 +p363 +sVbej +p364 +V\u0411\u0435\u0434\u0436\u0430 +p365 +sVben +p366 +V\u0411\u0435\u043d\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439 +p367 +sVbel +p368 +V\u0411\u0435\u043b\u043e\u0440\u0443\u0441\u0441\u043a\u0438\u0439 +p369 +sVbem +p370 +V\u0411\u0435\u043c\u0431\u0430 (\u0417\u0430\u043c\u0431\u0438\u044f) +p371 +sVaar +p372 +V\u0410\u0444\u0430\u0440 +p373 +sVnzi +p374 +V\u041d\u0437\u0438\u043c\u0430 +p375 +sVsah +p376 +V\u042f\u043a\u0443\u0442\u0441\u043a\u0438\u0439 +p377 +sVsan +p378 +V\u0421\u0430\u043d\u0441\u043a\u0440\u0438\u0442 +p379 +sVsam +p380 +VAramaic; Samaritan +p381 +sVpro +p382 +V\u0421\u0442\u0430\u0440\u043e\u043f\u0440\u043e\u0432\u0430\u043d\u0441\u0430\u043b\u044c\u0441\u043a\u0438\u0439 (\u043f\u043e 1500) +p383 +sVsag +p384 +V\u0421\u0430\u043d\u0433\u043e +p385 +sVsad +p386 +V\u0421\u0430\u043d\u0434\u0430\u0432\u0435 +p387 +sVanp +p388 +V\u0410\u043d\u0436\u0438\u043a\u0430 +p389 +sVrap +p390 +V\u0420\u0430\u043f\u0430\u043d\u044e +p391 +sVsas +p392 +V\u0421\u0430\u0441\u0430\u043a\u0441\u043a\u0438\u0439 +p393 +sVnqo +p394 +V\u041d'\u043a\u043e +p395 +sVsat +p396 +V\u0421\u0430\u043d\u0442\u0430\u043b\u0438 +p397 +sVmin +p398 +V\u041c\u0438\u043d\u0430\u043d\u0433\u043a\u0430\u0431\u0430\u0443 +p399 +sVlim +p400 +VLimburgan +p401 +sVlin +p402 +V\u041b\u0438\u043d\u0433\u0430\u043b\u0430 +p403 +sVlit +p404 +V\u041b\u0438\u0442\u043e\u0432\u0441\u043a\u0438\u0439 +p405 +sVefi +p406 +V\u042d\u0444\u0438\u043a +p407 +sVmis +p408 +VUncoded languages +p409 +sVkac +p410 +V\u041a\u0430\u0447\u0438\u043d\u0441\u043a\u0438\u0439 +p411 +sVkab +p412 +V\u041a\u0430\u0431\u0438\u043b\u044c\u0441\u043a\u0438\u0439 +p413 +sVkaa +p414 +V\u041a\u0430\u0440\u0430\u043a\u0430\u043b\u043f\u0430\u043a\u0441\u043a\u0438\u0439 +p415 +sVkan +p416 +V\u041a\u0430\u043d\u043d\u0430\u0434\u0430 +p417 +sVkam +p418 +VKamba (Kenya) +p419 +sVkal +p420 +VKalaallisut +p421 +sVkas +p422 +V\u041a\u0430\u0448\u043c\u0438\u0440\u0438 +p423 +sVkaw +p424 +V\u041a\u0430\u0432\u0438 +p425 +sVkau +p426 +V\u041a\u0430\u043d\u0443\u0440\u0438 +p427 +sVkat +p428 +V\u0413\u0440\u0443\u0437\u0438\u043d\u0441\u043a\u0438\u0439 +p429 +sVkaz +p430 +V\u041a\u0430\u0437\u0430\u0445\u0441\u043a\u0438\u0439 +p431 +sVtyv +p432 +V\u0422\u0443\u0432\u0438\u043d\u0441\u043a\u0438\u0439 +p433 +sVawa +p434 +V\u0410\u0432\u0430\u0434\u0445\u0438 +p435 +sVurd +p436 +V\u0423\u0440\u0434\u0443 +p437 +sVdoi +p438 +VDogri (macrolanguage) +p439 +sVtpi +p440 +V\u0422\u043e\u043a \u041f\u0438\u0441\u0438\u043d +p441 +sVmri +p442 +V\u041c\u0430\u043e\u0440\u0438 +p443 +sVabk +p444 +V\u0410\u0431\u0445\u0430\u0437\u0441\u043a\u0438\u0439 +p445 +sVtkl +p446 +V\u0422\u043e\u043a\u0435\u043b\u0430\u0443 +p447 +sVnld +p448 +V\u041d\u0438\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 +p449 +sVoji +p450 +V\u041e\u0434\u0436\u0438\u0431\u0432\u0430 +p451 +sVoci +p452 +VOccitan (post 1500) +p453 +sVwol +p454 +V\u0412\u043e\u043b\u043e\u0444 +p455 +sVjav +p456 +V\u042f\u0432\u0430\u043d\u0441\u043a\u0438\u0439 +p457 +sVhrv +p458 +V\u0425\u043e\u0440\u0432\u0430\u0442\u0441\u043a\u0438\u0439 +p459 +sVzza +p460 +V\u0417\u0430\u0437\u0430\u043a\u0438 +p461 +sVmga +p462 +V\u0421\u0440\u0435\u0434\u043d\u0435\u0438\u0440\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439 (900-1200) +p463 +sVhit +p464 +V\u0425\u0438\u0442\u0442\u0438\u0442 +p465 +sVdyu +p466 +V\u0414\u0438\u0443\u043b\u0430 (\u0414\u044c\u044e\u043b\u0430) +p467 +sVssw +p468 +V\u0421\u0432\u0430\u0442\u0438 +p469 +sVmul +p470 +V\u0420\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u043c\u0435\u0439 \u044f\u0437\u044b\u043a\u0438 +p471 +sVhil +p472 +V\u0425\u0438\u043b\u0438\u0433\u0430\u0439\u043d\u043e\u043d +p473 +sVhin +p474 +V\u0425\u0438\u043d\u0434\u0438 +p475 +sVbas +p476 +V\u0411\u0430\u0441\u0430 (\u041a\u0430\u043c\u0435\u0440\u0443\u043d) +p477 +sVgba +p478 +VGbaya (Central African Republic) +p479 +sVwln +p480 +V\u0412\u0430\u043b\u043b\u0443\u043d +p481 +sVnep +p482 +V\u041d\u0435\u043f\u0430\u043b\u044c\u0441\u043a\u0438\u0439 +p483 +sVcre +p484 +V\u041a\u0440\u0438 +p485 +sVban +p486 +V\u0411\u0430\u043b\u0438\u0439\u0441\u043a\u0438\u0439 +p487 +sVbal +p488 +VBaluchi +p489 +sVbam +p490 +V\u0411\u0430\u043c\u0431\u0430\u0440\u0430 +p491 +sVbak +p492 +V\u0411\u0430\u0448\u043a\u0438\u0440\u0441\u043a\u0438\u0439 +p493 +sVshn +p494 +V\u0428\u0430\u043d\u0441\u043a\u0438\u0439 +p495 +sVarp +p496 +V\u0410\u0440\u0430\u043f\u0430\u0445\u043e +p497 +sVarw +p498 +V\u0410\u0440\u0430\u0432\u0430\u043a\u0441\u043a\u0438\u0439 +p499 +sVara +p500 +V\u0410\u0440\u0430\u0431\u0441\u043a\u0438\u0439 +p501 +sVarc +p502 +V\u0410\u0440\u0430\u043c\u0435\u0439\u0441\u043a\u0438\u0439; \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 +p503 +sVarg +p504 +V\u0410\u0440\u0430\u0433\u043e\u043d\u0441\u043a\u0438\u0439 +p505 +sVsel +p506 +V\u0421\u0435\u043b\u043a\u0430\u043f\u0441\u043a\u0438\u0439 +p507 +sVarn +p508 +VMapudungun +p509 +sVlus +p510 +V\u041b\u0443\u0448\u0430\u0439 +p511 +sVmus +p512 +V\u041a\u0440\u0438\u043a +p513 +sVlua +p514 +V\u041b\u0443\u0431\u0430-\u041b\u0443\u043b\u0443\u0430 +p515 +sVlub +p516 +V\u041b\u0443\u0431\u0430-\u041a\u0430\u0442\u0430\u043d\u0433\u0430 +p517 +sVlug +p518 +V\u0413\u0430\u043d\u0434\u0430 +p519 +sVlui +p520 +V\u041b\u0443\u0438\u0441\u0435\u043d\u044c\u043e +p521 +sVlun +p522 +V\u041b\u0443\u043d\u0434\u0430 +p523 +sVluo +p524 +V\u041b\u0443\u043e (\u041a\u0435\u043d\u0438\u044f \u0438 \u0422\u0430\u043d\u0437\u0430\u043d\u0438\u044f) +p525 +sViku +p526 +V\u0418\u043d\u0443\u043a\u0442\u0438\u0442\u0443\u0442 +p527 +sVtur +p528 +V\u0422\u0443\u0440\u0435\u0446\u043a\u0438\u0439 +p529 +sVzbl +p530 +VBlissymbols +p531 +sVtuk +p532 +V\u0422\u0443\u0440\u043a\u043c\u0435\u043d\u0441\u043a\u0438\u0439 +p533 +sVtum +p534 +V\u0422\u0443\u043c\u0431\u0443\u043a\u0430 +p535 +sVcop +p536 +V\u041a\u043e\u043f\u0442\u0441\u043a\u0438\u0439 +p537 +sVcos +p538 +V\u041a\u043e\u0440\u0441\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0439 +p539 +sVcor +p540 +V\u041a\u043e\u0440\u043d\u0441\u043a\u0438\u0439 +p541 +sVilo +p542 +V\u0418\u043b\u043e\u043a\u043e +p543 +sVgwi +p544 +VGwich\u02bcin +p545 +sVund +p546 +V\u041d\u0435\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 +p547 +sVtli +p548 +V\u0422\u043b\u0438\u043d\u0433\u0438\u0442 +p549 +sVtlh +p550 +VKlingon +p551 +sVpor +p552 +V\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439 +p553 +sVpon +p554 +V\u0424\u043e\u043d\u043f\u0435\u0439\u0441\u043a\u0438\u0439 +p555 +sVpol +p556 +V\u041f\u043e\u043b\u044c\u0441\u043a\u0438\u0439 +p557 +sVang +p558 +VEnglish; Old (ca. 450-1100) +p559 +sVtgk +p560 +V\u0422\u0430\u0434\u0436\u0438\u043a\u0441\u043a\u0438\u0439 +p561 +sVtgl +p562 +V\u0422\u0430\u0433\u0430\u043b\u043e\u0433 +p563 +sVfra +p564 +V\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439 +p565 +sVdum +p566 +VDutch; Middle (ca. 1050-1350) +p567 +sVswa +p568 +VSwahili (macrolanguage) +p569 +sVdua +p570 +V\u0414\u0443\u0430\u043b\u0430 +p571 +sVfro +p572 +VFrench; Old (842-ca. 1400) +p573 +sVyap +p574 +V\u042f\u0430\u043f\u0438\u0439\u0441\u043a\u0438\u0439 +p575 +sVfrm +p576 +VFrench; Middle (ca. 1400-1600) +p577 +sVfrs +p578 +VFrisian; Eastern +p579 +sVfrr +p580 +VFrisian; Northern +p581 +sVyao +p582 +V\u042f\u043e +p583 +sVxal +p584 +VKalmyk +p585 +sVfry +p586 +VFrisian; Western +p587 +sVgay +p588 +V\u0413\u0430\u0439\u043e +p589 +sVota +p590 +V\u0422\u0443\u0440\u0435\u0446\u043a\u0438\u0439; \u041e\u0442\u043e\u043c\u0430\u043d\u0433\u0441\u043a\u0438\u0439 (1500-1928) +p591 +sVhmn +p592 +V\u0425\u043c\u043e\u043d\u0433 +p593 +sVhmo +p594 +V\u0425\u0438\u0440\u0438 \u041c\u043e\u0442\u0443 +p595 +sVgaa +p596 +V\u0413\u0430 +p597 +sVfur +p598 +V\u0424\u0440\u0438\u0443\u043b\u0438\u0430\u043d\u0441\u043a\u0438\u0439 +p599 +sVmlg +p600 +V\u041c\u0430\u043b\u0430\u0433\u0430\u0441\u0438 +p601 +sVslv +p602 +V\u0421\u043b\u043e\u0432\u0435\u043d\u0441\u043a\u0438\u0439 +p603 +sVain +p604 +VAinu (Japan) +p605 +sVfil +p606 +VFilipino +p607 +sVmlt +p608 +V\u041c\u0430\u043b\u044c\u0442\u0438\u0439\u0441\u043a\u0438\u0439 +p609 +sVslk +p610 +V\u0421\u043b\u043e\u0432\u0430\u0446\u043a\u0438\u0439 +p611 +sVrar +p612 +VMaori; Cook Islands +p613 +sVful +p614 +V\u0424\u0443\u043b\u0430\u0445 +p615 +sVjpn +p616 +V\u042f\u043f\u043e\u043d\u0441\u043a\u0438\u0439 +p617 +sVvol +p618 +V\u0412\u043e\u043b\u0430\u043f\u044e\u043a +p619 +sVvot +p620 +V\u0412\u043e\u0442\u0438\u043a +p621 +sVind +p622 +V\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0439\u0441\u043a\u0438\u0439 +p623 +sVave +p624 +V\u0410\u0432\u0435\u0441\u0442\u0438\u0439\u0441\u043a\u0438\u0439 +p625 +sVjpr +p626 +V\u0415\u0432\u0440\u0435\u0439\u0441\u043a\u043e-\u043f\u0435\u0440\u0441\u0438\u0434\u0441\u043a\u0438\u0439 +p627 +sVava +p628 +V\u0410\u0432\u0430\u0440\u0441\u043a\u0438\u0439 +p629 +sVpap +p630 +V\u041f\u0430\u043f\u044c\u044f\u043c\u0435\u043d\u0442\u043e +p631 +sVewo +p632 +V\u042d\u0432\u043e\u043d\u0434\u043e +p633 +sVpau +p634 +V\u041f\u0430\u043b\u0430\u0443 +p635 +sVewe +p636 +V\u042d\u0432\u0435 +p637 +sVpag +p638 +V\u041f\u0430\u043d\u0433\u0430\u0441\u0438\u043d\u0430\u043d +p639 +sVpal +p640 +V\u041f\u0435\u0445\u043b\u0435\u0432\u0438\u0439\u0441\u043a\u0438\u0439 +p641 +sVpam +p642 +V\u041f\u0430\u043c\u043f\u0430\u043d\u0433\u0430 +p643 +sVpan +p644 +VPanjabi +p645 +sVsyc +p646 +VSyriac; Classical +p647 +sVphn +p648 +V\u0424\u0438\u043d\u0438\u043a\u0438\u0439\u0441\u043a\u0438\u0439 +p649 +sVkir +p650 +V\u041a\u0438\u0440\u0433\u0438\u0437\u0441\u043a\u0438\u0439 +p651 +sVnia +p652 +V\u041d\u0438\u0430\u0441 +p653 +sVkik +p654 +V\u041a\u0438\u043a\u0443\u0439\u044e +p655 +sVsyr +p656 +V\u0421\u0438\u0440\u0438\u0439\u0441\u043a\u0438\u0439 +p657 +sVkin +p658 +V\u041a\u0438\u043d\u044c\u044f\u0440\u0443\u0430\u043d\u0434\u0430 +p659 +sVniu +p660 +V\u041d\u0438\u0443\u044d +p661 +sVgsw +p662 +VGerman; Swiss +p663 +sVepo +p664 +V\u042d\u0441\u043f\u0435\u0440\u0430\u043d\u0442\u043e +p665 +sVjbo +p666 +V\u041b\u043e\u0434\u0436\u0431\u0430\u043d +p667 +sVmic +p668 +VMi'kmaq +p669 +sVtha +p670 +V\u0422\u0430\u0438 +p671 +sVhai +p672 +V\u0425\u0430\u0439\u0434\u0430 +p673 +sVgmh +p674 +VGerman; Middle High (ca. 1050-1500) +p675 +sVell +p676 +V\u041d\u043e\u0432\u043e\u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0439 (\u0441 1453) +p677 +sVady +p678 +V\u0410\u0434\u044b\u0433\u0435\u0439\u0441\u043a\u0438\u0439 +p679 +sVelx +p680 +V\u042d\u043b\u0430\u043c\u0441\u043a\u0438\u0439 +p681 +sVada +p682 +V\u0410\u0434\u0430\u043d\u0433\u043c\u0435 +p683 +sVnav +p684 +VNavajo +p685 +sVhat +p686 +VCreole; Haitian +p687 +sVhau +p688 +V\u0425\u0430\u0443\u0441\u0430 +p689 +sVhaw +p690 +V\u0413\u0430\u0432\u0430\u0439\u0441\u043a\u0438\u0439 +p691 +sVbin +p692 +V\u0411\u0438\u043d\u0438 +p693 +sVamh +p694 +V\u0410\u043c\u0445\u0430\u0440\u0441\u043a\u0438\u0439 (\u0410\u043c\u0430\u0440\u0438\u043d\u044c\u044f) +p695 +sVbik +p696 +V\u0411\u0438\u043a\u043e\u043b\u044c\u0441\u043a\u0438\u0439 +p697 +sVmos +p698 +V\u041c\u043e\u0435\u0439 +p699 +sVmoh +p700 +V\u041c\u043e\u0445\u0430\u0443\u043a +p701 +sVmon +p702 +V\u041c\u043e\u043d\u0433\u043e\u043b\u044c\u0441\u043a\u0438\u0439 +p703 +sVbho +p704 +V\u0411\u0445\u043e\u0434\u0436\u043f\u0443\u0440\u0438 +p705 +sVbis +p706 +V\u0411\u0438\u0441\u043b\u0430\u043c\u0430 +p707 +sVtvl +p708 +V\u0422\u0443\u0432\u0430\u043b\u0443 +p709 +sVest +p710 +V\u042d\u0441\u0442\u043e\u043d\u0441\u043a\u0438\u0439 +p711 +sVkmb +p712 +V\u041a\u0438\u043c\u0431\u0443\u043d\u0434\u0443 +p713 +sVpeo +p714 +VPersian; Old (ca. 600-400 B.C.) +p715 +sVumb +p716 +V\u0423\u043c\u0431\u0443\u043d\u0434\u0443 +p717 +sVtmh +p718 +V\u0422\u0430\u043c\u0430\u0448\u0435\u043a +p719 +sVfon +p720 +V\u0424\u043e\u043d +p721 +sVhsb +p722 +VSorbian; Upper +p723 +sVrun +p724 +V\u0420\u0443\u043d\u0434\u0438 +p725 +sVrus +p726 +V\u0420\u0443\u0441\u0441\u043a\u0438\u0439 +p727 +sVrup +p728 +VRomanian; Macedo- +p729 +sVpli +p730 +V\u041f\u0430\u043b\u0438 +p731 +sVace +p732 +V\u0410\u0447\u0435\u0445\u0441\u043a\u0438\u0439 +p733 +sVach +p734 +V\u0410\u0447\u043e\u043b\u0438 +p735 +sVnde +p736 +V\u041d\u0434\u0435\u0431\u0435\u043b\u0435 \u0441\u0435\u0432\u0435\u0440\u043d\u044b\u0439 +p737 +sVdzo +p738 +V\u0414\u0437\u043e\u043d\u0433-\u043a\u044d +p739 +sVkru +p740 +V\u041a\u0443\u0440\u0443\u0445 +p741 +sVsrr +p742 +V\u0421\u0435\u0440\u0435\u0440 +p743 +sVido +p744 +V\u0418\u0434\u043e +p745 +sVsrp +p746 +V\u0421\u0435\u0440\u0431\u0441\u043a\u0438\u0439 +p747 +sVkrl +p748 +V\u041a\u0430\u0440\u0435\u043b\u044c\u0441\u043a\u0438\u0439 +p749 +sVkrc +p750 +V\u041a\u0430\u0440\u0430\u0447\u0430\u0435\u0432\u043e-\u0431\u0430\u043b\u043a\u0430\u0440\u0441\u043a\u0438\u0439 +p751 +sVnds +p752 +VGerman; Low +p753 +sVzun +p754 +V\u0417\u0443\u043d\u044c\u0438 +p755 +sVzul +p756 +V\u0417\u0443\u043b\u0443\u0441\u0441\u043a\u0438\u0439 +p757 +sVtwi +p758 +V\u0422\u0432\u0438 +p759 +sVsog +p760 +V\u0421\u043e\u0433\u0434\u0438\u0439\u0441\u043a\u0438\u0439 +p761 +sVnso +p762 +VSotho; Northern +p763 +sVswe +p764 +V\u0428\u0432\u0435\u0434\u0441\u043a\u0438\u0439 +p765 +sVsom +p766 +V\u0421\u043e\u043c\u0430\u043b\u0438 +p767 +sVsot +p768 +V\u0421\u043e\u0442\u043e \u042e\u0436\u043d\u044b\u0439 +p769 +sVmkd +p770 +V\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438\u0439 +p771 +sVher +p772 +V\u0413\u0435\u0440\u0435\u0440\u043e +p773 +sVlol +p774 +V\u041c\u043e\u043d\u0433\u043e +p775 +sVheb +p776 +V\u0418\u0432\u0440\u0438\u0442 +p777 +sVloz +p778 +V\u041b\u043e\u0437\u0438 +p779 +sVgil +p780 +V\u0413\u0438\u043b\u044c\u0431\u0435\u0440\u0442\u0441\u043a\u0438\u0439 +p781 +sVwas +p782 +V\u0412\u0430\u0448\u043e +p783 +sVwar +p784 +VWaray (Philippines) +p785 +sVbul +p786 +V\u0411\u043e\u043b\u0433\u0430\u0440\u0441\u043a\u0438\u0439 +p787 +sVwal +p788 +VWolaytta +p789 +sVbua +p790 +V\u0411\u0443\u0440\u044f\u0442\u0441\u043a\u0438\u0439 +p791 +sVbug +p792 +V\u0411\u0443\u0433\u0438\u0439\u0441\u043a\u0438\u0439 +p793 +sVaze +p794 +V\u0410\u0437\u0435\u0440\u0431\u0430\u0439\u0434\u0436\u0430\u043d\u0441\u043a\u0438\u0439 +p795 +sVzha +p796 +V\u0427\u0436\u0443\u0430\u043d\u0441\u043a\u0438\u0439 +p797 +sVzho +p798 +V\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 +p799 +sVnno +p800 +V\u041d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439 \u041d\u044e\u043d\u043e\u0440\u0441\u043a +p801 +sVuig +p802 +V\u0423\u0439\u0433\u0443\u0440\u0441\u043a\u0438\u0439 +p803 +sVmyv +p804 +V\u042d\u0440\u0437\u044f\u043d\u0441\u043a\u0438\u0439 +p805 +sVinh +p806 +V\u0418\u043d\u0433\u0443\u0448\u0441\u043a\u0438\u0439 +p807 +sVkhm +p808 +VKhmer; Central +p809 +sVkho +p810 +V\u0425\u043e\u0442\u0430\u043d\u0441\u043a\u0438\u0439 +p811 +sVmya +p812 +V\u0411\u0438\u0440\u043c\u0430\u043d\u0441\u043a\u0438\u0439 +p813 +sVkha +p814 +V\u041a\u0445\u0430\u0441\u0438 +p815 +sVina +p816 +V\u0418\u043d\u0442\u0435\u0440\u043b\u0438\u043d\u0433\u0432\u0430 (\u0410\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443\u043d\u0430\u0440\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430) +p817 +sVtiv +p818 +V\u0422\u0438\u0432 +p819 +sVtir +p820 +V\u0422\u0438\u0433\u0440\u0438\u043d\u044c\u044f +p821 +sVnap +p822 +V\u041d\u0435\u0430\u043f\u043e\u043b\u0438\u0442\u0430\u043d\u0441\u043a\u0438\u0439 +p823 +sVgrb +p824 +V\u0413\u0440\u0435\u0431\u043e +p825 +sVgrc +p826 +V\u0414\u0440\u0435\u0432\u043d\u0435\u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0439 (\u043f\u043e 1453) +p827 +sVnau +p828 +V\u041d\u0430\u0443\u0440\u0443 +p829 +sVgrn +p830 +V\u0413\u0443\u0430\u0440\u0430\u043d\u0438 +p831 +sVtig +p832 +V\u0422\u0438\u0433\u0440\u0435 +p833 +sVyor +p834 +V\u0419\u043e\u0440\u0443\u0431\u0430 +p835 +sVile +p836 +V\u0418\u043d\u0442\u0435\u0440\u043b\u0438\u043d\u0433\u0432\u0435 +p837 +sVsqi +p838 +V\u0410\u043b\u0431\u0430\u043d\u0441\u043a\u0438\u0439 +p839 +ssS'fr' +p840 +(dp841 +Vroh +p842 +Vromanche +p843 +sVsco +p844 +Vcossais +p845 +sVscn +p846 +Vsicilien +p847 +sVrom +p848 +Vromany +p849 +sVron +p850 +Vroumain +p851 +sVoss +p852 +Vosstien +p853 +sVale +p854 +Valoute +p855 +sVmni +p856 +Vmanipuri +p857 +sVnwc +p858 +Vnewari ancien +p859 +sVosa +p860 +Vosage +p861 +sValt +p862 +Valta mridional +p863 +sVmnc +p864 +Vmandchou +p865 +sVmwr +p866 +Vmarwari +p867 +sVven +p868 +Vvenda +p869 +sVuga +p870 +Vougaritique +p871 +sVmwl +p872 +Vmirandais +p873 +sVfas +p874 +Vpersan +p875 +sVfat +p876 +Vfanti +p877 +sVfan +p878 +Vfang (Guine quatoriale) +p879 +sVfao +p880 +Vfroen +p881 +sVdin +p882 +Vdinka +p883 +sVhye +p884 +Varmnien +p885 +sVbla +p886 +Vpied-noir +p887 +sVsrd +p888 +Vsarde +p889 +sVcar +p890 +Vcarib; Galibi +p891 +sVdiv +p892 +Vdhivehi +p893 +sVtel +p894 +Vtlougou +p895 +sVtem +p896 +Vtimne +p897 +sVnbl +p898 +Vndebele mridional +p899 +sVter +p900 +Vtereno +p901 +sVtet +p902 +Vtetum +p903 +sVsun +p904 +Vsundanais +p905 +sVkut +p906 +Vkutenai +p907 +sVsuk +p908 +Vsukuma +p909 +sVkur +p910 +Vkurde +p911 +sVkum +p912 +Vkumyk +p913 +sVsus +p914 +Vsusu +p915 +sVnew +p916 +Vbhasa; Npal +p917 +sVkua +p918 +Vkuanyama +p919 +sVsux +p920 +Vsumrien +p921 +sVmen +p922 +Vmende (Sierra Lone) +p923 +sVlez +p924 +Vlezghian +p925 +sVgla +p926 +Vgalique cossais +p927 +sVbos +p928 +Vbosniaque +p929 +sVgle +p930 +Virlandais +p931 +sVeka +p932 +Vekajuk +p933 +sVglg +p934 +Vgalicien +p935 +sVakk +p936 +Vakkadien +p937 +sVaka +p938 +Vakan +p939 +sVbod +p940 +Vtibtain +p941 +sVglv +p942 +Vmanx +p943 +sVjrb +p944 +Vjudo-arabe +p945 +sVvie +p946 +Vvietnamien +p947 +sVipk +p948 +Vinupiaq +p949 +sVuzb +p950 +Vouszbek +p951 +sVsga +p952 +Virlandais ancien (jusqu' 900) +p953 +sVbre +p954 +Vbreton +p955 +sVbra +p956 +Vbraj +p957 +sVaym +p958 +Vaymara +p959 +sVcha +p960 +Vchamorro +p961 +sVchb +p962 +Vchibcha +p963 +sVche +p964 +Vthtchne +p965 +sVchg +p966 +Vchagatai +p967 +sVchk +p968 +Vchuukese +p969 +sVchm +p970 +Vmari (Russie) +p971 +sVchn +p972 +Vchinook; jargon +p973 +sVcho +p974 +Vchoctaw +p975 +sVchp +p976 +Vchipewyan +p977 +sVchr +p978 +Vcherokee +p979 +sVchu +p980 +Vslavon; ancien +p981 +sVchv +p982 +Vtchouvache +p983 +sVchy +p984 +Vcheyenne +p985 +sVmsa +p986 +Vmalais (macrolangue) +p987 +sViii +p988 +Vyi de Sichuan +p989 +sVndo +p990 +Vndonga +p991 +sVibo +p992 +Vigbo +p993 +sViba +p994 +Viban +p995 +sVxho +p996 +Vxhosa +p997 +sVdeu +p998 +Vallemand +p999 +sVcat +p1000 +Vcatalan +p1001 +sVdel +p1002 +Vdelaware +p1003 +sVden +p1004 +Vesclave (athapascan) +p1005 +sVcad +p1006 +Vcaddo +p1007 +sVtat +p1008 +Vtatar +p1009 +sVsrn +p1010 +Vsranan Tongo +p1011 +sVraj +p1012 +Vrajasthani +p1013 +sVtam +p1014 +Vtamoul +p1015 +sVspa +p1016 +Vespagnol +p1017 +sVtah +p1018 +Vtahitien +p1019 +sVafh +p1020 +Vafrihili +p1021 +sVeng +p1022 +Vanglais +p1023 +sVenm +p1024 +Vanglais moyen (1100-1500) +p1025 +sVcsb +p1026 +Vkachoubien +p1027 +sVnyn +p1028 +Vnyankole +p1029 +sVnyo +p1030 +Vnyoro +p1031 +sVsid +p1032 +Vsidamo +p1033 +sVnya +p1034 +Vnyanja +p1035 +sVsin +p1036 +Vsinhala +p1037 +sVafr +p1038 +VAfrikaans +p1039 +sVlam +p1040 +Vlamba +p1041 +sVsnd +p1042 +Vsindhi +p1043 +sVmar +p1044 +Vmarathi +p1045 +sVlah +p1046 +Vlahnda +p1047 +sVnym +p1048 +Vnyamwezi +p1049 +sVsna +p1050 +Vshona +p1051 +sVlad +p1052 +Vladino +p1053 +sVsnk +p1054 +Vsoninke +p1055 +sVmad +p1056 +Vmadurais +p1057 +sVmag +p1058 +Vmagahi +p1059 +sVmai +p1060 +Vmaithili +p1061 +sVmah +p1062 +Vmarshallais +p1063 +sVlav +p1064 +Vletton +p1065 +sVmal +p1066 +Vmalayalam +p1067 +sVman +p1068 +Vmandingue +p1069 +sVegy +p1070 +Vgyptien ancien +p1071 +sVzen +p1072 +Vzenaga +p1073 +sVkbd +p1074 +Vkabardian +p1075 +sVita +p1076 +Vitalien +p1077 +sVvai +p1078 +Vvai +p1079 +sVtsn +p1080 +Vtswana +p1081 +sVtso +p1082 +Vtsonga +p1083 +sVtsi +p1084 +Vtsimshien +p1085 +sVbyn +p1086 +Vbilin +p1087 +sVfij +p1088 +Vfidjien +p1089 +sVfin +p1090 +Vfinnois +p1091 +sVeus +p1092 +Vbasque +p1093 +sVnon +p1094 +Vnorse ancien +p1095 +sVceb +p1096 +Vcbuan +p1097 +sVdan +p1098 +Vdanois +p1099 +sVnog +p1100 +Vnoga +p1101 +sVnob +p1102 +Vnorvgien bokml +p1103 +sVdak +p1104 +Vdakota +p1105 +sVces +p1106 +Vtchque +p1107 +sVdar +p1108 +Vdargwa +p1109 +sVnor +p1110 +Vnorvgien +p1111 +sVkpe +p1112 +Vkpelle +p1113 +sVguj +p1114 +Vgujarati +p1115 +sVmdf +p1116 +Vmoksha +p1117 +sVmas +p1118 +Vmassa +p1119 +sVlao +p1120 +Vlao +p1121 +sVmdr +p1122 +Vmandar +p1123 +sVgon +p1124 +Vgondi +p1125 +sVgoh +p1126 +Vallemand; vieux haut (environ 750-1050) +p1127 +sVsms +p1128 +Vsami de Skolt +p1129 +sVsmo +p1130 +Vsamoan +p1131 +sVsmn +p1132 +Vsami d'Inari +p1133 +sVsmj +p1134 +Vsami de Lule +p1135 +sVgot +p1136 +Vgothique +p1137 +sVsme +p1138 +Vsami septentrional +p1139 +sVdsb +p1140 +Vbas-sorbien +p1141 +sVsma +p1142 +Vsami mridional +p1143 +sVgor +p1144 +Vgorontalo +p1145 +sVast +p1146 +Vasturien +p1147 +sVorm +p1148 +Voromo +p1149 +sVque +p1150 +Vquechua +p1151 +sVori +p1152 +Voriya +p1153 +sVcrh +p1154 +Vturc de Crime +p1155 +sVasm +p1156 +Vassamais +p1157 +sVpus +p1158 +Vpushto +p1159 +sVdgr +p1160 +Vdogrib +p1161 +sVltz +p1162 +Vluxembourgeois +p1163 +sVgez +p1164 +Vgeez +p1165 +sVisl +p1166 +Vislandais +p1167 +sVlat +p1168 +Vlatin +p1169 +sVmak +p1170 +Vmakassar +p1171 +sVzap +p1172 +Vzapotque +p1173 +sVyid +p1174 +Vyiddish +p1175 +sVkok +p1176 +Vkonkani (macrolangue) +p1177 +sVkom +p1178 +Vkomi +p1179 +sVkon +p1180 +Vkongo +p1181 +sVukr +p1182 +Vukrainien +p1183 +sVton +p1184 +Vtonga (les Tonga) +p1185 +sVzxx +p1186 +Vpas de contenu linguistique +p1187 +sVkos +p1188 +Vkosraen +p1189 +sVkor +p1190 +Vcoren +p1191 +sVtog +p1192 +Vtonga (Nyasa) +p1193 +sVhun +p1194 +Vhongrois +p1195 +sVhup +p1196 +Vhupa +p1197 +sVcym +p1198 +Vgallois +p1199 +sVudm +p1200 +Vudmurt +p1201 +sVbej +p1202 +Vbeja +p1203 +sVben +p1204 +Vbengali +p1205 +sVbel +p1206 +Vbilorusse +p1207 +sVbem +p1208 +Vbemba (Zambie) +p1209 +sVaar +p1210 +Vafar +p1211 +sVnzi +p1212 +Vnzima +p1213 +sVsah +p1214 +Viakoute +p1215 +sVsan +p1216 +Vsanskrit +p1217 +sVsam +p1218 +Varamaque samaritain +p1219 +sVpro +p1220 +Vprovenal ancien (jusqu' 1500) +p1221 +sVsag +p1222 +Vsango +p1223 +sVsad +p1224 +Vsandawe +p1225 +sVanp +p1226 +Vangika +p1227 +sVrap +p1228 +Vrapanui +p1229 +sVsas +p1230 +Vsasak +p1231 +sVnqo +p1232 +Vn'Ko +p1233 +sVsat +p1234 +Vsantali +p1235 +sVmin +p1236 +Vminangkabau +p1237 +sVlim +p1238 +Vlimbourgeois +p1239 +sVlin +p1240 +Vlingala +p1241 +sVlit +p1242 +Vlituanien +p1243 +sVefi +p1244 +Vefik +p1245 +sVmis +p1246 +VLangues non codes +p1247 +sVkac +p1248 +Vkachin +p1249 +sVkab +p1250 +Vkabyle +p1251 +sVkaa +p1252 +Vkara-kalpak +p1253 +sVkan +p1254 +Vkannada +p1255 +sVkam +p1256 +Vkamba (Kenya) +p1257 +sVkal +p1258 +Vkalaallisut +p1259 +sVkas +p1260 +Vcachemiri +p1261 +sVkaw +p1262 +Vkawi +p1263 +sVkau +p1264 +Vkanuri +p1265 +sVkat +p1266 +Vgorgien +p1267 +sVkaz +p1268 +Vkazakh +p1269 +sVtyv +p1270 +Vtuvinien +p1271 +sVawa +p1272 +Vawadhi +p1273 +sVurd +p1274 +Vourdou +p1275 +sVdoi +p1276 +Vdogri (macrolangue) +p1277 +sVtpi +p1278 +Vtok Pisin +p1279 +sVmri +p1280 +Vmaori +p1281 +sVabk +p1282 +Vabkhaze +p1283 +sVtkl +p1284 +Vtokelau +p1285 +sVnld +p1286 +Vnerlandais +p1287 +sVoji +p1288 +Vojibwa +p1289 +sVoci +p1290 +Voccitan (aprs 1500) +p1291 +sVwol +p1292 +Vwolof +p1293 +sVjav +p1294 +Vjavanais +p1295 +sVhrv +p1296 +Vcroate +p1297 +sVzza +p1298 +Vzaza +p1299 +sVmga +p1300 +Virlandais intermdiaire (900-1200) +p1301 +sVhit +p1302 +Vhittite +p1303 +sVdyu +p1304 +Vdioula +p1305 +sVssw +p1306 +Vswati +p1307 +sVmul +p1308 +VLangues multiples +p1309 +sVhil +p1310 +Vhiligaynon +p1311 +sVhin +p1312 +Vhindi +p1313 +sVbas +p1314 +Vbasa (Cameroun) +p1315 +sVgba +p1316 +Vgbaya (Rpublique Centrafricaine) +p1317 +sVwln +p1318 +Vwallon +p1319 +sVnep +p1320 +Vnpalais +p1321 +sVcre +p1322 +Vcri +p1323 +sVban +p1324 +Vbalinais +p1325 +sVbal +p1326 +Vbaloutchi +p1327 +sVbam +p1328 +Vbambara +p1329 +sVbak +p1330 +Vbachkir +p1331 +sVshn +p1332 +Vshan +p1333 +sVarp +p1334 +Varapaho +p1335 +sVarw +p1336 +Varawak +p1337 +sVara +p1338 +Varabe +p1339 +sVarc +p1340 +Varamen officiel (700-300 A.C.) +p1341 +sVarg +p1342 +Varagonais +p1343 +sVsel +p1344 +Vselkup +p1345 +sVarn +p1346 +Vmapudungun +p1347 +sVlus +p1348 +Vlushai +p1349 +sVmus +p1350 +Vcreek +p1351 +sVlua +p1352 +Vluba-lulua +p1353 +sVlub +p1354 +Vluba-katanga +p1355 +sVlug +p1356 +Vganda +p1357 +sVlui +p1358 +Vluiseno +p1359 +sVlun +p1360 +Vlunda +p1361 +sVluo +p1362 +Vluo (Kenya et Tanzanie) +p1363 +sViku +p1364 +Vinuktitut +p1365 +sVtur +p1366 +Vturc +p1367 +sVzbl +p1368 +Vblissymbols +p1369 +sVtuk +p1370 +Vturkmne +p1371 +sVtum +p1372 +Vtumbuka +p1373 +sVcop +p1374 +Vcopte +p1375 +sVcos +p1376 +Vcorse +p1377 +sVcor +p1378 +Vcornish +p1379 +sVilo +p1380 +Viloko +p1381 +sVgwi +p1382 +Vgwich\u02bcin +p1383 +sVund +p1384 +Vindtermin +p1385 +sVtli +p1386 +Vtlingit +p1387 +sVtlh +p1388 +Vklingon +p1389 +sVpor +p1390 +Vportugais +p1391 +sVpon +p1392 +Vpohnpeien +p1393 +sVpol +p1394 +Vpolonais +p1395 +sVang +p1396 +Vanglo-saxon (environ 450-1100) +p1397 +sVtgk +p1398 +Vtadjik +p1399 +sVtgl +p1400 +Vtagalog +p1401 +sVfra +p1402 +VFranais +p1403 +sVdum +p1404 +Vnerlandais moyen (environ 1050-1350) +p1405 +sVswa +p1406 +Vswahili (macrolangue) +p1407 +sVdua +p1408 +Vduala +p1409 +sVfro +p1410 +Vancien franais (842 environ 1400) +p1411 +sVyap +p1412 +Vyapese +p1413 +sVfrm +p1414 +Vfranais moyen (environ 1400-1600) +p1415 +sVfrs +p1416 +Vfrison oriental +p1417 +sVfrr +p1418 +Vfrison septentrional +p1419 +sVyao +p1420 +Vyao +p1421 +sVxal +p1422 +Vkalmouke +p1423 +sVfry +p1424 +Vfrison occidental +p1425 +sVgay +p1426 +Vgayo +p1427 +sVota +p1428 +Vturc ottoman (1500-1928) +p1429 +sVhmn +p1430 +Vhmong +p1431 +sVhmo +p1432 +Vhiri Motu +p1433 +sVgaa +p1434 +Vga +p1435 +sVfur +p1436 +Vfrioulan +p1437 +sVmlg +p1438 +Vmalgache +p1439 +sVslv +p1440 +Vslovne +p1441 +sVain +p1442 +Vanou (Japon) +p1443 +sVfil +p1444 +Vfilipino +p1445 +sVmlt +p1446 +Vmaltais +p1447 +sVslk +p1448 +Vslovaque +p1449 +sVrar +p1450 +Vmaori des les Cook +p1451 +sVful +p1452 +Vfulah +p1453 +sVjpn +p1454 +Vjaponais +p1455 +sVvol +p1456 +Vvolapk +p1457 +sVvot +p1458 +Vvotique +p1459 +sVind +p1460 +Vindonsien +p1461 +sVave +p1462 +Vavestique +p1463 +sVjpr +p1464 +Vjudo-persan +p1465 +sVava +p1466 +Vavar +p1467 +sVpap +p1468 +Vpapiamento +p1469 +sVewo +p1470 +Vewondo +p1471 +sVpau +p1472 +Vpalauen +p1473 +sVewe +p1474 +Vewe +p1475 +sVpag +p1476 +Vpangasinan +p1477 +sVpal +p1478 +Vpahlavi +p1479 +sVpam +p1480 +Vpampangan +p1481 +sVpan +p1482 +Vpendjabi +p1483 +sVsyc +p1484 +Vsyriaque classique +p1485 +sVphn +p1486 +Vphnicien +p1487 +sVkir +p1488 +Vkirghize +p1489 +sVnia +p1490 +Vnias +p1491 +sVkik +p1492 +Vkikuyu +p1493 +sVsyr +p1494 +Vsyriaque +p1495 +sVkin +p1496 +Vkinyarwanda +p1497 +sVniu +p1498 +Vniuen +p1499 +sVgsw +p1500 +Vallemand de Suisse +p1501 +sVepo +p1502 +Vespranto +p1503 +sVjbo +p1504 +Vlojban +p1505 +sVmic +p1506 +Vmicmaque +p1507 +sVtha +p1508 +Vthai +p1509 +sVhai +p1510 +Vhaida +p1511 +sVgmh +p1512 +Vallemand; moyen haut (environ 1050-1500) +p1513 +sVell +p1514 +Vgrec moderne (aprs 1453) +p1515 +sVady +p1516 +Vadyguen +p1517 +sVelx +p1518 +Vlamite +p1519 +sVada +p1520 +Vadangme +p1521 +sVnav +p1522 +Vnavajo +p1523 +sVhat +p1524 +Vcrole hatien +p1525 +sVhau +p1526 +Vhausa +p1527 +sVhaw +p1528 +Vhawaen +p1529 +sVbin +p1530 +Vbini +p1531 +sVamh +p1532 +Vamharique +p1533 +sVbik +p1534 +Vbikol +p1535 +sVmos +p1536 +Vmossi +p1537 +sVmoh +p1538 +Vmohawk +p1539 +sVmon +p1540 +Vmongol +p1541 +sVbho +p1542 +Vbhojpuri +p1543 +sVbis +p1544 +Vbislama +p1545 +sVtvl +p1546 +Vtuvalu +p1547 +sVest +p1548 +Vestonien +p1549 +sVkmb +p1550 +Vkimbundu +p1551 +sVpeo +p1552 +Vperse ancien (environ 600-400 avant J.-C.) +p1553 +sVumb +p1554 +Vumbundu +p1555 +sVtmh +p1556 +Vtamacheq +p1557 +sVfon +p1558 +Vfon-gbe +p1559 +sVhsb +p1560 +Vhaut-sorbien +p1561 +sVrun +p1562 +Vrundi +p1563 +sVrus +p1564 +Vrusse +p1565 +sVrup +p1566 +Vmacdo-roumain +p1567 +sVpli +p1568 +Vpali +p1569 +sVace +p1570 +Vat-chinois +p1571 +sVach +p1572 +Vacoli +p1573 +sVnde +p1574 +Vndebele septentrional +p1575 +sVdzo +p1576 +Vdzongkha +p1577 +sVkru +p1578 +Vkurukh +p1579 +sVsrr +p1580 +Vserer +p1581 +sVido +p1582 +Vido +p1583 +sVsrp +p1584 +Vserbe +p1585 +sVkrl +p1586 +Vcarlien +p1587 +sVkrc +p1588 +Vkarachay-balkar +p1589 +sVnds +p1590 +VAllemand; Bas +p1591 +sVzun +p1592 +Vzuni +p1593 +sVzul +p1594 +Vzoulou +p1595 +sVtwi +p1596 +Vtwi +p1597 +sVsog +p1598 +Vsogdien +p1599 +sVnso +p1600 +Vsotho septentrional +p1601 +sVswe +p1602 +Vsudois +p1603 +sVsom +p1604 +Vsomali +p1605 +sVsot +p1606 +Vsotho mridional +p1607 +sVmkd +p1608 +Vmacdonien +p1609 +sVher +p1610 +Vherero +p1611 +sVlol +p1612 +Vmongo +p1613 +sVheb +p1614 +Vhbreu +p1615 +sVloz +p1616 +Vlozi +p1617 +sVgil +p1618 +Vgilbertese +p1619 +sVwas +p1620 +Vwasho +p1621 +sVwar +p1622 +Vwaray (Philippines) +p1623 +sVbul +p1624 +Vbulgare +p1625 +sVwal +p1626 +Vwolaytta +p1627 +sVbua +p1628 +Vbouriate +p1629 +sVbug +p1630 +Vbuginais +p1631 +sVaze +p1632 +Vazri +p1633 +sVzha +p1634 +Vzhuang +p1635 +sVzho +p1636 +Vchinois +p1637 +sVnno +p1638 +Vnorvgien nynorsk +p1639 +sVuig +p1640 +Voughour +p1641 +sVmyv +p1642 +Verzya +p1643 +sVinh +p1644 +Vingouche +p1645 +sVkhm +p1646 +Vkhmer central +p1647 +sVkho +p1648 +Vkhotanais +p1649 +sVmya +p1650 +Vbirman +p1651 +sVkha +p1652 +Vkhasi +p1653 +sVina +p1654 +Vinterlingua (association pour une langue auxiliaire internationale) +p1655 +sVtiv +p1656 +Vtiv +p1657 +sVtir +p1658 +Vtigrigna +p1659 +sVnap +p1660 +Vnapolitain +p1661 +sVgrb +p1662 +Vgrebo +p1663 +sVgrc +p1664 +Vgrec ancien (jusqu' 1453) +p1665 +sVnau +p1666 +Vnauru +p1667 +sVgrn +p1668 +Vguarani +p1669 +sVtig +p1670 +Vtigre +p1671 +sVyor +p1672 +Vyoruba +p1673 +sVile +p1674 +Vinterlingue +p1675 +sVsqi +p1676 +Valbanais +p1677 +ssS'en' +p1678 +(dp1679 +Vroh +p1680 +VRomansh +p1681 +sVsco +p1682 +VScots +p1683 +sVscn +p1684 +VSicilian +p1685 +sVrom +p1686 +VRomany +p1687 +sVron +p1688 +VRomanian +p1689 +sVoss +p1690 +VOssetian +p1691 +sVale +p1692 +VAleut +p1693 +sVmni +p1694 +VManipuri +p1695 +sVnwc +p1696 +VNewari; Old +p1697 +sVosa +p1698 +VOsage +p1699 +sValt +p1700 +VAltai; Southern +p1701 +sVmnc +p1702 +VManchu +p1703 +sVmwr +p1704 +VMarwari +p1705 +sVven +p1706 +VVenda +p1707 +sVuga +p1708 +VUgaritic +p1709 +sVmwl +p1710 +VMirandese +p1711 +sVfas +p1712 +VPersian +p1713 +sVfat +p1714 +VFanti +p1715 +sVfan +p1716 +VFang (Equatorial Guinea) +p1717 +sVfao +p1718 +VFaroese +p1719 +sVdin +p1720 +VDinka +p1721 +sVhye +p1722 +VArmenian +p1723 +sVbla +p1724 +VSiksika +p1725 +sVsrd +p1726 +VSardinian +p1727 +sVcar +p1728 +VCarib; Galibi +p1729 +sVdiv +p1730 +VDhivehi +p1731 +sVtel +p1732 +VTelugu +p1733 +sVtem +p1734 +VTimne +p1735 +sVnbl +p1736 +VNdebele; South +p1737 +sVter +p1738 +VTereno +p1739 +sVtet +p1740 +VTetum +p1741 +sVsun +p1742 +VSundanese +p1743 +sVkut +p1744 +VKutenai +p1745 +sVsuk +p1746 +VSukuma +p1747 +sVkur +p1748 +VKurdish +p1749 +sVkum +p1750 +VKumyk +p1751 +sVsus +p1752 +VSusu +p1753 +sVnew +p1754 +VBhasa; Nepal +p1755 +sVkua +p1756 +VKuanyama +p1757 +sVsux +p1758 +VSumerian +p1759 +sVmen +p1760 +VMende (Sierra Leone) +p1761 +sVlez +p1762 +VLezghian +p1763 +sVgla +p1764 +VGaelic; Scottish +p1765 +sVbos +p1766 +VBosnian +p1767 +sVgle +p1768 +VIrish +p1769 +sVeka +p1770 +VEkajuk +p1771 +sVglg +p1772 +VGalician +p1773 +sVakk +p1774 +VAkkadian +p1775 +sVaka +p1776 +VAkan +p1777 +sVbod +p1778 +VTibetan +p1779 +sVglv +p1780 +VManx +p1781 +sVjrb +p1782 +VJudeo-Arabic +p1783 +sVvie +p1784 +VVietnamese +p1785 +sVipk +p1786 +VInupiaq +p1787 +sVuzb +p1788 +VUzbek +p1789 +sVsga +p1790 +VIrish; Old (to 900) +p1791 +sVbre +p1792 +VBreton +p1793 +sVbra +p1794 +VBraj +p1795 +sVaym +p1796 +VAymara +p1797 +sVcha +p1798 +VChamorro +p1799 +sVchb +p1800 +VChibcha +p1801 +sVche +p1802 +VChechen +p1803 +sVchg +p1804 +VChagatai +p1805 +sVchk +p1806 +VChuukese +p1807 +sVchm +p1808 +VMari (Russia) +p1809 +sVchn +p1810 +VChinook jargon +p1811 +sVcho +p1812 +VChoctaw +p1813 +sVchp +p1814 +VChipewyan +p1815 +sVchr +p1816 +VCherokee +p1817 +sVchu +p1818 +VSlavonic; Old +p1819 +sVchv +p1820 +VChuvash +p1821 +sVchy +p1822 +VCheyenne +p1823 +sVmsa +p1824 +VMalay (macrolanguage) +p1825 +sViii +p1826 +VYi; Sichuan +p1827 +sVndo +p1828 +VNdonga +p1829 +sVibo +p1830 +VIgbo +p1831 +sViba +p1832 +VIban +p1833 +sVxho +p1834 +VXhosa +p1835 +sVdeu +p1836 +VGerman +p1837 +sVcat +p1838 +VCatalan +p1839 +sVdel +p1840 +VDelaware +p1841 +sVden +p1842 +VSlave (Athapascan) +p1843 +sVcad +p1844 +VCaddo +p1845 +sVtat +p1846 +VTatar +p1847 +sVsrn +p1848 +VSranan Tongo +p1849 +sVraj +p1850 +VRajasthani +p1851 +sVtam +p1852 +VTamil +p1853 +sVspa +p1854 +VSpanish +p1855 +sVtah +p1856 +VTahitian +p1857 +sVafh +p1858 +VAfrihili +p1859 +sVeng +p1860 +VEnglish +p1861 +sVenm +p1862 +VEnglish; Middle (1100-1500) +p1863 +sVcsb +p1864 +VKashubian +p1865 +sVnyn +p1866 +VNyankole +p1867 +sVnyo +p1868 +VNyoro +p1869 +sVsid +p1870 +VSidamo +p1871 +sVnya +p1872 +VNyanja +p1873 +sVsin +p1874 +VSinhala +p1875 +sVafr +p1876 +VAfrikaans +p1877 +sVlam +p1878 +VLamba +p1879 +sVsnd +p1880 +VSindhi +p1881 +sVmar +p1882 +VMarathi +p1883 +sVlah +p1884 +VLahnda +p1885 +sVnym +p1886 +VNyamwezi +p1887 +sVsna +p1888 +VShona +p1889 +sVlad +p1890 +VLadino +p1891 +sVsnk +p1892 +VSoninke +p1893 +sVmad +p1894 +VMadurese +p1895 +sVmag +p1896 +VMagahi +p1897 +sVmai +p1898 +VMaithili +p1899 +sVmah +p1900 +VMarshallese +p1901 +sVlav +p1902 +VLatvian +p1903 +sVmal +p1904 +VMalayalam +p1905 +sVman +p1906 +VMandingo +p1907 +sVegy +p1908 +VEgyptian (Ancient) +p1909 +sVzen +p1910 +VZenaga +p1911 +sVkbd +p1912 +VKabardian +p1913 +sVita +p1914 +VItalian +p1915 +sVvai +p1916 +VVai +p1917 +sVtsn +p1918 +VTswana +p1919 +sVtso +p1920 +VTsonga +p1921 +sVtsi +p1922 +VTsimshian +p1923 +sVbyn +p1924 +VBilin +p1925 +sVfij +p1926 +VFijian +p1927 +sVfin +p1928 +VFinnish +p1929 +sVeus +p1930 +VBasque +p1931 +sVnon +p1932 +VNorse; Old +p1933 +sVceb +p1934 +VCebuano +p1935 +sVdan +p1936 +VDanish +p1937 +sVnog +p1938 +VNogai +p1939 +sVnob +p1940 +VNorwegian Bokml +p1941 +sVdak +p1942 +VDakota +p1943 +sVces +p1944 +VCzech +p1945 +sVdar +p1946 +VDargwa +p1947 +sVnor +p1948 +VNorwegian +p1949 +sVkpe +p1950 +VKpelle +p1951 +sVguj +p1952 +VGujarati +p1953 +sVmdf +p1954 +VMoksha +p1955 +sVmas +p1956 +VMasai +p1957 +sVlao +p1958 +VLao +p1959 +sVmdr +p1960 +VMandar +p1961 +sVgon +p1962 +VGondi +p1963 +sVgoh +p1964 +VGerman; Old High (ca. 750-1050) +p1965 +sVsms +p1966 +VSami; Skolt +p1967 +sVsmo +p1968 +VSamoan +p1969 +sVsmn +p1970 +VSami; Inari +p1971 +sVsmj +p1972 +VLule Sami +p1973 +sVgot +p1974 +VGothic +p1975 +sVsme +p1976 +VSami; Northern +p1977 +sVdsb +p1978 +VSorbian; Lower +p1979 +sVsma +p1980 +VSami; Southern +p1981 +sVgor +p1982 +VGorontalo +p1983 +sVast +p1984 +VAsturian +p1985 +sVorm +p1986 +VOromo +p1987 +sVque +p1988 +VQuechua +p1989 +sVori +p1990 +VOriya +p1991 +sVcrh +p1992 +VTurkish; Crimean +p1993 +sVasm +p1994 +VAssamese +p1995 +sVpus +p1996 +VPushto +p1997 +sVdgr +p1998 +VDogrib +p1999 +sVltz +p2000 +VLuxembourgish +p2001 +sVgez +p2002 +VGeez +p2003 +sVisl +p2004 +VIcelandic +p2005 +sVlat +p2006 +VLatin +p2007 +sVmak +p2008 +VMakasar +p2009 +sVzap +p2010 +VZapotec +p2011 +sVyid +p2012 +VYiddish +p2013 +sVkok +p2014 +VKonkani (macrolanguage) +p2015 +sVkom +p2016 +VKomi +p2017 +sVkon +p2018 +VKongo +p2019 +sVukr +p2020 +VUkrainian +p2021 +sVton +p2022 +VTonga (Tonga Islands) +p2023 +sVzxx +p2024 +VNo linguistic content +p2025 +sVkos +p2026 +VKosraean +p2027 +sVkor +p2028 +VKorean +p2029 +sVtog +p2030 +VTonga (Nyasa) +p2031 +sVhun +p2032 +VHungarian +p2033 +sVhup +p2034 +VHupa +p2035 +sVcym +p2036 +VWelsh +p2037 +sVudm +p2038 +VUdmurt +p2039 +sVbej +p2040 +VBeja +p2041 +sVben +p2042 +VBengali +p2043 +sVbel +p2044 +VBelarusian +p2045 +sVbem +p2046 +VBemba (Zambia) +p2047 +sVaar +p2048 +VAfar +p2049 +sVnzi +p2050 +VNzima +p2051 +sVsah +p2052 +VYakut +p2053 +sVsan +p2054 +VSanskrit +p2055 +sVsam +p2056 +VAramaic; Samaritan +p2057 +sVpro +p2058 +VProvenal; Old (to 1500) +p2059 +sVsag +p2060 +VSango +p2061 +sVsad +p2062 +VSandawe +p2063 +sVanp +p2064 +VAngika +p2065 +sVrap +p2066 +VRapanui +p2067 +sVsas +p2068 +VSasak +p2069 +sVnqo +p2070 +VN'Ko +p2071 +sVsat +p2072 +VSantali +p2073 +sVmin +p2074 +VMinangkabau +p2075 +sVlim +p2076 +VLimburgan +p2077 +sVlin +p2078 +VLingala +p2079 +sVlit +p2080 +VLithuanian +p2081 +sVefi +p2082 +VEfik +p2083 +sVmis +p2084 +VUncoded languages +p2085 +sVkac +p2086 +VKachin +p2087 +sVkab +p2088 +VKabyle +p2089 +sVkaa +p2090 +VKara-Kalpak +p2091 +sVkan +p2092 +VKannada +p2093 +sVkam +p2094 +VKamba (Kenya) +p2095 +sVkal +p2096 +VKalaallisut +p2097 +sVkas +p2098 +VKashmiri +p2099 +sVkaw +p2100 +VKawi +p2101 +sVkau +p2102 +VKanuri +p2103 +sVkat +p2104 +VGeorgian +p2105 +sVkaz +p2106 +VKazakh +p2107 +sVtyv +p2108 +VTuvinian +p2109 +sVawa +p2110 +VAwadhi +p2111 +sVurd +p2112 +VUrdu +p2113 +sVdoi +p2114 +VDogri (macrolanguage) +p2115 +sVtpi +p2116 +VTok Pisin +p2117 +sVmri +p2118 +VMaori +p2119 +sVabk +p2120 +VAbkhazian +p2121 +sVtkl +p2122 +VTokelau +p2123 +sVnld +p2124 +VDutch +p2125 +sVoji +p2126 +VOjibwa +p2127 +sVoci +p2128 +VOccitan (post 1500) +p2129 +sVwol +p2130 +VWolof +p2131 +sVjav +p2132 +VJavanese +p2133 +sVhrv +p2134 +VCroatian +p2135 +sVzza +p2136 +VZaza +p2137 +sVmga +p2138 +VIrish; Middle (900-1200) +p2139 +sVhit +p2140 +VHittite +p2141 +sVdyu +p2142 +VDyula +p2143 +sVssw +p2144 +VSwati +p2145 +sVmul +p2146 +VMultiple languages +p2147 +sVhil +p2148 +VHiligaynon +p2149 +sVhin +p2150 +VHindi +p2151 +sVbas +p2152 +VBasa (Cameroon) +p2153 +sVgba +p2154 +VGbaya (Central African Republic) +p2155 +sVwln +p2156 +VWalloon +p2157 +sVnep +p2158 +VNepali +p2159 +sVcre +p2160 +VCree +p2161 +sVban +p2162 +VBalinese +p2163 +sVbal +p2164 +VBaluchi +p2165 +sVbam +p2166 +VBambara +p2167 +sVbak +p2168 +VBashkir +p2169 +sVshn +p2170 +VShan +p2171 +sVarp +p2172 +VArapaho +p2173 +sVarw +p2174 +VArawak +p2175 +sVara +p2176 +VArabic +p2177 +sVarc +p2178 +VAramaic; Official (700-300 BCE) +p2179 +sVarg +p2180 +VAragonese +p2181 +sVsel +p2182 +VSelkup +p2183 +sVarn +p2184 +VMapudungun +p2185 +sVlus +p2186 +VLushai +p2187 +sVmus +p2188 +VCreek +p2189 +sVlua +p2190 +VLuba-Lulua +p2191 +sVlub +p2192 +VLuba-Katanga +p2193 +sVlug +p2194 +VGanda +p2195 +sVlui +p2196 +VLuiseno +p2197 +sVlun +p2198 +VLunda +p2199 +sVluo +p2200 +VLuo (Kenya and Tanzania) +p2201 +sViku +p2202 +VInuktitut +p2203 +sVtur +p2204 +VTurkish +p2205 +sVzbl +p2206 +VBlissymbols +p2207 +sVtuk +p2208 +VTurkmen +p2209 +sVtum +p2210 +VTumbuka +p2211 +sVcop +p2212 +VCoptic +p2213 +sVcos +p2214 +VCorsican +p2215 +sVcor +p2216 +VCornish +p2217 +sVilo +p2218 +VIloko +p2219 +sVgwi +p2220 +VGwich\u02bcin +p2221 +sVund +p2222 +VUndetermined +p2223 +sVtli +p2224 +VTlingit +p2225 +sVtlh +p2226 +VKlingon +p2227 +sVpor +p2228 +VPortuguese +p2229 +sVpon +p2230 +VPohnpeian +p2231 +sVpol +p2232 +VPolish +p2233 +sVang +p2234 +VEnglish; Old (ca. 450-1100) +p2235 +sVtgk +p2236 +VTajik +p2237 +sVtgl +p2238 +VTagalog +p2239 +sVfra +p2240 +VFrench +p2241 +sVdum +p2242 +VDutch; Middle (ca. 1050-1350) +p2243 +sVswa +p2244 +VSwahili (macrolanguage) +p2245 +sVdua +p2246 +VDuala +p2247 +sVfro +p2248 +VFrench; Old (842-ca. 1400) +p2249 +sVyap +p2250 +VYapese +p2251 +sVfrm +p2252 +VFrench; Middle (ca. 1400-1600) +p2253 +sVfrs +p2254 +VFrisian; Eastern +p2255 +sVfrr +p2256 +VFrisian; Northern +p2257 +sVyao +p2258 +VYao +p2259 +sVxal +p2260 +VKalmyk +p2261 +sVfry +p2262 +VFrisian; Western +p2263 +sVgay +p2264 +VGayo +p2265 +sVota +p2266 +VTurkish; Ottoman (1500-1928) +p2267 +sVhmn +p2268 +VHmong +p2269 +sVhmo +p2270 +VHiri Motu +p2271 +sVgaa +p2272 +VGa +p2273 +sVfur +p2274 +VFriulian +p2275 +sVmlg +p2276 +VMalagasy +p2277 +sVslv +p2278 +VSlovenian +p2279 +sVain +p2280 +VAinu (Japan) +p2281 +sVfil +p2282 +VFilipino +p2283 +sVmlt +p2284 +VMaltese +p2285 +sVslk +p2286 +VSlovak +p2287 +sVrar +p2288 +VMaori; Cook Islands +p2289 +sVful +p2290 +VFulah +p2291 +sVjpn +p2292 +VJapanese +p2293 +sVvol +p2294 +VVolapk +p2295 +sVvot +p2296 +VVotic +p2297 +sVind +p2298 +VIndonesian +p2299 +sVave +p2300 +VAvestan +p2301 +sVjpr +p2302 +VJudeo-Persian +p2303 +sVava +p2304 +VAvaric +p2305 +sVpap +p2306 +VPapiamento +p2307 +sVewo +p2308 +VEwondo +p2309 +sVpau +p2310 +VPalauan +p2311 +sVewe +p2312 +VEwe +p2313 +sVpag +p2314 +VPangasinan +p2315 +sVpal +p2316 +VPahlavi +p2317 +sVpam +p2318 +VPampanga +p2319 +sVpan +p2320 +VPanjabi +p2321 +sVsyc +p2322 +VSyriac; Classical +p2323 +sVphn +p2324 +VPhoenician +p2325 +sVkir +p2326 +VKirghiz +p2327 +sVnia +p2328 +VNias +p2329 +sVkik +p2330 +VKikuyu +p2331 +sVsyr +p2332 +VSyriac +p2333 +sVkin +p2334 +VKinyarwanda +p2335 +sVniu +p2336 +VNiuean +p2337 +sVgsw +p2338 +VGerman; Swiss +p2339 +sVepo +p2340 +VEsperanto +p2341 +sVjbo +p2342 +VLojban +p2343 +sVmic +p2344 +VMi'kmaq +p2345 +sVtha +p2346 +VThai +p2347 +sVhai +p2348 +VHaida +p2349 +sVgmh +p2350 +VGerman; Middle High (ca. 1050-1500) +p2351 +sVell +p2352 +VGreek; Modern (1453-) +p2353 +sVady +p2354 +VAdyghe +p2355 +sVelx +p2356 +VElamite +p2357 +sVada +p2358 +VAdangme +p2359 +sVnav +p2360 +VNavajo +p2361 +sVhat +p2362 +VCreole; Haitian +p2363 +sVhau +p2364 +VHausa +p2365 +sVhaw +p2366 +VHawaiian +p2367 +sVbin +p2368 +VBini +p2369 +sVamh +p2370 +VAmharic +p2371 +sVbik +p2372 +VBikol +p2373 +sVmos +p2374 +VMossi +p2375 +sVmoh +p2376 +VMohawk +p2377 +sVmon +p2378 +VMongolian +p2379 +sVbho +p2380 +VBhojpuri +p2381 +sVbis +p2382 +VBislama +p2383 +sVtvl +p2384 +VTuvalu +p2385 +sVest +p2386 +VEstonian +p2387 +sVkmb +p2388 +VKimbundu +p2389 +sVpeo +p2390 +VPersian; Old (ca. 600-400 B.C.) +p2391 +sVumb +p2392 +VUmbundu +p2393 +sVtmh +p2394 +VTamashek +p2395 +sVfon +p2396 +VFon +p2397 +sVhsb +p2398 +VSorbian; Upper +p2399 +sVrun +p2400 +VRundi +p2401 +sVrus +p2402 +VRussian +p2403 +sVrup +p2404 +VRomanian; Macedo- +p2405 +sVpli +p2406 +VPali +p2407 +sVace +p2408 +VAchinese +p2409 +sVach +p2410 +VAcoli +p2411 +sVnde +p2412 +VNdebele; North +p2413 +sVdzo +p2414 +VDzongkha +p2415 +sVkru +p2416 +VKurukh +p2417 +sVsrr +p2418 +VSerer +p2419 +sVido +p2420 +VIdo +p2421 +sVsrp +p2422 +VSerbian +p2423 +sVkrl +p2424 +VKarelian +p2425 +sVkrc +p2426 +VKarachay-Balkar +p2427 +sVnds +p2428 +VGerman; Low +p2429 +sVzun +p2430 +VZuni +p2431 +sVzul +p2432 +VZulu +p2433 +sVtwi +p2434 +VTwi +p2435 +sVsog +p2436 +VSogdian +p2437 +sVnso +p2438 +VSotho; Northern +p2439 +sVswe +p2440 +VSwedish +p2441 +sVsom +p2442 +VSomali +p2443 +sVsot +p2444 +VSotho; Southern +p2445 +sVmkd +p2446 +VMacedonian +p2447 +sVher +p2448 +VHerero +p2449 +sVlol +p2450 +VMongo +p2451 +sVheb +p2452 +VHebrew +p2453 +sVloz +p2454 +VLozi +p2455 +sVgil +p2456 +VGilbertese +p2457 +sVwas +p2458 +VWasho +p2459 +sVwar +p2460 +VWaray (Philippines) +p2461 +sVbul +p2462 +VBulgarian +p2463 +sVwal +p2464 +VWolaytta +p2465 +sVbua +p2466 +VBuriat +p2467 +sVbug +p2468 +VBuginese +p2469 +sVaze +p2470 +VAzerbaijani +p2471 +sVzha +p2472 +VZhuang +p2473 +sVzho +p2474 +VChinese +p2475 +sVnno +p2476 +VNorwegian Nynorsk +p2477 +sVuig +p2478 +VUighur +p2479 +sVmyv +p2480 +VErzya +p2481 +sVinh +p2482 +VIngush +p2483 +sVkhm +p2484 +VKhmer; Central +p2485 +sVkho +p2486 +VKhotanese +p2487 +sVmya +p2488 +VBurmese +p2489 +sVkha +p2490 +VKhasi +p2491 +sVina +p2492 +VInterlingua (International Auxiliary Language Association) +p2493 +sVtiv +p2494 +VTiv +p2495 +sVtir +p2496 +VTigrinya +p2497 +sVnap +p2498 +VNeapolitan +p2499 +sVgrb +p2500 +VGrebo +p2501 +sVgrc +p2502 +VGreek; Ancient (to 1453) +p2503 +sVnau +p2504 +VNauru +p2505 +sVgrn +p2506 +VGuarani +p2507 +sVtig +p2508 +VTigre +p2509 +sVyor +p2510 +VYoruba +p2511 +sVile +p2512 +VInterlingue +p2513 +sVsqi +p2514 +VAlbanian +p2515 +ssS'nl' +p2516 +(dp2517 +Vroh +p2518 +VReto-Romaans +p2519 +sVsco +p2520 +VSchots +p2521 +sVscn +p2522 +VSiciliaans +p2523 +sVrom +p2524 +VRomani +p2525 +sVron +p2526 +VRoemeens +p2527 +sVoss +p2528 +VOssetisch +p2529 +sVale +p2530 +VAleut +p2531 +sVmni +p2532 +VManipuri +p2533 +sVnwc +p2534 +VNewari; Klassiek Nepal +p2535 +sVosa +p2536 +VOsaags +p2537 +sValt +p2538 +VAltajs; zuidelijk +p2539 +sVmnc +p2540 +VManchu +p2541 +sVmwr +p2542 +VMarwari +p2543 +sVven +p2544 +VVenda +p2545 +sVuga +p2546 +VUgaritisch +p2547 +sVmwl +p2548 +VMirandees +p2549 +sVfas +p2550 +VPerzisch +p2551 +sVfat +p2552 +VFanti +p2553 +sVfan +p2554 +VFang +p2555 +sVfao +p2556 +VFaerers +p2557 +sVdin +p2558 +VDinka +p2559 +sVhye +p2560 +VArmeens +p2561 +sVbla +p2562 +VSiksika +p2563 +sVsrd +p2564 +VSardinisch +p2565 +sVcar +p2566 +VCaribische talen +p2567 +sVdiv +p2568 +VDivehi +p2569 +sVtel +p2570 +VTelugu +p2571 +sVtem +p2572 +VTimne +p2573 +sVnbl +p2574 +VNdebele; zuid +p2575 +sVter +p2576 +VTereno +p2577 +sVtet +p2578 +VTetum +p2579 +sVsun +p2580 +VSoendanees; Sundanees +p2581 +sVkut +p2582 +VKutenasch +p2583 +sVsuk +p2584 +VSukuma +p2585 +sVkur +p2586 +VKoerdisch +p2587 +sVkum +p2588 +VKumyk +p2589 +sVsus +p2590 +VSusu +p2591 +sVnew +p2592 +VNewari; Nepal +p2593 +sVkua +p2594 +VKuanyama +p2595 +sVsux +p2596 +VSumerisch +p2597 +sVmen +p2598 +VMende +p2599 +sVlez +p2600 +VLezghiaans +p2601 +sVgla +p2602 +VKeltisch; schots +p2603 +sVbos +p2604 +VBosnisch +p2605 +sVgle +p2606 +VIers +p2607 +sVeka +p2608 +VEkajuk +p2609 +sVglg +p2610 +VGaliciaans +p2611 +sVakk +p2612 +VAkkadiaans +p2613 +sVaka +p2614 +VAkaans +p2615 +sVbod +p2616 +VTibetaans +p2617 +sVglv +p2618 +VManx +p2619 +sVjrb +p2620 +VJoods-Arabisch +p2621 +sVvie +p2622 +VVietnamees +p2623 +sVipk +p2624 +VInupiak +p2625 +sVuzb +p2626 +VOezbeeks +p2627 +sVsga +p2628 +VIers; oud (tot 900) +p2629 +sVbre +p2630 +VBretons; Bretoens +p2631 +sVbra +p2632 +VBraj +p2633 +sVaym +p2634 +VAymara +p2635 +sVcha +p2636 +VChamorro +p2637 +sVchb +p2638 +VTsjibtsja +p2639 +sVche +p2640 +VTsjetsjeens +p2641 +sVchg +p2642 +VChagatai +p2643 +sVchk +p2644 +VChukees +p2645 +sVchm +p2646 +VMari (Rusland) +p2647 +sVchn +p2648 +VChinook-jargon +p2649 +sVcho +p2650 +VChoctaw +p2651 +sVchp +p2652 +VChipewyaans +p2653 +sVchr +p2654 +VCherokee +p2655 +sVchu +p2656 +VSlavisch; oud (kerk) +p2657 +sVchv +p2658 +VTsjoevasjisch +p2659 +sVchy +p2660 +VCheyenne +p2661 +sVmsa +p2662 +VMaleis +p2663 +sViii +p2664 +VYi; Sichuan - Nuosu +p2665 +sVndo +p2666 +VNdonga +p2667 +sVibo +p2668 +VIgbo +p2669 +sViba +p2670 +VIbaans +p2671 +sVxho +p2672 +VXhosa +p2673 +sVdeu +p2674 +VDuits +p2675 +sVcat +p2676 +VCatalaans +p2677 +sVdel +p2678 +VDelaware +p2679 +sVden +p2680 +VSlavisch (Athapascaans) +p2681 +sVcad +p2682 +VCaddo +p2683 +sVtat +p2684 +VTataars +p2685 +sVsrn +p2686 +VSranan Tongo +p2687 +sVraj +p2688 +VRajasthani +p2689 +sVtam +p2690 +VTamil +p2691 +sVspa +p2692 +VSpaans +p2693 +sVtah +p2694 +VTahitisch +p2695 +sVafh +p2696 +VAfrihili +p2697 +sVeng +p2698 +VEngels +p2699 +sVenm +p2700 +VEngels; middel (1100-1500) +p2701 +sVcsb +p2702 +VKasjoebiaans +p2703 +sVnyn +p2704 +VNyankools +p2705 +sVnyo +p2706 +VNyoro +p2707 +sVsid +p2708 +VSidamo +p2709 +sVnya +p2710 +VNyanja +p2711 +sVsin +p2712 +VSinhala +p2713 +sVafr +p2714 +VAfrikaans +p2715 +sVlam +p2716 +VLamba +p2717 +sVsnd +p2718 +VSindhi +p2719 +sVmar +p2720 +VMarathi +p2721 +sVlah +p2722 +VLahnda +p2723 +sVnym +p2724 +VNyamwezi +p2725 +sVsna +p2726 +VShona +p2727 +sVlad +p2728 +VLadino +p2729 +sVsnk +p2730 +VSoninke +p2731 +sVmad +p2732 +VMadurees +p2733 +sVmag +p2734 +VMagahisch +p2735 +sVmai +p2736 +VMaithili +p2737 +sVmah +p2738 +VMarshallees +p2739 +sVlav +p2740 +VLets +p2741 +sVmal +p2742 +VMalayalam +p2743 +sVman +p2744 +VMandingo +p2745 +sVegy +p2746 +VEgyptisch (antiek) +p2747 +sVzen +p2748 +VZenaga +p2749 +sVkbd +p2750 +VKabardisch; Tsjerkessisch +p2751 +sVita +p2752 +VItaliaans +p2753 +sVvai +p2754 +VVai +p2755 +sVtsn +p2756 +VTswana +p2757 +sVtso +p2758 +VTsonga +p2759 +sVtsi +p2760 +VTsimsjiaans +p2761 +sVbyn +p2762 +VBilin +p2763 +sVfij +p2764 +VFijisch +p2765 +sVfin +p2766 +VFins +p2767 +sVeus +p2768 +VBaskisch +p2769 +sVnon +p2770 +VNoors; oud +p2771 +sVceb +p2772 +VCebuano +p2773 +sVdan +p2774 +VDeens +p2775 +sVnog +p2776 +VNogai +p2777 +sVnob +p2778 +VNoors; Bokml +p2779 +sVdak +p2780 +VDakota +p2781 +sVces +p2782 +VTsjechisch +p2783 +sVdar +p2784 +VDargwa +p2785 +sVnor +p2786 +VNoors +p2787 +sVkpe +p2788 +VKpelle +p2789 +sVguj +p2790 +VGujarati +p2791 +sVmdf +p2792 +VMoksja +p2793 +sVmas +p2794 +VMasai +p2795 +sVlao +p2796 +VLaotiaans +p2797 +sVmdr +p2798 +VMandars +p2799 +sVgon +p2800 +VGondi +p2801 +sVgoh +p2802 +VDuits; oud hoog (ca. 750-1050) +p2803 +sVsms +p2804 +VSami; Skolt, Laps; Skolt +p2805 +sVsmo +p2806 +VSamoaans +p2807 +sVsmn +p2808 +VSami; Inari, Laps; Inari +p2809 +sVsmj +p2810 +VLule Sami +p2811 +sVgot +p2812 +VGothisch +p2813 +sVsme +p2814 +VSamisch; noord, Laps; noord +p2815 +sVdsb +p2816 +VSorbisch; lager +p2817 +sVsma +p2818 +VSamisch; zuid, Laps; zuid +p2819 +sVgor +p2820 +VGorontalo +p2821 +sVast +p2822 +VAsturisch +p2823 +sVorm +p2824 +VOromo +p2825 +sVque +p2826 +VQuechua +p2827 +sVori +p2828 +VOriya +p2829 +sVcrh +p2830 +VTurks; Crimean +p2831 +sVasm +p2832 +VAssamees; Assami +p2833 +sVpus +p2834 +VPoesjto +p2835 +sVdgr +p2836 +VDogrib +p2837 +sVltz +p2838 +VLuxemburgs +p2839 +sVgez +p2840 +VGe'ez +p2841 +sVisl +p2842 +VIJslands +p2843 +sVlat +p2844 +VLatijn +p2845 +sVmak +p2846 +VMakasar +p2847 +sVzap +p2848 +VZapotec +p2849 +sVyid +p2850 +VJiddisch +p2851 +sVkok +p2852 +VKonkani +p2853 +sVkom +p2854 +VKomi +p2855 +sVkon +p2856 +VKikongo +p2857 +sVukr +p2858 +VOekraens +p2859 +sVton +p2860 +VTonga (Tonga-eilanden) +p2861 +sVzxx +p2862 +VGeen lingustische inhoud +p2863 +sVkos +p2864 +VKosraeaans +p2865 +sVkor +p2866 +VKoreaans +p2867 +sVtog +p2868 +VTonga (Nyasa) +p2869 +sVhun +p2870 +VHongaars +p2871 +sVhup +p2872 +VHupa +p2873 +sVcym +p2874 +VWelsh +p2875 +sVudm +p2876 +VUdmurts +p2877 +sVbej +p2878 +VBeja +p2879 +sVben +p2880 +VBengaals +p2881 +sVbel +p2882 +VWit-Russisch; Belarussisch +p2883 +sVbem +p2884 +VBemba (Zambia) +p2885 +sVaar +p2886 +VAfar; Hamitisch +p2887 +sVnzi +p2888 +VNzima +p2889 +sVsah +p2890 +VJakoets +p2891 +sVsan +p2892 +VSanskriet +p2893 +sVsam +p2894 +VAramees; Samaritaans +p2895 +sVpro +p2896 +VProvenaals; oud (tot 1500) +p2897 +sVsag +p2898 +VSangho +p2899 +sVsad +p2900 +VSandawe +p2901 +sVanp +p2902 +VAngika +p2903 +sVrap +p2904 +VRapanui +p2905 +sVsas +p2906 +VSasaaks +p2907 +sVnqo +p2908 +VN'Ko +p2909 +sVsat +p2910 +VSantali +p2911 +sVmin +p2912 +VMinangkabau +p2913 +sVlim +p2914 +VLimburgs +p2915 +sVlin +p2916 +VLingala +p2917 +sVlit +p2918 +VLitouws +p2919 +sVefi +p2920 +VEfikisch +p2921 +sVmis +p2922 +VNiet-gecodeerde talen +p2923 +sVkac +p2924 +VKatsjin +p2925 +sVkab +p2926 +VKabyle +p2927 +sVkaa +p2928 +VKara-Kalpak +p2929 +sVkan +p2930 +VKannada; Kanara; Kanarees +p2931 +sVkam +p2932 +VKamba (Kenya) +p2933 +sVkal +p2934 +VGroenlands +p2935 +sVkas +p2936 +VKashmiri +p2937 +sVkaw +p2938 +VKawi +p2939 +sVkau +p2940 +VKanuri +p2941 +sVkat +p2942 +VGeorgisch +p2943 +sVkaz +p2944 +VKazachs +p2945 +sVtyv +p2946 +VTuviniaans +p2947 +sVawa +p2948 +VAwadhi +p2949 +sVurd +p2950 +VUrdu +p2951 +sVdoi +p2952 +VDogri +p2953 +sVtpi +p2954 +VTok Pisin +p2955 +sVmri +p2956 +VMaori +p2957 +sVabk +p2958 +VAbchazisch +p2959 +sVtkl +p2960 +VTokelau +p2961 +sVnld +p2962 +VNederlands +p2963 +sVoji +p2964 +VOjibwa +p2965 +sVoci +p2966 +VOccitaans (na 1500) +p2967 +sVwol +p2968 +VWolof +p2969 +sVjav +p2970 +VJavaans +p2971 +sVhrv +p2972 +VKroatisch +p2973 +sVzza +p2974 +VZaza +p2975 +sVmga +p2976 +VIers; middel (900-1200) +p2977 +sVhit +p2978 +VHittitisch +p2979 +sVdyu +p2980 +VDyula +p2981 +sVssw +p2982 +VSwati +p2983 +sVmul +p2984 +VMeerdere talen +p2985 +sVhil +p2986 +VHiligainoons +p2987 +sVhin +p2988 +VHindi +p2989 +sVbas +p2990 +VBasa (Kameroen) +p2991 +sVgba +p2992 +VGbaya (Centraal Afrikaanse Republiek) +p2993 +sVwln +p2994 +VWaals +p2995 +sVnep +p2996 +VNepalees +p2997 +sVcre +p2998 +VCree +p2999 +sVban +p3000 +VBalinees +p3001 +sVbal +p3002 +VBalutsji; Baluchi +p3003 +sVbam +p3004 +VBambara +p3005 +sVbak +p3006 +VBasjkiers; Basjkirisch +p3007 +sVshn +p3008 +VSjaans +p3009 +sVarp +p3010 +VArapaho +p3011 +sVarw +p3012 +VArawak +p3013 +sVara +p3014 +VArabisch +p3015 +sVarc +p3016 +VAramees; officieel (700-300 B.C.) +p3017 +sVarg +p3018 +VAragonees +p3019 +sVsel +p3020 +VSulkoeps +p3021 +sVarn +p3022 +VMapudungun +p3023 +sVlus +p3024 +VLushai +p3025 +sVmus +p3026 +VCreek +p3027 +sVlua +p3028 +VLuba-Lulua +p3029 +sVlub +p3030 +VLuba-Katanga +p3031 +sVlug +p3032 +VLuganda +p3033 +sVlui +p3034 +VLuiseno +p3035 +sVlun +p3036 +VLunda +p3037 +sVluo +p3038 +VLuo (Kenia en Tanzania) +p3039 +sViku +p3040 +VInuktitut +p3041 +sVtur +p3042 +VTurks +p3043 +sVzbl +p3044 +VBlissymbolen +p3045 +sVtuk +p3046 +VTurkmeens +p3047 +sVtum +p3048 +VTumbuka +p3049 +sVcop +p3050 +VKoptisch +p3051 +sVcos +p3052 +VCorsicaans +p3053 +sVcor +p3054 +VCornisch +p3055 +sVilo +p3056 +VIloko +p3057 +sVgwi +p3058 +VGwich\u02bcin +p3059 +sVund +p3060 +VOnbepaald +p3061 +sVtli +p3062 +VTlingit +p3063 +sVtlh +p3064 +VKlingon; tlhIngan-Hol +p3065 +sVpor +p3066 +VPortugees +p3067 +sVpon +p3068 +VPohnpeiaans +p3069 +sVpol +p3070 +VPools +p3071 +sVang +p3072 +VEngels; oud (ca. 450-1100) +p3073 +sVtgk +p3074 +VTadzjieks +p3075 +sVtgl +p3076 +VTagalog +p3077 +sVfra +p3078 +VFrans +p3079 +sVdum +p3080 +VNederlands; middel (ca. 1050-1350) +p3081 +sVswa +p3082 +VSwahili +p3083 +sVdua +p3084 +VDuala +p3085 +sVfro +p3086 +VFrans; oud (842-ca. 1400) +p3087 +sVyap +p3088 +VYapees +p3089 +sVfrm +p3090 +VFrans; middel (ca. 1400-1600) +p3091 +sVfrs +p3092 +VFries; oostelijk (Duitsland) +p3093 +sVfrr +p3094 +VFries; noordelijk (Duitsland) +p3095 +sVyao +p3096 +VYao +p3097 +sVxal +p3098 +VKalmyk +p3099 +sVfry +p3100 +VFries +p3101 +sVgay +p3102 +VGayo +p3103 +sVota +p3104 +VTurks; ottomaans (1500-1928) +p3105 +sVhmn +p3106 +VHmong +p3107 +sVhmo +p3108 +VHiri Motu +p3109 +sVgaa +p3110 +VGa +p3111 +sVfur +p3112 +VFriulisch +p3113 +sVmlg +p3114 +VMalagassisch +p3115 +sVslv +p3116 +VSloveens +p3117 +sVain +p3118 +VAinu (Japan) +p3119 +sVfil +p3120 +VFilipijns +p3121 +sVmlt +p3122 +VMaltees +p3123 +sVslk +p3124 +VSlowaaks +p3125 +sVrar +p3126 +VRarotongan; Cookeilanden Maori +p3127 +sVful +p3128 +VFulah +p3129 +sVjpn +p3130 +VJapans +p3131 +sVvol +p3132 +VVolapk +p3133 +sVvot +p3134 +VVotisch +p3135 +sVind +p3136 +VIndonesisch +p3137 +sVave +p3138 +VAvestisch +p3139 +sVjpr +p3140 +VJoods-Perzisch +p3141 +sVava +p3142 +VAvaars; Awari +p3143 +sVpap +p3144 +VPapiamento +p3145 +sVewo +p3146 +VEwondo +p3147 +sVpau +p3148 +VPalauaans +p3149 +sVewe +p3150 +VEwe +p3151 +sVpag +p3152 +VPangasinaans +p3153 +sVpal +p3154 +VPehlevi +p3155 +sVpam +p3156 +VPampanga +p3157 +sVpan +p3158 +VPunjabi +p3159 +sVsyc +p3160 +VSyriac; Klassiek +p3161 +sVphn +p3162 +VFoenisisch +p3163 +sVkir +p3164 +VKirgizisch +p3165 +sVnia +p3166 +VNias +p3167 +sVkik +p3168 +VKikuyu +p3169 +sVsyr +p3170 +VSyrisch +p3171 +sVkin +p3172 +VKinyarwanda +p3173 +sVniu +p3174 +VNiueaans +p3175 +sVgsw +p3176 +VDuits; Zwitserland +p3177 +sVepo +p3178 +VEsperanto +p3179 +sVjbo +p3180 +VLojbaans +p3181 +sVmic +p3182 +VMi'kmaq; Micmac +p3183 +sVtha +p3184 +VThai +p3185 +sVhai +p3186 +VHaida +p3187 +sVgmh +p3188 +VDuits; middel hoog (ca. 1050-1500) +p3189 +sVell +p3190 +VGrieks; Modern (1453-) +p3191 +sVady +p3192 +VAdyghe +p3193 +sVelx +p3194 +VElamitisch +p3195 +sVada +p3196 +VAdangme +p3197 +sVnav +p3198 +VNavajo +p3199 +sVhat +p3200 +VCreools; Hatiaans +p3201 +sVhau +p3202 +VHausa +p3203 +sVhaw +p3204 +VHawaiiaans +p3205 +sVbin +p3206 +VBini; Edo +p3207 +sVamh +p3208 +VAmhaars; Amharisch +p3209 +sVbik +p3210 +VBikol +p3211 +sVmos +p3212 +VMossisch +p3213 +sVmoh +p3214 +VMohawk +p3215 +sVmon +p3216 +VMongools +p3217 +sVbho +p3218 +VBhojpuri +p3219 +sVbis +p3220 +VBislama +p3221 +sVtvl +p3222 +VTuvalu +p3223 +sVest +p3224 +VEstlands +p3225 +sVkmb +p3226 +VKimbundu +p3227 +sVpeo +p3228 +VPerzisch; oud (ca. 600-400 B.C.) +p3229 +sVumb +p3230 +VUmbundu +p3231 +sVtmh +p3232 +VTamasjek +p3233 +sVfon +p3234 +VFon +p3235 +sVhsb +p3236 +VServisch; hoger +p3237 +sVrun +p3238 +VRundi +p3239 +sVrus +p3240 +VRussisch +p3241 +sVrup +p3242 +VRoemeens; Macedo- +p3243 +sVpli +p3244 +VPali +p3245 +sVace +p3246 +VAchinees +p3247 +sVach +p3248 +VAcholi +p3249 +sVnde +p3250 +VNdebele; noord +p3251 +sVdzo +p3252 +VDzongkha +p3253 +sVkru +p3254 +VKurukh +p3255 +sVsrr +p3256 +VSerer +p3257 +sVido +p3258 +VIdo +p3259 +sVsrp +p3260 +VServisch +p3261 +sVkrl +p3262 +VKarelisch +p3263 +sVkrc +p3264 +VKaratsjay-Balkar +p3265 +sVnds +p3266 +VDuits; Laag +p3267 +sVzun +p3268 +VZuni +p3269 +sVzul +p3270 +VZoeloe +p3271 +sVtwi +p3272 +VTwi +p3273 +sVsog +p3274 +VSogdiaans +p3275 +sVnso +p3276 +VPedi; Sepedi; Noord-Sothotisch +p3277 +sVswe +p3278 +VZweeds +p3279 +sVsom +p3280 +VSomalisch +p3281 +sVsot +p3282 +VSothaans; zuidelijk +p3283 +sVmkd +p3284 +VMacedonisch +p3285 +sVher +p3286 +VHerero +p3287 +sVlol +p3288 +VMongo +p3289 +sVheb +p3290 +VHebreeuws +p3291 +sVloz +p3292 +VLozi +p3293 +sVgil +p3294 +VGilbertees +p3295 +sVwas +p3296 +VWasjo +p3297 +sVwar +p3298 +VWaray (Filipijns) +p3299 +sVbul +p3300 +VBulgaars +p3301 +sVwal +p3302 +VWalamo +p3303 +sVbua +p3304 +VBoeriaats +p3305 +sVbug +p3306 +VBuginees +p3307 +sVaze +p3308 +VAzerbeidzjaans +p3309 +sVzha +p3310 +VZhuang, Tsjoeang +p3311 +sVzho +p3312 +VChinees +p3313 +sVnno +p3314 +VNoors; Nynorsk +p3315 +sVuig +p3316 +VOeigoers; Oejgoers +p3317 +sVmyv +p3318 +VErzya +p3319 +sVinh +p3320 +VIngoesjetisch +p3321 +sVkhm +p3322 +VKhmer, Cambodjaans +p3323 +sVkho +p3324 +VKhotanees +p3325 +sVmya +p3326 +VBurmees +p3327 +sVkha +p3328 +VKhasi +p3329 +sVina +p3330 +VInterlingua (International Auxiliary Language Association) +p3331 +sVtiv +p3332 +VTiv +p3333 +sVtir +p3334 +VTigrinya +p3335 +sVnap +p3336 +VNapolitaans +p3337 +sVgrb +p3338 +VGrebo +p3339 +sVgrc +p3340 +VGrieks; antiek (tot 1453) +p3341 +sVnau +p3342 +VNauruaans +p3343 +sVgrn +p3344 +VGuarani +p3345 +sVtig +p3346 +VTigre +p3347 +sVyor +p3348 +VYoruba +p3349 +sVile +p3350 +VInterlingue +p3351 +sVsqi +p3352 +VAlbanees +p3353 +ssS'zh_Hans_CN' +p3354 +(dp3355 +Vroh +p3356 +V\u7f57\u66fc\u4ec0\u8bed +p3357 +sVsco +p3358 +V\u82cf\u683c\u5170\u8bed +p3359 +sVscn +p3360 +V\u897f\u897f\u91cc\u8bed +p3361 +sVrom +p3362 +V\u7f57\u59c6\u8bed +p3363 +sVron +p3364 +V\u7f57\u9a6c\u5c3c\u4e9a\u8bed +p3365 +sVoss +p3366 +V\u5965\u585e\u68af\u8bed +p3367 +sVale +p3368 +V\u963f\u7559\u7533\u8bed +p3369 +sVmni +p3370 +V\u66fc\u5c3c\u666e\u5c14\u8bed +p3371 +sVnwc +p3372 +V\u5c3c\u74e6\u5c14\u8bed\uff08\u53e4\u5178\uff09 +p3373 +sVosa +p3374 +V\u5965\u8428\u683c\u8bed +p3375 +sValt +p3376 +V\u963f\u5c14\u6cf0\u8bed\uff08\u5357\uff09 +p3377 +sVmnc +p3378 +V\u6ee1\u8bed +p3379 +sVmwr +p3380 +V\u9a6c\u5c14\u74e6\u5229\u8bed +p3381 +sVven +p3382 +V\u6587\u8fbe\u8bed +p3383 +sVuga +p3384 +V\u4e4c\u52a0\u91cc\u7279\u8bed +p3385 +sVmwl +p3386 +V\u7c73\u5170\u5fb7\u65af\u8bed +p3387 +sVfas +p3388 +V\u6ce2\u65af\u8bed +p3389 +sVfat +p3390 +V\u82b3\u8482\u8bed +p3391 +sVfan +p3392 +V\u82b3\u8bed\uff08\u8d64\u9053\u51e0\u5185\u4e9a\uff09 +p3393 +sVfao +p3394 +V\u6cd5\u7f57\u8bed +p3395 +sVdin +p3396 +V\u4e01\u5361\u8bed +p3397 +sVhye +p3398 +V\u4e9a\u7f8e\u5c3c\u4e9a\u8bed +p3399 +sVbla +p3400 +V\u897f\u514b\u897f\u5361\u8bed +p3401 +sVsrd +p3402 +V\u6492\u4e01\u8bed +p3403 +sVcar +p3404 +V\u52a0\u52d2\u6bd4\u8bed +p3405 +sVdiv +p3406 +V\u8fea\u7ef4\u5e0c\u8bed +p3407 +sVtel +p3408 +V\u6cf0\u5362\u56fa\u8bed +p3409 +sVtem +p3410 +V\u6ed5\u5185\u8bed +p3411 +sVnbl +p3412 +V\u6069\u5fb7\u8d1d\u52d2\u8bed\uff08\u5357\uff09 +p3413 +sVter +p3414 +V\u7279\u5217\u7eb3\u8bed +p3415 +sVtet +p3416 +V\u7279\u5854\u59c6\u8bed +p3417 +sVsun +p3418 +V\u5dfd\u4ed6\u8bed +p3419 +sVkut +p3420 +V\u5e93\u7279\u5185\u8bed +p3421 +sVsuk +p3422 +V\u82cf\u5e93\u9a6c\u8bed +p3423 +sVkur +p3424 +V\u5e93\u5c14\u5fb7\u8bed +p3425 +sVkum +p3426 +V\u5e93\u6885\u514b\u8bed +p3427 +sVsus +p3428 +V\u82cf\u82cf\u8bed +p3429 +sVnew +p3430 +V\u5c3c\u74e6\u5c14\u8bed +p3431 +sVkua +p3432 +V\u5bbd\u4e9a\u739b\u8bed +p3433 +sVsux +p3434 +V\u82cf\u7f8e\u5c14\u8bed +p3435 +sVmen +p3436 +V\u95e8\u5fb7\u8bed\uff08\u585e\u62c9\u5229\u6602\uff09 +p3437 +sVlez +p3438 +V\u5217\u5179\u91d1\u8bed +p3439 +sVgla +p3440 +V\u76d6\u5c14\u8bed\uff08\u82cf\u683c\u5170\uff09 +p3441 +sVbos +p3442 +V\u6ce2\u65af\u5c3c\u4e9a\u8bed +p3443 +sVgle +p3444 +V\u7231\u5c14\u5170\u8bed +p3445 +sVeka +p3446 +V\u57c3\u514b\u4e18\u514b\u8bed +p3447 +sVglg +p3448 +V\u52a0\u5229\u897f\u4e9a\u8bed +p3449 +sVakk +p3450 +V\u963f\u5361\u5fb7\u8bed +p3451 +sVaka +p3452 +V\u963f\u574e\u8bed +p3453 +sVbod +p3454 +V\u85cf\u8bed +p3455 +sVglv +p3456 +V\u9a6c\u6069\u5c9b\u8bed +p3457 +sVjrb +p3458 +V\u72b9\u592a-\u963f\u62c9\u4f2f\u8bed +p3459 +sVvie +p3460 +V\u8d8a\u5357\u8bed +p3461 +sVipk +p3462 +V\u4f9d\u52aa\u5e87\u514b\u8bed +p3463 +sVuzb +p3464 +V\u4e4c\u5179\u522b\u514b\u8bed +p3465 +sVsga +p3466 +V\u7231\u5c14\u5170\u8bed\uff08\u53e4\uff0c\u81f3 900\uff09 +p3467 +sVbre +p3468 +V\u5e03\u5217\u5854\u5c3c\u8bed +p3469 +sVbra +p3470 +V\u5e03\u62c9\u5409\u8bed +p3471 +sVaym +p3472 +V\u827e\u9a6c\u62c9\u8bed +p3473 +sVcha +p3474 +V\u67e5\u83ab\u7f57\u8bed +p3475 +sVchb +p3476 +V\u5947\u5e03\u67e5\u8bed +p3477 +sVche +p3478 +V\u8f66\u81e3\u8bed +p3479 +sVchg +p3480 +V\u5bdf\u5408\u53f0\u8bed +p3481 +sVchk +p3482 +V\u4e18\u514b\u8bed +p3483 +sVchm +p3484 +V\u9a6c\u91cc\u8bed\uff08\u4fc4\u7f57\u65af\uff09 +p3485 +sVchn +p3486 +V\u5947\u52aa\u514b\u6df7\u5408\u8bed +p3487 +sVcho +p3488 +V\u4e54\u514b\u6258\u8bed +p3489 +sVchp +p3490 +V\u5947\u4f69\u7ef4\u5b89\u8bed +p3491 +sVchr +p3492 +V\u5207\u7f57\u57fa\u8bed +p3493 +sVchu +p3494 +V\u65af\u62c9\u592b\u8bed\uff08\u53e4\u6559\u4f1a\uff09 +p3495 +sVchv +p3496 +V\u695a\u74e6\u4ec0\u8bed +p3497 +sVchy +p3498 +V\u590f\u5ef6\u8bed +p3499 +sVmsa +p3500 +V\u9a6c\u6765\u8bed\u65cf +p3501 +sViii +p3502 +V\u5f5d\u8bed\uff08\u56db\u5ddd\uff09 +p3503 +sVndo +p3504 +V\u6069\u6566\u52a0\u8bed +p3505 +sVibo +p3506 +V\u4f0a\u535a\u8bed +p3507 +sViba +p3508 +V\u4f0a\u73ed\u8bed +p3509 +sVxho +p3510 +V\u79d1\u8428\u8bed +p3511 +sVdeu +p3512 +V\u5fb7\u8bed +p3513 +sVcat +p3514 +V\u52a0\u6cf0\u7f57\u5c3c\u4e9a\u8bed +p3515 +sVdel +p3516 +V\u7279\u62c9\u534e\u8bed +p3517 +sVden +p3518 +V\u53f2\u62c9\u7ef4\u8bed\uff08\u963f\u6c99\u5df4\u65af\u7518\uff09 +p3519 +sVcad +p3520 +V\u5361\u591a\u8bed +p3521 +sVtat +p3522 +V\u5854\u5854\u5c14\u8bed +p3523 +sVsrn +p3524 +V\u82cf\u91cc\u5357\u6c64\u52a0\u8bed +p3525 +sVraj +p3526 +V\u62c9\u8d3e\u65af\u5766\u8bed +p3527 +sVtam +p3528 +V\u6cf0\u7c73\u5c14\u8bed +p3529 +sVspa +p3530 +V\u897f\u73ed\u7259\u8bed +p3531 +sVtah +p3532 +V\u5854\u5e0c\u63d0\u8bed +p3533 +sVafh +p3534 +V\u963f\u5f17\u91cc\u5e0c\u5229\u8bed +p3535 +sVeng +p3536 +V\u82f1\u8bed +p3537 +sVenm +p3538 +V\u82f1\u8bed\uff08\u4e2d\u53e4\uff0c1100-1500\uff09 +p3539 +sVcsb +p3540 +V\u5361\u8212\u6bd4\u8bed +p3541 +sVnyn +p3542 +V\u5c3c\u626c\u79d1\u52d2\u8bed +p3543 +sVnyo +p3544 +V\u5c3c\u5965\u7f57\u8bed +p3545 +sVsid +p3546 +V\u9521\u8fbe\u83ab\u8bed +p3547 +sVnya +p3548 +V\u5c3c\u626c\u8d3e\u8bed +p3549 +sVsin +p3550 +V\u50e7\u52a0\u7f57\u8bed +p3551 +sVafr +p3552 +V\u5357\u975e\u8377\u5170\u8bed +p3553 +sVlam +p3554 +V\u5170\u5df4\u8bed +p3555 +sVsnd +p3556 +V\u4fe1\u5fb7\u8bed +p3557 +sVmar +p3558 +V\u9a6c\u62c9\u5730\u8bed +p3559 +sVlah +p3560 +V\u62c9\u4ea8\u8fbe\u8bed +p3561 +sVnym +p3562 +V\u5c3c\u626c\u97e6\u9f50\u8bed +p3563 +sVsna +p3564 +V\u4fee\u7eb3\u8bed +p3565 +sVlad +p3566 +V\u62c9\u8fea\u8bfa\u8bed +p3567 +sVsnk +p3568 +V\u7d22\u5b81\u514b\u8bed +p3569 +sVmad +p3570 +V\u9a6c\u90fd\u62c9\u8bed +p3571 +sVmag +p3572 +V\u6469\u63ed\u9640\u8bed +p3573 +sVmai +p3574 +V\u7c73\u5fb7\u52d2\u8bed +p3575 +sVmah +p3576 +V\u9a6c\u7ecd\u5c14\u8bed +p3577 +sVlav +p3578 +V\u62c9\u8131\u7ef4\u4e9a\u8bed +p3579 +sVmal +p3580 +V\u9a6c\u62c9\u96c5\u62c9\u59c6\u8bed +p3581 +sVman +p3582 +V\u66fc\u4e01\u54e5\u8bed +p3583 +sVegy +p3584 +V\u57c3\u53ca\u8bed\uff08\u53e4\uff09 +p3585 +sVzen +p3586 +V\u54f2\u7eb3\u52a0\u8bed +p3587 +sVkbd +p3588 +V\u5361\u5df4\u5c14\u8fbe\u8bed +p3589 +sVita +p3590 +V\u610f\u5927\u5229\u8bed +p3591 +sVvai +p3592 +V\u74e6\u4f0a\u8bed +p3593 +sVtsn +p3594 +V\u8328\u74e6\u7eb3\u8bed +p3595 +sVtso +p3596 +V\u806a\u52a0\u8bed +p3597 +sVtsi +p3598 +V\u94a6\u897f\u5b89\u8bed +p3599 +sVbyn +p3600 +V\u6bd4\u6797\u8bed +p3601 +sVfij +p3602 +V\u6590\u6d4e\u8bed +p3603 +sVfin +p3604 +V\u82ac\u5170\u8bed +p3605 +sVeus +p3606 +V\u5df4\u65af\u514b\u8bed +p3607 +sVnon +p3608 +V\u8bfa\u5c14\u65af\u8bed\uff08\u53e4\uff09 +p3609 +sVceb +p3610 +V\u5bbf\u52a1\u8bed +p3611 +sVdan +p3612 +V\u4e39\u9ea6\u8bed +p3613 +sVnog +p3614 +V\u8bfa\u76d6\u8bed +p3615 +sVnob +p3616 +V\u632a\u5a01\u5e03\u514b\u83ab\u5c14\u8bed +p3617 +sVdak +p3618 +V\u8fbe\u79d1\u4ed6\u8bed +p3619 +sVces +p3620 +V\u6377\u514b\u8bed +p3621 +sVdar +p3622 +V\u8fbe\u5c14\u683c\u74e6\u8bed +p3623 +sVnor +p3624 +V\u632a\u5a01\u8bed +p3625 +sVkpe +p3626 +V\u514b\u4f69\u52d2\u8bed +p3627 +sVguj +p3628 +V\u53e4\u5409\u62c9\u7279\u8bed +p3629 +sVmdf +p3630 +V\u83ab\u514b\u6c99\u8bed +p3631 +sVmas +p3632 +V\u9a6c\u8428\u4f0a\u8bed +p3633 +sVlao +p3634 +V\u8001\u631d\u8bed +p3635 +sVmdr +p3636 +V\u66fc\u8fbe\u8bed +p3637 +sVgon +p3638 +V\u8d21\u5fb7\u8bed +p3639 +sVgoh +p3640 +V\u5fb7\u8bed\uff08\u4e0a\u53e4\u9ad8\u5730\uff0c\u7ea6 750-1050\uff09 +p3641 +sVsms +p3642 +V\u65af\u79d1\u7279-\u8428\u7c73\u8bed +p3643 +sVsmo +p3644 +V\u8428\u6469\u4e9a\u8bed +p3645 +sVsmn +p3646 +V\u4f0a\u7eb3\u91cc-\u8428\u7c73\u8bed +p3647 +sVsmj +p3648 +V\u5f8b\u52d2\u6b27-\u8428\u7c73\u8bed +p3649 +sVgot +p3650 +V\u54e5\u7279\u8bed +p3651 +sVsme +p3652 +V\u8428\u7c73\u8bed\uff08\u5317\uff09 +p3653 +sVdsb +p3654 +V\u7d22\u5e03\u8bed\uff08\u4e0b\uff09 +p3655 +sVsma +p3656 +V\u8428\u7c73\u8bed\uff08\u5357\uff09 +p3657 +sVgor +p3658 +V\u54e5\u4f26\u6253\u6d1b\u8bed +p3659 +sVast +p3660 +V\u963f\u65af\u56fe\u91cc\u4e9a\u65af\u8bed +p3661 +sVorm +p3662 +V\u5965\u7f57\u83ab\u8bed +p3663 +sVque +p3664 +V\u514b\u4e18\u4e9a\u8bed +p3665 +sVori +p3666 +V\u5965\u5229\u4e9a\u8bed +p3667 +sVcrh +p3668 +V\u9791\u977c\u8bed\uff08\u514b\u91cc\u7c73\u4e9a\uff09 +p3669 +sVasm +p3670 +V\u963f\u8428\u59c6\u8bed +p3671 +sVpus +p3672 +V\u666e\u4ec0\u56fe\u8bed +p3673 +sVdgr +p3674 +V\u591a\u683c\u91cc\u5e03\u8bed +p3675 +sVltz +p3676 +V\u5362\u68ee\u5821\u8bed +p3677 +sVgez +p3678 +V\u5409\u5179\u8bed +p3679 +sVisl +p3680 +V\u51b0\u5c9b\u8bed +p3681 +sVlat +p3682 +V\u62c9\u4e01\u8bed +p3683 +sVmak +p3684 +V\u671b\u52a0\u9521\u8bed +p3685 +sVzap +p3686 +V\u8428\u6ce2\u7279\u514b\u8bed +p3687 +sVyid +p3688 +V\u4f9d\u5730\u8bed +p3689 +sVkok +p3690 +V\u5b54\u5361\u5c3c\u8bed +p3691 +sVkom +p3692 +V\u79d1\u7c73\u8bed +p3693 +sVkon +p3694 +V\u521a\u679c\u8bed +p3695 +sVukr +p3696 +V\u4e4c\u514b\u5170\u8bed +p3697 +sVton +p3698 +V\u6c64\u52a0\u8bed\uff08\u6c64\u52a0\u5c9b\uff09 +p3699 +sVzxx +p3700 +VNo linguistic content +p3701 +sVkos +p3702 +V\u79d1\u65af\u62c9\u4f0a\u8bed +p3703 +sVkor +p3704 +V\u671d\u9c9c\u8bed +p3705 +sVtog +p3706 +V\u6c64\u52a0\u8bed (\u5c3c\u4e9a\u8428) +p3707 +sVhun +p3708 +V\u5308\u7259\u5229\u8bed +p3709 +sVhup +p3710 +V\u80e1\u5e15\u8bed +p3711 +sVcym +p3712 +V\u5a01\u5c14\u58eb\u8bed +p3713 +sVudm +p3714 +V\u4e4c\u5fb7\u7a46\u5c14\u7279\u8bed +p3715 +sVbej +p3716 +V\u8d1d\u624e\u8bed +p3717 +sVben +p3718 +V\u5b5f\u52a0\u62c9\u8bed +p3719 +sVbel +p3720 +V\u767d\u4fc4\u7f57\u65af\u8bed +p3721 +sVbem +p3722 +V\u672c\u5df4\u8bed\uff08\u8d5e\u6bd4\u4e9a\uff09 +p3723 +sVaar +p3724 +V\u963f\u6cd5\u5c14\u8bed +p3725 +sVnzi +p3726 +V\u6069\u6d4e\u9a6c\u8bed +p3727 +sVsah +p3728 +V\u96c5\u5e93\u7279\u8bed +p3729 +sVsan +p3730 +V\u68b5\u8bed +p3731 +sVsam +p3732 +V\u963f\u62c9\u7c73\u8bed\uff08\u8428\u9a6c\u5229\u4e9a\uff09 +p3733 +sVpro +p3734 +V\u666e\u7f57\u65fa\u65af\u8bed\uff08\u53e4\uff0c\u81f3 1500\uff09 +p3735 +sVsag +p3736 +V\u6851\u6208\u8bed +p3737 +sVsad +p3738 +V\u6851\u8fbe\u97e6\u8bed +p3739 +sVanp +p3740 +V\u5b89\u5409\u5361\u8bed +p3741 +sVrap +p3742 +V\u62c9\u5e15\u52aa\u4f0a\u8bed +p3743 +sVsas +p3744 +V\u8428\u8428\u514b\u8bed +p3745 +sVnqo +p3746 +V\u897f\u975e\u4e66\u9762\u8bed\u8a00\u5b57\u6bcd +p3747 +sVsat +p3748 +V\u6851\u5854\u5229\u8bed +p3749 +sVmin +p3750 +V\u7c73\u5357\u5361\u4fdd\u8bed +p3751 +sVlim +p3752 +V\u6797\u5821\u8bed +p3753 +sVlin +p3754 +V\u6797\u52a0\u62c9\u8bed +p3755 +sVlit +p3756 +V\u7acb\u9676\u5b9b\u8bed +p3757 +sVefi +p3758 +V\u57c3\u83f2\u514b\u8bed +p3759 +sVmis +p3760 +V\u672a\u88ab\u7f16\u7801\u7684\u8bed\u8a00 +p3761 +sVkac +p3762 +V\u666f\u9887\u8bed +p3763 +sVkab +p3764 +V\u5361\u5e03\u5217\u8bed +p3765 +sVkaa +p3766 +V\u5361\u62c9\u5361\u5c14\u5e15\u514b\u8bed +p3767 +sVkan +p3768 +V\u5361\u7eb3\u8fbe\u8bed +p3769 +sVkam +p3770 +V\u574e\u5df4\u8bed\uff08\u80af\u5c3c\u4e9a\uff09 +p3771 +sVkal +p3772 +V\u683c\u9675\u5170\u8bed +p3773 +sVkas +p3774 +V\u514b\u4ec0\u7c73\u5c14\u8bed +p3775 +sVkaw +p3776 +V\u5361\u5a01\u8bed +p3777 +sVkau +p3778 +V\u5361\u52aa\u91cc\u8bed +p3779 +sVkat +p3780 +V\u683c\u9c81\u5409\u4e9a\u8bed +p3781 +sVkaz +p3782 +V\u54c8\u8428\u514b\u8bed +p3783 +sVtyv +p3784 +V\u56fe\u74e6\u8bed +p3785 +sVawa +p3786 +V\u963f\u74e6\u5fb7\u8bed +p3787 +sVurd +p3788 +V\u4e4c\u5c14\u90fd\u8bed +p3789 +sVdoi +p3790 +V\u591a\u683c\u62c9\u8bed +p3791 +sVtpi +p3792 +V\u6258\u514b\u76ae\u8f9b\u8bed +p3793 +sVmri +p3794 +V\u6bdb\u5229\u8bed +p3795 +sVabk +p3796 +V\u963f\u5e03\u54c8\u5179\u8bed +p3797 +sVtkl +p3798 +V\u6258\u514b\u52b3\u8bed +p3799 +sVnld +p3800 +V\u8377\u5170\u8bed +p3801 +sVoji +p3802 +V\u5965\u5409\u5e03\u74e6\u8bed +p3803 +sVoci +p3804 +V\u5965\u514b\u897f\u5510\u8bed\uff081500 \u540e\uff09 +p3805 +sVwol +p3806 +V\u6c83\u6d1b\u592b\u8bed +p3807 +sVjav +p3808 +V\u722a\u54c7\u8bed +p3809 +sVhrv +p3810 +V\u514b\u7f57\u5730\u4e9a\u8bed +p3811 +sVzza +p3812 +V\u624e\u624e\u5176\u8bed +p3813 +sVmga +p3814 +V\u7231\u5c14\u5170\u8bed\uff08\u4e2d\u53e4\uff0c900-1200\uff09 +p3815 +sVhit +p3816 +V\u8d6b\u68af\u8bed +p3817 +sVdyu +p3818 +V\u8fea\u5c24\u62c9\u8bed +p3819 +sVssw +p3820 +V\u65af\u74e6\u7279\u8bed +p3821 +sVmul +p3822 +V\u591a\u79cd\u8bed\u8a00 +p3823 +sVhil +p3824 +V\u5e0c\u5229\u76d6\u519c\u8bed +p3825 +sVhin +p3826 +V\u5370\u5730\u8bed +p3827 +sVbas +p3828 +V\u5df4\u8428\u8bed\uff08\u5580\u9ea6\u9686\uff09 +p3829 +sVgba +p3830 +V\u5df4\u4e9a\u8bed\uff08\u4e2d\u975e\u5171\u548c\u56fd\uff09 +p3831 +sVwln +p3832 +V\u74e6\u9f99\u8bed +p3833 +sVnep +p3834 +V\u5c3c\u6cca\u5c14\u8bed +p3835 +sVcre +p3836 +V\u514b\u91cc\u8bed +p3837 +sVban +p3838 +V\u5df4\u5398\u8bed +p3839 +sVbal +p3840 +V\u4ffe\u8def\u652f\u8bed +p3841 +sVbam +p3842 +V\u73ed\u5df4\u62c9\u8bed +p3843 +sVbak +p3844 +V\u5df4\u4ec0\u57fa\u5c14\u8bed +p3845 +sVshn +p3846 +V\u63b8\u8bed +p3847 +sVarp +p3848 +V\u963f\u62c9\u5e15\u970d\u8bed +p3849 +sVarw +p3850 +V\u963f\u62c9\u74e6\u514b\u8bed +p3851 +sVara +p3852 +V\u963f\u62c9\u4f2f\u8bed +p3853 +sVarc +p3854 +V\u963f\u62c9\u7c73\u8bed\uff08\u5b98\u65b9\uff0c\u516c\u5143\u524d 700-300\uff09 +p3855 +sVarg +p3856 +V\u963f\u62c9\u8d21\u8bed +p3857 +sVsel +p3858 +V\u585e\u5c14\u5e93\u666e\u8bed +p3859 +sVarn +p3860 +V\u963f\u52b3\u574e\u8bed +p3861 +sVlus +p3862 +V\u5362\u8428\u8bed +p3863 +sVmus +p3864 +V\u514b\u91cc\u514b\u8bed +p3865 +sVlua +p3866 +V\u5362\u5df4-\u5362\u62c9\u8bed +p3867 +sVlub +p3868 +V\u5362\u5df4-\u52a0\u4e39\u52a0\u8bed +p3869 +sVlug +p3870 +V\u5e72\u8fbe\u8bed +p3871 +sVlui +p3872 +V\u5362\u4f0a\u585e\u8bfa\u8bed +p3873 +sVlun +p3874 +V\u9686\u8fbe\u8bed +p3875 +sVluo +p3876 +V\u5362\u5965\u8bed\uff08\u80af\u5c3c\u4e9a\u548c\u5766\u6851\u5c3c\u4e9a\uff09 +p3877 +sViku +p3878 +V\u4f0a\u52aa\u4f0a\u7279\u8bed +p3879 +sVtur +p3880 +V\u571f\u8033\u5176\u8bed +p3881 +sVzbl +p3882 +V\u5e03\u5229\u65af\u7b26\u53f7 +p3883 +sVtuk +p3884 +V\u571f\u5e93\u66fc\u8bed +p3885 +sVtum +p3886 +V\u5947\u56fe\u59c6\u5e03\u5361\u8bed +p3887 +sVcop +p3888 +V\u79d1\u666e\u7279\u8bed +p3889 +sVcos +p3890 +V\u79d1\u897f\u5609\u8bed +p3891 +sVcor +p3892 +V\u5eb7\u6c83\u5c14\u8bed +p3893 +sVilo +p3894 +V\u4f0a\u6d1b\u5361\u8bfa\u8bed +p3895 +sVgwi +p3896 +V\u5e93\u81e3\u8bed +p3897 +sVund +p3898 +V\u672a\u786e\u5b9a\u7684\u8bed\u8a00 +p3899 +sVtli +p3900 +V\u7279\u6797\u5409\u7279\u8bed +p3901 +sVtlh +p3902 +V\u514b\u6797\u8d21\u8bed +p3903 +sVpor +p3904 +V\u8461\u8404\u7259\u8bed +p3905 +sVpon +p3906 +V\u6ce2\u7eb3\u4f69\u8bed +p3907 +sVpol +p3908 +V\u6ce2\u5170\u8bed +p3909 +sVang +p3910 +V\u82f1\u8bed\uff08\u4e0a\u53e4\uff0c\u7ea6 450-1100\uff09 +p3911 +sVtgk +p3912 +V\u5854\u5409\u514b\u8bed +p3913 +sVtgl +p3914 +V\u5854\u52a0\u6d1b\u8bed +p3915 +sVfra +p3916 +V\u6cd5\u8bed +p3917 +sVdum +p3918 +V\u8377\u5170\u8bed\uff08\u4e2d\u53e4\uff0c\u7ea6 1050-1350\uff09 +p3919 +sVswa +p3920 +V\u65af\u74e6\u5e0c\u91cc\u8bed\u65cf +p3921 +sVdua +p3922 +V\u675c\u4e9a\u62c9\u8bed +p3923 +sVfro +p3924 +V\u6cd5\u8bed\uff08\u4e0a\u53e4\uff0c842-\u7ea6 1400\uff09 +p3925 +sVyap +p3926 +V\u96c5\u6d66\u8bed +p3927 +sVfrm +p3928 +V\u6cd5\u8bed\uff08\u4e2d\u53e4\uff0c\u7ea6 1400-1600\uff09 +p3929 +sVfrs +p3930 +V\u5f17\u91cc\u897f\u4e9a\u8bed\uff08\u4e1c\uff09 +p3931 +sVfrr +p3932 +V\u5f17\u91cc\u897f\u8bed\uff08\u5317\uff09 +p3933 +sVyao +p3934 +V\u7476\u8bed +p3935 +sVxal +p3936 +V\u5361\u5c14\u6885\u514b\u8bed +p3937 +sVfry +p3938 +V\u5f17\u91cc\u897f\u4e9a\u8bed\uff08\u897f\uff09 +p3939 +sVgay +p3940 +V\u5361\u7ea6\u8bed +p3941 +sVota +p3942 +V\u571f\u8033\u5176\u8bed\uff08\u5965\u65af\u66fc\uff0c1500-1928\uff09 +p3943 +sVhmn +p3944 +V\u82d7\u8bed +p3945 +sVhmo +p3946 +V\u5e0c\u91cc\u83ab\u56fe\u8bed +p3947 +sVgaa +p3948 +V\u52a0\u8bed +p3949 +sVfur +p3950 +V\u5f17\u7559\u5229\u8bed +p3951 +sVmlg +p3952 +V\u9a6c\u8fbe\u52a0\u65af\u52a0\u8bed +p3953 +sVslv +p3954 +V\u65af\u6d1b\u6587\u5c3c\u4e9a\u8bed +p3955 +sVain +p3956 +V\u963f\u4f0a\u52aa\u8bed\uff08\u65e5\u672c\uff09 +p3957 +sVfil +p3958 +V\u83f2\u5f8b\u5bbe\u8bed +p3959 +sVmlt +p3960 +V\u9a6c\u8033\u4ed6\u8bed +p3961 +sVslk +p3962 +V\u65af\u6d1b\u4f10\u514b\u8bed +p3963 +sVrar +p3964 +V\u62c9\u7f57\u6c64\u52a0\u8bed +p3965 +sVful +p3966 +V\u5bcc\u62c9\u8bed +p3967 +sVjpn +p3968 +V\u65e5\u8bed +p3969 +sVvol +p3970 +V\u6c83\u62c9\u666e\u514b\u8bed +p3971 +sVvot +p3972 +V\u6c83\u63d0\u514b\u8bed +p3973 +sVind +p3974 +V\u5370\u5c3c\u8bed +p3975 +sVave +p3976 +V\u963f\u7ef4\u65af\u9640\u8bed +p3977 +sVjpr +p3978 +V\u72b9\u592a-\u6ce2\u65af\u8bed +p3979 +sVava +p3980 +V\u963f\u74e6\u5c14\u8bed +p3981 +sVpap +p3982 +V\u5e15\u76ae\u4e9a\u95e8\u6258\u8bed +p3983 +sVewo +p3984 +V\u57c3\u7fc1\u591a\u8bed +p3985 +sVpau +p3986 +V\u5e15\u52b3\u8bed +p3987 +sVewe +p3988 +V\u57c3\u7ef4\u8bed +p3989 +sVpag +p3990 +V\u90a6\u963f\u897f\u6960\u8bed +p3991 +sVpal +p3992 +V\u94b5\u7f57\u94b5\u8bed +p3993 +sVpam +p3994 +V\u90a6\u677f\u7259\u8bed +p3995 +sVpan +p3996 +V\u65c1\u906e\u666e\u8bed +p3997 +sVsyc +p3998 +V\u53d9\u5229\u4e9a\u8bed\uff08\u53e4\u5178\uff09 +p3999 +sVphn +p4000 +V\u8153\u5c3c\u57fa\u8bed +p4001 +sVkir +p4002 +V\u5409\u5c14\u5409\u65af\u8bed +p4003 +sVnia +p4004 +V\u5c3c\u4e9a\u65af\u8bed +p4005 +sVkik +p4006 +V\u57fa\u5e93\u5c24\u8bed +p4007 +sVsyr +p4008 +V\u53e4\u53d9\u5229\u4e9a\u8bed +p4009 +sVkin +p4010 +V\u57fa\u5c3c\u963f\u4e07\u8fbe\u8bed +p4011 +sVniu +p4012 +V\u7ebd\u57c3\u8bed +p4013 +sVgsw +p4014 +V\u5fb7\u8bed\uff08\u745e\u58eb\uff09 +p4015 +sVepo +p4016 +V\u4e16\u754c\u8bed +p4017 +sVjbo +p4018 +V\u903b\u8f91\u8bed +p4019 +sVmic +p4020 +V\u7c73\u514b\u9a6c\u514b\u8bed +p4021 +sVtha +p4022 +V\u6cf0\u8bed +p4023 +sVhai +p4024 +V\u6d77\u8fbe\u8bed +p4025 +sVgmh +p4026 +V\u5fb7\u8bed\uff08\u4e2d\u53e4\u9ad8\u5730\uff0c\u7ea6 1050-1500\uff09 +p4027 +sVell +p4028 +V\u5e0c\u814a\u8bed\uff08\u73b0\u4ee3\uff0c1453-\uff09 +p4029 +sVady +p4030 +V\u963f\u8fea\u683c\u8bed +p4031 +sVelx +p4032 +V\u57c3\u5170\u8bed +p4033 +sVada +p4034 +V\u963f\u5f53\u6885\u8bed +p4035 +sVnav +p4036 +V\u7eb3\u74e6\u970d\u8bed +p4037 +sVhat +p4038 +V\u514b\u91cc\u5965\u5c14\u8bed\uff08\u6d77\u5730\uff09 +p4039 +sVhau +p4040 +V\u8c6a\u8428\u8bed +p4041 +sVhaw +p4042 +V\u590f\u5a01\u5937\u8bed +p4043 +sVbin +p4044 +V\u6bd4\u5c3c\u8bed +p4045 +sVamh +p4046 +V\u963f\u59c6\u54c8\u62c9\u8bed +p4047 +sVbik +p4048 +V\u6bd4\u79d1\u5c14\u8bed +p4049 +sVmos +p4050 +V\u83ab\u897f\u8bed +p4051 +sVmoh +p4052 +V\u83ab\u970d\u514b\u8bed +p4053 +sVmon +p4054 +V\u8499\u53e4\u8bed +p4055 +sVbho +p4056 +V\u535a\u6770\u666e\u5c14\u8bed +p4057 +sVbis +p4058 +V\u6bd4\u65af\u62c9\u9a6c\u8bed +p4059 +sVtvl +p4060 +V\u56fe\u74e6\u5362\u8bed +p4061 +sVest +p4062 +V\u7231\u6c99\u5c3c\u4e9a\u8bed +p4063 +sVkmb +p4064 +V\u91d1\u672c\u675c\u8bed +p4065 +sVpeo +p4066 +V\u6ce2\u65af\u8bed\uff08\u53e4\uff0c\u516c\u5143\u524d\u7ea6 600-400\uff09 +p4067 +sVumb +p4068 +V\u7fc1\u672c\u675c\u8bed +p4069 +sVtmh +p4070 +V\u5854\u9a6c\u820d\u514b\u8bed +p4071 +sVfon +p4072 +V\u4e30\u8bed +p4073 +sVhsb +p4074 +V\u7d22\u5e03\u8bed\uff08\u4e0a\uff09 +p4075 +sVrun +p4076 +V\u57fa\u9686\u8fea\u8bed +p4077 +sVrus +p4078 +V\u4fc4\u8bed +p4079 +sVrup +p4080 +V\u963f\u7f57\u9a6c\u5c3c\u4e9a\u8bed +p4081 +sVpli +p4082 +V\u5df4\u5229\u8bed +p4083 +sVace +p4084 +V\u4e9a\u9f50\u8bed +p4085 +sVach +p4086 +V\u963f\u4e54\u5229\u8bed +p4087 +sVnde +p4088 +V\u6069\u5fb7\u8d1d\u52d2\u8bed\uff08\u5317\uff09 +p4089 +sVdzo +p4090 +V\u5b97\u5580\u8bed +p4091 +sVkru +p4092 +V\u5e93\u5362\u514b\u8bed +p4093 +sVsrr +p4094 +V\u585e\u96f7\u5c14\u8bed +p4095 +sVido +p4096 +V\u4f0a\u591a\u8bed +p4097 +sVsrp +p4098 +V\u585e\u5c14\u7ef4\u4e9a\u8bed +p4099 +sVkrl +p4100 +V\u5361\u7d2f\u5229\u963f\u8bed +p4101 +sVkrc +p4102 +V\u5361\u62c9\u6070\u4f0a-\u5df4\u5c14\u5361\u5c14\u8bed +p4103 +sVnds +p4104 +V\u6492\u514b\u900a\u8bed\uff08\u4f4e\u5730\uff09 +p4105 +sVzun +p4106 +V\u7956\u5c3c\u8bed +p4107 +sVzul +p4108 +V\u7956\u9c81\u8bed +p4109 +sVtwi +p4110 +V\u5951\u7ef4\u8bed +p4111 +sVsog +p4112 +V\u7c9f\u7279\u8bed +p4113 +sVnso +p4114 +V\u7d22\u6258\u8bed\uff08\u5317\uff09 +p4115 +sVswe +p4116 +V\u745e\u5178\u8bed +p4117 +sVsom +p4118 +V\u7d22\u9a6c\u91cc\u8bed +p4119 +sVsot +p4120 +V\u7d22\u6258\u8bed\uff08\u5357\uff09 +p4121 +sVmkd +p4122 +V\u9a6c\u5176\u987f\u8bed +p4123 +sVher +p4124 +V\u8d6b\u96f7\u7f57\u8bed +p4125 +sVlol +p4126 +V\u8292\u6208\u8bed +p4127 +sVheb +p4128 +V\u5e0c\u4f2f\u6765\u8bed +p4129 +sVloz +p4130 +V\u6d1b\u9f50\u8bed +p4131 +sVgil +p4132 +V\u5409\u5c14\u4f2f\u7279\u8bed +p4133 +sVwas +p4134 +V\u74e6\u8096\u8bed +p4135 +sVwar +p4136 +V\u74e6\u8d56\u8bed\uff08\u83f2\u5f8b\u5bbe\uff09 +p4137 +sVbul +p4138 +V\u4fdd\u52a0\u5229\u4e9a\u8bed +p4139 +sVwal +p4140 +V\u74e6\u62c9\u83ab\u8bed +p4141 +sVbua +p4142 +V\u5e03\u91cc\u4e9a\u7279\u8bed +p4143 +sVbug +p4144 +V\u5e03\u5409\u8bed +p4145 +sVaze +p4146 +V\u963f\u585e\u62dc\u7586\u8bed +p4147 +sVzha +p4148 +V\u58ee\u8bed +p4149 +sVzho +p4150 +V\u4e2d\u6587 +p4151 +sVnno +p4152 +V\u65b0\u632a\u5a01\u8bed +p4153 +sVuig +p4154 +V\u7ef4\u543e\u5c14\u8bed +p4155 +sVmyv +p4156 +V\u5384\u5c14\u5179\u4e9a\u8bed +p4157 +sVinh +p4158 +V\u5370\u53e4\u4ec0\u8bed +p4159 +sVkhm +p4160 +V\u9ad8\u68c9\u8bed +p4161 +sVkho +p4162 +V\u548c\u7530\u8bed +p4163 +sVmya +p4164 +V\u7f05\u7538\u8bed +p4165 +sVkha +p4166 +V\u5361\u897f\u8bed +p4167 +sVina +p4168 +V\u56fd\u9645\u8bed +p4169 +sVtiv +p4170 +V\u8482\u592b\u8bed +p4171 +sVtir +p4172 +V\u63d0\u683c\u91cc\u5c3c\u4e9a\u8bed +p4173 +sVnap +p4174 +V\u62ff\u5761\u91cc\u8bed +p4175 +sVgrb +p4176 +V\u683c\u5217\u535a\u8bed +p4177 +sVgrc +p4178 +V\u5e0c\u814a\u8bed\uff08\u53e4\u5178\uff0c\u76f4\u5230 1453\uff09 +p4179 +sVnau +p4180 +V\u7459\u9c81\u8bed +p4181 +sVgrn +p4182 +V\u74dc\u62c9\u5c3c\u8bed +p4183 +sVtig +p4184 +V\u63d0\u683c\u96f7\u8bed +p4185 +sVyor +p4186 +V\u7ea6\u9c81\u5df4\u8bed +p4187 +sVile +p4188 +V\u56fd\u9645\u8bed\uff08\u897f\u65b9\uff09 +p4189 +sVsqi +p4190 +V\u963f\u5c14\u5df4\u5c3c\u4e9a\u8bed +p4191 +ssS'de' +p4192 +(dp4193 +Vroh +p4194 +VBndnerromanisch +p4195 +sVsco +p4196 +VSchottisch +p4197 +sVscn +p4198 +VSizilianisch +p4199 +sVrom +p4200 +VRomani; Zigeunersprache +p4201 +sVron +p4202 +VRumnisch +p4203 +sVoss +p4204 +VOssetisch +p4205 +sVale +p4206 +VAleutisch +p4207 +sVmni +p4208 +VMeithei-Sprache +p4209 +sVnwc +p4210 +VNewari; Alt +p4211 +sVosa +p4212 +VOsage +p4213 +sValt +p4214 +VAltaisch; Sd +p4215 +sVmnc +p4216 +VManchu; Mandschurisch +p4217 +sVmwr +p4218 +VMarwari +p4219 +sVven +p4220 +VVenda +p4221 +sVuga +p4222 +VUgaritisch +p4223 +sVmwl +p4224 +VMirandesisch +p4225 +sVfas +p4226 +VPersisch +p4227 +sVfat +p4228 +VFanti +p4229 +sVfan +p4230 +VFang (quatorial-Guinea) +p4231 +sVfao +p4232 +VFrisch +p4233 +sVdin +p4234 +VDinka +p4235 +sVhye +p4236 +VArmenisch +p4237 +sVbla +p4238 +VBlackfoot +p4239 +sVsrd +p4240 +VSardisch +p4241 +sVcar +p4242 +VKaribisch; Galbi +p4243 +sVdiv +p4244 +VDhivehi +p4245 +sVtel +p4246 +VTelugu +p4247 +sVtem +p4248 +VTemne +p4249 +sVnbl +p4250 +VNdebele (Sd) +p4251 +sVter +p4252 +VTereno +p4253 +sVtet +p4254 +VTetum +p4255 +sVsun +p4256 +VSundanesisch +p4257 +sVkut +p4258 +VKutenai +p4259 +sVsuk +p4260 +VSukuma +p4261 +sVkur +p4262 +VKurdisch +p4263 +sVkum +p4264 +VKumkisch +p4265 +sVsus +p4266 +VSusu +p4267 +sVnew +p4268 +VBhasa; Nepalesisch +p4269 +sVkua +p4270 +VKwanyama +p4271 +sVsux +p4272 +VSumerisch +p4273 +sVmen +p4274 +VMende (Sierra Leone) +p4275 +sVlez +p4276 +VLesgisch +p4277 +sVgla +p4278 +VGlisch; Schottisch +p4279 +sVbos +p4280 +VBosnisch +p4281 +sVgle +p4282 +VIrisch +p4283 +sVeka +p4284 +VEkajuk +p4285 +sVglg +p4286 +VGalicisch +p4287 +sVakk +p4288 +VAkkadisch +p4289 +sVaka +p4290 +VAkan-Sprache +p4291 +sVbod +p4292 +VTibetisch +p4293 +sVglv +p4294 +VManx +p4295 +sVjrb +p4296 +VJdisch-Arabisch +p4297 +sVvie +p4298 +VVietnamesisch +p4299 +sVipk +p4300 +VInupiaq +p4301 +sVuzb +p4302 +VUsbekisch +p4303 +sVsga +p4304 +VAltirisch (bis 900) +p4305 +sVbre +p4306 +VBretonisch +p4307 +sVbra +p4308 +VBraj-Bhakha +p4309 +sVaym +p4310 +VAymara +p4311 +sVcha +p4312 +VChamorro +p4313 +sVchb +p4314 +VChibcha +p4315 +sVche +p4316 +VTschetschenisch +p4317 +sVchg +p4318 +VTschagataisch +p4319 +sVchk +p4320 +VTrukesisch +p4321 +sVchm +p4322 +VMari (Russland) +p4323 +sVchn +p4324 +VChinook +p4325 +sVcho +p4326 +VChoctaw +p4327 +sVchp +p4328 +VChipewyan +p4329 +sVchr +p4330 +VCherokee +p4331 +sVchu +p4332 +VAltkirchenslawisch +p4333 +sVchv +p4334 +VTschuwaschisch +p4335 +sVchy +p4336 +VCheyenne +p4337 +sVmsa +p4338 +VMalaiisch (Makrosprache) +p4339 +sViii +p4340 +VYi; Sichuan +p4341 +sVndo +p4342 +VNdonga +p4343 +sVibo +p4344 +VIbo +p4345 +sViba +p4346 +VIban +p4347 +sVxho +p4348 +VXhosa +p4349 +sVdeu +p4350 +VDeutsch +p4351 +sVcat +p4352 +VKatalanisch +p4353 +sVdel +p4354 +VDelaware +p4355 +sVden +p4356 +VSlave (Athapaskisch) +p4357 +sVcad +p4358 +VCaddo +p4359 +sVtat +p4360 +VTatarisch +p4361 +sVsrn +p4362 +VSranan Tongo +p4363 +sVraj +p4364 +VRajasthani +p4365 +sVtam +p4366 +VTamilisch +p4367 +sVspa +p4368 +VSpanisch; Kastilianisch +p4369 +sVtah +p4370 +VTahitisch +p4371 +sVafh +p4372 +VAfrihili +p4373 +sVeng +p4374 +VEnglisch +p4375 +sVenm +p4376 +VMittelenglisch +p4377 +sVcsb +p4378 +VKaschubisch +p4379 +sVnyn +p4380 +VNyankole +p4381 +sVnyo +p4382 +VNyoro +p4383 +sVsid +p4384 +VSidamo +p4385 +sVnya +p4386 +VNyanja +p4387 +sVsin +p4388 +VSinghalesisch +p4389 +sVafr +p4390 +VAfrikaans +p4391 +sVlam +p4392 +VBanjari; Lamba +p4393 +sVsnd +p4394 +VSindhi +p4395 +sVmar +p4396 +VMarathi +p4397 +sVlah +p4398 +VLahnda +p4399 +sVnym +p4400 +VNyamwezi +p4401 +sVsna +p4402 +VSchona +p4403 +sVlad +p4404 +VJudenspanisch +p4405 +sVsnk +p4406 +VSoninke +p4407 +sVmad +p4408 +VMaduresisch +p4409 +sVmag +p4410 +VKhotta +p4411 +sVmai +p4412 +VMaithili +p4413 +sVmah +p4414 +VMarshallesisch +p4415 +sVlav +p4416 +VLettisch +p4417 +sVmal +p4418 +VMalayalam +p4419 +sVman +p4420 +VMande; Mandigo; Malinke +p4421 +sVegy +p4422 +Vgyptisch (Historisch) +p4423 +sVzen +p4424 +VZenaga +p4425 +sVkbd +p4426 +VKabardisch +p4427 +sVita +p4428 +VItalienisch +p4429 +sVvai +p4430 +VVai +p4431 +sVtsn +p4432 +VTswana +p4433 +sVtso +p4434 +VTsonga +p4435 +sVtsi +p4436 +VTsimshian +p4437 +sVbyn +p4438 +VBilin +p4439 +sVfij +p4440 +VFidschianisch +p4441 +sVfin +p4442 +VFinnisch +p4443 +sVeus +p4444 +VBaskisch +p4445 +sVnon +p4446 +VAltnordisch +p4447 +sVceb +p4448 +VCebuano +p4449 +sVdan +p4450 +VDnisch +p4451 +sVnog +p4452 +VNogai +p4453 +sVnob +p4454 +VNorwegisch-Bokml +p4455 +sVdak +p4456 +VDakota +p4457 +sVces +p4458 +VTschechisch +p4459 +sVdar +p4460 +VDarginisch +p4461 +sVnor +p4462 +VNorwegisch +p4463 +sVkpe +p4464 +VKpelle +p4465 +sVguj +p4466 +VGujarati +p4467 +sVmdf +p4468 +VMoksha +p4469 +sVmas +p4470 +VMassai +p4471 +sVlao +p4472 +VLaotisch +p4473 +sVmdr +p4474 +VMandaresisch +p4475 +sVgon +p4476 +VGondi +p4477 +sVgoh +p4478 +VAlthochdeutsch (ca. 750-1050) +p4479 +sVsms +p4480 +VSamisch; Skolt +p4481 +sVsmo +p4482 +VSamoanisch +p4483 +sVsmn +p4484 +VSamisch; Inari +p4485 +sVsmj +p4486 +VSamisch (Lule) +p4487 +sVgot +p4488 +VGotisch +p4489 +sVsme +p4490 +VNordsamisch +p4491 +sVdsb +p4492 +VSorbisch; Nieder +p4493 +sVsma +p4494 +VSami; Sd +p4495 +sVgor +p4496 +VGorontalesisch +p4497 +sVast +p4498 +VAsturisch +p4499 +sVorm +p4500 +VOromo +p4501 +sVque +p4502 +VKetschua +p4503 +sVori +p4504 +VOrija +p4505 +sVcrh +p4506 +VTrkisch; Krimtatarisch +p4507 +sVasm +p4508 +VAssamesisch +p4509 +sVpus +p4510 +VPaschtu; Afghanisch +p4511 +sVdgr +p4512 +VDogrib +p4513 +sVltz +p4514 +VLuxemburgisch +p4515 +sVgez +p4516 +VAltthiopisch +p4517 +sVisl +p4518 +VIslndisch +p4519 +sVlat +p4520 +VLateinisch +p4521 +sVmak +p4522 +VMakassarisch +p4523 +sVzap +p4524 +VZapotekisch +p4525 +sVyid +p4526 +VJiddisch +p4527 +sVkok +p4528 +VKonkani (Makrosprache) +p4529 +sVkom +p4530 +VKomi +p4531 +sVkon +p4532 +VKongo +p4533 +sVukr +p4534 +VUkrainisch +p4535 +sVton +p4536 +VTonga (Tonga-Inseln) +p4537 +sVzxx +p4538 +VKein sprachlicher Inhalt +p4539 +sVkos +p4540 +VKosraeanisch +p4541 +sVkor +p4542 +VKoreanisch +p4543 +sVtog +p4544 +VTonga (Nyasa) +p4545 +sVhun +p4546 +VUngarisch +p4547 +sVhup +p4548 +VHupa +p4549 +sVcym +p4550 +VWalisisch +p4551 +sVudm +p4552 +VUdmurt +p4553 +sVbej +p4554 +VBedja (Bedauye) +p4555 +sVben +p4556 +VBengalisch +p4557 +sVbel +p4558 +VWeirussisch +p4559 +sVbem +p4560 +VBemba (Sambia) +p4561 +sVaar +p4562 +VDanakil-Sprache +p4563 +sVnzi +p4564 +VNzima +p4565 +sVsah +p4566 +VJakutisch +p4567 +sVsan +p4568 +VSanskrit +p4569 +sVsam +p4570 +VAramisch; Samaritanisch +p4571 +sVpro +p4572 +VAltokzitanisch; Altprovenzalisch (bis 1500) +p4573 +sVsag +p4574 +VSango +p4575 +sVsad +p4576 +VSandawe +p4577 +sVanp +p4578 +VAnga-Sprache +p4579 +sVrap +p4580 +VOsterinsel-Sprache; Rapanui +p4581 +sVsas +p4582 +VSassak +p4583 +sVnqo +p4584 +VN'Ko +p4585 +sVsat +p4586 +VSantali +p4587 +sVmin +p4588 +VMinangkabau +p4589 +sVlim +p4590 +VLimburgisch +p4591 +sVlin +p4592 +VLingala +p4593 +sVlit +p4594 +VLitauisch +p4595 +sVefi +p4596 +VEfik +p4597 +sVmis +p4598 +VNichtklassifizierte Sprachen +p4599 +sVkac +p4600 +VKachinisch +p4601 +sVkab +p4602 +VKabylisch +p4603 +sVkaa +p4604 +VKarakalpakisch +p4605 +sVkan +p4606 +VKannada +p4607 +sVkam +p4608 +VKamba (Kenia) +p4609 +sVkal +p4610 +VKalaallisut (Grnlndisch) +p4611 +sVkas +p4612 +VKaschmirisch +p4613 +sVkaw +p4614 +VKawi; Altjavanisch +p4615 +sVkau +p4616 +VKanuri +p4617 +sVkat +p4618 +VGeorgisch +p4619 +sVkaz +p4620 +VKasachisch +p4621 +sVtyv +p4622 +VTuwinisch +p4623 +sVawa +p4624 +VAwadhi +p4625 +sVurd +p4626 +VUrdu +p4627 +sVdoi +p4628 +VDogri (Makrosprache) +p4629 +sVtpi +p4630 +VNeumelanesisch; Pidgin +p4631 +sVmri +p4632 +VMaori +p4633 +sVabk +p4634 +VAbchasisch +p4635 +sVtkl +p4636 +VTokelauanisch +p4637 +sVnld +p4638 +VNiederlndisch +p4639 +sVoji +p4640 +VOjibwa +p4641 +sVoci +p4642 +VOkzitanisch (nach 1500) +p4643 +sVwol +p4644 +VWolof +p4645 +sVjav +p4646 +VJavanisch +p4647 +sVhrv +p4648 +VKroatisch +p4649 +sVzza +p4650 +VZaza +p4651 +sVmga +p4652 +VMittelirisch (900-1200) +p4653 +sVhit +p4654 +VHethitisch +p4655 +sVdyu +p4656 +VDyula +p4657 +sVssw +p4658 +VSwazi +p4659 +sVmul +p4660 +VMehrsprachig; Polyglott +p4661 +sVhil +p4662 +VHiligaynon +p4663 +sVhin +p4664 +VHindi +p4665 +sVbas +p4666 +VBasa (Kamerun) +p4667 +sVgba +p4668 +VGbaya (Zentralafrikanische Republik) +p4669 +sVwln +p4670 +VWallonisch +p4671 +sVnep +p4672 +VNepali +p4673 +sVcre +p4674 +VCree +p4675 +sVban +p4676 +VBalinesisch +p4677 +sVbal +p4678 +VBelutschisch +p4679 +sVbam +p4680 +VBambara +p4681 +sVbak +p4682 +VBaschkirisch +p4683 +sVshn +p4684 +VSchan +p4685 +sVarp +p4686 +VArapaho +p4687 +sVarw +p4688 +VArawakisch +p4689 +sVara +p4690 +VArabisch +p4691 +sVarc +p4692 +VAramisch +p4693 +sVarg +p4694 +VAragonesisch +p4695 +sVsel +p4696 +VSelkupisch +p4697 +sVarn +p4698 +VMapudungun +p4699 +sVlus +p4700 +VLushai +p4701 +sVmus +p4702 +VMuskogee +p4703 +sVlua +p4704 +VLuba-Lulua +p4705 +sVlub +p4706 +VLuba-Katanga +p4707 +sVlug +p4708 +VGanda +p4709 +sVlui +p4710 +VLuiseno +p4711 +sVlun +p4712 +VLunda +p4713 +sVluo +p4714 +VLuo (Kenia und Tansania) +p4715 +sViku +p4716 +VInuktitut +p4717 +sVtur +p4718 +VTrkisch +p4719 +sVzbl +p4720 +VBliss-Symbole +p4721 +sVtuk +p4722 +VTurkmenisch +p4723 +sVtum +p4724 +VTumbuka +p4725 +sVcop +p4726 +VKoptisch +p4727 +sVcos +p4728 +VKorsisch +p4729 +sVcor +p4730 +VKornisch +p4731 +sVilo +p4732 +VIlokano +p4733 +sVgwi +p4734 +VKutchin +p4735 +sVund +p4736 +VUnbestimmbar +p4737 +sVtli +p4738 +VTlingit +p4739 +sVtlh +p4740 +VKlingonisch +p4741 +sVpor +p4742 +VPortugiesisch +p4743 +sVpon +p4744 +VPonapeanisch +p4745 +sVpol +p4746 +VPolnisch +p4747 +sVang +p4748 +VEnglisch; Alt (ca. 450-1100) +p4749 +sVtgk +p4750 +VTadschikisch +p4751 +sVtgl +p4752 +VTagalog +p4753 +sVfra +p4754 +VFranzsisch +p4755 +sVdum +p4756 +VNiederlndisch; Mittel (ca. 1050-1350) +p4757 +sVswa +p4758 +VSwahili (Makrosprache) +p4759 +sVdua +p4760 +VDuala +p4761 +sVfro +p4762 +VFranzsisch; Alt (842 - ca. 1400) +p4763 +sVyap +p4764 +VYapesisch +p4765 +sVfrm +p4766 +VFranzsisch; Mittel (ca. 1400 - 1600) +p4767 +sVfrs +p4768 +VFriesisch; Ost +p4769 +sVfrr +p4770 +VFriesisch; Nord +p4771 +sVyao +p4772 +VYao +p4773 +sVxal +p4774 +VKalmkisch +p4775 +sVfry +p4776 +VFriesisch; West +p4777 +sVgay +p4778 +VGayo +p4779 +sVota +p4780 +VOttomanisch (Osmanisch/Trkisch) (1500-1928) +p4781 +sVhmn +p4782 +VMiao-Sprachen +p4783 +sVhmo +p4784 +VHiri-Motu +p4785 +sVgaa +p4786 +VGa +p4787 +sVfur +p4788 +VFriaulisch +p4789 +sVmlg +p4790 +VMadegassisch +p4791 +sVslv +p4792 +VSlowenisch +p4793 +sVain +p4794 +VAinu-Sprache (Japan) +p4795 +sVfil +p4796 +VFilipino +p4797 +sVmlt +p4798 +VMaltesisch +p4799 +sVslk +p4800 +VSlowakisch +p4801 +sVrar +p4802 +VMaori; Cook-Inseln +p4803 +sVful +p4804 +VFul +p4805 +sVjpn +p4806 +VJapanisch +p4807 +sVvol +p4808 +VVolapk +p4809 +sVvot +p4810 +VWotisch +p4811 +sVind +p4812 +VIndonesisch +p4813 +sVave +p4814 +VAvestisch +p4815 +sVjpr +p4816 +VJdisch-Persisch +p4817 +sVava +p4818 +VAwarisch +p4819 +sVpap +p4820 +VPapiamento +p4821 +sVewo +p4822 +VEwondo +p4823 +sVpau +p4824 +VPalau +p4825 +sVewe +p4826 +VEwe-Sprache +p4827 +sVpag +p4828 +VPangasinan +p4829 +sVpal +p4830 +VMittelpersisch +p4831 +sVpam +p4832 +VPampanggan +p4833 +sVpan +p4834 +VPanjabi +p4835 +sVsyc +p4836 +VSyrisch; Klassisch +p4837 +sVphn +p4838 +VPhnikisch +p4839 +sVkir +p4840 +VKirgisisch +p4841 +sVnia +p4842 +VNias +p4843 +sVkik +p4844 +VKikuyu +p4845 +sVsyr +p4846 +VSyrisch +p4847 +sVkin +p4848 +VRwanda +p4849 +sVniu +p4850 +VNiue +p4851 +sVgsw +p4852 +VSchweizerdeutsch +p4853 +sVepo +p4854 +VEsperanto +p4855 +sVjbo +p4856 +VLojban +p4857 +sVmic +p4858 +VMikmak +p4859 +sVtha +p4860 +VThailndisch +p4861 +sVhai +p4862 +VHaida +p4863 +sVgmh +p4864 +VMittelhochdeutsch (ca. 1050-1500) +p4865 +sVell +p4866 +VNeugriechisch (ab 1453) +p4867 +sVady +p4868 +VAdygisch +p4869 +sVelx +p4870 +VElamisch +p4871 +sVada +p4872 +VAdangme-Sprache +p4873 +sVnav +p4874 +VNavajo +p4875 +sVhat +p4876 +VKreolisch; Haitisch +p4877 +sVhau +p4878 +VHaussa +p4879 +sVhaw +p4880 +VHawaiianisch +p4881 +sVbin +p4882 +VBini +p4883 +sVamh +p4884 +VAmharisch +p4885 +sVbik +p4886 +VBikol +p4887 +sVmos +p4888 +VMossi +p4889 +sVmoh +p4890 +VMohawk +p4891 +sVmon +p4892 +VMongolisch +p4893 +sVbho +p4894 +VBhojpuri +p4895 +sVbis +p4896 +VBislama +p4897 +sVtvl +p4898 +VElliceanisch +p4899 +sVest +p4900 +VEstnisch +p4901 +sVkmb +p4902 +VMbundu; Kimbundu +p4903 +sVpeo +p4904 +VPersisch; Alt (ca. 600-400 v.Chr.) +p4905 +sVumb +p4906 +VMbundu; Umbundu +p4907 +sVtmh +p4908 +VTamaseq +p4909 +sVfon +p4910 +VFon +p4911 +sVhsb +p4912 +VObersorbisch +p4913 +sVrun +p4914 +VRundi +p4915 +sVrus +p4916 +VRussisch +p4917 +sVrup +p4918 +VRumnisch; Mezedonisch +p4919 +sVpli +p4920 +VPali +p4921 +sVace +p4922 +VAceh-Sprache +p4923 +sVach +p4924 +VAcholi-Sprache +p4925 +sVnde +p4926 +VNdebele (Nord) +p4927 +sVdzo +p4928 +VDzongkha +p4929 +sVkru +p4930 +VKurukh +p4931 +sVsrr +p4932 +VSerer +p4933 +sVido +p4934 +VIdo +p4935 +sVsrp +p4936 +VSerbisch +p4937 +sVkrl +p4938 +VKarenisch +p4939 +sVkrc +p4940 +VKarachay-Balkar +p4941 +sVnds +p4942 +VPlattdeutsch +p4943 +sVzun +p4944 +VZuni +p4945 +sVzul +p4946 +VZulu +p4947 +sVtwi +p4948 +VTwi +p4949 +sVsog +p4950 +VSogdisch +p4951 +sVnso +p4952 +VSotho; Nord +p4953 +sVswe +p4954 +VSchwedisch +p4955 +sVsom +p4956 +VSomali +p4957 +sVsot +p4958 +VSotho (Sd) +p4959 +sVmkd +p4960 +VMakedonisch +p4961 +sVher +p4962 +VHerero +p4963 +sVlol +p4964 +VMongo +p4965 +sVheb +p4966 +VHebrisch +p4967 +sVloz +p4968 +VRotse +p4969 +sVgil +p4970 +VGilbertesisch +p4971 +sVwas +p4972 +VWasho +p4973 +sVwar +p4974 +VWaray (Philippinen) +p4975 +sVbul +p4976 +VBulgarisch +p4977 +sVwal +p4978 +VWolaytta +p4979 +sVbua +p4980 +VBurjatisch +p4981 +sVbug +p4982 +VBuginesisch +p4983 +sVaze +p4984 +VAserbaidschanisch +p4985 +sVzha +p4986 +VZhuang +p4987 +sVzho +p4988 +VChinesisch +p4989 +sVnno +p4990 +VNynorsk (Norwegen) +p4991 +sVuig +p4992 +VUigurisch +p4993 +sVmyv +p4994 +VErzya +p4995 +sVinh +p4996 +VInguschisch +p4997 +sVkhm +p4998 +VKhmer; Zentral +p4999 +sVkho +p5000 +VSakisch +p5001 +sVmya +p5002 +VBurmesisch +p5003 +sVkha +p5004 +VKhasi-Sprache +p5005 +sVina +p5006 +VInterlingua (Internationale Hilfssprachen-Vereinigung) +p5007 +sVtiv +p5008 +VTiv +p5009 +sVtir +p5010 +VTigrinja +p5011 +sVnap +p5012 +VNeapolitanisch +p5013 +sVgrb +p5014 +VGrebo +p5015 +sVgrc +p5016 +VAltgriechisch (bis 1453) +p5017 +sVnau +p5018 +VNauruanisch +p5019 +sVgrn +p5020 +VGuaran +p5021 +sVtig +p5022 +VTigre +p5023 +sVyor +p5024 +VJoruba +p5025 +sVile +p5026 +VInterlingue +p5027 +sVsqi +p5028 +VAlbanisch +p5029 +ssS'it' +p5030 +(dp5031 +Vroh +p5032 +VRomansh +p5033 +sVsco +p5034 +VScots +p5035 +sVscn +p5036 +VSiciliano +p5037 +sVrom +p5038 +VRomany +p5039 +sVron +p5040 +VRumeno +p5041 +sVoss +p5042 +VOssetian +p5043 +sVale +p5044 +VAleut +p5045 +sVmni +p5046 +VManipuri +p5047 +sVnwc +p5048 +VNewari antico +p5049 +sVosa +p5050 +VOsage +p5051 +sValt +p5052 +VAltai meridionale +p5053 +sVmnc +p5054 +VManchu +p5055 +sVmwr +p5056 +VMarwari +p5057 +sVven +p5058 +Vvenda +p5059 +sVuga +p5060 +VUgaritico +p5061 +sVmwl +p5062 +VMirandese +p5063 +sVfas +p5064 +VPersiano +p5065 +sVfat +p5066 +VFanti +p5067 +sVfan +p5068 +VFang (Guinea equatoriale) +p5069 +sVfao +p5070 +VFaroese +p5071 +sVdin +p5072 +VDinca +p5073 +sVhye +p5074 +Varmeno +p5075 +sVbla +p5076 +VSiksika +p5077 +sVsrd +p5078 +VSardo +p5079 +sVcar +p5080 +VCarib (Galibi) +p5081 +sVdiv +p5082 +VDhivehi +p5083 +sVtel +p5084 +VTelugu +p5085 +sVtem +p5086 +VTemne +p5087 +sVnbl +p5088 +VNdebele del Sud +p5089 +sVter +p5090 +VTereno +p5091 +sVtet +p5092 +VTetum +p5093 +sVsun +p5094 +VSundanese +p5095 +sVkut +p5096 +Vkutenai +p5097 +sVsuk +p5098 +Vsukuma +p5099 +sVkur +p5100 +VCurdo +p5101 +sVkum +p5102 +Vkumyk +p5103 +sVsus +p5104 +VSusu +p5105 +sVnew +p5106 +VBhasa; Nepal +p5107 +sVkua +p5108 +VKuanyama +p5109 +sVsux +p5110 +VSumero +p5111 +sVmen +p5112 +VMende (Sierra Leone) +p5113 +sVlez +p5114 +VLezghian +p5115 +sVgla +p5116 +VGaelico (Scozzese) +p5117 +sVbos +p5118 +VBosniaco +p5119 +sVgle +p5120 +VGaelico +p5121 +sVeka +p5122 +VEkajuk +p5123 +sVglg +p5124 +VGaliziano +p5125 +sVakk +p5126 +VAccadico +p5127 +sVaka +p5128 +VAkan +p5129 +sVbod +p5130 +VTibetano +p5131 +sVglv +p5132 +VManx +p5133 +sVjrb +p5134 +VGiudeo-arabo +p5135 +sVvie +p5136 +VVietnamita +p5137 +sVipk +p5138 +VInupiaq +p5139 +sVuzb +p5140 +VUsbeco +p5141 +sVsga +p5142 +VIrlandese antico (fino al \u2019900) +p5143 +sVbre +p5144 +VBretone +p5145 +sVbra +p5146 +Vbraj +p5147 +sVaym +p5148 +VAymara +p5149 +sVcha +p5150 +VChamorro +p5151 +sVchb +p5152 +VChibcha +p5153 +sVche +p5154 +VChechen +p5155 +sVchg +p5156 +VCiagataico +p5157 +sVchk +p5158 +VChuukese +p5159 +sVchm +p5160 +VMari (Russia) +p5161 +sVchn +p5162 +VChinook jargon +p5163 +sVcho +p5164 +VChoctaw +p5165 +sVchp +p5166 +VChipewyan +p5167 +sVchr +p5168 +VCherokee +p5169 +sVchu +p5170 +VSlavo antico +p5171 +sVchv +p5172 +VChuvash +p5173 +sVchy +p5174 +VCheyenne +p5175 +sVmsa +p5176 +VMalay (macrolingua) +p5177 +sViii +p5178 +VYi; Sichuan +p5179 +sVndo +p5180 +VNdonga +p5181 +sVibo +p5182 +VIgbo +p5183 +sViba +p5184 +VIban +p5185 +sVxho +p5186 +VXhosa +p5187 +sVdeu +p5188 +VTedesco +p5189 +sVcat +p5190 +VCatalano +p5191 +sVdel +p5192 +Vdelaware +p5193 +sVden +p5194 +VSlave (Athapascan) +p5195 +sVcad +p5196 +Vcaddo +p5197 +sVtat +p5198 +VTatarico +p5199 +sVsrn +p5200 +VSranan Tongo +p5201 +sVraj +p5202 +Vrajasthani +p5203 +sVtam +p5204 +VTamil +p5205 +sVspa +p5206 +VSpagnolo +p5207 +sVtah +p5208 +VTahitian +p5209 +sVafh +p5210 +VAfrihili +p5211 +sVeng +p5212 +VInglese +p5213 +sVenm +p5214 +VInglese medio (1100-1500) +p5215 +sVcsb +p5216 +Vkashubian +p5217 +sVnyn +p5218 +VNyankole +p5219 +sVnyo +p5220 +VNyoro +p5221 +sVsid +p5222 +VSidamo +p5223 +sVnya +p5224 +VNyanja +p5225 +sVsin +p5226 +VSinhala +p5227 +sVafr +p5228 +VAfrikaans +p5229 +sVlam +p5230 +VLamba +p5231 +sVsnd +p5232 +VSindhi +p5233 +sVmar +p5234 +VMarathi +p5235 +sVlah +p5236 +Vlahnda +p5237 +sVnym +p5238 +VNyamwezi +p5239 +sVsna +p5240 +VShona +p5241 +sVlad +p5242 +VLadino +p5243 +sVsnk +p5244 +VSoninke +p5245 +sVmad +p5246 +VMadurese +p5247 +sVmag +p5248 +VMagahi +p5249 +sVmai +p5250 +VMaithili +p5251 +sVmah +p5252 +VMarshallese +p5253 +sVlav +p5254 +VLettone +p5255 +sVmal +p5256 +VMalayalam +p5257 +sVman +p5258 +VMandingo +p5259 +sVegy +p5260 +VEgiziano antico +p5261 +sVzen +p5262 +VZenaga +p5263 +sVkbd +p5264 +VKabardia +p5265 +sVita +p5266 +VItaliano +p5267 +sVvai +p5268 +VVai +p5269 +sVtsn +p5270 +VTswana +p5271 +sVtso +p5272 +VTsonga +p5273 +sVtsi +p5274 +VTsimshian +p5275 +sVbyn +p5276 +VBilin +p5277 +sVfij +p5278 +VFigiano +p5279 +sVfin +p5280 +VFinlandese +p5281 +sVeus +p5282 +VBasco +p5283 +sVnon +p5284 +VNorse antico +p5285 +sVceb +p5286 +VCebuano +p5287 +sVdan +p5288 +VDanese +p5289 +sVnog +p5290 +VNogai +p5291 +sVnob +p5292 +VNorvegese bokml +p5293 +sVdak +p5294 +VDakota +p5295 +sVces +p5296 +VCeco +p5297 +sVdar +p5298 +VDargwa +p5299 +sVnor +p5300 +VNorvegese +p5301 +sVkpe +p5302 +VKpelle +p5303 +sVguj +p5304 +VGujarati +p5305 +sVmdf +p5306 +VMoksha +p5307 +sVmas +p5308 +VMasai +p5309 +sVlao +p5310 +VLao +p5311 +sVmdr +p5312 +VMandar +p5313 +sVgon +p5314 +VGondi +p5315 +sVgoh +p5316 +VTedesco antico alto (ca. 750-1050) +p5317 +sVsms +p5318 +VSami; Skolt +p5319 +sVsmo +p5320 +VSamoano +p5321 +sVsmn +p5322 +VSami; Inari +p5323 +sVsmj +p5324 +Vsami lule +p5325 +sVgot +p5326 +VGotico +p5327 +sVsme +p5328 +VSami settentrionale +p5329 +sVdsb +p5330 +VLusaziano inferiore +p5331 +sVsma +p5332 +VSami meridionale +p5333 +sVgor +p5334 +VGorontalo +p5335 +sVast +p5336 +VAsturiano +p5337 +sVorm +p5338 +VOromo +p5339 +sVque +p5340 +VQuechua +p5341 +sVori +p5342 +VOriya +p5343 +sVcrh +p5344 +VTurco; Crimeo +p5345 +sVasm +p5346 +VAssamese +p5347 +sVpus +p5348 +VPushto +p5349 +sVdgr +p5350 +VDogrib +p5351 +sVltz +p5352 +VLussemburghese +p5353 +sVgez +p5354 +VGeez +p5355 +sVisl +p5356 +VIslandese +p5357 +sVlat +p5358 +VLatino +p5359 +sVmak +p5360 +VMakasar +p5361 +sVzap +p5362 +VZapoteco +p5363 +sVyid +p5364 +VYiddish +p5365 +sVkok +p5366 +VKonkani (macrolinguaggio) +p5367 +sVkom +p5368 +VKomi +p5369 +sVkon +p5370 +VKongo +p5371 +sVukr +p5372 +VUcraino +p5373 +sVton +p5374 +VTonga (Isole Tonga) +p5375 +sVzxx +p5376 +VNessun contenuto linguistico +p5377 +sVkos +p5378 +VKosraean +p5379 +sVkor +p5380 +VCoreano +p5381 +sVtog +p5382 +VTonga (Nyasa) +p5383 +sVhun +p5384 +VUngherese +p5385 +sVhup +p5386 +VHupa +p5387 +sVcym +p5388 +VGallese +p5389 +sVudm +p5390 +VUdmurt +p5391 +sVbej +p5392 +VBeja +p5393 +sVben +p5394 +VBengalese +p5395 +sVbel +p5396 +VBielorusso +p5397 +sVbem +p5398 +VBemba (Zambia) +p5399 +sVaar +p5400 +VAfar +p5401 +sVnzi +p5402 +VNzima +p5403 +sVsah +p5404 +VYakut +p5405 +sVsan +p5406 +VSanscrito +p5407 +sVsam +p5408 +VAramaico samaritano +p5409 +sVpro +p5410 +VProvenal antico (fino al 1500) +p5411 +sVsag +p5412 +VSango +p5413 +sVsad +p5414 +VSandawe +p5415 +sVanp +p5416 +VAngika +p5417 +sVrap +p5418 +VRapanui +p5419 +sVsas +p5420 +VSasak +p5421 +sVnqo +p5422 +VN'Ko +p5423 +sVsat +p5424 +VSantali +p5425 +sVmin +p5426 +VMinangkabau +p5427 +sVlim +p5428 +VLimburgan +p5429 +sVlin +p5430 +VLingala +p5431 +sVlit +p5432 +VLituano +p5433 +sVefi +p5434 +VEfik +p5435 +sVmis +p5436 +VLingue non codificate +p5437 +sVkac +p5438 +VKachin +p5439 +sVkab +p5440 +VKabyle +p5441 +sVkaa +p5442 +VKara-Kalpak +p5443 +sVkan +p5444 +Vkannada +p5445 +sVkam +p5446 +VKamba (Kenya) +p5447 +sVkal +p5448 +VKalaallisut +p5449 +sVkas +p5450 +Vkashmiri +p5451 +sVkaw +p5452 +VKawi +p5453 +sVkau +p5454 +VKanuri +p5455 +sVkat +p5456 +VGeorgiano +p5457 +sVkaz +p5458 +VKazako +p5459 +sVtyv +p5460 +VTuvinian +p5461 +sVawa +p5462 +VAwadhi +p5463 +sVurd +p5464 +VUrdu +p5465 +sVdoi +p5466 +VDogri (macrolingua) +p5467 +sVtpi +p5468 +VTok pisin +p5469 +sVmri +p5470 +VMaori +p5471 +sVabk +p5472 +VAbkhazian +p5473 +sVtkl +p5474 +VTokelau +p5475 +sVnld +p5476 +VOlandese +p5477 +sVoji +p5478 +VOjibwa +p5479 +sVoci +p5480 +VOccitan (post 1500) +p5481 +sVwol +p5482 +VWolof +p5483 +sVjav +p5484 +VJavanese +p5485 +sVhrv +p5486 +VCroato +p5487 +sVzza +p5488 +VZaza +p5489 +sVmga +p5490 +VIrlandese medio (900-1200) +p5491 +sVhit +p5492 +Vhittite +p5493 +sVdyu +p5494 +VDiula +p5495 +sVssw +p5496 +VSwati +p5497 +sVmul +p5498 +VLingue multiple +p5499 +sVhil +p5500 +VHiligayna +p5501 +sVhin +p5502 +VHindi +p5503 +sVbas +p5504 +VBasa (Cameru) +p5505 +sVgba +p5506 +VGbaya (Repubblica centro africana) +p5507 +sVwln +p5508 +VWalloon +p5509 +sVnep +p5510 +VNepali +p5511 +sVcre +p5512 +VCree +p5513 +sVban +p5514 +VBalinese +p5515 +sVbal +p5516 +VBaluchi +p5517 +sVbam +p5518 +VBambara +p5519 +sVbak +p5520 +VBashkir +p5521 +sVshn +p5522 +VShan +p5523 +sVarp +p5524 +VArapaho +p5525 +sVarw +p5526 +VArawak +p5527 +sVara +p5528 +VArabo +p5529 +sVarc +p5530 +VAramaico ufficiale (700-300 p.e.v.) +p5531 +sVarg +p5532 +VAragonese +p5533 +sVsel +p5534 +VSelkup +p5535 +sVarn +p5536 +VMapudungun +p5537 +sVlus +p5538 +VLushai +p5539 +sVmus +p5540 +VCreek +p5541 +sVlua +p5542 +VLuba-lulua +p5543 +sVlub +p5544 +VLuba-katanga +p5545 +sVlug +p5546 +VGanda +p5547 +sVlui +p5548 +VLuiseno +p5549 +sVlun +p5550 +VLunda +p5551 +sVluo +p5552 +VLuo (Kenya e Tanzania) +p5553 +sViku +p5554 +Vinuktitut +p5555 +sVtur +p5556 +VTurco +p5557 +sVzbl +p5558 +VBlissymbols +p5559 +sVtuk +p5560 +VTurkmeno +p5561 +sVtum +p5562 +VTumbuka +p5563 +sVcop +p5564 +VCopto +p5565 +sVcos +p5566 +VCorso +p5567 +sVcor +p5568 +VCornish +p5569 +sVilo +p5570 +VIlocano +p5571 +sVgwi +p5572 +VGwich\u02bcin +p5573 +sVund +p5574 +VNon determinato +p5575 +sVtli +p5576 +VTlingit +p5577 +sVtlh +p5578 +VKlingon +p5579 +sVpor +p5580 +VPortoghese +p5581 +sVpon +p5582 +VPohnpeian +p5583 +sVpol +p5584 +VPolacco +p5585 +sVang +p5586 +VInglese antico (ca. 450-1100) +p5587 +sVtgk +p5588 +VTajik +p5589 +sVtgl +p5590 +VTagalog +p5591 +sVfra +p5592 +VFrancese +p5593 +sVdum +p5594 +VOlandese medio (ca. 1050-1350) +p5595 +sVswa +p5596 +VSwahili (macro-lingua) +p5597 +sVdua +p5598 +VDuala +p5599 +sVfro +p5600 +VFrancese antico (842-ca. 1400) +p5601 +sVyap +p5602 +VYapese +p5603 +sVfrm +p5604 +VFrancese medio (ca. 1400-1600) +p5605 +sVfrs +p5606 +VFrisone orientale +p5607 +sVfrr +p5608 +VFrisone settentrionale +p5609 +sVyao +p5610 +VYao +p5611 +sVxal +p5612 +VKalmyk +p5613 +sVfry +p5614 +VFrisone occidentale +p5615 +sVgay +p5616 +Vgayo +p5617 +sVota +p5618 +VTurco ottomano (1500-1928) +p5619 +sVhmn +p5620 +VHmong +p5621 +sVhmo +p5622 +VHiri motu +p5623 +sVgaa +p5624 +Vga +p5625 +sVfur +p5626 +VFriulano +p5627 +sVmlg +p5628 +Vmalagasy +p5629 +sVslv +p5630 +VSloveno +p5631 +sVain +p5632 +VAinu (Giappone) +p5633 +sVfil +p5634 +VFilippino +p5635 +sVmlt +p5636 +VMaltese +p5637 +sVslk +p5638 +VSlovacco +p5639 +sVrar +p5640 +VMaori (Isole Cook) +p5641 +sVful +p5642 +VFulah +p5643 +sVjpn +p5644 +VGiapponese +p5645 +sVvol +p5646 +VVolapk +p5647 +sVvot +p5648 +VVotic +p5649 +sVind +p5650 +VIndonesiano +p5651 +sVave +p5652 +VAvestano +p5653 +sVjpr +p5654 +VGiudeo-persiano +p5655 +sVava +p5656 +VAvarico +p5657 +sVpap +p5658 +VPapiamento +p5659 +sVewo +p5660 +VEwondo +p5661 +sVpau +p5662 +VPalauan +p5663 +sVewe +p5664 +VEwe +p5665 +sVpag +p5666 +VPangasinan +p5667 +sVpal +p5668 +VPahlavi +p5669 +sVpam +p5670 +Vpampanga +p5671 +sVpan +p5672 +VPanjabi +p5673 +sVsyc +p5674 +VSiriaco classico +p5675 +sVphn +p5676 +VFenicio +p5677 +sVkir +p5678 +VKirghiso +p5679 +sVnia +p5680 +VNias +p5681 +sVkik +p5682 +VKikuyu +p5683 +sVsyr +p5684 +VSiriaco +p5685 +sVkin +p5686 +VKinyarwanda +p5687 +sVniu +p5688 +VNiuean +p5689 +sVgsw +p5690 +VTedesco (Svizzera) +p5691 +sVepo +p5692 +VEsperanto +p5693 +sVjbo +p5694 +Vlojban +p5695 +sVmic +p5696 +VMi'kmaq +p5697 +sVtha +p5698 +VThailandese +p5699 +sVhai +p5700 +VHaida +p5701 +sVgmh +p5702 +VTedesco medio alto (ca. 1050-1500) +p5703 +sVell +p5704 +VGreco moderno (1453-) +p5705 +sVady +p5706 +VAdyghe +p5707 +sVelx +p5708 +VElamitico +p5709 +sVada +p5710 +VAdangme +p5711 +sVnav +p5712 +VNavajo +p5713 +sVhat +p5714 +VCreolo (Haitiano) +p5715 +sVhau +p5716 +VHausa +p5717 +sVhaw +p5718 +Vhawaiano +p5719 +sVbin +p5720 +VBini +p5721 +sVamh +p5722 +VAmarico +p5723 +sVbik +p5724 +Vbicol +p5725 +sVmos +p5726 +VMossi +p5727 +sVmoh +p5728 +Vmohawk +p5729 +sVmon +p5730 +VMongolo +p5731 +sVbho +p5732 +VBhojpuri +p5733 +sVbis +p5734 +Vbislama +p5735 +sVtvl +p5736 +VTuvalu +p5737 +sVest +p5738 +VEstone +p5739 +sVkmb +p5740 +VKimbundu +p5741 +sVpeo +p5742 +VPersiano antico (ca. 600-400 A.C.) +p5743 +sVumb +p5744 +VUmbundu +p5745 +sVtmh +p5746 +VTamashek +p5747 +sVfon +p5748 +VFon +p5749 +sVhsb +p5750 +VLusaziano superiore +p5751 +sVrun +p5752 +VRundi +p5753 +sVrus +p5754 +VRusso +p5755 +sVrup +p5756 +VRumeno macedone +p5757 +sVpli +p5758 +VPali +p5759 +sVace +p5760 +VAchinese +p5761 +sVach +p5762 +VAcoli +p5763 +sVnde +p5764 +VNdebele del Nord +p5765 +sVdzo +p5766 +VDzongkha +p5767 +sVkru +p5768 +VKurukh +p5769 +sVsrr +p5770 +VSerer +p5771 +sVido +p5772 +VIdo +p5773 +sVsrp +p5774 +VSerbo +p5775 +sVkrl +p5776 +VKarelian +p5777 +sVkrc +p5778 +Vkarachay-Balkar +p5779 +sVnds +p5780 +VTedesco; Volgare +p5781 +sVzun +p5782 +VZuni +p5783 +sVzul +p5784 +VZulu +p5785 +sVtwi +p5786 +VTwi +p5787 +sVsog +p5788 +VSogdian +p5789 +sVnso +p5790 +VSotho settentrionale +p5791 +sVswe +p5792 +VSvedese +p5793 +sVsom +p5794 +VSomali +p5795 +sVsot +p5796 +VSotho meridionale +p5797 +sVmkd +p5798 +VMacedone +p5799 +sVher +p5800 +VHerero +p5801 +sVlol +p5802 +VMongo +p5803 +sVheb +p5804 +VEbraico +p5805 +sVloz +p5806 +Vlozi +p5807 +sVgil +p5808 +VGilbertese +p5809 +sVwas +p5810 +VWasho +p5811 +sVwar +p5812 +VWaray (Filippine) +p5813 +sVbul +p5814 +VBulgaro +p5815 +sVwal +p5816 +VWolaytta +p5817 +sVbua +p5818 +VBuriat +p5819 +sVbug +p5820 +VBuginese +p5821 +sVaze +p5822 +VAzerbaijano +p5823 +sVzha +p5824 +VZhuang +p5825 +sVzho +p5826 +VCinese +p5827 +sVnno +p5828 +VNorvegese nynorsk +p5829 +sVuig +p5830 +VUighuro +p5831 +sVmyv +p5832 +VErzya +p5833 +sVinh +p5834 +VIngush +p5835 +sVkhm +p5836 +VKhmer centrale +p5837 +sVkho +p5838 +VKhotanese +p5839 +sVmya +p5840 +VBurmese +p5841 +sVkha +p5842 +VKhasi +p5843 +sVina +p5844 +VInterlingua (International Auxiliary Language Association) +p5845 +sVtiv +p5846 +VTiv +p5847 +sVtir +p5848 +VTigrinya +p5849 +sVnap +p5850 +VNapoletano +p5851 +sVgrb +p5852 +VGrebo +p5853 +sVgrc +p5854 +VGreco antico (fino al 1453) +p5855 +sVnau +p5856 +VNauru +p5857 +sVgrn +p5858 +VGuarani +p5859 +sVtig +p5860 +VTigre +p5861 +sVyor +p5862 +VYoruba +p5863 +sVile +p5864 +VInterlingua +p5865 +sVsqi +p5866 +VAlbanese +p5867 +ssS'km' +p5868 +(dp5869 +Vroh +p5870 +VRomansh +p5871 +sVsco +p5872 +VScots +p5873 +sVscn +p5874 +VSicilian +p5875 +sVrom +p5876 +VRomany +p5877 +sVron +p5878 +VRomanian +p5879 +sVoss +p5880 +VOssetian +p5881 +sVale +p5882 +VAleut +p5883 +sVmni +p5884 +VManipuri +p5885 +sVnwc +p5886 +VNewari; Old +p5887 +sVosa +p5888 +VOsage +p5889 +sValt +p5890 +VAltai; Southern +p5891 +sVmnc +p5892 +VManchu +p5893 +sVmwr +p5894 +VMarwari +p5895 +sVven +p5896 +VVenda +p5897 +sVuga +p5898 +VUgaritic +p5899 +sVmwl +p5900 +VMirandese +p5901 +sVfas +p5902 +VPersian +p5903 +sVfat +p5904 +VFanti +p5905 +sVfan +p5906 +VFang (Equatorial Guinea) +p5907 +sVfao +p5908 +VFaroese +p5909 +sVdin +p5910 +VDinka +p5911 +sVhye +p5912 +VArmenian +p5913 +sVbla +p5914 +VSiksika +p5915 +sVsrd +p5916 +VSardinian +p5917 +sVcar +p5918 +VCarib; Galibi +p5919 +sVdiv +p5920 +VDhivehi +p5921 +sVtel +p5922 +VTelugu +p5923 +sVtem +p5924 +VTimne +p5925 +sVnbl +p5926 +VNdebele; South +p5927 +sVter +p5928 +VTereno +p5929 +sVtet +p5930 +VTetum +p5931 +sVsun +p5932 +VSundanese +p5933 +sVkut +p5934 +VKutenai +p5935 +sVsuk +p5936 +VSukuma +p5937 +sVkur +p5938 +VKurdish +p5939 +sVkum +p5940 +VKumyk +p5941 +sVsus +p5942 +VSusu +p5943 +sVnew +p5944 +VBhasa; Nepal +p5945 +sVkua +p5946 +VKuanyama +p5947 +sVsux +p5948 +VSumerian +p5949 +sVmen +p5950 +VMende (Sierra Leone) +p5951 +sVlez +p5952 +VLezghian +p5953 +sVgla +p5954 +VGaelic; Scottish +p5955 +sVbos +p5956 +VBosnian +p5957 +sVgle +p5958 +VIrish +p5959 +sVeka +p5960 +VEkajuk +p5961 +sVglg +p5962 +VGalician +p5963 +sVakk +p5964 +VAkkadian +p5965 +sVaka +p5966 +VAkan +p5967 +sVbod +p5968 +VTibetan +p5969 +sVglv +p5970 +VManx +p5971 +sVjrb +p5972 +VJudeo-Arabic +p5973 +sVvie +p5974 +VVietnamese +p5975 +sVipk +p5976 +VInupiaq +p5977 +sVuzb +p5978 +VUzbek +p5979 +sVsga +p5980 +VIrish; Old (to 900) +p5981 +sVbre +p5982 +VBreton +p5983 +sVbra +p5984 +VBraj +p5985 +sVaym +p5986 +VAymara +p5987 +sVcha +p5988 +VChamorro +p5989 +sVchb +p5990 +VChibcha +p5991 +sVche +p5992 +VChechen +p5993 +sVchg +p5994 +VChagatai +p5995 +sVchk +p5996 +VChuukese +p5997 +sVchm +p5998 +VMari (Russia) +p5999 +sVchn +p6000 +VChinook jargon +p6001 +sVcho +p6002 +VChoctaw +p6003 +sVchp +p6004 +VChipewyan +p6005 +sVchr +p6006 +VCherokee +p6007 +sVchu +p6008 +VSlavonic; Old +p6009 +sVchv +p6010 +VChuvash +p6011 +sVchy +p6012 +VCheyenne +p6013 +sVmsa +p6014 +VMalay (macrolanguage) +p6015 +sViii +p6016 +VYi; Sichuan +p6017 +sVndo +p6018 +VNdonga +p6019 +sVibo +p6020 +VIgbo +p6021 +sViba +p6022 +VIban +p6023 +sVxho +p6024 +VXhosa +p6025 +sVdeu +p6026 +VGerman +p6027 +sVcat +p6028 +VCatalan +p6029 +sVdel +p6030 +VDelaware +p6031 +sVden +p6032 +VSlave (Athapascan) +p6033 +sVcad +p6034 +VCaddo +p6035 +sVtat +p6036 +VTatar +p6037 +sVsrn +p6038 +VSranan Tongo +p6039 +sVraj +p6040 +VRajasthani +p6041 +sVtam +p6042 +VTamil +p6043 +sVspa +p6044 +VSpanish +p6045 +sVtah +p6046 +VTahitian +p6047 +sVafh +p6048 +VAfrihili +p6049 +sVeng +p6050 +VEnglish +p6051 +sVenm +p6052 +VEnglish; Middle (1100-1500) +p6053 +sVcsb +p6054 +VKashubian +p6055 +sVnyn +p6056 +VNyankole +p6057 +sVnyo +p6058 +VNyoro +p6059 +sVsid +p6060 +VSidamo +p6061 +sVnya +p6062 +VNyanja +p6063 +sVsin +p6064 +VSinhala +p6065 +sVafr +p6066 +VAfrikaans +p6067 +sVlam +p6068 +VLamba +p6069 +sVsnd +p6070 +VSindhi +p6071 +sVmar +p6072 +VMarathi +p6073 +sVlah +p6074 +VLahnda +p6075 +sVnym +p6076 +VNyamwezi +p6077 +sVsna +p6078 +VShona +p6079 +sVlad +p6080 +VLadino +p6081 +sVsnk +p6082 +VSoninke +p6083 +sVmad +p6084 +VMadurese +p6085 +sVmag +p6086 +VMagahi +p6087 +sVmai +p6088 +VMaithili +p6089 +sVmah +p6090 +VMarshallese +p6091 +sVlav +p6092 +VLatvian +p6093 +sVmal +p6094 +VMalayalam +p6095 +sVman +p6096 +VMandingo +p6097 +sVegy +p6098 +VEgyptian (Ancient) +p6099 +sVzen +p6100 +VZenaga +p6101 +sVkbd +p6102 +VKabardian +p6103 +sVita +p6104 +VItalian +p6105 +sVvai +p6106 +VVai +p6107 +sVtsn +p6108 +VTswana +p6109 +sVtso +p6110 +VTsonga +p6111 +sVtsi +p6112 +VTsimshian +p6113 +sVbyn +p6114 +VBilin +p6115 +sVfij +p6116 +VFijian +p6117 +sVfin +p6118 +VFinnish +p6119 +sVeus +p6120 +VBasque +p6121 +sVnon +p6122 +VNorse; Old +p6123 +sVceb +p6124 +VCebuano +p6125 +sVdan +p6126 +VDanish +p6127 +sVnog +p6128 +VNogai +p6129 +sVnob +p6130 +VNorwegian Bokml +p6131 +sVdak +p6132 +VDakota +p6133 +sVces +p6134 +VCzech +p6135 +sVdar +p6136 +VDargwa +p6137 +sVnor +p6138 +VNorwegian +p6139 +sVkpe +p6140 +VKpelle +p6141 +sVguj +p6142 +VGujarati +p6143 +sVmdf +p6144 +VMoksha +p6145 +sVmas +p6146 +VMasai +p6147 +sVlao +p6148 +VLao +p6149 +sVmdr +p6150 +VMandar +p6151 +sVgon +p6152 +VGondi +p6153 +sVgoh +p6154 +VGerman; Old High (ca. 750-1050) +p6155 +sVsms +p6156 +VSami; Skolt +p6157 +sVsmo +p6158 +VSamoan +p6159 +sVsmn +p6160 +VSami; Inari +p6161 +sVsmj +p6162 +VLule Sami +p6163 +sVgot +p6164 +VGothic +p6165 +sVsme +p6166 +VSami; Northern +p6167 +sVdsb +p6168 +VSorbian; Lower +p6169 +sVsma +p6170 +VSami; Southern +p6171 +sVgor +p6172 +VGorontalo +p6173 +sVast +p6174 +VAsturian +p6175 +sVorm +p6176 +VOromo +p6177 +sVque +p6178 +VQuechua +p6179 +sVori +p6180 +VOriya +p6181 +sVcrh +p6182 +VTurkish; Crimean +p6183 +sVasm +p6184 +VAssamese +p6185 +sVpus +p6186 +VPushto +p6187 +sVdgr +p6188 +VDogrib +p6189 +sVltz +p6190 +VLuxembourgish +p6191 +sVgez +p6192 +VGeez +p6193 +sVisl +p6194 +VIcelandic +p6195 +sVlat +p6196 +VLatin +p6197 +sVmak +p6198 +VMakasar +p6199 +sVzap +p6200 +VZapotec +p6201 +sVyid +p6202 +VYiddish +p6203 +sVkok +p6204 +VKonkani (macrolanguage) +p6205 +sVkom +p6206 +VKomi +p6207 +sVkon +p6208 +VKongo +p6209 +sVukr +p6210 +VUkrainian +p6211 +sVton +p6212 +VTonga (Tonga Islands) +p6213 +sVzxx +p6214 +VNo linguistic content +p6215 +sVkos +p6216 +VKosraean +p6217 +sVkor +p6218 +VKorean +p6219 +sVtog +p6220 +VTonga (Nyasa) +p6221 +sVhun +p6222 +VHungarian +p6223 +sVhup +p6224 +VHupa +p6225 +sVcym +p6226 +VWelsh +p6227 +sVudm +p6228 +VUdmurt +p6229 +sVbej +p6230 +VBeja +p6231 +sVben +p6232 +VBengali +p6233 +sVbel +p6234 +VBelarusian +p6235 +sVbem +p6236 +VBemba (Zambia) +p6237 +sVaar +p6238 +VAfar +p6239 +sVnzi +p6240 +VNzima +p6241 +sVsah +p6242 +VYakut +p6243 +sVsan +p6244 +VSanskrit +p6245 +sVsam +p6246 +VAramaic; Samaritan +p6247 +sVpro +p6248 +VProvenal; Old (to 1500) +p6249 +sVsag +p6250 +VSango +p6251 +sVsad +p6252 +VSandawe +p6253 +sVanp +p6254 +VAngika +p6255 +sVrap +p6256 +VRapanui +p6257 +sVsas +p6258 +VSasak +p6259 +sVnqo +p6260 +VN'Ko +p6261 +sVsat +p6262 +VSantali +p6263 +sVmin +p6264 +VMinangkabau +p6265 +sVlim +p6266 +VLimburgan +p6267 +sVlin +p6268 +VLingala +p6269 +sVlit +p6270 +VLithuanian +p6271 +sVefi +p6272 +VEfik +p6273 +sVmis +p6274 +VUncoded languages +p6275 +sVkac +p6276 +VKachin +p6277 +sVkab +p6278 +VKabyle +p6279 +sVkaa +p6280 +VKara-Kalpak +p6281 +sVkan +p6282 +VKannada +p6283 +sVkam +p6284 +VKamba (Kenya) +p6285 +sVkal +p6286 +VKalaallisut +p6287 +sVkas +p6288 +VKashmiri +p6289 +sVkaw +p6290 +VKawi +p6291 +sVkau +p6292 +VKanuri +p6293 +sVkat +p6294 +VGeorgian +p6295 +sVkaz +p6296 +VKazakh +p6297 +sVtyv +p6298 +VTuvinian +p6299 +sVawa +p6300 +VAwadhi +p6301 +sVurd +p6302 +VUrdu +p6303 +sVdoi +p6304 +VDogri (macrolanguage) +p6305 +sVtpi +p6306 +VTok Pisin +p6307 +sVmri +p6308 +VMaori +p6309 +sVabk +p6310 +VAbkhazian +p6311 +sVtkl +p6312 +VTokelau +p6313 +sVnld +p6314 +VDutch +p6315 +sVoji +p6316 +VOjibwa +p6317 +sVoci +p6318 +VOccitan (post 1500) +p6319 +sVwol +p6320 +VWolof +p6321 +sVjav +p6322 +VJavanese +p6323 +sVhrv +p6324 +VCroatian +p6325 +sVzza +p6326 +VZaza +p6327 +sVmga +p6328 +VIrish; Middle (900-1200) +p6329 +sVhit +p6330 +VHittite +p6331 +sVdyu +p6332 +VDyula +p6333 +sVssw +p6334 +VSwati +p6335 +sVmul +p6336 +VMultiple languages +p6337 +sVhil +p6338 +VHiligaynon +p6339 +sVhin +p6340 +VHindi +p6341 +sVbas +p6342 +VBasa (Cameroon) +p6343 +sVgba +p6344 +VGbaya (Central African Republic) +p6345 +sVwln +p6346 +VWalloon +p6347 +sVnep +p6348 +VNepali +p6349 +sVcre +p6350 +VCree +p6351 +sVban +p6352 +VBalinese +p6353 +sVbal +p6354 +VBaluchi +p6355 +sVbam +p6356 +VBambara +p6357 +sVbak +p6358 +VBashkir +p6359 +sVshn +p6360 +VShan +p6361 +sVarp +p6362 +VArapaho +p6363 +sVarw +p6364 +VArawak +p6365 +sVara +p6366 +VArabic +p6367 +sVarc +p6368 +VAramaic; Official (700-300 BCE) +p6369 +sVarg +p6370 +VAragonese +p6371 +sVsel +p6372 +VSelkup +p6373 +sVarn +p6374 +VMapudungun +p6375 +sVlus +p6376 +VLushai +p6377 +sVmus +p6378 +VCreek +p6379 +sVlua +p6380 +VLuba-Lulua +p6381 +sVlub +p6382 +VLuba-Katanga +p6383 +sVlug +p6384 +VGanda +p6385 +sVlui +p6386 +VLuiseno +p6387 +sVlun +p6388 +VLunda +p6389 +sVluo +p6390 +VLuo (Kenya and Tanzania) +p6391 +sViku +p6392 +VInuktitut +p6393 +sVtur +p6394 +VTurkish +p6395 +sVzbl +p6396 +VBlissymbols +p6397 +sVtuk +p6398 +VTurkmen +p6399 +sVtum +p6400 +VTumbuka +p6401 +sVcop +p6402 +VCoptic +p6403 +sVcos +p6404 +VCorsican +p6405 +sVcor +p6406 +VCornish +p6407 +sVilo +p6408 +VIloko +p6409 +sVgwi +p6410 +VGwich\u02bcin +p6411 +sVund +p6412 +VUndetermined +p6413 +sVtli +p6414 +VTlingit +p6415 +sVtlh +p6416 +VKlingon +p6417 +sVpor +p6418 +VPortuguese +p6419 +sVpon +p6420 +VPohnpeian +p6421 +sVpol +p6422 +VPolish +p6423 +sVang +p6424 +VEnglish; Old (ca. 450-1100) +p6425 +sVtgk +p6426 +VTajik +p6427 +sVtgl +p6428 +VTagalog +p6429 +sVfra +p6430 +VFrench +p6431 +sVdum +p6432 +VDutch; Middle (ca. 1050-1350) +p6433 +sVswa +p6434 +VSwahili (macrolanguage) +p6435 +sVdua +p6436 +VDuala +p6437 +sVfro +p6438 +VFrench; Old (842-ca. 1400) +p6439 +sVyap +p6440 +VYapese +p6441 +sVfrm +p6442 +VFrench; Middle (ca. 1400-1600) +p6443 +sVfrs +p6444 +VFrisian; Eastern +p6445 +sVfrr +p6446 +VFrisian; Northern +p6447 +sVyao +p6448 +VYao +p6449 +sVxal +p6450 +VKalmyk +p6451 +sVfry +p6452 +VFrisian; Western +p6453 +sVgay +p6454 +VGayo +p6455 +sVota +p6456 +VTurkish; Ottoman (1500-1928) +p6457 +sVhmn +p6458 +VHmong +p6459 +sVhmo +p6460 +VHiri Motu +p6461 +sVgaa +p6462 +VGa +p6463 +sVfur +p6464 +VFriulian +p6465 +sVmlg +p6466 +VMalagasy +p6467 +sVslv +p6468 +VSlovenian +p6469 +sVain +p6470 +VAinu (Japan) +p6471 +sVfil +p6472 +VFilipino +p6473 +sVmlt +p6474 +VMaltese +p6475 +sVslk +p6476 +VSlovak +p6477 +sVrar +p6478 +VMaori; Cook Islands +p6479 +sVful +p6480 +VFulah +p6481 +sVjpn +p6482 +VJapanese +p6483 +sVvol +p6484 +VVolapk +p6485 +sVvot +p6486 +VVotic +p6487 +sVind +p6488 +VIndonesian +p6489 +sVave +p6490 +VAvestan +p6491 +sVjpr +p6492 +VJudeo-Persian +p6493 +sVava +p6494 +VAvaric +p6495 +sVpap +p6496 +VPapiamento +p6497 +sVewo +p6498 +VEwondo +p6499 +sVpau +p6500 +VPalauan +p6501 +sVewe +p6502 +VEwe +p6503 +sVpag +p6504 +VPangasinan +p6505 +sVpal +p6506 +VPahlavi +p6507 +sVpam +p6508 +VPampanga +p6509 +sVpan +p6510 +VPanjabi +p6511 +sVsyc +p6512 +VSyriac; Classical +p6513 +sVphn +p6514 +VPhoenician +p6515 +sVkir +p6516 +VKirghiz +p6517 +sVnia +p6518 +VNias +p6519 +sVkik +p6520 +VKikuyu +p6521 +sVsyr +p6522 +VSyriac +p6523 +sVkin +p6524 +VKinyarwanda +p6525 +sVniu +p6526 +VNiuean +p6527 +sVgsw +p6528 +VGerman; Swiss +p6529 +sVepo +p6530 +VEsperanto +p6531 +sVjbo +p6532 +VLojban +p6533 +sVmic +p6534 +VMi'kmaq +p6535 +sVtha +p6536 +VThai +p6537 +sVhai +p6538 +VHaida +p6539 +sVgmh +p6540 +VGerman; Middle High (ca. 1050-1500) +p6541 +sVell +p6542 +VGreek; Modern (1453-) +p6543 +sVady +p6544 +VAdyghe +p6545 +sVelx +p6546 +VElamite +p6547 +sVada +p6548 +VAdangme +p6549 +sVnav +p6550 +VNavajo +p6551 +sVhat +p6552 +VCreole; Haitian +p6553 +sVhau +p6554 +VHausa +p6555 +sVhaw +p6556 +VHawaiian +p6557 +sVbin +p6558 +VBini +p6559 +sVamh +p6560 +VAmharic +p6561 +sVbik +p6562 +VBikol +p6563 +sVmos +p6564 +VMossi +p6565 +sVmoh +p6566 +VMohawk +p6567 +sVmon +p6568 +VMongolian +p6569 +sVbho +p6570 +VBhojpuri +p6571 +sVbis +p6572 +VBislama +p6573 +sVtvl +p6574 +VTuvalu +p6575 +sVest +p6576 +VEstonian +p6577 +sVkmb +p6578 +VKimbundu +p6579 +sVpeo +p6580 +VPersian; Old (ca. 600-400 B.C.) +p6581 +sVumb +p6582 +VUmbundu +p6583 +sVtmh +p6584 +VTamashek +p6585 +sVfon +p6586 +VFon +p6587 +sVhsb +p6588 +VSorbian; Upper +p6589 +sVrun +p6590 +VRundi +p6591 +sVrus +p6592 +VRussian +p6593 +sVrup +p6594 +VRomanian; Macedo- +p6595 +sVpli +p6596 +VPali +p6597 +sVace +p6598 +VAchinese +p6599 +sVach +p6600 +VAcoli +p6601 +sVnde +p6602 +VNdebele; North +p6603 +sVdzo +p6604 +VDzongkha +p6605 +sVkru +p6606 +VKurukh +p6607 +sVsrr +p6608 +VSerer +p6609 +sVido +p6610 +VIdo +p6611 +sVsrp +p6612 +VSerbian +p6613 +sVkrl +p6614 +VKarelian +p6615 +sVkrc +p6616 +VKarachay-Balkar +p6617 +sVnds +p6618 +VGerman; Low +p6619 +sVzun +p6620 +VZuni +p6621 +sVzul +p6622 +VZulu +p6623 +sVtwi +p6624 +VTwi +p6625 +sVsog +p6626 +VSogdian +p6627 +sVnso +p6628 +VSotho; Northern +p6629 +sVswe +p6630 +VSwedish +p6631 +sVsom +p6632 +VSomali +p6633 +sVsot +p6634 +VSotho; Southern +p6635 +sVmkd +p6636 +VMacedonian +p6637 +sVher +p6638 +VHerero +p6639 +sVlol +p6640 +VMongo +p6641 +sVheb +p6642 +VHebrew +p6643 +sVloz +p6644 +VLozi +p6645 +sVgil +p6646 +VGilbertese +p6647 +sVwas +p6648 +VWasho +p6649 +sVwar +p6650 +VWaray (Philippines) +p6651 +sVbul +p6652 +VBulgarian +p6653 +sVwal +p6654 +VWolaytta +p6655 +sVbua +p6656 +VBuriat +p6657 +sVbug +p6658 +VBuginese +p6659 +sVaze +p6660 +VAzerbaijani +p6661 +sVzha +p6662 +VZhuang +p6663 +sVzho +p6664 +VChinese +p6665 +sVnno +p6666 +VNorwegian Nynorsk +p6667 +sVuig +p6668 +VUighur +p6669 +sVmyv +p6670 +VErzya +p6671 +sVinh +p6672 +VIngush +p6673 +sVkhm +p6674 +VKhmer; Central +p6675 +sVkho +p6676 +VKhotanese +p6677 +sVmya +p6678 +VBurmese +p6679 +sVkha +p6680 +VKhasi +p6681 +sVina +p6682 +VInterlingua (International Auxiliary Language Association) +p6683 +sVtiv +p6684 +VTiv +p6685 +sVtir +p6686 +VTigrinya +p6687 +sVnap +p6688 +VNeapolitan +p6689 +sVgrb +p6690 +VGrebo +p6691 +sVgrc +p6692 +VGreek; Ancient (to 1453) +p6693 +sVnau +p6694 +VNauru +p6695 +sVgrn +p6696 +VGuarani +p6697 +sVtig +p6698 +VTigre +p6699 +sVyor +p6700 +VYoruba +p6701 +sVile +p6702 +VInterlingue +p6703 +sVsqi +p6704 +VAlbanian +p6705 +ssS'hu' +p6706 +(dp6707 +Vroh +p6708 +VRomansh +p6709 +sVsco +p6710 +Vskt +p6711 +sVscn +p6712 +Vfriuli +p6713 +sVrom +p6714 +Vroma +p6715 +sVron +p6716 +Vromn +p6717 +sVoss +p6718 +VOssetian +p6719 +sVale +p6720 +Valeut +p6721 +sVmni +p6722 +Vmanipuri +p6723 +sVnwc +p6724 +Vnewari; newari +p6725 +sVosa +p6726 +Voszage +p6727 +sValt +p6728 +Valtji; dli +p6729 +sVmnc +p6730 +Vmanchu +p6731 +sVmwr +p6732 +Vmarwari +p6733 +sVven +p6734 +Vvenda +p6735 +sVuga +p6736 +Vuragi +p6737 +sVmwl +p6738 +Vmirandese +p6739 +sVfas +p6740 +Vperzsa +p6741 +sVfat +p6742 +Vfanti +p6743 +sVfan +p6744 +VFang (Equatorial Guinea) +p6745 +sVfao +p6746 +VFereri +p6747 +sVdin +p6748 +Vdinka +p6749 +sVhye +p6750 +Vrmny +p6751 +sVbla +p6752 +Vszikszika +p6753 +sVsrd +p6754 +Vszardniai +p6755 +sVcar +p6756 +VCarib; Galibi +p6757 +sVdiv +p6758 +VDhivehi +p6759 +sVtel +p6760 +Vtelugu +p6761 +sVtem +p6762 +Vtimne +p6763 +sVnbl +p6764 +Vndebele (dli) +p6765 +sVter +p6766 +Vtereno +p6767 +sVtet +p6768 +Vtetum +p6769 +sVsun +p6770 +Vszundanz +p6771 +sVkut +p6772 +Vkutenai +p6773 +sVsuk +p6774 +Vsukuma +p6775 +sVkur +p6776 +Vkurd +p6777 +sVkum +p6778 +Vkumyk +p6779 +sVsus +p6780 +Vsusu +p6781 +sVnew +p6782 +VBhasa; Nepal +p6783 +sVkua +p6784 +Vkuanyama +p6785 +sVsux +p6786 +Vsumr +p6787 +sVmen +p6788 +VMende (Sierra Leone) +p6789 +sVlez +p6790 +Vlezgi +p6791 +sVgla +p6792 +VGaelic; Scottish +p6793 +sVbos +p6794 +Vbosnyk +p6795 +sVgle +p6796 +Vr +p6797 +sVeka +p6798 +Vekajuk +p6799 +sVglg +p6800 +Vgalciai +p6801 +sVakk +p6802 +Vakkd +p6803 +sVaka +p6804 +Vakan +p6805 +sVbod +p6806 +Vtibeti +p6807 +sVglv +p6808 +Vmanx +p6809 +sVjrb +p6810 +Vjudeo-arab +p6811 +sVvie +p6812 +Vvietnami +p6813 +sVipk +p6814 +Vinupiak +p6815 +sVuzb +p6816 +Vzbg +p6817 +sVsga +p6818 +Vr; r (900-ig) +p6819 +sVbre +p6820 +Vbreton +p6821 +sVbra +p6822 +Vbradzs +p6823 +sVaym +p6824 +Vajmara +p6825 +sVcha +p6826 +Vcsamorro +p6827 +sVchb +p6828 +Vcsibcsa +p6829 +sVche +p6830 +Vcsecsen +p6831 +sVchg +p6832 +Vchagati +p6833 +sVchk +p6834 +Vcsukz +p6835 +sVchm +p6836 +VMari (Russia) +p6837 +sVchn +p6838 +Vchinook zsargon +p6839 +sVcho +p6840 +Vcsokt +p6841 +sVchp +p6842 +Vcsippeva +p6843 +sVchr +p6844 +Vcserok +p6845 +sVchu +p6846 +Vszlv; szlv +p6847 +sVchv +p6848 +Vcsuvas +p6849 +sVchy +p6850 +Vcsejen +p6851 +sVmsa +p6852 +VMalay (macrolanguage) +p6853 +sViii +p6854 +VYi; Sichuan +p6855 +sVndo +p6856 +Vndonga +p6857 +sVibo +p6858 +Vigbo +p6859 +sViba +p6860 +Viba +p6861 +sVxho +p6862 +Vxhosa +p6863 +sVdeu +p6864 +Vnmet +p6865 +sVcat +p6866 +Vkataln +p6867 +sVdel +p6868 +Vdelavr +p6869 +sVden +p6870 +VSzolga (atapaszkn) +p6871 +sVcad +p6872 +Vcaddo +p6873 +sVtat +p6874 +Vtatr +p6875 +sVsrn +p6876 +VSranan Tongo +p6877 +sVraj +p6878 +Vradzsasztani +p6879 +sVtam +p6880 +Vtamil +p6881 +sVspa +p6882 +Vspanyol +p6883 +sVtah +p6884 +Vtahiti +p6885 +sVafh +p6886 +VAfrihili +p6887 +sVeng +p6888 +Vangol +p6889 +sVenm +p6890 +Vangol; kzpkori (1100-1500) +p6891 +sVcsb +p6892 +Vkasubi +p6893 +sVnyn +p6894 +Vnyankole +p6895 +sVnyo +p6896 +Vnyoro +p6897 +sVsid +p6898 +Vszidamo +p6899 +sVnya +p6900 +VNyanja +p6901 +sVsin +p6902 +VSinhala +p6903 +sVafr +p6904 +VAfrikaans +p6905 +sVlam +p6906 +Vlamba +p6907 +sVsnd +p6908 +Vszindi +p6909 +sVmar +p6910 +Vmarathi +p6911 +sVlah +p6912 +Vlanda +p6913 +sVnym +p6914 +Vnyamwezi +p6915 +sVsna +p6916 +Vshona +p6917 +sVlad +p6918 +Vladino +p6919 +sVsnk +p6920 +Vsoninke +p6921 +sVmad +p6922 +Vmaduri +p6923 +sVmag +p6924 +Vmagahi +p6925 +sVmai +p6926 +Vmaithili +p6927 +sVmah +p6928 +VMarshallese +p6929 +sVlav +p6930 +Vlett +p6931 +sVmal +p6932 +Vmalajalam +p6933 +sVman +p6934 +Vmandingo +p6935 +sVegy +p6936 +Vegyiptomi +p6937 +sVzen +p6938 +Vzenaga +p6939 +sVkbd +p6940 +Vkabardi +p6941 +sVita +p6942 +Volasz +p6943 +sVvai +p6944 +Vvai +p6945 +sVtsn +p6946 +Vtswana +p6947 +sVtso +p6948 +Vtsonga +p6949 +sVtsi +p6950 +Vcimsi +p6951 +sVbyn +p6952 +VBilin +p6953 +sVfij +p6954 +Vfidzsi +p6955 +sVfin +p6956 +Vfinn +p6957 +sVeus +p6958 +VBaszk +p6959 +sVnon +p6960 +Vnorvg; norvg +p6961 +sVceb +p6962 +Vcebuano +p6963 +sVdan +p6964 +Vdn +p6965 +sVnog +p6966 +Vnogai +p6967 +sVnob +p6968 +VNorwegian Bokml +p6969 +sVdak +p6970 +Vdakota +p6971 +sVces +p6972 +Vcseh +p6973 +sVdar +p6974 +Vdargwa +p6975 +sVnor +p6976 +Vnorvg +p6977 +sVkpe +p6978 +Vkpelle +p6979 +sVguj +p6980 +Vgudzsarati +p6981 +sVmdf +p6982 +Vmoksa +p6983 +sVmas +p6984 +Vmaszj +p6985 +sVlao +p6986 +Vlao +p6987 +sVmdr +p6988 +Vmandar +p6989 +sVgon +p6990 +Vgondi +p6991 +sVgoh +p6992 +Vnmet; nmet (kb. 750-1050) +p6993 +sVsms +p6994 +VSami; Skolt +p6995 +sVsmo +p6996 +Vszamoai +p6997 +sVsmn +p6998 +VSami; Inari +p6999 +sVsmj +p7000 +Vlule szami +p7001 +sVgot +p7002 +Vgt +p7003 +sVsme +p7004 +VSami; Northern +p7005 +sVdsb +p7006 +VSorbian; Lower +p7007 +sVsma +p7008 +VSami; Southern +p7009 +sVgor +p7010 +Vgorontalo +p7011 +sVast +p7012 +VAsturian +p7013 +sVorm +p7014 +Voromo +p7015 +sVque +p7016 +Vkecsua +p7017 +sVori +p7018 +Vorija +p7019 +sVcrh +p7020 +VTurkish; Crimean +p7021 +sVasm +p7022 +Vasszmi +p7023 +sVpus +p7024 +Vpushto +p7025 +sVdgr +p7026 +Vdogrib +p7027 +sVltz +p7028 +VLuxembourgish +p7029 +sVgez +p7030 +Vgz +p7031 +sVisl +p7032 +Vizlandi +p7033 +sVlat +p7034 +Vlatin +p7035 +sVmak +p7036 +Vmakasar +p7037 +sVzap +p7038 +VZapotk +p7039 +sVyid +p7040 +Vjiddis +p7041 +sVkok +p7042 +VKonkani (macrolanguage) +p7043 +sVkom +p7044 +Vkomi +p7045 +sVkon +p7046 +Vkongo +p7047 +sVukr +p7048 +Vukrn +p7049 +sVton +p7050 +Vtonga (Tonga-szigetek) +p7051 +sVzxx +p7052 +VNo linguistic content +p7053 +sVkos +p7054 +Vkoszrai +p7055 +sVkor +p7056 +Vkoreai +p7057 +sVtog +p7058 +Vtonga (nyasza) +p7059 +sVhun +p7060 +VMagyar +p7061 +sVhup +p7062 +Vhupa +p7063 +sVcym +p7064 +Vvelszi +p7065 +sVudm +p7066 +Vudmurt +p7067 +sVbej +p7068 +Vbeja +p7069 +sVben +p7070 +Vbengli +p7071 +sVbel +p7072 +Vbelarusz +p7073 +sVbem +p7074 +VBemba (Zambia) +p7075 +sVaar +p7076 +VAfar +p7077 +sVnzi +p7078 +Vnzima +p7079 +sVsah +p7080 +Vjakut +p7081 +sVsan +p7082 +Vszankszrit +p7083 +sVsam +p7084 +Varmi; szamaritnus +p7085 +sVpro +p7086 +Vprovanszl; (1500-ig) +p7087 +sVsag +p7088 +Vszango +p7089 +sVsad +p7090 +Vsandawe +p7091 +sVanp +p7092 +Vangika +p7093 +sVrap +p7094 +Vrapanui +p7095 +sVsas +p7096 +Vszaszak +p7097 +sVnqo +p7098 +VN'Ko +p7099 +sVsat +p7100 +Vszantli +p7101 +sVmin +p7102 +Vminangkabau +p7103 +sVlim +p7104 +VLimburgan +p7105 +sVlin +p7106 +Vlingala +p7107 +sVlit +p7108 +Vlitvn +p7109 +sVefi +p7110 +Vefik +p7111 +sVmis +p7112 +VUncoded languages +p7113 +sVkac +p7114 +Vkachin +p7115 +sVkab +p7116 +Vkabile +p7117 +sVkaa +p7118 +Vkara-kalpak +p7119 +sVkan +p7120 +Vkannada +p7121 +sVkam +p7122 +VKamba (Kenya) +p7123 +sVkal +p7124 +VKalaallisut +p7125 +sVkas +p7126 +Vkasmri +p7127 +sVkaw +p7128 +Vkawi +p7129 +sVkau +p7130 +Vkanuri +p7131 +sVkat +p7132 +Vgrz +p7133 +sVkaz +p7134 +Vkazah +p7135 +sVtyv +p7136 +Vtuvini +p7137 +sVawa +p7138 +Vavdi +p7139 +sVurd +p7140 +Vurdu +p7141 +sVdoi +p7142 +VDogri (macrolanguage) +p7143 +sVtpi +p7144 +Vtok pisin +p7145 +sVmri +p7146 +Vmaori +p7147 +sVabk +p7148 +VAbhz +p7149 +sVtkl +p7150 +Vtokelau +p7151 +sVnld +p7152 +Vholland +p7153 +sVoji +p7154 +Vodzsibwa +p7155 +sVoci +p7156 +VOccitan (post 1500) +p7157 +sVwol +p7158 +Vwolof +p7159 +sVjav +p7160 +Vjvai +p7161 +sVhrv +p7162 +Vhorvt +p7163 +sVzza +p7164 +VZaza +p7165 +sVmga +p7166 +Vkzp-r (900-1200) +p7167 +sVhit +p7168 +Vhettita +p7169 +sVdyu +p7170 +Vdjula +p7171 +sVssw +p7172 +Vswati +p7173 +sVmul +p7174 +Vtbb nyelv +p7175 +sVhil +p7176 +Vhiligajnon +p7177 +sVhin +p7178 +Vhindi +p7179 +sVbas +p7180 +VBasa (Cameroon) +p7181 +sVgba +p7182 +VGbaya (Central African Republic) +p7183 +sVwln +p7184 +Vvallon +p7185 +sVnep +p7186 +Vnepli +p7187 +sVcre +p7188 +Vcree +p7189 +sVban +p7190 +Vbalinz +p7191 +sVbal +p7192 +Vbaluchi +p7193 +sVbam +p7194 +Vbambara +p7195 +sVbak +p7196 +Vbaskr +p7197 +sVshn +p7198 +Vshan +p7199 +sVarp +p7200 +Varapaho +p7201 +sVarw +p7202 +Varawak +p7203 +sVara +p7204 +Varab +p7205 +sVarc +p7206 +Varmi; hivatalos (i.e. 700- i.e. 300) +p7207 +sVarg +p7208 +Varagniai +p7209 +sVsel +p7210 +Vszelkup +p7211 +sVarn +p7212 +VMapudungun +p7213 +sVlus +p7214 +Vlushai +p7215 +sVmus +p7216 +Vcreek +p7217 +sVlua +p7218 +Vluba-lulua +p7219 +sVlub +p7220 +Vluba-katanga +p7221 +sVlug +p7222 +Vganda +p7223 +sVlui +p7224 +Vluisendo +p7225 +sVlun +p7226 +Vlunda +p7227 +sVluo +p7228 +Vluo (Kenya s Tanznia) +p7229 +sViku +p7230 +Vinuktitut +p7231 +sVtur +p7232 +Vtrk +p7233 +sVzbl +p7234 +VBlissymbols +p7235 +sVtuk +p7236 +Vtrkmn +p7237 +sVtum +p7238 +Vtumbuka +p7239 +sVcop +p7240 +Vkopt +p7241 +sVcos +p7242 +Vkorzikai +p7243 +sVcor +p7244 +Vcornwalli +p7245 +sVilo +p7246 +Viloko +p7247 +sVgwi +p7248 +VGwich\u02bcin +p7249 +sVund +p7250 +Vismeretlen +p7251 +sVtli +p7252 +Vtlingit +p7253 +sVtlh +p7254 +VKlingon +p7255 +sVpor +p7256 +Vportugl +p7257 +sVpon +p7258 +Vponpei +p7259 +sVpol +p7260 +Vlengyel +p7261 +sVang +p7262 +Vangol; angol (kb. 450-1100) +p7263 +sVtgk +p7264 +Vtadzsik +p7265 +sVtgl +p7266 +Vtagalog +p7267 +sVfra +p7268 +Vfrancia +p7269 +sVdum +p7270 +VDutch; Middle (ca. 1050-1350) +p7271 +sVswa +p7272 +VSwahili (macrolanguage) +p7273 +sVdua +p7274 +Vduala +p7275 +sVfro +p7276 +Vfrancia; francia (842- kb. 1400) +p7277 +sVyap +p7278 +Vjap +p7279 +sVfrm +p7280 +VFrench; Middle (ca. 1400-1600) +p7281 +sVfrs +p7282 +VFrisian; Eastern +p7283 +sVfrr +p7284 +VFrisian; Northern +p7285 +sVyao +p7286 +Vyao +p7287 +sVxal +p7288 +VKalmyk +p7289 +sVfry +p7290 +VFrisian; Western +p7291 +sVgay +p7292 +Vgajo +p7293 +sVota +p7294 +Vtrk (ottomn) (1500-1928) +p7295 +sVhmn +p7296 +Vhmong +p7297 +sVhmo +p7298 +Vhiri motu +p7299 +sVgaa +p7300 +Vga +p7301 +sVfur +p7302 +Vfriul +p7303 +sVmlg +p7304 +Vmalagasy +p7305 +sVslv +p7306 +Vszlovn +p7307 +sVain +p7308 +Vainu (Japn) +p7309 +sVfil +p7310 +VFilipino +p7311 +sVmlt +p7312 +Vmltai +p7313 +sVslk +p7314 +Vszlovk +p7315 +sVrar +p7316 +VMaori; Cook Islands +p7317 +sVful +p7318 +Vfula +p7319 +sVjpn +p7320 +Vjapn +p7321 +sVvol +p7322 +Vvolapk +p7323 +sVvot +p7324 +Vvt +p7325 +sVind +p7326 +Vindonz +p7327 +sVave +p7328 +Vavesztai +p7329 +sVjpr +p7330 +Vjudeo-perzsa +p7331 +sVava +p7332 +Vavar +p7333 +sVpap +p7334 +Vpapiamento +p7335 +sVewo +p7336 +Vewondo +p7337 +sVpau +p7338 +Vpalaui +p7339 +sVewe +p7340 +Vewe +p7341 +sVpag +p7342 +Vpangasini +p7343 +sVpal +p7344 +Vpahlavi +p7345 +sVpam +p7346 +Vpampanga +p7347 +sVpan +p7348 +VPanjabi +p7349 +sVsyc +p7350 +VSyriac; Classical +p7351 +sVphn +p7352 +Vf\u0151nciai +p7353 +sVkir +p7354 +Vkirgiz +p7355 +sVnia +p7356 +Vnias +p7357 +sVkik +p7358 +Vkikuyu +p7359 +sVsyr +p7360 +Vszr +p7361 +sVkin +p7362 +Vkinyarwanda +p7363 +sVniu +p7364 +Vniuei +p7365 +sVgsw +p7366 +VGerman; Swiss +p7367 +sVepo +p7368 +Veszperant +p7369 +sVjbo +p7370 +Vlodzsban +p7371 +sVmic +p7372 +VMi'kmaq +p7373 +sVtha +p7374 +Vthai +p7375 +sVhai +p7376 +Vhaida +p7377 +sVgmh +p7378 +VGerman; Middle High (ca. 1050-1500) +p7379 +sVell +p7380 +Vmodern grg (1453-) +p7381 +sVady +p7382 +VAdyghe +p7383 +sVelx +p7384 +Velamita +p7385 +sVada +p7386 +VAdangme +p7387 +sVnav +p7388 +VNavajo +p7389 +sVhat +p7390 +VCreole; Haitian +p7391 +sVhau +p7392 +Vhausza +p7393 +sVhaw +p7394 +Vhawaii +p7395 +sVbin +p7396 +Vbini +p7397 +sVamh +p7398 +Vamhara +p7399 +sVbik +p7400 +Vbikol +p7401 +sVmos +p7402 +Vmossi +p7403 +sVmoh +p7404 +Vmohawk +p7405 +sVmon +p7406 +Vmongol +p7407 +sVbho +p7408 +Vbhodzspuri +p7409 +sVbis +p7410 +Vbiszlama +p7411 +sVtvl +p7412 +Vtuvalu +p7413 +sVest +p7414 +Vszt +p7415 +sVkmb +p7416 +Vkimbundu +p7417 +sVpeo +p7418 +VPersian; Old (ca. 600-400 B.C.) +p7419 +sVumb +p7420 +Vumbundu +p7421 +sVtmh +p7422 +Vtamasek +p7423 +sVfon +p7424 +Vfon +p7425 +sVhsb +p7426 +VSorbian; Upper +p7427 +sVrun +p7428 +Vrundi +p7429 +sVrus +p7430 +Vorosz +p7431 +sVrup +p7432 +VRomanian; Macedo- +p7433 +sVpli +p7434 +Vpali +p7435 +sVace +p7436 +VAkinz +p7437 +sVach +p7438 +VAcoli +p7439 +sVnde +p7440 +Vndebele (szaki) +p7441 +sVdzo +p7442 +Vdzongka +p7443 +sVkru +p7444 +Vkuruk +p7445 +sVsrr +p7446 +Vserer +p7447 +sVido +p7448 +Vido +p7449 +sVsrp +p7450 +Vszerb +p7451 +sVkrl +p7452 +Vkareliai +p7453 +sVkrc +p7454 +Vkaracsai-balkar +p7455 +sVnds +p7456 +VGerman; Low +p7457 +sVzun +p7458 +Vzuni +p7459 +sVzul +p7460 +VZulu +p7461 +sVtwi +p7462 +Vtwi +p7463 +sVsog +p7464 +Vsogdi +p7465 +sVnso +p7466 +Vsotho (szaki) +p7467 +sVswe +p7468 +Vsvd +p7469 +sVsom +p7470 +Vszomli +p7471 +sVsot +p7472 +Vsotho; dli +p7473 +sVmkd +p7474 +Vmacedn +p7475 +sVher +p7476 +Vherero +p7477 +sVlol +p7478 +Vmongo +p7479 +sVheb +p7480 +Vhber +p7481 +sVloz +p7482 +Vlozi +p7483 +sVgil +p7484 +Vgilberti +p7485 +sVwas +p7486 +Vwasho +p7487 +sVwar +p7488 +VWaray (Philippines) +p7489 +sVbul +p7490 +Vbolgr +p7491 +sVwal +p7492 +VWolaytta +p7493 +sVbua +p7494 +Vburjt +p7495 +sVbug +p7496 +Vbuginz +p7497 +sVaze +p7498 +Vazeri +p7499 +sVzha +p7500 +Vzsuang +p7501 +sVzho +p7502 +Vknai +p7503 +sVnno +p7504 +Vnorvg (nynorsk) +p7505 +sVuig +p7506 +Vujgur +p7507 +sVmyv +p7508 +Verzija +p7509 +sVinh +p7510 +Vingus +p7511 +sVkhm +p7512 +VKhmer; Central +p7513 +sVkho +p7514 +Vkotni +p7515 +sVmya +p7516 +Vburmai +p7517 +sVkha +p7518 +Vkazi +p7519 +sVina +p7520 +Vinterlingva (Nemzetkzi Segdnyelv Egyeslet) +p7521 +sVtiv +p7522 +Vtiv +p7523 +sVtir +p7524 +Vtigrinya +p7525 +sVnap +p7526 +Vnpolyi +p7527 +sVgrb +p7528 +Vgrebo +p7529 +sVgrc +p7530 +Vgrg (1453-ig) +p7531 +sVnau +p7532 +Vnauru +p7533 +sVgrn +p7534 +Vguarani +p7535 +sVtig +p7536 +Vtigre +p7537 +sVyor +p7538 +Vjoruba +p7539 +sVile +p7540 +Vinterlingva +p7541 +sVsqi +p7542 +Valbn +p7543 +ssS'es' +p7544 +g1679 +sS'sv' +p7545 +(dp7546 +Vroh +p7547 +VRomansh +p7548 +sVsco +p7549 +VLgskotska +p7550 +sVscn +p7551 +VSicilianska +p7552 +sVrom +p7553 +VRomani +p7554 +sVron +p7555 +VRumnska +p7556 +sVoss +p7557 +VOssetian +p7558 +sVale +p7559 +VAleutiska +p7560 +sVmni +p7561 +VManipuri +p7562 +sVnwc +p7563 +VNewari; gammal +p7564 +sVosa +p7565 +VOsage +p7566 +sValt +p7567 +VAltaiska; sdra +p7568 +sVmnc +p7569 +VManchu +p7570 +sVmwr +p7571 +VMarwari +p7572 +sVven +p7573 +VVenda +p7574 +sVuga +p7575 +VUgaritiska +p7576 +sVmwl +p7577 +VMirandese +p7578 +sVfas +p7579 +VPersiska +p7580 +sVfat +p7581 +VFanti +p7582 +sVfan +p7583 +VFang (Ekvatorialguinea) +p7584 +sVfao +p7585 +VFriska +p7586 +sVdin +p7587 +VDinka +p7588 +sVhye +p7589 +VArmeniska +p7590 +sVbla +p7591 +VSiksika (svartfotindianernas sprk) +p7592 +sVsrd +p7593 +VSardiska +p7594 +sVcar +p7595 +VCarib; Galibi +p7596 +sVdiv +p7597 +VDivehi +p7598 +sVtel +p7599 +VTelugu (Indien) +p7600 +sVtem +p7601 +VTemne +p7602 +sVnbl +p7603 +VNdebele; syd +p7604 +sVter +p7605 +VTereno +p7606 +sVtet +p7607 +VTetum +p7608 +sVsun +p7609 +VSundanesiska +p7610 +sVkut +p7611 +VKutenai +p7612 +sVsuk +p7613 +VSukuma +p7614 +sVkur +p7615 +VKurdiska +p7616 +sVkum +p7617 +VKumyk +p7618 +sVsus +p7619 +VSusu +p7620 +sVnew +p7621 +VBhasa; Nepal +p7622 +sVkua +p7623 +VOvambo (kuanyama) +p7624 +sVsux +p7625 +VSumeriska +p7626 +sVmen +p7627 +VMende (Sierra Leone) +p7628 +sVlez +p7629 +VLezginska +p7630 +sVgla +p7631 +VGaeliska; skotska +p7632 +sVbos +p7633 +VBosniska +p7634 +sVgle +p7635 +VIriska +p7636 +sVeka +p7637 +VEkajuk +p7638 +sVglg +p7639 +VGaliciska +p7640 +sVakk +p7641 +VAkkadiska +p7642 +sVaka +p7643 +VAkan (Ghana, Elfenbenskusten) +p7644 +sVbod +p7645 +VTibetanska +p7646 +sVglv +p7647 +VManx +p7648 +sVjrb +p7649 +VJudearabiska +p7650 +sVvie +p7651 +VVietnamesiska +p7652 +sVipk +p7653 +VInupiaq +p7654 +sVuzb +p7655 +VUzbekiska +p7656 +sVsga +p7657 +VIriska; gammal (-900) +p7658 +sVbre +p7659 +VBretonska +p7660 +sVbra +p7661 +VBraj +p7662 +sVaym +p7663 +VAymara (Bolivien) +p7664 +sVcha +p7665 +VChamorro +p7666 +sVchb +p7667 +VChibcha +p7668 +sVche +p7669 +VTjetjenska +p7670 +sVchg +p7671 +VChagatai +p7672 +sVchk +p7673 +VChuukese +p7674 +sVchm +p7675 +VMari (Ryssland) +p7676 +sVchn +p7677 +VChinook +p7678 +sVcho +p7679 +VChoctaw +p7680 +sVchp +p7681 +VChopi +p7682 +sVchr +p7683 +VCherokesiska +p7684 +sVchu +p7685 +VSlavonic; antik +p7686 +sVchv +p7687 +VTjuvasjiska +p7688 +sVchy +p7689 +VCheyenne +p7690 +sVmsa +p7691 +VMalajiska (makrosprk) +p7692 +sViii +p7693 +VYi; Sichuan +p7694 +sVndo +p7695 +VNdonga +p7696 +sVibo +p7697 +VIbo (Igbo) +p7698 +sViba +p7699 +VIban +p7700 +sVxho +p7701 +VXhosa (Sydafrika) +p7702 +sVdeu +p7703 +VTyska +p7704 +sVcat +p7705 +VKatalanska (Katalonien) +p7706 +sVdel +p7707 +VDelaware +p7708 +sVden +p7709 +VSlave +p7710 +sVcad +p7711 +VCaddo +p7712 +sVtat +p7713 +VTatariska ( Ryssland, Ukraina, Turkiet, Kina, Finland, Centralasien) +p7714 +sVsrn +p7715 +VSranan Tongo +p7716 +sVraj +p7717 +VRajasthani +p7718 +sVtam +p7719 +VTamil (Indien, Sri Lanka, Singapore) +p7720 +sVspa +p7721 +VSpanska +p7722 +sVtah +p7723 +VTahitiska +p7724 +sVafh +p7725 +VAfrihili (konstgjort sprk) +p7726 +sVeng +p7727 +VEngelska +p7728 +sVenm +p7729 +VMedelengelska (1100-1500) +p7730 +sVcsb +p7731 +VKasjubianska +p7732 +sVnyn +p7733 +VNyankole +p7734 +sVnyo +p7735 +VNyoro +p7736 +sVsid +p7737 +VSidami +p7738 +sVnya +p7739 +VNyanja +p7740 +sVsin +p7741 +VSinhala +p7742 +sVafr +p7743 +VAfrikaans +p7744 +sVlam +p7745 +VLamba +p7746 +sVsnd +p7747 +VSindhi +p7748 +sVmar +p7749 +VMarathi (Indien) +p7750 +sVlah +p7751 +VLahnda +p7752 +sVnym +p7753 +VNyamwezi +p7754 +sVsna +p7755 +VShona (Zimbabwe) +p7756 +sVlad +p7757 +VSpanjolska (ladino) +p7758 +sVsnk +p7759 +VSoninke +p7760 +sVmad +p7761 +VMadurese +p7762 +sVmag +p7763 +VMagahi +p7764 +sVmai +p7765 +VMaithili +p7766 +sVmah +p7767 +VMarshallese +p7768 +sVlav +p7769 +VLettiska +p7770 +sVmal +p7771 +VMalayalam (Indien) +p7772 +sVman +p7773 +VMande +p7774 +sVegy +p7775 +VEgyptiska; gammal +p7776 +sVzen +p7777 +VZenaga +p7778 +sVkbd +p7779 +VKabardinska (sttjerkessiska) +p7780 +sVita +p7781 +VItalienska +p7782 +sVvai +p7783 +VVai +p7784 +sVtsn +p7785 +VSetswana/Tswand (Botswana, Sydafrika, Zimbabwe, Namibia) +p7786 +sVtso +p7787 +VTsonga +p7788 +sVtsi +p7789 +VTsimshian +p7790 +sVbyn +p7791 +VBilin +p7792 +sVfij +p7793 +VFijianska +p7794 +sVfin +p7795 +VFinska +p7796 +sVeus +p7797 +VBaskiska +p7798 +sVnon +p7799 +VNordiska; gammal +p7800 +sVceb +p7801 +VCebuanska +p7802 +sVdan +p7803 +VDanska +p7804 +sVnog +p7805 +VNogaiska +p7806 +sVnob +p7807 +VNorskt bokml +p7808 +sVdak +p7809 +VDakota +p7810 +sVces +p7811 +VTjeckiska +p7812 +sVdar +p7813 +VDargwa +p7814 +sVnor +p7815 +VNorska +p7816 +sVkpe +p7817 +VKpelle +p7818 +sVguj +p7819 +VGujarati (Indien) +p7820 +sVmdf +p7821 +VMoksha +p7822 +sVmas +p7823 +VMassajiska +p7824 +sVlao +p7825 +VLaotiska (Laos) +p7826 +sVmdr +p7827 +VMandar +p7828 +sVgon +p7829 +VGondi +p7830 +sVgoh +p7831 +VTyska; gammal hg (ca. 750-1050) +p7832 +sVsms +p7833 +VSamiska; Skolt +p7834 +sVsmo +p7835 +VSamoanska +p7836 +sVsmn +p7837 +VSamiska; Inari +p7838 +sVsmj +p7839 +VSamiska; Lule +p7840 +sVgot +p7841 +VGotiska +p7842 +sVsme +p7843 +VSamiska; norra +p7844 +sVdsb +p7845 +VSorbian; nedre +p7846 +sVsma +p7847 +VSamiska,; sdra +p7848 +sVgor +p7849 +VGorontalo +p7850 +sVast +p7851 +VAsturiska +p7852 +sVorm +p7853 +VOromo ( Etiopien, Kenya) +p7854 +sVque +p7855 +VQuechua +p7856 +sVori +p7857 +VOriya +p7858 +sVcrh +p7859 +VTurkiska Krim +p7860 +sVasm +p7861 +VAssamesiska +p7862 +sVpus +p7863 +VPashto +p7864 +sVdgr +p7865 +VDogrib +p7866 +sVltz +p7867 +VLuxembourgish +p7868 +sVgez +p7869 +VGeez; fornetiopiska +p7870 +sVisl +p7871 +VIslndska +p7872 +sVlat +p7873 +VLatin +p7874 +sVmak +p7875 +VMakasar +p7876 +sVzap +p7877 +VZapotek +p7878 +sVyid +p7879 +VJiddisch +p7880 +sVkok +p7881 +VKonkani (macrolanguage) +p7882 +sVkom +p7883 +VKomi +p7884 +sVkon +p7885 +VKongo +p7886 +sVukr +p7887 +VUkrainska +p7888 +sVton +p7889 +VTonga (Tongaarna) +p7890 +sVzxx +p7891 +VNo linguistic content +p7892 +sVkos +p7893 +VKusaie +p7894 +sVkor +p7895 +VKoreanska +p7896 +sVtog +p7897 +VTonga (Nyasa) +p7898 +sVhun +p7899 +VUngerska +p7900 +sVhup +p7901 +VHupa +p7902 +sVcym +p7903 +VKymriska +p7904 +sVudm +p7905 +VUdmurt +p7906 +sVbej +p7907 +VBeyja +p7908 +sVben +p7909 +VBengaliska +p7910 +sVbel +p7911 +VVitryska +p7912 +sVbem +p7913 +VBemba (Zambia) +p7914 +sVaar +p7915 +VAfar +p7916 +sVnzi +p7917 +VNzima +p7918 +sVsah +p7919 +VJakutiska +p7920 +sVsan +p7921 +VSanskrit +p7922 +sVsam +p7923 +VArameiska; samariska +p7924 +sVpro +p7925 +VProvensalska; gammal (-1500) +p7926 +sVsag +p7927 +VSango +p7928 +sVsad +p7929 +VSandawe +p7930 +sVanp +p7931 +VAngika +p7932 +sVrap +p7933 +VRapanui +p7934 +sVsas +p7935 +VSasak +p7936 +sVnqo +p7937 +VN'Ko +p7938 +sVsat +p7939 +VSantali +p7940 +sVmin +p7941 +VMinangkabau +p7942 +sVlim +p7943 +VLimburgan +p7944 +sVlin +p7945 +VLingala (Kongo-Kinshasa, Kongo-Brazzaville) +p7946 +sVlit +p7947 +VLitauiska +p7948 +sVefi +p7949 +VEfik +p7950 +sVmis +p7951 +VOkodade sprk +p7952 +sVkac +p7953 +VKachin +p7954 +sVkab +p7955 +VKabyliska +p7956 +sVkaa +p7957 +VKarakalpakiska +p7958 +sVkan +p7959 +VKannada (Indien) +p7960 +sVkam +p7961 +VKamba (Kenya) +p7962 +sVkal +p7963 +VGrnlndska (Kalaallisut) +p7964 +sVkas +p7965 +VKashmiri +p7966 +sVkaw +p7967 +VKiwi; fornjavanska +p7968 +sVkau +p7969 +VKanuri +p7970 +sVkat +p7971 +VGeorgiska +p7972 +sVkaz +p7973 +VKazakiska (Kazakstan) +p7974 +sVtyv +p7975 +VTuvinska +p7976 +sVawa +p7977 +VAwadhi +p7978 +sVurd +p7979 +VUrdu (Pakistan, Indien) +p7980 +sVdoi +p7981 +VDogri (macrolanguage) +p7982 +sVtpi +p7983 +VTok Pisin +p7984 +sVmri +p7985 +VMaoriska +p7986 +sVabk +p7987 +VAbchaziska +p7988 +sVtkl +p7989 +VTokelau +p7990 +sVnld +p7991 +VNederlndska +p7992 +sVoji +p7993 +VOdjibwa (chippewa) +p7994 +sVoci +p7995 +VOccitan (post 1500) +p7996 +sVwol +p7997 +VWolof (Senegal, Gambia, Mauretanien) +p7998 +sVjav +p7999 +VJavanesiska +p8000 +sVhrv +p8001 +VKroatiska +p8002 +sVzza +p8003 +VZaza +p8004 +sVmga +p8005 +Virlndsk; medel (900-1200) +p8006 +sVhit +p8007 +VHettitiska sprk +p8008 +sVdyu +p8009 +VDyula +p8010 +sVssw +p8011 +VSwazi +p8012 +sVmul +p8013 +VFlera sprk +p8014 +sVhil +p8015 +VHiligaynon +p8016 +sVhin +p8017 +VHindi +p8018 +sVbas +p8019 +VBasa (Kamerun) +p8020 +sVgba +p8021 +VGbaya (Centralafrikanska republiken) +p8022 +sVwln +p8023 +VVallonska +p8024 +sVnep +p8025 +VNepalesiska +p8026 +sVcre +p8027 +VCree +p8028 +sVban +p8029 +VBalinesiska +p8030 +sVbal +p8031 +VBaluchi +p8032 +sVbam +p8033 +VBambara (Vstafrika) +p8034 +sVbak +p8035 +VBasjkiriska +p8036 +sVshn +p8037 +VShan +p8038 +sVarp +p8039 +VArapaho +p8040 +sVarw +p8041 +VArawakiska +p8042 +sVara +p8043 +VArabiska +p8044 +sVarc +p8045 +VArameiska; officiell (700-300 f.Kr.) +p8046 +sVarg +p8047 +VAragonska +p8048 +sVsel +p8049 +VSelkup +p8050 +sVarn +p8051 +VMapudungun +p8052 +sVlus +p8053 +VMizo (lushai) +p8054 +sVmus +p8055 +VMuskogee +p8056 +sVlua +p8057 +VLuba-Lulua +p8058 +sVlub +p8059 +VLuba-Katanga +p8060 +sVlug +p8061 +VLuganda/Ganda (Uganda) +p8062 +sVlui +p8063 +VLuiseno +p8064 +sVlun +p8065 +VLunda +p8066 +sVluo +p8067 +VLuo (Kenya och Tanzania) +p8068 +sViku +p8069 +VInuktitut +p8070 +sVtur +p8071 +VTurkiska +p8072 +sVzbl +p8073 +VBlissymbols +p8074 +sVtuk +p8075 +VTurkmeniska +p8076 +sVtum +p8077 +VTumbuka +p8078 +sVcop +p8079 +VKoptiska +p8080 +sVcos +p8081 +VKorsikanska +p8082 +sVcor +p8083 +VKorniska +p8084 +sVilo +p8085 +VIloko +p8086 +sVgwi +p8087 +VGwich\u02bcin +p8088 +sVund +p8089 +VOdefinierat +p8090 +sVtli +p8091 +VTlingit +p8092 +sVtlh +p8093 +VKlingon +p8094 +sVpor +p8095 +VPortugisiska +p8096 +sVpon +p8097 +VPonape +p8098 +sVpol +p8099 +VPolska +p8100 +sVang +p8101 +VEngelska; gammal (ca. 450-1100) +p8102 +sVtgk +p8103 +VTadzjikiska (Tadzjikistan) +p8104 +sVtgl +p8105 +VTagalog (Filippinerna) +p8106 +sVfra +p8107 +VFranska +p8108 +sVdum +p8109 +VHollnska; medeltida (ca. 1050-1350) +p8110 +sVswa +p8111 +VSwahili +p8112 +sVdua +p8113 +VDuala +p8114 +sVfro +p8115 +VFranska; gammal (842-ca. 1400) +p8116 +sVyap +p8117 +VYap +p8118 +sVfrm +p8119 +VFranska; medel (ca. 1400-1600) +p8120 +sVfrs +p8121 +VFrisian; stra +p8122 +sVfrr +p8123 +VFrisian; norra +p8124 +sVyao +p8125 +VYao +p8126 +sVxal +p8127 +VKalmyk +p8128 +sVfry +p8129 +VFrisian; vstra +p8130 +sVgay +p8131 +VGayo +p8132 +sVota +p8133 +VOttomanska (1500-1928) +p8134 +sVhmn +p8135 +VHmong +p8136 +sVhmo +p8137 +VHiri Motu +p8138 +sVgaa +p8139 +VGa +p8140 +sVfur +p8141 +VFriuliska +p8142 +sVmlg +p8143 +VMadagaskiska +p8144 +sVslv +p8145 +VSlovenska +p8146 +sVain +p8147 +VAinu (Japan) +p8148 +sVfil +p8149 +VFilipino +p8150 +sVmlt +p8151 +VMaltesiska (Malta) +p8152 +sVslk +p8153 +VSlovakiska +p8154 +sVrar +p8155 +VMaoriska; Cookarna +p8156 +sVful +p8157 +VFulani +p8158 +sVjpn +p8159 +VJapanska +p8160 +sVvol +p8161 +VVolapk +p8162 +sVvot +p8163 +VVotiska +p8164 +sVind +p8165 +VIndonesiska +p8166 +sVave +p8167 +VAvestiska +p8168 +sVjpr +p8169 +VJudepersiska +p8170 +sVava +p8171 +VAvariska +p8172 +sVpap +p8173 +VPapiamento +p8174 +sVewo +p8175 +VEwondo +p8176 +sVpau +p8177 +VPalauan +p8178 +sVewe +p8179 +VEwe +p8180 +sVpag +p8181 +VPangasinan +p8182 +sVpal +p8183 +VPahlavi (medelpersiska) +p8184 +sVpam +p8185 +VPampanga (Filippinerna) +p8186 +sVpan +p8187 +VPunjabi (Indien) +p8188 +sVsyc +p8189 +VSyriac; klassisk +p8190 +sVphn +p8191 +VFeniciska +p8192 +sVkir +p8193 +VKirgisiska +p8194 +sVnia +p8195 +VNias +p8196 +sVkik +p8197 +VKikuyu (Kenya) +p8198 +sVsyr +p8199 +VSyriska +p8200 +sVkin +p8201 +VKinyarwanda (Rwanda) +p8202 +sVniu +p8203 +VNiuean +p8204 +sVgsw +p8205 +VTyska; Schweizisk +p8206 +sVepo +p8207 +VEsperanto +p8208 +sVjbo +p8209 +VLojban +p8210 +sVmic +p8211 +VMi'kmaq +p8212 +sVtha +p8213 +VThailndska +p8214 +sVhai +p8215 +VHaida +p8216 +sVgmh +p8217 +VTyska; medelhg (ca. 1050-1500) +p8218 +sVell +p8219 +VGrekiska; modern (1453-) +p8220 +sVady +p8221 +VAdygeiska +p8222 +sVelx +p8223 +VElamitiska +p8224 +sVada +p8225 +VAdangme +p8226 +sVnav +p8227 +VNavajo +p8228 +sVhat +p8229 +VKreolsprk; haitisk kreol +p8230 +sVhau +p8231 +VHaussa +p8232 +sVhaw +p8233 +VHawaiiska +p8234 +sVbin +p8235 +VEdo (bini) +p8236 +sVamh +p8237 +VAmhariska (Etiopien) +p8238 +sVbik +p8239 +VBikol +p8240 +sVmos +p8241 +VMossi +p8242 +sVmoh +p8243 +VMohawk +p8244 +sVmon +p8245 +VMongoliska +p8246 +sVbho +p8247 +VBhojpuri +p8248 +sVbis +p8249 +VBislama +p8250 +sVtvl +p8251 +VTuvaluan +p8252 +sVest +p8253 +VEstniska +p8254 +sVkmb +p8255 +VMbundu (kimbundu) +p8256 +sVpeo +p8257 +VPersiska; antik (ca. 600-400 f.Kr.) +p8258 +sVumb +p8259 +VUmbundu +p8260 +sVtmh +p8261 +VTamashek +p8262 +sVfon +p8263 +VFon +p8264 +sVhsb +p8265 +VSorbiska; vre +p8266 +sVrun +p8267 +VRundi +p8268 +sVrus +p8269 +VRyska +p8270 +sVrup +p8271 +VRumnska; Macedo- +p8272 +sVpli +p8273 +VPali +p8274 +sVace +p8275 +VAcehnesiska (Indonesien) +p8276 +sVach +p8277 +VAcoli (Uganda) +p8278 +sVnde +p8279 +VNdebele; norra +p8280 +sVdzo +p8281 +VBhutanesiska (Dzongkha) +p8282 +sVkru +p8283 +VKurukh +p8284 +sVsrr +p8285 +VSerer +p8286 +sVido +p8287 +VIdo +p8288 +sVsrp +p8289 +VSerbiska +p8290 +sVkrl +p8291 +VKarelska +p8292 +sVkrc +p8293 +VKaratjaj-balkar +p8294 +sVnds +p8295 +VTyska; lg +p8296 +sVzun +p8297 +VZuni +p8298 +sVzul +p8299 +VZulu (Sydafrika, Malawi, Moambique, Swaziland) +p8300 +sVtwi +p8301 +VTwi +p8302 +sVsog +p8303 +VSogdiska +p8304 +sVnso +p8305 +VNordsotho +p8306 +sVswe +p8307 +VSvenska +p8308 +sVsom +p8309 +VSomaliska +p8310 +sVsot +p8311 +VSotho; sdra +p8312 +sVmkd +p8313 +VMakedonska +p8314 +sVher +p8315 +VHerero +p8316 +sVlol +p8317 +VLolo (mongo) +p8318 +sVheb +p8319 +VHebreiska +p8320 +sVloz +p8321 +VLozi +p8322 +sVgil +p8323 +VGilbertesiska +p8324 +sVwas +p8325 +VWasho +p8326 +sVwar +p8327 +VWaray (Filippinerna) +p8328 +sVbul +p8329 +VBulgariska +p8330 +sVwal +p8331 +VWolaytta +p8332 +sVbua +p8333 +VBurjatiska +p8334 +sVbug +p8335 +VBuginesiska +p8336 +sVaze +p8337 +VAzerbajdzjanska +p8338 +sVzha +p8339 +VZhuang +p8340 +sVzho +p8341 +VKinesiska +p8342 +sVnno +p8343 +VNynorsk +p8344 +sVuig +p8345 +VUighurUiguriska (Kina, Kazakstan, Pakistan, Kirgizistan, Tadzjikistan, Indien) +p8346 +sVmyv +p8347 +VErzya +p8348 +sVinh +p8349 +VIngusj +p8350 +sVkhm +p8351 +VKhmer (Kambodja) +p8352 +sVkho +p8353 +VSakiska (khotanesiska) +p8354 +sVmya +p8355 +VBurmanska +p8356 +sVkha +p8357 +VKhasi +p8358 +sVina +p8359 +VInterlingua (International Auxiliary Language Association) +p8360 +sVtiv +p8361 +VTivi +p8362 +sVtir +p8363 +VTigrinja (Etiopien, Eritrea) +p8364 +sVnap +p8365 +VNeapolitansk italienska +p8366 +sVgrb +p8367 +VGrebo +p8368 +sVgrc +p8369 +VGrekiska; antik (-1453) +p8370 +sVnau +p8371 +VNauruanska +p8372 +sVgrn +p8373 +VGuarani +p8374 +sVtig +p8375 +VTigre (Eritrea) +p8376 +sVyor +p8377 +VYoruba +p8378 +sVile +p8379 +VInterlingue +p8380 +sVsqi +p8381 +VAlbanska +p8382 +ssS'ja' +p8383 +(dp8384 +Vroh +p8385 +VRomansh +p8386 +sVsco +p8387 +V\u30b9\u30b3\u30c3\u30c8\u30e9\u30f3\u30c9\u8a9e +p8388 +sVscn +p8389 +V\u30b7\u30c1\u30ea\u30a2\u8a9e +p8390 +sVrom +p8391 +V\u30ed\u30de\u30cb\u8a9e +p8392 +sVron +p8393 +V\u30eb\u30fc\u30de\u30cb\u30a2\u8a9e +p8394 +sVoss +p8395 +VOssetian +p8396 +sVale +p8397 +V\u30a2\u30ec\u30a6\u30c8\u8a9e +p8398 +sVmni +p8399 +V\u30de\u30cb\u30d7\u30eb\u8a9e +p8400 +sVnwc +p8401 +VNewari; Old +p8402 +sVosa +p8403 +V\u30aa\u30fc\u30bb\u30fc\u30b8\u8a9e +p8404 +sValt +p8405 +VAltai; Southern +p8406 +sVmnc +p8407 +V\u6e80\u5dde\u8a9e +p8408 +sVmwr +p8409 +V\u30de\u30eb\u30ef\u30ea\u8a9e +p8410 +sVven +p8411 +V\u30d9\u30f3\u30c0\u8a9e +p8412 +sVuga +p8413 +V\u30a6\u30ac\u30ea\u30c3\u30c8\u8a9e +p8414 +sVmwl +p8415 +V\u30df\u30e9\u30f3\u30c9\u8a9e +p8416 +sVfas +p8417 +V\u30da\u30eb\u30b7\u30a2\u8a9e +p8418 +sVfat +p8419 +V\u30d5\u30a1\u30f3\u30c6\u30a3\u30fc\u8a9e +p8420 +sVfan +p8421 +VFang (Equatorial Guinea) +p8422 +sVfao +p8423 +V\u30d5\u30a7\u30ed\u30fc\u8a9e +p8424 +sVdin +p8425 +V\u30c7\u30a3\u30f3\u30ab\u8a9e +p8426 +sVhye +p8427 +V\u30a2\u30eb\u30e1\u30cb\u30a2\u8a9e +p8428 +sVbla +p8429 +V\u30d6\u30e9\u30c3\u30af\u30d5\u30c3\u30c8\u8a9e +p8430 +sVsrd +p8431 +V\u30b5\u30eb\u30c7\u30fc\u30cb\u30e3\u8a9e +p8432 +sVcar +p8433 +VCarib; Galibi +p8434 +sVdiv +p8435 +VDhivehi +p8436 +sVtel +p8437 +V\u30c6\u30eb\u30b0\u8a9e +p8438 +sVtem +p8439 +V\u30c6\u30e0\u30cd\u8a9e +p8440 +sVnbl +p8441 +V\u30cc\u30c7\u30d9\u30ec\u8a9e; \u5357 +p8442 +sVter +p8443 +V\u30c6\u30ec\u30fc\u30ce\u8a9e +p8444 +sVtet +p8445 +V\u30c6\u30c8\u30a5\u30f3\u8a9e +p8446 +sVsun +p8447 +V\u30b9\u30f3\u30c0\u8a9e +p8448 +sVkut +p8449 +V\u30af\u30c6\u30ca\u30a4\u8a9e +p8450 +sVsuk +p8451 +V\u30b9\u30af\u30de\u8a9e +p8452 +sVkur +p8453 +V\u30af\u30eb\u30c9\u8a9e +p8454 +sVkum +p8455 +V\u30af\u30df\u30c3\u30af\u8a9e +p8456 +sVsus +p8457 +V\u30b9\u30b9\u8a9e +p8458 +sVnew +p8459 +VBhasa; Nepal +p8460 +sVkua +p8461 +V\u30af\u30a2\u30cb\u30e3\u30de\u8a9e +p8462 +sVsux +p8463 +V\u30b7\u30e5\u30e1\u30fc\u30eb\u8a9e +p8464 +sVmen +p8465 +VMende (Sierra Leone) +p8466 +sVlez +p8467 +V\u30ec\u30ba\u30ae\u8a9e +p8468 +sVgla +p8469 +VGaelic; Scottish +p8470 +sVbos +p8471 +V\u30dc\u30b9\u30cb\u30a2\u8a9e +p8472 +sVgle +p8473 +V\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9\u8a9e +p8474 +sVeka +p8475 +V\u30a8\u30ab\u30b8\u30e5\u30af\u8a9e +p8476 +sVglg +p8477 +VGalician +p8478 +sVakk +p8479 +V\u30a2\u30c3\u30ab\u30c9\u8a9e +p8480 +sVaka +p8481 +V\u30a2\u30ab\u30f3\u8a9e +p8482 +sVbod +p8483 +V\u30c1\u30d9\u30c3\u30c8\u8a9e +p8484 +sVglv +p8485 +V\u30de\u30f3\u5cf6\u8a9e +p8486 +sVjrb +p8487 +V\u30e6\u30c0\u30e4\u30fb\u30a2\u30e9\u30d3\u30a2\u8a9e +p8488 +sVvie +p8489 +V\u30d9\u30c8\u30ca\u30e0\u8a9e +p8490 +sVipk +p8491 +V\u30a4\u30cc\u30d4\u30a2\u30af\u8a9e +p8492 +sVuzb +p8493 +V\u30a6\u30ba\u30d9\u30af\u8a9e +p8494 +sVsga +p8495 +V\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9\u8a9e; \u53e4 (-900) +p8496 +sVbre +p8497 +V\u30d6\u30eb\u30c8\u30f3\u8a9e +p8498 +sVbra +p8499 +V\u30d6\u30e9\u30b8\u8a9e +p8500 +sVaym +p8501 +V\u30a2\u30a4\u30de\u30e9\u8a9e +p8502 +sVcha +p8503 +V\u30c1\u30e3\u30e2\u30ed\u8a9e +p8504 +sVchb +p8505 +V\u30c1\u30d6\u30c1\u30e3\u8a9e +p8506 +sVche +p8507 +V\u30c1\u30a7\u30c1\u30a7\u30f3\u8a9e +p8508 +sVchg +p8509 +V\u30c1\u30e3\u30ac\u30bf\u30a4\u8a9e +p8510 +sVchk +p8511 +V\u30c1\u30e5\u30fc\u30af\u8a9e +p8512 +sVchm +p8513 +VMari (Russia) +p8514 +sVchn +p8515 +V\u30c1\u30cc\u30fc\u30af\u6df7\u6210\u8a9e +p8516 +sVcho +p8517 +V\u30c1\u30e7\u30af\u30c8\u30fc\u8a9e +p8518 +sVchp +p8519 +V\u30c1\u30da\u30ef\u30a4\u30a2\u30f3\u8a9e +p8520 +sVchr +p8521 +V\u30c1\u30a7\u30ed\u30ad\u30fc\u8a9e +p8522 +sVchu +p8523 +VSlavonic; Old +p8524 +sVchv +p8525 +V\u30c1\u30e5\u30f4\u30a1\u30b7\u30e5\u8a9e +p8526 +sVchy +p8527 +V\u30b7\u30e3\u30a4\u30a2\u30f3\u8a9e +p8528 +sVmsa +p8529 +VMalay (macrolanguage) +p8530 +sViii +p8531 +VYi; Sichuan +p8532 +sVndo +p8533 +V\u30f3\u30c9\u30f3\u30ac\u8a9e +p8534 +sVibo +p8535 +V\u30a4\u30dc\u8a9e +p8536 +sViba +p8537 +V\u30a4\u30d0\u30f3\u8a9e +p8538 +sVxho +p8539 +V\u30db\u30b5\u8a9e +p8540 +sVdeu +p8541 +V\u30c9\u30a4\u30c4\u8a9e +p8542 +sVcat +p8543 +V\u30ab\u30bf\u30ed\u30cb\u30a2\u8a9e +p8544 +sVdel +p8545 +V\u30c7\u30e9\u30a6\u30a7\u30a2\u8a9e +p8546 +sVden +p8547 +V\u30b9\u30ec\u30fc\u30d6\u8a9e (\u30a2\u30b5\u30d1\u30b9\u30ab\u30f3\u8a9e) +p8548 +sVcad +p8549 +V\u30ab\u30c9\u30fc\u8a9e +p8550 +sVtat +p8551 +V\u30bf\u30bf\u30fc\u30eb\u8a9e +p8552 +sVsrn +p8553 +VSranan Tongo +p8554 +sVraj +p8555 +V\u30e9\u30fc\u30b8\u30e3\u30b9\u30bf\u30fc\u30cb\u30fc\u8a9e +p8556 +sVtam +p8557 +V\u30bf\u30df\u30eb\u8a9e +p8558 +sVspa +p8559 +V\u30b9\u30da\u30a4\u30f3\u8a9e +p8560 +sVtah +p8561 +V\u30bf\u30d2\u30c1\u8a9e +p8562 +sVafh +p8563 +V\u30a2\u30d5\u30ea\u30d2\u30ea +p8564 +sVeng +p8565 +V\u82f1\u8a9e +p8566 +sVenm +p8567 +V\u82f1\u8a9e; \u4e2d\u4e16 (1100-1500) +p8568 +sVcsb +p8569 +V\u30ab\u30b7\u30e5\u30d3\u30a2\u30f3\u8a9e +p8570 +sVnyn +p8571 +V\u30cb\u30e3\u30f3\u30b3\u30fc\u30eb\u8a9e +p8572 +sVnyo +p8573 +V\u30cb\u30e7\u30ed\u8a9e +p8574 +sVsid +p8575 +V\u30b7\u30c0\u30e2\u8a9e +p8576 +sVnya +p8577 +VNyanja +p8578 +sVsin +p8579 +V\u30b7\u30f3\u30cf\u30e9\u6587\u5b57 +p8580 +sVafr +p8581 +V\u30a2\u30d5\u30ea\u30ab\u30fc\u30f3\u30b9\u8a9e +p8582 +sVlam +p8583 +V\u30e9\u30f3\u30d0\u8a9e +p8584 +sVsnd +p8585 +V\u30b7\u30f3\u30c7\u30a3\u30fc\u8a9e +p8586 +sVmar +p8587 +V\u30de\u30e9\u30fc\u30c6\u30a3\u30fc\u8a9e +p8588 +sVlah +p8589 +V\u30e9\u30d5\u30f3\u30c0\u30fc\u8a9e +p8590 +sVnym +p8591 +V\u30e0\u30a8\u30b8\u8a9e +p8592 +sVsna +p8593 +V\u30b7\u30e7\u30ca\u8a9e +p8594 +sVlad +p8595 +V\u30e9\u30b8\u30ce\u8a9e +p8596 +sVsnk +p8597 +V\u30bd\u30cb\u30f3\u30b1\u8a9e +p8598 +sVmad +p8599 +V\u30de\u30c9\u30a5\u30e9\u8a9e +p8600 +sVmag +p8601 +V\u30de\u30ac\u30d2\u8a9e +p8602 +sVmai +p8603 +V\u30de\u30a4\u30c1\u30ea\u8a9e +p8604 +sVmah +p8605 +VMarshallese +p8606 +sVlav +p8607 +V\u30e9\u30c8\u30f4\u30a3\u30a2\u8a9e +p8608 +sVmal +p8609 +V\u30de\u30e9\u30e4\u30fc\u30e9\u30e0\u8a9e +p8610 +sVman +p8611 +V\u30de\u30f3\u30c7\u30a3\u30f3\u30b4\u8a9e +p8612 +sVegy +p8613 +V\u30a8\u30b8\u30d7\u30c8\u8a9e (\u53e4\u4ee3) +p8614 +sVzen +p8615 +V\u30bc\u30ca\u30ac\u8a9e +p8616 +sVkbd +p8617 +V\u30ab\u30d0\u30eb\u30c0\u8a9e +p8618 +sVita +p8619 +V\u30a4\u30bf\u30ea\u30a2\u8a9e +p8620 +sVvai +p8621 +V\u30f4\u30a1\u30a4\u8a9e +p8622 +sVtsn +p8623 +V\u30c4\u30ef\u30ca\u8a9e +p8624 +sVtso +p8625 +V\u30c4\u30a9\u30f3\u30ac\u8a9e +p8626 +sVtsi +p8627 +V\u30c1\u30e0\u30b7\u30e5\u8a9e +p8628 +sVbyn +p8629 +VBilin +p8630 +sVfij +p8631 +V\u30d5\u30a3\u30b8\u30fc\u8a9e +p8632 +sVfin +p8633 +V\u30d5\u30a3\u30f3\u8a9e +p8634 +sVeus +p8635 +V\u30d0\u30b9\u30af\u8a9e +p8636 +sVnon +p8637 +V\u30b9\u30ab\u30f3\u30b8\u30ca\u30d3\u30a2\u8a9e; \u53e4\u671f +p8638 +sVceb +p8639 +V\u30bb\u30d6\u30a2\u30ce\u8a9e +p8640 +sVdan +p8641 +V\u30c7\u30f3\u30de\u30fc\u30af\u8a9e +p8642 +sVnog +p8643 +V\u30ce\u30ac\u30a4\u8a9e +p8644 +sVnob +p8645 +VNorwegian Bokml +p8646 +sVdak +p8647 +V\u30c0\u30b3\u30bf\u8a9e +p8648 +sVces +p8649 +V\u30c1\u30a7\u30b3\u8a9e +p8650 +sVdar +p8651 +V\u30c0\u30eb\u30ac\u30f3\u8a9e +p8652 +sVnor +p8653 +V\u30ce\u30eb\u30a6\u30a7\u30fc\u8a9e +p8654 +sVkpe +p8655 +V\u30af\u30da\u30ec\u8a9e +p8656 +sVguj +p8657 +V\u30b0\u30b8\u30e3\u30e9\u30fc\u30c6\u30a3\u30fc\u8a9e +p8658 +sVmdf +p8659 +V\u30e2\u30af\u30b7\u30e3\u8a9e +p8660 +sVmas +p8661 +V\u30de\u30b5\u30a4\u8a9e +p8662 +sVlao +p8663 +V\u30e9\u30aa\u8a9e +p8664 +sVmdr +p8665 +V\u30de\u30f3\u30c0\u30eb\u8a9e +p8666 +sVgon +p8667 +V\u30b4\u30fc\u30f3\u30c7\u30a3\u30fc\u8a9e +p8668 +sVgoh +p8669 +VGerman; Old High (ca. 750-1050) +p8670 +sVsms +p8671 +VSami; Skolt +p8672 +sVsmo +p8673 +V\u30b5\u30e2\u30a2\u8a9e +p8674 +sVsmn +p8675 +VSami; Inari +p8676 +sVsmj +p8677 +V\u30eb\u30ec\u30fb\u30b5\u30fc\u30df\u8a9e +p8678 +sVgot +p8679 +V\u30b4\u30fc\u30c8\u8a9e +p8680 +sVsme +p8681 +VSami; Northern +p8682 +sVdsb +p8683 +VSorbian; Lower +p8684 +sVsma +p8685 +VSami; Southern +p8686 +sVgor +p8687 +V\u30b4\u30ed\u30f3\u30bf\u30ed\u8a9e +p8688 +sVast +p8689 +VAsturian +p8690 +sVorm +p8691 +V\u30aa\u30ed\u30e2\u8a9e +p8692 +sVque +p8693 +V\u30ad\u30c1\u30e5\u30ef\u8a9e +p8694 +sVori +p8695 +V\u30aa\u30ea\u30e4\u30fc\u8a9e +p8696 +sVcrh +p8697 +VTurkish; Crimean +p8698 +sVasm +p8699 +V\u30a2\u30c3\u30b5\u30e0\u8a9e +p8700 +sVpus +p8701 +V\u30d7\u30b7\u30e5\u30c8\u30a5\u30fc\u8a9e +p8702 +sVdgr +p8703 +V\u30c9\u30af\u30ea\u30d6\u8a9e +p8704 +sVltz +p8705 +VLuxembourgish +p8706 +sVgez +p8707 +V\u30b2\u30fc\u30ba\u8a9e +p8708 +sVisl +p8709 +V\u30a2\u30a4\u30b9\u30e9\u30f3\u30c9\u8a9e +p8710 +sVlat +p8711 +V\u30e9\u30c6\u30f3\u8a9e +p8712 +sVmak +p8713 +V\u30de\u30ab\u30c3\u30b5\u30eb\u8a9e +p8714 +sVzap +p8715 +V\u30b6\u30dd\u30c6\u30c3\u30af\u8a9e +p8716 +sVyid +p8717 +V\u30a4\u30c7\u30a3\u30c3\u30b7\u30e5\u8a9e +p8718 +sVkok +p8719 +VKonkani (macrolanguage) +p8720 +sVkom +p8721 +V\u30b3\u30df\u8a9e +p8722 +sVkon +p8723 +V\u30b3\u30f3\u30b4\u8a9e +p8724 +sVukr +p8725 +V\u30a6\u30af\u30e9\u30a4\u30ca\u8a9e +p8726 +sVton +p8727 +V\u30c8\u30f3\u30ac\u8a9e (\u30c8\u30f3\u30ac\u8af8\u5cf6) +p8728 +sVzxx +p8729 +VNo linguistic content +p8730 +sVkos +p8731 +V\u30b3\u30b9\u30e9\u30a8\u8a9e +p8732 +sVkor +p8733 +V\u671d\u9bae\u8a9e +p8734 +sVtog +p8735 +V\u30c8\u30f3\u30ac\u8a9e (\u30cb\u30a2\u30b5) +p8736 +sVhun +p8737 +V\u30cf\u30f3\u30ac\u30ea\u30fc\u8a9e +p8738 +sVhup +p8739 +V\u30a2\u30bf\u30d1\u30b9\u30ab\u8a9e +p8740 +sVcym +p8741 +V\u30a6\u30a7\u30fc\u30eb\u30ba\u8a9e +p8742 +sVudm +p8743 +V\u30a6\u30c9\u30e0\u30eb\u30c8\u8a9e +p8744 +sVbej +p8745 +V\u30d9\u30b8\u30e3\u8a9e +p8746 +sVben +p8747 +V\u30d9\u30f3\u30ac\u30eb\u8a9e +p8748 +sVbel +p8749 +V\u767d\u30ed\u30b7\u30a2\u8a9e +p8750 +sVbem +p8751 +VBemba (Zambia) +p8752 +sVaar +p8753 +V\u30a2\u30d5\u30a1\u30eb\u8a9e +p8754 +sVnzi +p8755 +V\u30f3\u30bc\u30de\u8a9e +p8756 +sVsah +p8757 +V\u30e4\u30af\u30fc\u30c8\u8a9e +p8758 +sVsan +p8759 +V\u68b5\u8a9e +p8760 +sVsam +p8761 +VAramaic; Samaritan +p8762 +sVpro +p8763 +V\u30d7\u30ed\u30f4\u30a1\u30f3\u30b9\u8a9e; \u53e4\u671f (-1500) +p8764 +sVsag +p8765 +V\u30b5\u30f3\u30b4\u8a9e +p8766 +sVsad +p8767 +V\u30b5\u30f3\u30c0\u30a6\u30a7\u8a9e +p8768 +sVanp +p8769 +V\u30a2\u30f3\u30ae\u30ab\u8a9e +p8770 +sVrap +p8771 +V\u30e9\u30d1\u30cc\u30fc\u30a4\u8a9e +p8772 +sVsas +p8773 +V\u30b5\u30b5\u30af\u8a9e +p8774 +sVnqo +p8775 +V\u30f3\u30b3\u6587\u5b57 +p8776 +sVsat +p8777 +V\u30b5\u30f3\u30bf\u30fc\u30ea\u30fc\u8a9e +p8778 +sVmin +p8779 +V\u30df\u30ca\u30f3\u30ab\u30d0\u30a6\u8a9e +p8780 +sVlim +p8781 +VLimburgan +p8782 +sVlin +p8783 +V\u30ea\u30f3\u30ac\u30e9\u8a9e +p8784 +sVlit +p8785 +V\u30ea\u30c8\u30a2\u30cb\u30a2\u8a9e +p8786 +sVefi +p8787 +V\u30a8\u30d5\u30a3\u30af\u8a9e +p8788 +sVmis +p8789 +VUncoded languages +p8790 +sVkac +p8791 +V\u30ab\u30c1\u30f3\u8a9e +p8792 +sVkab +p8793 +V\u30ab\u30d3\u30eb\u8a9e +p8794 +sVkaa +p8795 +V\u30ab\u30e9\u30fb\u30ab\u30eb\u30d1\u30af\u8a9e +p8796 +sVkan +p8797 +V\u30ab\u30f3\u30ca\u30c0\u8a9e +p8798 +sVkam +p8799 +VKamba (Kenya) +p8800 +sVkal +p8801 +VKalaallisut +p8802 +sVkas +p8803 +V\u30ab\u30b7\u30df\u30fc\u30ea\u30fc\u8a9e +p8804 +sVkaw +p8805 +V\u30ab\u30a6\u30a3\u8a9e +p8806 +sVkau +p8807 +V\u30ab\u30cc\u30ea\u8a9e +p8808 +sVkat +p8809 +V\u30b0\u30eb\u30b8\u30a2\u8a9e +p8810 +sVkaz +p8811 +V\u30ab\u30b6\u30fc\u30d5\u8a9e +p8812 +sVtyv +p8813 +V\u30c4\u30d0\u30cb\u30a2\u8a9e +p8814 +sVawa +p8815 +V\u30a2\u30ef\u30c7\u30a3\u8a9e +p8816 +sVurd +p8817 +V\u30a6\u30eb\u30c9\u30a5\u30fc\u8a9e +p8818 +sVdoi +p8819 +VDogri (macrolanguage) +p8820 +sVtpi +p8821 +V\u30c8\u30c3\u30af\u30fb\u30d4\u30b8\u30f3 +p8822 +sVmri +p8823 +V\u30de\u30aa\u30ea\u8a9e +p8824 +sVabk +p8825 +V\u30a2\u30d6\u30cf\u30b8\u30a2\u8a9e +p8826 +sVtkl +p8827 +V\u30c8\u30b1\u30e9\u30a6\u8a9e +p8828 +sVnld +p8829 +V\u30aa\u30e9\u30f3\u30c0\u8a9e +p8830 +sVoji +p8831 +V\u30aa\u30b8\u30d6\u30ef\u8a9e +p8832 +sVoci +p8833 +VOccitan (post 1500) +p8834 +sVwol +p8835 +V\u30a6\u30a9\u30ed\u30d5\u8a9e +p8836 +sVjav +p8837 +V\u30b8\u30e3\u30ef\u8a9e +p8838 +sVhrv +p8839 +V\u30af\u30ed\u30a2\u30c1\u30a2\u8a9e +p8840 +sVzza +p8841 +VZaza +p8842 +sVmga +p8843 +V\u30a2\u30a4\u30eb\u30e9\u30f3\u30c9\u8a9e; \u4e2d\u4e16 (900-1200) +p8844 +sVhit +p8845 +V\u30d2\u30c3\u30bf\u30a4\u30c8\u8a9e +p8846 +sVdyu +p8847 +V\u30c7\u30e5\u30e9\u8a9e +p8848 +sVssw +p8849 +V\u30b7\u30b9\u30ef\u30c6\u30a3\u8a9e +p8850 +sVmul +p8851 +V\u591a\u8a00\u8a9e +p8852 +sVhil +p8853 +V\u30d2\u30ea\u30b8\u30e3\u30ce\u30f3\u8a9e +p8854 +sVhin +p8855 +V\u30d2\u30f3\u30c7\u30a3\u30fc\u8a9e +p8856 +sVbas +p8857 +VBasa (Cameroon) +p8858 +sVgba +p8859 +VGbaya (Central African Republic) +p8860 +sVwln +p8861 +V\u30ef\u30ed\u30f3\u8a9e +p8862 +sVnep +p8863 +V\u30cd\u30d1\u30fc\u30eb\u8a9e +p8864 +sVcre +p8865 +V\u30af\u30ea\u30fc\u8a9e +p8866 +sVban +p8867 +V\u30d0\u30ea\u8a9e +p8868 +sVbal +p8869 +V\u30d0\u30eb\u30fc\u30c1\u30fc\u8a9e +p8870 +sVbam +p8871 +V\u30d0\u30f3\u30d0\u30e9\u8a9e +p8872 +sVbak +p8873 +V\u30d0\u30b7\u30ad\u30fc\u30eb\u8a9e +p8874 +sVshn +p8875 +V\u30b7\u30e3\u30f3\u8a9e +p8876 +sVarp +p8877 +V\u30a2\u30e9\u30d1\u30db\u30fc\u8a9e +p8878 +sVarw +p8879 +V\u30a2\u30e9\u30ef\u30af\u8a9e +p8880 +sVara +p8881 +V\u30a2\u30e9\u30d3\u30a2\u8a9e +p8882 +sVarc +p8883 +VAramaic; Official (700-300 BCE) +p8884 +sVarg +p8885 +V\u30a2\u30e9\u30b4\u30f3\u8a9e +p8886 +sVsel +p8887 +V\u30bb\u30ea\u30af\u30d7\u8a9e +p8888 +sVarn +p8889 +VMapudungun +p8890 +sVlus +p8891 +V\u30eb\u30b7\u30e3\u30a4\u8a9e +p8892 +sVmus +p8893 +V\u30af\u30ea\u30fc\u30af\u8a9e +p8894 +sVlua +p8895 +V\u30eb\u30d0\u30fb\u30eb\u30eb\u30a2\u8a9e +p8896 +sVlub +p8897 +V\u30eb\u30d0\u8a9e +p8898 +sVlug +p8899 +V\u30ac\u30f3\u30c0\u8a9e +p8900 +sVlui +p8901 +V\u30eb\u30a4\u30bb\u30cb\u30e7\u8a9e +p8902 +sVlun +p8903 +V\u30e9\u30f3\u30c0\u8a9e +p8904 +sVluo +p8905 +V\u30eb\u30aa\u8a9e (\u30b1\u30cb\u30a2\u3068\u30bf\u30f3\u30b6\u30cb\u30a2) +p8906 +sViku +p8907 +V\u30a4\u30cc\u30af\u30c1\u30bf\u30c3\u30c8\u8a9e +p8908 +sVtur +p8909 +V\u30c8\u30eb\u30b3\u8a9e +p8910 +sVzbl +p8911 +VBlissymbols +p8912 +sVtuk +p8913 +V\u30c8\u30a5\u30eb\u30af\u30e1\u30f3\u8a9e +p8914 +sVtum +p8915 +V\u30bf\u30f3\u30d6\u30ab\u8a9e +p8916 +sVcop +p8917 +V\u30b3\u30d7\u30c8\u8a9e +p8918 +sVcos +p8919 +V\u30b3\u30eb\u30b7\u30ab\u8a9e +p8920 +sVcor +p8921 +V\u30b3\u30fc\u30f3\u30a6\u30a9\u30fc\u30eb\u8a9e +p8922 +sVilo +p8923 +V\u30a4\u30ed\u30ab\u30ce\u8a9e +p8924 +sVgwi +p8925 +VGwich\u02bcin +p8926 +sVund +p8927 +V\u8a00\u8a9e\u540d\u4e0d\u660e +p8928 +sVtli +p8929 +V\u30c8\u30ea\u30f3\u30ae\u30c3\u30c8\u8a9e +p8930 +sVtlh +p8931 +VKlingon +p8932 +sVpor +p8933 +V\u30dd\u30eb\u30c8\u30ac\u30eb\u8a9e +p8934 +sVpon +p8935 +V\u30dd\u30ca\u30da\u8a9e +p8936 +sVpol +p8937 +V\u30dd\u30fc\u30e9\u30f3\u30c9\u8a9e +p8938 +sVang +p8939 +VEnglish; Old (ca. 450-1100) +p8940 +sVtgk +p8941 +V\u30bf\u30b8\u30af\u8a9e +p8942 +sVtgl +p8943 +V\u30bf\u30ac\u30ed\u30b0\u8a9e +p8944 +sVfra +p8945 +V\u30d5\u30e9\u30f3\u30b9\u8a9e +p8946 +sVdum +p8947 +VDutch; Middle (ca. 1050-1350) +p8948 +sVswa +p8949 +VSwahili (macrolanguage) +p8950 +sVdua +p8951 +V\u30c9\u30a5\u30a2\u30e9\u8a9e +p8952 +sVfro +p8953 +VFrench; Old (842-ca. 1400) +p8954 +sVyap +p8955 +V\u30e4\u30c3\u30d7\u8a9e +p8956 +sVfrm +p8957 +VFrench; Middle (ca. 1400-1600) +p8958 +sVfrs +p8959 +VFrisian; Eastern +p8960 +sVfrr +p8961 +VFrisian; Northern +p8962 +sVyao +p8963 +V\u30e4\u30aa\u8a9e +p8964 +sVxal +p8965 +VKalmyk +p8966 +sVfry +p8967 +VFrisian; Western +p8968 +sVgay +p8969 +V\u30ac\u30e8\u8a9e +p8970 +sVota +p8971 +V\u30c8\u30eb\u30b3\u8a9e; \u30aa\u30b9\u30de\u30f3 (1500-1928) +p8972 +sVhmn +p8973 +V\u30d5\u30e2\u30f3\u30b0\u8a9e +p8974 +sVhmo +p8975 +V\u30d2\u30ea\u30e2\u30c8\u30a5\u8a9e +p8976 +sVgaa +p8977 +V\u30ac\u8a9e +p8978 +sVfur +p8979 +V\u30d5\u30ea\u30a6\u30ea\u8a9e +p8980 +sVmlg +p8981 +V\u30de\u30e9\u30ac\u30b7\u8a9e +p8982 +sVslv +p8983 +V\u30b9\u30ed\u30f4\u30a7\u30cb\u30a2\u8a9e +p8984 +sVain +p8985 +VAinu (Japan) +p8986 +sVfil +p8987 +VFilipino +p8988 +sVmlt +p8989 +V\u30de\u30eb\u30bf\u8a9e +p8990 +sVslk +p8991 +V\u30b9\u30ed\u30f4\u30a1\u30ad\u30a2\u8a9e +p8992 +sVrar +p8993 +VMaori; Cook Islands +p8994 +sVful +p8995 +V\u30d5\u30e9\u8a9e +p8996 +sVjpn +p8997 +V\u65e5\u672c\u8a9e +p8998 +sVvol +p8999 +V\u30dc\u30e9\u30d4\u30e5\u30fc\u30af\u8a9e +p9000 +sVvot +p9001 +V\u30f4\u30a9\u30fc\u30c8\u8a9e +p9002 +sVind +p9003 +V\u30a4\u30f3\u30c9\u30cd\u30b7\u30a2\u8a9e +p9004 +sVave +p9005 +V\u30a2\u30f4\u30a7\u30b9\u30bf\u8a9e +p9006 +sVjpr +p9007 +V\u30e6\u30c0\u30e4\u30fb\u30da\u30eb\u30b7\u30a2\u8a9e +p9008 +sVava +p9009 +V\u30a2\u30f4\u30a1\u30eb\u8a9e +p9010 +sVpap +p9011 +V\u30d1\u30d4\u30a2\u30e1\u30f3\u30c8 +p9012 +sVewo +p9013 +V\u30a8\u30a6\u30a9\u30f3\u30c9\u8a9e +p9014 +sVpau +p9015 +V\u30d1\u30e9\u30aa\u8a9e +p9016 +sVewe +p9017 +V\u30a8\u30a6\u30a7\u8a9e +p9018 +sVpag +p9019 +V\u30d1\u30f3\u30ac\u30b7\u30ca\u30fc\u30f3\u8a9e +p9020 +sVpal +p9021 +V\u30d1\u30fc\u30e9\u30f4\u30a3\u30fc\u8a9e +p9022 +sVpam +p9023 +V\u30d1\u30f3\u30d1\u30f3\u30ac\u8a9e +p9024 +sVpan +p9025 +VPanjabi +p9026 +sVsyc +p9027 +VSyriac; Classical +p9028 +sVphn +p9029 +V\u30d5\u30a7\u30cb\u30ad\u30a2\u8a9e +p9030 +sVkir +p9031 +V\u30ad\u30eb\u30ae\u30b9\u8a9e +p9032 +sVnia +p9033 +V\u30cb\u30a2\u30b9\u8a9e +p9034 +sVkik +p9035 +V\u30ad\u30af\u30e6\u8a9e +p9036 +sVsyr +p9037 +V\u30b7\u30ea\u30a2\u8a9e +p9038 +sVkin +p9039 +V\u30ad\u30f3\u30e4\u30eb\u30ef\u30f3\u30c0\u8a9e +p9040 +sVniu +p9041 +V\u30cb\u30a6\u30fc\u30a8\u30a4\u8a9e +p9042 +sVgsw +p9043 +VGerman; Swiss +p9044 +sVepo +p9045 +V\u30a8\u30b9\u30da\u30e9\u30f3\u30c8 +p9046 +sVjbo +p9047 +V\u30ed\u30b8\u30d0\u30f3\u8a9e +p9048 +sVmic +p9049 +VMi'kmaq +p9050 +sVtha +p9051 +V\u30bf\u30a4\u8a9e +p9052 +sVhai +p9053 +V\u30cf\u30a4\u30c0\u8a9e +p9054 +sVgmh +p9055 +VGerman; Middle High (ca. 1050-1500) +p9056 +sVell +p9057 +V\u30ae\u30ea\u30b7\u30a2\u8a9e; \u73fe\u4ee3 (1453-) +p9058 +sVady +p9059 +VAdyghe +p9060 +sVelx +p9061 +V\u30a8\u30e9\u30e0\u8a9e +p9062 +sVada +p9063 +V\u30a2\u30c0\u30f3\u30b0\u30e1\u8a9e +p9064 +sVnav +p9065 +VNavajo +p9066 +sVhat +p9067 +VCreole; Haitian +p9068 +sVhau +p9069 +V\u30cf\u30a6\u30b5\u8a9e +p9070 +sVhaw +p9071 +V\u30cf\u30ef\u30a4\u8a9e +p9072 +sVbin +p9073 +V\u30d3\u30cb\u8a9e +p9074 +sVamh +p9075 +V\u30a2\u30e0\u30cf\u30e9\u8a9e +p9076 +sVbik +p9077 +V\u30d3\u30b3\u30eb\u8a9e +p9078 +sVmos +p9079 +V\u30e2\u30c3\u30b7\u30fc\u8a9e +p9080 +sVmoh +p9081 +V\u30e2\u30fc\u30db\u30fc\u30af\u8a9e +p9082 +sVmon +p9083 +V\u8499\u53e4\u8a9e +p9084 +sVbho +p9085 +V\u30dc\u30fc\u30b8\u30d7\u30ea\u30fc\u8a9e +p9086 +sVbis +p9087 +V\u30d3\u30b9\u30e9\u30de\u8a9e +p9088 +sVtvl +p9089 +V\u30c4\u30d0\u30eb\u8a9e +p9090 +sVest +p9091 +V\u30a8\u30b9\u30c8\u30cb\u30a2\u8a9e +p9092 +sVkmb +p9093 +V\u30ad\u30f3\u30d6\u30f3\u30c9\u30a5\u8a9e +p9094 +sVpeo +p9095 +VPersian; Old (ca. 600-400 B.C.) +p9096 +sVumb +p9097 +V\u30a2\u30f3\u30d6\u30f3\u30c9\u30a5\u8a9e +p9098 +sVtmh +p9099 +V\u30bf\u30de\u30b7\u30a7\u30af\u8a9e +p9100 +sVfon +p9101 +V\u30d5\u30a9\u30f3\u8a9e +p9102 +sVhsb +p9103 +VSorbian; Upper +p9104 +sVrun +p9105 +V\u30eb\u30f3\u30c7\u30a3\u8a9e +p9106 +sVrus +p9107 +V\u30ed\u30b7\u30a2\u8a9e +p9108 +sVrup +p9109 +VRomanian; Macedo- +p9110 +sVpli +p9111 +V\u30d1\u30fc\u30ea\u8a9e +p9112 +sVace +p9113 +V\u30a2\u30c1\u30a7\u30fc\u8a9e +p9114 +sVach +p9115 +V\u30a2\u30c1\u30e7\u30ea\u8a9e +p9116 +sVnde +p9117 +V\u30de\u30bf\u30d9\u30ec\u8a9e; \u5317 +p9118 +sVdzo +p9119 +V\u30be\u30f3\u30ab\u8a9e +p9120 +sVkru +p9121 +V\u30af\u30eb\u30af\u8a9e +p9122 +sVsrr +p9123 +V\u30bb\u30ec\u30fc\u30eb\u8a9e +p9124 +sVido +p9125 +V\u30a4\u30c9\u8a9e +p9126 +sVsrp +p9127 +V\u30bb\u30eb\u30d3\u30a2\u8a9e +p9128 +sVkrl +p9129 +V\u30ab\u30ec\u30ea\u30a2\u8a9e +p9130 +sVkrc +p9131 +V\u30ab\u30e9\u30c1\u30e3\u30a4\u30fb\u30d0\u30eb\u30ab\u30eb\u8a9e +p9132 +sVnds +p9133 +VGerman; Low +p9134 +sVzun +p9135 +V\u30ba\u30cb\u8a9e +p9136 +sVzul +p9137 +V\u30ba\u30fc\u30eb\u30fc\u8a9e +p9138 +sVtwi +p9139 +V\u30c8\u30a6\u30a3\u8a9e +p9140 +sVsog +p9141 +V\u30bd\u30b0\u30c9\u8a9e +p9142 +sVnso +p9143 +VSotho; Northern +p9144 +sVswe +p9145 +V\u30b9\u30a6\u30a7\u30fc\u30c7\u30f3\u8a9e +p9146 +sVsom +p9147 +V\u30bd\u30de\u30ea\u8a9e +p9148 +sVsot +p9149 +V\u30bd\u30c8\u8a9e; \u5357 +p9150 +sVmkd +p9151 +V\u30de\u30b1\u30c9\u30cb\u30a2\u8a9e +p9152 +sVher +p9153 +V\u30d8\u30ec\u30ed\u8a9e +p9154 +sVlol +p9155 +V\u30e2\u30f3\u30b4\u8a9e +p9156 +sVheb +p9157 +V\u30d8\u30d6\u30e9\u30a4\u8a9e +p9158 +sVloz +p9159 +V\u30ed\u30b8\u8a9e +p9160 +sVgil +p9161 +V\u30ad\u30ea\u30d0\u30b9\u8a9e +p9162 +sVwas +p9163 +V\u30ef\u30b7\u30e7\u8a9e +p9164 +sVwar +p9165 +VWaray (Philippines) +p9166 +sVbul +p9167 +V\u30d6\u30eb\u30ac\u30ea\u30a2\u8a9e +p9168 +sVwal +p9169 +VWolaytta +p9170 +sVbua +p9171 +V\u30d6\u30ea\u30e4\u30fc\u30c8\u8a9e +p9172 +sVbug +p9173 +V\u30d6\u30ae\u8a9e +p9174 +sVaze +p9175 +V\u30a2\u30bc\u30eb\u30d0\u30a4\u30b8\u30e3\u30f3\u8a9e +p9176 +sVzha +p9177 +VZhuang +p9178 +sVzho +p9179 +V\u4e2d\u56fd\u8a9e +p9180 +sVnno +p9181 +V\u30cb\u30fc\u30ce\u30b7\u30e5\u30af\u30fb\u30ce\u30eb\u30a6\u30a7\u30fc\u8a9e +p9182 +sVuig +p9183 +V\u30a6\u30a4\u30b0\u30eb\u8a9e +p9184 +sVmyv +p9185 +V\u30a8\u30eb\u30b8\u30e3\u8a9e +p9186 +sVinh +p9187 +V\u30a4\u30f3\u30b0\u30fc\u30b7\u8a9e +p9188 +sVkhm +p9189 +VKhmer; Central +p9190 +sVkho +p9191 +V\u30db\u30fc\u30bf\u30f3\u8a9e +p9192 +sVmya +p9193 +V\u30d3\u30eb\u30de\u8a9e +p9194 +sVkha +p9195 +V\u30ab\u30b7\u8a9e +p9196 +sVina +p9197 +V\u30a4\u30f3\u30bf\u30fc\u30ea\u30f3\u30b0\u30a2\u8a9e (\u56fd\u969b\u88dc\u52a9\u8a9e\u5354\u4f1a) +p9198 +sVtiv +p9199 +V\u30c6\u30a3\u30d6\u8a9e +p9200 +sVtir +p9201 +V\u30c6\u30a3\u30b0\u30ea\u30cb\u30a2\u8a9e +p9202 +sVnap +p9203 +V\u30ca\u30dd\u30ea\u8a9e +p9204 +sVgrb +p9205 +V\u30b0\u30ec\u30dc\u8a9e +p9206 +sVgrc +p9207 +V\u30ae\u30ea\u30b7\u30a2\u8a9e; \u53e4\u4ee3 (-1453) +p9208 +sVnau +p9209 +V\u30ca\u30a6\u30eb\u8a9e +p9210 +sVgrn +p9211 +V\u30b0\u30a2\u30e9\u30cb\u30fc\u8a9e +p9212 +sVtig +p9213 +V\u30c6\u30a3\u30b0\u30ec\u8a9e +p9214 +sVyor +p9215 +V\u30e8\u30eb\u30d0\u8a9e +p9216 +sVile +p9217 +V\u30a4\u30f3\u30bf\u30fc\u30ea\u30f3\u30b0 +p9218 +sVsqi +p9219 +V\u30a2\u30eb\u30d0\u30cb\u30a2\u8a9e +p9220 +ssS'pl' +p9221 +(dp9222 +Vroh +p9223 +Vretoroma\u0144ski +p9224 +sVsco +p9225 +Vscots +p9226 +sVscn +p9227 +Vsycylijski +p9228 +sVrom +p9229 +Vromski +p9230 +sVron +p9231 +Vrumu\u0144ski +p9232 +sVoss +p9233 +Vosetyjski +p9234 +sVale +p9235 +Valeucki +p9236 +sVmni +p9237 +Vmanipuri +p9238 +sVnwc +p9239 +Vnewarski klasyczny +p9240 +sVosa +p9241 +Vosage +p9242 +sValt +p9243 +Va\u0142tajski po\u0142udniowy +p9244 +sVmnc +p9245 +Vmand\u017curski +p9246 +sVmwr +p9247 +Vmarwari +p9248 +sVven +p9249 +Vvenda +p9250 +sVuga +p9251 +Vugarycki +p9252 +sVmwl +p9253 +Vmirandyjski +p9254 +sVfas +p9255 +Vperski +p9256 +sVfat +p9257 +Vfanti +p9258 +sVfan +p9259 +Vfang (Gwinea Rwnikowa) +p9260 +sVfao +p9261 +Vfarerski +p9262 +sVdin +p9263 +Vdinka +p9264 +sVhye +p9265 +Vormia\u0144ski +p9266 +sVbla +p9267 +Vsiksika +p9268 +sVsrd +p9269 +Vsardy\u0144ski +p9270 +sVcar +p9271 +Vkaraibski galibi +p9272 +sVdiv +p9273 +Vmalediwski; divehi +p9274 +sVtel +p9275 +Vtelugu +p9276 +sVtem +p9277 +Vtemne +p9278 +sVnbl +p9279 +Vndebele po\u0142udniowy +p9280 +sVter +p9281 +Vtereno +p9282 +sVtet +p9283 +Vtetum +p9284 +sVsun +p9285 +Vsundajski +p9286 +sVkut +p9287 +Vkutenai +p9288 +sVsuk +p9289 +Vsukuma +p9290 +sVkur +p9291 +Vkurdyjski +p9292 +sVkum +p9293 +Vkumycki +p9294 +sVsus +p9295 +Vsusu +p9296 +sVnew +p9297 +Vnewarski +p9298 +sVkua +p9299 +Vkwanyama +p9300 +sVsux +p9301 +Vsumeryjski +p9302 +sVmen +p9303 +Vmende (Sierra Leone) +p9304 +sVlez +p9305 +Vlezgi\u0144ski +p9306 +sVgla +p9307 +Vszkocki gaelicki +p9308 +sVbos +p9309 +Vbo\u015bniacki +p9310 +sVgle +p9311 +Virlandzki +p9312 +sVeka +p9313 +Vekajuk +p9314 +sVglg +p9315 +Vgalicyjski +p9316 +sVakk +p9317 +Vakadyjski +p9318 +sVaka +p9319 +Vakan +p9320 +sVbod +p9321 +Vtybeta\u0144ski +p9322 +sVglv +p9323 +Vmanx +p9324 +sVjrb +p9325 +Vjudeoarabski +p9326 +sVvie +p9327 +Vwietnamski +p9328 +sVipk +p9329 +Vinupiaq +p9330 +sVuzb +p9331 +Vuzbecki +p9332 +sVsga +p9333 +Vstaroirlandzki (do 900) +p9334 +sVbre +p9335 +Vbreto\u0144ski +p9336 +sVbra +p9337 +Vbrad\u017a +p9338 +sVaym +p9339 +Vajmara +p9340 +sVcha +p9341 +Vczamorro +p9342 +sVchb +p9343 +Vczibcza +p9344 +sVche +p9345 +Vczecze\u0144ski +p9346 +sVchg +p9347 +Vczagatajski +p9348 +sVchk +p9349 +Vchuuk +p9350 +sVchm +p9351 +Vmaryjski (Rosja) +p9352 +sVchn +p9353 +V\u017cargon chinoocki +p9354 +sVcho +p9355 +Vczoktaw +p9356 +sVchp +p9357 +Vchipewyan +p9358 +sVchr +p9359 +Vczerokeski +p9360 +sVchu +p9361 +Vstaros\u0142owia\u0144ski +p9362 +sVchv +p9363 +Vczuwaski +p9364 +sVchy +p9365 +Vczeje\u0144ski +p9366 +sVmsa +p9367 +Vmalajski (makroj\u0119zyk) +p9368 +sViii +p9369 +Vsyczua\u0144ski +p9370 +sVndo +p9371 +Vndonga +p9372 +sVibo +p9373 +Vibo +p9374 +sViba +p9375 +Vibanag +p9376 +sVxho +p9377 +Vxhosa +p9378 +sVdeu +p9379 +Vniemiecki +p9380 +sVcat +p9381 +Vkatalo\u0144ski +p9382 +sVdel +p9383 +Vdelaware +p9384 +sVden +p9385 +Vslavey (atapaska\u0144ski) +p9386 +sVcad +p9387 +Vkaddo +p9388 +sVtat +p9389 +Vtatarski +p9390 +sVsrn +p9391 +Vsranan tongo +p9392 +sVraj +p9393 +Vrad\u017aasthani +p9394 +sVtam +p9395 +Vtamilski +p9396 +sVspa +p9397 +Vhiszpa\u0144ski +p9398 +sVtah +p9399 +Vtahita\u0144ski +p9400 +sVafh +p9401 +Vafrihili +p9402 +sVeng +p9403 +VAngielski +p9404 +sVenm +p9405 +Vangielski \u015bredniowieczny (1100-1500) +p9406 +sVcsb +p9407 +Vkaszubski +p9408 +sVnyn +p9409 +Vnyankole +p9410 +sVnyo +p9411 +Vnyoro +p9412 +sVsid +p9413 +Vsidamo +p9414 +sVnya +p9415 +Vnjand\u017ca +p9416 +sVsin +p9417 +Vsyngaleski +p9418 +sVafr +p9419 +Vafrykanerski +p9420 +sVlam +p9421 +Vlamba +p9422 +sVsnd +p9423 +Vsindhi +p9424 +sVmar +p9425 +Vmarathi +p9426 +sVlah +p9427 +Vlahnda +p9428 +sVnym +p9429 +Vnyamwezi +p9430 +sVsna +p9431 +Vshona +p9432 +sVlad +p9433 +Vladino +p9434 +sVsnk +p9435 +Vsoninke +p9436 +sVmad +p9437 +Vmadurajski +p9438 +sVmag +p9439 +Vmagahi +p9440 +sVmai +p9441 +Vmaithili +p9442 +sVmah +p9443 +Vmarshalski +p9444 +sVlav +p9445 +V\u0142otewski +p9446 +sVmal +p9447 +Vmalajalam +p9448 +sVman +p9449 +Vmandingo +p9450 +sVegy +p9451 +Vegipski (staro\u017cytny) +p9452 +sVzen +p9453 +Vzenaga +p9454 +sVkbd +p9455 +Vkabardyjski +p9456 +sVita +p9457 +Vw\u0142oski +p9458 +sVvai +p9459 +Vwai +p9460 +sVtsn +p9461 +Vtswana +p9462 +sVtso +p9463 +Vtsonga +p9464 +sVtsi +p9465 +Vtsimszian +p9466 +sVbyn +p9467 +Vblin +p9468 +sVfij +p9469 +Vfid\u017cyjski +p9470 +sVfin +p9471 +Vfi\u0144ski +p9472 +sVeus +p9473 +Vbaskijski +p9474 +sVnon +p9475 +Vstaronordyjski +p9476 +sVceb +p9477 +Vcebua\u0144ski +p9478 +sVdan +p9479 +Vdu\u0144ski +p9480 +sVnog +p9481 +Vnogajski +p9482 +sVnob +p9483 +Vnorweski Bokml +p9484 +sVdak +p9485 +Vdakota +p9486 +sVces +p9487 +Vczeski +p9488 +sVdar +p9489 +Vdargwijski +p9490 +sVnor +p9491 +Vnorweski +p9492 +sVkpe +p9493 +Vkpelle +p9494 +sVguj +p9495 +Vgud\u017aarati +p9496 +sVmdf +p9497 +Vmoksza +p9498 +sVmas +p9499 +Vmasajski +p9500 +sVlao +p9501 +Vlaota\u0144ski +p9502 +sVmdr +p9503 +Vmandar +p9504 +sVgon +p9505 +Vgondi +p9506 +sVgoh +p9507 +Vstaro-wysoko-niemiecki (ok. 750-1050) +p9508 +sVsms +p9509 +Vlapo\u0144ski skolt +p9510 +sVsmo +p9511 +Vsamoa\u0144ski +p9512 +sVsmn +p9513 +Vlapo\u0144ski inari +p9514 +sVsmj +p9515 +Vlapo\u0144ski lule +p9516 +sVgot +p9517 +Vgocki +p9518 +sVsme +p9519 +Vp\u0142nocnolapo\u0144ski +p9520 +sVdsb +p9521 +Vdolno\u0142u\u017cycki +p9522 +sVsma +p9523 +Vpo\u0142udniowolapo\u0144ski +p9524 +sVgor +p9525 +Vgorontalo +p9526 +sVast +p9527 +Vasturyjski +p9528 +sVorm +p9529 +Voromo +p9530 +sVque +p9531 +Vkeczua +p9532 +sVori +p9533 +Vorija +p9534 +sVcrh +p9535 +Vkrymskotatarski +p9536 +sVasm +p9537 +Vasamski +p9538 +sVpus +p9539 +Vpaszto +p9540 +sVdgr +p9541 +Vdogrib +p9542 +sVltz +p9543 +Vluksemburski +p9544 +sVgez +p9545 +Vgyyz +p9546 +sVisl +p9547 +Vislandzki +p9548 +sVlat +p9549 +V\u0142aci\u0144ski +p9550 +sVmak +p9551 +Vmakasar +p9552 +sVzap +p9553 +Vzapotecki +p9554 +sVyid +p9555 +Vjidysz +p9556 +sVkok +p9557 +Vkonkani (makroj\u0119zyk) +p9558 +sVkom +p9559 +Vkomi +p9560 +sVkon +p9561 +Vkongo +p9562 +sVukr +p9563 +Vukrai\u0144ski +p9564 +sVton +p9565 +Vtonga\u0144ski (Wyspy Tonga) +p9566 +sVzxx +p9567 +Vbrak kontekstu j\u0119zykowego +p9568 +sVkos +p9569 +Vkosrae +p9570 +sVkor +p9571 +Vkorea\u0144ski +p9572 +sVtog +p9573 +Vtonga\u0144ski (Nyasa) +p9574 +sVhun +p9575 +Vw\u0119gierski +p9576 +sVhup +p9577 +Vhupa +p9578 +sVcym +p9579 +Vwalijski +p9580 +sVudm +p9581 +Vudmurcki +p9582 +sVbej +p9583 +Vbed\u017ca +p9584 +sVben +p9585 +Vbengalski +p9586 +sVbel +p9587 +Vbia\u0142oruski +p9588 +sVbem +p9589 +Vbemba (Zambia) +p9590 +sVaar +p9591 +Vafarski +p9592 +sVnzi +p9593 +Vnzema +p9594 +sVsah +p9595 +Vjakucki +p9596 +sVsan +p9597 +Vsanskryt +p9598 +sVsam +p9599 +Vsamaryta\u0144ski aramejski +p9600 +sVpro +p9601 +Vprowansalski \u015bredniowieczny (do 1500) +p9602 +sVsag +p9603 +Vsango +p9604 +sVsad +p9605 +Vsandawe +p9606 +sVanp +p9607 +Vangika +p9608 +sVrap +p9609 +Vrapanui +p9610 +sVsas +p9611 +Vsasak +p9612 +sVnqo +p9613 +Vn\u2019ko +p9614 +sVsat +p9615 +Vsantali +p9616 +sVmin +p9617 +Vminangkabau +p9618 +sVlim +p9619 +Vlimburgijski +p9620 +sVlin +p9621 +Vlingala +p9622 +sVlit +p9623 +Vlitewski +p9624 +sVefi +p9625 +Vefik +p9626 +sVmis +p9627 +Vj\u0119zyki niezakodowane +p9628 +sVkac +p9629 +Vkaczin +p9630 +sVkab +p9631 +Vkabylski +p9632 +sVkaa +p9633 +Vkaraka\u0142packi +p9634 +sVkan +p9635 +Vkannada +p9636 +sVkam +p9637 +Vkamba (Kenia) +p9638 +sVkal +p9639 +Vkalaallisut +p9640 +sVkas +p9641 +Vkaszmirski +p9642 +sVkaw +p9643 +Vkawi +p9644 +sVkau +p9645 +Vkanuri +p9646 +sVkat +p9647 +Vgruzi\u0144ski +p9648 +sVkaz +p9649 +Vkazaski +p9650 +sVtyv +p9651 +Vtuwi\u0144ski +p9652 +sVawa +p9653 +Vawadhi +p9654 +sVurd +p9655 +Vurdu +p9656 +sVdoi +p9657 +Vdogri (makroj\u0119zyk) +p9658 +sVtpi +p9659 +Vtok pisin +p9660 +sVmri +p9661 +Vmaoryski +p9662 +sVabk +p9663 +Vabchaski +p9664 +sVtkl +p9665 +Vtokelau +p9666 +sVnld +p9667 +Vholenderski +p9668 +sVoji +p9669 +Vod\u017cibwe +p9670 +sVoci +p9671 +Vokcyta\u0144ski (po 1500) +p9672 +sVwol +p9673 +Vwolof +p9674 +sVjav +p9675 +Vjawajski +p9676 +sVhrv +p9677 +Vchorwacki +p9678 +sVzza +p9679 +Vzazaki +p9680 +sVmga +p9681 +Virlandzki \u015bredniowieczny (900-1200) +p9682 +sVhit +p9683 +Vhetycki +p9684 +sVdyu +p9685 +Vdiula +p9686 +sVssw +p9687 +Vsuazi +p9688 +sVmul +p9689 +Vwiele j\u0119zykw +p9690 +sVhil +p9691 +Vhiligajnon +p9692 +sVhin +p9693 +Vhindi +p9694 +sVbas +p9695 +Vbasa (Kamerun) +p9696 +sVgba +p9697 +Vgbaya (Republika \u015arodkowoafryka\u0144ska) +p9698 +sVwln +p9699 +Vwalo\u0144ski +p9700 +sVnep +p9701 +Vnepalski +p9702 +sVcre +p9703 +Vkri +p9704 +sVban +p9705 +Vbalijski +p9706 +sVbal +p9707 +Vbaluczi +p9708 +sVbam +p9709 +Vbambara +p9710 +sVbak +p9711 +Vbaszkirski +p9712 +sVshn +p9713 +Vszan +p9714 +sVarp +p9715 +Varapaho +p9716 +sVarw +p9717 +Varawak +p9718 +sVara +p9719 +Varabski +p9720 +sVarc +p9721 +Varamejski oficjalny (700-300 p.n.e.) +p9722 +sVarg +p9723 +Varago\u0144ski +p9724 +sVsel +p9725 +Vselkupski +p9726 +sVarn +p9727 +Varauka\u0144ski +p9728 +sVlus +p9729 +Vlushai +p9730 +sVmus +p9731 +Vkrik +p9732 +sVlua +p9733 +Vluba-lulua +p9734 +sVlub +p9735 +Vluba-katanga +p9736 +sVlug +p9737 +Vluganda +p9738 +sVlui +p9739 +Vluiseno +p9740 +sVlun +p9741 +Vlunda +p9742 +sVluo +p9743 +Vluo (Kenia i Tanzania) +p9744 +sViku +p9745 +Vinuktitut +p9746 +sVtur +p9747 +Vturecki +p9748 +sVzbl +p9749 +Vbliss +p9750 +sVtuk +p9751 +Vturkme\u0144ski +p9752 +sVtum +p9753 +Vtumbuka +p9754 +sVcop +p9755 +Vkoptyjski +p9756 +sVcos +p9757 +Vkorsyka\u0144ski +p9758 +sVcor +p9759 +Vkornijski +p9760 +sVilo +p9761 +Vilokano +p9762 +sVgwi +p9763 +Vgwich\u02bcin +p9764 +sVund +p9765 +Vnieokre\u015blony +p9766 +sVtli +p9767 +Vtlingit +p9768 +sVtlh +p9769 +Vklingo\u0144ski +p9770 +sVpor +p9771 +Vportugalski +p9772 +sVpon +p9773 +Vpohnpei +p9774 +sVpol +p9775 +VPolski +p9776 +sVang +p9777 +VStaroangielski (ok. 450-1100) +p9778 +sVtgk +p9779 +Vtad\u017cycki +p9780 +sVtgl +p9781 +Vtagalski +p9782 +sVfra +p9783 +Vfrancuski +p9784 +sVdum +p9785 +Vholenderski \u015bredniowieczny (ok. 1050-1350) +p9786 +sVswa +p9787 +Vsuahili (makroj\u0119zyk) +p9788 +sVdua +p9789 +Vduala +p9790 +sVfro +p9791 +Vstarofrancuski (842-ok. 1400) +p9792 +sVyap +p9793 +Vjapski +p9794 +sVfrm +p9795 +Vfrancuski \u015bredniowieczny (ok. 1400-1600) +p9796 +sVfrs +p9797 +Vwschodniofryzyjski +p9798 +sVfrr +p9799 +Vp\u0142nocnofryzyjski +p9800 +sVyao +p9801 +Vyao +p9802 +sVxal +p9803 +Vka\u0142mucki +p9804 +sVfry +p9805 +Vzachodniofryzyjski +p9806 +sVgay +p9807 +Vgayo +p9808 +sVota +p9809 +Vturecki otoma\u0144ski (1500-1928) +p9810 +sVhmn +p9811 +Vhmong +p9812 +sVhmo +p9813 +Vhiri motu +p9814 +sVgaa +p9815 +Vga +p9816 +sVfur +p9817 +Vfriulski +p9818 +sVmlg +p9819 +Vmalgaski +p9820 +sVslv +p9821 +Vs\u0142owe\u0144ski +p9822 +sVain +p9823 +Vajnoski (Japonia) +p9824 +sVfil +p9825 +Vpilipino +p9826 +sVmlt +p9827 +Vmalta\u0144ski +p9828 +sVslk +p9829 +Vs\u0142owacki +p9830 +sVrar +p9831 +Vmaoryski Wysp Cooka +p9832 +sVful +p9833 +Vfulani +p9834 +sVjpn +p9835 +Vjapo\u0144ski +p9836 +sVvol +p9837 +Vwolapik +p9838 +sVvot +p9839 +Vwotycki +p9840 +sVind +p9841 +Vindonezyjski +p9842 +sVave +p9843 +Vawestyjski +p9844 +sVjpr +p9845 +Vjudeo-perski +p9846 +sVava +p9847 +Vawarski +p9848 +sVpap +p9849 +Vpapiamento +p9850 +sVewo +p9851 +Vewondo +p9852 +sVpau +p9853 +Vpalau +p9854 +sVewe +p9855 +Vewe +p9856 +sVpag +p9857 +Vpangasino +p9858 +sVpal +p9859 +Vpahlawi +p9860 +sVpam +p9861 +Vpampango +p9862 +sVpan +p9863 +Vpend\u017cabski +p9864 +sVsyc +p9865 +Vsyryjski klasyczny +p9866 +sVphn +p9867 +Vfenicki +p9868 +sVkir +p9869 +Vkirgiski +p9870 +sVnia +p9871 +Vnias +p9872 +sVkik +p9873 +Vkikiju +p9874 +sVsyr +p9875 +Vsyryjski +p9876 +sVkin +p9877 +Vruanda +p9878 +sVniu +p9879 +Vniue +p9880 +sVgsw +p9881 +Vniemiecki szwajcarski +p9882 +sVepo +p9883 +Vesperanto +p9884 +sVjbo +p9885 +Vlojban +p9886 +sVmic +p9887 +Vmicmac +p9888 +sVtha +p9889 +Vtajski +p9890 +sVhai +p9891 +Vhaida +p9892 +sVgmh +p9893 +V\u015brednio-wysoko-niemiecki (ok. 1050-1500) +p9894 +sVell +p9895 +Vgrecki wsp\u0142czesny (1453-) +p9896 +sVady +p9897 +Vadygejski +p9898 +sVelx +p9899 +Velamicki +p9900 +sVada +p9901 +Vadangme +p9902 +sVnav +p9903 +Vnavaho +p9904 +sVhat +p9905 +Vkreolski haita\u0144ski +p9906 +sVhau +p9907 +Vhausa +p9908 +sVhaw +p9909 +Vhawajski +p9910 +sVbin +p9911 +Vedo +p9912 +sVamh +p9913 +Vamharski +p9914 +sVbik +p9915 +Vbikol +p9916 +sVmos +p9917 +Vmossi +p9918 +sVmoh +p9919 +Vmohawk +p9920 +sVmon +p9921 +Vmongolski +p9922 +sVbho +p9923 +Vbhod\u017apuri +p9924 +sVbis +p9925 +Vbislama +p9926 +sVtvl +p9927 +Vtuvalu +p9928 +sVest +p9929 +Vesto\u0144ski +p9930 +sVkmb +p9931 +Vkimbundu +p9932 +sVpeo +p9933 +Vstaroperski (ok. 600-400 p.n.e) +p9934 +sVumb +p9935 +Vumbundu +p9936 +sVtmh +p9937 +Vtuareski +p9938 +sVfon +p9939 +Vfon +p9940 +sVhsb +p9941 +Vgrno\u0142u\u017cycki +p9942 +sVrun +p9943 +Vrundi +p9944 +sVrus +p9945 +Vrosyjski +p9946 +sVrup +p9947 +Varumu\u0144ski +p9948 +sVpli +p9949 +Vpali +p9950 +sVace +p9951 +Vaczineski +p9952 +sVach +p9953 +Vaczoli +p9954 +sVnde +p9955 +Vndebele p\u0142nocny +p9956 +sVdzo +p9957 +Vdzongka +p9958 +sVkru +p9959 +Vkurukh +p9960 +sVsrr +p9961 +Vserer +p9962 +sVido +p9963 +Vido +p9964 +sVsrp +p9965 +Vserbski +p9966 +sVkrl +p9967 +Vkarelski +p9968 +sVkrc +p9969 +Vkaraczajsko-ba\u0142karski +p9970 +sVnds +p9971 +VGerman; Low +p9972 +sVzun +p9973 +Vzuni +p9974 +sVzul +p9975 +Vzuluski +p9976 +sVtwi +p9977 +Vtwi +p9978 +sVsog +p9979 +Vsogdia\u0144ski +p9980 +sVnso +p9981 +Vsotho p\u0142nocny +p9982 +sVswe +p9983 +Vszwedzki +p9984 +sVsom +p9985 +Vsomalijski +p9986 +sVsot +p9987 +Vsotho po\u0142udniowy +p9988 +sVmkd +p9989 +Vmacedo\u0144ski +p9990 +sVher +p9991 +Vherero +p9992 +sVlol +p9993 +Vmongo +p9994 +sVheb +p9995 +Vhebrajski +p9996 +sVloz +p9997 +Vlozi +p9998 +sVgil +p9999 +Vgilberta\u0144ski +p10000 +sVwas +p10001 +Vwasho +p10002 +sVwar +p10003 +Vwarajski (Filipiny) +p10004 +sVbul +p10005 +Vbu\u0142garski +p10006 +sVwal +p10007 +Vwalamo +p10008 +sVbua +p10009 +Vburiacki +p10010 +sVbug +p10011 +Vbugijski +p10012 +sVaze +p10013 +Vazerski +p10014 +sVzha +p10015 +Vzhuang +p10016 +sVzho +p10017 +Vchi\u0144ski +p10018 +sVnno +p10019 +Vnorweski Nynorsk +p10020 +sVuig +p10021 +Vujgurski +p10022 +sVmyv +p10023 +Verzja +p10024 +sVinh +p10025 +Vinguski +p10026 +sVkhm +p10027 +V\u015brodkowokhmerski +p10028 +sVkho +p10029 +Vchota\u0144ski +p10030 +sVmya +p10031 +Vbirma\u0144ski +p10032 +sVkha +p10033 +Vkhasi +p10034 +sVina +p10035 +Vinterlingua (Mi\u0119dzynarodowe Stowarzyszenie J\u0119zyka Pomocniczego) +p10036 +sVtiv +p10037 +Vtiw +p10038 +sVtir +p10039 +Vtigrinia +p10040 +sVnap +p10041 +Vneapolita\u0144ski +p10042 +sVgrb +p10043 +Vgrebo +p10044 +sVgrc +p10045 +Vgrecki staro\u017cytny (do 1453) +p10046 +sVnau +p10047 +Vnaurua\u0144ski +p10048 +sVgrn +p10049 +Vguarani +p10050 +sVtig +p10051 +Vtigre +p10052 +sVyor +p10053 +Vjoruba +p10054 +sVile +p10055 +Vinterlingue +p10056 +sVsqi +p10057 +Valba\u0144ski +p10058 +ss. \ No newline at end of file diff --git a/src/cps/translations/it/LC_MESSAGES/messages.mo b/src/cps/translations/it/LC_MESSAGES/messages.mo new file mode 100644 index 0000000..90bafee Binary files /dev/null and b/src/cps/translations/it/LC_MESSAGES/messages.mo differ diff --git a/src/cps/translations/it/LC_MESSAGES/messages.po b/src/cps/translations/it/LC_MESSAGES/messages.po new file mode 100644 index 0000000..f276928 --- /dev/null +++ b/src/cps/translations/it/LC_MESSAGES/messages.po @@ -0,0 +1,1976 @@ +# Traduzione in italiano per Calibre-Web. +# Copyright (C) 2016 Smart Cities Community +# This file is distributed under the same license as the Calibre-Web +# Juan F. Villa , 2016. +msgid "" +msgstr "" +"Project-Id-Version: Calibre-Web\n" +"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" +"POT-Creation-Date: 2018-11-03 14:03+0100\n" +"PO-Revision-Date: 2017-04-04 15:09+0200\n" +"Last-Translator: Marco Picone \n" +"Language: it\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134 +#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27 +msgid "not installed" +msgstr "non installato" + +#: cps/converter.py:22 cps/converter.py:38 +msgid "Excecution permissions missing" +msgstr "Mancano autorizzazioni di esecuzione" + +#: cps/converter.py:48 +msgid "not configured" +msgstr "" + +#: cps/helper.py:58 +#, python-format +msgid "%(format)s format not found for book id: %(book)d" +msgstr "" + +#: cps/helper.py:70 +#, python-format +msgid "%(format)s not found on Google Drive: %(fn)s" +msgstr "" + +#: cps/helper.py:77 cps/helper.py:147 cps/templates/detail.html:44 +msgid "Send to Kindle" +msgstr "Invia a Kindle" + +#: cps/helper.py:78 cps/helper.py:96 +msgid "This e-mail has been sent via Calibre-Web." +msgstr "" + +#: cps/helper.py:89 +#, python-format +msgid "%(format)s not found: %(fn)s" +msgstr "" + +#: cps/helper.py:94 +msgid "Calibre-Web test e-mail" +msgstr "" + +#: cps/helper.py:95 +msgid "Test e-mail" +msgstr "" + +#: cps/helper.py:111 +msgid "Get Started with Calibre-Web" +msgstr "" + +#: cps/helper.py:112 +#, python-format +msgid "Registration e-mail for user: %(name)s" +msgstr "" + +#: cps/helper.py:135 cps/helper.py:145 +msgid "Could not find any formats suitable for sending by e-mail" +msgstr "" + +#: cps/helper.py:148 +#, python-format +msgid "E-mail: %(book)s" +msgstr "" + +#: cps/helper.py:150 +msgid "The requested file could not be read. Maybe wrong permissions?" +msgstr "" + +#: cps/helper.py:250 +#, python-format +msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "" + +#: cps/helper.py:259 +#, python-format +msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "" + +#: cps/helper.py:281 cps/helper.py:290 +#, python-format +msgid "File %(file)s not found on Google Drive" +msgstr "" + +#: cps/helper.py:308 +#, python-format +msgid "Book path %(path)s not found on Google Drive" +msgstr "" + +#: cps/helper.py:565 +msgid "Error excecuting UnRar" +msgstr "" + +#: cps/helper.py:567 +msgid "Unrar binary file not found" +msgstr "" + +#: cps/helper.py:609 +msgid "Waiting" +msgstr "" + +#: cps/helper.py:611 +msgid "Failed" +msgstr "" + +#: cps/helper.py:613 +msgid "Started" +msgstr "" + +#: cps/helper.py:615 +msgid "Finished" +msgstr "" + +#: cps/helper.py:617 +msgid "Unknown Status" +msgstr "" + +#: cps/helper.py:622 +msgid "E-mail: " +msgstr "" + +#: cps/helper.py:624 cps/helper.py:628 +msgid "Convert: " +msgstr "" + +#: cps/helper.py:626 +msgid "Upload: " +msgstr "" + +#: cps/helper.py:630 +msgid "Unknown Task: " +msgstr "" + +#: cps/web.py:1132 cps/web.py:2842 +msgid "Unknown" +msgstr "" + +#: cps/web.py:1141 cps/web.py:1172 cps/web.py:1257 +msgid "HTTP Error" +msgstr "" + +#: cps/web.py:1143 cps/web.py:1174 cps/web.py:1258 +msgid "Connection error" +msgstr "" + +#: cps/web.py:1145 cps/web.py:1176 cps/web.py:1259 +msgid "Timeout while establishing connection" +msgstr "" + +#: cps/web.py:1147 cps/web.py:1178 cps/web.py:1260 +msgid "General error" +msgstr "" + +#: cps/web.py:1153 +msgid "Unexpected data while reading update information" +msgstr "" + +#: cps/web.py:1160 +msgid "No update available. You already have the latest version installed" +msgstr "" + +#: cps/web.py:1185 +msgid "A new update is available. Click on the button below to update to the latest version." +msgstr "" + +#: cps/web.py:1235 +msgid "Could not fetch update information" +msgstr "" + +#: cps/web.py:1250 +msgid "Requesting update package" +msgstr "Richiesta del pacchetto di aggiornamento" + +#: cps/web.py:1251 +msgid "Downloading update package" +msgstr "Scaricare il pacchetto di aggiornamento" + +#: cps/web.py:1252 +msgid "Unzipping update package" +msgstr "Decomprimere pacchetto di aggiornamento" + +#: cps/web.py:1253 +msgid "Replacing files" +msgstr "" + +#: cps/web.py:1254 +msgid "Database connections are closed" +msgstr "Le connessioni di database sono chiuse" + +#: cps/web.py:1255 +msgid "Stopping server" +msgstr "" + +#: cps/web.py:1256 +msgid "Update finished, please press okay and reload page" +msgstr "Aggiornamento completato, prego premere bene e ricaricare pagina" + +#: cps/web.py:1257 cps/web.py:1258 cps/web.py:1259 cps/web.py:1260 +msgid "Update failed:" +msgstr "" + +#: cps/web.py:1283 +msgid "Recently Added Books" +msgstr "Libri aggiunti di recente" + +#: cps/web.py:1293 +msgid "Newest Books" +msgstr "I più nuovi libri" + +#: cps/web.py:1305 +msgid "Oldest Books" +msgstr "Libri più vecchi" + +#: cps/web.py:1317 +msgid "Books (A-Z)" +msgstr "Ebook (A-Z)" + +#: cps/web.py:1328 +msgid "Books (Z-A)" +msgstr "Ebook (Z-A)" + +#: cps/web.py:1357 +msgid "Hot Books (most downloaded)" +msgstr "Hot Books (più scaricati)" + +#: cps/web.py:1370 +msgid "Best rated books" +msgstr "I migliori libri valutati" + +#: cps/templates/index.xml:39 cps/web.py:1383 +msgid "Random Books" +msgstr "Libri casuali" + +#: cps/web.py:1398 +msgid "Author list" +msgstr "Elenco degli autori" + +#: cps/web.py:1410 cps/web.py:1501 cps/web.py:1663 cps/web.py:2206 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "Errore durante l'apertura di eBook. Il file non esiste o il file non è accessibile:" + +#: cps/web.py:1438 +msgid "Publisher list" +msgstr "" + +#: cps/web.py:1452 +#, python-format +msgid "Publisher: %(name)s" +msgstr "" + +#: cps/templates/index.xml:83 cps/web.py:1484 +msgid "Series list" +msgstr "Lista delle serie" + +#: cps/web.py:1499 +#, python-format +msgid "Series: %(serie)s" +msgstr "Serie :" + +#: cps/web.py:1528 +msgid "Available languages" +msgstr "Lingue disponibili" + +#: cps/web.py:1548 +#, python-format +msgid "Language: %(name)s" +msgstr "Lingue: %(name)s" + +#: cps/templates/index.xml:76 cps/web.py:1559 +msgid "Category list" +msgstr "Elenco categorie" + +#: cps/web.py:1573 +#, python-format +msgid "Category: %(name)s" +msgstr "Categoria : %(name)s" + +#: cps/templates/layout.html:71 cps/web.py:1699 +msgid "Tasks" +msgstr "" + +#: cps/web.py:1733 +msgid "Statistics" +msgstr "Statistica" + +#: cps/web.py:1840 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "" + +#: cps/web.py:1915 +msgid "Server restarted, please reload page" +msgstr "Server riavviato, ricarica pagina" + +#: cps/web.py:1918 +msgid "Performing shutdown of server, please close window" +msgstr "Eseguire l'arresto del server, chiudi la finestra." + +#: cps/web.py:1937 +msgid "Update done" +msgstr "Aggiornamento fatto" + +#: cps/web.py:2007 +msgid "Published after " +msgstr "" + +#: cps/web.py:2014 +msgid "Published before " +msgstr "" + +#: cps/web.py:2028 +#, python-format +msgid "Rating <= %(rating)s" +msgstr "" + +#: cps/web.py:2030 +#, python-format +msgid "Rating >= %(rating)s" +msgstr "" + +#: cps/web.py:2089 cps/web.py:2098 +msgid "search" +msgstr "ricerca" + +#: cps/templates/index.xml:47 cps/templates/index.xml:51 +#: cps/templates/layout.html:146 cps/web.py:2165 +msgid "Read Books" +msgstr "Leggere libri" + +#: cps/templates/index.xml:55 cps/templates/index.xml:59 +#: cps/templates/layout.html:148 cps/web.py:2168 +msgid "Unread Books" +msgstr "Libri non letti" + +#: cps/web.py:2216 cps/web.py:2218 cps/web.py:2220 cps/web.py:2232 +msgid "Read a Book" +msgstr "Leggere un libro" + +#: cps/web.py:2298 cps/web.py:3201 +msgid "Please fill out all fields!" +msgstr "Compila tutti i campi" + +#: cps/web.py:2299 cps/web.py:2320 cps/web.py:2324 cps/web.py:2329 +#: cps/web.py:2331 +msgid "register" +msgstr "Registrare" + +#: cps/web.py:2319 cps/web.py:3417 +msgid "An unknown error occurred. Please try again later." +msgstr "" + +#: cps/web.py:2322 +msgid "Your e-mail is not allowed to register" +msgstr "" + +#: cps/web.py:2325 +msgid "Confirmation e-mail was send to your e-mail account." +msgstr "" + +#: cps/web.py:2328 +msgid "This username or e-mail address is already in use." +msgstr "" + +#: cps/web.py:2345 cps/web.py:2441 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "ora sei connesso come : '%(nickname)s'" + +#: cps/web.py:2350 +msgid "Wrong Username or Password" +msgstr "Nome utente o password errata" + +#: cps/web.py:2356 cps/web.py:2377 +msgid "login" +msgstr "Accesso" + +#: cps/web.py:2389 cps/web.py:2420 +msgid "Token not found" +msgstr "Token non trovato" + +#: cps/web.py:2397 cps/web.py:2428 +msgid "Token has expired" +msgstr "Il token è scaduto" + +#: cps/web.py:2405 +msgid "Success! Please return to your device" +msgstr "Successo! Torna al tuo dispositivo" + +#: cps/web.py:2455 +msgid "Please configure the SMTP mail settings first..." +msgstr "Configurare prima le impostazioni della posta SMTP..." + +#: cps/web.py:2459 +#, python-format +msgid "Book successfully queued for sending to %(kindlemail)s" +msgstr "" + +#: cps/web.py:2463 +#, python-format +msgid "There was an error sending this book: %(res)s" +msgstr "Si è verificato un errore durante l'invio di questo libro: %(res)s" + +#: cps/web.py:2465 cps/web.py:3255 +msgid "Please configure your kindle e-mail address first..." +msgstr "" + +#: cps/web.py:2476 cps/web.py:2528 +msgid "Invalid shelf specified" +msgstr "" + +#: cps/web.py:2483 +#, python-format +msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2491 +msgid "You are not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2500 +#, python-format +msgid "Book is already part of the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2514 +#, python-format +msgid "Book has been added to shelf: %(sname)s" +msgstr "Il libro è stato aggiunto alla mensola: %(sname)s" + +#: cps/web.py:2533 +#, python-format +msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgstr "" + +#: cps/web.py:2538 +msgid "User is not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2556 +#, python-format +msgid "Books are already part of the shelf: %(name)s" +msgstr "" + +#: cps/web.py:2570 +#, python-format +msgid "Books have been added to shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2572 +#, python-format +msgid "Could not add books to shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2609 +#, python-format +msgid "Book has been removed from shelf: %(sname)s" +msgstr "Il libro è stato rimosso dalla mensola: %(sname)s" + +#: cps/web.py:2615 +#, python-format +msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2635 cps/web.py:2659 +#, python-format +msgid "A shelf with the name '%(title)s' already exists." +msgstr "Uno scaffale con il nome '%(title)s' esiste già." + +#: cps/web.py:2640 +#, python-format +msgid "Shelf %(title)s created" +msgstr "Mensola %(title)s creato" + +#: cps/web.py:2642 cps/web.py:2670 +msgid "There was an error" +msgstr "c'era un errore" + +#: cps/web.py:2643 cps/web.py:2645 +msgid "create a shelf" +msgstr "creare uno scaffale" + +#: cps/web.py:2668 +#, python-format +msgid "Shelf %(title)s changed" +msgstr "Mensola %(title)s cambiato" + +#: cps/web.py:2671 cps/web.py:2673 +msgid "Edit a shelf" +msgstr "Modifica un ripiano" + +#: cps/web.py:2694 +#, python-format +msgid "successfully deleted shelf %(name)s" +msgstr "cancellato con successo il ripiano %(name)s" + +#: cps/web.py:2721 +#, python-format +msgid "Shelf: '%(name)s'" +msgstr "Mensola: '%(name)s'" + +#: cps/web.py:2724 +msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "Errore durante l'apertura dello scaffale. La mensola non esiste o non è accessibile" + +#: cps/web.py:2755 +#, python-format +msgid "Change order of Shelf: '%(name)s'" +msgstr "Modificare l'ordine della mensola: '%(name)s'" + +#: cps/web.py:2784 cps/web.py:3207 +msgid "E-mail is not from valid domain" +msgstr "" + +#: cps/web.py:2786 cps/web.py:2829 cps/web.py:2832 +#, python-format +msgid "%(name)s's profile" +msgstr "Profilo di %(name)s" + +#: cps/web.py:2827 +msgid "Found an existing account for this e-mail address." +msgstr "" + +#: cps/web.py:2830 +msgid "Profile updated" +msgstr "Profilo aggiornato" + +#: cps/web.py:2858 +msgid "Admin page" +msgstr "Pagina di amministrazione" + +#: cps/web.py:2938 cps/web.py:3112 +msgid "Calibre-Web configuration updated" +msgstr "Aggiornamento della configurazione del calibro-web" + +#: cps/templates/admin.html:100 cps/web.py:2951 +msgid "UI Configuration" +msgstr "" + +#: cps/web.py:2969 +msgid "Import of optional Google Drive requirements missing" +msgstr "" + +#: cps/web.py:2972 +msgid "client_secrets.json is missing or not readable" +msgstr "" + +#: cps/web.py:2977 cps/web.py:3004 +msgid "client_secrets.json is not configured for web application" +msgstr "" + +#: cps/templates/admin.html:99 cps/web.py:3007 cps/web.py:3033 cps/web.py:3045 +#: cps/web.py:3088 cps/web.py:3103 cps/web.py:3120 cps/web.py:3127 +#: cps/web.py:3142 +msgid "Basic Configuration" +msgstr "Configurazione di base" + +#: cps/web.py:3030 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:3042 +msgid "Certfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:3085 +msgid "Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:3124 +msgid "DB location is not valid, please enter correct path" +msgstr "Posizione DB non valida. Inserisci il percorso corretto." + +#: cps/templates/admin.html:33 cps/web.py:3203 cps/web.py:3209 cps/web.py:3225 +msgid "Add new user" +msgstr "Aggiungi un nuovo utente" + +#: cps/web.py:3215 +#, python-format +msgid "User '%(user)s' created" +msgstr "utente '%(user)s' creato" + +#: cps/web.py:3219 +msgid "Found an existing account for this e-mail address or nickname." +msgstr "" + +#: cps/web.py:3243 cps/web.py:3257 +msgid "E-mail server settings updated" +msgstr "" + +#: cps/web.py:3250 +#, python-format +msgid "Test e-mail successfully send to %(kindlemail)s" +msgstr "" + +#: cps/web.py:3253 +#, python-format +msgid "There was an error sending the Test e-mail: %(res)s" +msgstr "" + +#: cps/web.py:3258 +msgid "Edit e-mail server settings" +msgstr "" + +#: cps/web.py:3283 +#, python-format +msgid "User '%(nick)s' deleted" +msgstr "utente '%(nick)s' cancellati" + +#: cps/web.py:3392 +#, python-format +msgid "User '%(nick)s' updated" +msgstr "utente '%(nick)s' aggiornato" + +#: cps/web.py:3395 +msgid "An unknown error occured." +msgstr "Errore imprevisto." + +#: cps/web.py:3397 +#, python-format +msgid "Edit User %(nick)s" +msgstr "Modifica utente %(nick)s" + +#: cps/web.py:3414 +#, python-format +msgid "Password for user %(user)s reset" +msgstr "" + +#: cps/web.py:3428 cps/web.py:3629 +msgid "Error opening eBook. File does not exist or file is not accessible" +msgstr "Errore durante l'apertura di eBook. Il file non esiste o il file non è accessibile" + +#: cps/web.py:3453 cps/web.py:3912 +msgid "edit metadata" +msgstr "modificare la metainformazione" + +#: cps/web.py:3546 cps/web.py:3782 +#, python-format +msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" +msgstr "Non è consentito caricare i file con l'estensione '%(ext)s' a questo server" + +#: cps/web.py:3550 cps/web.py:3786 +msgid "File to be uploaded must have an extension" +msgstr "Il file da caricare deve avere un'estensione" + +#: cps/web.py:3562 cps/web.py:3806 +#, python-format +msgid "Failed to create path %(path)s (Permission denied)." +msgstr "Impossibile creare il percorso %(path)s (autorizzazione negata)" + +#: cps/web.py:3567 +#, python-format +msgid "Failed to store file %(file)s." +msgstr "" + +#: cps/web.py:3583 +#, python-format +msgid "File format %(ext)s added to %(book)s" +msgstr "" + +#: cps/web.py:3601 +#, python-format +msgid "Failed to create path for cover %(path)s (Permission denied)." +msgstr "" + +#: cps/web.py:3608 +#, python-format +msgid "Failed to store cover-file %(cover)s." +msgstr "" + +#: cps/web.py:3611 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/web.py:3641 cps/web.py:3650 cps/web.py:3654 +msgid "unknown" +msgstr "Sconosciuto" + +#: cps/web.py:3673 +msgid "Cover is not a jpg file, can't save" +msgstr "" + +#: cps/web.py:3721 +#, python-format +msgid "%(langname)s is not a valid language" +msgstr "" + +#: cps/web.py:3752 +msgid "Metadata successfully updated" +msgstr "" + +#: cps/web.py:3761 +msgid "Error editing book, please check logfile for details" +msgstr "" + +#: cps/web.py:3811 +#, python-format +msgid "Failed to store file %(file)s (Permission denied)." +msgstr "Impossibile archiviare il file %(file)s (autorizzazione negata)" + +#: cps/web.py:3816 +#, python-format +msgid "Failed to delete file %(file)s (Permission denied)." +msgstr "Impossibile eliminare il file %(file)s (autorizzazione negata)" + +#: cps/web.py:3898 +#, python-format +msgid "File %(file)s uploaded" +msgstr "" + +#: cps/web.py:3928 +msgid "Source or destination format for conversion missing" +msgstr "" + +#: cps/web.py:3938 +#, python-format +msgid "Book successfully queued for converting to %(book_format)s" +msgstr "" + +#: cps/web.py:3942 +#, python-format +msgid "There was an error converting this book: %(res)s" +msgstr "" + +#: cps/worker.py:287 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "" + +#: cps/worker.py:298 +#, python-format +msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" +msgstr "errore" + +#: cps/templates/admin.html:6 +msgid "User list" +msgstr "elenco utenti" + +#: cps/templates/admin.html:9 +msgid "Nickname" +msgstr "Nickname" + +#: cps/templates/admin.html:10 +msgid "E-mail" +msgstr "" + +#: cps/templates/admin.html:11 +msgid "Kindle" +msgstr "Kindle" + +#: cps/templates/admin.html:12 +msgid "DLS" +msgstr "DLS" + +#: cps/templates/admin.html:13 cps/templates/layout.html:74 +msgid "Admin" +msgstr "Admin" + +#: cps/templates/admin.html:14 cps/templates/detail.html:22 +#: cps/templates/detail.html:31 +msgid "Download" +msgstr "Download" + +#: cps/templates/admin.html:15 cps/templates/layout.html:64 +msgid "Upload" +msgstr "Upload" + +#: cps/templates/admin.html:16 +msgid "Edit" +msgstr "Modifica" + +#: cps/templates/admin.html:39 +msgid "SMTP e-mail server settings" +msgstr "" + +#: cps/templates/admin.html:42 cps/templates/email_edit.html:11 +msgid "SMTP hostname" +msgstr "SMTP hostname" + +#: cps/templates/admin.html:43 +msgid "SMTP port" +msgstr "SMTP port" + +#: cps/templates/admin.html:44 +msgid "SSL" +msgstr "SSL" + +#: cps/templates/admin.html:45 cps/templates/email_edit.html:27 +msgid "SMTP login" +msgstr "SMTP login" + +#: cps/templates/admin.html:46 +msgid "From mail" +msgstr "From mail" + +#: cps/templates/admin.html:56 +msgid "Change SMTP settings" +msgstr "Modificare SMTP impostazioni" + +#: cps/templates/admin.html:62 +msgid "Configuration" +msgstr "Configurazione" + +#: cps/templates/admin.html:65 +msgid "Calibre DB dir" +msgstr "Calibre DB dir" + +#: cps/templates/admin.html:69 +msgid "Log level" +msgstr "" + +#: cps/templates/admin.html:73 +msgid "Port" +msgstr "Port" + +#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23 +msgid "Books per page" +msgstr "Libri per pagina" + +#: cps/templates/admin.html:83 +msgid "Uploading" +msgstr "Uploading" + +#: cps/templates/admin.html:87 +msgid "Anonymous browsing" +msgstr "" + +#: cps/templates/admin.html:91 +msgid "Public registration" +msgstr "Registrazione pubblica" + +#: cps/templates/admin.html:95 cps/templates/remote_login.html:4 +msgid "Remote login" +msgstr "Login remoto" + +#: cps/templates/admin.html:106 +msgid "Administration" +msgstr "Administration" + +#: cps/templates/admin.html:107 +msgid "Reconnect to Calibre DB" +msgstr "Ricollegare al DB Calibre" + +#: cps/templates/admin.html:108 +msgid "Restart Calibre-Web" +msgstr "Ricomincia Calibre-Web" + +#: cps/templates/admin.html:109 +msgid "Stop Calibre-Web" +msgstr "Stop Calibre-Web" + +#: cps/templates/admin.html:115 +msgid "Update" +msgstr "" + +#: cps/templates/admin.html:119 +msgid "Version" +msgstr "" + +#: cps/templates/admin.html:120 +msgid "Details" +msgstr "" + +#: cps/templates/admin.html:126 +msgid "Current version" +msgstr "" + +#: cps/templates/admin.html:132 +msgid "Check for update" +msgstr "Ricerca aggiornamenti" + +#: cps/templates/admin.html:133 +msgid "Perform Update" +msgstr "Esegui aggiornamento" + +#: cps/templates/admin.html:145 +msgid "Do you really want to restart Calibre-Web?" +msgstr "Vuoi veramente riavviare Caliber-web?" + +#: cps/templates/admin.html:150 cps/templates/admin.html:164 +#: cps/templates/admin.html:184 cps/templates/shelf.html:61 +msgid "Ok" +msgstr "Ok" + +#: cps/templates/admin.html:151 cps/templates/admin.html:165 +#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200 +#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168 +#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75 +#: cps/templates/shelf.html:62 cps/templates/shelf_edit.html:19 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155 +msgid "Back" +msgstr "Indietro" + +#: cps/templates/admin.html:163 +msgid "Do you really want to stop Calibre-Web?" +msgstr "Vuoi veramente fermare Caliber-web?" + +#: cps/templates/admin.html:175 +msgid "Updating, please do not reload page" +msgstr "Aggiornamento, non ricaricare la pagina." + +#: cps/templates/author.html:15 +msgid "via" +msgstr "via" + +#: cps/templates/author.html:23 +msgid "In Library" +msgstr "In libreria" + +#: cps/templates/author.html:69 +msgid "More by" +msgstr "Altro da" + +#: cps/templates/book_edit.html:16 +msgid "Delete Book" +msgstr "Elimina libro" + +#: cps/templates/book_edit.html:19 +msgid "Delete formats:" +msgstr "" + +#: cps/templates/book_edit.html:22 cps/templates/book_edit.html:199 +#: cps/templates/email_edit.html:73 cps/templates/email_edit.html:74 +msgid "Delete" +msgstr "Elimina" + +#: cps/templates/book_edit.html:30 +msgid "Convert book format:" +msgstr "" + +#: cps/templates/book_edit.html:34 +msgid "Convert from:" +msgstr "" + +#: cps/templates/book_edit.html:36 cps/templates/book_edit.html:43 +msgid "select an option" +msgstr "" + +#: cps/templates/book_edit.html:41 +msgid "Convert to:" +msgstr "" + +#: cps/templates/book_edit.html:50 +msgid "Convert book" +msgstr "" + +#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6 +msgid "Book Title" +msgstr "Titolo del libro" + +#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:259 +#: cps/templates/book_edit.html:277 cps/templates/search_form.html:10 +msgid "Author" +msgstr "Autore" + +#: cps/templates/book_edit.html:67 cps/templates/book_edit.html:264 +#: cps/templates/book_edit.html:279 cps/templates/search_form.html:106 +msgid "Description" +msgstr "Descrizione" + +#: cps/templates/book_edit.html:71 cps/templates/search_form.html:33 +msgid "Tags" +msgstr "Tags" + +#: cps/templates/book_edit.html:75 cps/templates/layout.html:157 +#: cps/templates/search_form.html:53 +msgid "Series" +msgstr "Serie" + +#: cps/templates/book_edit.html:79 +msgid "Series id" +msgstr "Series id" + +#: cps/templates/book_edit.html:83 +msgid "Rating" +msgstr "Valutazione" + +#: cps/templates/book_edit.html:87 +msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +msgstr "" + +#: cps/templates/book_edit.html:91 +msgid "Upload Cover from local drive" +msgstr "" + +#: cps/templates/book_edit.html:96 cps/templates/detail.html:135 +msgid "Publishing date" +msgstr "Data di pubblicazione" + +#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:278 cps/templates/detail.html:127 +#: cps/templates/search_form.html:14 +msgid "Publisher" +msgstr "Editore" + +#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31 +msgid "Language" +msgstr "Lingua" + +#: cps/templates/book_edit.html:117 cps/templates/search_form.html:117 +msgid "Yes" +msgstr "Si" + +#: cps/templates/book_edit.html:118 cps/templates/search_form.html:118 +msgid "No" +msgstr "No" + +#: cps/templates/book_edit.html:164 +msgid "Upload format" +msgstr "" + +#: cps/templates/book_edit.html:173 +msgid "view book after edit" +msgstr "visualizzare il libro dopo la modifica" + +#: cps/templates/book_edit.html:176 cps/templates/book_edit.html:212 +msgid "Get metadata" +msgstr "Ottieni metadati" + +#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210 +#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20 +#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17 +#: cps/templates/user_edit.html:153 +msgid "Submit" +msgstr "Sottoscrivi" + +#: cps/templates/book_edit.html:191 +msgid "Are you really sure?" +msgstr "Sei davvero sicuro?" + +#: cps/templates/book_edit.html:194 +msgid "Book will be deleted from Calibre database" +msgstr "l libro verrà cancellato dal database Calibre'" + +#: cps/templates/book_edit.html:195 +msgid "and from hard disk" +msgstr "e dal disco rigido" + +#: cps/templates/book_edit.html:215 +msgid "Keyword" +msgstr "Parola chiave" + +#: cps/templates/book_edit.html:216 +msgid " Search keyword " +msgstr "Cerca parola chiave" + +#: cps/templates/book_edit.html:218 cps/templates/layout.html:46 +msgid "Go!" +msgstr "Partire" + +#: cps/templates/book_edit.html:222 +msgid "Click the cover to load metadata to the form" +msgstr "Fai clic sul coperchio per caricare i metadati nel modulo" + +#: cps/templates/book_edit.html:234 cps/templates/book_edit.html:274 +msgid "Loading..." +msgstr "Caricamento in corso..." + +#: cps/templates/book_edit.html:239 cps/templates/layout.html:224 +msgid "Close" +msgstr "Chiuso" + +#: cps/templates/book_edit.html:266 cps/templates/book_edit.html:280 +msgid "Source" +msgstr "fonte" + +#: cps/templates/book_edit.html:275 +msgid "Search error!" +msgstr "Errore di ricerca!" + +#: cps/templates/book_edit.html:276 +msgid "No Result(s) found! Please try aonther keyword." +msgstr "" + +#: cps/templates/config_edit.html:12 +msgid "Library Configuration" +msgstr "" + +#: cps/templates/config_edit.html:19 +msgid "Location of Calibre database" +msgstr "Posizione del database Calibre" + +#: cps/templates/config_edit.html:24 +msgid "Use Google Drive?" +msgstr "Usa Google Drive?" + +#: cps/templates/config_edit.html:30 +msgid "Google Drive config problem" +msgstr "" + +#: cps/templates/config_edit.html:36 +msgid "Authenticate Google Drive" +msgstr "" + +#: cps/templates/config_edit.html:40 +msgid "Please finish Google Drive setup after login" +msgstr "" + +#: cps/templates/config_edit.html:44 +msgid "Google Drive Calibre folder" +msgstr "" + +#: cps/templates/config_edit.html:52 +msgid "Metadata Watch Channel ID" +msgstr "ID canale Watch Metadata" + +#: cps/templates/config_edit.html:55 +msgid "Revoke" +msgstr "" + +#: cps/templates/config_edit.html:73 +msgid "Server Configuration" +msgstr "" + +#: cps/templates/config_edit.html:80 +msgid "Server Port" +msgstr "Porta del server" + +#: cps/templates/config_edit.html:84 +msgid "SSL certfile location (leave it empty for non-SSL Servers)" +msgstr "" + +#: cps/templates/config_edit.html:88 +msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" +msgstr "" + +#: cps/templates/config_edit.html:99 +msgid "Logfile Configuration" +msgstr "" + +#: cps/templates/config_edit.html:106 +msgid "Log Level" +msgstr "Livello del registro" + +#: cps/templates/config_edit.html:115 +msgid "Location and name of logfile (calibre-web.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:126 +msgid "Feature Configuration" +msgstr "" + +#: cps/templates/config_edit.html:134 +msgid "Enable uploading" +msgstr "Abilita il caricamento" + +#: cps/templates/config_edit.html:138 +msgid "Enable anonymous browsing" +msgstr "Abilita la navigazione anonima" + +#: cps/templates/config_edit.html:142 +msgid "Enable public registration" +msgstr "Abilita la registrazione pubblica" + +#: cps/templates/config_edit.html:146 +msgid "Enable remote login (\"magic link\")" +msgstr "Attiva login remoto (\"magic link\")" + +#: cps/templates/config_edit.html:151 +msgid "Use" +msgstr "Uso" + +#: cps/templates/config_edit.html:152 +msgid "Obtain an API Key" +msgstr "Ottenere una chiave API" + +#: cps/templates/config_edit.html:156 +msgid "Goodreads API Key" +msgstr "API di Goodreads" + +#: cps/templates/config_edit.html:160 +msgid "Goodreads API Secret" +msgstr "Goodreads API Secret" + +#: cps/templates/config_edit.html:173 +msgid "External binaries" +msgstr "" + +#: cps/templates/config_edit.html:181 +msgid "No converter" +msgstr "" + +#: cps/templates/config_edit.html:183 +msgid "Use Kindlegen" +msgstr "" + +#: cps/templates/config_edit.html:185 +msgid "Use calibre's ebook converter" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "E-Book converter settings" +msgstr "" + +#: cps/templates/config_edit.html:193 +msgid "Path to convertertool" +msgstr "" + +#: cps/templates/config_edit.html:199 +msgid "Location of Unrar binary" +msgstr "" + +#: cps/templates/config_edit.html:215 cps/templates/layout.html:82 +#: cps/templates/login.html:4 +msgid "Login" +msgstr "Accesso" + +#: cps/templates/config_view_edit.html:12 +msgid "View Configuration" +msgstr "" + +#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 +#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 +msgid "Title" +msgstr "Titolo" + +#: cps/templates/config_view_edit.html:27 +msgid "No. of random books to show" +msgstr "Numero di libri casuali da mostrare" + +#: cps/templates/config_view_edit.html:31 +msgid "Regular expression for ignoring columns" +msgstr "Espressione regolare per ignorare le colonne" + +#: cps/templates/config_view_edit.html:35 +msgid "Link read/unread status to Calibre column" +msgstr "" + +#: cps/templates/config_view_edit.html:44 +msgid "Regular expression for title sorting" +msgstr "Espressione regolare per la selezione del titolo" + +#: cps/templates/config_view_edit.html:48 +msgid "Tags for Mature Content" +msgstr "Tags per Contenuti maturi" + +#: cps/templates/config_view_edit.html:62 +msgid "Default settings for new users" +msgstr "Impostazioni predefinite per i nuovi utenti" + +#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110 +msgid "Admin user" +msgstr "Utente amministratore" + +#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119 +msgid "Allow Downloads" +msgstr "Consenti download" + +#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123 +msgid "Allow Uploads" +msgstr "Consenti caricamenti" + +#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127 +msgid "Allow Edit" +msgstr "Consenti Modifica" + +#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131 +msgid "Allow Delete books" +msgstr "Consenti l'eliminazione di libri" + +#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136 +msgid "Allow Changing Password" +msgstr "Consenti la modifica della password" + +#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140 +msgid "Allow Editing Public Shelfs" +msgstr "Consenti la modifica dei ripiani pubblici" + +#: cps/templates/config_view_edit.html:104 +msgid "Default visibilities for new users" +msgstr "" + +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58 +msgid "Show random books" +msgstr "Mostra libro a caso" + +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62 +msgid "Show recent books" +msgstr "" + +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66 +msgid "Show sorted books" +msgstr "" + +#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70 +msgid "Show hot books" +msgstr "Mostra libri popolari" + +#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74 +msgid "Show best rated books" +msgstr "Mostra sezione più votati" + +#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78 +msgid "Show language selection" +msgstr "Mostra sezione lingua" + +#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82 +msgid "Show series selection" +msgstr "Mostra sezione serie" + +#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86 +msgid "Show category selection" +msgstr "Mostra sezione categorie" + +#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90 +msgid "Show author selection" +msgstr "Mostra sezione autore" + +#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94 +msgid "Show publisher selection" +msgstr "" + +#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98 +msgid "Show read and unread" +msgstr "Mostra letto e non letto" + +#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102 +msgid "Show random books in detail view" +msgstr "Un libro a caso" + +#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115 +msgid "Show mature content" +msgstr "Mostra sezione adulti" + +#: cps/templates/detail.html:49 +msgid "Read in browser" +msgstr "Leggere nel browser" + +#: cps/templates/detail.html:88 +msgid "Book" +msgstr "Libro" + +#: cps/templates/detail.html:88 +msgid "of" +msgstr "di" + +#: cps/templates/detail.html:94 +msgid "language" +msgstr "Lingua" + +#: cps/templates/detail.html:172 +msgid "Read" +msgstr "Leggere" + +#: cps/templates/detail.html:182 +msgid "Description:" +msgstr "Descrizione :" + +#: cps/templates/detail.html:195 cps/templates/search.html:14 +msgid "Add to shelf" +msgstr "Aggiungi al ripiano" + +#: cps/templates/detail.html:257 +msgid "Edit metadata" +msgstr "Modifica metadati" + +#: cps/templates/email_edit.html:15 +msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +msgstr "Puerto SMTP (por lo general 25 para SMTP plano, 465 para SSL y 587 para STARTTLS)" + +#: cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "crittografia" + +#: cps/templates/email_edit.html:21 +msgid "None" +msgstr "Nessuna" + +#: cps/templates/email_edit.html:22 +msgid "STARTTLS" +msgstr "STATRTTLS" + +#: cps/templates/email_edit.html:23 +msgid "SSL/TLS" +msgstr "SSL/TLS" + +#: cps/templates/email_edit.html:31 +msgid "SMTP password" +msgstr "SMTP password" + +#: cps/templates/email_edit.html:35 +msgid "From e-mail" +msgstr "Dall'email" + +#: cps/templates/email_edit.html:38 +msgid "Save settings" +msgstr "Salva le impostazioni" + +#: cps/templates/email_edit.html:39 +msgid "Save settings and send Test E-Mail" +msgstr "Salvare le impostazioni e inviare Test e-mail" + +#: cps/templates/email_edit.html:43 +msgid "Allowed domains for registering" +msgstr "" + +#: cps/templates/email_edit.html:47 +msgid "Enter domainname" +msgstr "" + +#: cps/templates/email_edit.html:55 +msgid "Add Domain" +msgstr "" + +#: cps/templates/email_edit.html:58 +msgid "Add" +msgstr "" + +#: cps/templates/email_edit.html:72 +msgid "Do you really want to delete this domain rule?" +msgstr "" + +#: cps/templates/feed.xml:21 cps/templates/layout.html:208 +msgid "Next" +msgstr "Prossimo" + +#: cps/templates/feed.xml:33 cps/templates/index.xml:11 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 +msgid "Search" +msgstr "Cerca" + +#: cps/templates/index.html:5 +msgid "Discover (Random Books)" +msgstr "Scoprire (Libri casuali)" + +#: cps/templates/index.xml:6 +msgid "Start" +msgstr "Inizio" + +#: cps/templates/index.xml:18 cps/templates/layout.html:139 +msgid "Hot Books" +msgstr "Hot Ebook" + +#: cps/templates/index.xml:22 +msgid "Popular publications from this catalog based on Downloads." +msgstr "Pubblicazioni popolari di questo catalogo in base ai download." + +#: cps/templates/index.xml:25 cps/templates/layout.html:142 +msgid "Best rated Books" +msgstr "Libri più votati" + +#: cps/templates/index.xml:29 +msgid "Popular publications from this catalog based on Rating." +msgstr "Pubblicazioni popolari di questo catalogo basate su Rating." + +#: cps/templates/index.xml:32 +msgid "New Books" +msgstr "Nuovi libri" + +#: cps/templates/index.xml:36 +msgid "The latest Books" +msgstr "Gli ultimi Libri" + +#: cps/templates/index.xml:43 +msgid "Show Random Books" +msgstr "Mostra libri casuali" + +#: cps/templates/index.xml:62 cps/templates/layout.html:160 +msgid "Authors" +msgstr "Autori" + +#: cps/templates/index.xml:66 +msgid "Books ordered by Author" +msgstr "Libri ordinati dall'autore" + +#: cps/templates/index.xml:69 cps/templates/layout.html:163 +msgid "Publishers" +msgstr "" + +#: cps/templates/index.xml:73 +msgid "Books ordered by publisher" +msgstr "" + +#: cps/templates/index.xml:80 +msgid "Books ordered by category" +msgstr "Libri ordinati per categoria" + +#: cps/templates/index.xml:87 +msgid "Books ordered by series" +msgstr "Libri ordinati per serie" + +#: cps/templates/index.xml:90 cps/templates/layout.html:169 +msgid "Public Shelves" +msgstr "Ripiani pubblici" + +#: cps/templates/index.xml:94 +msgid "Books organized in public shelfs, visible to everyone" +msgstr "" + +#: cps/templates/index.xml:98 cps/templates/layout.html:173 +msgid "Your Shelves" +msgstr "I tuoi scaffali" + +#: cps/templates/index.xml:102 +msgid "User's own shelfs, only visible to the current user himself" +msgstr "" + +#: cps/templates/layout.html:33 +msgid "Toggle navigation" +msgstr "Toggle navigation" + +#: cps/templates/layout.html:54 +msgid "Advanced Search" +msgstr "Ricerca avanzata" + +#: cps/templates/layout.html:78 +msgid "Logout" +msgstr "Logout" + +#: cps/templates/layout.html:83 cps/templates/register.html:14 +msgid "Register" +msgstr "Registrare" + +#: cps/templates/layout.html:108 +msgid "Uploading..." +msgstr "" + +#: cps/templates/layout.html:109 +msgid "please don't refresh the page" +msgstr "" + +#: cps/templates/layout.html:120 +msgid "Browse" +msgstr "Navigare" + +#: cps/templates/layout.html:122 +msgid "Recently Added" +msgstr "Aggiunto recentemente" + +#: cps/templates/layout.html:127 +msgid "Sorted Books" +msgstr "Libri ordinati" + +#: cps/templates/layout.html:131 cps/templates/layout.html:132 +#: cps/templates/layout.html:133 cps/templates/layout.html:134 +msgid "Sort By" +msgstr "Ordina per" + +#: cps/templates/layout.html:131 +msgid "Newest" +msgstr "i più nuovi" + +#: cps/templates/layout.html:132 +msgid "Oldest" +msgstr "il più vecchio" + +#: cps/templates/layout.html:133 +msgid "Ascending" +msgstr "Ascendente" + +#: cps/templates/layout.html:134 +msgid "Descending" +msgstr "Discendente" + +#: cps/templates/layout.html:151 +msgid "Discover" +msgstr "Per scoprire" + +#: cps/templates/layout.html:154 +msgid "Categories" +msgstr "Categoria" + +#: cps/templates/layout.html:166 cps/templates/search_form.html:74 +msgid "Languages" +msgstr "lingua" + +#: cps/templates/layout.html:178 +msgid "Create a Shelf" +msgstr "Crea una mensola" + +#: cps/templates/layout.html:179 cps/templates/stats.html:3 +msgid "About" +msgstr "Di" + +#: cps/templates/layout.html:193 +msgid "Previous" +msgstr "Precedente" + +#: cps/templates/layout.html:220 +msgid "Book Details" +msgstr "Dettagli ebook" + +#: cps/templates/login.html:8 cps/templates/login.html:9 +#: cps/templates/register.html:7 cps/templates/user_edit.html:8 +msgid "Username" +msgstr "Username" + +#: cps/templates/login.html:12 cps/templates/login.html:13 +#: cps/templates/user_edit.html:21 +msgid "Password" +msgstr "Password" + +#: cps/templates/login.html:17 +msgid "Remember me" +msgstr "Ricordami" + +#: cps/templates/login.html:22 +msgid "Log in with magic link" +msgstr "Accedi con il collegamento magico" + +#: cps/templates/osd.xml:5 +msgid "Calibre-Web ebook catalog" +msgstr "" + +#: cps/templates/read.html:69 cps/templates/readcbr.html:79 +#: cps/templates/readcbr.html:103 +msgid "Settings" +msgstr "" + +#: cps/templates/read.html:72 +msgid "Reflow text when sidebars are open." +msgstr "Ridimensionare il testo quando le barre laterali sono aperte" + +#: cps/templates/readcbr.html:84 +msgid "Keyboard Shortcuts" +msgstr "" + +#: cps/templates/readcbr.html:87 +msgid "Previous Page" +msgstr "" + +#: cps/templates/readcbr.html:88 +msgid "Next Page" +msgstr "" + +#: cps/templates/readcbr.html:89 +msgid "Scale to Best" +msgstr "" + +#: cps/templates/readcbr.html:90 +msgid "Scale to Width" +msgstr "" + +#: cps/templates/readcbr.html:91 +msgid "Scale to Height" +msgstr "" + +#: cps/templates/readcbr.html:92 +msgid "Scale to Native" +msgstr "" + +#: cps/templates/readcbr.html:93 +msgid "Rotate Right" +msgstr "" + +#: cps/templates/readcbr.html:94 +msgid "Rotate Left" +msgstr "" + +#: cps/templates/readcbr.html:95 +msgid "Flip Image" +msgstr "" + +#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39 +msgid "Theme" +msgstr "" + +#: cps/templates/readcbr.html:111 +msgid "Light" +msgstr "" + +#: cps/templates/readcbr.html:112 +msgid "Dark" +msgstr "" + +#: cps/templates/readcbr.html:117 +msgid "Scale" +msgstr "" + +#: cps/templates/readcbr.html:120 +msgid "Best" +msgstr "" + +#: cps/templates/readcbr.html:121 +msgid "Width" +msgstr "" + +#: cps/templates/readcbr.html:122 +msgid "Height" +msgstr "" + +#: cps/templates/readcbr.html:123 +msgid "Native" +msgstr "" + +#: cps/templates/readcbr.html:128 +msgid "Rotate" +msgstr "" + +#: cps/templates/readcbr.html:139 +msgid "Flip" +msgstr "" + +#: cps/templates/readcbr.html:142 +msgid "Horizontal" +msgstr "" + +#: cps/templates/readcbr.html:143 +msgid "Vertical" +msgstr "" + +#: cps/templates/readpdf.html:29 +msgid "PDF.js viewer" +msgstr "Visiera PDF.js" + +#: cps/templates/readtxt.html:6 +msgid "Basic txt Reader" +msgstr "Lettore base txt" + +#: cps/templates/register.html:4 +msgid "Register a new account" +msgstr "Registra un nuovo account" + +#: cps/templates/register.html:8 +msgid "Choose a username" +msgstr "Scegli un nome utente" + +#: cps/templates/register.html:11 cps/templates/user_edit.html:13 +msgid "E-mail address" +msgstr "" + +#: cps/templates/register.html:12 +msgid "Your email address" +msgstr "Il tuo indirizzo e-mail" + +#: cps/templates/remote_login.html:6 +msgid "Using your another device, visit" +msgstr "Utilizzando l'altro dispositivo, visita" + +#: cps/templates/remote_login.html:6 +msgid "and log in" +msgstr "e accedi" + +#: cps/templates/remote_login.html:9 +msgid "Once you do so, you will automatically get logged in on this device." +msgstr "Una volta fatto questo, ti verrà automaticamente connesso in questo dispositivo" + +#: cps/templates/search.html:5 +msgid "No Results for:" +msgstr "Nessun risultato per:" + +#: cps/templates/search.html:6 +msgid "Please try a different search" +msgstr "Prova una ricerca diversa" + +#: cps/templates/search.html:8 +msgid "Results for:" +msgstr "Risultati per:" + +#: cps/templates/search_form.html:19 +msgid "Publishing date from" +msgstr "" + +#: cps/templates/search_form.html:26 +msgid "Publishing date to" +msgstr "" + +#: cps/templates/search_form.html:43 +msgid "Exclude Tags" +msgstr "Elimina i tag" + +#: cps/templates/search_form.html:63 +msgid "Exclude Series" +msgstr "Escludi la serie" + +#: cps/templates/search_form.html:84 +msgid "Exclude Languages" +msgstr "Elimina lingue" + +#: cps/templates/search_form.html:97 +msgid "Rating bigger than" +msgstr "" + +#: cps/templates/search_form.html:101 +msgid "Rating less than" +msgstr "" + +#: cps/templates/shelf.html:7 +msgid "Delete this Shelf" +msgstr "Cancellare questa libreria" + +#: cps/templates/shelf.html:8 +msgid "Edit Shelf" +msgstr "" + +#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11 +msgid "Change order" +msgstr "Cambia ordine" + +#: cps/templates/shelf.html:56 +msgid "Do you really want to delete the shelf?" +msgstr "Vuoi davvero eliminare lo scaffale?" + +#: cps/templates/shelf.html:59 +msgid "Shelf will be lost for everybody and forever!" +msgstr "La mensola sarà perduta per tutti e per sempre!" + +#: cps/templates/shelf_edit.html:13 +msgid "should the shelf be public?" +msgstr "Pubblico?" + +#: cps/templates/shelf_order.html:5 +msgid "Drag 'n drop to rearrange order" +msgstr "Riordina drag and drop" + +#: cps/templates/stats.html:7 +msgid "Calibre library statistics" +msgstr "Statistiche libreria" + +#: cps/templates/stats.html:12 +msgid "Books in this Library" +msgstr "Libri in questa libreria" + +#: cps/templates/stats.html:16 +msgid "Authors in this Library" +msgstr "Autori in questa libreria" + +#: cps/templates/stats.html:20 +msgid "Categories in this Library" +msgstr "Categorie in questa libreria" + +#: cps/templates/stats.html:24 +msgid "Series in this Library" +msgstr "Serie in questa libreria" + +#: cps/templates/stats.html:28 +msgid "Linked libraries" +msgstr "Link libreria" + +#: cps/templates/stats.html:32 +msgid "Program library" +msgstr "Programma libreria" + +#: cps/templates/stats.html:33 +msgid "Installed Version" +msgstr "Versione installata" + +#: cps/templates/tasks.html:7 +msgid "Tasks list" +msgstr "" + +#: cps/templates/tasks.html:12 +msgid "User" +msgstr "" + +#: cps/templates/tasks.html:14 +msgid "Task" +msgstr "" + +#: cps/templates/tasks.html:15 +msgid "Status" +msgstr "" + +#: cps/templates/tasks.html:16 +msgid "Progress" +msgstr "" + +#: cps/templates/tasks.html:17 +msgid "Runtime" +msgstr "" + +#: cps/templates/tasks.html:18 +msgid "Starttime" +msgstr "" + +#: cps/templates/tasks.html:24 +msgid "Delete finished tasks" +msgstr "" + +#: cps/templates/tasks.html:25 +msgid "Hide all tasks" +msgstr "" + +#: cps/templates/user_edit.html:18 +msgid "Reset user Password" +msgstr "" + +#: cps/templates/user_edit.html:27 +msgid "Kindle E-Mail" +msgstr "Email Kindle" + +#: cps/templates/user_edit.html:41 +msgid "Standard Theme" +msgstr "" + +#: cps/templates/user_edit.html:42 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "" + +#: cps/templates/user_edit.html:47 +msgid "Show books with language" +msgstr "Mostra libri per lingua" + +#: cps/templates/user_edit.html:49 +msgid "Show all" +msgstr "Mostra tutto" + +#: cps/templates/user_edit.html:147 +msgid "Delete this user" +msgstr "Elimina questo utente" + +#: cps/templates/user_edit.html:162 +msgid "Recent Downloads" +msgstr "Download Recenti" + +#~ msgid "%s: %s" +#~ msgstr "" + +#~ msgid "E-Mail: %(book)s" +#~ msgstr "" + +#~ msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Password for user %(user)s reset" +#~ msgstr "" + +#~ msgid "Password for user %s reset" +#~ msgstr "" + +#~ msgid "Rename title from: '%(src)s' to '%(src)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Rename author from: '%(src)s' to '%(src)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Failed to create path for cover %(cover)s (Permission denied)." +#~ msgstr "" + +#~ msgid "File extension '%s' is not allowed to be uploaded to this server" +#~ msgstr "" + +#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server" +#~ msgstr "Non è consentito caricare i file con l'estensione \"%(ext)s\" a questo server" + +#~ msgid "Current commit timestamp" +#~ msgstr "Timestamp di commit corrente" + +#~ msgid "Newest commit timestamp" +#~ msgstr "Più recente commit timestamp" + +#~ msgid "Convert: %(book)s" +#~ msgstr "" + +#~ msgid "Convert to %(format)s: %(book)s" +#~ msgstr "" + +#~ msgid "Files are replaced" +#~ msgstr "I file vengono sostituiti" + +#~ msgid "Server is stopped" +#~ msgstr "Il server viene arrestato" + +#~ msgid "Convertertool %(converter)s not found" +#~ msgstr "" + +#~ msgid "Choose a password" +#~ msgstr "Scegli una chiave" + diff --git a/src/cps/translations/ja/LC_MESSAGES/messages.mo b/src/cps/translations/ja/LC_MESSAGES/messages.mo new file mode 100644 index 0000000..635875e Binary files /dev/null and b/src/cps/translations/ja/LC_MESSAGES/messages.mo differ diff --git a/src/cps/translations/ja/LC_MESSAGES/messages.po b/src/cps/translations/ja/LC_MESSAGES/messages.po new file mode 100644 index 0000000..28c198b --- /dev/null +++ b/src/cps/translations/ja/LC_MESSAGES/messages.po @@ -0,0 +1,1977 @@ +# Japanese translations for Calibre-Web. +# Copyright (C) 2017 Calibre-Web +# This file is distributed under the same license as the Calibre-Web +# project. +# FIRST AUTHOR white, 2017. +msgid "" +msgstr "" +"Project-Id-Version: Calibre-Web\n" +"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" +"POT-Creation-Date: 2018-11-03 14:03+0100\n" +"PO-Revision-Date: 2018-02-07 02:20-0500\n" +"Last-Translator: white \n" +"Language: ja\n" +"Language-Team: ja \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134 +#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27 +msgid "not installed" +msgstr "インストールされません" + +#: cps/converter.py:22 cps/converter.py:38 +msgid "Excecution permissions missing" +msgstr "実行許可はありません" + +#: cps/converter.py:48 +msgid "not configured" +msgstr "" + +#: cps/helper.py:58 +#, python-format +msgid "%(format)s format not found for book id: %(book)d" +msgstr "" + +#: cps/helper.py:70 +#, python-format +msgid "%(format)s not found on Google Drive: %(fn)s" +msgstr "" + +#: cps/helper.py:77 cps/helper.py:147 cps/templates/detail.html:44 +msgid "Send to Kindle" +msgstr "Kindleに送信する" + +#: cps/helper.py:78 cps/helper.py:96 +msgid "This e-mail has been sent via Calibre-Web." +msgstr "" + +#: cps/helper.py:89 +#, python-format +msgid "%(format)s not found: %(fn)s" +msgstr "" + +#: cps/helper.py:94 +msgid "Calibre-Web test e-mail" +msgstr "" + +#: cps/helper.py:95 +msgid "Test e-mail" +msgstr "" + +#: cps/helper.py:111 +msgid "Get Started with Calibre-Web" +msgstr "" + +#: cps/helper.py:112 +#, python-format +msgid "Registration e-mail for user: %(name)s" +msgstr "" + +#: cps/helper.py:135 cps/helper.py:145 +msgid "Could not find any formats suitable for sending by e-mail" +msgstr "" + +#: cps/helper.py:148 +#, python-format +msgid "E-mail: %(book)s" +msgstr "" + +#: cps/helper.py:150 +msgid "The requested file could not be read. Maybe wrong permissions?" +msgstr "" + +#: cps/helper.py:250 +#, python-format +msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "" + +#: cps/helper.py:259 +#, python-format +msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "" + +#: cps/helper.py:281 cps/helper.py:290 +#, python-format +msgid "File %(file)s not found on Google Drive" +msgstr "" + +#: cps/helper.py:308 +#, python-format +msgid "Book path %(path)s not found on Google Drive" +msgstr "" + +#: cps/helper.py:565 +msgid "Error excecuting UnRar" +msgstr "" + +#: cps/helper.py:567 +msgid "Unrar binary file not found" +msgstr "" + +#: cps/helper.py:609 +msgid "Waiting" +msgstr "" + +#: cps/helper.py:611 +msgid "Failed" +msgstr "" + +#: cps/helper.py:613 +msgid "Started" +msgstr "" + +#: cps/helper.py:615 +msgid "Finished" +msgstr "" + +#: cps/helper.py:617 +msgid "Unknown Status" +msgstr "" + +#: cps/helper.py:622 +msgid "E-mail: " +msgstr "" + +#: cps/helper.py:624 cps/helper.py:628 +msgid "Convert: " +msgstr "" + +#: cps/helper.py:626 +msgid "Upload: " +msgstr "" + +#: cps/helper.py:630 +msgid "Unknown Task: " +msgstr "" + +#: cps/web.py:1132 cps/web.py:2842 +msgid "Unknown" +msgstr "" + +#: cps/web.py:1141 cps/web.py:1172 cps/web.py:1257 +msgid "HTTP Error" +msgstr "" + +#: cps/web.py:1143 cps/web.py:1174 cps/web.py:1258 +msgid "Connection error" +msgstr "" + +#: cps/web.py:1145 cps/web.py:1176 cps/web.py:1259 +msgid "Timeout while establishing connection" +msgstr "" + +#: cps/web.py:1147 cps/web.py:1178 cps/web.py:1260 +msgid "General error" +msgstr "" + +#: cps/web.py:1153 +msgid "Unexpected data while reading update information" +msgstr "" + +#: cps/web.py:1160 +msgid "No update available. You already have the latest version installed" +msgstr "" + +#: cps/web.py:1185 +msgid "A new update is available. Click on the button below to update to the latest version." +msgstr "" + +#: cps/web.py:1235 +msgid "Could not fetch update information" +msgstr "" + +#: cps/web.py:1250 +msgid "Requesting update package" +msgstr "更新パッケージを要求します" + +#: cps/web.py:1251 +msgid "Downloading update package" +msgstr "更新パッケージをダウンロードします" + +#: cps/web.py:1252 +msgid "Unzipping update package" +msgstr "更新パッケージをZIP解凍します" + +#: cps/web.py:1253 +msgid "Replacing files" +msgstr "" + +#: cps/web.py:1254 +msgid "Database connections are closed" +msgstr "データベースの接続が閉じられました" + +#: cps/web.py:1255 +msgid "Stopping server" +msgstr "" + +#: cps/web.py:1256 +msgid "Update finished, please press okay and reload page" +msgstr "更新完了、Okayまたは再読み込みボタンを押してください" + +#: cps/web.py:1257 cps/web.py:1258 cps/web.py:1259 cps/web.py:1260 +msgid "Update failed:" +msgstr "" + +#: cps/web.py:1283 +msgid "Recently Added Books" +msgstr "最近追加された本" + +#: cps/web.py:1293 +msgid "Newest Books" +msgstr "最新の本" + +#: cps/web.py:1305 +msgid "Oldest Books" +msgstr "最古の本" + +#: cps/web.py:1317 +msgid "Books (A-Z)" +msgstr "本(A-Z)" + +#: cps/web.py:1328 +msgid "Books (Z-A)" +msgstr "本 (Z-A)" + +#: cps/web.py:1357 +msgid "Hot Books (most downloaded)" +msgstr "有名な本(ダウンロード数)" + +#: cps/web.py:1370 +msgid "Best rated books" +msgstr "最高評判の本" + +#: cps/templates/index.xml:39 cps/web.py:1383 +msgid "Random Books" +msgstr "任意の本" + +#: cps/web.py:1398 +msgid "Author list" +msgstr "著者リスト" + +#: cps/web.py:1410 cps/web.py:1501 cps/web.py:1663 cps/web.py:2206 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "電子本を開けません。ファイルは存在しないまたはアクセスできません" + +#: cps/web.py:1438 +msgid "Publisher list" +msgstr "" + +#: cps/web.py:1452 +#, python-format +msgid "Publisher: %(name)s" +msgstr "" + +#: cps/templates/index.xml:83 cps/web.py:1484 +msgid "Series list" +msgstr "叢書リスト" + +#: cps/web.py:1499 +#, python-format +msgid "Series: %(serie)s" +msgstr "叢書: %(serie)s" + +#: cps/web.py:1528 +msgid "Available languages" +msgstr "利用可能な言語" + +#: cps/web.py:1548 +#, python-format +msgid "Language: %(name)s" +msgstr "言語: %(name)s" + +#: cps/templates/index.xml:76 cps/web.py:1559 +msgid "Category list" +msgstr "カテゴリーリスト" + +#: cps/web.py:1573 +#, python-format +msgid "Category: %(name)s" +msgstr "カテゴリー: %(name)s" + +#: cps/templates/layout.html:71 cps/web.py:1699 +msgid "Tasks" +msgstr "" + +#: cps/web.py:1733 +msgid "Statistics" +msgstr "統計" + +#: cps/web.py:1840 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "" + +#: cps/web.py:1915 +msgid "Server restarted, please reload page" +msgstr "サーバを再起動しました、ページを再読み込みしてください" + +#: cps/web.py:1918 +msgid "Performing shutdown of server, please close window" +msgstr "サーバをシャットダウンします、ページを閉じてください" + +#: cps/web.py:1937 +msgid "Update done" +msgstr "更新完了" + +#: cps/web.py:2007 +msgid "Published after " +msgstr "" + +#: cps/web.py:2014 +msgid "Published before " +msgstr "" + +#: cps/web.py:2028 +#, python-format +msgid "Rating <= %(rating)s" +msgstr "" + +#: cps/web.py:2030 +#, python-format +msgid "Rating >= %(rating)s" +msgstr "" + +#: cps/web.py:2089 cps/web.py:2098 +msgid "search" +msgstr "検索" + +#: cps/templates/index.xml:47 cps/templates/index.xml:51 +#: cps/templates/layout.html:146 cps/web.py:2165 +msgid "Read Books" +msgstr "既読の本" + +#: cps/templates/index.xml:55 cps/templates/index.xml:59 +#: cps/templates/layout.html:148 cps/web.py:2168 +msgid "Unread Books" +msgstr "未読の本" + +#: cps/web.py:2216 cps/web.py:2218 cps/web.py:2220 cps/web.py:2232 +msgid "Read a Book" +msgstr "本を読む" + +#: cps/web.py:2298 cps/web.py:3201 +msgid "Please fill out all fields!" +msgstr "全ての項目を入力してください" + +#: cps/web.py:2299 cps/web.py:2320 cps/web.py:2324 cps/web.py:2329 +#: cps/web.py:2331 +msgid "register" +msgstr "登録" + +#: cps/web.py:2319 cps/web.py:3417 +msgid "An unknown error occurred. Please try again later." +msgstr "" + +#: cps/web.py:2322 +msgid "Your e-mail is not allowed to register" +msgstr "" + +#: cps/web.py:2325 +msgid "Confirmation e-mail was send to your e-mail account." +msgstr "" + +#: cps/web.py:2328 +msgid "This username or e-mail address is already in use." +msgstr "" + +#: cps/web.py:2345 cps/web.py:2441 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "%(nickname)s としてログインします" + +#: cps/web.py:2350 +msgid "Wrong Username or Password" +msgstr "ユーザ名またはパスワードは間違いました" + +#: cps/web.py:2356 cps/web.py:2377 +msgid "login" +msgstr "ログイン" + +#: cps/web.py:2389 cps/web.py:2420 +msgid "Token not found" +msgstr "トークンは見つかりません" + +#: cps/web.py:2397 cps/web.py:2428 +msgid "Token has expired" +msgstr "トークンは失効されました" + +#: cps/web.py:2405 +msgid "Success! Please return to your device" +msgstr "成功しまた!端末に戻ってください" + +#: cps/web.py:2455 +msgid "Please configure the SMTP mail settings first..." +msgstr "SMTPメールをまず設定してください" + +#: cps/web.py:2459 +#, python-format +msgid "Book successfully queued for sending to %(kindlemail)s" +msgstr "" + +#: cps/web.py:2463 +#, python-format +msgid "There was an error sending this book: %(res)s" +msgstr "%(res)s を送信する際にエーラが発生しました" + +#: cps/web.py:2465 cps/web.py:3255 +msgid "Please configure your kindle e-mail address first..." +msgstr "" + +#: cps/web.py:2476 cps/web.py:2528 +msgid "Invalid shelf specified" +msgstr "" + +#: cps/web.py:2483 +#, python-format +msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2491 +msgid "You are not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2500 +#, python-format +msgid "Book is already part of the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2514 +#, python-format +msgid "Book has been added to shelf: %(sname)s" +msgstr "本 %(sname)s を書架に追加されました" + +#: cps/web.py:2533 +#, python-format +msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgstr "" + +#: cps/web.py:2538 +msgid "User is not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2556 +#, python-format +msgid "Books are already part of the shelf: %(name)s" +msgstr "" + +#: cps/web.py:2570 +#, python-format +msgid "Books have been added to shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2572 +#, python-format +msgid "Could not add books to shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2609 +#, python-format +msgid "Book has been removed from shelf: %(sname)s" +msgstr "本 %(sname)s を書架から除去されました" + +#: cps/web.py:2615 +#, python-format +msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2635 cps/web.py:2659 +#, python-format +msgid "A shelf with the name '%(title)s' already exists." +msgstr "名前を使った書架 '%(title)s' は既に存在しました" + +#: cps/web.py:2640 +#, python-format +msgid "Shelf %(title)s created" +msgstr "書架%(title)s は作成されました" + +#: cps/web.py:2642 cps/web.py:2670 +msgid "There was an error" +msgstr "エーラが発生しました" + +#: cps/web.py:2643 cps/web.py:2645 +msgid "create a shelf" +msgstr "書架を作成する" + +#: cps/web.py:2668 +#, python-format +msgid "Shelf %(title)s changed" +msgstr "書架 %(title)s 変わりました" + +#: cps/web.py:2671 cps/web.py:2673 +msgid "Edit a shelf" +msgstr "書架を編集する" + +#: cps/web.py:2694 +#, python-format +msgid "successfully deleted shelf %(name)s" +msgstr "%(name)s の書架を削除されました" + +#: cps/web.py:2721 +#, python-format +msgid "Shelf: '%(name)s'" +msgstr "書架: '%(name)s'" + +#: cps/web.py:2724 +msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "書架を開けません。書架は存在しないまたはアクセスできません" + +#: cps/web.py:2755 +#, python-format +msgid "Change order of Shelf: '%(name)s'" +msgstr "'%(name)s' の書架の順番を入れ替える" + +#: cps/web.py:2784 cps/web.py:3207 +msgid "E-mail is not from valid domain" +msgstr "" + +#: cps/web.py:2786 cps/web.py:2829 cps/web.py:2832 +#, python-format +msgid "%(name)s's profile" +msgstr "%(name)sのプロファイル" + +#: cps/web.py:2827 +msgid "Found an existing account for this e-mail address." +msgstr "" + +#: cps/web.py:2830 +msgid "Profile updated" +msgstr "プロファイルが更新されました" + +#: cps/web.py:2858 +msgid "Admin page" +msgstr "管理者ページ" + +#: cps/web.py:2938 cps/web.py:3112 +msgid "Calibre-Web configuration updated" +msgstr "Calibre-Web 設定を更新されました" + +#: cps/templates/admin.html:100 cps/web.py:2951 +msgid "UI Configuration" +msgstr "" + +#: cps/web.py:2969 +msgid "Import of optional Google Drive requirements missing" +msgstr "" + +#: cps/web.py:2972 +msgid "client_secrets.json is missing or not readable" +msgstr "" + +#: cps/web.py:2977 cps/web.py:3004 +msgid "client_secrets.json is not configured for web application" +msgstr "" + +#: cps/templates/admin.html:99 cps/web.py:3007 cps/web.py:3033 cps/web.py:3045 +#: cps/web.py:3088 cps/web.py:3103 cps/web.py:3120 cps/web.py:3127 +#: cps/web.py:3142 +msgid "Basic Configuration" +msgstr "基本設定" + +#: cps/web.py:3030 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:3042 +msgid "Certfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:3085 +msgid "Logfile location is not valid, please enter correct path" +msgstr "ログファイルの場所は不適切です。正しい場所を入力してください" + +#: cps/web.py:3124 +msgid "DB location is not valid, please enter correct path" +msgstr "データベースの場所は不適切です。正しい場所を入力してください" + +#: cps/templates/admin.html:33 cps/web.py:3203 cps/web.py:3209 cps/web.py:3225 +msgid "Add new user" +msgstr "新規ユーザ追加" + +#: cps/web.py:3215 +#, python-format +msgid "User '%(user)s' created" +msgstr "ユーザ '%(user)s' が作成されました" + +#: cps/web.py:3219 +msgid "Found an existing account for this e-mail address or nickname." +msgstr "" + +#: cps/web.py:3243 cps/web.py:3257 +msgid "E-mail server settings updated" +msgstr "" + +#: cps/web.py:3250 +#, python-format +msgid "Test e-mail successfully send to %(kindlemail)s" +msgstr "" + +#: cps/web.py:3253 +#, python-format +msgid "There was an error sending the Test e-mail: %(res)s" +msgstr "" + +#: cps/web.py:3258 +msgid "Edit e-mail server settings" +msgstr "" + +#: cps/web.py:3283 +#, python-format +msgid "User '%(nick)s' deleted" +msgstr "ユーザ '%(nick)s' 削除されました" + +#: cps/web.py:3392 +#, python-format +msgid "User '%(nick)s' updated" +msgstr "ユーザ '%(nick)s' 更新されました" + +#: cps/web.py:3395 +msgid "An unknown error occured." +msgstr "不明のエーラが発生しました" + +#: cps/web.py:3397 +#, python-format +msgid "Edit User %(nick)s" +msgstr "ユーザ編集 %(nick)s" + +#: cps/web.py:3414 +#, python-format +msgid "Password for user %(user)s reset" +msgstr "" + +#: cps/web.py:3428 cps/web.py:3629 +msgid "Error opening eBook. File does not exist or file is not accessible" +msgstr "電子本を開けません。ファイルは存在しないまたはアクセスできません" + +#: cps/web.py:3453 cps/web.py:3912 +msgid "edit metadata" +msgstr "メタデータを編集します" + +#: cps/web.py:3546 cps/web.py:3782 +#, python-format +msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" +msgstr "ファイル拡張子 '%(ext)s' をこのサーバにアップロードする許可はありません" + +#: cps/web.py:3550 cps/web.py:3786 +msgid "File to be uploaded must have an extension" +msgstr "ファイルをアップロードするために拡張子が必要です" + +#: cps/web.py:3562 cps/web.py:3806 +#, python-format +msgid "Failed to create path %(path)s (Permission denied)." +msgstr "場所 %(path)s の作成を失敗しました (許可拒否)" + +#: cps/web.py:3567 +#, python-format +msgid "Failed to store file %(file)s." +msgstr "フアイル %(file)s の保存を失敗しました" + +#: cps/web.py:3583 +#, python-format +msgid "File format %(ext)s added to %(book)s" +msgstr "" + +#: cps/web.py:3601 +#, python-format +msgid "Failed to create path for cover %(path)s (Permission denied)." +msgstr "" + +#: cps/web.py:3608 +#, python-format +msgid "Failed to store cover-file %(cover)s." +msgstr "" + +#: cps/web.py:3611 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/web.py:3641 cps/web.py:3650 cps/web.py:3654 +msgid "unknown" +msgstr "不明" + +#: cps/web.py:3673 +msgid "Cover is not a jpg file, can't save" +msgstr "" + +#: cps/web.py:3721 +#, python-format +msgid "%(langname)s is not a valid language" +msgstr "" + +#: cps/web.py:3752 +msgid "Metadata successfully updated" +msgstr "" + +#: cps/web.py:3761 +msgid "Error editing book, please check logfile for details" +msgstr "" + +#: cps/web.py:3811 +#, python-format +msgid "Failed to store file %(file)s (Permission denied)." +msgstr "ファイル %(file)s の保存を失敗しました (許可拒否)" + +#: cps/web.py:3816 +#, python-format +msgid "Failed to delete file %(file)s (Permission denied)." +msgstr "ファイル %(file)s の削除を失敗しました (許可拒否)" + +#: cps/web.py:3898 +#, python-format +msgid "File %(file)s uploaded" +msgstr "" + +#: cps/web.py:3928 +msgid "Source or destination format for conversion missing" +msgstr "" + +#: cps/web.py:3938 +#, python-format +msgid "Book successfully queued for converting to %(book_format)s" +msgstr "" + +#: cps/web.py:3942 +#, python-format +msgid "There was an error converting this book: %(res)s" +msgstr "" + +#: cps/worker.py:287 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "" + +#: cps/worker.py:298 +#, python-format +msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" +msgstr "Kindlegen 失敗しました、エーラ %(error)s. メッセージ: %(message)s" + +#: cps/templates/admin.html:6 +msgid "User list" +msgstr "ユーザリスト" + +#: cps/templates/admin.html:9 +msgid "Nickname" +msgstr "通称" + +#: cps/templates/admin.html:10 +msgid "E-mail" +msgstr "" + +#: cps/templates/admin.html:11 +msgid "Kindle" +msgstr "Kindle" + +#: cps/templates/admin.html:12 +msgid "DLS" +msgstr "DLS" + +#: cps/templates/admin.html:13 cps/templates/layout.html:74 +msgid "Admin" +msgstr "管理者" + +#: cps/templates/admin.html:14 cps/templates/detail.html:22 +#: cps/templates/detail.html:31 +msgid "Download" +msgstr "ダウンロード" + +#: cps/templates/admin.html:15 cps/templates/layout.html:64 +msgid "Upload" +msgstr "アップロード" + +#: cps/templates/admin.html:16 +msgid "Edit" +msgstr "編集" + +#: cps/templates/admin.html:39 +msgid "SMTP e-mail server settings" +msgstr "" + +#: cps/templates/admin.html:42 cps/templates/email_edit.html:11 +msgid "SMTP hostname" +msgstr "SMTPホスト名" + +#: cps/templates/admin.html:43 +msgid "SMTP port" +msgstr "SMTPポート" + +#: cps/templates/admin.html:44 +msgid "SSL" +msgstr "SSL" + +#: cps/templates/admin.html:45 cps/templates/email_edit.html:27 +msgid "SMTP login" +msgstr "SMTP ログイン" + +#: cps/templates/admin.html:46 +msgid "From mail" +msgstr "メールから" + +#: cps/templates/admin.html:56 +msgid "Change SMTP settings" +msgstr "SMTP設定を変更する" + +#: cps/templates/admin.html:62 +msgid "Configuration" +msgstr "設定" + +#: cps/templates/admin.html:65 +msgid "Calibre DB dir" +msgstr "Calibre データベースの場所" + +#: cps/templates/admin.html:69 +msgid "Log level" +msgstr "" + +#: cps/templates/admin.html:73 +msgid "Port" +msgstr "ポート" + +#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23 +msgid "Books per page" +msgstr "本数毎ページ" + +#: cps/templates/admin.html:83 +msgid "Uploading" +msgstr "アップロード中" + +#: cps/templates/admin.html:87 +msgid "Anonymous browsing" +msgstr "" + +#: cps/templates/admin.html:91 +msgid "Public registration" +msgstr "公的登録" + +#: cps/templates/admin.html:95 cps/templates/remote_login.html:4 +msgid "Remote login" +msgstr "遠距離ログイン" + +#: cps/templates/admin.html:106 +msgid "Administration" +msgstr "管理" + +#: cps/templates/admin.html:107 +msgid "Reconnect to Calibre DB" +msgstr "Calibreデータベースに再接続します" + +#: cps/templates/admin.html:108 +msgid "Restart Calibre-Web" +msgstr "Calibre-Webを再起動します" + +#: cps/templates/admin.html:109 +msgid "Stop Calibre-Web" +msgstr "Calibre-Webを停止します" + +#: cps/templates/admin.html:115 +msgid "Update" +msgstr "" + +#: cps/templates/admin.html:119 +msgid "Version" +msgstr "" + +#: cps/templates/admin.html:120 +msgid "Details" +msgstr "" + +#: cps/templates/admin.html:126 +msgid "Current version" +msgstr "" + +#: cps/templates/admin.html:132 +msgid "Check for update" +msgstr "更新を確認します" + +#: cps/templates/admin.html:133 +msgid "Perform Update" +msgstr "更新を実行します" + +#: cps/templates/admin.html:145 +msgid "Do you really want to restart Calibre-Web?" +msgstr "Calibre-Webを再起動します。宜しいですか?" + +#: cps/templates/admin.html:150 cps/templates/admin.html:164 +#: cps/templates/admin.html:184 cps/templates/shelf.html:61 +msgid "Ok" +msgstr "はい" + +#: cps/templates/admin.html:151 cps/templates/admin.html:165 +#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200 +#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168 +#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75 +#: cps/templates/shelf.html:62 cps/templates/shelf_edit.html:19 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155 +msgid "Back" +msgstr "戻る" + +#: cps/templates/admin.html:163 +msgid "Do you really want to stop Calibre-Web?" +msgstr "Calibre-Webを停止します。宜しいですか?" + +#: cps/templates/admin.html:175 +msgid "Updating, please do not reload page" +msgstr "更新中、ページ再読み込みしないでください" + +#: cps/templates/author.html:15 +msgid "via" +msgstr "経由" + +#: cps/templates/author.html:23 +msgid "In Library" +msgstr "図書館の中" + +#: cps/templates/author.html:69 +msgid "More by" +msgstr "もっと多い" + +#: cps/templates/book_edit.html:16 +msgid "Delete Book" +msgstr "本を削除" + +#: cps/templates/book_edit.html:19 +msgid "Delete formats:" +msgstr "" + +#: cps/templates/book_edit.html:22 cps/templates/book_edit.html:199 +#: cps/templates/email_edit.html:73 cps/templates/email_edit.html:74 +msgid "Delete" +msgstr "削除" + +#: cps/templates/book_edit.html:30 +msgid "Convert book format:" +msgstr "" + +#: cps/templates/book_edit.html:34 +msgid "Convert from:" +msgstr "" + +#: cps/templates/book_edit.html:36 cps/templates/book_edit.html:43 +msgid "select an option" +msgstr "" + +#: cps/templates/book_edit.html:41 +msgid "Convert to:" +msgstr "" + +#: cps/templates/book_edit.html:50 +msgid "Convert book" +msgstr "" + +#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6 +msgid "Book Title" +msgstr "本のタイトル" + +#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:259 +#: cps/templates/book_edit.html:277 cps/templates/search_form.html:10 +msgid "Author" +msgstr "著者" + +#: cps/templates/book_edit.html:67 cps/templates/book_edit.html:264 +#: cps/templates/book_edit.html:279 cps/templates/search_form.html:106 +msgid "Description" +msgstr "詳細" + +#: cps/templates/book_edit.html:71 cps/templates/search_form.html:33 +msgid "Tags" +msgstr "タグ" + +#: cps/templates/book_edit.html:75 cps/templates/layout.html:157 +#: cps/templates/search_form.html:53 +msgid "Series" +msgstr "叢書" + +#: cps/templates/book_edit.html:79 +msgid "Series id" +msgstr "叢書番号" + +#: cps/templates/book_edit.html:83 +msgid "Rating" +msgstr "評価" + +#: cps/templates/book_edit.html:87 +msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +msgstr "" + +#: cps/templates/book_edit.html:91 +msgid "Upload Cover from local drive" +msgstr "" + +#: cps/templates/book_edit.html:96 cps/templates/detail.html:135 +msgid "Publishing date" +msgstr "発行日" + +#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:278 cps/templates/detail.html:127 +#: cps/templates/search_form.html:14 +msgid "Publisher" +msgstr "出版社" + +#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31 +msgid "Language" +msgstr "言語" + +#: cps/templates/book_edit.html:117 cps/templates/search_form.html:117 +msgid "Yes" +msgstr "はい" + +#: cps/templates/book_edit.html:118 cps/templates/search_form.html:118 +msgid "No" +msgstr "いいえ" + +#: cps/templates/book_edit.html:164 +msgid "Upload format" +msgstr "アップロード拡張子" + +#: cps/templates/book_edit.html:173 +msgid "view book after edit" +msgstr "編集してから本を表示します" + +#: cps/templates/book_edit.html:176 cps/templates/book_edit.html:212 +msgid "Get metadata" +msgstr "メタデータを取得します" + +#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210 +#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20 +#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17 +#: cps/templates/user_edit.html:153 +msgid "Submit" +msgstr "提出" + +#: cps/templates/book_edit.html:191 +msgid "Are you really sure?" +msgstr "宜しいですか?" + +#: cps/templates/book_edit.html:194 +msgid "Book will be deleted from Calibre database" +msgstr "この本はCalibreデータベースから削除されます" + +#: cps/templates/book_edit.html:195 +msgid "and from hard disk" +msgstr "とハードディクスから" + +#: cps/templates/book_edit.html:215 +msgid "Keyword" +msgstr "キーワード" + +#: cps/templates/book_edit.html:216 +msgid " Search keyword " +msgstr "キーワードを検索します" + +#: cps/templates/book_edit.html:218 cps/templates/layout.html:46 +msgid "Go!" +msgstr "行く" + +#: cps/templates/book_edit.html:222 +msgid "Click the cover to load metadata to the form" +msgstr "メタデータをフォームに読み込むためにカバーをクリックしてください" + +#: cps/templates/book_edit.html:234 cps/templates/book_edit.html:274 +msgid "Loading..." +msgstr "読み込み中..." + +#: cps/templates/book_edit.html:239 cps/templates/layout.html:224 +msgid "Close" +msgstr "閉じる" + +#: cps/templates/book_edit.html:266 cps/templates/book_edit.html:280 +msgid "Source" +msgstr "ソース" + +#: cps/templates/book_edit.html:275 +msgid "Search error!" +msgstr "検索エーラ!" + +#: cps/templates/book_edit.html:276 +msgid "No Result(s) found! Please try aonther keyword." +msgstr "" + +#: cps/templates/config_edit.html:12 +msgid "Library Configuration" +msgstr "" + +#: cps/templates/config_edit.html:19 +msgid "Location of Calibre database" +msgstr "Calibreデータベースの場所" + +#: cps/templates/config_edit.html:24 +msgid "Use Google Drive?" +msgstr "Googleドライブを利用します?" + +#: cps/templates/config_edit.html:30 +msgid "Google Drive config problem" +msgstr "" + +#: cps/templates/config_edit.html:36 +msgid "Authenticate Google Drive" +msgstr "" + +#: cps/templates/config_edit.html:40 +msgid "Please finish Google Drive setup after login" +msgstr "" + +#: cps/templates/config_edit.html:44 +msgid "Google Drive Calibre folder" +msgstr "" + +#: cps/templates/config_edit.html:52 +msgid "Metadata Watch Channel ID" +msgstr "" + +#: cps/templates/config_edit.html:55 +msgid "Revoke" +msgstr "" + +#: cps/templates/config_edit.html:73 +msgid "Server Configuration" +msgstr "" + +#: cps/templates/config_edit.html:80 +msgid "Server Port" +msgstr "サーバポート" + +#: cps/templates/config_edit.html:84 +msgid "SSL certfile location (leave it empty for non-SSL Servers)" +msgstr "" + +#: cps/templates/config_edit.html:88 +msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" +msgstr "" + +#: cps/templates/config_edit.html:99 +msgid "Logfile Configuration" +msgstr "" + +#: cps/templates/config_edit.html:106 +msgid "Log Level" +msgstr "ログレベル" + +#: cps/templates/config_edit.html:115 +msgid "Location and name of logfile (calibre-web.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:126 +msgid "Feature Configuration" +msgstr "" + +#: cps/templates/config_edit.html:134 +msgid "Enable uploading" +msgstr "アップロードを 有効する" + +#: cps/templates/config_edit.html:138 +msgid "Enable anonymous browsing" +msgstr "匿名ブラウジングを有効する" + +#: cps/templates/config_edit.html:142 +msgid "Enable public registration" +msgstr "公的登録を有効する" + +#: cps/templates/config_edit.html:146 +msgid "Enable remote login (\"magic link\")" +msgstr "遠距離ログインを有効する ('マジックリンク')" + +#: cps/templates/config_edit.html:151 +msgid "Use" +msgstr "使う" + +#: cps/templates/config_edit.html:152 +msgid "Obtain an API Key" +msgstr "APIキーを取得する" + +#: cps/templates/config_edit.html:156 +msgid "Goodreads API Key" +msgstr "GoodreadsのAPIキー" + +#: cps/templates/config_edit.html:160 +msgid "Goodreads API Secret" +msgstr "GoodreadsのAPI秘密" + +#: cps/templates/config_edit.html:173 +msgid "External binaries" +msgstr "" + +#: cps/templates/config_edit.html:181 +msgid "No converter" +msgstr "" + +#: cps/templates/config_edit.html:183 +msgid "Use Kindlegen" +msgstr "" + +#: cps/templates/config_edit.html:185 +msgid "Use calibre's ebook converter" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "E-Book converter settings" +msgstr "" + +#: cps/templates/config_edit.html:193 +msgid "Path to convertertool" +msgstr "" + +#: cps/templates/config_edit.html:199 +msgid "Location of Unrar binary" +msgstr "" + +#: cps/templates/config_edit.html:215 cps/templates/layout.html:82 +#: cps/templates/login.html:4 +msgid "Login" +msgstr "ログイン" + +#: cps/templates/config_view_edit.html:12 +msgid "View Configuration" +msgstr "" + +#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 +#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 +msgid "Title" +msgstr "タイトル" + +#: cps/templates/config_view_edit.html:27 +msgid "No. of random books to show" +msgstr "任意本を表示するの数" + +#: cps/templates/config_view_edit.html:31 +msgid "Regular expression for ignoring columns" +msgstr "列を無視するの正規表現" + +#: cps/templates/config_view_edit.html:35 +msgid "Link read/unread status to Calibre column" +msgstr "" + +#: cps/templates/config_view_edit.html:44 +msgid "Regular expression for title sorting" +msgstr "タイトルを並び替えの正規表現" + +#: cps/templates/config_view_edit.html:48 +msgid "Tags for Mature Content" +msgstr "成人向けのタグ" + +#: cps/templates/config_view_edit.html:62 +msgid "Default settings for new users" +msgstr "新規ユーザにデフォルト設定を設定する" + +#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110 +msgid "Admin user" +msgstr "管理ユーザ" + +#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119 +msgid "Allow Downloads" +msgstr "ダウンロードを有効する" + +#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123 +msgid "Allow Uploads" +msgstr "アップロードを有効する" + +#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127 +msgid "Allow Edit" +msgstr "編集を有効する" + +#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131 +msgid "Allow Delete books" +msgstr "本削除を有効する" + +#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136 +msgid "Allow Changing Password" +msgstr "パスワード変更を有効する" + +#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140 +msgid "Allow Editing Public Shelfs" +msgstr "公的叢書の編集を有効する" + +#: cps/templates/config_view_edit.html:104 +msgid "Default visibilities for new users" +msgstr "新規ユーザにデフォルト可視性を設定する" + +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58 +msgid "Show random books" +msgstr "任意本を表示する" + +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62 +msgid "Show recent books" +msgstr "最近の本を表示する" + +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66 +msgid "Show sorted books" +msgstr "整列された本を表示する" + +#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70 +msgid "Show hot books" +msgstr "有名な本を表示する" + +#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74 +msgid "Show best rated books" +msgstr "最高評価の本を表示する" + +#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78 +msgid "Show language selection" +msgstr "言語選択を表示する" + +#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82 +msgid "Show series selection" +msgstr "奏者選択を表示する" + +#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86 +msgid "Show category selection" +msgstr "カテゴリー選択を表示する" + +#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90 +msgid "Show author selection" +msgstr "著者選択を表示する" + +#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94 +msgid "Show publisher selection" +msgstr "" + +#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98 +msgid "Show read and unread" +msgstr "既読と未読の本を表示する" + +#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102 +msgid "Show random books in detail view" +msgstr "任意の本を詳細閲覧で表示する" + +#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115 +msgid "Show mature content" +msgstr "成人向けコンテンツを表示" + +#: cps/templates/detail.html:49 +msgid "Read in browser" +msgstr "ブラウザで読む" + +#: cps/templates/detail.html:88 +msgid "Book" +msgstr "本" + +#: cps/templates/detail.html:88 +msgid "of" +msgstr "から" + +#: cps/templates/detail.html:94 +msgid "language" +msgstr "言語" + +#: cps/templates/detail.html:172 +msgid "Read" +msgstr "読む" + +#: cps/templates/detail.html:182 +msgid "Description:" +msgstr "詳細:" + +#: cps/templates/detail.html:195 cps/templates/search.html:14 +msgid "Add to shelf" +msgstr "書架に追加" + +#: cps/templates/detail.html:257 +msgid "Edit metadata" +msgstr "メタデータを編集する" + +#: cps/templates/email_edit.html:15 +msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +msgstr "SMTPポート(基本的にplain SMTPは25、SSLは465、STARTTLSは587)" + +#: cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "暗号化" + +#: cps/templates/email_edit.html:21 +msgid "None" +msgstr "なし" + +#: cps/templates/email_edit.html:22 +msgid "STARTTLS" +msgstr "STARTTLS" + +#: cps/templates/email_edit.html:23 +msgid "SSL/TLS" +msgstr "SSL/TLS" + +#: cps/templates/email_edit.html:31 +msgid "SMTP password" +msgstr "SMTP パスワード" + +#: cps/templates/email_edit.html:35 +msgid "From e-mail" +msgstr "メールより" + +#: cps/templates/email_edit.html:38 +msgid "Save settings" +msgstr "設定を保存する" + +#: cps/templates/email_edit.html:39 +msgid "Save settings and send Test E-Mail" +msgstr "設定を保存するとテストメールを送信する" + +#: cps/templates/email_edit.html:43 +msgid "Allowed domains for registering" +msgstr "" + +#: cps/templates/email_edit.html:47 +msgid "Enter domainname" +msgstr "" + +#: cps/templates/email_edit.html:55 +msgid "Add Domain" +msgstr "" + +#: cps/templates/email_edit.html:58 +msgid "Add" +msgstr "" + +#: cps/templates/email_edit.html:72 +msgid "Do you really want to delete this domain rule?" +msgstr "" + +#: cps/templates/feed.xml:21 cps/templates/layout.html:208 +msgid "Next" +msgstr "次" + +#: cps/templates/feed.xml:33 cps/templates/index.xml:11 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 +msgid "Search" +msgstr "検索" + +#: cps/templates/index.html:5 +msgid "Discover (Random Books)" +msgstr "発見 (任意の本)" + +#: cps/templates/index.xml:6 +msgid "Start" +msgstr "開始" + +#: cps/templates/index.xml:18 cps/templates/layout.html:139 +msgid "Hot Books" +msgstr "最新の本" + +#: cps/templates/index.xml:22 +msgid "Popular publications from this catalog based on Downloads." +msgstr "ダウンロードによりカタログの有名な出版" + +#: cps/templates/index.xml:25 cps/templates/layout.html:142 +msgid "Best rated Books" +msgstr "最高評価の本" + +#: cps/templates/index.xml:29 +msgid "Popular publications from this catalog based on Rating." +msgstr "評価によりカタログの有名な出版" + +#: cps/templates/index.xml:32 +msgid "New Books" +msgstr "新しい本" + +#: cps/templates/index.xml:36 +msgid "The latest Books" +msgstr "最近の本" + +#: cps/templates/index.xml:43 +msgid "Show Random Books" +msgstr "任意の本を表示する" + +#: cps/templates/index.xml:62 cps/templates/layout.html:160 +msgid "Authors" +msgstr "著者" + +#: cps/templates/index.xml:66 +msgid "Books ordered by Author" +msgstr "著者の名前で並び替える" + +#: cps/templates/index.xml:69 cps/templates/layout.html:163 +msgid "Publishers" +msgstr "" + +#: cps/templates/index.xml:73 +msgid "Books ordered by publisher" +msgstr "" + +#: cps/templates/index.xml:80 +msgid "Books ordered by category" +msgstr "カテゴリーで並び替える" + +#: cps/templates/index.xml:87 +msgid "Books ordered by series" +msgstr "叢書で並び替える" + +#: cps/templates/index.xml:90 cps/templates/layout.html:169 +msgid "Public Shelves" +msgstr "公的の叢書" + +#: cps/templates/index.xml:94 +msgid "Books organized in public shelfs, visible to everyone" +msgstr "公的の叢書に選び分ける、みんなに見える" + +#: cps/templates/index.xml:98 cps/templates/layout.html:173 +msgid "Your Shelves" +msgstr "あなたの叢書" + +#: cps/templates/index.xml:102 +msgid "User's own shelfs, only visible to the current user himself" +msgstr "ユーザ自身の叢書、自分しか見えない" + +#: cps/templates/layout.html:33 +msgid "Toggle navigation" +msgstr "ナビゲーション" + +#: cps/templates/layout.html:54 +msgid "Advanced Search" +msgstr "詳細検索" + +#: cps/templates/layout.html:78 +msgid "Logout" +msgstr "ロクアウト" + +#: cps/templates/layout.html:83 cps/templates/register.html:14 +msgid "Register" +msgstr "登録" + +#: cps/templates/layout.html:108 +msgid "Uploading..." +msgstr "" + +#: cps/templates/layout.html:109 +msgid "please don't refresh the page" +msgstr "" + +#: cps/templates/layout.html:120 +msgid "Browse" +msgstr "ブラウズ" + +#: cps/templates/layout.html:122 +msgid "Recently Added" +msgstr "最近追加" + +#: cps/templates/layout.html:127 +msgid "Sorted Books" +msgstr "整列した本" + +#: cps/templates/layout.html:131 cps/templates/layout.html:132 +#: cps/templates/layout.html:133 cps/templates/layout.html:134 +msgid "Sort By" +msgstr "整列" + +#: cps/templates/layout.html:131 +msgid "Newest" +msgstr "最新" + +#: cps/templates/layout.html:132 +msgid "Oldest" +msgstr "最古" + +#: cps/templates/layout.html:133 +msgid "Ascending" +msgstr "昇順" + +#: cps/templates/layout.html:134 +msgid "Descending" +msgstr "降順" + +#: cps/templates/layout.html:151 +msgid "Discover" +msgstr "発見" + +#: cps/templates/layout.html:154 +msgid "Categories" +msgstr "カテゴリー" + +#: cps/templates/layout.html:166 cps/templates/search_form.html:74 +msgid "Languages" +msgstr "言語" + +#: cps/templates/layout.html:178 +msgid "Create a Shelf" +msgstr "叢書を作成する" + +#: cps/templates/layout.html:179 cps/templates/stats.html:3 +msgid "About" +msgstr "このサイトについて" + +#: cps/templates/layout.html:193 +msgid "Previous" +msgstr "前" + +#: cps/templates/layout.html:220 +msgid "Book Details" +msgstr "本の詳細" + +#: cps/templates/login.html:8 cps/templates/login.html:9 +#: cps/templates/register.html:7 cps/templates/user_edit.html:8 +msgid "Username" +msgstr "ユーザ名" + +#: cps/templates/login.html:12 cps/templates/login.html:13 +#: cps/templates/user_edit.html:21 +msgid "Password" +msgstr "パスワード" + +#: cps/templates/login.html:17 +msgid "Remember me" +msgstr "" + +#: cps/templates/login.html:22 +msgid "Log in with magic link" +msgstr "マジックリンクでログインする" + +#: cps/templates/osd.xml:5 +msgid "Calibre-Web ebook catalog" +msgstr "" + +#: cps/templates/read.html:69 cps/templates/readcbr.html:79 +#: cps/templates/readcbr.html:103 +msgid "Settings" +msgstr "設定" + +#: cps/templates/read.html:72 +msgid "Reflow text when sidebars are open." +msgstr "" + +#: cps/templates/readcbr.html:84 +msgid "Keyboard Shortcuts" +msgstr "" + +#: cps/templates/readcbr.html:87 +msgid "Previous Page" +msgstr "" + +#: cps/templates/readcbr.html:88 +msgid "Next Page" +msgstr "" + +#: cps/templates/readcbr.html:89 +msgid "Scale to Best" +msgstr "" + +#: cps/templates/readcbr.html:90 +msgid "Scale to Width" +msgstr "" + +#: cps/templates/readcbr.html:91 +msgid "Scale to Height" +msgstr "" + +#: cps/templates/readcbr.html:92 +msgid "Scale to Native" +msgstr "" + +#: cps/templates/readcbr.html:93 +msgid "Rotate Right" +msgstr "" + +#: cps/templates/readcbr.html:94 +msgid "Rotate Left" +msgstr "" + +#: cps/templates/readcbr.html:95 +msgid "Flip Image" +msgstr "" + +#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39 +msgid "Theme" +msgstr "" + +#: cps/templates/readcbr.html:111 +msgid "Light" +msgstr "" + +#: cps/templates/readcbr.html:112 +msgid "Dark" +msgstr "" + +#: cps/templates/readcbr.html:117 +msgid "Scale" +msgstr "" + +#: cps/templates/readcbr.html:120 +msgid "Best" +msgstr "" + +#: cps/templates/readcbr.html:121 +msgid "Width" +msgstr "" + +#: cps/templates/readcbr.html:122 +msgid "Height" +msgstr "" + +#: cps/templates/readcbr.html:123 +msgid "Native" +msgstr "" + +#: cps/templates/readcbr.html:128 +msgid "Rotate" +msgstr "" + +#: cps/templates/readcbr.html:139 +msgid "Flip" +msgstr "" + +#: cps/templates/readcbr.html:142 +msgid "Horizontal" +msgstr "" + +#: cps/templates/readcbr.html:143 +msgid "Vertical" +msgstr "" + +#: cps/templates/readpdf.html:29 +msgid "PDF.js viewer" +msgstr "" + +#: cps/templates/readtxt.html:6 +msgid "Basic txt Reader" +msgstr "" + +#: cps/templates/register.html:4 +msgid "Register a new account" +msgstr "新規アカウントを登録する" + +#: cps/templates/register.html:8 +msgid "Choose a username" +msgstr "ユーザ名" + +#: cps/templates/register.html:11 cps/templates/user_edit.html:13 +msgid "E-mail address" +msgstr "" + +#: cps/templates/register.html:12 +msgid "Your email address" +msgstr "あなたのメールアドレス" + +#: cps/templates/remote_login.html:6 +msgid "Using your another device, visit" +msgstr "他の端末を使っています" + +#: cps/templates/remote_login.html:6 +msgid "and log in" +msgstr "とログイン" + +#: cps/templates/remote_login.html:9 +msgid "Once you do so, you will automatically get logged in on this device." +msgstr "やってたら、自動的にこの端末にログインします" + +#: cps/templates/search.html:5 +msgid "No Results for:" +msgstr "結果なし:" + +#: cps/templates/search.html:6 +msgid "Please try a different search" +msgstr "他の検索を試してくだい" + +#: cps/templates/search.html:8 +msgid "Results for:" +msgstr "結果:" + +#: cps/templates/search_form.html:19 +msgid "Publishing date from" +msgstr "" + +#: cps/templates/search_form.html:26 +msgid "Publishing date to" +msgstr "" + +#: cps/templates/search_form.html:43 +msgid "Exclude Tags" +msgstr "タグを除外" + +#: cps/templates/search_form.html:63 +msgid "Exclude Series" +msgstr "叢書を除外" + +#: cps/templates/search_form.html:84 +msgid "Exclude Languages" +msgstr "言語を除外" + +#: cps/templates/search_form.html:97 +msgid "Rating bigger than" +msgstr "" + +#: cps/templates/search_form.html:101 +msgid "Rating less than" +msgstr "" + +#: cps/templates/shelf.html:7 +msgid "Delete this Shelf" +msgstr "この叢書を削除" + +#: cps/templates/shelf.html:8 +msgid "Edit Shelf" +msgstr "" + +#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11 +msgid "Change order" +msgstr "順番を変更する" + +#: cps/templates/shelf.html:56 +msgid "Do you really want to delete the shelf?" +msgstr "書架を削除します。宜しいですか?" + +#: cps/templates/shelf.html:59 +msgid "Shelf will be lost for everybody and forever!" +msgstr "書架は誰にも見えなくなり永遠なくなります" + +#: cps/templates/shelf_edit.html:13 +msgid "should the shelf be public?" +msgstr "叢書を公的に表示しますか?" + +#: cps/templates/shelf_order.html:5 +msgid "Drag 'n drop to rearrange order" +msgstr "ドラッグドロップで並び替えます" + +#: cps/templates/stats.html:7 +msgid "Calibre library statistics" +msgstr "Calibre図書館の統計" + +#: cps/templates/stats.html:12 +msgid "Books in this Library" +msgstr "この図書館の本" + +#: cps/templates/stats.html:16 +msgid "Authors in this Library" +msgstr "図書館内の著者" + +#: cps/templates/stats.html:20 +msgid "Categories in this Library" +msgstr "図書館内のカテゴリー" + +#: cps/templates/stats.html:24 +msgid "Series in this Library" +msgstr "図書館内の叢書" + +#: cps/templates/stats.html:28 +msgid "Linked libraries" +msgstr "リンク付き図書館" + +#: cps/templates/stats.html:32 +msgid "Program library" +msgstr "プログラム図書館" + +#: cps/templates/stats.html:33 +msgid "Installed Version" +msgstr "インストールされたバージョン" + +#: cps/templates/tasks.html:7 +msgid "Tasks list" +msgstr "" + +#: cps/templates/tasks.html:12 +msgid "User" +msgstr "" + +#: cps/templates/tasks.html:14 +msgid "Task" +msgstr "" + +#: cps/templates/tasks.html:15 +msgid "Status" +msgstr "" + +#: cps/templates/tasks.html:16 +msgid "Progress" +msgstr "" + +#: cps/templates/tasks.html:17 +msgid "Runtime" +msgstr "" + +#: cps/templates/tasks.html:18 +msgid "Starttime" +msgstr "" + +#: cps/templates/tasks.html:24 +msgid "Delete finished tasks" +msgstr "" + +#: cps/templates/tasks.html:25 +msgid "Hide all tasks" +msgstr "" + +#: cps/templates/user_edit.html:18 +msgid "Reset user Password" +msgstr "" + +#: cps/templates/user_edit.html:27 +msgid "Kindle E-Mail" +msgstr "Kindleメール" + +#: cps/templates/user_edit.html:41 +msgid "Standard Theme" +msgstr "" + +#: cps/templates/user_edit.html:42 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "" + +#: cps/templates/user_edit.html:47 +msgid "Show books with language" +msgstr "言語で本を表示する" + +#: cps/templates/user_edit.html:49 +msgid "Show all" +msgstr "全て表示" + +#: cps/templates/user_edit.html:147 +msgid "Delete this user" +msgstr "このユーザを削除する" + +#: cps/templates/user_edit.html:162 +msgid "Recent Downloads" +msgstr "最近ダウンロード" + +#~ msgid "%s: %s" +#~ msgstr "" + +#~ msgid "E-Mail: %(book)s" +#~ msgstr "" + +#~ msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +#~ msgstr "タイトルを'%(src)s'から'%(dest)s'の改名は失敗しました。エーラ: %(error)s" + +#~ msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +#~ msgstr "著者を'%(src)s'から'%(dest)s'の改名は失敗しました。エーラ:%(error)s" + +#~ msgid "Password for user %(user)s reset" +#~ msgstr "" + +#~ msgid "Password for user %s reset" +#~ msgstr "" + +#~ msgid "Rename title from: '%(src)s' to '%(src)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Rename author from: '%(src)s' to '%(src)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Failed to create path for cover %(cover)s (Permission denied)." +#~ msgstr "" + +#~ msgid "File extension '%s' is not allowed to be uploaded to this server" +#~ msgstr "" + +#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server" +#~ msgstr "ファイル拡張子 \"%(ext)s\" をこのサーバにアップロードする許可はありません" + +#~ msgid "Current commit timestamp" +#~ msgstr "現在コミットのタイムスタンプ" + +#~ msgid "Newest commit timestamp" +#~ msgstr "最新コミットのタイムスタンプ" + +#~ msgid "Convert: %(book)s" +#~ msgstr "" + +#~ msgid "Convert to %(format)s: %(book)s" +#~ msgstr "" + +#~ msgid "Files are replaced" +#~ msgstr "ファイルを書き換えました" + +#~ msgid "Server is stopped" +#~ msgstr "サーバがシャットダウンされました" + +#~ msgid "Convertertool %(converter)s not found" +#~ msgstr "" + +#~ msgid "Choose a password" +#~ msgstr "パスワード" + diff --git a/src/cps/translations/km/LC_MESSAGES/messages.mo b/src/cps/translations/km/LC_MESSAGES/messages.mo new file mode 100644 index 0000000..11558e3 Binary files /dev/null and b/src/cps/translations/km/LC_MESSAGES/messages.mo differ diff --git a/src/cps/translations/km/LC_MESSAGES/messages.po b/src/cps/translations/km/LC_MESSAGES/messages.po new file mode 100644 index 0000000..e4ba464 --- /dev/null +++ b/src/cps/translations/km/LC_MESSAGES/messages.po @@ -0,0 +1,1978 @@ +# Khmer translations for Calibre-Web. +# Copyright (C) 2017 Calibre-Web +# This file is distributed under the same license as the Calibre-Web +# project. +# FIRST AUTHOR manuthchek, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: Calibre-Web\n" +"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" +"POT-Creation-Date: 2018-11-03 14:03+0100\n" +"PO-Revision-Date: 2018-08-27 17:06+0700\n" +"Last-Translator: \n" +"Language: km_KH\n" +"Language-Team: \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134 +#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27 +msgid "not installed" +msgstr "មិនបានតម្លើង" + +#: cps/converter.py:22 cps/converter.py:38 +msgid "Excecution permissions missing" +msgstr "ខ្វះសិទ្ធិប្រតិបត្តិការ" + +#: cps/converter.py:48 +msgid "not configured" +msgstr "" + +#: cps/helper.py:58 +#, python-format +msgid "%(format)s format not found for book id: %(book)d" +msgstr "" + +#: cps/helper.py:70 +#, python-format +msgid "%(format)s not found on Google Drive: %(fn)s" +msgstr "" + +#: cps/helper.py:77 cps/helper.py:147 cps/templates/detail.html:44 +msgid "Send to Kindle" +msgstr "ផ្ញើទៅ Kindle" + +#: cps/helper.py:78 cps/helper.py:96 +msgid "This e-mail has been sent via Calibre-Web." +msgstr "" + +#: cps/helper.py:89 +#, python-format +msgid "%(format)s not found: %(fn)s" +msgstr "" + +#: cps/helper.py:94 +msgid "Calibre-Web test e-mail" +msgstr "" + +#: cps/helper.py:95 +msgid "Test e-mail" +msgstr "" + +#: cps/helper.py:111 +msgid "Get Started with Calibre-Web" +msgstr "" + +#: cps/helper.py:112 +#, python-format +msgid "Registration e-mail for user: %(name)s" +msgstr "" + +#: cps/helper.py:135 cps/helper.py:145 +msgid "Could not find any formats suitable for sending by e-mail" +msgstr "" + +#: cps/helper.py:148 +#, python-format +msgid "E-mail: %(book)s" +msgstr "អ៊ីមែល៖ %(book)s" + +#: cps/helper.py:150 +msgid "The requested file could not be read. Maybe wrong permissions?" +msgstr "ឯកសារដែលបានស្នើសុំមិនអាចបើកបានទេ។ អាចនឹងខុសសិទ្ធិប្រើប្រាស់ទេដឹង?" + +#: cps/helper.py:250 +#, python-format +msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "ប្តូរចំណងជើងពី “%(src)s” ទៅជា “%(dest)s” បរាជ័យដោយបញ្ហា: %(error)s" + +#: cps/helper.py:259 +#, python-format +msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "ប្តូរអ្នកនិពន្ធពី “%(src)s” ទៅជា “%(dest)s” បរាជ័យដោយបញ្ហា: %(error)s" + +#: cps/helper.py:281 cps/helper.py:290 +#, python-format +msgid "File %(file)s not found on Google Drive" +msgstr "ឯកសារ %(file)s រកមិនឃើញក្នុង Google Drive" + +#: cps/helper.py:308 +#, python-format +msgid "Book path %(path)s not found on Google Drive" +msgstr "ទីតាំងសៀវភៅ %(path)s រកមិនឃើញក្នុង Google Drive" + +#: cps/helper.py:565 +msgid "Error excecuting UnRar" +msgstr "" + +#: cps/helper.py:567 +msgid "Unrar binary file not found" +msgstr "" + +#: cps/helper.py:609 +msgid "Waiting" +msgstr "កំពុងរង់ចាំ" + +#: cps/helper.py:611 +msgid "Failed" +msgstr "បានបរាជ័យ" + +#: cps/helper.py:613 +msgid "Started" +msgstr "បានចាប់ផ្តើម" + +#: cps/helper.py:615 +msgid "Finished" +msgstr "បានបញ្ចប់" + +#: cps/helper.py:617 +msgid "Unknown Status" +msgstr "" + +#: cps/helper.py:622 +msgid "E-mail: " +msgstr "" + +#: cps/helper.py:624 cps/helper.py:628 +msgid "Convert: " +msgstr "" + +#: cps/helper.py:626 +msgid "Upload: " +msgstr "" + +#: cps/helper.py:630 +msgid "Unknown Task: " +msgstr "" + +#: cps/web.py:1132 cps/web.py:2842 +msgid "Unknown" +msgstr "មិនដឹង" + +#: cps/web.py:1141 cps/web.py:1172 cps/web.py:1257 +msgid "HTTP Error" +msgstr "" + +#: cps/web.py:1143 cps/web.py:1174 cps/web.py:1258 +msgid "Connection error" +msgstr "" + +#: cps/web.py:1145 cps/web.py:1176 cps/web.py:1259 +msgid "Timeout while establishing connection" +msgstr "" + +#: cps/web.py:1147 cps/web.py:1178 cps/web.py:1260 +msgid "General error" +msgstr "" + +#: cps/web.py:1153 +msgid "Unexpected data while reading update information" +msgstr "" + +#: cps/web.py:1160 +msgid "No update available. You already have the latest version installed" +msgstr "" + +#: cps/web.py:1185 +msgid "A new update is available. Click on the button below to update to the latest version." +msgstr "" + +#: cps/web.py:1235 +msgid "Could not fetch update information" +msgstr "" + +#: cps/web.py:1250 +msgid "Requesting update package" +msgstr "កំពុងស្នើសុំឯកសារបច្ចុប្បន្នភាព" + +#: cps/web.py:1251 +msgid "Downloading update package" +msgstr "កំពុងទាញយកឯកសារបច្ចុប្បន្នភាព" + +#: cps/web.py:1252 +msgid "Unzipping update package" +msgstr "កំពុងពន្លាឯកសារបច្ចុប្បន្នភាព" + +#: cps/web.py:1253 +msgid "Replacing files" +msgstr "" + +#: cps/web.py:1254 +msgid "Database connections are closed" +msgstr "ទំនាក់ទំនងទៅមូលដ្ឋានទិន្នន័យត្រូវបានផ្តាច់" + +#: cps/web.py:1255 +msgid "Stopping server" +msgstr "" + +#: cps/web.py:1256 +msgid "Update finished, please press okay and reload page" +msgstr "ការធ្វើបច្ចុប្បន្នភាពបានបញ្ចប់ សូមចុច okay រួចបើកទំព័រជាថ្មី" + +#: cps/web.py:1257 cps/web.py:1258 cps/web.py:1259 cps/web.py:1260 +msgid "Update failed:" +msgstr "" + +#: cps/web.py:1283 +msgid "Recently Added Books" +msgstr "សៀវភៅដែលទើបបានបន្ថែម" + +#: cps/web.py:1293 +msgid "Newest Books" +msgstr "សៀវភៅថ្មីៗជាងគេ" + +#: cps/web.py:1305 +msgid "Oldest Books" +msgstr "សៀវភៅចាស់ជាងគេ" + +#: cps/web.py:1317 +msgid "Books (A-Z)" +msgstr "សៀវភៅពី A ទៅ Z" + +#: cps/web.py:1328 +msgid "Books (Z-A)" +msgstr "សៀវភៅពី Z ទៅ A" + +#: cps/web.py:1357 +msgid "Hot Books (most downloaded)" +msgstr "សៀវភៅដែលត្រូវបានទាញយកច្រើនជាងគេ" + +#: cps/web.py:1370 +msgid "Best rated books" +msgstr "សៀវភៅដែលត្រូវបានវាយតម្លៃល្អជាងគេ" + +#: cps/templates/index.xml:39 cps/web.py:1383 +msgid "Random Books" +msgstr "សៀវភៅចៃដន្យ" + +#: cps/web.py:1398 +msgid "Author list" +msgstr "បញ្ជីអ្នកនិពន្ធ" + +#: cps/web.py:1410 cps/web.py:1501 cps/web.py:1663 cps/web.py:2206 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "មានបញ្ហាពេលបើកឯកសារ eBook ។ មិនមានឯកសារនេះ ឬមិនអាចបើកបាន៖" + +#: cps/web.py:1438 +msgid "Publisher list" +msgstr "" + +#: cps/web.py:1452 +#, python-format +msgid "Publisher: %(name)s" +msgstr "" + +#: cps/templates/index.xml:83 cps/web.py:1484 +msgid "Series list" +msgstr "បញ្ជីស៊េរី" + +#: cps/web.py:1499 +#, python-format +msgid "Series: %(serie)s" +msgstr "ស៊េរី៖ %(serie)s" + +#: cps/web.py:1528 +msgid "Available languages" +msgstr "ភាសាដែលមាន" + +#: cps/web.py:1548 +#, python-format +msgid "Language: %(name)s" +msgstr "ភាសា៖ %(name)s" + +#: cps/templates/index.xml:76 cps/web.py:1559 +msgid "Category list" +msgstr "បញ្ជីប្រភេទ" + +#: cps/web.py:1573 +#, python-format +msgid "Category: %(name)s" +msgstr "ប្រភេទ៖ %(name)s" + +#: cps/templates/layout.html:71 cps/web.py:1699 +msgid "Tasks" +msgstr "កិច្ចការនានា" + +#: cps/web.py:1733 +msgid "Statistics" +msgstr "ស្ថិតិ" + +#: cps/web.py:1840 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "Callback domain មិនទាន់បានផ្ទៀងផ្ទាត់ឲប្រើទេ សូមធ្វើតាមជំហានដើម្បីផ្ទៀងផ្ទាត់ domain នៅក្នុង Google Developer Console" + +#: cps/web.py:1915 +msgid "Server restarted, please reload page" +msgstr "ម៉ាស៊ីន server បានដំណើរការម្តងទៀត សូមបើកទំព័រជាថ្មី" + +#: cps/web.py:1918 +msgid "Performing shutdown of server, please close window" +msgstr "កំពុងបិទម៉ាស៊ីន server សូមបិទផ្ទាំងនេះ" + +#: cps/web.py:1937 +msgid "Update done" +msgstr "ការធ្វើបច្ចុប្បន្នភាពរួចរាល់" + +#: cps/web.py:2007 +msgid "Published after " +msgstr "បានបោះពុម្ភក្រោយ " + +#: cps/web.py:2014 +msgid "Published before " +msgstr "បានបោះពុម្ភមុន " + +#: cps/web.py:2028 +#, python-format +msgid "Rating <= %(rating)s" +msgstr "ការវាយតម្លៃ <= %(rating)s" + +#: cps/web.py:2030 +#, python-format +msgid "Rating >= %(rating)s" +msgstr "ការវាយតម្លៃ >= %(rating)s" + +#: cps/web.py:2089 cps/web.py:2098 +msgid "search" +msgstr "ស្វែងរក" + +#: cps/templates/index.xml:47 cps/templates/index.xml:51 +#: cps/templates/layout.html:146 cps/web.py:2165 +msgid "Read Books" +msgstr "សៀវភៅដែលបានអានរួច" + +#: cps/templates/index.xml:55 cps/templates/index.xml:59 +#: cps/templates/layout.html:148 cps/web.py:2168 +msgid "Unread Books" +msgstr "សៀវភៅដែលមិនទាន់បានអាន" + +#: cps/web.py:2216 cps/web.py:2218 cps/web.py:2220 cps/web.py:2232 +msgid "Read a Book" +msgstr "អានសៀវភៅ" + +#: cps/web.py:2298 cps/web.py:3201 +msgid "Please fill out all fields!" +msgstr "សូមបំពេញចន្លោះទាំងអស់!" + +#: cps/web.py:2299 cps/web.py:2320 cps/web.py:2324 cps/web.py:2329 +#: cps/web.py:2331 +msgid "register" +msgstr "ចុះឈ្មោះ" + +#: cps/web.py:2319 cps/web.py:3417 +msgid "An unknown error occurred. Please try again later." +msgstr "" + +#: cps/web.py:2322 +msgid "Your e-mail is not allowed to register" +msgstr "" + +#: cps/web.py:2325 +msgid "Confirmation e-mail was send to your e-mail account." +msgstr "" + +#: cps/web.py:2328 +msgid "This username or e-mail address is already in use." +msgstr "" + +#: cps/web.py:2345 cps/web.py:2441 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "ឥឡូវអ្នកបានចូលដោយមានឈ្មោះថា៖ ‘%(nickname)s’" + +#: cps/web.py:2350 +msgid "Wrong Username or Password" +msgstr "ខុសឈ្មោះអ្នកប្រើប្រាស់ ឬលេខសម្ងាត់" + +#: cps/web.py:2356 cps/web.py:2377 +msgid "login" +msgstr "ចូលប្រើ" + +#: cps/web.py:2389 cps/web.py:2420 +msgid "Token not found" +msgstr "រកមិនឃើញវត្ថុតាង" + +#: cps/web.py:2397 cps/web.py:2428 +msgid "Token has expired" +msgstr "វត្ថុតាងហួសពេលកំណត់" + +#: cps/web.py:2405 +msgid "Success! Please return to your device" +msgstr "ជោគជ័យ! សូមវិលមកឧបករណ៍អ្នកវិញ" + +#: cps/web.py:2455 +msgid "Please configure the SMTP mail settings first..." +msgstr "សូមកំណត់អ៊ីមែល SMTP ជាមុនសិន" + +#: cps/web.py:2459 +#, python-format +msgid "Book successfully queued for sending to %(kindlemail)s" +msgstr "សៀវភៅបានចូលជួរសម្រាប់ផ្ញើទៅ %(kindlemail)s ដោយជោគជ័យ" + +#: cps/web.py:2463 +#, python-format +msgid "There was an error sending this book: %(res)s" +msgstr "មានបញ្ហានៅពេលផ្ញើសៀវភៅនេះ៖ %(res)s" + +#: cps/web.py:2465 cps/web.py:3255 +msgid "Please configure your kindle e-mail address first..." +msgstr "" + +#: cps/web.py:2476 cps/web.py:2528 +msgid "Invalid shelf specified" +msgstr "" + +#: cps/web.py:2483 +#, python-format +msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2491 +msgid "You are not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2500 +#, python-format +msgid "Book is already part of the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2514 +#, python-format +msgid "Book has been added to shelf: %(sname)s" +msgstr "សៀវភៅត្រូវបានបន្ថែមទៅធ្នើ៖ %(sname)s" + +#: cps/web.py:2533 +#, python-format +msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgstr "" + +#: cps/web.py:2538 +msgid "User is not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2556 +#, python-format +msgid "Books are already part of the shelf: %(name)s" +msgstr "" + +#: cps/web.py:2570 +#, python-format +msgid "Books have been added to shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2572 +#, python-format +msgid "Could not add books to shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2609 +#, python-format +msgid "Book has been removed from shelf: %(sname)s" +msgstr "សៀវភៅត្រូវបានដកចេញពីធ្នើ៖ %(sname)s" + +#: cps/web.py:2615 +#, python-format +msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgstr "សូមអភ័យទោស អ្នកមិនមានសិទ្ធិដកសៀវភៅចេញពីធ្នើនេះទេ៖ %(sname)s" + +#: cps/web.py:2635 cps/web.py:2659 +#, python-format +msgid "A shelf with the name '%(title)s' already exists." +msgstr "មានធ្នើដែលមានឈ្មោះ ‘%(title)s’ រួចហើយ។" + +#: cps/web.py:2640 +#, python-format +msgid "Shelf %(title)s created" +msgstr "ធ្នើឈ្មោះ %(title)s ត្រូវបានបង្កើត" + +#: cps/web.py:2642 cps/web.py:2670 +msgid "There was an error" +msgstr "មានបញ្ហា" + +#: cps/web.py:2643 cps/web.py:2645 +msgid "create a shelf" +msgstr "បង្កើតធ្នើ" + +#: cps/web.py:2668 +#, python-format +msgid "Shelf %(title)s changed" +msgstr "ធ្នើឈ្មោះ %(title)s ត្រូវបានប្តូរ" + +#: cps/web.py:2671 cps/web.py:2673 +msgid "Edit a shelf" +msgstr "កែប្រែធ្នើ" + +#: cps/web.py:2694 +#, python-format +msgid "successfully deleted shelf %(name)s" +msgstr "បានបង្កើតធ្នើឈ្មោះ %(name)s ដោយជោគជ័យ" + +#: cps/web.py:2721 +#, python-format +msgid "Shelf: '%(name)s'" +msgstr "ធ្នើ៖ ‘%(name)s’" + +#: cps/web.py:2724 +msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "មានបញ្ហាពេលបើកធ្នើ។ ពុំមានធ្នើ ឬមិនអាចបើកបាន" + +#: cps/web.py:2755 +#, python-format +msgid "Change order of Shelf: '%(name)s'" +msgstr "ប្តូរលំដាប់ធ្នើ៖ ‘%(name)s’" + +#: cps/web.py:2784 cps/web.py:3207 +msgid "E-mail is not from valid domain" +msgstr "" + +#: cps/web.py:2786 cps/web.py:2829 cps/web.py:2832 +#, python-format +msgid "%(name)s's profile" +msgstr "ព័ត៌មានសង្ខេបរបស់ %(name)s" + +#: cps/web.py:2827 +msgid "Found an existing account for this e-mail address." +msgstr "" + +#: cps/web.py:2830 +msgid "Profile updated" +msgstr "ព័ត៌មានសង្ខេបបានកែប្រែ" + +#: cps/web.py:2858 +msgid "Admin page" +msgstr "ទំព័ររដ្ឋបាល" + +#: cps/web.py:2938 cps/web.py:3112 +msgid "Calibre-Web configuration updated" +msgstr "" + +#: cps/templates/admin.html:100 cps/web.py:2951 +msgid "UI Configuration" +msgstr "ការកំណត់ផ្ទាំងប្រើប្រាស់" + +#: cps/web.py:2969 +msgid "Import of optional Google Drive requirements missing" +msgstr "ខ្វះការនាំចូលតម្រូវការបន្ថែមរបស់ Google Drive" + +#: cps/web.py:2972 +msgid "client_secrets.json is missing or not readable" +msgstr "មិនមានឯកសារ client_secrets.json ឬមិនអាចបើកបាន" + +#: cps/web.py:2977 cps/web.py:3004 +msgid "client_secrets.json is not configured for web application" +msgstr "ឯកសារ client_secrets.json មិនទាន់បានកំណត់សម្រាប់កម្មវិធីវែប" + +#: cps/templates/admin.html:99 cps/web.py:3007 cps/web.py:3033 cps/web.py:3045 +#: cps/web.py:3088 cps/web.py:3103 cps/web.py:3120 cps/web.py:3127 +#: cps/web.py:3142 +msgid "Basic Configuration" +msgstr "ការកំណត់សាមញ្ញ" + +#: cps/web.py:3030 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "ទីតាំងរបស់ keyfile មិនត្រឹមត្រូវ សូមបញ្ចូលទីតាំងត្រឹមត្រូវ" + +#: cps/web.py:3042 +msgid "Certfile location is not valid, please enter correct path" +msgstr "ទីតាំងរបស់ certfile មិនត្រឹមត្រូវ សូមបញ្ចូលទីតាំងត្រឹមត្រូវ" + +#: cps/web.py:3085 +msgid "Logfile location is not valid, please enter correct path" +msgstr "ទីតាំងរបស់ logfile មិនត្រឹមត្រូវ សូមបញ្ចូលទីតាំងត្រឹមត្រូវ" + +#: cps/web.py:3124 +msgid "DB location is not valid, please enter correct path" +msgstr "ទីតាំងរបស់ database មិនត្រឹមត្រូវ សូមបញ្ចូលទីតាំងត្រឹមត្រូវ" + +#: cps/templates/admin.html:33 cps/web.py:3203 cps/web.py:3209 cps/web.py:3225 +msgid "Add new user" +msgstr "បន្ថែមអ្នកប្រើប្រាស់ថ្មី" + +#: cps/web.py:3215 +#, python-format +msgid "User '%(user)s' created" +msgstr "បានបង្កើតអ្នកប្រើប្រាស់ ‘%(user)s’" + +#: cps/web.py:3219 +msgid "Found an existing account for this e-mail address or nickname." +msgstr "" + +#: cps/web.py:3243 cps/web.py:3257 +msgid "E-mail server settings updated" +msgstr "" + +#: cps/web.py:3250 +#, python-format +msgid "Test e-mail successfully send to %(kindlemail)s" +msgstr "" + +#: cps/web.py:3253 +#, python-format +msgid "There was an error sending the Test e-mail: %(res)s" +msgstr "" + +#: cps/web.py:3258 +msgid "Edit e-mail server settings" +msgstr "" + +#: cps/web.py:3283 +#, python-format +msgid "User '%(nick)s' deleted" +msgstr "អ្នកប្រើប្រាស់ ‘%(nick)s’ ត្រូវបានលុប" + +#: cps/web.py:3392 +#, python-format +msgid "User '%(nick)s' updated" +msgstr "អ្នកប្រើប្រាស់ ‘%(nick)s’ ត្រូវបានកែប្រែ" + +#: cps/web.py:3395 +msgid "An unknown error occured." +msgstr "បញ្ហាដែលមិនដឹងបានកើតឡើង។" + +#: cps/web.py:3397 +#, python-format +msgid "Edit User %(nick)s" +msgstr "កែប្រែអ្នកប្រើប្រាស់ %(nick)s" + +#: cps/web.py:3414 +#, python-format +msgid "Password for user %(user)s reset" +msgstr "" + +#: cps/web.py:3428 cps/web.py:3629 +msgid "Error opening eBook. File does not exist or file is not accessible" +msgstr "មានបញ្ហាពេលបើកឯកសារ eBook ។ ពុំមានឯកសារ ឬឯកសារនេះមិនអាចបើកបាន" + +#: cps/web.py:3453 cps/web.py:3912 +msgid "edit metadata" +msgstr "កែប្រែទិន្នន័យមេតា" + +#: cps/web.py:3546 cps/web.py:3782 +#, python-format +msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" +msgstr "ឯកសារប្រភេទ '%(ext)s' មិនត្រូវបានអនុញ្ញាតឲអាប់ឡូដទៅម៉ាស៊ីន server នេះទេ" + +#: cps/web.py:3550 cps/web.py:3786 +msgid "File to be uploaded must have an extension" +msgstr "ឯកសារដែលត្រូវអាប់ឡូដត្រូវមានកន្ទុយឯកសារ" + +#: cps/web.py:3562 cps/web.py:3806 +#, python-format +msgid "Failed to create path %(path)s (Permission denied)." +msgstr "មិនអាចបង្កើតទីតាំង %(path)s (ពុំមានសិទ្ធិ)។" + +#: cps/web.py:3567 +#, python-format +msgid "Failed to store file %(file)s." +msgstr "មិនអាចរក្សាទុកឯកសារ %(file)s ។" + +#: cps/web.py:3583 +#, python-format +msgid "File format %(ext)s added to %(book)s" +msgstr "ឯកសារទម្រង់ %(ext)s ត្រូវបានបន្ថែមទៅ %(book)s" + +#: cps/web.py:3601 +#, python-format +msgid "Failed to create path for cover %(path)s (Permission denied)." +msgstr "" + +#: cps/web.py:3608 +#, python-format +msgid "Failed to store cover-file %(cover)s." +msgstr "" + +#: cps/web.py:3611 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/web.py:3641 cps/web.py:3650 cps/web.py:3654 +msgid "unknown" +msgstr "មិនដឹង" + +#: cps/web.py:3673 +msgid "Cover is not a jpg file, can't save" +msgstr "គម្របមិនមែនជាឯកសារ JPG មិនអាចរក្សាទុក" + +#: cps/web.py:3721 +#, python-format +msgid "%(langname)s is not a valid language" +msgstr "" + +#: cps/web.py:3752 +msgid "Metadata successfully updated" +msgstr "" + +#: cps/web.py:3761 +msgid "Error editing book, please check logfile for details" +msgstr "មានបញ្ហាពេលកែប្រែសៀវភៅ សូមពិនិត្យមើល logfile សម្រាប់ព័ត៌មានបន្ថែម" + +#: cps/web.py:3811 +#, python-format +msgid "Failed to store file %(file)s (Permission denied)." +msgstr "មិនអាចរក្សាទុកឯកសារ %(file)s (មិនមានសិទ្ធិ)។" + +#: cps/web.py:3816 +#, python-format +msgid "Failed to delete file %(file)s (Permission denied)." +msgstr "មិនអាចលុបឯកសារ %(file)s (មិនមានសិទ្ធិ)។" + +#: cps/web.py:3898 +#, python-format +msgid "File %(file)s uploaded" +msgstr "ឯកសារ %(file)s ត្រូវបានអាប់ឡូដ" + +#: cps/web.py:3928 +msgid "Source or destination format for conversion missing" +msgstr "" + +#: cps/web.py:3938 +#, python-format +msgid "Book successfully queued for converting to %(book_format)s" +msgstr "" + +#: cps/web.py:3942 +#, python-format +msgid "There was an error converting this book: %(res)s" +msgstr "" + +#: cps/worker.py:287 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Ebook-converter បានបរាជ័យ៖ %(error)s" + +#: cps/worker.py:298 +#, python-format +msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" +msgstr "Kindlegen បានបរាជ័យដោយមានកំហុស %(error)s. សារ៖ %(message)s" + +#: cps/templates/admin.html:6 +msgid "User list" +msgstr "បញ្ជីអ្នកប្រើប្រាស់" + +#: cps/templates/admin.html:9 +msgid "Nickname" +msgstr "ឈ្មោះហៅក្រៅ" + +#: cps/templates/admin.html:10 +msgid "E-mail" +msgstr "" + +#: cps/templates/admin.html:11 +msgid "Kindle" +msgstr "ឧបករណ៍ Kindle" + +#: cps/templates/admin.html:12 +msgid "DLS" +msgstr "ឯកសារ DLS" + +#: cps/templates/admin.html:13 cps/templates/layout.html:74 +msgid "Admin" +msgstr "រដ្ឋបាល" + +#: cps/templates/admin.html:14 cps/templates/detail.html:22 +#: cps/templates/detail.html:31 +msgid "Download" +msgstr "ទាញយក" + +#: cps/templates/admin.html:15 cps/templates/layout.html:64 +msgid "Upload" +msgstr "អាប់ឡូដ" + +#: cps/templates/admin.html:16 +msgid "Edit" +msgstr "កែប្រែ" + +#: cps/templates/admin.html:39 +msgid "SMTP e-mail server settings" +msgstr "" + +#: cps/templates/admin.html:42 cps/templates/email_edit.html:11 +msgid "SMTP hostname" +msgstr "ឈ្មោះម៉ាស៊ីន SMTP" + +#: cps/templates/admin.html:43 +msgid "SMTP port" +msgstr "លេខ port SMTP" + +#: cps/templates/admin.html:44 +msgid "SSL" +msgstr "SSL" + +#: cps/templates/admin.html:45 cps/templates/email_edit.html:27 +msgid "SMTP login" +msgstr "អ្នកចូលប្រើ SMTP" + +#: cps/templates/admin.html:46 +msgid "From mail" +msgstr "ពីអ៊ីមែល" + +#: cps/templates/admin.html:56 +msgid "Change SMTP settings" +msgstr "ប្តូរការកំណត់ SMTP" + +#: cps/templates/admin.html:62 +msgid "Configuration" +msgstr "ការកំណត់" + +#: cps/templates/admin.html:65 +msgid "Calibre DB dir" +msgstr "ទីតាំង database Calibre" + +#: cps/templates/admin.html:69 +msgid "Log level" +msgstr "" + +#: cps/templates/admin.html:73 +msgid "Port" +msgstr "លេខ port" + +#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23 +msgid "Books per page" +msgstr "ចំនួនសៀវភៅក្នុងមួយទំព័រ" + +#: cps/templates/admin.html:83 +msgid "Uploading" +msgstr "កំពុងអាប់ឡូដ" + +#: cps/templates/admin.html:87 +msgid "Anonymous browsing" +msgstr "" + +#: cps/templates/admin.html:91 +msgid "Public registration" +msgstr "ការចុះឈ្មាះសាធារណៈ" + +#: cps/templates/admin.html:95 cps/templates/remote_login.html:4 +msgid "Remote login" +msgstr "ការចូលប្រើប្រាស់ពីចម្ងាយ" + +#: cps/templates/admin.html:106 +msgid "Administration" +msgstr "កិច្ចការរដ្ឋបាល" + +#: cps/templates/admin.html:107 +msgid "Reconnect to Calibre DB" +msgstr "ភ្ជាប់ទៅ database Calibre ម្តងទៀត" + +#: cps/templates/admin.html:108 +msgid "Restart Calibre-Web" +msgstr "" + +#: cps/templates/admin.html:109 +msgid "Stop Calibre-Web" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Update" +msgstr "" + +#: cps/templates/admin.html:119 +msgid "Version" +msgstr "" + +#: cps/templates/admin.html:120 +msgid "Details" +msgstr "" + +#: cps/templates/admin.html:126 +msgid "Current version" +msgstr "" + +#: cps/templates/admin.html:132 +msgid "Check for update" +msgstr "រកមើលបច្ចុប្បន្នភាព" + +#: cps/templates/admin.html:133 +msgid "Perform Update" +msgstr "ធ្វើបច្ចុប្បន្នភាព" + +#: cps/templates/admin.html:145 +msgid "Do you really want to restart Calibre-Web?" +msgstr "" + +#: cps/templates/admin.html:150 cps/templates/admin.html:164 +#: cps/templates/admin.html:184 cps/templates/shelf.html:61 +msgid "Ok" +msgstr "បាទ/ចាស" + +#: cps/templates/admin.html:151 cps/templates/admin.html:165 +#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200 +#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168 +#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75 +#: cps/templates/shelf.html:62 cps/templates/shelf_edit.html:19 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155 +msgid "Back" +msgstr "មកក្រោយ" + +#: cps/templates/admin.html:163 +msgid "Do you really want to stop Calibre-Web?" +msgstr "" + +#: cps/templates/admin.html:175 +msgid "Updating, please do not reload page" +msgstr "កំពុងធ្វើបច្ចុប្បន្នភាព សូមកុំបើកទំព័រជាថ្មី" + +#: cps/templates/author.html:15 +msgid "via" +msgstr "តាមរយៈ" + +#: cps/templates/author.html:23 +msgid "In Library" +msgstr "នៅក្នុងបណ្ណាល័យ" + +#: cps/templates/author.html:69 +msgid "More by" +msgstr "បន្ថែមទៀតដោយ" + +#: cps/templates/book_edit.html:16 +msgid "Delete Book" +msgstr "លុបសៀវភៅ" + +#: cps/templates/book_edit.html:19 +msgid "Delete formats:" +msgstr "លុបឯកសារទម្រង់៖" + +#: cps/templates/book_edit.html:22 cps/templates/book_edit.html:199 +#: cps/templates/email_edit.html:73 cps/templates/email_edit.html:74 +msgid "Delete" +msgstr "លុប" + +#: cps/templates/book_edit.html:30 +msgid "Convert book format:" +msgstr "" + +#: cps/templates/book_edit.html:34 +msgid "Convert from:" +msgstr "" + +#: cps/templates/book_edit.html:36 cps/templates/book_edit.html:43 +msgid "select an option" +msgstr "" + +#: cps/templates/book_edit.html:41 +msgid "Convert to:" +msgstr "" + +#: cps/templates/book_edit.html:50 +msgid "Convert book" +msgstr "" + +#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6 +msgid "Book Title" +msgstr "ចំណងជើងសៀវភៅ" + +#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:259 +#: cps/templates/book_edit.html:277 cps/templates/search_form.html:10 +msgid "Author" +msgstr "អ្នកនិពន្ធ" + +#: cps/templates/book_edit.html:67 cps/templates/book_edit.html:264 +#: cps/templates/book_edit.html:279 cps/templates/search_form.html:106 +msgid "Description" +msgstr "ពិពណ៌នា" + +#: cps/templates/book_edit.html:71 cps/templates/search_form.html:33 +msgid "Tags" +msgstr "Tag" + +#: cps/templates/book_edit.html:75 cps/templates/layout.html:157 +#: cps/templates/search_form.html:53 +msgid "Series" +msgstr "ស៊េរី" + +#: cps/templates/book_edit.html:79 +msgid "Series id" +msgstr "លេខសម្គាល់ស៊េរី" + +#: cps/templates/book_edit.html:83 +msgid "Rating" +msgstr "ការវាយតម្លៃ" + +#: cps/templates/book_edit.html:87 +msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +msgstr "URL របស់ក្របមុខ (ឯកសារ JPG ក្របមុខត្រូវបានទាញយក និងរក្សាទុកក្នុង database ក្រោយមកចន្លោះនេះទទេម្តងទៀត)" + +#: cps/templates/book_edit.html:91 +msgid "Upload Cover from local drive" +msgstr "" + +#: cps/templates/book_edit.html:96 cps/templates/detail.html:135 +msgid "Publishing date" +msgstr "ថ្ងៃបោះពុម្ភ" + +#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:278 cps/templates/detail.html:127 +#: cps/templates/search_form.html:14 +msgid "Publisher" +msgstr "អ្នកបោះពុម្ភ" + +#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31 +msgid "Language" +msgstr "ភាសា" + +#: cps/templates/book_edit.html:117 cps/templates/search_form.html:117 +msgid "Yes" +msgstr "បាទ/ចាស" + +#: cps/templates/book_edit.html:118 cps/templates/search_form.html:118 +msgid "No" +msgstr "ទេ" + +#: cps/templates/book_edit.html:164 +msgid "Upload format" +msgstr "ទម្រង់អាប់ឡូដ" + +#: cps/templates/book_edit.html:173 +msgid "view book after edit" +msgstr "មើលសៀវភៅក្រោយពីកែប្រែ" + +#: cps/templates/book_edit.html:176 cps/templates/book_edit.html:212 +msgid "Get metadata" +msgstr "មើលទិន្នន័យមេតា" + +#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210 +#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20 +#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17 +#: cps/templates/user_edit.html:153 +msgid "Submit" +msgstr "បញ្ចូល" + +#: cps/templates/book_edit.html:191 +msgid "Are you really sure?" +msgstr "" + +#: cps/templates/book_edit.html:194 +msgid "Book will be deleted from Calibre database" +msgstr "សៀវភៅនឹងត្រូវលុបចេញពី database របស់ Calibre" + +#: cps/templates/book_edit.html:195 +msgid "and from hard disk" +msgstr "និងពីថាសរឹង" + +#: cps/templates/book_edit.html:215 +msgid "Keyword" +msgstr "ពាក្យគន្លឹះ" + +#: cps/templates/book_edit.html:216 +msgid " Search keyword " +msgstr "ស្វែងរកពាក្យគន្លឹះ" + +#: cps/templates/book_edit.html:218 cps/templates/layout.html:46 +msgid "Go!" +msgstr "ទៅ!" + +#: cps/templates/book_edit.html:222 +msgid "Click the cover to load metadata to the form" +msgstr "ចុចលើគម្របដើម្បីបញ្ចូលទិន្នន័យមេតាទៅក្នុង form" + +#: cps/templates/book_edit.html:234 cps/templates/book_edit.html:274 +msgid "Loading..." +msgstr "កំពុងដំណើរការ..." + +#: cps/templates/book_edit.html:239 cps/templates/layout.html:224 +msgid "Close" +msgstr "បិទ" + +#: cps/templates/book_edit.html:266 cps/templates/book_edit.html:280 +msgid "Source" +msgstr "ប្រភព" + +#: cps/templates/book_edit.html:275 +msgid "Search error!" +msgstr "ការស្វែងរកមានកំហុស!" + +#: cps/templates/book_edit.html:276 +msgid "No Result(s) found! Please try aonther keyword." +msgstr "" + +#: cps/templates/config_edit.html:12 +msgid "Library Configuration" +msgstr "ការកំណត់បណ្ណាល័យ" + +#: cps/templates/config_edit.html:19 +msgid "Location of Calibre database" +msgstr "ទីតាំង database របស់ Calibre" + +#: cps/templates/config_edit.html:24 +msgid "Use Google Drive?" +msgstr "ប្រើ Google Drive ឬ?" + +#: cps/templates/config_edit.html:30 +msgid "Google Drive config problem" +msgstr "មានបញ្ហាកំណត់ប្រើជាមួយ Google Drive" + +#: cps/templates/config_edit.html:36 +msgid "Authenticate Google Drive" +msgstr "វាយបញ្ចូលគណនី Google Drive" + +#: cps/templates/config_edit.html:40 +msgid "Please finish Google Drive setup after login" +msgstr "សូមបញ្ចប់ការភ្ជាប់ទៅ Google Drive ក្រោយពេល login" + +#: cps/templates/config_edit.html:44 +msgid "Google Drive Calibre folder" +msgstr "Folder របស់ Google Drive Calibre" + +#: cps/templates/config_edit.html:52 +msgid "Metadata Watch Channel ID" +msgstr "Metadata Watch Channel ID" + +#: cps/templates/config_edit.html:55 +msgid "Revoke" +msgstr "ដកសិទ្ធិ" + +#: cps/templates/config_edit.html:73 +msgid "Server Configuration" +msgstr "ការកំណត់ម៉ាស៊ីន server" + +#: cps/templates/config_edit.html:80 +msgid "Server Port" +msgstr "លេខ port របស់ម៉ាស៊ីន server" + +#: cps/templates/config_edit.html:84 +msgid "SSL certfile location (leave it empty for non-SSL Servers)" +msgstr "ទីតាំង SSL certfile (ទុកទទេសម្រាប់ម៉ាស៊ីន server ដែលមិនប្រើ SSL)" + +#: cps/templates/config_edit.html:88 +msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" +msgstr "ទីតាំង SSL keyfile (ទុកទទេសម្រាប់ម៉ាស៊ីន server ដែលមិនប្រើ SSL)" + +#: cps/templates/config_edit.html:99 +msgid "Logfile Configuration" +msgstr "ការកំណត់ logfile" + +#: cps/templates/config_edit.html:106 +msgid "Log Level" +msgstr "កម្រិត log" + +#: cps/templates/config_edit.html:115 +msgid "Location and name of logfile (calibre-web.log for no entry)" +msgstr "ទីតាំង និងឈ្មោះ logfile (calibre-web.log ប្រសិនបើទទេ)" + +#: cps/templates/config_edit.html:126 +msgid "Feature Configuration" +msgstr "ការកំណត់មុខងារ" + +#: cps/templates/config_edit.html:134 +msgid "Enable uploading" +msgstr "អនុញ្ញាតការអាប់ឡូត" + +#: cps/templates/config_edit.html:138 +msgid "Enable anonymous browsing" +msgstr "អនុញ្ញាតការរុករកដោយអនាមិក" + +#: cps/templates/config_edit.html:142 +msgid "Enable public registration" +msgstr "អនុញ្ញាតការចុះឈ្មោះសាធារណៈ" + +#: cps/templates/config_edit.html:146 +msgid "Enable remote login (\"magic link\")" +msgstr "អនុញ្ញាតការ login ពីចម្ងាយ (ឬ “magic link”)" + +#: cps/templates/config_edit.html:151 +msgid "Use" +msgstr "ប្រើប្រាស់" + +#: cps/templates/config_edit.html:152 +msgid "Obtain an API Key" +msgstr "ទាញយក API key" + +#: cps/templates/config_edit.html:156 +msgid "Goodreads API Key" +msgstr "Goodreads API key" + +#: cps/templates/config_edit.html:160 +msgid "Goodreads API Secret" +msgstr "Goodreads API secret" + +#: cps/templates/config_edit.html:173 +msgid "External binaries" +msgstr "" + +#: cps/templates/config_edit.html:181 +msgid "No converter" +msgstr "គ្មានកម្មវិធីបម្លែង" + +#: cps/templates/config_edit.html:183 +msgid "Use Kindlegen" +msgstr "ប្រើ Kindlegen" + +#: cps/templates/config_edit.html:185 +msgid "Use calibre's ebook converter" +msgstr "ប្រើកម្មវិធីបម្លែង eBook របស់ Calibre" + +#: cps/templates/config_edit.html:189 +msgid "E-Book converter settings" +msgstr "ការកំណត់របស់កម្មវិធីបម្លែង eBook" + +#: cps/templates/config_edit.html:193 +msgid "Path to convertertool" +msgstr "ទីតាំងរបស់កម្មវិធីបម្លែង" + +#: cps/templates/config_edit.html:199 +msgid "Location of Unrar binary" +msgstr "" + +#: cps/templates/config_edit.html:215 cps/templates/layout.html:82 +#: cps/templates/login.html:4 +msgid "Login" +msgstr "ចូលប្រើប្រាស់" + +#: cps/templates/config_view_edit.html:12 +msgid "View Configuration" +msgstr "មើលការកំណត់" + +#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 +#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 +msgid "Title" +msgstr "ចំណងជើង" + +#: cps/templates/config_view_edit.html:27 +msgid "No. of random books to show" +msgstr "ចំនួនសៀវភៅចៃដន្យដើម្បីបង្ហាញ" + +#: cps/templates/config_view_edit.html:31 +msgid "Regular expression for ignoring columns" +msgstr "Regular expression សម្រាប់រំលងជួរឈរ" + +#: cps/templates/config_view_edit.html:35 +msgid "Link read/unread status to Calibre column" +msgstr "ភ្ជាប់ស្ថានភាពបានអាន/មិនទាន់បានអានទៅជួរឈររបស់ Calibre" + +#: cps/templates/config_view_edit.html:44 +msgid "Regular expression for title sorting" +msgstr "Regular expression ដើម្បីរៀបចំណងជើងតាមលំដាប់" + +#: cps/templates/config_view_edit.html:48 +msgid "Tags for Mature Content" +msgstr "Tag សម្រាប់មាតិកាសម្រាប់មនុស្សពេញវ័យ" + +#: cps/templates/config_view_edit.html:62 +msgid "Default settings for new users" +msgstr "ការកំណត់មកស្រាប់សម្រាប់អ្នកប្រើប្រាស់ថ្មី" + +#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110 +msgid "Admin user" +msgstr "អ្នកប្រើប្រាស់រដ្ឋបាល" + +#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119 +msgid "Allow Downloads" +msgstr "អនុញ្ញាតឲទាញយក" + +#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123 +msgid "Allow Uploads" +msgstr "អនុញ្ញាតឲអាប់ឡូត" + +#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127 +msgid "Allow Edit" +msgstr "អនុញ្ញាតឲកែប្រែ" + +#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131 +msgid "Allow Delete books" +msgstr "អនុញ្ញាតឲលុបសៀវភៅ" + +#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136 +msgid "Allow Changing Password" +msgstr "អនុញ្ញាតឲប្តូរលេខសម្ងាត់" + +#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140 +msgid "Allow Editing Public Shelfs" +msgstr "អនុញ្ញាតឲកែប្រែធ្នើសាធារណៈ" + +#: cps/templates/config_view_edit.html:104 +msgid "Default visibilities for new users" +msgstr "ភាពមើលឃើញដែលមកស្រាប់សម្រាប់អ្នកប្រើប្រាស់ថ្មី" + +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58 +msgid "Show random books" +msgstr "បង្ហាញសៀវភៅចៃដន្យ" + +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62 +msgid "Show recent books" +msgstr "បង្ហាញសៀវភៅមកថ្មី" + +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66 +msgid "Show sorted books" +msgstr "បង្ហាញសៀវភៅដែលរៀបតាមលំដាប់" + +#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70 +msgid "Show hot books" +msgstr "បង្ហាញសៀវភៅដែលមានប្រជាប្រិយភាព" + +#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74 +msgid "Show best rated books" +msgstr "បង្ហាញសៀវភៅដែលមានការវាយតម្លៃល្អជាងគេ" + +#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78 +msgid "Show language selection" +msgstr "បង្ហាញផ្នែកភាសា" + +#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82 +msgid "Show series selection" +msgstr "បង្ហាញជម្រើសស៊េរី" + +#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86 +msgid "Show category selection" +msgstr "បង្ហាញជម្រើសប្រភេទ" + +#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90 +msgid "Show author selection" +msgstr "បង្ហាញជម្រើសអ្នកនិពន្ធ" + +#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94 +msgid "Show publisher selection" +msgstr "" + +#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98 +msgid "Show read and unread" +msgstr "បង្ហាញអានរួច និងមិនទាន់អាន" + +#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102 +msgid "Show random books in detail view" +msgstr "បង្ហាញសៀវភៅចៃដន្យក្នុងការបង្ហាញជាពិស្តារ" + +#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115 +msgid "Show mature content" +msgstr "បង្ហាញមាតិកាសម្រាប់មនុស្សពេញវ័យ" + +#: cps/templates/detail.html:49 +msgid "Read in browser" +msgstr "អានក្នុងកម្មវិធី browser" + +#: cps/templates/detail.html:88 +msgid "Book" +msgstr "សៀវភៅ" + +#: cps/templates/detail.html:88 +msgid "of" +msgstr "នៃ" + +#: cps/templates/detail.html:94 +msgid "language" +msgstr "ភាសា" + +#: cps/templates/detail.html:172 +msgid "Read" +msgstr "អាន" + +#: cps/templates/detail.html:182 +msgid "Description:" +msgstr "ពិពណ៌នា" + +#: cps/templates/detail.html:195 cps/templates/search.html:14 +msgid "Add to shelf" +msgstr "បន្ថែមទៅធ្នើ" + +#: cps/templates/detail.html:257 +msgid "Edit metadata" +msgstr "កែប្រែទិន្នន័យមេតា" + +#: cps/templates/email_edit.html:15 +msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +msgstr "លេខ port SMTP (ជាធម្មតាលេខ 25 សម្រាប់ SMTP ធម្មតា ឬ 465 សម្រាប់ SSL ឬ 587 សម្រាប់ STARTTLS)" + +#: cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "ការអ៊ិនគ្រីប" + +#: cps/templates/email_edit.html:21 +msgid "None" +msgstr "គ្មាន" + +#: cps/templates/email_edit.html:22 +msgid "STARTTLS" +msgstr "STARTTLS" + +#: cps/templates/email_edit.html:23 +msgid "SSL/TLS" +msgstr "SSL/TLS" + +#: cps/templates/email_edit.html:31 +msgid "SMTP password" +msgstr "លេខសម្ងាត់ SMTP" + +#: cps/templates/email_edit.html:35 +msgid "From e-mail" +msgstr "ពីអ៊ីមែល" + +#: cps/templates/email_edit.html:38 +msgid "Save settings" +msgstr "រក្សាទុកការកំណត់" + +#: cps/templates/email_edit.html:39 +msgid "Save settings and send Test E-Mail" +msgstr "រក្សាទុកការកំណត់រួចផ្ញើអ៊ីមែលសាកល្បង" + +#: cps/templates/email_edit.html:43 +msgid "Allowed domains for registering" +msgstr "" + +#: cps/templates/email_edit.html:47 +msgid "Enter domainname" +msgstr "" + +#: cps/templates/email_edit.html:55 +msgid "Add Domain" +msgstr "" + +#: cps/templates/email_edit.html:58 +msgid "Add" +msgstr "" + +#: cps/templates/email_edit.html:72 +msgid "Do you really want to delete this domain rule?" +msgstr "" + +#: cps/templates/feed.xml:21 cps/templates/layout.html:208 +msgid "Next" +msgstr "បន្ទាប់" + +#: cps/templates/feed.xml:33 cps/templates/index.xml:11 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 +msgid "Search" +msgstr "ស្វែងរក" + +#: cps/templates/index.html:5 +msgid "Discover (Random Books)" +msgstr "ស្រាវជ្រាវ (សៀវភៅចៃដន្យ)" + +#: cps/templates/index.xml:6 +msgid "Start" +msgstr "ចាប់ផ្តើម" + +#: cps/templates/index.xml:18 cps/templates/layout.html:139 +msgid "Hot Books" +msgstr "សៀវភៅដែលមានប្រជាប្រិយភាព" + +#: cps/templates/index.xml:22 +msgid "Popular publications from this catalog based on Downloads." +msgstr "ការបោះពុម្ភផ្សាយដែលមានប្រជាប្រិយភាពពីកាតាឡុកនេះផ្អែកលើការទាញយក" + +#: cps/templates/index.xml:25 cps/templates/layout.html:142 +msgid "Best rated Books" +msgstr "សៀវភៅដែលមានការវាយតម្លៃល្អជាងគេ" + +#: cps/templates/index.xml:29 +msgid "Popular publications from this catalog based on Rating." +msgstr "ការបោះពុម្ភផ្សាយដែលមានប្រជាប្រិយភាពពីកាតាឡុកនេះផ្អែកលើការវាយតម្លៃ" + +#: cps/templates/index.xml:32 +msgid "New Books" +msgstr "សៀវភៅថ្មីៗ" + +#: cps/templates/index.xml:36 +msgid "The latest Books" +msgstr "សៀវភៅចុងក្រោយគេ" + +#: cps/templates/index.xml:43 +msgid "Show Random Books" +msgstr "បង្ហាញសៀវភៅចៃដន្យ" + +#: cps/templates/index.xml:62 cps/templates/layout.html:160 +msgid "Authors" +msgstr "អ្នកនិពន្ធ" + +#: cps/templates/index.xml:66 +msgid "Books ordered by Author" +msgstr "សៀវភៅរៀបតាមលំដាប់អ្នកនិពន្ធ" + +#: cps/templates/index.xml:69 cps/templates/layout.html:163 +msgid "Publishers" +msgstr "" + +#: cps/templates/index.xml:73 +msgid "Books ordered by publisher" +msgstr "" + +#: cps/templates/index.xml:80 +msgid "Books ordered by category" +msgstr "សៀវភៅរៀបតាមលំដាប់ប្រភេទ" + +#: cps/templates/index.xml:87 +msgid "Books ordered by series" +msgstr "សៀវភៅរៀបតាមលំដាប់ស៊េរី" + +#: cps/templates/index.xml:90 cps/templates/layout.html:169 +msgid "Public Shelves" +msgstr "ធ្នើសាធារណៈ" + +#: cps/templates/index.xml:94 +msgid "Books organized in public shelfs, visible to everyone" +msgstr "សៀវភៅដែលរៀបចំនៅក្នុងធ្នើសាធារណៈ អាចមើលឃើញដោយគ្រប់គ្នា" + +#: cps/templates/index.xml:98 cps/templates/layout.html:173 +msgid "Your Shelves" +msgstr "ធ្នើរបស់អ្នក" + +#: cps/templates/index.xml:102 +msgid "User's own shelfs, only visible to the current user himself" +msgstr "ធ្នើផ្ទាល់ខ្លួនរបស់អ្នកប្រើប្រាស់ អាចមើលឃើញដោយអ្នកប្រើប្រាស់នេះប៉ុណ្ណោះ" + +#: cps/templates/layout.html:33 +msgid "Toggle navigation" +msgstr "បិទ/បើកការរុករក" + +#: cps/templates/layout.html:54 +msgid "Advanced Search" +msgstr "ស្វែងរកកម្រិតខ្ពស់" + +#: cps/templates/layout.html:78 +msgid "Logout" +msgstr "ចេញពីការប្រើប្រាស់" + +#: cps/templates/layout.html:83 cps/templates/register.html:14 +msgid "Register" +msgstr "ចុះឈ្មោះ" + +#: cps/templates/layout.html:108 +msgid "Uploading..." +msgstr "កំពុងអាប់ឡូត..." + +#: cps/templates/layout.html:109 +msgid "please don't refresh the page" +msgstr "សូមកុំបើកទំព័រជាថ្មី" + +#: cps/templates/layout.html:120 +msgid "Browse" +msgstr "រុករក" + +#: cps/templates/layout.html:122 +msgid "Recently Added" +msgstr "ទើបបន្ថែមថ្មីៗ" + +#: cps/templates/layout.html:127 +msgid "Sorted Books" +msgstr "សៀវភៅរៀបតាមលំដាប់" + +#: cps/templates/layout.html:131 cps/templates/layout.html:132 +#: cps/templates/layout.html:133 cps/templates/layout.html:134 +msgid "Sort By" +msgstr "រៀបតាម" + +#: cps/templates/layout.html:131 +msgid "Newest" +msgstr "ថ្មីជាងគេ" + +#: cps/templates/layout.html:132 +msgid "Oldest" +msgstr "ចាស់ជាងគេ" + +#: cps/templates/layout.html:133 +msgid "Ascending" +msgstr "ពីតូចទៅធំ" + +#: cps/templates/layout.html:134 +msgid "Descending" +msgstr "ពីធំទៅតូច" + +#: cps/templates/layout.html:151 +msgid "Discover" +msgstr "ស្រាវជ្រាវ" + +#: cps/templates/layout.html:154 +msgid "Categories" +msgstr "ប្រភេទនានា" + +#: cps/templates/layout.html:166 cps/templates/search_form.html:74 +msgid "Languages" +msgstr "ភាសានានា" + +#: cps/templates/layout.html:178 +msgid "Create a Shelf" +msgstr "បង្កើតធ្នើ" + +#: cps/templates/layout.html:179 cps/templates/stats.html:3 +msgid "About" +msgstr "អំពី" + +#: cps/templates/layout.html:193 +msgid "Previous" +msgstr "មុន" + +#: cps/templates/layout.html:220 +msgid "Book Details" +msgstr "ព័ត៌មានលម្អិតរបស់សៀវភៅ" + +#: cps/templates/login.html:8 cps/templates/login.html:9 +#: cps/templates/register.html:7 cps/templates/user_edit.html:8 +msgid "Username" +msgstr "ឈ្មោះអ្នកប្រើប្រាស់" + +#: cps/templates/login.html:12 cps/templates/login.html:13 +#: cps/templates/user_edit.html:21 +msgid "Password" +msgstr "លេខសម្ងាត់" + +#: cps/templates/login.html:17 +msgid "Remember me" +msgstr "ចងចាំខ្ញុំ" + +#: cps/templates/login.html:22 +msgid "Log in with magic link" +msgstr "ចូលប្រើប្រាស់ដោយ magic link" + +#: cps/templates/osd.xml:5 +msgid "Calibre-Web ebook catalog" +msgstr "" + +#: cps/templates/read.html:69 cps/templates/readcbr.html:79 +#: cps/templates/readcbr.html:103 +msgid "Settings" +msgstr "ការកំណត់" + +#: cps/templates/read.html:72 +msgid "Reflow text when sidebars are open." +msgstr "សេរេអត្ថបទនៅពេលបើកផ្ទាំងចំហៀង។" + +#: cps/templates/readcbr.html:84 +msgid "Keyboard Shortcuts" +msgstr "" + +#: cps/templates/readcbr.html:87 +msgid "Previous Page" +msgstr "" + +#: cps/templates/readcbr.html:88 +msgid "Next Page" +msgstr "" + +#: cps/templates/readcbr.html:89 +msgid "Scale to Best" +msgstr "" + +#: cps/templates/readcbr.html:90 +msgid "Scale to Width" +msgstr "" + +#: cps/templates/readcbr.html:91 +msgid "Scale to Height" +msgstr "" + +#: cps/templates/readcbr.html:92 +msgid "Scale to Native" +msgstr "" + +#: cps/templates/readcbr.html:93 +msgid "Rotate Right" +msgstr "" + +#: cps/templates/readcbr.html:94 +msgid "Rotate Left" +msgstr "" + +#: cps/templates/readcbr.html:95 +msgid "Flip Image" +msgstr "" + +#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39 +msgid "Theme" +msgstr "ការតុបតែង" + +#: cps/templates/readcbr.html:111 +msgid "Light" +msgstr "" + +#: cps/templates/readcbr.html:112 +msgid "Dark" +msgstr "" + +#: cps/templates/readcbr.html:117 +msgid "Scale" +msgstr "" + +#: cps/templates/readcbr.html:120 +msgid "Best" +msgstr "" + +#: cps/templates/readcbr.html:121 +msgid "Width" +msgstr "" + +#: cps/templates/readcbr.html:122 +msgid "Height" +msgstr "" + +#: cps/templates/readcbr.html:123 +msgid "Native" +msgstr "" + +#: cps/templates/readcbr.html:128 +msgid "Rotate" +msgstr "" + +#: cps/templates/readcbr.html:139 +msgid "Flip" +msgstr "" + +#: cps/templates/readcbr.html:142 +msgid "Horizontal" +msgstr "" + +#: cps/templates/readcbr.html:143 +msgid "Vertical" +msgstr "" + +#: cps/templates/readpdf.html:29 +msgid "PDF.js viewer" +msgstr "កម្មវិធីមើល PDF.js" + +#: cps/templates/readtxt.html:6 +msgid "Basic txt Reader" +msgstr "កម្មវិធីមើល txt សាមញ្ញ" + +#: cps/templates/register.html:4 +msgid "Register a new account" +msgstr "ចុះឈ្មោះបង្កើតគណនីថ្មី" + +#: cps/templates/register.html:8 +msgid "Choose a username" +msgstr "ជ្រើសរើសឈ្មោះអ្នកប្រើប្រាស់" + +#: cps/templates/register.html:11 cps/templates/user_edit.html:13 +msgid "E-mail address" +msgstr "" + +#: cps/templates/register.html:12 +msgid "Your email address" +msgstr "អាសយដ្ឋានអ៊ីមែលរបស់អ្នក" + +#: cps/templates/remote_login.html:6 +msgid "Using your another device, visit" +msgstr "ដោយប្រើប្រាស់ឧបករណ៍ផ្សេងទៀតរបស់អ្នក សូមចូលទៅ" + +#: cps/templates/remote_login.html:6 +msgid "and log in" +msgstr "រួចចូលប្រើប្រាស់" + +#: cps/templates/remote_login.html:9 +msgid "Once you do so, you will automatically get logged in on this device." +msgstr "ក្រោយពីនេះ អ្នកនឹងត្រូវបានឲចូលប្រើប្រាស់ក្នុងឧបករណ៍នេះដោយស្វ័យប្រវត្តិ។" + +#: cps/templates/search.html:5 +msgid "No Results for:" +msgstr "គ្មានលទ្ធផលសម្រាប់៖" + +#: cps/templates/search.html:6 +msgid "Please try a different search" +msgstr "សូមសាកល្បងស្វែងរកផ្សេងទៀត" + +#: cps/templates/search.html:8 +msgid "Results for:" +msgstr "លទ្ធផលសម្រាប់៖" + +#: cps/templates/search_form.html:19 +msgid "Publishing date from" +msgstr "ថ្ងៃបោះពុម្ភចាប់ពី" + +#: cps/templates/search_form.html:26 +msgid "Publishing date to" +msgstr "ថ្ងៃបោះពុម្ភរហូតដល់" + +#: cps/templates/search_form.html:43 +msgid "Exclude Tags" +msgstr "លើកលែង tag" + +#: cps/templates/search_form.html:63 +msgid "Exclude Series" +msgstr "លើកលែងស៊េរី" + +#: cps/templates/search_form.html:84 +msgid "Exclude Languages" +msgstr "លើកលែងភាសា" + +#: cps/templates/search_form.html:97 +msgid "Rating bigger than" +msgstr "ការវាយតម្លៃលើសពី" + +#: cps/templates/search_form.html:101 +msgid "Rating less than" +msgstr "ការវាយតម្លៃតិចជាង" + +#: cps/templates/shelf.html:7 +msgid "Delete this Shelf" +msgstr "លុបធ្នើនេះ" + +#: cps/templates/shelf.html:8 +msgid "Edit Shelf" +msgstr "" + +#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11 +msgid "Change order" +msgstr "ប្តូរលំដាប់" + +#: cps/templates/shelf.html:56 +msgid "Do you really want to delete the shelf?" +msgstr "តើអ្នកពិតជាចង់លុបធ្នើនេះមែនទេ?" + +#: cps/templates/shelf.html:59 +msgid "Shelf will be lost for everybody and forever!" +msgstr "ធ្នើនេះនឹងបាត់បង់ជាអចិន្ត្រៃយ៍សម្រាប់គ្រប់គ្នា!" + +#: cps/templates/shelf_edit.html:13 +msgid "should the shelf be public?" +msgstr "តើធ្នើនេះគួរជាសាធារណៈទេ?" + +#: cps/templates/shelf_order.html:5 +msgid "Drag 'n drop to rearrange order" +msgstr "ទាញដើម្បីប្តូរលំដាប់" + +#: cps/templates/stats.html:7 +msgid "Calibre library statistics" +msgstr "ស្ថិតិបណ្ណាល័យ Calibre" + +#: cps/templates/stats.html:12 +msgid "Books in this Library" +msgstr "សៀវភៅនានាក្នុងបណ្ណាល័យនេះ" + +#: cps/templates/stats.html:16 +msgid "Authors in this Library" +msgstr "អ្នកនិពន្ធនានាក្នុងបណ្ណាល័យនេះ" + +#: cps/templates/stats.html:20 +msgid "Categories in this Library" +msgstr "ប្រភេទនានាក្នុងបណ្ណាល័យនេះ" + +#: cps/templates/stats.html:24 +msgid "Series in this Library" +msgstr "ស៊េរីនានាក្នុងបណ្ណាល័យនេះ" + +#: cps/templates/stats.html:28 +msgid "Linked libraries" +msgstr "បណ្ណាល័យដែលមានទំនាក់ទំនង" + +#: cps/templates/stats.html:32 +msgid "Program library" +msgstr "Library របស់កម្មវិធី" + +#: cps/templates/stats.html:33 +msgid "Installed Version" +msgstr "លេខ version ដែលបានតម្លើង" + +#: cps/templates/tasks.html:7 +msgid "Tasks list" +msgstr "បញ្ជីការងារ" + +#: cps/templates/tasks.html:12 +msgid "User" +msgstr "អ្នកប្រើប្រាស់" + +#: cps/templates/tasks.html:14 +msgid "Task" +msgstr "ការងារ" + +#: cps/templates/tasks.html:15 +msgid "Status" +msgstr "ស្ថានភាព" + +#: cps/templates/tasks.html:16 +msgid "Progress" +msgstr "ដំណើរការ" + +#: cps/templates/tasks.html:17 +msgid "Runtime" +msgstr "រយៈពេលដែលបានចាប់ផ្តើម" + +#: cps/templates/tasks.html:18 +msgid "Starttime" +msgstr "ពេលចាប់ផ្តើម" + +#: cps/templates/tasks.html:24 +msgid "Delete finished tasks" +msgstr "លុបការងារដែលបានបញ្ចប់" + +#: cps/templates/tasks.html:25 +msgid "Hide all tasks" +msgstr "លាក់ការងារទាំងអស់" + +#: cps/templates/user_edit.html:18 +msgid "Reset user Password" +msgstr "" + +#: cps/templates/user_edit.html:27 +msgid "Kindle E-Mail" +msgstr "អ៊ីមែល Kindle" + +#: cps/templates/user_edit.html:41 +msgid "Standard Theme" +msgstr "ការតុបតែងសម្រាប់ប្រើ" + +#: cps/templates/user_edit.html:42 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "ការតុបតែងពណ៌ងងឹត caliBlur! (Beta)" + +#: cps/templates/user_edit.html:47 +msgid "Show books with language" +msgstr "បង្ហាញសៀវភៅដែលមានភាសា" + +#: cps/templates/user_edit.html:49 +msgid "Show all" +msgstr "បង្ហាញទាំងអស់" + +#: cps/templates/user_edit.html:147 +msgid "Delete this user" +msgstr "លុបអ្នកប្រើប្រាស់នេះ" + +#: cps/templates/user_edit.html:162 +msgid "Recent Downloads" +msgstr "ការទាញយកថ្មីៗ" + +#~ msgid "%s: %s" +#~ msgstr "%s៖ %s" + +#~ msgid "E-Mail: %(book)s" +#~ msgstr "អ៊ីមែល៖ %(book)s" + +#~ msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +#~ msgstr "ប្តូរចំណងជើងពី “%(src)s” ទៅជា “%(dest)s” បរាជ័យដោយបញ្ហា: %(error)s" + +#~ msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +#~ msgstr "ប្តូរអ្នកនិពន្ធពី “%(src)s” ទៅជា “%(dest)s” បរាជ័យដោយបញ្ហា: %(error)s" + +#~ msgid "Password for user %(user)s reset" +#~ msgstr "" + +#~ msgid "Password for user %s reset" +#~ msgstr "" + +#~ msgid "Rename title from: '%(src)s' to '%(src)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Rename author from: '%(src)s' to '%(src)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Failed to create path for cover %(cover)s (Permission denied)." +#~ msgstr "" + +#~ msgid "File extension '%s' is not allowed to be uploaded to this server" +#~ msgstr "" + +#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server" +#~ msgstr "ឯកសារប្រភេទ “%(ext)s” មិនត្រូវបានអនុញ្ញាតឲអាប់ឡូដទៅម៉ាស៊ីន server នេះទេ" + +#~ msgid "Current commit timestamp" +#~ msgstr "Commit timestamp បច្ចុប្បន្ន" + +#~ msgid "Newest commit timestamp" +#~ msgstr "Commit timestamp ចុងក្រោយគេ" + +#~ msgid "Convert: %(book)s" +#~ msgstr "បម្លែង៖ %(book)s" + +#~ msgid "Convert to %(format)s: %(book)s" +#~ msgstr "" + +#~ msgid "Files are replaced" +#~ msgstr "ឯកសារត្រូវបានផ្លាស់ប្តូរ" + +#~ msgid "Server is stopped" +#~ msgstr "ម៉ាស៊ីន server ត្រូវបានបញ្ឈប់" + +#~ msgid "Convertertool %(converter)s not found" +#~ msgstr "មិនអាចរកឃើញកម្មវិធីបម្លែង %(converter)s" + +#~ msgid "Choose a password" +#~ msgstr "ជ្រើសរើសលេខសម្ងាត់" + diff --git a/src/cps/translations/nl/LC_MESSAGES/messages.mo b/src/cps/translations/nl/LC_MESSAGES/messages.mo new file mode 100644 index 0000000..ccde0d5 Binary files /dev/null and b/src/cps/translations/nl/LC_MESSAGES/messages.mo differ diff --git a/src/cps/translations/nl/LC_MESSAGES/messages.po b/src/cps/translations/nl/LC_MESSAGES/messages.po new file mode 100644 index 0000000..e6d2939 --- /dev/null +++ b/src/cps/translations/nl/LC_MESSAGES/messages.po @@ -0,0 +1,1960 @@ +# Dutch translations for Calibre-Web +# Copyright (C) 2017 Calibre-Web +# This file is distributed under the same license as the Calibre-Web +# project. +# translation by Ed Driesen +# FIRST AUTHOR , 2017. +msgid "" +msgstr "" +"Project-Id-Version: Calibre-Web dutch translation by Ed Driesen (GPL V3)\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2018-12-10 19:35+0100\n" +"PO-Revision-Date: 2018-12-09 15:07+0100\n" +"Last-Translator: \n" +"Language: nl\n" +"Language-Team: ed.driesen@telenet.be\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134 +#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27 +msgid "not installed" +msgstr "niet geïnstalleerd" + +#: cps/converter.py:22 cps/converter.py:38 +msgid "Excecution permissions missing" +msgstr "Rechten om uit te voeren ontbreken" + +#: cps/converter.py:48 +msgid "not configured" +msgstr "Niet geconfigureerd" + +#: cps/helper.py:59 +#, python-format +msgid "%(format)s format not found for book id: %(book)d" +msgstr "%(format)s formaat niet gevonden voor boek met id: %(book)d" + +#: cps/helper.py:71 +#, python-format +msgid "%(format)s not found on Google Drive: %(fn)s" +msgstr "%(format)s niet gevonden op Google Drive: %(fn)s" + +#: cps/helper.py:78 cps/helper.py:186 cps/templates/detail.html:49 +msgid "Send to Kindle" +msgstr "Stuur naar Kindle" + +#: cps/helper.py:79 cps/helper.py:97 cps/helper.py:188 +msgid "This e-mail has been sent via Calibre-Web." +msgstr "Deze email werd verzonden via Calibre-Web." + +#: cps/helper.py:90 +#, python-format +msgid "%(format)s not found: %(fn)s" +msgstr "%(format)s niet gevonden %(fn)s" + +#: cps/helper.py:95 +msgid "Calibre-Web test e-mail" +msgstr "Calibre-Web test email" + +#: cps/helper.py:96 +msgid "Test e-mail" +msgstr "Test email" + +#: cps/helper.py:112 +msgid "Get Started with Calibre-Web" +msgstr "Aan de slag met Calibre-Web" + +#: cps/helper.py:113 +#, python-format +msgid "Registration e-mail for user: %(name)s" +msgstr "Registratie email voor gebruiker: %(name)s" + +#: cps/helper.py:126 cps/helper.py:128 cps/helper.py:130 cps/helper.py:132 +#: cps/helper.py:138 cps/helper.py:140 cps/helper.py:142 cps/helper.py:144 +#, python-format +msgid "Send %(format)s to Kindle" +msgstr "" + +#: cps/helper.py:148 cps/helper.py:152 +#, python-format +msgid "Convert %(orig)s to %(format)s and send to Kindle" +msgstr "" + +#: cps/helper.py:187 +#, python-format +msgid "E-mail: %(book)s" +msgstr "Email: %(book)s" + +#: cps/helper.py:190 +msgid "The requested file could not be read. Maybe wrong permissions?" +msgstr "Het gevraagde bestand kon niet worden gelezen. Misschien niet de juiste permissies?" + +#: cps/helper.py:290 +#, python-format +msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "Hernoemen van titel: '%(src)s' naar '%(dest)s' faade met fout: %(error)s" + +#: cps/helper.py:299 +#, python-format +msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "Hernoemen van de auteur: '%(src)s' naar '%(dest)s' faalde met fout: %(error)s" + +#: cps/helper.py:321 cps/helper.py:330 +#, python-format +msgid "File %(file)s not found on Google Drive" +msgstr "Bestand %(file)s niet gevonden op Google Drive" + +#: cps/helper.py:348 +#, python-format +msgid "Book path %(path)s not found on Google Drive" +msgstr "Boek pad %(path)s niet gevonden op Google Drive" + +#: cps/helper.py:614 +msgid "Error excecuting UnRar" +msgstr "Fout bij het uitvoeren van UnRar" + +#: cps/helper.py:616 +msgid "Unrar binary file not found" +msgstr "Unrar uitvoeringsbestand niet gevonden" + +#: cps/helper.py:667 +msgid "Waiting" +msgstr "Wachten" + +#: cps/helper.py:669 +msgid "Failed" +msgstr "Mislukt" + +#: cps/helper.py:671 +msgid "Started" +msgstr "Gestart" + +#: cps/helper.py:673 +msgid "Finished" +msgstr "Voltooid" + +#: cps/helper.py:675 +msgid "Unknown Status" +msgstr "Onbekende status" + +#: cps/helper.py:680 +msgid "E-mail: " +msgstr "Email:" + +#: cps/helper.py:682 cps/helper.py:686 +msgid "Convert: " +msgstr "Converteer:" + +#: cps/helper.py:684 +msgid "Upload: " +msgstr "Upload:" + +#: cps/helper.py:688 +msgid "Unknown Task: " +msgstr "Onbekende taak:" + +#: cps/web.py:1126 cps/web.py:2835 +msgid "Unknown" +msgstr "Onbekend" + +#: cps/web.py:1135 cps/web.py:1166 cps/web.py:1251 +msgid "HTTP Error" +msgstr "HTTP fout" + +#: cps/web.py:1137 cps/web.py:1168 cps/web.py:1252 +msgid "Connection error" +msgstr "Verbindingsfout" + +#: cps/web.py:1139 cps/web.py:1170 cps/web.py:1253 +msgid "Timeout while establishing connection" +msgstr "Time-out bij het maken van de verbinding" + +#: cps/web.py:1141 cps/web.py:1172 cps/web.py:1254 +msgid "General error" +msgstr "Algemene fout" + +#: cps/web.py:1147 +msgid "Unexpected data while reading update information" +msgstr "Onverwachte data tijdens het lezen van de update informatie" + +#: cps/web.py:1154 +msgid "No update available. You already have the latest version installed" +msgstr "Geen update beschikbaar. Je hebt reeds de laatste versie geïnstalleerd" + +#: cps/web.py:1179 +msgid "A new update is available. Click on the button below to update to the latest version." +msgstr "Een nieuwe update is beschikbaar. Click op de knop hier onder op te updaten naar de laatste versie." + +#: cps/web.py:1229 +msgid "Could not fetch update information" +msgstr "De update informatie kon niet gelezen worden" + +#: cps/web.py:1244 +msgid "Requesting update package" +msgstr "Update pakket wordt aangevraagd" + +#: cps/web.py:1245 +msgid "Downloading update package" +msgstr "Update pakket wordt gedownload" + +#: cps/web.py:1246 +msgid "Unzipping update package" +msgstr "Update pakket wordt uitgepakt" + +#: cps/web.py:1247 +msgid "Replacing files" +msgstr "Bestanden aan het vervangen" + +#: cps/web.py:1248 +msgid "Database connections are closed" +msgstr "Database verbindingen zijn gesloten" + +#: cps/web.py:1249 +msgid "Stopping server" +msgstr "Server aan het stoppen" + +#: cps/web.py:1250 +msgid "Update finished, please press okay and reload page" +msgstr "Update voltooid, klik op ok en herlaad de pagina" + +#: cps/web.py:1251 cps/web.py:1252 cps/web.py:1253 cps/web.py:1254 +msgid "Update failed:" +msgstr "Update gefaald:" + +#: cps/web.py:1277 +msgid "Recently Added Books" +msgstr "Recent toegevoegde boeken" + +#: cps/web.py:1287 +msgid "Newest Books" +msgstr "Nieuwste boeken" + +#: cps/web.py:1299 +msgid "Oldest Books" +msgstr "Oudste boeken" + +#: cps/web.py:1311 +msgid "Books (A-Z)" +msgstr "Boeken (A-Z)" + +#: cps/web.py:1322 +msgid "Books (Z-A)" +msgstr "Boeken (A-Z)" + +#: cps/web.py:1351 +msgid "Hot Books (most downloaded)" +msgstr "Populaire boeken (meeste downloads)" + +#: cps/web.py:1364 +msgid "Best rated books" +msgstr "Best beoordeelde boeken" + +#: cps/templates/index.xml:39 cps/web.py:1377 +msgid "Random Books" +msgstr "Willekeurige boeken" + +#: cps/web.py:1392 +msgid "Author list" +msgstr "Auteur lijst" + +#: cps/web.py:1404 cps/web.py:1657 cps/web.py:2204 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "Fout bij openen van het boek. Bestand bestaat niet of is niet toegankelijk:" + +#: cps/web.py:1432 +msgid "Publisher list" +msgstr "Uitgeverslijst" + +#: cps/web.py:1447 +#, python-format +msgid "Publisher: %(name)s" +msgstr "Uitgever: %(name)s" + +#: cps/templates/index.xml:83 cps/web.py:1479 +msgid "Series list" +msgstr "Serie lijst" + +#: cps/web.py:1493 +#, python-format +msgid "Series: %(serie)s" +msgstr "Serie: %(serie)s" + +#: cps/web.py:1519 +msgid "Available languages" +msgstr "Beschikbare talen" + +#: cps/web.py:1539 +#, python-format +msgid "Language: %(name)s" +msgstr "Taal: %(name)s" + +#: cps/templates/index.xml:76 cps/web.py:1550 +msgid "Category list" +msgstr "Categorie lijst" + +#: cps/web.py:1564 +#, python-format +msgid "Category: %(name)s" +msgstr "Categorie: %(name)s" + +#: cps/templates/layout.html:71 cps/web.py:1693 +msgid "Tasks" +msgstr "Taken" + +#: cps/web.py:1727 +msgid "Statistics" +msgstr "Statistieken" + +#: cps/web.py:1835 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "Het callback domein is niet geverifieerd, volg de stappen in de google ontwikkelaars console om het domein te verifiëren" + +#: cps/web.py:1911 +msgid "Server restarted, please reload page" +msgstr "Server herstart, gelieve de pagina herladen" + +#: cps/web.py:1914 +msgid "Performing shutdown of server, please close window" +msgstr "Bezig met het stoppen van de server, gelieve venster te sluiten" + +#: cps/web.py:1933 +msgid "Update done" +msgstr "Update voltooid" + +#: cps/web.py:2003 +msgid "Published after " +msgstr "Gepubliceerd na " + +#: cps/web.py:2010 +msgid "Published before " +msgstr "Gepubliceerd voor " + +#: cps/web.py:2024 +#, python-format +msgid "Rating <= %(rating)s" +msgstr "Waardering <= %(rating)s" + +#: cps/web.py:2026 +#, python-format +msgid "Rating >= %(rating)s" +msgstr "Waardering >= %(rating)s" + +#: cps/web.py:2087 cps/web.py:2096 +msgid "search" +msgstr "zoek" + +#: cps/templates/index.xml:47 cps/templates/index.xml:51 +#: cps/templates/layout.html:146 cps/web.py:2163 +msgid "Read Books" +msgstr "Gelezen Boeken" + +#: cps/templates/index.xml:55 cps/templates/index.xml:59 +#: cps/templates/layout.html:148 cps/web.py:2166 +msgid "Unread Books" +msgstr "Ongelezen Boeken" + +#: cps/web.py:2214 cps/web.py:2216 cps/web.py:2218 cps/web.py:2230 +msgid "Read a Book" +msgstr "Lees een boek" + +#: cps/web.py:2289 cps/web.py:3197 +msgid "Please fill out all fields!" +msgstr "Gelieve alle velden in te vullen!" + +#: cps/web.py:2290 cps/web.py:2311 cps/web.py:2315 cps/web.py:2320 +#: cps/web.py:2322 +msgid "register" +msgstr "registreer" + +#: cps/web.py:2310 cps/web.py:3413 +msgid "An unknown error occurred. Please try again later." +msgstr "Er was een onbekende fout. Gelieve later nog eens te proberen." + +#: cps/web.py:2313 +msgid "Your e-mail is not allowed to register" +msgstr "Het is niet toegestaan om te registreren met jou email" + +#: cps/web.py:2316 +msgid "Confirmation e-mail was send to your e-mail account." +msgstr "Bevestigings email werd verzonden naar jou email account." + +#: cps/web.py:2319 +msgid "This username or e-mail address is already in use." +msgstr "Deze gebruikersnaam of email adres is reeds in gebruik." + +#: cps/web.py:2336 cps/web.py:2432 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "je bent nu ingelogd als: '%(nickname)s'" + +#: cps/web.py:2341 +msgid "Wrong Username or Password" +msgstr "Verkeerde gebruikersnaam of Wachtwoord" + +#: cps/web.py:2347 cps/web.py:2368 +msgid "login" +msgstr "login" + +#: cps/web.py:2380 cps/web.py:2411 +msgid "Token not found" +msgstr "Token niet gevonden" + +#: cps/web.py:2388 cps/web.py:2419 +msgid "Token has expired" +msgstr "Token is verlopen" + +#: cps/web.py:2396 +msgid "Success! Please return to your device" +msgstr "Gelukt! Ga terug naar je apparaat" + +#: cps/web.py:2446 +msgid "Please configure the SMTP mail settings first..." +msgstr "Gelieve de SMTP mail instellingen eerst te configureren..." + +#: cps/web.py:2451 +#, python-format +msgid "Book successfully queued for sending to %(kindlemail)s" +msgstr "Boek met succes in de wachtrij geplaatst om te verzenden naar %(kindlemail)s" + +#: cps/web.py:2455 +#, python-format +msgid "There was an error sending this book: %(res)s" +msgstr "Er trad een fout op bij het versturen van dit boek: %(res)s" + +#: cps/web.py:2457 cps/web.py:3251 +msgid "Please configure your kindle e-mail address first..." +msgstr "Gelieve eerst je kindle mailadres te configureren..." + +#: cps/web.py:2468 cps/web.py:2520 +msgid "Invalid shelf specified" +msgstr "Ongeldige boekenplank gespecificeerd" + +#: cps/web.py:2475 +#, python-format +msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" +msgstr "Sorry, jij mag geen boeken toe voegen aan boekenplank: %(shelfname)s" + +#: cps/web.py:2483 +msgid "You are not allowed to edit public shelves" +msgstr "Jij mag geen publieke boekenplanken bewerken" + +#: cps/web.py:2492 +#, python-format +msgid "Book is already part of the shelf: %(shelfname)s" +msgstr "Dit boek maakt al deel uit van boekenplank: %(shelfname)s" + +#: cps/web.py:2506 +#, python-format +msgid "Book has been added to shelf: %(sname)s" +msgstr "Boek werd toegevoegd aan boekenplank: %(sname)s" + +#: cps/web.py:2525 +#, python-format +msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgstr "Jij mag geen boeken plaatsen op boekenplank: %(name)s" + +#: cps/web.py:2530 +msgid "User is not allowed to edit public shelves" +msgstr "Gebruiker is niet toegestaan om publieke boekenplanken te bewerken" + +#: cps/web.py:2548 +#, python-format +msgid "Books are already part of the shelf: %(name)s" +msgstr "Deze boeken maken reeds deel uit van boekenplank: %(name)s" + +#: cps/web.py:2562 +#, python-format +msgid "Books have been added to shelf: %(sname)s" +msgstr "De boeken werden toegevoegd aan boekenplank: %(sname)s" + +#: cps/web.py:2564 +#, python-format +msgid "Could not add books to shelf: %(sname)s" +msgstr "Kon geen boeken toevoegen aan boekenplank: %(sname)s" + +#: cps/web.py:2601 +#, python-format +msgid "Book has been removed from shelf: %(sname)s" +msgstr "Boek werd verwijderd van boekenplank: %(sname)s" + +#: cps/web.py:2607 +#, python-format +msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgstr "Sorry, jij mag geen boeken verwijderen van deze boekenplank: %(sname)s" + +#: cps/web.py:2628 cps/web.py:2652 +#, python-format +msgid "A shelf with the name '%(title)s' already exists." +msgstr "Een boekenplank met de naam '%(title)s' bestaat reeds." + +#: cps/web.py:2633 +#, python-format +msgid "Shelf %(title)s created" +msgstr "Boekenplank %(title)s aangemaakt" + +#: cps/web.py:2635 cps/web.py:2663 +msgid "There was an error" +msgstr "Er deed zich een fout voor" + +#: cps/web.py:2636 cps/web.py:2638 +msgid "create a shelf" +msgstr "maak een boekenplank" + +#: cps/web.py:2661 +#, python-format +msgid "Shelf %(title)s changed" +msgstr "Boekenplank %(title)s gewijzigd" + +#: cps/web.py:2664 cps/web.py:2666 +msgid "Edit a shelf" +msgstr "Bewerk een boekenplank" + +#: cps/web.py:2687 +#, python-format +msgid "successfully deleted shelf %(name)s" +msgstr "boekenplank %(name)s succesvol gewist" + +#: cps/web.py:2714 +#, python-format +msgid "Shelf: '%(name)s'" +msgstr "Boekenplank: '%(name)s'" + +#: cps/web.py:2717 +msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "Fout bij openen boekenplank. Boekenplank bestaat niet of is niet toegankelijk" + +#: cps/web.py:2748 +#, python-format +msgid "Change order of Shelf: '%(name)s'" +msgstr "Verander volgorde van Boekenplank: '%(name)s'" + +#: cps/web.py:2777 cps/web.py:3203 +msgid "E-mail is not from valid domain" +msgstr "Email is niet van een geldig domein" + +#: cps/web.py:2779 cps/web.py:2822 cps/web.py:2825 +#, python-format +msgid "%(name)s's profile" +msgstr "%(name)s's profiel" + +#: cps/web.py:2820 +msgid "Found an existing account for this e-mail address." +msgstr "Een bestaand account met dit email adres werd gevonden." + +#: cps/web.py:2823 +msgid "Profile updated" +msgstr "Profiel aangepast" + +#: cps/web.py:2851 +msgid "Admin page" +msgstr "Administratie pagina" + +#: cps/web.py:2931 cps/web.py:3105 +msgid "Calibre-Web configuration updated" +msgstr "Calibre-Web configuratie aangepast" + +#: cps/templates/admin.html:100 cps/web.py:2944 +msgid "UI Configuration" +msgstr "Gebruikersinterface configuratie" + +#: cps/web.py:2962 +msgid "Import of optional Google Drive requirements missing" +msgstr "De import van optionele Google Drive vereisten ontbreken" + +#: cps/web.py:2965 +msgid "client_secrets.json is missing or not readable" +msgstr "client_secrets.json ontbreekt of is niet leesbaar" + +#: cps/web.py:2970 cps/web.py:2997 +msgid "client_secrets.json is not configured for web application" +msgstr "client_secrets.json is niet geconfigureerd voor web applicaties" + +#: cps/templates/admin.html:99 cps/web.py:3000 cps/web.py:3026 cps/web.py:3038 +#: cps/web.py:3081 cps/web.py:3096 cps/web.py:3114 cps/web.py:3122 +#: cps/web.py:3138 +msgid "Basic Configuration" +msgstr "Basis configuratie" + +#: cps/web.py:3023 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "Sleutelbestand (\"keyfile\") locatie ongeldig, gelieve het correcte pad in te geven" + +#: cps/web.py:3035 +msgid "Certfile location is not valid, please enter correct path" +msgstr "Certificatiebestand (\"certfile\") locatie ongeldig, gelieve het correcte pad in te geven" + +#: cps/web.py:3078 +msgid "Logfile location is not valid, please enter correct path" +msgstr "Log bestand (\"logfile\") locatie ongeldig, gelieve het correcte pad in te geven" + +#: cps/web.py:3118 +msgid "DB location is not valid, please enter correct path" +msgstr "DB locatie is niet geldig, gelieve het correcte pad in te geven" + +#: cps/templates/admin.html:33 cps/web.py:3199 cps/web.py:3205 cps/web.py:3221 +msgid "Add new user" +msgstr "Voeg nieuwe gebruiker toe" + +#: cps/web.py:3211 +#, python-format +msgid "User '%(user)s' created" +msgstr "Gebruiker '%(user)s' aangemaakt" + +#: cps/web.py:3215 +msgid "Found an existing account for this e-mail address or nickname." +msgstr "Een bestaande account gevonden met dit email adres of gebruikersnaam." + +#: cps/web.py:3239 cps/web.py:3253 +msgid "E-mail server settings updated" +msgstr "Email server instellingen aangepast" + +#: cps/web.py:3246 +#, python-format +msgid "Test e-mail successfully send to %(kindlemail)s" +msgstr "Test email met succes verzonden naar %(kindlemail)s" + +#: cps/web.py:3249 +#, python-format +msgid "There was an error sending the Test e-mail: %(res)s" +msgstr "Er was een fout bij het verzenden van test email: %(res)s" + +#: cps/web.py:3254 +msgid "Edit e-mail server settings" +msgstr "Bewerk email server instellingen" + +#: cps/web.py:3279 +#, python-format +msgid "User '%(nick)s' deleted" +msgstr "Gebruiker '%(nick)s' verwijderd" + +#: cps/web.py:3388 +#, python-format +msgid "User '%(nick)s' updated" +msgstr "Gebruiker '%(nick)s' aangepast" + +#: cps/web.py:3391 +msgid "An unknown error occured." +msgstr "Een onbekende fout deed zich voor." + +#: cps/web.py:3393 +#, python-format +msgid "Edit User %(nick)s" +msgstr "Bewerk gebruiker '%(nick)s" + +#: cps/web.py:3410 +#, python-format +msgid "Password for user %(user)s reset" +msgstr "Wachtwoord voor gebruiker %(user)s gereset" + +#: cps/web.py:3424 cps/web.py:3627 +msgid "Error opening eBook. File does not exist or file is not accessible" +msgstr "Fout bij openen eBook. Het bestand bestaat niet of is niet toegankelijk" + +#: cps/web.py:3449 cps/web.py:3912 +msgid "edit metadata" +msgstr "bewerk metadata" + +#: cps/web.py:3542 cps/web.py:3780 +#, python-format +msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" +msgstr "Het uploaden van bestandsextensie '%(ext)s' is niet toegestaan op deze server" + +#: cps/web.py:3546 cps/web.py:3784 +msgid "File to be uploaded must have an extension" +msgstr "Up te loaden bestanden dienen een extensie te hebben" + +#: cps/web.py:3558 cps/web.py:3804 +#, python-format +msgid "Failed to create path %(path)s (Permission denied)." +msgstr "Het pad %(path)s aanmaken mislukt (Geen toestemming)." + +#: cps/web.py:3563 +#, python-format +msgid "Failed to store file %(file)s." +msgstr "Bestand opslaan niet gelukt voor %(file)s." + +#: cps/web.py:3580 +#, python-format +msgid "File format %(ext)s added to %(book)s" +msgstr "Bestandsformaat %(ext)s toegevoegd aan %(book)s" + +#: cps/web.py:3598 +#, python-format +msgid "Failed to create path for cover %(path)s (Permission denied)." +msgstr "Het pad %(path)s aanmaken voor boekomslag is mislukt (Geen toestemming)." + +#: cps/web.py:3606 +#, python-format +msgid "Failed to store cover-file %(cover)s." +msgstr "Boekomslag %(cover)s opslaan mislukt." + +#: cps/web.py:3609 +msgid "Cover-file is not a valid image file" +msgstr "Boekomslag bestand is geen geldig beeldbestand" + +#: cps/web.py:3639 cps/web.py:3648 cps/web.py:3652 +msgid "unknown" +msgstr "onbekend" + +#: cps/web.py:3671 +msgid "Cover is not a jpg file, can't save" +msgstr "Boekomslag is geen jpg bestand, opslaan niet mogelijk" + +#: cps/web.py:3719 +#, python-format +msgid "%(langname)s is not a valid language" +msgstr "%(langname)s is geen geldige taal" + +#: cps/web.py:3750 +msgid "Metadata successfully updated" +msgstr "Metadata succesvol geüpdatet" + +#: cps/web.py:3759 +msgid "Error editing book, please check logfile for details" +msgstr "Fout bij het bewerken van het boek, gelieve logfile controleren" + +#: cps/web.py:3809 +#, python-format +msgid "Failed to store file %(file)s (Permission denied)." +msgstr "Bestand %(file)s opslaan mislukt (Geen toestemming)." + +#: cps/web.py:3814 +#, python-format +msgid "Failed to delete file %(file)s (Permission denied)." +msgstr "Bestand %(file)s wissen mislukt (Geen toestemming)." + +#: cps/web.py:3932 +msgid "Source or destination format for conversion missing" +msgstr "Bron of doel formaat voor conversie ontbreekt" + +#: cps/web.py:3942 +#, python-format +msgid "Book successfully queued for converting to %(book_format)s" +msgstr "Boek succesvol in de wachtrij geplaatst voor conversie naar %(book_format)s" + +#: cps/web.py:3946 +#, python-format +msgid "There was an error converting this book: %(res)s" +msgstr "Er trad een fout op bij het converteren van dit boek: %(res)s" + +#: cps/worker.py:287 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Ebook conversie mislukt: %(error)s" + +#: cps/worker.py:298 +#, python-format +msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" +msgstr "Kindlegen gefaald met Error %(error)s. Bericht: %(message)s" + +#: cps/templates/admin.html:6 +msgid "User list" +msgstr "Gebruikerslijst" + +#: cps/templates/admin.html:9 +msgid "Nickname" +msgstr "Gebruikersnaam" + +#: cps/templates/admin.html:10 +msgid "E-mail" +msgstr "Email" + +#: cps/templates/admin.html:11 +msgid "Kindle" +msgstr "Kindlle" + +#: cps/templates/admin.html:12 +msgid "DLS" +msgstr "DLS" + +#: cps/templates/admin.html:13 cps/templates/layout.html:74 +msgid "Admin" +msgstr "Administratie" + +#: cps/templates/admin.html:14 cps/templates/detail.html:22 +#: cps/templates/detail.html:31 +msgid "Download" +msgstr "Download" + +#: cps/templates/admin.html:15 cps/templates/layout.html:64 +msgid "Upload" +msgstr "Upload" + +#: cps/templates/admin.html:16 +msgid "Edit" +msgstr "Bewerk" + +#: cps/templates/admin.html:39 +msgid "SMTP e-mail server settings" +msgstr "SMTP email server instellingen" + +#: cps/templates/admin.html:42 cps/templates/email_edit.html:11 +msgid "SMTP hostname" +msgstr "SMTP hostnaam" + +#: cps/templates/admin.html:43 +msgid "SMTP port" +msgstr "SMTP poort" + +#: cps/templates/admin.html:44 +msgid "SSL" +msgstr "SSL" + +#: cps/templates/admin.html:45 cps/templates/email_edit.html:27 +msgid "SMTP login" +msgstr "SMTP login" + +#: cps/templates/admin.html:46 +msgid "From mail" +msgstr "Van mail" + +#: cps/templates/admin.html:56 +msgid "Change SMTP settings" +msgstr "Bewerk SMTP instellingen" + +#: cps/templates/admin.html:62 +msgid "Configuration" +msgstr "Configuratie" + +#: cps/templates/admin.html:65 +msgid "Calibre DB dir" +msgstr "Calibre DB map" + +#: cps/templates/admin.html:69 +msgid "Log level" +msgstr "Log niveau" + +#: cps/templates/admin.html:73 +msgid "Port" +msgstr "Poort" + +#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23 +msgid "Books per page" +msgstr "Boeken per pagina" + +#: cps/templates/admin.html:83 +msgid "Uploading" +msgstr "Aan het uploaden" + +#: cps/templates/admin.html:87 +msgid "Anonymous browsing" +msgstr "Anoniem verkennen" + +#: cps/templates/admin.html:91 +msgid "Public registration" +msgstr "Publieke registratie" + +#: cps/templates/admin.html:95 cps/templates/remote_login.html:4 +msgid "Remote login" +msgstr "Login op afstand" + +#: cps/templates/admin.html:106 +msgid "Administration" +msgstr "Administratie" + +#: cps/templates/admin.html:107 +msgid "Reconnect to Calibre DB" +msgstr "Herverbinden met calibre DB" + +#: cps/templates/admin.html:108 +msgid "Restart Calibre-Web" +msgstr "Herstart Calibre-Web" + +#: cps/templates/admin.html:109 +msgid "Stop Calibre-Web" +msgstr "Stop Calibre-Web" + +#: cps/templates/admin.html:115 +msgid "Update" +msgstr "Update" + +#: cps/templates/admin.html:119 +msgid "Version" +msgstr "Versie" + +#: cps/templates/admin.html:120 +msgid "Details" +msgstr "Details" + +#: cps/templates/admin.html:126 +msgid "Current version" +msgstr "Huidige versie" + +#: cps/templates/admin.html:132 +msgid "Check for update" +msgstr "Controleer voor update" + +#: cps/templates/admin.html:133 +msgid "Perform Update" +msgstr "Voer update uit" + +#: cps/templates/admin.html:145 +msgid "Do you really want to restart Calibre-Web?" +msgstr "Wil je Calibre-Web echt herstarten?" + +#: cps/templates/admin.html:150 cps/templates/admin.html:164 +#: cps/templates/admin.html:184 cps/templates/shelf.html:63 +msgid "Ok" +msgstr "Ok" + +#: cps/templates/admin.html:151 cps/templates/admin.html:165 +#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200 +#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168 +#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75 +#: cps/templates/shelf.html:64 cps/templates/shelf_edit.html:19 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155 +msgid "Back" +msgstr "Terug" + +#: cps/templates/admin.html:163 +msgid "Do you really want to stop Calibre-Web?" +msgstr "Wil je Calibre-Web echt stoppen?" + +#: cps/templates/admin.html:175 +msgid "Updating, please do not reload page" +msgstr "Aan het updaten, gelieve de pagina niet te herladen" + +#: cps/templates/author.html:15 +msgid "via" +msgstr "via" + +#: cps/templates/author.html:23 +msgid "In Library" +msgstr "In Bibliotheek" + +#: cps/templates/author.html:71 +msgid "More by" +msgstr "Meer van" + +#: cps/templates/book_edit.html:16 +msgid "Delete Book" +msgstr "Wis boek" + +#: cps/templates/book_edit.html:19 +msgid "Delete formats:" +msgstr "Wis formaten:" + +#: cps/templates/book_edit.html:22 cps/templates/book_edit.html:199 +#: cps/templates/email_edit.html:73 cps/templates/email_edit.html:74 +msgid "Delete" +msgstr "Wis" + +#: cps/templates/book_edit.html:30 +msgid "Convert book format:" +msgstr "Converteer boek formaat:" + +#: cps/templates/book_edit.html:34 +msgid "Convert from:" +msgstr "Converteer van:" + +#: cps/templates/book_edit.html:36 cps/templates/book_edit.html:43 +msgid "select an option" +msgstr "selecteer een optie" + +#: cps/templates/book_edit.html:41 +msgid "Convert to:" +msgstr "Converteer naar:" + +#: cps/templates/book_edit.html:50 +msgid "Convert book" +msgstr "Converteer boek" + +#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6 +msgid "Book Title" +msgstr "Boek titel" + +#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:259 +#: cps/templates/book_edit.html:277 cps/templates/search_form.html:10 +msgid "Author" +msgstr "Auteur" + +#: cps/templates/book_edit.html:67 cps/templates/book_edit.html:264 +#: cps/templates/book_edit.html:279 cps/templates/search_form.html:106 +msgid "Description" +msgstr "Omschrijving" + +#: cps/templates/book_edit.html:71 cps/templates/search_form.html:33 +msgid "Tags" +msgstr "Tags" + +#: cps/templates/book_edit.html:75 cps/templates/layout.html:157 +#: cps/templates/search_form.html:53 +msgid "Series" +msgstr "Series" + +#: cps/templates/book_edit.html:79 +msgid "Series id" +msgstr "Series id" + +#: cps/templates/book_edit.html:83 +msgid "Rating" +msgstr "Beoordeling" + +#: cps/templates/book_edit.html:87 +msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +msgstr "Boekomslag URL (jpg, omslag wordt gedownload en opgeslagen in database, invulveld is nadien terug leeg)" + +#: cps/templates/book_edit.html:91 +msgid "Upload Cover from local drive" +msgstr "Upload cover van lokale schijf" + +#: cps/templates/book_edit.html:96 cps/templates/detail.html:147 +msgid "Publishing date" +msgstr "Publicatie datum" + +#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:278 cps/templates/detail.html:139 +#: cps/templates/search_form.html:14 +msgid "Publisher" +msgstr "Uitgever" + +#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31 +msgid "Language" +msgstr "Taal" + +#: cps/templates/book_edit.html:117 cps/templates/search_form.html:117 +msgid "Yes" +msgstr "Ja" + +#: cps/templates/book_edit.html:118 cps/templates/search_form.html:118 +msgid "No" +msgstr "Nee" + +#: cps/templates/book_edit.html:164 +msgid "Upload format" +msgstr "Upload type" + +#: cps/templates/book_edit.html:173 +msgid "view book after edit" +msgstr "bekijk boek na bewerking" + +#: cps/templates/book_edit.html:176 cps/templates/book_edit.html:212 +msgid "Get metadata" +msgstr "Verkrijg metadata" + +#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210 +#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20 +#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17 +#: cps/templates/user_edit.html:153 +msgid "Submit" +msgstr "Opslaan" + +#: cps/templates/book_edit.html:191 +msgid "Are you really sure?" +msgstr "Ben je zeker?" + +#: cps/templates/book_edit.html:194 +msgid "Book will be deleted from Calibre database" +msgstr "Boek wordt nu gewist uit de Calibre database" + +#: cps/templates/book_edit.html:195 +msgid "and from hard disk" +msgstr "en van de harde schijf" + +#: cps/templates/book_edit.html:215 +msgid "Keyword" +msgstr "Zoekwoord" + +#: cps/templates/book_edit.html:216 +msgid " Search keyword " +msgstr " Zoek sleutelwoord " + +#: cps/templates/book_edit.html:218 cps/templates/layout.html:46 +msgid "Go!" +msgstr "Start!" + +#: cps/templates/book_edit.html:222 +msgid "Click the cover to load metadata to the form" +msgstr "Klik op de omslag om de metatadata in het formulier te laden" + +#: cps/templates/book_edit.html:234 cps/templates/book_edit.html:274 +msgid "Loading..." +msgstr "Aan het laden..." + +#: cps/templates/book_edit.html:239 cps/templates/layout.html:224 +msgid "Close" +msgstr "Sluit" + +#: cps/templates/book_edit.html:266 cps/templates/book_edit.html:280 +msgid "Source" +msgstr "Bron" + +#: cps/templates/book_edit.html:275 +msgid "Search error!" +msgstr "Zoek fout!" + +#: cps/templates/book_edit.html:276 +msgid "No Result(s) found! Please try aonther keyword." +msgstr "Geen resultaten gevonden! Gebruik alsjeblieft een ander sleutelwoord." + +#: cps/templates/config_edit.html:12 +msgid "Library Configuration" +msgstr "Bibliotheek configuratie" + +#: cps/templates/config_edit.html:19 +msgid "Location of Calibre database" +msgstr "Locatie van de Calibre database" + +#: cps/templates/config_edit.html:24 +msgid "Use Google Drive?" +msgstr "Google Drive gebruiken?" + +#: cps/templates/config_edit.html:30 +msgid "Google Drive config problem" +msgstr "Google Drive configuratie probleem" + +#: cps/templates/config_edit.html:36 +msgid "Authenticate Google Drive" +msgstr "Verifieer Google Drive" + +#: cps/templates/config_edit.html:40 +msgid "Please finish Google Drive setup after login" +msgstr "Gelieve Google Drive setup te voltooien na login" + +#: cps/templates/config_edit.html:44 +msgid "Google Drive Calibre folder" +msgstr "Google Drive Calibre folder" + +#: cps/templates/config_edit.html:52 +msgid "Metadata Watch Channel ID" +msgstr "Metadata Watch Channel ID" + +#: cps/templates/config_edit.html:55 +msgid "Revoke" +msgstr "Terugtrekken" + +#: cps/templates/config_edit.html:73 +msgid "Server Configuration" +msgstr "Server configuratie" + +#: cps/templates/config_edit.html:80 +msgid "Server Port" +msgstr "Server poort" + +#: cps/templates/config_edit.html:84 +msgid "SSL certfile location (leave it empty for non-SSL Servers)" +msgstr "SSL certificaat (\"certfile\") bestand locatie (laat leeg voor niet-SSL servers)" + +#: cps/templates/config_edit.html:88 +msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" +msgstr "SSL sleutel (\"keyfile\") bestand (laat leeg voor niet-SSL servers)" + +#: cps/templates/config_edit.html:99 +msgid "Logfile Configuration" +msgstr "Logbestand configuratie" + +#: cps/templates/config_edit.html:106 +msgid "Log Level" +msgstr "Log niveau" + +#: cps/templates/config_edit.html:115 +msgid "Location and name of logfile (calibre-web.log for no entry)" +msgstr "Locatie en naam van logbestand (calibre-web.log indien leeg)" + +#: cps/templates/config_edit.html:126 +msgid "Feature Configuration" +msgstr "Voorzieningen configuratie" + +#: cps/templates/config_edit.html:134 +msgid "Enable uploading" +msgstr "Uploaden aanzetten" + +#: cps/templates/config_edit.html:138 +msgid "Enable anonymous browsing" +msgstr "Anoniem verkennen aanzetten" + +#: cps/templates/config_edit.html:142 +msgid "Enable public registration" +msgstr "Publieke registratie aanzetten" + +#: cps/templates/config_edit.html:146 +msgid "Enable remote login (\"magic link\")" +msgstr "Maak op afstand ionloggen mogelijk (\"magic link\")" + +#: cps/templates/config_edit.html:151 +msgid "Use" +msgstr "Gebruik" + +#: cps/templates/config_edit.html:152 +msgid "Obtain an API Key" +msgstr "Verkrijg een API sleutel" + +#: cps/templates/config_edit.html:156 +msgid "Goodreads API Key" +msgstr "Goodreads API sleutel" + +#: cps/templates/config_edit.html:160 +msgid "Goodreads API Secret" +msgstr "Goodreads API geheim" + +#: cps/templates/config_edit.html:173 +msgid "External binaries" +msgstr "Externe bibliotheken" + +#: cps/templates/config_edit.html:181 +msgid "No converter" +msgstr "Geen conversie programma" + +#: cps/templates/config_edit.html:183 +msgid "Use Kindlegen" +msgstr "Gebruik Kindlegen" + +#: cps/templates/config_edit.html:185 +msgid "Use calibre's ebook converter" +msgstr "Gebruik calibre's ebook converter" + +#: cps/templates/config_edit.html:189 +msgid "E-Book converter settings" +msgstr "E-book conversie instellingen" + +#: cps/templates/config_edit.html:193 +msgid "Path to convertertool" +msgstr "Pad naar conversietool" + +#: cps/templates/config_edit.html:199 +msgid "Location of Unrar binary" +msgstr "Locatie van Unrar programma" + +#: cps/templates/config_edit.html:215 cps/templates/layout.html:82 +#: cps/templates/login.html:4 +msgid "Login" +msgstr "Login" + +#: cps/templates/config_view_edit.html:12 +msgid "View Configuration" +msgstr "Bekijk Configuratie" + +#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 +#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 +msgid "Title" +msgstr "Titel" + +#: cps/templates/config_view_edit.html:27 +msgid "No. of random books to show" +msgstr "Aantal boeken te tonen" + +#: cps/templates/config_view_edit.html:31 +msgid "Regular expression for ignoring columns" +msgstr "Reguliere expressie om kolommen te negeren" + +#: cps/templates/config_view_edit.html:35 +msgid "Link read/unread status to Calibre column" +msgstr "Koppel gelezen/ongelezen status aan Calibre kolom" + +#: cps/templates/config_view_edit.html:44 +msgid "Regular expression for title sorting" +msgstr "Rguliere expressie op titels te sorteren" + +#: cps/templates/config_view_edit.html:48 +msgid "Tags for Mature Content" +msgstr "Tags voor Volwassen Inhoud" + +#: cps/templates/config_view_edit.html:62 +msgid "Default settings for new users" +msgstr "Standaard instellingen voor nieuwe gebruikers" + +#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110 +msgid "Admin user" +msgstr "Administratie gebruiker" + +#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119 +msgid "Allow Downloads" +msgstr "Downloads toestaan" + +#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123 +msgid "Allow Uploads" +msgstr "Uploads toestaan" + +#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127 +msgid "Allow Edit" +msgstr "Bewerken toestaan" + +#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131 +msgid "Allow Delete books" +msgstr "Het wissen van boeken toestaan" + +#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136 +msgid "Allow Changing Password" +msgstr "Wachtwoord wijzigen toestaan" + +#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140 +msgid "Allow Editing Public Shelfs" +msgstr "Publieke boekenplanken bewerken toestaan" + +#: cps/templates/config_view_edit.html:104 +msgid "Default visibilities for new users" +msgstr "Standaard zichtbaar voor nieuwe gebruikers" + +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58 +msgid "Show random books" +msgstr "Toon willekeurige boeken" + +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62 +msgid "Show recent books" +msgstr "Toon recente boeken" + +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66 +msgid "Show sorted books" +msgstr "Toon gesorteerde boeken" + +#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70 +msgid "Show hot books" +msgstr "Toon populaire boeken" + +#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74 +msgid "Show best rated books" +msgstr "Toon best beoordeelde boeken" + +#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78 +msgid "Show language selection" +msgstr "Toon taal selectie" + +#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82 +msgid "Show series selection" +msgstr "Toon serie selectie" + +#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86 +msgid "Show category selection" +msgstr "Toon categorie selectie" + +#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90 +msgid "Show author selection" +msgstr "Toon auteur selectie" + +#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94 +msgid "Show publisher selection" +msgstr "Toon uitgevers selectie" + +#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98 +msgid "Show read and unread" +msgstr "Toon gelezen en ongelezen" + +#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102 +msgid "Show random books in detail view" +msgstr "Toon willekeurige boeken in gedetailleerd zicht" + +#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115 +msgid "Show mature content" +msgstr "Toon Volwassen Inhoud" + +#: cps/templates/detail.html:63 +msgid "Read in browser" +msgstr "Lees in browser" + +#: cps/templates/detail.html:100 +msgid "Book" +msgstr "Boek" + +#: cps/templates/detail.html:100 +msgid "of" +msgstr "van" + +#: cps/templates/detail.html:106 +msgid "language" +msgstr "taal" + +#: cps/templates/detail.html:184 +msgid "Read" +msgstr "Lees" + +#: cps/templates/detail.html:194 +msgid "Description:" +msgstr "Omschrijving:" + +#: cps/templates/detail.html:207 cps/templates/search.html:14 +msgid "Add to shelf" +msgstr "Voeg toe aan boekenplank" + +#: cps/templates/detail.html:269 +msgid "Edit metadata" +msgstr "Bewerk metadata" + +#: cps/templates/email_edit.html:15 +msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +msgstr "SMTP poort (meestal 25 voor normale SMTP en 465 voor SSL en 587 voor STARTTLS)" + +#: cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "Encryptie" + +#: cps/templates/email_edit.html:21 +msgid "None" +msgstr "Geen" + +#: cps/templates/email_edit.html:22 +msgid "STARTTLS" +msgstr "STARTTLS" + +#: cps/templates/email_edit.html:23 +msgid "SSL/TLS" +msgstr "SSL/TLS" + +#: cps/templates/email_edit.html:31 +msgid "SMTP password" +msgstr "SMTP wachtwoord" + +#: cps/templates/email_edit.html:35 +msgid "From e-mail" +msgstr "Van email" + +#: cps/templates/email_edit.html:38 +msgid "Save settings" +msgstr "Bewaar instelling" + +#: cps/templates/email_edit.html:39 +msgid "Save settings and send Test E-Mail" +msgstr "Bewaar instellingen en stuur test email" + +#: cps/templates/email_edit.html:43 +msgid "Allowed domains for registering" +msgstr "Toegelaten domeinen voor registratie" + +#: cps/templates/email_edit.html:47 +msgid "Enter domainname" +msgstr "Voer domeinnaam in" + +#: cps/templates/email_edit.html:55 +msgid "Add Domain" +msgstr "Voeg Domein toe" + +#: cps/templates/email_edit.html:58 +msgid "Add" +msgstr "Voeg toe" + +#: cps/templates/email_edit.html:72 +msgid "Do you really want to delete this domain rule?" +msgstr "Wil je werkelijk deze domein regel verwijderen?" + +#: cps/templates/feed.xml:21 cps/templates/layout.html:208 +msgid "Next" +msgstr "Volgende" + +#: cps/templates/feed.xml:33 cps/templates/index.xml:11 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 +msgid "Search" +msgstr "Zoek" + +#: cps/templates/http_error.html:23 +msgid "Back to home" +msgstr "" + +#: cps/templates/index.html:5 +msgid "Discover (Random Books)" +msgstr "Ontdek (Willekeurige Boeken)" + +#: cps/templates/index.xml:6 +msgid "Start" +msgstr "Start" + +#: cps/templates/index.xml:18 cps/templates/layout.html:139 +msgid "Hot Books" +msgstr "Populaire Boeken" + +#: cps/templates/index.xml:22 +msgid "Popular publications from this catalog based on Downloads." +msgstr "Populaire publicaties van deze cataloog gebaseerd op Downloads." + +#: cps/templates/index.xml:25 cps/templates/layout.html:142 +msgid "Best rated Books" +msgstr "Best beoordeeld" + +#: cps/templates/index.xml:29 +msgid "Popular publications from this catalog based on Rating." +msgstr "Populaire publicaties van deze cataloog gebaseerd op Beoordeling." + +#: cps/templates/index.xml:32 +msgid "New Books" +msgstr "Nieuwe Boeken" + +#: cps/templates/index.xml:36 +msgid "The latest Books" +msgstr "Recentste boeken" + +#: cps/templates/index.xml:43 +msgid "Show Random Books" +msgstr "Toon Willekeurige Boeken" + +#: cps/templates/index.xml:62 cps/templates/layout.html:160 +msgid "Authors" +msgstr "Auteurs" + +#: cps/templates/index.xml:66 +msgid "Books ordered by Author" +msgstr "Boeken gesorteerd op Auteur" + +#: cps/templates/index.xml:69 cps/templates/layout.html:163 +msgid "Publishers" +msgstr "Uitgevers" + +#: cps/templates/index.xml:73 +msgid "Books ordered by publisher" +msgstr "Boeken gesorteerd op uitgever" + +#: cps/templates/index.xml:80 +msgid "Books ordered by category" +msgstr "Boeken gesorteerd op Categorie" + +#: cps/templates/index.xml:87 +msgid "Books ordered by series" +msgstr "Boeken gesorteerd op Serie" + +#: cps/templates/index.xml:90 cps/templates/layout.html:169 +msgid "Public Shelves" +msgstr "Publieke Boekenplanken" + +#: cps/templates/index.xml:94 +msgid "Books organized in public shelfs, visible to everyone" +msgstr "Boeken georganiseerd in publieke boekenplanken, zichtbaar voor iedereen" + +#: cps/templates/index.xml:98 cps/templates/layout.html:173 +msgid "Your Shelves" +msgstr "Jou Boekenplanken" + +#: cps/templates/index.xml:102 +msgid "User's own shelfs, only visible to the current user himself" +msgstr "Eigen boekenplanken, enkel zichtbaar voor de huidige gebruiker zelf" + +#: cps/templates/layout.html:33 +msgid "Toggle navigation" +msgstr "Kies navigatie" + +#: cps/templates/layout.html:54 +msgid "Advanced Search" +msgstr "Geavanceerd zoeken" + +#: cps/templates/layout.html:78 +msgid "Logout" +msgstr "Log uit" + +#: cps/templates/layout.html:83 cps/templates/register.html:14 +msgid "Register" +msgstr "Registreer" + +#: cps/templates/layout.html:108 +msgid "Uploading..." +msgstr "Aan het uploaden..." + +#: cps/templates/layout.html:109 +msgid "please don't refresh the page" +msgstr "gelieve de pagina niet te herladen" + +#: cps/templates/layout.html:120 +msgid "Browse" +msgstr "Verkennen" + +#: cps/templates/layout.html:122 +msgid "Recently Added" +msgstr "Recent Toegevoegd" + +#: cps/templates/layout.html:127 +msgid "Sorted Books" +msgstr "Gesorteerde Boeken" + +#: cps/templates/layout.html:131 cps/templates/layout.html:132 +#: cps/templates/layout.html:133 cps/templates/layout.html:134 +msgid "Sort By" +msgstr "Sorteren op" + +#: cps/templates/layout.html:131 +msgid "Newest" +msgstr "Nieuwste" + +#: cps/templates/layout.html:132 +msgid "Oldest" +msgstr "Oudste" + +#: cps/templates/layout.html:133 +msgid "Ascending" +msgstr "Oplopend" + +#: cps/templates/layout.html:134 +msgid "Descending" +msgstr "Aflopend" + +#: cps/templates/layout.html:151 +msgid "Discover" +msgstr "Ontdek" + +#: cps/templates/layout.html:154 +msgid "Categories" +msgstr "Categorieën" + +#: cps/templates/layout.html:166 cps/templates/search_form.html:74 +msgid "Languages" +msgstr "Talen" + +#: cps/templates/layout.html:178 +msgid "Create a Shelf" +msgstr "Maak een boekenplank" + +#: cps/templates/layout.html:179 cps/templates/stats.html:3 +msgid "About" +msgstr "Over" + +#: cps/templates/layout.html:193 +msgid "Previous" +msgstr "Vorige" + +#: cps/templates/layout.html:220 +msgid "Book Details" +msgstr "Boek Details" + +#: cps/templates/login.html:8 cps/templates/login.html:9 +#: cps/templates/register.html:7 cps/templates/user_edit.html:8 +msgid "Username" +msgstr "Gebruikersnaam" + +#: cps/templates/login.html:12 cps/templates/login.html:13 +#: cps/templates/user_edit.html:21 +msgid "Password" +msgstr "Wachtwoord" + +#: cps/templates/login.html:17 +msgid "Remember me" +msgstr "Onthoumij" + +#: cps/templates/login.html:22 +msgid "Log in with magic link" +msgstr "Inloggen met magische koppeling" + +#: cps/templates/osd.xml:5 +msgid "Calibre-Web ebook catalog" +msgstr "Calibre-Web ebook cataloog" + +#: cps/templates/read.html:69 cps/templates/readcbr.html:79 +#: cps/templates/readcbr.html:103 +msgid "Settings" +msgstr "Instellingen" + +#: cps/templates/read.html:72 +msgid "Reflow text when sidebars are open." +msgstr "Herschuif tekst waneer het zijpaneel open staat." + +#: cps/templates/readcbr.html:84 +msgid "Keyboard Shortcuts" +msgstr "Sneltoetsen" + +#: cps/templates/readcbr.html:87 +msgid "Previous Page" +msgstr "Vorige Pagina" + +#: cps/templates/readcbr.html:88 +msgid "Next Page" +msgstr "Volgende Pagina" + +#: cps/templates/readcbr.html:89 +msgid "Scale to Best" +msgstr "Optimaal schalen" + +#: cps/templates/readcbr.html:90 +msgid "Scale to Width" +msgstr "Schalen naar breedte" + +#: cps/templates/readcbr.html:91 +msgid "Scale to Height" +msgstr "Schalen naar hoogte" + +#: cps/templates/readcbr.html:92 +msgid "Scale to Native" +msgstr "Schalen op ware grootte" + +#: cps/templates/readcbr.html:93 +msgid "Rotate Right" +msgstr "Draai rechtsom" + +#: cps/templates/readcbr.html:94 +msgid "Rotate Left" +msgstr "Draai linksom" + +#: cps/templates/readcbr.html:95 +msgid "Flip Image" +msgstr "Keer beeld om" + +#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39 +msgid "Theme" +msgstr "Thema" + +#: cps/templates/readcbr.html:111 +msgid "Light" +msgstr "Licht" + +#: cps/templates/readcbr.html:112 +msgid "Dark" +msgstr "Donker" + +#: cps/templates/readcbr.html:117 +msgid "Scale" +msgstr "Schaal" + +#: cps/templates/readcbr.html:120 +msgid "Best" +msgstr "Beste" + +#: cps/templates/readcbr.html:121 +msgid "Width" +msgstr "Breedte" + +#: cps/templates/readcbr.html:122 +msgid "Height" +msgstr "Hoogte" + +#: cps/templates/readcbr.html:123 +msgid "Native" +msgstr "Ware grootte" + +#: cps/templates/readcbr.html:128 +msgid "Rotate" +msgstr "Draai" + +#: cps/templates/readcbr.html:139 +msgid "Flip" +msgstr "Keer" + +#: cps/templates/readcbr.html:142 +msgid "Horizontal" +msgstr "Horizontaal" + +#: cps/templates/readcbr.html:143 +msgid "Vertical" +msgstr "Verticaal" + +#: cps/templates/readpdf.html:29 +msgid "PDF.js viewer" +msgstr "PDF.js viewer" + +#: cps/templates/readtxt.html:6 +msgid "Basic txt Reader" +msgstr "Basis txt Lezer" + +#: cps/templates/register.html:4 +msgid "Register a new account" +msgstr "Registreer een nieuwe gebruiker" + +#: cps/templates/register.html:8 +msgid "Choose a username" +msgstr "Kies een gebruikersnaam" + +#: cps/templates/register.html:11 cps/templates/user_edit.html:13 +msgid "E-mail address" +msgstr "Email adres" + +#: cps/templates/register.html:12 +msgid "Your email address" +msgstr "Jou email adres" + +#: cps/templates/remote_login.html:6 +msgid "Using your another device, visit" +msgstr "Bezoek met je andere apparaat" + +#: cps/templates/remote_login.html:6 +msgid "and log in" +msgstr "en log in" + +#: cps/templates/remote_login.html:9 +msgid "Once you do so, you will automatically get logged in on this device." +msgstr "Eenmaal gedaan wordt je automagisch op dit apparaat ingelogd." + +#: cps/templates/search.html:5 +msgid "No Results for:" +msgstr "Geen resultaat voor:" + +#: cps/templates/search.html:6 +msgid "Please try a different search" +msgstr "Gelieve een ander zoekwoord proberen" + +#: cps/templates/search.html:8 +msgid "Results for:" +msgstr "Resultaten voor:" + +#: cps/templates/search_form.html:19 +msgid "Publishing date from" +msgstr "Publicatie datum van" + +#: cps/templates/search_form.html:26 +msgid "Publishing date to" +msgstr "Publicatie datum tot" + +#: cps/templates/search_form.html:43 +msgid "Exclude Tags" +msgstr "Sluit Tags uit" + +#: cps/templates/search_form.html:63 +msgid "Exclude Series" +msgstr "Sluit Series uit" + +#: cps/templates/search_form.html:84 +msgid "Exclude Languages" +msgstr "Sluit Talen uit" + +#: cps/templates/search_form.html:97 +msgid "Rating bigger than" +msgstr "Waardering meer dan" + +#: cps/templates/search_form.html:101 +msgid "Rating less than" +msgstr "Waardering minder dan" + +#: cps/templates/shelf.html:7 +msgid "Delete this Shelf" +msgstr "Wis deze boekenplank" + +#: cps/templates/shelf.html:8 +msgid "Edit Shelf" +msgstr "Bewerk Boekenplank" + +#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11 +msgid "Change order" +msgstr "Verander volgorde" + +#: cps/templates/shelf.html:58 +msgid "Do you really want to delete the shelf?" +msgstr "Wil je echt deze boekenplank verwijderen?" + +#: cps/templates/shelf.html:61 +msgid "Shelf will be lost for everybody and forever!" +msgstr "Boekenplank zal verdwijnen voor iedereen en altijd!" + +#: cps/templates/shelf_edit.html:13 +msgid "should the shelf be public?" +msgstr "mag deze boekenplank publiek zijn?" + +#: cps/templates/shelf_order.html:5 +msgid "Drag 'n drop to rearrange order" +msgstr "Sleep en laat vallen om de volgorde te veranderen" + +#: cps/templates/stats.html:7 +msgid "Calibre library statistics" +msgstr "Calibre bibliotheek statistieken" + +#: cps/templates/stats.html:12 +msgid "Books in this Library" +msgstr "Boeken in deze Bibliotheek" + +#: cps/templates/stats.html:16 +msgid "Authors in this Library" +msgstr "Auteurs in deze Bibliotheek" + +#: cps/templates/stats.html:20 +msgid "Categories in this Library" +msgstr "Categorieën in deze Bibliotheek" + +#: cps/templates/stats.html:24 +msgid "Series in this Library" +msgstr "Series in deze Bibliotheek" + +#: cps/templates/stats.html:28 +msgid "Linked libraries" +msgstr "Gelinkte bibliotheken" + +#: cps/templates/stats.html:32 +msgid "Program library" +msgstr "Programma bibliotheek" + +#: cps/templates/stats.html:33 +msgid "Installed Version" +msgstr "Geïnstalleerde versie" + +#: cps/templates/tasks.html:7 +msgid "Tasks list" +msgstr "Taaklijst" + +#: cps/templates/tasks.html:12 +msgid "User" +msgstr "Gebruiker" + +#: cps/templates/tasks.html:14 +msgid "Task" +msgstr "Taak" + +#: cps/templates/tasks.html:15 +msgid "Status" +msgstr "Status" + +#: cps/templates/tasks.html:16 +msgid "Progress" +msgstr "Vooruitgang" + +#: cps/templates/tasks.html:17 +msgid "Runtime" +msgstr "Looptijd" + +#: cps/templates/tasks.html:18 +msgid "Starttime" +msgstr "Start tijd" + +#: cps/templates/tasks.html:24 +msgid "Delete finished tasks" +msgstr "Verwijder voltooide taken" + +#: cps/templates/tasks.html:25 +msgid "Hide all tasks" +msgstr "Verberg alle taken" + +#: cps/templates/user_edit.html:18 +msgid "Reset user Password" +msgstr "Reset gebruikers wachtwoord" + +#: cps/templates/user_edit.html:27 +msgid "Kindle E-Mail" +msgstr "Kindle email" + +#: cps/templates/user_edit.html:41 +msgid "Standard Theme" +msgstr "Standaard thema" + +#: cps/templates/user_edit.html:42 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "caliBlur! Donker Thema (Beta)" + +#: cps/templates/user_edit.html:47 +msgid "Show books with language" +msgstr "Toon boeken met taal" + +#: cps/templates/user_edit.html:49 +msgid "Show all" +msgstr "Toon alles" + +#: cps/templates/user_edit.html:147 +msgid "Delete this user" +msgstr "Wis deze gebruiker" + +#: cps/templates/user_edit.html:162 +msgid "Recent Downloads" +msgstr "Recente Downloads" + +#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server" +#~ msgstr "Het uploaden van bestandsextensie \"%(ext)s\" is niet toegestaan op deze server" + +#~ msgid "Current commit timestamp" +#~ msgstr "Huidige commit tijdsstempel" + +#~ msgid "Newest commit timestamp" +#~ msgstr "Nieuwste commit tijdsstempel" + +#~ msgid "Convert: %(book)s" +#~ msgstr "Converteer: %(book)s" + +#~ msgid "Convert to %(format)s: %(book)s" +#~ msgstr "Converteren naar %(format)s: %(book)s" + +#~ msgid "Files are replaced" +#~ msgstr "Bestanden zijn vervangen" + +#~ msgid "Server is stopped" +#~ msgstr "Server is gestopt" + +#~ msgid "Convertertool %(converter)s not found" +#~ msgstr "Converteer tool %(converter)s niet gevonden" + +#~ msgid "Choose a password" +#~ msgstr "Kies een wachtwoord" + +#~ msgid "Could not find any formats suitable for sending by e-mail" +#~ msgstr "Geen geschikte formaten geschikt voor verzending per email gevonden" + +#~ msgid "File %(file)s uploaded" +#~ msgstr "Bestand %(file)s geüpload" + diff --git a/src/cps/translations/pl/LC_MESSAGES/messages.mo b/src/cps/translations/pl/LC_MESSAGES/messages.mo new file mode 100644 index 0000000..7c8cb27 Binary files /dev/null and b/src/cps/translations/pl/LC_MESSAGES/messages.mo differ diff --git a/src/cps/translations/pl/LC_MESSAGES/messages.po b/src/cps/translations/pl/LC_MESSAGES/messages.po new file mode 100644 index 0000000..a530909 --- /dev/null +++ b/src/cps/translations/pl/LC_MESSAGES/messages.po @@ -0,0 +1,1986 @@ +# Polish translations for Calibre Web. +# Copyright (C) 2017 Radosław Kierznowski +# This file is distributed under the same license as the Calibre Web +# project. +# Radosław Kierznowski , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Calibre Web - polski (POT: 2017-04-11 22:51)\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2018-11-03 14:03+0100\n" +"PO-Revision-Date: 2017-04-11 22:51+0200\n" +"Last-Translator: Radosław Kierznowski \n" +"Language: pl\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134 +#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27 +msgid "not installed" +msgstr "nie zainstalowane" + +#: cps/converter.py:22 cps/converter.py:38 +msgid "Excecution permissions missing" +msgstr "" + +#: cps/converter.py:48 +msgid "not configured" +msgstr "" + +#: cps/helper.py:58 +#, python-format +msgid "%(format)s format not found for book id: %(book)d" +msgstr "" + +#: cps/helper.py:70 +#, python-format +msgid "%(format)s not found on Google Drive: %(fn)s" +msgstr "" + +#: cps/helper.py:77 cps/helper.py:147 cps/templates/detail.html:44 +msgid "Send to Kindle" +msgstr "Wyślij do Kindle" + +#: cps/helper.py:78 cps/helper.py:96 +msgid "This e-mail has been sent via Calibre-Web." +msgstr "" + +#: cps/helper.py:89 +#, python-format +msgid "%(format)s not found: %(fn)s" +msgstr "" + +#: cps/helper.py:94 +msgid "Calibre-Web test e-mail" +msgstr "" + +#: cps/helper.py:95 +msgid "Test e-mail" +msgstr "" + +#: cps/helper.py:111 +msgid "Get Started with Calibre-Web" +msgstr "" + +#: cps/helper.py:112 +#, python-format +msgid "Registration e-mail for user: %(name)s" +msgstr "" + +#: cps/helper.py:135 cps/helper.py:145 +msgid "Could not find any formats suitable for sending by e-mail" +msgstr "" + +#: cps/helper.py:148 +#, python-format +msgid "E-mail: %(book)s" +msgstr "" + +#: cps/helper.py:150 +msgid "The requested file could not be read. Maybe wrong permissions?" +msgstr "" + +#: cps/helper.py:250 +#, python-format +msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "" + +#: cps/helper.py:259 +#, python-format +msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "" + +#: cps/helper.py:281 cps/helper.py:290 +#, python-format +msgid "File %(file)s not found on Google Drive" +msgstr "" + +#: cps/helper.py:308 +#, python-format +msgid "Book path %(path)s not found on Google Drive" +msgstr "" + +#: cps/helper.py:565 +msgid "Error excecuting UnRar" +msgstr "" + +#: cps/helper.py:567 +msgid "Unrar binary file not found" +msgstr "" + +#: cps/helper.py:609 +msgid "Waiting" +msgstr "" + +#: cps/helper.py:611 +msgid "Failed" +msgstr "" + +#: cps/helper.py:613 +msgid "Started" +msgstr "" + +#: cps/helper.py:615 +msgid "Finished" +msgstr "" + +#: cps/helper.py:617 +msgid "Unknown Status" +msgstr "" + +#: cps/helper.py:622 +msgid "E-mail: " +msgstr "" + +#: cps/helper.py:624 cps/helper.py:628 +msgid "Convert: " +msgstr "" + +#: cps/helper.py:626 +msgid "Upload: " +msgstr "" + +#: cps/helper.py:630 +msgid "Unknown Task: " +msgstr "" + +#: cps/web.py:1132 cps/web.py:2842 +msgid "Unknown" +msgstr "" + +#: cps/web.py:1141 cps/web.py:1172 cps/web.py:1257 +msgid "HTTP Error" +msgstr "" + +#: cps/web.py:1143 cps/web.py:1174 cps/web.py:1258 +msgid "Connection error" +msgstr "" + +#: cps/web.py:1145 cps/web.py:1176 cps/web.py:1259 +msgid "Timeout while establishing connection" +msgstr "" + +#: cps/web.py:1147 cps/web.py:1178 cps/web.py:1260 +msgid "General error" +msgstr "" + +#: cps/web.py:1153 +msgid "Unexpected data while reading update information" +msgstr "" + +#: cps/web.py:1160 +msgid "No update available. You already have the latest version installed" +msgstr "" + +#: cps/web.py:1185 +msgid "A new update is available. Click on the button below to update to the latest version." +msgstr "" + +#: cps/web.py:1235 +msgid "Could not fetch update information" +msgstr "" + +#: cps/web.py:1250 +msgid "Requesting update package" +msgstr "Żądanie o pakiet aktualizacji" + +#: cps/web.py:1251 +msgid "Downloading update package" +msgstr "Pobieranie pakietu aktualizacji" + +#: cps/web.py:1252 +msgid "Unzipping update package" +msgstr "Rozpakowywanie pakietu aktualizacji" + +#: cps/web.py:1253 +msgid "Replacing files" +msgstr "" + +#: cps/web.py:1254 +msgid "Database connections are closed" +msgstr "Połączenia z bazą danych zostały zakończone" + +#: cps/web.py:1255 +msgid "Stopping server" +msgstr "" + +#: cps/web.py:1256 +msgid "Update finished, please press okay and reload page" +msgstr "Aktualizacja zakończona, proszę nacisnąć OK i odświeżyć stronę" + +#: cps/web.py:1257 cps/web.py:1258 cps/web.py:1259 cps/web.py:1260 +msgid "Update failed:" +msgstr "" + +#: cps/web.py:1283 +msgid "Recently Added Books" +msgstr "" + +#: cps/web.py:1293 +msgid "Newest Books" +msgstr "" + +#: cps/web.py:1305 +msgid "Oldest Books" +msgstr "" + +#: cps/web.py:1317 +msgid "Books (A-Z)" +msgstr "" + +#: cps/web.py:1328 +msgid "Books (Z-A)" +msgstr "" + +#: cps/web.py:1357 +msgid "Hot Books (most downloaded)" +msgstr "Najpopularniejsze książki (najczęściej pobierane)" + +#: cps/web.py:1370 +msgid "Best rated books" +msgstr "Najlepiej oceniane książki" + +#: cps/templates/index.xml:39 cps/web.py:1383 +msgid "Random Books" +msgstr "Losowe książki" + +#: cps/web.py:1398 +msgid "Author list" +msgstr "Lista autorów" + +#: cps/web.py:1410 cps/web.py:1501 cps/web.py:1663 cps/web.py:2206 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "Błąd otwierania e-booka. Plik nie istnieje lub plik nie jest dostępny:" + +#: cps/web.py:1438 +msgid "Publisher list" +msgstr "" + +#: cps/web.py:1452 +#, python-format +msgid "Publisher: %(name)s" +msgstr "" + +#: cps/templates/index.xml:83 cps/web.py:1484 +msgid "Series list" +msgstr "Lista serii" + +#: cps/web.py:1499 +#, python-format +msgid "Series: %(serie)s" +msgstr "Seria: %(serie)s" + +#: cps/web.py:1528 +msgid "Available languages" +msgstr "Dostępne języki" + +#: cps/web.py:1548 +#, python-format +msgid "Language: %(name)s" +msgstr "Język: %(name)s" + +#: cps/templates/index.xml:76 cps/web.py:1559 +msgid "Category list" +msgstr "Lista kategorii" + +#: cps/web.py:1573 +#, python-format +msgid "Category: %(name)s" +msgstr "Kategoria: %(name)s" + +#: cps/templates/layout.html:71 cps/web.py:1699 +msgid "Tasks" +msgstr "" + +#: cps/web.py:1733 +msgid "Statistics" +msgstr "Statystyki" + +#: cps/web.py:1840 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "" + +#: cps/web.py:1915 +msgid "Server restarted, please reload page" +msgstr "Serwer uruchomiony ponownie, proszę odświeżyć stronę" + +#: cps/web.py:1918 +msgid "Performing shutdown of server, please close window" +msgstr "Wykonano wyłączenie serwera, proszę zamknąć okno" + +#: cps/web.py:1937 +msgid "Update done" +msgstr "Aktualizacja zakończona" + +#: cps/web.py:2007 +msgid "Published after " +msgstr "" + +#: cps/web.py:2014 +msgid "Published before " +msgstr "" + +#: cps/web.py:2028 +#, python-format +msgid "Rating <= %(rating)s" +msgstr "" + +#: cps/web.py:2030 +#, python-format +msgid "Rating >= %(rating)s" +msgstr "" + +#: cps/web.py:2089 cps/web.py:2098 +msgid "search" +msgstr "szukaj" + +#: cps/templates/index.xml:47 cps/templates/index.xml:51 +#: cps/templates/layout.html:146 cps/web.py:2165 +msgid "Read Books" +msgstr "Przeczytane książki" + +#: cps/templates/index.xml:55 cps/templates/index.xml:59 +#: cps/templates/layout.html:148 cps/web.py:2168 +msgid "Unread Books" +msgstr "Nieprzeczytane książki" + +#: cps/web.py:2216 cps/web.py:2218 cps/web.py:2220 cps/web.py:2232 +msgid "Read a Book" +msgstr "Czytaj książkę" + +#: cps/web.py:2298 cps/web.py:3201 +msgid "Please fill out all fields!" +msgstr "Proszę wypełnić wszystkie pola!" + +#: cps/web.py:2299 cps/web.py:2320 cps/web.py:2324 cps/web.py:2329 +#: cps/web.py:2331 +msgid "register" +msgstr "rejestracja" + +#: cps/web.py:2319 cps/web.py:3417 +msgid "An unknown error occurred. Please try again later." +msgstr "" + +#: cps/web.py:2322 +msgid "Your e-mail is not allowed to register" +msgstr "" + +#: cps/web.py:2325 +msgid "Confirmation e-mail was send to your e-mail account." +msgstr "" + +#: cps/web.py:2328 +msgid "This username or e-mail address is already in use." +msgstr "" + +#: cps/web.py:2345 cps/web.py:2441 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "Zalogowałeś się jako: '%(nickname)s'" + +#: cps/web.py:2350 +msgid "Wrong Username or Password" +msgstr "Błędna nazwa użytkownika lub hasło" + +#: cps/web.py:2356 cps/web.py:2377 +msgid "login" +msgstr "logowanie" + +#: cps/web.py:2389 cps/web.py:2420 +msgid "Token not found" +msgstr "" + +#: cps/web.py:2397 cps/web.py:2428 +msgid "Token has expired" +msgstr "" + +#: cps/web.py:2405 +msgid "Success! Please return to your device" +msgstr "" + +#: cps/web.py:2455 +msgid "Please configure the SMTP mail settings first..." +msgstr "Proszę najpierw skonfigurować ustawienia SMTP poczty e-mail..." + +#: cps/web.py:2459 +#, python-format +msgid "Book successfully queued for sending to %(kindlemail)s" +msgstr "" + +#: cps/web.py:2463 +#, python-format +msgid "There was an error sending this book: %(res)s" +msgstr "Wystąpił błąd podczas wysyłania tej książki: %(res)s" + +#: cps/web.py:2465 cps/web.py:3255 +msgid "Please configure your kindle e-mail address first..." +msgstr "" + +#: cps/web.py:2476 cps/web.py:2528 +msgid "Invalid shelf specified" +msgstr "" + +#: cps/web.py:2483 +#, python-format +msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2491 +msgid "You are not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2500 +#, python-format +msgid "Book is already part of the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2514 +#, python-format +msgid "Book has been added to shelf: %(sname)s" +msgstr "Książka została dodana do półki: %(sname)s" + +#: cps/web.py:2533 +#, python-format +msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgstr "" + +#: cps/web.py:2538 +msgid "User is not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2556 +#, python-format +msgid "Books are already part of the shelf: %(name)s" +msgstr "" + +#: cps/web.py:2570 +#, python-format +msgid "Books have been added to shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2572 +#, python-format +msgid "Could not add books to shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2609 +#, python-format +msgid "Book has been removed from shelf: %(sname)s" +msgstr "Książka została usunięta z półki: %(sname)s" + +#: cps/web.py:2615 +#, python-format +msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2635 cps/web.py:2659 +#, python-format +msgid "A shelf with the name '%(title)s' already exists." +msgstr "Półka o nazwie '%(title)s' już istnieje." + +#: cps/web.py:2640 +#, python-format +msgid "Shelf %(title)s created" +msgstr "Półka %(title)s została utworzona" + +#: cps/web.py:2642 cps/web.py:2670 +msgid "There was an error" +msgstr "Wystąpił błąd" + +#: cps/web.py:2643 cps/web.py:2645 +msgid "create a shelf" +msgstr "utwórz półkę" + +#: cps/web.py:2668 +#, python-format +msgid "Shelf %(title)s changed" +msgstr "Półka %(title)s została zmieniona" + +#: cps/web.py:2671 cps/web.py:2673 +msgid "Edit a shelf" +msgstr "Edytuj półkę" + +#: cps/web.py:2694 +#, python-format +msgid "successfully deleted shelf %(name)s" +msgstr "pomyślnie usunięto półkę %(name)s" + +#: cps/web.py:2721 +#, python-format +msgid "Shelf: '%(name)s'" +msgstr "Półka: '%(name)s'" + +#: cps/web.py:2724 +msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "" + +#: cps/web.py:2755 +#, python-format +msgid "Change order of Shelf: '%(name)s'" +msgstr "Zmieniono kolejność półki: '%(name)s'" + +#: cps/web.py:2784 cps/web.py:3207 +msgid "E-mail is not from valid domain" +msgstr "" + +#: cps/web.py:2786 cps/web.py:2829 cps/web.py:2832 +#, python-format +msgid "%(name)s's profile" +msgstr "Profil użytkownika %(name)s" + +#: cps/web.py:2827 +msgid "Found an existing account for this e-mail address." +msgstr "" + +#: cps/web.py:2830 +msgid "Profile updated" +msgstr "Zaktualizowano profil" + +#: cps/web.py:2858 +msgid "Admin page" +msgstr "Portal administracyjny" + +#: cps/web.py:2938 cps/web.py:3112 +msgid "Calibre-Web configuration updated" +msgstr "Konfiguracja Calibre-Web została zaktualizowana" + +#: cps/templates/admin.html:100 cps/web.py:2951 +msgid "UI Configuration" +msgstr "" + +#: cps/web.py:2969 +msgid "Import of optional Google Drive requirements missing" +msgstr "" + +#: cps/web.py:2972 +msgid "client_secrets.json is missing or not readable" +msgstr "" + +#: cps/web.py:2977 cps/web.py:3004 +msgid "client_secrets.json is not configured for web application" +msgstr "" + +#: cps/templates/admin.html:99 cps/web.py:3007 cps/web.py:3033 cps/web.py:3045 +#: cps/web.py:3088 cps/web.py:3103 cps/web.py:3120 cps/web.py:3127 +#: cps/web.py:3142 +msgid "Basic Configuration" +msgstr "Podstawowa konfiguracja" + +#: cps/web.py:3030 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:3042 +msgid "Certfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:3085 +msgid "Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:3124 +msgid "DB location is not valid, please enter correct path" +msgstr "Lokalizacja bazy danych jest nieprawidłowa, wpisz poprawną ścieżkę" + +#: cps/templates/admin.html:33 cps/web.py:3203 cps/web.py:3209 cps/web.py:3225 +msgid "Add new user" +msgstr "Dodaj nowego użytkownika" + +#: cps/web.py:3215 +#, python-format +msgid "User '%(user)s' created" +msgstr "Użytkownik '%(user)s' został utworzony" + +#: cps/web.py:3219 +msgid "Found an existing account for this e-mail address or nickname." +msgstr "" + +#: cps/web.py:3243 cps/web.py:3257 +msgid "E-mail server settings updated" +msgstr "" + +#: cps/web.py:3250 +#, python-format +msgid "Test e-mail successfully send to %(kindlemail)s" +msgstr "" + +#: cps/web.py:3253 +#, python-format +msgid "There was an error sending the Test e-mail: %(res)s" +msgstr "" + +#: cps/web.py:3258 +msgid "Edit e-mail server settings" +msgstr "" + +#: cps/web.py:3283 +#, python-format +msgid "User '%(nick)s' deleted" +msgstr "Użytkownik '%(nick)s' został usunięty" + +#: cps/web.py:3392 +#, python-format +msgid "User '%(nick)s' updated" +msgstr "Użytkownik '%(nick)s' został zaktualizowany" + +#: cps/web.py:3395 +msgid "An unknown error occured." +msgstr "Wystąpił nieznany błąd." + +#: cps/web.py:3397 +#, python-format +msgid "Edit User %(nick)s" +msgstr "Edytuj użytkownika %(nick)s" + +#: cps/web.py:3414 +#, python-format +msgid "Password for user %(user)s reset" +msgstr "" + +#: cps/web.py:3428 cps/web.py:3629 +msgid "Error opening eBook. File does not exist or file is not accessible" +msgstr "" + +#: cps/web.py:3453 cps/web.py:3912 +msgid "edit metadata" +msgstr "edytuj metadane" + +#: cps/web.py:3546 cps/web.py:3782 +#, python-format +msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" +msgstr "Rozszerzenie pliku '%(ext)s' nie jest dozwolone do przesłania na ten serwer" + +#: cps/web.py:3550 cps/web.py:3786 +msgid "File to be uploaded must have an extension" +msgstr "Plik do przesłania musi mieć rozszerzenie" + +#: cps/web.py:3562 cps/web.py:3806 +#, python-format +msgid "Failed to create path %(path)s (Permission denied)." +msgstr "Nie udało się utworzyć łącza %(path)s (Odmowa dostępu)." + +#: cps/web.py:3567 +#, python-format +msgid "Failed to store file %(file)s." +msgstr "" + +#: cps/web.py:3583 +#, python-format +msgid "File format %(ext)s added to %(book)s" +msgstr "" + +#: cps/web.py:3601 +#, python-format +msgid "Failed to create path for cover %(path)s (Permission denied)." +msgstr "" + +#: cps/web.py:3608 +#, python-format +msgid "Failed to store cover-file %(cover)s." +msgstr "" + +#: cps/web.py:3611 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/web.py:3641 cps/web.py:3650 cps/web.py:3654 +msgid "unknown" +msgstr "" + +#: cps/web.py:3673 +msgid "Cover is not a jpg file, can't save" +msgstr "" + +#: cps/web.py:3721 +#, python-format +msgid "%(langname)s is not a valid language" +msgstr "" + +#: cps/web.py:3752 +msgid "Metadata successfully updated" +msgstr "" + +#: cps/web.py:3761 +msgid "Error editing book, please check logfile for details" +msgstr "" + +#: cps/web.py:3811 +#, python-format +msgid "Failed to store file %(file)s (Permission denied)." +msgstr "Nie można przechowywać pliku %(file)s (Odmowa dostępu)." + +#: cps/web.py:3816 +#, python-format +msgid "Failed to delete file %(file)s (Permission denied)." +msgstr "Nie udało się usunąć pliku %(file)s (Odmowa dostępu)." + +#: cps/web.py:3898 +#, python-format +msgid "File %(file)s uploaded" +msgstr "" + +#: cps/web.py:3928 +msgid "Source or destination format for conversion missing" +msgstr "" + +#: cps/web.py:3938 +#, python-format +msgid "Book successfully queued for converting to %(book_format)s" +msgstr "" + +#: cps/web.py:3942 +#, python-format +msgid "There was an error converting this book: %(res)s" +msgstr "" + +#: cps/worker.py:287 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "" + +#: cps/worker.py:298 +#, python-format +msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" +msgstr "" + +#: cps/templates/admin.html:6 +msgid "User list" +msgstr "Lista użytkowników" + +#: cps/templates/admin.html:9 +msgid "Nickname" +msgstr "Nazwa użytkownika" + +#: cps/templates/admin.html:10 +msgid "E-mail" +msgstr "" + +#: cps/templates/admin.html:11 +msgid "Kindle" +msgstr "Kindle" + +#: cps/templates/admin.html:12 +msgid "DLS" +msgstr "DLS" + +#: cps/templates/admin.html:13 cps/templates/layout.html:74 +msgid "Admin" +msgstr "Portal administracyjny" + +#: cps/templates/admin.html:14 cps/templates/detail.html:22 +#: cps/templates/detail.html:31 +msgid "Download" +msgstr "Pobierz" + +#: cps/templates/admin.html:15 cps/templates/layout.html:64 +msgid "Upload" +msgstr "Wyślij" + +#: cps/templates/admin.html:16 +msgid "Edit" +msgstr "Edytuj" + +#: cps/templates/admin.html:39 +msgid "SMTP e-mail server settings" +msgstr "" + +#: cps/templates/admin.html:42 cps/templates/email_edit.html:11 +msgid "SMTP hostname" +msgstr "Adres serwera SMTP" + +#: cps/templates/admin.html:43 +msgid "SMTP port" +msgstr "Port serwera SMTP" + +#: cps/templates/admin.html:44 +msgid "SSL" +msgstr "SSL" + +#: cps/templates/admin.html:45 cps/templates/email_edit.html:27 +msgid "SMTP login" +msgstr "Nazwa użytkownika SMTP" + +#: cps/templates/admin.html:46 +msgid "From mail" +msgstr "Wyślij z adresu e-mail" + +#: cps/templates/admin.html:56 +msgid "Change SMTP settings" +msgstr "Zmień ustawienia SMTP" + +#: cps/templates/admin.html:62 +msgid "Configuration" +msgstr "Konfiguracja" + +#: cps/templates/admin.html:65 +msgid "Calibre DB dir" +msgstr "Folder bazy danych Calibre" + +#: cps/templates/admin.html:69 +msgid "Log level" +msgstr "" + +#: cps/templates/admin.html:73 +msgid "Port" +msgstr "Port" + +#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23 +msgid "Books per page" +msgstr "Ilość książek na stronie" + +#: cps/templates/admin.html:83 +msgid "Uploading" +msgstr "Wysyłanie" + +#: cps/templates/admin.html:87 +msgid "Anonymous browsing" +msgstr "" + +#: cps/templates/admin.html:91 +msgid "Public registration" +msgstr "Publiczna rejestracja" + +#: cps/templates/admin.html:95 cps/templates/remote_login.html:4 +msgid "Remote login" +msgstr "" + +#: cps/templates/admin.html:106 +msgid "Administration" +msgstr "Zarządzanie" + +#: cps/templates/admin.html:107 +msgid "Reconnect to Calibre DB" +msgstr "Połącz ponownie z bazą danych Calibre" + +#: cps/templates/admin.html:108 +msgid "Restart Calibre-Web" +msgstr "Uruchom ponownie Calibre Web" + +#: cps/templates/admin.html:109 +msgid "Stop Calibre-Web" +msgstr "Zatrzymaj Calibre Web" + +#: cps/templates/admin.html:115 +msgid "Update" +msgstr "" + +#: cps/templates/admin.html:119 +msgid "Version" +msgstr "" + +#: cps/templates/admin.html:120 +msgid "Details" +msgstr "" + +#: cps/templates/admin.html:126 +msgid "Current version" +msgstr "" + +#: cps/templates/admin.html:132 +msgid "Check for update" +msgstr "Sprawdź aktualizacje" + +#: cps/templates/admin.html:133 +msgid "Perform Update" +msgstr "Wykonaj aktualizację" + +#: cps/templates/admin.html:145 +msgid "Do you really want to restart Calibre-Web?" +msgstr "Na pewno chcesz uruchomić ponownie Calibre Web?" + +#: cps/templates/admin.html:150 cps/templates/admin.html:164 +#: cps/templates/admin.html:184 cps/templates/shelf.html:61 +msgid "Ok" +msgstr "OK" + +#: cps/templates/admin.html:151 cps/templates/admin.html:165 +#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200 +#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168 +#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75 +#: cps/templates/shelf.html:62 cps/templates/shelf_edit.html:19 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155 +msgid "Back" +msgstr "Wróć" + +#: cps/templates/admin.html:163 +msgid "Do you really want to stop Calibre-Web?" +msgstr "Na pewno chcesz zatrzymać Calibre Web?" + +#: cps/templates/admin.html:175 +msgid "Updating, please do not reload page" +msgstr "Aktualizowanie, proszę nie odświeżać strony" + +#: cps/templates/author.html:15 +msgid "via" +msgstr "" + +#: cps/templates/author.html:23 +msgid "In Library" +msgstr "" + +#: cps/templates/author.html:69 +msgid "More by" +msgstr "" + +#: cps/templates/book_edit.html:16 +msgid "Delete Book" +msgstr "" + +#: cps/templates/book_edit.html:19 +msgid "Delete formats:" +msgstr "" + +#: cps/templates/book_edit.html:22 cps/templates/book_edit.html:199 +#: cps/templates/email_edit.html:73 cps/templates/email_edit.html:74 +msgid "Delete" +msgstr "" + +#: cps/templates/book_edit.html:30 +msgid "Convert book format:" +msgstr "" + +#: cps/templates/book_edit.html:34 +msgid "Convert from:" +msgstr "" + +#: cps/templates/book_edit.html:36 cps/templates/book_edit.html:43 +msgid "select an option" +msgstr "" + +#: cps/templates/book_edit.html:41 +msgid "Convert to:" +msgstr "" + +#: cps/templates/book_edit.html:50 +msgid "Convert book" +msgstr "" + +#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6 +msgid "Book Title" +msgstr "Tytuł książki" + +#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:259 +#: cps/templates/book_edit.html:277 cps/templates/search_form.html:10 +msgid "Author" +msgstr "Autor" + +#: cps/templates/book_edit.html:67 cps/templates/book_edit.html:264 +#: cps/templates/book_edit.html:279 cps/templates/search_form.html:106 +msgid "Description" +msgstr "Opis" + +#: cps/templates/book_edit.html:71 cps/templates/search_form.html:33 +msgid "Tags" +msgstr "Tagi" + +#: cps/templates/book_edit.html:75 cps/templates/layout.html:157 +#: cps/templates/search_form.html:53 +msgid "Series" +msgstr "Seria" + +#: cps/templates/book_edit.html:79 +msgid "Series id" +msgstr "ID serii" + +#: cps/templates/book_edit.html:83 +msgid "Rating" +msgstr "Ocena" + +#: cps/templates/book_edit.html:87 +msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +msgstr "" + +#: cps/templates/book_edit.html:91 +msgid "Upload Cover from local drive" +msgstr "" + +#: cps/templates/book_edit.html:96 cps/templates/detail.html:135 +msgid "Publishing date" +msgstr "Data publikacji" + +#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:278 cps/templates/detail.html:127 +#: cps/templates/search_form.html:14 +msgid "Publisher" +msgstr "Wydawca" + +#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31 +msgid "Language" +msgstr "Język" + +#: cps/templates/book_edit.html:117 cps/templates/search_form.html:117 +msgid "Yes" +msgstr "Tak" + +#: cps/templates/book_edit.html:118 cps/templates/search_form.html:118 +msgid "No" +msgstr "Nie" + +#: cps/templates/book_edit.html:164 +msgid "Upload format" +msgstr "" + +#: cps/templates/book_edit.html:173 +msgid "view book after edit" +msgstr "wyświetl książkę po edycji" + +#: cps/templates/book_edit.html:176 cps/templates/book_edit.html:212 +msgid "Get metadata" +msgstr "Uzyskaj metadane" + +#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210 +#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20 +#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17 +#: cps/templates/user_edit.html:153 +msgid "Submit" +msgstr "Wyślij" + +#: cps/templates/book_edit.html:191 +msgid "Are you really sure?" +msgstr "" + +#: cps/templates/book_edit.html:194 +msgid "Book will be deleted from Calibre database" +msgstr "" + +#: cps/templates/book_edit.html:195 +msgid "and from hard disk" +msgstr "" + +#: cps/templates/book_edit.html:215 +msgid "Keyword" +msgstr "Słowo kluczowe" + +#: cps/templates/book_edit.html:216 +msgid " Search keyword " +msgstr " Szukaj słowa kluczowego " + +#: cps/templates/book_edit.html:218 cps/templates/layout.html:46 +msgid "Go!" +msgstr "Idź!" + +#: cps/templates/book_edit.html:222 +msgid "Click the cover to load metadata to the form" +msgstr "Kliknij okładkę, aby załadować metadane do formularza" + +#: cps/templates/book_edit.html:234 cps/templates/book_edit.html:274 +msgid "Loading..." +msgstr "Ładowanie..." + +#: cps/templates/book_edit.html:239 cps/templates/layout.html:224 +msgid "Close" +msgstr "Zamknij" + +#: cps/templates/book_edit.html:266 cps/templates/book_edit.html:280 +msgid "Source" +msgstr "Źródło" + +#: cps/templates/book_edit.html:275 +msgid "Search error!" +msgstr "Błąd wyszukiwania!" + +#: cps/templates/book_edit.html:276 +msgid "No Result(s) found! Please try aonther keyword." +msgstr "" + +#: cps/templates/config_edit.html:12 +msgid "Library Configuration" +msgstr "" + +#: cps/templates/config_edit.html:19 +msgid "Location of Calibre database" +msgstr "Lokalizacja bazy danych Calibre" + +#: cps/templates/config_edit.html:24 +msgid "Use Google Drive?" +msgstr "Użyć dysku Google?" + +#: cps/templates/config_edit.html:30 +msgid "Google Drive config problem" +msgstr "" + +#: cps/templates/config_edit.html:36 +msgid "Authenticate Google Drive" +msgstr "" + +#: cps/templates/config_edit.html:40 +msgid "Please finish Google Drive setup after login" +msgstr "" + +#: cps/templates/config_edit.html:44 +msgid "Google Drive Calibre folder" +msgstr "" + +#: cps/templates/config_edit.html:52 +#, fuzzy +msgid "Metadata Watch Channel ID" +msgstr "Metadane Watch Channel ID" + +#: cps/templates/config_edit.html:55 +msgid "Revoke" +msgstr "" + +#: cps/templates/config_edit.html:73 +msgid "Server Configuration" +msgstr "" + +#: cps/templates/config_edit.html:80 +msgid "Server Port" +msgstr "Port serwera" + +#: cps/templates/config_edit.html:84 +msgid "SSL certfile location (leave it empty for non-SSL Servers)" +msgstr "" + +#: cps/templates/config_edit.html:88 +msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" +msgstr "" + +#: cps/templates/config_edit.html:99 +msgid "Logfile Configuration" +msgstr "" + +#: cps/templates/config_edit.html:106 +msgid "Log Level" +msgstr "Poziom logów" + +#: cps/templates/config_edit.html:115 +msgid "Location and name of logfile (calibre-web.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:126 +msgid "Feature Configuration" +msgstr "" + +#: cps/templates/config_edit.html:134 +msgid "Enable uploading" +msgstr "Włącz wysyłanie" + +#: cps/templates/config_edit.html:138 +msgid "Enable anonymous browsing" +msgstr "Włącz anonimowe przeglądanie" + +#: cps/templates/config_edit.html:142 +msgid "Enable public registration" +msgstr "Włącz publiczną rejestrację" + +#: cps/templates/config_edit.html:146 +msgid "Enable remote login (\"magic link\")" +msgstr "" + +#: cps/templates/config_edit.html:151 +msgid "Use" +msgstr "" + +#: cps/templates/config_edit.html:152 +msgid "Obtain an API Key" +msgstr "" + +#: cps/templates/config_edit.html:156 +msgid "Goodreads API Key" +msgstr "" + +#: cps/templates/config_edit.html:160 +msgid "Goodreads API Secret" +msgstr "" + +#: cps/templates/config_edit.html:173 +msgid "External binaries" +msgstr "" + +#: cps/templates/config_edit.html:181 +msgid "No converter" +msgstr "" + +#: cps/templates/config_edit.html:183 +msgid "Use Kindlegen" +msgstr "" + +#: cps/templates/config_edit.html:185 +msgid "Use calibre's ebook converter" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "E-Book converter settings" +msgstr "" + +#: cps/templates/config_edit.html:193 +msgid "Path to convertertool" +msgstr "" + +#: cps/templates/config_edit.html:199 +msgid "Location of Unrar binary" +msgstr "" + +#: cps/templates/config_edit.html:215 cps/templates/layout.html:82 +#: cps/templates/login.html:4 +msgid "Login" +msgstr "Zaloguj się" + +#: cps/templates/config_view_edit.html:12 +msgid "View Configuration" +msgstr "" + +#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 +#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 +msgid "Title" +msgstr "Tytuł" + +#: cps/templates/config_view_edit.html:27 +msgid "No. of random books to show" +msgstr "Liczba losowych książek do pokazania" + +#: cps/templates/config_view_edit.html:31 +msgid "Regular expression for ignoring columns" +msgstr "Wyrażenie regularne dla ignorowanych kolumn" + +#: cps/templates/config_view_edit.html:35 +msgid "Link read/unread status to Calibre column" +msgstr "" + +#: cps/templates/config_view_edit.html:44 +msgid "Regular expression for title sorting" +msgstr "Wyrażenie regularne dla tytułu sortującego" + +#: cps/templates/config_view_edit.html:48 +msgid "Tags for Mature Content" +msgstr "" + +#: cps/templates/config_view_edit.html:62 +msgid "Default settings for new users" +msgstr "Domyślne ustawienia dla nowych użytkowników" + +#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110 +msgid "Admin user" +msgstr "Użytkownik z uprawnieniami administratora" + +#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119 +msgid "Allow Downloads" +msgstr "Zezwalaj na pobieranie" + +#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123 +msgid "Allow Uploads" +msgstr "Zezwalaj na wysyłanie" + +#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127 +msgid "Allow Edit" +msgstr "Zezwalaj na edycję" + +#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131 +msgid "Allow Delete books" +msgstr "" + +#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136 +msgid "Allow Changing Password" +msgstr "Zezwalaj na zmianę hasła" + +#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140 +msgid "Allow Editing Public Shelfs" +msgstr "" + +#: cps/templates/config_view_edit.html:104 +msgid "Default visibilities for new users" +msgstr "" + +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58 +msgid "Show random books" +msgstr "Pokaż losowe książki" + +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62 +msgid "Show recent books" +msgstr "" + +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66 +msgid "Show sorted books" +msgstr "" + +#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70 +msgid "Show hot books" +msgstr "Pokaż najpopularniejsze książki" + +#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74 +msgid "Show best rated books" +msgstr "Pokaż najlepiej ocenione książki" + +#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78 +msgid "Show language selection" +msgstr "Pokaż wybór języka" + +#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82 +msgid "Show series selection" +msgstr "Pokaż wybór serii" + +#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86 +msgid "Show category selection" +msgstr "Pokaż wybór kategorii" + +#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90 +msgid "Show author selection" +msgstr "Pokaż wybór autora" + +#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94 +msgid "Show publisher selection" +msgstr "" + +#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98 +msgid "Show read and unread" +msgstr "Pokaż przeczytane i nieprzeczytane" + +#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102 +msgid "Show random books in detail view" +msgstr "Pokaz losowe książki w widoku szczegółowym" + +#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115 +msgid "Show mature content" +msgstr "" + +#: cps/templates/detail.html:49 +msgid "Read in browser" +msgstr "Czytaj w przeglądarce" + +#: cps/templates/detail.html:88 +msgid "Book" +msgstr "Książka" + +#: cps/templates/detail.html:88 +msgid "of" +msgstr "z" + +#: cps/templates/detail.html:94 +msgid "language" +msgstr "język" + +#: cps/templates/detail.html:172 +msgid "Read" +msgstr "Czytaj" + +#: cps/templates/detail.html:182 +msgid "Description:" +msgstr "Opis:" + +#: cps/templates/detail.html:195 cps/templates/search.html:14 +msgid "Add to shelf" +msgstr "Dodaj do półki" + +#: cps/templates/detail.html:257 +msgid "Edit metadata" +msgstr "Edytuj metadane" + +#: cps/templates/email_edit.html:15 +msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +msgstr "Port serwera SMTP (używane 25 dla jawnego SMTP i 465 dla połączenia SSL i 587 dla połączenia STARTTLS)" + +#: cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "Szyfrowanie" + +#: cps/templates/email_edit.html:21 +msgid "None" +msgstr "Nic" + +#: cps/templates/email_edit.html:22 +msgid "STARTTLS" +msgstr "STARTTLS" + +#: cps/templates/email_edit.html:23 +msgid "SSL/TLS" +msgstr "SSL/TLS" + +#: cps/templates/email_edit.html:31 +msgid "SMTP password" +msgstr "Hasło SMTP" + +#: cps/templates/email_edit.html:35 +msgid "From e-mail" +msgstr "Z adresu e-mail" + +#: cps/templates/email_edit.html:38 +msgid "Save settings" +msgstr "Zapisz ustawienia" + +#: cps/templates/email_edit.html:39 +msgid "Save settings and send Test E-Mail" +msgstr "Zapisz ustawienia i wyślij testową wiadomość e-mail" + +#: cps/templates/email_edit.html:43 +msgid "Allowed domains for registering" +msgstr "" + +#: cps/templates/email_edit.html:47 +msgid "Enter domainname" +msgstr "" + +#: cps/templates/email_edit.html:55 +msgid "Add Domain" +msgstr "" + +#: cps/templates/email_edit.html:58 +msgid "Add" +msgstr "" + +#: cps/templates/email_edit.html:72 +msgid "Do you really want to delete this domain rule?" +msgstr "" + +#: cps/templates/feed.xml:21 cps/templates/layout.html:208 +msgid "Next" +msgstr "Następne" + +#: cps/templates/feed.xml:33 cps/templates/index.xml:11 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 +msgid "Search" +msgstr "Szukaj" + +#: cps/templates/index.html:5 +msgid "Discover (Random Books)" +msgstr "Odkrywaj (losowe książki)" + +#: cps/templates/index.xml:6 +msgid "Start" +msgstr "Rozpocznij" + +#: cps/templates/index.xml:18 cps/templates/layout.html:139 +msgid "Hot Books" +msgstr "Najpopularniejsze książki" + +#: cps/templates/index.xml:22 +msgid "Popular publications from this catalog based on Downloads." +msgstr "Popularne publikacje z tego katalogu bazujące na pobranych." + +#: cps/templates/index.xml:25 cps/templates/layout.html:142 +msgid "Best rated Books" +msgstr "Najlepiej ocenione książki" + +#: cps/templates/index.xml:29 +msgid "Popular publications from this catalog based on Rating." +msgstr "Popularne publikacje z tego katalogu bazujące na ocenach." + +#: cps/templates/index.xml:32 +msgid "New Books" +msgstr "Nowe książki" + +#: cps/templates/index.xml:36 +msgid "The latest Books" +msgstr "Ostatnie książki" + +#: cps/templates/index.xml:43 +msgid "Show Random Books" +msgstr "Pokazuj losowe książki" + +#: cps/templates/index.xml:62 cps/templates/layout.html:160 +msgid "Authors" +msgstr "Autorzy" + +#: cps/templates/index.xml:66 +msgid "Books ordered by Author" +msgstr "Książki sortowane według autorów" + +#: cps/templates/index.xml:69 cps/templates/layout.html:163 +msgid "Publishers" +msgstr "" + +#: cps/templates/index.xml:73 +msgid "Books ordered by publisher" +msgstr "" + +#: cps/templates/index.xml:80 +msgid "Books ordered by category" +msgstr "Książki sortowane według kategorii" + +#: cps/templates/index.xml:87 +msgid "Books ordered by series" +msgstr "Książki sortowane według serii" + +#: cps/templates/index.xml:90 cps/templates/layout.html:169 +msgid "Public Shelves" +msgstr "Publiczne półki" + +#: cps/templates/index.xml:94 +msgid "Books organized in public shelfs, visible to everyone" +msgstr "" + +#: cps/templates/index.xml:98 cps/templates/layout.html:173 +msgid "Your Shelves" +msgstr "Twoje półki" + +#: cps/templates/index.xml:102 +msgid "User's own shelfs, only visible to the current user himself" +msgstr "" + +#: cps/templates/layout.html:33 +msgid "Toggle navigation" +msgstr "Przełącz nawigację" + +#: cps/templates/layout.html:54 +msgid "Advanced Search" +msgstr "Zaawansowane wyszukiwanie" + +#: cps/templates/layout.html:78 +msgid "Logout" +msgstr "Wyloguj się" + +#: cps/templates/layout.html:83 cps/templates/register.html:14 +msgid "Register" +msgstr "Zarejestruj się" + +#: cps/templates/layout.html:108 +msgid "Uploading..." +msgstr "" + +#: cps/templates/layout.html:109 +msgid "please don't refresh the page" +msgstr "" + +#: cps/templates/layout.html:120 +msgid "Browse" +msgstr "Przeglądaj" + +#: cps/templates/layout.html:122 +msgid "Recently Added" +msgstr "" + +#: cps/templates/layout.html:127 +msgid "Sorted Books" +msgstr "" + +#: cps/templates/layout.html:131 cps/templates/layout.html:132 +#: cps/templates/layout.html:133 cps/templates/layout.html:134 +msgid "Sort By" +msgstr "" + +#: cps/templates/layout.html:131 +msgid "Newest" +msgstr "" + +#: cps/templates/layout.html:132 +msgid "Oldest" +msgstr "" + +#: cps/templates/layout.html:133 +msgid "Ascending" +msgstr "" + +#: cps/templates/layout.html:134 +msgid "Descending" +msgstr "" + +#: cps/templates/layout.html:151 +msgid "Discover" +msgstr "Odkrywaj" + +#: cps/templates/layout.html:154 +msgid "Categories" +msgstr "Kategorie" + +#: cps/templates/layout.html:166 cps/templates/search_form.html:74 +msgid "Languages" +msgstr "Języki" + +#: cps/templates/layout.html:178 +msgid "Create a Shelf" +msgstr "Utwórz półkę" + +#: cps/templates/layout.html:179 cps/templates/stats.html:3 +msgid "About" +msgstr "O programie" + +#: cps/templates/layout.html:193 +msgid "Previous" +msgstr "" + +#: cps/templates/layout.html:220 +msgid "Book Details" +msgstr "" + +#: cps/templates/login.html:8 cps/templates/login.html:9 +#: cps/templates/register.html:7 cps/templates/user_edit.html:8 +msgid "Username" +msgstr "Nazwa użytkownika" + +#: cps/templates/login.html:12 cps/templates/login.html:13 +#: cps/templates/user_edit.html:21 +msgid "Password" +msgstr "Hasło" + +#: cps/templates/login.html:17 +msgid "Remember me" +msgstr "Zapamiętaj mnie" + +#: cps/templates/login.html:22 +msgid "Log in with magic link" +msgstr "" + +#: cps/templates/osd.xml:5 +msgid "Calibre-Web ebook catalog" +msgstr "" + +#: cps/templates/read.html:69 cps/templates/readcbr.html:79 +#: cps/templates/readcbr.html:103 +msgid "Settings" +msgstr "" + +#: cps/templates/read.html:72 +#, fuzzy +msgid "Reflow text when sidebars are open." +msgstr "Tekst pływający, gdy paski boczne są otwarte." + +#: cps/templates/readcbr.html:84 +msgid "Keyboard Shortcuts" +msgstr "" + +#: cps/templates/readcbr.html:87 +msgid "Previous Page" +msgstr "" + +#: cps/templates/readcbr.html:88 +msgid "Next Page" +msgstr "" + +#: cps/templates/readcbr.html:89 +msgid "Scale to Best" +msgstr "" + +#: cps/templates/readcbr.html:90 +msgid "Scale to Width" +msgstr "" + +#: cps/templates/readcbr.html:91 +msgid "Scale to Height" +msgstr "" + +#: cps/templates/readcbr.html:92 +msgid "Scale to Native" +msgstr "" + +#: cps/templates/readcbr.html:93 +msgid "Rotate Right" +msgstr "" + +#: cps/templates/readcbr.html:94 +msgid "Rotate Left" +msgstr "" + +#: cps/templates/readcbr.html:95 +msgid "Flip Image" +msgstr "" + +#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39 +msgid "Theme" +msgstr "" + +#: cps/templates/readcbr.html:111 +msgid "Light" +msgstr "" + +#: cps/templates/readcbr.html:112 +msgid "Dark" +msgstr "" + +#: cps/templates/readcbr.html:117 +msgid "Scale" +msgstr "" + +#: cps/templates/readcbr.html:120 +msgid "Best" +msgstr "" + +#: cps/templates/readcbr.html:121 +msgid "Width" +msgstr "" + +#: cps/templates/readcbr.html:122 +msgid "Height" +msgstr "" + +#: cps/templates/readcbr.html:123 +msgid "Native" +msgstr "" + +#: cps/templates/readcbr.html:128 +msgid "Rotate" +msgstr "" + +#: cps/templates/readcbr.html:139 +msgid "Flip" +msgstr "" + +#: cps/templates/readcbr.html:142 +msgid "Horizontal" +msgstr "" + +#: cps/templates/readcbr.html:143 +msgid "Vertical" +msgstr "" + +#: cps/templates/readpdf.html:29 +msgid "PDF.js viewer" +msgstr "PDF.js viewer" + +#: cps/templates/readtxt.html:6 +msgid "Basic txt Reader" +msgstr "Podstawowy czytnik txt" + +#: cps/templates/register.html:4 +msgid "Register a new account" +msgstr "Zarejestruj nowe konto" + +#: cps/templates/register.html:8 +msgid "Choose a username" +msgstr "Wybierz nazwę użytkownika" + +#: cps/templates/register.html:11 cps/templates/user_edit.html:13 +msgid "E-mail address" +msgstr "" + +#: cps/templates/register.html:12 +msgid "Your email address" +msgstr "Twój adres e-mail" + +#: cps/templates/remote_login.html:6 +msgid "Using your another device, visit" +msgstr "" + +#: cps/templates/remote_login.html:6 +msgid "and log in" +msgstr "" + +#: cps/templates/remote_login.html:9 +msgid "Once you do so, you will automatically get logged in on this device." +msgstr "" + +#: cps/templates/search.html:5 +msgid "No Results for:" +msgstr "Brak wyników dla:" + +#: cps/templates/search.html:6 +msgid "Please try a different search" +msgstr "Proszę wypróbować podobne wyszukiwanie" + +#: cps/templates/search.html:8 +msgid "Results for:" +msgstr "Wyniki dla:" + +#: cps/templates/search_form.html:19 +msgid "Publishing date from" +msgstr "" + +#: cps/templates/search_form.html:26 +msgid "Publishing date to" +msgstr "" + +#: cps/templates/search_form.html:43 +msgid "Exclude Tags" +msgstr "Wyklucz tagi" + +#: cps/templates/search_form.html:63 +msgid "Exclude Series" +msgstr "Wyklucz serie" + +#: cps/templates/search_form.html:84 +msgid "Exclude Languages" +msgstr "Wyklucz języki" + +#: cps/templates/search_form.html:97 +msgid "Rating bigger than" +msgstr "" + +#: cps/templates/search_form.html:101 +msgid "Rating less than" +msgstr "" + +#: cps/templates/shelf.html:7 +msgid "Delete this Shelf" +msgstr "Usuń tą półkę" + +#: cps/templates/shelf.html:8 +msgid "Edit Shelf" +msgstr "" + +#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11 +msgid "Change order" +msgstr "Zmień sortowanie" + +#: cps/templates/shelf.html:56 +msgid "Do you really want to delete the shelf?" +msgstr "" + +#: cps/templates/shelf.html:59 +msgid "Shelf will be lost for everybody and forever!" +msgstr "" + +#: cps/templates/shelf_edit.html:13 +msgid "should the shelf be public?" +msgstr "półka powinna być publiczna?" + +#: cps/templates/shelf_order.html:5 +msgid "Drag 'n drop to rearrange order" +msgstr "Przeciągnij i upuść, aby zmienić kolejność" + +#: cps/templates/stats.html:7 +msgid "Calibre library statistics" +msgstr "Statystyki biblioteki Calibre" + +#: cps/templates/stats.html:12 +msgid "Books in this Library" +msgstr "Książki" + +#: cps/templates/stats.html:16 +msgid "Authors in this Library" +msgstr "Autorzy" + +#: cps/templates/stats.html:20 +msgid "Categories in this Library" +msgstr "Kategorie" + +#: cps/templates/stats.html:24 +msgid "Series in this Library" +msgstr "Serie" + +#: cps/templates/stats.html:28 +msgid "Linked libraries" +msgstr "Załączone biblioteki" + +#: cps/templates/stats.html:32 +msgid "Program library" +msgstr "Biblioteka programu" + +#: cps/templates/stats.html:33 +msgid "Installed Version" +msgstr "Zainstalowana wersja" + +#: cps/templates/tasks.html:7 +msgid "Tasks list" +msgstr "" + +#: cps/templates/tasks.html:12 +msgid "User" +msgstr "" + +#: cps/templates/tasks.html:14 +msgid "Task" +msgstr "" + +#: cps/templates/tasks.html:15 +msgid "Status" +msgstr "" + +#: cps/templates/tasks.html:16 +msgid "Progress" +msgstr "" + +#: cps/templates/tasks.html:17 +msgid "Runtime" +msgstr "" + +#: cps/templates/tasks.html:18 +msgid "Starttime" +msgstr "" + +#: cps/templates/tasks.html:24 +msgid "Delete finished tasks" +msgstr "" + +#: cps/templates/tasks.html:25 +msgid "Hide all tasks" +msgstr "" + +#: cps/templates/user_edit.html:18 +msgid "Reset user Password" +msgstr "" + +#: cps/templates/user_edit.html:27 +msgid "Kindle E-Mail" +msgstr "Adres e-mail Kindle" + +#: cps/templates/user_edit.html:41 +msgid "Standard Theme" +msgstr "" + +#: cps/templates/user_edit.html:42 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "" + +#: cps/templates/user_edit.html:47 +msgid "Show books with language" +msgstr "Pokaż książki w języku" + +#: cps/templates/user_edit.html:49 +msgid "Show all" +msgstr "Pokaż wszystko" + +#: cps/templates/user_edit.html:147 +msgid "Delete this user" +msgstr "Usuń tego użytkownika" + +#: cps/templates/user_edit.html:162 +msgid "Recent Downloads" +msgstr "Ostatnio pobierane" + +#~ msgid "Convert: %s" +#~ msgstr "" + +#~ msgid "%s: %s" +#~ msgstr "" + +#~ msgid "E-Mail: %(book)s" +#~ msgstr "" + +#~ msgid "E-mail: %stitle" +#~ msgstr "" + +#~ msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Password for user %(user)s reset" +#~ msgstr "" + +#~ msgid "Password for user %s reset" +#~ msgstr "" + +#~ msgid "Rename title from: '%(src)s' to '%(src)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Rename author from: '%(src)s' to '%(src)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Failed to create path for cover %(cover)s (Permission denied)." +#~ msgstr "" + +#~ msgid "File extension '%s' is not allowed to be uploaded to this server" +#~ msgstr "" + +#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server" +#~ msgstr "Rozszerzenie pliku \"%(ext)s\" nie jest dozwolone do przesłania na ten serwer" + +#~ msgid "Current commit timestamp" +#~ msgstr "Znacznik czasowy zainstalowanej wersji" + +#~ msgid "Newest commit timestamp" +#~ msgstr "Znacznik czasowy nowej wersji" + +#~ msgid "Convert: %(book)s" +#~ msgstr "" + +#~ msgid "Convert to %(format)s: %(book)s" +#~ msgstr "" + +#~ msgid "Files are replaced" +#~ msgstr "Pliki zostały zastąpione" + +#~ msgid "Server is stopped" +#~ msgstr "Serwer jest zatrzymany" + +#~ msgid "Convertertool %(converter)s not found" +#~ msgstr "" + +#~ msgid "Choose a password" +#~ msgstr "Wybierz hasło" + diff --git a/src/cps/translations/ru/LC_MESSAGES/messages.mo b/src/cps/translations/ru/LC_MESSAGES/messages.mo new file mode 100644 index 0000000..7b01b1f Binary files /dev/null and b/src/cps/translations/ru/LC_MESSAGES/messages.mo differ diff --git a/src/cps/translations/ru/LC_MESSAGES/messages.po b/src/cps/translations/ru/LC_MESSAGES/messages.po new file mode 100644 index 0000000..5657f41 --- /dev/null +++ b/src/cps/translations/ru/LC_MESSAGES/messages.po @@ -0,0 +1,1947 @@ +# Перевод на русский язык для Calibre-Web. +# Copyright (C) 2017 Pavel Korovin +# This file is distributed under the same license as the Calibre-Web project +# Pavel Korovin , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Calibre-Web\n" +"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" +"POT-Creation-Date: 2018-11-03 14:03+0100\n" +"PO-Revision-Date: 2017-04-30 00:47+0300\n" +"Last-Translator: Pavel Korovin \n" +"Language: ru\n" +"Language-Team: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134 +#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27 +msgid "not installed" +msgstr "не установлено" + +#: cps/converter.py:22 cps/converter.py:38 +msgid "Excecution permissions missing" +msgstr "Отсутствуют разрешения на выполнение" + +#: cps/converter.py:48 +msgid "not configured" +msgstr "" + +#: cps/helper.py:58 +#, python-format +msgid "%(format)s format not found for book id: %(book)d" +msgstr "%(format)s форма не найден для книги с id: %(book)d" + +#: cps/helper.py:70 +#, python-format +msgid "%(format)s not found on Google Drive: %(fn)s" +msgstr "%(format)s не найден на Google Drive: %(fn)s" + +#: cps/helper.py:77 cps/helper.py:147 cps/templates/detail.html:44 +msgid "Send to Kindle" +msgstr "Отправить на Kindle" + +#: cps/helper.py:78 cps/helper.py:96 +msgid "This e-mail has been sent via Calibre-Web." +msgstr "Это электронное письмо было отправлено через Caliber-Web." + +#: cps/helper.py:89 +#, python-format +msgid "%(format)s not found: %(fn)s" +msgstr "%(format)s не найден: %(fn)s" + +#: cps/helper.py:94 +msgid "Calibre-Web test e-mail" +msgstr "Тестовый e-mail для Calibre-Web" + +#: cps/helper.py:95 +msgid "Test e-mail" +msgstr "Тестовый e-mail" + +#: cps/helper.py:111 +msgid "Get Started with Calibre-Web" +msgstr "Начать работать с Calibre-Web" + +#: cps/helper.py:112 +#, python-format +msgid "Registration e-mail for user: %(name)s" +msgstr "Регистрационный e-mail для пользователя: %(name)s" + +#: cps/helper.py:135 cps/helper.py:145 +msgid "Could not find any formats suitable for sending by e-mail" +msgstr "Не удалось найти форматы, которые подходят для отправки по e-mail" + +#: cps/helper.py:148 +#, python-format +msgid "E-mail: %(book)s" +msgstr "Эл. почта: %(book)s" + +#: cps/helper.py:150 +msgid "The requested file could not be read. Maybe wrong permissions?" +msgstr "Запрашиваемый файл не может быть прочитан. Возможно не верные разрешения?" + +#: cps/helper.py:250 +#, python-format +msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "Переименовывание заголовка с: '%(src)s' на '%(dest)s' не удалось из-за ошибки: %(error)s" + +#: cps/helper.py:259 +#, python-format +msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "Переименовывание автора с: '%(src)s' на '%(dest)s' не удалось из-за ошибки: %(error)s" + +#: cps/helper.py:281 cps/helper.py:290 +#, python-format +msgid "File %(file)s not found on Google Drive" +msgstr "Файл %(file)s не найден на Google Drive" + +#: cps/helper.py:308 +#, python-format +msgid "Book path %(path)s not found on Google Drive" +msgstr "Путь книги %(path)s не найден на Google Drive" + +#: cps/helper.py:565 +msgid "Error excecuting UnRar" +msgstr "Ошибка извлечения UnRar" + +#: cps/helper.py:567 +msgid "Unrar binary file not found" +msgstr "Unrar двочиный файл не найден" + +#: cps/helper.py:609 +msgid "Waiting" +msgstr "Ожидание" + +#: cps/helper.py:611 +msgid "Failed" +msgstr "Неудачно" + +#: cps/helper.py:613 +msgid "Started" +msgstr "Начало" + +#: cps/helper.py:615 +msgid "Finished" +msgstr "Закончено" + +#: cps/helper.py:617 +msgid "Unknown Status" +msgstr "" + +#: cps/helper.py:622 +msgid "E-mail: " +msgstr "" + +#: cps/helper.py:624 cps/helper.py:628 +msgid "Convert: " +msgstr "" + +#: cps/helper.py:626 +msgid "Upload: " +msgstr "" + +#: cps/helper.py:630 +msgid "Unknown Task: " +msgstr "" + +#: cps/web.py:1132 cps/web.py:2842 +msgid "Unknown" +msgstr "Неизвестно" + +#: cps/web.py:1141 cps/web.py:1172 cps/web.py:1257 +msgid "HTTP Error" +msgstr "Ошибка HTTP" + +#: cps/web.py:1143 cps/web.py:1174 cps/web.py:1258 +msgid "Connection error" +msgstr "Ошибка соединения" + +#: cps/web.py:1145 cps/web.py:1176 cps/web.py:1259 +msgid "Timeout while establishing connection" +msgstr "Таймаут при установлении соединения" + +#: cps/web.py:1147 cps/web.py:1178 cps/web.py:1260 +msgid "General error" +msgstr "Общая ошибка" + +#: cps/web.py:1153 +msgid "Unexpected data while reading update information" +msgstr "Некорректные данные при чтении информации об обновлении" + +#: cps/web.py:1160 +msgid "No update available. You already have the latest version installed" +msgstr "Обновление недоступно. Вы используете самую последнюю версию" + +#: cps/web.py:1185 +msgid "A new update is available. Click on the button below to update to the latest version." +msgstr "Доступно обновление. Нажмите на кнопку, что бы обновиться до последней версии." + +#: cps/web.py:1235 +msgid "Could not fetch update information" +msgstr "Не удалось получить информацию об обновлении" + +#: cps/web.py:1250 +msgid "Requesting update package" +msgstr "Проверка обновлений" + +#: cps/web.py:1251 +msgid "Downloading update package" +msgstr "Загрузка обновлений" + +#: cps/web.py:1252 +msgid "Unzipping update package" +msgstr "Распаковка обновлений" + +#: cps/web.py:1253 +msgid "Replacing files" +msgstr "" + +#: cps/web.py:1254 +msgid "Database connections are closed" +msgstr "Соеднинения с базой данных закрыты" + +#: cps/web.py:1255 +msgid "Stopping server" +msgstr "" + +#: cps/web.py:1256 +msgid "Update finished, please press okay and reload page" +msgstr "Обновления установлены, нажмите okay и перезагрузите страницу" + +#: cps/web.py:1257 cps/web.py:1258 cps/web.py:1259 cps/web.py:1260 +msgid "Update failed:" +msgstr "" + +#: cps/web.py:1283 +msgid "Recently Added Books" +msgstr "Недавно Добавленные Книги" + +#: cps/web.py:1293 +msgid "Newest Books" +msgstr "Новые Книги" + +#: cps/web.py:1305 +msgid "Oldest Books" +msgstr "Старые Книги" + +#: cps/web.py:1317 +msgid "Books (A-Z)" +msgstr "Книги (А-Я)" + +#: cps/web.py:1328 +msgid "Books (Z-A)" +msgstr "Книги (Я-А)" + +#: cps/web.py:1357 +msgid "Hot Books (most downloaded)" +msgstr "Популярные книги (часто загружаемые)" + +#: cps/web.py:1370 +msgid "Best rated books" +msgstr "Книги с наивысшим рейтингом" + +#: cps/templates/index.xml:39 cps/web.py:1383 +msgid "Random Books" +msgstr "Случайный выбор" + +#: cps/web.py:1398 +msgid "Author list" +msgstr "Авторы" + +#: cps/web.py:1410 cps/web.py:1501 cps/web.py:1663 cps/web.py:2206 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "Невозможно открыть книгу. Файл не существует или недоступен." + +#: cps/web.py:1438 +msgid "Publisher list" +msgstr "" + +#: cps/web.py:1452 +#, python-format +msgid "Publisher: %(name)s" +msgstr "" + +#: cps/templates/index.xml:83 cps/web.py:1484 +msgid "Series list" +msgstr "Серии" + +#: cps/web.py:1499 +#, python-format +msgid "Series: %(serie)s" +msgstr "Серии: %(serie)s" + +#: cps/web.py:1528 +msgid "Available languages" +msgstr "Доступные языки" + +#: cps/web.py:1548 +#, python-format +msgid "Language: %(name)s" +msgstr "Язык: %(name)s" + +#: cps/templates/index.xml:76 cps/web.py:1559 +msgid "Category list" +msgstr "Категории" + +#: cps/web.py:1573 +#, python-format +msgid "Category: %(name)s" +msgstr "Категория: %(name)s" + +#: cps/templates/layout.html:71 cps/web.py:1699 +msgid "Tasks" +msgstr "Задания" + +#: cps/web.py:1733 +msgid "Statistics" +msgstr "Статистика" + +#: cps/web.py:1840 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "Не удалось проверить домен обратного вызова, пожалуйста, выполните шаги для проверки домена в консоли разработчика Google." + +#: cps/web.py:1915 +msgid "Server restarted, please reload page" +msgstr "Сервер перезагружен, пожалуйста, перезагрузите страницу" + +#: cps/web.py:1918 +msgid "Performing shutdown of server, please close window" +msgstr "Производится остановка сервера, пожалуйста, закройте окно" + +#: cps/web.py:1937 +msgid "Update done" +msgstr "Обновление закончено" + +#: cps/web.py:2007 +msgid "Published after " +msgstr "Опубликовано до " + +#: cps/web.py:2014 +msgid "Published before " +msgstr "Опубликовано после " + +#: cps/web.py:2028 +#, python-format +msgid "Rating <= %(rating)s" +msgstr "Рейтинг <= %(rating)s" + +#: cps/web.py:2030 +#, python-format +msgid "Rating >= %(rating)s" +msgstr "Рейтинг >= %(rating)s" + +#: cps/web.py:2089 cps/web.py:2098 +msgid "search" +msgstr "поиск" + +#: cps/templates/index.xml:47 cps/templates/index.xml:51 +#: cps/templates/layout.html:146 cps/web.py:2165 +msgid "Read Books" +msgstr "Прочитанные Книги" + +#: cps/templates/index.xml:55 cps/templates/index.xml:59 +#: cps/templates/layout.html:148 cps/web.py:2168 +msgid "Unread Books" +msgstr "Непрочитанные Книги" + +#: cps/web.py:2216 cps/web.py:2218 cps/web.py:2220 cps/web.py:2232 +msgid "Read a Book" +msgstr "Читать Книгу" + +#: cps/web.py:2298 cps/web.py:3201 +msgid "Please fill out all fields!" +msgstr "Пожалуйста, заполните все поля!" + +#: cps/web.py:2299 cps/web.py:2320 cps/web.py:2324 cps/web.py:2329 +#: cps/web.py:2331 +msgid "register" +msgstr "регистрация" + +#: cps/web.py:2319 cps/web.py:3417 +msgid "An unknown error occurred. Please try again later." +msgstr "Неизвестная ошибка. Попробуйте позже." + +#: cps/web.py:2322 +msgid "Your e-mail is not allowed to register" +msgstr "Ваш e-mail не подходит для регистрации" + +#: cps/web.py:2325 +msgid "Confirmation e-mail was send to your e-mail account." +msgstr "Письмо с подтверждением отправлено вам на e-mail" + +#: cps/web.py:2328 +msgid "This username or e-mail address is already in use." +msgstr "Этот никнейм или e-mail уже используются" + +#: cps/web.py:2345 cps/web.py:2441 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "Вы вошли как пользователь '%(nickname)s'" + +#: cps/web.py:2350 +msgid "Wrong Username or Password" +msgstr "Ошибка в имени пользователя или пароле" + +#: cps/web.py:2356 cps/web.py:2377 +msgid "login" +msgstr "войти" + +#: cps/web.py:2389 cps/web.py:2420 +msgid "Token not found" +msgstr "Ключ не найден" + +#: cps/web.py:2397 cps/web.py:2428 +msgid "Token has expired" +msgstr "Ключ просрочен" + +#: cps/web.py:2405 +msgid "Success! Please return to your device" +msgstr "Успешно! Пожалуйста, проверьте свое устройство" + +#: cps/web.py:2455 +msgid "Please configure the SMTP mail settings first..." +msgstr "Пожалуйста, сначала сконфигурируйте параметры SMTP" + +#: cps/web.py:2459 +#, python-format +msgid "Book successfully queued for sending to %(kindlemail)s" +msgstr "Книга успешно поставлена в очередь для отправки на %(kindlemail)s" + +#: cps/web.py:2463 +#, python-format +msgid "There was an error sending this book: %(res)s" +msgstr "Ошибка при отправке книги: %(res)s" + +#: cps/web.py:2465 cps/web.py:3255 +msgid "Please configure your kindle e-mail address first..." +msgstr "Пожалуйста, сначала настройте e-mail на вашем kindle..." + +#: cps/web.py:2476 cps/web.py:2528 +msgid "Invalid shelf specified" +msgstr "Указана неверная полка" + +#: cps/web.py:2483 +#, python-format +msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2491 +msgid "You are not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2500 +#, python-format +msgid "Book is already part of the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2514 +#, python-format +msgid "Book has been added to shelf: %(sname)s" +msgstr "Книга добавлена на книжную полку: %(sname)s" + +#: cps/web.py:2533 +#, python-format +msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgstr "Вам не разрешено добавлять книгу на полку: %(name)s" + +#: cps/web.py:2538 +msgid "User is not allowed to edit public shelves" +msgstr "Пользователь не может редактировать общедоступные полки" + +#: cps/web.py:2556 +#, python-format +msgid "Books are already part of the shelf: %(name)s" +msgstr "Книги уже размещены на полке: %(name)s" + +#: cps/web.py:2570 +#, python-format +msgid "Books have been added to shelf: %(sname)s" +msgstr "Книги добавлены в полку: %(sname)s" + +#: cps/web.py:2572 +#, python-format +msgid "Could not add books to shelf: %(sname)s" +msgstr "Не удалось добавить книги на полку: %(sname)s" + +#: cps/web.py:2609 +#, python-format +msgid "Book has been removed from shelf: %(sname)s" +msgstr "Книга удалена с полки: %(sname)s" + +#: cps/web.py:2615 +#, python-format +msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgstr "Извините, вы не можете удалить книгу с полки: %(sname)s" + +#: cps/web.py:2635 cps/web.py:2659 +#, python-format +msgid "A shelf with the name '%(title)s' already exists." +msgstr "Полка с названием '%(title)s' уже существует." + +#: cps/web.py:2640 +#, python-format +msgid "Shelf %(title)s created" +msgstr "Создана полка %(title)s" + +#: cps/web.py:2642 cps/web.py:2670 +msgid "There was an error" +msgstr "Произошла ошибка" + +#: cps/web.py:2643 cps/web.py:2645 +msgid "create a shelf" +msgstr "создать полку" + +#: cps/web.py:2668 +#, python-format +msgid "Shelf %(title)s changed" +msgstr "Колка %(title)s изменена" + +#: cps/web.py:2671 cps/web.py:2673 +msgid "Edit a shelf" +msgstr "Изменить полку" + +#: cps/web.py:2694 +#, python-format +msgid "successfully deleted shelf %(name)s" +msgstr "удачно удалена полка %(name)s" + +#: cps/web.py:2721 +#, python-format +msgid "Shelf: '%(name)s'" +msgstr "Полка: '%(name)s'" + +#: cps/web.py:2724 +msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "Ошибка открытия Полки. Полка не существует или недоступна" + +#: cps/web.py:2755 +#, python-format +msgid "Change order of Shelf: '%(name)s'" +msgstr "Изменить расположение полки '%(name)s'" + +#: cps/web.py:2784 cps/web.py:3207 +msgid "E-mail is not from valid domain" +msgstr "E-mail не из существующей доменной зоны" + +#: cps/web.py:2786 cps/web.py:2829 cps/web.py:2832 +#, python-format +msgid "%(name)s's profile" +msgstr "Профиль %(name)s" + +#: cps/web.py:2827 +msgid "Found an existing account for this e-mail address." +msgstr "Этот адрес электронной почты уже зарегистрирован." + +#: cps/web.py:2830 +msgid "Profile updated" +msgstr "Профиль обновлён" + +#: cps/web.py:2858 +msgid "Admin page" +msgstr "Администрирование" + +#: cps/web.py:2938 cps/web.py:3112 +msgid "Calibre-Web configuration updated" +msgstr "Конфигурация Calibre-Web обновлена" + +#: cps/templates/admin.html:100 cps/web.py:2951 +msgid "UI Configuration" +msgstr "Настройка интерфейса" + +#: cps/web.py:2969 +msgid "Import of optional Google Drive requirements missing" +msgstr "Импорт дополнительных требований к Google Диску отсутствует" + +#: cps/web.py:2972 +msgid "client_secrets.json is missing or not readable" +msgstr "client_secrets.json отсутствует или его невозможно прочесть" + +#: cps/web.py:2977 cps/web.py:3004 +msgid "client_secrets.json is not configured for web application" +msgstr "client_secrets.json не настроен для веб-приложения" + +#: cps/templates/admin.html:99 cps/web.py:3007 cps/web.py:3033 cps/web.py:3045 +#: cps/web.py:3088 cps/web.py:3103 cps/web.py:3120 cps/web.py:3127 +#: cps/web.py:3142 +msgid "Basic Configuration" +msgstr "Настройки сервера" + +#: cps/web.py:3030 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "Неверное расположение файла-ключа, введите правильный путь" + +#: cps/web.py:3042 +msgid "Certfile location is not valid, please enter correct path" +msgstr "Неверное расположение сертификата, введите правильный путь" + +#: cps/web.py:3085 +msgid "Logfile location is not valid, please enter correct path" +msgstr "Неверное расположение лог-файла, введите правильный путь" + +#: cps/web.py:3124 +msgid "DB location is not valid, please enter correct path" +msgstr "Неверное расположение базы данных, введите правильный путь" + +#: cps/templates/admin.html:33 cps/web.py:3203 cps/web.py:3209 cps/web.py:3225 +msgid "Add new user" +msgstr "Добавить пользователя" + +#: cps/web.py:3215 +#, python-format +msgid "User '%(user)s' created" +msgstr "Пользователь '%(user)s' добавлен" + +#: cps/web.py:3219 +msgid "Found an existing account for this e-mail address or nickname." +msgstr "Для этого адреса электронной почты или логина уже есть аккаунт." + +#: cps/web.py:3243 cps/web.py:3257 +msgid "E-mail server settings updated" +msgstr "Настройки E-mail сервера обновлены" + +#: cps/web.py:3250 +#, python-format +msgid "Test e-mail successfully send to %(kindlemail)s" +msgstr "Тестовое письмо успешно отправлено на %(kindlemail)s" + +#: cps/web.py:3253 +#, python-format +msgid "There was an error sending the Test e-mail: %(res)s" +msgstr "Произошла ошибка при отправке тестового письма на: %(res)s" + +#: cps/web.py:3258 +msgid "Edit e-mail server settings" +msgstr "Изменить настройки e-mail сервера" + +#: cps/web.py:3283 +#, python-format +msgid "User '%(nick)s' deleted" +msgstr "Пользователь '%(nick)s' удалён" + +#: cps/web.py:3392 +#, python-format +msgid "User '%(nick)s' updated" +msgstr "Пользователь '%(nick)s' обновлён" + +#: cps/web.py:3395 +msgid "An unknown error occured." +msgstr "Произошла неизвестная ошибка." + +#: cps/web.py:3397 +#, python-format +msgid "Edit User %(nick)s" +msgstr "Изменить пользователя %(nick)s" + +#: cps/web.py:3414 +#, python-format +msgid "Password for user %(user)s reset" +msgstr "Пароль для пользователя %(user)s сброшен" + +#: cps/web.py:3428 cps/web.py:3629 +msgid "Error opening eBook. File does not exist or file is not accessible" +msgstr "Ошибка при открытии eBook. Файл не существует или файл недоступен" + +#: cps/web.py:3453 cps/web.py:3912 +msgid "edit metadata" +msgstr "изменить метаданные" + +#: cps/web.py:3546 cps/web.py:3782 +#, python-format +msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" +msgstr "Запрещена загрузка файлов с расширением '%(ext)s'" + +#: cps/web.py:3550 cps/web.py:3786 +msgid "File to be uploaded must have an extension" +msgstr "Загружаемый файл должен иметь расширение" + +#: cps/web.py:3562 cps/web.py:3806 +#, python-format +msgid "Failed to create path %(path)s (Permission denied)." +msgstr "Ошибка при создании пути %(path)s (Доступ запрещён)." + +#: cps/web.py:3567 +#, python-format +msgid "Failed to store file %(file)s." +msgstr "Не удалось сохранить файл %(file)s." + +#: cps/web.py:3583 +#, python-format +msgid "File format %(ext)s added to %(book)s" +msgstr "Формат файла %(ext)s добавлен в %(book)s" + +#: cps/web.py:3601 +#, python-format +msgid "Failed to create path for cover %(path)s (Permission denied)." +msgstr "Не удалось создать путь для обложки %(path)s (Доступ запрещён)." + +#: cps/web.py:3608 +#, python-format +msgid "Failed to store cover-file %(cover)s." +msgstr "Не удалось сохранить файл обложки %(cover)s." + +#: cps/web.py:3611 +msgid "Cover-file is not a valid image file" +msgstr "Файл обложки не соответствует изображению" + +#: cps/web.py:3641 cps/web.py:3650 cps/web.py:3654 +msgid "unknown" +msgstr "неизвестно" + +#: cps/web.py:3673 +msgid "Cover is not a jpg file, can't save" +msgstr "Обложка не jpg файл, невозможно сохранить" + +#: cps/web.py:3721 +#, python-format +msgid "%(langname)s is not a valid language" +msgstr "%(langname)s не допустимый язык" + +#: cps/web.py:3752 +msgid "Metadata successfully updated" +msgstr "" + +#: cps/web.py:3761 +msgid "Error editing book, please check logfile for details" +msgstr "Ошибка редактирования книги. Пожалуйста, проверьте лог-файл для дополнительной информации" + +#: cps/web.py:3811 +#, python-format +msgid "Failed to store file %(file)s (Permission denied)." +msgstr "Ошибка записи файла %(file)s (Доступ запрещён)." + +#: cps/web.py:3816 +#, python-format +msgid "Failed to delete file %(file)s (Permission denied)." +msgstr "Ошибка удаления файла %(file)s (Доступ запрещён)." + +#: cps/web.py:3898 +#, python-format +msgid "File %(file)s uploaded" +msgstr "Файл %(file)s загружен" + +#: cps/web.py:3928 +msgid "Source or destination format for conversion missing" +msgstr "Исходный или целевой формат для конвертирования отсутствует" + +#: cps/web.py:3938 +#, python-format +msgid "Book successfully queued for converting to %(book_format)s" +msgstr "Книга успешно поставлена в очередь для конвертирования в %(book_format)s" + +#: cps/web.py:3942 +#, python-format +msgid "There was an error converting this book: %(res)s" +msgstr "Произошла ошибка при конвертирования этой книги: %(res)s" + +#: cps/worker.py:287 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "Ошибка Ebook-конвертора: %(error)s" + +#: cps/worker.py:298 +#, python-format +msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" +msgstr "Kindlegen - неудачно, с Ошибкой %(error)s. Сообщение: %(message)s" + +#: cps/templates/admin.html:6 +msgid "User list" +msgstr "Список пользователей" + +#: cps/templates/admin.html:9 +msgid "Nickname" +msgstr "Имя пользователя" + +#: cps/templates/admin.html:10 +msgid "E-mail" +msgstr "Почта" + +#: cps/templates/admin.html:11 +msgid "Kindle" +msgstr "Kindle" + +#: cps/templates/admin.html:12 +msgid "DLS" +msgstr "DLS" + +#: cps/templates/admin.html:13 cps/templates/layout.html:74 +msgid "Admin" +msgstr "Управление" + +#: cps/templates/admin.html:14 cps/templates/detail.html:22 +#: cps/templates/detail.html:31 +msgid "Download" +msgstr "Скачать" + +#: cps/templates/admin.html:15 cps/templates/layout.html:64 +msgid "Upload" +msgstr "Загрузить" + +#: cps/templates/admin.html:16 +msgid "Edit" +msgstr "Редактировать" + +#: cps/templates/admin.html:39 +msgid "SMTP e-mail server settings" +msgstr "Настройки SMTP-сервера" + +#: cps/templates/admin.html:42 cps/templates/email_edit.html:11 +msgid "SMTP hostname" +msgstr "SMTP-сервер" + +#: cps/templates/admin.html:43 +msgid "SMTP port" +msgstr "SMTP-порт" + +#: cps/templates/admin.html:44 +msgid "SSL" +msgstr "SSL" + +#: cps/templates/admin.html:45 cps/templates/email_edit.html:27 +msgid "SMTP login" +msgstr "SMTP-логин" + +#: cps/templates/admin.html:46 +msgid "From mail" +msgstr "Отправитель" + +#: cps/templates/admin.html:56 +msgid "Change SMTP settings" +msgstr "Изменить настройки SMTP" + +#: cps/templates/admin.html:62 +msgid "Configuration" +msgstr "Настройки сервера" + +#: cps/templates/admin.html:65 +msgid "Calibre DB dir" +msgstr "Папка Calibre DB" + +#: cps/templates/admin.html:69 +msgid "Log level" +msgstr "Уровень лога" + +#: cps/templates/admin.html:73 +msgid "Port" +msgstr "Порт" + +#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23 +msgid "Books per page" +msgstr "Количество книг на странице" + +#: cps/templates/admin.html:83 +msgid "Uploading" +msgstr "Загрузка на сервер" + +#: cps/templates/admin.html:87 +msgid "Anonymous browsing" +msgstr "Анонимный просмотр" + +#: cps/templates/admin.html:91 +msgid "Public registration" +msgstr "Публичная регистрация" + +#: cps/templates/admin.html:95 cps/templates/remote_login.html:4 +msgid "Remote login" +msgstr "Удалённый логин" + +#: cps/templates/admin.html:106 +msgid "Administration" +msgstr "Управление" + +#: cps/templates/admin.html:107 +msgid "Reconnect to Calibre DB" +msgstr "Переподключиться к БД Calibre" + +#: cps/templates/admin.html:108 +msgid "Restart Calibre-Web" +msgstr "Перезагрузить Calibre-Web" + +#: cps/templates/admin.html:109 +msgid "Stop Calibre-Web" +msgstr "Остановить Calibre-Web" + +#: cps/templates/admin.html:115 +msgid "Update" +msgstr "Обновление" + +#: cps/templates/admin.html:119 +msgid "Version" +msgstr "Версия" + +#: cps/templates/admin.html:120 +msgid "Details" +msgstr "Подробности" + +#: cps/templates/admin.html:126 +msgid "Current version" +msgstr "Текущая версия" + +#: cps/templates/admin.html:132 +msgid "Check for update" +msgstr "Проверка обновлений" + +#: cps/templates/admin.html:133 +msgid "Perform Update" +msgstr "Установить обновления" + +#: cps/templates/admin.html:145 +msgid "Do you really want to restart Calibre-Web?" +msgstr "Вы действительно хотите перезагрузить Calibre-Web?" + +#: cps/templates/admin.html:150 cps/templates/admin.html:164 +#: cps/templates/admin.html:184 cps/templates/shelf.html:61 +msgid "Ok" +msgstr "Ok" + +#: cps/templates/admin.html:151 cps/templates/admin.html:165 +#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200 +#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168 +#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75 +#: cps/templates/shelf.html:62 cps/templates/shelf_edit.html:19 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155 +msgid "Back" +msgstr "Назад" + +#: cps/templates/admin.html:163 +msgid "Do you really want to stop Calibre-Web?" +msgstr "Вы действительно хотите остановить Calibre-Web?" + +#: cps/templates/admin.html:175 +msgid "Updating, please do not reload page" +msgstr "Установка обновлений, пожалуйста, не обновляйте страницу." + +#: cps/templates/author.html:15 +msgid "via" +msgstr "с помощью" + +#: cps/templates/author.html:23 +msgid "In Library" +msgstr "В библиотеке" + +#: cps/templates/author.html:69 +msgid "More by" +msgstr "Ещё от" + +#: cps/templates/book_edit.html:16 +msgid "Delete Book" +msgstr "Удалить книгу" + +#: cps/templates/book_edit.html:19 +msgid "Delete formats:" +msgstr "Удалить форматы:" + +#: cps/templates/book_edit.html:22 cps/templates/book_edit.html:199 +#: cps/templates/email_edit.html:73 cps/templates/email_edit.html:74 +msgid "Delete" +msgstr "Удалить" + +#: cps/templates/book_edit.html:30 +msgid "Convert book format:" +msgstr "Конвертировать формат книги:" + +#: cps/templates/book_edit.html:34 +msgid "Convert from:" +msgstr "Конвертировать из:" + +#: cps/templates/book_edit.html:36 cps/templates/book_edit.html:43 +msgid "select an option" +msgstr "выбрать вариант" + +#: cps/templates/book_edit.html:41 +msgid "Convert to:" +msgstr "Конвертировать в:" + +#: cps/templates/book_edit.html:50 +msgid "Convert book" +msgstr "Конвертировать книгу" + +#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6 +msgid "Book Title" +msgstr "Название" + +#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:259 +#: cps/templates/book_edit.html:277 cps/templates/search_form.html:10 +msgid "Author" +msgstr "Автор" + +#: cps/templates/book_edit.html:67 cps/templates/book_edit.html:264 +#: cps/templates/book_edit.html:279 cps/templates/search_form.html:106 +msgid "Description" +msgstr "Описание" + +#: cps/templates/book_edit.html:71 cps/templates/search_form.html:33 +msgid "Tags" +msgstr "Теги" + +#: cps/templates/book_edit.html:75 cps/templates/layout.html:157 +#: cps/templates/search_form.html:53 +msgid "Series" +msgstr "Серии" + +#: cps/templates/book_edit.html:79 +msgid "Series id" +msgstr "Серия" + +#: cps/templates/book_edit.html:83 +msgid "Rating" +msgstr "Рейтинг" + +#: cps/templates/book_edit.html:87 +msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +msgstr "URL обложки(jpg, обложка загружается и сохраняется в базе данных, после этого поле снова пустое)" + +#: cps/templates/book_edit.html:91 +msgid "Upload Cover from local drive" +msgstr "Загрузить обложку с диска" + +#: cps/templates/book_edit.html:96 cps/templates/detail.html:135 +msgid "Publishing date" +msgstr "Опубликовано" + +#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:278 cps/templates/detail.html:127 +#: cps/templates/search_form.html:14 +msgid "Publisher" +msgstr "Издатель" + +#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31 +msgid "Language" +msgstr "Язык" + +#: cps/templates/book_edit.html:117 cps/templates/search_form.html:117 +msgid "Yes" +msgstr "Да" + +#: cps/templates/book_edit.html:118 cps/templates/search_form.html:118 +msgid "No" +msgstr "Нет" + +#: cps/templates/book_edit.html:164 +msgid "Upload format" +msgstr "Загружаемый формат" + +#: cps/templates/book_edit.html:173 +msgid "view book after edit" +msgstr "смотреть книгу после редактирования" + +#: cps/templates/book_edit.html:176 cps/templates/book_edit.html:212 +msgid "Get metadata" +msgstr "Получить метаданные" + +#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210 +#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20 +#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17 +#: cps/templates/user_edit.html:153 +msgid "Submit" +msgstr "Отправить" + +#: cps/templates/book_edit.html:191 +msgid "Are you really sure?" +msgstr "Вы действительно уверены?" + +#: cps/templates/book_edit.html:194 +msgid "Book will be deleted from Calibre database" +msgstr "Книга будет удалена из БД Calibre" + +#: cps/templates/book_edit.html:195 +msgid "and from hard disk" +msgstr "и с диска" + +#: cps/templates/book_edit.html:215 +msgid "Keyword" +msgstr "Ключевое слово" + +#: cps/templates/book_edit.html:216 +msgid " Search keyword " +msgstr " Поиск по ключевому слову " + +#: cps/templates/book_edit.html:218 cps/templates/layout.html:46 +msgid "Go!" +msgstr "Старт!" + +#: cps/templates/book_edit.html:222 +msgid "Click the cover to load metadata to the form" +msgstr "Нажмите на обложку, чтобы получить метаданные" + +#: cps/templates/book_edit.html:234 cps/templates/book_edit.html:274 +msgid "Loading..." +msgstr "Загрузка..." + +#: cps/templates/book_edit.html:239 cps/templates/layout.html:224 +msgid "Close" +msgstr "Закрыть" + +#: cps/templates/book_edit.html:266 cps/templates/book_edit.html:280 +msgid "Source" +msgstr "Источник" + +#: cps/templates/book_edit.html:275 +msgid "Search error!" +msgstr "Ошибка поиска!" + +#: cps/templates/book_edit.html:276 +msgid "No Result(s) found! Please try aonther keyword." +msgstr "Результат(ы) не найдены! Попробуйте другое ключевое слово." + +#: cps/templates/config_edit.html:12 +msgid "Library Configuration" +msgstr "Настройки библотеки" + +#: cps/templates/config_edit.html:19 +msgid "Location of Calibre database" +msgstr "Расположение БД Calibre" + +#: cps/templates/config_edit.html:24 +msgid "Use Google Drive?" +msgstr "Использовать Google Drive?" + +#: cps/templates/config_edit.html:30 +msgid "Google Drive config problem" +msgstr "Проблема с настройкой Google Drive" + +#: cps/templates/config_edit.html:36 +msgid "Authenticate Google Drive" +msgstr "Аутентификация Google Drive" + +#: cps/templates/config_edit.html:40 +msgid "Please finish Google Drive setup after login" +msgstr "Завершите настройку Google Диска после входа в систему" + +#: cps/templates/config_edit.html:44 +msgid "Google Drive Calibre folder" +msgstr "Google Диск Calibre папка" + +#: cps/templates/config_edit.html:52 +msgid "Metadata Watch Channel ID" +msgstr "ID Канала Просмотра Метаданных" + +#: cps/templates/config_edit.html:55 +msgid "Revoke" +msgstr "Отозвано" + +#: cps/templates/config_edit.html:73 +msgid "Server Configuration" +msgstr "Настройки сервера" + +#: cps/templates/config_edit.html:80 +msgid "Server Port" +msgstr "Порт сервера" + +#: cps/templates/config_edit.html:84 +msgid "SSL certfile location (leave it empty for non-SSL Servers)" +msgstr "Расположение SSL сертификата (оставьте его пустым для серверов без SSL)" + +#: cps/templates/config_edit.html:88 +msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" +msgstr "Расположение SSL файла-ключа (оставьте его пустым для серверов без SSL)" + +#: cps/templates/config_edit.html:99 +msgid "Logfile Configuration" +msgstr "Настройки лог-файла" + +#: cps/templates/config_edit.html:106 +msgid "Log Level" +msgstr "Уровень Логирования" + +#: cps/templates/config_edit.html:115 +msgid "Location and name of logfile (calibre-web.log for no entry)" +msgstr "Расположение и имя лог-файла (не вводите calibre-web.log)" + +#: cps/templates/config_edit.html:126 +msgid "Feature Configuration" +msgstr "Дополнительный Настройки" + +#: cps/templates/config_edit.html:134 +msgid "Enable uploading" +msgstr "Разрешить загрузку на сервер" + +#: cps/templates/config_edit.html:138 +msgid "Enable anonymous browsing" +msgstr "Разрешить анонимный просмотр" + +#: cps/templates/config_edit.html:142 +msgid "Enable public registration" +msgstr "Разрешить публичную регистрацию" + +#: cps/templates/config_edit.html:146 +msgid "Enable remote login (\"magic link\")" +msgstr "Включить удаленный логин (\"magic link\")" + +#: cps/templates/config_edit.html:151 +msgid "Use" +msgstr "Использовать" + +#: cps/templates/config_edit.html:152 +msgid "Obtain an API Key" +msgstr "Получить ключ API" + +#: cps/templates/config_edit.html:156 +msgid "Goodreads API Key" +msgstr "Ключ API Goodreads" + +#: cps/templates/config_edit.html:160 +msgid "Goodreads API Secret" +msgstr "Goodreads API Секрет" + +#: cps/templates/config_edit.html:173 +msgid "External binaries" +msgstr "Внешние двоичные файлы" + +#: cps/templates/config_edit.html:181 +msgid "No converter" +msgstr "Нет конвертера" + +#: cps/templates/config_edit.html:183 +msgid "Use Kindlegen" +msgstr "Использовать Kindlegen" + +#: cps/templates/config_edit.html:185 +msgid "Use calibre's ebook converter" +msgstr "Использовать конвертер calibre's ebook" + +#: cps/templates/config_edit.html:189 +msgid "E-Book converter settings" +msgstr "Настройки конвертера E-Book" + +#: cps/templates/config_edit.html:193 +msgid "Path to convertertool" +msgstr "Путь к конвертеру" + +#: cps/templates/config_edit.html:199 +msgid "Location of Unrar binary" +msgstr "Расположение двоичного файла Unrar" + +#: cps/templates/config_edit.html:215 cps/templates/layout.html:82 +#: cps/templates/login.html:4 +msgid "Login" +msgstr "Логин" + +#: cps/templates/config_view_edit.html:12 +msgid "View Configuration" +msgstr "Просмотреть Конфигурацию" + +#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 +#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 +msgid "Title" +msgstr "Заголовок" + +#: cps/templates/config_view_edit.html:27 +msgid "No. of random books to show" +msgstr "Количество отображаемых случайных книг" + +#: cps/templates/config_view_edit.html:31 +msgid "Regular expression for ignoring columns" +msgstr "Regexp для игнорирования столбцов" + +#: cps/templates/config_view_edit.html:35 +msgid "Link read/unread status to Calibre column" +msgstr "Ссылка на чтение/непрочитанный статус столбца Caliber" + +#: cps/templates/config_view_edit.html:44 +msgid "Regular expression for title sorting" +msgstr "Regexp для сортировки по названию" + +#: cps/templates/config_view_edit.html:48 +msgid "Tags for Mature Content" +msgstr "Теги для Зрелого Контента" + +#: cps/templates/config_view_edit.html:62 +msgid "Default settings for new users" +msgstr "Настройки по умолчанию для новых пользователей" + +#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110 +msgid "Admin user" +msgstr "Управление сервером" + +#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119 +msgid "Allow Downloads" +msgstr "Разрешить скачивание с сервера" + +#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123 +msgid "Allow Uploads" +msgstr "Разрешить загрузку на сервер" + +#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127 +msgid "Allow Edit" +msgstr "Разрешить редактирование книг" + +#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131 +msgid "Allow Delete books" +msgstr "Разрешить удаление книг" + +#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136 +msgid "Allow Changing Password" +msgstr "Разрешить смену пароля" + +#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140 +msgid "Allow Editing Public Shelfs" +msgstr "Разрешить редактирование публичных книжных полок" + +#: cps/templates/config_view_edit.html:104 +msgid "Default visibilities for new users" +msgstr "Видимость для новых пользователей(по умолчанию)" + +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58 +msgid "Show random books" +msgstr "Показывать случайные книги" + +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62 +msgid "Show recent books" +msgstr "Показывать недавние книги" + +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66 +msgid "Show sorted books" +msgstr "Показывать отсортированные книги" + +#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70 +msgid "Show hot books" +msgstr "Показывать популярные книги" + +#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74 +msgid "Show best rated books" +msgstr "Показывать книги с наивысшим рейтингом" + +#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78 +msgid "Show language selection" +msgstr "Показывать выбор языка" + +#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82 +msgid "Show series selection" +msgstr "Показывать выбор серии" + +#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86 +msgid "Show category selection" +msgstr "Показывать выбор категории" + +#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90 +msgid "Show author selection" +msgstr "Показывать выбор автора" + +#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94 +msgid "Show publisher selection" +msgstr "" + +#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98 +msgid "Show read and unread" +msgstr "Показывать прочитанные и непрочитанные" + +#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102 +msgid "Show random books in detail view" +msgstr "Показывать случайные книги при просмотре деталей" + +#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115 +msgid "Show mature content" +msgstr "Показывать взрослый контент" + +#: cps/templates/detail.html:49 +msgid "Read in browser" +msgstr "Открыть в браузере" + +#: cps/templates/detail.html:88 +msgid "Book" +msgstr "Книга" + +#: cps/templates/detail.html:88 +msgid "of" +msgstr "из" + +#: cps/templates/detail.html:94 +msgid "language" +msgstr "Язык" + +#: cps/templates/detail.html:172 +msgid "Read" +msgstr "Прочитано" + +#: cps/templates/detail.html:182 +msgid "Description:" +msgstr "Описание:" + +#: cps/templates/detail.html:195 cps/templates/search.html:14 +msgid "Add to shelf" +msgstr "Добавить на книжную полку" + +#: cps/templates/detail.html:257 +msgid "Edit metadata" +msgstr "Редактировать метаданные" + +#: cps/templates/email_edit.html:15 +msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +msgstr "SMTP-порт (обычно 25 для SMTP, 465 для SSL и 587 для STARTTLS)" + +#: cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "Шифрование" + +#: cps/templates/email_edit.html:21 +msgid "None" +msgstr "Нет" + +#: cps/templates/email_edit.html:22 +msgid "STARTTLS" +msgstr "STARTTLS" + +#: cps/templates/email_edit.html:23 +msgid "SSL/TLS" +msgstr "SSL/TLS" + +#: cps/templates/email_edit.html:31 +msgid "SMTP password" +msgstr "Пароль SMTP" + +#: cps/templates/email_edit.html:35 +msgid "From e-mail" +msgstr "Адрес отправителя" + +#: cps/templates/email_edit.html:38 +msgid "Save settings" +msgstr "Сохранить настройки" + +#: cps/templates/email_edit.html:39 +msgid "Save settings and send Test E-Mail" +msgstr "Сохранить настройки и отправить тестовое письмо" + +#: cps/templates/email_edit.html:43 +msgid "Allowed domains for registering" +msgstr "Допустимые домены для регистрации" + +#: cps/templates/email_edit.html:47 +msgid "Enter domainname" +msgstr "Введите доменное имя" + +#: cps/templates/email_edit.html:55 +msgid "Add Domain" +msgstr "Добавить Домен" + +#: cps/templates/email_edit.html:58 +msgid "Add" +msgstr "Добавить" + +#: cps/templates/email_edit.html:72 +msgid "Do you really want to delete this domain rule?" +msgstr "Вы действительно желаете удалить это правило домена?" + +#: cps/templates/feed.xml:21 cps/templates/layout.html:208 +msgid "Next" +msgstr "Дальше" + +#: cps/templates/feed.xml:33 cps/templates/index.xml:11 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 +msgid "Search" +msgstr "Поиск" + +#: cps/templates/index.html:5 +msgid "Discover (Random Books)" +msgstr "Обзор (Случайные Книги)" + +#: cps/templates/index.xml:6 +msgid "Start" +msgstr "Старт" + +#: cps/templates/index.xml:18 cps/templates/layout.html:139 +msgid "Hot Books" +msgstr "Популярные Книги" + +#: cps/templates/index.xml:22 +msgid "Popular publications from this catalog based on Downloads." +msgstr "Популярные книги в этом каталоге, на основе количества Скачиваний" + +#: cps/templates/index.xml:25 cps/templates/layout.html:142 +msgid "Best rated Books" +msgstr "Книги с наилучшим рейтингом" + +#: cps/templates/index.xml:29 +msgid "Popular publications from this catalog based on Rating." +msgstr "Популярные книги из этого каталога на основании Рейтинга" + +#: cps/templates/index.xml:32 +msgid "New Books" +msgstr "Новые Книги" + +#: cps/templates/index.xml:36 +msgid "The latest Books" +msgstr "Последние Книги" + +#: cps/templates/index.xml:43 +msgid "Show Random Books" +msgstr "Показывать Случайные Сниги" + +#: cps/templates/index.xml:62 cps/templates/layout.html:160 +msgid "Authors" +msgstr "Авторы" + +#: cps/templates/index.xml:66 +msgid "Books ordered by Author" +msgstr "Книги, отсортированные по Автору" + +#: cps/templates/index.xml:69 cps/templates/layout.html:163 +msgid "Publishers" +msgstr "" + +#: cps/templates/index.xml:73 +msgid "Books ordered by publisher" +msgstr "" + +#: cps/templates/index.xml:80 +msgid "Books ordered by category" +msgstr "Книги, отсортированные по категории" + +#: cps/templates/index.xml:87 +msgid "Books ordered by series" +msgstr "Книги, отсортированные по серии" + +#: cps/templates/index.xml:90 cps/templates/layout.html:169 +msgid "Public Shelves" +msgstr "Общие полки" + +#: cps/templates/index.xml:94 +msgid "Books organized in public shelfs, visible to everyone" +msgstr "Книги размещены на полках, и доступны всем" + +#: cps/templates/index.xml:98 cps/templates/layout.html:173 +msgid "Your Shelves" +msgstr "Ваши полки" + +#: cps/templates/index.xml:102 +msgid "User's own shelfs, only visible to the current user himself" +msgstr "Пользовательские полки, видимые только самому пользователю" + +#: cps/templates/layout.html:33 +msgid "Toggle navigation" +msgstr "Включить навигацию" + +#: cps/templates/layout.html:54 +msgid "Advanced Search" +msgstr "Расширенный поиск" + +#: cps/templates/layout.html:78 +msgid "Logout" +msgstr "Выход" + +#: cps/templates/layout.html:83 cps/templates/register.html:14 +msgid "Register" +msgstr "Зарегистрироваться" + +#: cps/templates/layout.html:108 +msgid "Uploading..." +msgstr "Загружается..." + +#: cps/templates/layout.html:109 +msgid "please don't refresh the page" +msgstr "пожалуйста не обновляйте страницу" + +#: cps/templates/layout.html:120 +msgid "Browse" +msgstr "Просмотр" + +#: cps/templates/layout.html:122 +msgid "Recently Added" +msgstr "Недавно Добавленные" + +#: cps/templates/layout.html:127 +msgid "Sorted Books" +msgstr "Сортировка Книг" + +#: cps/templates/layout.html:131 cps/templates/layout.html:132 +#: cps/templates/layout.html:133 cps/templates/layout.html:134 +msgid "Sort By" +msgstr "Отсортировано по" + +#: cps/templates/layout.html:131 +msgid "Newest" +msgstr "Новинки" + +#: cps/templates/layout.html:132 +msgid "Oldest" +msgstr "Старое" + +#: cps/templates/layout.html:133 +msgid "Ascending" +msgstr "По возрастанию" + +#: cps/templates/layout.html:134 +msgid "Descending" +msgstr "По убыванию" + +#: cps/templates/layout.html:151 +msgid "Discover" +msgstr "Обзор" + +#: cps/templates/layout.html:154 +msgid "Categories" +msgstr "Категории" + +#: cps/templates/layout.html:166 cps/templates/search_form.html:74 +msgid "Languages" +msgstr "Языки" + +#: cps/templates/layout.html:178 +msgid "Create a Shelf" +msgstr "Создать книжную полку" + +#: cps/templates/layout.html:179 cps/templates/stats.html:3 +msgid "About" +msgstr "О программе" + +#: cps/templates/layout.html:193 +msgid "Previous" +msgstr "Предыдущий" + +#: cps/templates/layout.html:220 +msgid "Book Details" +msgstr "Подробнее о книге" + +#: cps/templates/login.html:8 cps/templates/login.html:9 +#: cps/templates/register.html:7 cps/templates/user_edit.html:8 +msgid "Username" +msgstr "Имя пользователя" + +#: cps/templates/login.html:12 cps/templates/login.html:13 +#: cps/templates/user_edit.html:21 +msgid "Password" +msgstr "Пароль" + +#: cps/templates/login.html:17 +msgid "Remember me" +msgstr "Запомнить меня" + +#: cps/templates/login.html:22 +msgid "Log in with magic link" +msgstr "Войти через магическую ссылку" + +#: cps/templates/osd.xml:5 +msgid "Calibre-Web ebook catalog" +msgstr "Каталог электронных книг Caliber-Web" + +#: cps/templates/read.html:69 cps/templates/readcbr.html:79 +#: cps/templates/readcbr.html:103 +msgid "Settings" +msgstr "Настройки" + +#: cps/templates/read.html:72 +msgid "Reflow text when sidebars are open." +msgstr "Обновить размещение текста при открытии боковой панели" + +#: cps/templates/readcbr.html:84 +msgid "Keyboard Shortcuts" +msgstr "Горячие клавиши" + +#: cps/templates/readcbr.html:87 +msgid "Previous Page" +msgstr "Предыдущая страница" + +#: cps/templates/readcbr.html:88 +msgid "Next Page" +msgstr "Следующая страница" + +#: cps/templates/readcbr.html:89 +msgid "Scale to Best" +msgstr "Масштабировать до лучшего" + +#: cps/templates/readcbr.html:90 +msgid "Scale to Width" +msgstr "Масштабироваать по ширине" + +#: cps/templates/readcbr.html:91 +msgid "Scale to Height" +msgstr "Масштабировать по высоте" + +#: cps/templates/readcbr.html:92 +msgid "Scale to Native" +msgstr "Масштабировать до оригинала" + +#: cps/templates/readcbr.html:93 +msgid "Rotate Right" +msgstr "Повернуть Вправо" + +#: cps/templates/readcbr.html:94 +msgid "Rotate Left" +msgstr "Повернуть Влево" + +#: cps/templates/readcbr.html:95 +msgid "Flip Image" +msgstr "Перевернуть изображение" + +#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39 +msgid "Theme" +msgstr "Тема" + +#: cps/templates/readcbr.html:111 +msgid "Light" +msgstr "Светлая" + +#: cps/templates/readcbr.html:112 +msgid "Dark" +msgstr "Темная" + +#: cps/templates/readcbr.html:117 +msgid "Scale" +msgstr "Масштаб" + +#: cps/templates/readcbr.html:120 +msgid "Best" +msgstr "Лучшее" + +#: cps/templates/readcbr.html:121 +msgid "Width" +msgstr "Ширина" + +#: cps/templates/readcbr.html:122 +msgid "Height" +msgstr "Длина" + +#: cps/templates/readcbr.html:123 +msgid "Native" +msgstr "Оригинальный" + +#: cps/templates/readcbr.html:128 +msgid "Rotate" +msgstr "Повернуть" + +#: cps/templates/readcbr.html:139 +msgid "Flip" +msgstr "Перевернуть" + +#: cps/templates/readcbr.html:142 +msgid "Horizontal" +msgstr "Горизонтально" + +#: cps/templates/readcbr.html:143 +msgid "Vertical" +msgstr "Вертикально" + +#: cps/templates/readpdf.html:29 +msgid "PDF.js viewer" +msgstr "Просмотровщик PDF.js" + +#: cps/templates/readtxt.html:6 +msgid "Basic txt Reader" +msgstr "Средство для чтения txt-файлов" + +#: cps/templates/register.html:4 +msgid "Register a new account" +msgstr "Зарегистрировать новую учётную запись" + +#: cps/templates/register.html:8 +msgid "Choose a username" +msgstr "Выберите имя пользователя" + +#: cps/templates/register.html:11 cps/templates/user_edit.html:13 +msgid "E-mail address" +msgstr "E-mail адрес" + +#: cps/templates/register.html:12 +msgid "Your email address" +msgstr "Ваш email-адрес" + +#: cps/templates/remote_login.html:6 +msgid "Using your another device, visit" +msgstr "Используйте другое устройство, посетите" + +#: cps/templates/remote_login.html:6 +msgid "and log in" +msgstr "и войти" + +#: cps/templates/remote_login.html:9 +msgid "Once you do so, you will automatically get logged in on this device." +msgstr "После этого вы автоматически войдете в систему на этом устройстве." + +#: cps/templates/search.html:5 +msgid "No Results for:" +msgstr "Ничего не найдено по запросу:" + +#: cps/templates/search.html:6 +msgid "Please try a different search" +msgstr "Попробуйте изменить критерии поиск" + +#: cps/templates/search.html:8 +msgid "Results for:" +msgstr "Результаты для:" + +#: cps/templates/search_form.html:19 +msgid "Publishing date from" +msgstr "Опубликовано от" + +#: cps/templates/search_form.html:26 +msgid "Publishing date to" +msgstr "Опубликовано до" + +#: cps/templates/search_form.html:43 +msgid "Exclude Tags" +msgstr "Исключить теги" + +#: cps/templates/search_form.html:63 +msgid "Exclude Series" +msgstr "Исключить серии" + +#: cps/templates/search_form.html:84 +msgid "Exclude Languages" +msgstr "Исключить языки" + +#: cps/templates/search_form.html:97 +msgid "Rating bigger than" +msgstr "Рейтинг больше чем" + +#: cps/templates/search_form.html:101 +msgid "Rating less than" +msgstr "Рейтинг меньше чем" + +#: cps/templates/shelf.html:7 +msgid "Delete this Shelf" +msgstr "Удалить эту книжную полку" + +#: cps/templates/shelf.html:8 +msgid "Edit Shelf" +msgstr "Изменить Полку" + +#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11 +msgid "Change order" +msgstr "Изменить порядок" + +#: cps/templates/shelf.html:56 +msgid "Do you really want to delete the shelf?" +msgstr "Вы действительно хотите удалить эту книжную полку?" + +#: cps/templates/shelf.html:59 +msgid "Shelf will be lost for everybody and forever!" +msgstr "Книжная полка будет безвозвратно удалена для всех" + +#: cps/templates/shelf_edit.html:13 +msgid "should the shelf be public?" +msgstr "сделать книжную полку доступной для всех?" + +#: cps/templates/shelf_order.html:5 +msgid "Drag 'n drop to rearrange order" +msgstr "Перетащите для изменения порядка" + +#: cps/templates/stats.html:7 +msgid "Calibre library statistics" +msgstr "Статистика библиотеки Calibre" + +#: cps/templates/stats.html:12 +msgid "Books in this Library" +msgstr "Книг в этой Библиотеке" + +#: cps/templates/stats.html:16 +msgid "Authors in this Library" +msgstr "Авторов в этой Библиотеке" + +#: cps/templates/stats.html:20 +msgid "Categories in this Library" +msgstr "Категорий в этой Библиотеке" + +#: cps/templates/stats.html:24 +msgid "Series in this Library" +msgstr "Серий в этой Библиотеке" + +#: cps/templates/stats.html:28 +msgid "Linked libraries" +msgstr "Установленное ПО" + +#: cps/templates/stats.html:32 +msgid "Program library" +msgstr "Название" + +#: cps/templates/stats.html:33 +msgid "Installed Version" +msgstr "Установленная версия" + +#: cps/templates/tasks.html:7 +msgid "Tasks list" +msgstr "Список задач" + +#: cps/templates/tasks.html:12 +msgid "User" +msgstr "Пользователь" + +#: cps/templates/tasks.html:14 +msgid "Task" +msgstr "Задача" + +#: cps/templates/tasks.html:15 +msgid "Status" +msgstr "Статус" + +#: cps/templates/tasks.html:16 +msgid "Progress" +msgstr "Прогресс" + +#: cps/templates/tasks.html:17 +msgid "Runtime" +msgstr "Время выполнения" + +#: cps/templates/tasks.html:18 +msgid "Starttime" +msgstr "Время начала" + +#: cps/templates/tasks.html:24 +msgid "Delete finished tasks" +msgstr "Удалить законченные задачи" + +#: cps/templates/tasks.html:25 +msgid "Hide all tasks" +msgstr "Скрыть все задачи" + +#: cps/templates/user_edit.html:18 +msgid "Reset user Password" +msgstr "Сбросить пароль пользователя" + +#: cps/templates/user_edit.html:27 +msgid "Kindle E-Mail" +msgstr "Адрес почты Kindle" + +#: cps/templates/user_edit.html:41 +msgid "Standard Theme" +msgstr "Стандартная тема" + +#: cps/templates/user_edit.html:42 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "caliBlur! Темная тема (Бета)" + +#: cps/templates/user_edit.html:47 +msgid "Show books with language" +msgstr "Показать книги на языках" + +#: cps/templates/user_edit.html:49 +msgid "Show all" +msgstr "Показать все" + +#: cps/templates/user_edit.html:147 +msgid "Delete this user" +msgstr "Удалить этого пользователя" + +#: cps/templates/user_edit.html:162 +msgid "Recent Downloads" +msgstr "Недавние скачивания" + +#~ msgid "E-mail: %s" +#~ msgstr "Почта: %s" + +#~ msgid "Current commit timestamp" +#~ msgstr "Текущая метка фиксации" + +#~ msgid "Newest commit timestamp" +#~ msgstr "Новая метка фиксации" + +#~ msgid "Choose a password" +#~ msgstr "Выберите пароль" + +#~ msgid "Convert: %(book)s" +#~ msgstr "Конвертировать: %(book)s" + +#~ msgid "Convert to %(format)s: %(book)s" +#~ msgstr "Конвертировать в %(format)s: %(book)s" + +#~ msgid "Files are replaced" +#~ msgstr "Файлы заменены" + +#~ msgid "Server is stopped" +#~ msgstr "Сервер остановлен" + +#~ msgid "Convertertool %(converter)s not found" +#~ msgstr "Инструмент конвертирования %(converter)s не найден" + diff --git a/src/cps/translations/sv/LC_MESSAGES/messages.mo b/src/cps/translations/sv/LC_MESSAGES/messages.mo new file mode 100644 index 0000000..0e52fbc Binary files /dev/null and b/src/cps/translations/sv/LC_MESSAGES/messages.mo differ diff --git a/src/cps/translations/sv/LC_MESSAGES/messages.po b/src/cps/translations/sv/LC_MESSAGES/messages.po new file mode 100644 index 0000000..019728f --- /dev/null +++ b/src/cps/translations/sv/LC_MESSAGES/messages.po @@ -0,0 +1,1964 @@ +# German translations for Calibre-Web. +# Copyright (C) 2016 Ozzie Isaacs +# This file is distributed under the same license as the Calibre-Web +# project. +# FIRST AUTHOR OzzieIsaacs, 2016. +msgid "" +msgstr "" +"Project-Id-Version: Calibre-Web\n" +"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" +"POT-Creation-Date: 2018-11-24 20:45+0100\n" +"PO-Revision-Date: 2018-11-23 02:57+0100\n" +"Last-Translator: Jonatan Nyberg \n" +"Language: sv\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134 +#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27 +msgid "not installed" +msgstr "inte installerad" + +#: cps/converter.py:22 cps/converter.py:38 +msgid "Excecution permissions missing" +msgstr "Utförande behörighet saknas" + +#: cps/converter.py:48 +msgid "not configured" +msgstr "inte konfigurerad" + +#: cps/helper.py:59 +#, python-format +msgid "%(format)s format not found for book id: %(book)d" +msgstr "%(format)s formatet hittades inte för bok-id: %(book)d" + +#: cps/helper.py:71 +#, python-format +msgid "%(format)s not found on Google Drive: %(fn)s" +msgstr "%(format)s hittades inte på Google Drive: %(fn)s" + +#: cps/helper.py:78 cps/helper.py:174 cps/templates/detail.html:49 +msgid "Send to Kindle" +msgstr "Skicka till Kindle" + +#: cps/helper.py:79 cps/helper.py:97 cps/helper.py:176 +msgid "This e-mail has been sent via Calibre-Web." +msgstr "Detta e-postmeddelande har skickats via Calibre-Web." + +#: cps/helper.py:90 +#, python-format +msgid "%(format)s not found: %(fn)s" +msgstr "%(format)s hittades inte: %(fn)s" + +#: cps/helper.py:95 +msgid "Calibre-Web test e-mail" +msgstr "Calibre-Web test e-post" + +#: cps/helper.py:96 +msgid "Test e-mail" +msgstr "Test e-post" + +#: cps/helper.py:112 +msgid "Get Started with Calibre-Web" +msgstr "Kom igång med Calibre-Web" + +#: cps/helper.py:113 +#, python-format +msgid "Registration e-mail for user: %(name)s" +msgstr "Registrera e-post för användare: %(name)s" + +#: cps/helper.py:126 cps/helper.py:128 cps/helper.py:130 cps/helper.py:138 +#: cps/helper.py:140 cps/helper.py:142 cps/helper.py:144 +#, python-format +msgid "Send %(format)s to Kindle" +msgstr "" + +#: cps/helper.py:132 +#, python-format +msgid "Send %(format)s to Kkindle" +msgstr "" + +#: cps/helper.py:148 cps/helper.py:152 +#, python-format +msgid "Convert %(orig)s to %(format)s and send to Kindle" +msgstr "" + +#: cps/helper.py:175 +#, python-format +msgid "E-mail: %(book)s" +msgstr "E-post: %(book)s" + +#: cps/helper.py:178 +msgid "The requested file could not be read. Maybe wrong permissions?" +msgstr "Den begärda filen kunde inte läsas. Kanske fel behörigheter?" + +#: cps/helper.py:278 +#, python-format +msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "Byt namn på titel från: \"%(src)s\" till \"%(dest)s\" misslyckades med fel: %(error)s" + +#: cps/helper.py:287 +#, python-format +msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "Byt namn på författare från: \"%(src)s\" till \"%(dest)s\" misslyckades med fel: %(error)s" + +#: cps/helper.py:309 cps/helper.py:318 +#, python-format +msgid "File %(file)s not found on Google Drive" +msgstr "Filen %(file)s hittades inte på Google Drive" + +#: cps/helper.py:336 +#, python-format +msgid "Book path %(path)s not found on Google Drive" +msgstr "Boksökvägen %(path)s hittades inte på Google Drive" + +#: cps/helper.py:597 +msgid "Error excecuting UnRar" +msgstr "Fel vid körning av UnRar" + +#: cps/helper.py:599 +msgid "Unrar binary file not found" +msgstr "Unrar binärfil hittades inte" + +#: cps/helper.py:648 +msgid "Waiting" +msgstr "Väntar" + +#: cps/helper.py:650 +msgid "Failed" +msgstr "Misslyckades" + +#: cps/helper.py:652 +msgid "Started" +msgstr "Startad" + +#: cps/helper.py:654 +msgid "Finished" +msgstr "Klar" + +#: cps/helper.py:656 +msgid "Unknown Status" +msgstr "Okänd status" + +#: cps/helper.py:661 +msgid "E-mail: " +msgstr "E-post: " + +#: cps/helper.py:663 cps/helper.py:667 +msgid "Convert: " +msgstr "Konvertera: " + +#: cps/helper.py:665 +msgid "Upload: " +msgstr "Överför: " + +#: cps/helper.py:669 +msgid "Unknown Task: " +msgstr "Okänd uppgift: " + +#: cps/web.py:1155 cps/web.py:2860 +msgid "Unknown" +msgstr "Okänd" + +#: cps/web.py:1164 cps/web.py:1195 cps/web.py:1280 +msgid "HTTP Error" +msgstr "HTTP-fel" + +#: cps/web.py:1166 cps/web.py:1197 cps/web.py:1281 +msgid "Connection error" +msgstr "Anslutningsfel" + +#: cps/web.py:1168 cps/web.py:1199 cps/web.py:1282 +msgid "Timeout while establishing connection" +msgstr "Tiden ute när du etablerade anslutning" + +#: cps/web.py:1170 cps/web.py:1201 cps/web.py:1283 +msgid "General error" +msgstr "Allmänt fel" + +#: cps/web.py:1176 +msgid "Unexpected data while reading update information" +msgstr "Oväntade data vid läsning av uppdateringsinformation" + +#: cps/web.py:1183 +msgid "No update available. You already have the latest version installed" +msgstr "Ingen uppdatering tillgänglig. Du har redan den senaste versionen installerad" + +#: cps/web.py:1208 +msgid "A new update is available. Click on the button below to update to the latest version." +msgstr "En ny uppdatering är tillgänglig. Klicka på knappen nedan för att uppdatera till den senaste versionen." + +#: cps/web.py:1258 +msgid "Could not fetch update information" +msgstr "Kunde inte hämta uppdateringsinformation" + +#: cps/web.py:1273 +msgid "Requesting update package" +msgstr "Begär uppdateringspaketet" + +#: cps/web.py:1274 +msgid "Downloading update package" +msgstr "Hämtar uppdateringspaketet" + +#: cps/web.py:1275 +msgid "Unzipping update package" +msgstr "Packar upp uppdateringspaketet" + +#: cps/web.py:1276 +msgid "Replacing files" +msgstr "Ersätta filer" + +#: cps/web.py:1277 +msgid "Database connections are closed" +msgstr "Databasanslutningarna är stängda" + +#: cps/web.py:1278 +msgid "Stopping server" +msgstr "Stoppar server" + +#: cps/web.py:1279 +msgid "Update finished, please press okay and reload page" +msgstr "Uppdatering klar, tryck på okej och uppdatera sidan" + +#: cps/web.py:1280 cps/web.py:1281 cps/web.py:1282 cps/web.py:1283 +msgid "Update failed:" +msgstr "Uppdateringen misslyckades:" + +#: cps/web.py:1306 +msgid "Recently Added Books" +msgstr "Nyligen tillagda böcker" + +#: cps/web.py:1316 +msgid "Newest Books" +msgstr "Nyaste böcker" + +#: cps/web.py:1328 +msgid "Oldest Books" +msgstr "Äldsta böcker" + +#: cps/web.py:1340 +msgid "Books (A-Z)" +msgstr "Böcker (A-Ö)" + +#: cps/web.py:1351 +msgid "Books (Z-A)" +msgstr "Böcker (Ö-A)" + +#: cps/web.py:1380 +msgid "Hot Books (most downloaded)" +msgstr "Heta böcker (mest hämtade)" + +#: cps/web.py:1393 +msgid "Best rated books" +msgstr "Bäst rankade böcker" + +#: cps/templates/index.xml:39 cps/web.py:1406 +msgid "Random Books" +msgstr "Slumpmässiga böcker" + +#: cps/web.py:1421 +msgid "Author list" +msgstr "Författarlista" + +#: cps/web.py:1433 cps/web.py:1524 cps/web.py:1688 cps/web.py:2231 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "Fel vid öppnande av e-bok. Filen finns inte eller filen är inte tillgänglig:" + +#: cps/web.py:1461 +msgid "Publisher list" +msgstr "Lista över förlag" + +#: cps/web.py:1475 +#, python-format +msgid "Publisher: %(name)s" +msgstr "Förlag: %(name)s" + +#: cps/templates/index.xml:83 cps/web.py:1507 +msgid "Series list" +msgstr "Serielista" + +#: cps/web.py:1522 +#, python-format +msgid "Series: %(serie)s" +msgstr "Serier: %(serie)s" + +#: cps/web.py:1551 +msgid "Available languages" +msgstr "Tillgängliga språk" + +#: cps/web.py:1571 +#, python-format +msgid "Language: %(name)s" +msgstr "Språk: %(name)s" + +#: cps/templates/index.xml:76 cps/web.py:1582 +msgid "Category list" +msgstr "Kategorilista" + +#: cps/web.py:1596 +#, python-format +msgid "Category: %(name)s" +msgstr "Kategori: %(name)s" + +#: cps/templates/layout.html:71 cps/web.py:1724 +msgid "Tasks" +msgstr "Uppgifter" + +#: cps/web.py:1758 +msgid "Statistics" +msgstr "Statistik" + +#: cps/web.py:1865 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "Återuppringningsdomänen är inte verifierad, följ stegen för att verifiera domänen i Google utvecklarkonsol" + +#: cps/web.py:1940 +msgid "Server restarted, please reload page" +msgstr "Server startas om, vänligen uppdatera sidan" + +#: cps/web.py:1943 +msgid "Performing shutdown of server, please close window" +msgstr "Stänger servern, vänligen stäng fönstret" + +#: cps/web.py:1962 +msgid "Update done" +msgstr "Uppdatering klar" + +#: cps/web.py:2032 +msgid "Published after " +msgstr "Publicerad efter " + +#: cps/web.py:2039 +msgid "Published before " +msgstr "Publicerad före " + +#: cps/web.py:2053 +#, python-format +msgid "Rating <= %(rating)s" +msgstr "Betyg <= %(rating)s" + +#: cps/web.py:2055 +#, python-format +msgid "Rating >= %(rating)s" +msgstr "Betyg >= %(rating)s" + +#: cps/web.py:2114 cps/web.py:2123 +msgid "search" +msgstr "sök" + +#: cps/templates/index.xml:47 cps/templates/index.xml:51 +#: cps/templates/layout.html:146 cps/web.py:2190 +msgid "Read Books" +msgstr "Lästa böcker" + +#: cps/templates/index.xml:55 cps/templates/index.xml:59 +#: cps/templates/layout.html:148 cps/web.py:2193 +msgid "Unread Books" +msgstr "Olästa böcker" + +#: cps/web.py:2241 cps/web.py:2243 cps/web.py:2245 cps/web.py:2257 +msgid "Read a Book" +msgstr "Läs en bok" + +#: cps/web.py:2316 cps/web.py:3219 +msgid "Please fill out all fields!" +msgstr "Fyll i alla fält!" + +#: cps/web.py:2317 cps/web.py:2338 cps/web.py:2342 cps/web.py:2347 +#: cps/web.py:2349 +msgid "register" +msgstr "registrera" + +#: cps/web.py:2337 cps/web.py:3435 +msgid "An unknown error occurred. Please try again later." +msgstr "Ett okänt fel uppstod. Försök igen senare." + +#: cps/web.py:2340 +msgid "Your e-mail is not allowed to register" +msgstr "Din e-post är inte tillåten att registrera" + +#: cps/web.py:2343 +msgid "Confirmation e-mail was send to your e-mail account." +msgstr "Bekräftelsemail skickades till ditt e-postkonto." + +#: cps/web.py:2346 +msgid "This username or e-mail address is already in use." +msgstr "Det här användarnamnet eller e-postadressen är redan i bruk." + +#: cps/web.py:2363 cps/web.py:2459 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "du är nu inloggad som: \"%(nickname)s\"" + +#: cps/web.py:2368 +msgid "Wrong Username or Password" +msgstr "Fel användarnamn eller lösenord" + +#: cps/web.py:2374 cps/web.py:2395 +msgid "login" +msgstr "logga in" + +#: cps/web.py:2407 cps/web.py:2438 +msgid "Token not found" +msgstr "Token hittades inte" + +#: cps/web.py:2415 cps/web.py:2446 +msgid "Token has expired" +msgstr "Token har löpt ut" + +#: cps/web.py:2423 +msgid "Success! Please return to your device" +msgstr "Lyckades! Vänligen återvänd till din enhet" + +#: cps/web.py:2473 +msgid "Please configure the SMTP mail settings first..." +msgstr "Konfigurera SMTP-postinställningarna först..." + +#: cps/web.py:2477 +#, python-format +msgid "Book successfully queued for sending to %(kindlemail)s" +msgstr "Boken är i kö för att skicka till %(kindlemail)s" + +#: cps/web.py:2481 +#, python-format +msgid "There was an error sending this book: %(res)s" +msgstr "Det gick inte att skicka den här boken: %(res)s" + +#: cps/web.py:2483 cps/web.py:3273 +msgid "Please configure your kindle e-mail address first..." +msgstr "Konfigurera din kindle-e-postadress först..." + +#: cps/web.py:2494 cps/web.py:2546 +msgid "Invalid shelf specified" +msgstr "Ogiltig hylla specificerad" + +#: cps/web.py:2501 +#, python-format +msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2509 +msgid "You are not allowed to edit public shelves" +msgstr "Du får inte redigera offentliga hyllor" + +#: cps/web.py:2518 +#, python-format +msgid "Book is already part of the shelf: %(shelfname)s" +msgstr "Boken är redan en del av hyllan: %(shelfname)s" + +#: cps/web.py:2532 +#, python-format +msgid "Book has been added to shelf: %(sname)s" +msgstr "Boken har lagts till i hyllan: %(sname)s" + +#: cps/web.py:2551 +#, python-format +msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgstr "Du får inte lägga till en bok i hyllan: %(name)s" + +#: cps/web.py:2556 +msgid "User is not allowed to edit public shelves" +msgstr "Användaren får inte redigera publika hyllor" + +#: cps/web.py:2574 +#, python-format +msgid "Books are already part of the shelf: %(name)s" +msgstr "Böcker är redan en del av hyllan: %(name)s" + +#: cps/web.py:2588 +#, python-format +msgid "Books have been added to shelf: %(sname)s" +msgstr "Böcker har lagts till hyllan: %(sname)s" + +#: cps/web.py:2590 +#, python-format +msgid "Could not add books to shelf: %(sname)s" +msgstr "Kunde inte lägga till böcker till hyllan: %(sname)s" + +#: cps/web.py:2627 +#, python-format +msgid "Book has been removed from shelf: %(sname)s" +msgstr "Boken har tagits bort från hyllan: %(sname)s" + +#: cps/web.py:2633 +#, python-format +msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgstr "Tyvärr har du inte rätt att ta bort en bok från den här hyllan: %(sname)s" + +#: cps/web.py:2653 cps/web.py:2677 +#, python-format +msgid "A shelf with the name '%(title)s' already exists." +msgstr "En hylla med namnet '%(title)s' finns redan." + +#: cps/web.py:2658 +#, python-format +msgid "Shelf %(title)s created" +msgstr "Hyllan %(title)s skapad" + +#: cps/web.py:2660 cps/web.py:2688 +msgid "There was an error" +msgstr "Det fanns ett fel" + +#: cps/web.py:2661 cps/web.py:2663 +msgid "create a shelf" +msgstr "skapa en hylla" + +#: cps/web.py:2686 +#, python-format +msgid "Shelf %(title)s changed" +msgstr "Hyllan %(title)s ändrad" + +#: cps/web.py:2689 cps/web.py:2691 +msgid "Edit a shelf" +msgstr "Redigera en hylla" + +#: cps/web.py:2712 +#, python-format +msgid "successfully deleted shelf %(name)s" +msgstr "tog bort hyllan %(name)s" + +#: cps/web.py:2739 +#, python-format +msgid "Shelf: '%(name)s'" +msgstr "Hylla: '%(name)s'" + +#: cps/web.py:2742 +msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "Fel vid öppning av hyllan. Hylla finns inte eller är inte tillgänglig" + +#: cps/web.py:2773 +#, python-format +msgid "Change order of Shelf: '%(name)s'" +msgstr "Ändra ordning på hyllan: '%(name)s'" + +#: cps/web.py:2802 cps/web.py:3225 +msgid "E-mail is not from valid domain" +msgstr "E-posten är inte från giltig domän" + +#: cps/web.py:2804 cps/web.py:2847 cps/web.py:2850 +#, python-format +msgid "%(name)s's profile" +msgstr "%(name)ss profil" + +#: cps/web.py:2845 +msgid "Found an existing account for this e-mail address." +msgstr "Hittade ett befintligt konto för den här e-postadressen." + +#: cps/web.py:2848 +msgid "Profile updated" +msgstr "Profilen uppdaterad" + +#: cps/web.py:2876 +msgid "Admin page" +msgstr "Administrationssida" + +#: cps/web.py:2956 cps/web.py:3130 +msgid "Calibre-Web configuration updated" +msgstr "Calibre-Web konfiguration uppdaterad" + +#: cps/templates/admin.html:100 cps/web.py:2969 +msgid "UI Configuration" +msgstr "Användargränssnitt konfiguration" + +#: cps/web.py:2987 +msgid "Import of optional Google Drive requirements missing" +msgstr "Import av valfri Google Drive krav saknas" + +#: cps/web.py:2990 +msgid "client_secrets.json is missing or not readable" +msgstr "client_secrets.json saknas eller inte kan läsas" + +#: cps/web.py:2995 cps/web.py:3022 +msgid "client_secrets.json is not configured for web application" +msgstr "client_secrets.json är inte konfigurerad för webbapplikation" + +#: cps/templates/admin.html:99 cps/web.py:3025 cps/web.py:3051 cps/web.py:3063 +#: cps/web.py:3106 cps/web.py:3121 cps/web.py:3138 cps/web.py:3145 +#: cps/web.py:3160 +msgid "Basic Configuration" +msgstr "Grundläggande konfiguration" + +#: cps/web.py:3048 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "Platsen för Keyfile är inte giltig, ange rätt sökväg" + +#: cps/web.py:3060 +msgid "Certfile location is not valid, please enter correct path" +msgstr "Platsen för Certfile är inte giltig, ange rätt sökväg" + +#: cps/web.py:3103 +msgid "Logfile location is not valid, please enter correct path" +msgstr "Platsen för Logfile platsen är inte giltig, ange rätt sökväg" + +#: cps/web.py:3142 +msgid "DB location is not valid, please enter correct path" +msgstr "Platsen för DB är inte giltig, ange rätt sökväg" + +#: cps/templates/admin.html:33 cps/web.py:3221 cps/web.py:3227 cps/web.py:3243 +msgid "Add new user" +msgstr "Lägg till ny användare" + +#: cps/web.py:3233 +#, python-format +msgid "User '%(user)s' created" +msgstr "Användaren '%(user)s' skapad" + +#: cps/web.py:3237 +msgid "Found an existing account for this e-mail address or nickname." +msgstr "Hittade ett befintligt konto för den här e-postadressen eller smeknamnet." + +#: cps/web.py:3261 cps/web.py:3275 +msgid "E-mail server settings updated" +msgstr "E-postserverinställningar uppdaterade" + +#: cps/web.py:3268 +#, python-format +msgid "Test e-mail successfully send to %(kindlemail)s" +msgstr "Test-e-post skicka till %(kindlemail)s" + +#: cps/web.py:3271 +#, python-format +msgid "There was an error sending the Test e-mail: %(res)s" +msgstr "Det gick inte att skicka Testmeddelandet: %(res)s" + +#: cps/web.py:3276 +msgid "Edit e-mail server settings" +msgstr "Redigera inställningar för e-postserver" + +#: cps/web.py:3301 +#, python-format +msgid "User '%(nick)s' deleted" +msgstr "Användaren '%(nick)s' borttagen" + +#: cps/web.py:3410 +#, python-format +msgid "User '%(nick)s' updated" +msgstr "Användaren '%(nick)s' uppdaterad" + +#: cps/web.py:3413 +msgid "An unknown error occured." +msgstr "Ett okänt fel uppstod." + +#: cps/web.py:3415 +#, python-format +msgid "Edit User %(nick)s" +msgstr "Redigera användaren %(nick)s" + +#: cps/web.py:3432 +#, python-format +msgid "Password for user %(user)s reset" +msgstr "Lösenord för användaren %(user)s återställd" + +#: cps/web.py:3446 cps/web.py:3647 +msgid "Error opening eBook. File does not exist or file is not accessible" +msgstr "Det gick inte att öppna e-boken. Filen finns inte eller filen är inte tillgänglig" + +#: cps/web.py:3471 cps/web.py:3930 +msgid "edit metadata" +msgstr "redigera metadata" + +#: cps/web.py:3564 cps/web.py:3800 +#, python-format +msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" +msgstr "Filändelsen '%(ext)s' får inte laddas upp till den här servern" + +#: cps/web.py:3568 cps/web.py:3804 +msgid "File to be uploaded must have an extension" +msgstr "Filen som ska laddas upp måste ha en ändelse" + +#: cps/web.py:3580 cps/web.py:3824 +#, python-format +msgid "Failed to create path %(path)s (Permission denied)." +msgstr "Det gick inte att skapa sökväg %(path)s (behörighet nekad)." + +#: cps/web.py:3585 +#, python-format +msgid "Failed to store file %(file)s." +msgstr "Det gick inte att lagra filen %(file)s." + +#: cps/web.py:3601 +#, python-format +msgid "File format %(ext)s added to %(book)s" +msgstr "Filformatet %(ext)s lades till %(book)s" + +#: cps/web.py:3619 +#, python-format +msgid "Failed to create path for cover %(path)s (Permission denied)." +msgstr "Det gick inte att skapa sökväg för omslag %(path)s (behörighet nekad)." + +#: cps/web.py:3626 +#, python-format +msgid "Failed to store cover-file %(cover)s." +msgstr "Det gick inte att lagra omslagsfilen %(cover)s." + +#: cps/web.py:3629 +msgid "Cover-file is not a valid image file" +msgstr "Omslagsfilen är inte en giltig bildfil" + +#: cps/web.py:3659 cps/web.py:3668 cps/web.py:3672 +msgid "unknown" +msgstr "okänd" + +#: cps/web.py:3691 +msgid "Cover is not a jpg file, can't save" +msgstr "Omslag är inte en jpg-fil, kan inte spara" + +#: cps/web.py:3739 +#, python-format +msgid "%(langname)s is not a valid language" +msgstr "%(langname)s är inte ett giltigt språk" + +#: cps/web.py:3770 +msgid "Metadata successfully updated" +msgstr "Metadata uppdaterades" + +#: cps/web.py:3779 +msgid "Error editing book, please check logfile for details" +msgstr "Det gick inte att redigera boken, kontrollera loggfilen för mer information" + +#: cps/web.py:3829 +#, python-format +msgid "Failed to store file %(file)s (Permission denied)." +msgstr "Det gick inte att lagra filen %(file)s (behörighet nekad)." + +#: cps/web.py:3834 +#, python-format +msgid "Failed to delete file %(file)s (Permission denied)." +msgstr "Det gick inte att ta bort filen %(file)s (behörighet nekad)." + +#: cps/web.py:3947 +msgid "Source or destination format for conversion missing" +msgstr "Källa eller målformat för konvertering saknas" + +#: cps/web.py:3957 +#, python-format +msgid "Book successfully queued for converting to %(book_format)s" +msgstr "Boken är i kö för konvertering till %(book_format)s" + +#: cps/web.py:3961 +#, python-format +msgid "There was an error converting this book: %(res)s" +msgstr "Det gick inte att konvertera den här boken: %(res)s" + +#: cps/worker.py:287 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "E-bokkonverteraren misslyckades: %(error)s" + +#: cps/worker.py:298 +#, python-format +msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" +msgstr "Kindlegen misslyckades med fel %(error)s. Meddelande: %(message)s" + +#: cps/templates/admin.html:6 +msgid "User list" +msgstr "Användarlista" + +#: cps/templates/admin.html:9 +msgid "Nickname" +msgstr "Smeknamn" + +#: cps/templates/admin.html:10 +msgid "E-mail" +msgstr "E-post" + +#: cps/templates/admin.html:11 +msgid "Kindle" +msgstr "Kindle" + +#: cps/templates/admin.html:12 +msgid "DLS" +msgstr "DLS" + +#: cps/templates/admin.html:13 cps/templates/layout.html:74 +msgid "Admin" +msgstr "Administratör" + +#: cps/templates/admin.html:14 cps/templates/detail.html:22 +#: cps/templates/detail.html:31 +msgid "Download" +msgstr "Hämta" + +#: cps/templates/admin.html:15 cps/templates/layout.html:64 +msgid "Upload" +msgstr "Ladda upp" + +#: cps/templates/admin.html:16 +msgid "Edit" +msgstr "Redigera" + +#: cps/templates/admin.html:39 +msgid "SMTP e-mail server settings" +msgstr "Inställningar för SMTP-e-postserver" + +#: cps/templates/admin.html:42 cps/templates/email_edit.html:11 +msgid "SMTP hostname" +msgstr "SMTP-värdnamn" + +#: cps/templates/admin.html:43 +msgid "SMTP port" +msgstr "SMTP-port" + +#: cps/templates/admin.html:44 +msgid "SSL" +msgstr "SSL" + +#: cps/templates/admin.html:45 cps/templates/email_edit.html:27 +msgid "SMTP login" +msgstr "SMTP-inloggning" + +#: cps/templates/admin.html:46 +msgid "From mail" +msgstr "Från meddelande" + +#: cps/templates/admin.html:56 +msgid "Change SMTP settings" +msgstr "Ändra SMTP-inställningar" + +#: cps/templates/admin.html:62 +msgid "Configuration" +msgstr "Konfiguration" + +#: cps/templates/admin.html:65 +msgid "Calibre DB dir" +msgstr "Calibre DB dir" + +#: cps/templates/admin.html:69 +msgid "Log level" +msgstr "Loggnivå" + +#: cps/templates/admin.html:73 +msgid "Port" +msgstr "Port" + +#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23 +msgid "Books per page" +msgstr "Böcker per sida" + +#: cps/templates/admin.html:83 +msgid "Uploading" +msgstr "Laddar upp" + +#: cps/templates/admin.html:87 +msgid "Anonymous browsing" +msgstr "Anonym surfning" + +#: cps/templates/admin.html:91 +msgid "Public registration" +msgstr "Publik registrering" + +#: cps/templates/admin.html:95 cps/templates/remote_login.html:4 +msgid "Remote login" +msgstr "Fjärrinloggning" + +#: cps/templates/admin.html:106 +msgid "Administration" +msgstr "Administration" + +#: cps/templates/admin.html:107 +msgid "Reconnect to Calibre DB" +msgstr "Anslut till Calibre DB igen" + +#: cps/templates/admin.html:108 +msgid "Restart Calibre-Web" +msgstr "Starta om Calibre-Web" + +#: cps/templates/admin.html:109 +msgid "Stop Calibre-Web" +msgstr "Stoppa Calibre-Web" + +#: cps/templates/admin.html:115 +msgid "Update" +msgstr "Uppdatera" + +#: cps/templates/admin.html:119 +msgid "Version" +msgstr "Version" + +#: cps/templates/admin.html:120 +msgid "Details" +msgstr "Detaljer" + +#: cps/templates/admin.html:126 +msgid "Current version" +msgstr "Aktuell version" + +#: cps/templates/admin.html:132 +msgid "Check for update" +msgstr "Sök efter uppdatering" + +#: cps/templates/admin.html:133 +msgid "Perform Update" +msgstr "Utför uppdatering" + +#: cps/templates/admin.html:145 +msgid "Do you really want to restart Calibre-Web?" +msgstr "Är du säker på att du vill starta om Calibre-Web?" + +#: cps/templates/admin.html:150 cps/templates/admin.html:164 +#: cps/templates/admin.html:184 cps/templates/shelf.html:63 +msgid "Ok" +msgstr "Ok" + +#: cps/templates/admin.html:151 cps/templates/admin.html:165 +#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200 +#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168 +#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75 +#: cps/templates/shelf.html:64 cps/templates/shelf_edit.html:19 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155 +msgid "Back" +msgstr "Tillbaka" + +#: cps/templates/admin.html:163 +msgid "Do you really want to stop Calibre-Web?" +msgstr "Är du säker på att du vill stoppa Calibre-Web?" + +#: cps/templates/admin.html:175 +msgid "Updating, please do not reload page" +msgstr "Uppdaterar, vänligen uppdatera inte sidan" + +#: cps/templates/author.html:15 +msgid "via" +msgstr "via" + +#: cps/templates/author.html:23 +msgid "In Library" +msgstr "I biblioteket" + +#: cps/templates/author.html:71 +msgid "More by" +msgstr "Mer av" + +#: cps/templates/book_edit.html:16 +msgid "Delete Book" +msgstr "Ta bort boken" + +#: cps/templates/book_edit.html:19 +msgid "Delete formats:" +msgstr "Ta bort format:" + +#: cps/templates/book_edit.html:22 cps/templates/book_edit.html:199 +#: cps/templates/email_edit.html:73 cps/templates/email_edit.html:74 +msgid "Delete" +msgstr "Ta bort" + +#: cps/templates/book_edit.html:30 +msgid "Convert book format:" +msgstr "Konvertera bokformat:" + +#: cps/templates/book_edit.html:34 +msgid "Convert from:" +msgstr "Konvertera från:" + +#: cps/templates/book_edit.html:36 cps/templates/book_edit.html:43 +msgid "select an option" +msgstr "välj ett alternativ" + +#: cps/templates/book_edit.html:41 +msgid "Convert to:" +msgstr "Konvertera till:" + +#: cps/templates/book_edit.html:50 +msgid "Convert book" +msgstr "Konvertera boken" + +#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6 +msgid "Book Title" +msgstr "Boktitel" + +#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:259 +#: cps/templates/book_edit.html:277 cps/templates/search_form.html:10 +msgid "Author" +msgstr "Författare" + +#: cps/templates/book_edit.html:67 cps/templates/book_edit.html:264 +#: cps/templates/book_edit.html:279 cps/templates/search_form.html:106 +msgid "Description" +msgstr "Beskrivning" + +#: cps/templates/book_edit.html:71 cps/templates/search_form.html:33 +msgid "Tags" +msgstr "Taggar" + +#: cps/templates/book_edit.html:75 cps/templates/layout.html:157 +#: cps/templates/search_form.html:53 +msgid "Series" +msgstr "Serier" + +#: cps/templates/book_edit.html:79 +msgid "Series id" +msgstr "Serier-id" + +#: cps/templates/book_edit.html:83 +msgid "Rating" +msgstr "Betyg" + +#: cps/templates/book_edit.html:87 +msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +msgstr "Omslagswebbadress (jpg, omslag hämtas och lagras i databasen, fältet är efteråt tomt igen)" + +#: cps/templates/book_edit.html:91 +msgid "Upload Cover from local drive" +msgstr "Ladda upp omslag från lokal enhet" + +#: cps/templates/book_edit.html:96 cps/templates/detail.html:149 +msgid "Publishing date" +msgstr "Publiceringsdatum" + +#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:278 cps/templates/detail.html:141 +#: cps/templates/search_form.html:14 +msgid "Publisher" +msgstr "Förlag" + +#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31 +msgid "Language" +msgstr "Språk" + +#: cps/templates/book_edit.html:117 cps/templates/search_form.html:117 +msgid "Yes" +msgstr "Ja" + +#: cps/templates/book_edit.html:118 cps/templates/search_form.html:118 +msgid "No" +msgstr "Nej" + +#: cps/templates/book_edit.html:164 +msgid "Upload format" +msgstr "Ladda upp format" + +#: cps/templates/book_edit.html:173 +msgid "view book after edit" +msgstr "visa bok efter redigering" + +#: cps/templates/book_edit.html:176 cps/templates/book_edit.html:212 +msgid "Get metadata" +msgstr "Hämta metadata" + +#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210 +#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20 +#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17 +#: cps/templates/user_edit.html:153 +msgid "Submit" +msgstr "Skicka" + +#: cps/templates/book_edit.html:191 +msgid "Are you really sure?" +msgstr "Är du verkligen säker?" + +#: cps/templates/book_edit.html:194 +msgid "Book will be deleted from Calibre database" +msgstr "Boken kommer att tas bort från Calibre-databasen" + +#: cps/templates/book_edit.html:195 +msgid "and from hard disk" +msgstr "och från hårddisken" + +#: cps/templates/book_edit.html:215 +msgid "Keyword" +msgstr "Sökord" + +#: cps/templates/book_edit.html:216 +msgid " Search keyword " +msgstr " Sök sökord " + +#: cps/templates/book_edit.html:218 cps/templates/layout.html:46 +msgid "Go!" +msgstr "Kör!" + +#: cps/templates/book_edit.html:222 +msgid "Click the cover to load metadata to the form" +msgstr "Klicka på omslaget för att läsa in metadata till formuläret" + +#: cps/templates/book_edit.html:234 cps/templates/book_edit.html:274 +msgid "Loading..." +msgstr "Läser in..." + +#: cps/templates/book_edit.html:239 cps/templates/layout.html:224 +msgid "Close" +msgstr "Stäng" + +#: cps/templates/book_edit.html:266 cps/templates/book_edit.html:280 +msgid "Source" +msgstr "Källa" + +#: cps/templates/book_edit.html:275 +msgid "Search error!" +msgstr "Sökningsfel!" + +#: cps/templates/book_edit.html:276 +msgid "No Result(s) found! Please try aonther keyword." +msgstr "Inga resultat hittades! Försök med ett annat sökord." + +#: cps/templates/config_edit.html:12 +msgid "Library Configuration" +msgstr "Bibliotekets konfiguration" + +#: cps/templates/config_edit.html:19 +msgid "Location of Calibre database" +msgstr "Plats för Calibre-databasen" + +#: cps/templates/config_edit.html:24 +msgid "Use Google Drive?" +msgstr "Använda Google Drive?" + +#: cps/templates/config_edit.html:30 +msgid "Google Drive config problem" +msgstr "Google Drive-konfigurationsproblem" + +#: cps/templates/config_edit.html:36 +msgid "Authenticate Google Drive" +msgstr "Autentisera Google Drive" + +#: cps/templates/config_edit.html:40 +msgid "Please finish Google Drive setup after login" +msgstr "Vänligen avsluta Google Drive-inställning efter inloggning" + +#: cps/templates/config_edit.html:44 +msgid "Google Drive Calibre folder" +msgstr "Google Drive Calibre-mapp" + +#: cps/templates/config_edit.html:52 +msgid "Metadata Watch Channel ID" +msgstr "Metadata Titta på kanal ID" + +#: cps/templates/config_edit.html:55 +msgid "Revoke" +msgstr "Återkalla" + +#: cps/templates/config_edit.html:73 +msgid "Server Configuration" +msgstr "Serverkonfiguration" + +#: cps/templates/config_edit.html:80 +msgid "Server Port" +msgstr "Serverport" + +#: cps/templates/config_edit.html:84 +msgid "SSL certfile location (leave it empty for non-SSL Servers)" +msgstr "SSL certfile plats (lämna den tom för icke-SSL-servrar)" + +#: cps/templates/config_edit.html:88 +msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" +msgstr "SSL Keyfile plats (lämna den tom för icke-SSL-servrar)" + +#: cps/templates/config_edit.html:99 +msgid "Logfile Configuration" +msgstr "Loggfil konfiguration" + +#: cps/templates/config_edit.html:106 +msgid "Log Level" +msgstr "Loggnivå" + +#: cps/templates/config_edit.html:115 +msgid "Location and name of logfile (calibre-web.log for no entry)" +msgstr "Plats och namn på loggfilen (calibre-web.log för ingen post)" + +#: cps/templates/config_edit.html:126 +msgid "Feature Configuration" +msgstr "Funktion konfiguration" + +#: cps/templates/config_edit.html:134 +msgid "Enable uploading" +msgstr "Aktivera uppladdning" + +#: cps/templates/config_edit.html:138 +msgid "Enable anonymous browsing" +msgstr "Aktivera anonym surfning" + +#: cps/templates/config_edit.html:142 +msgid "Enable public registration" +msgstr "Aktivera offentlig registrering" + +#: cps/templates/config_edit.html:146 +msgid "Enable remote login (\"magic link\")" +msgstr "Aktivera fjärrinloggning (\"magic link\")" + +#: cps/templates/config_edit.html:151 +msgid "Use" +msgstr "Använd" + +#: cps/templates/config_edit.html:152 +msgid "Obtain an API Key" +msgstr "Hämta en API-nyckel" + +#: cps/templates/config_edit.html:156 +msgid "Goodreads API Key" +msgstr "Goodreads API-nyckel" + +#: cps/templates/config_edit.html:160 +msgid "Goodreads API Secret" +msgstr "Goodreads API-hemlighet" + +#: cps/templates/config_edit.html:173 +msgid "External binaries" +msgstr "Externa binärer" + +#: cps/templates/config_edit.html:181 +msgid "No converter" +msgstr "Ingen konverterare" + +#: cps/templates/config_edit.html:183 +msgid "Use Kindlegen" +msgstr "Använd Kindlegen" + +#: cps/templates/config_edit.html:185 +msgid "Use calibre's ebook converter" +msgstr "Använd calibres e-bokkonverterare" + +#: cps/templates/config_edit.html:189 +msgid "E-Book converter settings" +msgstr "Inställningar för e-bokkonverteraren" + +#: cps/templates/config_edit.html:193 +msgid "Path to convertertool" +msgstr "Sökväg till convertertool" + +#: cps/templates/config_edit.html:199 +msgid "Location of Unrar binary" +msgstr "Plats för Unrar-binär" + +#: cps/templates/config_edit.html:215 cps/templates/layout.html:82 +#: cps/templates/login.html:4 +msgid "Login" +msgstr "Logga in" + +#: cps/templates/config_view_edit.html:12 +msgid "View Configuration" +msgstr "Visa konfiguration" + +#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 +#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 +msgid "Title" +msgstr "Titel" + +#: cps/templates/config_view_edit.html:27 +msgid "No. of random books to show" +msgstr "Antal slumpmässiga böcker att visa" + +#: cps/templates/config_view_edit.html:31 +msgid "Regular expression for ignoring columns" +msgstr "Reguljärt uttryck för att ignorera kolumner" + +#: cps/templates/config_view_edit.html:35 +msgid "Link read/unread status to Calibre column" +msgstr "Länka läst/oläst status till Calibre-kolumn" + +#: cps/templates/config_view_edit.html:44 +msgid "Regular expression for title sorting" +msgstr "Reguljärt uttryck för titelsortering" + +#: cps/templates/config_view_edit.html:48 +msgid "Tags for Mature Content" +msgstr "Taggar för vuxeninnehåll" + +#: cps/templates/config_view_edit.html:62 +msgid "Default settings for new users" +msgstr "Standardinställningar för nya användare" + +#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110 +msgid "Admin user" +msgstr "Adminstratör användare" + +#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119 +msgid "Allow Downloads" +msgstr "Tillåt Hämtningar" + +#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123 +msgid "Allow Uploads" +msgstr "Tillåt Uppladdningar" + +#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127 +msgid "Allow Edit" +msgstr "Tillåt Redigera" + +#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131 +msgid "Allow Delete books" +msgstr "Tillåt Ta bort böcker" + +#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136 +msgid "Allow Changing Password" +msgstr "Tillåt Ändra lösenord" + +#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140 +msgid "Allow Editing Public Shelfs" +msgstr "Tillåt Redigering av offentliga hyllor" + +#: cps/templates/config_view_edit.html:104 +msgid "Default visibilities for new users" +msgstr "Standardvisibiliteter för nya användare" + +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58 +msgid "Show random books" +msgstr "Visa slumpmässiga böcker" + +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62 +msgid "Show recent books" +msgstr "Visa senaste böcker" + +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66 +msgid "Show sorted books" +msgstr "Visa sorterade böcker" + +#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70 +msgid "Show hot books" +msgstr "Visa heta böcker" + +#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74 +msgid "Show best rated books" +msgstr "Visa böcker med bästa betyg" + +#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78 +msgid "Show language selection" +msgstr "Visa språkval" + +#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82 +msgid "Show series selection" +msgstr "Visa serieval" + +#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86 +msgid "Show category selection" +msgstr "Visa kategorival" + +#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90 +msgid "Show author selection" +msgstr "Visa författarval" + +#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94 +msgid "Show publisher selection" +msgstr "Visa urval av förlag" + +#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98 +msgid "Show read and unread" +msgstr "Visa lästa och olästa" + +#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102 +msgid "Show random books in detail view" +msgstr "Visa slumpmässiga böcker i detaljvyn" + +#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115 +msgid "Show mature content" +msgstr "Visa vuxeninnehåll" + +#: cps/templates/detail.html:63 +msgid "Read in browser" +msgstr "Läs i webbläsaren" + +#: cps/templates/detail.html:102 +msgid "Book" +msgstr "Bok" + +#: cps/templates/detail.html:102 +msgid "of" +msgstr "av" + +#: cps/templates/detail.html:108 +msgid "language" +msgstr "språk" + +#: cps/templates/detail.html:186 +msgid "Read" +msgstr "Läst" + +#: cps/templates/detail.html:196 +msgid "Description:" +msgstr "Beskrivning:" + +#: cps/templates/detail.html:209 cps/templates/search.html:14 +msgid "Add to shelf" +msgstr "Lägg till hyllan" + +#: cps/templates/detail.html:271 +msgid "Edit metadata" +msgstr "Redigera metadata" + +#: cps/templates/email_edit.html:15 +msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +msgstr "SMTP-port (vanligtvis 25 för vanlig SMTP och 465 för SSL och 587 för STARTTLS)" + +#: cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "Kryptering" + +#: cps/templates/email_edit.html:21 +msgid "None" +msgstr "Ingen" + +#: cps/templates/email_edit.html:22 +msgid "STARTTLS" +msgstr "STARTTLS" + +#: cps/templates/email_edit.html:23 +msgid "SSL/TLS" +msgstr "SSL/TLS" + +#: cps/templates/email_edit.html:31 +msgid "SMTP password" +msgstr "SMTP-lösenord" + +#: cps/templates/email_edit.html:35 +msgid "From e-mail" +msgstr "Från e-post" + +#: cps/templates/email_edit.html:38 +msgid "Save settings" +msgstr "Spara inställningarna" + +#: cps/templates/email_edit.html:39 +msgid "Save settings and send Test E-Mail" +msgstr "Spara inställningarna och skicka test-e-post" + +#: cps/templates/email_edit.html:43 +msgid "Allowed domains for registering" +msgstr "Tillåtna domäner för registrering" + +#: cps/templates/email_edit.html:47 +msgid "Enter domainname" +msgstr "Ange domännamn" + +#: cps/templates/email_edit.html:55 +msgid "Add Domain" +msgstr "Lägg till domän" + +#: cps/templates/email_edit.html:58 +msgid "Add" +msgstr "Lägg till" + +#: cps/templates/email_edit.html:72 +msgid "Do you really want to delete this domain rule?" +msgstr "Är du säker på att du vill ta bort den här domänregeln?" + +#: cps/templates/feed.xml:21 cps/templates/layout.html:208 +msgid "Next" +msgstr "Nästa" + +#: cps/templates/feed.xml:33 cps/templates/index.xml:11 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 +msgid "Search" +msgstr "Sök" + +#: cps/templates/http_error.html:23 +msgid "Back to home" +msgstr "Tillbaka till hemmet" + +#: cps/templates/index.html:5 +msgid "Discover (Random Books)" +msgstr "Upptäck (slumpmässiga böcker)" + +#: cps/templates/index.xml:6 +msgid "Start" +msgstr "Starta" + +#: cps/templates/index.xml:18 cps/templates/layout.html:139 +msgid "Hot Books" +msgstr "Heta böcker" + +#: cps/templates/index.xml:22 +msgid "Popular publications from this catalog based on Downloads." +msgstr "Populära publikationer från den här katalogen baserad på hämtningar." + +#: cps/templates/index.xml:25 cps/templates/layout.html:142 +msgid "Best rated Books" +msgstr "Bäst rankade böcker" + +#: cps/templates/index.xml:29 +msgid "Popular publications from this catalog based on Rating." +msgstr "Populära publikationer från den här katalogen baserad på betyg." + +#: cps/templates/index.xml:32 +msgid "New Books" +msgstr "Nya böcker" + +#: cps/templates/index.xml:36 +msgid "The latest Books" +msgstr "De senaste böckerna" + +#: cps/templates/index.xml:43 +msgid "Show Random Books" +msgstr "Visa slumpmässiga böcker" + +#: cps/templates/index.xml:62 cps/templates/layout.html:160 +msgid "Authors" +msgstr "Författare" + +#: cps/templates/index.xml:66 +msgid "Books ordered by Author" +msgstr "Böcker ordnade efter författare" + +#: cps/templates/index.xml:69 cps/templates/layout.html:163 +msgid "Publishers" +msgstr "Förlag" + +#: cps/templates/index.xml:73 +msgid "Books ordered by publisher" +msgstr "Böcker ordnade efter förlag" + +#: cps/templates/index.xml:80 +msgid "Books ordered by category" +msgstr "Böcker ordnade efter kategori" + +#: cps/templates/index.xml:87 +msgid "Books ordered by series" +msgstr "Böcker ordnade efter serier" + +#: cps/templates/index.xml:90 cps/templates/layout.html:169 +msgid "Public Shelves" +msgstr "Offentliga hyllor" + +#: cps/templates/index.xml:94 +msgid "Books organized in public shelfs, visible to everyone" +msgstr "Böcker organiserade i offentliga hyllor, synliga för alla" + +#: cps/templates/index.xml:98 cps/templates/layout.html:173 +msgid "Your Shelves" +msgstr "Dina hyllor" + +#: cps/templates/index.xml:102 +msgid "User's own shelfs, only visible to the current user himself" +msgstr "Användarens egna hyllor, endast synliga för den aktuella användaren själv" + +#: cps/templates/layout.html:33 +msgid "Toggle navigation" +msgstr "Växla navigering" + +#: cps/templates/layout.html:54 +msgid "Advanced Search" +msgstr "Avancerad sökning" + +#: cps/templates/layout.html:78 +msgid "Logout" +msgstr "Logga ut" + +#: cps/templates/layout.html:83 cps/templates/register.html:14 +msgid "Register" +msgstr "Registrera" + +#: cps/templates/layout.html:108 +msgid "Uploading..." +msgstr "Laddar upp..." + +#: cps/templates/layout.html:109 +msgid "please don't refresh the page" +msgstr "uppdatera inte sidan" + +#: cps/templates/layout.html:120 +msgid "Browse" +msgstr "Bläddra" + +#: cps/templates/layout.html:122 +msgid "Recently Added" +msgstr "Nyligen tillagda" + +#: cps/templates/layout.html:127 +msgid "Sorted Books" +msgstr "Sorterade böcker" + +#: cps/templates/layout.html:131 cps/templates/layout.html:132 +#: cps/templates/layout.html:133 cps/templates/layout.html:134 +msgid "Sort By" +msgstr "Sortera efter" + +#: cps/templates/layout.html:131 +msgid "Newest" +msgstr "Nyast" + +#: cps/templates/layout.html:132 +msgid "Oldest" +msgstr "Äldst" + +#: cps/templates/layout.html:133 +msgid "Ascending" +msgstr "Stigande" + +#: cps/templates/layout.html:134 +msgid "Descending" +msgstr "Fallande" + +#: cps/templates/layout.html:151 +msgid "Discover" +msgstr "Upptäck" + +#: cps/templates/layout.html:154 +msgid "Categories" +msgstr "Kategorier" + +#: cps/templates/layout.html:166 cps/templates/search_form.html:74 +msgid "Languages" +msgstr "Språk" + +#: cps/templates/layout.html:178 +msgid "Create a Shelf" +msgstr "Skapa en hylla" + +#: cps/templates/layout.html:179 cps/templates/stats.html:3 +msgid "About" +msgstr "Om" + +#: cps/templates/layout.html:193 +msgid "Previous" +msgstr "Föregående" + +#: cps/templates/layout.html:220 +msgid "Book Details" +msgstr "Bokdetaljer" + +#: cps/templates/login.html:8 cps/templates/login.html:9 +#: cps/templates/register.html:7 cps/templates/user_edit.html:8 +msgid "Username" +msgstr "Användarnamn" + +#: cps/templates/login.html:12 cps/templates/login.html:13 +#: cps/templates/user_edit.html:21 +msgid "Password" +msgstr "Lösenord" + +#: cps/templates/login.html:17 +msgid "Remember me" +msgstr "Kom ihåg mig" + +#: cps/templates/login.html:22 +msgid "Log in with magic link" +msgstr "Logga in med magic link" + +#: cps/templates/osd.xml:5 +msgid "Calibre-Web ebook catalog" +msgstr "Calibre-Web e-bokkatalog" + +#: cps/templates/read.html:69 cps/templates/readcbr.html:79 +#: cps/templates/readcbr.html:103 +msgid "Settings" +msgstr "Inställningar" + +#: cps/templates/read.html:72 +msgid "Reflow text when sidebars are open." +msgstr "Fyll i texten igen när sidofält är öppna." + +#: cps/templates/readcbr.html:84 +msgid "Keyboard Shortcuts" +msgstr "Kortkommandon" + +#: cps/templates/readcbr.html:87 +msgid "Previous Page" +msgstr "Föregående sida" + +#: cps/templates/readcbr.html:88 +msgid "Next Page" +msgstr "Nästa sida" + +#: cps/templates/readcbr.html:89 +msgid "Scale to Best" +msgstr "Skala till bäst" + +#: cps/templates/readcbr.html:90 +msgid "Scale to Width" +msgstr "Skala till bredd" + +#: cps/templates/readcbr.html:91 +msgid "Scale to Height" +msgstr "Skala till höjd" + +#: cps/templates/readcbr.html:92 +msgid "Scale to Native" +msgstr "Skala till ursprunglig" + +#: cps/templates/readcbr.html:93 +msgid "Rotate Right" +msgstr "Rotera åt höger" + +#: cps/templates/readcbr.html:94 +msgid "Rotate Left" +msgstr "Rotera åt vänster" + +#: cps/templates/readcbr.html:95 +msgid "Flip Image" +msgstr "Vänd bilden" + +#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39 +msgid "Theme" +msgstr "Tema" + +#: cps/templates/readcbr.html:111 +msgid "Light" +msgstr "Ljust" + +#: cps/templates/readcbr.html:112 +msgid "Dark" +msgstr "Mörkt" + +#: cps/templates/readcbr.html:117 +msgid "Scale" +msgstr "Skala" + +#: cps/templates/readcbr.html:120 +msgid "Best" +msgstr "Bäst" + +#: cps/templates/readcbr.html:121 +msgid "Width" +msgstr "Bredd" + +#: cps/templates/readcbr.html:122 +msgid "Height" +msgstr "Höjd" + +#: cps/templates/readcbr.html:123 +msgid "Native" +msgstr "Ursprunglig" + +#: cps/templates/readcbr.html:128 +msgid "Rotate" +msgstr "Rotera" + +#: cps/templates/readcbr.html:139 +msgid "Flip" +msgstr "Vänd" + +#: cps/templates/readcbr.html:142 +msgid "Horizontal" +msgstr "Horisontell" + +#: cps/templates/readcbr.html:143 +msgid "Vertical" +msgstr "Vertikal" + +#: cps/templates/readpdf.html:29 +msgid "PDF.js viewer" +msgstr "PDF.js visare" + +#: cps/templates/readtxt.html:6 +msgid "Basic txt Reader" +msgstr "Grundläggande txt-läsare" + +#: cps/templates/register.html:4 +msgid "Register a new account" +msgstr "Registrera ett nytt konto" + +#: cps/templates/register.html:8 +msgid "Choose a username" +msgstr "Välj ett användarnamn" + +#: cps/templates/register.html:11 cps/templates/user_edit.html:13 +msgid "E-mail address" +msgstr "E-postadress" + +#: cps/templates/register.html:12 +msgid "Your email address" +msgstr "Din e-postadress" + +#: cps/templates/remote_login.html:6 +msgid "Using your another device, visit" +msgstr "Använda en annan enhet, besök" + +#: cps/templates/remote_login.html:6 +msgid "and log in" +msgstr "och logga in" + +#: cps/templates/remote_login.html:9 +msgid "Once you do so, you will automatically get logged in on this device." +msgstr "När du gör det kommer du automatiskt att logga in på den här enheten." + +#: cps/templates/search.html:5 +msgid "No Results for:" +msgstr "Inga resultat för:" + +#: cps/templates/search.html:6 +msgid "Please try a different search" +msgstr "Försök en annan sökning" + +#: cps/templates/search.html:8 +msgid "Results for:" +msgstr "Resultat för:" + +#: cps/templates/search_form.html:19 +msgid "Publishing date from" +msgstr "Publiceringsdatum från" + +#: cps/templates/search_form.html:26 +msgid "Publishing date to" +msgstr "Publiceringsdatum till" + +#: cps/templates/search_form.html:43 +msgid "Exclude Tags" +msgstr "Uteslut taggar" + +#: cps/templates/search_form.html:63 +msgid "Exclude Series" +msgstr "Uteslut serier" + +#: cps/templates/search_form.html:84 +msgid "Exclude Languages" +msgstr "Uteslut språk" + +#: cps/templates/search_form.html:97 +msgid "Rating bigger than" +msgstr "Betyg större än" + +#: cps/templates/search_form.html:101 +msgid "Rating less than" +msgstr "Betyg mindre än" + +#: cps/templates/shelf.html:7 +msgid "Delete this Shelf" +msgstr "Ta bort den här hyllan" + +#: cps/templates/shelf.html:8 +msgid "Edit Shelf" +msgstr "Redigera hyllan" + +#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11 +msgid "Change order" +msgstr "Ändra ordningen" + +#: cps/templates/shelf.html:58 +msgid "Do you really want to delete the shelf?" +msgstr "Är du säker på att du vill ta bort hyllan?" + +#: cps/templates/shelf.html:61 +msgid "Shelf will be lost for everybody and forever!" +msgstr "Hylla kommer att gå förlorad för alla och för alltid!" + +#: cps/templates/shelf_edit.html:13 +msgid "should the shelf be public?" +msgstr "ska hyllan vara offentlig?" + +#: cps/templates/shelf_order.html:5 +msgid "Drag 'n drop to rearrange order" +msgstr "Drag och släpp för att ändra ordning" + +#: cps/templates/stats.html:7 +msgid "Calibre library statistics" +msgstr "Calibre-biblioteksstatistik" + +#: cps/templates/stats.html:12 +msgid "Books in this Library" +msgstr "Böcker i det här biblioteket" + +#: cps/templates/stats.html:16 +msgid "Authors in this Library" +msgstr "Författare i det här biblioteket" + +#: cps/templates/stats.html:20 +msgid "Categories in this Library" +msgstr "Kategorier i det här biblioteket" + +#: cps/templates/stats.html:24 +msgid "Series in this Library" +msgstr "Serier i detta bibliotek" + +#: cps/templates/stats.html:28 +msgid "Linked libraries" +msgstr "Länkade bibliotek" + +#: cps/templates/stats.html:32 +msgid "Program library" +msgstr "Programbibliotek" + +#: cps/templates/stats.html:33 +msgid "Installed Version" +msgstr "Installerad version" + +#: cps/templates/tasks.html:7 +msgid "Tasks list" +msgstr "Uppgiftslista" + +#: cps/templates/tasks.html:12 +msgid "User" +msgstr "Användare" + +#: cps/templates/tasks.html:14 +msgid "Task" +msgstr "Uppgift" + +#: cps/templates/tasks.html:15 +msgid "Status" +msgstr "Status" + +#: cps/templates/tasks.html:16 +msgid "Progress" +msgstr "Förlopp" + +#: cps/templates/tasks.html:17 +msgid "Runtime" +msgstr "Drifttid" + +#: cps/templates/tasks.html:18 +msgid "Starttime" +msgstr "Starttid" + +#: cps/templates/tasks.html:24 +msgid "Delete finished tasks" +msgstr "Ta bort färdiga uppgifter" + +#: cps/templates/tasks.html:25 +msgid "Hide all tasks" +msgstr "Dölj alla uppgifter" + +#: cps/templates/user_edit.html:18 +msgid "Reset user Password" +msgstr "Återställ användarlösenordet" + +#: cps/templates/user_edit.html:27 +msgid "Kindle E-Mail" +msgstr "Kindle e-post" + +#: cps/templates/user_edit.html:41 +msgid "Standard Theme" +msgstr "Standard tema" + +#: cps/templates/user_edit.html:42 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "caliBlur! Mörkt tema (beta)" + +#: cps/templates/user_edit.html:47 +msgid "Show books with language" +msgstr "Visa böcker med språk" + +#: cps/templates/user_edit.html:49 +msgid "Show all" +msgstr "Visa alla" + +#: cps/templates/user_edit.html:147 +msgid "Delete this user" +msgstr "Ta bort den här användaren" + +#: cps/templates/user_edit.html:162 +msgid "Recent Downloads" +msgstr "Senaste hämtningar" + +#~ msgid "Current commit timestamp" +#~ msgstr "Aktuelles Commit Datum" + +#~ msgid "Newest commit timestamp" +#~ msgstr "Neuestes Commit Datum" + +#~ msgid "Convert: %(book)s" +#~ msgstr "Konvertera: %(book)s" + +#~ msgid "Convert to %(format)s: %(book)s" +#~ msgstr "Konvertera till %(format)s: %(book)s" + +#~ msgid "Files are replaced" +#~ msgstr "Filer ersätts" + +#~ msgid "Server is stopped" +#~ msgstr "Servern stoppas" + +#~ msgid "Convertertool %(converter)s not found" +#~ msgstr "Convertertool %(converter)s hittades inte" + +#~ msgid "Choose a password" +#~ msgstr "Välj ett lösenord" + +#~ msgid "Could not find any formats suitable for sending by e-mail" +#~ msgstr "Det gick inte att hitta några format som är lämpliga för att skicka via e-post" + +#~ msgid "Sorry you are not allowed to add a book to the shelf: %(shelfname)s" +#~ msgstr "Tyvärr får du inte lägga till en bok på hyllan: %(shelfname)s" + +#~ msgid "File %(file)s uploaded" +#~ msgstr "Filen %(file)s uppladdad" + diff --git a/src/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo b/src/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo new file mode 100644 index 0000000..86bd49c Binary files /dev/null and b/src/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.mo differ diff --git a/src/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/src/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po new file mode 100644 index 0000000..ee728a9 --- /dev/null +++ b/src/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po @@ -0,0 +1,1980 @@ +# Chinese (Simplified, China) translations for Calibre-Web. +# Copyright (C) 2017 Calibre-Web +# This file is distributed under the same license as the Calibre-Web +# project. +# FIRST AUTHOR dalin , 2017. +msgid "" +msgstr "" +"Project-Id-Version: Calibre-Web\n" +"Report-Msgid-Bugs-To: https://github.com/janeczku/Calibre-Web\n" +"POT-Creation-Date: 2018-11-03 14:03+0100\n" +"PO-Revision-Date: 2017-01-06 17:00+0000\n" +"Last-Translator: dalin \n" +"Language: zh_Hans_CN\n" +"Language-Team: zh_Hans_CN \n" +"Plural-Forms: nplurals=1; plural=0\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134 +#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27 +msgid "not installed" +msgstr "未安装" + +#: cps/converter.py:22 cps/converter.py:38 +msgid "Excecution permissions missing" +msgstr "可执行权限缺失" + +#: cps/converter.py:48 +msgid "not configured" +msgstr "未配置" + +#: cps/helper.py:58 +#, python-format +msgid "%(format)s format not found for book id: %(book)d" +msgstr "找不到id为 %(book)d 的书的 %(format)s 格式" + +#: cps/helper.py:70 +#, python-format +msgid "%(format)s not found on Google Drive: %(fn)s" +msgstr "Google Drive %(fn)s 上找不到 %(format)s" + +#: cps/helper.py:77 cps/helper.py:147 cps/templates/detail.html:44 +msgid "Send to Kindle" +msgstr "发送到Kindle" + +#: cps/helper.py:78 cps/helper.py:96 +msgid "This e-mail has been sent via Calibre-Web." +msgstr "此邮件已经通过Calibre-Web发送" + +#: cps/helper.py:89 +#, python-format +msgid "%(format)s not found: %(fn)s" +msgstr "找不到 %(format)s: %(fn)s" + +#: cps/helper.py:94 +msgid "Calibre-Web test e-mail" +msgstr "Calibre-Web测试邮件" + +#: cps/helper.py:95 +msgid "Test e-mail" +msgstr "测试邮件" + +#: cps/helper.py:111 +msgid "Get Started with Calibre-Web" +msgstr "开启Calibre-Web之旅" + +#: cps/helper.py:112 +#, python-format +msgid "Registration e-mail for user: %(name)s" +msgstr "用户 %(name)s 的注册邮箱" + +#: cps/helper.py:135 cps/helper.py:145 +msgid "Could not find any formats suitable for sending by e-mail" +msgstr "找不到任何适合邮件发送的格式" + +#: cps/helper.py:148 +#, python-format +msgid "E-mail: %(book)s" +msgstr "" + +#: cps/helper.py:150 +msgid "The requested file could not be read. Maybe wrong permissions?" +msgstr "无法读取请求的文件。 可能有错误的权限设置?" + +#: cps/helper.py:250 +#, python-format +msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "将标题从'%(src)s'改为'%(dest)s'时失败,出错信息: %(error)s" + +#: cps/helper.py:259 +#, python-format +msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "将作者从'%(src)s'改为'%(dest)s'时失败,出错信息: %(error)s" + +#: cps/helper.py:281 cps/helper.py:290 +#, python-format +msgid "File %(file)s not found on Google Drive" +msgstr "Google Drive上找不到文件 %(file)s" + +#: cps/helper.py:308 +#, python-format +msgid "Book path %(path)s not found on Google Drive" +msgstr "Google Drive上找不到书籍路径 %(path)s" + +#: cps/helper.py:565 +msgid "Error excecuting UnRar" +msgstr "执行UnRar时出错" + +#: cps/helper.py:567 +msgid "Unrar binary file not found" +msgstr "找不到Unrar二进制文件" + +#: cps/helper.py:609 +msgid "Waiting" +msgstr "等待中" + +#: cps/helper.py:611 +msgid "Failed" +msgstr "失败" + +#: cps/helper.py:613 +msgid "Started" +msgstr "已开始" + +#: cps/helper.py:615 +msgid "Finished" +msgstr "已完成" + +#: cps/helper.py:617 +msgid "Unknown Status" +msgstr "未知状态" + +#: cps/helper.py:622 +msgid "E-mail: " +msgstr "" + +#: cps/helper.py:624 cps/helper.py:628 +msgid "Convert: " +msgstr "转换:" + +#: cps/helper.py:626 +msgid "Upload: " +msgstr "上传:" + +#: cps/helper.py:630 +msgid "Unknown Task: " +msgstr "未知任务:" + +#: cps/web.py:1132 cps/web.py:2842 +msgid "Unknown" +msgstr "未知" + +#: cps/web.py:1141 cps/web.py:1172 cps/web.py:1257 +msgid "HTTP Error" +msgstr "HTTP错误" + +#: cps/web.py:1143 cps/web.py:1174 cps/web.py:1258 +msgid "Connection error" +msgstr "连接错误" + +#: cps/web.py:1145 cps/web.py:1176 cps/web.py:1259 +msgid "Timeout while establishing connection" +msgstr "建立连接超时" + +#: cps/web.py:1147 cps/web.py:1178 cps/web.py:1260 +msgid "General error" +msgstr "一般错误" + +#: cps/web.py:1153 +msgid "Unexpected data while reading update information" +msgstr "读取更新信息时出现异常数据" + +#: cps/web.py:1160 +msgid "No update available. You already have the latest version installed" +msgstr "没有可用更新。您已经安装了最新版本" + +#: cps/web.py:1185 +msgid "A new update is available. Click on the button below to update to the latest version." +msgstr "有一个更新可用。点击正文按钮更新到最新版本。" + +#: cps/web.py:1235 +msgid "Could not fetch update information" +msgstr "无法获取更新信息" + +#: cps/web.py:1250 +msgid "Requesting update package" +msgstr "正在请求更新包" + +#: cps/web.py:1251 +msgid "Downloading update package" +msgstr "正在下载更新包" + +#: cps/web.py:1252 +msgid "Unzipping update package" +msgstr "正在解压更新包" + +#: cps/web.py:1253 +msgid "Replacing files" +msgstr "正在替换文件" + +#: cps/web.py:1254 +msgid "Database connections are closed" +msgstr "数据库连接已关闭" + +#: cps/web.py:1255 +msgid "Stopping server" +msgstr "正在停止服务器" + +#: cps/web.py:1256 +msgid "Update finished, please press okay and reload page" +msgstr "更新完成,请按确定并刷新页面" + +#: cps/web.py:1257 cps/web.py:1258 cps/web.py:1259 cps/web.py:1260 +msgid "Update failed:" +msgstr "更新失败:" + +#: cps/web.py:1283 +msgid "Recently Added Books" +msgstr "最近添加的书籍" + +#: cps/web.py:1293 +msgid "Newest Books" +msgstr "最新书籍" + +#: cps/web.py:1305 +msgid "Oldest Books" +msgstr "最旧书籍" + +#: cps/web.py:1317 +msgid "Books (A-Z)" +msgstr "书籍 (A-Z)" + +#: cps/web.py:1328 +msgid "Books (Z-A)" +msgstr "书籍 (Z-A)" + +#: cps/web.py:1357 +msgid "Hot Books (most downloaded)" +msgstr "热门书籍(最多下载)" + +#: cps/web.py:1370 +msgid "Best rated books" +msgstr "最高评分书籍" + +#: cps/templates/index.xml:39 cps/web.py:1383 +msgid "Random Books" +msgstr "随机书籍" + +#: cps/web.py:1398 +msgid "Author list" +msgstr "作者列表" + +#: cps/web.py:1410 cps/web.py:1501 cps/web.py:1663 cps/web.py:2206 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "无法打开电子书。 文件不存在或者文件不可访问:" + +#: cps/web.py:1438 +msgid "Publisher list" +msgstr "出版社列表" + +#: cps/web.py:1452 +#, python-format +msgid "Publisher: %(name)s" +msgstr "出版社: %(name)s" + +#: cps/templates/index.xml:83 cps/web.py:1484 +msgid "Series list" +msgstr "丛书列表" + +#: cps/web.py:1499 +#, python-format +msgid "Series: %(serie)s" +msgstr "丛书: %(serie)s" + +#: cps/web.py:1528 +msgid "Available languages" +msgstr "可用语言" + +#: cps/web.py:1548 +#, python-format +msgid "Language: %(name)s" +msgstr "语言: %(name)s" + +#: cps/templates/index.xml:76 cps/web.py:1559 +msgid "Category list" +msgstr "分类列表" + +#: cps/web.py:1573 +#, python-format +msgid "Category: %(name)s" +msgstr "分类: %(name)s" + +#: cps/templates/layout.html:71 cps/web.py:1699 +msgid "Tasks" +msgstr "任务" + +#: cps/web.py:1733 +msgid "Statistics" +msgstr "统计" + +#: cps/web.py:1840 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "回调域名尚未被校验,请在google开发者控制台按步骤校验域名" + +#: cps/web.py:1915 +msgid "Server restarted, please reload page" +msgstr "服务器已重启,请刷新页面" + +#: cps/web.py:1918 +msgid "Performing shutdown of server, please close window" +msgstr "正在关闭服务器,请关闭窗口" + +#: cps/web.py:1937 +msgid "Update done" +msgstr "更新完成" + +#: cps/web.py:2007 +msgid "Published after " +msgstr "出版时晚于 " + +#: cps/web.py:2014 +msgid "Published before " +msgstr "出版时早于 " + +#: cps/web.py:2028 +#, python-format +msgid "Rating <= %(rating)s" +msgstr "评分 <= %(rating)s" + +#: cps/web.py:2030 +#, python-format +msgid "Rating >= %(rating)s" +msgstr "评分 >= %(rating)s" + +#: cps/web.py:2089 cps/web.py:2098 +msgid "search" +msgstr "搜索" + +#: cps/templates/index.xml:47 cps/templates/index.xml:51 +#: cps/templates/layout.html:146 cps/web.py:2165 +msgid "Read Books" +msgstr "已读书籍" + +#: cps/templates/index.xml:55 cps/templates/index.xml:59 +#: cps/templates/layout.html:148 cps/web.py:2168 +msgid "Unread Books" +msgstr "未读书籍" + +#: cps/web.py:2216 cps/web.py:2218 cps/web.py:2220 cps/web.py:2232 +msgid "Read a Book" +msgstr "阅读一本书" + +#: cps/web.py:2298 cps/web.py:3201 +msgid "Please fill out all fields!" +msgstr "请填写所有字段" + +#: cps/web.py:2299 cps/web.py:2320 cps/web.py:2324 cps/web.py:2329 +#: cps/web.py:2331 +msgid "register" +msgstr "注册" + +#: cps/web.py:2319 cps/web.py:3417 +msgid "An unknown error occurred. Please try again later." +msgstr "发生一个未知错误,请稍后再试。" + +#: cps/web.py:2322 +msgid "Your e-mail is not allowed to register" +msgstr "您的邮箱不能用来注册" + +#: cps/web.py:2325 +msgid "Confirmation e-mail was send to your e-mail account." +msgstr "确认邮件已经发送到您的邮箱。" + +#: cps/web.py:2328 +msgid "This username or e-mail address is already in use." +msgstr "这个用户名或者邮箱已经被使用。" + +#: cps/web.py:2345 cps/web.py:2441 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "您现在已以'%(nickname)s'身份登录" + +#: cps/web.py:2350 +msgid "Wrong Username or Password" +msgstr "用户名或密码错误" + +#: cps/web.py:2356 cps/web.py:2377 +msgid "login" +msgstr "登录" + +#: cps/web.py:2389 cps/web.py:2420 +msgid "Token not found" +msgstr "找不到Token" + +#: cps/web.py:2397 cps/web.py:2428 +msgid "Token has expired" +msgstr "Token已过期" + +#: cps/web.py:2405 +msgid "Success! Please return to your device" +msgstr "成功!请返回您的设备" + +#: cps/web.py:2455 +msgid "Please configure the SMTP mail settings first..." +msgstr "请先配置SMTP邮箱..." + +#: cps/web.py:2459 +#, python-format +msgid "Book successfully queued for sending to %(kindlemail)s" +msgstr "书籍已经被成功加入 %(kindlemail)s 的发送队列" + +#: cps/web.py:2463 +#, python-format +msgid "There was an error sending this book: %(res)s" +msgstr "发送这本书的时候出现错误: %(res)s" + +#: cps/web.py:2465 cps/web.py:3255 +msgid "Please configure your kindle e-mail address first..." +msgstr "请先配置您的kindle邮箱..." + +#: cps/web.py:2476 cps/web.py:2528 +msgid "Invalid shelf specified" +msgstr "指定的书架无效" + +#: cps/web.py:2483 +#, python-format +msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" +msgstr "对不起,您没有添加书籍到书架 %(shelfname)s 的权限" + +#: cps/web.py:2491 +msgid "You are not allowed to edit public shelves" +msgstr "您没有编辑书架的权限" + +#: cps/web.py:2500 +#, python-format +msgid "Book is already part of the shelf: %(shelfname)s" +msgstr "此书已经是书架 %(shelfname)s 的一部分" + +#: cps/web.py:2514 +#, python-format +msgid "Book has been added to shelf: %(sname)s" +msgstr "此书已被添加到书架: %(sname)s" + +#: cps/web.py:2533 +#, python-format +msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgstr "您没有添加书籍到书架 %(name)s 的权限" + +#: cps/web.py:2538 +msgid "User is not allowed to edit public shelves" +msgstr "用户没有编辑公开书架的权限" + +#: cps/web.py:2556 +#, python-format +msgid "Books are already part of the shelf: %(name)s" +msgstr "书籍已经在书架 %(name)s 中了" + +#: cps/web.py:2570 +#, python-format +msgid "Books have been added to shelf: %(sname)s" +msgstr "书籍已经被添加到书架 %(sname)s 中'" + +#: cps/web.py:2572 +#, python-format +msgid "Could not add books to shelf: %(sname)s" +msgstr "无法添加书籍到书架: %(sname)s" + +#: cps/web.py:2609 +#, python-format +msgid "Book has been removed from shelf: %(sname)s" +msgstr "此书已从书架 %(sname)s 中删除" + +#: cps/web.py:2615 +#, python-format +msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgstr "对不起,您没有从书架 %(sname)s 中删除书籍的权限" + +#: cps/web.py:2635 cps/web.py:2659 +#, python-format +msgid "A shelf with the name '%(title)s' already exists." +msgstr "已存在书架 '%(title)s'。" + +#: cps/web.py:2640 +#, python-format +msgid "Shelf %(title)s created" +msgstr "书架 %(title)s 已被创建" + +#: cps/web.py:2642 cps/web.py:2670 +msgid "There was an error" +msgstr "发生错误" + +#: cps/web.py:2643 cps/web.py:2645 +msgid "create a shelf" +msgstr "创建书架" + +#: cps/web.py:2668 +#, python-format +msgid "Shelf %(title)s changed" +msgstr "书架 %(title)s 已被修改" + +#: cps/web.py:2671 cps/web.py:2673 +msgid "Edit a shelf" +msgstr "编辑书架" + +#: cps/web.py:2694 +#, python-format +msgid "successfully deleted shelf %(name)s" +msgstr "成功删除书架 %(name)s" + +#: cps/web.py:2721 +#, python-format +msgid "Shelf: '%(name)s'" +msgstr "书架: '%(name)s'" + +#: cps/web.py:2724 +msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "打开书架出错。书架不存在或不可访问" + +#: cps/web.py:2755 +#, python-format +msgid "Change order of Shelf: '%(name)s'" +msgstr "修改书架 '%(name)s' 顺序" + +#: cps/web.py:2784 cps/web.py:3207 +msgid "E-mail is not from valid domain" +msgstr "邮箱不在有效域中'" + +#: cps/web.py:2786 cps/web.py:2829 cps/web.py:2832 +#, python-format +msgid "%(name)s's profile" +msgstr "%(name)s 的资料" + +#: cps/web.py:2827 +msgid "Found an existing account for this e-mail address." +msgstr "找到一个已有账号使用这个邮箱。" + +#: cps/web.py:2830 +msgid "Profile updated" +msgstr "资料已更新" + +#: cps/web.py:2858 +msgid "Admin page" +msgstr "管理页" + +#: cps/web.py:2938 cps/web.py:3112 +msgid "Calibre-Web configuration updated" +msgstr "Calibre-Web配置已更新" + +#: cps/templates/admin.html:100 cps/web.py:2951 +msgid "UI Configuration" +msgstr "UI配置" + +#: cps/web.py:2969 +msgid "Import of optional Google Drive requirements missing" +msgstr "可选的Google Drive依赖导入缺失" + +#: cps/web.py:2972 +msgid "client_secrets.json is missing or not readable" +msgstr "client_secrets.json文件缺失或不可读" + +#: cps/web.py:2977 cps/web.py:3004 +msgid "client_secrets.json is not configured for web application" +msgstr "没有为web应用配置client_secrets.json" + +#: cps/templates/admin.html:99 cps/web.py:3007 cps/web.py:3033 cps/web.py:3045 +#: cps/web.py:3088 cps/web.py:3103 cps/web.py:3120 cps/web.py:3127 +#: cps/web.py:3142 +msgid "Basic Configuration" +msgstr "基本配置" + +#: cps/web.py:3030 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "key文件位置无效,请输入正确路径" + +#: cps/web.py:3042 +msgid "Certfile location is not valid, please enter correct path" +msgstr "证书文件位置无效,请输入正确路径" + +#: cps/web.py:3085 +msgid "Logfile location is not valid, please enter correct path" +msgstr "日志文件位置无效,请输入正确路径" + +#: cps/web.py:3124 +msgid "DB location is not valid, please enter correct path" +msgstr "DB位置无效,请输入正确路径" + +#: cps/templates/admin.html:33 cps/web.py:3203 cps/web.py:3209 cps/web.py:3225 +msgid "Add new user" +msgstr "添加新用户" + +#: cps/web.py:3215 +#, python-format +msgid "User '%(user)s' created" +msgstr "用户 '%(user)s' 已被创建" + +#: cps/web.py:3219 +msgid "Found an existing account for this e-mail address or nickname." +msgstr "此邮箱或昵称的账号已经存在。" + +#: cps/web.py:3243 cps/web.py:3257 +msgid "E-mail server settings updated" +msgstr "已更新邮件服务器设置" + +#: cps/web.py:3250 +#, python-format +msgid "Test e-mail successfully send to %(kindlemail)s" +msgstr "测试邮件已经被成功发到 %(kindlemail)s" + +#: cps/web.py:3253 +#, python-format +msgid "There was an error sending the Test e-mail: %(res)s" +msgstr "发送测试邮件出错了: %(res)s" + +#: cps/web.py:3258 +msgid "Edit e-mail server settings" +msgstr "编辑邮箱服务器设置" + +#: cps/web.py:3283 +#, python-format +msgid "User '%(nick)s' deleted" +msgstr "用户 '%(nick)s' 已被删除" + +#: cps/web.py:3392 +#, python-format +msgid "User '%(nick)s' updated" +msgstr "用户 '%(nick)s' 已被更新" + +#: cps/web.py:3395 +msgid "An unknown error occured." +msgstr "发生未知错误。" + +#: cps/web.py:3397 +#, python-format +msgid "Edit User %(nick)s" +msgstr "编辑用户 %(nick)s" + +#: cps/web.py:3414 +#, python-format +msgid "Password for user %(user)s reset" +msgstr "用户 %(user)s 的密码已重置" + +#: cps/web.py:3428 cps/web.py:3629 +msgid "Error opening eBook. File does not exist or file is not accessible" +msgstr "打开电子书出错。文件不存在或不可访问" + +#: cps/web.py:3453 cps/web.py:3912 +msgid "edit metadata" +msgstr "编辑元数据" + +#: cps/web.py:3546 cps/web.py:3782 +#, python-format +msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" +msgstr "不能上传后缀为 '%(ext)s' 的文件到此服务器" + +#: cps/web.py:3550 cps/web.py:3786 +msgid "File to be uploaded must have an extension" +msgstr "要上传的文件必须有一个后缀" + +#: cps/web.py:3562 cps/web.py:3806 +#, python-format +msgid "Failed to create path %(path)s (Permission denied)." +msgstr "创建路径 %(path)s 失败(权限拒绝)。" + +#: cps/web.py:3567 +#, python-format +msgid "Failed to store file %(file)s." +msgstr "保存文件 %(file)s 失败。" + +#: cps/web.py:3583 +#, python-format +msgid "File format %(ext)s added to %(book)s" +msgstr "已添加 %(ext)s 格式到 %(book)s" + +#: cps/web.py:3601 +#, python-format +msgid "Failed to create path for cover %(path)s (Permission denied)." +msgstr "为封面 %(path)s 创建路径失败(权限拒绝)。" + +#: cps/web.py:3608 +#, python-format +msgid "Failed to store cover-file %(cover)s." +msgstr "保存封面文件 %(cover)s 失败。" + +#: cps/web.py:3611 +msgid "Cover-file is not a valid image file" +msgstr "封面文件不是一个有效的图片文件" + +#: cps/web.py:3641 cps/web.py:3650 cps/web.py:3654 +msgid "unknown" +msgstr "未知" + +#: cps/web.py:3673 +msgid "Cover is not a jpg file, can't save" +msgstr "封面不是一个jpg文件,无法保存" + +#: cps/web.py:3721 +#, python-format +msgid "%(langname)s is not a valid language" +msgstr "%(langname)s 不是一种有效语言" + +#: cps/web.py:3752 +msgid "Metadata successfully updated" +msgstr "已成功更新元数据" + +#: cps/web.py:3761 +msgid "Error editing book, please check logfile for details" +msgstr "编辑书籍出错,详情请检查日志文件" + +#: cps/web.py:3811 +#, python-format +msgid "Failed to store file %(file)s (Permission denied)." +msgstr "存储文件 %(file)s 失败(权限拒绝)。" + +#: cps/web.py:3816 +#, python-format +msgid "Failed to delete file %(file)s (Permission denied)." +msgstr "删除文件 %(file)s 失败(权限拒绝)。" + +#: cps/web.py:3898 +#, python-format +msgid "File %(file)s uploaded" +msgstr "文件 %(file)s 已上传" + +#: cps/web.py:3928 +msgid "Source or destination format for conversion missing" +msgstr "转换的源或目的格式缺失" + +#: cps/web.py:3938 +#, python-format +msgid "Book successfully queued for converting to %(book_format)s" +msgstr "书籍已经被成功加入 %(book_format)s 的转换队列" + +#: cps/web.py:3942 +#, python-format +msgid "There was an error converting this book: %(res)s" +msgstr "转换此书时出现错误: %(res)s" + +#: cps/worker.py:287 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "电子书转换器失败: %(error)s" + +#: cps/worker.py:298 +#, python-format +msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" +msgstr "Kindlegen 因为错误 %(error)s 失败。消息: %(message)s" + +#: cps/templates/admin.html:6 +msgid "User list" +msgstr "用户列表" + +#: cps/templates/admin.html:9 +msgid "Nickname" +msgstr "昵称" + +#: cps/templates/admin.html:10 +msgid "E-mail" +msgstr "" + +#: cps/templates/admin.html:11 +msgid "Kindle" +msgstr "" + +#: cps/templates/admin.html:12 +msgid "DLS" +msgstr "" + +#: cps/templates/admin.html:13 cps/templates/layout.html:74 +msgid "Admin" +msgstr "管理" + +#: cps/templates/admin.html:14 cps/templates/detail.html:22 +#: cps/templates/detail.html:31 +msgid "Download" +msgstr "下载" + +#: cps/templates/admin.html:15 cps/templates/layout.html:64 +msgid "Upload" +msgstr "上传" + +#: cps/templates/admin.html:16 +msgid "Edit" +msgstr "编辑" + +#: cps/templates/admin.html:39 +msgid "SMTP e-mail server settings" +msgstr "SMTP邮件服务器设置" + +#: cps/templates/admin.html:42 cps/templates/email_edit.html:11 +msgid "SMTP hostname" +msgstr "SMTP地址" + +#: cps/templates/admin.html:43 +msgid "SMTP port" +msgstr "SMTP端口" + +#: cps/templates/admin.html:44 +msgid "SSL" +msgstr "" + +#: cps/templates/admin.html:45 cps/templates/email_edit.html:27 +msgid "SMTP login" +msgstr "SMTP用户名" + +#: cps/templates/admin.html:46 +msgid "From mail" +msgstr "来自邮箱" + +#: cps/templates/admin.html:56 +msgid "Change SMTP settings" +msgstr "修改SMTP设置" + +#: cps/templates/admin.html:62 +msgid "Configuration" +msgstr "配置" + +#: cps/templates/admin.html:65 +msgid "Calibre DB dir" +msgstr "Calibre DB目录" + +#: cps/templates/admin.html:69 +msgid "Log level" +msgstr "日志级别" + +#: cps/templates/admin.html:73 +msgid "Port" +msgstr "端口" + +#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23 +msgid "Books per page" +msgstr "每页书籍数" + +#: cps/templates/admin.html:83 +msgid "Uploading" +msgstr "上传" + +#: cps/templates/admin.html:87 +msgid "Anonymous browsing" +msgstr "匿名浏览" + +#: cps/templates/admin.html:91 +msgid "Public registration" +msgstr "开放注册" + +#: cps/templates/admin.html:95 cps/templates/remote_login.html:4 +msgid "Remote login" +msgstr "远程登录" + +#: cps/templates/admin.html:106 +msgid "Administration" +msgstr "管理" + +#: cps/templates/admin.html:107 +msgid "Reconnect to Calibre DB" +msgstr "重新连接到Calibre数据库" + +#: cps/templates/admin.html:108 +msgid "Restart Calibre-Web" +msgstr "重启 Calibre-Web" + +#: cps/templates/admin.html:109 +msgid "Stop Calibre-Web" +msgstr "停止 Calibre-Web" + +#: cps/templates/admin.html:115 +msgid "Update" +msgstr "更新" + +#: cps/templates/admin.html:119 +msgid "Version" +msgstr "版本" + +#: cps/templates/admin.html:120 +msgid "Details" +msgstr "详情" + +#: cps/templates/admin.html:126 +msgid "Current version" +msgstr "当前版本" + +#: cps/templates/admin.html:132 +msgid "Check for update" +msgstr "检查更新" + +#: cps/templates/admin.html:133 +msgid "Perform Update" +msgstr "执行更新" + +#: cps/templates/admin.html:145 +msgid "Do you really want to restart Calibre-Web?" +msgstr "您确定要重启 Calibre-Web 吗?" + +#: cps/templates/admin.html:150 cps/templates/admin.html:164 +#: cps/templates/admin.html:184 cps/templates/shelf.html:61 +msgid "Ok" +msgstr "确定" + +#: cps/templates/admin.html:151 cps/templates/admin.html:165 +#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200 +#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168 +#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75 +#: cps/templates/shelf.html:62 cps/templates/shelf_edit.html:19 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155 +msgid "Back" +msgstr "后退" + +#: cps/templates/admin.html:163 +msgid "Do you really want to stop Calibre-Web?" +msgstr "您确定要关闭 Calibre-Web 吗?" + +#: cps/templates/admin.html:175 +msgid "Updating, please do not reload page" +msgstr "正在更新,请不要刷新页面" + +#: cps/templates/author.html:15 +msgid "via" +msgstr "" + +#: cps/templates/author.html:23 +msgid "In Library" +msgstr "" + +#: cps/templates/author.html:69 +msgid "More by" +msgstr "" + +#: cps/templates/book_edit.html:16 +msgid "Delete Book" +msgstr "删除书籍" + +#: cps/templates/book_edit.html:19 +msgid "Delete formats:" +msgstr "删除格式:" + +#: cps/templates/book_edit.html:22 cps/templates/book_edit.html:199 +#: cps/templates/email_edit.html:73 cps/templates/email_edit.html:74 +msgid "Delete" +msgstr "删除" + +#: cps/templates/book_edit.html:30 +msgid "Convert book format:" +msgstr "转换书籍格式:" + +#: cps/templates/book_edit.html:34 +msgid "Convert from:" +msgstr "从格式转换:" + +#: cps/templates/book_edit.html:36 cps/templates/book_edit.html:43 +msgid "select an option" +msgstr "选择一个选项" + +#: cps/templates/book_edit.html:41 +msgid "Convert to:" +msgstr "转换到:" + +#: cps/templates/book_edit.html:50 +msgid "Convert book" +msgstr "转换书籍" + +#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6 +msgid "Book Title" +msgstr "书名" + +#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:259 +#: cps/templates/book_edit.html:277 cps/templates/search_form.html:10 +msgid "Author" +msgstr "作者" + +#: cps/templates/book_edit.html:67 cps/templates/book_edit.html:264 +#: cps/templates/book_edit.html:279 cps/templates/search_form.html:106 +msgid "Description" +msgstr "简介" + +#: cps/templates/book_edit.html:71 cps/templates/search_form.html:33 +msgid "Tags" +msgstr "标签" + +#: cps/templates/book_edit.html:75 cps/templates/layout.html:157 +#: cps/templates/search_form.html:53 +msgid "Series" +msgstr "丛书" + +#: cps/templates/book_edit.html:79 +msgid "Series id" +msgstr "丛书ID" + +#: cps/templates/book_edit.html:83 +msgid "Rating" +msgstr "评分" + +#: cps/templates/book_edit.html:87 +msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +msgstr "封面URL(jpg,封面会被下载被保存在数据库中,然后字段会被重新清空)" + +#: cps/templates/book_edit.html:91 +msgid "Upload Cover from local drive" +msgstr "从本地磁盘上传封面" + +#: cps/templates/book_edit.html:96 cps/templates/detail.html:135 +msgid "Publishing date" +msgstr "出版日期" + +#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:278 cps/templates/detail.html:127 +#: cps/templates/search_form.html:14 +msgid "Publisher" +msgstr "出版社" + +#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31 +msgid "Language" +msgstr "语言" + +#: cps/templates/book_edit.html:117 cps/templates/search_form.html:117 +msgid "Yes" +msgstr "确认" + +#: cps/templates/book_edit.html:118 cps/templates/search_form.html:118 +msgid "No" +msgstr "" + +#: cps/templates/book_edit.html:164 +msgid "Upload format" +msgstr "上传格式" + +#: cps/templates/book_edit.html:173 +msgid "view book after edit" +msgstr "编辑后查看书籍" + +#: cps/templates/book_edit.html:176 cps/templates/book_edit.html:212 +msgid "Get metadata" +msgstr "获取元数据" + +#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210 +#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20 +#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17 +#: cps/templates/user_edit.html:153 +msgid "Submit" +msgstr "提交" + +#: cps/templates/book_edit.html:191 +msgid "Are you really sure?" +msgstr "您真的确认?" + +#: cps/templates/book_edit.html:194 +msgid "Book will be deleted from Calibre database" +msgstr "书籍会被从Calibre数据库和硬盘中删除" + +#: cps/templates/book_edit.html:195 +msgid "and from hard disk" +msgstr "" + +#: cps/templates/book_edit.html:215 +msgid "Keyword" +msgstr "关键字" + +#: cps/templates/book_edit.html:216 +msgid " Search keyword " +msgstr "搜索关键字" + +#: cps/templates/book_edit.html:218 cps/templates/layout.html:46 +msgid "Go!" +msgstr "走起!" + +#: cps/templates/book_edit.html:222 +msgid "Click the cover to load metadata to the form" +msgstr "点击封面加载元数据到表单" + +#: cps/templates/book_edit.html:234 cps/templates/book_edit.html:274 +msgid "Loading..." +msgstr "加载中..." + +#: cps/templates/book_edit.html:239 cps/templates/layout.html:224 +msgid "Close" +msgstr "关闭" + +#: cps/templates/book_edit.html:266 cps/templates/book_edit.html:280 +msgid "Source" +msgstr "来源" + +#: cps/templates/book_edit.html:275 +msgid "Search error!" +msgstr "搜索错误" + +#: cps/templates/book_edit.html:276 +msgid "No Result(s) found! Please try aonther keyword." +msgstr "找不到结果。请尝试另一个关键字" + +#: cps/templates/config_edit.html:12 +msgid "Library Configuration" +msgstr "书库配置" + +#: cps/templates/config_edit.html:19 +msgid "Location of Calibre database" +msgstr "Calibre 数据库位置" + +#: cps/templates/config_edit.html:24 +msgid "Use Google Drive?" +msgstr "是否使用Google Drive?" + +#: cps/templates/config_edit.html:30 +msgid "Google Drive config problem" +msgstr "Google Drive 配置问题" + +#: cps/templates/config_edit.html:36 +msgid "Authenticate Google Drive" +msgstr "认证 Google Drive" + +#: cps/templates/config_edit.html:40 +msgid "Please finish Google Drive setup after login" +msgstr "登录后请完成Google Drive设置" + +#: cps/templates/config_edit.html:44 +msgid "Google Drive Calibre folder" +msgstr "Google Drive Calibre 目录" + +#: cps/templates/config_edit.html:52 +msgid "Metadata Watch Channel ID" +msgstr "元数据监视频道ID" + +#: cps/templates/config_edit.html:55 +msgid "Revoke" +msgstr "撤回" + +#: cps/templates/config_edit.html:73 +msgid "Server Configuration" +msgstr "服务器配置" + +#: cps/templates/config_edit.html:80 +msgid "Server Port" +msgstr "服务器端口" + +#: cps/templates/config_edit.html:84 +msgid "SSL certfile location (leave it empty for non-SSL Servers)" +msgstr "SSL 证书文件位置(非SSL服务器请留空)" + +#: cps/templates/config_edit.html:88 +msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" +msgstr "SSL Key文件位置(非SSL服务器请留空)" + +#: cps/templates/config_edit.html:99 +msgid "Logfile Configuration" +msgstr "日志文件配置" + +#: cps/templates/config_edit.html:106 +msgid "Log Level" +msgstr "日志级别" + +#: cps/templates/config_edit.html:115 +msgid "Location and name of logfile (calibre-web.log for no entry)" +msgstr "日志文件位置和名称(默认为calibre-web.log)" + +#: cps/templates/config_edit.html:126 +msgid "Feature Configuration" +msgstr "特性配置" + +#: cps/templates/config_edit.html:134 +msgid "Enable uploading" +msgstr "启用上传" + +#: cps/templates/config_edit.html:138 +msgid "Enable anonymous browsing" +msgstr "启用匿名浏览" + +#: cps/templates/config_edit.html:142 +msgid "Enable public registration" +msgstr "启用注册" + +#: cps/templates/config_edit.html:146 +msgid "Enable remote login (\"magic link\")" +msgstr "启用远程登录 ('魔法链接')" + +#: cps/templates/config_edit.html:151 +msgid "Use" +msgstr "使用" + +#: cps/templates/config_edit.html:152 +msgid "Obtain an API Key" +msgstr "获取API Key" + +#: cps/templates/config_edit.html:156 +msgid "Goodreads API Key" +msgstr "" + +#: cps/templates/config_edit.html:160 +msgid "Goodreads API Secret" +msgstr "" + +#: cps/templates/config_edit.html:173 +msgid "External binaries" +msgstr "外部二进制" + +#: cps/templates/config_edit.html:181 +msgid "No converter" +msgstr "没有转换器" + +#: cps/templates/config_edit.html:183 +msgid "Use Kindlegen" +msgstr "使用Kindlegen" + +#: cps/templates/config_edit.html:185 +msgid "Use calibre's ebook converter" +msgstr "使用calibre的电子书转换器" + +#: cps/templates/config_edit.html:189 +msgid "E-Book converter settings" +msgstr "电子书转换设置" + +#: cps/templates/config_edit.html:193 +msgid "Path to convertertool" +msgstr "转换工具路径" + +#: cps/templates/config_edit.html:199 +msgid "Location of Unrar binary" +msgstr "Unrar二进制位置" + +#: cps/templates/config_edit.html:215 cps/templates/layout.html:82 +#: cps/templates/login.html:4 +msgid "Login" +msgstr "登录" + +#: cps/templates/config_view_edit.html:12 +msgid "View Configuration" +msgstr "查看配置" + +#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 +#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 +msgid "Title" +msgstr "标题" + +#: cps/templates/config_view_edit.html:27 +msgid "No. of random books to show" +msgstr "随机书籍显示数量" + +#: cps/templates/config_view_edit.html:31 +msgid "Regular expression for ignoring columns" +msgstr "忽略列的正则表达式" + +#: cps/templates/config_view_edit.html:35 +msgid "Link read/unread status to Calibre column" +msgstr "链接 已读/未读 状态到Calibre栏" + +#: cps/templates/config_view_edit.html:44 +msgid "Regular expression for title sorting" +msgstr "标题排序的正则表达式" + +#: cps/templates/config_view_edit.html:48 +msgid "Tags for Mature Content" +msgstr "成人内容标签" + +#: cps/templates/config_view_edit.html:62 +msgid "Default settings for new users" +msgstr "新用户默认设置" + +#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110 +msgid "Admin user" +msgstr "管理用户" + +#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119 +msgid "Allow Downloads" +msgstr "允许下载" + +#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123 +msgid "Allow Uploads" +msgstr "允许上传" + +#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127 +msgid "Allow Edit" +msgstr "允许编辑" + +#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131 +msgid "Allow Delete books" +msgstr "允许删除书籍" + +#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136 +msgid "Allow Changing Password" +msgstr "允许修改密码" + +#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140 +msgid "Allow Editing Public Shelfs" +msgstr "允许编辑公共书架" + +#: cps/templates/config_view_edit.html:104 +msgid "Default visibilities for new users" +msgstr "新用户的默认显示权限" + +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58 +msgid "Show random books" +msgstr "显示随机书籍" + +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62 +msgid "Show recent books" +msgstr "显示最近书籍" + +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66 +msgid "Show sorted books" +msgstr "显示已排序书籍" + +#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70 +msgid "Show hot books" +msgstr "显示热门书籍" + +#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74 +msgid "Show best rated books" +msgstr "显示最高评分书籍" + +#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78 +msgid "Show language selection" +msgstr "显示语言选择" + +#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82 +msgid "Show series selection" +msgstr "显示丛书选择" + +#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86 +msgid "Show category selection" +msgstr "显示分类选择" + +#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90 +msgid "Show author selection" +msgstr "显示作者选择" + +#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94 +msgid "Show publisher selection" +msgstr "显示出版社选择" + +#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98 +msgid "Show read and unread" +msgstr "显示已读和未读" + +#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102 +msgid "Show random books in detail view" +msgstr "在详情页显示随机书籍" + +#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115 +msgid "Show mature content" +msgstr "显示成人内容" + +#: cps/templates/detail.html:49 +msgid "Read in browser" +msgstr "在浏览器中阅读" + +#: cps/templates/detail.html:88 +msgid "Book" +msgstr "" + +#: cps/templates/detail.html:88 +msgid "of" +msgstr "" + +#: cps/templates/detail.html:94 +msgid "language" +msgstr "语言" + +#: cps/templates/detail.html:172 +msgid "Read" +msgstr "" + +#: cps/templates/detail.html:182 +msgid "Description:" +msgstr "简介:" + +#: cps/templates/detail.html:195 cps/templates/search.html:14 +msgid "Add to shelf" +msgstr "添加到书架" + +#: cps/templates/detail.html:257 +msgid "Edit metadata" +msgstr "编辑元数据" + +#: cps/templates/email_edit.html:15 +msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +msgstr "SMTP端口(无加密SMTP通常是25, SSL加密是465, STARTTLS加密是587)" + +#: cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "加密方式" + +#: cps/templates/email_edit.html:21 +msgid "None" +msgstr "无" + +#: cps/templates/email_edit.html:22 +msgid "STARTTLS" +msgstr "" + +#: cps/templates/email_edit.html:23 +msgid "SSL/TLS" +msgstr "" + +#: cps/templates/email_edit.html:31 +msgid "SMTP password" +msgstr "SMTP密码" + +#: cps/templates/email_edit.html:35 +msgid "From e-mail" +msgstr "来自邮箱" + +#: cps/templates/email_edit.html:38 +msgid "Save settings" +msgstr "保存设置" + +#: cps/templates/email_edit.html:39 +msgid "Save settings and send Test E-Mail" +msgstr "保存设置并发送测试邮件" + +#: cps/templates/email_edit.html:43 +msgid "Allowed domains for registering" +msgstr "允许注册的域名" + +#: cps/templates/email_edit.html:47 +msgid "Enter domainname" +msgstr "输入域名" + +#: cps/templates/email_edit.html:55 +msgid "Add Domain" +msgstr "添加域名" + +#: cps/templates/email_edit.html:58 +msgid "Add" +msgstr "添加" + +#: cps/templates/email_edit.html:72 +msgid "Do you really want to delete this domain rule?" +msgstr "您确定要删除这条域名规则吗?" + +#: cps/templates/feed.xml:21 cps/templates/layout.html:208 +msgid "Next" +msgstr "下一个" + +#: cps/templates/feed.xml:33 cps/templates/index.xml:11 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 +msgid "Search" +msgstr "搜索" + +#: cps/templates/index.html:5 +msgid "Discover (Random Books)" +msgstr "发现(随机书籍)" + +#: cps/templates/index.xml:6 +msgid "Start" +msgstr "开始" + +#: cps/templates/index.xml:18 cps/templates/layout.html:139 +msgid "Hot Books" +msgstr "热门书籍" + +#: cps/templates/index.xml:22 +msgid "Popular publications from this catalog based on Downloads." +msgstr "基于下载数的热门书籍" + +#: cps/templates/index.xml:25 cps/templates/layout.html:142 +msgid "Best rated Books" +msgstr "最高评分书籍" + +#: cps/templates/index.xml:29 +msgid "Popular publications from this catalog based on Rating." +msgstr "基于评分的热门书籍" + +#: cps/templates/index.xml:32 +msgid "New Books" +msgstr "新书" + +#: cps/templates/index.xml:36 +msgid "The latest Books" +msgstr "最新书籍" + +#: cps/templates/index.xml:43 +msgid "Show Random Books" +msgstr "显示随机书籍" + +#: cps/templates/index.xml:62 cps/templates/layout.html:160 +msgid "Authors" +msgstr "作者" + +#: cps/templates/index.xml:66 +msgid "Books ordered by Author" +msgstr "书籍按作者排序" + +#: cps/templates/index.xml:69 cps/templates/layout.html:163 +msgid "Publishers" +msgstr "出版社" + +#: cps/templates/index.xml:73 +msgid "Books ordered by publisher" +msgstr "书籍按出版社排版" + +#: cps/templates/index.xml:80 +msgid "Books ordered by category" +msgstr "书籍按分类排序" + +#: cps/templates/index.xml:87 +msgid "Books ordered by series" +msgstr "书籍按丛书排序" + +#: cps/templates/index.xml:90 cps/templates/layout.html:169 +msgid "Public Shelves" +msgstr "公开书架" + +#: cps/templates/index.xml:94 +msgid "Books organized in public shelfs, visible to everyone" +msgstr "公开书架中的书籍,对所有人都可见" + +#: cps/templates/index.xml:98 cps/templates/layout.html:173 +msgid "Your Shelves" +msgstr "您的书架" + +#: cps/templates/index.xml:102 +msgid "User's own shelfs, only visible to the current user himself" +msgstr "用户私有书架,只对当前用户本身可见" + +#: cps/templates/layout.html:33 +msgid "Toggle navigation" +msgstr "切换导航" + +#: cps/templates/layout.html:54 +msgid "Advanced Search" +msgstr "高级搜索" + +#: cps/templates/layout.html:78 +msgid "Logout" +msgstr "注销" + +#: cps/templates/layout.html:83 cps/templates/register.html:14 +msgid "Register" +msgstr "注册" + +#: cps/templates/layout.html:108 +msgid "Uploading..." +msgstr "上传中..." + +#: cps/templates/layout.html:109 +msgid "please don't refresh the page" +msgstr "请不要刷新页面" + +#: cps/templates/layout.html:120 +msgid "Browse" +msgstr "浏览" + +#: cps/templates/layout.html:122 +msgid "Recently Added" +msgstr "最近添加" + +#: cps/templates/layout.html:127 +msgid "Sorted Books" +msgstr "已排序书籍" + +#: cps/templates/layout.html:131 cps/templates/layout.html:132 +#: cps/templates/layout.html:133 cps/templates/layout.html:134 +msgid "Sort By" +msgstr "排序" + +#: cps/templates/layout.html:131 +msgid "Newest" +msgstr "最新" + +#: cps/templates/layout.html:132 +msgid "Oldest" +msgstr "最旧" + +#: cps/templates/layout.html:133 +msgid "Ascending" +msgstr "升序" + +#: cps/templates/layout.html:134 +msgid "Descending" +msgstr "降序" + +#: cps/templates/layout.html:151 +msgid "Discover" +msgstr "发现" + +#: cps/templates/layout.html:154 +msgid "Categories" +msgstr "分类" + +#: cps/templates/layout.html:166 cps/templates/search_form.html:74 +msgid "Languages" +msgstr "语言" + +#: cps/templates/layout.html:178 +msgid "Create a Shelf" +msgstr "创建书架" + +#: cps/templates/layout.html:179 cps/templates/stats.html:3 +msgid "About" +msgstr "关于" + +#: cps/templates/layout.html:193 +msgid "Previous" +msgstr "上一个" + +#: cps/templates/layout.html:220 +msgid "Book Details" +msgstr "书籍详情" + +#: cps/templates/login.html:8 cps/templates/login.html:9 +#: cps/templates/register.html:7 cps/templates/user_edit.html:8 +msgid "Username" +msgstr "用户名" + +#: cps/templates/login.html:12 cps/templates/login.html:13 +#: cps/templates/user_edit.html:21 +msgid "Password" +msgstr "密码" + +#: cps/templates/login.html:17 +msgid "Remember me" +msgstr "记住我" + +#: cps/templates/login.html:22 +msgid "Log in with magic link" +msgstr "通过魔法链接登录" + +#: cps/templates/osd.xml:5 +msgid "Calibre-Web ebook catalog" +msgstr "Caliebre-Web电子书目录" + +#: cps/templates/read.html:69 cps/templates/readcbr.html:79 +#: cps/templates/readcbr.html:103 +msgid "Settings" +msgstr "设置" + +#: cps/templates/read.html:72 +msgid "Reflow text when sidebars are open." +msgstr "" + +#: cps/templates/readcbr.html:84 +msgid "Keyboard Shortcuts" +msgstr "快捷键" + +#: cps/templates/readcbr.html:87 +msgid "Previous Page" +msgstr "上一页" + +#: cps/templates/readcbr.html:88 +msgid "Next Page" +msgstr "下一页" + +#: cps/templates/readcbr.html:89 +msgid "Scale to Best" +msgstr "缩放到最佳" + +#: cps/templates/readcbr.html:90 +msgid "Scale to Width" +msgstr "按宽度缩放" + +#: cps/templates/readcbr.html:91 +msgid "Scale to Height" +msgstr "按高度缩放" + +#: cps/templates/readcbr.html:92 +msgid "Scale to Native" +msgstr "" + +#: cps/templates/readcbr.html:93 +msgid "Rotate Right" +msgstr "向右旋转" + +#: cps/templates/readcbr.html:94 +msgid "Rotate Left" +msgstr "向左旋转" + +#: cps/templates/readcbr.html:95 +msgid "Flip Image" +msgstr "翻转图片" + +#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39 +msgid "Theme" +msgstr "主题" + +#: cps/templates/readcbr.html:111 +msgid "Light" +msgstr "浅色" + +#: cps/templates/readcbr.html:112 +msgid "Dark" +msgstr "深色" + +#: cps/templates/readcbr.html:117 +msgid "Scale" +msgstr "缩放" + +#: cps/templates/readcbr.html:120 +msgid "Best" +msgstr "最佳" + +#: cps/templates/readcbr.html:121 +msgid "Width" +msgstr "宽度" + +#: cps/templates/readcbr.html:122 +msgid "Height" +msgstr "高度" + +#: cps/templates/readcbr.html:123 +msgid "Native" +msgstr "" + +#: cps/templates/readcbr.html:128 +msgid "Rotate" +msgstr "旋转" + +#: cps/templates/readcbr.html:139 +msgid "Flip" +msgstr "翻转" + +#: cps/templates/readcbr.html:142 +msgid "Horizontal" +msgstr "水平" + +#: cps/templates/readcbr.html:143 +msgid "Vertical" +msgstr "垂直" + +#: cps/templates/readpdf.html:29 +msgid "PDF.js viewer" +msgstr "PDF.js 查看器" + +#: cps/templates/readtxt.html:6 +msgid "Basic txt Reader" +msgstr "简单txt阅读器" + +#: cps/templates/register.html:4 +msgid "Register a new account" +msgstr "注册新用户" + +#: cps/templates/register.html:8 +msgid "Choose a username" +msgstr "选择一个用户名" + +#: cps/templates/register.html:11 cps/templates/user_edit.html:13 +msgid "E-mail address" +msgstr "邮箱地址" + +#: cps/templates/register.html:12 +msgid "Your email address" +msgstr "您的邮箱地址" + +#: cps/templates/remote_login.html:6 +msgid "Using your another device, visit" +msgstr "使用您的另一个设备访问" + +#: cps/templates/remote_login.html:6 +msgid "and log in" +msgstr "和登录" + +#: cps/templates/remote_login.html:9 +msgid "Once you do so, you will automatically get logged in on this device." +msgstr "一旦您这样做了,您在这个设备上会自动登录。" + +#: cps/templates/search.html:5 +msgid "No Results for:" +msgstr "找不到结果:" + +#: cps/templates/search.html:6 +msgid "Please try a different search" +msgstr "请尝试别的关键字" + +#: cps/templates/search.html:8 +msgid "Results for:" +msgstr "结果:" + +#: cps/templates/search_form.html:19 +msgid "Publishing date from" +msgstr "" + +#: cps/templates/search_form.html:26 +msgid "Publishing date to" +msgstr "" + +#: cps/templates/search_form.html:43 +msgid "Exclude Tags" +msgstr "排除标签" + +#: cps/templates/search_form.html:63 +msgid "Exclude Series" +msgstr "排除丛书" + +#: cps/templates/search_form.html:84 +msgid "Exclude Languages" +msgstr "排除语言" + +#: cps/templates/search_form.html:97 +msgid "Rating bigger than" +msgstr "评分大于" + +#: cps/templates/search_form.html:101 +msgid "Rating less than" +msgstr "评分小于" + +#: cps/templates/shelf.html:7 +msgid "Delete this Shelf" +msgstr "删除此书架" + +#: cps/templates/shelf.html:8 +msgid "Edit Shelf" +msgstr "编辑书架" + +#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11 +msgid "Change order" +msgstr "修改顺序" + +#: cps/templates/shelf.html:56 +msgid "Do you really want to delete the shelf?" +msgstr "您真的想要删除这个书架吗?" + +#: cps/templates/shelf.html:59 +msgid "Shelf will be lost for everybody and forever!" +msgstr "书架将会永远丢失!" + +#: cps/templates/shelf_edit.html:13 +msgid "should the shelf be public?" +msgstr "要公开此书架吗?" + +#: cps/templates/shelf_order.html:5 +msgid "Drag 'n drop to rearrange order" +msgstr "拖拽以重新排序" + +#: cps/templates/stats.html:7 +msgid "Calibre library statistics" +msgstr "Calibre书库统计" + +#: cps/templates/stats.html:12 +msgid "Books in this Library" +msgstr "本书在此书库" + +#: cps/templates/stats.html:16 +msgid "Authors in this Library" +msgstr "个作者在此书库" + +#: cps/templates/stats.html:20 +msgid "Categories in this Library" +msgstr "个分类在此书库" + +#: cps/templates/stats.html:24 +msgid "Series in this Library" +msgstr "个丛书在此书库" + +#: cps/templates/stats.html:28 +msgid "Linked libraries" +msgstr "链接库" + +#: cps/templates/stats.html:32 +msgid "Program library" +msgstr "程序库" + +#: cps/templates/stats.html:33 +msgid "Installed Version" +msgstr "已安装版本" + +#: cps/templates/tasks.html:7 +msgid "Tasks list" +msgstr "任务列表" + +#: cps/templates/tasks.html:12 +msgid "User" +msgstr "用户" + +#: cps/templates/tasks.html:14 +msgid "Task" +msgstr "任务" + +#: cps/templates/tasks.html:15 +msgid "Status" +msgstr "状态" + +#: cps/templates/tasks.html:16 +msgid "Progress" +msgstr "进展" + +#: cps/templates/tasks.html:17 +msgid "Runtime" +msgstr "运行时间" + +#: cps/templates/tasks.html:18 +msgid "Starttime" +msgstr "开始时间" + +#: cps/templates/tasks.html:24 +msgid "Delete finished tasks" +msgstr "删除已完成任务" + +#: cps/templates/tasks.html:25 +msgid "Hide all tasks" +msgstr "隐藏所有任务" + +#: cps/templates/user_edit.html:18 +msgid "Reset user Password" +msgstr "重置用户密码" + +#: cps/templates/user_edit.html:27 +msgid "Kindle E-Mail" +msgstr "" + +#: cps/templates/user_edit.html:41 +msgid "Standard Theme" +msgstr "标准主题" + +#: cps/templates/user_edit.html:42 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "" + +#: cps/templates/user_edit.html:47 +msgid "Show books with language" +msgstr "按语言显示书籍" + +#: cps/templates/user_edit.html:49 +msgid "Show all" +msgstr "显示全部" + +#: cps/templates/user_edit.html:147 +msgid "Delete this user" +msgstr "删除此用户" + +#: cps/templates/user_edit.html:162 +msgid "Recent Downloads" +msgstr "最近下载" + +#~ msgid "Published after %s" +#~ msgstr "出版时晚于 %s" + +#~ msgid "%s: %s" +#~ msgstr "" + +#~ msgid "E-Mail: %s" +#~ msgstr "" + +#~ msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +#~ msgstr "将标题从'%(src)s'改为'%(dest)s'时失败,出错信息: %(error)s" + +#~ msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +#~ msgstr "将作者从'%(src)s'改为'%(dest)s'时失败,出错信息: %(error)s" + +#~ msgid "Password for user %(user)s reset" +#~ msgstr "用户 %(user)s 的密码已重置" + +#~ msgid "Password for user %s reset" +#~ msgstr "" + +#~ msgid "Rename title from: '%(src)s' to '%(src)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Rename author from: '%(src)s' to '%(src)s' failed with error: %(error)s" +#~ msgstr "" + +#~ msgid "Failed to create path for cover %(cover)s (Permission denied)." +#~ msgstr "为封面 %(cover)s 创建路径失败(权限拒绝)。" + +#~ msgid "File extension '%s' is not allowed to be uploaded to this server" +#~ msgstr "" + +#~ msgid "File extension \"%(ext)s\" is not allowed to be uploaded to this server" +#~ msgstr "不能上传后缀为 \"%(ext)s\" 的文件到此服务器" + +#~ msgid "Current commit timestamp" +#~ msgstr "当前提交时间戳" + +#~ msgid "Newest commit timestamp" +#~ msgstr "最新提交时间戳" + +#~ msgid "Convert: %(book)s" +#~ msgstr "转换: %(book)s" + +#~ msgid "Convert to %(format)s: %(book)s" +#~ msgstr "转换到 %(format)s: %(book)s" + +#~ msgid "Files are replaced" +#~ msgstr "文件已替换" + +#~ msgid "Server is stopped" +#~ msgstr "服务器已停止" + +#~ msgid "Convertertool %(converter)s not found" +#~ msgstr "找不到转换工具 $(converter)s" + +#~ msgid "Choose a password" +#~ msgstr "选择一个密码" + diff --git a/src/cps/ub.py b/src/cps/ub.py new file mode 100644 index 0000000..57dbde6 --- /dev/null +++ b/src/cps/ub.py @@ -0,0 +1,783 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from sqlalchemy import * +from sqlalchemy import exc +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import * +from flask_login import AnonymousUserMixin +import sys +import os +import logging +from werkzeug.security import generate_password_hash +import json +import datetime +from binascii import hexlify +import cli + +engine = create_engine('sqlite:///{0}'.format(cli.settingspath), echo=False) +Base = declarative_base() + +ROLE_USER = 0 +ROLE_ADMIN = 1 +ROLE_DOWNLOAD = 2 +ROLE_UPLOAD = 4 +ROLE_EDIT = 8 +ROLE_PASSWD = 16 +ROLE_ANONYMOUS = 32 +ROLE_EDIT_SHELFS = 64 +ROLE_DELETE_BOOKS = 128 + + +DETAIL_RANDOM = 1 +SIDEBAR_LANGUAGE = 2 +SIDEBAR_SERIES = 4 +SIDEBAR_CATEGORY = 8 +SIDEBAR_HOT = 16 +SIDEBAR_RANDOM = 32 +SIDEBAR_AUTHOR = 64 +SIDEBAR_BEST_RATED = 128 +SIDEBAR_READ_AND_UNREAD = 256 +SIDEBAR_RECENT = 512 +SIDEBAR_SORTED = 1024 +MATURE_CONTENT = 2048 +SIDEBAR_PUBLISHER = 4096 + +DEFAULT_PASS = "admin123" +DEFAULT_PORT = int(os.environ.get("CALIBRE_PORT", 8083)) + + +class UserBase: + + @property + def is_authenticated(self): + return True + + def role_admin(self): + if self.role is not None: + return True if self.role & ROLE_ADMIN == ROLE_ADMIN else False + else: + return False + + def role_download(self): + if self.role is not None: + return True if self.role & ROLE_DOWNLOAD == ROLE_DOWNLOAD else False + else: + return False + + def role_upload(self): + return bool((self.role is not None)and(self.role & ROLE_UPLOAD == ROLE_UPLOAD)) + + def role_edit(self): + if self.role is not None: + return True if self.role & ROLE_EDIT == ROLE_EDIT else False + else: + return False + + def role_passwd(self): + if self.role is not None: + return True if self.role & ROLE_PASSWD == ROLE_PASSWD else False + else: + return False + + def role_anonymous(self): + if self.role is not None: + return True if self.role & ROLE_ANONYMOUS == ROLE_ANONYMOUS else False + else: + return False + + def role_edit_shelfs(self): + if self.role is not None: + return True if self.role & ROLE_EDIT_SHELFS == ROLE_EDIT_SHELFS else False + else: + return False + + def role_delete_books(self): + return bool((self.role is not None)and(self.role & ROLE_DELETE_BOOKS == ROLE_DELETE_BOOKS)) + + @property + def is_active(self): + return True + + @property + def is_anonymous(self): + return False + + @property + def get_theme(self): + return self.theme + + def get_id(self): + return str(self.id) + + def filter_language(self): + return self.default_language + + def show_random_books(self): + return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_RANDOM == SIDEBAR_RANDOM)) + + def show_language(self): + return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_LANGUAGE == SIDEBAR_LANGUAGE)) + + def show_hot_books(self): + return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_HOT == SIDEBAR_HOT)) + + def show_recent(self): + return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_RECENT == SIDEBAR_RECENT)) + + def show_sorted(self): + return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_SORTED == SIDEBAR_SORTED)) + + def show_series(self): + return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_SERIES == SIDEBAR_SERIES)) + + def show_category(self): + return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_CATEGORY == SIDEBAR_CATEGORY)) + + def show_author(self): + return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_AUTHOR == SIDEBAR_AUTHOR)) + + def show_publisher(self): + return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_PUBLISHER == SIDEBAR_PUBLISHER)) + + def show_best_rated_books(self): + return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_BEST_RATED == SIDEBAR_BEST_RATED)) + + def show_read_and_unread(self): + return bool((self.sidebar_view is not None)and(self.sidebar_view & SIDEBAR_READ_AND_UNREAD == SIDEBAR_READ_AND_UNREAD)) + + def show_detail_random(self): + return bool((self.sidebar_view is not None)and(self.sidebar_view & DETAIL_RANDOM == DETAIL_RANDOM)) + + def __repr__(self): + return '' % self.nickname + + +# Baseclass for Users in Calibre-Web, settings which are depending on certain users are stored here. It is derived from +# User Base (all access methods are declared there) +class User(UserBase, Base): + __tablename__ = 'user' + + id = Column(Integer, primary_key=True) + nickname = Column(String(64), unique=True) + email = Column(String(120), unique=True, default="") + role = Column(SmallInteger, default=ROLE_USER) + password = Column(String) + kindle_mail = Column(String(120), default="") + shelf = relationship('Shelf', backref='user', lazy='dynamic', order_by='Shelf.name') + downloads = relationship('Downloads', backref='user', lazy='dynamic') + locale = Column(String(2), default="en") + sidebar_view = Column(Integer, default=1) + default_language = Column(String(3), default="all") + mature_content = Column(Boolean, default=True) + theme = Column(Integer, default=0) + + +# Class for anonymous user is derived from User base and completly overrides methods and properties for the +# anonymous user +class Anonymous(AnonymousUserMixin, UserBase): + def __init__(self): + self.loadSettings() + + def loadSettings(self): + data = session.query(User).filter(User.role.op('&')(ROLE_ANONYMOUS) == ROLE_ANONYMOUS).first() # type: User + settings = session.query(Settings).first() + self.nickname = data.nickname + self.role = data.role + self.id=data.id + self.sidebar_view = data.sidebar_view + self.default_language = data.default_language + self.locale = data.locale + self.mature_content = data.mature_content + self.anon_browse = settings.config_anonbrowse + + def role_admin(self): + return False + + @property + def is_active(self): + return False + + @property + def is_anonymous(self): + return self.anon_browse + + @property + def is_authenticated(self): + return False + + +# Baseclass representing Shelfs in calibre-web in app.db +class Shelf(Base): + __tablename__ = 'shelf' + + id = Column(Integer, primary_key=True) + name = Column(String) + is_public = Column(Integer, default=0) + user_id = Column(Integer, ForeignKey('user.id')) + + def __repr__(self): + return '' % self.name + + +# Baseclass representing Relationship between books and Shelfs in Calibre-Web in app.db (N:M) +class BookShelf(Base): + __tablename__ = 'book_shelf_link' + + id = Column(Integer, primary_key=True) + book_id = Column(Integer) + order = Column(Integer) + shelf = Column(Integer, ForeignKey('shelf.id')) + + def __repr__(self): + return '' % self.id + + +class ReadBook(Base): + __tablename__ = 'book_read_link' + + id = Column(Integer, primary_key=True) + book_id = Column(Integer, unique=False) + user_id = Column(Integer, ForeignKey('user.id'), unique=False) + is_read = Column(Boolean, unique=False) + + +class Bookmark(Base): + __tablename__ = 'bookmark' + + id = Column(Integer, primary_key=True) + user_id = Column(Integer, ForeignKey('user.id')) + book_id = Column(Integer) + format = Column(String(collation='NOCASE')) + bookmark_key = Column(String) + + +# Baseclass representing Downloads from calibre-web in app.db +class Downloads(Base): + __tablename__ = 'downloads' + + id = Column(Integer, primary_key=True) + book_id = Column(Integer) + user_id = Column(Integer, ForeignKey('user.id')) + + def __repr__(self): + return '".format(self.domain) + + +# Baseclass for representing settings in app.db with email server settings and Calibre database settings +# (application settings) +class Settings(Base): + __tablename__ = 'settings' + + id = Column(Integer, primary_key=True) + mail_server = Column(String) + mail_port = Column(Integer, default=25) + mail_use_ssl = Column(SmallInteger, default=0) + mail_login = Column(String) + mail_password = Column(String) + mail_from = Column(String) + config_calibre_dir = Column(String) + config_port = Column(Integer, default=DEFAULT_PORT) + config_certfile = Column(String) + config_keyfile = Column(String) + config_calibre_web_title = Column(String, default=u'Calibre-Web') + config_books_per_page = Column(Integer, default=60) + config_random_books = Column(Integer, default=4) + config_read_column = Column(Integer, default=0) + config_title_regex = Column(String, default=u'^(A|The|An|Der|Die|Das|Den|Ein|Eine|Einen|Dem|Des|Einem|Eines)\s+') + config_log_level = Column(SmallInteger, default=logging.INFO) + config_uploading = Column(SmallInteger, default=0) + config_anonbrowse = Column(SmallInteger, default=0) + config_public_reg = Column(SmallInteger, default=0) + config_default_role = Column(SmallInteger, default=0) + config_default_show = Column(SmallInteger, default=6143) + config_columns_to_ignore = Column(String) + config_use_google_drive = Column(Boolean) + config_google_drive_folder = Column(String) + config_google_drive_watch_changes_response = Column(String) + config_remote_login = Column(Boolean) + config_use_goodreads = Column(Boolean) + config_goodreads_api_key = Column(String) + config_goodreads_api_secret = Column(String) + config_mature_content_tags = Column(String) + config_logfile = Column(String) + config_ebookconverter = Column(Integer, default=0) + config_converterpath = Column(String) + config_calibre = Column(String) + config_rarfile_location = Column(String) + + def __repr__(self): + pass + + +class RemoteAuthToken(Base): + __tablename__ = 'remote_auth_token' + + id = Column(Integer, primary_key=True) + auth_token = Column(String(8), unique=True) + user_id = Column(Integer, ForeignKey('user.id')) + verified = Column(Boolean, default=False) + expiration = Column(DateTime) + + def __init__(self): + self.auth_token = hexlify(os.urandom(4)) + self.expiration = datetime.datetime.now() + datetime.timedelta(minutes=10) # 10 min from now + + def __repr__(self): + return '' % self.id + + +# Class holds all application specific settings in calibre-web +class Config: + def __init__(self): + self.config_main_dir = os.path.join(os.path.normpath(os.path.dirname( + os.path.realpath(__file__)) + os.sep + ".." + os.sep)) + self.db_configured = None + self.config_logfile = None + self.loadSettings() + + def loadSettings(self): + data = session.query(Settings).first() # type: Settings + + self.config_calibre_dir = data.config_calibre_dir + self.config_port = data.config_port + self.config_certfile = data.config_certfile + self.config_keyfile = data.config_keyfile + self.config_calibre_web_title = data.config_calibre_web_title + self.config_books_per_page = data.config_books_per_page + self.config_random_books = data.config_random_books + self.config_title_regex = data.config_title_regex + self.config_read_column = data.config_read_column + self.config_log_level = data.config_log_level + self.config_uploading = data.config_uploading + self.config_anonbrowse = data.config_anonbrowse + self.config_public_reg = data.config_public_reg + self.config_default_role = data.config_default_role + self.config_default_show = data.config_default_show + self.config_columns_to_ignore = data.config_columns_to_ignore + self.config_use_google_drive = data.config_use_google_drive + self.config_google_drive_folder = data.config_google_drive_folder + self.config_ebookconverter = data.config_ebookconverter + self.config_converterpath = data.config_converterpath + self.config_calibre = data.config_calibre + if data.config_google_drive_watch_changes_response: + self.config_google_drive_watch_changes_response = json.loads(data.config_google_drive_watch_changes_response) + else: + self.config_google_drive_watch_changes_response=None + self.config_columns_to_ignore = data.config_columns_to_ignore + self.db_configured = bool(self.config_calibre_dir is not None and + (not self.config_use_google_drive or os.path.exists(self.config_calibre_dir + '/metadata.db'))) + self.config_remote_login = data.config_remote_login + self.config_use_goodreads = data.config_use_goodreads + self.config_goodreads_api_key = data.config_goodreads_api_key + self.config_goodreads_api_secret = data.config_goodreads_api_secret + if data.config_mature_content_tags: + self.config_mature_content_tags = data.config_mature_content_tags + else: + self.config_mature_content_tags = u'' + if data.config_logfile: + self.config_logfile = data.config_logfile + self.config_rarfile_location = data.config_rarfile_location + + @property + def get_main_dir(self): + return self.config_main_dir + + def get_config_certfile(self): + if cli.certfilepath: + return cli.certfilepath + else: + if cli.certfilepath is "": + return None + else: + return self.config_certfile + + def get_config_keyfile(self): + if cli.keyfilepath: + return cli.keyfilepath + else: + if cli.certfilepath is "": + return None + else: + return self.config_keyfile + + def get_config_logfile(self): + if not self.config_logfile: + return os.path.join(self.get_main_dir, "calibre-web.log") + else: + if os.path.dirname(self.config_logfile): + return self.config_logfile + else: + return os.path.join(self.get_main_dir, self.config_logfile) + + def role_admin(self): + if self.config_default_role is not None: + return True if self.config_default_role & ROLE_ADMIN == ROLE_ADMIN else False + else: + return False + + def role_download(self): + if self.config_default_role is not None: + return True if self.config_default_role & ROLE_DOWNLOAD == ROLE_DOWNLOAD else False + else: + return False + + def role_upload(self): + if self.config_default_role is not None: + return True if self.config_default_role & ROLE_UPLOAD == ROLE_UPLOAD else False + else: + return False + + def role_edit(self): + if self.config_default_role is not None: + return True if self.config_default_role & ROLE_EDIT == ROLE_EDIT else False + else: + return False + + def role_passwd(self): + if self.config_default_role is not None: + return True if self.config_default_role & ROLE_PASSWD == ROLE_PASSWD else False + else: + return False + + def role_edit_shelfs(self): + if self.config_default_role is not None: + return True if self.config_default_role & ROLE_EDIT_SHELFS == ROLE_EDIT_SHELFS else False + else: + return False + + def role_delete_books(self): + return bool((self.config_default_role is not None) and + (self.config_default_role & ROLE_DELETE_BOOKS == ROLE_DELETE_BOOKS)) + + def show_detail_random(self): + return bool((self.config_default_show is not None) and + (self.config_default_show & DETAIL_RANDOM == DETAIL_RANDOM)) + + def show_language(self): + return bool((self.config_default_show is not None) and + (self.config_default_show & SIDEBAR_LANGUAGE == SIDEBAR_LANGUAGE)) + + def show_series(self): + return bool((self.config_default_show is not None) and + (self.config_default_show & SIDEBAR_SERIES == SIDEBAR_SERIES)) + + def show_category(self): + return bool((self.config_default_show is not None) and + (self.config_default_show & SIDEBAR_CATEGORY == SIDEBAR_CATEGORY)) + + def show_hot_books(self): + return bool((self.config_default_show is not None) and + (self.config_default_show & SIDEBAR_HOT == SIDEBAR_HOT)) + + def show_random_books(self): + return bool((self.config_default_show is not None) and + (self.config_default_show & SIDEBAR_RANDOM == SIDEBAR_RANDOM)) + + def show_author(self): + return bool((self.config_default_show is not None) and + (self.config_default_show & SIDEBAR_AUTHOR == SIDEBAR_AUTHOR)) + + def show_publisher(self): + return bool((self.config_default_show is not None) and + (self.config_default_show & SIDEBAR_PUBLISHER == SIDEBAR_PUBLISHER)) + + def show_best_rated_books(self): + return bool((self.config_default_show is not None) and + (self.config_default_show & SIDEBAR_BEST_RATED == SIDEBAR_BEST_RATED)) + + def show_read_and_unread(self): + return bool((self.config_default_show is not None) and + (self.config_default_show & SIDEBAR_READ_AND_UNREAD == SIDEBAR_READ_AND_UNREAD)) + + def show_recent(self): + return bool((self.config_default_show is not None) and + (self.config_default_show & SIDEBAR_RECENT == SIDEBAR_RECENT)) + + def show_sorted(self): + return bool((self.config_default_show is not None) and + (self.config_default_show & SIDEBAR_SORTED == SIDEBAR_SORTED)) + + def show_mature_content(self): + return bool((self.config_default_show is not None) and + (self.config_default_show & MATURE_CONTENT == MATURE_CONTENT)) + + def mature_content_tags(self): + if sys.version_info > (3, 0): # Python3 str, Python2 unicode + lstrip = str.lstrip + else: + lstrip = unicode.lstrip + return list(map(lstrip, self.config_mature_content_tags.split(","))) + + def get_Log_Level(self): + ret_value = "" + if self.config_log_level == logging.INFO: + ret_value = 'INFO' + elif self.config_log_level == logging.DEBUG: + ret_value = 'DEBUG' + elif self.config_log_level == logging.WARNING: + ret_value = 'WARNING' + elif self.config_log_level == logging.ERROR: + ret_value = 'ERROR' + return ret_value + + +# Migrate database to current version, has to be updated after every database change. Currently migration from +# everywhere to curent should work. Migration is done by checking if relevant coloums are existing, and than adding +# rows with SQL commands +def migrate_Database(): + if not engine.dialect.has_table(engine.connect(), "bookmark"): + Bookmark.__table__.create(bind=engine) + if not engine.dialect.has_table(engine.connect(), "registration"): + ReadBook.__table__.create(bind=engine) + conn = engine.connect() + conn.execute("insert into registration (domain) values('%.%')") + session.commit() + # Handle table exists, but no content + cnt = session.query(Registration).count() + if not cnt: + conn = engine.connect() + conn.execute("insert into registration (domain) values('%.%')") + session.commit() + try: + session.query(exists().where(Settings.config_use_google_drive)).scalar() + except exc.OperationalError: + conn = engine.connect() + conn.execute("ALTER TABLE Settings ADD column `config_use_google_drive` INTEGER DEFAULT 0") + conn.execute("ALTER TABLE Settings ADD column `config_google_drive_folder` String DEFAULT ''") + conn.execute("ALTER TABLE Settings ADD column `config_google_drive_watch_changes_response` String DEFAULT ''") + session.commit() + try: + session.query(exists().where(Settings.config_columns_to_ignore)).scalar() + except exc.OperationalError: + conn = engine.connect() + conn.execute("ALTER TABLE Settings ADD column `config_columns_to_ignore` String DEFAULT ''") + session.commit() + try: + session.query(exists().where(Settings.config_default_role)).scalar() + except exc.OperationalError: # Database is not compatible, some rows are missing + conn = engine.connect() + conn.execute("ALTER TABLE Settings ADD column `config_default_role` SmallInteger DEFAULT 0") + session.commit() + try: + session.query(exists().where(BookShelf.order)).scalar() + except exc.OperationalError: # Database is not compatible, some rows are missing + conn = engine.connect() + conn.execute("ALTER TABLE book_shelf_link ADD column 'order' INTEGER DEFAULT 1") + session.commit() + try: + session.query(exists().where(Settings.config_rarfile_location)).scalar() + session.commit() + except exc.OperationalError: # Database is not compatible, some rows are missing + conn = engine.connect() + conn.execute("ALTER TABLE Settings ADD column `config_rarfile_location` String DEFAULT ''") + session.commit() + try: + create = False + session.query(exists().where(User.sidebar_view)).scalar() + except exc.OperationalError: # Database is not compatible, some rows are missing + conn = engine.connect() + conn.execute("ALTER TABLE user ADD column `sidebar_view` Integer DEFAULT 1") + session.commit() + create = True + try: + if create: + conn = engine.connect() + conn.execute("SELECT language_books FROM user") + session.commit() + except exc.OperationalError: + conn = engine.connect() + conn.execute("UPDATE user SET 'sidebar_view' = (random_books* :side_random + language_books * :side_lang " + "+ series_books * :side_series + category_books * :side_category + hot_books * " + ":side_hot + :side_autor + :detail_random)" + ,{'side_random': SIDEBAR_RANDOM, 'side_lang': SIDEBAR_LANGUAGE, 'side_series': SIDEBAR_SERIES, + 'side_category': SIDEBAR_CATEGORY, 'side_hot': SIDEBAR_HOT, 'side_autor': SIDEBAR_AUTHOR, + 'detail_random': DETAIL_RANDOM}) + session.commit() + try: + session.query(exists().where(User.mature_content)).scalar() + except exc.OperationalError: + conn = engine.connect() + conn.execute("ALTER TABLE user ADD column `mature_content` INTEGER DEFAULT 1") + try: + session.query(exists().where(User.theme)).scalar() + except exc.OperationalError: + conn = engine.connect() + conn.execute("ALTER TABLE user ADD column `theme` INTEGER DEFAULT 0") + session.commit() + if session.query(User).filter(User.role.op('&')(ROLE_ANONYMOUS) == ROLE_ANONYMOUS).first() is None: + create_anonymous_user() + try: + session.query(exists().where(Settings.config_remote_login)).scalar() + except exc.OperationalError: + conn = engine.connect() + conn.execute("ALTER TABLE Settings ADD column `config_remote_login` INTEGER DEFAULT 0") + try: + session.query(exists().where(Settings.config_use_goodreads)).scalar() + except exc.OperationalError: + conn = engine.connect() + conn.execute("ALTER TABLE Settings ADD column `config_use_goodreads` INTEGER DEFAULT 0") + conn.execute("ALTER TABLE Settings ADD column `config_goodreads_api_key` String DEFAULT ''") + conn.execute("ALTER TABLE Settings ADD column `config_goodreads_api_secret` String DEFAULT ''") + try: + session.query(exists().where(Settings.config_mature_content_tags)).scalar() + except exc.OperationalError: + conn = engine.connect() + conn.execute("ALTER TABLE Settings ADD column `config_mature_content_tags` String DEFAULT ''") + try: + session.query(exists().where(Settings.config_default_show)).scalar() + except exc.OperationalError: # Database is not compatible, some rows are missing + conn = engine.connect() + conn.execute("ALTER TABLE Settings ADD column `config_default_show` SmallInteger DEFAULT 2047") + session.commit() + try: + session.query(exists().where(Settings.config_logfile)).scalar() + except exc.OperationalError: # Database is not compatible, some rows are missing + conn = engine.connect() + conn.execute("ALTER TABLE Settings ADD column `config_logfile` String DEFAULT ''") + session.commit() + try: + session.query(exists().where(Settings.config_certfile)).scalar() + except exc.OperationalError: # Database is not compatible, some rows are missing + conn = engine.connect() + conn.execute("ALTER TABLE Settings ADD column `config_certfile` String DEFAULT ''") + conn.execute("ALTER TABLE Settings ADD column `config_keyfile` String DEFAULT ''") + session.commit() + try: + session.query(exists().where(Settings.config_read_column)).scalar() + except exc.OperationalError: # Database is not compatible, some rows are missing + conn = engine.connect() + conn.execute("ALTER TABLE Settings ADD column `config_read_column` INTEGER DEFAULT 0") + session.commit() + try: + session.query(exists().where(Settings.config_ebookconverter)).scalar() + except exc.OperationalError: # Database is not compatible, some rows are missing + conn = engine.connect() + conn.execute("ALTER TABLE Settings ADD column `config_ebookconverter` INTEGER DEFAULT 0") + conn.execute("ALTER TABLE Settings ADD column `config_converterpath` String DEFAULT ''") + conn.execute("ALTER TABLE Settings ADD column `config_calibre` String DEFAULT ''") + session.commit() + + # Remove login capability of user Guest + conn = engine.connect() + conn.execute("UPDATE user SET password='' where nickname = 'Guest' and password !=''") + session.commit() + + +def clean_database(): + # Remove expired remote login tokens + now = datetime.datetime.now() + session.query(RemoteAuthToken).filter(now > RemoteAuthToken.expiration).delete() + + +def create_default_config(): + settings = Settings() + settings.mail_server = "mail.example.com" + settings.mail_port = 25 + settings.mail_use_ssl = 0 + settings.mail_login = "mail@example.com" + settings.mail_password = "mypassword" + settings.mail_from = "automailer " + + session.add(settings) + session.commit() + + +def get_mail_settings(): + settings = session.query(Settings).first() + + if not settings: + return {} + + data = { + 'mail_server': settings.mail_server, + 'mail_port': settings.mail_port, + 'mail_use_ssl': settings.mail_use_ssl, + 'mail_login': settings.mail_login, + 'mail_password': settings.mail_password, + 'mail_from': settings.mail_from + } + + return data + +# Save downloaded books per user in calibre-web's own database +def update_download(book_id, user_id): + check = session.query(Downloads).filter(Downloads.user_id == user_id).filter(Downloads.book_id == + book_id).first() + + if not check: + new_download = Downloads(user_id=user_id, book_id=book_id) + session.add(new_download) + session.commit() + +# Delete non exisiting downloaded books in calibre-web's own database +def delete_download(book_id): + session.query(Downloads).filter(book_id == Downloads.book_id).delete() + session.commit() + +# Generate user Guest (translated text), as anoymous user, no rights +def create_anonymous_user(): + user = User() + user.nickname = "Guest" + user.email = 'no@email' + user.role = ROLE_ANONYMOUS + user.password = '' + + session.add(user) + try: + session.commit() + except Exception: + session.rollback() + + +# Generate User admin with admin123 password, and access to everything +def create_admin_user(): + user = User() + user.nickname = "admin" + user.role = ROLE_USER + ROLE_ADMIN + ROLE_DOWNLOAD + ROLE_UPLOAD + ROLE_EDIT + ROLE_DELETE_BOOKS + ROLE_PASSWD + user.sidebar_view = DETAIL_RANDOM + SIDEBAR_LANGUAGE + SIDEBAR_SERIES + SIDEBAR_CATEGORY + SIDEBAR_HOT + \ + SIDEBAR_RANDOM + SIDEBAR_AUTHOR + SIDEBAR_BEST_RATED + SIDEBAR_READ_AND_UNREAD + SIDEBAR_RECENT + \ + SIDEBAR_SORTED + MATURE_CONTENT + SIDEBAR_PUBLISHER + + user.password = generate_password_hash(DEFAULT_PASS) + + session.add(user) + try: + session.commit() + except Exception: + session.rollback() + + +# Open session for database connection +Session = sessionmaker() +Session.configure(bind=engine) +session = Session() + +# generate database and admin and guest user, if no database is existing +if not os.path.exists(cli.settingspath): + try: + Base.metadata.create_all(engine) + create_default_config() + create_admin_user() + create_anonymous_user() + except Exception: + raise +else: + Base.metadata.create_all(engine) + migrate_Database() + clean_database() + +# Generate global Settings Object accessible from every file +config = Config() +searched_ids = {} diff --git a/src/cps/uploader.py b/src/cps/uploader.py new file mode 100644 index 0000000..40741bf --- /dev/null +++ b/src/cps/uploader.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +from tempfile import gettempdir +import hashlib +from collections import namedtuple +import book_formats + +BookMeta = namedtuple('BookMeta', 'file_path, extension, title, author, cover, description, tags, series, series_id, languages') + +""" + :rtype: BookMeta +""" + + +def upload(uploadfile): + tmp_dir = os.path.join(gettempdir(), 'calibre_web') + + if not os.path.isdir(tmp_dir): + os.mkdir(tmp_dir) + + filename = uploadfile.filename + filename_root, file_extension = os.path.splitext(filename) + md5 = hashlib.md5() + md5.update(filename.encode('utf-8')) + tmp_file_path = os.path.join(tmp_dir, md5.hexdigest()) + uploadfile.save(tmp_file_path) + meta = book_formats.process(tmp_file_path, filename_root, file_extension) + return meta diff --git a/src/cps/web.py b/src/cps/web.py new file mode 100644 index 0000000..e5e4b9d --- /dev/null +++ b/src/cps/web.py @@ -0,0 +1,3947 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import mimetypes +import logging +from logging.handlers import RotatingFileHandler +from flask import (Flask, render_template, request, Response, redirect, + url_for, send_from_directory, make_response, g, flash, + abort, Markup) +from flask import __version__ as flaskVersion +from werkzeug import __version__ as werkzeugVersion +from werkzeug.exceptions import default_exceptions + +from jinja2 import __version__ as jinja2Version +import cache_buster +import ub +from ub import config +import helper +import os +from sqlalchemy.sql.expression import func +from sqlalchemy.sql.expression import false +from sqlalchemy.exc import IntegrityError +from sqlalchemy import __version__ as sqlalchemyVersion +from math import ceil +from flask_login import (LoginManager, login_user, logout_user, + login_required, current_user) +from flask_principal import Principal +from flask_principal import __version__ as flask_principalVersion +from flask_babel import Babel +from flask_babel import gettext as _ +import requests +from werkzeug.security import generate_password_hash, check_password_hash +from werkzeug.datastructures import Headers +from babel import Locale as LC +from babel import negotiate_locale +from babel import __version__ as babelVersion +from babel.dates import format_date, format_datetime +from babel.core import UnknownLocaleError +from functools import wraps +import base64 +from sqlalchemy.sql import * +import json +import datetime +from iso639 import languages as isoLanguages +from iso639 import __version__ as iso639Version +from pytz import __version__ as pytzVersion +from uuid import uuid4 +import os.path +import sys +import re +import db +from shutil import move, copyfile +import gdriveutils +import converter +import tempfile +from redirect import redirect_back +import time +import server +from reverseproxy import ReverseProxied + +try: + from googleapiclient.errors import HttpError +except ImportError: + pass + +try: + from goodreads.client import GoodreadsClient + goodreads_support = True +except ImportError: + goodreads_support = False + +try: + import Levenshtein + levenshtein_support = True +except ImportError: + levenshtein_support = False + +try: + from functools import reduce +except ImportError: + pass # We're not using Python 3 + +try: + import rarfile + rar_support=True +except ImportError: + rar_support=False + +try: + from natsort import natsorted as sort +except ImportError: + sort=sorted # Just use regular sort then + # may cause issues with badly named pages in cbz/cbr files +try: + import cPickle +except ImportError: + import pickle as cPickle + +try: + from urllib.parse import quote + from imp import reload +except ImportError: + from urllib import quote + +try: + from flask_login import __version__ as flask_loginVersion +except ImportError: + from flask_login.__about__ import __version__ as flask_loginVersion + + +# Global variables +current_milli_time = lambda: int(round(time.time() * 1000)) +gdrive_watch_callback_token = 'target=calibreweb-watch_files' +EXTENSIONS_UPLOAD = {'txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx', + 'fb2', 'html', 'rtf', 'odt'} +EXTENSIONS_CONVERT = {'pdf', 'epub', 'mobi', 'azw3', 'docx', 'rtf', 'fb2', 'lit', 'lrf', 'txt', 'html', 'rtf', 'odt'} + + +# Main code +mimetypes.init() +mimetypes.add_type('application/xhtml+xml', '.xhtml') +mimetypes.add_type('application/epub+zip', '.epub') +mimetypes.add_type('application/fb2+zip', '.fb2') +mimetypes.add_type('application/x-mobipocket-ebook', '.mobi') +mimetypes.add_type('application/x-mobipocket-ebook', '.prc') +mimetypes.add_type('application/vnd.amazon.ebook', '.azw') +mimetypes.add_type('application/x-cbr', '.cbr') +mimetypes.add_type('application/x-cbz', '.cbz') +mimetypes.add_type('application/x-cbt', '.cbt') +mimetypes.add_type('image/vnd.djvu', '.djvu') + +app = (Flask(__name__)) + +# custom error page +def error_http(error): + return render_template('http_error.html', + error_code=error.code, + error_name=error.name, + instance=config.config_calibre_web_title + ), error.code + +# http error handling +for ex in default_exceptions: + # new routine for all client errors, server errors stay + if ex < 500: + app.register_error_handler(ex, error_http) + +app.wsgi_app = ReverseProxied(app.wsgi_app) +cache_buster.init_cache_busting(app) + +formatter = logging.Formatter( + "[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s") +try: + file_handler = RotatingFileHandler(config.get_config_logfile(), maxBytes=50000, backupCount=2) +except IOError: + file_handler = RotatingFileHandler(os.path.join(config.get_main_dir, "calibre-web.log"), + maxBytes=50000, backupCount=2) + # ToDo: reset logfile value in config class +file_handler.setFormatter(formatter) +app.logger.addHandler(file_handler) +app.logger.setLevel(config.config_log_level) + +app.logger.info('Starting Calibre Web...') +logging.getLogger("book_formats").addHandler(file_handler) +logging.getLogger("book_formats").setLevel(config.config_log_level) + +Principal(app) +babel = Babel(app) + +import uploader + +lm = LoginManager(app) +lm.init_app(app) +lm.login_view = 'login' +lm.anonymous_user = ub.Anonymous +app.secret_key = os.getenv('SECRET_KEY', 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT') +db.setup_db() + +with open(os.path.join(config.get_main_dir, 'cps/translations/iso639.pickle'), 'rb') as f: + language_table = cPickle.load(f) + + +def is_gdrive_ready(): + return os.path.exists(os.path.join(config.get_main_dir, 'settings.yaml')) and \ + os.path.exists(os.path.join(config.get_main_dir, 'gdrive_credentials')) + + + +@babel.localeselector +def get_locale(): + # if a user is logged in, use the locale from the user settings + user = getattr(g, 'user', None) + if user is not None and hasattr(user, "locale"): + if user.nickname != 'Guest': # if the account is the guest account bypass the config lang settings + return user.locale + translations = [str(item) for item in babel.list_translations()] + ['en'] + preferred = [str(LC.parse(x.replace('-','_'))) for x in request.accept_languages.values()] + return negotiate_locale(preferred, translations) + + +@babel.timezoneselector +def get_timezone(): + user = getattr(g, 'user', None) + if user is not None: + return user.timezone + + +@lm.user_loader +def load_user(user_id): + return ub.session.query(ub.User).filter(ub.User.id == int(user_id)).first() + + +@lm.header_loader +def load_user_from_header(header_val): + if header_val.startswith('Basic '): + header_val = header_val.replace('Basic ', '', 1) + basic_username = basic_password = '' + try: + header_val = base64.b64decode(header_val) + basic_username = header_val.split(':')[0] + basic_password = header_val.split(':')[1] + except TypeError: + pass + user = ub.session.query(ub.User).filter(func.lower(ub.User.nickname) == basic_username.lower()).first() + if user and check_password_hash(user.password, basic_password): + return user + return + + +def check_auth(username, password): + user = ub.session.query(ub.User).filter(func.lower(ub.User.nickname) == username.lower()).first() + return bool(user and check_password_hash(user.password, password)) + + +def authenticate(): + return Response( + 'Could not verify your access level for that URL.\n' + 'You have to login with proper credentials', 401, + {'WWW-Authenticate': 'Basic realm="Login Required"'}) + + +def requires_basic_auth_if_no_ano(f): + @wraps(f) + def decorated(*args, **kwargs): + auth = request.authorization + if config.config_anonbrowse != 1: + if not auth or not check_auth(auth.username, auth.password): + return authenticate() + return f(*args, **kwargs) + + return decorated + + +# simple pagination for the feed +class Pagination(object): + def __init__(self, page, per_page, total_count): + self.page = int(page) + self.per_page = int(per_page) + self.total_count = int(total_count) + + @property + def next_offset(self): + return int(self.page * self.per_page) + + @property + def previous_offset(self): + return int((self.page - 2) * self.per_page) + + @property + def last_offset(self): + last = int(self.total_count) - int(self.per_page) + if last < 0: + last = 0 + return int(last) + + @property + def pages(self): + return int(ceil(self.total_count / float(self.per_page))) + + @property + def has_prev(self): + return self.page > 1 + + @property + def has_next(self): + return self.page < self.pages + + # right_edge: last right_edges count of all pages are shown as number, means, if 10 pages are paginated -> 9,10 shwn + # left_edge: first left_edges count of all pages are shown as number -> 1,2 shwn + # left_current: left_current count below current page are shown as number, means if current page 5 -> 3,4 shwn + # left_current: right_current count above current page are shown as number, means if current page 5 -> 6,7 shwn + def iter_pages(self, left_edge=2, left_current=2, + right_current=4, right_edge=2): + last = 0 + left_current = self.page - left_current - 1 + right_current = self.page + right_current + 1 + right_edge = self.pages - right_edge + for num in range(1, (self.pages + 1)): + if num <= left_edge or (left_current < num < right_current) or num > right_edge: + if last + 1 != num: + yield None + yield num + last = num + + +def login_required_if_no_ano(func): + @wraps(func) + def decorated_view(*args, **kwargs): + if config.config_anonbrowse == 1: + return func(*args, **kwargs) + return login_required(func)(*args, **kwargs) + return decorated_view + + +def remote_login_required(f): + @wraps(f) + def inner(*args, **kwargs): + if config.config_remote_login: + return f(*args, **kwargs) + if request.is_xhr: + data = {'status': 'error', 'message': 'Forbidden'} + response = make_response(json.dumps(data, ensure_ascii=False)) + response.headers["Content-Type"] = "application/json; charset=utf-8" + return response, 403 + abort(403) + + return inner + + +# custom jinja filters + +# pagination links in jinja +@app.template_filter('url_for_other_page') +def url_for_other_page(page): + args = request.view_args.copy() + args['page'] = page + return url_for(request.endpoint, **args) + + +# shortentitles to at longest nchar, shorten longer words if necessary +@app.template_filter('shortentitle') +def shortentitle_filter(s, nchar=20): + text = s.split() + res = "" # result + suml = 0 # overall length + for line in text: + if suml >= 60: + res += '...' + break + # if word longer than 20 chars truncate line and append '...', otherwise add whole word to result + # string, and summarize total length to stop at chars given by nchar + if len(line) > nchar: + res += line[:(nchar-3)] + '[..] ' + suml += nchar+3 + else: + res += line + ' ' + suml += len(line) + 1 + return res.strip() + + +@app.template_filter('mimetype') +def mimetype_filter(val): + try: + s = mimetypes.types_map['.' + val] + except Exception: + s = 'application/octet-stream' + return s + + +@app.template_filter('formatdate') +def formatdate_filter(val): + conformed_timestamp = re.sub(r"[:]|([-](?!((\d{2}[:]\d{2})|(\d{4}))$))", '', val) + formatdate = datetime.datetime.strptime(conformed_timestamp[:15], "%Y%m%d %H%M%S") + return format_date(formatdate, format='medium', locale=get_locale()) + + +@app.template_filter('formatdateinput') +def format_date_input(val): + conformed_timestamp = re.sub(r"[:]|([-](?!((\d{2}[:]\d{2})|(\d{4}))$))", '', val) + date_obj = datetime.datetime.strptime(conformed_timestamp[:15], "%Y%m%d %H%M%S") + input_date = date_obj.isoformat().split('T', 1)[0] # Hack to support dates <1900 + return '' if input_date == "0101-01-01" else input_date + + +@app.template_filter('strftime') +def timestamptodate(date, fmt=None): + date = datetime.datetime.fromtimestamp( + int(date)/1000 + ) + native = date.replace(tzinfo=None) + if fmt: + time_format = fmt + else: + time_format = '%d %m %Y - %H:%S' + return native.strftime(time_format) + + +@app.template_filter('yesno') +def yesno(value, yes, no): + return yes if value else no + + +'''@app.template_filter('canread') +def canread(ext): + if isinstance(ext, db.Data): + ext = ext.format + return ext.lower() in EXTENSIONS_READER''' + + +def admin_required(f): + """ + Checks if current_user.role == 1 + """ + + @wraps(f) + def inner(*args, **kwargs): + if current_user.role_admin(): + return f(*args, **kwargs) + abort(403) + + return inner + + +def unconfigured(f): + """ + Checks if current_user.role == 1 + """ + + @wraps(f) + def inner(*args, **kwargs): + if not config.db_configured: + return f(*args, **kwargs) + abort(403) + + return inner + + +def download_required(f): + @wraps(f) + def inner(*args, **kwargs): + if current_user.role_download() or current_user.role_admin(): + return f(*args, **kwargs) + abort(403) + + return inner + + +def upload_required(f): + @wraps(f) + def inner(*args, **kwargs): + if current_user.role_upload() or current_user.role_admin(): + return f(*args, **kwargs) + abort(403) + + return inner + + +def edit_required(f): + @wraps(f) + def inner(*args, **kwargs): + if current_user.role_edit() or current_user.role_admin(): + return f(*args, **kwargs) + abort(403) + + return inner + + +# Language and content filters for displaying in the UI +def common_filters(): + if current_user.filter_language() != "all": + lang_filter = db.Books.languages.any(db.Languages.lang_code == current_user.filter_language()) + else: + lang_filter = true() + content_rating_filter = false() if current_user.mature_content else \ + db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags())) + return and_(lang_filter, ~content_rating_filter) + + +# Creates for all stored languages a translated speaking name in the array for the UI +def speaking_language(languages=None): + if not languages: + languages = db.session.query(db.Languages).all() + for lang in languages: + try: + cur_l = LC.parse(lang.lang_code) + lang.name = cur_l.get_language_name(get_locale()) + except UnknownLocaleError: + lang.name = _(isoLanguages.get(part3=lang.lang_code).name) + return languages + + +# Fill indexpage with all requested data from database +def fill_indexpage(page, database, db_filter, order, *join): + if current_user.show_detail_random(): + randm = db.session.query(db.Books).filter(common_filters())\ + .order_by(func.random()).limit(config.config_random_books) + else: + randm = false() + off = int(int(config.config_books_per_page) * (page - 1)) + pagination = Pagination(page, config.config_books_per_page, + len(db.session.query(database) + .filter(db_filter).filter(common_filters()).all())) + entries = db.session.query(database).join(*join,isouter=True).filter(db_filter)\ + .filter(common_filters()).order_by(*order).offset(off).limit(config.config_books_per_page).all() + return entries, randm, pagination + + +# Modifies different Database objects, first check if elements have to be added to database, than check +# if elements have to be deleted, because they are no longer used +def modify_database_object(input_elements, db_book_object, db_object, db_session, db_type): + # passing input_elements not as a list may lead to undesired results + if not isinstance(input_elements, list): + raise TypeError(str(input_elements) + " should be passed as a list") + + input_elements = [x for x in input_elements if x != ''] + # we have all input element (authors, series, tags) names now + # 1. search for elements to remove + del_elements = [] + for c_elements in db_book_object: + found = False + if db_type == 'languages': + type_elements = c_elements.lang_code + elif db_type == 'custom': + type_elements = c_elements.value + else: + type_elements = c_elements.name + for inp_element in input_elements: + if inp_element.lower() == type_elements.lower(): + found = True + break + # if the element was not found in the new list, add it to remove list + if not found: + del_elements.append(c_elements) + # 2. search for elements that need to be added + add_elements = [] + for inp_element in input_elements: + found = False + for c_elements in db_book_object: + if db_type == 'languages': + type_elements = c_elements.lang_code + elif db_type == 'custom': + type_elements = c_elements.value + else: + type_elements = c_elements.name + if inp_element == type_elements: + found = True + break + if not found: + add_elements.append(inp_element) + # if there are elements to remove, we remove them now + if len(del_elements) > 0: + for del_element in del_elements: + db_book_object.remove(del_element) + if len(del_element.books) == 0: + db_session.delete(del_element) + # if there are elements to add, we add them now! + if len(add_elements) > 0: + if db_type == 'languages': + db_filter = db_object.lang_code + elif db_type == 'custom': + db_filter = db_object.value + else: + db_filter = db_object.name + for add_element in add_elements: + # check if a element with that name exists + db_element = db_session.query(db_object).filter(db_filter == add_element).first() + # if no element is found add it + # if new_element is None: + if db_type == 'author': + new_element = db_object(add_element, helper.get_sorted_author(add_element.replace('|', ',')), "") + elif db_type == 'series': + new_element = db_object(add_element, add_element) + elif db_type == 'custom': + new_element = db_object(value=add_element) + elif db_type == 'publisher': + new_element = db_object(add_element, None) + else: # db_type should be tag or language + new_element = db_object(add_element) + if db_element is None: + db_session.add(new_element) + db_book_object.append(new_element) + else: + if db_type == 'custom' and db_element.value != add_element: + new_element.value = add_element + # new_element = db_element + elif db_type == 'languages' and db_element.lang_code != add_element: + db_element.lang_code = add_element + # new_element = db_element + elif db_type == 'series' and db_element.name != add_element: + db_element.name = add_element # = add_element # new_element = db_object(add_element, add_element) + db_element.sort = add_element + # new_element = db_element + elif db_type == 'author' and db_element.name != add_element: + db_element.name = add_element + db_element.sort = add_element.replace('|', ',') + # new_element = db_element + if db_type == 'publisher' and db_element.name != add_element: + db_element.name = add_element + db_element.sort = None + # new_element = db_element + elif db_element.name != add_element: + db_element.name = add_element + # new_element = db_element + # add element to book + db_book_object.append(db_element) + + +# read search results from calibre-database and return it (function is used for feed and simple search +def get_search_results(term): + q = list() + authorterms = re.split("[, ]+", term) + for authorterm in authorterms: + q.append(db.Books.authors.any(db.Authors.name.ilike("%" + authorterm + "%"))) + db.session.connection().connection.connection.create_function("lower", 1, db.lcase) + db.Books.authors.any(db.Authors.name.ilike("%" + term + "%")) + + return db.session.query(db.Books).filter(common_filters()).filter( + db.or_(db.Books.tags.any(db.Tags.name.ilike("%" + term + "%")), + db.Books.series.any(db.Series.name.ilike("%" + term + "%")), + db.Books.authors.any(and_(*q)), + db.Books.publishers.any(db.Publishers.name.ilike("%" + term + "%")), + db.Books.title.ilike("%" + term + "%"))).all() + + +def feed_search(term): + if term: + term = term.strip().lower() + entries = get_search_results( term) + entriescount = len(entries) if len(entries) > 0 else 1 + pagination = Pagination(1, entriescount, entriescount) + return render_xml_template('feed.xml', searchterm=term, entries=entries, pagination=pagination) + else: + return render_xml_template('feed.xml', searchterm="") + + +def render_xml_template(*args, **kwargs): + #ToDo: return time in current timezone similar to %z + currtime = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S+00:00") + xml = render_template(current_time=currtime, *args, **kwargs) + response = make_response(xml) + response.headers["Content-Type"] = "application/atom+xml; charset=utf-8" + return response + + +# Returns the template for redering and includes the instance name +def render_title_template(*args, **kwargs): + return render_template(instance=config.config_calibre_web_title, *args, **kwargs) + + +@app.before_request +def before_request(): + g.user = current_user + g.allow_registration = config.config_public_reg + g.allow_upload = config.config_uploading + g.public_shelfes = ub.session.query(ub.Shelf).filter(ub.Shelf.is_public == 1).order_by(ub.Shelf.name).all() + if not config.db_configured and request.endpoint not in ('basic_configuration', 'login') and '/static/' not in request.path: + return redirect(url_for('basic_configuration')) + + +# Routing functions + +@app.route("/opds") +@requires_basic_auth_if_no_ano +def feed_index(): + return render_xml_template('index.xml') + + +@app.route("/opds/osd") +@requires_basic_auth_if_no_ano +def feed_osd(): + return render_xml_template('osd.xml', lang='en-EN') + + +@app.route("/opds/search/") +@requires_basic_auth_if_no_ano +def feed_cc_search(query): + return feed_search(query.strip()) + + +@app.route("/opds/search", methods=["GET"]) +@requires_basic_auth_if_no_ano +def feed_normal_search(): + return feed_search(request.args.get("query").strip()) + + +@app.route("/opds/new") +@requires_basic_auth_if_no_ano +def feed_new(): + off = request.args.get("offset") or 0 + entries, __, pagination = fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), + db.Books, True, [db.Books.timestamp.desc()]) + return render_xml_template('feed.xml', entries=entries, pagination=pagination) + + +@app.route("/opds/discover") +@requires_basic_auth_if_no_ano +def feed_discover(): + entries = db.session.query(db.Books).filter(common_filters()).order_by(func.random())\ + .limit(config.config_books_per_page) + pagination = Pagination(1, config.config_books_per_page, int(config.config_books_per_page)) + return render_xml_template('feed.xml', entries=entries, pagination=pagination) + + +@app.route("/opds/rated") +@requires_basic_auth_if_no_ano +def feed_best_rated(): + off = request.args.get("offset") or 0 + entries, __, pagination = fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), + db.Books, db.Books.ratings.any(db.Ratings.rating > 9), [db.Books.timestamp.desc()]) + return render_xml_template('feed.xml', entries=entries, pagination=pagination) + + +@app.route("/opds/hot") +@requires_basic_auth_if_no_ano +def feed_hot(): + off = request.args.get("offset") or 0 + all_books = ub.session.query(ub.Downloads, ub.func.count(ub.Downloads.book_id)).order_by( + ub.func.count(ub.Downloads.book_id).desc()).group_by(ub.Downloads.book_id) + hot_books = all_books.offset(off).limit(config.config_books_per_page) + entries = list() + for book in hot_books: + downloadBook = db.session.query(db.Books).filter(db.Books.id == book.Downloads.book_id).first() + if downloadBook: + entries.append( + db.session.query(db.Books).filter(common_filters()) + .filter(db.Books.id == book.Downloads.book_id).first() + ) + else: + ub.delete_download(book.Downloads.book_id) + # ub.session.query(ub.Downloads).filter(book.Downloads.book_id == ub.Downloads.book_id).delete() + # ub.session.commit() + numBooks = entries.__len__() + pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), + config.config_books_per_page, numBooks) + return render_xml_template('feed.xml', entries=entries, pagination=pagination) + + +@app.route("/opds/author") +@requires_basic_auth_if_no_ano +def feed_authorindex(): + off = request.args.get("offset") or 0 + entries = db.session.query(db.Authors).join(db.books_authors_link).join(db.Books).filter(common_filters())\ + .group_by('books_authors_link.author').order_by(db.Authors.sort).limit(config.config_books_per_page).offset(off) + pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, + len(db.session.query(db.Authors).all())) + return render_xml_template('feed.xml', listelements=entries, folder='feed_author', pagination=pagination) + + +@app.route("/opds/author/") +@requires_basic_auth_if_no_ano +def feed_author(book_id): + off = request.args.get("offset") or 0 + entries, __, pagination = fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), + db.Books, db.Books.authors.any(db.Authors.id == book_id), [db.Books.timestamp.desc()]) + return render_xml_template('feed.xml', entries=entries, pagination=pagination) + + +@app.route("/opds/publisher") +@requires_basic_auth_if_no_ano +def feed_publisherindex(): + off = request.args.get("offset") or 0 + entries = db.session.query(db.Publishers).join(db.books_publishers_link).join(db.Books).filter(common_filters())\ + .group_by('books_publishers_link.publisher').order_by(db.Publishers.sort).limit(config.config_books_per_page).offset(off) + pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, + len(db.session.query(db.Publishers).all())) + return render_xml_template('feed.xml', listelements=entries, folder='feed_publisher', pagination=pagination) + + +@app.route("/opds/publisher/") +@requires_basic_auth_if_no_ano +def feed_publisher(book_id): + off = request.args.get("offset") or 0 + entries, __, pagination = fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), + db.Books, db.Books.publishers.any(db.Publishers.id == book_id), + [db.Books.timestamp.desc()]) + return render_xml_template('feed.xml', entries=entries, pagination=pagination) + + +@app.route("/opds/category") +@requires_basic_auth_if_no_ano +def feed_categoryindex(): + off = request.args.get("offset") or 0 + entries = db.session.query(db.Tags).join(db.books_tags_link).join(db.Books).filter(common_filters())\ + .group_by('books_tags_link.tag').order_by(db.Tags.name).offset(off).limit(config.config_books_per_page) + pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, + len(db.session.query(db.Tags).all())) + return render_xml_template('feed.xml', listelements=entries, folder='feed_category', pagination=pagination) + + +@app.route("/opds/category/") +@requires_basic_auth_if_no_ano +def feed_category(book_id): + off = request.args.get("offset") or 0 + entries, __, pagination = fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), + db.Books, db.Books.tags.any(db.Tags.id == book_id), [db.Books.timestamp.desc()]) + return render_xml_template('feed.xml', entries=entries, pagination=pagination) + + +@app.route("/opds/series") +@requires_basic_auth_if_no_ano +def feed_seriesindex(): + off = request.args.get("offset") or 0 + entries = db.session.query(db.Series).join(db.books_series_link).join(db.Books).filter(common_filters())\ + .group_by('books_series_link.series').order_by(db.Series.sort).offset(off).all() + pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, + len(db.session.query(db.Series).all())) + return render_xml_template('feed.xml', listelements=entries, folder='feed_series', pagination=pagination) + + +@app.route("/opds/series/") +@requires_basic_auth_if_no_ano +def feed_series(book_id): + off = request.args.get("offset") or 0 + entries, __, pagination = fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), + db.Books, db.Books.series.any(db.Series.id == book_id), [db.Books.series_index]) + return render_xml_template('feed.xml', entries=entries, pagination=pagination) + + +@app.route("/opds/shelfindex/", defaults={'public': 0}) +@app.route("/opds/shelfindex/") +@requires_basic_auth_if_no_ano +def feed_shelfindex(public): + off = request.args.get("offset") or 0 + if public is not 0: + shelf = g.public_shelfes + number = len(shelf) + else: + shelf = g.user.shelf + number = shelf.count() + pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, + number) + return render_xml_template('feed.xml', listelements=shelf, folder='feed_shelf', pagination=pagination) + + +@app.route("/opds/shelf/") +@requires_basic_auth_if_no_ano +def feed_shelf(book_id): + off = request.args.get("offset") or 0 + if current_user.is_anonymous: + shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.is_public == 1, ub.Shelf.id == book_id).first() + else: + shelf = ub.session.query(ub.Shelf).filter(ub.or_(ub.and_(ub.Shelf.user_id == int(current_user.id), + ub.Shelf.id == book_id), + ub.and_(ub.Shelf.is_public == 1, + ub.Shelf.id == book_id))).first() + result = list() + # user is allowed to access shelf + if shelf: + books_in_shelf = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == book_id).order_by( + ub.BookShelf.order.asc()).all() + for book in books_in_shelf: + cur_book = db.session.query(db.Books).filter(db.Books.id == book.book_id).first() + result.append(cur_book) + pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, + len(result)) + return render_xml_template('feed.xml', entries=result, pagination=pagination) + + +@app.route("/opds/download///") +@requires_basic_auth_if_no_ano +@download_required +def get_opds_download_link(book_id, book_format): + book_format = book_format.split(".")[0] + book = db.session.query(db.Books).filter(db.Books.id == book_id).first() + data = db.session.query(db.Data).filter(db.Data.book == book.id).filter(db.Data.format == book_format.upper()).first() + app.logger.info(data.name) + if current_user.is_authenticated: + ub.update_download(book_id, int(current_user.id)) + file_name = book.title + if len(book.authors) > 0: + file_name = book.authors[0].name + '_' + file_name + file_name = helper.get_valid_filename(file_name) + headers = Headers() + headers["Content-Disposition"] = "attachment; filename*=UTF-8''%s.%s" % (quote(file_name.encode('utf8')), + book_format) + try: + headers["Content-Type"] = mimetypes.types_map['.' + book_format] + except KeyError: + headers["Content-Type"] = "application/octet-stream" + return helper.do_download_file(book, book_format, data, headers) + + +@app.route("/ajax/book/") +@requires_basic_auth_if_no_ano +def get_metadata_calibre_companion(uuid): + entry = db.session.query(db.Books).filter(db.Books.uuid.like("%" + uuid + "%")).first() + if entry is not None: + js = render_template('json.txt', entry=entry) + response = make_response(js) + response.headers["Content-Type"] = "application/json; charset=utf-8" + return response + else: + return "" + +@app.route("/ajax/emailstat") +@login_required +def get_email_status_json(): + tasks=helper.global_WorkerThread.get_taskstatus() + answer = helper.render_task_status(tasks) + js=json.dumps(answer, default=helper.json_serial) + response = make_response(js) + response.headers["Content-Type"] = "application/json; charset=utf-8" + return response + + +# checks if domain is in database (including wildcards) +# example SELECT * FROM @TABLE WHERE 'abcdefg' LIKE Name; +# from https://code.luasoftware.com/tutorials/flask/execute-raw-sql-in-flask-sqlalchemy/ +def check_valid_domain(domain_text): + # result = session.query(Notification).from_statement(text(sql)).params(id=5).all() + #ToDo: check possible SQL injection + domain_text = domain_text.split('@',1)[-1].lower() + sql = "SELECT * FROM registration WHERE '%s' LIKE domain;" % domain_text + result = ub.session.query(ub.Registration).from_statement(text(sql)).all() + return len(result) + + +''' POST /post + name: 'username', //name of field (column in db) + pk: 1 //primary key (record id) + value: 'superuser!' //new value''' +@app.route("/ajax/editdomain", methods=['POST']) +@login_required +@admin_required +def edit_domain(): + vals = request.form.to_dict() + answer = ub.session.query(ub.Registration).filter(ub.Registration.id == vals['pk']).first() + # domain_name = request.args.get('domain') + answer.domain = vals['value'].replace('*','%').replace('?','_').lower() + ub.session.commit() + return "" + + +@app.route("/ajax/adddomain", methods=['POST']) +@login_required +@admin_required +def add_domain(): + domain_name = request.form.to_dict()['domainname'].replace('*','%').replace('?','_').lower() + check = ub.session.query(ub.Registration).filter(ub.Registration.domain == domain_name).first() + if not check: + new_domain = ub.Registration(domain=domain_name) + ub.session.add(new_domain) + ub.session.commit() + return "" + + +@app.route("/ajax/deletedomain", methods=['POST']) +@login_required +@admin_required +def delete_domain(): + domain_id = request.form.to_dict()['domainid'].replace('*','%').replace('?','_').lower() + ub.session.query(ub.Registration).filter(ub.Registration.id == domain_id).delete() + ub.session.commit() + # If last domain was deleted, add all domains by default + if not ub.session.query(ub.Registration).count(): + new_domain = ub.Registration(domain="%.%") + ub.session.add(new_domain) + ub.session.commit() + return "" + + +@app.route("/ajax/domainlist") +@login_required +@admin_required +def list_domain(): + answer = ub.session.query(ub.Registration).all() + json_dumps = json.dumps([{"domain":r.domain.replace('%','*').replace('_','?'),"id":r.id} for r in answer]) + js=json.dumps(json_dumps.replace('"', "'")).lstrip('"').strip('"') + response = make_response(js.replace("'",'"')) + response.headers["Content-Type"] = "application/json; charset=utf-8" + return response + + +''' +@app.route("/ajax/getcomic///") +@login_required +def get_comic_book(book_id, book_format, page): + book = db.session.query(db.Books).filter(db.Books.id == book_id).first() + if not book: + return "", 204 + else: + for bookformat in book.data: + if bookformat.format.lower() == book_format.lower(): + cbr_file = os.path.join(config.config_calibre_dir, book.path, bookformat.name) + "." + book_format + if book_format in ("cbr", "rar"): + if rar_support == True: + rarfile.UNRAR_TOOL = config.config_rarfile_location + try: + rf = rarfile.RarFile(cbr_file) + names = sort(rf.namelist()) + extract = lambda page: rf.read(names[page]) + except: + # rarfile not valid + app.logger.error('Unrar binary not found, or unable to decompress file ' + cbr_file) + return "", 204 + else: + app.logger.info('Unrar is not supported please install python rarfile extension') + # no support means return nothing + return "", 204 + elif book_format in ("cbz", "zip"): + zf = zipfile.ZipFile(cbr_file) + names=sort(zf.namelist()) + extract = lambda page: zf.read(names[page]) + elif book_format in ("cbt", "tar"): + tf = tarfile.TarFile(cbr_file) + names=sort(tf.getnames()) + extract = lambda page: tf.extractfile(names[page]).read() + else: + app.logger.error('unsupported comic format') + return "", 204 + + if sys.version_info.major >= 3: + b64 = codecs.encode(extract(page), 'base64').decode() + else: + b64 = extract(page).encode('base64') + ext = names[page].rpartition('.')[-1] + if ext not in ('png', 'gif', 'jpg', 'jpeg'): + ext = 'png' + extractedfile="data:image/" + ext + ";base64," + b64 + fileData={"name": names[page], "page":page, "last":len(names)-1, "content": extractedfile} + return make_response(json.dumps(fileData)) + return "", 204 +''' + + +@app.route("/get_authors_json", methods=['GET', 'POST']) +@login_required_if_no_ano +def get_authors_json(): + if request.method == "GET": + query = request.args.get('q') + entries = db.session.query(db.Authors).filter(db.Authors.name.ilike("%" + query + "%")).all() + json_dumps = json.dumps([dict(name=r.name.replace('|',',')) for r in entries]) + return json_dumps + + +@app.route("/get_publishers_json", methods=['GET', 'POST']) +@login_required_if_no_ano +def get_publishers_json(): + if request.method == "GET": + query = request.args.get('q') + entries = db.session.query(db.Publishers).filter(db.Publishers.name.ilike("%" + query + "%")).all() + json_dumps = json.dumps([dict(name=r.name.replace('|',',')) for r in entries]) + return json_dumps + + +@app.route("/get_tags_json", methods=['GET', 'POST']) +@login_required_if_no_ano +def get_tags_json(): + if request.method == "GET": + query = request.args.get('q') + entries = db.session.query(db.Tags).filter(db.Tags.name.ilike("%" + query + "%")).all() + json_dumps = json.dumps([dict(name=r.name) for r in entries]) + return json_dumps + + +@app.route("/get_languages_json", methods=['GET', 'POST']) +@login_required_if_no_ano +def get_languages_json(): + if request.method == "GET": + query = request.args.get('q').lower() + # languages = speaking_language() + languages = language_table[get_locale()] + entries_start = [s for key, s in languages.items() if s.lower().startswith(query.lower())] + if len(entries_start) < 5: + entries = [s for key,s in languages.items() if query in s.lower()] + entries_start.extend(entries[0:(5-len(entries_start))]) + entries_start = list(set(entries_start)) + json_dumps = json.dumps([dict(name=r) for r in entries_start[0:5]]) + return json_dumps + + +@app.route("/get_series_json", methods=['GET', 'POST']) +@login_required_if_no_ano +def get_series_json(): + if request.method == "GET": + query = request.args.get('q') + entries = db.session.query(db.Series).filter(db.Series.name.ilike("%" + query + "%")).all() + # entries = db.session.execute("select name from series where name like '%" + query + "%'") + json_dumps = json.dumps([dict(name=r.name) for r in entries]) + return json_dumps + + +@app.route("/get_matching_tags", methods=['GET', 'POST']) +@login_required_if_no_ano +def get_matching_tags(): + tag_dict = {'tags': []} + if request.method == "GET": + q = db.session.query(db.Books) + author_input = request.args.get('author_name') + title_input = request.args.get('book_title') + include_tag_inputs = request.args.getlist('include_tag') + exclude_tag_inputs = request.args.getlist('exclude_tag') + q = q.filter(db.Books.authors.any(db.Authors.name.ilike("%" + author_input + "%")), + db.Books.title.ilike("%" + title_input + "%")) + if len(include_tag_inputs) > 0: + for tag in include_tag_inputs: + q = q.filter(db.Books.tags.any(db.Tags.id == tag)) + if len(exclude_tag_inputs) > 0: + for tag in exclude_tag_inputs: + q = q.filter(not_(db.Books.tags.any(db.Tags.id == tag))) + for book in q: + for tag in book.tags: + if tag.id not in tag_dict['tags']: + tag_dict['tags'].append(tag.id) + json_dumps = json.dumps(tag_dict) + return json_dumps + + +@app.route("/get_update_status", methods=['GET']) +@login_required_if_no_ano +def get_update_status(): + status = { + 'update': False, + 'success': False, + 'message': '', + 'current_commit_hash': '' + } + parents = [] + + repository_url = 'https://api.github.com/repos/janeczku/calibre-web' + tz = datetime.timedelta(seconds=time.timezone if (time.localtime().tm_isdst == 0) else time.altzone) + + if request.method == "GET": + version = helper.get_current_version_info() + if version is False: + status['current_commit_hash'] = _(u'Unknown') + else: + status['current_commit_hash'] = version['hash'] + + try: + r = requests.get(repository_url + '/git/refs/heads/master') + r.raise_for_status() + commit = r.json() + except requests.exceptions.HTTPError as ex: + status['message'] = _(u'HTTP Error') + ' ' + str(ex) + except requests.exceptions.ConnectionError: + status['message'] = _(u'Connection error') + except requests.exceptions.Timeout: + status['message'] = _(u'Timeout while establishing connection') + except requests.exceptions.RequestException: + status['message'] = _(u'General error') + + if status['message'] != '': + return json.dumps(status) + + if 'object' not in commit: + status['message'] = _(u'Unexpected data while reading update information') + return json.dumps(status) + + if commit['object']['sha'] == status['current_commit_hash']: + status.update({ + 'update': False, + 'success': True, + 'message': _(u'No update available. You already have the latest version installed') + }) + return json.dumps(status) + + # a new update is available + status['update'] = True + + try: + r = requests.get(repository_url + '/git/commits/' + commit['object']['sha']) + r.raise_for_status() + update_data = r.json() + except requests.exceptions.HTTPError as ex: + status['error'] = _(u'HTTP Error') + ' ' + str(ex) + except requests.exceptions.ConnectionError: + status['error'] = _(u'Connection error') + except requests.exceptions.Timeout: + status['error'] = _(u'Timeout while establishing connection') + except requests.exceptions.RequestException: + status['error'] = _(u'General error') + + if status['message'] != '': + return json.dumps(status) + + if 'committer' in update_data and 'message' in update_data: + status['success'] = True + status['message'] = _(u'A new update is available. Click on the button below to update to the latest version.') + + new_commit_date = datetime.datetime.strptime( + update_data['committer']['date'], '%Y-%m-%dT%H:%M:%SZ') - tz + parents.append( + [ + format_datetime(new_commit_date, format='short', locale=get_locale()), + update_data['message'], + update_data['sha'] + ] + ) + + # it only makes sense to analyze the parents if we know the current commit hash + if status['current_commit_hash'] != '': + try: + parent_commit = update_data['parents'][0] + # limit the maximum search depth + remaining_parents_cnt = 10 + except IndexError: + remaining_parents_cnt = None + + if remaining_parents_cnt is not None: + while True: + if remaining_parents_cnt == 0: + break + + # check if we are more than one update behind if so, go up the tree + if parent_commit['sha'] != status['current_commit_hash']: + try: + r = requests.get(parent_commit['url']) + r.raise_for_status() + parent_data = r.json() + + parent_commit_date = datetime.datetime.strptime( + parent_data['committer']['date'], '%Y-%m-%dT%H:%M:%SZ') - tz + parent_commit_date = format_datetime( + parent_commit_date, format='short', locale=get_locale()) + + parents.append([parent_commit_date, parent_data['message'], parent_data['sha']]) + parent_commit = parent_data['parents'][0] + remaining_parents_cnt -= 1 + except Exception: + # it isn't crucial if we can't get information about the parent + break + else: + # parent is our current version + break + + else: + status['success'] = False + status['message'] = _(u'Could not fetch update information') + + status['history'] = parents + return json.dumps(status) + + +@app.route("/get_updater_status", methods=['GET', 'POST']) +@login_required +@admin_required +def get_updater_status(): + status = {} + if request.method == "POST": + commit = request.form.to_dict() + if "start" in commit and commit['start'] == 'True': + text = { + "1": _(u'Requesting update package'), + "2": _(u'Downloading update package'), + "3": _(u'Unzipping update package'), + "4": _(u'Replacing files'), + "5": _(u'Database connections are closed'), + "6": _(u'Stopping server'), + "7": _(u'Update finished, please press okay and reload page'), + "8": _(u'Update failed:') + u' ' + _(u'HTTP Error'), + "9": _(u'Update failed:') + u' ' + _(u'Connection error'), + "10": _(u'Update failed:') + u' ' + _(u'Timeout while establishing connection'), + "11": _(u'Update failed:') + u' ' + _(u'General error') + } + status['text'] = text + helper.updater_thread = helper.Updater() + helper.updater_thread.start() + status['status'] = helper.updater_thread.get_update_status() + elif request.method == "GET": + try: + status['status'] = helper.updater_thread.get_update_status() + except AttributeError: + # thread is not active, occours after restart on update + status['status'] = 7 + except Exception: + status['status'] = 11 + return json.dumps(status) + + +@app.route("/", defaults={'page': 1}) +@app.route('/page/') +@login_required_if_no_ano +def index(page): + entries, random, pagination = fill_indexpage(page, db.Books, True, [db.Books.timestamp.desc()]) + return render_title_template('index.html', random=random, entries=entries, pagination=pagination, + title=_(u"Recently Added Books"), page="root") + + +@app.route('/books/newest', defaults={'page': 1}) +@app.route('/books/newest/page/') +@login_required_if_no_ano +def newest_books(page): + if current_user.show_sorted(): + entries, random, pagination = fill_indexpage(page, db.Books, True, [db.Books.pubdate.desc()]) + return render_title_template('index.html', random=random, entries=entries, pagination=pagination, + title=_(u"Newest Books"), page="newest") + else: + abort(404) + + +@app.route('/books/oldest', defaults={'page': 1}) +@app.route('/books/oldest/page/') +@login_required_if_no_ano +def oldest_books(page): + if current_user.show_sorted(): + entries, random, pagination = fill_indexpage(page, db.Books, True, [db.Books.pubdate]) + return render_title_template('index.html', random=random, entries=entries, pagination=pagination, + title=_(u"Oldest Books"), page="oldest") + else: + abort(404) + + +@app.route('/books/a-z', defaults={'page': 1}) +@app.route('/books/a-z/page/') +@login_required_if_no_ano +def titles_ascending(page): + if current_user.show_sorted(): + entries, random, pagination = fill_indexpage(page, db.Books, True, [db.Books.sort]) + return render_title_template('index.html', random=random, entries=entries, pagination=pagination, + title=_(u"Books (A-Z)"), page="a-z") + else: + abort(404) + + +@app.route('/books/z-a', defaults={'page': 1}) +@app.route('/books/z-a/page/') +@login_required_if_no_ano +def titles_descending(page): + entries, random, pagination = fill_indexpage(page, db.Books, True, [db.Books.sort.desc()]) + return render_title_template('index.html', random=random, entries=entries, pagination=pagination, + title=_(u"Books (Z-A)"), page="z-a") + + +@app.route("/hot", defaults={'page': 1}) +@app.route('/hot/page/') +@login_required_if_no_ano +def hot_books(page): + if current_user.show_hot_books(): + if current_user.show_detail_random(): + random = db.session.query(db.Books).filter(common_filters())\ + .order_by(func.random()).limit(config.config_random_books) + else: + random = false() + off = int(int(config.config_books_per_page) * (page - 1)) + all_books = ub.session.query(ub.Downloads, ub.func.count(ub.Downloads.book_id)).order_by( + ub.func.count(ub.Downloads.book_id).desc()).group_by(ub.Downloads.book_id) + hot_books = all_books.offset(off).limit(config.config_books_per_page) + entries = list() + for book in hot_books: + downloadBook = db.session.query(db.Books).filter(common_filters()).filter(db.Books.id == book.Downloads.book_id).first() + if downloadBook: + entries.append(downloadBook) + else: + ub.delete_download(book.Downloads.book_id) + # ub.session.query(ub.Downloads).filter(book.Downloads.book_id == ub.Downloads.book_id).delete() + # ub.session.commit() + numBooks = entries.__len__() + pagination = Pagination(page, config.config_books_per_page, numBooks) + return render_title_template('index.html', random=random, entries=entries, pagination=pagination, + title=_(u"Hot Books (most downloaded)"), page="hot") + else: + abort(404) + + +@app.route("/rated", defaults={'page': 1}) +@app.route('/rated/page/') +@login_required_if_no_ano +def best_rated_books(page): + if current_user.show_best_rated_books(): + entries, random, pagination = fill_indexpage(page, db.Books, db.Books.ratings.any(db.Ratings.rating > 9), + [db.Books.timestamp.desc()]) + return render_title_template('index.html', random=random, entries=entries, pagination=pagination, + title=_(u"Best rated books"), page="rated") + else: + abort(404) + + +@app.route("/discover", defaults={'page': 1}) +@app.route('/discover/page/') +@login_required_if_no_ano +def discover(page): + if current_user.show_random_books(): + entries, __, pagination = fill_indexpage(page, db.Books, True, [func.randomblob(2)]) + pagination = Pagination(1, config.config_books_per_page, config.config_books_per_page) + return render_title_template('discover.html', entries=entries, pagination=pagination, + title=_(u"Random Books"), page="discover") + else: + abort(404) + + +@app.route("/author") +@login_required_if_no_ano +def author_list(): + if current_user.show_author(): + entries = db.session.query(db.Authors, func.count('books_authors_link.book').label('count'))\ + .join(db.books_authors_link).join(db.Books).filter(common_filters())\ + .group_by('books_authors_link.author').order_by(db.Authors.sort).all() + for entry in entries: + entry.Authors.name = entry.Authors.name.replace('|', ',') + return render_title_template('list.html', entries=entries, folder='author', + title=_(u"Author list"), page="authorlist") + else: + abort(404) + + +@app.route("/author/", defaults={'page': 1}) +@app.route("/author//'") +@login_required_if_no_ano +def author(book_id, page): + entries, __, pagination = fill_indexpage(page, db.Books, db.Books.authors.any(db.Authors.id == book_id), + [db.Series.name, db.Books.series_index],db.books_series_link, db.Series) + if entries is None: + flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error") + return redirect(url_for("index")) + + name = (db.session.query(db.Authors).filter(db.Authors.id == book_id).first().name).replace('|', ',') + + author_info = None + other_books = [] + if goodreads_support and config.config_use_goodreads: + try: + gc = GoodreadsClient(config.config_goodreads_api_key, config.config_goodreads_api_secret) + author_info = gc.find_author(author_name=name) + other_books = get_unique_other_books(entries.all(), author_info.books) + except Exception: + # Skip goodreads, if site is down/inaccessible + app.logger.error('Goodreads website is down/inaccessible') + + return render_title_template('author.html', entries=entries, pagination=pagination, + title=name, author=author_info, other_books=other_books, page="author") + + +@app.route("/publisher") +@login_required_if_no_ano +def publisher_list(): + if current_user.show_publisher(): + entries = db.session.query(db.Publishers, func.count('books_publishers_link.book').label('count'))\ + .join(db.books_publishers_link).join(db.Books).filter(common_filters())\ + .group_by('books_publishers_link.publisher').order_by(db.Publishers.sort).all() + return render_title_template('list.html', entries=entries, folder='publisher', + title=_(u"Publisher list"), page="publisherlist") + else: + abort(404) + + +@app.route("/publisher/", defaults={'page': 1}) +@app.route('/publisher//') +@login_required_if_no_ano +def publisher(book_id, page): + publisher = db.session.query(db.Publishers).filter(db.Publishers.id == book_id).first() + if publisher: + entries, random, pagination = fill_indexpage(page, db.Books, + db.Books.publishers.any(db.Publishers.id == book_id), + (db.Series.name, db.Books.series_index), db.books_series_link, db.Series) + return render_title_template('index.html', random=random, entries=entries, pagination=pagination, + title=_(u"Publisher: %(name)s", name=publisher.name), page="publisher") + else: + abort(404) + + +def get_unique_other_books(library_books, author_books): + # Get all identifiers (ISBN, Goodreads, etc) and filter author's books by that list so we show fewer duplicates + # Note: Not all images will be shown, even though they're available on Goodreads.com. + # See https://www.goodreads.com/topic/show/18213769-goodreads-book-images + identifiers = reduce(lambda acc, book: acc + map(lambda identifier: identifier.val, book.identifiers), library_books, []) + other_books = filter(lambda book: book.isbn not in identifiers and book.gid["#text"] not in identifiers, author_books) + + # Fuzzy match book titles + if levenshtein_support: + library_titles = reduce(lambda acc, book: acc + [book.title], library_books, []) + other_books = filter(lambda author_book: not filter( + lambda library_book: + Levenshtein.ratio(re.sub(r"\(.*\)", "", author_book.title), library_book) > 0.7, # Remove items in parentheses before comparing + library_titles + ), other_books) + + return other_books + + +@app.route("/series") +@login_required_if_no_ano +def series_list(): + if current_user.show_series(): + entries = db.session.query(db.Series, func.count('books_series_link.book').label('count'))\ + .join(db.books_series_link).join(db.Books).filter(common_filters())\ + .group_by('books_series_link.series').order_by(db.Series.sort).all() + return render_title_template('list.html', entries=entries, folder='series', + title=_(u"Series list"), page="serieslist") + else: + abort(404) + + +@app.route("/series//", defaults={'page': 1}) +@app.route("/series//") +@login_required_if_no_ano +def series(book_id, page): + name = db.session.query(db.Series).filter(db.Series.id == book_id).first() + if name: + entries, random, pagination = fill_indexpage(page, db.Books, db.Books.series.any(db.Series.id == book_id), + [db.Books.series_index]) + return render_title_template('index.html', random=random, pagination=pagination, entries=entries, + title=_(u"Series: %(serie)s", serie=name.name), page="series") + else: + abort(404) + + +@app.route("/language") +@login_required_if_no_ano +def language_overview(): + if current_user.show_language(): + if current_user.filter_language() == u"all": + languages = speaking_language() + else: + try: + cur_l = LC.parse(current_user.filter_language()) + except UnknownLocaleError: + cur_l = None + languages = db.session.query(db.Languages).filter( + db.Languages.lang_code == current_user.filter_language()).all() + if cur_l: + languages[0].name = cur_l.get_language_name(get_locale()) + else: + languages[0].name = _(isoLanguages.get(part3=languages[0].lang_code).name) + lang_counter = db.session.query(db.books_languages_link, + func.count('books_languages_link.book').label('bookcount')).group_by( + 'books_languages_link.lang_code').all() + return render_title_template('languages.html', languages=languages, lang_counter=lang_counter, + title=_(u"Available languages"), page="langlist") + else: + abort(404) + + +@app.route("/language/", defaults={'page': 1}) +@app.route('/language//page/') +@login_required_if_no_ano +def language(name, page): + try: + cur_l = LC.parse(name) + lang_name = cur_l.get_language_name(get_locale()) + except UnknownLocaleError: + try: + lang_name = _(isoLanguages.get(part3=name).name) + except KeyError: + abort(404) + entries, random, pagination = fill_indexpage(page, db.Books, db.Books.languages.any(db.Languages.lang_code == name), + [db.Books.timestamp.desc()]) + return render_title_template('index.html', random=random, entries=entries, pagination=pagination, + title=_(u"Language: %(name)s", name=lang_name), page="language") + + +@app.route("/category") +@login_required_if_no_ano +def category_list(): + if current_user.show_category(): + entries = db.session.query(db.Tags, func.count('books_tags_link.book').label('count'))\ + .join(db.books_tags_link).join(db.Books).order_by(db.Tags.name).filter(common_filters())\ + .group_by('books_tags_link.tag').all() + return render_title_template('list.html', entries=entries, folder='category', + title=_(u"Category list"), page="catlist") + else: + abort(404) + + +@app.route("/category/", defaults={'page': 1}) +@app.route('/category//') +@login_required_if_no_ano +def category(book_id, page): + name = db.session.query(db.Tags).filter(db.Tags.id == book_id).first() + if name: + entries, random, pagination = fill_indexpage(page, db.Books, db.Books.tags.any(db.Tags.id == book_id), + (db.Series.name, db.Books.series_index),db.books_series_link,db.Series) + return render_title_template('index.html', random=random, entries=entries, pagination=pagination, + title=_(u"Category: %(name)s", name=name.name), page="category") + else: + abort(404) + + +@app.route("/ajax/toggleread/", methods=['POST']) +@login_required +def toggle_read(book_id): + if not config.config_read_column: + book = ub.session.query(ub.ReadBook).filter(ub.and_(ub.ReadBook.user_id == int(current_user.id), + ub.ReadBook.book_id == book_id)).first() + if book: + book.is_read = not book.is_read + else: + readBook = ub.ReadBook() + readBook.user_id = int(current_user.id) + readBook.book_id = book_id + readBook.is_read = True + book = readBook + ub.session.merge(book) + ub.session.commit() + else: + try: + db.session.connection().connection.connection.create_function("title_sort", 1, db.title_sort) + book = db.session.query(db.Books).filter(db.Books.id == book_id).filter(common_filters()).first() + read_status = getattr(book, 'custom_column_' + str(config.config_read_column)) + if len(read_status): + read_status[0].value = not read_status[0].value + db.session.commit() + else: + cc_class = db.cc_classes[config.config_read_column] + new_cc = cc_class(value=1, book=book_id) + db.session.add(new_cc) + db.session.commit() + except KeyError: + app.logger.error( + u"Custom Column No.%d is not exisiting in calibre database" % config.config_read_column) + return "" + +@app.route("/book/") +@login_required_if_no_ano +def show_book(book_id): + entries = db.session.query(db.Books).filter(db.Books.id == book_id).filter(common_filters()).first() + if entries: + for index in range(0, len(entries.languages)): + try: + entries.languages[index].language_name = LC.parse(entries.languages[index].lang_code).get_language_name( + get_locale()) + except UnknownLocaleError: + entries.languages[index].language_name = _( + isoLanguages.get(part3=entries.languages[index].lang_code).name) + tmpcc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all() + + if config.config_columns_to_ignore: + cc = [] + for col in tmpcc: + r = re.compile(config.config_columns_to_ignore) + if r.match(col.label): + cc.append(col) + else: + cc = tmpcc + book_in_shelfs = [] + shelfs = ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == book_id).all() + for entry in shelfs: + book_in_shelfs.append(entry.shelf) + + if not current_user.is_anonymous: + if not config.config_read_column: + matching_have_read_book = ub.session.query(ub.ReadBook)\ + .filter(ub.and_(ub.ReadBook.user_id == int(current_user.id), + ub.ReadBook.book_id == book_id)).all() + have_read = len(matching_have_read_book) > 0 and matching_have_read_book[0].is_read + else: + try: + matching_have_read_book = getattr(entries,'custom_column_'+str(config.config_read_column)) + have_read = len(matching_have_read_book) > 0 and matching_have_read_book[0].value + except KeyError: + app.logger.error( + u"Custom Column No.%d is not exisiting in calibre database" % config.config_read_column) + have_read = None + + else: + have_read = None + + entries.tags = sort(entries.tags, key = lambda tag: tag.name) + + kindle_list = helper.check_send_to_kindle(entries) + reader_list = helper.check_read_formats(entries) + + return render_title_template('detail.html', entry=entries, cc=cc, is_xhr=request.is_xhr, + title=entries.title, books_shelfs=book_in_shelfs, + have_read=have_read, kindle_list=kindle_list, reader_list=reader_list, page="book") + else: + flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error") + return redirect(url_for("index")) + + +@app.route("/ajax/bookmark//", methods=['POST']) +@login_required +def bookmark(book_id, book_format): + bookmark_key = request.form["bookmark"] + ub.session.query(ub.Bookmark).filter(ub.and_(ub.Bookmark.user_id == int(current_user.id), + ub.Bookmark.book_id == book_id, + ub.Bookmark.format == book_format)).delete() + if not bookmark_key: + ub.session.commit() + return "", 204 + + lbookmark = ub.Bookmark(user_id=current_user.id, + book_id=book_id, + format=book_format, + bookmark_key=bookmark_key) + ub.session.merge(lbookmark) + ub.session.commit() + return "", 201 + + +@app.route("/tasks") +@login_required +def get_tasks_status(): + # if current user admin, show all email, otherwise only own emails + answer=list() + # UIanswer=list() + tasks=helper.global_WorkerThread.get_taskstatus() + # answer = tasks + + # UIanswer = copy.deepcopy(answer) + answer = helper.render_task_status(tasks) + # foreach row format row + return render_title_template('tasks.html', entries=answer, title=_(u"Tasks")) + + +@app.route("/admin") +@login_required +def admin_forbidden(): + abort(403) + + +@app.route("/stats") +@login_required +def stats(): + counter = db.session.query(db.Books).count() + authors = db.session.query(db.Authors).count() + categorys = db.session.query(db.Tags).count() + series = db.session.query(db.Series).count() + versions = uploader.book_formats.get_versions() + versions['Babel'] = 'v' + babelVersion + versions['Sqlalchemy'] = 'v' + sqlalchemyVersion + versions['Werkzeug'] = 'v' + werkzeugVersion + versions['Jinja2'] = 'v' + jinja2Version + versions['Flask'] = 'v' + flaskVersion + versions['Flask Login'] = 'v' + flask_loginVersion + versions['Flask Principal'] = 'v' + flask_principalVersion + versions['Iso 639'] = 'v' + iso639Version + versions['pytz'] = 'v' + pytzVersion + + versions['Requests'] = 'v' + requests.__version__ + versions['pySqlite'] = 'v' + db.engine.dialect.dbapi.version + versions['Sqlite'] = 'v' + db.engine.dialect.dbapi.sqlite_version + versions.update(converter.versioncheck()) + versions.update(server.Server.getNameVersion()) + versions['Python'] = sys.version + return render_title_template('stats.html', bookcounter=counter, authorcounter=authors, versions=versions, + categorycounter=categorys, seriecounter=series, title=_(u"Statistics"), page="stat") + + +@app.route("/delete//", defaults={'book_format': ""}) +@app.route("/delete///") +@login_required +def delete_book(book_id, book_format): + if current_user.role_delete_books(): + book = db.session.query(db.Books).filter(db.Books.id == book_id).first() + if book: + helper.delete_book(book, config.config_calibre_dir, book_format=book_format.upper()) + if not book_format: + # delete book from Shelfs, Downloads, Read list + ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == book_id).delete() + ub.session.query(ub.ReadBook).filter(ub.ReadBook.book_id == book_id).delete() + ub.delete_download(book_id) + ub.session.commit() + + # check if only this book links to: + # author, language, series, tags, custom columns + modify_database_object([u''], book.authors, db.Authors, db.session, 'author') + modify_database_object([u''], book.tags, db.Tags, db.session, 'tags') + modify_database_object([u''], book.series, db.Series, db.session, 'series') + modify_database_object([u''], book.languages, db.Languages, db.session, 'languages') + modify_database_object([u''], book.publishers, db.Publishers, db.session, 'publishers') + + cc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all() + for c in cc: + cc_string = "custom_column_" + str(c.id) + if not c.is_multiple: + if len(getattr(book, cc_string)) > 0: + if c.datatype == 'bool' or c.datatype == 'integer': + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + db.session.delete(del_cc) + elif c.datatype == 'rating': + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + if len(del_cc.books) == 0: + db.session.delete(del_cc) + else: + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + db.session.delete(del_cc) + else: + modify_database_object([u''], getattr(book, cc_string), db.cc_classes[c.id], + db.session, 'custom') + db.session.query(db.Books).filter(db.Books.id == book_id).delete() + else: + db.session.query(db.Data).filter(db.Data.book == book.id).filter(db.Data.format == book_format).delete() + db.session.commit() + else: + # book not found + app.logger.info('Book with id "'+str(book_id)+'" could not be deleted') + if book_format: + return redirect(url_for('edit_book', book_id=book_id)) + else: + return redirect(url_for('index')) + + + +@app.route("/gdrive/authenticate") +@login_required +@admin_required +def authenticate_google_drive(): + authUrl = gdriveutils.Gauth.Instance().auth.GetAuthUrl() + return redirect(authUrl) + + +@app.route("/gdrive/callback") +def google_drive_callback(): + auth_code = request.args.get('code') + if not auth_code: + abort(403) + try: + credentials = gdriveutils.Gauth.Instance().auth.flow.step2_exchange(auth_code) + with open(os.path.join(config.get_main_dir,'gdrive_credentials'), 'w') as f: + f.write(credentials.to_json()) + except ValueError as error: + app.logger.error(error) + return redirect(url_for('configuration')) + + +@app.route("/gdrive/watch/subscribe") +@login_required +@admin_required +def watch_gdrive(): + if not config.config_google_drive_watch_changes_response: + with open(os.path.join(config.get_main_dir,'client_secrets.json'), 'r') as settings: + filedata = json.load(settings) + if filedata['web']['redirect_uris'][0].endswith('/'): + filedata['web']['redirect_uris'][0] = filedata['web']['redirect_uris'][0][:-((len('/gdrive/callback')+1))] + else: + filedata['web']['redirect_uris'][0] = filedata['web']['redirect_uris'][0][:-(len('/gdrive/callback'))] + address = '%s/gdrive/watch/callback' % filedata['web']['redirect_uris'][0] + notification_id = str(uuid4()) + try: + result = gdriveutils.watchChange(gdriveutils.Gdrive.Instance().drive, notification_id, + 'web_hook', address, gdrive_watch_callback_token, current_milli_time() + 604800*1000) + settings = ub.session.query(ub.Settings).first() + settings.config_google_drive_watch_changes_response = json.dumps(result) + ub.session.merge(settings) + ub.session.commit() + settings = ub.session.query(ub.Settings).first() + config.loadSettings() + except HttpError as e: + reason=json.loads(e.content)['error']['errors'][0] + if reason['reason'] == u'push.webhookUrlUnauthorized': + flash(_(u'Callback domain is not verified, please follow steps to verify domain in google developer console'), category="error") + else: + flash(reason['message'], category="error") + + return redirect(url_for('configuration')) + + +@app.route("/gdrive/watch/revoke") +@login_required +@admin_required +def revoke_watch_gdrive(): + last_watch_response = config.config_google_drive_watch_changes_response + if last_watch_response: + try: + gdriveutils.stopChannel(gdriveutils.Gdrive.Instance().drive, last_watch_response['id'], + last_watch_response['resourceId']) + except HttpError: + pass + settings = ub.session.query(ub.Settings).first() + settings.config_google_drive_watch_changes_response = None + ub.session.merge(settings) + ub.session.commit() + config.loadSettings() + return redirect(url_for('configuration')) + + +@app.route("/gdrive/watch/callback", methods=['GET', 'POST']) +def on_received_watch_confirmation(): + app.logger.debug(request.headers) + if request.headers.get('X-Goog-Channel-Token') == gdrive_watch_callback_token \ + and request.headers.get('X-Goog-Resource-State') == 'change' \ + and request.data: + + data = request.data + + def updateMetaData(): + app.logger.info('Change received from gdrive') + app.logger.debug(data) + try: + j = json.loads(data) + app.logger.info('Getting change details') + response = gdriveutils.getChangeById(gdriveutils.Gdrive.Instance().drive, j['id']) + app.logger.debug(response) + if response: + dbpath = os.path.join(config.config_calibre_dir, "metadata.db") + if not response['deleted'] and response['file']['title'] == 'metadata.db' and response['file']['md5Checksum'] != md5(dbpath): + tmpDir = tempfile.gettempdir() + app.logger.info('Database file updated') + copyfile(dbpath, os.path.join(tmpDir, "metadata.db_" + str(current_milli_time()))) + app.logger.info('Backing up existing and downloading updated metadata.db') + gdriveutils.downloadFile(None, "metadata.db", os.path.join(tmpDir, "tmp_metadata.db")) + app.logger.info('Setting up new DB') + # prevent error on windows, as os.rename does on exisiting files + move(os.path.join(tmpDir, "tmp_metadata.db"), dbpath) + db.setup_db() + except Exception as e: + app.logger.info(e.message) + app.logger.exception(e) + updateMetaData() + return '' + + +@app.route("/shutdown") +@login_required +@admin_required +def shutdown(): + task = int(request.args.get("parameter").strip()) + if task == 1 or task == 0: # valid commandos received + # close all database connections + db.session.close() + db.engine.dispose() + ub.session.close() + ub.engine.dispose() + + showtext = {} + if task == 0: + showtext['text'] = _(u'Server restarted, please reload page') + server.Server.setRestartTyp(True) + else: + showtext['text'] = _(u'Performing shutdown of server, please close window') + server.Server.setRestartTyp(False) + # stop gevent/tornado server + server.Server.stopServer() + return json.dumps(showtext) + else: + if task == 2: + db.session.close() + db.engine.dispose() + db.setup_db() + return json.dumps({}) + abort(404) + + +@app.route("/update") +@login_required +@admin_required +def update(): + helper.updater_thread = helper.Updater() + flash(_(u"Update done"), category="info") + return abort(404) + + +@app.route("/search", methods=["GET"]) +@login_required_if_no_ano +def search(): + term = request.args.get("query").strip().lower() + if term: + entries = get_search_results(term) + ids = list() + for element in entries: + ids.append(element.id) + ub.searched_ids[current_user.id] = ids + return render_title_template('search.html', searchterm=term, entries=entries, page="search") + else: + return render_title_template('search.html', searchterm="", page="search") + + +@app.route("/advanced_search", methods=['GET']) +@login_required_if_no_ano +def advanced_search(): + # Build custom columns names + tmpcc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all() + if config.config_columns_to_ignore: + cc = [] + for col in tmpcc: + r = re.compile(config.config_columns_to_ignore) + if r.match(col.label): + cc.append(col) + else: + cc = tmpcc + + db.session.connection().connection.connection.create_function("lower", 1, db.lcase) + q = db.session.query(db.Books) + # postargs = request.form.to_dict() + + include_tag_inputs = request.args.getlist('include_tag') + exclude_tag_inputs = request.args.getlist('exclude_tag') + include_series_inputs = request.args.getlist('include_serie') + exclude_series_inputs = request.args.getlist('exclude_serie') + include_languages_inputs = request.args.getlist('include_language') + exclude_languages_inputs = request.args.getlist('exclude_language') + + author_name = request.args.get("author_name") + book_title = request.args.get("book_title") + publisher = request.args.get("publisher") + pub_start = request.args.get("Publishstart") + pub_end = request.args.get("Publishend") + rating_low = request.args.get("ratinghigh") + rating_high = request.args.get("ratinglow") + description = request.args.get("comment") + if author_name: author_name = author_name.strip().lower().replace(',','|') + if book_title: book_title = book_title.strip().lower() + if publisher: publisher = publisher.strip().lower() + + searchterm = [] + cc_present = False + for c in cc: + if request.args.get('custom_column_' + str(c.id)): + searchterm.extend([(u"%s: %s" % (c.name, request.args.get('custom_column_' + str(c.id))))]) + cc_present = True + + if include_tag_inputs or exclude_tag_inputs or include_series_inputs or exclude_series_inputs or \ + include_languages_inputs or exclude_languages_inputs or author_name or book_title or \ + publisher or pub_start or pub_end or rating_low or rating_high or description or cc_present: + searchterm = [] + searchterm.extend((author_name.replace('|',','), book_title, publisher)) + if pub_start: + try: + searchterm.extend([_(u"Published after ") + + format_date(datetime.datetime.strptime(pub_start,"%Y-%m-%d"), + format='medium', locale=get_locale())]) + except ValueError: + pub_start = u"" + if pub_end: + try: + searchterm.extend([_(u"Published before ") + + format_date(datetime.datetime.strptime(pub_end,"%Y-%m-%d"), + format='medium', locale=get_locale())]) + except ValueError: + pub_start = u"" + tag_names = db.session.query(db.Tags).filter(db.Tags.id.in_(include_tag_inputs)).all() + searchterm.extend(tag.name for tag in tag_names) + serie_names = db.session.query(db.Series).filter(db.Series.id.in_(include_series_inputs)).all() + searchterm.extend(serie.name for serie in serie_names) + language_names = db.session.query(db.Languages).filter(db.Languages.id.in_(include_languages_inputs)).all() + if language_names: + language_names = speaking_language(language_names) + searchterm.extend(language.name for language in language_names) + if rating_high: + searchterm.extend([_(u"Rating <= %(rating)s", rating=rating_high)]) + if rating_low: + searchterm.extend([_(u"Rating >= %(rating)s", rating=rating_low)]) + # handle custom columns + for c in cc: + if request.args.get('custom_column_' + str(c.id)): + searchterm.extend([(u"%s: %s" % (c.name, request.args.get('custom_column_' + str(c.id))))]) + searchterm = " + ".join(filter(None, searchterm)) + q = q.filter() + if author_name: + q = q.filter(db.Books.authors.any(db.Authors.name.ilike("%" + author_name + "%"))) + if book_title: + q = q.filter(db.Books.title.ilike("%" + book_title + "%")) + if pub_start: + q = q.filter(db.Books.pubdate >= pub_start) + if pub_end: + q = q.filter(db.Books.pubdate <= pub_end) + if publisher: + q = q.filter(db.Books.publishers.any(db.Publishers.name.ilike("%" + publisher + "%"))) + for tag in include_tag_inputs: + q = q.filter(db.Books.tags.any(db.Tags.id == tag)) + for tag in exclude_tag_inputs: + q = q.filter(not_(db.Books.tags.any(db.Tags.id == tag))) + for serie in include_series_inputs: + q = q.filter(db.Books.series.any(db.Series.id == serie)) + for serie in exclude_series_inputs: + q = q.filter(not_(db.Books.series.any(db.Series.id == serie))) + if current_user.filter_language() != "all": + q = q.filter(db.Books.languages.any(db.Languages.lang_code == current_user.filter_language())) + else: + for language in include_languages_inputs: + q = q.filter(db.Books.languages.any(db.Languages.id == language)) + for language in exclude_languages_inputs: + q = q.filter(not_(db.Books.series.any(db.Languages.id == language))) + if rating_high: + rating_high = int(rating_high) * 2 + q = q.filter(db.Books.ratings.any(db.Ratings.rating <= rating_high)) + if rating_low: + rating_low = int(rating_low) *2 + q = q.filter(db.Books.ratings.any(db.Ratings.rating >= rating_low)) + if description: + q = q.filter(db.Books.comments.any(db.Comments.text.ilike("%" + description + "%"))) + + # search custom culumns + for c in cc: + custom_query = request.args.get('custom_column_' + str(c.id)) + if custom_query: + if c.datatype == 'bool': + getattr(db.Books, 'custom_column_1') + q = q.filter(getattr(db.Books, 'custom_column_'+str(c.id)).any( + db.cc_classes[c.id].value == (custom_query== "True") )) + elif c.datatype == 'int': + q = q.filter(getattr(db.Books, 'custom_column_'+str(c.id)).any( + db.cc_classes[c.id].value == custom_query )) + else: + q = q.filter(getattr(db.Books, 'custom_column_'+str(c.id)).any( + db.cc_classes[c.id].value.ilike("%" + custom_query + "%"))) + q = q.all() + ids = list() + for element in q: + ids.append(element.id) + ub.searched_ids[current_user.id] = ids + return render_title_template('search.html', searchterm=searchterm, + entries=q, title=_(u"search"), page="search") + # prepare data for search-form + tags = db.session.query(db.Tags).order_by(db.Tags.name).all() + series = db.session.query(db.Series).order_by(db.Series.name).all() + if current_user.filter_language() == u"all": + languages = speaking_language() + else: + languages = None + return render_title_template('search_form.html', tags=tags, languages=languages, + series=series, title=_(u"search"), cc=cc, page="advsearch") + + +@app.route("/cover/") +@login_required_if_no_ano +def get_cover(cover_path): + return helper.get_book_cover(cover_path) + + +@app.route("/show//") +@login_required_if_no_ano +def serve_book(book_id, book_format): + book_format = book_format.split(".")[0] + book = db.session.query(db.Books).filter(db.Books.id == book_id).first() + data = db.session.query(db.Data).filter(db.Data.book == book.id).filter(db.Data.format == book_format.upper()).first() + app.logger.info(data.name) + if config.config_use_google_drive: + headers = Headers() + try: + headers["Content-Type"] = mimetypes.types_map['.' + book_format] + except KeyError: + headers["Content-Type"] = "application/octet-stream" + df = gdriveutils.getFileFromEbooksFolder(book.path, data.name + "." + book_format) + return gdriveutils.do_gdrive_download(df, headers) + else: + return send_from_directory(os.path.join(config.config_calibre_dir, book.path), data.name + "." + book_format) + + +@app.route("/opds/thumb_240_240/") +@app.route("/opds/cover_240_240/") +@app.route("/opds/cover_90_90/") +@app.route("/opds/cover/") +@requires_basic_auth_if_no_ano +def feed_get_cover(book_id): + book = db.session.query(db.Books).filter(db.Books.id == book_id).first() + return helper.get_book_cover(book.path) + + +def render_read_books(page, are_read, as_xml=False): + if not config.config_read_column: + readBooks = ub.session.query(ub.ReadBook).filter(ub.ReadBook.user_id == int(current_user.id))\ + .filter(ub.ReadBook.is_read == True).all() + readBookIds = [x.book_id for x in readBooks] + else: + try: + readBooks = db.session.query(db.cc_classes[config.config_read_column])\ + .filter(db.cc_classes[config.config_read_column].value==True).all() + readBookIds = [x.book for x in readBooks] + except KeyError: + app.logger.error(u"Custom Column No.%d is not existing in calibre database" % config.config_read_column) + readBookIds = [] + + if are_read: + db_filter = db.Books.id.in_(readBookIds) + else: + db_filter = ~db.Books.id.in_(readBookIds) + + entries, random, pagination = fill_indexpage(page, db.Books, + db_filter, [db.Books.timestamp.desc()]) + + if as_xml: + xml = render_title_template('feed.xml', entries=entries, pagination=pagination) + response = make_response(xml) + response.headers["Content-Type"] = "application/xml; charset=utf-8" + return response + else: + if are_read: + name = _(u'Read Books') + ' (' + str(len(readBookIds)) + ')' + else: + total_books = db.session.query(func.count(db.Books.id)).scalar() + name = _(u'Unread Books') + ' (' + str(total_books - len(readBookIds)) + ')' + return render_title_template('index.html', random=random, entries=entries, pagination=pagination, + title=_(name, name=name), page="read") + + +@app.route("/opds/readbooks/") +@login_required_if_no_ano +def feed_read_books(): + off = request.args.get("offset") or 0 + return render_read_books(int(off) / (int(config.config_books_per_page)) + 1, True, True) + + +@app.route("/readbooks/", defaults={'page': 1}) +@app.route("/readbooks/'") +@login_required_if_no_ano +def read_books(page): + return render_read_books(page, True) + + +@app.route("/opds/unreadbooks/") +@login_required_if_no_ano +def feed_unread_books(): + off = request.args.get("offset") or 0 + return render_read_books(int(off) / (int(config.config_books_per_page)) + 1, False, True) + + +@app.route("/unreadbooks/", defaults={'page': 1}) +@app.route("/unreadbooks/'") +@login_required_if_no_ano +def unread_books(page): + return render_read_books(page, False) + + +@app.route("/read//") +@login_required_if_no_ano +def read_book(book_id, book_format): + book = db.session.query(db.Books).filter(db.Books.id == book_id).first() + if not book: + flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error") + return redirect(url_for("index")) + + # check if book was downloaded before + lbookmark = None + if current_user.is_authenticated: + lbookmark = ub.session.query(ub.Bookmark).filter(ub.and_(ub.Bookmark.user_id == int(current_user.id), + ub.Bookmark.book_id == book_id, + ub.Bookmark.format == book_format.upper())).first() + if book_format.lower() == "epub": + return render_title_template('read.html', bookid=book_id, title=_(u"Read a Book"), bookmark=lbookmark) + elif book_format.lower() == "pdf": + return render_title_template('readpdf.html', pdffile=book_id, title=_(u"Read a Book")) + elif book_format.lower() == "txt": + return render_title_template('readtxt.html', txtfile=book_id, title=_(u"Read a Book")) + else: + book_dir = os.path.join(config.get_main_dir, "cps", "static", str(book_id)) + if not os.path.exists(book_dir): + os.mkdir(book_dir) + for fileext in ["cbr", "cbt", "cbz"]: + if book_format.lower() == fileext: + all_name = str(book_id) # + "/" + book.data[0].name + "." + fileext + #tmp_file = os.path.join(book_dir, book.data[0].name) + "." + fileext + #if not os.path.exists(all_name): + # cbr_file = os.path.join(config.config_calibre_dir, book.path, book.data[0].name) + "." + fileext + # copyfile(cbr_file, tmp_file) + return render_title_template('readcbr.html', comicfile=all_name, title=_(u"Read a Book"), + extension=fileext) + '''if rar_support == True: + extensionList = ["cbr","cbt","cbz"] + else: + extensionList = ["cbt","cbz"] + for fileext in extensionList: + if book_format.lower() == fileext: + return render_title_template('readcbr.html', comicfile=book_id, + extension=fileext, title=_(u"Read a Book"), book=book) + flash(_(u"Error opening eBook. File does not exist or file is not accessible."), category="error") + return redirect(url_for("index"))''' + + +@app.route("/download//") +@login_required_if_no_ano +@download_required +def get_download_link(book_id, book_format): + book_format = book_format.split(".")[0] + book = db.session.query(db.Books).filter(db.Books.id == book_id).first() + data = db.session.query(db.Data).filter(db.Data.book == book.id)\ + .filter(db.Data.format == book_format.upper()).first() + if data: + # collect downloaded books only for registered user and not for anonymous user + if current_user.is_authenticated: + ub.update_download(book_id, int(current_user.id)) + file_name = book.title + if len(book.authors) > 0: + file_name = book.authors[0].name + '_' + file_name + file_name = helper.get_valid_filename(file_name) + headers = Headers() + try: + headers["Content-Type"] = mimetypes.types_map['.' + book_format] + except KeyError: + headers["Content-Type"] = "application/octet-stream" + headers["Content-Disposition"] = "attachment; filename*=UTF-8''%s.%s" % (quote(file_name.encode('utf-8')), + book_format) + return helper.do_download_file(book, book_format, data, headers) + else: + abort(404) + + +@app.route("/download///") +@login_required_if_no_ano +@download_required +def get_download_link_ext(book_id, book_format, anyname): + return get_download_link(book_id, book_format) + + +@app.route('/register', methods=['GET', 'POST']) +def register(): + if not config.config_public_reg: + abort(404) + if current_user is not None and current_user.is_authenticated: + return redirect(url_for('index')) + + if request.method == "POST": + to_save = request.form.to_dict() + if not to_save["nickname"] or not to_save["email"]: + flash(_(u"Please fill out all fields!"), category="error") + return render_title_template('register.html', title=_(u"register"), page="register") + + existing_user = ub.session.query(ub.User).filter(func.lower(ub.User.nickname) == to_save["nickname"].lower()).first() + existing_email = ub.session.query(ub.User).filter(ub.User.email == to_save["email"].lower()).first() + if not existing_user and not existing_email: + content = ub.User() + # content.password = generate_password_hash(to_save["password"]) + if check_valid_domain(to_save["email"]): + content.nickname = to_save["nickname"] + content.email = to_save["email"] + password = helper.generate_random_password() + content.password = generate_password_hash(password) + content.role = config.config_default_role + content.sidebar_view = config.config_default_show + try: + ub.session.add(content) + ub.session.commit() + helper.send_registration_mail(to_save["email"],to_save["nickname"], password) + except Exception: + ub.session.rollback() + flash(_(u"An unknown error occurred. Please try again later."), category="error") + return render_title_template('register.html', title=_(u"register"), page="register") + else: + flash(_(u"Your e-mail is not allowed to register"), category="error") + app.logger.info('Registering failed for user "' + to_save['nickname'] + '" e-mail adress: ' + to_save["email"]) + return render_title_template('register.html', title=_(u"register"), page="register") + flash(_(u"Confirmation e-mail was send to your e-mail account."), category="success") + return redirect(url_for('login')) + else: + flash(_(u"This username or e-mail address is already in use."), category="error") + return render_title_template('register.html', title=_(u"register"), page="register") + + return render_title_template('register.html', title=_(u"register"), page="register") + + +@app.route('/login', methods=['GET', 'POST']) +def login(): + if not config.db_configured: + return redirect(url_for('basic_configuration')) + if current_user is not None and current_user.is_authenticated: + return redirect(url_for('index')) + if request.method == "POST": + form = request.form.to_dict() + user = ub.session.query(ub.User).filter(func.lower(ub.User.nickname) == form['username'].strip().lower()).first() + if user and check_password_hash(user.password, form['password']) and user.nickname is not "Guest": + login_user(user, remember=True) + flash(_(u"you are now logged in as: '%(nickname)s'", nickname=user.nickname), category="success") + return redirect_back(url_for("index")) + else: + ipAdress = request.headers.get('X-Forwarded-For', request.remote_addr) + app.logger.info('Login failed for user "' + form['username'] + '" IP-adress: ' + ipAdress) + flash(_(u"Wrong Username or Password"), category="error") + + # next_url = request.args.get('next') + # if next_url is None or not is_safe_url(next_url): + next_url = url_for('index') + + return render_title_template('login.html', title=_(u"login"), next_url=next_url, + remote_login=config.config_remote_login, page="login") + + +@app.route('/logout') +@login_required +def logout(): + if current_user is not None and current_user.is_authenticated: + logout_user() + return redirect(url_for('login')) + + +@app.route('/remote/login') +@remote_login_required +def remote_login(): + auth_token = ub.RemoteAuthToken() + ub.session.add(auth_token) + ub.session.commit() + + verify_url = url_for('verify_token', token=auth_token.auth_token, _external=true) + + return render_title_template('remote_login.html', title=_(u"login"), token=auth_token.auth_token, + verify_url=verify_url, page="remotelogin") + + +@app.route('/verify/') +@remote_login_required +@login_required +def verify_token(token): + auth_token = ub.session.query(ub.RemoteAuthToken).filter(ub.RemoteAuthToken.auth_token == token).first() + + # Token not found + if auth_token is None: + flash(_(u"Token not found"), category="error") + return redirect(url_for('index')) + + # Token expired + if datetime.datetime.now() > auth_token.expiration: + ub.session.delete(auth_token) + ub.session.commit() + + flash(_(u"Token has expired"), category="error") + return redirect(url_for('index')) + + # Update token with user information + auth_token.user_id = current_user.id + auth_token.verified = True + ub.session.commit() + + flash(_(u"Success! Please return to your device"), category="success") + return redirect(url_for('index')) + + +@app.route('/ajax/verify_token', methods=['POST']) +@remote_login_required +def token_verified(): + token = request.form['token'] + auth_token = ub.session.query(ub.RemoteAuthToken).filter(ub.RemoteAuthToken.auth_token == token).first() + + data = {} + + # Token not found + if auth_token is None: + data['status'] = 'error' + data['message'] = _(u"Token not found") + + # Token expired + elif datetime.datetime.now() > auth_token.expiration: + ub.session.delete(auth_token) + ub.session.commit() + + data['status'] = 'error' + data['message'] = _(u"Token has expired") + + elif not auth_token.verified: + data['status'] = 'not_verified' + + else: + user = ub.session.query(ub.User).filter(ub.User.id == auth_token.user_id).first() + login_user(user) + + ub.session.delete(auth_token) + ub.session.commit() + + data['status'] = 'success' + flash(_(u"you are now logged in as: '%(nickname)s'", nickname=user.nickname), category="success") + + response = make_response(json.dumps(data, ensure_ascii=False)) + response.headers["Content-Type"] = "application/json; charset=utf-8" + + return response + + +@app.route('/send///') +@login_required +@download_required +def send_to_kindle(book_id, book_format, convert): + settings = ub.get_mail_settings() + if settings.get("mail_server", "mail.example.com") == "mail.example.com": + flash(_(u"Please configure the SMTP mail settings first..."), category="error") + elif current_user.kindle_mail: + result = helper.send_mail(book_id, book_format, convert, current_user.kindle_mail, config.config_calibre_dir, + current_user.nickname) + if result is None: + flash(_(u"Book successfully queued for sending to %(kindlemail)s", kindlemail=current_user.kindle_mail), + category="success") + ub.update_download(book_id, int(current_user.id)) + else: + flash(_(u"There was an error sending this book: %(res)s", res=result), category="error") + else: + flash(_(u"Please configure your kindle e-mail address first..."), category="error") + return redirect(request.environ["HTTP_REFERER"]) + + +@app.route("/shelf/add//") +@login_required +def add_to_shelf(shelf_id, book_id): + shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first() + if shelf is None: + app.logger.info("Invalid shelf specified") + if not request.is_xhr: + flash(_(u"Invalid shelf specified"), category="error") + return redirect(url_for('index')) + return "Invalid shelf specified", 400 + + if not shelf.is_public and not shelf.user_id == int(current_user.id): + app.logger.info("Sorry you are not allowed to add a book to the the shelf: %s" % shelf.name) + if not request.is_xhr: + flash(_(u"Sorry you are not allowed to add a book to the the shelf: %(shelfname)s", shelfname=shelf.name), + category="error") + return redirect(url_for('index')) + return "Sorry you are not allowed to add a book to the the shelf: %s" % shelf.name, 403 + + if shelf.is_public and not current_user.role_edit_shelfs(): + app.logger.info("User is not allowed to edit public shelves") + if not request.is_xhr: + flash(_(u"You are not allowed to edit public shelves"), category="error") + return redirect(url_for('index')) + return "User is not allowed to edit public shelves", 403 + + book_in_shelf = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id, + ub.BookShelf.book_id == book_id).first() + if book_in_shelf: + app.logger.info("Book is already part of the shelf: %s" % shelf.name) + if not request.is_xhr: + flash(_(u"Book is already part of the shelf: %(shelfname)s", shelfname=shelf.name), category="error") + return redirect(url_for('index')) + return "Book is already part of the shelf: %s" % shelf.name, 400 + + maxOrder = ub.session.query(func.max(ub.BookShelf.order)).filter(ub.BookShelf.shelf == shelf_id).first() + if maxOrder[0] is None: + maxOrder = 0 + else: + maxOrder = maxOrder[0] + + ins = ub.BookShelf(shelf=shelf.id, book_id=book_id, order=maxOrder + 1) + ub.session.add(ins) + ub.session.commit() + if not request.is_xhr: + flash(_(u"Book has been added to shelf: %(sname)s", sname=shelf.name), category="success") + if "HTTP_REFERER" in request.environ: + return redirect(request.environ["HTTP_REFERER"]) + else: + return redirect(url_for('index')) + return "", 204 + + +@app.route("/shelf/massadd/") +@login_required +def search_to_shelf(shelf_id): + shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first() + if shelf is None: + app.logger.info("Invalid shelf specified") + flash(_(u"Invalid shelf specified"), category="error") + return redirect(url_for('index')) + + if not shelf.is_public and not shelf.user_id == int(current_user.id): + app.logger.info("You are not allowed to add a book to the the shelf: %s" % shelf.name) + flash(_(u"You are not allowed to add a book to the the shelf: %(name)s", name=shelf.name), category="error") + return redirect(url_for('index')) + + if shelf.is_public and not current_user.role_edit_shelfs(): + app.logger.info("User is not allowed to edit public shelves") + flash(_(u"User is not allowed to edit public shelves"), category="error") + return redirect(url_for('index')) + + if current_user.id in ub.searched_ids and ub.searched_ids[current_user.id]: + books_for_shelf = list() + books_in_shelf = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id).all() + if books_in_shelf: + book_ids = list() + for book_id in books_in_shelf: + book_ids.append(book_id.book_id) + for id in ub.searched_ids[current_user.id]: + if id not in book_ids: + books_for_shelf.append(id) + else: + books_for_shelf = ub.searched_ids[current_user.id] + + if not books_for_shelf: + app.logger.info("Books are already part of the shelf: %s" % shelf.name) + flash(_(u"Books are already part of the shelf: %(name)s", name=shelf.name), category="error") + return redirect(url_for('index')) + + maxOrder = ub.session.query(func.max(ub.BookShelf.order)).filter(ub.BookShelf.shelf == shelf_id).first() + if maxOrder[0] is None: + maxOrder = 0 + else: + maxOrder = maxOrder[0] + + for book in books_for_shelf: + maxOrder = maxOrder + 1 + ins = ub.BookShelf(shelf=shelf.id, book_id=book, order=maxOrder) + ub.session.add(ins) + ub.session.commit() + flash(_(u"Books have been added to shelf: %(sname)s", sname=shelf.name), category="success") + else: + flash(_(u"Could not add books to shelf: %(sname)s", sname=shelf.name), category="error") + return redirect(url_for('index')) + + +@app.route("/shelf/remove//") +@login_required +def remove_from_shelf(shelf_id, book_id): + shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first() + if shelf is None: + app.logger.info("Invalid shelf specified") + if not request.is_xhr: + return redirect(url_for('index')) + return "Invalid shelf specified", 400 + + # if shelf is public and use is allowed to edit shelfs, or if shelf is private and user is owner + # allow editing shelfs + # result shelf public user allowed user owner + # false 1 0 x + # true 1 1 x + # true 0 x 1 + # false 0 x 0 + + if (not shelf.is_public and shelf.user_id == int(current_user.id)) \ + or (shelf.is_public and current_user.role_edit_shelfs()): + book_shelf = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id, + ub.BookShelf.book_id == book_id).first() + + if book_shelf is None: + app.logger.info("Book already removed from shelf") + if not request.is_xhr: + return redirect(url_for('index')) + return "Book already removed from shelf", 410 + + ub.session.delete(book_shelf) + ub.session.commit() + + if not request.is_xhr: + flash(_(u"Book has been removed from shelf: %(sname)s", sname=shelf.name), category="success") + return redirect(request.environ["HTTP_REFERER"]) + return "", 204 + else: + app.logger.info("Sorry you are not allowed to remove a book from this shelf: %s" % shelf.name) + if not request.is_xhr: + flash(_(u"Sorry you are not allowed to remove a book from this shelf: %(sname)s", sname=shelf.name), + category="error") + return redirect(url_for('index')) + return "Sorry you are not allowed to remove a book from this shelf: %s" % shelf.name, 403 + + + +@app.route("/shelf/create", methods=["GET", "POST"]) +@login_required +def create_shelf(): + shelf = ub.Shelf() + if request.method == "POST": + to_save = request.form.to_dict() + if "is_public" in to_save: + shelf.is_public = 1 + shelf.name = to_save["title"] + shelf.user_id = int(current_user.id) + existing_shelf = ub.session.query(ub.Shelf).filter( + or_((ub.Shelf.name == to_save["title"]) & (ub.Shelf.is_public == 1), + (ub.Shelf.name == to_save["title"]) & (ub.Shelf.user_id == int(current_user.id)))).first() + if existing_shelf: + flash(_(u"A shelf with the name '%(title)s' already exists.", title=to_save["title"]), category="error") + else: + try: + ub.session.add(shelf) + ub.session.commit() + flash(_(u"Shelf %(title)s created", title=to_save["title"]), category="success") + except Exception: + flash(_(u"There was an error"), category="error") + return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"create a shelf"), page="shelfcreate") + else: + return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"create a shelf"), page="shelfcreate") + + +@app.route("/shelf/edit/", methods=["GET", "POST"]) +@login_required +def edit_shelf(shelf_id): + shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first() + if request.method == "POST": + to_save = request.form.to_dict() + existing_shelf = ub.session.query(ub.Shelf).filter( + or_((ub.Shelf.name == to_save["title"]) & (ub.Shelf.is_public == 1), + (ub.Shelf.name == to_save["title"]) & (ub.Shelf.user_id == int(current_user.id)))).filter( + ub.Shelf.id != shelf_id).first() + if existing_shelf: + flash(_(u"A shelf with the name '%(title)s' already exists.", title=to_save["title"]), category="error") + else: + shelf.name = to_save["title"] + if "is_public" in to_save: + shelf.is_public = 1 + else: + shelf.is_public = 0 + try: + ub.session.commit() + flash(_(u"Shelf %(title)s changed", title=to_save["title"]), category="success") + except Exception: + flash(_(u"There was an error"), category="error") + return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Edit a shelf"), page="shelfedit") + else: + return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Edit a shelf"), page="shelfedit") + + +@app.route("/shelf/delete/") +@login_required +def delete_shelf(shelf_id): + cur_shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).first() + deleted = None + if current_user.role_admin(): + deleted = ub.session.query(ub.Shelf).filter(ub.Shelf.id == shelf_id).delete() + else: + if (not cur_shelf.is_public and cur_shelf.user_id == int(current_user.id)) \ + or (cur_shelf.is_public and current_user.role_edit_shelfs()): + deleted = ub.session.query(ub.Shelf).filter(ub.or_(ub.and_(ub.Shelf.user_id == int(current_user.id), + ub.Shelf.id == shelf_id), + ub.and_(ub.Shelf.is_public == 1, + ub.Shelf.id == shelf_id))).delete() + + if deleted: + ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id).delete() + ub.session.commit() + app.logger.info(_(u"successfully deleted shelf %(name)s", name=cur_shelf.name, category="success")) + return redirect(url_for('index')) + + +@app.route("/shelf/") +@login_required_if_no_ano +def show_shelf(shelf_id): + if current_user.is_anonymous: + shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.is_public == 1, ub.Shelf.id == shelf_id).first() + else: + shelf = ub.session.query(ub.Shelf).filter(ub.or_(ub.and_(ub.Shelf.user_id == int(current_user.id), + ub.Shelf.id == shelf_id), + ub.and_(ub.Shelf.is_public == 1, + ub.Shelf.id == shelf_id))).first() + result = list() + # user is allowed to access shelf + if shelf: + books_in_shelf = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id).order_by( + ub.BookShelf.order.asc()).all() + for book in books_in_shelf: + cur_book = db.session.query(db.Books).filter(db.Books.id == book.book_id).first() + if cur_book: + result.append(cur_book) + else: + app.logger.info('Not existing book %s in shelf %s deleted' % (book.book_id, shelf.id)) + ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == book.book_id).delete() + ub.session.commit() + return render_title_template('shelf.html', entries=result, title=_(u"Shelf: '%(name)s'", name=shelf.name), + shelf=shelf, page="shelf") + else: + flash(_(u"Error opening shelf. Shelf does not exist or is not accessible"), category="error") + return redirect(url_for("index")) + + +@app.route("/shelf/order/", methods=["GET", "POST"]) +@login_required +def order_shelf(shelf_id): + if request.method == "POST": + to_save = request.form.to_dict() + books_in_shelf = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id).order_by( + ub.BookShelf.order.asc()).all() + counter = 0 + for book in books_in_shelf: + setattr(book, 'order', to_save[str(book.book_id)]) + counter += 1 + ub.session.commit() + if current_user.is_anonymous: + shelf = ub.session.query(ub.Shelf).filter(ub.Shelf.is_public == 1, ub.Shelf.id == shelf_id).first() + else: + shelf = ub.session.query(ub.Shelf).filter(ub.or_(ub.and_(ub.Shelf.user_id == int(current_user.id), + ub.Shelf.id == shelf_id), + ub.and_(ub.Shelf.is_public == 1, + ub.Shelf.id == shelf_id))).first() + result = list() + if shelf: + books_in_shelf2 = ub.session.query(ub.BookShelf).filter(ub.BookShelf.shelf == shelf_id) \ + .order_by(ub.BookShelf.order.asc()).all() + for book in books_in_shelf2: + cur_book = db.session.query(db.Books).filter(db.Books.id == book.book_id).first() + result.append(cur_book) + return render_title_template('shelf_order.html', entries=result, + title=_(u"Change order of Shelf: '%(name)s'", name=shelf.name), + shelf=shelf, page="shelforder") + + +@app.route("/me", methods=["GET", "POST"]) +@login_required +def profile(): + content = ub.session.query(ub.User).filter(ub.User.id == int(current_user.id)).first() + downloads = list() + languages = speaking_language() + translations = babel.list_translations() + [LC('en')] + for book in content.downloads: + downloadBook = db.session.query(db.Books).filter(db.Books.id == book.book_id).first() + if downloadBook: + downloads.append(db.session.query(db.Books).filter(db.Books.id == book.book_id).first()) + else: + ub.delete_download(book.book_id) + # ub.session.query(ub.Downloads).filter(book.book_id == ub.Downloads.book_id).delete() + # ub.session.commit() + if request.method == "POST": + to_save = request.form.to_dict() + content.random_books = 0 + if current_user.role_passwd() or current_user.role_admin(): + if "password" in to_save and to_save["password"]: + content.password = generate_password_hash(to_save["password"]) + if "kindle_mail" in to_save and to_save["kindle_mail"] != content.kindle_mail: + content.kindle_mail = to_save["kindle_mail"] + if to_save["email"] and to_save["email"] != content.email: + if config.config_public_reg and not check_valid_domain(to_save["email"]): + flash(_(u"E-mail is not from valid domain"), category="error") + return render_title_template("user_edit.html", content=content, downloads=downloads, + title=_(u"%(name)s's profile", name=current_user.nickname)) + content.email = to_save["email"] + if "show_random" in to_save and to_save["show_random"] == "on": + content.random_books = 1 + if "default_language" in to_save: + content.default_language = to_save["default_language"] + if "locale" in to_save: + content.locale = to_save["locale"] + content.sidebar_view = 0 + if "show_random" in to_save: + content.sidebar_view += ub.SIDEBAR_RANDOM + if "show_language" in to_save: + content.sidebar_view += ub.SIDEBAR_LANGUAGE + if "show_series" in to_save: + content.sidebar_view += ub.SIDEBAR_SERIES + if "show_category" in to_save: + content.sidebar_view += ub.SIDEBAR_CATEGORY + if "show_recent" in to_save: + content.sidebar_view += ub.SIDEBAR_RECENT + if "show_sorted" in to_save: + content.sidebar_view += ub.SIDEBAR_SORTED + if "show_hot" in to_save: + content.sidebar_view += ub.SIDEBAR_HOT + if "show_best_rated" in to_save: + content.sidebar_view += ub.SIDEBAR_BEST_RATED + if "show_author" in to_save: + content.sidebar_view += ub.SIDEBAR_AUTHOR + if "show_publisher" in to_save: + content.sidebar_view += ub.SIDEBAR_PUBLISHER + if "show_read_and_unread" in to_save: + content.sidebar_view += ub.SIDEBAR_READ_AND_UNREAD + if "show_detail_random" in to_save: + content.sidebar_view += ub.DETAIL_RANDOM + + content.mature_content = "show_mature_content" in to_save + content.theme = int(to_save["theme"]) + + try: + ub.session.commit() + except IntegrityError: + ub.session.rollback() + flash(_(u"Found an existing account for this e-mail address."), category="error") + return render_title_template("user_edit.html", content=content, downloads=downloads, + title=_(u"%(name)s's profile", name=current_user.nickname)) + flash(_(u"Profile updated"), category="success") + return render_title_template("user_edit.html", translations=translations, profile=1, languages=languages, + content=content, downloads=downloads, title=_(u"%(name)s's profile", + name=current_user.nickname), page="me") + + +@app.route("/admin/view") +@login_required +@admin_required +def admin(): + version = helper.get_current_version_info() + if version is False: + commit = _(u'Unknown') + else: + commit = version['datetime'] + + tz = datetime.timedelta(seconds=time.timezone if (time.localtime().tm_isdst == 0) else time.altzone) + form_date = datetime.datetime.strptime(commit[:19], "%Y-%m-%dT%H:%M:%S") + if len(commit) > 19: # check if string has timezone + if commit[19] == '+': + form_date -= datetime.timedelta(hours=int(commit[20:22]), minutes=int(commit[23:])) + elif commit[19] == '-': + form_date += datetime.timedelta(hours=int(commit[20:22]), minutes=int(commit[23:])) + commit = format_datetime(form_date - tz, format='short', locale=get_locale()) + + content = ub.session.query(ub.User).all() + settings = ub.session.query(ub.Settings).first() + return render_title_template("admin.html", content=content, email=settings, config=config, commit=commit, + title=_(u"Admin page"), page="admin") + + +@app.route("/admin/config", methods=["GET", "POST"]) +@login_required +@admin_required +def configuration(): + return configuration_helper(0) + + +@app.route("/admin/viewconfig", methods=["GET", "POST"]) +@login_required +@admin_required +def view_configuration(): + reboot_required = False + if request.method == "POST": + to_save = request.form.to_dict() + content = ub.session.query(ub.Settings).first() + if "config_calibre_web_title" in to_save: + content.config_calibre_web_title = to_save["config_calibre_web_title"] + if "config_columns_to_ignore" in to_save: + content.config_columns_to_ignore = to_save["config_columns_to_ignore"] + if "config_read_column" in to_save: + content.config_read_column = int(to_save["config_read_column"]) + if "config_title_regex" in to_save: + if content.config_title_regex != to_save["config_title_regex"]: + content.config_title_regex = to_save["config_title_regex"] + reboot_required = True + if "config_random_books" in to_save: + content.config_random_books = int(to_save["config_random_books"]) + if "config_books_per_page" in to_save: + content.config_books_per_page = int(to_save["config_books_per_page"]) + # Mature Content configuration + if "config_mature_content_tags" in to_save: + content.config_mature_content_tags = to_save["config_mature_content_tags"].strip() + + # Default user configuration + content.config_default_role = 0 + if "admin_role" in to_save: + content.config_default_role = content.config_default_role + ub.ROLE_ADMIN + if "download_role" in to_save: + content.config_default_role = content.config_default_role + ub.ROLE_DOWNLOAD + if "upload_role" in to_save: + content.config_default_role = content.config_default_role + ub.ROLE_UPLOAD + if "edit_role" in to_save: + content.config_default_role = content.config_default_role + ub.ROLE_EDIT + if "delete_role" in to_save: + content.config_default_role = content.config_default_role + ub.ROLE_DELETE_BOOKS + if "passwd_role" in to_save: + content.config_default_role = content.config_default_role + ub.ROLE_PASSWD + if "passwd_role" in to_save: + content.config_default_role = content.config_default_role + ub.ROLE_EDIT_SHELFS + content.config_default_show = 0 + if "show_detail_random" in to_save: + content.config_default_show = content.config_default_show + ub.DETAIL_RANDOM + if "show_language" in to_save: + content.config_default_show = content.config_default_show + ub.SIDEBAR_LANGUAGE + if "show_series" in to_save: + content.config_default_show = content.config_default_show + ub.SIDEBAR_SERIES + if "show_category" in to_save: + content.config_default_show = content.config_default_show + ub.SIDEBAR_CATEGORY + if "show_hot" in to_save: + content.config_default_show = content.config_default_show + ub.SIDEBAR_HOT + if "show_random" in to_save: + content.config_default_show = content.config_default_show + ub.SIDEBAR_RANDOM + if "show_author" in to_save: + content.config_default_show = content.config_default_show + ub.SIDEBAR_AUTHOR + if "show_publisher" in to_save: + content.config_default_show = content.config_default_show + ub.SIDEBAR_PUBLISHER + if "show_best_rated" in to_save: + content.config_default_show = content.config_default_show + ub.SIDEBAR_BEST_RATED + if "show_read_and_unread" in to_save: + content.config_default_show = content.config_default_show + ub.SIDEBAR_READ_AND_UNREAD + if "show_recent" in to_save: + content.config_default_show = content.config_default_show + ub.SIDEBAR_RECENT + if "show_sorted" in to_save: + content.config_default_show = content.config_default_show + ub.SIDEBAR_SORTED + if "show_mature_content" in to_save: + content.config_default_show = content.config_default_show + ub.MATURE_CONTENT + ub.session.commit() + flash(_(u"Calibre-Web configuration updated"), category="success") + config.loadSettings() + if reboot_required: + # db.engine.dispose() # ToDo verify correct + # ub.session.close() + # ub.engine.dispose() + # stop Server + server.Server.setRestartTyp(True) + server.Server.stopServer() + app.logger.info('Reboot required, restarting') + readColumn = db.session.query(db.Custom_Columns)\ + .filter(db.and_(db.Custom_Columns.datatype == 'bool',db.Custom_Columns.mark_for_delete == 0)).all() + return render_title_template("config_view_edit.html", content=config, readColumns=readColumn, + title=_(u"UI Configuration"), page="uiconfig") + + + +@app.route("/config", methods=["GET", "POST"]) +@unconfigured +def basic_configuration(): + logout_user() + return configuration_helper(1) + + +def configuration_helper(origin): + reboot_required = False + gdriveError=None + db_change = False + success = False + filedata = None + if gdriveutils.gdrive_support == False: + gdriveError = _('Import of optional Google Drive requirements missing') + else: + if not os.path.isfile(os.path.join(config.get_main_dir,'client_secrets.json')): + gdriveError = _('client_secrets.json is missing or not readable') + else: + with open(os.path.join(config.get_main_dir,'client_secrets.json'), 'r') as settings: + filedata=json.load(settings) + if not 'web' in filedata: + gdriveError = _('client_secrets.json is not configured for web application') + if request.method == "POST": + to_save = request.form.to_dict() + content = ub.session.query(ub.Settings).first() # type: ub.Settings + if "config_calibre_dir" in to_save: + if content.config_calibre_dir != to_save["config_calibre_dir"]: + content.config_calibre_dir = to_save["config_calibre_dir"] + db_change = True + # Google drive setup + if "config_use_google_drive" in to_save and not content.config_use_google_drive and not gdriveError: + if filedata: + if filedata['web']['redirect_uris'][0].endswith('/'): + filedata['web']['redirect_uris'][0] = filedata['web']['redirect_uris'][0][:-1] + with open(os.path.join(config.get_main_dir,'settings.yaml'), 'w') as f: + yaml = "client_config_backend: settings\nclient_config_file: %(client_file)s\n" \ + "client_config:\n" \ + " client_id: %(client_id)s\n client_secret: %(client_secret)s\n" \ + " redirect_uri: %(redirect_uri)s\n\nsave_credentials: True\n" \ + "save_credentials_backend: file\nsave_credentials_file: %(credential)s\n\n" \ + "get_refresh_token: True\n\noauth_scope:\n" \ + " - https://www.googleapis.com/auth/drive\n" + f.write(yaml % {'client_file': os.path.join(config.get_main_dir,'client_secrets.json'), + 'client_id': filedata['web']['client_id'], + 'client_secret': filedata['web']['client_secret'], + 'redirect_uri': filedata['web']['redirect_uris'][0], + 'credential': os.path.join(config.get_main_dir,'gdrive_credentials')}) + else: + flash(_(u'client_secrets.json is not configured for web application'), category="error") + return render_title_template("config_edit.html", content=config, origin=origin, + gdrive=gdriveutils.gdrive_support, gdriveError=gdriveError, + goodreads=goodreads_support, title=_(u"Basic Configuration"), + page="config") + # always show google drive settings, but in case of error deny support + if "config_use_google_drive" in to_save and not gdriveError: + content.config_use_google_drive = "config_use_google_drive" in to_save + else: + content.config_use_google_drive = 0 + if "config_google_drive_folder" in to_save: + if content.config_google_drive_folder != to_save["config_google_drive_folder"]: + content.config_google_drive_folder = to_save["config_google_drive_folder"] + gdriveutils.deleteDatabaseOnChange() + + if "config_port" in to_save: + if content.config_port != int(to_save["config_port"]): + content.config_port = int(to_save["config_port"]) + reboot_required = True + if "config_keyfile" in to_save: + if content.config_keyfile != to_save["config_keyfile"]: + if os.path.isfile(to_save["config_keyfile"]) or to_save["config_keyfile"] is u"": + content.config_keyfile = to_save["config_keyfile"] + reboot_required = True + else: + ub.session.commit() + flash(_(u'Keyfile location is not valid, please enter correct path'), category="error") + return render_title_template("config_edit.html", content=config, origin=origin, + gdrive=gdriveutils.gdrive_support, gdriveError=gdriveError, + goodreads=goodreads_support, title=_(u"Basic Configuration"), + page="config") + if "config_certfile" in to_save: + if content.config_certfile != to_save["config_certfile"]: + if os.path.isfile(to_save["config_certfile"]) or to_save["config_certfile"] is u"": + content.config_certfile = to_save["config_certfile"] + reboot_required = True + else: + ub.session.commit() + flash(_(u'Certfile location is not valid, please enter correct path'), category="error") + return render_title_template("config_edit.html", content=config, origin=origin, + gdrive=gdriveutils.gdrive_support, gdriveError=gdriveError, + goodreads=goodreads_support, title=_(u"Basic Configuration"), + page="config") + content.config_uploading = 0 + content.config_anonbrowse = 0 + content.config_public_reg = 0 + if "config_uploading" in to_save and to_save["config_uploading"] == "on": + content.config_uploading = 1 + if "config_anonbrowse" in to_save and to_save["config_anonbrowse"] == "on": + content.config_anonbrowse = 1 + if "config_public_reg" in to_save and to_save["config_public_reg"] == "on": + content.config_public_reg = 1 + + if "config_converterpath" in to_save: + content.config_converterpath = to_save["config_converterpath"].strip() + if "config_calibre" in to_save: + content.config_calibre = to_save["config_calibre"].strip() + if "config_ebookconverter" in to_save: + content.config_ebookconverter = int(to_save["config_ebookconverter"]) + + # Remote login configuration + content.config_remote_login = ("config_remote_login" in to_save and to_save["config_remote_login"] == "on") + if not content.config_remote_login: + ub.session.query(ub.RemoteAuthToken).delete() + + # Goodreads configuration + content.config_use_goodreads = ("config_use_goodreads" in to_save and to_save["config_use_goodreads"] == "on") + if "config_goodreads_api_key" in to_save: + content.config_goodreads_api_key = to_save["config_goodreads_api_key"] + if "config_goodreads_api_secret" in to_save: + content.config_goodreads_api_secret = to_save["config_goodreads_api_secret"] + if "config_log_level" in to_save: + content.config_log_level = int(to_save["config_log_level"]) + if content.config_logfile != to_save["config_logfile"]: + # check valid path, only path or file + if os.path.dirname(to_save["config_logfile"]): + if os.path.exists(os.path.dirname(to_save["config_logfile"])) and \ + os.path.basename(to_save["config_logfile"]) and not os.path.isdir(to_save["config_logfile"]): + content.config_logfile = to_save["config_logfile"] + else: + ub.session.commit() + flash(_(u'Logfile location is not valid, please enter correct path'), category="error") + return render_title_template("config_edit.html", content=config, origin=origin, + gdrive=gdriveutils.gdrive_support, gdriveError=gdriveError, + goodreads=goodreads_support, title=_(u"Basic Configuration"), + page="config") + else: + content.config_logfile = to_save["config_logfile"] + reboot_required = True + + # Rarfile Content configuration + if "config_rarfile_location" in to_save and to_save['config_rarfile_location'] is not u"": + check = helper.check_unrar(to_save["config_rarfile_location"].strip()) + if not check[0] : + content.config_rarfile_location = to_save["config_rarfile_location"].strip() + else: + flash(check[1], category="error") + return render_title_template("config_edit.html", content=config, origin=origin, + gdrive=gdriveutils.gdrive_support, goodreads=goodreads_support, + rarfile_support=rar_support, title=_(u"Basic Configuration")) + try: + if content.config_use_google_drive and is_gdrive_ready() and not os.path.exists(config.config_calibre_dir + "/metadata.db"): + gdriveutils.downloadFile(None, "metadata.db", config.config_calibre_dir + "/metadata.db") + if db_change: + if config.db_configured: + db.session.close() + db.engine.dispose() + ub.session.commit() + flash(_(u"Calibre-Web configuration updated"), category="success") + config.loadSettings() + app.logger.setLevel(config.config_log_level) + logging.getLogger("book_formats").setLevel(config.config_log_level) + except Exception as e: + flash(e, category="error") + return render_title_template("config_edit.html", content=config, origin=origin, + gdrive=gdriveutils.gdrive_support, gdriveError=gdriveError, + goodreads=goodreads_support, rarfile_support=rar_support, + title=_(u"Basic Configuration"), page="config") + if db_change: + reload(db) + if not db.setup_db(): + flash(_(u'DB location is not valid, please enter correct path'), category="error") + return render_title_template("config_edit.html", content=config, origin=origin, + gdrive=gdriveutils.gdrive_support,gdriveError=gdriveError, + goodreads=goodreads_support, rarfile_support=rar_support, + title=_(u"Basic Configuration"), page="config") + if reboot_required: + # stop Server + server.Server.setRestartTyp(True) + server.Server.stopServer() + app.logger.info('Reboot required, restarting') + if origin: + success = True + if is_gdrive_ready() and gdriveutils.gdrive_support == True and config.config_use_google_drive == True: + gdrivefolders=gdriveutils.listRootFolders() + else: + gdrivefolders=list() + return render_title_template("config_edit.html", origin=origin, success=success, content=config, + show_authenticate_google_drive=not is_gdrive_ready(), + gdrive=gdriveutils.gdrive_support, gdriveError=gdriveError, + gdrivefolders=gdrivefolders, rarfile_support=rar_support, + goodreads=goodreads_support, title=_(u"Basic Configuration"), page="config") + + +@app.route("/admin/user/new", methods=["GET", "POST"]) +@login_required +@admin_required +def new_user(): + content = ub.User() + languages = speaking_language() + translations = [LC('en')] + babel.list_translations() + if request.method == "POST": + to_save = request.form.to_dict() + content.default_language = to_save["default_language"] + content.mature_content = "show_mature_content" in to_save + content.theme = int(to_save["theme"]) + if "locale" in to_save: + content.locale = to_save["locale"] + content.sidebar_view = 0 + if "show_random" in to_save: + content.sidebar_view += ub.SIDEBAR_RANDOM + if "show_language" in to_save: + content.sidebar_view += ub.SIDEBAR_LANGUAGE + if "show_series" in to_save: + content.sidebar_view += ub.SIDEBAR_SERIES + if "show_category" in to_save: + content.sidebar_view += ub.SIDEBAR_CATEGORY + if "show_hot" in to_save: + content.sidebar_view += ub.SIDEBAR_HOT + if "show_read_and_unread" in to_save: + content.sidebar_view += ub.SIDEBAR_READ_AND_UNREAD + if "show_best_rated" in to_save: + content.sidebar_view += ub.SIDEBAR_BEST_RATED + if "show_author" in to_save: + content.sidebar_view += ub.SIDEBAR_AUTHOR + if "show_publisher" in to_save: + content.sidebar_view += ub.SIDEBAR_PUBLISHER + if "show_detail_random" in to_save: + content.sidebar_view += ub.DETAIL_RANDOM + if "show_sorted" in to_save: + content.sidebar_view += ub.SIDEBAR_SORTED + if "show_recent" in to_save: + content.sidebar_view += ub.SIDEBAR_RECENT + + content.role = 0 + if "admin_role" in to_save: + content.role = content.role + ub.ROLE_ADMIN + if "download_role" in to_save: + content.role = content.role + ub.ROLE_DOWNLOAD + if "upload_role" in to_save: + content.role = content.role + ub.ROLE_UPLOAD + if "edit_role" in to_save: + content.role = content.role + ub.ROLE_DELETE_BOOKS + if "delete_role" in to_save: + content.role = content.role + ub.ROLE_EDIT + if "passwd_role" in to_save: + content.role = content.role + ub.ROLE_PASSWD + if "edit_shelf_role" in to_save: + content.role = content.role + ub.ROLE_EDIT_SHELFS + if not to_save["nickname"] or not to_save["email"] or not to_save["password"]: + flash(_(u"Please fill out all fields!"), category="error") + return render_title_template("user_edit.html", new_user=1, content=content, translations=translations, + title=_(u"Add new user")) + content.password = generate_password_hash(to_save["password"]) + content.nickname = to_save["nickname"] + if config.config_public_reg and not check_valid_domain(to_save["email"]): + flash(_(u"E-mail is not from valid domain"), category="error") + return render_title_template("user_edit.html", new_user=1, content=content, translations=translations, + title=_(u"Add new user")) + else: + content.email = to_save["email"] + try: + ub.session.add(content) + ub.session.commit() + flash(_(u"User '%(user)s' created", user=content.nickname), category="success") + return redirect(url_for('admin')) + except IntegrityError: + ub.session.rollback() + flash(_(u"Found an existing account for this e-mail address or nickname."), category="error") + else: + content.role = config.config_default_role + content.sidebar_view = config.config_default_show + content.mature_content = bool(config.config_default_show & ub.MATURE_CONTENT) + return render_title_template("user_edit.html", new_user=1, content=content, translations=translations, + languages=languages, title=_(u"Add new user"), page="newuser") + + +@app.route("/admin/mailsettings", methods=["GET", "POST"]) +@login_required +@admin_required +def edit_mailsettings(): + content = ub.session.query(ub.Settings).first() + if request.method == "POST": + to_save = request.form.to_dict() + content.mail_server = to_save["mail_server"] + content.mail_port = int(to_save["mail_port"]) + content.mail_login = to_save["mail_login"] + content.mail_password = to_save["mail_password"] + content.mail_from = to_save["mail_from"] + content.mail_use_ssl = int(to_save["mail_use_ssl"]) + try: + ub.session.commit() + flash(_(u"E-mail server settings updated"), category="success") + except Exception as e: + flash(e, category="error") + if "test" in to_save and to_save["test"]: + if current_user.kindle_mail: + result = helper.send_test_mail(current_user.kindle_mail, current_user.nickname) + if result is None: + flash(_(u"Test e-mail successfully send to %(kindlemail)s", kindlemail=current_user.kindle_mail), + category="success") + else: + flash(_(u"There was an error sending the Test e-mail: %(res)s", res=result), category="error") + else: + flash(_(u"Please configure your kindle e-mail address first..."), category="error") + else: + flash(_(u"E-mail server settings updated"), category="success") + return render_title_template("email_edit.html", content=content, title=_(u"Edit e-mail server settings"), + page="mailset") + + +@app.route("/admin/user/", methods=["GET", "POST"]) +@login_required +@admin_required +def edit_user(user_id): + content = ub.session.query(ub.User).filter(ub.User.id == int(user_id)).first() # type: ub.User + downloads = list() + languages = speaking_language() + translations = babel.list_translations() + [LC('en')] + for book in content.downloads: + downloadbook = db.session.query(db.Books).filter(db.Books.id == book.book_id).first() + if downloadbook: + downloads.append(downloadbook) + else: + ub.delete_download(book.book_id) + # ub.session.query(ub.Downloads).filter(book.book_id == ub.Downloads.book_id).delete() + # ub.session.commit() + if request.method == "POST": + to_save = request.form.to_dict() + if "delete" in to_save: + ub.session.query(ub.User).filter(ub.User.id == content.id).delete() + ub.session.commit() + flash(_(u"User '%(nick)s' deleted", nick=content.nickname), category="success") + return redirect(url_for('admin')) + else: + if "password" in to_save and to_save["password"]: + content.password = generate_password_hash(to_save["password"]) + + if "admin_role" in to_save and not content.role_admin(): + content.role = content.role + ub.ROLE_ADMIN + elif "admin_role" not in to_save and content.role_admin(): + content.role = content.role - ub.ROLE_ADMIN + + if "download_role" in to_save and not content.role_download(): + content.role = content.role + ub.ROLE_DOWNLOAD + elif "download_role" not in to_save and content.role_download(): + content.role = content.role - ub.ROLE_DOWNLOAD + + if "upload_role" in to_save and not content.role_upload(): + content.role = content.role + ub.ROLE_UPLOAD + elif "upload_role" not in to_save and content.role_upload(): + content.role = content.role - ub.ROLE_UPLOAD + + if "edit_role" in to_save and not content.role_edit(): + content.role = content.role + ub.ROLE_EDIT + elif "edit_role" not in to_save and content.role_edit(): + content.role = content.role - ub.ROLE_EDIT + + if "delete_role" in to_save and not content.role_delete_books(): + content.role = content.role + ub.ROLE_DELETE_BOOKS + elif "delete_role" not in to_save and content.role_delete_books(): + content.role = content.role - ub.ROLE_DELETE_BOOKS + + if "passwd_role" in to_save and not content.role_passwd(): + content.role = content.role + ub.ROLE_PASSWD + elif "passwd_role" not in to_save and content.role_passwd(): + content.role = content.role - ub.ROLE_PASSWD + + if "edit_shelf_role" in to_save and not content.role_edit_shelfs(): + content.role = content.role + ub.ROLE_EDIT_SHELFS + elif "edit_shelf_role" not in to_save and content.role_edit_shelfs(): + content.role = content.role - ub.ROLE_EDIT_SHELFS + + if "show_random" in to_save and not content.show_random_books(): + content.sidebar_view += ub.SIDEBAR_RANDOM + elif "show_random" not in to_save and content.show_random_books(): + content.sidebar_view -= ub.SIDEBAR_RANDOM + + if "show_language" in to_save and not content.show_language(): + content.sidebar_view += ub.SIDEBAR_LANGUAGE + elif "show_language" not in to_save and content.show_language(): + content.sidebar_view -= ub.SIDEBAR_LANGUAGE + + if "show_series" in to_save and not content.show_series(): + content.sidebar_view += ub.SIDEBAR_SERIES + elif "show_series" not in to_save and content.show_series(): + content.sidebar_view -= ub.SIDEBAR_SERIES + + if "show_category" in to_save and not content.show_category(): + content.sidebar_view += ub.SIDEBAR_CATEGORY + elif "show_category" not in to_save and content.show_category(): + content.sidebar_view -= ub.SIDEBAR_CATEGORY + + if "show_recent" in to_save and not content.show_recent(): + content.sidebar_view += ub.SIDEBAR_RECENT + elif "show_recent" not in to_save and content.show_recent(): + content.sidebar_view -= ub.SIDEBAR_RECENT + + if "show_sorted" in to_save and not content.show_sorted(): + content.sidebar_view += ub.SIDEBAR_SORTED + elif "show_sorted" not in to_save and content.show_sorted(): + content.sidebar_view -= ub.SIDEBAR_SORTED + + if "show_hot" in to_save and not content.show_hot_books(): + content.sidebar_view += ub.SIDEBAR_HOT + elif "show_hot" not in to_save and content.show_hot_books(): + content.sidebar_view -= ub.SIDEBAR_HOT + + if "show_best_rated" in to_save and not content.show_best_rated_books(): + content.sidebar_view += ub.SIDEBAR_BEST_RATED + elif "show_best_rated" not in to_save and content.show_best_rated_books(): + content.sidebar_view -= ub.SIDEBAR_BEST_RATED + + if "show_read_and_unread" in to_save and not content.show_read_and_unread(): + content.sidebar_view += ub.SIDEBAR_READ_AND_UNREAD + elif "show_read_and_unread" not in to_save and content.show_read_and_unread(): + content.sidebar_view -= ub.SIDEBAR_READ_AND_UNREAD + + if "show_author" in to_save and not content.show_author(): + content.sidebar_view += ub.SIDEBAR_AUTHOR + elif "show_author" not in to_save and content.show_author(): + content.sidebar_view -= ub.SIDEBAR_AUTHOR + + if "show_detail_random" in to_save and not content.show_detail_random(): + content.sidebar_view += ub.DETAIL_RANDOM + elif "show_detail_random" not in to_save and content.show_detail_random(): + content.sidebar_view -= ub.DETAIL_RANDOM + + content.mature_content = "show_mature_content" in to_save + content.theme = int(to_save["theme"]) + + if "default_language" in to_save: + content.default_language = to_save["default_language"] + if "locale" in to_save and to_save["locale"]: + content.locale = to_save["locale"] + if to_save["email"] and to_save["email"] != content.email: + content.email = to_save["email"] + if "kindle_mail" in to_save and to_save["kindle_mail"] != content.kindle_mail: + content.kindle_mail = to_save["kindle_mail"] + try: + ub.session.commit() + flash(_(u"User '%(nick)s' updated", nick=content.nickname), category="success") + except IntegrityError: + ub.session.rollback() + flash(_(u"An unknown error occured."), category="error") + return render_title_template("user_edit.html", translations=translations, languages=languages, new_user=0, + content=content, downloads=downloads, title=_(u"Edit User %(nick)s", + nick=content.nickname), page="edituser") + + +@app.route("/admin/resetpassword/") +@login_required +@admin_required +def reset_password(user_id): + if not config.config_public_reg: + abort(404) + if current_user is not None and current_user.is_authenticated: + existing_user = ub.session.query(ub.User).filter(ub.User.id == user_id).first() + password = helper.generate_random_password() + existing_user.password = generate_password_hash(password) + try: + ub.session.commit() + helper.send_registration_mail(existing_user.email, existing_user.nickname, password, True) + flash(_(u"Password for user %(user)s reset", user=existing_user.nickname), category="success") + except Exception: + ub.session.rollback() + flash(_(u"An unknown error occurred. Please try again later."), category="error") + return redirect(url_for('admin')) + + +def render_edit_book(book_id): + db.session.connection().connection.connection.create_function("title_sort", 1, db.title_sort) + cc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all() + book = db.session.query(db.Books)\ + .filter(db.Books.id == book_id).filter(common_filters()).first() + + if not book: + flash(_(u"Error opening eBook. File does not exist or file is not accessible"), category="error") + return redirect(url_for("index")) + + for indx in range(0, len(book.languages)): + book.languages[indx].language_name = language_table[get_locale()][book.languages[indx].lang_code] + author_names = [] + for authr in book.authors: + author_names.append(authr.name.replace('|', ',')) + + # Option for showing convertbook button + valid_source_formats=list() + if config.config_ebookconverter == 2: + for file in book.data: + if file.format.lower() in EXTENSIONS_CONVERT: + valid_source_formats.append(file.format.lower()) + + # Determine what formats don't already exist + allowed_conversion_formats = EXTENSIONS_CONVERT.copy() + for file in book.data: + try: + allowed_conversion_formats.remove(file.format.lower()) + except Exception: + app.logger.warning(file.format.lower() + ' already removed from list.') + + return render_title_template('book_edit.html', book=book, authors=author_names, cc=cc, + title=_(u"edit metadata"), page="editbook", + conversion_formats=allowed_conversion_formats, + source_formats=valid_source_formats) + + +def edit_cc_data(book_id, book, to_save): + cc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all() + for c in cc: + cc_string = "custom_column_" + str(c.id) + if not c.is_multiple: + if len(getattr(book, cc_string)) > 0: + cc_db_value = getattr(book, cc_string)[0].value + else: + cc_db_value = None + if to_save[cc_string].strip(): + if c.datatype == 'bool': + if to_save[cc_string] == 'None': + to_save[cc_string] = None + else: + to_save[cc_string] = 1 if to_save[cc_string] == 'True' else 0 + if to_save[cc_string] != cc_db_value: + if cc_db_value is not None: + if to_save[cc_string] is not None: + setattr(getattr(book, cc_string)[0], 'value', to_save[cc_string]) + else: + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + db.session.delete(del_cc) + else: + cc_class = db.cc_classes[c.id] + new_cc = cc_class(value=to_save[cc_string], book=book_id) + db.session.add(new_cc) + elif c.datatype == 'int': + if to_save[cc_string] == 'None': + to_save[cc_string] = None + if to_save[cc_string] != cc_db_value: + if cc_db_value is not None: + if to_save[cc_string] is not None: + setattr(getattr(book, cc_string)[0], 'value', to_save[cc_string]) + else: + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + db.session.delete(del_cc) + else: + cc_class = db.cc_classes[c.id] + new_cc = cc_class(value=to_save[cc_string], book=book_id) + db.session.add(new_cc) + + else: + if c.datatype == 'rating': + to_save[cc_string] = str(int(float(to_save[cc_string]) * 2)) + if to_save[cc_string].strip() != cc_db_value: + if cc_db_value is not None: + # remove old cc_val + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + if len(del_cc.books) == 0: + db.session.delete(del_cc) + cc_class = db.cc_classes[c.id] + new_cc = db.session.query(cc_class).filter( + cc_class.value == to_save[cc_string].strip()).first() + # if no cc val is found add it + if new_cc is None: + new_cc = cc_class(value=to_save[cc_string].strip()) + db.session.add(new_cc) + db.session.flush() + new_cc = db.session.query(cc_class).filter( + cc_class.value == to_save[cc_string].strip()).first() + # add cc value to book + getattr(book, cc_string).append(new_cc) + else: + if cc_db_value is not None: + # remove old cc_val + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + if len(del_cc.books) == 0: + db.session.delete(del_cc) + else: + input_tags = to_save[cc_string].split(',') + input_tags = list(map(lambda it: it.strip(), input_tags)) + modify_database_object(input_tags, getattr(book, cc_string), db.cc_classes[c.id], db.session, + 'custom') + return cc + +def upload_single_file(request, book, book_id): + # Check and handle Uploaded file + if 'btn-upload-format' in request.files: + requested_file = request.files['btn-upload-format'] + # check for empty request + if requested_file.filename != '': + if '.' in requested_file.filename: + file_ext = requested_file.filename.rsplit('.', 1)[-1].lower() + if file_ext not in EXTENSIONS_UPLOAD: + flash(_("File extension '%(ext)s' is not allowed to be uploaded to this server", ext=file_ext), + category="error") + return redirect(url_for('show_book', book_id=book.id)) + else: + flash(_('File to be uploaded must have an extension'), category="error") + return redirect(url_for('show_book', book_id=book.id)) + + file_name = book.path.rsplit('/', 1)[-1] + filepath = os.path.normpath(os.path.join(config.config_calibre_dir, book.path)) + saved_filename = os.path.join(filepath, file_name + '.' + file_ext) + + # check if file path exists, otherwise create it, copy file to calibre path and delete temp file + if not os.path.exists(filepath): + try: + os.makedirs(filepath) + except OSError: + flash(_(u"Failed to create path %(path)s (Permission denied).", path=filepath), category="error") + return redirect(url_for('show_book', book_id=book.id)) + try: + requested_file.save(saved_filename) + except OSError: + flash(_(u"Failed to store file %(file)s.", file=saved_filename), category="error") + return redirect(url_for('show_book', book_id=book.id)) + + file_size = os.path.getsize(saved_filename) + is_format = db.session.query(db.Data).filter(db.Data.book == book_id).\ + filter(db.Data.format == file_ext.upper()).first() + + # Format entry already exists, no need to update the database + if is_format: + app.logger.info('Book format already existing') + else: + db_format = db.Data(book_id, file_ext.upper(), file_size, file_name) + db.session.add(db_format) + db.session.commit() + db.session.connection().connection.connection.create_function("title_sort", 1, db.title_sort) + + # Queue uploader info + uploadText=_(u"File format %(ext)s added to %(book)s", ext=file_ext.upper(), book=book.title) + helper.global_WorkerThread.add_upload(current_user.nickname, + "" + uploadText + "") + +def upload_cover(request, book): + if 'btn-upload-cover' in request.files: + requested_file = request.files['btn-upload-cover'] + # check for empty request + if requested_file.filename != '': + file_ext = requested_file.filename.rsplit('.', 1)[-1].lower() + filepath = os.path.normpath(os.path.join(config.config_calibre_dir, book.path)) + saved_filename = os.path.join(filepath, 'cover.' + file_ext) + + # check if file path exists, otherwise create it, copy file to calibre path and delete temp file + if not os.path.exists(filepath): + try: + os.makedirs(filepath) + except OSError: + flash(_(u"Failed to create path for cover %(path)s (Permission denied).", cover=filepath), + category="error") + return redirect(url_for('show_book', book_id=book.id)) + try: + requested_file.save(saved_filename) + # im=Image.open(saved_filename) + book.has_cover = 1 + except OSError: + flash(_(u"Failed to store cover-file %(cover)s.", cover=saved_filename), category="error") + return redirect(url_for('show_book', book_id=book.id)) + except IOError: + flash(_(u"Cover-file is not a valid image file" % saved_filename), category="error") + return redirect(url_for('show_book', book_id=book.id)) + +@app.route("/admin/book/", methods=['GET', 'POST']) +@login_required_if_no_ano +@edit_required +def edit_book(book_id): + # Show form + if request.method != 'POST': + return render_edit_book(book_id) + + # create the function for sorting... + db.session.connection().connection.connection.create_function("title_sort", 1, db.title_sort) + book = db.session.query(db.Books)\ + .filter(db.Books.id == book_id).filter(common_filters()).first() + + # Book not found + if not book: + flash(_(u"Error opening eBook. File does not exist or file is not accessible"), category="error") + return redirect(url_for("index")) + + upload_single_file(request, book, book_id) + upload_cover(request, book) + try: + to_save = request.form.to_dict() + # Update book + edited_books_id = None + #handle book title + if book.title != to_save["book_title"].rstrip().strip(): + if to_save["book_title"] == '': + to_save["book_title"] = _(u'unknown') + book.title = to_save["book_title"].rstrip().strip() + edited_books_id = book.id + + # handle author(s) + input_authors = to_save["author_name"].split('&') + input_authors = list(map(lambda it: it.strip().replace(',', '|'), input_authors)) + # we have all author names now + if input_authors == ['']: + input_authors = [_(u'unknown')] # prevent empty Author + if book.authors: + author0_before_edit = book.authors[0].name + else: + author0_before_edit = db.Authors(_(u'unknown'), '', 0) + modify_database_object(input_authors, book.authors, db.Authors, db.session, 'author') + if book.authors: + if author0_before_edit != book.authors[0].name: + edited_books_id = book.id + book.author_sort = helper.get_sorted_author(input_authors[0]) + + if config.config_use_google_drive: + gdriveutils.updateGdriveCalibreFromLocal() + + error = False + if edited_books_id: + error = helper.update_dir_stucture(edited_books_id, config.config_calibre_dir) + + if not error: + if to_save["cover_url"]: + if helper.save_cover(to_save["cover_url"], book.path) is True: + book.has_cover = 1 + else: + flash(_(u"Cover is not a jpg file, can't save"), category="error") + + if book.series_index != to_save["series_index"]: + book.series_index = to_save["series_index"] + + # Handle book comments/description + if len(book.comments): + book.comments[0].text = to_save["description"] + else: + book.comments.append(db.Comments(text=to_save["description"], book=book.id)) + + # Handle book tags + input_tags = to_save["tags"].split(',') + input_tags = list(map(lambda it: it.strip(), input_tags)) + modify_database_object(input_tags, book.tags, db.Tags, db.session, 'tags') + + # Handle book series + input_series = [to_save["series"].strip()] + input_series = [x for x in input_series if x != ''] + modify_database_object(input_series, book.series, db.Series, db.session, 'series') + + if to_save["pubdate"]: + try: + book.pubdate = datetime.datetime.strptime(to_save["pubdate"], "%Y-%m-%d") + except ValueError: + book.pubdate = db.Books.DEFAULT_PUBDATE + else: + book.pubdate = db.Books.DEFAULT_PUBDATE + + if to_save["publisher"]: + publisher = to_save["publisher"].rstrip().strip() + if len(book.publishers) == 0 or (len(book.publishers) > 0 and publisher != book.publishers[0].name): + modify_database_object([publisher], book.publishers, db.Publishers, db.session, 'publisher') + elif len(book.publishers): + modify_database_object([], book.publishers, db.Publishers, db.session, 'publisher') + + + # handle book languages + input_languages = to_save["languages"].split(',') + input_languages = [x.strip().lower() for x in input_languages if x != ''] + input_l = [] + invers_lang_table = [x.lower() for x in language_table[get_locale()].values()] + for lang in input_languages: + try: + res = list(language_table[get_locale()].keys())[invers_lang_table.index(lang)] + input_l.append(res) + except ValueError: + app.logger.error('%s is not a valid language' % lang) + flash(_(u"%(langname)s is not a valid language", langname=lang), category="error") + modify_database_object(input_l, book.languages, db.Languages, db.session, 'languages') + + # handle book ratings + if to_save["rating"].strip(): + old_rating = False + if len(book.ratings) > 0: + old_rating = book.ratings[0].rating + ratingx2 = int(float(to_save["rating"]) * 2) + if ratingx2 != old_rating: + is_rating = db.session.query(db.Ratings).filter(db.Ratings.rating == ratingx2).first() + if is_rating: + book.ratings.append(is_rating) + else: + new_rating = db.Ratings(rating=ratingx2) + book.ratings.append(new_rating) + if old_rating: + book.ratings.remove(book.ratings[0]) + else: + if len(book.ratings) > 0: + book.ratings.remove(book.ratings[0]) + + # handle cc data + edit_cc_data(book_id, book, to_save) + + db.session.commit() + if config.config_use_google_drive: + gdriveutils.updateGdriveCalibreFromLocal() + if "detail_view" in to_save: + return redirect(url_for('show_book', book_id=book.id)) + else: + flash(_("Metadata successfully updated"), category="success") + return render_edit_book(book_id) + else: + db.session.rollback() + flash(error, category="error") + return render_edit_book(book_id) + except Exception as e: + app.logger.exception(e) + db.session.rollback() + flash(_("Error editing book, please check logfile for details"), category="error") + return redirect(url_for('show_book', book_id=book.id)) + + +@app.route("/upload", methods=["GET", "POST"]) +@login_required_if_no_ano +@upload_required +def upload(): + if not config.config_uploading: + abort(404) + if request.method == 'POST' and 'btn-upload' in request.files: + for requested_file in request.files.getlist("btn-upload"): + # create the function for sorting... + db.session.connection().connection.connection.create_function("title_sort", 1, db.title_sort) + db.session.connection().connection.connection.create_function('uuid4', 0, lambda: str(uuid4())) + + # check if file extension is correct + if '.' in requested_file.filename: + file_ext = requested_file.filename.rsplit('.', 1)[-1].lower() + if file_ext not in EXTENSIONS_UPLOAD: + flash( + _("File extension '%(ext)s' is not allowed to be uploaded to this server", + ext=file_ext), category="error") + return redirect(url_for('index')) + else: + flash(_('File to be uploaded must have an extension'), category="error") + return redirect(url_for('index')) + + # extract metadata from file + meta = uploader.upload(requested_file) + title = meta.title + authr = meta.author + tags = meta.tags + series = meta.series + series_index = meta.series_id + title_dir = helper.get_valid_filename(title) + author_dir = helper.get_valid_filename(authr) + filepath = os.path.join(config.config_calibre_dir, author_dir, title_dir) + saved_filename = os.path.join(filepath, title_dir + meta.extension.lower()) + + # check if file path exists, otherwise create it, copy file to calibre path and delete temp file + if not os.path.exists(filepath): + try: + os.makedirs(filepath) + except OSError: + flash(_(u"Failed to create path %(path)s (Permission denied).", path=filepath), category="error") + return redirect(url_for('index')) + try: + copyfile(meta.file_path, saved_filename) + except OSError: + flash(_(u"Failed to store file %(file)s (Permission denied).", file=saved_filename), category="error") + return redirect(url_for('index')) + try: + os.unlink(meta.file_path) + except OSError: + flash(_(u"Failed to delete file %(file)s (Permission denied).", file= meta.file_path), + category="warning") + + if meta.cover is None: + has_cover = 0 + copyfile(os.path.join(config.get_main_dir, "cps/static/generic_cover.jpg"), + os.path.join(filepath, "cover.jpg")) + else: + has_cover = 1 + move(meta.cover, os.path.join(filepath, "cover.jpg")) + + # handle authors + is_author = db.session.query(db.Authors).filter(db.Authors.name == authr).first() + if is_author: + db_author = is_author + else: + db_author = db.Authors(authr, helper.get_sorted_author(authr), "") + db.session.add(db_author) + + # handle series + db_series = None + is_series = db.session.query(db.Series).filter(db.Series.name == series).first() + if is_series: + db_series = is_series + elif series != '': + db_series = db.Series(series, "") + db.session.add(db_series) + + # add language actually one value in list + input_language = meta.languages + db_language = None + if input_language != "": + input_language = isoLanguages.get(name=input_language).part3 + hasLanguage = db.session.query(db.Languages).filter(db.Languages.lang_code == input_language).first() + if hasLanguage: + db_language = hasLanguage + else: + db_language = db.Languages(input_language) + db.session.add(db_language) + + # combine path and normalize path from windows systems + path = os.path.join(author_dir, title_dir).replace('\\', '/') + db_book = db.Books(title, "", db_author.sort, datetime.datetime.now(), datetime.datetime(101, 1, 1), + series_index, datetime.datetime.now(), path, has_cover, db_author, [], db_language) + db_book.authors.append(db_author) + if db_series: + db_book.series.append(db_series) + if db_language is not None: + db_book.languages.append(db_language) + file_size = os.path.getsize(saved_filename) + db_data = db.Data(db_book, meta.extension.upper()[1:], file_size, title_dir) + + # handle tags + input_tags = tags.split(',') + input_tags = list(map(lambda it: it.strip(), input_tags)) + if input_tags[0] !="": + modify_database_object(input_tags, db_book.tags, db.Tags, db.session, 'tags') + + # flush content, get db_book.id available + db_book.data.append(db_data) + db.session.add(db_book) + db.session.flush() + + # add comment + book_id = db_book.id + upload_comment = Markup(meta.description).unescape() + if upload_comment != "": + db.session.add(db.Comments(upload_comment, book_id)) + + # save data to database, reread data + db.session.commit() + db.session.connection().connection.connection.create_function("title_sort", 1, db.title_sort) + book = db.session.query(db.Books).filter(db.Books.id == book_id).filter(common_filters()).first() + + # upload book to gdrive if nesseccary and add "(bookid)" to folder name + if config.config_use_google_drive: + gdriveutils.updateGdriveCalibreFromLocal() + error = helper.update_dir_stucture(book.id, config.config_calibre_dir) + db.session.commit() + if config.config_use_google_drive: + gdriveutils.updateGdriveCalibreFromLocal() + if error: + flash(error, category="error") + uploadText=(u"File %s" % book.title) + helper.global_WorkerThread.add_upload(current_user.nickname, + "" + uploadText + "") + + # create data for displaying display Full language name instead of iso639.part3language + if db_language is not None: + book.languages[0].language_name = _(meta.languages) + author_names = [] + for author in db_book.authors: + author_names.append(author.name) + if len(request.files.getlist("btn-upload")) < 2: + cc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns. + datatype.notin_(db.cc_exceptions)).all() + if current_user.role_edit() or current_user.role_admin(): + return render_title_template('book_edit.html', book=book, authors=author_names, + cc=cc, title=_(u"edit metadata"), page="upload") + book_in_shelfs = [] + kindle_list = helper.check_send_to_kindle(book) + reader_list = helper.check_read_formats(book) + + return render_title_template('detail.html', entry=book, cc=cc, + title=book.title, books_shelfs=book_in_shelfs, kindle_list=kindle_list, + reader_list=reader_list, page="upload") + return redirect(url_for("index")) + + +@app.route("/admin/book/convert/", methods=['POST']) +@login_required_if_no_ano +@edit_required +def convert_bookformat(book_id): + # check to see if we have form fields to work with - if not send user back + book_format_from = request.form.get('book_format_from', None) + book_format_to = request.form.get('book_format_to', None) + + if (book_format_from is None) or (book_format_to is None): + flash(_(u"Source or destination format for conversion missing"), category="error") + return redirect(request.environ["HTTP_REFERER"]) + + app.logger.debug('converting: book id: ' + str(book_id) + + ' from: ' + request.form['book_format_from'] + + ' to: ' + request.form['book_format_to']) + rtn = helper.convert_book_format(book_id, config.config_calibre_dir, book_format_from.upper(), + book_format_to.upper(), current_user.nickname) + + if rtn is None: + flash(_(u"Book successfully queued for converting to %(book_format)s", + book_format=book_format_to), + category="success") + else: + flash(_(u"There was an error converting this book: %(res)s", res=rtn), category="error") + return redirect(request.environ["HTTP_REFERER"]) diff --git a/src/cps/worker.py b/src/cps/worker.py new file mode 100644 index 0000000..1439807 --- /dev/null +++ b/src/cps/worker.py @@ -0,0 +1,508 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from __future__ import print_function +import smtplib +import threading +from datetime import datetime +import logging +import time +import socket +import sys +import os +from email.generator import Generator +import web +from flask_babel import gettext as _ +import re +import gdriveutils as gd +import subprocess + +try: + from StringIO import StringIO + from email.MIMEBase import MIMEBase + from email.MIMEMultipart import MIMEMultipart + from email.MIMEText import MIMEText +except ImportError: + from io import StringIO + from email.mime.base import MIMEBase + from email.mime.multipart import MIMEMultipart + from email.mime.text import MIMEText + +from email import encoders +from email.utils import formatdate +from email.utils import make_msgid + +chunksize = 8192 +# task 'status' consts +STAT_WAITING = 0 +STAT_FAIL = 1 +STAT_STARTED = 2 +STAT_FINISH_SUCCESS = 3 +#taskType consts +TASK_EMAIL = 1 +TASK_CONVERT = 2 +TASK_UPLOAD = 3 +TASK_CONVERT_ANY = 4 + +RET_FAIL = 0 +RET_SUCCESS = 1 + + +# For gdrive download book from gdrive to calibredir (temp dir for books), read contents in both cases and append +# it in MIME Base64 encoded to +def get_attachment(bookpath, filename): + """Get file as MIMEBase message""" + calibrepath = web.config.config_calibre_dir + if web.ub.config.config_use_google_drive: + df = gd.getFileFromEbooksFolder(bookpath, filename) + if df: + datafile = os.path.join(calibrepath, bookpath, filename) + if not os.path.exists(os.path.join(calibrepath, bookpath)): + os.makedirs(os.path.join(calibrepath, bookpath)) + df.GetContentFile(datafile) + else: + return None + file_ = open(datafile, 'rb') + data = file_.read() + file_.close() + os.remove(datafile) + else: + try: + file_ = open(os.path.join(calibrepath, bookpath, filename), 'rb') + data = file_.read() + file_.close() + except IOError as e: + web.app.logger.exception(e) # traceback.print_exc() + web.app.logger.error(u'The requested file could not be read. Maybe wrong permissions?') + return None + + attachment = MIMEBase('application', 'octet-stream') + attachment.set_payload(data) + encoders.encode_base64(attachment) + attachment.add_header('Content-Disposition', 'attachment', + filename=filename) + return attachment + + +# Class for sending email with ability to get current progress +class emailbase(): + + transferSize = 0 + progress = 0 + + def data(self, msg): + self.transferSize = len(msg) + (code, resp) = smtplib.SMTP.data(self, msg) + self.progress = 0 + return (code, resp) + + def send(self, strg): + """Send `strg' to the server.""" + if self.debuglevel > 0: + print('send:', repr(strg), file=sys.stderr) + if hasattr(self, 'sock') and self.sock: + try: + if self.transferSize: + lock=threading.Lock() + lock.acquire() + self.transferSize = len(strg) + lock.release() + for i in range(0, self.transferSize, chunksize): + if type(strg) == bytes: + self.sock.send((strg[i:i+chunksize])) + else: + self.sock.send((strg[i:i + chunksize]).encode('utf-8')) + lock.acquire() + self.progress = i + lock.release() + else: + self.sock.sendall(strg.encode('utf-8')) + except socket.error: + self.close() + raise smtplib.SMTPServerDisconnected('Server not connected') + else: + raise smtplib.SMTPServerDisconnected('please run connect() first') + + def getTransferStatus(self): + if self.transferSize: + lock2 = threading.Lock() + lock2.acquire() + value = int((float(self.progress) / float(self.transferSize))*100) + lock2.release() + return str(value) + ' %' + else: + return "100 %" + + +# Class for sending email with ability to get current progress, derived from emailbase class +class email(emailbase, smtplib.SMTP): + + def __init__(self, *args, **kwargs): + smtplib.SMTP.__init__(self, *args, **kwargs) + + +# Class for sending ssl encrypted email with ability to get current progress, , derived from emailbase class +class email_SSL(emailbase, smtplib.SMTP_SSL): + + def __init__(self, *args, **kwargs): + smtplib.SMTP_SSL.__init__(self, *args, **kwargs) + + +#Class for all worker tasks in the background +class WorkerThread(threading.Thread): + + def __init__(self): + self._stopevent = threading.Event() + threading.Thread.__init__(self) + self.status = 0 + self.current = 0 + self.last = 0 + self.queue = list() + self.UIqueue = list() + self.asyncSMTP=None + self.id = 0 + + # Main thread loop starting the different tasks + def run(self): + while not self._stopevent.isSet(): + doLock = threading.Lock() + doLock.acquire() + if self.current != self.last: + doLock.release() + if self.queue[self.current]['taskType'] == TASK_EMAIL: + self._send_raw_email() + if self.queue[self.current]['taskType'] == TASK_CONVERT: + self._convert_any_format() + if self.queue[self.current]['taskType'] == TASK_CONVERT_ANY: + self._convert_any_format() + # TASK_UPLOAD is handled implicitly + self.current += 1 + else: + doLock.release() + time.sleep(1) + + def stop(self): + self._stopevent.set() + + def get_send_status(self): + if self.asyncSMTP: + return self.asyncSMTP.getTransferStatus() + else: + return "0 %" + + def _delete_completed_tasks(self): + for index, task in reversed(list(enumerate(self.UIqueue))): + if task['progress'] == "100 %": + # delete tasks + self.queue.pop(index) + self.UIqueue.pop(index) + # if we are deleting entries before the current index, adjust the index + self.current -= 1 + self.last = len(self.queue) + + def get_taskstatus(self): + if self.current < len(self.queue): + if self.UIqueue[self.current]['stat'] == STAT_STARTED: + if self.queue[self.current]['taskType'] == TASK_EMAIL: + self.UIqueue[self.current]['progress'] = self.get_send_status() + self.UIqueue[self.current]['runtime'] = self._formatRuntime( + datetime.now() - self.queue[self.current]['starttime']) + return self.UIqueue + + def _convert_any_format(self): + # convert book, and upload in case of google drive + self.UIqueue[self.current]['stat'] = STAT_STARTED + self.queue[self.current]['starttime'] = datetime.now() + self.UIqueue[self.current]['formStarttime'] = self.queue[self.current]['starttime'] + curr_task = self.queue[self.current]['taskType'] + filename = self._convert_ebook_format() + if filename: + if web.ub.config.config_use_google_drive: + gd.updateGdriveCalibreFromLocal() + if curr_task == TASK_CONVERT: + self.add_email(self.queue[self.current]['settings']['subject'], self.queue[self.current]['path'], + filename, self.queue[self.current]['settings'], self.queue[self.current]['kindle'], + self.UIqueue[self.current]['user'], self.queue[self.current]['title'], + self.queue[self.current]['settings']['body']) + + def _convert_ebook_format(self): + error_message = None + file_path = self.queue[self.current]['file_path'] + bookid = self.queue[self.current]['bookid'] + format_old_ext = u'.' + self.queue[self.current]['settings']['old_book_format'].lower() + format_new_ext = u'.' + self.queue[self.current]['settings']['new_book_format'].lower() + + # check to see if destination format already exists - + # if it does - mark the conversion task as complete and return a success + # this will allow send to kindle workflow to continue to work + if os.path.isfile(file_path + format_new_ext): + web.app.logger.info("Book id %d already converted to %s", bookid, format_new_ext) + cur_book = web.db.session.query(web.db.Books).filter(web.db.Books.id == bookid).first() + self.queue[self.current]['path'] = file_path + self.queue[self.current]['title'] = cur_book.title + self._handleSuccess() + return file_path + format_new_ext + else: + web.app.logger.info("Book id %d - target format of %s does not exist. Moving forward with convert.", bookid, format_new_ext) + + # check if converter-executable is existing + if not os.path.exists(web.ub.config.config_converterpath): + # ToDo Text is not translated + self._handleError(u"Convertertool %s not found" % web.ub.config.config_converterpath) + return + + try: + # check which converter to use kindlegen is "1" + if format_old_ext == '.epub' and format_new_ext == '.mobi': + if web.ub.config.config_ebookconverter == 1: + if os.name == 'nt': + command = web.ub.config.config_converterpath + u' "' + file_path + u'.epub"' + if sys.version_info < (3, 0): + command = command.encode(sys.getfilesystemencoding()) + else: + command = [web.ub.config.config_converterpath, file_path + u'.epub'] + if sys.version_info < (3, 0): + command = [x.encode(sys.getfilesystemencoding()) for x in command] + if web.ub.config.config_ebookconverter == 2: + # Linux py2.7 encode as list without quotes no empty element for parameters + # linux py3.x no encode and as list without quotes no empty element for parameters + # windows py2.7 encode as string with quotes empty element for parameters is okay + # windows py 3.x no encode and as string with quotes empty element for parameters is okay + # separate handling for windows and linux + if os.name == 'nt': + command = web.ub.config.config_converterpath + u' "' + file_path + format_old_ext + u'" "' + \ + file_path + format_new_ext + u'" ' + web.ub.config.config_calibre + if sys.version_info < (3, 0): + command = command.encode(sys.getfilesystemencoding()) + else: + command = [web.ub.config.config_converterpath, (file_path + format_old_ext), + (file_path + format_new_ext)] + if web.ub.config.config_calibre: + command.append(web.ub.config.config_calibre) + if sys.version_info < (3, 0): + command = [x.encode(sys.getfilesystemencoding()) for x in command] + + p = subprocess.Popen(command, stdout=subprocess.PIPE, universal_newlines=True) + except OSError as e: + self._handleError(_(u"Ebook-converter failed: %(error)s", error=e)) + return + + if web.ub.config.config_ebookconverter == 1: + nextline = p.communicate()[0] + # Format of error message (kindlegen translates its output texts): + # Error(prcgen):E23006: Language not recognized in metadata.The dc:Language field is mandatory.Aborting. + conv_error = re.search(".*\(.*\):(E\d+):\s(.*)", nextline, re.MULTILINE) + # If error occoures, store error message for logfile + if conv_error: + error_message = _(u"Kindlegen failed with Error %(error)s. Message: %(message)s", + error=conv_error.group(1), message=conv_error.group(2).strip()) + web.app.logger.debug("convert_kindlegen: " + nextline) + else: + while p.poll() is None: + nextline = p.stdout.readline() + if os.name == 'nt' and sys.version_info < (3, 0): + nextline = nextline.decode('windows-1252') + web.app.logger.debug(nextline.strip('\r\n')) + # parse progress string from calibre-converter + progress = re.search("(\d+)%\s.*", nextline) + if progress: + self.UIqueue[self.current]['progress'] = progress.group(1) + ' %' + + # process returncode + check = p.returncode + + # kindlegen returncodes + # 0 = Info(prcgen):I1036: Mobi file built successfully + # 1 = Info(prcgen):I1037: Mobi file built with WARNINGS! + # 2 = Info(prcgen):I1038: MOBI file could not be generated because of errors! + if (check < 2 and web.ub.config.config_ebookconverter == 1) or \ + (check == 0 and web.ub.config.config_ebookconverter == 2): + cur_book = web.db.session.query(web.db.Books).filter(web.db.Books.id == bookid).first() + if os.path.isfile(file_path + format_new_ext): + new_format = web.db.Data(name=cur_book.data[0].name, + book_format=self.queue[self.current]['settings']['new_book_format'].upper(), + book=bookid, uncompressed_size=os.path.getsize(file_path + format_new_ext)) + cur_book.data.append(new_format) + web.db.session.commit() + self.queue[self.current]['path'] = cur_book.path + self.queue[self.current]['title'] = cur_book.title + if web.ub.config.config_use_google_drive: + os.remove(file_path + format_old_ext) + self._handleSuccess() + return file_path + format_new_ext + else: + error_message = format_new_ext.upper() + ' format not found on disk' + web.app.logger.info("ebook converter failed with error while converting book") + if not error_message: + error_message = 'Ebook converter failed with unknown error' + self._handleError(error_message) + return + + + def add_convert(self, file_path, bookid, user_name, taskMessage, settings, kindle_mail=None): + addLock = threading.Lock() + addLock.acquire() + if self.last >= 20: + self._delete_completed_tasks() + # progress, runtime, and status = 0 + self.id += 1 + task = TASK_CONVERT_ANY + if kindle_mail: + task = TASK_CONVERT + self.queue.append({'file_path':file_path, 'bookid':bookid, 'starttime': 0, 'kindle': kindle_mail, + 'taskType': task, 'settings':settings}) + self.UIqueue.append({'user': user_name, 'formStarttime': '', 'progress': " 0 %", 'taskMess': taskMessage, + 'runtime': '0 s', 'stat': STAT_WAITING,'id': self.id, 'taskType': task } ) + + self.last=len(self.queue) + addLock.release() + + def add_email(self, subject, filepath, attachment, settings, recipient, user_name, taskMessage, + text): + # if more than 20 entries in the list, clean the list + addLock = threading.Lock() + addLock.acquire() + if self.last >= 20: + self._delete_completed_tasks() + # progress, runtime, and status = 0 + self.id += 1 + self.queue.append({'subject':subject, 'attachment':attachment, 'filepath':filepath, + 'settings':settings, 'recipent':recipient, 'starttime': 0, + 'taskType': TASK_EMAIL, 'text':text}) + self.UIqueue.append({'user': user_name, 'formStarttime': '', 'progress': " 0 %", 'taskMess': taskMessage, + 'runtime': '0 s', 'stat': STAT_WAITING,'id': self.id, 'taskType': TASK_EMAIL }) + self.last=len(self.queue) + addLock.release() + + def add_upload(self, user_name, taskMessage): + # if more than 20 entries in the list, clean the list + addLock = threading.Lock() + addLock.acquire() + if self.last >= 20: + self._delete_completed_tasks() + # progress=100%, runtime=0, and status finished + self.id += 1 + self.queue.append({'starttime': datetime.now(), 'taskType': TASK_UPLOAD}) + self.UIqueue.append({'user': user_name, 'formStarttime': '', 'progress': "100 %", 'taskMess': taskMessage, + 'runtime': '0 s', 'stat': STAT_FINISH_SUCCESS,'id': self.id, 'taskType': TASK_UPLOAD}) + self.UIqueue[self.current]['formStarttime'] = self.queue[self.current]['starttime'] + self.last=len(self.queue) + addLock.release() + + + def _send_raw_email(self): + self.queue[self.current]['starttime'] = datetime.now() + self.UIqueue[self.current]['formStarttime'] = self.queue[self.current]['starttime'] + # self.queue[self.current]['status'] = STAT_STARTED + self.UIqueue[self.current]['stat'] = STAT_STARTED + obj=self.queue[self.current] + # create MIME message + msg = MIMEMultipart() + msg['Subject'] = self.queue[self.current]['subject'] + msg['Message-Id'] = make_msgid('calibre-web') + msg['Date'] = formatdate(localtime=True) + text = self.queue[self.current]['text'] + msg.attach(MIMEText(text.encode('UTF-8'), 'plain', 'UTF-8')) + if obj['attachment']: + result = get_attachment(obj['filepath'], obj['attachment']) + if result: + msg.attach(result) + else: + self._handleError(u"Attachment not found") + return + + msg['From'] = obj['settings']["mail_from"] + msg['To'] = obj['recipent'] + + use_ssl = int(obj['settings'].get('mail_use_ssl', 0)) + try: + # convert MIME message to string + fp = StringIO() + gen = Generator(fp, mangle_from_=False) + gen.flatten(msg) + msg = fp.getvalue() + + # send email + timeout = 600 # set timeout to 5mins + + org_stderr = sys.stderr + sys.stderr = StderrLogger() + + if use_ssl == 2: + self.asyncSMTP = email_SSL(obj['settings']["mail_server"], obj['settings']["mail_port"], timeout) + else: + self.asyncSMTP = email(obj['settings']["mail_server"], obj['settings']["mail_port"], timeout) + + # link to logginglevel + if web.ub.config.config_log_level != logging.DEBUG: + self.asyncSMTP.set_debuglevel(0) + else: + self.asyncSMTP.set_debuglevel(1) + if use_ssl == 1: + self.asyncSMTP.starttls() + if obj['settings']["mail_password"]: + self.asyncSMTP.login(str(obj['settings']["mail_login"]), str(obj['settings']["mail_password"])) + self.asyncSMTP.sendmail(obj['settings']["mail_from"], obj['recipent'], msg) + self.asyncSMTP.quit() + self._handleSuccess() + sys.stderr = org_stderr + + except (MemoryError) as e: + self._handleError(u'Error sending email: ' + e.message) + return None + except (smtplib.SMTPException) as e: + if hasattr(e, "smtp_error"): + text = e.smtp_error.replace("\n",'. ') + else: + text = '' + self._handleError(u'Error sending email: ' + text) + return None + except (socket.error) as e: + self._handleError(u'Error sending email: ' + e.strerror) + return None + + def _formatRuntime(self, runtime): + self.UIqueue[self.current]['rt'] = runtime.total_seconds() + val = re.split('\:|\.', str(runtime))[0:3] + erg = list() + for v in val: + if int(v) > 0: + erg.append(v) + retVal = (':'.join(erg)).lstrip('0') + ' s' + if retVal == ' s': + retVal = '0 s' + return retVal + + def _handleError(self, error_message): + web.app.logger.error(error_message) + # self.queue[self.current]['status'] = STAT_FAIL + self.UIqueue[self.current]['stat'] = STAT_FAIL + self.UIqueue[self.current]['progress'] = "100 %" + self.UIqueue[self.current]['runtime'] = self._formatRuntime( + datetime.now() - self.queue[self.current]['starttime']) + self.UIqueue[self.current]['message'] = error_message + + def _handleSuccess(self): + # self.queue[self.current]['status'] = STAT_FINISH_SUCCESS + self.UIqueue[self.current]['stat'] = STAT_FINISH_SUCCESS + self.UIqueue[self.current]['progress'] = "100 %" + self.UIqueue[self.current]['runtime'] = self._formatRuntime( + datetime.now() - self.queue[self.current]['starttime']) + + +# Enable logging of smtp lib debug output +class StderrLogger(object): + + buffer = '' + + def __init__(self): + self.logger = web.app.logger + + def write(self, message): + if message == '\n': + self.logger.debug(self.buffer) + print(self.buffer) + self.buffer = '' + else: + self.buffer += message + diff --git a/src/messages.pot b/src/messages.pot new file mode 100644 index 0000000..e01f9d4 --- /dev/null +++ b/src/messages.pot @@ -0,0 +1,1925 @@ +# Translations template for PROJECT. +# Copyright (C) 2018 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2018. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2018-12-10 19:35+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.6.0\n" + +#: cps/book_formats.py:129 cps/book_formats.py:130 cps/book_formats.py:134 +#: cps/book_formats.py:138 cps/converter.py:11 cps/converter.py:27 +msgid "not installed" +msgstr "" + +#: cps/converter.py:22 cps/converter.py:38 +msgid "Excecution permissions missing" +msgstr "" + +#: cps/converter.py:48 +msgid "not configured" +msgstr "" + +#: cps/helper.py:59 +#, python-format +msgid "%(format)s format not found for book id: %(book)d" +msgstr "" + +#: cps/helper.py:71 +#, python-format +msgid "%(format)s not found on Google Drive: %(fn)s" +msgstr "" + +#: cps/helper.py:78 cps/helper.py:186 cps/templates/detail.html:49 +msgid "Send to Kindle" +msgstr "" + +#: cps/helper.py:79 cps/helper.py:97 cps/helper.py:188 +msgid "This e-mail has been sent via Calibre-Web." +msgstr "" + +#: cps/helper.py:90 +#, python-format +msgid "%(format)s not found: %(fn)s" +msgstr "" + +#: cps/helper.py:95 +msgid "Calibre-Web test e-mail" +msgstr "" + +#: cps/helper.py:96 +msgid "Test e-mail" +msgstr "" + +#: cps/helper.py:112 +msgid "Get Started with Calibre-Web" +msgstr "" + +#: cps/helper.py:113 +#, python-format +msgid "Registration e-mail for user: %(name)s" +msgstr "" + +#: cps/helper.py:126 cps/helper.py:128 cps/helper.py:130 cps/helper.py:132 +#: cps/helper.py:138 cps/helper.py:140 cps/helper.py:142 cps/helper.py:144 +#, python-format +msgid "Send %(format)s to Kindle" +msgstr "" + +#: cps/helper.py:148 cps/helper.py:152 +#, python-format +msgid "Convert %(orig)s to %(format)s and send to Kindle" +msgstr "" + +#: cps/helper.py:187 +#, python-format +msgid "E-mail: %(book)s" +msgstr "" + +#: cps/helper.py:190 +msgid "The requested file could not be read. Maybe wrong permissions?" +msgstr "" + +#: cps/helper.py:290 +#, python-format +msgid "Rename title from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "" + +#: cps/helper.py:299 +#, python-format +msgid "Rename author from: '%(src)s' to '%(dest)s' failed with error: %(error)s" +msgstr "" + +#: cps/helper.py:321 cps/helper.py:330 +#, python-format +msgid "File %(file)s not found on Google Drive" +msgstr "" + +#: cps/helper.py:348 +#, python-format +msgid "Book path %(path)s not found on Google Drive" +msgstr "" + +#: cps/helper.py:614 +msgid "Error excecuting UnRar" +msgstr "" + +#: cps/helper.py:616 +msgid "Unrar binary file not found" +msgstr "" + +#: cps/helper.py:667 +msgid "Waiting" +msgstr "" + +#: cps/helper.py:669 +msgid "Failed" +msgstr "" + +#: cps/helper.py:671 +msgid "Started" +msgstr "" + +#: cps/helper.py:673 +msgid "Finished" +msgstr "" + +#: cps/helper.py:675 +msgid "Unknown Status" +msgstr "" + +#: cps/helper.py:680 +msgid "E-mail: " +msgstr "" + +#: cps/helper.py:682 cps/helper.py:686 +msgid "Convert: " +msgstr "" + +#: cps/helper.py:684 +msgid "Upload: " +msgstr "" + +#: cps/helper.py:688 +msgid "Unknown Task: " +msgstr "" + +#: cps/web.py:1126 cps/web.py:2835 +msgid "Unknown" +msgstr "" + +#: cps/web.py:1135 cps/web.py:1166 cps/web.py:1251 +msgid "HTTP Error" +msgstr "" + +#: cps/web.py:1137 cps/web.py:1168 cps/web.py:1252 +msgid "Connection error" +msgstr "" + +#: cps/web.py:1139 cps/web.py:1170 cps/web.py:1253 +msgid "Timeout while establishing connection" +msgstr "" + +#: cps/web.py:1141 cps/web.py:1172 cps/web.py:1254 +msgid "General error" +msgstr "" + +#: cps/web.py:1147 +msgid "Unexpected data while reading update information" +msgstr "" + +#: cps/web.py:1154 +msgid "No update available. You already have the latest version installed" +msgstr "" + +#: cps/web.py:1179 +msgid "A new update is available. Click on the button below to update to the latest version." +msgstr "" + +#: cps/web.py:1229 +msgid "Could not fetch update information" +msgstr "" + +#: cps/web.py:1244 +msgid "Requesting update package" +msgstr "" + +#: cps/web.py:1245 +msgid "Downloading update package" +msgstr "" + +#: cps/web.py:1246 +msgid "Unzipping update package" +msgstr "" + +#: cps/web.py:1247 +msgid "Replacing files" +msgstr "" + +#: cps/web.py:1248 +msgid "Database connections are closed" +msgstr "" + +#: cps/web.py:1249 +msgid "Stopping server" +msgstr "" + +#: cps/web.py:1250 +msgid "Update finished, please press okay and reload page" +msgstr "" + +#: cps/web.py:1251 cps/web.py:1252 cps/web.py:1253 cps/web.py:1254 +msgid "Update failed:" +msgstr "" + +#: cps/web.py:1277 +msgid "Recently Added Books" +msgstr "" + +#: cps/web.py:1287 +msgid "Newest Books" +msgstr "" + +#: cps/web.py:1299 +msgid "Oldest Books" +msgstr "" + +#: cps/web.py:1311 +msgid "Books (A-Z)" +msgstr "" + +#: cps/web.py:1322 +msgid "Books (Z-A)" +msgstr "" + +#: cps/web.py:1351 +msgid "Hot Books (most downloaded)" +msgstr "" + +#: cps/web.py:1364 +msgid "Best rated books" +msgstr "" + +#: cps/templates/index.xml:39 cps/web.py:1377 +msgid "Random Books" +msgstr "" + +#: cps/web.py:1392 +msgid "Author list" +msgstr "" + +#: cps/web.py:1404 cps/web.py:1657 cps/web.py:2204 +msgid "Error opening eBook. File does not exist or file is not accessible:" +msgstr "" + +#: cps/web.py:1432 +msgid "Publisher list" +msgstr "" + +#: cps/web.py:1447 +#, python-format +msgid "Publisher: %(name)s" +msgstr "" + +#: cps/templates/index.xml:83 cps/web.py:1479 +msgid "Series list" +msgstr "" + +#: cps/web.py:1493 +#, python-format +msgid "Series: %(serie)s" +msgstr "" + +#: cps/web.py:1519 +msgid "Available languages" +msgstr "" + +#: cps/web.py:1539 +#, python-format +msgid "Language: %(name)s" +msgstr "" + +#: cps/templates/index.xml:76 cps/web.py:1550 +msgid "Category list" +msgstr "" + +#: cps/web.py:1564 +#, python-format +msgid "Category: %(name)s" +msgstr "" + +#: cps/templates/layout.html:71 cps/web.py:1693 +msgid "Tasks" +msgstr "" + +#: cps/web.py:1727 +msgid "Statistics" +msgstr "" + +#: cps/web.py:1835 +msgid "Callback domain is not verified, please follow steps to verify domain in google developer console" +msgstr "" + +#: cps/web.py:1911 +msgid "Server restarted, please reload page" +msgstr "" + +#: cps/web.py:1914 +msgid "Performing shutdown of server, please close window" +msgstr "" + +#: cps/web.py:1933 +msgid "Update done" +msgstr "" + +#: cps/web.py:2003 +msgid "Published after " +msgstr "" + +#: cps/web.py:2010 +msgid "Published before " +msgstr "" + +#: cps/web.py:2024 +#, python-format +msgid "Rating <= %(rating)s" +msgstr "" + +#: cps/web.py:2026 +#, python-format +msgid "Rating >= %(rating)s" +msgstr "" + +#: cps/web.py:2087 cps/web.py:2096 +msgid "search" +msgstr "" + +#: cps/templates/index.xml:47 cps/templates/index.xml:51 +#: cps/templates/layout.html:146 cps/web.py:2163 +msgid "Read Books" +msgstr "" + +#: cps/templates/index.xml:55 cps/templates/index.xml:59 +#: cps/templates/layout.html:148 cps/web.py:2166 +msgid "Unread Books" +msgstr "" + +#: cps/web.py:2214 cps/web.py:2216 cps/web.py:2218 cps/web.py:2230 +msgid "Read a Book" +msgstr "" + +#: cps/web.py:2289 cps/web.py:3197 +msgid "Please fill out all fields!" +msgstr "" + +#: cps/web.py:2290 cps/web.py:2311 cps/web.py:2315 cps/web.py:2320 +#: cps/web.py:2322 +msgid "register" +msgstr "" + +#: cps/web.py:2310 cps/web.py:3413 +msgid "An unknown error occurred. Please try again later." +msgstr "" + +#: cps/web.py:2313 +msgid "Your e-mail is not allowed to register" +msgstr "" + +#: cps/web.py:2316 +msgid "Confirmation e-mail was send to your e-mail account." +msgstr "" + +#: cps/web.py:2319 +msgid "This username or e-mail address is already in use." +msgstr "" + +#: cps/web.py:2336 cps/web.py:2432 +#, python-format +msgid "you are now logged in as: '%(nickname)s'" +msgstr "" + +#: cps/web.py:2341 +msgid "Wrong Username or Password" +msgstr "" + +#: cps/web.py:2347 cps/web.py:2368 +msgid "login" +msgstr "" + +#: cps/web.py:2380 cps/web.py:2411 +msgid "Token not found" +msgstr "" + +#: cps/web.py:2388 cps/web.py:2419 +msgid "Token has expired" +msgstr "" + +#: cps/web.py:2396 +msgid "Success! Please return to your device" +msgstr "" + +#: cps/web.py:2446 +msgid "Please configure the SMTP mail settings first..." +msgstr "" + +#: cps/web.py:2451 +#, python-format +msgid "Book successfully queued for sending to %(kindlemail)s" +msgstr "" + +#: cps/web.py:2455 +#, python-format +msgid "There was an error sending this book: %(res)s" +msgstr "" + +#: cps/web.py:2457 cps/web.py:3251 +msgid "Please configure your kindle e-mail address first..." +msgstr "" + +#: cps/web.py:2468 cps/web.py:2520 +msgid "Invalid shelf specified" +msgstr "" + +#: cps/web.py:2475 +#, python-format +msgid "Sorry you are not allowed to add a book to the the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2483 +msgid "You are not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2492 +#, python-format +msgid "Book is already part of the shelf: %(shelfname)s" +msgstr "" + +#: cps/web.py:2506 +#, python-format +msgid "Book has been added to shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2525 +#, python-format +msgid "You are not allowed to add a book to the the shelf: %(name)s" +msgstr "" + +#: cps/web.py:2530 +msgid "User is not allowed to edit public shelves" +msgstr "" + +#: cps/web.py:2548 +#, python-format +msgid "Books are already part of the shelf: %(name)s" +msgstr "" + +#: cps/web.py:2562 +#, python-format +msgid "Books have been added to shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2564 +#, python-format +msgid "Could not add books to shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2601 +#, python-format +msgid "Book has been removed from shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2607 +#, python-format +msgid "Sorry you are not allowed to remove a book from this shelf: %(sname)s" +msgstr "" + +#: cps/web.py:2628 cps/web.py:2652 +#, python-format +msgid "A shelf with the name '%(title)s' already exists." +msgstr "" + +#: cps/web.py:2633 +#, python-format +msgid "Shelf %(title)s created" +msgstr "" + +#: cps/web.py:2635 cps/web.py:2663 +msgid "There was an error" +msgstr "" + +#: cps/web.py:2636 cps/web.py:2638 +msgid "create a shelf" +msgstr "" + +#: cps/web.py:2661 +#, python-format +msgid "Shelf %(title)s changed" +msgstr "" + +#: cps/web.py:2664 cps/web.py:2666 +msgid "Edit a shelf" +msgstr "" + +#: cps/web.py:2687 +#, python-format +msgid "successfully deleted shelf %(name)s" +msgstr "" + +#: cps/web.py:2714 +#, python-format +msgid "Shelf: '%(name)s'" +msgstr "" + +#: cps/web.py:2717 +msgid "Error opening shelf. Shelf does not exist or is not accessible" +msgstr "" + +#: cps/web.py:2748 +#, python-format +msgid "Change order of Shelf: '%(name)s'" +msgstr "" + +#: cps/web.py:2777 cps/web.py:3203 +msgid "E-mail is not from valid domain" +msgstr "" + +#: cps/web.py:2779 cps/web.py:2822 cps/web.py:2825 +#, python-format +msgid "%(name)s's profile" +msgstr "" + +#: cps/web.py:2820 +msgid "Found an existing account for this e-mail address." +msgstr "" + +#: cps/web.py:2823 +msgid "Profile updated" +msgstr "" + +#: cps/web.py:2851 +msgid "Admin page" +msgstr "" + +#: cps/web.py:2931 cps/web.py:3105 +msgid "Calibre-Web configuration updated" +msgstr "" + +#: cps/templates/admin.html:100 cps/web.py:2944 +msgid "UI Configuration" +msgstr "" + +#: cps/web.py:2962 +msgid "Import of optional Google Drive requirements missing" +msgstr "" + +#: cps/web.py:2965 +msgid "client_secrets.json is missing or not readable" +msgstr "" + +#: cps/web.py:2970 cps/web.py:2997 +msgid "client_secrets.json is not configured for web application" +msgstr "" + +#: cps/templates/admin.html:99 cps/web.py:3000 cps/web.py:3026 cps/web.py:3038 +#: cps/web.py:3081 cps/web.py:3096 cps/web.py:3114 cps/web.py:3122 +#: cps/web.py:3138 +msgid "Basic Configuration" +msgstr "" + +#: cps/web.py:3023 +msgid "Keyfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:3035 +msgid "Certfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:3078 +msgid "Logfile location is not valid, please enter correct path" +msgstr "" + +#: cps/web.py:3118 +msgid "DB location is not valid, please enter correct path" +msgstr "" + +#: cps/templates/admin.html:33 cps/web.py:3199 cps/web.py:3205 cps/web.py:3221 +msgid "Add new user" +msgstr "" + +#: cps/web.py:3211 +#, python-format +msgid "User '%(user)s' created" +msgstr "" + +#: cps/web.py:3215 +msgid "Found an existing account for this e-mail address or nickname." +msgstr "" + +#: cps/web.py:3239 cps/web.py:3253 +msgid "E-mail server settings updated" +msgstr "" + +#: cps/web.py:3246 +#, python-format +msgid "Test e-mail successfully send to %(kindlemail)s" +msgstr "" + +#: cps/web.py:3249 +#, python-format +msgid "There was an error sending the Test e-mail: %(res)s" +msgstr "" + +#: cps/web.py:3254 +msgid "Edit e-mail server settings" +msgstr "" + +#: cps/web.py:3279 +#, python-format +msgid "User '%(nick)s' deleted" +msgstr "" + +#: cps/web.py:3388 +#, python-format +msgid "User '%(nick)s' updated" +msgstr "" + +#: cps/web.py:3391 +msgid "An unknown error occured." +msgstr "" + +#: cps/web.py:3393 +#, python-format +msgid "Edit User %(nick)s" +msgstr "" + +#: cps/web.py:3410 +#, python-format +msgid "Password for user %(user)s reset" +msgstr "" + +#: cps/web.py:3424 cps/web.py:3627 +msgid "Error opening eBook. File does not exist or file is not accessible" +msgstr "" + +#: cps/web.py:3449 cps/web.py:3912 +msgid "edit metadata" +msgstr "" + +#: cps/web.py:3542 cps/web.py:3780 +#, python-format +msgid "File extension '%(ext)s' is not allowed to be uploaded to this server" +msgstr "" + +#: cps/web.py:3546 cps/web.py:3784 +msgid "File to be uploaded must have an extension" +msgstr "" + +#: cps/web.py:3558 cps/web.py:3804 +#, python-format +msgid "Failed to create path %(path)s (Permission denied)." +msgstr "" + +#: cps/web.py:3563 +#, python-format +msgid "Failed to store file %(file)s." +msgstr "" + +#: cps/web.py:3580 +#, python-format +msgid "File format %(ext)s added to %(book)s" +msgstr "" + +#: cps/web.py:3598 +#, python-format +msgid "Failed to create path for cover %(path)s (Permission denied)." +msgstr "" + +#: cps/web.py:3606 +#, python-format +msgid "Failed to store cover-file %(cover)s." +msgstr "" + +#: cps/web.py:3609 +msgid "Cover-file is not a valid image file" +msgstr "" + +#: cps/web.py:3639 cps/web.py:3648 cps/web.py:3652 +msgid "unknown" +msgstr "" + +#: cps/web.py:3671 +msgid "Cover is not a jpg file, can't save" +msgstr "" + +#: cps/web.py:3719 +#, python-format +msgid "%(langname)s is not a valid language" +msgstr "" + +#: cps/web.py:3750 +msgid "Metadata successfully updated" +msgstr "" + +#: cps/web.py:3759 +msgid "Error editing book, please check logfile for details" +msgstr "" + +#: cps/web.py:3809 +#, python-format +msgid "Failed to store file %(file)s (Permission denied)." +msgstr "" + +#: cps/web.py:3814 +#, python-format +msgid "Failed to delete file %(file)s (Permission denied)." +msgstr "" + +#: cps/web.py:3932 +msgid "Source or destination format for conversion missing" +msgstr "" + +#: cps/web.py:3942 +#, python-format +msgid "Book successfully queued for converting to %(book_format)s" +msgstr "" + +#: cps/web.py:3946 +#, python-format +msgid "There was an error converting this book: %(res)s" +msgstr "" + +#: cps/worker.py:287 +#, python-format +msgid "Ebook-converter failed: %(error)s" +msgstr "" + +#: cps/worker.py:298 +#, python-format +msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" +msgstr "" + +#: cps/templates/admin.html:6 +msgid "User list" +msgstr "" + +#: cps/templates/admin.html:9 +msgid "Nickname" +msgstr "" + +#: cps/templates/admin.html:10 +msgid "E-mail" +msgstr "" + +#: cps/templates/admin.html:11 +msgid "Kindle" +msgstr "" + +#: cps/templates/admin.html:12 +msgid "DLS" +msgstr "" + +#: cps/templates/admin.html:13 cps/templates/layout.html:74 +msgid "Admin" +msgstr "" + +#: cps/templates/admin.html:14 cps/templates/detail.html:22 +#: cps/templates/detail.html:31 +msgid "Download" +msgstr "" + +#: cps/templates/admin.html:15 cps/templates/layout.html:64 +msgid "Upload" +msgstr "" + +#: cps/templates/admin.html:16 +msgid "Edit" +msgstr "" + +#: cps/templates/admin.html:39 +msgid "SMTP e-mail server settings" +msgstr "" + +#: cps/templates/admin.html:42 cps/templates/email_edit.html:11 +msgid "SMTP hostname" +msgstr "" + +#: cps/templates/admin.html:43 +msgid "SMTP port" +msgstr "" + +#: cps/templates/admin.html:44 +msgid "SSL" +msgstr "" + +#: cps/templates/admin.html:45 cps/templates/email_edit.html:27 +msgid "SMTP login" +msgstr "" + +#: cps/templates/admin.html:46 +msgid "From mail" +msgstr "" + +#: cps/templates/admin.html:56 +msgid "Change SMTP settings" +msgstr "" + +#: cps/templates/admin.html:62 +msgid "Configuration" +msgstr "" + +#: cps/templates/admin.html:65 +msgid "Calibre DB dir" +msgstr "" + +#: cps/templates/admin.html:69 +msgid "Log level" +msgstr "" + +#: cps/templates/admin.html:73 +msgid "Port" +msgstr "" + +#: cps/templates/admin.html:79 cps/templates/config_view_edit.html:23 +msgid "Books per page" +msgstr "" + +#: cps/templates/admin.html:83 +msgid "Uploading" +msgstr "" + +#: cps/templates/admin.html:87 +msgid "Anonymous browsing" +msgstr "" + +#: cps/templates/admin.html:91 +msgid "Public registration" +msgstr "" + +#: cps/templates/admin.html:95 cps/templates/remote_login.html:4 +msgid "Remote login" +msgstr "" + +#: cps/templates/admin.html:106 +msgid "Administration" +msgstr "" + +#: cps/templates/admin.html:107 +msgid "Reconnect to Calibre DB" +msgstr "" + +#: cps/templates/admin.html:108 +msgid "Restart Calibre-Web" +msgstr "" + +#: cps/templates/admin.html:109 +msgid "Stop Calibre-Web" +msgstr "" + +#: cps/templates/admin.html:115 +msgid "Update" +msgstr "" + +#: cps/templates/admin.html:119 +msgid "Version" +msgstr "" + +#: cps/templates/admin.html:120 +msgid "Details" +msgstr "" + +#: cps/templates/admin.html:126 +msgid "Current version" +msgstr "" + +#: cps/templates/admin.html:132 +msgid "Check for update" +msgstr "" + +#: cps/templates/admin.html:133 +msgid "Perform Update" +msgstr "" + +#: cps/templates/admin.html:145 +msgid "Do you really want to restart Calibre-Web?" +msgstr "" + +#: cps/templates/admin.html:150 cps/templates/admin.html:164 +#: cps/templates/admin.html:184 cps/templates/shelf.html:63 +msgid "Ok" +msgstr "" + +#: cps/templates/admin.html:151 cps/templates/admin.html:165 +#: cps/templates/book_edit.html:178 cps/templates/book_edit.html:200 +#: cps/templates/config_edit.html:212 cps/templates/config_view_edit.html:168 +#: cps/templates/email_edit.html:40 cps/templates/email_edit.html:75 +#: cps/templates/shelf.html:64 cps/templates/shelf_edit.html:19 +#: cps/templates/shelf_order.html:12 cps/templates/user_edit.html:155 +msgid "Back" +msgstr "" + +#: cps/templates/admin.html:163 +msgid "Do you really want to stop Calibre-Web?" +msgstr "" + +#: cps/templates/admin.html:175 +msgid "Updating, please do not reload page" +msgstr "" + +#: cps/templates/author.html:15 +msgid "via" +msgstr "" + +#: cps/templates/author.html:23 +msgid "In Library" +msgstr "" + +#: cps/templates/author.html:71 +msgid "More by" +msgstr "" + +#: cps/templates/book_edit.html:16 +msgid "Delete Book" +msgstr "" + +#: cps/templates/book_edit.html:19 +msgid "Delete formats:" +msgstr "" + +#: cps/templates/book_edit.html:22 cps/templates/book_edit.html:199 +#: cps/templates/email_edit.html:73 cps/templates/email_edit.html:74 +msgid "Delete" +msgstr "" + +#: cps/templates/book_edit.html:30 +msgid "Convert book format:" +msgstr "" + +#: cps/templates/book_edit.html:34 +msgid "Convert from:" +msgstr "" + +#: cps/templates/book_edit.html:36 cps/templates/book_edit.html:43 +msgid "select an option" +msgstr "" + +#: cps/templates/book_edit.html:41 +msgid "Convert to:" +msgstr "" + +#: cps/templates/book_edit.html:50 +msgid "Convert book" +msgstr "" + +#: cps/templates/book_edit.html:59 cps/templates/search_form.html:6 +msgid "Book Title" +msgstr "" + +#: cps/templates/book_edit.html:63 cps/templates/book_edit.html:259 +#: cps/templates/book_edit.html:277 cps/templates/search_form.html:10 +msgid "Author" +msgstr "" + +#: cps/templates/book_edit.html:67 cps/templates/book_edit.html:264 +#: cps/templates/book_edit.html:279 cps/templates/search_form.html:106 +msgid "Description" +msgstr "" + +#: cps/templates/book_edit.html:71 cps/templates/search_form.html:33 +msgid "Tags" +msgstr "" + +#: cps/templates/book_edit.html:75 cps/templates/layout.html:157 +#: cps/templates/search_form.html:53 +msgid "Series" +msgstr "" + +#: cps/templates/book_edit.html:79 +msgid "Series id" +msgstr "" + +#: cps/templates/book_edit.html:83 +msgid "Rating" +msgstr "" + +#: cps/templates/book_edit.html:87 +msgid "Cover URL (jpg, cover is downloaded and stored in database, field is afterwards empty again)" +msgstr "" + +#: cps/templates/book_edit.html:91 +msgid "Upload Cover from local drive" +msgstr "" + +#: cps/templates/book_edit.html:96 cps/templates/detail.html:147 +msgid "Publishing date" +msgstr "" + +#: cps/templates/book_edit.html:103 cps/templates/book_edit.html:261 +#: cps/templates/book_edit.html:278 cps/templates/detail.html:139 +#: cps/templates/search_form.html:14 +msgid "Publisher" +msgstr "" + +#: cps/templates/book_edit.html:107 cps/templates/user_edit.html:31 +msgid "Language" +msgstr "" + +#: cps/templates/book_edit.html:117 cps/templates/search_form.html:117 +msgid "Yes" +msgstr "" + +#: cps/templates/book_edit.html:118 cps/templates/search_form.html:118 +msgid "No" +msgstr "" + +#: cps/templates/book_edit.html:164 +msgid "Upload format" +msgstr "" + +#: cps/templates/book_edit.html:173 +msgid "view book after edit" +msgstr "" + +#: cps/templates/book_edit.html:176 cps/templates/book_edit.html:212 +msgid "Get metadata" +msgstr "" + +#: cps/templates/book_edit.html:177 cps/templates/config_edit.html:210 +#: cps/templates/config_view_edit.html:167 cps/templates/login.html:20 +#: cps/templates/search_form.html:153 cps/templates/shelf_edit.html:17 +#: cps/templates/user_edit.html:153 +msgid "Submit" +msgstr "" + +#: cps/templates/book_edit.html:191 +msgid "Are you really sure?" +msgstr "" + +#: cps/templates/book_edit.html:194 +msgid "Book will be deleted from Calibre database" +msgstr "" + +#: cps/templates/book_edit.html:195 +msgid "and from hard disk" +msgstr "" + +#: cps/templates/book_edit.html:215 +msgid "Keyword" +msgstr "" + +#: cps/templates/book_edit.html:216 +msgid " Search keyword " +msgstr "" + +#: cps/templates/book_edit.html:218 cps/templates/layout.html:46 +msgid "Go!" +msgstr "" + +#: cps/templates/book_edit.html:222 +msgid "Click the cover to load metadata to the form" +msgstr "" + +#: cps/templates/book_edit.html:234 cps/templates/book_edit.html:274 +msgid "Loading..." +msgstr "" + +#: cps/templates/book_edit.html:239 cps/templates/layout.html:224 +msgid "Close" +msgstr "" + +#: cps/templates/book_edit.html:266 cps/templates/book_edit.html:280 +msgid "Source" +msgstr "" + +#: cps/templates/book_edit.html:275 +msgid "Search error!" +msgstr "" + +#: cps/templates/book_edit.html:276 +msgid "No Result(s) found! Please try aonther keyword." +msgstr "" + +#: cps/templates/config_edit.html:12 +msgid "Library Configuration" +msgstr "" + +#: cps/templates/config_edit.html:19 +msgid "Location of Calibre database" +msgstr "" + +#: cps/templates/config_edit.html:24 +msgid "Use Google Drive?" +msgstr "" + +#: cps/templates/config_edit.html:30 +msgid "Google Drive config problem" +msgstr "" + +#: cps/templates/config_edit.html:36 +msgid "Authenticate Google Drive" +msgstr "" + +#: cps/templates/config_edit.html:40 +msgid "Please finish Google Drive setup after login" +msgstr "" + +#: cps/templates/config_edit.html:44 +msgid "Google Drive Calibre folder" +msgstr "" + +#: cps/templates/config_edit.html:52 +msgid "Metadata Watch Channel ID" +msgstr "" + +#: cps/templates/config_edit.html:55 +msgid "Revoke" +msgstr "" + +#: cps/templates/config_edit.html:73 +msgid "Server Configuration" +msgstr "" + +#: cps/templates/config_edit.html:80 +msgid "Server Port" +msgstr "" + +#: cps/templates/config_edit.html:84 +msgid "SSL certfile location (leave it empty for non-SSL Servers)" +msgstr "" + +#: cps/templates/config_edit.html:88 +msgid "SSL Keyfile location (leave it empty for non-SSL Servers)" +msgstr "" + +#: cps/templates/config_edit.html:99 +msgid "Logfile Configuration" +msgstr "" + +#: cps/templates/config_edit.html:106 +msgid "Log Level" +msgstr "" + +#: cps/templates/config_edit.html:115 +msgid "Location and name of logfile (calibre-web.log for no entry)" +msgstr "" + +#: cps/templates/config_edit.html:126 +msgid "Feature Configuration" +msgstr "" + +#: cps/templates/config_edit.html:134 +msgid "Enable uploading" +msgstr "" + +#: cps/templates/config_edit.html:138 +msgid "Enable anonymous browsing" +msgstr "" + +#: cps/templates/config_edit.html:142 +msgid "Enable public registration" +msgstr "" + +#: cps/templates/config_edit.html:146 +msgid "Enable remote login (\"magic link\")" +msgstr "" + +#: cps/templates/config_edit.html:151 +msgid "Use" +msgstr "" + +#: cps/templates/config_edit.html:152 +msgid "Obtain an API Key" +msgstr "" + +#: cps/templates/config_edit.html:156 +msgid "Goodreads API Key" +msgstr "" + +#: cps/templates/config_edit.html:160 +msgid "Goodreads API Secret" +msgstr "" + +#: cps/templates/config_edit.html:173 +msgid "External binaries" +msgstr "" + +#: cps/templates/config_edit.html:181 +msgid "No converter" +msgstr "" + +#: cps/templates/config_edit.html:183 +msgid "Use Kindlegen" +msgstr "" + +#: cps/templates/config_edit.html:185 +msgid "Use calibre's ebook converter" +msgstr "" + +#: cps/templates/config_edit.html:189 +msgid "E-Book converter settings" +msgstr "" + +#: cps/templates/config_edit.html:193 +msgid "Path to convertertool" +msgstr "" + +#: cps/templates/config_edit.html:199 +msgid "Location of Unrar binary" +msgstr "" + +#: cps/templates/config_edit.html:215 cps/templates/layout.html:82 +#: cps/templates/login.html:4 +msgid "Login" +msgstr "" + +#: cps/templates/config_view_edit.html:12 +msgid "View Configuration" +msgstr "" + +#: cps/templates/config_view_edit.html:19 cps/templates/layout.html:133 +#: cps/templates/layout.html:134 cps/templates/shelf_edit.html:7 +msgid "Title" +msgstr "" + +#: cps/templates/config_view_edit.html:27 +msgid "No. of random books to show" +msgstr "" + +#: cps/templates/config_view_edit.html:31 +msgid "Regular expression for ignoring columns" +msgstr "" + +#: cps/templates/config_view_edit.html:35 +msgid "Link read/unread status to Calibre column" +msgstr "" + +#: cps/templates/config_view_edit.html:44 +msgid "Regular expression for title sorting" +msgstr "" + +#: cps/templates/config_view_edit.html:48 +msgid "Tags for Mature Content" +msgstr "" + +#: cps/templates/config_view_edit.html:62 +msgid "Default settings for new users" +msgstr "" + +#: cps/templates/config_view_edit.html:70 cps/templates/user_edit.html:110 +msgid "Admin user" +msgstr "" + +#: cps/templates/config_view_edit.html:74 cps/templates/user_edit.html:119 +msgid "Allow Downloads" +msgstr "" + +#: cps/templates/config_view_edit.html:78 cps/templates/user_edit.html:123 +msgid "Allow Uploads" +msgstr "" + +#: cps/templates/config_view_edit.html:82 cps/templates/user_edit.html:127 +msgid "Allow Edit" +msgstr "" + +#: cps/templates/config_view_edit.html:86 cps/templates/user_edit.html:131 +msgid "Allow Delete books" +msgstr "" + +#: cps/templates/config_view_edit.html:90 cps/templates/user_edit.html:136 +msgid "Allow Changing Password" +msgstr "" + +#: cps/templates/config_view_edit.html:94 cps/templates/user_edit.html:140 +msgid "Allow Editing Public Shelfs" +msgstr "" + +#: cps/templates/config_view_edit.html:104 +msgid "Default visibilities for new users" +msgstr "" + +#: cps/templates/config_view_edit.html:112 cps/templates/user_edit.html:58 +msgid "Show random books" +msgstr "" + +#: cps/templates/config_view_edit.html:116 cps/templates/user_edit.html:62 +msgid "Show recent books" +msgstr "" + +#: cps/templates/config_view_edit.html:120 cps/templates/user_edit.html:66 +msgid "Show sorted books" +msgstr "" + +#: cps/templates/config_view_edit.html:124 cps/templates/user_edit.html:70 +msgid "Show hot books" +msgstr "" + +#: cps/templates/config_view_edit.html:128 cps/templates/user_edit.html:74 +msgid "Show best rated books" +msgstr "" + +#: cps/templates/config_view_edit.html:132 cps/templates/user_edit.html:78 +msgid "Show language selection" +msgstr "" + +#: cps/templates/config_view_edit.html:136 cps/templates/user_edit.html:82 +msgid "Show series selection" +msgstr "" + +#: cps/templates/config_view_edit.html:140 cps/templates/user_edit.html:86 +msgid "Show category selection" +msgstr "" + +#: cps/templates/config_view_edit.html:144 cps/templates/user_edit.html:90 +msgid "Show author selection" +msgstr "" + +#: cps/templates/config_view_edit.html:148 cps/templates/user_edit.html:94 +msgid "Show publisher selection" +msgstr "" + +#: cps/templates/config_view_edit.html:152 cps/templates/user_edit.html:98 +msgid "Show read and unread" +msgstr "" + +#: cps/templates/config_view_edit.html:156 cps/templates/user_edit.html:102 +msgid "Show random books in detail view" +msgstr "" + +#: cps/templates/config_view_edit.html:160 cps/templates/user_edit.html:115 +msgid "Show mature content" +msgstr "" + +#: cps/templates/detail.html:63 +msgid "Read in browser" +msgstr "" + +#: cps/templates/detail.html:100 +msgid "Book" +msgstr "" + +#: cps/templates/detail.html:100 +msgid "of" +msgstr "" + +#: cps/templates/detail.html:106 +msgid "language" +msgstr "" + +#: cps/templates/detail.html:184 +msgid "Read" +msgstr "" + +#: cps/templates/detail.html:194 +msgid "Description:" +msgstr "" + +#: cps/templates/detail.html:207 cps/templates/search.html:14 +msgid "Add to shelf" +msgstr "" + +#: cps/templates/detail.html:269 +msgid "Edit metadata" +msgstr "" + +#: cps/templates/email_edit.html:15 +msgid "SMTP port (usually 25 for plain SMTP and 465 for SSL and 587 for STARTTLS)" +msgstr "" + +#: cps/templates/email_edit.html:19 +msgid "Encryption" +msgstr "" + +#: cps/templates/email_edit.html:21 +msgid "None" +msgstr "" + +#: cps/templates/email_edit.html:22 +msgid "STARTTLS" +msgstr "" + +#: cps/templates/email_edit.html:23 +msgid "SSL/TLS" +msgstr "" + +#: cps/templates/email_edit.html:31 +msgid "SMTP password" +msgstr "" + +#: cps/templates/email_edit.html:35 +msgid "From e-mail" +msgstr "" + +#: cps/templates/email_edit.html:38 +msgid "Save settings" +msgstr "" + +#: cps/templates/email_edit.html:39 +msgid "Save settings and send Test E-Mail" +msgstr "" + +#: cps/templates/email_edit.html:43 +msgid "Allowed domains for registering" +msgstr "" + +#: cps/templates/email_edit.html:47 +msgid "Enter domainname" +msgstr "" + +#: cps/templates/email_edit.html:55 +msgid "Add Domain" +msgstr "" + +#: cps/templates/email_edit.html:58 +msgid "Add" +msgstr "" + +#: cps/templates/email_edit.html:72 +msgid "Do you really want to delete this domain rule?" +msgstr "" + +#: cps/templates/feed.xml:21 cps/templates/layout.html:208 +msgid "Next" +msgstr "" + +#: cps/templates/feed.xml:33 cps/templates/index.xml:11 +#: cps/templates/layout.html:43 cps/templates/layout.html:44 +msgid "Search" +msgstr "" + +#: cps/templates/http_error.html:23 +msgid "Back to home" +msgstr "" + +#: cps/templates/index.html:5 +msgid "Discover (Random Books)" +msgstr "" + +#: cps/templates/index.xml:6 +msgid "Start" +msgstr "" + +#: cps/templates/index.xml:18 cps/templates/layout.html:139 +msgid "Hot Books" +msgstr "" + +#: cps/templates/index.xml:22 +msgid "Popular publications from this catalog based on Downloads." +msgstr "" + +#: cps/templates/index.xml:25 cps/templates/layout.html:142 +msgid "Best rated Books" +msgstr "" + +#: cps/templates/index.xml:29 +msgid "Popular publications from this catalog based on Rating." +msgstr "" + +#: cps/templates/index.xml:32 +msgid "New Books" +msgstr "" + +#: cps/templates/index.xml:36 +msgid "The latest Books" +msgstr "" + +#: cps/templates/index.xml:43 +msgid "Show Random Books" +msgstr "" + +#: cps/templates/index.xml:62 cps/templates/layout.html:160 +msgid "Authors" +msgstr "" + +#: cps/templates/index.xml:66 +msgid "Books ordered by Author" +msgstr "" + +#: cps/templates/index.xml:69 cps/templates/layout.html:163 +msgid "Publishers" +msgstr "" + +#: cps/templates/index.xml:73 +msgid "Books ordered by publisher" +msgstr "" + +#: cps/templates/index.xml:80 +msgid "Books ordered by category" +msgstr "" + +#: cps/templates/index.xml:87 +msgid "Books ordered by series" +msgstr "" + +#: cps/templates/index.xml:90 cps/templates/layout.html:169 +msgid "Public Shelves" +msgstr "" + +#: cps/templates/index.xml:94 +msgid "Books organized in public shelfs, visible to everyone" +msgstr "" + +#: cps/templates/index.xml:98 cps/templates/layout.html:173 +msgid "Your Shelves" +msgstr "" + +#: cps/templates/index.xml:102 +msgid "User's own shelfs, only visible to the current user himself" +msgstr "" + +#: cps/templates/layout.html:33 +msgid "Toggle navigation" +msgstr "" + +#: cps/templates/layout.html:54 +msgid "Advanced Search" +msgstr "" + +#: cps/templates/layout.html:78 +msgid "Logout" +msgstr "" + +#: cps/templates/layout.html:83 cps/templates/register.html:14 +msgid "Register" +msgstr "" + +#: cps/templates/layout.html:108 +msgid "Uploading..." +msgstr "" + +#: cps/templates/layout.html:109 +msgid "please don't refresh the page" +msgstr "" + +#: cps/templates/layout.html:120 +msgid "Browse" +msgstr "" + +#: cps/templates/layout.html:122 +msgid "Recently Added" +msgstr "" + +#: cps/templates/layout.html:127 +msgid "Sorted Books" +msgstr "" + +#: cps/templates/layout.html:131 cps/templates/layout.html:132 +#: cps/templates/layout.html:133 cps/templates/layout.html:134 +msgid "Sort By" +msgstr "" + +#: cps/templates/layout.html:131 +msgid "Newest" +msgstr "" + +#: cps/templates/layout.html:132 +msgid "Oldest" +msgstr "" + +#: cps/templates/layout.html:133 +msgid "Ascending" +msgstr "" + +#: cps/templates/layout.html:134 +msgid "Descending" +msgstr "" + +#: cps/templates/layout.html:151 +msgid "Discover" +msgstr "" + +#: cps/templates/layout.html:154 +msgid "Categories" +msgstr "" + +#: cps/templates/layout.html:166 cps/templates/search_form.html:74 +msgid "Languages" +msgstr "" + +#: cps/templates/layout.html:178 +msgid "Create a Shelf" +msgstr "" + +#: cps/templates/layout.html:179 cps/templates/stats.html:3 +msgid "About" +msgstr "" + +#: cps/templates/layout.html:193 +msgid "Previous" +msgstr "" + +#: cps/templates/layout.html:220 +msgid "Book Details" +msgstr "" + +#: cps/templates/login.html:8 cps/templates/login.html:9 +#: cps/templates/register.html:7 cps/templates/user_edit.html:8 +msgid "Username" +msgstr "" + +#: cps/templates/login.html:12 cps/templates/login.html:13 +#: cps/templates/user_edit.html:21 +msgid "Password" +msgstr "" + +#: cps/templates/login.html:17 +msgid "Remember me" +msgstr "" + +#: cps/templates/login.html:22 +msgid "Log in with magic link" +msgstr "" + +#: cps/templates/osd.xml:5 +msgid "Calibre-Web ebook catalog" +msgstr "" + +#: cps/templates/read.html:69 cps/templates/readcbr.html:79 +#: cps/templates/readcbr.html:103 +msgid "Settings" +msgstr "" + +#: cps/templates/read.html:72 +msgid "Reflow text when sidebars are open." +msgstr "" + +#: cps/templates/readcbr.html:84 +msgid "Keyboard Shortcuts" +msgstr "" + +#: cps/templates/readcbr.html:87 +msgid "Previous Page" +msgstr "" + +#: cps/templates/readcbr.html:88 +msgid "Next Page" +msgstr "" + +#: cps/templates/readcbr.html:89 +msgid "Scale to Best" +msgstr "" + +#: cps/templates/readcbr.html:90 +msgid "Scale to Width" +msgstr "" + +#: cps/templates/readcbr.html:91 +msgid "Scale to Height" +msgstr "" + +#: cps/templates/readcbr.html:92 +msgid "Scale to Native" +msgstr "" + +#: cps/templates/readcbr.html:93 +msgid "Rotate Right" +msgstr "" + +#: cps/templates/readcbr.html:94 +msgid "Rotate Left" +msgstr "" + +#: cps/templates/readcbr.html:95 +msgid "Flip Image" +msgstr "" + +#: cps/templates/readcbr.html:108 cps/templates/user_edit.html:39 +msgid "Theme" +msgstr "" + +#: cps/templates/readcbr.html:111 +msgid "Light" +msgstr "" + +#: cps/templates/readcbr.html:112 +msgid "Dark" +msgstr "" + +#: cps/templates/readcbr.html:117 +msgid "Scale" +msgstr "" + +#: cps/templates/readcbr.html:120 +msgid "Best" +msgstr "" + +#: cps/templates/readcbr.html:121 +msgid "Width" +msgstr "" + +#: cps/templates/readcbr.html:122 +msgid "Height" +msgstr "" + +#: cps/templates/readcbr.html:123 +msgid "Native" +msgstr "" + +#: cps/templates/readcbr.html:128 +msgid "Rotate" +msgstr "" + +#: cps/templates/readcbr.html:139 +msgid "Flip" +msgstr "" + +#: cps/templates/readcbr.html:142 +msgid "Horizontal" +msgstr "" + +#: cps/templates/readcbr.html:143 +msgid "Vertical" +msgstr "" + +#: cps/templates/readpdf.html:29 +msgid "PDF.js viewer" +msgstr "" + +#: cps/templates/readtxt.html:6 +msgid "Basic txt Reader" +msgstr "" + +#: cps/templates/register.html:4 +msgid "Register a new account" +msgstr "" + +#: cps/templates/register.html:8 +msgid "Choose a username" +msgstr "" + +#: cps/templates/register.html:11 cps/templates/user_edit.html:13 +msgid "E-mail address" +msgstr "" + +#: cps/templates/register.html:12 +msgid "Your email address" +msgstr "" + +#: cps/templates/remote_login.html:6 +msgid "Using your another device, visit" +msgstr "" + +#: cps/templates/remote_login.html:6 +msgid "and log in" +msgstr "" + +#: cps/templates/remote_login.html:9 +msgid "Once you do so, you will automatically get logged in on this device." +msgstr "" + +#: cps/templates/search.html:5 +msgid "No Results for:" +msgstr "" + +#: cps/templates/search.html:6 +msgid "Please try a different search" +msgstr "" + +#: cps/templates/search.html:8 +msgid "Results for:" +msgstr "" + +#: cps/templates/search_form.html:19 +msgid "Publishing date from" +msgstr "" + +#: cps/templates/search_form.html:26 +msgid "Publishing date to" +msgstr "" + +#: cps/templates/search_form.html:43 +msgid "Exclude Tags" +msgstr "" + +#: cps/templates/search_form.html:63 +msgid "Exclude Series" +msgstr "" + +#: cps/templates/search_form.html:84 +msgid "Exclude Languages" +msgstr "" + +#: cps/templates/search_form.html:97 +msgid "Rating bigger than" +msgstr "" + +#: cps/templates/search_form.html:101 +msgid "Rating less than" +msgstr "" + +#: cps/templates/shelf.html:7 +msgid "Delete this Shelf" +msgstr "" + +#: cps/templates/shelf.html:8 +msgid "Edit Shelf" +msgstr "" + +#: cps/templates/shelf.html:9 cps/templates/shelf_order.html:11 +msgid "Change order" +msgstr "" + +#: cps/templates/shelf.html:58 +msgid "Do you really want to delete the shelf?" +msgstr "" + +#: cps/templates/shelf.html:61 +msgid "Shelf will be lost for everybody and forever!" +msgstr "" + +#: cps/templates/shelf_edit.html:13 +msgid "should the shelf be public?" +msgstr "" + +#: cps/templates/shelf_order.html:5 +msgid "Drag 'n drop to rearrange order" +msgstr "" + +#: cps/templates/stats.html:7 +msgid "Calibre library statistics" +msgstr "" + +#: cps/templates/stats.html:12 +msgid "Books in this Library" +msgstr "" + +#: cps/templates/stats.html:16 +msgid "Authors in this Library" +msgstr "" + +#: cps/templates/stats.html:20 +msgid "Categories in this Library" +msgstr "" + +#: cps/templates/stats.html:24 +msgid "Series in this Library" +msgstr "" + +#: cps/templates/stats.html:28 +msgid "Linked libraries" +msgstr "" + +#: cps/templates/stats.html:32 +msgid "Program library" +msgstr "" + +#: cps/templates/stats.html:33 +msgid "Installed Version" +msgstr "" + +#: cps/templates/tasks.html:7 +msgid "Tasks list" +msgstr "" + +#: cps/templates/tasks.html:12 +msgid "User" +msgstr "" + +#: cps/templates/tasks.html:14 +msgid "Task" +msgstr "" + +#: cps/templates/tasks.html:15 +msgid "Status" +msgstr "" + +#: cps/templates/tasks.html:16 +msgid "Progress" +msgstr "" + +#: cps/templates/tasks.html:17 +msgid "Runtime" +msgstr "" + +#: cps/templates/tasks.html:18 +msgid "Starttime" +msgstr "" + +#: cps/templates/tasks.html:24 +msgid "Delete finished tasks" +msgstr "" + +#: cps/templates/tasks.html:25 +msgid "Hide all tasks" +msgstr "" + +#: cps/templates/user_edit.html:18 +msgid "Reset user Password" +msgstr "" + +#: cps/templates/user_edit.html:27 +msgid "Kindle E-Mail" +msgstr "" + +#: cps/templates/user_edit.html:41 +msgid "Standard Theme" +msgstr "" + +#: cps/templates/user_edit.html:42 +msgid "caliBlur! Dark Theme (Beta)" +msgstr "" + +#: cps/templates/user_edit.html:47 +msgid "Show books with language" +msgstr "" + +#: cps/templates/user_edit.html:49 +msgid "Show all" +msgstr "" + +#: cps/templates/user_edit.html:147 +msgid "Delete this user" +msgstr "" + +#: cps/templates/user_edit.html:162 +msgid "Recent Downloads" +msgstr "" + diff --git a/src/optional-requirements.txt b/src/optional-requirements.txt new file mode 100644 index 0000000..154612b --- /dev/null +++ b/src/optional-requirements.txt @@ -0,0 +1,20 @@ +# GDrive Integration +google-api-python-client==1.6.1 +gevent==1.2.1 +greenlet==0.4.12 +httplib2==0.9.2 +oauth2client==4.0.0 +uritemplate==3.0.0 +pyasn1-modules==0.0.8 +pyasn1==0.1.9 +PyDrive==1.3.1 +PyYAML==3.12 +rsa==3.4.2 +six==1.10.0 +# goodreads +goodreads>=0.3.2 +python-Levenshtein>=0.12.0 +# other +lxml>=3.8.0 +rarfile>=2.7 +natsort>=2.2.0 diff --git a/src/readme.md b/src/readme.md new file mode 100755 index 0000000..4539cd4 --- /dev/null +++ b/src/readme.md @@ -0,0 +1,215 @@ +# About + +Calibre-Web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing [Calibre](https://calibre-ebook.com) database. + +*This software is a fork of [library](https://github.com/mutschler/calibreserver) and licensed under the GPL v3 License.* + +![screenshot](https://raw.githubusercontent.com/janeczku/docker-calibre-web/master/screenshot.png) + +## Features + +- Bootstrap 3 HTML5 interface +- full graphical setup +- User management with fine grained per-user permissions +- Admin interface +- User Interface in dutch, english, french, german, hungarian, italian, japanese, khmer, polish, russian, simplified chinese, spanish, swedish +- OPDS feed for eBook reader apps +- Filter and search by titles, authors, tags, series and language +- Create custom book collection (shelves) +- Support for editing eBook metadata and deleting eBooks from Calibre library +- Support for converting eBooks from EPUB to Kindle format (mobi/azw) +- Restrict eBook download to logged-in users +- Support for public user registration +- Send eBooks to Kindle devices with the click of a button +- Support for reading eBooks directly in the browser (.txt, .epub, .pdf, .cbr, .cbt, .cbz) +- Upload new books in PDF, epub, fb2 format +- Support for Calibre custom columns +- Ability to hide content based on categories for certain users +- Self update capability +- "Magic Link" login to make it easy to log on eReaders + +## Quick start + +1. Install dependencies by running `pip install --target vendor -r requirements.txt`. +2. Execute the command: `python cps.py` (or `nohup python cps.py` - recommended if you want to exit the terminal window) +3. Point your browser to `http://localhost:8083` or `http://localhost:8083/opds` for the OPDS catalog +4. Set `Location of Calibre database` to the path of the folder where your Calibre library (metadata.db) lives, push "submit" button + optionally a google drive can be used to host the calibre library (-> Using Google Drive integration) +5. Go to Login page + +**Default admin login:** +*Username:* admin +*Password:* admin123 + +**Issues with Ubuntu:** +Please note that running the above install command can fail on some versions of Ubuntu, saying `"can't combine user with prefix"`. This is a [known bug](https://github.com/pypa/pip/issues/3826) and can be remedied by using the command `pip install --system --target vendor -r requirements.txt` instead. + +## Runtime Configuration Options + +The configuration can be changed as admin in the admin panel under "Configuration" + +Server Port: +Changes the port Calibre-Web is listening, changes take effect after pressing submit button + +Enable public registration: +Tick to enable public user registration. + +Enable anonymous browsing: +Tick to allow not logged in users to browse the catalog, anonymous user permissions can be set as admin ("Guest" user) + +Enable uploading: +Tick to enable uploading of PDF, epub, FB2. This requires the imagemagick library to be installed. + +Enable remote login ("magic link"): +Tick to enable remote login, i.e. a link that allows user to log in via a different device. + +## Requirements + +Python 2.7+ + +Optionally, to enable on-the-fly conversion from EPUB to MOBI when using the send-to-kindle feature: + +[Download](http://www.amazon.com/gp/feature.html?docId=1000765211) Amazon's KindleGen tool for your platform and place the binary named as `kindlegen` in the `vendor` folder. + +## Using Google Drive integration + +Calibre Calibre library (metadata.db) can be located on a Google Drive. Additional optional dependencys are necessary to get this work. Please install all optional requirements by executing `pip install --target vendor -r optional-requirements.txt` + +To use google drive integration, you have to use the google developer console to create a new app. https://console.developers.google.com + +Once a project has been created, we need to create a client ID and a client secret that will be used to enable the OAuth request with google, and enable the Drive API. To do this, follow the steps below: - + +1. Open project in developer console +2. Click Enable API, and enable google drive +3. Now on the sidebar, click Credentials +4. Click Create Credentials and OAuth Client ID +5. Select Web Application and then next +6. Give the Credentials a name and enter your callback, which will be CALIBRE_WEB_URL/gdrive/callback +7. Click save +8. Download json file and place it in `calibre-web` directory, with the name `client_secrets.json` + +The Drive API should now be setup and ready to use, so we need to integrate it into Calibre-Web. This is done as below: - + +1. Open config page +2. Enter the location that will be used to store the metadata.db file locally, and to temporary store uploaded books and other temporary files for upload ("Location of Calibre database") +2. Tick Use Google Drive +3. Click the "Submit" button +4. Now select Authenticate Google Drive +5. This should redirect you to Google. After allowing it to use your Drive, it redirects you back to the config page +6. Select the folder that is the root of your calibre library on Gdrive ("Google drive Calibre folder") +7. Click the "Submit" button +8. Google Drive should now be connected and be used to get images and download Epubs. The metadata.db is stored in the calibre library location + +### Optional +If your Calibre-Web is using https, it is possible to add a "watch" to the drive. This will inform us if the metadata.db file is updated and allow us to update our calibre library accordingly. +Additionally the public adress your server uses (e.g.https://example.com) has to be verified in the Google developer console. After this is done, please wait a few minutes. + +9. Open config page +10. Click enable watch of metadata.db +11. Note that this expires after a week, so will need to be manually refresh + +## Docker images + +Pre-built Docker images based on Alpine Linux are available in these Docker Hub repositories: + +**x64** ++ **technosoft2000** at [technosoft2000/calibre-web](https://hub.docker.com/r/technosoft2000/calibre-web/) ++ **linuxserver.io** at [linuxserver/calibre-web](https://hub.docker.com/r/linuxserver/calibre-web/) + +**armhf** ++ **linuxserver.io** at [lsioarmhf/calibre-web](https://hub.docker.com/r/lsioarmhf/calibre-web/) + +**aarch64** ++ **linuxserver.io** at [lsioarmhf/calibre-web-aarch64](https://hub.docker.com/r/lsioarmhf/calibre-web-aarch64) + +## Reverse Proxy + +Reverse proxy configuration examples for apache and nginx to use Calibre-Web: + +nginx configuration for a local server listening on port 8080, mapping Calibre-Web to /calibre: + +``` +http { + upstream calibre { + server 127.0.0.1:8083; + } + server { + client_max_body_size 20M; + location /calibre { + proxy_bind $server_adress; + proxy_pass http://127.0.0.1:8083; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Scheme $scheme; + proxy_set_header X-Script-Name /calibre; + } + } +} +``` +*Note: If using SSL in your reverse proxy on a non-standard port (e.g.12345), the following proxy_redirect line may be required:* +``` +proxy_redirect http://$host/ https://$host:12345/; +``` + +Apache 2.4 configuration for a local server listening on port 443, mapping Calibre-Web to /calibre-web: + +The following modules have to be activated: headers, proxy, rewrite. +``` +Listen 443 + + + SSLEngine on + SSLProxyEngine on + SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL + SSLCertificateFile "C:\Apache24\conf\ssl\test.crt" + SSLCertificateKeyFile "C:\Apache24\conf\ssl\test.key" + + + RequestHeader set X-SCRIPT-NAME /calibre-web + RequestHeader set X-SCHEME https + ProxyPass http://localhost:8083/ + ProxyPassReverse http://localhost:8083/ + + +``` + +## (Optional) SSL Configuration + +For configuration of calibre-web as SSL Server go to the Config page in the Admin section. Enter the certfile- and keyfile-location, optionally change port to 443 and press submit. +Afterwards the server can only be accessed via SSL. In case of a misconfiguration (wrong/invalid files) both files can be overridden via command line options +-c [certfile location] -k [keyfile location] +By using "" as file locations the server runs as non SSL server again. The correct file path can than be entered on the Config page. After the next restart without command line options the changed file paths are applied. + + +## Start Calibre-Web as service under Linux + +Create a file "cps.service" as root in the folder /etc/systemd/system with the following content: + +```[Unit] +Description=Calibre-Web + +[Service] +Type=simple +User=[Username] +ExecStart=[path to python] [/PATH/TO/cps.py] +WorkingDirectory=[/PATH/TO/cps.py] + +[Install] +WantedBy=multi-user.target +``` + +Replace the user and ExecStart with your user and foldernames. + +`sudo systemctl enable cps.service` + +enables the service. + +## Command line options + +Starting the script with `-h` lists all supported command line options +Currently supported are 2 options, which are both useful for running multiple instances of Calibre-Web + +`"-p path"` allows to specify the location of the settings database +`"-g path"` allows to specify the location of the google-drive database +`"-c path"` allows to specify the location of SSL certfile, works only in combination with keyfile +`"-k path"` allows to specify the location of SSL keyfile, works only in combination with certfile diff --git a/src/requirements.txt b/src/requirements.txt new file mode 100644 index 0000000..3fb23ea --- /dev/null +++ b/src/requirements.txt @@ -0,0 +1,15 @@ +Babel>=1.3 +Flask-Babel>=0.11.1 +Flask-Login>=0.3.2 +Flask-Principal>=0.3.2 +singledispatch>=3.4.0.0 +backports_abc>=0.4 +Flask>=0.11 +iso-639>=0.4.5 +PyPDF2==1.26.0 +pytz>=2016.10 +requests>=2.11.1 +SQLAlchemy>=1.1.0 +tornado>=4.1 +Wand>=0.4.4 +unidecode>=0.04.19 diff --git a/src/test b/src/test deleted file mode 100644 index c0ae62c..0000000 --- a/src/test +++ /dev/null @@ -1 +0,0 @@ -#test \ No newline at end of file diff --git a/src/test/Calibre-Web TestSummary.html b/src/test/Calibre-Web TestSummary.html new file mode 100644 index 0000000..2feb61b --- /dev/null +++ b/src/test/Calibre-Web TestSummary.html @@ -0,0 +1,2232 @@ + + + + + + + Test Report + + + + + + + + + + + + + + + + + + + + +
      +
      +

      Test Report

      +
      + +
      +
      +

      Start Time: 2018-11-25 12:57:57.569980

      + +
      +
      +

      Stop Time: 2018-11-25 13:16:06.314449

      + +
      +
      +

      Duration: 0:18:08.744469

      + +
      +
      + +
      +
      + +
      +
      + +
      +
      All Calibre-Web tests
      +
      + + +
      +
      + + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Test Group/Test caseCountPassFailErrorSkipView
      test_shelf.test_shelf76100 + Detail +
      +
      test_delete_book_of_shelf
      +
      PASS
      +
      test_private_shelf
      +
      PASS
      +
      test_public_private_shelf
      +
      PASS
      +
      test_public_shelf
      +
      PASS
      +
      test_rename_shelf
      +
      PASS
      +
      test_shelf_database_change
      +
      +
      + FAIL +
      + + + +
      +
      test_shelf_long_name
      +
      PASS
      test_logging.test_logging43100 + Detail +
      +
      test_debug_log
      +
      PASS
      +
      test_failed_login
      +
      PASS
      +
      test_logfile_change
      +
      PASS
      +
      test_logfile_recover
      +
      +
      + FAIL +
      + + + +
      test_visiblilitys.calibre_web_visibilitys1717000 + Detail +
      +
      test_about
      +
      PASS
      +
      test_admin_SMTP_Settings
      +
      PASS
      +
      test_admin_add_user
      +
      PASS
      +
      test_admin_change_password
      +
      PASS
      +
      test_admin_change_visibility_authors
      +
      PASS
      +
      test_admin_change_visibility_category
      +
      PASS
      +
      test_admin_change_visibility_hot
      +
      PASS
      +
      test_admin_change_visibility_language
      +
      PASS
      +
      test_admin_change_visibility_publisher
      +
      PASS
      +
      test_admin_change_visibility_rated
      +
      PASS
      +
      test_admin_change_visibility_read
      +
      PASS
      +
      test_admin_change_visibility_series
      +
      PASS
      +
      test_admin_change_visibility_sorted
      +
      PASS
      +
      test_checked_logged_in
      +
      PASS
      +
      test_random_books_available
      +
      PASS
      +
      test_user_email_available
      +
      PASS
      +
      test_user_visibility_sidebar
      +
      PASS
      test_user_template.test_user_template1512003 + Detail +
      +
      test_author_user_template
      +
      PASS
      +
      test_best_user_template
      +
      PASS
      +
      test_category_user_template
      +
      PASS
      +
      test_detail_random_user_template
      +
      PASS
      +
      test_hot_user_template
      +
      PASS
      +
      test_language_user_template
      +
      PASS
      +
      test_limit_book_languages
      +
      +
      + SKIP +
      + + + +
      +
      test_mature_content_settings
      +
      +
      + SKIP +
      + + + +
      +
      test_publisher_user_template
      +
      PASS
      +
      test_random_user_template
      +
      PASS
      +
      test_read_user_template
      +
      PASS
      +
      test_recent_user_template
      +
      PASS
      +
      test_series_user_template
      +
      PASS
      +
      test_sorted_user_template
      +
      PASS
      +
      test_ui_language_settings
      +
      +
      + SKIP +
      + + + +
      test_anonymous.test_anonymous10001 + Detail +
      +
      test_anonymous_user
      +
      +
      + SKIP +
      + + + +
      test_edit_books.test_edit_books2232017 + Detail +
      +
      test_database_errors
      +
      +
      + SKIP +
      + + + +
      +
      test_delete_book
      +
      +
      + SKIP +
      + + + +
      +
      test_delete_format
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_author
      +
      +
      + FAIL +
      + + + +
      +
      test_edit_category
      +
      PASS
      +
      test_edit_comments
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_custom_bool
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_custom_rating
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_custom_single_select
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_custom_text
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_language
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_publisher
      +
      PASS
      +
      test_edit_publishing_date
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_rating
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_series
      +
      PASS
      +
      test_edit_title
      +
      +
      + FAIL +
      + + + +
      +
      test_typeahead_author
      +
      +
      + SKIP +
      + + + +
      +
      test_typeahead_language
      +
      +
      + SKIP +
      + + + +
      +
      test_typeahead_publisher
      +
      +
      + SKIP +
      + + + +
      +
      test_typeahead_series
      +
      +
      + SKIP +
      + + + +
      +
      test_typeahead_tag
      +
      +
      + SKIP +
      + + + +
      +
      test_upload_cover_hdd
      +
      +
      + SKIP +
      + + + +
      test_edit_books_gdrive.test_edit_books_gdrive2200022 + Detail +
      +
      test_database_errors
      +
      +
      + SKIP +
      + + + +
      +
      test_delete_book
      +
      +
      + SKIP +
      + + + +
      +
      test_delete_format
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_author
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_category
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_comments
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_custom_bool
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_custom_rating
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_custom_single_select
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_custom_text
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_language
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_publisher
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_publishing_date
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_rating
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_series
      +
      +
      + SKIP +
      + + + +
      +
      test_edit_title
      +
      +
      + SKIP +
      + + + +
      +
      test_typeahead_author
      +
      +
      + SKIP +
      + + + +
      +
      test_typeahead_language
      +
      +
      + SKIP +
      + + + +
      +
      test_typeahead_publisher
      +
      +
      + SKIP +
      + + + +
      +
      test_typeahead_series
      +
      +
      + SKIP +
      + + + +
      +
      test_typeahead_tag
      +
      +
      + SKIP +
      + + + +
      +
      test_upload_cover_hdd
      +
      +
      + SKIP +
      + + + +
      test_ebook_convert.test_ebook_convert1210011 + Detail +
      +
      test_SSL_smtp_setup_error
      +
      +
      + SKIP +
      + + + +
      +
      test_STARTTLS_smtp_setup_error
      +
      +
      + SKIP +
      + + + +
      +
      test_convert_deactivate
      +
      +
      + SKIP +
      + + + +
      +
      test_convert_email
      +
      +
      + SKIP +
      + + + +
      +
      test_convert_failed_and_email
      +
      +
      + SKIP +
      + + + +
      +
      test_convert_only
      +
      +
      + SKIP +
      + + + +
      +
      test_convert_parameter
      +
      +
      + SKIP +
      + + + +
      +
      test_convert_wrong_excecutable
      +
      PASS
      +
      test_email_failed
      +
      +
      + SKIP +
      + + + +
      +
      test_email_only
      +
      +
      + SKIP +
      + + + +
      +
      test_kindle_send_not_configured
      +
      +
      + SKIP +
      + + + +
      +
      test_smtp_setup_error
      +
      +
      + SKIP +
      + + + +
      test_login.test_login65100 + Detail +
      +
      test_login_capital_letters_user_unicode_password_passwort
      +
      PASS
      +
      test_login_delete_admin
      +
      PASS
      +
      test_login_empty_password
      +
      PASS
      +
      test_login_protected
      +
      +
      + FAIL +
      + + + +
      +
      test_login_unicode_user_space_end_passwort
      +
      PASS
      +
      test_login_user_with_space_passwort_end_space
      +
      PASS
      test_opds_feed.test_opds_feed10001 + Detail +
      +
      test_opds
      +
      +
      + SKIP +
      + + + +
      test_updater.test_updater10001 + Detail +
      +
      test_updater
      +
      +
      + SKIP +
      + + + +
      test_helper.calibre_helper1313000 + Detail +
      +
      test_author_sort
      +
      PASS
      +
      test_author_sort_comma
      +
      PASS
      +
      test_author_sort_junior
      +
      PASS
      +
      test_author_sort_oneword
      +
      PASS
      +
      test_author_sort_roman
      +
      PASS
      +
      test_check_Limit_Length
      +
      PASS
      +
      test_check_char_replacement
      +
      PASS
      +
      test_check_chinese_Characters
      +
      PASS
      +
      test_check_degEUR_replacement
      +
      PASS
      +
      test_check_doubleS
      +
      PASS
      +
      test_check_finish_Dot
      +
      PASS
      +
      test_check_high23
      +
      PASS
      +
      test_check_umlauts
      +
      PASS
      test_register.test_register40004 + Detail +
      +
      test_login_with_password
      +
      +
      + SKIP +
      + + + +
      +
      test_registering_user
      +
      +
      + SKIP +
      + + + +
      +
      test_registering_user_fail
      +
      +
      + SKIP +
      + + + +
      +
      test_resend_password
      +
      +
      + SKIP +
      + + + +
      test_cli.test_cli44000 + Detail +
      +
      test_cli_SSL_files
      +
      PASS
      +
      test_cli_different_folder
      +
      PASS
      +
      test_cli_different_settings_database
      +
      PASS
      +
      test_environ_port_setting
      +
      PASS
      Total129645060 
      + + + +
      + +
      +
      +

      Made with HTMLTestRunner2

      +
      +
      + + + diff --git a/src/test/css/runner.css b/src/test/css/runner.css new file mode 100644 index 0000000..440f87e --- /dev/null +++ b/src/test/css/runner.css @@ -0,0 +1,21 @@ +.hiddenRow { + display: none; +} + +.bg-grey { + background-color: rgba(0, 0, 0, 0.03); +} + +.table-curved { + border-radius: 20px; +} + +.buttons, .report-description { + margin: 5px; + padding: 5px; +} + +.piechart{ + text-align: center; +} + diff --git a/src/test/js/runner.js b/src/test/js/runner.js new file mode 100644 index 0000000..2ecf365 --- /dev/null +++ b/src/test/js/runner.js @@ -0,0 +1,189 @@ +output_list = Array(); + +/* Level - 0: Summary; 1: Failed; 2: All; 3: Skipped */ +function showCase(level) { + table_rows = document.getElementsByTagName("tr"); + for (var i = 0; i < table_rows.length; i++) { + row = table_rows[i]; + id = row.id; + if (id.substr(0,2) == 'ft') { + if (level < 1 || level == 3) { + row.classList.add('hiddenRow'); + } + else { + row.classList.remove('hiddenRow'); + } + } + if (id.substr(0,2) == 'pt') { + if (level > 1 && level != 3) { + row.classList.remove('hiddenRow'); + } + else { + row.classList.add('hiddenRow'); + } + } + if (id.substr(0,2) == 'st') { + if (level >=2) { + row.classList.remove('hiddenRow'); + } + else { + row.classList.add('hiddenRow'); + } + } + + + } +} + + +function showClassDetail(class_id, count) { + var testcases_list = Array(count); + var all_hidden = true; + for (var i = 0; i < count; i++) { + testcase_postfix_id = 't' + class_id.substr(1) + '.' + (i+1); + testcase_id = 'f' + testcase_postfix_id; + testcase = document.getElementById(testcase_id); + if (!testcase) { + testcase_id = 'p' + testcase_postfix_id; + testcase = document.getElementById(testcase_id); + } + if (!testcase) { + testcase_id = 's' + testcase_postfix_id; + testcase = document.getElementById(testcase_id); + } + testcases_list[i] = testcase; + if (testcase.classList.contains('hiddenRow')) { + all_hidden = false; + } + } + for (var i = 0; i < count; i++) { + testcase = testcases_list[i]; + if (!all_hidden) { + testcase.classList.remove('hiddenRow'); + } + else { + testcase.classList.add('hiddenRow'); + } + } +} + + +function showTestDetail(div_id){ + var details_div = document.getElementById(div_id) + var displayState = details_div.style.display + // alert(displayState) + if (displayState != 'block' ) { + displayState = 'block' + details_div.style.display = 'block' + } + else { + details_div.style.display = 'none' + } +} + + +function html_escape(s) { + s = s.replace(/&/g,'&'); + s = s.replace(//g,'>'); + return s; +} + +/* obsoleted by detail in
      +function showOutput(id, name) { + var w = window.open("", //url + name, + "resizable,scrollbars,status,width=800,height=450"); + d = w.document; + d.write("
      ");
      +    d.write(html_escape(output_list[id]));
      +    d.write("\n");
      +    d.write("close\n");
      +    d.write("
      \n"); + d.close(); +} +*/ +function drawCircle(pass, fail, error, skip){ + var color = ["#5cb85c","#d9534f","#c00","#f0ad4e"]; + var data = [pass,fail,error,skip]; + var text_arr = ["pass", "fail", "error","skip"]; + + var canvas = document.getElementById("circle"); + var ctx = canvas.getContext("2d"); + var startPoint=0; + var width = 20, height = 10; + var posX = 112 * 2 + 20, posY = 30; + var textX = posX + width + 5, textY = posY + 10; + for(var i=0;ilen-1){ + index=0; + clearInterval(start); //运行一轮后停止 + } + changeImg(index++); + } + imgyuan.style.width= 25*len +"px"; + //对应圆圈和图片同步 + function changeImg(index) { + var list = obj1.getElementsByTagName('img'); + var list1 = obj1.getElementsByTagName('font'); + for (i = 0; i < list.length; i++) { + list[i].style.display = 'none'; + list1[i].style.backgroundColor = 'white'; + } + list[index].style.display = 'block'; + list1[index].style.backgroundColor = 'blue'; + } + +} +function hide_img(obj){ + obj.parentElement.style.display = "none"; + obj.parentElement.getElementsByClassName('imgyuan')[0].innerHTML = ""; +} \ No newline at end of file