diff --git a/.gitignore b/.gitignore index 8d7c170..67f095f 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,9 @@ app/data/emoji app/DataBase/Msg/* server *.db +*.bin +*.json +*.txt *.ui *.pyc *.bat diff --git a/LICENSE b/LICENSE index f288702..fe89547 100644 --- a/LICENSE +++ b/LICENSE @@ -1,674 +1,21 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> - 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 <https://www.gnu.org/licenses/>. - -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: - - <program> Copyright (C) <year> <name of author> - 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 -<https://www.gnu.org/licenses/>. - - 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 -<https://www.gnu.org/licenses/why-not-lgpl.html>. +MIT License + +Copyright (c) 2024 SiYuan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/app/DataBase/__init__.py b/app/DataBase/__init__.py deleted file mode 100644 index 5c44b10..0000000 --- a/app/DataBase/__init__.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -""" -@File : __init__.py.py -@Author : Shuaikang Zhou -@Time : 2023/1/5 0:10 -@IDE : Pycharm -@Version : Python3.10 -@comment : ··· -""" -from .hard_link import HardLink -from .micro_msg import MicroMsg -from .media_msg import MediaMsg -from .misc import Misc -from .msg import Msg -from .msg import MsgType - -misc_db = Misc() -msg_db = Msg() -micro_msg_db = MicroMsg() -hard_link_db = HardLink() -media_msg_db = MediaMsg() - - -def close_db(): - misc_db.close() - msg_db.close() - micro_msg_db.close() - hard_link_db.close() - media_msg_db.close() - - -def init_db(): - misc_db.init_database() - msg_db.init_database() - micro_msg_db.init_database() - hard_link_db.init_database() - media_msg_db.init_database() - - -__all__ = ['misc_db', 'micro_msg_db', 'msg_db', 'hard_link_db', 'MsgType', "media_msg_db", "close_db"] diff --git a/app/DataBase/hard_link.py b/app/DataBase/hard_link.py deleted file mode 100644 index 95cf643..0000000 --- a/app/DataBase/hard_link.py +++ /dev/null @@ -1,297 +0,0 @@ -import binascii -import os.path -import sqlite3 -import threading -import traceback -import xml.etree.ElementTree as ET - -from app.log import log, logger -from app.util.protocbuf.msg_pb2 import MessageBytesExtra - -image_db_lock = threading.Lock() -video_db_lock = threading.Lock() -image_db_path = "./app/Database/Msg/HardLinkImage.db" -video_db_path = "./app/Database/Msg/HardLinkVideo.db" -root_path = "FileStorage/MsgAttach/" -video_root_path = "FileStorage/Video/" - - -@log -def get_md5_from_xml(content, type_="img"): - try: - # 解析XML - root = ET.fromstring(content) - if type_ == "img": - # 提取md5的值 - md5_value = root.find(".//img").get("md5") - elif type_ == "video": - md5_value = root.find(".//videomsg").get("md5") - # print(md5_value) - return md5_value - except ET.ParseError: - return None - - -def decodeExtraBuf(extra_buf_content: bytes): - if not extra_buf_content: - return { - "region": ('', '', ''), - "signature": '', - "telephone": '', - "gender": 0, - } - trunkName = { - b"\x46\xCF\x10\xC4": "个性签名", - b"\xA4\xD9\x02\x4A": "国家", - b"\xE2\xEA\xA8\xD1": "省份", - b"\x1D\x02\x5B\xBF": "市", - # b"\x81\xAE\x19\xB4": "朋友圈背景url", - # b"\xF9\x17\xBC\xC0": "公司名称", - # b"\x4E\xB9\x6D\x85": "企业微信属性", - # b"\x0E\x71\x9F\x13": "备注图片", - b"\x75\x93\x78\xAD": "手机号", - b"\x74\x75\x2C\x06": "性别", - } - res = {"手机号": ""} - off = 0 - try: - for key in trunkName: - trunk_head = trunkName[key] - try: - off = extra_buf_content.index(key) + 4 - except: - pass - char = extra_buf_content[off: off + 1] - off += 1 - if char == b"\x04": # 四个字节的int,小端序 - intContent = extra_buf_content[off: off + 4] - off += 4 - intContent = int.from_bytes(intContent, "little") - res[trunk_head] = intContent - elif char == b"\x18": # utf-16字符串 - lengthContent = extra_buf_content[off: off + 4] - off += 4 - lengthContent = int.from_bytes(lengthContent, "little") - strContent = extra_buf_content[off: off + lengthContent] - off += lengthContent - res[trunk_head] = strContent.decode("utf-16").rstrip("\x00") - return { - "region": (res["国家"], res["省份"], res["市"]), - "signature": res["个性签名"], - "telephone": res["手机号"], - "gender": res["性别"], - } - except: - logger.error(f'联系人解析错误:\n{traceback.format_exc()}') - return { - "region": ('', '', ''), - "signature": '', - "telephone": '', - "gender": 0, - } - - -def singleton(cls): - _instance = {} - - def inner(): - if cls not in _instance: - _instance[cls] = cls() - return _instance[cls] - - return inner - - -@singleton -class HardLink: - def __init__(self): - self.imageDB = None - self.videoDB = None - self.image_cursor = None - self.video_cursor = None - self.open_flag = False - self.init_database() - - def init_database(self): - if not self.open_flag: - if os.path.exists(image_db_path): - self.imageDB = sqlite3.connect(image_db_path, check_same_thread=False) - # '''创建游标''' - self.image_cursor = self.imageDB.cursor() - self.open_flag = True - if image_db_lock.locked(): - image_db_lock.release() - if os.path.exists(video_db_path): - self.videoDB = sqlite3.connect(video_db_path, check_same_thread=False) - # '''创建游标''' - self.video_cursor = self.videoDB.cursor() - self.open_flag = True - if video_db_lock.locked(): - video_db_lock.release() - - def get_image_by_md5(self, md5: bytes): - if not md5: - return None - if not self.open_flag: - return None - sql = """ - select Md5Hash,MD5,FileName,HardLinkImageID.Dir as DirName1,HardLinkImageID2.Dir as DirName2 - from HardLinkImageAttribute - join HardLinkImageID on HardLinkImageAttribute.DirID1 = HardLinkImageID.DirID - join HardLinkImageID as HardLinkImageID2 on HardLinkImageAttribute.DirID2 = HardLinkImageID2.DirID - where MD5 = ?; - """ - try: - image_db_lock.acquire(True) - try: - self.image_cursor.execute(sql, [md5]) - except AttributeError: - self.init_database() - self.image_cursor.execute(sql, [md5]) - result = self.image_cursor.fetchone() - return result - finally: - image_db_lock.release() - - def get_video_by_md5(self, md5: bytes): - if not md5: - return None - if not self.open_flag: - return None - sql = """ - select Md5Hash,MD5,FileName,HardLinkVideoID2.Dir as DirName2 - from HardLinkVideoAttribute - join HardLinkVideoID as HardLinkVideoID2 on HardLinkVideoAttribute.DirID2 = HardLinkVideoID2.DirID - where MD5 = ?; - """ - try: - video_db_lock.acquire(True) - try: - self.video_cursor.execute(sql, [md5]) - except sqlite3.OperationalError: - return None - except AttributeError: - self.init_database() - self.video_cursor.execute(sql, [md5]) - result = self.video_cursor.fetchone() - return result - finally: - video_db_lock.release() - - def get_image_original(self, content, bytesExtra) -> str: - msg_bytes = MessageBytesExtra() - msg_bytes.ParseFromString(bytesExtra) - result = '' - for tmp in msg_bytes.message2: - if tmp.field1 != 4: - continue - pathh = tmp.field2 # wxid\FileStorage\... - pathh = "\\".join(pathh.split("\\")[1:]) - return pathh - md5 = get_md5_from_xml(content) - if not md5: - pass - else: - result = self.get_image_by_md5(binascii.unhexlify(md5)) - if result: - dir1 = result[3] - dir2 = result[4] - data_image = result[2] - dir0 = "Image" - dat_image = os.path.join(root_path, dir1, dir0, dir2, data_image) - result = dat_image - return result - - def get_image_thumb(self, content, bytesExtra) -> str: - msg_bytes = MessageBytesExtra() - msg_bytes.ParseFromString(bytesExtra) - result = '' - for tmp in msg_bytes.message2: - if tmp.field1 != 3: - continue - pathh = tmp.field2 # wxid\FileStorage\... - pathh = "\\".join(pathh.split("\\")[1:]) - return pathh - md5 = get_md5_from_xml(content) - if not md5: - pass - else: - result = self.get_image_by_md5(binascii.unhexlify(md5)) - if result: - dir1 = result[3] - dir2 = result[4] - data_image = result[2] - dir0 = "Thumb" - dat_image = os.path.join(root_path, dir1, dir0, dir2, data_image) - result = dat_image - return result - - def get_image(self, content, bytesExtra, up_dir="", thumb=False) -> str: - msg_bytes = MessageBytesExtra() - msg_bytes.ParseFromString(bytesExtra) - if thumb: - result = self.get_image_thumb(content, bytesExtra) - else: - result = self.get_image_original(content, bytesExtra) - if not (result and os.path.exists(os.path.join(up_dir, result))): - result = self.get_image_thumb(content, bytesExtra) - return result - - def get_video(self, content, bytesExtra, thumb=False): - msg_bytes = MessageBytesExtra() - msg_bytes.ParseFromString(bytesExtra) - for tmp in msg_bytes.message2: - if tmp.field1 != (3 if thumb else 4): - continue - pathh = tmp.field2 # wxid\FileStorage\... - pathh = "\\".join(pathh.split("\\")[1:]) - return pathh - md5 = get_md5_from_xml(content, type_="video") - if not md5: - return '' - result = self.get_video_by_md5(binascii.unhexlify(md5)) - if result: - dir2 = result[3] - data_image = result[2].split(".")[0] + ".jpg" if thumb else result[2] - # dir0 = 'Thumb' if thumb else 'Image' - dat_image = os.path.join(video_root_path, dir2, data_image) - return dat_image - else: - return '' - - def close(self): - if self.open_flag: - try: - image_db_lock.acquire(True) - video_db_lock.acquire(True) - self.open_flag = False - self.imageDB.close() - self.videoDB.close() - finally: - image_db_lock.release() - video_db_lock.release() - - def __del__(self): - self.close() - - -# 6b02292eecea118f06be3a5b20075afc_t - -if __name__ == "__main__": - msg_root_path = "./Msg/" - image_db_path = "./Msg/HardLinkImage.db" - video_db_path = "./Msg/HardLinkVideo.db" - hard_link_db = HardLink() - hard_link_db.init_database() - # content = '''<?xml version="1.0"?><msg>\n\t<img aeskey="bc37a58c32cb203ee9ac587b068e5853" encryver="1" cdnthumbaeskey="bc37a58c32cb203ee9ac587b068e5853" cdnthumburl="3057020100044b30490201000204d181705002032f5405020428a7b4de02046537869d042462313532363539632d663930622d343463302d616636662d333837646434633061626534020401150a020201000405004c4c6d00" cdnthumblength="3097" cdnthumbheight="120" cdnthumbwidth="68" cdnmidheight="0" cdnmidwidth="0" cdnhdheight="0" cdnhdwidth="0" cdnmidimgurl="3057020100044b30490201000204d181705002032f5405020428a7b4de02046537869d042462313532363539632d663930622d343463302d616636662d333837646434633061626534020401150a020201000405004c4c6d00" length="57667" md5="6844b812d5d514eb6878657e0bf4cdbb" originsourcemd5="1dfdfa24922270ea1cb5daba103f45ca" />\n\t<platform_signature></platform_signature>\n\t<imgdatahash></imgdatahash>\n</msg>\n''' - # print(hard_link_db.get_image(content)) - # print(hard_link_db.get_image(content, thumb=False)) - # result = get_md5_from_xml(content) - # print(result) - content = """<?xml version="1.0"?> -<msg> - <videomsg aeskey="d635d2013d221dbd05a4eab3a8185f5a" cdnvideourl="3057020100044b304902010002040297cead02032f540502042ba7b4de020465673b74042438316562356530652d653764352d343263632d613531642d6464383661313330623965330204052400040201000405004c537500" cdnthumbaeskey="d635d2013d221dbd05a4eab3a8185f5a" cdnthumburl="3057020100044b304902010002040297cead02032f540502042ba7b4de020465673b74042438316562356530652d653764352d343263632d613531642d6464383661313330623965330204052400040201000405004c537500" length="25164270" playlength="60" cdnthumblength="7419" cdnthumbwidth="1920" cdnthumbheight="1080" fromusername="wxid_yt67eeoo4blm22" md5="95558f0e503651375b475636519d2285" newmd5="4ece19bcd92dc5b93b83f397461a1310" isplaceholder="0" rawmd5="d660ba186bb31126d94fa568144face8" rawlength="143850007" cdnrawvideourl="3052020100044b30490201000204d8cd585302032f540502040f6a42b7020465673b85042464666462306634342d653339342d343232302d613534392d3930633030646236306266610204059400040201000400" cdnrawvideoaeskey="5915b14ac8d121e0944d9e444aebb7ed" overwritenewmsgid="0" originsourcemd5="a1a567d8c170bca33d075b787a60dd3f" isad="0" /> -</msg> -""" - print(hard_link_db.get_video(content)) - print(hard_link_db.get_video(content, thumb=True)) diff --git a/app/DataBase/media_msg.py b/app/DataBase/media_msg.py deleted file mode 100644 index 4baf912..0000000 --- a/app/DataBase/media_msg.py +++ /dev/null @@ -1,145 +0,0 @@ -import os.path -import subprocess -import sys -import traceback -from os import system -import sqlite3 -import threading -import xml.etree.ElementTree as ET -from pilk import decode - -from app.log import logger - -lock = threading.Lock() -db_path = "./app/Database/Msg/MediaMSG.db" - - -def get_ffmpeg_path(): - # 获取打包后的资源目录 - resource_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__))) - - # 构建 FFmpeg 可执行文件的路径 - ffmpeg_path = os.path.join(resource_dir, 'app', 'resources','data', 'ffmpeg.exe') - - return ffmpeg_path - - -def singleton(cls): - _instance = {} - - def inner(): - if cls not in _instance: - _instance[cls] = cls() - return _instance[cls] - - return inner - - -@singleton -class MediaMsg: - def __init__(self): - self.DB = None - self.cursor: sqlite3.Cursor = None - self.open_flag = False - self.init_database() - - def init_database(self): - if not self.open_flag: - if os.path.exists(db_path): - self.DB = sqlite3.connect(db_path, check_same_thread=False) - # '''创建游标''' - self.cursor = self.DB.cursor() - self.open_flag = True - if lock.locked(): - lock.release() - - def get_media_buffer(self, reserved0): - sql = ''' - select Buf - from Media - where Reserved0 = ? - ''' - try: - lock.acquire(True) - self.cursor.execute(sql, [reserved0]) - result = self.cursor.fetchone() - - finally: - lock.release() - return result[0] if result else None - - def get_audio(self, reserved0, output_path): - buf = self.get_media_buffer(reserved0) - if not buf: - return '' - silk_path = f"{output_path}/{reserved0}.silk" - pcm_path = f"{output_path}/{reserved0}.pcm" - mp3_path = f"{output_path}/{reserved0}.mp3" - if os.path.exists(mp3_path): - return mp3_path - with open(silk_path, "wb") as f: - f.write(buf) - # open(silk_path, "wb").write() - try: - decode(silk_path, pcm_path, 44100) - # 调用系统上的 ffmpeg 可执行文件 - # 获取 FFmpeg 可执行文件的路径 - ffmpeg_path = get_ffmpeg_path() - # # 调用 FFmpeg - if os.path.exists(ffmpeg_path): - cmd = f'''"{ffmpeg_path}" -loglevel quiet -y -f s16le -i "{pcm_path}" -ar 44100 -ac 1 "{mp3_path}"''' - # system(cmd) - # 使用subprocess.run()执行命令 - subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - else: - # 源码运行的时候下面的有效 - # 这里不知道怎么捕捉异常 - cmd = f'''"{os.path.join(os.getcwd(), 'app', 'resources', 'data','ffmpeg.exe')}" -loglevel quiet -y -f s16le -i "{pcm_path}" -ar 44100 -ac 1 "{mp3_path}"''' - # system(cmd) - # 使用subprocess.run()执行命令 - subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - os.remove(silk_path) - os.remove(pcm_path) - except Exception as e: - print(f"Error: {e}") - logger.error(f'语音发送错误\n{traceback.format_exc()}') - cmd = f'''"{os.path.join(os.getcwd(), 'app', 'resources', 'data', 'ffmpeg.exe')}" -loglevel quiet -y -f s16le -i "{pcm_path}" -ar 44100 -ac 1 "{mp3_path}"''' - # system(cmd) - # 使用subprocess.run()执行命令 - subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - finally: - print(mp3_path) - return mp3_path - - def get_audio_path(self, reserved0, output_path): - mp3_path = f"{output_path}\\{reserved0}.mp3" - mp3_path = mp3_path.replace("/", "\\") - return mp3_path - - def get_audio_text(self, content): - try: - root = ET.fromstring(content) - transtext = root.find(".//voicetrans").get("transtext") - return transtext - except: - return "" - - def close(self): - if self.open_flag: - try: - lock.acquire(True) - self.open_flag = False - self.DB.close() - finally: - lock.release() - - def __del__(self): - self.close() - - -if __name__ == '__main__': - db_path = './Msg/MediaMSG.db' - media_msg_db = MediaMsg() - reserved = '2865682741418252473' - path = media_msg_db.get_audio(reserved, r"D:\gou\message\WeChatMsg") - print(path) diff --git a/app/DataBase/merge.py b/app/DataBase/merge.py deleted file mode 100644 index 945eba0..0000000 --- a/app/DataBase/merge.py +++ /dev/null @@ -1,103 +0,0 @@ -import os -import sqlite3 -import traceback - -from app.log import logger - - -def merge_MediaMSG_databases(source_paths, target_path): - # 创建目标数据库连接 - target_conn = sqlite3.connect(target_path) - target_cursor = target_conn.cursor() - try: - # 开始事务 - target_conn.execute("BEGIN;") - for i, source_path in enumerate(source_paths): - if not os.path.exists(source_path): - continue - db = sqlite3.connect(source_path) - db.text_factory = str - cursor = db.cursor() - # 附加源数据库 - try: - sql = '''SELECT Key,Reserved0,Buf,Reserved1,Reserved2 FROM Media;''' - cursor.execute(sql) - result = cursor.fetchall() - target_cursor.executemany( - "INSERT INTO Media (Key,Reserved0,Buf,Reserved1,Reserved2)" - "VALUES(?,?,?,?,?)", - result) - except sqlite3.IntegrityError: - print("有重复key", "跳过") - except sqlite3.OperationalError: - print("no such table: Media", "跳过") - cursor.close() - db.close() - # 提交事务 - target_conn.execute("COMMIT;") - - except Exception as e: - # 发生异常时回滚事务 - target_conn.execute("ROLLBACK;") - raise e - - finally: - # 关闭目标数据库连接 - target_conn.close() - - -def merge_databases(source_paths, target_path): - # 创建目标数据库连接 - target_conn = sqlite3.connect(target_path) - target_cursor = target_conn.cursor() - try: - # 开始事务 - target_conn.execute("BEGIN;") - for i, source_path in enumerate(source_paths): - if not os.path.exists(source_path): - continue - db = sqlite3.connect(source_path) - db.text_factory = str - cursor = db.cursor() - try: - sql = ''' - SELECT TalkerId,MsgsvrID,Type,SubType,IsSender,CreateTime,Sequence,StrTalker,StrContent,DisplayContent,BytesExtra,CompressContent - FROM MSG; - ''' - cursor.execute(sql) - result = cursor.fetchall() - # 附加源数据库 - target_cursor.executemany( - "INSERT INTO MSG " - "(TalkerId,MsgsvrID,Type,SubType,IsSender,CreateTime,Sequence,StrTalker,StrContent,DisplayContent," - "BytesExtra,CompressContent)" - "VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", - result) - except: - logger.error(f'{source_path}数据库合并错误:\n{traceback.format_exc()}') - cursor.close() - db.close() - # 提交事务 - target_conn.execute("COMMIT;") - - except Exception as e: - # 发生异常时回滚事务 - target_conn.execute("ROLLBACK;") - raise e - - finally: - # 关闭目标数据库连接 - target_conn.close() - - -if __name__ == "__main__": - # 源数据库文件列表 - source_databases = ["Msg/MSG1.db", "Msg/MSG2.db", "Msg/MSG3.db"] - - # 目标数据库文件 - target_database = "Msg/MSG.db" - import shutil - - shutil.copy('Msg/MSG0.db', target_database) # 使用一个数据库文件作为模板 - # 合并数据库 - merge_databases(source_databases, target_database) diff --git a/app/DataBase/micro_msg.py b/app/DataBase/micro_msg.py deleted file mode 100644 index 44ae061..0000000 --- a/app/DataBase/micro_msg.py +++ /dev/null @@ -1,152 +0,0 @@ -import os.path -import sqlite3 -import threading - -lock = threading.Lock() -db_path = "./app/Database/Msg/MicroMsg.db" - - -def singleton(cls): - _instance = {} - - def inner(): - if cls not in _instance: - _instance[cls] = cls() - return _instance[cls] - - return inner - - -def is_database_exist(): - return os.path.exists(db_path) - - -class MicroMsg: - def __init__(self): - self.DB = None - self.cursor = None - self.open_flag = False - self.init_database() - - def init_database(self): - if not self.open_flag: - if os.path.exists(db_path): - self.DB = sqlite3.connect(db_path, check_same_thread=False) - # '''创建游标''' - self.cursor = self.DB.cursor() - self.open_flag = True - if lock.locked(): - lock.release() - - def get_contact(self): - if not self.open_flag: - return [] - try: - lock.acquire(True) - sql = '''SELECT UserName, Alias, Type, Remark, NickName, PYInitial, RemarkPYInitial, ContactHeadImgUrl.smallHeadImgUrl, ContactHeadImgUrl.bigHeadImgUrl,ExTraBuf,COALESCE(ContactLabel.LabelName, 'None') AS labelName - FROM Contact - INNER JOIN ContactHeadImgUrl ON Contact.UserName = ContactHeadImgUrl.usrName - LEFT JOIN ContactLabel ON Contact.LabelIDList = ContactLabel.LabelId - WHERE (Type!=4 AND VerifyFlag=0) - AND NickName != '' - ORDER BY - CASE - WHEN RemarkPYInitial = '' THEN PYInitial - ELSE RemarkPYInitial - END ASC - ''' - self.cursor.execute(sql) - result = self.cursor.fetchall() - except sqlite3.OperationalError: - # lock.acquire(True) - sql = ''' - SELECT UserName, Alias, Type, Remark, NickName, PYInitial, RemarkPYInitial, ContactHeadImgUrl.smallHeadImgUrl, ContactHeadImgUrl.bigHeadImgUrl,ExTraBuf,"None" - FROM Contact - INNER JOIN ContactHeadImgUrl ON Contact.UserName = ContactHeadImgUrl.usrName - WHERE (Type!=4 AND VerifyFlag=0) - AND NickName != '' - ORDER BY - CASE - WHEN RemarkPYInitial = '' THEN PYInitial - ELSE RemarkPYInitial - END ASC - ''' - self.cursor.execute(sql) - result = self.cursor.fetchall() - finally: - lock.release() - from app.DataBase import msg_db - return msg_db.get_contact(result) - - def get_contact_by_username(self, username): - if not self.open_flag: - return None - try: - lock.acquire(True) - sql = ''' - SELECT UserName, Alias, Type, Remark, NickName, PYInitial, RemarkPYInitial, ContactHeadImgUrl.smallHeadImgUrl, ContactHeadImgUrl.bigHeadImgUrl,ExTraBuf,ContactLabel.LabelName - FROM Contact - INNER JOIN ContactHeadImgUrl ON Contact.UserName = ContactHeadImgUrl.usrName - LEFT JOIN ContactLabel ON Contact.LabelIDList = ContactLabel.LabelId - WHERE UserName = ? - ''' - self.cursor.execute(sql, [username]) - result = self.cursor.fetchone() - except sqlite3.OperationalError: - # 解决ContactLabel表不存在的问题 - # lock.acquire(True) - sql = ''' - SELECT UserName, Alias, Type, Remark, NickName, PYInitial, RemarkPYInitial, ContactHeadImgUrl.smallHeadImgUrl, ContactHeadImgUrl.bigHeadImgUrl,ExTraBuf,"None" - FROM Contact - INNER JOIN ContactHeadImgUrl ON Contact.UserName = ContactHeadImgUrl.usrName - WHERE UserName = ? - ''' - self.cursor.execute(sql, [username]) - result = self.cursor.fetchone() - finally: - lock.release() - - return result - - def get_chatroom_info(self, chatroomname): - ''' - 获取群聊信息 - ''' - if not self.open_flag: - return None - try: - lock.acquire(True) - sql = '''SELECT ChatRoomName, RoomData FROM ChatRoom WHERE ChatRoomName = ?''' - self.cursor.execute(sql, [chatroomname]) - result = self.cursor.fetchone() - finally: - lock.release() - return result - - def close(self): - if self.open_flag: - try: - lock.acquire(True) - self.open_flag = False - self.DB.close() - finally: - lock.release() - - def __del__(self): - self.close() - - -if __name__ == '__main__': - db_path = "./app/database/Msg/MicroMsg.db" - msg = MicroMsg() - msg.init_database() - contacts = msg.get_contact() - from app.DataBase.hard_link import decodeExtraBuf - - s = {'wxid_vtz9jk9ulzjt22','wxid_zu9l4wxdv1pa22', 'wxid_0o18ef858vnu22','wxid_8piw6sb4hvfm22','wxid_e7ypfycxpnu322','wxid_oxmg02c8kwxu22','wxid_7pp2fblq7hkq22','wxid_h1n9niofgyci22'} - for contact in contacts: - if contact[0] in s: - print(contact[:7]) - buf = contact[9] - info = decodeExtraBuf(buf) - print(info) diff --git a/app/DataBase/misc.py b/app/DataBase/misc.py deleted file mode 100644 index c746247..0000000 --- a/app/DataBase/misc.py +++ /dev/null @@ -1,78 +0,0 @@ -import os.path -import sqlite3 -import threading - -lock = threading.Lock() -DB = None -cursor = None -db_path = "./app/Database/Msg/Misc.db" - - -# db_path = './Msg/Misc.db' - - -def singleton(cls): - _instance = {} - - def inner(): - if cls not in _instance: - _instance[cls] = cls() - return _instance[cls] - - return inner - - -@singleton -class Misc: - def __init__(self): - self.DB = None - self.cursor = None - self.open_flag = False - self.init_database() - - def init_database(self): - if not self.open_flag: - if os.path.exists(db_path): - self.DB = sqlite3.connect(db_path, check_same_thread=False) - # '''创建游标''' - self.cursor = self.DB.cursor() - self.open_flag = True - if lock.locked(): - lock.release() - - def get_avatar_buffer(self, userName): - if not self.open_flag: - return None - sql = ''' - select smallHeadBuf - from ContactHeadImg1 - where usrName=?; - ''' - if not self.open_flag: - self.init_database() - try: - lock.acquire(True) - self.cursor.execute(sql, [userName]) - result = self.cursor.fetchall() - if result: - return result[0][0] - finally: - lock.release() - return None - - def close(self): - if self.open_flag: - try: - lock.acquire(True) - self.open_flag = False - self.DB.close() - finally: - lock.release() - - def __del__(self): - self.close() - - -if __name__ == '__main__': - Misc() - print(Misc().get_avatar_buffer('wxid_al2oan01b6fn11')) diff --git a/app/DataBase/msg.py b/app/DataBase/msg.py deleted file mode 100644 index b56e671..0000000 --- a/app/DataBase/msg.py +++ /dev/null @@ -1,894 +0,0 @@ -import os.path -import random -import sqlite3 -import threading -import traceback -from collections import defaultdict -from datetime import datetime, date -from typing import Tuple - -from app.log import logger -from app.util.compress_content import parser_reply -from app.util.protocbuf.msg_pb2 import MessageBytesExtra - -db_path = "./app/Database/Msg/MSG.db" -lock = threading.Lock() - - -def is_database_exist(): - return os.path.exists(db_path) - - -def convert_to_timestamp_(time_input) -> int: - if isinstance(time_input, (int, float)): - # 如果输入是时间戳,直接返回 - return int(time_input) - elif isinstance(time_input, str): - # 如果输入是格式化的时间字符串,将其转换为时间戳 - try: - dt_object = datetime.strptime(time_input, '%Y-%m-%d %H:%M:%S') - return int(dt_object.timestamp()) - except ValueError: - # 如果转换失败,可能是其他格式的字符串,可以根据需要添加更多的处理逻辑 - print("Error: Unsupported date format") - return -1 - elif isinstance(time_input, date): - # 如果输入是datetime.date对象,将其转换为时间戳 - dt_object = datetime.combine(time_input, datetime.min.time()) - return int(dt_object.timestamp()) - else: - print("Error: Unsupported input type") - return -1 - - -def convert_to_timestamp(time_range) -> Tuple[int, int]: - """ - 将时间转换成时间戳 - @param time_range: - @return: - """ - if not time_range: - return 0, 0 - else: - return convert_to_timestamp_(time_range[0]), convert_to_timestamp_(time_range[1]) - - -def parser_chatroom_message(messages): - from app.DataBase import micro_msg_db, misc_db - from app.util.protocbuf.msg_pb2 import MessageBytesExtra - from app.person import Contact, Me, ContactDefault - ''' - 获取一个群聊的聊天记录 - return list - a[0]: localId, - a[1]: talkerId, (和strtalker对应的,不是群聊信息发送人) - a[2]: type, - a[3]: subType, - a[4]: is_sender, - a[5]: timestamp, - a[6]: status, (没啥用) - a[7]: str_content, - a[8]: str_time, (格式化的时间) - a[9]: msgSvrId, - a[10]: BytesExtra, - a[11]: CompressContent, - a[12]: DisplayContent, - a[13]: msg_sender, (ContactPC 或 ContactDefault 类型,这个才是群聊里的信息发送人,不是群聊或者自己是发送者没有这个字段) - ''' - updated_messages = [] # 用于存储修改后的消息列表 - for row in messages: - message = list(row) - if message[4] == 1: # 自己发送的就没必要解析了 - message.append(Me()) - updated_messages.append(tuple(message)) - continue - if message[10] is None: # BytesExtra是空的跳过 - message.append(ContactDefault(wxid)) - updated_messages.append(tuple(message)) - continue - msgbytes = MessageBytesExtra() - msgbytes.ParseFromString(message[10]) - wxid = '' - for tmp in msgbytes.message2: - if tmp.field1 != 1: - continue - wxid = tmp.field2 - if wxid == "": # 系统消息里面 wxid 不存在 - message.append(ContactDefault(wxid)) - updated_messages.append(tuple(message)) - continue - # todo 解析还是有问题,会出现这种带:的东西 - if ':' in wxid: # wxid_ewi8gfgpp0eu22:25319:1 - wxid = wxid.split(':')[0] - contact_info_list = micro_msg_db.get_contact_by_username(wxid) - if contact_info_list is None: # 群聊中已退群的联系人不会保存在数据库里 - message.append(ContactDefault(wxid)) - updated_messages.append(tuple(message)) - continue - contact_info = { - 'UserName': contact_info_list[0], - 'Alias': contact_info_list[1], - 'Type': contact_info_list[2], - 'Remark': contact_info_list[3], - 'NickName': contact_info_list[4], - 'smallHeadImgUrl': contact_info_list[7] - } - contact = Contact(contact_info) - contact.smallHeadImgBLOG = misc_db.get_avatar_buffer(contact.wxid) - contact.set_avatar(contact.smallHeadImgBLOG) - message.append(contact) - updated_messages.append(tuple(message)) - return updated_messages - - -def singleton(cls): - _instance = {} - - def inner(): - if cls not in _instance: - _instance[cls] = cls() - return _instance[cls] - - return inner - - -class MsgType: - TEXT = 1 - IMAGE = 3 - EMOJI = 47 - - -class Msg: - def __init__(self): - self.DB = None - self.cursor = None - self.open_flag = False - self.init_database() - - def init_database(self, path=None): - global db_path - if not self.open_flag: - if path: - db_path = path - if os.path.exists(db_path): - self.DB = sqlite3.connect(db_path, check_same_thread=False) - # '''创建游标''' - self.cursor = self.DB.cursor() - self.open_flag = True - if lock.locked(): - lock.release() - - def add_sender(self, messages): - """ - @param messages: - @return: - """ - new_messages = [] - for message in messages: - is_sender = message[4] - wxid = '' - if is_sender: - pass - else: - msgbytes = MessageBytesExtra() - msgbytes.ParseFromString(message[10]) - for tmp in msgbytes.message2: - if tmp.field1 != 1: - continue - wxid = tmp.field2 - new_message = (*message, wxid) - new_messages.append(new_message) - return new_messages - - def get_messages( - self, - username_, - time_range: Tuple[int | float | str | date, int | float | str | date] = None, - ): - """ - return list - a[0]: localId, - a[1]: talkerId, (和strtalker对应的,不是群聊信息发送人) - a[2]: type, - a[3]: subType, - a[4]: is_sender, - a[5]: timestamp, - a[6]: status, (没啥用) - a[7]: str_content, - a[8]: str_time, (格式化的时间) - a[9]: msgSvrId, - a[10]: BytesExtra, - a[11]: CompressContent, - a[12]: DisplayContent, - a[13]: 联系人的类(如果是群聊就有,不是的话没有这个字段) - """ - if not self.open_flag: - return None - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql = f''' - select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent - from MSG - where StrTalker=? - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - order by CreateTime - ''' - try: - lock.acquire(True) - self.cursor.execute(sql, [username_]) - result = self.cursor.fetchall() - finally: - lock.release() - return parser_chatroom_message(result) if username_.__contains__('@chatroom') else result - # result.sort(key=lambda x: x[5]) - # return self.add_sender(result) - - def get_messages_all(self, time_range=None): - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql = f''' - select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,StrTalker,Reserved1,CompressContent - from MSG - {'WHERE CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - order by CreateTime - ''' - if not self.open_flag: - return None - try: - lock.acquire(True) - self.cursor.execute(sql) - result = self.cursor.fetchall() - finally: - lock.release() - result.sort(key=lambda x: x[5]) - return result - - def get_messages_group_by_day( - self, - username_: str, - time_range: Tuple[int | float | str | date, int | float | str | date] = None, - - ) -> dict: - """ - return dict { - date: messages - } - """ - if not self.open_flag: - return {} - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql = f''' - select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent - from MSG - where StrTalker=? AND type=1 - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - order by CreateTime; - ''' - try: - lock.acquire(True) - self.cursor.execute(sql, [username_]) - result = self.cursor.fetchall() - finally: - lock.release() - result = parser_chatroom_message(result) if username_.__contains__('@chatroom') else result - - # 按天分组存储聊天记录 - grouped_results = defaultdict(list) - for row in result: - '2024-01-01' - date = row[8][:10] # 获取日期部分 - grouped_results[date].append(row) # 将消息加入对应的日期列表中 - - return grouped_results - - def get_messages_length(self): - sql = ''' - select count(*) - group by MsgSvrID - from MSG - ''' - if not self.open_flag: - return None - try: - lock.acquire(True) - self.cursor.execute(sql) - result = self.cursor.fetchone() - except Exception as e: - result = None - finally: - lock.release() - return result[0] - - def get_message_by_num(self, username_, local_id): - sql = ''' - select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent - from MSG - where StrTalker = ? and localId < ? and (Type=1 or Type=3) - order by CreateTime desc - limit 20 - ''' - result = None - if not self.open_flag: - return None - try: - lock.acquire(True) - self.cursor.execute(sql, [username_, local_id]) - result = self.cursor.fetchall() - except sqlite3.DatabaseError: - logger.error(f'{traceback.format_exc()}\n数据库损坏请删除msg文件夹重试') - finally: - lock.release() - # result.sort(key=lambda x: x[5]) - return parser_chatroom_message(result) if username_.__contains__('@chatroom') else result - - def get_messages_by_type( - self, - username_, - type_, - year_='all', - time_range: Tuple[int | float | str | date, int | float | str | date] = None, - ): - """ - @param username_: - @param type_: - @param year_: - @param time_range: Tuple(timestamp:开始时间戳,timestamp:结束时间戳) - @return: - """ - if not self.open_flag: - return None - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - if year_ == 'all': - sql = f''' - select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent - from MSG - where StrTalker=? and Type=? - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - order by CreateTime - ''' - try: - lock.acquire(True) - self.cursor.execute(sql, [username_, type_]) - result = self.cursor.fetchall() - finally: - lock.release() - else: - sql = ''' - select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent - from MSG - where StrTalker=? and Type=? and strftime('%Y', CreateTime, 'unixepoch', 'localtime') = ? - order by CreateTime - ''' - try: - lock.acquire(True) - self.cursor.execute(sql, [username_, type_, year_]) - finally: - lock.release() - result = self.cursor.fetchall() - return result - - def get_messages_by_keyword(self, username_, keyword, num=5, max_len=10, time_range=None, year_='all'): - if not self.open_flag: - return None - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql = f''' - select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra - from MSG - where StrTalker=? and Type=1 and LENGTH(StrContent)<? and StrContent like ? - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - order by CreateTime desc - ''' - temp = [] - try: - lock.acquire(True) - self.cursor.execute(sql, [username_, max_len, f'%{keyword}%'] if year_ == "all" else [username_, max_len, - f'%{keyword}%', - year_]) - messages = self.cursor.fetchall() - finally: - lock.release() - if len(messages) > 5: - messages = random.sample(messages, num) - try: - lock.acquire(True) - for msg in messages: - local_id = msg[0] - is_send = msg[4] - sql = ''' - select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID - from MSG - where localId > ? and StrTalker=? and Type=1 and IsSender=? - limit 1 - ''' - self.cursor.execute(sql, [local_id, username_, 1 - is_send]) - temp.append((msg, self.cursor.fetchone())) - finally: - lock.release() - res = [] - for dialog in temp: - msg1 = dialog[0] - msg2 = dialog[1] - try: - res.append(( - (msg1[4], msg1[5], msg1[7].split(keyword), msg1[8]), - (msg2[4], msg2[5], msg2[7], msg2[8]) - )) - except TypeError: - res.append(( - ('', '', ['', ''], ''), - ('', '', '', '') - )) - """ - 返回值为一个列表,每个列表元素是一个对话 - 每个对话是一个元组数据 - ('is_send','时间戳','以关键词为分割符的消息内容','格式化时间') - """ - return res - - def get_contact(self, contacts): - if not self.open_flag: - return None - try: - lock.acquire(True) - sql = '''select StrTalker, MAX(CreateTime) from MSG group by StrTalker''' - self.cursor.execute(sql) - res = self.cursor.fetchall() - finally: - lock.release() - res = {StrTalker: CreateTime for StrTalker, CreateTime in res} - contacts = [list(cur_contact) for cur_contact in contacts] - for i, cur_contact in enumerate(contacts): - if cur_contact[0] in res: - contacts[i].append(res[cur_contact[0]]) - else: - contacts[i].append(0) - contacts.sort(key=lambda cur_contact: cur_contact[-1], reverse=True) - return contacts - - def get_messages_calendar(self, username_): - sql = ''' - SELECT strftime('%Y-%m-%d',CreateTime,'unixepoch','localtime') as days - from ( - SELECT MsgSvrID, CreateTime - FROM MSG - WHERE StrTalker = ? - ORDER BY CreateTime - ) - group by days - ''' - if not self.open_flag: - print('数据库未就绪') - return None - try: - lock.acquire(True) - self.cursor.execute(sql, [username_]) - result = self.cursor.fetchall() - finally: - lock.release() - return [date[0] for date in result] - - def get_messages_by_days( - self, - username_, - time_range: Tuple[int | float | str | date, int | float | str | date] = None, - ): - result = None - if not self.open_flag: - return None - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql = f''' - SELECT strftime('%Y-%m-%d',CreateTime,'unixepoch','localtime') as days,count(MsgSvrID) - from ( - SELECT MsgSvrID, CreateTime - FROM MSG - WHERE StrTalker = ? - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - ) - group by days - ''' - result = None - if not self.open_flag: - return None - try: - lock.acquire(True) - self.cursor.execute(sql, [username_]) - result = self.cursor.fetchall() - finally: - lock.release() - return result - - def get_messages_by_month( - self, - username_, - time_range: Tuple[int | float | str | date, int | float | str | date] = None, - ): - result = None - if not self.open_flag: - return None - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql = f''' - SELECT strftime('%Y-%m',CreateTime,'unixepoch','localtime') as days,count(MsgSvrID) - from ( - SELECT MsgSvrID, CreateTime - FROM MSG - WHERE StrTalker = ? - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - ) - group by days - ''' - try: - lock.acquire(True) - self.cursor.execute(sql, [username_]) - result = self.cursor.fetchall() - except sqlite3.DatabaseError: - logger.error(f'{traceback.format_exc()}\n数据库损坏请删除msg文件夹重试') - finally: - lock.release() - return result - - def get_messages_by_hour(self, username_, time_range=None, year_='all'): - result = [] - if not self.open_flag: - return result - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql = f''' - SELECT strftime('%H:00',CreateTime,'unixepoch','localtime') as hours,count(MsgSvrID) - from ( - SELECT MsgSvrID, CreateTime - FROM MSG - where StrTalker = ? - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - ) - group by hours - ''' - try: - lock.acquire(True) - self.cursor.execute(sql, [username_]) - except sqlite3.DatabaseError: - logger.error(f'{traceback.format_exc()}\n数据库损坏请删除msg文件夹重试') - finally: - lock.release() - result = self.cursor.fetchall() - return result - - def get_first_time_of_message(self, username_=''): - if not self.open_flag: - return None - sql = f''' - select StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime - from MSG - {'where StrTalker=?' if username_ else ''} - order by CreateTime - limit 1 - ''' - try: - lock.acquire(True) - self.cursor.execute(sql, [username_] if username_ else []) - result = self.cursor.fetchone() - finally: - lock.release() - return result - - def get_latest_time_of_message(self, username_='', time_range=None, year_='all'): - if not self.open_flag: - return None - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql = f''' - SELECT isSender,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime, - strftime('%H:%M:%S', CreateTime,'unixepoch','localtime') as hour - FROM MSG - WHERE Type=1 AND - {'StrTalker = ? AND ' if username_ else f"'{username_}'=? AND "} - hour BETWEEN '00:00:00' AND '05:00:00' - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - ORDER BY hour DESC - LIMIT 20; - ''' - try: - lock.acquire(True) - self.cursor.execute(sql, [username_, year_] if year_ != "all" else [username_]) - except sqlite3.DatabaseError: - logger.error(f'{traceback.format_exc()}\n数据库损坏请删除msg文件夹重试') - finally: - lock.release() - result = self.cursor.fetchall() - if not result: - return [] - res = [] - is_sender = result[0][0] - res.append(result[0]) - for msg in result[1:]: - if msg[0] != is_sender: - res.append(msg) - break - return res - - def get_send_messages_type_number( - self, - time_range: Tuple[int | float | str | date, int | float | str | date] = None, - ) -> list: - """ - 统计自己发的各类型消息条数,按条数降序,精确到subtype\n - return [(type_1, subtype_1, number_1), (type_2, subtype_2, number_2), ...]\n - be like [(1, 0, 71481), (3, 0, 6686), (49, 57, 3887), ..., (10002, 0, 1)] - """ - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql = f""" - SELECT type, subtype, Count(MsgSvrID) - from MSG - where isSender = 1 - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - group by type, subtype - order by Count(MsgSvrID) desc - """ - result = None - if not self.open_flag: - return None - try: - lock.acquire(True) - self.cursor.execute(sql) - result = self.cursor.fetchall() - except sqlite3.DatabaseError: - logger.error(f'{traceback.format_exc()}\n数据库损坏请删除msg文件夹重试') - finally: - lock.release() - return result - - def get_messages_number( - self, - username_, - time_range: Tuple[int | float | str | date, int | float | str | date] = None, - ) -> int: - """ - 统计好友聊天消息的数量 - @param username_: - @param time_range: - @return: - """ - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql = f""" - SELECT Count(MsgSvrID) - from MSG - where StrTalker = ? - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - """ - result = 0 - if not self.open_flag: - return 0 - try: - lock.acquire(True) - self.cursor.execute(sql, [username_]) - result = self.cursor.fetchone() - except sqlite3.DatabaseError: - logger.error(f'{traceback.format_exc()}\n数据库损坏请删除msg文件夹重试') - finally: - lock.release() - return result[0] if result else 0 - - def get_chatted_top_contacts( - self, - time_range: Tuple[int | float | str | date, int | float | str | date] = None, - contain_chatroom=False, - top_n=10 - ) -> list: - """ - 统计聊天最多的 n 个联系人(默认不包含群组),按条数降序\n - return [(wxid_1, number_1), (wxid_2, number_2), ...] - """ - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql = f""" - SELECT strtalker, Count(MsgSvrID) - from MSG - where strtalker != "filehelper" and strtalker != "notifymessage" and strtalker not like "gh_%" - {"and strtalker not like '%@chatroom'" if not contain_chatroom else ""} - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - group by strtalker - order by Count(MsgSvrID) desc - limit {top_n} - """ - result = None - if not self.open_flag: - return None - try: - lock.acquire(True) - self.cursor.execute(sql) - result = self.cursor.fetchall() - except sqlite3.DatabaseError: - logger.error(f'{traceback.format_exc()}\n数据库损坏请删除msg文件夹重试') - finally: - lock.release() - return result - - def get_send_messages_length( - self, - time_range: Tuple[int | float | str | date, int | float | str | date] = None, - ) -> int: - """ - 统计自己总共发消息的字数,包含type=1的文本和type=49,subtype=57里面自己发的文本 - """ - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql_type_1 = f""" - SELECT sum(length(strContent)) - from MSG - where isSender = 1 and type = 1 - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - """ - sql_type_49 = f""" - SELECT CompressContent - from MSG - where isSender = 1 and type = 49 and subtype = 57 - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - """ - sum_type_1 = None - result_type_49 = None - sum_type_49 = 0 - - if not self.open_flag: - return None - try: - lock.acquire(True) - self.cursor.execute(sql_type_1) - sum_type_1 = self.cursor.fetchall()[0][0] - self.cursor.execute(sql_type_49) - result_type_49 = self.cursor.fetchall() - for message in result_type_49: - message = message[0] - content = parser_reply(message) - if content["is_error"]: - continue - sum_type_49 += len(content["title"]) - except sqlite3.DatabaseError: - logger.error(f'{traceback.format_exc()}\n数据库损坏请删除msg文件夹重试') - finally: - lock.release() - return sum_type_1 + sum_type_49 - - def get_send_messages_number_sum( - self, - time_range: Tuple[int | float | str | date, int | float | str | date] = None, - ) -> int: - """统计自己总共发了多少条消息""" - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql = f""" - SELECT count(MsgSvrID) - from MSG - where isSender = 1 - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - """ - result = None - if not self.open_flag: - return None - try: - lock.acquire(True) - self.cursor.execute(sql) - result = self.cursor.fetchall()[0][0] - except sqlite3.DatabaseError: - logger.error(f'{traceback.format_exc()}\n数据库损坏请删除msg文件夹重试') - finally: - lock.release() - return result - - def get_send_messages_number_by_hour( - self, - time_range: Tuple[int | float | str | date, int | float | str | date] = None, - ) -> list: - """ - 统计每个(小时)时段自己总共发了多少消息,从最多到最少排序\n - return be like [('23', 9526), ('00', 7890), ('22', 7600), ..., ('05', 29)] - """ - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql = f""" - SELECT strftime('%H', CreateTime, 'unixepoch', 'localtime') as hour,count(MsgSvrID) - from ( - SELECT MsgSvrID, CreateTime - FROM MSG - where isSender = 1 - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - ) - group by hour - order by count(MsgSvrID) desc - """ - result = None - if not self.open_flag: - return None - try: - lock.acquire(True) - self.cursor.execute(sql) - result = self.cursor.fetchall() - except sqlite3.DatabaseError: - logger.error(f'{traceback.format_exc()}\n数据库损坏请删除msg文件夹重试') - finally: - lock.release() - return result - - def get_message_length( - self, - username_='', - time_range: Tuple[int | float | str | date, int | float | str | date] = None, - ) -> int: - """ - 统计自己总共发消息的字数,包含type=1的文本和type=49,subtype=57里面自己发的文本 - """ - if time_range: - start_time, end_time = convert_to_timestamp(time_range) - sql_type_1 = f""" - SELECT sum(length(strContent)) - from MSG - where StrTalker = ? and - type = 1 - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - """ - sql_type_49 = f""" - SELECT CompressContent - from MSG - where StrTalker = ? and - type = 49 and subtype = 57 - {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} - """ - sum_type_1 = 0 - result_type_1 = 0 - result_type_49 = 0 - sum_type_49 = 0 - - if not self.open_flag: - return None - try: - lock.acquire(True) - self.cursor.execute(sql_type_1, [username_]) - result_type_1 = self.cursor.fetchall()[0][0] - self.cursor.execute(sql_type_49, [username_]) - result_type_49 = self.cursor.fetchall() - except sqlite3.DatabaseError: - logger.error(f'{traceback.format_exc()}\n数据库损坏请删除msg文件夹重试') - finally: - lock.release() - for message in result_type_49: - message = message[0] - content = parser_reply(message) - if content["is_error"]: - continue - sum_type_49 += len(content["title"]) - sum_type_1 = result_type_1 if result_type_1 else 0 - return sum_type_1 + sum_type_49 - - def close(self): - if self.open_flag: - try: - lock.acquire(True) - self.open_flag = False - self.DB.close() - finally: - lock.release() - - def __del__(self): - self.close() - - -if __name__ == '__main__': - db_path = "./Msg/MSG.db" - msg = Msg() - msg.init_database() - wxid = 'wxid_0o18ef858vnu22' - wxid = '24521163022@chatroom' - wxid = 'wxid_vtz9jk9ulzjt22' # si - print() - time_range = ('2023-01-01 00:00:00', '2024-01-01 00:00:00') - print(msg.get_messages_calendar(wxid)) - print(msg.get_first_time_of_message()) - print(msg.get_latest_time_of_message()) - top_n = msg.get_chatted_top_contacts(time_range=time_range, top_n=9999999) - print(top_n) - print(len(top_n)) diff --git a/app/DataBase/package_msg.py b/app/DataBase/package_msg.py deleted file mode 100644 index ded0486..0000000 --- a/app/DataBase/package_msg.py +++ /dev/null @@ -1,184 +0,0 @@ -import threading - -from app.DataBase import msg_db, micro_msg_db, misc_db -from app.util.protocbuf.msg_pb2 import MessageBytesExtra -from app.util.protocbuf.roomdata_pb2 import ChatRoomData -from app.person import Contact, Me, ContactDefault - -lock = threading.Lock() - - -def singleton(cls): - _instance = {} - - def inner(): - if cls not in _instance: - _instance[cls] = cls() - return _instance[cls] - - return inner - - -@singleton -class PackageMsg: - def __init__(self): - self.ChatRoomMap = {} - - def get_package_message_all(self): - ''' - 获取完整的聊天记录 - ''' - updated_messages = [] # 用于存储修改后的消息列表 - - messages = msg_db.get_messages_all() - for row in messages: - row_list = list(row) - # 删除不使用的几个字段 - del row_list[13] - del row_list[12] - del row_list[11] - del row_list[10] - del row_list[9] - - strtalker = row[11] - info = micro_msg_db.get_contact_by_username(strtalker) - if info is not None: - row_list.append(info[3]) - row_list.append(info[4]) - else: - row_list.append('') - row_list.append('') - # 判断是否是群聊 - if strtalker.__contains__('@chatroom'): - # 自己发送 - if row[4] == 1: - row_list.append('我') - else: - # 存在BytesExtra为空的情况,此时消息类型应该为提示性消息。跳过不处理 - if row[10] is None: - continue - # 解析BytesExtra - msgbytes = MessageBytesExtra() - msgbytes.ParseFromString(row[10]) - wxid = '' - for tmp in msgbytes.message2: - if tmp.field1 != 1: - continue - wxid = tmp.field2 - sender = '' - # 获取群聊成员列表 - membersMap = self.get_chatroom_member_list(strtalker) - if membersMap is not None: - if wxid in membersMap: - sender = membersMap.get(wxid) - else: - senderinfo = micro_msg_db.get_contact_by_username(wxid) - if senderinfo is not None: - sender = senderinfo[4] - membersMap[wxid] = senderinfo[4] - if len(senderinfo[3]) > 0: - sender = senderinfo[3] - membersMap[wxid] = senderinfo[3] - row_list.append(sender) - else: - if row[4] == 1: - row_list.append('我') - else: - if info is not None: - row_list.append(info[4]) - else: - row_list.append('') - updated_messages.append(tuple(row_list)) - return updated_messages - - def get_package_message_by_wxid(self, chatroom_wxid): - ''' - 获取一个群聊的聊天记录 - return list - a[0]: localId, - a[1]: talkerId, (和strtalker对应的,不是群聊信息发送人) - a[2]: type, - a[3]: subType, - a[4]: is_sender, - a[5]: timestamp, - a[6]: status, (没啥用) - a[7]: str_content, - a[8]: str_time, (格式化的时间) - a[9]: msgSvrId, - a[10]: BytesExtra, - a[11]: CompressContent, - a[12]: DisplayContent, - a[13]: msg_sender, (ContactPC 或 ContactDefault 类型,这个才是群聊里的信息发送人,不是群聊或者自己是发送者没有这个字段) - ''' - updated_messages = [] # 用于存储修改后的消息列表 - messages = msg_db.get_messages(chatroom_wxid) - for row in messages: - message = list(row) - if message[4] == 1: # 自己发送的就没必要解析了 - message.append(Me()) - updated_messages.append(message) - continue - if message[10] is None: # BytesExtra是空的跳过 - message.append(ContactDefault(wxid)) - updated_messages.append(message) - continue - msgbytes = MessageBytesExtra() - msgbytes.ParseFromString(message[10]) - wxid = '' - for tmp in msgbytes.message2: - if tmp.field1 != 1: - continue - wxid = tmp.field2 - if wxid == "": # 系统消息里面 wxid 不存在 - message.append(ContactDefault(wxid)) - updated_messages.append(message) - continue - contact_info_list = micro_msg_db.get_contact_by_username(wxid) - if contact_info_list is None: # 群聊中已退群的联系人不会保存在数据库里 - message.append(ContactDefault(wxid)) - updated_messages.append(message) - continue - contact_info = { - 'UserName': contact_info_list[0], - 'Alias': contact_info_list[1], - 'Type': contact_info_list[2], - 'Remark': contact_info_list[3], - 'NickName': contact_info_list[4], - 'smallHeadImgUrl': contact_info_list[7] - } - contact = Contact(contact_info) - contact.smallHeadImgBLOG = misc_db.get_avatar_buffer(contact.wxid) - contact.set_avatar(contact.smallHeadImgBLOG) - message.append(contact) - updated_messages.append(tuple(message)) - return updated_messages - - def get_chatroom_member_list(self, strtalker): - membermap = {} - ''' - 获取群聊成员 - ''' - try: - lock.acquire(True) - if strtalker in self.ChatRoomMap: - membermap = self.ChatRoomMap.get(strtalker) - else: - chatroom = micro_msg_db.get_chatroom_info(strtalker) - if chatroom is None: - return None - # 解析RoomData数据 - parsechatroom = ChatRoomData() - parsechatroom.ParseFromString(chatroom[1]) - # 群成员数据放入字典存储 - for mem in parsechatroom.members: - if mem.displayName is not None and len(mem.displayName) > 0: - membermap[mem.wxID] = mem.displayName - self.ChatRoomMap[strtalker] = membermap - finally: - lock.release() - return membermap - - -if __name__ == "__main__": - p = PackageMsg() - print(p.get_package_message_by_wxid("48615079469@chatroom")) diff --git a/app/__init__.py b/app/__init__.py deleted file mode 100644 index 2def13e..0000000 --- a/app/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -""" -@File : __init__.py.py -@Author : Shuaikang Zhou -@Time : 2023/1/5 17:43 -@IDE : Pycharm -@Version : Python3.10 -@comment : ··· -""" diff --git a/app/analysis/analysis.py b/app/analysis/analysis.py deleted file mode 100644 index 2690776..0000000 --- a/app/analysis/analysis.py +++ /dev/null @@ -1,535 +0,0 @@ -import os -from collections import Counter -import sys -from datetime import datetime -from typing import List - -import jieba - -from app.DataBase import msg_db, MsgType -from pyecharts import options as opts -from pyecharts.charts import WordCloud, Calendar, Bar, Line, Pie, Map - -from app.person import Contact -from app.util.region_conversion import conversion_province_to_chinese - -os.makedirs('./data/聊天统计/', exist_ok=True) - - -def wordcloud_(wxid, time_range=None): - import jieba - txt_messages = msg_db.get_messages_by_type(wxid, MsgType.TEXT, time_range=time_range) - if not txt_messages: - return { - 'chart_data': None, - 'keyword': "没有聊天你想分析啥", - 'max_num': "0", - 'dialogs': [] - } - # text = ''.join(map(lambda x: x[7], txt_messages)) - text = ''.join(map(lambda x: x[7], txt_messages)) # 1“我”说的话,0“Ta”说的话 - - total_msg_len = len(text) - # 使用jieba进行分词,并加入停用词 - words = jieba.cut(text) - # 统计词频 - word_count = Counter(words) - # 过滤停用词 - stopwords_file = './app/data/stopwords.txt' - with open(stopwords_file, "r", encoding="utf-8") as stopword_file: - stopwords1 = set(stopword_file.read().splitlines()) - # 构建 FFmpeg 可执行文件的路径 - stopwords = set() - stopwords_file = './app/resources/data/stopwords.txt' - if not os.path.exists(stopwords_file): - resource_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__))) - stopwords_file = os.path.join(resource_dir, 'app', 'resources', 'data', 'stopwords.txt') - with open(stopwords_file, "r", encoding="utf-8") as stopword_file: - stopwords = set(stopword_file.read().splitlines()) - stopwords = stopwords.union(stopwords1) - filtered_word_count = {word: count for word, count in word_count.items() if len(word) > 1 and word not in stopwords} - - # 转换为词云数据格式 - data = [(word, count) for word, count in filtered_word_count.items()] - # text_data = data - data.sort(key=lambda x: x[1], reverse=True) - - text_data = data[:100] if len(data) > 100 else data - # 创建词云图 - keyword, max_num = text_data[0] - w = ( - WordCloud(init_opts=opts.InitOpts()) - .add(series_name="聊天文字", data_pair=text_data, word_size_range=[5, 100]) - ) - # return w.render_embed() - return { - 'chart_data': w.dump_options_with_quotes(), - 'keyword': keyword, - 'max_num': str(max_num), - 'dialogs': msg_db.get_messages_by_keyword(wxid, keyword, num=5, max_len=12) - } - - -def get_wordcloud(text): - total_msg_len = len(text) - jieba.load_userdict('./app/data/new_words.txt') - # 使用jieba进行分词,并加入停用词 - words = jieba.cut(text) - # 统计词频 - word_count = Counter(words) - # 过滤停用词 - stopwords_file = './app/data/stopwords.txt' - with open(stopwords_file, "r", encoding="utf-8") as stopword_file: - stopwords1 = set(stopword_file.read().splitlines()) - # 构建 FFmpeg 可执行文件的路径 - stopwords = set() - stopwords_file = './app/resources/data/stopwords.txt' - if not os.path.exists(stopwords_file): - resource_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__))) - stopwords_file = os.path.join(resource_dir, 'app', 'resources', 'data', 'stopwords.txt') - with open(stopwords_file, "r", encoding="utf-8") as stopword_file: - stopwords = set(stopword_file.read().splitlines()) - stopwords = stopwords.union(stopwords1) - - filtered_word_count = {word: count for word, count in word_count.items() if len(word) > 1 and word not in stopwords} - # 转换为词云数据格式 - data = [(word, count) for word, count in filtered_word_count.items()] - # text_data = data - data.sort(key=lambda x: x[1], reverse=True) - - text_data = data[:100] if len(data) > 100 else data - # 创建词云图 - if text_data: - keyword, max_num = text_data[0] - else: - keyword, max_num = '', 0 - w = ( - WordCloud() - .add(series_name="聊天文字", data_pair=text_data, word_size_range=[5, 40]) - ) - return { - 'chart_data_wordcloud': w.dump_options_with_quotes(), - 'keyword': keyword, - 'keyword_max_num': max_num, - } - - -def wordcloud_christmas(wxid,time_range=None, year='2023'): - import jieba - - txt_messages = msg_db.get_messages_by_type(wxid, MsgType.TEXT, time_range=time_range) - if not txt_messages: - return { - 'wordcloud_chart_data': None, - 'keyword': "没有聊天你想分析啥", - 'max_num': '0', - 'dialogs': [], - 'total_num': 0, - } - text = ''.join(map(lambda x: x[7], txt_messages)) - total_msg_len = len(text) - wordcloud_data = get_wordcloud(text) - # return w.render_embed() - keyword = wordcloud_data.get('keyword') - max_num = wordcloud_data.get('keyword_max_num') - dialogs = msg_db.get_messages_by_keyword(wxid, keyword, num=3, max_len=12, time_range=time_range) - - return { - 'wordcloud_chart_data': wordcloud_data.get('chart_data_wordcloud'), - 'keyword': keyword, - 'keyword_max_num': str(max_num), - 'dialogs': dialogs, - 'total_num': total_msg_len, - } - - -def calendar_chart(wxid, time_range=None): - calendar_data = msg_db.get_messages_by_days(wxid, time_range) - if not calendar_data: - return { - 'chart_data': None, - 'calendar_chart_data': None, - 'chat_days': 0, - # 'chart':c, - } - min_ = min(map(lambda x: x[1], calendar_data)) - max_ = max(map(lambda x: x[1], calendar_data)) - start_date_ = calendar_data[0][0] - end_date_ = calendar_data[-1][0] - print(start_date_, '---->', end_date_) - calendar_days = (start_date_, end_date_) - calendar_title = '和Ta的聊天情况' - c = ( - Calendar() - .add( - "", - calendar_data, - calendar_opts=opts.CalendarOpts(range_=calendar_days) - ) - .set_global_opts( - visualmap_opts=opts.VisualMapOpts( - max_=max_, - min_=min_, - orient="horizontal", - pos_bottom="0px", - pos_left="0px", - ), - legend_opts=opts.LegendOpts(is_show=False) - ) - ) - return { - 'chart_data': c.dump_options_with_quotes(), - 'calendar_chart_data': c.dump_options_with_quotes(), - 'chat_days': len(calendar_data), - # 'chart':c, - } - - -def month_count(wxid, time_range=None): - """ - 每月聊天条数 - """ - msg_data = msg_db.get_messages_by_month(wxid, time_range) - y_data = list(map(lambda x: x[1], msg_data)) - x_axis = list(map(lambda x: x[0], msg_data)) - m = ( - Bar(init_opts=opts.InitOpts()) - .add_xaxis(x_axis) - .add_yaxis("消息数量", y_data, - label_opts=opts.LabelOpts(is_show=True), - itemstyle_opts=opts.ItemStyleOpts(color="#ffae80"), - ) - .set_global_opts( - title_opts=opts.TitleOpts(title="逐月统计", subtitle=None), - datazoom_opts=opts.DataZoomOpts(), - toolbox_opts=opts.ToolboxOpts(), - yaxis_opts=opts.AxisOpts( - name="消息数", - type_="value", - axistick_opts=opts.AxisTickOpts(is_show=True), - splitline_opts=opts.SplitLineOpts(is_show=True), - ), - visualmap_opts=opts.VisualMapOpts( - min_=min(y_data), - max_=max(y_data), - dimension=1, # 根据第2个维度(y 轴)进行映射 - is_piecewise=False, # 是否分段显示 - range_color=["#ffbe7a", "#fa7f6f"], # 设置颜色范围 - type_="color", - pos_right="0%", - ), - ) - ) - return { - 'chart_data': m.dump_options_with_quotes(), - # 'chart': m, - } - - -def hour_count(wxid, is_Annual_report=False, year='2023'): - """ - 小时计数聊天条数 - """ - msg_data = msg_db.get_messages_by_hour(wxid, is_Annual_report, year) - print(msg_data) - y_data = list(map(lambda x: x[1], msg_data)) - x_axis = list(map(lambda x: x[0], msg_data)) - h = ( - Line(init_opts=opts.InitOpts()) - .add_xaxis(xaxis_data=x_axis) - .add_yaxis( - series_name="聊天频率", - y_axis=y_data, - markpoint_opts=opts.MarkPointOpts( - data=[ - opts.MarkPointItem(type_="max", name="最大值"), - opts.MarkPointItem(type_="min", name="最小值", value=int(10)), - ] - ), - markline_opts=opts.MarkLineOpts( - data=[opts.MarkLineItem(type_="average", name="平均值")] - ), - ) - .set_global_opts( - title_opts=opts.TitleOpts(title="聊天时段", subtitle=None), - # datazoom_opts=opts.DataZoomOpts(), - # toolbox_opts=opts.ToolboxOpts(), - ) - .set_series_opts( - label_opts=opts.LabelOpts( - is_show=False - ) - ) - ) - - return { - 'chart_data': h - } - - -types = { - '文本': 1, - '图片': 3, - '语音': 34, - '视频': 43, - '表情包': 47, - '音乐与音频': 4903, - '文件': 4906, - '分享卡片': 4905, - '转账': 492000, - '音视频通话': 50, - '拍一拍等系统消息': 10000, -} -types_ = { - 1: '文本', - 3: '图片', - 34: '语音', - 43: '视频', - 47: '表情包', - 4957: '引用消息', - 4903: '音乐与音频', - 4906: '文件', - 4905: '分享卡片', - 492000: '转账', - 50: '音视频通话', - 10000: '拍一拍等系统消息', -} - - -def get_weekday(timestamp): - # 将时间戳转换为日期时间对象 - dt_object = datetime.fromtimestamp(timestamp) - - # 获取星期几,0代表星期一,1代表星期二,以此类推 - weekday = dt_object.weekday() - weekdays = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] - return weekdays[weekday] - - -def sender(wxid, time_range, my_name='', ta_name=''): - msg_data = msg_db.get_messages(wxid, time_range) - - types_count = {} - send_num = 0 # 发送消息的数量 - weekday_count = {} - for message in msg_data: - type_ = message[2] - is_sender = message[4] - subType = message[3] - timestamp = message[5] - weekday = get_weekday(timestamp) - str_time = message[8] - send_num += is_sender - type_ = f'{type_}{subType:0>2d}' if subType != 0 else type_ - type_ = int(type_) - if type_ in types_count: - types_count[type_] += 1 - else: - types_count[type_] = 1 - if weekday in weekday_count: - weekday_count[weekday] += 1 - else: - weekday_count[weekday] = 1 - receive_num = len(msg_data) - send_num - data = [[types_.get(key), value] for key, value in types_count.items() if key in types_] - if not data: - return { - 'chart_data_sender': None, - 'chart_data_types': None, - 'chart_data_weekday': None, - } - p1 = ( - Pie() - .add( - "", - data, - center=["40%", "50%"], - ) - .set_global_opts( - datazoom_opts=opts.DataZoomOpts(), - toolbox_opts=opts.ToolboxOpts(), - title_opts=opts.TitleOpts(title="消息类型占比"), - legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", pos_top="20%", orient="vertical"), - ) - .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) - # .render("./data/聊天统计/types_pie.html") - ) - p2 = ( - Pie() - .add( - "", - [[my_name, send_num], [ta_name, receive_num]], - center=["40%", "50%"], - ) - .set_global_opts( - datazoom_opts=opts.DataZoomOpts(), - toolbox_opts=opts.ToolboxOpts(), - title_opts=opts.TitleOpts(title="双方消息占比"), - legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", pos_top="20%", orient="vertical"), - ) - .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}\n{d}%")) - # .render("./data/聊天统计/pie_scroll_legend.html") - ) - p3 = ( - Pie() - .add( - "", - [[key, value] for key, value in weekday_count.items()], - radius=["40%", "75%"], - ) - .set_global_opts( - datazoom_opts=opts.DataZoomOpts(), - toolbox_opts=opts.ToolboxOpts(), - title_opts=opts.TitleOpts(title="星期分布图"), - legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"), - ) - .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}\n{d}%")) - # .render("./data/聊天统计/pie_weekdays.html") - ) - return { - 'chart_data_sender': p2.dump_options_with_quotes(), - 'chart_data_types': p1.dump_options_with_quotes(), - 'chart_data_weekday': p3.dump_options_with_quotes(), - } - - -def contacts_analysis(contacts): - man_contact_num = 0 - woman_contact_num = 0 - province_dict = { - '北京': '北京市', - '上海': '上海市', - '天津': '天津市', - '重庆': '重庆市', - '新疆': '新疆维吾尔族自治区', - '广西': '广西壮族自治区', - '内蒙古': '内蒙古自治区', - '宁夏': '宁夏回族自治区', - '西藏': '西藏自治区' - } - provinces = [] - for contact, num, text_length in contacts: - if contact.detail.get('gender') == 1: - man_contact_num += 1 - elif contact.detail.get('gender') == 2: - woman_contact_num += 1 - province_py = contact.detail.get('region') - if province_py: - province = province_py[1] - province = conversion_province_to_chinese(province) - if province: - if province in province_dict: - province = province_dict[province] - else: - province += '省' - provinces.append(province) - print(province, contact.detail) - data = Counter(provinces) - data = [[k, v] for k, v in data.items()] - print(data) - max_ = max(list(map(lambda x:x[1],data))) - c = ( - Map() - .add("分布", data, "china") - .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) - .set_global_opts( - title_opts=opts.TitleOpts(title="地区分布"), - visualmap_opts=opts.VisualMapOpts(max_=max_, is_piecewise=True), - legend_opts=opts.LegendOpts(is_show=False), - ) - ) - return { - 'woman_contact_num': woman_contact_num, - 'man_contact_num': man_contact_num, - 'contact_region_map': c.dump_options_with_quotes(), - } - - -def my_message_counter(time_range, my_name=''): - msg_data = msg_db.get_messages_all(time_range=time_range) - types_count = {} - send_num = 0 # 发送消息的数量 - weekday_count = {} - str_content = '' - total_text_num = 0 - for message in msg_data: - type_ = message[2] - is_sender = message[4] - subType = message[3] - timestamp = message[5] - weekday = get_weekday(timestamp) - str_time = message[8] - send_num += is_sender - type_ = f'{type_}{subType:0>2d}' if subType != 0 else type_ - type_ = int(type_) - if type_ in types_count: - types_count[type_] += 1 - else: - types_count[type_] = 1 - if weekday in weekday_count: - weekday_count[weekday] += 1 - else: - weekday_count[weekday] = 1 - if type_ == 1: - total_text_num += len(message[7]) - if is_sender == 1: - str_content += message[7] - receive_num = len(msg_data) - send_num - data = [[types_.get(key), value] for key, value in types_count.items() if key in types_] - if not data: - return { - 'chart_data_sender': None, - 'chart_data_types': None, - } - p1 = ( - Pie() - .add( - "", - data, - center=["40%", "50%"], - ) - .set_global_opts( - datazoom_opts=opts.DataZoomOpts(), - legend_opts=opts.LegendOpts(type_="scroll", pos_left="70%", pos_top="10%", orient="vertical"), - ) - .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) - # .render("./data/聊天统计/types_pie.html") - ) - p2 = ( - Pie() - .add( - "", - [['发送', send_num], ['接收', receive_num]], - center=["40%", "50%"], - ) - .set_global_opts( - datazoom_opts=opts.DataZoomOpts(), - legend_opts=opts.LegendOpts(type_="scroll", pos_left="70%", pos_top="20%", orient="vertical"), - ) - .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}\n{d}%", position='inside')) - # .render("./data/聊天统计/pie_scroll_legend.html") - ) - w = get_wordcloud(str_content) - return { - 'chart_data_sender': p2.dump_options_with_quotes(), - 'chart_data_types': p1.dump_options_with_quotes(), - 'chart_data_wordcloud': w.get('chart_data_wordcloud'), - 'keyword': w.get('keyword'), - 'keyword_max_num': w.get('keyword_max_num'), - 'total_text_num': total_text_num, - } - - -if __name__ == '__main__': - msg_db.init_database(path='../DataBase/Msg/MSG.db') - # w = wordcloud('wxid_0o18ef858vnu22') - # w_data = wordcloud('wxid_27hqbq7vx5hf22', True, '2023') - # # print(w_data) - # w_data['chart_data'].render("./data/聊天统计/wordcloud.html") - wxid = 'wxid_0o18ef858vnu22' - # data = month_count(wxid, time_range=None) - # data['chart'].render("./data/聊天统计/month_count.html") - # data = calendar_chart(wxid, time_range=None) - # data['chart'].render("./data/聊天统计/calendar_chart.html") - data = sender(wxid, time_range=None, my_name='发送', ta_name='接收') - print(data) diff --git a/app/components/Button_Contact.py b/app/components/Button_Contact.py deleted file mode 100644 index 8486d5a..0000000 --- a/app/components/Button_Contact.py +++ /dev/null @@ -1,103 +0,0 @@ -from datetime import datetime - -from PyQt5 import QtWidgets, QtGui, QtCore -from PyQt5.QtCore import * - -from app import person - - -class ContactUi(QtWidgets.QPushButton): - """ - 联系人类,继承自pyqt的按钮,里面封装了联系人头像等标签 - """ - usernameSingal = pyqtSignal(str) - - def __init__(self, Ui, id=None, rconversation=None): - super(ContactUi, self).__init__(Ui) - self.contact: person.Contact = person.Contact(rconversation[1]) - self.init_ui(Ui) - self.msgCount = rconversation[0] - self.username = rconversation[1] - self.conversationTime = rconversation[6] - self.msgType = rconversation[7] - self.digest = rconversation[8] - hasTrunc = rconversation[10] - attrflag = rconversation[11] - if hasTrunc == 0: - if attrflag == 0: - self.digest = '[动画表情]' - elif attrflag == 67108864: - try: - remark = data.get_conRemark(rconversation[9]) - msg = self.digest.split(':')[1].strip('\n').strip() - self.digest = f'{remark}:{msg}' - except Exception as e: - pass - else: - pass - self.show_info(id) - - def init_ui(self, Ui): - self.layoutWidget = QtWidgets.QWidget(Ui) - self.layoutWidget.setObjectName("layoutWidget") - self.gridLayout1 = QtWidgets.QGridLayout(self.layoutWidget) - self.gridLayout1.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize) - self.gridLayout1.setContentsMargins(10, 10, 10, 10) - self.gridLayout1.setSpacing(10) - self.gridLayout1.setObjectName("gridLayout1") - self.label_time = QtWidgets.QLabel(self.layoutWidget) - font = QtGui.QFont() - font.setFamily("微软雅黑") - font.setPointSize(8) - self.label_time.setFont(font) - self.label_time.setLayoutDirection(QtCore.Qt.RightToLeft) - self.label_time.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) - self.label_time.setObjectName("label_time") - self.gridLayout1.addWidget(self.label_time, 0, 2, 1, 1) - self.label_remark = QtWidgets.QLabel(self.layoutWidget) - font = QtGui.QFont() - font.setFamily("黑体") - font.setPointSize(10) - # font.setBold(True) - self.label_remark.setFont(font) - self.label_remark.setObjectName("label_remark") - self.gridLayout1.addWidget(self.label_remark, 0, 1, 1, 1) - self.label_msg = QtWidgets.QLabel(self.layoutWidget) - font = QtGui.QFont() - font.setFamily("微软雅黑") - font.setPointSize(8) - self.label_msg.setFont(font) - self.label_msg.setObjectName("label_msg") - self.gridLayout1.addWidget(self.label_msg, 1, 1, 1, 2) - self.label_avatar = QtWidgets.QLabel(self.layoutWidget) - self.label_avatar.setMinimumSize(QtCore.QSize(60, 60)) - self.label_avatar.setMaximumSize(QtCore.QSize(60, 60)) - self.label_avatar.setLayoutDirection(QtCore.Qt.RightToLeft) - self.label_avatar.setAutoFillBackground(False) - self.label_avatar.setStyleSheet("background-color: #ffffff;") - self.label_avatar.setInputMethodHints(QtCore.Qt.ImhNone) - self.label_avatar.setFrameShape(QtWidgets.QFrame.NoFrame) - self.label_avatar.setFrameShadow(QtWidgets.QFrame.Plain) - self.label_avatar.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) - self.label_avatar.setObjectName("label_avatar") - self.gridLayout1.addWidget(self.label_avatar, 0, 0, 2, 1) - self.gridLayout1.setColumnStretch(0, 1) - self.gridLayout1.setColumnStretch(1, 6) - self.gridLayout1.setRowStretch(0, 5) - self.gridLayout1.setRowStretch(1, 3) - self.setLayout(self.gridLayout1) - self.setStyleSheet( - "QPushButton {background-color: rgb(220,220,220);}" - "QPushButton:hover{background-color: rgb(208,208,208);}\n" - ) - - def show_info(self, id): - time = datetime.now().strftime("%m-%d %H:%M") - msg = '还没说话' - self.label_avatar.setPixmap(self.contact.avatar) # 在label上显示图片 - self.label_remark.setText(self.contact.conRemark) - self.label_msg.setText(self.digest) - self.label_time.setText(data.timestamp2str(self.conversationTime)[2:]) - - def show_msg(self): - self.usernameSingal.emit(self.username) diff --git a/app/components/CAvatar.py b/app/components/CAvatar.py deleted file mode 100644 index 74c0ba7..0000000 --- a/app/components/CAvatar.py +++ /dev/null @@ -1,303 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -Created on 2019年7月26日 -@author: Irony -@site: https://pyqt5.com https://github.com/892768447 -@email: 892768447@qq.com -@file: CustomWidgets.CAvatar -@description: 头像 -""" -import os - -from PyQt5.QtCore import QUrl, QRectF, Qt, QSize, QTimer, QPropertyAnimation, \ - QPointF, pyqtProperty -from PyQt5.QtGui import QPixmap, QColor, QPainter, QPainterPath, QMovie -from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkDiskCache, \ - QNetworkRequest -from PyQt5.QtWidgets import QWidget, qApp - -__Author__ = 'Irony' -__Copyright__ = 'Copyright (c) 2019 Irony' -__Version__ = 1.0 - - -class CAvatar(QWidget): - Circle = 0 # 圆圈 - Rectangle = 1 # 圆角矩形 - SizeLarge = QSize(128, 128) - SizeMedium = QSize(64, 64) - SizeSmall = QSize(32, 32) - StartAngle = 0 # 起始旋转角度 - EndAngle = 360 # 结束旋转角度 - - def __init__(self, *args, shape=0, url='', img_bytes=None, cacheDir=False, size=QSize(64, 64), animation=False, - **kwargs): - super(CAvatar, self).__init__(*args, **kwargs) - self.url = '' - self._angle = 0 # 角度 - self.pradius = 0 # 加载进度条半径 - self.animation = animation # 是否使用动画 - self._movie = None # 动态图 - self._pixmap = QPixmap() # 图片对象 - self.pixmap = QPixmap() # 被绘制的对象 - self.isGif = url.endswith('.gif') - # 进度动画定时器 - self.loadingTimer = QTimer(self, timeout=self.onLoading) - # 旋转动画 - self.rotateAnimation = QPropertyAnimation( - self, b'angle', self, loopCount=1) - self.setShape(shape) - self.setCacheDir(cacheDir) - self.setSize(size) - if img_bytes: - self.setBytes(img_bytes) - - - else: - self.setUrl(url) - - def paintEvent(self, event): - super(CAvatar, self).paintEvent(event) - # 画笔 - painter = QPainter(self) - painter.setRenderHint(QPainter.Antialiasing, True) - painter.setRenderHint(QPainter.HighQualityAntialiasing, True) - painter.setRenderHint(QPainter.SmoothPixmapTransform, True) - # 绘制 - path = QPainterPath() - diameter = min(self.width(), self.height()) - if self.shape == self.Circle: - radius = int(diameter / 2) - elif self.shape == self.Rectangle: - radius = 4 - halfW = self.width() / 2 - halfH = self.height() / 2 - painter.translate(halfW, halfH) - path.addRoundedRect( - QRectF(-halfW, -halfH, diameter, diameter), radius, radius) - painter.setClipPath(path) - # 如果是动画效果 - if self.rotateAnimation.state() == QPropertyAnimation.Running: - painter.rotate(self._angle) # 旋转 - painter.drawPixmap( - QPointF(-self.pixmap.width() / 2, -self.pixmap.height() // 2), self.pixmap) - else: - painter.drawPixmap(-int(halfW), -int(halfH), self.pixmap) - # 如果在加载 - if self.loadingTimer.isActive(): - diameter = 2 * self.pradius - painter.setBrush( - QColor(45, 140, 240, int((1 - self.pradius / 10) * 255))) - painter.setPen(Qt.NoPen) - painter.drawRoundedRect( - QRectF(-self.pradius, -self.pradius, diameter, diameter), self.pradius, self.pradius) - - def enterEvent(self, event): - """鼠标进入动画 - :param event: - """ - if not (self.animation and not self.isGif): - return - self.rotateAnimation.stop() - cv = self.rotateAnimation.currentValue() or self.StartAngle - self.rotateAnimation.setDuration( - 540 if cv == 0 else int(cv / self.EndAngle * 540)) - self.rotateAnimation.setStartValue(cv) - self.rotateAnimation.setEndValue(self.EndAngle) - self.rotateAnimation.start() - - def leaveEvent(self, event): - """鼠标离开动画 - :param event: - """ - if not (self.animation and not self.isGif): - return - self.rotateAnimation.stop() - cv = self.rotateAnimation.currentValue() or self.EndAngle - self.rotateAnimation.setDuration(int(cv / self.EndAngle * 540)) - self.rotateAnimation.setStartValue(cv) - self.rotateAnimation.setEndValue(self.StartAngle) - self.rotateAnimation.start() - - def onLoading(self): - """更新进度动画 - """ - if self.loadingTimer.isActive(): - if self.pradius > 9: - self.pradius = 0 - self.pradius += 1 - else: - self.pradius = 0 - self.update() - - def onFinished(self): - """图片下载完成 - """ - self.loadingTimer.stop() - self.pradius = 0 - reply = self.sender() - - if self.isGif: - self._movie = QMovie(reply, b'gif', self) - if self._movie.isValid(): - self._movie.frameChanged.connect(self._resizeGifPixmap) - self._movie.start() - else: - data = reply.readAll().data() - reply.deleteLater() - del reply - self._pixmap.loadFromData(data) - if self._pixmap.isNull(): - self._pixmap = QPixmap(self.size()) - self._pixmap.fill(QColor(204, 204, 204)) - self._resizePixmap() - - def onError(self, code): - """下载出错了 - :param code: - """ - self._pixmap = QPixmap(self.size()) - self._pixmap.fill(QColor(204, 204, 204)) - self._resizePixmap() - - def refresh(self): - """强制刷新 - """ - self._get(self.url) - - def isLoading(self): - """判断是否正在加载 - """ - return self.loadingTimer.isActive() - - def setShape(self, shape): - """设置形状 - :param shape: 0=圆形, 1=圆角矩形 - """ - self.shape = shape - - def setBytes(self, img_bytes): - self._pixmap = QPixmap() - if isinstance(img_bytes, bytes): - if img_bytes[:4] == b'\x89PNG': - self._pixmap.loadFromData(img_bytes, format='PNG') - else: - self._pixmap.loadFromData(img_bytes, format='jfif') - elif isinstance(img_bytes, QPixmap): - self._pixmap = img_bytes - self._resizePixmap() - - def setUrl(self, url): - """设置url,可以是本地路径,也可以是网络地址 - :param url: - """ - return - self.url = url - self._get(url) - - def setCacheDir(self, cacheDir=''): - """设置本地缓存路径 - :param cacheDir: - """ - self.cacheDir = cacheDir - self._initNetWork() - - def setSize(self, size): - """设置固定尺寸 - :param size: - """ - if not isinstance(size, QSize): - size = self.SizeMedium - self.setMinimumSize(size) - self.setMaximumSize(size) - self._resizePixmap() - - @pyqtProperty(int) - def angle(self): - return self._angle - - @angle.setter - def angle(self, value): - self._angle = value - self.update() - - def _resizePixmap(self): - """缩放图片 - """ - if not self._pixmap.isNull(): - self.pixmap = self._pixmap.scaled( - self.width(), self.height(), Qt.IgnoreAspectRatio, Qt.SmoothTransformation) - self.update() - - def _resizeGifPixmap(self, _): - """缩放动画图片 - """ - if self._movie: - self.pixmap = self._movie.currentPixmap().scaled( - self.width(), self.height(), Qt.IgnoreAspectRatio, Qt.SmoothTransformation) - self.update() - - def _initNetWork(self): - """初始化异步网络库 - """ - if not hasattr(qApp, '_network'): - network = QNetworkAccessManager(self.window()) - setattr(qApp, '_network', network) - # 是否需要设置缓存 - if self.cacheDir and not qApp._network.cache(): - cache = QNetworkDiskCache(self.window()) - cache.setCacheDirectory(self.cacheDir) - qApp._network.setCache(cache) - - def _get(self, url): - """设置图片或者请求网络图片 - :param url: - """ - if not url: - self.onError('') - return - if url.startswith('http') and not self.loadingTimer.isActive(): - url = QUrl(url) - request = QNetworkRequest(url) - # request.setHeader(QNetworkRequest.UserAgentHeader, b'CAvatar') - # request.setRawHeader(b'Author', b'Irony') - request.setAttribute( - QNetworkRequest.FollowRedirectsAttribute, True) - if qApp._network.cache(): - request.setAttribute( - QNetworkRequest.CacheLoadControlAttribute, QNetworkRequest.PreferNetwork) - request.setAttribute( - QNetworkRequest.CacheSaveControlAttribute, True) - reply = qApp._network.get(request) - self.pradius = 0 - self.loadingTimer.start(50) # 显示进度动画 - reply.finished.connect(self.onFinished) - reply.error.connect(self.onError) - return - self.pradius = 0 - if os.path.exists(url) and os.path.isfile(url): - if self.isGif: - self._movie = QMovie(url, parent=self) - if self._movie.isValid(): - self._movie.frameChanged.connect(self._resizeGifPixmap) - self._movie.start() - else: - self._pixmap = QPixmap(url) - self._resizePixmap() - else: - self.onError('') - - -if __name__ == '__main__': - import sys - from PyQt5.QtWidgets import QApplication - - app = QApplication(sys.argv) - w = CAvatar( - img_bytes=b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x84\x00\x00\x00\x84\x08\x00\x00\x00\x00t/\xdc{\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x02bKGD\x00\xff\x87\x8f\xcc\xbf\x00\x00\x0e\x8fIDATx\xda\xed\x9b[\x8c]\xd7Y\xc7\xbf\xff\xb7\xd6\xde\xfb\x9c3w\xdf&\xbe\xdf\x9d\xa4\xbe\xc4\x89krmI\xdc\x06\xa5i\xa0$\x95\xa0\x95\x02U\x0bBH(\\\xfa\x80\x10<\xf0\xd6\x07\xfa\x80D\x1e\xa0P\xa2\x02-\xa1)%j\x13\xd2\xe6~O\x9a\xc4J\x9a\xc4\x8e\xeb\xcb8\xf8\x9eq\xec\x8c\xe7~\xf6\xdek}\x7f\x1e\xce\x8c\xc7g<c\x8f\x8dP\x04:K\x9a\x87\xd93k\xed\xdf\xf9\xd6w\xfff0&\x1f\xff\xd2\x8f\x1b\xa0\x05\xd1\x82hA\xb4 Z\x10-\x88\x16D\x0b\xa2\x05\xd1\x82hA\xb4 Z\x10-\x88\x16D\x0b\xe2\xe3\x06hA\\.\x04\xe6\xf0\x1c""\x049\xf5\x90\x14\x10 \x85\x8d\xef.\x05\x02"\x94\xcbZJU\x9b8\x81\x02\x08\x1d\xa9J\x15\x11\xcc\xf0Q\xfc\xecG]&\x81\x88P h\x9c\x00\x8a\x88\xd0DL@\n\x00\x9b;\x04\x84\x00\xe2eb\x14\xe2\x05b\x02\x884d!@C4v\xbe(f\x85\xa0\x88ApY\xf2\x88.\x01HN^(\xa1AT"\x01\x88\x9e\x7f\xe2\xec\xd7\x01\x11\x9a\x9f\x90\xe7\xa5-\x1fI:\x00\x93*a\xe6\xa4\xa4\xa6\x9c\xd0\xceikv\xc5\xa48\x970\x10\x86\te\xe2\xac\xbf9e"\x14\xc6(\x92\xb0b\x89D\x03\x80\x08\x08T\x99i\x11\x01^\x92b\x82%\x08/\xd4\x86\xbd\x11r\xa1\xd5 \x84\xc1\x07"\xee\xdc\xb3ce\xee\xa1\xa6$\xd5$\xab\x7f0\xd0\xb9\x04*\xa22\xa9\xb3s\x81\x88\xe2)4\x99\x80\x9f\xc3\xad\x80b\xa0\xa9\xc5\xf0\xcc\xf3\xd9b\xe6\x95\xe0\x84\xa2F\xb5\xe2\x91\xe7\x97\xfe\xe1\x9a\xc2<\x02\x08a\x93s\x99\xfd:\xdc\x81\xe7\xfb\xe1\xa2\xa9QA\x02\x17e\x10\x08\x84j\xeaC\x91?\xbd\xab\xe2\xe8i".\x98+G\xfaN\x1c\x19\x89\xe2\xactP@\x9bN\x9b\x15\x02\xac}\xeb\x89\x93P\x95\t\xfb\xba\x08D\xe3\xb6,\xd4sG\xab\xf5\xf2\xf03C\x88^D\x85J\x89\xffu\xc4wVM\xc49\x13r\x9a\xdb\x9c\xddD\xd1\xbb\xf5\xdfG\x7f\xcfATJ\xc5\x1cl\x15B\x08\x9f\x1e\xde\xb8\xba\x1b5W\x7f*[\xd2\xbdpu\x1b\x18\xb3\x82\xf9\xeb\x03\\?\xdf\xd2\xa2\xf4<\xdf\xf0/\xe01\xfd\x1d{~\xd8sw%w\x14\xa5\x98^\x84\x82""\x8a\r\xdf\xfc\xce\xf2\xcd\x0b\xdfN+\xe3\x0f\x87\xb8\xee\xbek\xcb\x04\xe3\xb5\xf8\xeeK\xf9\xaaO\xb7\xa7uT\x82*\x85l:\xcd\xfd\xc5,g*\x13\x9cy\x7f\xff\xc2\xe5>:\x05\xe7\xa0\x11\x8d\xaf\x85m\xa1o\xcf\xdb\xc7d(]\xb8\xe2\xc6\x1d\xd7\xd4\x9cYR\x0e~{/v\xdce\x89c\xa4\x93(\x8a\xb9YG\xe9\x87zox\xf9\xe4\xc3\xab\xd6\xa4!\xb1\x8b\xdb\x06H\x81\x18\xc2\x8e\xab\xde\xdd\xd7\x7f\xf4x\xfb\x95_Y0\xbf\xcd\x8fV\x10\x92\xfa\xab\xafiu\xad\xef\xff\xa8\xad\xc3k.N\x8c\xde\xe6\x02\x91X\xfb\xc8\x96\xbb\xef\xef{q%9W\xa7I8qq\xe9\xaa\xba\x7f\xe4\xaf\xd0}CI\xa9w\x94\x92\xe4|M\x92\xc1\x1f\xffp\xa0\\\xbaz\xed-\xcb\x02\xc5I\x9c\x93\x89F\xc9\xdb\xf4\xa6u#oEK"/\xae\x97\x13a\x8aP\xab{\x89\x9ai\x10I\xd2h\xa4\xd7M\xcep\xf0\xe0P\xb1\xf7\x89\x87\xfb\xcdT\xa35\xbd\xf7\x02Q\xb42Z\xe9\xbd\xb3\\e\x19\xa3\x83\\,\x88Lz\xd5<d*\xb44/I+-Q\xf1E\xe5\xd3#\xa3Y]\xdf\xda[\x1d\xd9\xb4\x04f\x829\xea\x84\x88y\xf8\xbb\xb6\xf5V\x0c)\x82\xb9\xa8S/k\xf8\x8e\xa6\x83\x1a\x8f\rYf\xa5\xb7\x93A\xc3\xdb\xfd\x8b6%y\x8a\xd1\x8e\xb1\xc5\xbf\x0b\xe6\xfb\x7f\xe1\xdd\xb5\xf7\\\x91Wcd\xb3f^\x00\x02\x1a\x83\xae\xb2\xd2\xab\x01:\xc10\xf9\xb2Y\x82\tPHQ\xba\x91\x93>\xec\xfa\xe6\xa9E\x7f\xb2\xcd\x19\xd3\xa0\xa5y\xdb\xf7\xd0\x01\xae\xfe\xf2\x1as\x05\xc5ISVq\x81\xeb(\x13\x83\x99\xa51\n`\x93\x12\xa4\xc1\x899\x03g\xf4\x1c\xc1\r?\xb87\xb5\xfdeU\x8f\xc9\xday\xae,3Ww\xce\x87\x03\x7f\xb3/n\xf9\xdaV\x9a+t:\xfd\xec\x1e\x93,\xd5\x99(c\xc6\xd2CCC\x14\xce\xd1D\x83\xe8\xcc1-\xa9\xa3~hl,\xf3y\\w\xe7\x1d\xedCY-\x94\xd5\x10\x8b\x9d\x0f\x1c\xf5\xb7\xfd\xc1<\x12\x92\x80\xd6\x1c\x04fuV\x02OD\x07\x19T\x11\x188q\x1dQ\xd5\x04\xe6\xc1\x99<\x18$\xb4]\xb5\xf2\xe4@\x84\xdf\xf6\xa5\xb5C\xbe\xeaL\xbc!>\xfb\xd0\x01\xd7yko\xae\xa9\x16\x89L\x0b\xa2\x82\xd9\xc6\xd4 \xb32d\x05\x1f\x18\xea\xd9\xbe\x99>LlCd\x1c\x1e\xec\xad\x00\xcef\xda\x86 \xbe\xef\x9f_\tze\xd7\xe9p\xd3\xe7{\x05\x9a\x87\xe7\xff\xb1\xdf\xa5\xd6\xd3\xd9\xbd\xf6\xc6++\x88\xe2%\x9ck\xa3~\xfa\x9b\x01S\x98\x90*c\x99\xaf\x8f<\xf2\x83\xb0\xf9\x97\x95\xa1\xf1\xc9A\xd3\xf2\xfb\x8f\xf7\xddq\xcf\xd5\xa9\x988kd\xb2\x84PI\x15C\x89dt\xc9\x8a\x97\x93\xb0/P\x0f\xad\xee\x8db\x95#\x8f\x7f8?J\xc6\xc1\x93\xaf\xfd\xe4\x86\xdf\\\xee\x94\xe6&\xee\x92\xa2\xc2&\x08\x98\x12A%B`\xa20=\xfe\xd8\x13\xf3v|nY\x14g"0g\xaaq\xffw\xeb\xdd/\x9e\xba\xf7\xc6\x89\x84\xeb\x9c\xfc\x9eP\xf3&\xd9\xce\x9d\x06\xcb\x13\xcf\rW\x88de\xb9\xe8W7V\xbb*\x95\x04\xa3\xfb\x1e~\xe6\xc3\xfb\xd6\xda\x94m@8M\x12\x06(\x9dF:\x13GI\xeb\xbb\xbfs\xb0\xe7\xf77v$\xb9\x06O:3\x04\x05\xaf\x1b\xda\'{~\xb2\xb9\xcdEN\xe6j\x80\x882B\x11\xad|\xf1\xfb\x07T\xb6v\xbdw|\xc1\xe7\xd6\xa9\x14\xd0\xb6\xed\xb7\xb8\xb2f\x92\xc4m\xaf\x1fy\xe7G_\xeb\xd0sL\x94\xc04\xeb(\xb2\xc2\x9bc\x84)\xf3\xddO\xbdT\xbd\xe3\x8b\xf3\x13\xe6ItA\x11|\x84\x037\xfd\xe5\xb1\xbf\xdec;\x87k\xc0\x84;\x07i>\x06u\x8cq\xfc\xcd\x9f\xf6\xf5\xa7\xba\xed\x8f\x16\xbe;\xb8hSn\xc1%%{\xf2\x98Y\t\x14X\xb4\xdf?\xbf\xf6\xf38\x1b:(Nl\x1aD\x02\xc4$OH\x8d\xbb\xdex\xb2\xbe\xfc\xcb\xd7u0\xba`e\xadT\x8d\x12\x1c(l\x93")RD\xe7\x08C#h0\x00.\x8e\x1f\xdb\xb3\xfb\xb5\x81\xaa\xc0_\xb7H\xb6\x92\xa52\x95 RG\xc5\xe2/\x0e/\x08\xbbv\xb3}\xe0\xe0x\xdb\x94q@8]\'\xdc@\xa5V*a\x07~\xfc\xf6\xc9\xee;\xefXn\xfd\x03\xebU\xd4["\xa7\xdf]\xb1\xba\xf0j \xa3\xf94u\r\xff\xa5\xc2(p&c\xc7\xf7\xee~kt\xacm\xd5\xe9T\xe5\x13\t\xcaX\x89"\xb1D\xd5\x0c6\xbe\xf3?\xde[06d\xc9G\xeboH\xa9\x93NFAk\x86\x10\x8d\xffj7\xadh\x1b\xf9\xf93?\x8f=\xb7\xff\xc6Ro\xc3\x0f\x8c\xfd\xf1\xbc$\xf8\xdc\xeb\xfb\xf7/\xf8\xf35#\x15\x8dZ\x96\x11\xddU\x11\xa3\x8a\xd0\x9c\xe3\x9b\x8f~\x84\xb1#\xa3\x95\x9eUk~e\xe9\xb7\x9e)\xbb\xf2\x07O\xec\xd8\x94\x8b\xa3\xa4\x16\x89\xfc\xf0s\x8f\xf6\xf7\x1c\xae@\xfc\xf2?\xbdR4\xb8Is\x8c\xb1\xa2\xbe\x99!\xa9<\xf7\xea\xfa\xcec\xfbG\xe7\x7f\xea\xfa\rm\x12\xb0\xf7\xf5\rB\xaay\x97\x9f\x1a\xdf\xf7\xd3{ky\xa6(\x8dZ\xf3\x93^\xdbEV\x96\xac\x7f\xeeH\xd1\xb1l\xd5\x96\r+\xab\'NE;\xfd\xf7\x1f\x9c9\xf1\xd5\xf5\xde\xa2\x9a\xa5CG_}\xf9h\xdeY\xaaI\xb2\xe0\xb7\xd6\x01\xe6\xa7,\xd4Yl\x82\xa0\xc8\x17\xd7?\xfdz\xde\xbe\xfc\xfam\xcbj\x96\xd4\xb5xe\xb8\xb7\xad\xf4\x11\xde\x92\x81\x9co~j\xa3D53a\xd5M\xe6:!\xb1\xf1\xc5wo=:x\xc5\xf2\x9ev\'\xe1\xe8\xb1\xb2"\xfb\x1c_\xdd\xb4\xc2\xb2$\x1f;\xbd\xf7\xcd\x83\x83\x03d\x99*C\xf5\x9e\x9b\xb3hv\xd6\xdbR46[Gte\xe7\xcd\xdb\x8f\xd4\x17t\xa5!#\xea\xa9\xbe\xf1\xfa\xf85\xa9DoQR\xa5\x9d8q\x95\x830\x880=\x1b:\xd2zE\xcbl\xf3U\x96\xb0t$\xf6\x9d\xaa\x85\xf2K\xd9\x8bG\x9f\xba9\x7f\xf6\xf8\xf0\xc0\xe9\xd14\xe9\xea9\xed0\xae\xa2\x8b\xcbg\xb6\xcdO\xf4\xac\xc7WFi\x86pTZ\xba\xca\x993\x15\x81\x8f\xe5sG\xe6_i\nz\xcb\x13\x85\x1b?Z8\x15\x94\x14\xd5\xb3\xc9VH\x83x+UIOp\xf4\xa0\x85$Y\x97\xbe\x15O\xed\xb9\xde\x8e\x9c\t\xc9\xc6\r\x1b\x92G\xcf\x98T"]\xdf!\xfd\xb3OM\xa5\xeeT-\x1d\xa79+1\xd0\x91E\xca\xe8$w\xfb_\xaal\xe9\xf4\x88\xce\xe8\x83P\xfdXLJg\x12\'*\xfe\t\xe5\x92F\xb6AB\xa8g\x8e\x88+\xf0\x0fE\x9e\r\xbf\xf3\x85\xaf|\xf6\x0c\xb1\xaa-\xff\xbb}\xc1G\x13\xb8z\xfb\x86\x95\x0eg}\x15\x08\xfa\xb2\xd9D)\x80D\xaf\xb4\xac \xb2\x0f\xbf;\xda~}\x879\xb1\xa4\x9eh`6:f\xd1G\x1d\x8f\x8ej\xaa\xb0\x08B\x04l\x04v\x08\xcc\x1f\xeaW\xbba\xf1cQ\x87\xab\x03\x83m\xeb\xbc9;\xfa\xed\xc7\xb3\xb4\x84\xa8\x8dm\xfc\xf5\xdbj\xa5\x9emR\x10\x94\xc25C4B\x98\xc9\xe8\x07m\xdd\x15\x94/\xec\xd1y\xeb4\x1a\x90\'\xc6U=\x1fU\xbb3\x8a\xa0\x1e`TD\xc5\xf4n\x1a\x95\x87sm\xbf\xed\x97^\x18f\xc5\xf5\x8d\xb5k\x94\x88\xa3\xbbk\x89Q\x1ct\xdeo\x7f2\r\x06L\xe6\x86\xa0x\x86\xe9\xd7A\x80\xe2\xfb\x1e\x1a\xbcv\xf5R{\xb6\xbf\xb2\xf9\n\x1a\x9dDO\xbb\xfa\xb3Ovm\xf0\x14\xf3\xa5\x08\x89F\xf0l\x86\x80\xf0x\xb0x\xfa\xbdz\x18\xaf\xb8b\xb8\xc7\xa7\xac\xcb\x8a\xd5\xa7G\xa5=\x8f\xea\xee\xd8R\xb3\xe8t*\xab1&h\x0e`P\t\xa2\xd4|+\x9f\xfc\x9et\x97\xb1\xd6\xb3\xbd\xdd\x92\x02\x96F\xb0\xfb\xabwe\x0b\x05T\xb3\x02"4\x17\xb5\x11\xc6\xcf5\xf2\xe2X\xe9\x86\xff%=\xb3\xa4\xf3\xc4\x90\r\xfbXH\xac\xcd\xbf\xefo\x0f\xb7\xa7\xfd\xfda\xf1u]#i\xd4\xa9\x9e\n\x9c\x19\x9b!h\x02E)p\xd7,]\xfd\xfc\x81\xc1\xb6|\xde\x92\xb4\xee\xd0hD\x96\xd9R\x88\x98\xa8\xa5\xa6g\x1bR\xcd\x08\x8a\xb1\x0f\xa1\xba\xa0\xb6\xe4\xa6\xe5\xdf\xa8&\x87\xb7\xa83\x89\x95\x15_?\xe1:\xef\x1f@\xe7\x92\x90\xd1\x89\x9e\xcdX\xa3\xea\xf4\xa4F#\x1d\x98E\x1d\x98\xdfqO\xf1^w\xbd}\xe0\x85\xb6\xe5\x05(\xd1\x19\xd4\x94B\x88Z{57j\x9c^\x99QDlt$)z>s\xab.x\xdf\xb4\xb4\xe8\x02\x13\x11\xce\x9f\xe7\x07+ERs \xc4\xa6r\x1aG\x89:\xbd\x02\xf3e\xb0\xc2b\xcfx\xb5\xef\r7\x86\xd1\xfe\x07\xbf\xf1\xbe\x0b\n\x13\x15\xa2\x91>\x98u\xb8\xe8\xb3\xe8\xcb\xc4\xceM4)B\xd1\xfa`\x90+n\\\xb5\xb8+\xb2\x88=\tM\x0c\x02c=D/\xb5\x84"T\xea\xd4\x1e\xea\xb42\xd0`\x89w\x11(\xed\xd8\xbf\xedcm\xdb\'+\xd8\xf5\xc8GY\x107\x95Z#$\x1d\xed\xc2\xae\x00\x15\x9e\xdbjhTi\x83\x92b\xc9Rbx Ij\x8b\x11+\tb\x8c\xaa\xcey\'\xa9\nM\xcek>5{\xcc\x18\x92Rq\xc6\xe7\x87\x1e\xf9\xd9p\xc7=_\x18\xfb\xa7\x97\xf4\x95\x9b\x17E\x7fN\xa9C\xfaR\xa4gm\x12M8\xbd\xa0\xd3\x98\xa4!\xac\xaf\xf9\x0f\x1ey\xb3\xae+\x17\x05\xa3@E\xa20\x86R3\x9d\xb1\xc5\xd0\x04\x11\x90&c\x08?xmtt\xa0\xed\xda_\xdb\xa1\xbd__\xfb\x9f~$:\xb3svk\xfc`\x90\xb5e\x1a\xd0\xe8\x07\x9c#\n\x9a.\xdf\xfaN\xba\xd9\x15\xed\xe9\t\xad\xdd\xd8\x053\nI\x07U\xe7\xac\xa63\xb6g\xa7\xc5\x8e\xa8\x80\xdbpr_\xbef\xfbg\xd6%\xa5u\xde\xb9|dC\xb3\xde\xc0\x99H\x1c\xab\xd7\xbd64\xe5\xdc\x9fA\xba\x7f\xe7)Y\xa9\xec\xba\xbdvp\xc5\xed,\x12\x90\x02%\x85P\xa9\x81\xa4^\x18\x820&!\xbde\xfb{\x83\xcbV\'&i\xa9\xdd\xb7\x8e\xd7\xc6*\xe7\x1a"`\xf3\xdaF\\ThP\xb5f\x131\xc8\x86\xd5E\xad^\xb1ewGICb\x10\x80\x86\x86<2\x87\x8bJB\x90D\xd1\x02\xb5\x1b-\x82N"\x83\xe6\xde &Sb\xa4\xc8\xc2\x8a3\xe7\x83sFLS\n\xd1\\\xdaC\x1aM\xbd\x17q\x9cL\xc6)\x0e!\xebp\x86\x19*\xd8&\xd9 \xc2\xb1\xac$,\xa2(,\x8a\x8395\x1f\xa1r\xb6cD\x8d\xce\x99\xf7\x9c\xa9\xbf\xa2\xa4\xf3\xa2l\xb4\xa2qN^\xaf\x14\xf8\nDf\xa8\xdb\x9aN"\x023\x1f\xc4\xab\xc5(NH\x07\xa7Z\x89q\xaax\x84D\xc4H\xf5\xb34\x91\xe8@B\xed\xbc\x89\x82\x95\xb1\xda6s\xff\xad\tB#,W\xd2\xe8\xb3FAS7Z\x18\xcf\xdc\x94\xd4\xa9\x96\x8e\x97\xd0Tg\xaa\xca\'Z(!:\rM2\x16\x0b\xb9\xfav\xc1E\'?11QS\x80f*F \x05\xa9\x12\x85S\x9b\xe9C=h-\x99\xf13\tH\x8a\xa9\xd0\xa6\xc9\x98\xc5\x88\xf75@f\x18\xba4\xeb\x84\x89\x98\x906YcR\x8ch\x8c\xd1l\nbl\xbcd\xcd\xdb\xcc=7*\xe8Hh\xd3\xd0\x8d\xe0\xf8\x10;\xdb`3\xb5\xa7\xcf;\xa9Y^\x13i\\C\xbf\xd98"\xe8\xa1\x11\xeb\xae\xaa5\xa6~\xcd\x97B\xd8\xe4\xeco\xf2\x84\xc6\x800=U/{:\xa8q.\x10\x17X\xa0\x13\x03J\xd9\x1b\xa4\xbb\x1a\xe6\xb6\x15\x12@\xb8\xc8\x8f\xa2-H8\xd3\xf4\xe9\xd2\x86\xb3&\xa6\x81\xc9\x81\x83.[\x98\xccq.Eq"f\x8eG\x86\xb18\x99\xb9\x1dz\t\x10\x84\xa8+S\x8c<\xdeWV\xd7\xcc\xa5\xdf\xdd\xd8\xe6\n\xa81\xef\xa3\xaeP\\\xea\\\xf4\xbc\x15]\x8c\x9e\x1f>\xfd\xac\xc3\xda\x95\xca\x8b\xb5\xfd\x1b\x0b\x16T\x04\xf8\xb0/\xce[,\x98\xd1\xbb\\\x02\x044z\x1c\x7fl\xd7\xf1q\xb8\x1bz\\\xa0\xcdI\x8c\xae\xac\x14\x86\xf8\xce \x16\xcf\x9b6\xc0\xbe,Id\xa3i\xa5\xd6\xd1\xdb\xbb\xf6\x13;\x1cA77\xad\xa8\x8cV\xeb\xd9\xae\x87$\xb9\xba\xcbh\xfa?\xbc\x0e\x1d\xcf\xd8s\xef@\xe1\xabH\x181G\xcd4&\xca\xa7~tX\x16m\xb3Y&i\x97\x00AT\xc7\x1dc\x97\xc1\x11\x91P\x9b\xd36U\x8e\xa7?;\xbc\xa0\xbeu\xa3\xcd\xa2\xca\x98\xfb\xbf\xdb\xc0\x8a\xaa\x04U"\x84D\x04s\x1b\x1e\x13E\xd5dh$\xef\xaeVl\x96=\x97\x00A\x8d\xde\x08\x81\x01\x86\x99\x1d\xf0\x0c\x82\x08\xe2\x83\x13\xf3\xf5t6A\\\x8a\x9f@\xf4\x91\r\xf7M\x05q\xf1I\xa9\x88H\xd4$x#\xa2\x9f}\xb4z\t\x92\xf8\xdf[\xff\xe7\xfe\xa6\xa6\x05\xd1\x82hA\xb4 Z\x10\x1f\xfbjA\xb4 Z\x10-\x88\x16D\x0b\xa2\x05\xd1\x82\xf8\x7f\x01\xf1\xdf\x91\xd3\xe9`7\x9a\x1c\x88\x00\x00\x00\x12tEXtexif:ExifOffset\x00620\x1a\xa3x\x00\x00\x00\x12tEXtexif:ImageLength\x000\xc1\xc5N\xce\x00\x00\x00\x11tEXtexif:ImageWidth\x000/\xffv\xa0\x00\x00\x00\x12tEXtexif:LightSource\x000x\x05kH\x00\x00\x00\x00IEND\xaeB`\x82' - , - url='https://wx.qlogo.cn/mmhead/ver_1/DpDqmvTDORNWfLrMj26YicorEUREffl1G8FapawdKgINVH9g1icudfWesGrH9LqeGAz16z4PmkW9U1KAIM3btWgozZ1GaLF66bdKdxlMdazmibn2hpFeiaa4613dN6HM4Vfk/132') - w.show() - sys.exit(app.exec_()) diff --git a/app/components/QCursorGif.py b/app/components/QCursorGif.py deleted file mode 100644 index 01d4800..0000000 --- a/app/components/QCursorGif.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -Created on 2020年3月13日 -@author: Irony -@site: https://pyqt.site , https://github.com/PyQt5 -@email: 892768447@qq.com -@file: Demo.Lib.QCursorGif -@description: -""" - -try: - from PyQt5.QtCore import QTimer, Qt - from PyQt5.QtGui import QCursor, QPixmap - from PyQt5.QtWidgets import QApplication -except ImportError: - from PySide2.QtCore import QTimer, Qt - from PySide2.QtGui import QCursor, QPixmap - from PySide2.QtWidgets import QApplication -from app.resources import resource_rc - -var = resource_rc.qt_resource_name - - -class QCursorGif: - - def initCursor(self, cursors, parent=None): - # 记录默认的光标 - self._oldCursor = Qt.ArrowCursor - self.setOldCursor(parent) - # 加载光标图片 - self._cursorImages = [ - QCursor(QPixmap(cursor)) for cursor in cursors] - self._cursorIndex = 0 - self._cursorCount = len(self._cursorImages) - 1 - # 创建刷新定时器 - self._cursorTimeout = 200 - self._cursorTimer = QTimer(parent) - self._cursorTimer.timeout.connect(self._doBusy) - self.num = 0 - - def _doBusy(self): - if self._cursorIndex > self._cursorCount: - self._cursorIndex = 0 - QApplication.setOverrideCursor( - self._cursorImages[self._cursorIndex]) - self._cursorIndex += 1 - self.num += 1 - - def startBusy(self): - # QApplication.setOverrideCursor(Qt.WaitCursor) - if not self._cursorTimer.isActive(): - self._cursorTimer.start(self._cursorTimeout) - - def stopBusy(self): - self._cursorTimer.stop() - QApplication.restoreOverrideCursor() - # 将光标出栈,恢复至原始状态 - for i in range(self.num): - QApplication.restoreOverrideCursor() - self.num = 0 - - - def setCursorTimeout(self, timeout): - self._cursorTimeout = timeout - - def setOldCursor(self, parent=None): - QApplication.overrideCursor() - self._oldCursor = (QApplication.overrideCursor() or parent.cursor() or Qt.ArrowCursor or Qt.IBeamCursor) if parent else ( - QApplication.overrideCursor() or Qt.ArrowCursor) diff --git a/app/components/__init__.py b/app/components/__init__.py deleted file mode 100644 index 6d1eb7f..0000000 --- a/app/components/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .contact_info_ui import ContactQListWidgetItem -from .scroll_bar import ScrollBar diff --git a/app/components/bubble_message.py b/app/components/bubble_message.py deleted file mode 100644 index d2b5e0c..0000000 --- a/app/components/bubble_message.py +++ /dev/null @@ -1,301 +0,0 @@ -import os.path -import subprocess -import platform - -from PyQt5 import QtGui -from PyQt5.QtCore import QSize, pyqtSignal, Qt, QThread -from PyQt5.QtGui import QPainter, QFont, QColor, QPixmap, QPolygon, QFontMetrics -from PyQt5.QtWidgets import QWidget, QLabel, QHBoxLayout, QSizePolicy, QVBoxLayout, QSpacerItem, \ - QScrollArea - -from app.components.scroll_bar import ScrollBar - - -class MessageType: - Text = 1 - Image = 3 - - -class TextMessage(QLabel): - heightSingal = pyqtSignal(int) - - def __init__(self, text, is_send=False, parent=None): - if isinstance(text, bytes): - text = text.decode('utf-8') - super(TextMessage, self).__init__(text, parent) - font = QFont('微软雅黑', 12) - self.setFont(font) - self.setWordWrap(True) - self.setMaximumWidth(800) - # self.setMinimumWidth(100) - self.setMinimumHeight(45) - self.setTextInteractionFlags(Qt.TextSelectableByMouse) - self.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) - if is_send: - self.setAlignment(Qt.AlignCenter | Qt.AlignRight) - self.setStyleSheet( - ''' - background-color:#b2e281; - border-radius:10px; - padding:10px; - ''' - ) - else: - self.setStyleSheet( - ''' - background-color:white; - border-radius:10px; - padding:10px; - ''' - ) - font_metrics = QFontMetrics(font) - rect = font_metrics.boundingRect(text) - # rect = font_metrics - self.setMaximumWidth(rect.width() + 40) - - def paintEvent(self, a0: QtGui.QPaintEvent) -> None: - super(TextMessage, self).paintEvent(a0) - - -class Triangle(QLabel): - def __init__(self, Type, is_send=False, position=(0, 0), parent=None): - """ - - @param Type: - @param is_send: - @param position:(x,y) - @param parent: - """ - super().__init__(parent) - self.Type = Type - self.is_send = is_send - self.position = position - - def paintEvent(self, a0: QtGui.QPaintEvent) -> None: - - super(Triangle, self).paintEvent(a0) - if self.Type == MessageType.Text: - self.setFixedSize(6, 45) - painter = QPainter(self) - triangle = QPolygon() - x, y = self.position - if self.is_send: - painter.setPen(QColor('#b2e281')) - painter.setBrush(QColor('#b2e281')) - triangle.setPoints(0, 20+y, 0, 34+y, 6, 27+y) - else: - painter.setPen(QColor('white')) - painter.setBrush(QColor('white')) - triangle.setPoints(0, 27+y, 6, 20+y, 6, 34+y) - painter.drawPolygon(triangle) - - -class Notice(QLabel): - def __init__(self, text, type_=3, parent=None): - super().__init__(text, parent) - self.type_ = type_ - self.setFont(QFont('微软雅黑', 10)) - self.setWordWrap(True) - self.setTextInteractionFlags(Qt.TextSelectableByMouse) - self.setAlignment(Qt.AlignCenter) - - -class Avatar(QLabel): - def __init__(self, avatar, parent=None): - super().__init__(parent) - if isinstance(avatar, str): - self.setPixmap(QPixmap(avatar).scaled(45, 45)) - self.image_path = avatar - elif isinstance(avatar, QPixmap): - self.setPixmap(avatar.scaled(45, 45)) - self.setFixedSize(QSize(45, 45)) - - -def open_image_viewer(file_path): - system_platform = platform.system() - - if system_platform == "Darwin": # macOS - subprocess.run(["open", file_path]) - elif system_platform == "Windows": - subprocess.run(["start", " ", file_path], shell=True) - elif system_platform == "Linux": - subprocess.run(["xdg-open", file_path]) - else: - print("Unsupported platform") - - -class OpenImageThread(QThread): - def __init__(self, image_path): - super().__init__() - self.image_path = image_path - - def run(self) -> None: - if os.path.exists(self.image_path): - open_image_viewer(self.image_path) - - -class ImageMessage(QLabel): - def __init__(self, image, is_send, image_link='', max_width=480, max_height=240, parent=None): - """ - param:image 图像路径或者QPixmap对象 - param:image_link='' 点击图像打开的文件路径 - """ - super().__init__(parent) - self.image = QLabel(self) - self.max_width = max_width - self.max_height = max_height - # self.setFixedSize(self.max_width,self.max_height) - self.setMaximumWidth(self.max_width) - self.setMaximumHeight(self.max_height) - self.setCursor(Qt.PointingHandCursor) - if isinstance(image, str): - pixmap = QPixmap(image) - self.image_path = image - elif isinstance(image, QPixmap): - pixmap = image - self.set_image(pixmap) - if image_link: - self.image_path = image_link - self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - - if is_send: - self.setAlignment(Qt.AlignCenter | Qt.AlignRight) - # self.setScaledContents(True) - - def set_image(self, pixmap): - # 计算调整后的大小 - adjusted_width = min(pixmap.width(), self.max_width) - adjusted_height = min(pixmap.height(), self.max_height) - self.setPixmap(pixmap.scaled(adjusted_width, adjusted_height, Qt.KeepAspectRatio)) - # 调整QLabel的大小以适应图片的宽高,但不超过最大宽高 - # self.setFixedSize(adjusted_width, adjusted_height) - - def mousePressEvent(self, event): - if event.buttons() == Qt.LeftButton: # 左键按下 - print('打开图像', self.image_path) - self.open_image_thread = OpenImageThread(self.image_path) - self.open_image_thread.start() - - -class BubbleMessage(QWidget): - def __init__(self, str_content, avatar, Type, is_send=False, display_name=None, parent=None): - super().__init__(parent) - self.isSend = is_send - # self.set - self.setStyleSheet( - ''' - border:none; - ''' - ) - layout = QHBoxLayout() - layout.setSpacing(0) - layout.setContentsMargins(0, 5, 5, 5) - # self.resize(QSize(200, 50)) - self.avatar = Avatar(avatar) - triangle = Triangle(Type, is_send, (0, 0)) - if Type == MessageType.Text: - self.message = TextMessage(str_content, is_send) - # self.message.setMaximumWidth(int(self.width() * 0.6)) - elif Type == MessageType.Image: - self.message = ImageMessage(str_content, is_send) - else: - raise ValueError("未知的消息类型") - if display_name: - triangle = Triangle(Type, is_send, (0, 10)) - label_name = QLabel(display_name, self) - label_name.setFont(QFont('微软雅黑', 10)) - if is_send: - label_name.setAlignment(Qt.AlignRight) - vlayout = QVBoxLayout() - vlayout.setSpacing(0) - if is_send: - vlayout.addWidget(label_name, 0, Qt.AlignTop | Qt.AlignRight) - vlayout.addWidget(self.message, 0, Qt.AlignTop | Qt.AlignRight) - else: - vlayout.addWidget(label_name) - vlayout.addWidget(self.message) - self.spacerItem = QSpacerItem(45 + 6, 45, QSizePolicy.Expanding, QSizePolicy.Minimum) - if is_send: - layout.addItem(self.spacerItem) - if display_name: - layout.addLayout(vlayout, 1) - else: - layout.addWidget(self.message, 1) - layout.addWidget(triangle, 0, Qt.AlignTop | Qt.AlignLeft) - layout.addWidget(self.avatar, 0, Qt.AlignTop | Qt.AlignLeft) - else: - layout.addWidget(self.avatar, 0, Qt.AlignTop | Qt.AlignRight) - layout.addWidget(triangle, 0, Qt.AlignTop | Qt.AlignRight) - if display_name: - layout.addLayout(vlayout, 1) - else: - layout.addWidget(self.message, 1) - layout.addItem(self.spacerItem) - self.setLayout(layout) - - -class ScrollAreaContent(QWidget): - def __init__(self, parent=None): - super().__init__(parent) - self.adjustSize() - - -class ScrollArea(QScrollArea): - def __init__(self, parent=None): - super().__init__(parent) - self.setWidgetResizable(True) - self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) - self.setStyleSheet( - ''' - border:none; - ''' - ) - - -class ChatWidget(QWidget): - def __init__(self): - super().__init__() - self.resize(500, 200) - - layout = QVBoxLayout() - layout.setSpacing(0) - self.adjustSize() - # 生成滚动区域 - self.scrollArea = ScrollArea(self) - scrollBar = ScrollBar() - self.scrollArea.setVerticalScrollBar(scrollBar) - # 生成滚动区域的内容部署层部件 - self.scrollAreaWidgetContents = ScrollAreaContent(self.scrollArea) - self.scrollAreaWidgetContents.setMinimumSize(50, 100) - # 设置滚动区域的内容部署部件为前面生成的内容部署层部件 - self.scrollArea.setWidget(self.scrollAreaWidgetContents) - layout.addWidget(self.scrollArea) - self.layout0 = QVBoxLayout() - self.layout0.setSpacing(0) - self.scrollAreaWidgetContents.setLayout(self.layout0) - self.setLayout(layout) - - def add_message_item(self, bubble_message, index=1): - if index: - self.layout0.addWidget(bubble_message) - else: - self.layout0.insertWidget(0, bubble_message) - # self.set_scroll_bar_last() - - def set_scroll_bar_last(self): - self.scrollArea.verticalScrollBar().setValue( - self.scrollArea.verticalScrollBar().maximum() - ) - - def set_scroll_bar_value(self, val): - self.verticalScrollBar().setValue(val) - - def verticalScrollBar(self): - return self.scrollArea.verticalScrollBar() - - def update(self) -> None: - super().update() - self.scrollAreaWidgetContents.adjustSize() - self.scrollArea.update() - # self.scrollArea.repaint() - # self.verticalScrollBar().setMaximum(self.scrollAreaWidgetContents.height()) diff --git a/app/components/calendar_dialog.py b/app/components/calendar_dialog.py deleted file mode 100644 index 91898ef..0000000 --- a/app/components/calendar_dialog.py +++ /dev/null @@ -1,78 +0,0 @@ -import time - -from datetime import datetime, timedelta -from PyQt5.QtCore import QTimer, QThread, pyqtSignal, Qt -from PyQt5.QtGui import QIcon -from PyQt5.QtWidgets import QApplication, QDialog, QCheckBox, QMessageBox, QCalendarWidget, QWidget, QVBoxLayout, \ - QToolButton - -from app.ui.Icon import Icon - - -class CalendarDialog(QDialog): - selected_date_signal = pyqtSignal(int) - - def __init__(self, date_range=None, parent=None): - """ - - @param date_range: tuple[Union[QDate, datetime.date],Union[QDate, datetime.date]] #限定的可选择范围 - @param parent: - """ - super().__init__(parent) - self.setWindowTitle('选择日期') - self.calendar = QCalendarWidget(self) - self.calendar.clicked.connect(self.onDateChanged) - prev_btn = self.calendar.findChild(QToolButton, "qt_calendar_prevmonth") - prev_btn.setIcon(Icon.Arrow_left_Icon) - next_btn = self.calendar.findChild(QToolButton, "qt_calendar_nextmonth") - next_btn.setIcon(Icon.Arrow_right_Icon) - self.date_range = date_range - if date_range: - self.calendar.setDateRange(*date_range) - # 从第一天开始,依次添加日期到列表,直到该月的最后一天 - current_date = date_range[1] - while (current_date + timedelta(days=1)).month == date_range[1].month: - current_date += timedelta(days=1) - range_format = self.calendar.dateTextFormat(current_date) - range_format.setForeground(Qt.gray) - self.calendar.setDateTextFormat(current_date, range_format) - # 从第一天开始,依次添加日期到列表,直到该月的最后一天 - current_date = date_range[0] - while (current_date - timedelta(days=1)).month == date_range[0].month: - current_date -= timedelta(days=1) - range_format = self.calendar.dateTextFormat(current_date) - range_format.setForeground(Qt.gray) - self.calendar.setDateTextFormat(current_date, range_format) - layout = QVBoxLayout(self) - layout.addWidget(self.calendar) - self.setLayout(layout) - - def set_start_date(self): - if self.date_range: - self.calendar.setCurrentPage(self.date_range[0].year, self.date_range[0].month) - def set_end_date(self): - if self.date_range: - self.calendar.setCurrentPage(self.date_range[1].year, self.date_range[1].month) - def onDateChanged(self): - # 获取选择的日期 - selected_date = self.calendar.selectedDate() - s_t = time.strptime(selected_date.toString("yyyy-MM-dd"), "%Y-%m-%d") # 返回元祖 - mkt = int(time.mktime(s_t)) - timestamp = mkt - self.selected_date_signal.emit(timestamp) - print("Selected Date:", selected_date.toString("yyyy-MM-dd"), timestamp) - self.close() - - -if __name__ == '__main__': - import sys - from datetime import datetime, timedelta - - app = QApplication(sys.argv) - # 设置日期范围 - start_date = datetime(2024, 1, 5) - end_date = datetime(2024, 1, 9) - date_range = (start_date.date(), end_date.date()) - ex = CalendarDialog(date_range=date_range) - ex.show() - sys.exit(app.exec_()) diff --git a/app/components/contact_info_ui.py b/app/components/contact_info_ui.py deleted file mode 100644 index ba73ea7..0000000 --- a/app/components/contact_info_ui.py +++ /dev/null @@ -1,104 +0,0 @@ -import sys - -from PyQt5.Qt import * -from PyQt5.QtCore import * -from PyQt5.QtWidgets import * - -from .CAvatar import CAvatar - -Stylesheet = """ -QWidget{ - background: rgb(238,244,249); -} -""" -Stylesheet_hover = """ -QWidget,QLabel{ - background: rgb(230, 235, 240); -} -""" -Stylesheet_clicked = """ -QWidget,QLabel{ - background: rgb(230, 235, 240); -} -""" - - -class QListWidgetItemWidget(QWidget): - def __init__(self): - super().__init__() - self.is_selected = False - - def leaveEvent(self, e): # 鼠标离开label - if self.is_selected: - return - self.setStyleSheet(Stylesheet) - - def enterEvent(self, e): # 鼠标移入label - self.setStyleSheet(Stylesheet_hover) - - -# 自定义的item 继承自QListWidgetItem -class ContactQListWidgetItem(QListWidgetItem): - def __init__(self, name, url, img_bytes=None): - super().__init__() - # 自定义item中的widget 用来显示自定义的内容 - self.widget = QListWidgetItemWidget() - # 用来显示name - self.nameLabel = QLabel(self.widget) - self.nameLabel.setText(name) - # 用来显示avator(图像) - self.avatorLabel = CAvatar(parent=self.widget, shape=CAvatar.Rectangle, size=QSize(60, 60), - url=url, img_bytes=img_bytes) - # 设置布局用来对nameLabel和avatorLabel进行布局 - hbox = QHBoxLayout() - hbox.addWidget(self.avatorLabel) - hbox.addWidget(self.nameLabel) - hbox.addStretch(1) - # 设置widget的布局 - self.widget.setLayout(hbox) - self.widget.setStyleSheet(Stylesheet) - # 设置自定义的QListWidgetItem的sizeHint,不然无法显示 - self.setSizeHint(self.widget.sizeHint()) - - def select(self): - """ - 设置选择后的事件 - @return: - """ - self.widget.is_selected = True - self.widget.setStyleSheet(Stylesheet_clicked) - - def dis_select(self): - """ - 设置取消选择的事件 - @return: - """ - self.widget.is_selected = False - self.widget.setStyleSheet(Stylesheet) - - -if __name__ == "__main__": - app = QApplication(sys.argv) - - # 主窗口 - w = QWidget() - w.setWindowTitle("QListWindow") - # 新建QListWidget - listWidget = QListWidget(w) - listWidget.resize(300, 300) - - # 新建两个自定义的QListWidgetItem(customQListWidgetItem) - item1 = ContactQListWidgetItem("鲤鱼王", "liyuwang.jpg") - item2 = ContactQListWidgetItem("可达鸭", "kedaya.jpg") - - # 在listWidget中加入两个自定义的item - listWidget.addItem(item1) - listWidget.setItemWidget(item1, item1.widget) - listWidget.addItem(item2) - listWidget.setItemWidget(item2, item2.widget) - - # 绑定点击槽函数 点击显示对应item中的name - listWidget.itemClicked.connect(lambda item: print(item.nameLabel.text())) - - w.show() - sys.exit(app.exec_()) diff --git a/app/components/export_contact_item.py b/app/components/export_contact_item.py deleted file mode 100644 index 9566bf5..0000000 --- a/app/components/export_contact_item.py +++ /dev/null @@ -1,127 +0,0 @@ -import sys - -from PyQt5.Qt import * -from PyQt5.QtCore import * -from PyQt5.QtWidgets import * - -try: - from .CAvatar import CAvatar -except: - from CAvatar import CAvatar - -Stylesheet = """ -QWidget{ - background: rgb(238,244,249); -} -""" -Stylesheet_hover = """ -QWidget,QLabel{ - background: rgb(230, 235, 240); -} -""" -Stylesheet_clicked = """ -QWidget,QLabel{ - background: rgb(230, 235, 240); -} -""" - - -class QListWidgetItemWidget(QWidget): - def __init__(self): - super().__init__() - self.is_selected = False - - def leaveEvent(self, e): # 鼠标离开label - if self.is_selected: - return - self.setStyleSheet(Stylesheet) - - def enterEvent(self, e): # 鼠标移入label - self.setStyleSheet(Stylesheet_hover) - - -# 自定义的item 继承自QListWidgetItem -class ContactQListWidgetItem(QListWidgetItem): - def __init__(self, name, url, img_bytes=None): - super().__init__() - self.is_select = False - # 自定义item中的widget 用来显示自定义的内容 - self.widget = QListWidgetItemWidget() - # 用来显示name - self.nameLabel = QLabel(self.widget) - self.nameLabel.setText(name) - # 用来显示avator(图像) - self.avatorLabel = CAvatar(parent=self.widget, shape=CAvatar.Rectangle, size=QSize(30, 30), - url=url, img_bytes=img_bytes) - # 设置布局用来对nameLabel和avatorLabel进行布局 - hbox = QHBoxLayout(self.widget) - self.checkBox = QCheckBox(self.widget) - self.checkBox.clicked.connect(self.select) - hbox.addWidget(self.checkBox) - hbox.addWidget(self.avatorLabel) - hbox.addWidget(self.nameLabel) - hbox.addStretch(1) - # 设置widget的布局 - self.widget.setLayout(hbox) - self.widget.setStyleSheet(Stylesheet) - # 设置自定义的QListWidgetItem的sizeHint,不然无法显示 - self.setSizeHint(self.widget.sizeHint()) - sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.widget.sizePolicy().hasHeightForWidth()) - self.widget.setSizePolicy(sizePolicy) - - def select(self): - """ - 设置选择后的事件 - @return: - """ - self.widget.is_selected = True - self.is_select = not self.is_select - # print('选择',self.is_select) - self.checkBox.setChecked(self.is_select) - # self.widget.setStyleSheet(Stylesheet_clicked) - - def force_select(self): - self.is_select = True - self.checkBox.setChecked(self.is_select) - - def force_dis_select(self): - self.is_select = False - self.checkBox.setChecked(self.is_select) - - def dis_select(self): - """ - 设置取消选择的事件 - @return: - """ - self.widget.is_selected = False - self.widget.setStyleSheet(Stylesheet) - - -if __name__ == "__main__": - app = QApplication(sys.argv) - - # 主窗口 - w = QWidget() - w.setWindowTitle("QListWindow") - # 新建QListWidget - listWidget = QListWidget(w) - listWidget.resize(300, 300) - - # 新建两个自定义的QListWidgetItem(customQListWidgetItem) - item1 = ContactQListWidgetItem("鲤鱼王", "liyuwang.jpg") - item2 = ContactQListWidgetItem("可达鸭", "kedaya.jpg") - - # 在listWidget中加入两个自定义的item - listWidget.addItem(item1) - listWidget.setItemWidget(item1, item1.widget) - listWidget.addItem(item2) - listWidget.setItemWidget(item2, item2.widget) - - # 绑定点击槽函数 点击显示对应item中的name - listWidget.itemClicked.connect(lambda item: item.select()) - - w.show() - sys.exit(app.exec_()) diff --git a/app/components/prompt_bar.py b/app/components/prompt_bar.py deleted file mode 100644 index df99b1f..0000000 --- a/app/components/prompt_bar.py +++ /dev/null @@ -1,39 +0,0 @@ -from PyQt5 import QtGui -from PyQt5.QtCore import * -from PyQt5.QtGui import * -from PyQt5.QtWidgets import * - - -class PromptBar(QLabel): - def __init__(self, parent=None): - super().__init__(parent) - - def paintEvent(self, e): # 绘图事件 - qp = QPainter() - qp.begin(self) - self.drawRectangles1(qp) # 绘制线条矩形 - self.drawRectangles2(qp) # 绘制填充矩形 - self.drawRectangles3(qp) # 绘制线条+填充矩形 - self.drawRectangles4(qp) # 绘制线条矩形2 - qp.end() - - def drawRectangles1(self, qp): # 绘制填充矩形 - qp.setPen(QPen(Qt.black, 2, Qt.SolidLine)) # 颜色、线宽、线性 - qp.drawRect(*self.data) - - def drawRectangles2(self, qp): # 绘制填充矩形 - qp.setPen(QPen(Qt.black, 2, Qt.NoPen)) - qp.setBrush(QColor(200, 0, 0)) - qp.drawRect(220, 15, 200, 100) - - def drawRectangles3(self, qp): # 绘制线条+填充矩形 - qp.setPen(QPen(Qt.black, 2, Qt.SolidLine)) - qp.setBrush(QColor(200, 0, 0)) - qp.drawRect(430, 15, 200, 100) - - def drawRectangles4(self, qp): # 绘制线条矩形2 - path = QtGui.QPainterPath() - qp.setPen(QPen(Qt.blue, 2, Qt.SolidLine)) - qp.setBrush(QColor(0, 0, 0, 0)) # 设置画刷颜色透明 - path.addRect(100, 200, 200, 100) - qp.drawPath(path) diff --git a/app/components/scroll_bar.py b/app/components/scroll_bar.py deleted file mode 100644 index b6c96aa..0000000 --- a/app/components/scroll_bar.py +++ /dev/null @@ -1,48 +0,0 @@ -from PyQt5.QtWidgets import QScrollBar - - -class ScrollBar(QScrollBar): - def __init__(self): - super().__init__() - self.setStyleSheet( - ''' - QScrollBar:vertical { - border-width: 0px; - border: none; - background:rgba(133, 135, 138, 0); - width:4px; - margin: 0px 0px 0px 0px; - } - QScrollBar::handle:vertical { - background: qlineargradient(x1:0, y1:0, x2:1, y2:0, - stop: 0 rgb(133, 135, 138), stop: 0.5 rgb(133, 135, 138), stop:1 rgb(133, 135, 138)); - min-height: 20px; - max-height: 20px; - margin: 0 0px 0 0px; - border-radius: 2px; - } - QScrollBar::add-line:vertical { - background: qlineargradient(x1:0, y1:0, x2:1, y2:0, - stop: 0 rgba(133, 135, 138, 0), stop: 0.5 rgba(133, 135, 138, 0), stop:1 rgba(133, 135, 138, 0)); - height: 0px; - border: none; - subcontrol-position: bottom; - subcontrol-origin: margin; - } - QScrollBar::sub-line:vertical { - background: qlineargradient(x1:0, y1:0, x2:1, y2:0, - stop: 0 rgba(133, 135, 138, 0), stop: 0.5 rgba(133, 135, 138, 0), stop:1 rgba(133, 135, 138, 0)); - height: 0 px; - border: none; - subcontrol-position: top; - subcontrol-origin: margin; - } - QScrollBar::sub-page:vertical { - background: rgba(133, 135, 138, 0); - } - - QScrollBar::add-page:vertical { - background: rgba(133, 135, 138, 0); - } - ''' - ) \ No newline at end of file diff --git a/app/config.py b/app/config.py deleted file mode 100644 index 901283a..0000000 --- a/app/config.py +++ /dev/null @@ -1,35 +0,0 @@ -import os - -version = '2.0.5' -contact = '701805520' -github = 'https://github.com/LC044/WeChatMsg' -website = 'https://memotrace.cn/' -copyright = '© 2022-2024 SiYuan' -license = 'GPLv3' -description = [ - '1. 支持获取个人信息<br>', - '2. 支持显示聊天界面<br>', - '3. 支持导出聊天记录<br> * csv<br> * html<br> * ' - 'txt<br> * docx<br>', - '4. 生成年度报告——圣诞特别版', -] -about = f''' - 版本:{version}<br> - QQ交流群:请关注微信公众号回复:联系方式<br> - 地址:<a href='{github}'>{github}</a><br> - 官网:<a href='{website}'>{website}</a><br> - 新特性:<br>{''.join(['' + i for i in description])}<br> - License <a href='https://github.com/LC044/WeChatMsg/blob/master/LICENSE' target='_blank'>{license}</a><br> - Copyright {copyright} -''' - -# 数据存放文件路径 -INFO_FILE_PATH = './app/data/info.json' # 个人信息文件 -DB_DIR = './app/Database/Msg' -OUTPUT_DIR = './data/' # 输出文件夹 -os.makedirs('./app/data', exist_ok=True) -os.makedirs(DB_DIR, exist_ok=True) -os.makedirs(OUTPUT_DIR, exist_ok=True) -# 全局参数 -SEND_LOG_FLAG = True # 是否发送错误日志 -SERVER_API_URL = 'http://api.lc044.love' # api接口 \ No newline at end of file diff --git a/app/data/__init__.py b/app/data/__init__.py deleted file mode 100644 index 64d5f6a..0000000 --- a/app/data/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -""" -@File : __init__.py.py -@Author : Shuaikang Zhou -@Time : 2022/12/13 14:19 -@IDE : Pycharm -@Version : Python3.10 -@comment : ··· -""" diff --git a/app/decrypt/decrypt.py b/app/decrypt/decrypt.py deleted file mode 100644 index f4c57f4..0000000 --- a/app/decrypt/decrypt.py +++ /dev/null @@ -1,208 +0,0 @@ -# -*- coding: utf-8 -*-# -# ------------------------------------------------------------------------------- -# Name: getwxinfo.py -# Description: -# Author: xaoyaoo -# Date: 2023/08/21 -# License: https://github.com/xaoyaoo/PyWxDump/blob/3b794bcb47b0457d1245ce5b4cfec61b74524073/LICENSE MIT -# 微信数据库采用的加密算法是256位的AES-CBC。数据库的默认的页大小是4096字节即4KB,其中每一个页都是被单独加解密的。 -# 加密文件的每一个页都有一个随机的初始化向量,它被保存在每一页的末尾。 -# 加密文件的每一页都存有着消息认证码,算法使用的是HMAC-SHA1(安卓数据库使用的是SHA512)。它也被保存在每一页的末尾。 -# 每一个数据库文件的开头16字节都保存了一段唯一且随机的盐值,作为HMAC的验证和数据的解密。 -# 用来计算HMAC的key与解密的key是不同的,解密用的密钥是主密钥和之前提到的16字节的盐值通过PKCS5_PBKF2_HMAC1密钥扩展算法迭代64000次计算得到的。而计算HMAC的密钥是刚提到的解密密钥和16字节盐值异或0x3a的值通过PKCS5_PBKF2_HMAC1密钥扩展算法迭代2次计算得到的。 -# 为了保证数据部分长度是16字节即AES块大小的整倍数,每一页的末尾将填充一段空字节,使得保留字段的长度为48字节。 -# 综上,加密文件结构为第一页4KB数据前16字节为盐值,紧接着4032字节数据,再加上16字节IV和20字节HMAC以及12字节空字节;而后的页均是4048字节长度的加密数据段和48字节的保留段。 -# ------------------------------------------------------------------------------- -import argparse -import hmac -import hashlib -import os -from typing import Union, List -from Cryptodome.Cipher import AES - -# from Crypto.Cipher import AES # 如果上面的导入失败,可以尝试使用这个 - -SQLITE_FILE_HEADER = "SQLite format 3\x00" # SQLite文件头 - -KEY_SIZE = 32 -DEFAULT_PAGESIZE = 4096 -DEFAULT_ITER = 64000 - - -# 通过密钥解密数据库 -def decrypt(key: str, db_path, out_path): - """ - 通过密钥解密数据库 - :param key: 密钥 64位16进制字符串 - :param db_path: 待解密的数据库路径(必须是文件) - :param out_path: 解密后的数据库输出路径(必须是文件) - :return: - """ - if not os.path.exists(db_path) or not os.path.isfile(db_path): - return False, f"[-] db_path:'{db_path}' File not found!" - if not os.path.exists(os.path.dirname(out_path)): - return False, f"[-] out_path:'{out_path}' File not found!" - - if len(key) != 64: - return False, f"[-] key:'{key}' Len Error!" - - password = bytes.fromhex(key.strip()) - with open(db_path, "rb") as file: - blist = file.read() - - salt = blist[:16] - byteKey = hashlib.pbkdf2_hmac("sha1", password, salt, DEFAULT_ITER, KEY_SIZE) - first = blist[16:DEFAULT_PAGESIZE] - if len(salt) != 16: - return False, f"[-] db_path:'{db_path}' File Error!" - - mac_salt = bytes([(salt[i] ^ 58) for i in range(16)]) - mac_key = hashlib.pbkdf2_hmac("sha1", byteKey, mac_salt, 2, KEY_SIZE) - hash_mac = hmac.new(mac_key, first[:-32], hashlib.sha1) - hash_mac.update(b'\x01\x00\x00\x00') - - if hash_mac.digest() != first[-32:-12]: - return False, f"[-] Key Error! (key:'{key}'; db_path:'{db_path}'; out_path:'{out_path}' )" - - newblist = [blist[i:i + DEFAULT_PAGESIZE] for i in range(DEFAULT_PAGESIZE, len(blist), DEFAULT_PAGESIZE)] - - with open(out_path, "wb") as deFile: - deFile.write(SQLITE_FILE_HEADER.encode()) - t = AES.new(byteKey, AES.MODE_CBC, first[-48:-32]) - decrypted = t.decrypt(first[:-48]) - deFile.write(decrypted) - deFile.write(first[-48:]) - - for i in newblist: - t = AES.new(byteKey, AES.MODE_CBC, i[-48:-32]) - decrypted = t.decrypt(i[:-48]) - deFile.write(decrypted) - deFile.write(i[-48:]) - return True, [db_path, out_path, key] - - -def batch_decrypt(key: str, db_path: Union[str, List[str]], out_path: str, is_logging: bool = False): - if not isinstance(key, str) or not isinstance(out_path, str) or not os.path.exists(out_path) or len(key) != 64: - error = f"[-] (key:'{key}' or out_path:'{out_path}') Error!" - if is_logging: print(error) - return False, error - - process_list = [] - - if isinstance(db_path, str): - if not os.path.exists(db_path): - error = f"[-] db_path:'{db_path}' not found!" - if is_logging: print(error) - return False, error - - if os.path.isfile(db_path): - inpath = db_path - outpath = os.path.join(out_path, 'de_' + os.path.basename(db_path)) - process_list.append([key, inpath, outpath]) - - elif os.path.isdir(db_path): - for root, dirs, files in os.walk(db_path): - for file in files: - inpath = os.path.join(root, file) - rel = os.path.relpath(root, db_path) - outpath = os.path.join(out_path, rel, 'de_' + file) - - if not os.path.exists(os.path.dirname(outpath)): - os.makedirs(os.path.dirname(outpath)) - process_list.append([key, inpath, outpath]) - else: - error = f"[-] db_path:'{db_path}' Error " - if is_logging: print(error) - return False, error - - elif isinstance(db_path, list): - rt_path = os.path.commonprefix(db_path) - if not os.path.exists(rt_path): - rt_path = os.path.dirname(rt_path) - - for inpath in db_path: - if not os.path.exists(inpath): - erreor = f"[-] db_path:'{db_path}' not found!" - if is_logging: print(erreor) - return False, erreor - - inpath = os.path.normpath(inpath) - rel = os.path.relpath(os.path.dirname(inpath), rt_path) - outpath = os.path.join(out_path, rel, 'de_' + os.path.basename(inpath)) - if not os.path.exists(os.path.dirname(outpath)): - os.makedirs(os.path.dirname(outpath)) - process_list.append([key, inpath, outpath]) - else: - error = f"[-] db_path:'{db_path}' Error " - if is_logging: print(error) - return False, error - - result = [] - for i in process_list: - result.append(decrypt(*i)) # 解密 - - # 删除空文件夹 - for root, dirs, files in os.walk(out_path, topdown=False): - for dir in dirs: - if not os.listdir(os.path.join(root, dir)): - os.rmdir(os.path.join(root, dir)) - - if is_logging: - print("=" * 32) - success_count = 0 - fail_count = 0 - for code, ret in result: - if code == False: - print(ret) - fail_count += 1 - else: - print(f'[+] "{ret[0]}" -> "{ret[1]}"') - success_count += 1 - print("-" * 32) - print(f"[+] 共 {len(result)} 个文件, 成功 {success_count} 个, 失败 {fail_count} 个") - print("=" * 32) - return True, result - - -def encrypt(key: str, db_path, out_path): - """ - 通过密钥加密数据库 - :param key: 密钥 64位16进制字符串 - :param db_path: 待加密的数据库路径(必须是文件) - :param out_path: 加密后的数据库输出路径(必须是文件) - :return: - """ - if not os.path.exists(db_path) or not os.path.isfile(db_path): - return False, f"[-] db_path:'{db_path}' File not found!" - if not os.path.exists(os.path.dirname(out_path)): - return False, f"[-] out_path:'{out_path}' File not found!" - - if len(key) != 64: - return False, f"[-] key:'{key}' Len Error!" - - password = bytes.fromhex(key.strip()) - with open(db_path, "rb") as file: - blist = file.read() - - salt = os.urandom(16) # 生成随机盐值 - byteKey = hashlib.pbkdf2_hmac("sha1", password, salt, DEFAULT_ITER, KEY_SIZE) - - # 计算消息认证码 - mac_salt = bytes([(salt[i] ^ 58) for i in range(16)]) - mac_key = hashlib.pbkdf2_hmac("sha1", byteKey, mac_salt, 2, KEY_SIZE) - hash_mac = hmac.new(mac_key, blist[:-32], hashlib.sha1) - hash_mac.update(b'\x01\x00\x00\x00') - mac_digest = hash_mac.digest() - - newblist = [blist[i:i + DEFAULT_PAGESIZE] for i in range(DEFAULT_PAGESIZE, len(blist), DEFAULT_PAGESIZE)] - - with open(out_path, "wb") as enFile: - enFile.write(salt) # 写入盐值 - enFile.write(mac_digest) # 写入消息认证码 - - for i in newblist: - t = AES.new(byteKey, AES.MODE_CBC, os.urandom(16)) # 生成随机的初始向量 - encrypted = t.encrypt(i) # 加密数据块 - enFile.write(encrypted) - - return True, [db_path, out_path, key] \ No newline at end of file diff --git a/app/decrypt/get_wx_info.py b/app/decrypt/get_wx_info.py deleted file mode 100644 index 6d1bc2e..0000000 --- a/app/decrypt/get_wx_info.py +++ /dev/null @@ -1,468 +0,0 @@ -# -*- coding: utf-8 -*-# -# ------------------------------------------------------------------------------- -# Name: getwxinfo.py -# Description: -# Author: xaoyaoo -# Date: 2023/08/21 -# ------------------------------------------------------------------------------- -import hmac -import hashlib -import ctypes -import winreg -import pymem -from win32com.client import Dispatch -import psutil - -ReadProcessMemory = ctypes.windll.kernel32.ReadProcessMemory -void_p = ctypes.c_void_p - -import binascii -import pymem.process -from pymem import Pymem -from win32api import GetFileVersionInfo, HIWORD, LOWORD - -""" -class Wechat来源:https://github.com/SnowMeteors/GetWeChatKey -""" - - -class Wechat: - def __init__(self, pm): - module = pymem.process.module_from_name(pm.process_handle, "WeChatWin.dll") - self.pm = pm - self.dllBase = module.lpBaseOfDll - self.sizeOfImage = module.SizeOfImage - self.bits = self.GetPEBits() - - # 通过解析PE来获取位数 - def GetPEBits(self): - address = self.dllBase + self.pm.read_int(self.dllBase + 60) + 4 + 16 - SizeOfOptionalHeader = self.pm.read_short(address) - - # 0XF0 64bit - if SizeOfOptionalHeader == 0xF0: - return 64 - - return 32 - - def GetInfo(self): - version = self.GetVersion() - if not version: - print("Get WeChatWin.dll Failed") - return - - print(f"WeChat Version:{version}") - print(f"WeChat Bits: {self.bits}") - - keyBytes = b'-----BEGIN PUBLIC KEY-----\n...' - - # 从内存中查找 BEGIN PUBLIC KEY 的地址 - publicKeyList = pymem.pattern.pattern_scan_all(self.pm.process_handle, keyBytes, return_multiple=True) - if len(publicKeyList) == 0: - print("Failed to find PUBLIC KEY") - return - - keyAddr = self.GetKeyAddr(publicKeyList) - if keyAddr is None: - print("Failed to find key") - return - - keyLenOffset = 0x8c if self.bits == 32 else 0xd0 - - for addr in keyAddr: - try: - keyLen = self.pm.read_uchar(addr - keyLenOffset) - if self.bits == 32: - key = self.pm.read_bytes(self.pm.read_int(addr - 0x90), keyLen) - else: - key = self.pm.read_bytes(self.pm.read_longlong(addr - 0xd8), keyLen) - - key = binascii.b2a_hex(key).decode() - if self.CheckKey(key): - print(f"key is {key}") - return key - except: - pass - - print("Find the end of the key") - - @staticmethod - def CheckKey(key): - # 目前key位数是32位 - if key is None or len(key) != 64: - return False - - return True - - # 内存搜索特征码 - @staticmethod - def SearchMemory(parent, child): - offset = [] - index = -1 - - while True: - index = parent.find(child, index + 1) - if index == -1: - break - offset.append(index) - - return offset - - # 获取key的地址 - def GetKeyAddr(self, publicKeyList): - # 存放真正的key地址 - keyAddr = [] - - # 读取整个 WeChatWin.dll 的内容 - buffer = self.pm.read_bytes(self.dllBase, self.sizeOfImage) - - byteLen = 4 if self.bits == 32 else 8 - for publicKeyAddr in publicKeyList: - keyBytes = publicKeyAddr.to_bytes(byteLen, byteorder="little", signed=True) - offset = self.SearchMemory(buffer, keyBytes) - - if not offset or len(offset) == 0: - continue - - offset[:] = [x + self.dllBase for x in offset] - keyAddr += offset - - if len(keyAddr) == 0: - return None - - return keyAddr - - # 获取微信版本 - def GetVersion(self): - WeChatWindll_path = "" - for m in list(self.pm.list_modules()): - path = m.filename - if path.endswith("WeChatWin.dll"): - WeChatWindll_path = path - break - - if not WeChatWindll_path: - return False - - version = GetFileVersionInfo(WeChatWindll_path, "\\") - - msv = version['FileVersionMS'] - lsv = version['FileVersionLS'] - version = f"{str(HIWORD(msv))}.{str(LOWORD(msv))}.{str(HIWORD(lsv))}.{str(LOWORD(lsv))}" - - return version - - -# 获取exe文件的位数 -def get_exe_bit(file_path): - """ - 获取 PE 文件的位数: 32 位或 64 位 - :param file_path: PE 文件路径(可执行文件) - :return: 如果遇到错误则返回 64 - """ - try: - with open(file_path, 'rb') as f: - dos_header = f.read(2) - if dos_header != b'MZ': - print('get exe bit error: Invalid PE file') - return 64 - # Seek to the offset of the PE signature - f.seek(60) - pe_offset_bytes = f.read(4) - pe_offset = int.from_bytes(pe_offset_bytes, byteorder='little') - - # Seek to the Machine field in the PE header - f.seek(pe_offset + 4) - machine_bytes = f.read(2) - machine = int.from_bytes(machine_bytes, byteorder='little') - - if machine == 0x14c: - return 32 - elif machine == 0x8664: - return 64 - else: - print('get exe bit error: Unknown architecture: %s' % hex(machine)) - return 64 - except IOError: - print('get exe bit error: File not found or cannot be opened') - return 64 - - -# 读取内存中的字符串(非key部分) -def get_info_without_key(h_process, address, n_size=64): - array = ctypes.create_string_buffer(n_size) - if ReadProcessMemory(h_process, void_p(address), array, n_size, 0) == 0: return "None" - array = bytes(array).split(b"\x00")[0] if b"\x00" in array else bytes(array) - text = array.decode('utf-8', errors='ignore') - return text.strip() if text.strip() != "" else "None" - - -def pattern_scan_all(handle, pattern, *, return_multiple=False, find_num=100): - next_region = 0 - found = [] - user_space_limit = 0x7FFFFFFF0000 if sys.maxsize > 2 ** 32 else 0x7fff0000 - while next_region < user_space_limit: - try: - next_region, page_found = pymem.pattern.scan_pattern_page( - handle, - next_region, - pattern, - return_multiple=return_multiple - ) - except Exception as e: - print(e) - break - if not return_multiple and page_found: - return page_found - if page_found: - found += page_found - if len(found) > find_num: - break - return found - - -def get_info_wxid(h_process): - find_num = 100 - addrs = pattern_scan_all(h_process, br'\\Msg\\FTSContact', return_multiple=True, find_num=find_num) - wxids = [] - for addr in addrs: - array = ctypes.create_string_buffer(80) - if ReadProcessMemory(h_process, void_p(addr - 30), array, 80, 0) == 0: return "None" - array = bytes(array) # .split(b"\\")[0] - array = array.split(b"\\Msg")[0] - array = array.split(b"\\")[-1] - wxids.append(array.decode('utf-8', errors='ignore')) - wxid = max(wxids, key=wxids.count) if wxids else "None" - return wxid - - -def get_info_filePath(wxid="all"): - if not wxid: - return "None" - w_dir = "MyDocument:" - is_w_dir = False - - try: - key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Tencent\WeChat", 0, winreg.KEY_READ) - value, _ = winreg.QueryValueEx(key, "FileSavePath") - winreg.CloseKey(key) - w_dir = value - is_w_dir = True - except Exception as e: - w_dir = "MyDocument:" - - if not is_w_dir: - try: - user_profile = os.environ.get("USERPROFILE") - path_3ebffe94 = os.path.join(user_profile, "AppData", "Roaming", "Tencent", "WeChat", "All Users", "config", - "3ebffe94.ini") - with open(path_3ebffe94, "r", encoding="utf-8") as f: - w_dir = f.read() - is_w_dir = True - except Exception as e: - w_dir = "MyDocument:" - - if w_dir == "MyDocument:": - try: - # 打开注册表路径 - key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders") - documents_path = winreg.QueryValueEx(key, "Personal")[0] # 读取文档实际目录路径 - winreg.CloseKey(key) # 关闭注册表 - documents_paths = os.path.split(documents_path) - if "%" in documents_paths[0]: - w_dir = os.environ.get(documents_paths[0].replace("%", "")) - w_dir = os.path.join(w_dir, os.path.join(*documents_paths[1:])) - # print(1, w_dir) - else: - w_dir = documents_path - except Exception as e: - profile = os.environ.get("USERPROFILE") - w_dir = os.path.join(profile, "Documents") - - msg_dir = os.path.join(w_dir, "WeChat Files") - - if wxid == "all" and os.path.exists(msg_dir): - return msg_dir - - filePath = os.path.join(msg_dir, wxid) - return filePath if os.path.exists(filePath) else "None" - - -def get_key(db_path, addr_len): - def read_key_bytes(h_process, address, address_len=8): - array = ctypes.create_string_buffer(address_len) - if ReadProcessMemory(h_process, void_p(address), array, address_len, 0) == 0: return "None" - address = int.from_bytes(array, byteorder='little') # 逆序转换为int地址(key地址) - key = ctypes.create_string_buffer(32) - if ReadProcessMemory(h_process, void_p(address), key, 32, 0) == 0: return "None" - key_bytes = bytes(key) - return key_bytes - - def verify_key(key, wx_db_path): - if not wx_db_path or wx_db_path.lower() == "none": - return True - KEY_SIZE = 32 - DEFAULT_PAGESIZE = 4096 - DEFAULT_ITER = 64000 - with open(wx_db_path, "rb") as file: - blist = file.read(5000) - salt = blist[:16] - byteKey = hashlib.pbkdf2_hmac("sha1", key, salt, DEFAULT_ITER, KEY_SIZE) - first = blist[16:DEFAULT_PAGESIZE] - - mac_salt = bytes([(salt[i] ^ 58) for i in range(16)]) - mac_key = hashlib.pbkdf2_hmac("sha1", byteKey, mac_salt, 2, KEY_SIZE) - hash_mac = hmac.new(mac_key, first[:-32], hashlib.sha1) - hash_mac.update(b'\x01\x00\x00\x00') - - if hash_mac.digest() != first[-32:-12]: - return False - return True - - phone_type1 = "iphone\x00" - phone_type2 = "android\x00" - phone_type3 = "ipad\x00" - - pm = pymem.Pymem("WeChat.exe") - module_name = "WeChatWin.dll" - - MicroMsg_path = os.path.join(db_path, "MSG", "MicroMsg.db") - - type1_addrs = pm.pattern_scan_module(phone_type1.encode(), module_name, return_multiple=True) - type2_addrs = pm.pattern_scan_module(phone_type2.encode(), module_name, return_multiple=True) - type3_addrs = pm.pattern_scan_module(phone_type3.encode(), module_name, return_multiple=True) - type_addrs = type1_addrs if len(type1_addrs) >= 2 else type2_addrs if len(type2_addrs) >= 2 else type3_addrs if len( - type3_addrs) >= 2 else "None" - # print(type_addrs) - if type_addrs == "None": - return "None" - for i in type_addrs[::-1]: - for j in range(i, i - 2000, -addr_len): - key_bytes = read_key_bytes(pm.process_handle, j, addr_len) - if key_bytes == "None": - continue - if db_path != "None" and verify_key(key_bytes, MicroMsg_path): - return key_bytes.hex() - return "None" - - -# 读取微信信息(account,mobile,name,mail,wxid,key) -def read_info(version_list, is_logging=False): - wechat_process = [] - result = [] - error = "" - for process in psutil.process_iter(['name', 'exe', 'pid']): - if process.name() == 'WeChat.exe': - wechat_process.append(process) - - if len(wechat_process) == 0: - error = "[-] WeChat No Run" - if is_logging: print(error) - return -1 - - for process in wechat_process: - tmp_rd = {} - - tmp_rd['pid'] = process.pid - tmp_rd['version'] = Dispatch("Scripting.FileSystemObject").GetFileVersion(process.exe()) - - wechat_base_address = 0 - for module in process.memory_maps(grouped=False): - if module.path and 'WeChatWin.dll' in module.path: - wechat_base_address = int(module.addr, 16) - break - if wechat_base_address == 0: - error = f"[-] WeChat WeChatWin.dll Not Found" - if is_logging: print(error) - return -1 - - Handle = ctypes.windll.kernel32.OpenProcess(0x1F0FFF, False, process.pid) - - bias_list = version_list.get(tmp_rd['version'], None) - if not isinstance(bias_list, list) or len(bias_list) <= 4: - error = f"[-] WeChat Current Version Is Not Supported(maybe not get account,mobile,name,mail)" - if is_logging: print(error) - tmp_rd['account'] = "None" - tmp_rd['mobile'] = "None" - tmp_rd['name'] = "None" - tmp_rd['mail'] = "None" - return tmp_rd['version'] - else: - name_baseaddr = wechat_base_address + bias_list[0] - account__baseaddr = wechat_base_address + bias_list[1] - mobile_baseaddr = wechat_base_address + bias_list[2] - mail_baseaddr = wechat_base_address + bias_list[3] - # key_baseaddr = wechat_base_address + bias_list[4] - - tmp_rd['account'] = get_info_without_key(Handle, account__baseaddr, 32) if bias_list[1] != 0 else "None" - tmp_rd['mobile'] = get_info_without_key(Handle, mobile_baseaddr, 64) if bias_list[2] != 0 else "None" - tmp_rd['name'] = get_info_without_key(Handle, name_baseaddr, 64) if bias_list[0] != 0 else "None" - tmp_rd['mail'] = get_info_without_key(Handle, mail_baseaddr, 64) if bias_list[3] != 0 else "None" - - addrLen = get_exe_bit(process.exe()) // 8 - - tmp_rd['wxid'] = get_info_wxid(Handle) - tmp_rd['filePath'] = get_info_filePath(tmp_rd['wxid']) if tmp_rd['wxid'] != "None" else "None" - tmp_rd['key'] = "None" - tmp_rd['key'] = get_key(tmp_rd['filePath'], addrLen) - if tmp_rd['key'] == 'None': - wechat = Pymem("WeChat.exe") - key = Wechat(wechat).GetInfo() - if key: - tmp_rd['key'] = key - result.append(tmp_rd) - - if is_logging: - print("=" * 32) - if isinstance(result, str): # 输出报错 - print(result) - else: # 输出结果 - for i, rlt in enumerate(result): - for k, v in rlt.items(): - print(f"[+] {k:>8}: {v}") - print(end="-" * 32 + "\n" if i != len(result) - 1 else "") - print("=" * 32) - - return result - - -import os -import sys - - -def resource_path(relative_path): - """ Get absolute path to resource, works for dev and for PyInstaller """ - base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) - return os.path.join(base_path, relative_path) - - -def get_info(VERSION_LIST): - result = read_info(VERSION_LIST, True) # 读取微信信息 - return result - - -if __name__ == "__main__": - import argparse - - parser = argparse.ArgumentParser() - parser.add_argument("--vlfile", type=str, help="手机号", required=False) - parser.add_argument("--vldict", type=str, help="微信昵称", required=False) - - args = parser.parse_args() - - # 读取微信各版本偏移 - if args.vlfile: - VERSION_LIST_PATH = args.vlfile - with open(VERSION_LIST_PATH, "r", encoding="utf-8") as f: - VERSION_LIST = json.load(f) - if args.vldict: - VERSION_LIST = json.loads(args.vldict) - - if not args.vlfile and not args.vldict: - VERSION_LIST_PATH = "../version_list.json" - - with open(VERSION_LIST_PATH, "r", encoding="utf-8") as f: - VERSION_LIST = json.load(f) - - result = read_info(VERSION_LIST, True) # 读取微信信息 diff --git a/app/decrypt/version_list.json b/app/decrypt/version_list.json deleted file mode 100644 index a56b00e..0000000 --- a/app/decrypt/version_list.json +++ /dev/null @@ -1,1011 +0,0 @@ -{ - "3.2.1.154": [ - 328121948, - 328122328, - 328123056, - 328121976, - 328123020, - 0 - ], - "3.3.0.115": [ - 31323364, - 31323744, - 31324472, - 31323392, - 31324436, - 0 - ], - "3.3.0.84": [ - 31315212, - 31315592, - 31316320, - 31315240, - 31316284, - 0 - ], - "3.3.0.93": [ - 31323364, - 31323744, - 31324472, - 31323392, - 31324436, - 0 - ], - "3.3.5.34": [ - 30603028, - 30603408, - 30604120, - 30603056, - 30604100, - 0 - ], - "3.3.5.42": [ - 30603012, - 30603392, - 30604120, - 30603040, - 30604084, - 0 - ], - "3.3.5.46": [ - 30578372, - 30578752, - 30579480, - 30578400, - 30579444, - 0 - ], - "3.4.0.37": [ - 31608116, - 31608496, - 31609224, - 31608144, - 31609188, - 0 - ], - "3.4.0.38": [ - 31604044, - 31604424, - 31605152, - 31604072, - 31605116, - 0 - ], - "3.4.0.50": [ - 31688500, - 31688880, - 31689608, - 31688528, - 31689572, - 0 - ], - "3.4.0.54": [ - 31700852, - 31701248, - 31700920, - 31700880, - 31701924, - 0 - ], - "3.4.5.27": [ - 32133788, - 32134168, - 32134896, - 32133816, - 32134860, - 0 - ], - "3.4.5.45": [ - 32147012, - 32147392, - 32147064, - 32147040, - 32148084, - 0 - ], - "3.5.0.20": [ - 35494484, - 35494864, - 35494536, - 35494512, - 35495556, - 0 - ], - "3.5.0.29": [ - 35507980, - 35508360, - 35508032, - 35508008, - 35509052, - 0 - ], - "3.5.0.33": [ - 35512140, - 35512520, - 35512192, - 35512168, - 35513212, - 0 - ], - "3.5.0.39": [ - 35516236, - 35516616, - 35516288, - 35516264, - 35517308, - 0 - ], - "3.5.0.42": [ - 35512140, - 35512520, - 35512192, - 35512168, - 35513212, - 0 - ], - "3.5.0.44": [ - 35510836, - 35511216, - 35510896, - 35510864, - 35511908, - 0 - ], - "3.5.0.46": [ - 35506740, - 35507120, - 35506800, - 35506768, - 35507812, - 0 - ], - "3.6.0.18": [ - 35842996, - 35843376, - 35843048, - 35843024, - 35844068, - 0 - ], - "3.6.5.7": [ - 35864356, - 35864736, - 35864408, - 35864384, - 35865428, - 0 - ], - "3.6.5.16": [ - 35909428, - 35909808, - 35909480, - 35909456, - 35910500, - 0 - ], - "3.7.0.26": [ - 37105908, - 37106288, - 37105960, - 37105936, - 37106980, - 0 - ], - "3.7.0.29": [ - 37105908, - 37106288, - 37105960, - 37105936, - 37106980, - 0 - ], - "3.7.0.30": [ - 37118196, - 37118576, - 37118248, - 37118224, - 37119268, - 0 - ], - "3.7.5.11": [ - 37883280, - 37884088, - 37883136, - 37883008, - 37884052, - 0 - ], - "3.7.5.23": [ - 37895736, - 37896544, - 37895592, - 37883008, - 37896508, - 0 - ], - "3.7.5.27": [ - 37895736, - 37896544, - 37895592, - 37895464, - 37896508, - 0 - ], - "3.7.5.31": [ - 37903928, - 37904736, - 37903784, - 37903656, - 37904700, - 0 - ], - "3.7.6.24": [ - 38978840, - 38979648, - 38978696, - 38978604, - 38979612, - 0 - ], - "3.7.6.29": [ - 38986376, - 38987184, - 38986232, - 38986104, - 38987148, - 0 - ], - "3.7.6.44": [ - 39016520, - 39017328, - 39016376, - 38986104, - 39017292, - 0 - ], - "3.8.0.31": [ - 46064088, - 46064912, - 46063944, - 38986104, - 46064876, - 0 - ], - "3.8.0.33": [ - 46059992, - 46060816, - 46059848, - 38986104, - 46060780, - 0 - ], - "3.8.0.41": [ - 46064024, - 46064848, - 46063880, - 38986104, - 46064812, - 0 - ], - "3.8.1.26": [ - 46409448, - 46410272, - 46409304, - 38986104, - 46410236, - 0 - ], - "3.9.0.28": [ - 48418376, - 48419280, - 48418232, - 38986104, - 48419244, - 0 - ], - "3.9.2.23": [ - 50320784, - 50321712, - 50320640, - 38986104, - 50321676, - 50592864 - ], - "3.9.2.26": [ - 50329040, - 50329968, - 50328896, - 38986104, - 50329932, - 0 - ], - "3.9.5.81": [ - 61650872, - 61652208, - 61650680, - 0, - 61652144, - 0 - ], - "3.9.5.91": [ - 61654904, - 61656240, - 61654712, - 38986104, - 61656176, - 61677112 - ], - "3.9.6.19": [ - 61997688, - 61997464, - 61997496, - 38986104, - 61998960, - 0 - ], - "3.9.6.33": [ - 62030600, - 62031936, - 62030408, - 0, - 62031872, - 0 - ], - "3.9.7.15": [ - 63482696, - 63484032, - 63482504, - 0, - 63483968, - 0 - ], - "3.9.7.25": [ - 63482760, - 63484096, - 63482568, - 0, - 63484032, - 0 - ], - "3.9.7.29": [ - 63486984, - 63488320, - 63486792, - 0, - 63488256, - 63488352 - ], - "3.9.8.15": [ - 64996632, - 64997968, - 64996440, - 0, - 64997904, - 65011632 - ], - "3.9.8.25": [ - 65000920, - 0, - 65000728, - 0, - 0, - 0 - ], - "3.9.9.27": [ - 68065304, - 0, - 68065112, - 0, - 68066576 - ], - "3.9.9.35": [ - 68065304, - 0, - 68065112, - 0, - 68066576 - ], - "3.9.9.148": [ - 69043224, - 69044560, - 69043032, - 0, - 0 - ], - "3.9.5.65": [ - 61642744, - 61644080, - 61644081, - 0, - 61644016 - ], - "3.9.9.38": [ - 68070104, - 68071440, - 68069912, - 0, - 68071376 - ], - "3.9.9.147": [ - 76731445, - 0, - 69043032, - 0, - 0 - ], - "3.6.0.0": [ - 35842996, - 35844104, - 35843048, - 0, - 0 - ], - "3.9.9.43": [ - 68065944, - 68067280, - 68065752, - 0, - 68067216 - ], - "3.9.9.143": [ - 69035096, - 69036432, - 69034904, - 0, - 69036368 - ], - "3.3.0.0": [ - 31082900, - 31083928, - 31082952, - 0, - 0 - ], - "3.9.9.25": [ - 68065304, - 0, - 68065112, - 0, - 68066576 - ], - "3.9.8.11": [ - 0, - 0, - 0, - 0, - 64998160 - ], - "3.9.9.16": [ - 68060952, - 0, - 0, - 0, - 68062224 - ], - "3.9.6.24": [ - 62022264, - 62044248, - 62022072, - 0, - 62023536 - ], - "3.9.9.34": [ - 56102304, - 56118252, - 56102160, - 0, - 0 - ], - "3.9.6.39": [ - 0, - 63280064, - 63278536, - 0, - 63280000 - ], - "3.9.7.28": [ - 52433824, - 52434792, - 52434793, - 0, - 0 - ], - "3.9.8.137": [ - 65894869, - 65909760, - 65908232, - 0, - 65909696 - ], - "3.9.5.25": [ - 61530888, - 0, - 61530696, - 0, - 61532160 - ], - "3.9.5.80": [ - 50681672, - 50682640, - 50682641, - 0, - 0 - ], - "3.7.6.45": [ - 39016456, - 0, - 39016312, - 0, - 0 - ], - "3.5.0.0": [ - 35507848, - 35507848, - 35506800, - 0, - 0 - ], - "3.9.8.9": [ - 65001112, - 65002448, - 0, - 0, - 65002384 - ], - "3.9.6.47": [ - 0, - 63288512, - 63286984, - 0, - 0 - ], - "3.9.8.8": [ - 64996952, - 0, - 64996760, - 0, - 64998224 - ], - "3.9.6.43": [ - 63283144, - 63284480, - 63282952, - 0, - 0 - ], - "3.9.0.22": [ - 48405896, - 48406800, - 48405752, - 0, - 0 - ], - "3.7.6.43": [ - 39016456, - 39261580, - 39016312, - 0, - 0 - ], - "3.0.0.0": [ - 25834908, - 25846332, - 25834960, - 0, - 0 - ], - "3.7.0.23": [ - 37105844, - 37106952, - 37105896, - 0, - 0 - ], - "3.9.6.8": [ - 61960264, - 61961600, - 0, - 0, - 61961536 - ], - "3.9.5.55": [ - 61589448, - 61590784, - 61589256, - 0, - 61590720 - ], - "3.9.8.27": [ - 65000920, - 65002256, - 65000728, - 0, - 65002192 - ], - "2.4.5.1": [ - 27329425, - 24589520, - 24588544, - 0, - 0 - ], - "3.9.6.37": [ - 63287160, - 63310040, - 63286968, - 0, - 63288432 - ], - "3.9.5.77": [ - 61652272, - 61652272, - 61650744, - 0, - 61652208 - ], - "3.9.9.13": [ - 68044888, - 68069384, - 68044696, - 0, - 68046160 - ], - "3.9.5.39": [ - 0, - 0, - 0, - 0, - 61565216 - ], - "3.9.6.17": [ - 61972568, - 61973904, - 61972376, - 0, - 61973840 - ], - "3.9.9.11": [ - 0, - 0, - 68032344, - 0, - 68033808 - ], - "3.2.1.0": [ - 0, - 28123056, - 28122080, - 0, - 0 - ], - "3.8.1.25": [ - 0, - 0, - 46405272, - 0, - 0 - ], - "3.9.6.29": [ - 0, - 62052520, - 62030344, - 0, - 62031808 - ], - "3.9.8.12": [ - 53479320, - 53480288, - 53479176, - 0, - 0 - ], - "3.9.5.73": [ - 61650872, - 61652208, - 0, - 0, - 61652144 - ], - "3.9.1.25": [ - 48634640, - 48635544, - 48634496, - 0, - 0 - ], - "3.8.0.29": [ - 50910714, - 0, - 46060689, - 0, - 0 - ], - "3.9.9.22": [ - 56102304, - 0, - 56102160, - 0, - 0 - ], - "3.9.10.10": [ - 102868520, - 102869856, - 102868328, - 0, - 102869792 - ], - "3.8.0.18": [ - 46043224, - 46044048, - 46043080, - 0, - 0 - ], - "3.9.10.13": [ - 0, - 0, - 95125416, - 0, - 0 - ], - "3.9.10.18": [ - 95129640, - 95130976, - 95129448, - 0, - 0 - ], - "3.9.10.11": [ - 102868456, - 102869792, - 102868264, - 0, - 0 - ], - "3.9.7.14": [ - 0, - 0, - 63478408, - 0, - 63479872 - ], - "3.9.10.19": [ - 95129768, - 0, - 95129576, - 0, - 95131192 - ], - "3.7.6.38": [ - 39016136, - 0, - 39015992, - 0, - 0 - ], - "3.9.10.9": [ - 102868712, - 102870048, - 102868520, - 0, - 102869984 - ], - "3.9.10.16": [ - 71305680, - 71306648, - 71305536, - 0, - 0 - ], - "3.9.0.26": [ - 48405896, - 0, - 48405752, - 0, - 0 - ], - "3.9.7.13": [ - 63474296, - 63475632, - 63474104, - 0, - 63475568 - ], - "3.8.0.15": [ - 46014616, - 0, - 46014472, - 0, - 0 - ], - "3.9.10.25": [ - 95135256, - 95136592, - 95135064, - 0, - 95136528 - ], - "3.9.10.27": [ - 95125656, - 95126992, - 95125464, - 0, - 95126928 - ], - "3.8.0.27": [ - 50268814, - 46060496, - 46060497, - 0, - 0 - ], - "3.9.10.26": [ - 71305744, - 71306712, - 71305600, - 0, - 0 - ], - "3.9.11.7": [ - 93459160, - 93460496, - 93458968, - 0, - 0 - ], - "3.9.11.5": [ - 93456272, - 93456272, - 93454744, - 0, - 0 - ], - "3.9.11.8": [ - 93454872, - 93456208, - 93454680, - 0, - 93456144 - ], - "3.9.11.9": [ - 93463000, - 93464336, - 93462808, - 0, - 93464272 - ], - "3.9.11.13": [ - 93546264, - 93547600, - 93547603, - 0, - 93547536 - ], - "3.9.11.15": [ - 93550360, - 93551696, - 93550168, - 0, - 93551632 - ], - "3.9.11.17": [ - 93550360, - 0, - 93550168, - 0, - 93551632 - ], - "3.9.6.13": [ - 0, - 0, - 0, - 0, - 61965584 - ], - "3.9.6.124": [ - 62034888, - 0, - 62034696, - 0, - 62036160 - ], - "3.9.11.19": [ - 93550296, - 93551632, - 93550104, - 0, - 93551568 - ], - "3.9.11.16": [ - 69861360, - 69862328, - 69861216, - 0, - 0 - ], - "3.9.11.18": [ - 69861296, - 69862264, - 69861152, - 0, - 0 - ], - "3.9.11.23": [ - 93701208, - 93725072, - 93701016, - 0, - 0 - ], - "3.7.5.25": [ - 37899832, - 37900640, - 37899688, - 0, - 0 - ], - "3.9.11.25": [ - 93701080, - 93702416, - 93700888, - 0, - 0 - ], - "3.9.11.24": [ - 69992304, - 69993272, - 0, - 0, - 0 - ], - "3.9.0.18": [ - 48385208, - 48386112, - 48385064, - 0, - 0 - ], - "3.9.7.24": [ - 0, - 52434792, - 52433680, - 0, - 30689842 - ], - "3.9.12.4": [ - 93809448, - 0, - 93809256, - 0, - 93810720 - ], - "3.9.12.9": [ - 93815072, - 93815072, - 93813544, - 0, - 93815008 - ], - "3.9.12.11": [ - 93810784, - 93810784, - 93809256, - 0, - 93810720 - ], - "3.9.11.33": [ - 0, - 93702416, - 0, - 0, - 93702352 - ], - "3.9.12.15": [93813544, 0, 93813352, 0, 93814968], - "3.9.12.14": [ - 70045856, - 70046824, - 70045712, - 0, - 0 - ] -} \ No newline at end of file diff --git a/app/log/__init__.py b/app/log/__init__.py deleted file mode 100644 index 77076b1..0000000 --- a/app/log/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .logger import log, logger - -__all__ = ["logger", "log"] diff --git a/app/log/exception_handling.py b/app/log/exception_handling.py deleted file mode 100644 index c279ca4..0000000 --- a/app/log/exception_handling.py +++ /dev/null @@ -1,75 +0,0 @@ -import sqlite3 -import sys -import traceback - -import requests - -from app.person import Me - - -class ExceptionHanding: - def __init__(self, exc_type, exc_value, traceback_): - self.exc_type = exc_type - self.exc_value = exc_value - self.traceback = traceback_ - self.error_message = ''.join(traceback.format_exception(exc_type, exc_value, traceback_)) - - def parser_exc(self): - if isinstance(self.exc_value, PermissionError): - return f'权限错误,请使用管理员身份运行并将文件夹设置为可读写' - elif isinstance(self.exc_value, sqlite3.DatabaseError): - return '数据库错误,请删除app文件夹后重启电脑再运行软件' - elif isinstance(self.exc_value, OSError) and self.exc_value.errno == 28: - return '空间磁盘不足,请预留足够多的磁盘空间以供软件正常运行' - elif isinstance(self.exc_value, TypeError) and 'NoneType' in str(self.exc_value) and 'not iterable' in str( - self.exc_value): - return '数据库错误,请删除app文件夹后重启电脑再运行软件' - elif isinstance(self.exc_value,KeyboardInterrupt): - return '' - else: - return '未知错误类型,可参考 https://blog.lc044.love/post/7 解决该问题\n温馨提示:重启电脑可解决80%的问题' - - def __str__(self): - errmsg = f'{self.error_message}\n{self.parser_exc()}' - return errmsg - - -def excepthook(exc_type, exc_value, traceback_): - # 将异常信息转为字符串 - - # 在这里处理全局异常 - - error_message = ExceptionHanding(exc_type, exc_value, traceback_) - txt = '您可添加QQ群发送log文件以便解决该问题' - msg = f"Exception Type: {exc_type.__name__}\nException Value: {exc_value}\ndetails: {error_message}\n\n{txt}" - print(msg) - - # 调用原始的 excepthook,以便程序正常退出 - sys.__excepthook__(exc_type, exc_value, traceback_) - -def send_error_msg( message): - url = "http://api.lc044.love/error" - if not message: - return { - 'code': 201, - 'errmsg': '日志为空' - } - data = { - 'username': Me().wxid, - 'error': message - } - try: - response = requests.post(url, json=data) - if response.status_code == 200: - resp_info = response.json() - return resp_info - else: - return { - 'code': 503, - 'errmsg': '服务器错误' - } - except: - return { - 'code': 404, - 'errmsg': '客户端错误' - } diff --git a/app/person.py b/app/person.py deleted file mode 100644 index 56d0e5e..0000000 --- a/app/person.py +++ /dev/null @@ -1,152 +0,0 @@ -""" -定义各种联系人 -""" -import json -import os.path -import re -from typing import Dict -from PyQt5.QtGui import QPixmap - -from app.config import INFO_FILE_PATH -from app.ui.Icon import Icon - - -def singleton(cls): - _instance = {} - - def inner(): - if cls not in _instance: - _instance[cls] = cls() - return _instance[cls] - - return inner - - -class Person: - def __init__(self): - self.avatar_path = None - self.avatar = None - self.avatar_path_qt = Icon.Default_avatar_path - self.detail = {} - - def set_avatar(self, img_bytes): - if not img_bytes: - self.avatar.load(Icon.Default_avatar_path) - return - if img_bytes[:4] == b'\x89PNG': - self.avatar.loadFromData(img_bytes, format='PNG') - else: - self.avatar.loadFromData(img_bytes, format='jfif') - - def save_avatar(self, path=None): - if not self.avatar: - return - if path: - save_path = path - if os.path.exists(save_path): - self.avatar_path = save_path - return save_path - else: - os.makedirs('./data/avatar', exist_ok=True) - save_path = os.path.join(f'data/avatar/', self.wxid + '.png') - self.avatar_path = save_path - if not os.path.exists(save_path): - self.avatar.save(save_path) - print('保存头像', save_path) - - -@singleton -class Me(Person): - def __init__(self): - super().__init__() - self.avatar = QPixmap(Icon.Default_avatar_path) - self.avatar_path = ':/icons/icons/default_avatar.svg' - self.wxid = 'wxid_00112233' - self.wx_dir = '' - self.name = '' - self.mobile = '' - self.smallHeadImgUrl = '' - self.nickName = self.name - self.remark = self.nickName - self.token = '' - - def save_info(self): - if os.path.exists(INFO_FILE_PATH): - with open(INFO_FILE_PATH, 'r', encoding='utf-8') as f: - info_data = json.loads(f.read()) - info_data['name'] = self.name - info_data['mobile'] = self.mobile - with open(INFO_FILE_PATH, 'w', encoding='utf-8') as f: - json.dump(info_data, f, ensure_ascii=False, indent=4) - -class Contact(Person): - def __init__(self, contact_info: Dict): - super().__init__() - self.wxid = contact_info.get('UserName') - self.remark = contact_info.get('Remark') - # Alias,Type,Remark,NickName,PYInitial,RemarkPYInitial,ContactHeadImgUrl.smallHeadImgUrl,ContactHeadImgUrl,bigHeadImgUrl - self.alias = contact_info.get('Alias') - self.nickName = contact_info.get('NickName') - if not self.remark: - self.remark = self.nickName - self.remark = re.sub(r'[\\/:*?"<>|\s\.]', '_', self.remark) - self.smallHeadImgUrl = contact_info.get('smallHeadImgUrl') - self.smallHeadImgBLOG = b'' - self.avatar = QPixmap() - self.avatar_path = Icon.Default_avatar_path - self.is_chatroom = self.wxid.__contains__('@chatroom') - self.detail: Dict = contact_info.get('detail') - self.label_name = contact_info.get('label_name') # 联系人的标签分类 - - """ - detail存储了联系人的详细信息,是个字典 - { - 'region': tuple[国家,省份,市], # 地区三元组 - 'signature': str, # 个性签名 - 'telephone': str, # 电话号码,自己写的备注才会显示 - 'gender': int, # 性别 0:未知,1:男,2:女 - } - """ - - -class ContactDefault(Person): - def __init__(self, wxid=""): - super().__init__() - self.avatar = QPixmap(Icon.Default_avatar_path) - self.avatar_path = ':/icons/icons/default_avatar.svg' - self.wxid = wxid - self.remark = wxid - self.alias = wxid - self.nickName = wxid - self.smallHeadImgUrl = "" - self.smallHeadImgBLOG = b'' - self.is_chatroom = False - self.detail = {} - - -class Contacts: - def __init__(self): - self.contacts: Dict[str:Contact] = {} - - def add(self, wxid, contact: Contact): - if wxid not in contact: - self.contacts[wxid] = contact - - def get(self, wxid: str) -> Contact: - return self.contacts.get(wxid) - - def remove(self, wxid: str): - return self.contacts.pop(wxid) - - def save_avatar(self, avatar_dir: str = './data/avatar/'): - for wxid, contact in self.contacts.items(): - avatar_path = os.path.join(avatar_dir, wxid + '.png') - if os.path.exists(avatar_path): - continue - contact.save_avatar(avatar_path) - - -if __name__ == '__main__': - p1 = Me() - p2 = Me() - print(p1 == p2) diff --git a/app/resources/__init__.py b/app/resources/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/app/resources/data/file.png b/app/resources/data/file.png deleted file mode 100644 index 565cf36..0000000 Binary files a/app/resources/data/file.png and /dev/null differ diff --git a/app/resources/data/icons/csv.png b/app/resources/data/icons/csv.png deleted file mode 100644 index 28b84e2..0000000 Binary files a/app/resources/data/icons/csv.png and /dev/null differ diff --git a/app/resources/data/icons/excel.png b/app/resources/data/icons/excel.png deleted file mode 100644 index 121ad33..0000000 Binary files a/app/resources/data/icons/excel.png and /dev/null differ diff --git a/app/resources/data/icons/file.png b/app/resources/data/icons/file.png deleted file mode 100644 index 565cf36..0000000 Binary files a/app/resources/data/icons/file.png and /dev/null differ diff --git a/app/resources/data/icons/pause.png b/app/resources/data/icons/pause.png deleted file mode 100644 index 5cdcf61..0000000 Binary files a/app/resources/data/icons/pause.png and /dev/null differ diff --git a/app/resources/data/icons/pdf.png b/app/resources/data/icons/pdf.png deleted file mode 100644 index 2e94ec4..0000000 Binary files a/app/resources/data/icons/pdf.png and /dev/null differ diff --git a/app/resources/data/icons/phone.png b/app/resources/data/icons/phone.png deleted file mode 100644 index 9b32eb0..0000000 Binary files a/app/resources/data/icons/phone.png and /dev/null differ diff --git a/app/resources/data/icons/play.png b/app/resources/data/icons/play.png deleted file mode 100644 index 596fcdc..0000000 Binary files a/app/resources/data/icons/play.png and /dev/null differ diff --git a/app/resources/data/icons/ppt.png b/app/resources/data/icons/ppt.png deleted file mode 100644 index 9a452c5..0000000 Binary files a/app/resources/data/icons/ppt.png and /dev/null differ diff --git a/app/resources/data/icons/transfer1.png b/app/resources/data/icons/transfer1.png deleted file mode 100644 index 1a3cc37..0000000 Binary files a/app/resources/data/icons/transfer1.png and /dev/null differ diff --git a/app/resources/data/icons/transfer2.png b/app/resources/data/icons/transfer2.png deleted file mode 100644 index 040cb8e..0000000 Binary files a/app/resources/data/icons/transfer2.png and /dev/null differ diff --git a/app/resources/data/icons/transfer3.png b/app/resources/data/icons/transfer3.png deleted file mode 100644 index 498cc74..0000000 Binary files a/app/resources/data/icons/transfer3.png and /dev/null differ diff --git a/app/resources/data/icons/txt.png b/app/resources/data/icons/txt.png deleted file mode 100644 index f2fc060..0000000 Binary files a/app/resources/data/icons/txt.png and /dev/null differ diff --git a/app/resources/data/icons/video.png b/app/resources/data/icons/video.png deleted file mode 100644 index d362f99..0000000 Binary files a/app/resources/data/icons/video.png and /dev/null differ diff --git a/app/resources/data/icons/word.png b/app/resources/data/icons/word.png deleted file mode 100644 index 5a0bd48..0000000 Binary files a/app/resources/data/icons/word.png and /dev/null differ diff --git a/app/resources/data/icons/zip.png b/app/resources/data/icons/zip.png deleted file mode 100644 index a5ceb5d..0000000 Binary files a/app/resources/data/icons/zip.png and /dev/null differ diff --git a/app/resources/data/stopwords.txt b/app/resources/data/stopwords.txt deleted file mode 100644 index 2a7e6b9..0000000 --- a/app/resources/data/stopwords.txt +++ /dev/null @@ -1,2540 +0,0 @@ -wxid -就 -说 -啥 -好 -干 -哦 -好 -嗯 -恩 -噢 -喔 -行 -拿 -你 -乡村 -腹肌 -徐坤 -振兴 -着力 -努力 -注重 -提供 -意义 -习近平 -加快 -实施 -参与 -带动 -带领 -方式 -力量 -主体 -矛盾 -切实 -进一步 -已经 -价值 -成为 -拓展 -保障 -面临 -国家 -中国 -推进 -推动 -世界 -战略 -维护 -强化 -贯彻 -治理 -增强 -健全 -确保 -开展 -老婆 -坚持 -体系 -建设 -在 -对 -我国 -实现 -提高 -统筹 -完善 -工作 -领导 -深化 -构建 -作用 -支持 -弘扬 -指导 -形成 -思想 -把握 -提出 -! -" -# -$ -% -& -' -( -) -* -+ -, -- --- -. -.. -... -...... -................... -./ -.一 -.数 -.日 -/ -// -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -: -:// -:: -; -< -= -> ->> -? -@ -A -Lex -[ -\ -] -^ -_ -` -exp -sub -sup -| -} -~ -~~~~ -· -× -××× -Δ -Ψ -γ -μ -φ -φ. -В -— -—— -——— -‘ -’ -’‘ -“ -” -”, -… -…… -…………………………………………………③ -′∈ -′| -℃ -Ⅲ -↑ -→ -∈[ -∪φ∈ -≈ -① -② -②c -③ -③] -④ -⑤ -⑥ -⑦ -⑧ -⑨ -⑩ -── -■ -▲ - -、 -。 -〈 -〉 -《 -》 -》), -」 -『 -』 -【 -】 -〔 -〕 -〕〔 -㈧ -一 -一. -一一 -一下 -一个 -一些 -一何 -一切 -一则 -一则通过 -一天 -一定 -一方面 -一旦 -一时 -一来 -一样 -一次 -一片 -一番 -一直 -一致 -一般 -一起 -一转眼 -一边 -一面 -七 -万一 -三 -三天两头 -三番两次 -三番五次 -上 -上下 -上升 -上去 -上来 -上述 -上面 -下 -下列 -下去 -下来 -下面 -不 -不一 -不下 -不久 -不了 -不亦乐乎 -不仅 -不仅...而且 -不仅仅 -不仅仅是 -不会 -不但 -不但...而且 -不光 -不免 -不再 -不力 -不单 -不变 -不只 -不可 -不可开交 -不可抗拒 -不同 -不外 -不外乎 -不够 -不大 -不如 -不妨 -不定 -不对 -不少 -不尽 -不尽然 -不巧 -不已 -不常 -不得 -不得不 -不得了 -不得已 -不必 -不怎么 -不怕 -不惟 -不成 -不拘 -不择手段 -不敢 -不料 -不断 -不日 -不时 -不是 -不曾 -不止 -不止一次 -不比 -不消 -不满 -不然 -不然的话 -不特 -不独 -不由得 -不知不觉 -不管 -不管怎样 -不经意 -不胜 -不能 -不能不 -不至于 -不若 -不要 -不论 -不起 -不足 -不过 -不迭 -不问 -不限 -与 -与其 -与其说 -与否 -与此同时 -专门 -且 -且不说 -且说 -两者 -严格 -严重 -个 -个人 -个别 -中小 -中间 -丰富 -串行 -临 -临到 -为 -为主 -为了 -为什么 -为什麽 -为何 -为止 -为此 -为着 -主张 -主要 -举凡 -举行 -乃 -乃至 -乃至于 -么 -之 -之一 -之前 -之后 -之後 -之所以 -之类 -乌乎 -乎 -乒 -乘 -乘势 -乘机 -乘胜 -乘虚 -乘隙 -九 -也 -也好 -也就是说 -也是 -也罢 -了 -了解 -争取 -二 -二来 -二话不说 -二话没说 -于 -于是 -于是乎 -云云 -云尔 -互 -互相 -五 -些 -交口 -亦 -产生 -亲口 -亲手 -亲眼 -亲自 -亲身 -人 -人人 -人们 -人家 -人民 -什么 -什么样 -什麽 -仅 -仅仅 -今 -今后 -今天 -今年 -今後 -介于 -仍 -仍旧 -仍然 -从 -从不 -从严 -从中 -从事 -从今以后 -从优 -从古到今 -从古至今 -从头 -从宽 -从小 -从新 -从无到有 -从早到晚 -从未 -从来 -从此 -从此以后 -从而 -从轻 -从速 -从重 -他 -他人 -他们 -他是 -他的 -代替 -以 -以上 -以下 -以为 -以便 -以免 -以前 -以及 -以后 -以外 -以後 -以故 -以期 -以来 -以至 -以至于 -以致 -们 -任 -任何 -任凭 -任务 -企图 -伙同 -会 -伟大 -传 -传说 -传闻 -似乎 -似的 -但 -但凡 -但愿 -但是 -何 -何乐而不为 -何以 -何况 -何处 -何妨 -何尝 -何必 -何时 -何止 -何苦 -何须 -余外 -作为 -你 -你们 -你是 -你的 -使 -使得 -使用 -例如 -依 -依据 -依照 -依靠 -便 -便于 -促进 -保持 -保管 -保险 -俺 -俺们 -倍加 -倍感 -倒不如 -倒不如说 -倒是 -倘 -倘使 -倘或 -倘然 -倘若 -借 -借以 -借此 -假使 -假如 -假若 -偏偏 -做到 -偶尔 -偶而 -傥然 -像 -儿 -允许 -元/吨 -充其极 -充其量 -充分 -先不先 -先后 -先後 -先生 -光 -光是 -全体 -全力 -全年 -全然 -全身心 -全部 -全都 -全面 -八 -八成 -公然 -六 -兮 -共 -共同 -共总 -关于 -其 -其一 -其中 -其二 -其他 -其余 -其后 -其它 -其实 -其次 -具体 -具体地说 -具体来说 -具体说来 -具有 -兼之 -内 -再 -再其次 -再则 -再有 -再次 -再者 -再者说 -再说 -冒 -冲 -决不 -决定 -决非 -况且 -准备 -凑巧 -凝神 -几 -几乎 -几度 -几时 -几番 -几经 -凡 -凡是 -凭 -凭借 -出 -出于 -出去 -出来 -出现 -分别 -分头 -分期 -分期分批 -切 -切不可 -切切 -切勿 -切莫 -则 -则甚 -刚 -刚好 -刚巧 -刚才 -初 -别 -别人 -别处 -别是 -别的 -别管 -别说 -到 -到了儿 -到处 -到头 -到头来 -到底 -到目前为止 -前后 -前此 -前者 -前进 -前面 -加上 -加之 -加以 -加入 -加强 -动不动 -动辄 -勃然 -匆匆 -十分 -千 -千万 -千万千万 -半 -单 -单单 -单纯 -即 -即令 -即使 -即便 -即刻 -即如 -即将 -即或 -即是说 -即若 -却 -却不 -历 -原来 -去 -又 -又及 -及 -及其 -及时 -及至 -双方 -反之 -反之亦然 -反之则 -反倒 -反倒是 -反应 -反手 -反映 -反而 -反过来 -反过来说 -取得 -取道 -受到 -变成 -古来 -另 -另一个 -另一方面 -另外 -另悉 -另方面 -另行 -只 -只当 -只怕 -只是 -只有 -只消 -只要 -只限 -叫 -叫做 -召开 -叮咚 -叮当 -可 -可以 -可好 -可是 -可能 -可见 -各 -各个 -各人 -各位 -各地 -各式 -各种 -各级 -各自 -合理 -同 -同一 -同时 -同样 -后 -后来 -后者 -后面 -向 -向使 -向着 -吓 -吗 -否则 -吧 -吧哒 -吱 -呀 -呃 -呆呆地 -呐 -呕 -呗 -呜 -呜呼 -呢 -周围 -呵 -呵呵 -呸 -呼哧 -呼啦 -咋 -和 -咚 -咦 -咧 - -敢 -敢于 -敢情 -数/ -整个 -断然 -方 -方便 -方才 -方能 -方面 -旁人 -无 -无宁 -无法 -无论 -既 -既...又 -既往 -既是 -既然 -日复一日 -日渐 -日益 -日臻 -日见 -时候 -昂然 -明显 -明确 -是 -是不是 -是以 -是否 -是的 -显然 -显著 -普通 -普遍 -暗中 -暗地里 -暗自 -更 -更为 -更加 -更进一步 -曾 -曾经 -替 -替代 -最 -最后 -最大 -最好 -最後 -最近 -最高 -有 -有些 -有关 -有利 -有力 -有及 -有所 -有效 -有时 -有点 -有的 -有的是 -有着 -有著 -望 -朝 -朝着 -末##末 -本 -本人 -本地 -本着 -本身 -权时 -来 -来不及 -来得及 -来看 -来着 -来自 -来讲 -来说 -极 -极为 -极了 -极其 -极力 -极大 -极度 -极端 -构成 -果然 -果真 -某 -某个 -某些 -某某 -根据 -根本 -格外 -梆 -概 -次第 -欢迎 -欤 -正值 -正在 -正如 -正巧 -正常 -正是 -此 -此中 -此后 -此地 -此处 -此外 -此时 -此次 -此间 -殆 -毋宁 -每 -每个 -每天 -每年 -每当 -每时每刻 -每每 -每逢 -比 -比及 -比如 -比如说 -比方 -比照 -比起 -比较 -毕竟 -毫不 -毫无 -毫无例外 -毫无保留地 -汝 -沙沙 -没 -没奈何 -没有 -沿 -沿着 -注意 -活 -深入 -清楚 -满 -满足 -漫说 -焉 -然 -然则 -然后 -然後 -然而 -照 -照着 -牢牢 -特别是 -特殊 -特点 -犹且 -犹自 -独 -独自 -猛然 -猛然间 -率尔 -率然 -现代 -现在 -理应 -理当 -理该 -瑟瑟 -甚且 -甚么 -甚或 -甚而 -甚至 -甚至于 -用 -用来 -甫 -甭 -由 -由于 -由是 -由此 -由此可见 -略 -略为 -略加 -略微 -白 -白白 -的 -的确 -的话 -皆可 -目前 -直到 -直接 -相似 -相信 -相反 -相同 -相对 -相对而言 -相应 -相当 -相等 -省得 -看 -看上去 -看出 -看到 -看来 -看样子 -看看 -看见 -看起来 -真是 -真正 -眨眼 -着 -着呢 -矣 -矣乎 -矣哉 -知道 -砰 -确定 -碰巧 -社会主义 -离 -种 -积极 -移动 -究竟 -穷年累月 -突出 -突然 -窃 -立 -立刻 -立即 -立地 -立时 -立马 -竟 -竟然 -竟而 -第 -第二 -等 -等到 -等等 -策略地 -简直 -简而言之 -简言之 -管 -类如 -粗 -精光 -紧接着 -累年 -累次 -纯 -纯粹 -纵 -纵令 -纵使 -纵然 -练习 -组成 -经 -经常 -经过 -结合 -结果 -给 -绝 -绝不 -绝对 -绝非 -绝顶 -继之 -继后 -继续 -继而 -维持 -综上所述 -缕缕 -罢了 -老 -老大 -老是 -老老实实 -考虑 -者 -而 -而且 -而况 -而又 -而后 -而外 -而已 -而是 -而言 -而论 -联系 -联袂 -背地里 -背靠背 -能 -能否 -能够 -腾 -自 -自个儿 -自从 -自各儿 -自后 -自家 -自己 -自打 -自身 -臭 -至 -至于 -至今 -至若 -致 -般的 -良好 -若 -若夫 -若是 -若果 -若非 -范围 -莫 -莫不 -莫不然 -莫如 -莫若 -莫非 -获得 -藉以 -虽 -虽则 -虽然 -虽说 -蛮 -行为 -行动 -表明 -表示 -被 -要 -要不 -要不是 -要不然 -要么 -要是 -要求 -见 -规定 -觉得 -譬喻 -譬如 -认为 -认真 -认识 -让 -许多 -论 -论说 -设使 -设或 -设若 -诚如 -诚然 -话说 -该 -该当 -说明 -说来 -说说 -请勿 -诸 -诸位 -诸如 -谁 -谁人 -谁料 -谁知 -谨 -豁然 -贼死 -赖以 -赶 -赶快 -赶早不赶晚 -起 -起先 -起初 -起头 -起来 -起见 -起首 -趁 -趁便 -趁势 -趁早 -趁机 -趁热 -趁着 -越是 -距 -跟 -路经 -转动 -转变 -转贴 -轰然 -较 -较为 -较之 -较比 -边 -达到 -达旦 -迄 -迅速 -过 -过于 -过去 -过来 -运用 -近 -近几年来 -近年来 -近来 -还 -还是 -还有 -还要 -这 -这一来 -这个 -这么 -这么些 -这么样 -这么点儿 -这些 -这会儿 -这儿 -这就是说 -这时 -这样 -这次 -这点 -这种 -这般 -这边 -这里 -这麽 -进入 -进去 -进来 -进步 -进而 -进行 -连 -连同 -连声 -连日 -连日来 -连袂 -连连 -迟早 -迫于 -适应 -适当 -适用 -逐步 -逐渐 -通常 -通过 -造成 -逢 -遇到 -遭到 -遵循 -遵照 -避免 -那 -那个 -那么 -那么些 -那么样 -那些 -那会儿 -那儿 -那时 -那末 -那样 -那般 -那边 -那里 -那麽 -部分 -都 -鄙人 -采取 -里面 -重大 -重新 -重要 -鉴于 -针对 -长期以来 -长此下去 -长线 -长话短说 -问题 -间或 -防止 -阿 -附近 -陈年 -限制 -陡然 -除 -除了 -除却 -除去 -除外 -除开 -除此 -除此之外 -除此以外 -除此而外 -除非 -随 -随后 -随时 -随着 -随著 -隔夜 -隔日 -难得 -难怪 -难说 -难道 -难道说 -集中 -零 -需要 -非但 -非常 -非徒 -非得 -非特 -非独 -靠 -顶多 -顷 -顷刻 -顷刻之间 -顷刻间 -顺 -顺着 -顿时 -颇 -风雨无阻 -饱 -首先 -马上 -高低 -高兴 -默然 -默默地 -齐 -︿ -! -# -$ -% -& -' -( -) -)÷(1- -)、 -* -+ -+ξ -++ -, -,也 -- --β --- --[*]- -. -/ -0 -0:2 -1 -1. -12% -2 -2.3% -3 -4 -5 -5:0 -6 -7 -8 -9 -: -; -< -<± -<Δ -<λ -<φ -<< -= -=″ -=☆ -=( -=- -=[ -={ -> ->λ -? -@ -A -LI -R.L. -ZXFITL -[ -[①①] -[①②] -[①③] -[①④] -[①⑤] -[①⑥] -[①⑦] -[①⑧] -[①⑨] -[①A] -[①B] -[①C] -[①D] -[①E] -[①] -[①a] -[①c] -[①d] -[①e] -[①f] -[①g] -[①h] -[①i] -[①o] -[② -[②①] -[②②] -[②③] -[②④ -[②⑤] -[②⑥] -[②⑦] -[②⑧] -[②⑩] -[②B] -[②G] -[②] -[②a] -[②b] -[②c] -[②d] -[②e] -[②f] -[②g] -[②h] -[②i] -[②j] -[③①] -[③⑩] -[③F] -[③] -[③a] -[③b] -[③c] -[③d] -[③e] -[③g] -[③h] -[④] -[④a] -[④b] -[④c] -[④d] -[④e] -[⑤] -[⑤]] -[⑤a] -[⑤b] -[⑤d] -[⑤e] -[⑤f] -[⑥] -[⑦] -[⑧] -[⑨] -[⑩] -[*] -[- -[] -] -]∧′=[ -][ -_ -a] -b] -c] -e] -f] -ng昉 -{ -{- -| -} -}> -~ -~± -~+ -¥ -打开天窗说亮话 -到目前为止 -赶早不赶晚 -常言说得好 -何乐而不为 -毫无保留地 -由此可见 -这就是说 -这么点儿 -综上所述 -总的来看 -总的来说 -总的说来 -总而言之 -相对而言 -除此之外 -反过来说 -恰恰相反 -如上所述 -换句话说 -具体地说 -具体说来 -另一方面 -与此同时 -一则通过 -毫无例外 -不然的话 -从此以后 -从古到今 -从古至今 -从今以后 -大张旗鼓 -从无到有 -从早到晚 -弹指之间 -不亦乐乎 -不知不觉 -不止一次 -不择手段 -不可开交 -不可抗拒 -不仅仅是 -不管怎样 -挨家挨户 -长此下去 -长话短说 -除此而外 -除此以外 -除此之外 -得天独厚 -川流不息 -长期以来 -挨门挨户 -挨门逐户 -多多少少 -多多益善 -二话不说 -更进一步 -二话没说 -分期分批 -风雨无阻 -归根到底 -归根结底 -反之亦然 -大面儿上 -倒不如说 -成年累月 -换句话说 -或多或少 -简而言之 -接连不断 -尽如人意 -尽心竭力 -尽心尽力 -尽管如此 -据我所知 -具体地说 -具体来说 -具体说来 -近几年来 -每时每刻 -屡次三番 -三番两次 -三番五次 -三天两头 -另一方面 -老老实实 -年复一年 -恰恰相反 -顷刻之间 -穷年累月 -千万千万 -日复一日 -如此等等 -如前所述 -如上所述 -一方面 -切不可 -顷刻间 -全身心 -另方面 -另一个 -猛然间 -默默地 -就是说 -近年来 -尽可能 -接下来 -简言之 -急匆匆 -即是说 -基本上 -换言之 -充其极 -充其量 -暗地里 -反之则 -比如说 -背地里 -背靠背 -并没有 -不得不 -不得了 -不得已 -不仅仅 -不经意 -不能不 -不外乎 -不由得 -不怎么 -不至于 -策略地 -差不多 -常言道 -常言说 -多年来 -多年前 -差一点 -敞开儿 -抽冷子 -大不了 -反倒是 -反过来 -大体上 -当口儿 -倒不如 -怪不得 -动不动 -看起来 -看上去 -看样子 -够瞧的 -到了儿 -呆呆地 -来不及 -来得及 -到头来 -连日来 -于是乎 -为什么 -这会儿 -换言之 -那会儿 -那么些 -那么样 -什么样 -反过来 -紧接着 -就是说 -要不然 -要不是 -一方面 -以至于 -自个儿 -自各儿 -之所以 -这么些 -这么样 -怎么办 -怎么样 -谁知 -顺着 -似的 -虽然 -虽说 -虽则 -随着 -所以 -他们 -他人 -它们 -她们 -倘或 -倘然 -倘若 -倘使 -要么 -要是 -也罢 -也好 -以便 -依照 -以及 -以免 -以至 -以致 -抑或 -因此 -因而 -因为 -由于 -有的 -有关 -有些 -于是 -与否 -与其 -越是 -云云 -一般 -一旦 -一来 -一切 -一样 -同时 -万一 -为何 -为了 -为着 -嗡嗡 -我们 -呜呼 -乌乎 -无论 -无宁 -沿着 -毋宁 -向着 -照着 -怎么 -咱们 -在下 -再说 -再者 -怎样 -这边 -这儿 -这个 -这里 -这么 -这时 -这些 -这样 -正如 -之类 -之一 -只是 -只限 -只要 -只有 -至于 -诸位 -着呢 -纵令 -纵然 -纵使 -遵照 -作为 -喔唷 -自从 -自己 -自家 -自身 -总之 -要不 -哎呀 -哎哟 -俺们 -按照 -吧哒 -罢了 -本着 -比方 -比如 -鄙人 -彼此 -别的 -别说 -并且 -不比 -不成 -不单 -不但 -不独 -不管 -不光 -不过 -不仅 -不拘 -不论 -不怕 -不然 -不如 -不特 -不惟 -不问 -不只 -朝着 -趁着 -除非 -除了 -此间 -此外 -从而 -但是 -当着 -的话 -等等 -叮咚 -对于 -多少 -而况 -而且 -而是 -而外 -而言 -而已 -尔后 -反之 -非但 -非徒 -否则 -嘎登 -各个 -各位 -各种 -各自 -根据 -故此 -固然 -关于 -果然 -果真 -哈哈 -何处 -何况 -何时 -哼唷 -呼哧 -还是 -还有 -或是 -或者 -极了 -及其 -及至 -即便 -即或 -即令 -即若 -即使 -既然 -既是 -继而 -加之 -假如 -假若 -假使 -鉴于 -几时 -较之 -接着 -结果 -进而 -尽管 -经过 -就是 -可见 -可是 -可以 -况且 -开始 -开外 -来着 -例如 -连同 -两者 -另外 -慢说 -漫说 -每当 -莫若 -某个 -某些 -哪边 -哪儿 -哪个 -哪里 -哪年 -哪怕 -哪天 -哪些 -哪样 -那边 -那儿 -那个 -那里 -那么 -那时 -那些 -那样 -乃至 -宁可 -宁肯 -宁愿 -你们 -啪达 -旁人 -凭借 -其次 -其二 -其他 -其它 -其一 -其余 -其中 -起见 -起见 -岂但 -前后 -前者 -然而 -然后 -然则 -人家 -任何 -任凭 -如此 -如果 -如何 -如其 -如若 -若非 -若是 -上下 -尚且 -设若 -设使 -甚而 -甚么 -甚至 -省得 -时候 -什么 -使得 -是的 -首先 -首先 -其次 -再次 -最后 -您们 -它们 -她们 -他们 -我们 -你是 -您是 -我是 -他是 -她是 -它是 -不是 -你们 -啊哈 -啊呀 -啊哟 -挨次 -挨个 -挨着 -哎呀 -哎哟 -俺们 -按理 -按期 -默然 -按时 -按说 -按照 -暗中 -暗自 -昂然 -八成 -倍感 -倍加 -本人 -本身 -本着 -并非 -别人 -必定 -比起 -比如 -比照 -鄙人 -毕竟 -必将 -必须 -并肩 -并没 -并排 -并且 -并无 -勃然 -不必 -不常 -不大 -不单 -不但 -而且 -不得 -不迭 -不定 -不独 -不对 -不妨 -不管 -不光 -不过 -不会 -不仅 -不拘 -不力 -不了 -不料 -不论 -不满 -不免 -不起 -不巧 -不然 -不日 -不少 -不胜 -不时 -不是 -不同 -不能 -不要 -不外 -不下 -不限 -不消 -不已 -不再 -不曾 -不止 -不只 -才能 -彻夜 -趁便 -趁机 -趁热 -趁势 -趁早 -趁着 -成心 -乘机 -乘势 -乘隙 -乘虚 -诚然 -迟早 -充分 -出来 -出去 -除此 -除非 -除开 -除了 -除去 -除却 -除外 -处处 -传说 -传闻 -纯粹 -此后 -此间 -此外 -此中 -次第 -匆匆 -从不 -从此 -从而 -从宽 -从来 -从轻 -从速 -从头 -从未 -从小 -从新 -从严 -从优 -从中 -从重 -凑巧 -存心 -达旦 -打从 -大大 -大抵 -大都 -大多 -大凡 -大概 -大家 -大举 -大略 -大约 -大致 -待到 -单纯 -单单 -但是 -但愿 -当场 -当儿 -当即 -当然 -当庭 -当头 -当下 -当真 -当中 -当着 -倒是 -到处 -到底 -到头 -得起 -的话 -的确 -等到 -等等 -顶多 -动辄 -陡然 -独自 -断然 -对于 -顿时 -多次 -多多 -多亏 -而后 -而论 -而且 -而是 -而外 -而言 -而已 -而又 -尔等 -反倒 -反而 -反手 -反之 -方才 -方能 -非常 -非但 -非得 -分头 -奋勇 -愤然 -更为 -更加 -根据 -个人 -各式 -刚才 -敢情 -该当 -嘎嘎 -否则 -赶快 -敢于 -刚好 -刚巧 -高低 -格外 -隔日 -隔夜 -公然 -过于 -果然 -果真 -光是 -关于 -共总 -姑且 -故此 -故而 -故意 -固然 -惯常 -毫不 -毫无 -很多 -何须 -好在 -何必 -何尝 -何妨 -何苦 -何况 -何止 -很少 -轰然 -后来 -呼啦 -哗啦 -互相 -忽地 -忽然 -话说 -或是 -伙同 -豁然 -恍然 -还是 -或许 -或者 -基本 -基于 -极大 -极度 -极端 -极力 -极其 -极为 -即便 -即将 -及其 -及至 -即刻 -即令 -即使 -几度 -几番 -几乎 -几经 -既然 -继而 -继之 -加上 -加以 -加之 -假如 -假若 -假使 -间或 -将才 -简直 -鉴于 -将近 -将要 -交口 -较比 -较为 -较之 -皆可 -截然 -截至 -藉以 -借此 -借以 -届时 -尽快 -近来 -进而 -进来 -进去 -尽管 -尽量 -尽然 -就算 -居然 -就此 -就地 -竟然 -究竟 -经常 -尽早 -精光 -经过 -就是 -局外 -举凡 -据称 -据此 -据实 -据说 -可好 -看来 -开外 -绝不 -决不 -据悉 -决非 -绝顶 -绝对 -绝非 -可见 -可能 -可是 -可以 -恐怕 -来讲 -来看 -快要 -况且 -拦腰 -牢牢 -老是 -累次 -累年 -理当 -理该 -理应 -例如 -立地 -立刻 -立马 -立时 -联袂 -连连 -连日 -路经 -临到 -连声 -连同 -连袂 -另外 -另行 -屡次 -屡屡 -缕缕 -率尔 -率然 -略加 -略微 -略为 -论说 -马上 -猛然 -没有 -每当 -每逢 -每每 -莫不 -莫非 -莫如 -莫若 -哪怕 -那么 -那末 -那些 -乃至 -难道 -难得 -难怪 -难说 -你们 -凝神 -宁可 -宁肯 -宁愿 -偶而 -偶尔 -碰巧 -譬如 -偏偏 -平素 -迫于 -扑通 -其次 -其后 -其实 -其它 -起初 -起来 -起首 -起头 -起先 -岂但 -岂非 -岂止 -恰逢 -恰好 -恰恰 -恰巧 -恰如 -恰似 -前后 -前者 -切莫 -切切 -切勿 -亲口 -亲身 -亲手 -亲眼 -亲自 -顷刻 -请勿 -取道 -权时 -全都 -全力 -全年 -全然 -然而 -然后 -人家 -人人 -仍旧 -仍然 -日见 -日渐 -日益 -日臻 -如常 -如次 -如果 -如今 -如期 -如若 -如上 -如下 -上来 -上去 -瑟瑟 -沙沙 -啊 -哎 -唉 -俺 -按 -吧 -把 -甭 -别 -嘿 -很 -乎 -会 -或 -既 -及 -啦 -了 -们 -你 -您 -哦 -砰 -啊 -你 -我 -他 -她 -它 -听 -哪 -想 -打 -🙄 -奥 -真 \ No newline at end of file diff --git a/app/resources/data/template.html b/app/resources/data/template.html deleted file mode 100644 index 608178f..0000000 --- a/app/resources/data/template.html +++ /dev/null @@ -1,1821 +0,0 @@ -<!DOCTYPE html> -<html lang="zh-CN"> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <meta name="referrer" content="no-referrer"/> - <style> -* { - padding: 0; - margin: 0; -} - -body { - margin: 0; - display: flex; - flex-direction: row; - height: 100vh; - align-items: center; - justify-content: center; - background-color: #F5F5F5; - /*background-image: url("data:image/svg+xml,%3Csvg width='52' height='26' viewBox='0 0 52 26' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%2394AB85' fill-opacity='0.4'%3E%3Cpath d='M10 10c0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6h2c0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4 3.314 0 6 2.686 6 6 0 2.21 1.79 4 4 4v2c-3.314 0-6-2.686-6-6 0-2.21-1.79-4-4-4-3.314 0-6-2.686-6-6zm25.464-1.95l8.486 8.486-1.414 1.414-8.486-8.486 1.414-1.414z' /%3E%3C/g%3E%3C/g%3E%3C/svg%3E");*/ -} - -::-webkit-scrollbar { - width: 10px; -} - -::-webkit-scrollbar-track { - /*-webkit-box-shadow: inset006pxrgba(0, 0, 0, 0.3);*/ - border-radius: 8px; -} - -::-webkit-scrollbar-thumb { - border-radius: 10px; - background: rgba(0, 0, 0, 0); - /*-webkit-box-shadow: inset006pxrgba(0, 0, 0, 0.5);*/ -} - -.page { - display: flex; - flex-direction: row; - width: 100%; - height: 100%; - max-width: 1200px; - box-shadow: 1px 1px 3px #ebebeb; - border-radius: 5px; -} - -.page .side-bar { - width: 50px; - background-color: #2e2e2e; - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; -} - -.page .mid-bar { - width: 300px; - background-color: #ebebeb; - border-right: solid 1px #d6d6d6; -} - -.page .main-body { - flex: 1; - display: flex; - flex-direction: column; - background-color: #f5f5f5; - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; -} - -.page .main-body .title-bar { - height: 60px; - display: flex; - flex-direction: row; - justify-content: flex-start; - align-items: center; -} - -.page .main-body .title-bar p { - margin: 5px 25px 5px 25px; - font-size: 18px; -} - -.page .main-body .container { - flex: 1; - border-top: solid 3px #f0f0f0; - border-bottom: solid 3px #f0f0f0; -} - -.page .main-body .nav-bar { - height: 80px; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; -} - -.page .main-body .nav-bar .turner-bar { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - color: #2e2e2e; - font-size: 16px; - transform: translateY(-10px); - user-select: none; -} - -.page .main-body .nav-bar .turner-bar .button { - display: inline-block; - background-color: #d6d6d6; - margin-left: 20px; - margin-right: 20px; - padding: 10px 15px 10px 15px; - border-radius: 5px; - font-size: 14px; - cursor: pointer; - transition: all 0.2s; -} - -.page .main-body .nav-bar .turner-bar .button:hover { - background-color: #ebebeb; -} - -.page .main-body .nav-bar .turner-bar p { - display: inline-block; - margin-left: 5px; - margin-right: 5px; -} - -.page .main-body .nav-bar .turner-bar input { - border: none; - resize: none; - outline: none; - background: none; - border-bottom: solid 1px #1F1F1F; - text-align: center; - font-size: 18px; - font-weight: 600; - height: 24px; - width: 50px; -} - - -.container { - /*height: 80vh;*/ - /*width: 100%;*/ - /*max-width: 900px;*/ - /*border-radius: 4px;*/ - /*border: 0.5px solid #e0e0e0;*/ - /*background-color: #f5f5f5;*/ - display: flex; - /* flex-flow: column; */ - overflow: hidden; - justify-content: center; /* 在主轴上居中 */ -} - -.container .content { - width: calc(100% - 40px); - padding: 20px; - overflow-y: scroll; - flex: 1; -} - -.container .content:hover::-webkit-scrollbar-thumb { - background: rgba(0, 0, 0, 0.1); -} - -.container .content:hover::-webkit-scrollbar-thumb:hover { - background: rgba(0, 0, 0, 0.3); -} - -.bubble { - white-space: pre-wrap; - max-width: 400px; - padding: 10px 11px 10px 11px; - border-radius: 5px; - position: relative; - color: #1F1F1F; - font-size: 14px; - word-wrap: break-word; - word-break: normal; -} - -.chat-refer { - margin-top: 5px; - max-width: 400px; - padding: 8px 10px 8px 10px; - border-radius: 3px; - position: relative; - color: #797979; - font-size: 12px; - background-color: #e8e8e8; - word-wrap: break-word; - word-break: normal; -} - -.chat-refer-right { - margin-right: 15px; -} - -.chat-refer-left { - margin-left: 15px; -} - -.item-left .bubble { - margin-left: 15px; - background-color: #fff; -} - -.item-left .bubble:before { - content: ""; - position: absolute; - width: 0; - height: 0; - border-left: 10px solid transparent; - border-top: 10px solid transparent; - border-right: 10px solid #fff; - border-bottom: 10px solid transparent; - left: -20px; -} - -.item-right .bubble { - margin-right: 15px; - background-color: #9eea6a; -} - -.item-right .bubble:before { - content: ""; - position: absolute; - width: 0; - height: 0; - border-left: 10px solid #9eea6a; - border-top: 10px solid transparent; - border-right: 10px solid transparent; - border-bottom: 10px solid transparent; - right: -20px; -} - -.item { - margin-top: 15px; - display: flex; - width: 100%; -} - -.item-refer { - margin-top: 4px; -} - -.item.item-right { - justify-content: flex-end; -} - -.item.item-center { - justify-content: center; -} - -.item.item-center span { - font-size: 12px; - padding: 2px 4px; - color: #fff; - background-color: #dadada; - border-radius: 3px; - -moz-user-select: none; /*火狐*/ - -webkit-user-select: none; /*webkit浏览器*/ - -ms-user-select: none; /*IE10*/ - -khtml-user-select: none; /*早期浏览器*/ - user-select: none; -} - -.content-wrapper { - display: flex; - flex-direction: column; -} - -.content-wrapper-left { - align-items: baseline; -} - -.content-wrapper-right { - align-items: flex-end; -} - -.displayname { - margin-left: 13px; - margin-left: 13px; - font-size: 13px; - margin-bottom: 5px; - color: darkgray; -} - -.chat-image img, .chat-file img { - margin-right: 18px; - margin-left: 18px; - max-width: 300px; - /*max-height: auto;*/ -} - -.avatar img { - width: 42px; - height: 42px; - border-radius: 3px; - user-select: none; -} - -.chat-video video { - margin-right: 18px; - margin-left: 18px; - max-width: 350px; -} - -.chat-audio { - max-width: 400px; -} - -audio { - margin-left: 9px; - margin-right: 9px; -} - -.chat-music-audio, .chat-file { - width: 300px; - margin-right: 20px; - display: flex; - flex-direction: column; - padding: 10px; - background-color: #fff; - border-radius: 4px; - cursor: pointer; - height: 100px; - margin-left: 10px; -} - -.chat-file img { - width: 50px; -} - -.chat-music-audio .player-box, .chat-file .file-box { - width: 300px; - display: flex; - align-items: center; - cursor: pointer; - height: 80px; -} - -.chat-music-audio .player-original, .chat-file .app-info { - border-top: 1px solid #ede3e3; -} - -.chat-music-audio .player-original p, .chat-file .app-info p { - margin-top: 3px; - color: #888; -} - -.chat-music-audio .player-controls, .chat-file .file-img { - display: flex; - align-items: center;; -} - -.file-title, .card-content > h2, .description > p { - display: -webkit-box; - overflow: hidden; - text-overflow: ellipsis; - -webkit-box-orient: vertical; -} - -.file-title, .card-content > h2 { - -webkit-line-clamp: 2; -} - -.description > p { - -webkit-line-clamp: 3; - margin-top: 2px; -} - - -.chat-music-audio .flex1, .chat-file .flex1 { - flex: 1; - justify-content: start; -} - -.chat-music-audio .flex2, .chat-file .flex2 { - flex: 2; - justify-content: end; -} - -.chat-music-audio .player-info, .chat-file .file-info { - width: 200px; - height: 80px; - margin-left: 4px; - margin-top: 15px; - white-space: normal; - flex-basis: 200px; - word-break: break-word; -} - -.chat-music-audio .song-title, .chat-file .file-name { - font-weight: bold; - overflow-wrap: break-word; -} - -.chat-music-audio .artist, .chat-file .file-size { - margin-top: 5px; - color: #888; -} - -.app-info { - font-size: 13px; - margin-left: 3px; - margin-right: 3px; -} - -.file-size { - font-size: 14px; -} - -.chat-music-audio .play-button { - width: 50px; - height: 50px; - background-color: rgba(0, 0, 0, 0); - border-radius: 50%; - border: none; - outline: none; - cursor: pointer; -} - -.chat-music-audio .play-button.playing { - background: url("./icon/pause.png"); -} - -.chat-music-audio .play-button.paused { - background: url("./icon/play.png"); -} - -.input-area { - border-top: 0.5px solid #e0e0e0; - height: 150px; - display: flex; - flex-flow: column; - background-color: #fff; -} - -textarea { - flex: 1; - padding: 5px; - font-size: 14px; - border: none; - cursor: pointer; - overflow-y: auto; - overflow-x: hidden; - outline: none; - resize: none; -} - -.button-area { - display: flex; - height: 40px; - margin-right: 10px; - line-height: 40px; - padding: 5px; - justify-content: flex-end; -} - -.button-area button { - width: 80px; - border: none; - outline: none; - border-radius: 4px; - float: right; - cursor: pointer; -} - -.button-row, -.jump-row, -#paginationInfo { - display: flex; - justify-content: center; - align-items: center; - margin-bottom: 10px; -} - -button { - padding: 10px 25px; - background-color: #3498db; - color: white; - border: none; - border-radius: 4px; - cursor: pointer; - margin: 0 14px; - transition: background-color 0.3s; -} - -button:hover { - background-color: #2980b9; -} - -input { - padding: 8px; - width: 120px; - box-sizing: border-box; - margin-right: 0px; - margin-left: 15px; -} - -button, -input { - font-size: 14px; -} - -#paginationInfo { - color: #555; - font-size: 14px; -} - -/* 分享的卡片 */ - -.card { - background-color: #fff; - border-radius: 10px; - overflow: hidden; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - max-width: 400px; - width: 400px; - display: flex; - flex-direction: column; - text-align: left; - margin: 5px 20px 20px 20px; -} - -.card a { - text-decoration: none; /* 去掉链接的下划线 */ - color: inherit; /* 继承父元素的文字颜色 */ - -} - -.card-content { - padding: 20px; - flex: 1; -} - -.thumbnail { - width: 50px; - height: 50px; - object-fit: cover; -} - -.description { - display: flex; - justify-content: space-between; -} - -.link-info { - display: flex; - align-items: center; - justify-content: center; - padding: 10px; - background-color: #f0f0f0; -} - -.app-logo { - width: 30px; - height: 30px; - margin-right: 10px; - border-radius: 50%; -} - -.app-name { - font-weight: bold; -} - -/* 转账 */ - -.transfer-box { - width: 200px; - height: 80px; - margin-left: 18px; - margin-right: 18px; - border-radius: 3px; - padding-left: 11px; - padding-right: 11px; - position: relative; -} - -.transfer-box[paysubtype="1"], .transfer-box[paysubtype="1"]::before { - background: #f79c46; -} - -.transfer-box[paysubtype="1"] i { - background-image: url(./icon/transfer1.png); -} - -.transfer-box:not([paysubtype="1"]), .transfer-box:not([paysubtype="1"])::before { - background: #f8e2c6; -} - -.transfer-box[paysubtype="3"] i { - background-image: url(./icon/transfer2.png); -} - -.transfer-box[paysubtype="4"] i { - background-image: url(./icon/transfer3.png); -} - -.transfer-box::before { - content: ""; - width: 8px; - height: 8px; - position: absolute; - transform: rotate(45deg); - top: 18px; -} - -.transfer-box[issend="0"]::before { - left: -3px; -} - -.transfer-box[issend="1"]::before { - left: 218px; -} - -.trans-content { - display: flex; - height: 60px; - align-items: center; - position: relative; -} - -.trans-content>i { - display: block; - width: 36px; - height: 36px; - background-repeat: no-repeat; - background-size: cover; -} - -.transfer-texts { - margin-left: 7px; - display: flex; - align-items: flex-start; - flex-direction: column; -} - -.transfer-texts>span, .transfer-texts>font, .trans-bottom>span { - color: white; - font-weight: 500; -} - -.transfer-texts>span { - font-size: 15px; -} - -.transfer-texts>font { - font-size: 12px; - padding-left: 2px; -} - -.transfer { - height: 60px; -} - -.trans-bottom { - height: 16px; - margin-top: 1px; - display: flex; - align-items: center; -} - -.trans-bottom>span { - font-size: 10px; -} - -/* 音视频通话 */ - -.call i{ - display: inline-block; - width: 18px; - height: 18px; - background-repeat: no-repeat; - background-size: cover; - vertical-align: middle; - margin-right: 4px; - margin-top: -2px; -} - -.call[calltype='1'] i { - background-image: url(./icon/phone.png); -} - -.call[calltype='0'] i { - background-image: url(./icon/video.png); -} - -@media screen and (max-width: 768px) { - .button-row, - .jump-row, - #paginationInfo { - display: flex; - justify-content: center; - align-items: center; - margin-bottom: 0px; - } - - button { - padding: 5px 10px; - background-color: #3498db; - color: white; - border: none; - border-radius: 4px; - cursor: pointer; - margin: 0 5px; - transition: background-color 0.3s; - } - - button:hover { - background-color: #2980b9; - } - - input { - padding: 8px; - width: 120px; - box-sizing: border-box; - margin-right: 0px; - margin-left: 5px; - } -} - -.system-msg > .emoji_img { - width: 18px; - height: 18px; -} - -.emoji_img { - width: 22px; - height: 22px; - vertical-align: middle; - margin-top: -4.4px; -} -.modal { - display: none; - position: fixed; - z-index: 9999; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.8); -} - -.modal-image { - display: block; - max-width: 90%; - max-height: 90%; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); -} - -@media screen and (max-width: 768px) { - body { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - } - - ::-webkit-scrollbar { - display: none; - } - - .page { - width: 100%; - height: 100%; - box-shadow: none; - } - - .page .side-bar, .page .mid-bar { - display: none - } - - .page .main-body .nav-bar { - height: 120px; - } - - .page .main-body .nav-bar .turner-bar { - transform: none; - font-size: 12px; - } - - .page .main-body .nav-bar .turner-bar input { - font-size: 14px; - } - - .page .main-body .nav-bar .turner-bar .button { - padding: 10px 12px 10px 12px; - } -} -</style> - <title>出错了</title> -</head> -<body> -<div class="page"> - <div class="side-bar"></div> - <div class="mid-bar"></div> - <div class="main-body"> - <div class="title-bar"><p id="title">出错了</p></div> - <div class="container"> - <div class="content" id="chat-container" onscroll="checkScroll()"> - <div class="item item-center"> - <span>8:16</span> - </div> - <div class="item item-center"> - <span>错误提示</span> - </div> - <div class="item item-left"> - <div class="avatar"> - <img src="https://blog.lc044.love/static/img/a774ab7a32635db7b4254c8ff7caaa89.Camera_XHS_16984826124131040g2sg30qo1ggopgqe05oce.webp"> - </div> - <div class="bubble bubble-left">很抱歉,由于程序出现未知错误,您的聊天记录未能成功展示。<br/>您可以关注下方微信公众号,<b>回复:联系方式</b>,获取QQ交流群群号,并在群内寻求帮助。 - </div> - </div> - <div class="item item-left"> - <div class="avatar"> - <img src="https://blog.lc044.love/static/img/a774ab7a32635db7b4254c8ff7caaa89.Camera_XHS_16984826124131040g2sg30qo1ggopgqe05oce.webp"> - </div> - <div class="bubble bubble-left">您可自行排查问题所在,例如只选择文本或图片,反馈时请说明哪种消息类型出现了问题!!! - </div> - </div> - <div class="item item-left"> - <div class="avatar"> - <img src="https://blog.lc044.love/static/img/a774ab7a32635db7b4254c8ff7caaa89.Camera_XHS_16984826124131040g2sg30qo1ggopgqe05oce.webp" - loading="lazy"> - </div> - <div class="content-wrapper content-wrapper-left"> - <div class="chat-image"> - <img src="https://blog.lc044.love/static/img/3fd32f1732a2c8f53a7eb923472b8f19.clipboard-2023-12-18.webp" - onclick="showModal(this)" loading="lazy"> - </div> - </div> - </div> - <div class="item item-right"> - <div class="bubble bubble-right">好的</div> - <div class="avatar"> - <img src="https://cdn.luogu.com.cn/upload/image_hosting/rbnmv4bu.png"> - </div> - </div> - </div> - </div> - <div class="nav-bar"> - <div class="turner-bar"> - <div class="button pre-page" onclick="prevPage()">上一页</div> - <div class="navigator-line">跳转到第 - <input class="navgator" value="1" id="gotoPage" onchange="gotoPage()"></input>页,共<p - id="maxPage">0</p>页 - </div> - <div class="button next-page" onclick="nextPage()">下一页</div> - </div> - </div> - </div> -</div> -<div id="modal" class="modal" onclick="hideModal()"> - <img id="modal-image" class="modal-image"> -</div> -<script> -const chatMessages = [ -/*注意看这是分割线*/ -]; - -</script> -<script> -const chatContainer = document.getElementById('chat-container'); - -function checkEnter(event) { - if (event.keyCode === 13) { - gotoPage(); - } -} - -const itemsPerPage = 100; // 每页显示的元素个数 -let currentPage = 1; // 当前页 -var reachedBottom = false; // 到达底部的标记 -var lastScrollTop = 0; -var lastTimeStamp = 0; - -function renderPage(page) { - const totalPages = Math.ceil(chatMessages.length / itemsPerPage); - // document.getElementById('curPage').innerHTML = currentPage; - document.getElementById('gotoPage').value = currentPage; - document.getElementById('maxPage').innerHTML = totalPages; - const container = document.getElementById('chat-container'); - if (!reachedBottom) { - container.innerHTML = ''; // 清空容器 - lastScrollTop = 0; - lastTimeStamp = 0; - } else { - reachedBottom = false; - } - - // 计算当前页应该显示的元素范围 - const startIndex = (page - 1) * itemsPerPage; - const endIndex = startIndex + itemsPerPage; - - // 工具类函数 - function replaceEmoji(text) { - - // 定义替换规则,可以根据需要添加更多规则 - var replacementRules = [ - { - pattern: /\[微笑\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_1@2x.png" id="微笑" class="emoji_img">' - }, - { - pattern: /\[发呆\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_4@2x.png" id="发呆" class="emoji_img">' - }, - { - pattern: /\[撇嘴\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_2@2x.png" id="撇嘴" class="emoji_img">' - }, - { - pattern: /\[色\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_3@2x.png" id="色" class="emoji_img">' - }, - { - pattern: /\[发呆\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_4@2x.png" id="发呆" class="emoji_img">' - }, - { - pattern: /\[得意\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_5@2x.png" id="得意" class="emoji_img">' - }, - { - pattern: /\[流泪\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_6@2x.png" id="流泪" class="emoji_img">' - }, - { - pattern: /\[害羞\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_7@2x.png" id="害羞" class="emoji_img">' - }, - { - pattern: /\[闭嘴\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_8@2x.png" id="闭嘴" class="emoji_img">' - }, - { - pattern: /\[睡\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_9@2x.png" id="睡" class="emoji_img">' - }, - { - pattern: /\[大哭\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_10@2x.png" id="大哭" class="emoji_img">' - }, - { - pattern: /\[尴尬\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_11@2x.png" id="尴尬" class="emoji_img">' - }, - { - pattern: /\[发怒\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_12@2x.png" id="发怒" class="emoji_img">' - }, - { - pattern: /\[调皮\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_13@2x.png" id="调皮" class="emoji_img">' - }, - { - pattern: /\[呲牙\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_14@2x.png" id="呲牙" class="emoji_img">' - }, - { - pattern: /\[惊讶\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_15@2x.png" id="惊讶" class="emoji_img">' - }, - { - pattern: /\[难过\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_16@2x.png" id="难过" class="emoji_img">' - }, - { - pattern: /\[抓狂\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_19@2x.png" id="抓狂" class="emoji_img">' - }, - { - pattern: /\[吐\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_20@2x.png" id="吐" class="emoji_img">' - }, - { - pattern: /\[偷笑\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_21@2x.png" id="偷笑" class="emoji_img">' - }, - { - pattern: /\[愉快\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_22@2x.png" id="愉快" class="emoji_img">' - }, - { - pattern: /\[白眼\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_23@2x.png" id="白 眼" class="emoji_img">' - }, - { - pattern: /\[傲慢\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_24@2x.png" id="傲慢" class="emoji_img">' - }, - { - pattern: /\[困\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_26@2x.png" id="困" class="emoji_img">' - }, - { - pattern: /\[惊恐\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_27@2x.png" id="惊恐" class="emoji_img">' - }, - { - pattern: /\[憨笑\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_29@2x.png" id="憨笑" class="emoji_img">' - }, - { - pattern: /\[悠闲\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_30@2x.png" id="悠闲" class="emoji_img">' - }, - { - pattern: /\[咒骂\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_32@2x.png" id="咒骂" class="emoji_img">' - }, - { - pattern: /\[疑问\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_33@2x.png" id="疑问" class="emoji_img">' - }, - { - pattern: /\[嘘\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_34@2x.png" id="嘘" class="emoji_img">' - }, - { - pattern: /\[晕\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_35@2x.png" id="晕" class="emoji_img">' - }, - { - pattern: /\[衰\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_37@2x.png" id="衰" class="emoji_img">' - }, - { - pattern: /\[骷髅\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_38@2x.png" id="骷髅" class="emoji_img">' - }, - { - pattern: /\[敲打\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_39@2x.png" id="敲打" class="emoji_img">' - }, - { - pattern: /\[再见\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_40@2x.png" id="再见" class="emoji_img">' - }, - { - pattern: /\[擦汗\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_41@2x.png" id="擦汗" class="emoji_img">' - }, - { - pattern: /\[抠鼻\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_42@2x.png" id="抠鼻" class="emoji_img">' - }, - { - pattern: /\[鼓掌\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_43@2x.png" id="鼓掌" class="emoji_img">' - }, - { - pattern: /\[坏笑\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_45@2x.png" id="坏笑" class="emoji_img">' - }, - { - pattern: /\[右哼哼\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_47@2x.png" id="右哼哼" class="emoji_img">' - }, - { - pattern: /\[鄙视\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_49@2x.png" id="鄙视" class="emoji_img">' - }, - { - pattern: /\[委屈\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_50@2x.png" id="委屈" class="emoji_img">' - }, - { - pattern: /\[快哭了\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_51@2x.png" id="快哭了" class="emoji_img">' - }, - { - pattern: /\[阴险\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_52@2x.png" id="阴险" class="emoji_img">' - }, - { - pattern: /\[亲亲\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_53@2x.png" id="亲亲" class="emoji_img">' - }, - { - pattern: /\[可怜\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_55@2x.png" id="可怜" class="emoji_img">' - }, - { - pattern: /\[Whimper\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_55@2x.png" id="可怜" class="emoji_img">' - }, - { - pattern: /\[笑脸\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Happy.png" id="笑脸" class="emoji_img">' - }, - { - pattern: /\[生病\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Sick.png" id="生病" class="emoji_img">' - }, - { - pattern: /\[脸红\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Flushed.png" id="脸红" class="emoji_img">' - }, - { - pattern: /\[破涕为笑\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Lol.png" id="破涕为笑" class="emoji_img">' - }, - { - pattern: /\[恐惧\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Terror.png" id="恐惧" class="emoji_img">' - }, - { - pattern: /\[失望\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/LetDown.png" id="失望" class="emoji_img">' - }, - { - pattern: /\[无语\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Duh.png" id="无语" class="emoji_img">' - }, - { - pattern: /\[嘿哈\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/2_04.png" id="嘿哈" class="emoji_img">' - }, - { - pattern: /\[捂脸\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/2_05.png" id="捂脸" class="emoji_img">' - }, - { - pattern: /\[奸笑\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/2_02.png" id="奸笑" class="emoji_img">' - }, - { - pattern: /\[机智\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/2_06.png" id="机智" class="emoji_img">' - }, - { - pattern: /\[皱眉\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/2_12.png" id="皱眉" class="emoji_img">' - }, - { - pattern: /\[耶\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/2_11.png" id="耶" class="emoji_img">' - }, - { - pattern: /\[吃瓜\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Watermelon.png" id="吃瓜" class="emoji_img">' - }, - { - pattern: /\[加油\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Addoil.png" id="加油" class="emoji_img">' - }, - { - pattern: /\[汗\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Sweat.png" id="汗" class="emoji_img">' - }, - { - pattern: /\[天啊\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Shocked.png" id="天啊" class="emoji_img">' - }, - { - pattern: /\[Emm\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Cold.png" id="Emm" class="emoji_img">' - }, - { - pattern: /\[社会社会\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Social.png" id="社会社会" class="emoji_img">' - }, - { - pattern: /\[旺柴\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Yellowdog.png" id="旺柴" class="emoji_img">' - }, - { - pattern: /\[好的\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/NoProb.png" id="好的" class="emoji_img">' - }, - { - pattern: /\[打脸\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Slap.png" id="打脸" class="emoji_img">' - }, - { - pattern: /\[哇\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Wow.png" id="哇" class="emoji_img">' - }, - { - pattern: /\[翻白眼\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Boring.png" id="翻白眼" class="emoji_img">' - }, - { - pattern: /\[666\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/666.png" id="666" class="emoji_img">' - }, - { - pattern: /\[让我看看\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/LetMeSee.png" id="让我看看" class="emoji_img">' - }, - { - pattern: /\[叹气\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Sigh.png" id="叹气" class="emoji_img">' - }, - { - pattern: /\[苦涩\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Hurt.png" id="苦涩" class="emoji_img">' - }, - { - pattern: /\[難受\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Hurt.png" id="苦涩" class="emoji_img">' - }, - { - pattern: /\[裂开\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Broken.png" id="裂开" class="emoji_img">' - }, - { - pattern: /\[嘴唇\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_66@2x.png" id="嘴唇" class="emoji_img">' - }, - { - pattern: /\[爱心\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_67@2x.png" id="爱心" class="emoji_img">' - }, - { - pattern: /\[心碎\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_68@2x.png" id="心碎" class="emoji_img">' - }, - { - pattern: /\[拥抱\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_79@2x.png" id="拥抱" class="emoji_img">' - }, - { - pattern: /\[强\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_80@2x.png" id="强" class="emoji_img">' - }, - { - pattern: /\[弱\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_81@2x.png" id="弱" class="emoji_img">' - }, - { - pattern: /\[握手\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_82@2x.png" id="握手" class="emoji_img">' - }, - { - pattern: /\[胜利\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_83@2x.png" id="胜利" class="emoji_img">' - }, - { - pattern: /\[抱拳\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_84@2x.png" id="抱拳" class="emoji_img">' - }, - { - pattern: /\[勾引\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_85@2x.png" id="勾引" class="emoji_img">' - }, - { - pattern: /\[拳头\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_86@2x.png" id="拳头" class="emoji_img">' - }, - { - pattern: /\[OK\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_90@2x.png" id="OK" class="emoji_img">' - }, - { - pattern: /\[合十\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Worship.png" id="合十" class="emoji_img">' - }, - { - pattern: /\[啤酒\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_58@2x.png" id="啤酒" class="emoji_img">' - }, - { - pattern: /\[咖啡]\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_61@2x.png" id="咖啡" class="emoji_img">' - }, - { - pattern: /\[蛋糕\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_69@2x.png" id="蛋糕" class="emoji_img">' - }, - { - pattern: /\[玫瑰\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_64@2x.png" id="玫 瑰" class="emoji_img">' - }, - { - pattern: /\[凋谢\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_65@2x.png" id="凋谢" class="emoji_img">' - }, - { - pattern: /\[菜刀\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_56@2x.png" id="菜刀" class="emoji_img">' - }, - { - pattern: /\[炸弹\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_71@2x.png" id="炸弹" class="emoji_img">' - }, - { - pattern: /\[便便\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_75@2x.png" id="便便" class="emoji_img">' - }, - { - pattern: /\[月亮\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_76@2x.png" id="月亮" class="emoji_img">' - }, - { - pattern: /\[太阳\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_77@2x.png" id="太阳" class="emoji_img">' - }, - { - pattern: /\[庆 祝\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Party.png" id="庆祝" class="emoji_img">' - }, - { - pattern: /\[礼物\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_78@2x.png" id="礼物" class="emoji_img">' - }, - { - pattern: /\[红包\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/2_09.png" id="红包" class="emoji_img">' - }, - { - pattern: /\[發\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/2_16.png" id="發" class="emoji_img">' - }, - { - pattern: /\[福\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/2_15.png" id="福" class="emoji_img">' - }, - { - pattern: /\[烟花\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Fireworks.png" id="烟花" class="emoji_img">' - }, - { - pattern: /\[爆竹\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Firecracker.png" id="爆竹" class="emoji_img">' - }, - { - pattern: /\[猪头\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_63@2x.png" id="猪头" class="emoji_img">' - }, - { - pattern: /\[跳跳\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_93@2x.png" id="跳跳" class="emoji_img">' - }, - { - pattern: /\[发抖\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_94@2x.png" id="发抖" class="emoji_img">' - }, - { - pattern: /\[转圈\]/g, - replacement: '<img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/Expression/Expression_96@2x.png" id="转圈" class="emoji_img">' - } - ]; - - // 循环遍历替换规则 - for (var i = 0; i < replacementRules.length; i++) { - var rule = replacementRules[i]; - text = text.replace(rule.pattern, rule.replacement); - } - return text; - } - - function timestampToTime(timestamp) { - let date = new Date(timestamp * 1000); - let year = date.getFullYear() + '-'; - let month = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; - let day = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' '; - let hour = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'; - let minute = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':'; - let second = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds(); - return year + month + day + hour + minute + second; - } - - // 生成各类标签的函数 - function add5MinTimeTag(message) { - if (message.timestamp - lastTimeStamp > 300) { - const newTimeMessage = document.createElement('div'); - newTimeMessage.className = "item item-center"; - newTimeMessage.innerHTML = `<span>${timestampToTime(message.timestamp)}</span>`; - chatContainer.appendChild(newTimeMessage); - lastTimeStamp = message.timestamp; - // console.log("增加时间元素", timestampToTime(message.timestamp)); - } - } - - function messageBubble(message, side) { - const messageBubbleTag = document.createElement('div'); - messageBubbleTag.className = `bubble bubble-${side}`; - messageBubbleTag.innerHTML = replaceEmoji(message.text); - return messageBubbleTag; - } - - function displayNameBox(message) { - const displayName = document.createElement('div'); - displayName.className = "displayname"; - displayName.innerHTML = message.displayname; - return displayName; - } - - function avatarBox(message) { - const avatarTag = document.createElement('div'); - avatarTag.className = "avatar"; - avatarTag.innerHTML = `<img src="${message.avatar_path}" loading="lazy" />` - return avatarTag; - } - - function messageImgBox(message) { - const messageImgTag = document.createElement('div'); - messageImgTag.className = `chat-image`; - messageImgTag.innerHTML = `<img src="${message.text}" onclick="showModal(this)" loading="lazy"/>`; - return messageImgTag; - } - - function messageVideoBox(message) { - const messageVideoTag = document.createElement('div'); - messageVideoTag.className = `chat-video`; - messageVideoTag.innerHTML = `<video src="${message.text}" controls />`; - return messageVideoTag; - } - - function messageElementReferText(message, side) { - const messageElementRefer = document.createElement('div'); - messageElementRefer.className = `chat-refer chat-refer-${side}`; - messageElementRefer.innerHTML = replaceEmoji(message.refer_text); - return messageElementRefer; - } - - function messageVoiceToTextBubble(message, side) { - const messageVoiceToTextTag = document.createElement('div'); - messageVoiceToTextTag.className = `bubble bubble-${side}`; - messageVoiceToTextTag.innerHTML = message.voice_to_text; - return messageVoiceToTextTag; - } - - function messageAudioBox(message) { - const messageAudioTag = document.createElement('div'); - messageAudioTag.className = `chat-audio`; - messageAudioTag.innerHTML = `<audio src="${message.text}" controls></audio>`; - return messageAudioTag; - } - - function messageCard(message) { - const messageTag = document.createElement('div'); - messageTag.className = `card`; - messageTag.innerHTML = `<a href="${message.url}" target="_blank"> - <div class="card-content"> - <h2 title="${message.title}">${message.title}</h2> - <div class="description"> - <p title="${message.description}">${message.description}</p> - <img loading="lazy" class="thumbnail" src="${message.thumbnail}" alt="Thumbnail"> - </div> - </div> - <div class="link-info"> - <img loading="lazy" class="app-logo" src="${message.app_logo}" alt="App Logo"> - <span class="app-name">${message.app_name}</span> - </div> - </a>`; - return messageTag; - } - - function messageFileBox(message) { - const messageFileTag = document.createElement('div'); - messageFileTag.className = `chat-file`; - messageFileTag.onclick = function (event) { - if (message.text !== '') { - window.open(message.text, '_blank'); - } else { - alert("文件可能丢失、过期或不存放在该主机上") - } - } - messageFileTag.innerHTML = `<div class="file-box"> - <div class="file-info flex1"> - <div class="file-title" title="${message.file_name}">${message.file_name}</div> - <div class="file-size">${message.file_size}</div> - </div> - <div class="file-img flex2"> - <img src="${message.icon_path}"/> - </div> - </div>` + - (message.app_name ? `<div class="app-info"><p>${message.app_name}</p></div>` : ""); - return messageFileTag; - } - - function messageMusicAudioBox(message) { - const messageMusicAudioTag = document.createElement('div'); - messageMusicAudioTag.className = `chat-music-audio`; - messageMusicAudioTag.dataset.link = message.link_url; - messageMusicAudioTag.onclick = function (event) { - if (!event.target.classList.contains('play-button')) { - window.open(message.link_url, '_blank'); - } - } - if (message.title.length >= 39) { - message.title = message.title.slice(0, 38) + '...' - } - messageMusicAudioTag.innerHTML = `<div class="player-box"> - <div class="player-info flex1"> - <div class="song-title">${message.title}</div> - </div> - <div class="player-controls flex2"> - </div> - </div> - <div class="player-original"><p>${message.website_name}</p></div> - - ` - if (message.text != '') { - var audio = document.createElement('audio'); - audio.src = message.text; - messageMusicAudioTag.querySelector('.player-controls').append(audio) - } - ; - var artist = document.createElement('div'); - artist.className = 'artist'; - artist.innerHTML = message.artist - if (message.title.length < 26) { - messageMusicAudioTag.querySelector('.player-info').append(artist) - } - var playButton = document.createElement('button'); - playButton.className = 'play-button paused'; - playButton.onclick = function (event) { - event.stopPropagation(); // 阻止点击播放按钮时触发父级的点击事件 - toggleAudio(event.target); - }; - if (message.is_send) { - messageMusicAudioTag.querySelector('.player-controls').append(playButton) - } else { - messageMusicAudioTag.querySelector('.player-controls').prepend(playButton) - } - return messageMusicAudioTag; - } - function messageTransfer(message) { - const transfer_box = document.createElement("div"); - transfer_box.className = "transfer-box"; - transfer_box.setAttribute("issend", message.is_send); - transfer_box.setAttribute("paysubtype", message.paysubtype); - transfer_box.innerHTML = `<div class="transfer"> - <div class="trans-content"><i></i> - <div class="transfer-texts"><span>${message.feedesc}</span><font>${message.text}</font></div> - </div> - <div class="trans-bottom"><span>聊天转账</span></div> - </div>`; - return transfer_box; - } - function messageVideoAudioCall(message, side) { - const message_call_box = document.createElement('div'); - message_call_box.className = `bubble bubble-${side} call`; - message_call_box.setAttribute("calltype", message.call_type) - message_call_box.innerHTML = `<i></i><span>${message.text}<span>`; - return message_call_box; - } - - // 从数据列表中取出对应范围的元素并添加到容器中 - for (let i = startIndex; i < endIndex && i < chatMessages.length; i++) { - const message = chatMessages[i]; - add5MinTimeTag(message); - const messageElement = document.createElement('div'); // 下面那俩的合体 - const avatarTag = avatarBox(message); // 头像 - const messageContent = document.createElement('div'); // 除了avatar之外的所有 - const side = message.is_send ? "right" : "left"; - if (message.type == 1) { - // displayname 和 bubble - messageContent.className = `content-wrapper content-wrapper-${side}`; - if (message.is_chatroom && !message.is_send) { - messageContent.appendChild(displayNameBox(message)); - } - messageContent.appendChild(messageBubble(message, side)); - - // 整合 - messageElement.className = `item item-${side}`; - messageElement.appendChild(message.is_send ? messageContent : avatarTag); - messageElement.appendChild(message.is_send ? avatarTag : messageContent); - } else if (message.type == 0) { - messageElement.className = "item item-center"; - messageElement.innerHTML = `<span class="system-msg">${replaceEmoji(message.text)}</span>`; - } else if (message.type == 3) { - // displayname 和 img - messageContent.className = `content-wrapper content-wrapper-${side}`; - if (message.is_chatroom && !message.is_send) { - messageContent.appendChild(displayNameBox(message)); - } - messageContent.appendChild(messageImgBox(message)); - - // 整合 - messageElement.className = `item item-${side}`; - messageElement.appendChild(message.is_send ? messageContent : avatarTag); - messageElement.appendChild(message.is_send ? avatarTag : messageContent); - } else if (message.type == 43) { - // displayname 和 video - messageContent.className = `content-wrapper content-wrapper-${side}`; - if (message.is_chatroom && !message.is_send) { - messageContent.appendChild(displayNameBox(message)); - } - messageContent.appendChild(messageVideoBox(message)); - - // 整合 - messageElement.className = `item item-${side}`; - messageElement.appendChild(message.is_send ? messageContent : avatarTag); - messageElement.appendChild(message.is_send ? avatarTag : messageContent); - } else if (message.type == 49) { - if (message.sub_type == 57) { - // displayname 和 bubble 和 refer - messageContent.className = `content-wrapper content-wrapper-${side}`; - if (message.is_chatroom && !message.is_send) { - messageContent.appendChild(displayNameBox(message)); - } - messageContent.appendChild(messageBubble(message, side)); - if (message.refer_text) { - messageContent.appendChild(messageElementReferText(message, side)); - } - - // 整合 - messageElement.className = `item item-${side}`; - messageElement.appendChild(message.is_send ? messageContent : avatarTag); - messageElement.appendChild(message.is_send ? avatarTag : messageContent); - } else if (message.sub_type == 6) { - // displayname 和 file - messageContent.className = `content-wrapper content-wrapper-${side}`; - if (message.is_chatroom && !message.is_send) { - messageContent.appendChild(displayNameBox(message)); - } - messageContent.appendChild(messageFileBox(message)); - - // 整合 - messageElement.className = `item item-${side}`; - messageElement.appendChild(message.is_send ? messageContent : avatarTag); - messageElement.appendChild(message.is_send ? avatarTag : messageContent); - } else if (message.sub_type == 3) { - // displayname 和 file - messageContent.className = `content-wrapper content-wrapper-${side}`; - if (message.is_chatroom && !message.is_send) { - messageContent.appendChild(displayNameBox(message)); - } - messageContent.appendChild(messageMusicAudioBox(message)); - - // 整合 - messageElement.className = `item item-${side}`; - messageElement.appendChild(message.is_send ? messageContent : avatarTag); - messageElement.appendChild(message.is_send ? avatarTag : messageContent); - } else if (message.sub_type == 5) { - // displayname 和 file - messageContent.className = `content-wrapper content-wrapper-${side}`; - if (message.is_chatroom && !message.is_send) { - messageContent.appendChild(displayNameBox(message)); - } - messageContent.appendChild(messageCard(message)); - - // 整合 - messageElement.className = `item item-${side}`; - messageElement.appendChild(message.is_send ? messageContent : avatarTag); - messageElement.appendChild(message.is_send ? avatarTag : messageContent); - } else if (message.sub_type == 2000) { - // displayname 和 messageTransfer - messageContent.className = `content-wrapper content-wrapper-${side}`; - if (message.is_chatroom && !message.is_send) { - messageContent.appendChild(displayNameBox(message)); - } - messageContent.appendChild(messageTransfer(message)); - - // 整合 - messageElement.className = `item item-${side}`; - messageElement.appendChild(message.is_send ? messageContent : avatarTag); - messageElement.appendChild(message.is_send ? avatarTag : messageContent); - } - - } else if (message.type == 34) { - // displayname 和 转的文字 和 audio - messageContent.className = `content-wrapper content-wrapper-${side}`; - if (message.is_chatroom && !message.is_send) { - messageContent.appendChild(displayNameBox(message)); - } - if (message.voice_to_text) { - messageContent.appendChild(messageVoiceToTextBubble(message, side)); - } - messageContent.appendChild(messageAudioBox(message)); - - // 整合 - messageElement.className = `item item-${side}`; - messageElement.appendChild(message.is_send ? messageContent : avatarTag); - messageElement.appendChild(message.is_send ? avatarTag : messageContent); - } else if (message.type == 50) { - // displayname 和 转的文字 和 audio - messageContent.className = `content-wrapper content-wrapper-${side}`; - if (message.is_chatroom && !message.is_send) { - messageContent.appendChild(displayNameBox(message)); - } - messageContent.appendChild(messageVideoAudioCall(message, side)); - - // 整合 - messageElement.className = `item item-${side}`; - messageElement.appendChild(message.is_send ? messageContent : avatarTag); - messageElement.appendChild(message.is_send ? avatarTag : messageContent); - } - chatContainer.appendChild(messageElement); - } - document.querySelector("#chat-container").scrollTop = lastScrollTop; - updatePaginationInfo(); - refreshMediaListener(); -} - -function prevPage() { - if (currentPage > 1) { - currentPage--; - reachedBottom = false; - renderPage(currentPage); - } -} - -function nextPage() { - const totalPages = Math.ceil(chatMessages.length / itemsPerPage); - if (currentPage < totalPages) { - currentPage++; - renderPage(currentPage); - } -} - -function updatePaginationInfo() { - const totalPages = Math.ceil(chatMessages.length / itemsPerPage); - const paginationInfo = document.getElementById('gotoPage'); - paginationInfo.value = `${currentPage}`; -} - -function gotoPage() { - const totalPages = Math.ceil(chatMessages.length / itemsPerPage); - const inputElement = document.getElementById('gotoPage'); - const targetPage = parseInt(inputElement.value); - - if (targetPage >= 1 && targetPage <= totalPages) { - currentPage = targetPage; - renderPage(currentPage); - } else { - alert('请输入有效的页码'); - } -} - - -function checkScroll() { - var chatContainer = document.getElementById("chat-container"); - - // 检查滚动条是否滑到底部 - if (chatContainer.scrollHeight - chatContainer.scrollTop - 10 <= chatContainer.clientHeight) { - // 如果滚动条在底部 - if (!reachedBottom) { - // 设置标记并返回 - reachedBottom = true; - lastScrollTop = chatContainer.scrollTop; - } - if (reachedBottom) { - nextPage(); - } - } -} - -// 初始化页面 -renderPage(currentPage); - -function refreshMediaListener() { - const audioTags = document.querySelectorAll('audio'); - const videoTags = document.querySelectorAll('video'); - - audioTags.forEach(audio => { - audio.addEventListener('play', function () { - pauseOtherMedia(audio); - }); - }); - videoTags.forEach(video => { - video.addEventListener('play', function () { - pauseOtherMedia(video); - }); - }); - - function pauseOtherMedia(currentMedia) { - const audioTags = document.querySelectorAll('audio'); - const videoTags = document.querySelectorAll('video'); - audioTags.forEach(media => { - if (media !== currentMedia && !media.paused) { - media.pause(); - } - }); - videoTags.forEach(media => { - if (media !== currentMedia && !media.paused) { - media.pause(); - } - }); - } -} - -refreshMediaListener(); - -function showModal(image) { - var modal = document.getElementById("modal"); - var modalImage = document.getElementById("modal-image"); - modal.style.display = "block"; - modalImage.src = image.src; - // console.log(image.src); -} - -function hideModal() { - var modal = document.getElementById("modal"); - modal.style.display = "none"; -} - -function toggleAudio(buttonElm) { - var audioPlayer = buttonElm.parentNode; - var audio = audioPlayer.querySelector('audio'); - if (audio == null) { - alert("该音频已失效或无法直接播放,有需要请点击音频链接查看") - } else { - if (audio.paused) { - audio.play(); - buttonElm.classList.remove('paused'); - buttonElm.classList.add('playing'); - } else { - audio.pause(); - buttonElm.classList.remove('playing'); - buttonElm.classList.add('paused'); - } - } - -} -</script> -</body> -</html> diff --git a/app/resources/icons/404.png b/app/resources/icons/404.png deleted file mode 100644 index d16f272..0000000 Binary files a/app/resources/icons/404.png and /dev/null differ diff --git a/app/resources/icons/404.svg b/app/resources/icons/404.svg deleted file mode 100644 index 495d5b1..0000000 --- a/app/resources/icons/404.svg +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1700491390268" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5035" - width="128" height="128"> - <path d="M965.138204 0.016004L964.962163 0H59.373916l-0.176041 0.016004C26.486208 0.12803 0 25.798046 0 57.517481v907.092599a59.373916 59.373916 0 0 0 59.373916 59.373916h905.588247a59.373916 59.373916 0 0 0 59.373916-59.373916V57.517481c0-31.719434-26.486208-57.389451-59.197875-57.501477z" - fill="#CCCCCC" p-id="5036"></path> - <path d="M928.313573 191.932984h-864.202547V928.089521a32.007502 32.007502 0 0 0 32.007502 32.023505h832.195045a32.007502 32.007502 0 0 0 32.007502-32.023505V191.932984h-32.007502z" - fill="#FFFFFF" p-id="5037"></path> - <path d="M736.268563 63.918981l-0.160038 0.016004H96.118528a32.007502 32.007502 0 0 0 0 64.015003h640.150035a32.007502 32.007502 0 0 0 0-64.031007z m96.022505 0a32.007502 32.007502 0 1 0 0.032008 64.047011 32.007502 32.007502 0 0 0-0.032008-64.047011z m96.022505 0a32.007502 32.007502 0 1 0 0.032008 64.047011 32.007502 32.007502 0 0 0-0.032008-64.047011z" - fill="#FFFFFF" p-id="5038"></path> - <path d="M359.188185 568.085145H312.073142v39.225193h-31.111292l74.465453-127.66192h-53.42052l-78.226334 132.783121v38.264968H312.073142v53.67658h47.115043v-53.67658h24.821817v-43.386169h-24.821817v-39.225193z m153.203907-88.53275c-32.119528 0-56.141158 10.210393-72.080894 30.583168-15.95574 20.372775-23.925608 47.611159-23.925608 81.61913 0 34.039978 7.969868 61.262358 23.925608 81.651136 15.939736 20.372775 39.961366 30.567164 72.080894 30.567165s56.141158-10.194389 72.080894-30.567165c15.95574-20.372775 23.925608-47.611159 23.925607-81.651136 0-34.007971-7.969868-61.230351-23.925607-81.61913-15.95574-20.372775-39.97737-30.583168-72.080894-30.583168z m34.200016 164.82263c-7.29771 13.235102-18.708385 19.860655-34.21602 19.860655s-26.918309-6.625553-34.216019-19.860655c-7.313714-13.251106-10.978573-30.727202-10.978573-52.444291s3.664859-39.193186 10.978573-52.460296c7.29771-13.235102 18.708385-19.844651 34.216019-19.844651s26.918309 6.609549 34.21602 19.844651c7.313714 13.267109 10.978573 30.743205 10.978573 52.460296s-3.664859 39.193186-10.978573 52.444291z m228.645588-37.064687v-39.225193h-47.115042v39.225193h-31.111292l74.465453-127.66192h-53.420521l-78.226334 132.783121v38.264968h88.292694v53.67658h47.115042v-53.67658h24.821818v-43.386169h-24.821818z" - fill="#ED7161" p-id="5039"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/Cursors/0.png b/app/resources/icons/Cursors/0.png deleted file mode 100644 index 27923f3..0000000 Binary files a/app/resources/icons/Cursors/0.png and /dev/null differ diff --git a/app/resources/icons/Cursors/1.png b/app/resources/icons/Cursors/1.png deleted file mode 100644 index e338b58..0000000 Binary files a/app/resources/icons/Cursors/1.png and /dev/null differ diff --git a/app/resources/icons/Cursors/2.png b/app/resources/icons/Cursors/2.png deleted file mode 100644 index 59ee695..0000000 Binary files a/app/resources/icons/Cursors/2.png and /dev/null differ diff --git a/app/resources/icons/Cursors/3.png b/app/resources/icons/Cursors/3.png deleted file mode 100644 index b86d752..0000000 Binary files a/app/resources/icons/Cursors/3.png and /dev/null differ diff --git a/app/resources/icons/Cursors/4.png b/app/resources/icons/Cursors/4.png deleted file mode 100644 index 61374db..0000000 Binary files a/app/resources/icons/Cursors/4.png and /dev/null differ diff --git a/app/resources/icons/Cursors/5.png b/app/resources/icons/Cursors/5.png deleted file mode 100644 index 5c2bc10..0000000 Binary files a/app/resources/icons/Cursors/5.png and /dev/null differ diff --git a/app/resources/icons/Cursors/6.png b/app/resources/icons/Cursors/6.png deleted file mode 100644 index ab3996a..0000000 Binary files a/app/resources/icons/Cursors/6.png and /dev/null differ diff --git a/app/resources/icons/Cursors/7.png b/app/resources/icons/Cursors/7.png deleted file mode 100644 index 0962be4..0000000 Binary files a/app/resources/icons/Cursors/7.png and /dev/null differ diff --git a/app/resources/icons/__init__.py b/app/resources/icons/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/app/resources/icons/analysis.svg b/app/resources/icons/analysis.svg deleted file mode 100644 index 8c301e7..0000000 --- a/app/resources/icons/analysis.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1699701989845" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9279" - width="16" height="16"> - <path d="M500.32 59.84a8 8 0 0 1 8 6.4v352a89.6 89.6 0 0 0 89.6 89.6h350.4a8.16 8.16 0 0 1 8.16 8.16v12.8A448 448 0 1 1 487.04 60.32h11.52zM441.44 132.8l-5.92 1.12a380.96 380.96 0 1 0 446.88 448l1.12-6.24H598.24a156.96 156.96 0 0 1-156.8-151.84V132.8z m142.56-66.56l8.64 1.6 6.56 1.28h2.72a448 448 0 0 1 346.08 350.56l2.08 11.36a8.32 8.32 0 0 1-6.72 9.44H620.64a44.96 44.96 0 0 1-44.8-41.6V74.4a8.16 8.16 0 0 1 8.16-8.16z m59.2 89.6a4.48 4.48 0 0 0 0 1.44v212a4.16 4.16 0 0 0 4 4.16h211.84a4.16 4.16 0 0 0 4.16-4.16 4.64 4.64 0 0 0 0-1.44 382.72 382.72 0 0 0-214.4-214.4 4.16 4.16 0 0 0-5.28 2.4z" - p-id="9280"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/annual_report.svg b/app/resources/icons/annual_report.svg deleted file mode 100644 index aeaec95..0000000 --- a/app/resources/icons/annual_report.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702562308255" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14206" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M160 184h512v256H160z" fill="#FFD740" p-id="14207"></path><path d="M672 448H160a8 8 0 0 1-8-8v-256a8 8 0 0 1 8-8h512a8 8 0 0 1 8 8v256a8 8 0 0 1-8 8z m-504-16h496V192h-496v240z" fill="#263238" p-id="14208"></path><path d="M704 944H128c-26.464 0-48-21.536-48-48V144c0-26.464 21.536-48 48-48h576c26.464 0 48 21.536 48 48v752c0 26.464-21.536 48-48 48zM128 112c-17.648 0-32 14.352-32 32v752c0 17.648 14.352 32 32 32h576c17.648 0 32-14.352 32-32V144c0-17.648-14.352-32-32-32H128z" fill="#263238" p-id="14209"></path><path d="M784 1024H192c-26.464 0-48-21.536-48-48v-8a8 8 0 0 1 16 0v8c0 17.648 14.352 32 32 32h592c17.648 0 32-14.352 32-32V224c0-17.648-14.352-32-32-32h-8a8 8 0 0 1 0-16h8c26.464 0 48 21.536 48 48v752c0 26.464-21.536 48-48 48zM848 48h-64a8 8 0 0 1 0-16h64a8 8 0 0 1 0 16z" fill="#263238" p-id="14210"></path><path d="M816 80a8 8 0 0 1-8-8v-64a8 8 0 0 1 16 0v64a8 8 0 0 1-8 8zM936 136h-64a8 8 0 0 1 0-16h64a8 8 0 0 1 0 16z" fill="#263238" p-id="14211"></path><path d="M904 168a8 8 0 0 1-8-8V96a8 8 0 0 1 16 0v64a8 8 0 0 1-8 8zM240 392a8 8 0 0 1-6.304-12.896l112-144a8 8 0 0 1 6.048-3.088 7.472 7.472 0 0 1 6.24 2.688l121.616 136.816 106.096-136.4a8 8 0 1 1 12.624 9.808l-112 144a8 8 0 0 1-12.288 0.4l-121.616-136.816-106.096 136.4A8 8 0 0 1 240 392z" fill="#263238" p-id="14212"></path><path d="M240 384m-24 0a24 24 0 1 0 48 0 24 24 0 1 0-48 0Z" fill="#FFFFFF" p-id="14213"></path><path d="M240 416c-17.648 0-32-14.352-32-32s14.352-32 32-32 32 14.352 32 32-14.352 32-32 32z m0-48a16.016 16.016 0 0 0 0 32 16.016 16.016 0 0 0 0-32z" fill="#263238" p-id="14214"></path><path d="M480 384m-24 0a24 24 0 1 0 48 0 24 24 0 1 0-48 0Z" fill="#FFFFFF" p-id="14215"></path><path d="M480 416c-17.648 0-32-14.352-32-32s14.352-32 32-32 32 14.352 32 32-14.352 32-32 32z m0-48a16.016 16.016 0 0 0 0 32 16.016 16.016 0 0 0 0-32z" fill="#263238" p-id="14216"></path><path d="M352 240m-24 0a24 24 0 1 0 48 0 24 24 0 1 0-48 0Z" fill="#FFFFFF" p-id="14217"></path><path d="M352 272c-17.648 0-32-14.352-32-32s14.352-32 32-32 32 14.352 32 32-14.352 32-32 32z m0-48a16.016 16.016 0 0 0 0 32 16.016 16.016 0 0 0 0-32z" fill="#263238" p-id="14218"></path><path d="M592 240m-24 0a24 24 0 1 0 48 0 24 24 0 1 0-48 0Z" fill="#FFFFFF" p-id="14219"></path><path d="M592 272c-17.648 0-32-14.352-32-32s14.352-32 32-32 32 14.352 32 32-14.352 32-32 32z m0-48a16.016 16.016 0 0 0 0 32 16.016 16.016 0 0 0 0-32zM576 864c-57.344 0-104-46.656-104-104S518.656 656 576 656s104 46.656 104 104S633.344 864 576 864z m0-192c-48.528 0-88 39.488-88 88S527.472 848 576 848s88-39.488 88-88S624.528 672 576 672zM608 528H224a8 8 0 0 1 0-16h384a8 8 0 0 1 0 16zM608 608H224a8 8 0 0 1 0-16h384a8 8 0 0 1 0 16z" fill="#263238" p-id="14220"></path><path d="M643.872 827.872l0.032-0.016A96 96 0 0 0 576 664v96l67.872 67.872z" fill="#40C4FF" p-id="14221"></path><path d="M643.888 835.856a8 8 0 0 1-5.664-2.336l-67.872-67.872a7.936 7.936 0 0 1-2.352-5.648v-96a8 8 0 0 1 8-8c57.344 0 104 46.656 104 104a103.328 103.328 0 0 1-30.432 73.52 8 8 0 0 1-5.68 2.336zM584 756.688l59.632 59.632A87.36 87.36 0 0 0 664 760a88.128 88.128 0 0 0-80-87.648v84.336z" fill="#263238" p-id="14222"></path><path d="M576 856a95.68 95.68 0 0 0 67.904-28.144L576 760h-96a96 96 0 0 0 96 96z" fill="#FF5252" p-id="14223"></path><path d="M576 864a104.128 104.128 0 0 1-104-104 8 8 0 0 1 8-8h96c2.112 0 4.16 0.848 5.664 2.336l67.904 67.856a8 8 0 0 1 0 11.328A103.424 103.424 0 0 1 576 864z m-87.648-96c4.048 44.8 41.808 80 87.648 80a87.36 87.36 0 0 0 56.336-20.384L572.688 768h-84.336z" fill="#263238" p-id="14224"></path><path d="M368 688h-128a8 8 0 0 1 0-16h128a8 8 0 0 1 0 16z" fill="#263238" p-id="14225"></path><path d="M368 768h-128a8 8 0 0 1 0-16h128a8 8 0 0 1 0 16z" fill="#263238" p-id="14226"></path><path d="M368 848h-128a8 8 0 0 1 0-16h128a8 8 0 0 1 0 16z" fill="#263238" p-id="14227"></path><path d="M904 944a8 8 0 0 1-8-8v-32a8 8 0 0 1 16 0v32a8 8 0 0 1-8 8z" fill="#263238" p-id="14228"></path><path d="M904 880a8 8 0 0 1-8-8v-288a8 8 0 0 1 16 0v288a8 8 0 0 1-8 8z" fill="#263238" p-id="14229"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/annual_report0.svg b/app/resources/icons/annual_report0.svg deleted file mode 100644 index ce23a10..0000000 --- a/app/resources/icons/annual_report0.svg +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1699702054249" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" - p-id="11802" - width="16" height="16"> - <path d="M919.647 118.99h-812c-11.046 0-20 8.954-20 20v72.793c0 11.045 8.954 20 20 20h50.648V833c0 11.046 8.954 20 20 20h670.703c11.046 0 20-8.954 20-20V231.784h50.648c11.046 0 20-8.955 20-20V138.99c0.001-11.046-8.953-20-19.999-20zM828.999 813H198.296V236.83h630.703V813z m70.648-621.216h-772V158.99h772v32.794z" - fill="" p-id="11803"></path> - <path d="M302.595 450.354c0 0.98 0.143 24.284 12.584 48.336 11.725 22.665 36.626 50.413 88.675 53.889 2.038 0.136 4.103 0.205 6.136 0.205 26.113 0 50.696-11.051 69.221-31.116 17.731-19.206 27.9-45.199 27.9-71.313 0-52.737-28.235-77.924-51.921-89.768-24.697-12.349-49.302-12.491-50.337-12.491-8.284 0-15 6.716-15 15v72.258h-72.258c-8.284 0-15 6.716-15 15z m102.258 15c8.284 0 15-6.716 15-15v-70.377c6.425 1.328 14.214 3.589 21.921 7.443 23.448 11.724 35.337 32.898 35.337 62.935 0 39.261-30.738 72.43-67.122 72.43-1.369 0-2.761-0.047-4.137-0.139-30.175-2.015-51.556-14.405-63.548-36.826-3.857-7.212-6.183-14.436-7.585-20.465h70.134z" - fill="" p-id="11804"></path> - <path d="M371.63 418.105V291.102s-39.842-5.032-88.183 39.508c-51.748 47.679-38.82 87.495-38.82 87.495H371.63zM575.922 327.976h198.527c9.665 0 17.5-7.835 17.5-17.5s-7.835-17.5-17.5-17.5H575.922c-9.665 0-17.5 7.835-17.5 17.5s7.835 17.5 17.5 17.5zM575.922 390.76h198.527c9.665 0 17.5-7.835 17.5-17.5s-7.835-17.5-17.5-17.5H575.922c-9.665 0-17.5 7.835-17.5 17.5s7.835 17.5 17.5 17.5zM620.038 520.799l44.902 34.716c7.245 5.602 17.579 4.671 23.706-2.131l63.284-70.245 14.989 14.484a9.142 9.142 0 0 0 12.926-0.221l9.379-65.614c1.119-6.864-0.319-8.253-1.262-9.164-3.166-3.059-4.193-4.052-10.544-2.244L712.165 432a9.142 9.142 0 0 0 0.221 12.926l14.36 13.877-53.24 59.095-43.373-33.534a17.503 17.503 0 0 0-22.138 0.596l-107.33 92.622c-7.317 6.314-8.13 17.365-1.816 24.683a17.457 17.457 0 0 0 13.257 6.066c4.05 0 8.119-1.398 11.426-4.251l96.506-83.281zM461.45 667.977H262.922c-9.665 0-17.5 7.835-17.5 17.5s7.835 17.5 17.5 17.5H461.45c9.665 0 17.5-7.835 17.5-17.5s-7.835-17.5-17.5-17.5zM461.45 736.76H262.922c-9.665 0-17.5 7.835-17.5 17.5s7.835 17.5 17.5 17.5H461.45c9.665 0 17.5-7.835 17.5-17.5s-7.835-17.5-17.5-17.5zM772.722 736.76v-33.941c0-9.665-7.835-17.5-17.5-17.5s-17.5 7.835-17.5 17.5v33.941h-14.993v-85.383c0-9.665-7.835-17.5-17.5-17.5s-17.5 7.835-17.5 17.5v85.383h-14.993v-59.383c0-9.665-7.835-17.5-17.5-17.5s-17.5 7.835-17.5 17.5v59.383h-14.993V607.332c0-9.665-7.835-17.5-17.5-17.5s-17.5 7.835-17.5 17.5V736.76H572.75v-46.907c0-9.665-7.835-17.5-17.5-17.5s-17.5 7.835-17.5 17.5v46.907h-4.794c-9.665 0-17.5 7.835-17.5 17.5s7.835 17.5 17.5 17.5h247.851c9.665 0 17.5-7.835 17.5-17.5s-7.835-17.5-17.5-17.5h-8.085zM328.595 877.5h-58.522c-9.665 0-17.5 7.835-17.5 17.5s7.835 17.5 17.5 17.5h58.522c9.665 0 17.5-7.835 17.5-17.5s-7.835-17.5-17.5-17.5zM417.674 877.5h-31.341c-9.665 0-17.5 7.835-17.5 17.5s7.835 17.5 17.5 17.5h31.341c9.665 0 17.5-7.835 17.5-17.5s-7.835-17.5-17.5-17.5zM753.675 877.5H480.077c-9.665 0-17.5 7.835-17.5 17.5s7.835 17.5 17.5 17.5h273.598c9.665 0 17.5-7.835 17.5-17.5s-7.835-17.5-17.5-17.5z" - fill="" p-id="11805"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/annual_report1.svg b/app/resources/icons/annual_report1.svg deleted file mode 100644 index cfa7a1f..0000000 --- a/app/resources/icons/annual_report1.svg +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1699702047342" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" - p-id="11637" width="16" height="16"> - <path d="M160 184h512v256H160z" fill="#FFD740" p-id="11638"></path> - <path d="M672 448H160a8 8 0 0 1-8-8v-256a8 8 0 0 1 8-8h512a8 8 0 0 1 8 8v256a8 8 0 0 1-8 8z m-504-16h496V192h-496v240z" - fill="#263238" p-id="11639"></path> - <path d="M704 944H128c-26.464 0-48-21.536-48-48V144c0-26.464 21.536-48 48-48h576c26.464 0 48 21.536 48 48v752c0 26.464-21.536 48-48 48zM128 112c-17.648 0-32 14.352-32 32v752c0 17.648 14.352 32 32 32h576c17.648 0 32-14.352 32-32V144c0-17.648-14.352-32-32-32H128z" - fill="#263238" p-id="11640"></path> - <path d="M784 1024H192c-26.464 0-48-21.536-48-48v-8a8 8 0 0 1 16 0v8c0 17.648 14.352 32 32 32h592c17.648 0 32-14.352 32-32V224c0-17.648-14.352-32-32-32h-8a8 8 0 0 1 0-16h8c26.464 0 48 21.536 48 48v752c0 26.464-21.536 48-48 48zM848 48h-64a8 8 0 0 1 0-16h64a8 8 0 0 1 0 16z" - fill="#263238" p-id="11641"></path> - <path d="M816 80a8 8 0 0 1-8-8v-64a8 8 0 0 1 16 0v64a8 8 0 0 1-8 8zM936 136h-64a8 8 0 0 1 0-16h64a8 8 0 0 1 0 16z" - fill="#263238" p-id="11642"></path> - <path d="M904 168a8 8 0 0 1-8-8V96a8 8 0 0 1 16 0v64a8 8 0 0 1-8 8zM240 392a8 8 0 0 1-6.304-12.896l112-144a8 8 0 0 1 6.048-3.088 7.472 7.472 0 0 1 6.24 2.688l121.616 136.816 106.096-136.4a8 8 0 1 1 12.624 9.808l-112 144a8 8 0 0 1-12.288 0.4l-121.616-136.816-106.096 136.4A8 8 0 0 1 240 392z" - fill="#263238" p-id="11643"></path> - <path d="M240 384m-24 0a24 24 0 1 0 48 0 24 24 0 1 0-48 0Z" fill="#FFFFFF" p-id="11644"></path> - <path d="M240 416c-17.648 0-32-14.352-32-32s14.352-32 32-32 32 14.352 32 32-14.352 32-32 32z m0-48a16.016 16.016 0 0 0 0 32 16.016 16.016 0 0 0 0-32z" - fill="#263238" p-id="11645"></path> - <path d="M480 384m-24 0a24 24 0 1 0 48 0 24 24 0 1 0-48 0Z" fill="#FFFFFF" p-id="11646"></path> - <path d="M480 416c-17.648 0-32-14.352-32-32s14.352-32 32-32 32 14.352 32 32-14.352 32-32 32z m0-48a16.016 16.016 0 0 0 0 32 16.016 16.016 0 0 0 0-32z" - fill="#263238" p-id="11647"></path> - <path d="M352 240m-24 0a24 24 0 1 0 48 0 24 24 0 1 0-48 0Z" fill="#FFFFFF" p-id="11648"></path> - <path d="M352 272c-17.648 0-32-14.352-32-32s14.352-32 32-32 32 14.352 32 32-14.352 32-32 32z m0-48a16.016 16.016 0 0 0 0 32 16.016 16.016 0 0 0 0-32z" - fill="#263238" p-id="11649"></path> - <path d="M592 240m-24 0a24 24 0 1 0 48 0 24 24 0 1 0-48 0Z" fill="#FFFFFF" p-id="11650"></path> - <path d="M592 272c-17.648 0-32-14.352-32-32s14.352-32 32-32 32 14.352 32 32-14.352 32-32 32z m0-48a16.016 16.016 0 0 0 0 32 16.016 16.016 0 0 0 0-32zM576 864c-57.344 0-104-46.656-104-104S518.656 656 576 656s104 46.656 104 104S633.344 864 576 864z m0-192c-48.528 0-88 39.488-88 88S527.472 848 576 848s88-39.488 88-88S624.528 672 576 672zM608 528H224a8 8 0 0 1 0-16h384a8 8 0 0 1 0 16zM608 608H224a8 8 0 0 1 0-16h384a8 8 0 0 1 0 16z" - fill="#263238" p-id="11651"></path> - <path d="M643.872 827.872l0.032-0.016A96 96 0 0 0 576 664v96l67.872 67.872z" fill="#40C4FF" p-id="11652"></path> - <path d="M643.888 835.856a8 8 0 0 1-5.664-2.336l-67.872-67.872a7.936 7.936 0 0 1-2.352-5.648v-96a8 8 0 0 1 8-8c57.344 0 104 46.656 104 104a103.328 103.328 0 0 1-30.432 73.52 8 8 0 0 1-5.68 2.336zM584 756.688l59.632 59.632A87.36 87.36 0 0 0 664 760a88.128 88.128 0 0 0-80-87.648v84.336z" - fill="#263238" p-id="11653"></path> - <path d="M576 856a95.68 95.68 0 0 0 67.904-28.144L576 760h-96a96 96 0 0 0 96 96z" fill="#FF5252" - p-id="11654"></path> - <path d="M576 864a104.128 104.128 0 0 1-104-104 8 8 0 0 1 8-8h96c2.112 0 4.16 0.848 5.664 2.336l67.904 67.856a8 8 0 0 1 0 11.328A103.424 103.424 0 0 1 576 864z m-87.648-96c4.048 44.8 41.808 80 87.648 80a87.36 87.36 0 0 0 56.336-20.384L572.688 768h-84.336z" - fill="#263238" p-id="11655"></path> - <path d="M368 688h-128a8 8 0 0 1 0-16h128a8 8 0 0 1 0 16z" fill="#263238" p-id="11656"></path> - <path d="M368 768h-128a8 8 0 0 1 0-16h128a8 8 0 0 1 0 16z" fill="#263238" p-id="11657"></path> - <path d="M368 848h-128a8 8 0 0 1 0-16h128a8 8 0 0 1 0 16z" fill="#263238" p-id="11658"></path> - <path d="M904 944a8 8 0 0 1-8-8v-32a8 8 0 0 1 16 0v32a8 8 0 0 1-8 8z" fill="#263238" p-id="11659"></path> - <path d="M904 880a8 8 0 0 1-8-8v-288a8 8 0 0 1 16 0v288a8 8 0 0 1-8 8z" fill="#263238" p-id="11660"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/arrow-left.svg b/app/resources/icons/arrow-left.svg deleted file mode 100644 index 7d5f037..0000000 --- a/app/resources/icons/arrow-left.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1704887643791" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6156" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M803.342997 87.013896a47.908827 47.908827 0 0 0 0-70.993102A61.421574 61.421574 0 0 0 723.904429 13.256823l-3.173448 2.763971L241.23323 470.949915l-2.405678 1.842647c-1.637909 1.228431-3.173448 2.559232-4.606618 3.941218-20.013196 18.938319-20.985704 48.113566-2.86634 68.075577l2.815155 2.917525 484.820954 459.945216c22.521244 21.343997 60.090773 21.343997 82.612016 0 20.013196-18.938319 20.985704-48.113566 2.86634-68.075577l-2.86634-2.968709-446.893132-423.911227L803.342997 87.013896z" fill="#303133" p-id="6157"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/arrow-right.svg b/app/resources/icons/arrow-right.svg deleted file mode 100644 index 47b6761..0000000 --- a/app/resources/icons/arrow-right.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1704887684029" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7130" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M240.871694 97.117314a56.39844 56.39844 0 0 1 0-80.461775 58.110393 58.110393 0 0 1 81.469746 0l460.787257 455.107414a56.39844 56.39844 0 0 1 0 80.445775L322.34144 1007.332141a58.110393 58.110393 0 0 1-81.469746 0 56.39844 56.39844 0 0 1 0-80.461775L660.956076 511.98584 240.871694 97.117314z" fill="#111111" p-id="7131"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/back.svg b/app/resources/icons/back.svg deleted file mode 100644 index ca26fa3..0000000 --- a/app/resources/icons/back.svg +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1699273771059" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" - p-id="12579" - width="16" height="16"> - <path d="M700.371228 394.525472 174.028569 394.525472l255.952416-227.506551c12.389168-11.011798 13.505595-29.980825 2.492774-42.369993-11.011798-12.386098-29.977755-13.506619-42.367947-2.492774L76.425623 400.975371c-6.960529 5.496178-11.434423 14.003945-11.434423 23.561625 0 0.013303 0.001023 0.026606 0.001023 0.039909 0 0.01228-0.001023 0.025583-0.001023 0.037862 0 0.473791 0.01535 0.946558 0.037862 1.418302 0.001023 0.016373 0.001023 0.032746 0.001023 0.049119 0.39295 8.030907 3.992941 15.595186 10.034541 20.962427l315.040163 280.028764c5.717212 5.083785 12.83533 7.580652 19.925818 7.580652 8.274454 0 16.514115-3.403516 22.442128-10.07445 11.011798-12.387122 9.896394-31.357172-2.492774-42.367947l-256.128425-227.665163 526.518668 0c109.219517 0 198.075241 88.855724 198.075241 198.075241s-88.855724 198.075241-198.075241 198.075241L354.324888 850.696955c-16.57449 0-30.011524 13.437034-30.011524 30.011524s13.437034 30.011524 30.011524 30.011524l346.046341 0c142.31631 0 258.098289-115.783003 258.098289-258.098289S842.686515 394.525472 700.371228 394.525472z" - fill="#272636" p-id="12580"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/chat.svg b/app/resources/icons/chat.svg deleted file mode 100644 index f319b84..0000000 --- a/app/resources/icons/chat.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702562131578" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6431" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M624.5 534.5m-325.5 0a325.5 325.5 0 1 0 651 0 325.5 325.5 0 1 0-651 0Z" fill="#C1E6DE" p-id="6432"></path><path d="M159.534 684.536c46.494-44.727 85.552-62.297 123.134-46.118 16.58 7.137 34.97 12.832 55.177 17.058a39.27 39.27 0 0 1 30.333 30.086c20.969 96.321 92.259 142.26 223.295 142.26 51.56 0 94.224-7.407 127.845-21.876 32.295-13.897 64.764-1.552 102.148 31.796v-220.63c0-94.239-30.647-152.84-90.93-183.574a39.273 39.273 0 0 1-21.42-33.974C704.862 235.03 616.634 159.545 434.403 159.545c-186.515 0-274.87 79.078-274.87 252.468v272.523z m92.085 26.028c2.48 1.067 0.207 1.546-7.93 6.597-14.267 8.859-32.893 25.731-55.043 50.436a61.702 61.702 0 0 1-45.94 20.514C108.625 788.111 81 760.481 81 726.397V412.013C81 193.18 206.34 81 434.404 81c214.652 0 338.605 99.388 352.16 294.146C861.73 422.736 900 504.862 900 617.113v269.384C900 918.81 873.806 945 841.5 945a58.5 58.5 0 0 1-43.55-19.441c-18.66-20.807-34.259-34.932-45.962-42.196-2.558-1.588-4.655-2.678-6.209-3.344-43.357 17.76-94.866 26.35-154.306 26.35-154.92 0-257.22-59.794-293.718-179.782-16.21-4.427-31.593-9.763-46.136-16.023z m70.156 21.795c-21.228-4.438-34.84-25.247-30.401-46.478 4.437-21.23 25.243-34.844 46.471-30.405 28.64 5.988 60.848 9.005 96.56 9.005 186.514 0 274.869-79.078 274.869-252.468 0-4.205-0.053-8.355-0.159-12.449-0.56-21.682 16.56-39.714 38.24-40.274 21.679-0.56 39.708 16.562 40.268 38.244 0.124 4.775 0.185 9.6 0.185 14.479 0 218.833-125.34 331.013-353.404 331.013-40.883 0-78.435-3.517-112.63-10.667z" fill="#0A0B0C" p-id="6433"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/chat0.svg b/app/resources/icons/chat0.svg deleted file mode 100644 index 7b78755..0000000 --- a/app/resources/icons/chat0.svg +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1699701643250" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4091" - width="16" height="16"> - <path d="M767.424 130.032 256.576 130.032c-70.4 0-128 57.6-128 128l0 335.632c0 70.4 57.6 128 128 128l118.352 0 0 172.288 213.328-172.288 179.152 0c70.4 0 128-57.6 128-128L895.408 258.032C895.424 187.632 837.824 130.032 767.424 130.032zM815.424 593.664c0 26.016-21.984 48-48 48L588.272 641.664 560 641.664l-22 17.76-83.056 67.088 0-4.848 0-80-80 0-118.352 0c-26.016 0-48-21.984-48-48L208.592 258.032c0-26.016 21.984-48 48-48l510.848 0c26.016 0 48 21.984 48 48L815.44 593.664z" - p-id="4092"></path> - <path d="M347.888 425.872m-46.608 0a2.913 2.913 0 1 0 93.216 0 2.913 2.913 0 1 0-93.216 0Z" p-id="4093"></path> - <path d="M512 425.872m-46.608 0a2.913 2.913 0 1 0 93.216 0 2.913 2.913 0 1 0-93.216 0Z" p-id="4094"></path> - <path d="M676.096 425.872m-46.608 0a2.913 2.913 0 1 0 93.216 0 2.913 2.913 0 1 0-93.216 0Z" p-id="4095"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/clear.svg b/app/resources/icons/clear.svg deleted file mode 100644 index 74eb441..0000000 --- a/app/resources/icons/clear.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1712632579720" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4260" width="16" height="16" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M899.1 869.6l-53-305.6H864c14.4 0 26-11.6 26-26V346c0-14.4-11.6-26-26-26H618V138c0-14.4-11.6-26-26-26H432c-14.4 0-26 11.6-26 26v182H160c-14.4 0-26 11.6-26 26v192c0 14.4 11.6 26 26 26h17.9l-53 305.6c-0.3 1.5-0.4 3-0.4 4.4 0 14.4 11.6 26 26 26h723c1.5 0 3-0.1 4.4-0.4 14.2-2.4 23.7-15.9 21.2-30zM204 390h272V182h72v208h272v104H204V390z m468 440V674c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v156H416V674c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v156H202.8l45.1-260H776l45.1 260H672z" p-id="4261" fill="#13227a"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/contact.svg b/app/resources/icons/contact.svg deleted file mode 100644 index 5d24ba6..0000000 --- a/app/resources/icons/contact.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1704807621521" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11539" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M0 30.72h960v960H0z" fill="#000000" fill-opacity="0" p-id="11540"></path><path d="M274.28864 716.43136c27.42272-13.71136 47.99488-58.28608 65.13664-65.13664 10.2912-3.4304 51.43552-24.00256 27.43296-85.7088-54.85568-54.86592-92.5696-106.2912-92.5696-226.304h411.42272c0 116.5824-37.71392 171.43808-92.5696 226.304-24.00256 68.56704 13.7216 85.7088 20.57216 85.7088 24.00256 6.8608 82.28864 54.85568 106.2912 65.13664 3.42016 0-133.72416 37.71392-240.00512 34.29376-68.56704 0-137.14432-13.7216-205.7216-34.29376z" fill="#FFE58F" p-id="11541"></path><path d="M480 37.5808c-65.14688 0-202.28096 47.99488-219.43296 164.56704h442.28608C682.2912 92.43648 545.14688 37.5808 480 37.5808z m226.28352 198.8608s-3.4304 0 0 0H253.71648c-10.2912 10.28096-37.71392 17.13152-48.00512 68.56704h548.57728c-17.14176-51.43552-41.14432-58.28608-48.00512-68.57728z" fill="#FAAD14" p-id="11542"></path><path d="M702.85312 236.4416s3.4304 0 0 0v-10.2912c0-6.8608 0-17.14176-3.42016-24.00256H260.56704c0 6.8608-3.42016 17.14176-3.42016 24.00256 0 3.4304-3.4304 6.8608-3.4304 10.28096h449.13664z" fill="#D46B08" p-id="11543"></path><path d="M850.28864 843.29472l-17.14176-34.29376c-24.00256-51.42528-65.14688-85.7088-113.152-109.71136-20.56192-10.28096-44.56448-17.14176-68.56704-20.57216-20.57216-3.4304-37.71392-3.4304-58.28608 0-37.71392 3.4304-71.99744 6.8608-106.2912 6.8608-37.70368 0-75.4176-3.4304-116.56192-6.8608-20.5824-3.4304-41.14432 0-58.28608 0-24.00256 3.4304-48.00512 10.2912-68.57728 20.5824-47.99488 23.99232-89.1392 58.27584-113.14176 109.70112l-17.14176 34.29376c-10.28096 13.71136-13.7216 27.42272-13.7216 44.56448 0 58.28608 44.58496 102.8608 102.8608 102.8608h555.43808c17.14176 0 30.85312-3.4304 44.56448-10.28096 54.85568-27.43296 75.42784-89.14944 48.00512-137.14432z" fill="#FFC53D" p-id="11544"></path><path d="M651.42784 678.71744v106.2912c0 37.71392-30.85312 68.56704-68.56704 68.56704H377.1392c-37.71392 0-68.56704-30.85312-68.56704-68.56704V675.28704c-24.00256 3.4304-48.00512 10.2912-68.57728 20.5824V990.72h480.01024V695.8592c-20.5824-6.8608-44.57472-13.71136-68.57728-17.14176z" fill="#FAAD14" p-id="11545"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/csv.svg b/app/resources/icons/csv.svg deleted file mode 100644 index be156fe..0000000 --- a/app/resources/icons/csv.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1698328334260" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4724" - width="200" height="200"> - <path d="M332.799002 686.081014m-332.799002 0a332.799002 332.799002 0 1 0 665.598003 0 332.799002 332.799002 0 1 0-665.598003 0Z" - fill="#F4EFC9" p-id="4725"></path> - <path d="M883.19735 1024h-639.99808A141.055577 141.055577 0 0 1 102.399693 883.200422v-742.397772A141.055577 141.055577 0 0 1 243.19927 0.003072h516.350451a89.087733 89.087733 0 0 1 63.231811 25.599923l189.695431 189.695431A38.399885 38.399885 0 0 1 1023.996928 243.202342v639.99808a141.055577 141.055577 0 0 1-140.799578 140.799578zM243.19927 76.802842A63.999808 63.999808 0 0 0 179.199462 140.80265v742.397772A63.999808 63.999808 0 0 0 243.19927 947.20023h639.99808a63.999808 63.999808 0 0 0 63.999808-63.999808V259.074295l-179.199462-179.199463a12.799962 12.799962 0 0 0-8.447975-3.07199z" - fill="#434260" p-id="4726"></path> - <path d="M292.095124 512.001536c0-73.727779 44.799866-118.015646 102.399693-118.015646a87.039739 87.039739 0 0 1 64.255807 28.671914l-19.455942 22.783932a60.15982 60.15982 0 0 0-44.287867-20.22394c-38.911883 0-66.047802 32.511902-66.047802 85.759743s25.599923 86.52774 65.023805 86.52774a65.791803 65.791803 0 0 0 51.199846-24.063927l18.943944 22.527932a89.087733 89.087733 0 0 1-70.399789 32.511903c-58.111826 0.767998-101.631695-41.727875-101.631695-116.479651zM478.206565 595.969284l20.991937-25.599923a87.551737 87.551737 0 0 0 60.15982 25.599923c27.391918 0 42.751872-12.799962 42.751872-31.999904s-15.359954-27.135919-36.351891-36.351891l-31.231907-13.567959a65.023805 65.023805 0 0 1-46.079861-59.135823A67.071799 67.071799 0 0 1 563.19831 394.753888a96.76771 96.76771 0 0 1 68.351795 28.671914l-18.687944 22.783931a72.191783 72.191783 0 0 0-49.663851-20.223939c-23.039931 0-38.143886 11.007967-38.143885 29.183912s18.175945 25.599923 36.60789 34.047898l30.975907 13.31196A63.23181 63.23181 0 0 1 638.206085 563.201382c0 36.351891-29.95191 65.791803-79.615761 65.791803a112.639662 112.639662 0 0 1-80.383759-33.023901zM650.750048 399.105875h37.887886l33.535899 116.991649c7.679977 25.599923 12.543962 47.871856 20.479939 73.983778h1.535995c7.679977-25.599923 13.31196-48.127856 20.479939-73.983778l33.535899-116.991649h36.351891l-70.655788 226.047322h-42.239873z" - fill="#434260" p-id="4727"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/decrypt.svg b/app/resources/icons/decrypt.svg deleted file mode 100644 index 2b85321..0000000 --- a/app/resources/icons/decrypt.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702563339699" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="28057" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><path d="M512.4096 509.696m-432.3328 0a432.3328 432.3328 0 1 0 864.6656 0 432.3328 432.3328 0 1 0-864.6656 0Z" fill="#B688FF" p-id="28058"></path><path d="M287.4368 415.5904c-85.0432 0-160.4096 41.3696-207.104 105.0624 4.5568 182.7328 122.368 337.3056 285.952 396.032 103.2192-33.28 177.92-130.048 177.92-244.3776 0-141.7728-114.944-256.7168-256.768-256.7168z" fill="#C3A4FF" p-id="28059"></path><path d="M639.8976 358.7584c21.504 0 36.4032-21.7088 28.3648-41.6768-16.5888-41.216-56.9856-70.4-104.0384-70.4H460.544c-61.9008 0-112.0768 50.176-112.0768 112.0768v64.0512h61.44V358.7584c0-27.9552 22.6816-50.6368 50.6368-50.6368h103.68c20.9408 0 38.9632 12.8 46.6432 30.976 4.9664 11.6736 15.8208 19.712 28.5184 19.712h0.512z" fill="#D7C7FF" p-id="28060"></path><path d="M670.0032 395.2128H354.7648c-48.9472 0-88.6272 39.68-88.6272 88.6272v186.0608c0 48.9472 39.68 88.6272 88.6272 88.6272h315.2384c48.9472 0 88.6272-39.68 88.6272-88.6272V483.84c0-48.9472-39.68-88.6272-88.6272-88.6272z m-130.1504 188.2112v64.512a27.4432 27.4432 0 0 1-54.8864 0v-64.512a55.31648 55.31648 0 0 1-27.9552-48.0768c0-30.6176 24.7808-55.3984 55.3984-55.3984s55.3984 24.7808 55.3984 55.3984c0 20.6336-11.264 38.5536-27.9552 48.0768z" fill="#FFFFFF" p-id="28061"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/default_avatar.svg b/app/resources/icons/default_avatar.svg deleted file mode 100644 index 5442c4e..0000000 --- a/app/resources/icons/default_avatar.svg +++ /dev/null @@ -1,134 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg height="64" node-id="1" sillyvg="true" template-height="64" template-width="64" version="1.1" - viewBox="0 0 1024 1024" width="64" xmlns="http://www.w3.org/2000/svg"> - <defs node-id="53"> - <linearGradient gradientUnits="objectBoundingBox" id="linearGradient-3" node-id="6" spreadMethod="pad" x1="0" - x2="0.5" y1="-0.11715827" y2="0.75683814"> - <stop offset="0" stop-color="#d08787"></stop> - <stop offset="1" stop-color="#a34f4f"></stop> - </linearGradient> - </defs> - <g node-id="90"> - <path d="M 664.65 903.49 L 678.50 910.89 L 690.64 918.02 L 701.23 924.89 L 710.39 931.49 L 718.26 937.84 L 724.95 943.95 L 730.58 949.84 L 735.26 955.52 L 739.06 961.02 L 742.09 966.35 L 749.88 982.25 L 756.95 997.59 L 763.31 1012.40 L 769.00 1026.70 L 186.18 1024.93 L 191.95 1008.02 L 197.69 992.69 L 203.40 978.83 L 209.07 966.35 L 211.83 960.38 L 215.15 954.60 L 219.06 948.99 L 223.59 943.53 L 228.77 938.21 L 234.66 933.04 L 241.31 928.00 L 248.77 923.10 L 257.12 918.36 L 266.42 913.77 L 276.74 909.36 L 288.18 905.14 L 305.23 902.23 L 320.30 900.19 L 333.55 898.92 L 345.15 898.33 L 355.26 898.33 L 364.03 898.85 L 371.60 899.80 L 378.33 901.18 L 385.40 903.18 L 392.84 905.85 L 400.68 909.25 L 408.97 913.43 L 417.73 918.48 L 426.99 924.46 L 436.80 931.44 L 454.78 922.87 L 471.54 915.47 L 487.14 909.14 L 501.66 903.82 L 515.15 899.43 L 527.69 895.90 L 539.33 893.16 L 550.13 891.14 L 560.16 889.80 L 574.26 889.15 L 587.66 889.11 L 600.39 889.63 L 612.48 890.71 L 623.98 892.30 L 634.92 894.39 L 645.32 896.96 L 655.22 899.99 L 664.65 903.49 Z" - fill="#4d80cf" fill-rule="evenodd" group-id="1" id="蒙版" node-id="11" stroke="none" - target-height="137.59656" target-width="582.81976" target-x="186.18182" target-y="889.1063"></path> - <path d="M 579.84 996.41 L 579.84 1026.13 L 370.12 1025.49 L 370.12 996.41 L 405.64 998.66 L 434.00 1000.11 L 456.25 1000.88 L 473.32 1001.13 L 474.03 1001.13 L 491.09 1000.90 L 513.68 1000.14 L 542.87 998.69 L 579.84 996.41 L 579.84 996.41 Z" - fill="#7facf1" fill-rule="evenodd" group-id="1" id="形状结合" node-id="12" stroke="none" - target-height="29.71997" target-width="209.71558" target-x="370.12415" target-y="996.407"></path> - <path d="M 702.12 925.50 L 702.15 925.77 L 704.57 946.05 L 706.21 963.66 L 707.18 978.85 L 707.55 991.86 L 707.41 1002.92 L 706.86 1012.25 L 705.95 1020.05 L 704.75 1026.51 L 663.92 1026.38 L 697.04 922.09 L 702.12 925.50 Z M 254.45 919.80 L 287.93 1025.24 L 247.16 1025.12 L 246.04 1018.42 L 245.20 1010.36 L 244.74 1000.75 L 244.70 989.40 L 245.18 976.08 L 246.25 960.57 L 248.01 942.64 L 250.56 922.03 L 254.45 919.80 Z" - fill="#3c6db8" fill-rule="evenodd" group-id="1" id="形状结合" node-id="13" stroke="none" - target-height="106.70648" target-width="462.84723" target-x="244.69966" target-y="919.80096"></path> - <path d="M 695.53 918.30 L 697.95 945.08 L 699.44 967.20 L 700.14 985.24 L 700.21 999.74 L 699.77 1011.22 L 698.93 1020.13 L 697.80 1026.89 L 696.48 1031.91 L 617.02 1031.96 L 617.02 898.80 L 618.40 896.82 L 620.18 895.19 L 622.40 893.89 L 625.16 892.92 L 628.58 892.34 L 632.78 892.22 L 637.93 892.66 L 642.61 893.59 L 648.78 895.46 L 656.78 898.55 L 666.96 903.16 L 679.73 909.62 L 695.53 918.30 Z M 256.68 918.30 L 254.27 945.08 L 252.78 967.20 L 252.07 985.24 L 252.00 999.74 L 252.45 1011.22 L 253.29 1020.13 L 254.41 1026.89 L 255.73 1031.91 L 335.19 1031.96 L 335.19 898.80 L 333.81 896.82 L 332.04 895.19 L 329.81 893.89 L 327.05 892.92 L 323.64 892.34 L 319.43 892.22 L 314.28 892.66 L 309.60 893.59 L 303.43 895.46 L 295.44 898.55 L 285.25 903.16 L 272.48 909.62 L 256.68 918.30 Z" - fill="#90623d" fill-rule="evenodd" group-id="1" id="形状结合" node-id="14" stroke="none" - target-height="139.7398" target-width="448.20587" target-x="252.00452" target-y="892.2155"></path> - <path d="M 625.87 900.54 L 626.11 916.18 L 626.37 937.63 L 626.47 962.41 L 626.27 988.04 L 626.00 1000.57 L 625.59 1012.04 L 625.00 1022.98 L 624.27 1031.94 L 617.02 1031.96 L 617.02 898.80 L 618.25 897.00 L 619.79 895.49 L 621.68 894.24 L 623.98 893.27 L 624.91 896.49 L 625.87 900.54 Z M 326.34 900.54 L 326.10 916.18 L 325.85 937.63 L 325.74 962.41 L 325.94 988.04 L 326.22 1000.57 L 326.62 1012.04 L 327.21 1022.98 L 327.94 1031.94 L 335.19 1031.96 L 335.19 898.80 L 333.97 897.00 L 332.43 895.49 L 330.53 894.24 L 328.23 893.27 L 327.31 896.49 L 326.34 900.54 Z" - fill="#604630" fill-rule="evenodd" group-id="1" id="形状结合" node-id="15" stroke="none" - target-height="138.68903" target-width="300.73462" target-x="325.7401" target-y="893.2663"></path> - </g> - <path d="M 523.03 871.40 C 511.28 892.05 492.75 910.25 467.41 926.00 C 435.36 901.73 420.84 881.40 423.86 865.02 C 418.79 856.74 418.79 839.65 423.86 813.76 C 390.08 822.23 363.98 830.64 345.57 838.98 C 317.94 851.49 270.34 881.75 296.88 907.65 C 301.30 911.44 308.91 906.59 315.73 906.32 C 329.12 905.04 339.04 906.32 344.08 908.22 C 383.27 920.97 417.14 938.81 459.00 977.36 C 466.17 983.30 473.98 983.30 482.44 977.36 C 526.40 931.68 573.24 906.06 622.99 900.50 C 629.88 899.71 641.99 900.66 654.98 902.25 C 663.53 905.06 665.21 906.78 668.95 902.25 C 686.06 875.99 626.80 835.96 578.39 828.50 C 546.12 823.53 514.55 818.43 483.69 813.22 C 512.62 832.27 525.73 851.66 523.03 871.40 Z" - fill="#5a8cd9" fill-rule="evenodd" id="蒙版" node-id="16" stroke="none" target-height="170.07861" - target-width="415.71912" target-x="270.3369" target-y="813.2206"></path> - <path d="M 303.97 900.40 L 305.72 900.29 C 312.73 899.73 323.17 901.81 337.04 906.53 C 332.28 905.82 326.03 905.55 318.58 906.08 L 315.73 906.32 C 314.37 906.37 312.97 906.61 311.58 906.92 L 306.07 908.35 C 302.50 909.24 299.24 909.67 296.88 907.65 C 292.24 903.13 289.86 898.46 289.25 893.79 C 291.68 898.45 296.59 900.65 303.97 900.40 Z M 670.10 883.45 C 672.78 890.05 672.71 896.48 668.95 902.25 C 666.53 905.18 664.97 905.50 661.86 904.59 L 659.99 903.99 L 659.99 903.99 L 656.42 902.73 C 655.96 902.57 655.48 902.41 654.98 902.25 L 649.48 901.61 C 648.58 901.51 647.68 901.42 646.79 901.33 L 641.60 900.84 C 640.75 900.77 639.92 900.71 639.11 900.65 L 634.38 900.36 C 629.85 900.14 625.94 900.16 622.99 900.50 C 614.49 901.44 606.08 902.98 597.76 905.10 C 622.98 896.01 641.40 892.74 653.03 895.28 L 654.58 895.66 C 661.49 897.59 666.47 894.14 669.51 885.29 L 670.10 883.45 Z" - fill="#5a8cd9" fill-opacity="0.5" fill-rule="evenodd" group-id="2" id="形状" node-id="17" stroke="none" - target-height="26.223694" target-width="383.52795" target-x="289.25232" target-y="883.4491"></path> - <path d="M 523.01 916.13 C 523.01 918.25 521.00 919.97 518.53 919.97 C 516.06 919.97 514.05 918.25 514.05 916.13 C 514.05 914.01 516.06 912.29 518.53 912.29 C 521.00 912.29 523.01 914.01 523.01 916.13 Z" - fill="#2a3547" fill-rule="evenodd" id="椭圆形" node-id="18" stroke="none" target-height="7.6762085" - target-width="8.955566" target-x="514.05194" target-y="912.2909"></path> - <path d="M 515.61 915.33 L 515.61 1010.94 L 521.88 1010.94 L 521.88 915.33 C 521.88 914.36 520.83 913.87 518.75 913.87 C 516.66 913.87 515.61 914.36 515.61 915.33 Z" - fill="#2b4d82" fill-rule="evenodd" id="路径-41" node-id="19" stroke="none" target-height="97.07422" - target-width="6.265808" target-x="515.61304" target-y="913.8698"></path> - <path d="M 517.38 1006.75 L 520.06 1006.75 L 520.06 1022.10 L 517.38 1022.10 Z" fill="#2a3547" fill-rule="evenodd" - id="矩形" node-id="20" stroke="none" target-height="15.352417" target-width="2.6866455" target-x="517.3775" - target-y="1006.74524"></path> - <path d="M 525.43 1007.44 C 525.43 1011.68 522.43 1015.12 518.72 1015.12 C 515.01 1015.12 512.00 1011.68 512.00 1007.44 C 512.00 1003.20 515.01 999.76 518.72 999.76 C 522.43 999.76 525.43 1003.20 525.43 1007.44 Z" - fill="#2b4d82" fill-rule="evenodd" id="椭圆形" node-id="21" stroke="none" target-height="15.352417" - target-width="13.43335" target-x="512" target-y="999.76337"></path> - <path d="M 420.61 916.13 C 420.61 918.25 418.60 919.97 416.13 919.97 C 413.66 919.97 411.65 918.25 411.65 916.13 C 411.65 914.01 413.66 912.29 416.13 912.29 C 418.60 912.29 420.61 914.01 420.61 916.13 Z" - fill="#2a3547" fill-rule="evenodd" id="椭圆形" node-id="22" stroke="none" target-height="7.6762085" - target-width="8.955597" target-x="411.65195" target-y="912.2909"></path> - <path d="M 413.21 915.33 L 413.21 1010.94 L 419.48 1010.94 L 419.48 915.33 C 419.48 914.36 418.43 913.87 416.35 913.87 C 414.26 913.87 413.21 914.36 413.21 915.33 Z" - fill="#2b4d82" fill-rule="evenodd" id="路径-41" node-id="23" stroke="none" target-height="97.07422" - target-width="6.2657776" target-x="413.21307" target-y="913.8698"></path> - <path d="M 414.98 1006.75 L 417.66 1006.75 L 417.66 1022.10 L 414.98 1022.10 Z" fill="#2a3547" fill-rule="evenodd" - id="矩形" node-id="24" stroke="none" target-height="15.352417" target-width="2.686676" target-x="414.9775" - target-y="1006.74524"></path> - <path d="M 423.03 1007.44 C 423.03 1011.68 420.03 1015.12 416.32 1015.12 C 412.61 1015.12 409.60 1011.68 409.60 1007.44 C 409.60 1003.20 412.61 999.76 416.32 999.76 C 420.03 999.76 423.03 1003.20 423.03 1007.44 Z" - fill="#2b4d82" fill-rule="evenodd" id="椭圆形" node-id="25" stroke="none" target-height="15.352417" - target-width="13.43338" target-x="409.6" target-y="999.76337"></path> - <path d="M 423.82 843.00 C 372.06 845.09 313.93 863.64 327.94 882.15 C 341.91 893.70 367.74 872.62 396.02 890.10 C 412.95 900.57 416.42 903.75 431.97 918.81 C 439.72 926.33 454.31 949.93 467.53 949.52 C 480.74 949.11 493.24 929.21 503.56 919.36 C 509.65 913.54 530.02 889.51 549.31 882.81 C 570.09 875.59 582.18 882.30 612.56 881.45 C 642.94 880.59 610.28 845.75 526.14 843.00 C 492.68 838.82 480.87 833.81 423.82 843.00 Z" - fill="#3c6db8" fill-rule="evenodd" id="路径-28" node-id="26" stroke="none" target-height="116.123474" - target-width="329.01477" target-x="313.92572" target-y="833.80615"></path> - <path d="M 400.29 828.14 C 399.61 845.83 400.03 857.11 401.57 861.97 C 407.94 886.07 435.30 925.47 462.60 924.05 C 492.70 924.74 521.69 884.07 526.18 861.97 C 529.93 851.11 524.86 835.38 526.87 828.14 C 531.72 823.52 511.92 825.15 467.47 833.03 L 400.29 828.14 Z" - fill="#ffb5a1" fill-rule="evenodd" id="蒙版" node-id="27" stroke="none" target-height="101.95264" - target-width="132.11285" target-x="399.6089" target-y="823.51654"></path> - <path d="M 505.70 899.61 C 494.43 912.75 479.80 923.41 464.75 924.03 L 462.60 924.05 C 448.77 924.77 434.93 915.02 423.80 902.08 C 450.76 908.58 477.52 907.93 504.06 900.12 L 505.70 899.61 Z" - fill="#ffffff" fill-rule="evenodd" id="路径" node-id="28" stroke="none" target-height="25.157288" - target-width="81.895996" target-x="423.80438" target-y="899.6133"></path> - <path d="M 430.64 830.34 L 467.47 833.03 L 479.23 830.99 L 479.23 830.99 L 489.72 829.28 L 489.72 829.28 L 498.92 827.89 L 498.92 827.89 L 504.99 827.06 L 504.99 827.06 L 510.33 826.42 L 510.33 826.42 L 514.96 825.95 L 514.96 825.95 L 517.64 825.75 L 517.64 825.75 L 520.00 825.62 L 520.00 825.62 L 522.95 825.58 C 523.24 825.59 523.51 825.60 523.77 825.61 L 525.17 825.73 L 525.17 825.73 L 526.26 825.93 C 527.80 826.33 528.00 827.06 526.87 828.14 C 526.25 830.40 526.31 833.49 526.58 837.01 L 527.18 843.70 C 527.73 849.89 528.05 856.54 526.18 861.97 C 525.23 866.62 523.21 872.08 520.32 877.81 C 518.83 877.94 517.30 878.01 515.72 878.01 C 490.06 878.01 454.02 864.55 407.57 837.62 L 400.12 833.25 L 400.15 832.34 L 400.15 832.34 L 430.64 830.34 Z" - fill="#f5987f" fill-rule="evenodd" id="路径" node-id="29" stroke="none" target-height="52.422913" - target-width="127.934906" target-x="400.11972" target-y="825.584"></path> - <path d="M 845.22 356.52 L 840.88 364.18 L 836.34 371.23 L 831.60 377.69 L 826.66 383.61 L 821.32 389.28 L 815.79 394.51 L 810.07 399.31 L 804.17 403.70 L 795.92 409.07 L 787.38 413.88 L 778.51 418.14 L 769.42 421.92 L 760.08 425.32 L 750.47 428.33 L 735.83 432.24 L 720.81 435.61 L 705.63 438.60 L 690.31 441.38 L 659.73 446.99 L 642.92 450.55 L 625.26 454.75 L 606.73 459.64 L 587.29 465.25 L 566.89 471.61 L 545.51 478.77 L 523.11 486.76 L 499.63 495.63 L 501.76 478.77 L 504.26 463.37 L 507.10 449.35 L 510.24 436.61 L 513.66 425.07 L 517.32 414.62 L 521.20 405.21 L 525.29 396.74 L 529.57 389.15 L 534.02 382.36 L 538.63 376.33 L 543.41 370.99 L 548.36 366.29 L 553.48 362.20 L 558.78 358.67 L 560.77 357.24 L 562.24 355.73 L 563.28 354.14 L 563.94 352.46 L 564.35 350.02 L 564.29 347.31 L 563.71 344.27 L 562.23 339.69 L 560.01 334.48 L 554.74 323.44 L 552.12 317.58 L 549.81 311.52 L 548.55 307.40 L 547.65 303.26 L 547.10 299.09 L 547.02 294.91 L 547.49 290.73 L 548.54 286.50 L 549.70 283.49 L 551.31 280.43 L 553.40 277.32 L 556.03 274.12 L 558.84 271.29 L 562.29 268.39 L 566.46 265.39 L 571.45 262.32 L 576.38 259.68 L 582.17 256.99 L 588.92 254.24 L 596.73 251.45 L 607.04 248.27 L 619.31 245.08 L 633.76 241.89 L 649.95 237.91 L 665.08 234.59 L 679.20 231.88 L 692.37 229.76 L 704.64 228.16 L 717.66 226.90 L 729.71 226.15 L 740.86 225.87 L 751.16 226.02 L 760.65 226.57 L 770.67 227.61 L 779.85 229.01 L 788.24 230.73 L 795.91 232.75 L 802.90 235.06 L 810.08 237.93 L 816.57 241.02 L 822.43 244.33 L 827.71 247.84 L 832.44 251.55 L 837.01 255.75 L 841.06 260.08 L 844.62 264.56 L 847.72 269.20 L 850.36 274.00 L 852.65 279.06 L 854.52 284.20 L 855.99 289.46 L 857.07 294.84 L 857.75 300.35 L 858.07 307.27 L 857.83 314.26 L 857.04 321.34 L 855.67 328.54 L 853.81 335.59 L 851.46 342.60 L 848.60 349.57 L 845.22 356.52 Z" - fill="#edb41f" fill-rule="evenodd" group-id="3" node-id="88" stroke="none" target-height="269.75473" - target-width="358.43317" target-x="499.63354" target-y="225.87112"></path> - <path d="M 843.38 374.87 L 838.15 382.19 L 832.77 388.86 L 827.24 394.90 L 821.57 400.35 L 815.51 405.50 L 809.30 410.17 L 802.95 414.38 L 796.44 418.15 L 789.72 421.57 L 782.85 424.65 L 775.84 427.39 L 768.67 429.81 L 758.98 432.57 L 749.06 434.93 L 738.93 436.86 L 732.48 437.91 L 732.48 437.91 L 725.97 438.83 L 725.97 438.83 L 719.43 439.65 L 716.14 440.03 L 709.53 440.71 L 709.53 440.71 L 728.65 426.69 L 741.24 424.47 L 752.98 421.80 L 763.91 418.71 L 774.09 415.22 L 783.56 411.35 L 792.37 407.11 L 800.55 402.51 L 808.14 397.57 L 815.18 392.27 L 821.69 386.62 L 827.69 380.61 L 833.21 374.23 L 838.26 367.47 L 842.86 360.30 L 847.00 352.71 L 850.70 344.67 L 853.94 336.14 L 856.72 327.10 L 859.02 317.51 L 860.82 307.34 L 861.48 312.95 L 861.73 318.60 L 861.57 324.31 L 860.99 330.10 L 860.03 335.81 L 858.71 341.52 L 857.01 347.24 L 854.93 352.97 L 851.68 360.39 L 847.83 367.68 L 843.38 374.87 Z" - fill="#d19800" fill-rule="evenodd" group-id="4" id="路径" node-id="33" stroke="none" target-height="133.37094" - target-width="152.19409" target-x="709.53314" target-y="307.34015"></path> - <path d="M 697.32 580.06 C 721.81 522.64 754.53 502.60 795.47 519.96 C 856.87 545.99 793.27 671.78 722.41 656.93 C 675.18 647.03 666.81 621.41 697.32 580.06 Z" - fill="#ffb5a1" fill-rule="evenodd" id="路径-24" node-id="34" stroke="none" target-height="169.17953" - target-width="190.05817" target-x="666.8143" target-y="502.60294"></path> - <path d="M 715.48 615.05 C 729.33 588.93 745.82 575.01 764.97 573.28" fill="none" id="路径-42" node-id="35" - stroke="#c26b6b" stroke-linecap="round" stroke-width="11.0529785" target-height="41.77179" - target-width="49.489807" target-x="715.4849" target-y="573.2826"></path> - <path d="M 735.51 589.57 C 748.14 592.28 756.51 599.24 760.61 610.44" fill="none" id="路径-43" node-id="36" - stroke="#c26b6b" stroke-linecap="round" stroke-width="11.0529785" target-height="20.875305" - target-width="25.101196" target-x="735.5066" target-y="589.5652"></path> - <path d="M 253.24 587.28 L 248.26 576.35 L 243.23 566.72 L 238.19 558.29 L 233.12 550.95 L 228.05 544.61 L 222.96 539.18 L 217.86 534.58 L 212.73 530.74 L 207.57 527.60 L 202.35 525.11 L 197.05 523.24 L 191.65 521.97 L 186.11 521.28 L 180.39 521.17 L 174.47 521.67 L 168.31 522.81 L 161.86 524.63 L 155.09 527.18 L 151.06 529.15 L 147.48 531.34 L 144.31 533.75 L 141.53 536.37 L 139.09 539.22 L 136.45 543.15 L 134.28 547.35 L 132.60 551.85 L 131.38 556.68 L 130.66 561.58 L 130.34 566.68 L 130.45 572.00 L 131.00 577.56 L 132.31 584.86 L 134.29 592.30 L 136.96 599.90 L 140.18 607.30 L 143.96 614.57 L 148.31 621.72 L 153.14 628.56 L 158.39 634.99 L 164.07 641.03 L 168.63 645.28 L 173.35 649.16 L 178.23 652.69 L 183.28 655.86 L 188.55 658.67 L 193.92 660.99 L 199.38 662.84 L 204.96 664.23 L 210.63 665.09 L 216.36 665.37 L 222.19 665.06 L 228.15 664.16 L 236.37 662.16 L 243.42 659.93 L 249.40 657.50 L 254.45 654.90 L 258.67 652.15 L 262.17 649.26 L 265.01 646.24 L 267.28 643.06 L 269.01 639.73 L 270.24 636.19 L 270.97 632.42 L 271.19 628.36 L 270.87 623.97 L 269.95 619.18 L 268.35 613.95 L 265.99 608.20 L 262.77 601.89 L 258.56 594.93 L 253.24 587.28 Z" - fill="#ffb5a1" fill-rule="evenodd" group-id="5" id="路径-24备份" node-id="37" stroke="none" - target-height="144.19855" target-width="140.85565" target-x="130.33887" target-y="521.17175"></path> - <path d="M 223.70 616.14 L 219.32 608.43 L 214.92 601.71 L 210.51 595.91 L 206.10 590.95 L 201.67 586.73 L 197.23 583.21 L 192.76 580.33 L 188.24 578.03 L 183.66 576.28 L 178.99 575.07 L 174.21 574.37" - fill="none" group-id="6" id="路径-42" node-id="38" stroke="#c26b6b" stroke-linecap="round" - stroke-width="11.0529785" target-height="41.77179" target-width="49.48979" target-x="174.20847" - target-y="574.37256"></path> - <path d="M 206.00 593.38 L 201.25 594.67 L 197.06 596.34 L 193.36 598.37 L 190.11 600.75 L 187.25 603.51 L 184.77 606.65 L 182.65 610.22 L 180.90 614.26" - fill="none" group-id="7" id="路径-43" node-id="39" stroke="#c26b6b" stroke-linecap="round" - stroke-width="11.0529785" target-height="20.875305" target-width="25.101166" target-x="180.89645" - target-y="593.3819"></path> - <path d="M 464.88 224.32 L 474.50 224.32 C 616.34 224.32 731.32 339.30 731.32 481.14 C 731.32 482.52 731.31 483.91 731.29 485.29 L 729.42 600.34 C 727.27 733.77 623.28 843.31 490.15 852.41 L 466.68 854.01 L 466.68 854.01 L 451.40 852.90 C 321.54 843.45 219.31 738.31 213.49 608.24 L 208.31 492.62 C 201.97 350.93 311.70 230.92 453.39 224.58 C 457.22 224.40 461.05 224.32 464.88 224.32 Z" - fill="#ffcdbc" fill-rule="evenodd" id="蒙版" node-id="40" stroke="none" target-height="629.6952" - target-width="529.3472" target-x="201.97139" target-y="224.31845"></path> - <path d="M 256.94 620.13 C 290.54 620.13 317.78 647.36 317.78 680.96 C 317.78 713.83 291.71 740.61 259.12 741.76 L 258.07 741.77 C 236.77 710.67 222.14 674.66 216.20 635.79 C 226.98 626.05 241.27 620.13 256.94 620.13 Z M 682.79 612.52 C 700.21 612.52 715.93 619.85 727.02 631.59 C 721.89 668.76 708.80 703.45 689.48 733.83 C 687.28 734.07 685.05 734.19 682.79 734.19 C 649.19 734.19 621.95 706.96 621.95 673.36 C 621.95 639.76 649.19 612.52 682.79 612.52 Z" - fill="#ffb5a1" fill-opacity="0.43815103" fill-rule="evenodd" group-id="8" id="形状结合" node-id="41" - stroke="none" target-height="129.2508" target-width="510.81848" target-x="216.20026" - target-y="612.52246"></path> - <path d="M 184.62 390.84 C 170.31 426.29 170.31 458.76 184.62 488.25 C 206.07 532.48 276.25 503.25 308.21 477.29 C 364.49 494.48 408.74 487.94 440.97 457.67 C 480.24 481.11 521.00 487.62 563.25 477.21 C 602.14 498.43 642.55 499.53 684.47 480.52 C 702.80 520.72 721.57 531.50 740.77 512.86 C 755.70 492.61 759.67 452.85 752.67 393.58 C 617.22 268.88 517.41 206.29 453.25 205.79 C 389.09 205.28 305.84 266.45 203.50 389.28 L 184.62 390.84 Z" - fill="#382222" fill-rule="evenodd" id="蒙版" node-id="42" stroke="none" target-height="327.1981" - target-width="589.3591" target-x="170.31012" target-y="205.2833"></path> - <path d="M 690.60 456.12 C 704.84 491.52 718.65 512.59 732.02 519.34 C 715.86 527.53 700.01 514.60 684.47 480.52 C 642.55 499.53 602.14 498.43 563.25 477.21 C 526.31 486.31 490.51 482.48 455.85 465.71 L 448.19 456.12 C 491.08 469.49 532.03 471.98 571.02 463.58 C 609.49 489.56 649.35 487.07 690.60 456.12 Z M 282.03 463.58 L 307.83 477.59 C 301.15 482.98 292.83 488.49 283.67 493.45 L 279.02 495.88 C 250.73 510.14 215.93 518.38 195.51 502.14 C 223.62 515.11 251.80 503.13 280.06 466.20 L 282.03 463.58 Z M 562.12 266.61 C 563.23 266.61 564.19 267.84 565.02 270.32 L 565.50 271.95 L 565.50 271.95 L 565.95 273.88 L 565.95 273.88 L 566.37 276.11 L 566.37 276.11 L 566.75 278.63 L 566.75 278.63 L 567.11 281.45 L 567.11 281.45 L 567.43 284.57 L 567.43 284.57 L 567.71 287.98 L 567.71 287.98 L 568.08 293.66 L 568.08 293.66 L 568.29 297.82 L 568.29 297.82 L 568.53 304.61 L 568.53 304.61 L 568.66 309.51 L 568.66 309.51 L 568.81 320.20 L 568.81 320.20 L 568.84 329.00 L 568.84 329.00 L 568.79 338.46 L 568.79 338.46 L 568.61 352.12 L 568.61 352.12 L 568.40 363.14 L 568.40 363.14 L 568.11 374.83 L 568.11 374.83 C 544.41 344.52 504.44 329.36 448.19 329.36 C 392.82 329.36 370.29 365.41 380.59 437.49 L 381.10 440.95 L 300.98 450.98 L 313.99 326.36 L 313.99 326.36 L 317.36 291.67 L 317.36 291.67 L 317.96 284.52 L 317.96 284.52 L 318.15 281.22 C 318.15 281.10 318.16 281.01 318.16 280.92 C 318.16 280.40 319.04 279.89 320.70 279.40 L 322.30 278.97 C 322.60 278.90 322.92 278.83 323.25 278.76 L 325.40 278.35 L 325.40 278.35 L 329.26 277.73 L 329.26 277.73 L 333.85 277.13 L 333.85 277.13 L 341.00 276.35 L 341.00 276.35 L 351.43 275.40 L 351.43 275.40 L 368.43 274.15 L 368.43 274.15 L 384.77 273.14 L 384.77 273.14 L 411.44 271.73 L 411.44 271.73 L 426.94 271.02 L 426.94 271.02 L 461.97 269.59 L 461.97 269.59 L 517.70 267.73 L 517.70 267.73 L 561.21 266.61 L 561.21 266.61 L 562.12 266.61 Z" - fill="#221010" fill-rule="evenodd" id="形状" node-id="43" stroke="none" target-height="260.92984" - target-width="536.51874" target-x="195.50623" target-y="266.605"></path> - <path d="M 480.70 93.09 C 495.01 93.09 507.16 103.37 511.50 117.64 C 686.18 141.11 769.14 248.09 760.41 438.57 C 680.93 455.25 580.75 463.58 459.88 463.58 C 339.00 463.58 243.67 458.54 173.89 448.44 C 166.16 235.26 258.37 124.37 450.51 115.76 L 450.52 115.77 C 455.31 102.48 467.02 93.09 480.70 93.09 Z M 459.88 302.54 C 374.41 303.89 334.04 346.51 338.76 430.41 C 417.49 442.31 492.50 442.31 563.78 430.41 C 582.91 400.91 544.85 302.31 459.88 302.54 Z" - fill="#ffc631" fill-rule="evenodd" id="蒙版" node-id="44" stroke="none" target-height="370.4926" - target-width="602.9802" target-x="166.16113" target-y="93.09091"></path> - <path d="M 518.08 119.96 L 514.12 118.00 L 521.87 119.15 C 689.46 145.42 768.97 251.89 760.41 438.57 C 687.04 453.96 596.04 462.25 487.40 463.44 L 469.13 463.57 C 466.06 463.58 462.98 463.58 459.88 463.58 L 439.71 463.54 C 433.06 463.50 426.50 463.46 420.02 463.39 L 400.82 463.15 L 400.82 463.15 L 382.11 462.82 L 382.11 462.82 L 363.88 462.38 C 360.89 462.30 357.91 462.22 354.95 462.13 L 337.45 461.56 L 337.45 461.56 L 320.44 460.88 L 320.44 460.88 C 326.04 446.18 332.05 432.64 338.39 420.16 C 338.44 423.51 338.56 426.92 338.76 430.41 C 417.49 442.31 492.50 442.31 563.78 430.41 C 582.91 400.91 544.85 302.31 459.88 302.54 C 453.03 302.65 446.48 303.02 440.21 303.66 C 462.85 288.92 485.47 278.73 506.35 270.49 L 514.60 267.29 L 514.60 267.29 L 522.65 264.27 L 522.65 264.27 L 541.68 257.21 L 541.68 257.21 L 548.80 254.50 C 556.92 251.34 564.39 248.19 571.02 244.80 C 614.63 222.49 609.03 190.43 578.08 160.52 L 575.01 157.63 C 573.96 156.67 572.89 155.72 571.78 154.76 L 568.41 151.91 C 567.84 151.43 567.26 150.96 566.67 150.49 L 563.08 147.67 L 563.08 147.67 L 559.36 144.87 L 559.36 144.87 L 555.50 142.10 C 554.84 141.64 554.19 141.18 553.52 140.72 L 549.48 138.00 C 548.11 137.10 546.72 136.20 545.31 135.30 L 541.03 132.65 C 540.31 132.21 539.58 131.77 538.85 131.33 L 534.41 128.73 C 533.66 128.30 532.90 127.87 532.15 127.44 L 527.55 124.90 L 527.55 124.90 L 522.86 122.41 L 522.86 122.41 L 518.08 119.96 L 518.08 119.96 Z M 510.92 115.88 L 511.38 117.21 L 507.76 116.54 C 501.86 115.51 493.97 114.50 485.81 115.16 C 489.86 109.17 489.50 101.91 484.72 93.38 C 496.04 94.92 505.57 102.94 510.19 114.00 L 510.92 115.88 Z" - fill="#e9a900" fill-rule="evenodd" id="形状" node-id="45" stroke="none" target-height="370.206" - target-width="448.5272" target-x="320.43954" target-y="93.37752"></path> - <path d="M 621.57 601.80 C 621.57 621.75 608.63 637.92 592.67 637.92 C 576.71 637.92 563.78 621.75 563.78 601.80 C 563.78 581.85 576.71 565.68 592.67 565.68 C 608.63 565.68 621.57 581.85 621.57 601.80 Z" - fill="#623d3d" fill-rule="evenodd" id="椭圆形备份-3" node-id="46" stroke="none" target-height="72.24164" - target-width="57.793335" target-x="563.7774" target-y="565.67773"></path> - <path d="M 375.95 601.80 C 375.95 621.75 363.01 637.92 347.05 637.92 C 331.09 637.92 318.16 621.75 318.16 601.80 C 318.16 581.85 331.09 565.68 347.05 565.68 C 363.01 565.68 375.95 581.85 375.95 601.80 Z" - fill="#623d3d" fill-rule="evenodd" id="椭圆形备份-4" node-id="47" stroke="none" target-height="72.24164" - target-width="57.793335" target-x="318.15567" target-y="565.67773"></path> - <path d="M 562.13 525.88 L 568.75 524.10 L 577.10 522.36 L 587.46 520.70 L 600.13 519.16 L 609.30 518.52 L 620.65 518.40 L 634.53 518.91 L 651.31 520.20 L 671.37 522.41 L 663.95 517.06 L 656.64 512.46 L 649.42 508.56 L 642.29 505.31 L 635.22 502.69 L 628.20 500.66 L 621.21 499.22 L 614.23 498.33 L 607.23 498.00 L 600.20 498.22 L 593.11 499.00 L 586.97 500.46 L 581.73 502.24 L 577.27 504.29 L 573.51 506.60 L 570.36 509.14 L 567.76 511.91 L 565.65 514.94 L 564.02 518.25 L 562.84 521.88 L 562.13 525.88 Z" - fill="#623d3d" fill-rule="evenodd" group-id="9" id="路径-27" node-id="48" stroke="none" - target-height="27.882507" target-width="109.242676" target-x="562.12537" target-y="497.99805"></path> - <path d="M 384.47 525.88 L 377.84 524.10 L 369.49 522.36 L 359.13 520.70 L 346.46 519.16 L 337.30 518.52 L 325.94 518.40 L 312.06 518.91 L 295.29 520.20 L 275.23 522.41 L 282.65 517.06 L 289.96 512.46 L 297.17 508.56 L 304.30 505.31 L 311.37 502.69 L 318.39 500.66 L 325.38 499.22 L 332.37 498.33 L 339.37 498.00 L 346.40 498.22 L 353.49 499.00 L 359.62 500.46 L 364.87 502.24 L 369.32 504.29 L 373.08 506.60 L 376.23 509.14 L 378.84 511.91 L 380.94 514.94 L 382.58 518.25 L 383.76 521.88 L 384.47 525.88 Z" - fill="#623d3d" fill-rule="evenodd" group-id="10" id="路径-27备份" node-id="49" stroke="none" - target-height="27.882507" target-width="109.242676" target-x="275.2269" target-y="497.99805"></path> - <path d="M 464.50 545.81 C 465.57 542.96 468.84 541.48 471.81 542.51 C 474.78 543.53 476.32 546.67 475.25 549.52 L 473.18 555.10 C 451.65 613.75 447.74 644.74 456.74 646.78 L 456.87 646.80 L 458.66 646.77 C 468.20 646.39 477.91 643.58 487.83 638.27 L 490.12 637.00 C 492.83 635.45 496.34 636.30 497.95 638.90 C 499.57 641.50 498.68 644.86 495.97 646.41 C 483.62 653.48 471.25 657.28 458.92 657.72 L 456.46 657.77 L 455.75 657.73 C 432.67 654.94 437.39 618.12 464.50 545.81 Z" - fill="#f28080" fill-rule="nonzero" id="路径-30" node-id="50" stroke="none" target-height="116.28613" - target-width="66.89816" target-x="432.67035" target-y="541.4824"></path> - <path d="M 417.05 701.46 L 515.68 687.01 C 515.68 727.18 502.75 750.36 476.90 756.54 C 451.05 762.71 431.10 744.36 417.05 701.46 Z" - fill="url(#linearGradient-3)" fill-rule="evenodd" id="路径-31" node-id="51" stroke="none" - target-height="75.70325" target-width="98.63388" target-x="417.04727" target-y="687.0109"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/down.svg b/app/resources/icons/down.svg deleted file mode 100644 index 7c8b4a4..0000000 --- a/app/resources/icons/down.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1706096167224" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7281" width="16" height="16" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M907.1 299.9c-14.6-14.6-38.4-14.6-53 0L513 640.5 172 299.9c-14.6-14.6-38.4-14.6-53 0-14.6 14.6-14.6 38.4 0 53l364.7 364.2c0.8 1 1.7 2 2.7 3 7.3 7.3 17 11 26.7 10.9 9.7 0 19.3-3.6 26.7-10.9 1-1 1.8-1.9 2.7-3l364.7-364.2c14.4-14.6 14.4-38.4-0.1-53z" fill="" p-id="7282"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/emotion.svg b/app/resources/icons/emotion.svg deleted file mode 100644 index 69cd504..0000000 --- a/app/resources/icons/emotion.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1699702358744" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" - p-id="12880" - width="16" height="16"> - <path d="M903 929.5H132.5c-20.1 0-36.5-16.4-36.5-36.6V119.5c0-13.8 11.2-25 25-25s25 11.2 25 25v760h757c13.8 0 25 11.2 25 25s-11.2 25-25 25z" - p-id="12881"></path> - <path d="M241 536.7h50V796h-50zM417.7 458.5h50V796h-50zM594.3 536.7h50V796h-50zM771 411h50v385h-50zM246.9 467.2L217 426.8l218.9-156.9 185.8 114.3 182.8-150.4 32.5 38.4-211 173.6-187.9-115.7z" - p-id="12882"></path> - <path d="M715.2 184.2l194.6-3.9-43.9 187" p-id="12883"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/folder.svg b/app/resources/icons/folder.svg deleted file mode 100644 index 8a5de43..0000000 --- a/app/resources/icons/folder.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702562737910" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="25002" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><path d="M0.853333 129.706667c0-28.16 22.186667-51.2 49.493334-51.2h336.213333c19.626667 0 37.546667 11.946667 45.226667 30.72l23.893333 58.88h438.613333c12.8 0 25.6 5.12 34.133334 15.36 9.386667 9.386667 14.506667 22.186667 14.506666 35.84v674.133333c0 13.653333-5.12 26.453333-14.506666 35.84s-21.333333 15.36-34.133334 15.36H50.346667c-12.8 0-25.6-5.12-34.133334-15.36-9.386667-9.386667-14.506667-23.04-14.506666-35.84-0.853333 0.853333-0.853333-763.733333-0.853334-763.733333z" fill="#FFA000" p-id="25003"></path><path d="M95.573333 213.333333h750.933334c34.133333 0 52.053333 17.92 52.053333 52.906667v477.866667c0 35.84-17.066667 52.906667-52.053333 52.906666h-750.933334c-34.133333 0-52.053333-17.92-52.053333-52.906666v-477.866667c0-35.84 17.92-52.906667 52.053333-52.906667z" fill="#FFFFFF" p-id="25004"></path><path d="M131.413333 293.546667h750.933334c34.133333 0 49.493333 17.066667 44.373333 51.2l-66.56 459.946666c-5.12 34.133333-24.746667 51.2-59.733333 51.2h-733.866667c-34.133333 0-49.493333-17.066667-44.373333-51.2l49.493333-459.946666c5.12-34.986667 25.6-51.2 59.733333-51.2z" fill="#EFC99A" opacity=".9" p-id="25005"></path><path d="M139.946667 315.733333h750.933333c34.133333 0 49.493333 17.066667 44.373333 51.2l-66.56 459.946667c-5.12 34.133333-24.746667 51.2-59.733333 51.2h-742.4c-34.133333 0-49.493333-17.066667-44.373333-51.2L80.213333 366.933333c5.12-34.986667 25.6-51.2 59.733334-51.2z" fill="#FFFFFF" p-id="25006"></path><path d="M131.413333 448.853333h843.946667c32.426667 0 49.493333 11.093333 49.493333 34.133334l-81.92 427.52c0 22.186667-16.213333 34.133333-49.493333 34.133333H49.493333c-32.426667 0-49.493333-11.093333-49.493333-34.133333l81.92-427.52c0-23.04 16.213333-34.133333 49.493333-34.133334z" fill="#FFCA28" p-id="25007"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/get_wx_info.svg b/app/resources/icons/get_wx_info.svg deleted file mode 100644 index fb2ad86..0000000 --- a/app/resources/icons/get_wx_info.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702562636844" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="22977" width="32" height="32" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M508.534154 342.646154m-306.727385 0a306.727385 306.727385 0 1 0 613.454769 0 306.727385 306.727385 0 1 0-613.454769 0Z" fill="#FFDC64" p-id="22978"></path><path d="M508.534154 667.490462a325.001846 325.001846 0 1 1 325.001846-324.844308 325.316923 325.316923 0 0 1-325.001846 324.844308z m0-613.45477A288.610462 288.610462 0 1 0 797.144615 342.646154 288.925538 288.925538 0 0 0 508.534154 54.035692z" fill="" p-id="22979"></path><path d="M508.534154 479.547077m-24.260923 0a24.260923 24.260923 0 1 0 48.521846 0 24.260923 24.260923 0 1 0-48.521846 0Z" fill="" p-id="22980"></path><path d="M508.534154 342.646154m-223.547077 0a223.547077 223.547077 0 1 0 447.094154 0 223.547077 223.547077 0 1 0-447.094154 0Z" fill="#DDDDDD" p-id="22981"></path><path d="M508.534154 584.310154a241.664 241.664 0 1 1 241.821538-241.664 241.979077 241.979077 0 0 1-241.821538 241.664z m0-447.094154a204.8 204.8 0 1 0 204.8 204.8 204.8 204.8 0 0 0-204.8-204.8z" fill="" p-id="22982"></path><path d="M480.964923 301.056h46.788923v192.354462h-46.788923z" fill="" p-id="22983"></path><path d="M527.753846 498.609231h-47.261538a5.198769 5.198769 0 0 1-5.19877-5.198769V301.056a5.198769 5.198769 0 0 1 5.19877-5.198769h47.261538a5.198769 5.198769 0 0 1 5.198769 5.198769v192.354462a5.198769 5.198769 0 0 1-5.198769 5.198769zM486.163692 488.369231h36.391385V306.254769h-36.391385z" fill="" p-id="22984"></path><path d="M504.438154 222.916923m-48.679385 0a48.679385 48.679385 0 1 0 97.358769 0 48.679385 48.679385 0 1 0-97.358769 0Z" fill="" p-id="22985"></path><path d="M899.544615 398.729846a48.836923 48.836923 0 0 0-48.836923 48.836923v129.024a48.836923 48.836923 0 0 0-81.762461-22.528L597.700923 724.676923a145.723077 145.723077 0 0 0-43.008 103.660308v160.216615h212.676923l150.606769-276.795077a250.171077 250.171077 0 0 0 30.247385-119.099077v-145.092923a48.836923 48.836923 0 0 0-48.679385-48.836923zM426.299077 724.676923L255.054769 554.220308A48.836923 48.836923 0 0 0 173.292308 576.590769v-129.024a48.836923 48.836923 0 1 0-97.673846 0v145.092923a250.013538 250.013538 0 0 0 30.247384 119.099077l150.606769 276.795077h212.676923V829.124923A145.723077 145.723077 0 0 0 426.299077 724.676923z" fill="#FFD29F" p-id="22986"></path><path d="M899.544615 381.085538a66.638769 66.638769 0 0 0-66.48123 66.481231v81.447385a66.481231 66.481231 0 0 0-76.563693 12.603077L585.255385 712.861538a163.367385 163.367385 0 0 0-48.20677 116.263385v159.428923a17.801846 17.801846 0 0 0 17.801847 17.801846h60.494769a17.801846 17.801846 0 1 0 0-35.446154h-42.850462v-141.784615a128.078769 128.078769 0 0 1 37.809231-91.214769L781.390769 567.138462a31.507692 31.507692 0 0 1 43.953231 0 26.308923 26.308923 0 0 1 7.561846 12.445538 48.521846 48.521846 0 0 1 0 17.329231 31.507692 31.507692 0 0 1-8.034461 14.020923L654.257231 781.863385a66.323692 66.323692 0 0 0-19.534769 47.261538 17.801846 17.801846 0 0 0 35.446153 0 31.507692 31.507692 0 0 1 9.137231-22.212923L850.707692 635.667692a66.481231 66.481231 0 0 0 17.959385-60.967384v-127.133539a31.507692 31.507692 0 1 1 62.070154 0v145.092923a232.369231 232.369231 0 0 1-28.199385 110.276923L756.184615 970.909538h-38.281846a17.801846 17.801846 0 1 0 0 35.446154h49.624616a17.644308 17.644308 0 0 0 15.753846-9.294769l150.606769-276.795077a267.815385 267.815385 0 0 0 32.452923-127.606154v-145.092923a66.638769 66.638769 0 0 0-66.796308-66.481231zM438.744615 712.861538L267.815385 541.617231a66.481231 66.481231 0 0 0-76.563693-12.603077v-81.447385a66.481231 66.481231 0 1 0-133.12 0v145.092923a267.815385 267.815385 0 0 0 32.452923 127.606154l150.449231 276.795077a17.644308 17.644308 0 0 0 15.753846 9.294769h49.624616a17.801846 17.801846 0 1 0 0-35.446154H267.815385l-145.565539-267.815384a232.369231 232.369231 0 0 1-28.199384-110.276923v-145.250462a31.507692 31.507692 0 1 1 62.070153 0v127.133539A66.481231 66.481231 0 0 0 173.292308 635.667692l171.401846 171.244308a31.507692 31.507692 0 0 1 9.137231 22.212923 17.801846 17.801846 0 0 0 35.446153 0 66.481231 66.481231 0 0 0-19.534769-47.261538L198.656 610.619077A31.507692 31.507692 0 1 1 242.609231 567.138462l171.086769 170.771692a128.078769 128.078769 0 0 1 37.809231 91.214769v141.784615h-42.850462a17.801846 17.801846 0 0 0 0 35.446154h60.494769a17.801846 17.801846 0 0 0 17.801847-17.644307V829.124923a163.367385 163.367385 0 0 0-48.20677-116.263385zM537.363692 327.837538h-65.851077a18.274462 18.274462 0 0 1 0-36.391384h65.851077a18.274462 18.274462 0 0 1 0 36.391384zM537.363692 501.129846h-65.851077a18.274462 18.274462 0 0 1 0-36.391384h65.851077a18.274462 18.274462 0 0 1 0 36.391384z" fill="" p-id="22987"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/help.svg b/app/resources/icons/help.svg deleted file mode 100644 index f25aa98..0000000 --- a/app/resources/icons/help.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702562909327" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="27021" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><path d="M942.08 1024H81.92A81.92 81.92 0 0 1 0 942.08V81.92A81.92 81.92 0 0 1 81.92 0h860.16A81.92 81.92 0 0 1 1024 81.92v860.16A81.92 81.92 0 0 1 942.08 1024zM81.92 68.498286a13.421714 13.421714 0 0 0-13.458286 13.421714v860.16c0 7.424 6.034286 13.421714 13.458286 13.421714h860.16a13.458286 13.458286 0 0 0 13.421714-13.421714V81.92a13.458286 13.458286 0 0 0-13.421714-13.421714H81.92z" fill="#C50935" p-id="27022"></path><path d="M452.388571 607.085714c-2.194286-22.820571-1.097143-42.24 3.291429-58.258285 4.388571-16.018286 10.386286-29.842286 18.066286-41.472 7.68-11.629714 16.457143-21.723429 26.331428-30.281143 9.874286-8.557714 19.090286-16.822857 27.648-24.685715a137.874286 137.874286 0 0 0 21.394286-24.685714c5.705143-8.557714 8.557714-18.761143 8.557714-30.610286 0-15.36-4.278857-27.648-12.8-36.864-8.594286-9.216-23.844571-13.824-45.787428-13.824-7.021714 0-14.482286 0.731429-22.381715 2.304a159.195429 159.195429 0 0 0-23.698285 6.582858 191.707429 191.707429 0 0 0-42.130286 21.394285l-32.914286-63.195428c16.676571-11.410286 35.876571-20.845714 57.6-28.306286 21.723429-7.460571 47.945143-11.190857 78.665143-11.190857 41.252571 0 73.508571 9.984 96.768 29.952 23.259429 19.968 34.889143 46.811429 34.889143 80.64 0 22.381714-2.925714 40.923429-8.886857 55.588571a135.497143 135.497143 0 0 1-22.052572 37.558857c-8.777143 10.313143-18.432 19.382857-28.964571 27.318858a249.490286 249.490286 0 0 0-28.964571 25.344c-8.777143 8.996571-16.237714 19.382857-22.381715 31.268571-6.144 11.849143-9.216 26.989714-9.216 45.421714H452.388571z m-13.165714 93.476572c0-15.36 4.790857-27.538286 14.445714-36.571429 9.654857-8.96 22.381714-13.458286 38.180572-13.458286 16.676571 0 29.842286 4.498286 39.497143 13.494858 9.654857 8.996571 14.482286 21.174857 14.482285 36.534857 0 15.36-4.827429 27.648-14.482285 36.864s-22.820571 13.824-39.497143 13.824c-15.798857 0-28.525714-4.608-38.180572-13.824s-14.482286-21.504-14.482285-36.864z" fill="#5584FF" p-id="27023"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/home.svg b/app/resources/icons/home.svg deleted file mode 100644 index 0f1c8de..0000000 --- a/app/resources/icons/home.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702562226298" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12795" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M384 128V16h-128v112" fill="#D73636" p-id="12796"></path><path d="M336 128V16h-80v112" fill="#F73B2F" p-id="12797"></path><path d="M48 416v528h928V416" fill="#FFE183" p-id="12798"></path><path d="M976 416v528h-64V480H48v-64h928z" fill="#D9BF6F" p-id="12799"></path><path d="M577.408 352H16v64h488.288" fill="#F73B2F" p-id="12800"></path><path d="M833.232 416H1008v-64H768.784" fill="#F73B2F" p-id="12801"></path><path d="M368 656a96.048 96.048 0 0 0-28.112-67.888A96 96 0 0 0 176 656v96h192v-96z" fill="#FFFFFF" p-id="12802"></path><path d="M320 592h32v160h-32z" fill="#D9D9D9" p-id="12803"></path><path d="M256 352v64c0 12.736-5.056 24.944-14.064 33.936a47.936 47.936 0 0 1-67.872 0A47.936 47.936 0 0 1 160 416v-64H32L128 128h18.736a48.032 48.032 0 0 1 90.528 0h201.408A80.048 80.048 0 0 1 512 80a80.048 80.048 0 0 1 72.32 45.792A63.712 63.712 0 0 1 624 112c16.208 0 31.024 6.048 42.32 16h49.824A71.92 71.92 0 0 1 776 96c24.944 0 46.944 12.704 59.856 32H896l96 224H400v56a40 40 0 1 1-80 0V352h-64z" fill="#CBE9EA" p-id="12804"></path><path d="M896 128l96 224H416c324.768 19.904 531.216-28.112 480-224z" fill="#ADC6C7" p-id="12805"></path><path d="M496 528l176-176 176 176v352H496V528" fill="#FFD140" p-id="12806"></path><path d="M464 880h416v64H464z" fill="#5AB947" p-id="12807"></path><path d="M768 656a96.048 96.048 0 0 0-28.112-67.888 96.048 96.048 0 0 0-135.776 0A96.048 96.048 0 0 0 576 656v224h192V656z" fill="#D73636" p-id="12808"></path><path d="M648 563.44a92.4 92.4 0 0 1 43.888 24.672A96.048 96.048 0 0 1 720 656v224h-144V656c0-25.456 10.112-49.872 28.112-67.888a92.4 92.4 0 0 1 43.888-24.672z" fill="#F73B2F" p-id="12809"></path><path d="M496 528v64l176-176 144 144v320h32V512L672 352 496 528z" fill="#D9B236" p-id="12810"></path><path d="M640 720m-16 0a16 16 0 1 0 32 0 16 16 0 1 0-32 0Z" fill="#F73B2F" p-id="12811"></path><path d="M672.064 261.584v-0.016l242.624 234.688a32 32 0 0 1 0.768 45.232l-0.016 0.016a32 32 0 0 1-45.248 0.784L672.064 350.96 474.496 541.744a31.936 31.936 0 0 1-45.248-0.8l-0.016-0.016a32 32 0 0 1 0.768-45.232l242.064-234.112z" fill="#F73B2F" p-id="12812"></path><path d="M40.32 960.784A104.064 104.064 0 0 1 136 816a103.68 103.68 0 0 1 71.6 28.592 79.584 79.584 0 0 0 71.312 20.864A108.944 108.944 0 0 1 296 864c48.576 0 88 39.424 88 88" fill="#CBE9EA" p-id="12813"></path><path d="M16 944h992v64H16z" fill="#5AB947" p-id="12814"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/home0.svg b/app/resources/icons/home0.svg deleted file mode 100644 index 8fc8a77..0000000 --- a/app/resources/icons/home0.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1701352359188" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7279" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M96 480c-9.6 0-19.2-3.2-25.6-12.8-12.8-12.8-9.6-35.2 3.2-44.8l377.6-310.4c35.2-25.6 86.4-25.6 118.4 0l377.6 307.2c12.8 9.6 16 32 3.2 44.8-12.8 12.8-32 16-44.8 3.2L531.2 166.4c-9.6-6.4-28.8-6.4-38.4 0L115.2 473.6c-6.4 6.4-12.8 6.4-19.2 6.4zM816 928H608c-19.2 0-32-12.8-32-32v-150.4c0-22.4-38.4-44.8-67.2-44.8-28.8 0-64 19.2-64 44.8V896c0 19.2-12.8 32-32 32H211.2C163.2 928 128 892.8 128 848V544c0-19.2 12.8-32 32-32s32 12.8 32 32v304c0 9.6 6.4 16 19.2 16H384v-118.4c0-64 67.2-108.8 128-108.8s131.2 44.8 131.2 108.8V864h176c9.6 0 16 0 16-19.2V544c0-19.2 12.8-32 32-32s32 12.8 32 32v304C896 896 864 928 816 928z" fill="#666666" p-id="7280"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/html.svg b/app/resources/icons/html.svg deleted file mode 100644 index c03b322..0000000 --- a/app/resources/icons/html.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1698328353112" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5767" - width="16" height="16"> - <path d="M112 16h736v992H112z" fill="#AED796" p-id="5768"></path> - <path d="M392.176 846.08c8.032 4.544 18.208 2.032 22.704-5.616l159.344-256.496c4.496-7.648 1.648-17.504-6.384-22.048s-18.208-2.032-22.704 5.616l-159.344 256.496c-4.512 7.632-1.648 17.504 6.384 22.048z m204.416-50.672a15.84 15.84 0 0 0 22.464 0l79.344-79.344c0.336-0.288 0.752-0.384 1.056-0.704a15.776 15.776 0 0 0 4.592-11.52 15.808 15.808 0 0 0-4.656-11.264c-0.224-0.224-0.512-0.304-0.752-0.496l-79.552-79.552a15.872 15.872 0 1 0-22.464 22.464l68.944 68.944-68.992 68.992a15.888 15.888 0 0 0 0.016 22.48zM261.6 716.064l79.328 79.344a15.84 15.84 0 0 0 22.464 0 15.84 15.84 0 0 0 0-22.464L294.4 703.952l68.944-68.944a15.872 15.872 0 1 0-22.464-22.464l-79.552 79.552c-0.224 0.208-0.528 0.288-0.736 0.496a15.744 15.744 0 0 0-4.656 11.264 15.808 15.808 0 0 0 4.592 11.52c0.32 0.288 0.736 0.4 1.072 0.688zM896 128h-32V32a32 32 0 0 0-32-32H128a32 32 0 0 0-32 32v960a32 32 0 0 0 32 32h704a32 32 0 0 0 32-32V416h32a32 32 0 0 0 32-32V160a32 32 0 0 0-32-32z m-64 0H352a32 32 0 0 0-32 32v224a32 32 0 0 0 32 32h480v576H128V32h704v96z" - fill="#2B3139" p-id="5769"></path> - <path d="M352 160h544v224H352z" fill="#FFFFFF" p-id="5770"></path> - <path d="M387.696 213.824h35.184v39.664h32.944v-39.664h35.184V328h-35.184v-45.264H422.88V328h-35.184v-114.176zM535.856 243.088h-31.984v-29.264h99.136v29.264h-31.984V328h-35.168v-84.912zM615.872 213.824h50.048l16.32 67.168h0.32l16.32-67.168h50.064V328H715.68v-73.248h-0.336l-19.84 73.248H669.28l-19.824-73.248h-0.336V328h-33.248v-114.176zM767.056 213.824h35.184v84.912h50.528V328h-85.712v-114.176z" - fill="#2B3139" p-id="5771"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/loading.svg b/app/resources/icons/loading.svg deleted file mode 100644 index 4434114..0000000 --- a/app/resources/icons/loading.svg +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1700658396719" class="icon" viewBox="0 0 2461 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7680" - width="307.625" height="128"> - <path d="M359.298246 215.578947h1760.561403c79.045614 0 143.719298 64.673684 143.719298 143.719299v287.438596c0 79.045614-64.673684 143.719298-143.719298 143.719298H359.298246c-79.045614 0-143.719298-64.673684-143.719299-143.719298V359.298246c0-79.045614 64.673684-143.719298 143.719299-143.719299z" - fill="#13227a" opacity=".597" p-id="7681"></path> - <path d="M1045.557895 388.042105h30.540351v176.056141h98.807017V592.842105h-131.143859V388.042105zM1196.463158 519.185965c0-16.168421 1.796491-26.947368 3.592982-35.929825 1.796491-7.185965 7.185965-14.37193 12.575439-19.761403 3.592982-5.389474 8.982456-8.982456 16.168421-12.575439 7.185965-3.592982 16.168421-5.389474 26.947368-5.389473s21.557895 1.796491 28.74386 5.389473c7.185965 3.592982 12.575439 8.982456 16.168421 12.575439 5.389474 5.389474 10.778947 12.575439 12.575439 19.761403 1.796491 8.982456 3.592982 19.761404 3.592982 35.929825s-1.796491 26.947368-3.592982 35.929824c-1.796491 7.185965-7.185965 14.37193-12.575439 21.557895l-7.185965 7.185965c-1.796491 1.796491-5.389474 3.592982-8.982456 5.389474-7.185965 3.592982-16.168421 5.389474-28.74386 7.185965-10.778947 0-19.761404-1.796491-26.947368-7.185965-7.185965-3.592982-12.575439-7.185965-16.168421-12.575439-5.389474-5.389474-8.982456-12.575439-12.575439-21.557895-3.592982-8.982456-3.592982-19.761404-3.592982-35.929824z m89.824561 1.796491c0-10.778947 0-17.964912-1.796491-23.354386-1.796491-5.389474-3.592982-8.982456-5.389474-12.575438-1.796491-3.592982-5.389474-5.389474-8.982456-7.185965-3.592982-1.796491-8.982456-3.592982-14.37193-3.592983-5.389474 0-8.982456 1.796491-14.371929 3.592983-3.592982 1.796491-7.185965 3.592982-8.982457 7.185965-1.796491 3.592982-3.592982 7.185965-5.389473 12.575438-1.796491 5.389474-1.796491 12.575439-1.796491 21.557895 0 10.778947 0 17.964912 1.796491 21.557895 1.796491 5.389474 3.592982 8.982456 5.389473 12.575438 1.796491 3.592982 5.389474 5.389474 8.982457 7.185965 3.592982 1.796491 8.982456 3.592982 14.371929 3.592983 5.389474 0 10.778947-1.796491 14.37193-3.592983 3.592982-1.796491 7.185965-5.389474 8.982456-7.185965 3.592982-3.592982 5.389474-7.185965 5.389474-12.575438 1.796491-3.592982 1.796491-10.778947 1.796491-19.761404zM1422.821053 580.266667c-3.592982 5.389474-7.185965 8.982456-12.575439 10.778947-5.389474 1.796491-12.575439 3.592982-23.354386 3.592982-16.168421 0-28.74386-3.592982-37.726316-12.575438-8.982456-8.982456-14.37193-17.964912-14.37193-32.336842 0-12.575439 3.592982-21.557895 12.575439-30.540351 7.185965-8.982456 19.761404-12.575439 35.929825-12.575439h41.319298v-16.168421c0-12.575439-8.982456-19.761404-30.540351-17.964912-7.185965 0-12.575439 0-17.964912 1.796491-3.592982 1.796491-7.185965 5.389474-10.778948 8.982456l-23.354386-17.964912c10.778947-14.37193 26.947368-21.557895 48.505264-21.557895 17.964912 0 32.336842 3.592982 43.115789 10.778948 10.778947 7.185965 16.168421 19.761404 16.168421 37.726315V592.842105h-28.74386v-12.575438z m0-48.505263h-35.929825c-16.168421 0-25.150877 5.389474-25.150877 17.964912 0 5.389474 1.796491 8.982456 7.185965 12.575438 3.592982 3.592982 10.778947 5.389474 21.557895 5.389474 12.575439 0 21.557895-1.796491 25.150877-3.592982 5.389474-3.592982 7.185965-10.778947 7.185965-21.557895v-10.778947zM1577.319298 576.673684c-8.982456 10.778947-21.557895 16.168421-37.726316 16.168421-8.982456 0-16.168421-1.796491-23.354386-5.389473-7.185965-3.592982-12.575439-7.185965-16.168421-14.37193-3.592982-5.389474-7.185965-10.778947-7.185964-17.964913-1.796491-5.389474-1.796491-17.964912-1.796492-35.929824s0-30.540351 1.796492-37.726316c1.796491-7.185965 3.592982-14.37193 7.185964-17.964912 8.982456-12.575439 21.557895-17.964912 39.522807-19.761404 7.185965 0 14.37193 1.796491 21.557895 5.389474 5.389474 3.592982 10.778947 7.185965 16.168421 12.575439v-73.656141h28.74386V592.842105h-28.74386v-16.168421z m-28.743859-102.4c-7.185965 0-12.575439 1.796491-16.168421 3.592983-3.592982 1.796491-7.185965 5.389474-8.982457 10.778947-1.796491 3.592982-3.592982 8.982456-3.592982 14.37193v32.336842c0 5.389474 1.796491 10.778947 3.592982 14.37193 1.796491 3.592982 5.389474 7.185965 8.982457 10.778947 3.592982 1.796491 8.982456 3.592982 16.168421 3.592983s12.575439-1.796491 16.168421-3.592983c3.592982-3.592982 7.185965-5.389474 8.982456-10.778947 1.796491-3.592982 3.592982-8.982456 3.592982-14.37193v-16.168421-16.168421c0-5.389474-1.796491-10.778947-3.592982-14.37193-1.796491-3.592982-3.592982-7.185965-8.982456-10.778947-3.592982-1.796491-8.982456-3.592982-16.168421-3.592983zM1640.196491 388.042105h28.74386v28.74386h-28.74386v-28.74386z m0 59.284211h28.74386V592.842105h-28.74386v-145.515789zM1708.463158 447.326316h28.74386v16.168421c8.982456-10.778947 21.557895-17.964912 37.726315-17.964912 12.575439 0 23.354386 3.592982 32.336842 12.575438 10.778947 8.982456 14.37193 21.557895 16.168421 37.726316V592.842105h-28.743859v-86.231579c0-10.778947-3.592982-17.964912-8.982456-23.354386-5.389474-5.389474-12.575439-8.982456-19.761404-8.982456s-16.168421 3.592982-21.557895 8.982456c-5.389474 5.389474-8.982456 12.575439-8.982456 23.354386V592.842105H1706.666667v-145.515789zM1943.803509 576.673684c-8.982456 10.778947-21.557895 16.168421-37.726316 16.168421-8.982456 0-17.964912-1.796491-23.354386-5.389473-7.185965-3.592982-10.778947-7.185965-14.37193-12.575439-3.592982-5.389474-7.185965-10.778947-8.982456-17.964912-1.796491-7.185965-1.796491-19.761404-1.796491-39.522807s0-32.336842 1.796491-39.522807c1.796491-7.185965 3.592982-12.575439 8.982456-17.964913 3.592982-5.389474 8.982456-8.982456 14.37193-12.575438 5.389474-3.592982 14.37193-5.389474 23.354386-5.389474 14.37193 0 26.947368 5.389474 37.726316 17.964912v-16.168421h28.743859v141.922807c0 21.557895-7.185965 37.726316-19.761403 48.505264-12.575439 10.778947-26.947368 16.168421-44.912281 16.168421-19.761404 0-35.929825-8.982456-50.301754-25.150878l23.354386-17.964912c3.592982 3.592982 7.185965 7.185965 12.575438 8.982456 5.389474 3.592982 10.778947 3.592982 16.168421 3.592983 10.778947 0 17.964912-3.592982 23.354386-8.982456 5.389474-5.389474 8.982456-12.575439 8.982457-23.354386v-10.778948zM1886.315789 520.982456c0 10.778947 0 17.964912 1.796492 23.354386 0 3.592982 1.796491 7.185965 5.389473 10.778947 1.796491 1.796491 5.389474 5.389474 8.982457 7.185965 3.592982 1.796491 8.982456 3.592982 14.371929 3.592983 5.389474 0 10.778947-1.796491 14.37193-3.592983 3.592982-1.796491 7.185965-5.389474 8.982456-7.185965l5.389474-10.778947V520.982456v-23.354386c0-3.592982-1.796491-7.185965-5.389474-10.778947-1.796491-1.796491-5.389474-5.389474-8.982456-7.185965-3.592982-1.796491-8.982456-3.592982-14.37193-3.592983-5.389474 0-10.778947 1.796491-14.371929 3.592983-3.592982 1.796491-7.185965 5.389474-8.982457 7.185965-1.796491 3.592982-3.592982 5.389474-5.389473 10.778947 0 3.592982-1.796491 10.778947-1.796492 23.354386z" - fill="#13227a" p-id="7682"></path> - <path d="M503.017544 718.596491c-10.778947 0-17.964912-7.185965-17.964912-17.964912s7.185965-17.964912 17.964912-17.964912c93.417544 0 170.666667-77.249123 170.666667-170.666667S596.435088 341.333333 503.017544 341.333333c-10.778947 0-17.964912-7.185965-17.964912-17.964912s7.185965-17.964912 17.964912-17.964912c113.178947 0 206.596491 93.417544 206.596491 206.596491S616.196491 718.596491 503.017544 718.596491z" - fill="#13227a" p-id="7683"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/logo.png b/app/resources/icons/logo.png deleted file mode 100644 index 03d3e52..0000000 Binary files a/app/resources/icons/logo.png and /dev/null differ diff --git a/app/resources/icons/logo.svg b/app/resources/icons/logo.svg deleted file mode 100644 index 5b75a88..0000000 --- a/app/resources/icons/logo.svg +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1698592095496" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5243" - width="16" height="16"> - <path d="M217.9 356.5c-14.1 0-25.5 11.4-25.5 25.5s11.4 25.5 25.5 25.5 25.5-11.4 25.5-25.5-11.4-25.5-25.5-25.5zM217.4 433.7c-11.2 0-20.4 9.2-20.4 20.4v174.4c0 11.2 9.2 20.4 20.4 20.4s20.4-9.2 20.4-20.4V454.1c0-11.2-9.2-20.4-20.4-20.4z" - fill="#6B400D" p-id="5244"></path> - <path d="M878.7 379.5v-86c0-96.3-57.5-153.7-153.7-153.7H218c-96.3 0-153.7 57.5-153.7 153.7v320.7C64.3 710.5 121.8 768 218 768h45.8v120.4L449.9 768h11.2c17.2 11.3 39 17.5 64.6 17.5h161.6l130.7 85v-85.1h33.5c66.6 0 107.9-41.3 107.9-107.9V484.8c-0.1-56.9-30.3-95.3-80.7-105.3zM417.8 484.8v192.8c0 16.2 2.5 31 7.2 44l-106.1 70.1v-74.9h-101c-67.7-0.3-102.2-34.8-102.5-102.5V293.5c0.3-67.7 34.8-102.2 102.5-102.5H725c67.7 0.3 102.2 34.8 102.5 102.5v83.3H525.7c-66.5 0.1-107.9 41.4-107.9 108z m490.4 192.7c-0.2 38.6-18.2 56.6-56.7 56.7h-87.2v40.3l-61-40.3H525.7c-38.5-0.2-56.6-18.2-56.7-56.7V484.8c0.2-38.6 18.2-56.6 56.7-56.7h325.7c38.5 0.2 56.6 18.2 56.7 56.7v192.7z" - fill="#6B400D" p-id="5245"></path> - <path d="M851.4 428.1H525.7c-38.5 0.2-56.6 18.2-56.7 56.7v192.8c0.2 38.5 18.2 56.6 56.7 56.7h177.5l61 40.3v-40.3h87.2c38.5-0.2 56.6-18.2 56.7-56.7V484.8c-0.1-38.6-18.1-56.6-56.7-56.7zM567 627.4c-21.1 0-38.3-17.2-38.3-38.3 0-21.1 17.2-38.3 38.3-38.3 21.1 0 38.3 17.2 38.3 38.3 0 21.1-17.2 38.3-38.3 38.3z m122.2 0c-21.1 0-38.3-17.2-38.3-38.3 0-21.1 17.2-38.3 38.3-38.3 21.1 0 38.3 17.2 38.3 38.3 0 21.1-17.2 38.3-38.3 38.3z m122.3 0c-21.1 0-38.3-17.2-38.3-38.3 0-21.1 17.2-38.3 38.3-38.3 21.1 0 38.3 17.2 38.3 38.3 0 21.1-17.2 38.3-38.3 38.3z" - fill="#FFD524" p-id="5246"></path> - <path d="M567 550.8c-21.1 0-38.3 17.2-38.3 38.3 0 21.1 17.2 38.3 38.3 38.3 21.1 0 38.3-17.2 38.3-38.3 0-21.1-17.2-38.3-38.3-38.3zM689.2 550.8c-21.1 0-38.3 17.2-38.3 38.3 0 21.1 17.2 38.3 38.3 38.3 21.1 0 38.3-17.2 38.3-38.3 0-21.1-17.2-38.3-38.3-38.3zM811.5 550.8c-21.1 0-38.3 17.2-38.3 38.3 0 21.1 17.2 38.3 38.3 38.3 21.1 0 38.3-17.2 38.3-38.3 0-21.1-17.2-38.3-38.3-38.3z" - fill="#6B400D" p-id="5247"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/logo3.0.ico b/app/resources/icons/logo3.0.ico deleted file mode 100644 index 3b2ecae..0000000 Binary files a/app/resources/icons/logo3.0.ico and /dev/null differ diff --git a/app/resources/icons/logo99.png b/app/resources/icons/logo99.png deleted file mode 100644 index a57fa48..0000000 Binary files a/app/resources/icons/logo99.png and /dev/null differ diff --git a/app/resources/icons/man.svg b/app/resources/icons/man.svg deleted file mode 100644 index 2fd05d0..0000000 --- a/app/resources/icons/man.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1704295160809" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4268" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M922.344176 152.209186v-0.050575c0-0.765851-0.0867-1.517251-0.130051-2.283101-0.036125-0.67915-0.04335-1.365526-0.108375-2.037452-0.0867-0.794751-0.2312-1.553376-0.36125-2.333676-0.07225-0.455175-0.122825-0.917576-0.209525-1.379976l-0.04335-0.296226-0.050575-0.281775c-0.15895-0.794751-0.397375-1.553376-0.599676-2.333677-0.15895-0.6069-0.289-1.228251-0.469625-1.820701-0.2601-0.816426-0.585225-1.618401-0.888676-2.420377l-0.27455-0.758625-0.166175-0.455176-0.13005-0.325125c-0.354025-0.830876-0.758626-1.625626-1.163226-2.427602-0.223975-0.455175-0.41905-0.917576-0.6647-1.358301-0.4335-0.801976-0.924801-1.553376-1.401651-2.319226-0.1445-0.223975-0.267325-0.4624-0.411826-0.671926-0.0867-0.13005-0.151725-0.267325-0.238425-0.397375l-0.1156-0.1734c-0.50575-0.751401-1.062076-1.445001-1.611176-2.153052-0.30345-0.39015-0.578-0.801976-0.888676-1.184901-0.556325-0.6647-1.163226-1.293276-1.755676-1.929076-0.354025-0.382925-0.67915-0.780301-1.040401-1.141551l-0.065025-0.065025-0.01445-0.021675-0.07225-0.0578c-0.527425-0.527425-1.098201-1.004276-1.668976-1.510026-0.426275-0.3757-0.823651-0.780301-1.271601-1.148776-0.599675-0.4913-1.249926-0.932026-1.878501-1.401651-0.484075-0.36125-0.953701-0.744176-1.452226-1.083751a5.086404 5.086404 0 0 1-0.332351-0.2023l-0.53465-0.310675a26.70362 26.70362 0 0 0-1.141551-0.693601c-0.5202-0.3179-1.025951-0.657475-1.567826-0.9537-0.67915-0.368475-1.394426-0.671925-2.095252-1.004276-0.56355-0.267325-1.112651-0.570775-1.690651-0.809201-0.151725-0.07225-0.325125-0.122825-0.4913-0.180625-0.18785-0.079475-0.39015-0.137275-0.578001-0.223975l-1.018725-0.368475c-0.628575-0.223975-1.242701-0.484075-1.892952-0.693601-0.643025-0.18785-1.307726-0.325125-1.965201-0.4913-0.729726-0.195075-1.445001-0.41905-2.189177-0.563551-0.151725-0.036125-0.310675-0.036125-0.4624-0.065025l-0.426275-0.07225c-0.527425-0.10115-1.069301-0.166175-1.618402-0.238425-0.599675-0.093925-1.184901-0.21675-1.784576-0.281775a42.772031 42.772031 0 0 0-4.428928-0.223975h-0.151725l-343.079377 1.235476a43.350032 43.350032 0 0 0 0.151726 86.700063h0.151725l238.417949-0.867-156.76094 157.895265c-53.710689-42.179581-121.170564-67.467099-194.150342-67.467099l-4.219403 0.021675c-174.093728 2.290327-313.85423 145.786157-311.563903 319.858209 2.261427 171.817851 143.849855 311.592803 315.631581 311.592803l4.219403-0.0289c84.330262-1.105426 163.18397-34.983476 222.031638-95.39897 58.854893-60.415494 90.644916-140.136203 89.532265-224.452014-0.881451-67.82835-23.553517-130.613646-61.159669-181.831708l157.61349-158.747816V495.418613a43.350032 43.350032 0 0 0 86.700064 0V152.346462v-0.050575-0.086701zM577.198448 751.978551c-39.990404 41.06693-93.585494 64.085797-150.901461 64.844422l-2.890002 0.01445c-116.73441 0-212.957031-95.001595-214.495957-211.77213C207.357652 486.748607 302.352021 389.23271 420.668708 387.672109l2.890002-0.007225c116.741636 0 212.971481 94.99437 214.488732 211.779355 0.758626 57.301517-20.851365 111.474607-60.848994 152.534312z" fill="#1296db" p-id="4269"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/myinfo.svg b/app/resources/icons/myinfo.svg deleted file mode 100644 index a53c9cf..0000000 --- a/app/resources/icons/myinfo.svg +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1699701710499" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7220" - width="16" height="16"> - <path d="M956 807.2 657.6 807.2c-16.8 0-29.6-13.6-29.6-29.6 0-16.8 13.6-29.6 29.6-29.6l299.2 0c16.8 0 29.6 13.6 29.6 29.6C986.4 793.6 972.8 807.2 956 807.2zM956 627.2 657.6 627.2c-16.8 0-29.6-13.6-29.6-29.6 0-16.8 13.6-29.6 29.6-29.6l299.2 0c16.8 0 29.6 13.6 29.6 29.6C986.4 614.4 972.8 627.2 956 627.2zM508 564.8 508 568c-198.4 0-358.4 173.6-358.4 388.8 0 10.4 0.8 20 1.6 29.6l-1.6 0L31.2 986.4c-0.8-9.6-1.6-20-1.6-29.6 0-201.6 110.4-375.2 270.4-456.8-55.2-49.6-91.2-120-91.2-200 0-148.8 120.8-268.8 268.8-268.8 148.8 0 268.8 120.8 268.8 268.8C747.2 436.8 642.4 549.6 508 564.8zM478.4 149.6c-82.4 0-149.6 67.2-149.6 149.6S396 448 478.4 448s149.6-67.2 149.6-149.6S560.8 149.6 478.4 149.6zM657.6 926.4l299.2 0c16.8 0 29.6 13.6 29.6 29.6 0 16.8-13.6 29.6-29.6 29.6L657.6 985.6c-16.8 0-29.6-13.6-29.6-29.6C627.2 940 640.8 926.4 657.6 926.4z" - p-id="7221"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/output.svg b/app/resources/icons/output.svg deleted file mode 100644 index 4c5a507..0000000 --- a/app/resources/icons/output.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702562413637" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="21315" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M781.28 425.28v377.12H290.4V445.12c0-10.88 10.88-19.68 24.32-19.68h466.56z" fill="#B3C8FE" p-id="21316"></path><path d="M561.44 361.76h171.2v185.76h48.64V337.44c0-13.44-10.88-24.32-24.32-24.32H533.92l-78.4-88.32c-4.64-5.28-11.2-8.16-18.24-8.16H204.96c-13.44 0-24.32 10.88-24.32 24.32v537.28c0 13.44 10.88 24.32 24.32 24.32h278.08v-48.64H229.28V265.12h197.12l78.4 88.32c4.64 5.28 11.2 8.16 18.24 8.16l38.4 0.16z" fill="#5186F5" p-id="21317"></path><path d="M804.32 695.2l-77.92-77.92-34.4 34.4L728.16 688h-152.32v-95.04h-48.64v119.36c0 13.44 10.88 24.32 24.32 24.32h176.64l-36.32 36.32 34.4 34.4 77.92-77.92c9.6-9.28 9.6-24.8 0.16-34.24z" fill="#5186F5" p-id="21318"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/output0.svg b/app/resources/icons/output0.svg deleted file mode 100644 index d08c4e8..0000000 --- a/app/resources/icons/output0.svg +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1699272892992" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4188" - width="16" height="16"> - <path d="M182.857143 146.285714h360.594286L768 370.834286V438.857143h146.285714V310.125714L604.16 0H36.571429v1024h877.714285v-146.285714H182.857143V146.285714z" - fill="#272536" p-id="4189"></path> - <path d="M987.428571 658.285714l-219.428571-146.285714v73.142857H475.428571v146.285714h292.571429v73.142858l219.428571-146.285715z" - fill="#272536" p-id="4190"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/resources.qrc b/app/resources/icons/resources.qrc deleted file mode 100644 index e9f1bcc..0000000 --- a/app/resources/icons/resources.qrc +++ /dev/null @@ -1,5 +0,0 @@ -<RCC> - <qresource prefix="/icons"> - <file>logo.svg</file> - </qresource> -</RCC> diff --git a/app/resources/icons/resources_rc.py b/app/resources/icons/resources_rc.py deleted file mode 100644 index 86f78aa..0000000 --- a/app/resources/icons/resources_rc.py +++ /dev/null @@ -1,202 +0,0 @@ -# -*- coding: utf-8 -*- - -# Resource object code -# -# Created by: The Resource Compiler for PyQt5 (Qt v5.15.2) -# -# WARNING! All changes made in this file will be lost! - -from PyQt5 import QtCore - -qt_resource_data = b"\ -\x00\x00\x09\x14\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\ -\x72\x61\x70\x68\x69\x63\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\ -\x44\x54\x44\x2f\x73\x76\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\ -\x0a\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x36\x39\x38\x35\x39\x32\ -\x30\x39\x35\x34\x39\x36\x22\x20\x63\x6c\x61\x73\x73\x3d\x22\x69\ -\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ -\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\x22\x20\x76\x65\x72\ -\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x78\x6d\x6c\x6e\x73\ -\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\ -\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x35\x32\x34\x33\x22\x0d\x0a\x20\x20\x20\x20\x20\ -\x77\x69\x64\x74\x68\x3d\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\ -\x74\x3d\x22\x31\x36\x22\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\ -\x74\x68\x20\x64\x3d\x22\x4d\x32\x31\x37\x2e\x39\x20\x33\x35\x36\ -\x2e\x35\x63\x2d\x31\x34\x2e\x31\x20\x30\x2d\x32\x35\x2e\x35\x20\ -\x31\x31\x2e\x34\x2d\x32\x35\x2e\x35\x20\x32\x35\x2e\x35\x73\x31\ -\x31\x2e\x34\x20\x32\x35\x2e\x35\x20\x32\x35\x2e\x35\x20\x32\x35\ -\x2e\x35\x20\x32\x35\x2e\x35\x2d\x31\x31\x2e\x34\x20\x32\x35\x2e\ -\x35\x2d\x32\x35\x2e\x35\x2d\x31\x31\x2e\x34\x2d\x32\x35\x2e\x35\ -\x2d\x32\x35\x2e\x35\x2d\x32\x35\x2e\x35\x7a\x4d\x32\x31\x37\x2e\ -\x34\x20\x34\x33\x33\x2e\x37\x63\x2d\x31\x31\x2e\x32\x20\x30\x2d\ -\x32\x30\x2e\x34\x20\x39\x2e\x32\x2d\x32\x30\x2e\x34\x20\x32\x30\ -\x2e\x34\x76\x31\x37\x34\x2e\x34\x63\x30\x20\x31\x31\x2e\x32\x20\ -\x39\x2e\x32\x20\x32\x30\x2e\x34\x20\x32\x30\x2e\x34\x20\x32\x30\ -\x2e\x34\x73\x32\x30\x2e\x34\x2d\x39\x2e\x32\x20\x32\x30\x2e\x34\ -\x2d\x32\x30\x2e\x34\x56\x34\x35\x34\x2e\x31\x63\x30\x2d\x31\x31\ -\x2e\x32\x2d\x39\x2e\x32\x2d\x32\x30\x2e\x34\x2d\x32\x30\x2e\x34\ -\x2d\x32\x30\x2e\x34\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x36\x42\x34\x30\x30\x44\ -\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x32\x34\x34\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\ -\x20\x64\x3d\x22\x4d\x38\x37\x38\x2e\x37\x20\x33\x37\x39\x2e\x35\ -\x76\x2d\x38\x36\x63\x30\x2d\x39\x36\x2e\x33\x2d\x35\x37\x2e\x35\ -\x2d\x31\x35\x33\x2e\x37\x2d\x31\x35\x33\x2e\x37\x2d\x31\x35\x33\ -\x2e\x37\x48\x32\x31\x38\x63\x2d\x39\x36\x2e\x33\x20\x30\x2d\x31\ -\x35\x33\x2e\x37\x20\x35\x37\x2e\x35\x2d\x31\x35\x33\x2e\x37\x20\ -\x31\x35\x33\x2e\x37\x76\x33\x32\x30\x2e\x37\x43\x36\x34\x2e\x33\ -\x20\x37\x31\x30\x2e\x35\x20\x31\x32\x31\x2e\x38\x20\x37\x36\x38\ -\x20\x32\x31\x38\x20\x37\x36\x38\x68\x34\x35\x2e\x38\x76\x31\x32\ -\x30\x2e\x34\x4c\x34\x34\x39\x2e\x39\x20\x37\x36\x38\x68\x31\x31\ -\x2e\x32\x63\x31\x37\x2e\x32\x20\x31\x31\x2e\x33\x20\x33\x39\x20\ -\x31\x37\x2e\x35\x20\x36\x34\x2e\x36\x20\x31\x37\x2e\x35\x68\x31\ -\x36\x31\x2e\x36\x6c\x31\x33\x30\x2e\x37\x20\x38\x35\x76\x2d\x38\ -\x35\x2e\x31\x68\x33\x33\x2e\x35\x63\x36\x36\x2e\x36\x20\x30\x20\ -\x31\x30\x37\x2e\x39\x2d\x34\x31\x2e\x33\x20\x31\x30\x37\x2e\x39\ -\x2d\x31\x30\x37\x2e\x39\x56\x34\x38\x34\x2e\x38\x63\x2d\x30\x2e\ -\x31\x2d\x35\x36\x2e\x39\x2d\x33\x30\x2e\x33\x2d\x39\x35\x2e\x33\ -\x2d\x38\x30\x2e\x37\x2d\x31\x30\x35\x2e\x33\x7a\x4d\x34\x31\x37\ -\x2e\x38\x20\x34\x38\x34\x2e\x38\x76\x31\x39\x32\x2e\x38\x63\x30\ -\x20\x31\x36\x2e\x32\x20\x32\x2e\x35\x20\x33\x31\x20\x37\x2e\x32\ -\x20\x34\x34\x6c\x2d\x31\x30\x36\x2e\x31\x20\x37\x30\x2e\x31\x76\ -\x2d\x37\x34\x2e\x39\x68\x2d\x31\x30\x31\x63\x2d\x36\x37\x2e\x37\ -\x2d\x30\x2e\x33\x2d\x31\x30\x32\x2e\x32\x2d\x33\x34\x2e\x38\x2d\ -\x31\x30\x32\x2e\x35\x2d\x31\x30\x32\x2e\x35\x56\x32\x39\x33\x2e\ -\x35\x63\x30\x2e\x33\x2d\x36\x37\x2e\x37\x20\x33\x34\x2e\x38\x2d\ -\x31\x30\x32\x2e\x32\x20\x31\x30\x32\x2e\x35\x2d\x31\x30\x32\x2e\ -\x35\x48\x37\x32\x35\x63\x36\x37\x2e\x37\x20\x30\x2e\x33\x20\x31\ -\x30\x32\x2e\x32\x20\x33\x34\x2e\x38\x20\x31\x30\x32\x2e\x35\x20\ -\x31\x30\x32\x2e\x35\x76\x38\x33\x2e\x33\x48\x35\x32\x35\x2e\x37\ -\x63\x2d\x36\x36\x2e\x35\x20\x30\x2e\x31\x2d\x31\x30\x37\x2e\x39\ -\x20\x34\x31\x2e\x34\x2d\x31\x30\x37\x2e\x39\x20\x31\x30\x38\x7a\ -\x20\x6d\x34\x39\x30\x2e\x34\x20\x31\x39\x32\x2e\x37\x63\x2d\x30\ -\x2e\x32\x20\x33\x38\x2e\x36\x2d\x31\x38\x2e\x32\x20\x35\x36\x2e\ -\x36\x2d\x35\x36\x2e\x37\x20\x35\x36\x2e\x37\x68\x2d\x38\x37\x2e\ -\x32\x76\x34\x30\x2e\x33\x6c\x2d\x36\x31\x2d\x34\x30\x2e\x33\x48\ -\x35\x32\x35\x2e\x37\x63\x2d\x33\x38\x2e\x35\x2d\x30\x2e\x32\x2d\ -\x35\x36\x2e\x36\x2d\x31\x38\x2e\x32\x2d\x35\x36\x2e\x37\x2d\x35\ -\x36\x2e\x37\x56\x34\x38\x34\x2e\x38\x63\x30\x2e\x32\x2d\x33\x38\ -\x2e\x36\x20\x31\x38\x2e\x32\x2d\x35\x36\x2e\x36\x20\x35\x36\x2e\ -\x37\x2d\x35\x36\x2e\x37\x68\x33\x32\x35\x2e\x37\x63\x33\x38\x2e\ -\x35\x20\x30\x2e\x32\x20\x35\x36\x2e\x36\x20\x31\x38\x2e\x32\x20\ -\x35\x36\x2e\x37\x20\x35\x36\x2e\x37\x76\x31\x39\x32\x2e\x37\x7a\ -\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\ -\x6c\x3d\x22\x23\x36\x42\x34\x30\x30\x44\x22\x20\x70\x2d\x69\x64\ -\x3d\x22\x35\x32\x34\x35\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\ -\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\ -\x35\x31\x2e\x34\x20\x34\x32\x38\x2e\x31\x48\x35\x32\x35\x2e\x37\ -\x63\x2d\x33\x38\x2e\x35\x20\x30\x2e\x32\x2d\x35\x36\x2e\x36\x20\ -\x31\x38\x2e\x32\x2d\x35\x36\x2e\x37\x20\x35\x36\x2e\x37\x76\x31\ -\x39\x32\x2e\x38\x63\x30\x2e\x32\x20\x33\x38\x2e\x35\x20\x31\x38\ -\x2e\x32\x20\x35\x36\x2e\x36\x20\x35\x36\x2e\x37\x20\x35\x36\x2e\ -\x37\x68\x31\x37\x37\x2e\x35\x6c\x36\x31\x20\x34\x30\x2e\x33\x76\ -\x2d\x34\x30\x2e\x33\x68\x38\x37\x2e\x32\x63\x33\x38\x2e\x35\x2d\ -\x30\x2e\x32\x20\x35\x36\x2e\x36\x2d\x31\x38\x2e\x32\x20\x35\x36\ -\x2e\x37\x2d\x35\x36\x2e\x37\x56\x34\x38\x34\x2e\x38\x63\x2d\x30\ -\x2e\x31\x2d\x33\x38\x2e\x36\x2d\x31\x38\x2e\x31\x2d\x35\x36\x2e\ -\x36\x2d\x35\x36\x2e\x37\x2d\x35\x36\x2e\x37\x7a\x4d\x35\x36\x37\ -\x20\x36\x32\x37\x2e\x34\x63\x2d\x32\x31\x2e\x31\x20\x30\x2d\x33\ -\x38\x2e\x33\x2d\x31\x37\x2e\x32\x2d\x33\x38\x2e\x33\x2d\x33\x38\ -\x2e\x33\x20\x30\x2d\x32\x31\x2e\x31\x20\x31\x37\x2e\x32\x2d\x33\ -\x38\x2e\x33\x20\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x20\x32\x31\ -\x2e\x31\x20\x30\x20\x33\x38\x2e\x33\x20\x31\x37\x2e\x32\x20\x33\ -\x38\x2e\x33\x20\x33\x38\x2e\x33\x20\x30\x20\x32\x31\x2e\x31\x2d\ -\x31\x37\x2e\x32\x20\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x20\x33\ -\x38\x2e\x33\x7a\x20\x6d\x31\x32\x32\x2e\x32\x20\x30\x63\x2d\x32\ -\x31\x2e\x31\x20\x30\x2d\x33\x38\x2e\x33\x2d\x31\x37\x2e\x32\x2d\ -\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x20\x30\x2d\x32\x31\x2e\x31\ -\x20\x31\x37\x2e\x32\x2d\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\x2d\ -\x33\x38\x2e\x33\x20\x32\x31\x2e\x31\x20\x30\x20\x33\x38\x2e\x33\ -\x20\x31\x37\x2e\x32\x20\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\x20\ -\x30\x20\x32\x31\x2e\x31\x2d\x31\x37\x2e\x32\x20\x33\x38\x2e\x33\ -\x2d\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\x7a\x20\x6d\x31\x32\x32\ -\x2e\x33\x20\x30\x63\x2d\x32\x31\x2e\x31\x20\x30\x2d\x33\x38\x2e\ -\x33\x2d\x31\x37\x2e\x32\x2d\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\ -\x20\x30\x2d\x32\x31\x2e\x31\x20\x31\x37\x2e\x32\x2d\x33\x38\x2e\ -\x33\x20\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x20\x32\x31\x2e\x31\ -\x20\x30\x20\x33\x38\x2e\x33\x20\x31\x37\x2e\x32\x20\x33\x38\x2e\ -\x33\x20\x33\x38\x2e\x33\x20\x30\x20\x32\x31\x2e\x31\x2d\x31\x37\ -\x2e\x32\x20\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x20\x33\x38\x2e\ -\x33\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\ -\x69\x6c\x6c\x3d\x22\x23\x46\x46\x44\x35\x32\x34\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x35\x32\x34\x36\x22\x3e\x3c\x2f\x70\x61\x74\x68\ -\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\ -\x4d\x35\x36\x37\x20\x35\x35\x30\x2e\x38\x63\x2d\x32\x31\x2e\x31\ -\x20\x30\x2d\x33\x38\x2e\x33\x20\x31\x37\x2e\x32\x2d\x33\x38\x2e\ -\x33\x20\x33\x38\x2e\x33\x20\x30\x20\x32\x31\x2e\x31\x20\x31\x37\ -\x2e\x32\x20\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\x20\x33\x38\x2e\ -\x33\x20\x32\x31\x2e\x31\x20\x30\x20\x33\x38\x2e\x33\x2d\x31\x37\ -\x2e\x32\x20\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x20\x30\x2d\x32\ -\x31\x2e\x31\x2d\x31\x37\x2e\x32\x2d\x33\x38\x2e\x33\x2d\x33\x38\ -\x2e\x33\x2d\x33\x38\x2e\x33\x7a\x4d\x36\x38\x39\x2e\x32\x20\x35\ -\x35\x30\x2e\x38\x63\x2d\x32\x31\x2e\x31\x20\x30\x2d\x33\x38\x2e\ -\x33\x20\x31\x37\x2e\x32\x2d\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\ -\x20\x30\x20\x32\x31\x2e\x31\x20\x31\x37\x2e\x32\x20\x33\x38\x2e\ -\x33\x20\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\x20\x32\x31\x2e\x31\ -\x20\x30\x20\x33\x38\x2e\x33\x2d\x31\x37\x2e\x32\x20\x33\x38\x2e\ -\x33\x2d\x33\x38\x2e\x33\x20\x30\x2d\x32\x31\x2e\x31\x2d\x31\x37\ -\x2e\x32\x2d\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x2d\x33\x38\x2e\ -\x33\x7a\x4d\x38\x31\x31\x2e\x35\x20\x35\x35\x30\x2e\x38\x63\x2d\ -\x32\x31\x2e\x31\x20\x30\x2d\x33\x38\x2e\x33\x20\x31\x37\x2e\x32\ -\x2d\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\x20\x30\x20\x32\x31\x2e\ -\x31\x20\x31\x37\x2e\x32\x20\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\ -\x20\x33\x38\x2e\x33\x20\x32\x31\x2e\x31\x20\x30\x20\x33\x38\x2e\ -\x33\x2d\x31\x37\x2e\x32\x20\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\ -\x20\x30\x2d\x32\x31\x2e\x31\x2d\x31\x37\x2e\x32\x2d\x33\x38\x2e\ -\x33\x2d\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x7a\x22\x0d\x0a\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\ -\x36\x42\x34\x30\x30\x44\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x32\ -\x34\x37\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x3c\x2f\x73\ -\x76\x67\x3e\ -" - -qt_resource_name = b"\ -\x00\x05\ -\x00\x6f\xa6\x53\ -\x00\x69\ -\x00\x63\x00\x6f\x00\x6e\x00\x73\ -\x00\x08\ -\x05\xe2\x54\xa7\ -\x00\x6c\ -\x00\x6f\x00\x67\x00\x6f\x00\x2e\x00\x73\x00\x76\x00\x67\ -" - -qt_resource_struct_v1 = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -" - -qt_resource_struct_v2 = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x8c\x16\x33\xc3\xa6\ -" - -qt_version = [int(v) for v in QtCore.qVersion().split('.')] -if qt_version < [5, 8, 0]: - rcc_version = 1 - qt_resource_struct = qt_resource_struct_v1 -else: - rcc_version = 2 - qt_resource_struct = qt_resource_struct_v2 - -def qInitResources(): - QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) - -def qCleanupResources(): - QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) - -qInitResources() diff --git a/app/resources/icons/search.svg b/app/resources/icons/search.svg deleted file mode 100644 index 4fde569..0000000 --- a/app/resources/icons/search.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1706191321830" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9915" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M416 192C537.6 192 640 294.4 640 416S537.6 640 416 640 192 537.6 192 416 294.4 192 416 192M416 128C256 128 128 256 128 416S256 704 416 704 704 576 704 416 576 128 416 128L416 128z" fill="#272636" p-id="9916"></path><path d="M832 864c-6.4 0-19.2 0-25.6-6.4l-192-192c-12.8-12.8-12.8-32 0-44.8s32-12.8 44.8 0l192 192c12.8 12.8 12.8 32 0 44.8C851.2 864 838.4 864 832 864z" fill="#272636" p-id="9917"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/select.svg b/app/resources/icons/select.svg deleted file mode 100644 index 6315947..0000000 --- a/app/resources/icons/select.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1704806879008" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8579" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M512 128c211.2 0 384 172.8 384 384s-172.8 384-384 384-384-172.8-384-384 172.8-384 384-384m0-64C262.4 64 64 262.4 64 512s198.4 448 448 448 448-198.4 448-448-198.4-448-448-448z" fill="#1296db" p-id="8580"></path><path d="M448 704c-12.8 0-25.6-6.4-32-12.8L313.6 588.8c-12.8-12.8-12.8-32 0-44.8s32-12.8 44.8 0L448 633.6l275.2-275.2c12.8-12.8 32-12.8 44.8 0 12.8 12.8 12.8 32 0 44.8l-288 288c-6.4 12.8-19.2 12.8-32 12.8z" fill="#1296db" p-id="8581"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/start.svg b/app/resources/icons/start.svg deleted file mode 100644 index 1cbad4e..0000000 --- a/app/resources/icons/start.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702562784487" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="26032" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><path d="M380.677 176.279l390.182 225.272c85.024 49.089 85.024 171.81 0 220.899L380.677 847.721c-85.024 49.089-191.304-12.272-191.304-110.449V286.728c0-98.177 106.28-159.538 191.304-110.449z" fill="#FF7B15" p-id="26033"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/tool.svg b/app/resources/icons/tool.svg deleted file mode 100644 index df7f6b0..0000000 --- a/app/resources/icons/tool.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702562083657" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5392" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M0 0m0 0l1024 0q0 0 0 0l0 1024q0 0 0 0l-1024 0q0 0 0 0l0-1024q0 0 0 0Z" fill="#E8EFF8" p-id="5393"></path><path d="M141.637818 405.643636A23.272727 23.272727 0 0 0 160.814545 442.181818h350.487273a23.272727 23.272727 0 0 0 18.455273-37.469091L364.683636 190.161455a46.545455 46.545455 0 0 0-75.170909 1.88509l-147.874909 213.620364z" fill="#69CB91" p-id="5394"></path><path d="M337.454545 884.363636a174.545455 174.545455 0 1 0 0-349.090909 174.545455 174.545455 0 0 0 0 349.090909z" fill="#247ADE" p-id="5395"></path><path d="M907.636364 186.181818a23.272727 23.272727 0 0 0-23.272728-23.272727h-209.454545a23.272727 23.272727 0 0 0-23.272727 23.272727v674.909091a23.272727 23.272727 0 0 0 23.272727 23.272727h209.454545a23.272727 23.272727 0 0 0 23.272728-23.272727V186.181818z" fill="#A0BFF7" p-id="5396"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/tool0.svg b/app/resources/icons/tool0.svg deleted file mode 100644 index 77e8abd..0000000 --- a/app/resources/icons/tool0.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1701352214618" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4343" width="16" height="16" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M248.768295 434.912297c15.133675 0 29.9358-2.030239 44.261063-5.529947 0.769526 1.051959 1.198292 2.275833 2.153036 3.230578l64.396659 64.396659c4.89345 4.89345 11.30344 7.339152 17.714454 7.339152 6.40999 0 12.821003-2.445702 17.714454-7.339152 9.7869-9.785877 9.7869-25.640983 0-35.427884l-52.420907-52.432163c13.237489-7.829316 25.690102-17.200754 36.859489-28.381397 5.088902-5.088902 9.750061-10.496052 14.165628-16.050558l53.962006 53.949726c4.892427 4.89345 11.30344 7.339152 17.71343 7.339152 6.412037 0 12.821003-2.446725 17.71343-7.339152 9.7869-9.7869 9.7869-25.640983 0-35.427884l-63.135946-63.124689c8.967232-21.922289 13.70207-45.581128 13.713326-69.999261 0-49.348941-19.230993-95.738481-54.132898-130.652665-38.143739-38.143739-90.698698-57.545624-144.757918-53.459562-9.762341 0.733711-18.190291 7.094582-21.592784 16.269545-3.388167 9.175987-1.136893 19.500123 5.786797 26.423813l32.847106 32.859385c14.887059 14.900362 23.096021 34.69315 23.096021 55.758931 0 21.042245-8.208962 40.859593-23.109324 55.759955-29.77514 29.751604-81.742722 29.751604-111.518886 0l-32.847106-32.859385c-6.924713-6.948249-17.23657-9.17394-26.412556-5.773494-9.187243 3.400446-15.536858 11.81714-16.282848 21.578458-4.097318 53.925167 15.378246 106.675578 53.460586 144.770198C153.017534 415.681304 199.41833 434.912297 248.768295 434.912297zM195.957509 326.280158c34.449603 0 66.831105-13.431917 91.186815-37.777395 24.369014-24.369014 37.777395-56.739259 37.789675-91.187839 0-25.176402-7.16826-49.251727-20.515243-69.877487 14.569834 6.581905 27.965935 15.830547 39.599903 27.452235 25.433252 25.445532 39.452547 59.258639 39.452547 95.224782 0 35.967166-14.020318 69.77925-39.452547 95.224782-25.445532 25.445532-59.270918 39.464827-95.249341 39.464827-35.966143 0-69.791529-14.019295-95.224782-39.441291-11.54801-11.54801-20.747533-24.955368-27.329439-39.538505C146.815275 319.134411 170.841481 326.280158 195.957509 326.280158zM902.606721 640.237663c-34.900881-34.889625-81.303724-54.120618-130.651642-54.120618-25.032116 0-49.27731 4.991688-71.66418 14.410198L580.586586 480.860792l201.484897-207.429283c22.790052-14.288424 45.300742-36.236296 50.755987-49.789986 5.65172-14.044878 7.878434-27.916816 4.929266-30.828123-2.933819-2.935865-7.742335-7.756661-10.69048-10.692526s-16.832364-0.733711-30.851659 4.919033c-13.726629 5.553483-36.150338 28.699646-50.426483 51.844785L403.263995 591.499635l-84.361363-8.489348c-7.52437-0.685615-14.729469 1.834788-20.026102 7.020904-18.300808 17.909905-176.210257 178.583305-182.76658 185.263447-41.886993 41.86141-43.99091 92.043323-5.614881 134.24754 18.803251 20.674878 43.049468 31.930223 70.134337 32.56672 0.795109 0 1.602498 0.023536 2.397606 0.023536 31.500435 0 59.992349-14.387685 74.855872-29.287023 62.965054-65.399499 162.178683-167.230746 177.48325-179.684382 10.739599-8.734942 12.355399-24.51637 3.631714-35.232432-8.733918-10.741645-24.538883-12.380982-35.243689-3.620457-22.582321 18.349927-165.713182 166.911474-181.640943 183.450149-6.15314 6.166443-22.680559 15.292288-40.321334 14.241352-13.408381-0.319272-24.613584-5.603625-34.228569-16.173354-13.554714-14.901385-25.360598-35.795251 4.134157-65.253166 1.493004-1.517563 136.084375-138.483005 173.983543-176.528506l84.61719 8.512884c7.695263 0.735757 15.145955-1.981121 20.478404-7.484462l32.945343-33.912367 128.267339 128.255059c-3.083222 13.481036-4.844332 27.330462-4.844332 41.49609 0 49.349965 19.232017 95.738481 54.133921 130.652665 34.814923 34.840506 81.20344 54.022381 130.615826 54.022381 4.709255 0 9.41851-0.170892 14.129812-0.537236 9.761318-0.733711 18.190291-7.096628 21.591761-16.269545 3.40147-9.175987 1.150196-19.501146-5.774517-26.423813l-32.847106-32.859385c-30.742165-30.754444-30.742165-80.789001 0.01228-111.544469 29.777187-29.751604 81.743746-29.751604 111.51991 0l32.847106 32.859385c6.91141 6.92369 17.21201 9.149381 26.411533 5.773494 9.187243-3.400446 15.536858-11.81714 16.282848-21.578458C960.164624 731.082694 940.689061 678.332283 902.606721 640.237663zM498.635109 565.222155l47.038316-48.419779 110.321618 110.296035c-5.089925 4.110621-10.019191 8.465812-14.71719 13.162788-11.584849 11.574616-21.263279 24.51637-29.263487 38.314631L498.635109 565.222155zM824.764841 694.773743c-34.449603 0-66.830081 13.407358-91.186815 37.751812-43.674709 43.674709-49.423643 111.152543-17.22429 161.088862-14.59644-6.605442-28.015054-15.8285-39.649022-27.475771-25.433252-25.445532-39.45357-59.258639-39.45357-95.224782 0-35.966143 14.019295-69.77925 39.45357-95.225805 25.444509-25.444509 59.269895-39.463804 95.250364-39.463804 35.96512 0 69.789483 14.019295 95.223758 39.440267 11.54801 11.54801 20.747533 24.956392 27.329439 39.538505C873.907075 701.892885 849.878822 694.773743 824.764841 694.773743z" fill="#272636" p-id="4344"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/txt.svg b/app/resources/icons/txt.svg deleted file mode 100644 index 512a8a3..0000000 --- a/app/resources/icons/txt.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1702554736273" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4304" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M661.944889 73.144889H146.289778a36.679111 36.679111 0 0 0-36.579556 36.565333v804.579556a36.679111 36.679111 0 0 0 36.579556 36.565333h731.420444a36.679111 36.679111 0 0 0 36.579556-36.565333v-588.8L661.944889 73.144889z" fill="#FCCC5A" p-id="4305"></path><path d="M661.944889 288.910222a36.679111 36.679111 0 0 0 36.565333 36.579556h215.779556L661.944889 73.144889v215.765333z" fill="#FFD980" p-id="4306"></path><path d="M347.434667 420.565333V486.4h118.855111v288.910222h91.420444V486.4h118.855111v-65.834667z" fill="#FFFFFF" p-id="4307"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/unselect.svg b/app/resources/icons/unselect.svg deleted file mode 100644 index 6bbbf96..0000000 --- a/app/resources/icons/unselect.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1704806899964" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9066" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M512 128c211.2 0 384 172.8 384 384S723.2 896 512 896 128 723.2 128 512s172.8-384 384-384m0-64C262.4 64 64 262.4 64 512s198.4 448 448 448 448-198.4 448-448S761.6 64 512 64z" fill="#515151" p-id="9067"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/up.svg b/app/resources/icons/up.svg deleted file mode 100644 index f3b5d91..0000000 --- a/app/resources/icons/up.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1706096206963" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8303" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M936.170667 669.952L534.613333 268.394667a32 32 0 0 0-42.986666-2.069334l-2.282667 2.069334L87.829333 669.952a8.533333 8.533333 0 0 0-2.496 6.037333v66.346667a8.533333 8.533333 0 0 0 14.570667 6.058667l412.074667-412.096 412.117333 412.096a8.533333 8.533333 0 0 0 14.570667-6.037334v-66.346666a8.533333 8.533333 0 0 0-2.496-6.058667z" fill="#333333" p-id="8304"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/update.svg b/app/resources/icons/update.svg deleted file mode 100644 index 6eb22e7..0000000 --- a/app/resources/icons/update.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1706094276810" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5249" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><path d="M549.546667 320v176.64l124.586666 124.586667a21.333333 21.333333 0 0 1 0 30.293333l-22.613333 22.613333a21.333333 21.333333 0 0 1-30.293333 0l-140.373334-140.373333a22.613333 22.613333 0 0 1-6.4-14.933333V320a21.333333 21.333333 0 0 1 21.333334-21.333333h32.426666a21.333333 21.333333 0 0 1 21.333334 21.333333z m346.453333 85.333333v-213.333333a21.333333 21.333333 0 0 0-21.333333-21.333333h-12.373334a20.906667 20.906667 0 0 0-15.36 6.4l-63.573333 63.573333A384 384 0 1 0 896 534.613333a21.333333 21.333333 0 0 0-5.546667-15.786666 22.186667 22.186667 0 0 0-15.36-6.826667h-42.666666a21.333333 21.333333 0 0 0-21.333334 20.053333A298.666667 298.666667 0 1 1 512 213.333333a295.68 295.68 0 0 1 210.346667 88.32l-75.946667 75.946667a20.906667 20.906667 0 0 0-6.4 15.36v12.373333a21.333333 21.333333 0 0 0 21.333333 21.333334h213.333334a21.333333 21.333333 0 0 0 21.333333-21.333334z" p-id="5250" fill="#d81e06"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/weixin.png b/app/resources/icons/weixin.png deleted file mode 100644 index 567df75..0000000 Binary files a/app/resources/icons/weixin.png and /dev/null differ diff --git a/app/resources/icons/woman.svg b/app/resources/icons/woman.svg deleted file mode 100644 index ce04025..0000000 --- a/app/resources/icons/woman.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1704295202245" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5558" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M870.69952 153.30048c-66.10688-66.10944-154.00448-102.51776-247.49696-102.51904-93.49248 0-181.3888 36.40832-247.49696 102.51648-66.11072 66.10944-102.51648 154.00576-102.51648 247.49952-0.00128 76.19968 24.19072 148.6784 68.93056 208.67584l-60.2048 60.20352L138.18496 525.94688c-19.99488-19.99488-52.41216-19.99488-72.40704 0-19.99488 19.9936-19.99488 52.41216 0 72.40704l143.72992 143.72992-55.75552 55.75552c-19.9936 19.9936-19.9936 52.41216 0 72.40576 19.99616 19.99616 52.41344 19.99488 72.40832 0l55.75424-55.75424 143.7312 143.72992c19.9936 19.99488 52.41088 19.99488 72.40576 0 19.99616-19.99488 19.99616-52.41216 0-72.40704L354.32192 742.08512l60.2048-60.20352c59.99872 44.73856 132.47616 68.93184 208.67584 68.93184 93.49248 0 181.38752-36.40832 247.49696-102.51776s102.51776-154.00576 102.51776-247.49824C973.21728 307.30496 936.80768 219.40736 870.69952 153.30048zM798.29248 575.88736c-46.76736 46.76736-108.94976 72.5248-175.08992 72.5248s-128.32128-25.75744-175.08992-72.5248c-46.76864-46.76736-72.5248-108.94976-72.5248-175.08992 0.00128-66.14272 25.75616-128.32384 72.5248-175.0912 46.76736-46.76864 108.94976-72.5248 175.08992-72.5248 66.14016 0.00128 128.32256 25.75744 175.08992 72.52608 46.76736 46.76736 72.5248 108.94848 72.5248 175.08864C870.81728 466.9376 845.0624 529.11872 798.29248 575.88736z" fill="#d81e06" p-id="5559"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/word.svg b/app/resources/icons/word.svg deleted file mode 100644 index 2f63a43..0000000 --- a/app/resources/icons/word.svg +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1698328304971" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2624" - width="16" height="16"> - <path d="M1024 298.666667V85.333333c0-25.6-17.066667-42.666667-42.666667-42.666666H298.666667c-25.6 0-42.666667 17.066667-42.666667 42.666666v213.333334l384 85.333333 384-85.333333z" - fill="#41A5EE" p-id="2625"></path> - <path d="M1024 298.666667H256v213.333333l405.333333 85.333333 362.666667-85.333333z" fill="#2B7CD3" - p-id="2626"></path> - <path d="M1024 512H256v213.333333l384 64 384-64z" fill="#185ABD" p-id="2627"></path> - <path d="M1024 725.333333H256v213.333334c0 25.6 17.066667 42.666667 42.666667 42.666666h682.666666c25.6 0 42.666667-17.066667 42.666667-42.666666v-213.333334z" - fill="#103F91" p-id="2628"></path> - <path d="M588.8 256H256v597.333333h324.266667c29.866667 0 59.733333-29.866667 59.733333-59.733333V307.2c0-29.866667-21.333333-51.2-51.2-51.2z" - opacity=".5" p-id="2629"></path> - <path d="M546.133333 810.666667H51.2C21.333333 810.666667 0 789.333333 0 759.466667V264.533333C0 234.666667 21.333333 213.333333 51.2 213.333333h499.2c25.6 0 46.933333 21.333333 46.933333 51.2v499.2c0 25.6-21.333333 46.933333-51.2 46.933334z" - fill="#185ABD" p-id="2630"></path> - <path d="M435.2 682.666667H371.2L298.666667 448 226.133333 682.666667H162.133333L93.866667 341.333333h59.733333l46.933333 238.933334 72.533334-230.4h51.2l68.266666 230.4L443.733333 341.333333h59.733334l-68.266667 341.333334z" - fill="#FFFFFF" p-id="2631"></path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/关闭.svg b/app/resources/icons/关闭.svg deleted file mode 100644 index 16e96e1..0000000 --- a/app/resources/icons/关闭.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1705163866087" class="icon" viewBox="0 0 1792 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="20689" xmlns:xlink="http://www.w3.org/1999/xlink" width="56" height="32"><path d="M320 192h1152a320 320 0 0 1 0 640H320A320 320 0 0 1 320 192z" fill="#CCCCCC" p-id="20690"></path><path d="M512 512m-512 0a512 512 0 1 0 1024 0 512 512 0 1 0-1024 0Z" fill="#FFFFFF" p-id="20691"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/关闭状态.svg b/app/resources/icons/关闭状态.svg deleted file mode 100644 index 179d8be..0000000 --- a/app/resources/icons/关闭状态.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1705163839362" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15502" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><path d="M294.912 245.76C141.312 245.76 18.432 370.688 18.432 522.24 18.432 675.84 143.36 798.72 294.912 798.72h430.08c153.6 2.048 278.528-122.88 278.528-276.48C1003.52 370.688 878.592 245.76 727.04 245.76H294.912z m0 507.904c-126.976 0-231.424-102.4-231.424-231.424 0-126.976 102.4-231.424 231.424-231.424h430.08c126.976 0 231.424 102.4 231.424 231.424 0 126.976-102.4 231.424-231.424 231.424h-430.08z m174.08-231.424c0-94.208-75.776-169.984-169.984-169.984S131.072 430.08 131.072 522.24c0 94.208 75.776 169.984 169.984 169.984s167.936-75.776 167.936-169.984z m0 0" fill="#CCCCCC" p-id="15503"></path></svg> \ No newline at end of file diff --git a/app/resources/icons/按钮_关闭.svg b/app/resources/icons/按钮_关闭.svg deleted file mode 100644 index fe1ed27..0000000 --- a/app/resources/icons/按钮_关闭.svg +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg t="1705163819393" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" - p-id="12840" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"> - <path fill="#e1e1e1" d="M699.7 284.2H326.3C200.2 284.2 98 386.4 98 512.4c0 126.1 102.2 228.3 228.3 228.3h373.5c126.1 0 228.3-102.2 228.3-228.3-0.1-126-102.3-228.2-228.4-228.2zM326.3 719.9c-114.6 0-207.5-92.9-207.5-207.5s92.9-207.5 207.5-207.5 207.5 92.9 207.5 207.5c-0.1 114.6-93 207.5-207.5 207.5z" p-id="12841"> - - </path> -</svg> \ No newline at end of file diff --git a/app/resources/icons/按钮_开启.svg b/app/resources/icons/按钮_开启.svg deleted file mode 100644 index 131c57a..0000000 --- a/app/resources/icons/按钮_开启.svg +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1705163901927" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="24319" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><path d="M98 512.4c0 126.1 102.2 228.3 228.3 228.3h373.5c126.1 0 228.3-102.2 228.3-228.3 0-126.1-102.2-228.2-228.3-228.2H326.3C200.2 284.2 98 386.4 98 512.4z m394.3 0c0-114.6 92.9-207.5 207.5-207.5s207.5 92.9 207.5 207.5-92.9 207.5-207.5 207.5S492.3 627 492.3 512.4z" p-id="24320"></path></svg> \ No newline at end of file diff --git a/app/resources/resource_rc.py b/app/resources/resource_rc.py deleted file mode 100644 index 90c24ff..0000000 --- a/app/resources/resource_rc.py +++ /dev/null @@ -1,18359 +0,0 @@ -# -*- coding: utf-8 -*- - -# Resource object code -# -# Created by: The Resource Compiler for PyQt5 (Qt v5.15.2) -# -# WARNING! All changes made in this file will be lost! - -from PyQt5 import QtCore - -qt_resource_data = b"\ -\x00\x00\x13\x4e\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x32\x35\x36\x32\x36\x33\x36\x38\x34\x34\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\x39\x37\x37\x22\x20\ -\x77\x69\x64\x74\x68\x3d\x22\x33\x32\x22\x20\x68\x65\x69\x67\x68\ -\x74\x3d\x22\x33\x32\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\ -\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\ -\x22\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x35\x30\x38\x2e\ -\x35\x33\x34\x31\x35\x34\x20\x33\x34\x32\x2e\x36\x34\x36\x31\x35\ -\x34\x6d\x2d\x33\x30\x36\x2e\x37\x32\x37\x33\x38\x35\x20\x30\x61\ -\x33\x30\x36\x2e\x37\x32\x37\x33\x38\x35\x20\x33\x30\x36\x2e\x37\ -\x32\x37\x33\x38\x35\x20\x30\x20\x31\x20\x30\x20\x36\x31\x33\x2e\ -\x34\x35\x34\x37\x36\x39\x20\x30\x20\x33\x30\x36\x2e\x37\x32\x37\ -\x33\x38\x35\x20\x33\x30\x36\x2e\x37\x32\x37\x33\x38\x35\x20\x30\ -\x20\x31\x20\x30\x2d\x36\x31\x33\x2e\x34\x35\x34\x37\x36\x39\x20\ -\x30\x5a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x44\x43\x36\ -\x34\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\x39\x37\x38\x22\x3e\ -\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\ -\x4d\x35\x30\x38\x2e\x35\x33\x34\x31\x35\x34\x20\x36\x36\x37\x2e\ -\x34\x39\x30\x34\x36\x32\x61\x33\x32\x35\x2e\x30\x30\x31\x38\x34\ -\x36\x20\x33\x32\x35\x2e\x30\x30\x31\x38\x34\x36\x20\x30\x20\x31\ -\x20\x31\x20\x33\x32\x35\x2e\x30\x30\x31\x38\x34\x36\x2d\x33\x32\ -\x34\x2e\x38\x34\x34\x33\x30\x38\x20\x33\x32\x35\x2e\x33\x31\x36\ -\x39\x32\x33\x20\x33\x32\x35\x2e\x33\x31\x36\x39\x32\x33\x20\x30\ -\x20\x30\x20\x31\x2d\x33\x32\x35\x2e\x30\x30\x31\x38\x34\x36\x20\ -\x33\x32\x34\x2e\x38\x34\x34\x33\x30\x38\x7a\x20\x6d\x30\x2d\x36\ -\x31\x33\x2e\x34\x35\x34\x37\x37\x41\x32\x38\x38\x2e\x36\x31\x30\ -\x34\x36\x32\x20\x32\x38\x38\x2e\x36\x31\x30\x34\x36\x32\x20\x30\ -\x20\x31\x20\x30\x20\x37\x39\x37\x2e\x31\x34\x34\x36\x31\x35\x20\ -\x33\x34\x32\x2e\x36\x34\x36\x31\x35\x34\x20\x32\x38\x38\x2e\x39\ -\x32\x35\x35\x33\x38\x20\x32\x38\x38\x2e\x39\x32\x35\x35\x33\x38\ -\x20\x30\x20\x30\x20\x30\x20\x35\x30\x38\x2e\x35\x33\x34\x31\x35\ -\x34\x20\x35\x34\x2e\x30\x33\x35\x36\x39\x32\x7a\x22\x20\x66\x69\ -\x6c\x6c\x3d\x22\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\x39\x37\ -\x39\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\ -\x64\x3d\x22\x4d\x35\x30\x38\x2e\x35\x33\x34\x31\x35\x34\x20\x34\ -\x37\x39\x2e\x35\x34\x37\x30\x37\x37\x6d\x2d\x32\x34\x2e\x32\x36\ -\x30\x39\x32\x33\x20\x30\x61\x32\x34\x2e\x32\x36\x30\x39\x32\x33\ -\x20\x32\x34\x2e\x32\x36\x30\x39\x32\x33\x20\x30\x20\x31\x20\x30\ -\x20\x34\x38\x2e\x35\x32\x31\x38\x34\x36\x20\x30\x20\x32\x34\x2e\ -\x32\x36\x30\x39\x32\x33\x20\x32\x34\x2e\x32\x36\x30\x39\x32\x33\ -\x20\x30\x20\x31\x20\x30\x2d\x34\x38\x2e\x35\x32\x31\x38\x34\x36\ -\x20\x30\x5a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x22\x20\x70\x2d\x69\ -\x64\x3d\x22\x32\x32\x39\x38\x30\x22\x3e\x3c\x2f\x70\x61\x74\x68\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x35\x30\x38\x2e\x35\ -\x33\x34\x31\x35\x34\x20\x33\x34\x32\x2e\x36\x34\x36\x31\x35\x34\ -\x6d\x2d\x32\x32\x33\x2e\x35\x34\x37\x30\x37\x37\x20\x30\x61\x32\ -\x32\x33\x2e\x35\x34\x37\x30\x37\x37\x20\x32\x32\x33\x2e\x35\x34\ -\x37\x30\x37\x37\x20\x30\x20\x31\x20\x30\x20\x34\x34\x37\x2e\x30\ -\x39\x34\x31\x35\x34\x20\x30\x20\x32\x32\x33\x2e\x35\x34\x37\x30\ -\x37\x37\x20\x32\x32\x33\x2e\x35\x34\x37\x30\x37\x37\x20\x30\x20\ -\x31\x20\x30\x2d\x34\x34\x37\x2e\x30\x39\x34\x31\x35\x34\x20\x30\ -\x5a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x44\x44\x44\x44\x44\x44\ -\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\x39\x38\x31\x22\x3e\x3c\ -\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\ -\x35\x30\x38\x2e\x35\x33\x34\x31\x35\x34\x20\x35\x38\x34\x2e\x33\ -\x31\x30\x31\x35\x34\x61\x32\x34\x31\x2e\x36\x36\x34\x20\x32\x34\ -\x31\x2e\x36\x36\x34\x20\x30\x20\x31\x20\x31\x20\x32\x34\x31\x2e\ -\x38\x32\x31\x35\x33\x38\x2d\x32\x34\x31\x2e\x36\x36\x34\x20\x32\ -\x34\x31\x2e\x39\x37\x39\x30\x37\x37\x20\x32\x34\x31\x2e\x39\x37\ -\x39\x30\x37\x37\x20\x30\x20\x30\x20\x31\x2d\x32\x34\x31\x2e\x38\ -\x32\x31\x35\x33\x38\x20\x32\x34\x31\x2e\x36\x36\x34\x7a\x20\x6d\ -\x30\x2d\x34\x34\x37\x2e\x30\x39\x34\x31\x35\x34\x61\x32\x30\x34\ -\x2e\x38\x20\x32\x30\x34\x2e\x38\x20\x30\x20\x31\x20\x30\x20\x32\ -\x30\x34\x2e\x38\x20\x32\x30\x34\x2e\x38\x20\x32\x30\x34\x2e\x38\ -\x20\x32\x30\x34\x2e\x38\x20\x30\x20\x30\x20\x30\x2d\x32\x30\x34\ -\x2e\x38\x2d\x32\x30\x34\x2e\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\ -\x22\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\x39\x38\x32\x22\x3e\ -\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\ -\x4d\x34\x38\x30\x2e\x39\x36\x34\x39\x32\x33\x20\x33\x30\x31\x2e\ -\x30\x35\x36\x68\x34\x36\x2e\x37\x38\x38\x39\x32\x33\x76\x31\x39\ -\x32\x2e\x33\x35\x34\x34\x36\x32\x68\x2d\x34\x36\x2e\x37\x38\x38\ -\x39\x32\x33\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x32\x32\x39\x38\x33\x22\x3e\x3c\x2f\x70\x61\x74\ -\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x35\x32\x37\x2e\ -\x37\x35\x33\x38\x34\x36\x20\x34\x39\x38\x2e\x36\x30\x39\x32\x33\ -\x31\x68\x2d\x34\x37\x2e\x32\x36\x31\x35\x33\x38\x61\x35\x2e\x31\ -\x39\x38\x37\x36\x39\x20\x35\x2e\x31\x39\x38\x37\x36\x39\x20\x30\ -\x20\x30\x20\x31\x2d\x35\x2e\x31\x39\x38\x37\x37\x2d\x35\x2e\x31\ -\x39\x38\x37\x36\x39\x56\x33\x30\x31\x2e\x30\x35\x36\x61\x35\x2e\ -\x31\x39\x38\x37\x36\x39\x20\x35\x2e\x31\x39\x38\x37\x36\x39\x20\ -\x30\x20\x30\x20\x31\x20\x35\x2e\x31\x39\x38\x37\x37\x2d\x35\x2e\ -\x31\x39\x38\x37\x36\x39\x68\x34\x37\x2e\x32\x36\x31\x35\x33\x38\ -\x61\x35\x2e\x31\x39\x38\x37\x36\x39\x20\x35\x2e\x31\x39\x38\x37\ -\x36\x39\x20\x30\x20\x30\x20\x31\x20\x35\x2e\x31\x39\x38\x37\x36\ -\x39\x20\x35\x2e\x31\x39\x38\x37\x36\x39\x76\x31\x39\x32\x2e\x33\ -\x35\x34\x34\x36\x32\x61\x35\x2e\x31\x39\x38\x37\x36\x39\x20\x35\ -\x2e\x31\x39\x38\x37\x36\x39\x20\x30\x20\x30\x20\x31\x2d\x35\x2e\ -\x31\x39\x38\x37\x36\x39\x20\x35\x2e\x31\x39\x38\x37\x36\x39\x7a\ -\x4d\x34\x38\x36\x2e\x31\x36\x33\x36\x39\x32\x20\x34\x38\x38\x2e\ -\x33\x36\x39\x32\x33\x31\x68\x33\x36\x2e\x33\x39\x31\x33\x38\x35\ -\x56\x33\x30\x36\x2e\x32\x35\x34\x37\x36\x39\x68\x2d\x33\x36\x2e\ -\x33\x39\x31\x33\x38\x35\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x22\ -\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\x39\x38\x34\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x35\ -\x30\x34\x2e\x34\x33\x38\x31\x35\x34\x20\x32\x32\x32\x2e\x39\x31\ -\x36\x39\x32\x33\x6d\x2d\x34\x38\x2e\x36\x37\x39\x33\x38\x35\x20\ -\x30\x61\x34\x38\x2e\x36\x37\x39\x33\x38\x35\x20\x34\x38\x2e\x36\ -\x37\x39\x33\x38\x35\x20\x30\x20\x31\x20\x30\x20\x39\x37\x2e\x33\ -\x35\x38\x37\x36\x39\x20\x30\x20\x34\x38\x2e\x36\x37\x39\x33\x38\ -\x35\x20\x34\x38\x2e\x36\x37\x39\x33\x38\x35\x20\x30\x20\x31\x20\ -\x30\x2d\x39\x37\x2e\x33\x35\x38\x37\x36\x39\x20\x30\x5a\x22\x20\ -\x66\x69\x6c\x6c\x3d\x22\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\ -\x39\x38\x35\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\ -\x68\x20\x64\x3d\x22\x4d\x38\x39\x39\x2e\x35\x34\x34\x36\x31\x35\ -\x20\x33\x39\x38\x2e\x37\x32\x39\x38\x34\x36\x61\x34\x38\x2e\x38\ -\x33\x36\x39\x32\x33\x20\x34\x38\x2e\x38\x33\x36\x39\x32\x33\x20\ -\x30\x20\x30\x20\x30\x2d\x34\x38\x2e\x38\x33\x36\x39\x32\x33\x20\ -\x34\x38\x2e\x38\x33\x36\x39\x32\x33\x76\x31\x32\x39\x2e\x30\x32\ -\x34\x61\x34\x38\x2e\x38\x33\x36\x39\x32\x33\x20\x34\x38\x2e\x38\ -\x33\x36\x39\x32\x33\x20\x30\x20\x30\x20\x30\x2d\x38\x31\x2e\x37\ -\x36\x32\x34\x36\x31\x2d\x32\x32\x2e\x35\x32\x38\x4c\x35\x39\x37\ -\x2e\x37\x30\x30\x39\x32\x33\x20\x37\x32\x34\x2e\x36\x37\x36\x39\ -\x32\x33\x61\x31\x34\x35\x2e\x37\x32\x33\x30\x37\x37\x20\x31\x34\ -\x35\x2e\x37\x32\x33\x30\x37\x37\x20\x30\x20\x30\x20\x30\x2d\x34\ -\x33\x2e\x30\x30\x38\x20\x31\x30\x33\x2e\x36\x36\x30\x33\x30\x38\ -\x76\x31\x36\x30\x2e\x32\x31\x36\x36\x31\x35\x68\x32\x31\x32\x2e\ -\x36\x37\x36\x39\x32\x33\x6c\x31\x35\x30\x2e\x36\x30\x36\x37\x36\ -\x39\x2d\x32\x37\x36\x2e\x37\x39\x35\x30\x37\x37\x61\x32\x35\x30\ -\x2e\x31\x37\x31\x30\x37\x37\x20\x32\x35\x30\x2e\x31\x37\x31\x30\ -\x37\x37\x20\x30\x20\x30\x20\x30\x20\x33\x30\x2e\x32\x34\x37\x33\ -\x38\x35\x2d\x31\x31\x39\x2e\x30\x39\x39\x30\x37\x37\x76\x2d\x31\ -\x34\x35\x2e\x30\x39\x32\x39\x32\x33\x61\x34\x38\x2e\x38\x33\x36\ -\x39\x32\x33\x20\x34\x38\x2e\x38\x33\x36\x39\x32\x33\x20\x30\x20\ -\x30\x20\x30\x2d\x34\x38\x2e\x36\x37\x39\x33\x38\x35\x2d\x34\x38\ -\x2e\x38\x33\x36\x39\x32\x33\x7a\x4d\x34\x32\x36\x2e\x32\x39\x39\ -\x30\x37\x37\x20\x37\x32\x34\x2e\x36\x37\x36\x39\x32\x33\x4c\x32\ -\x35\x35\x2e\x30\x35\x34\x37\x36\x39\x20\x35\x35\x34\x2e\x32\x32\ -\x30\x33\x30\x38\x41\x34\x38\x2e\x38\x33\x36\x39\x32\x33\x20\x34\ -\x38\x2e\x38\x33\x36\x39\x32\x33\x20\x30\x20\x30\x20\x30\x20\x31\ -\x37\x33\x2e\x32\x39\x32\x33\x30\x38\x20\x35\x37\x36\x2e\x35\x39\ -\x30\x37\x36\x39\x76\x2d\x31\x32\x39\x2e\x30\x32\x34\x61\x34\x38\ -\x2e\x38\x33\x36\x39\x32\x33\x20\x34\x38\x2e\x38\x33\x36\x39\x32\ -\x33\x20\x30\x20\x31\x20\x30\x2d\x39\x37\x2e\x36\x37\x33\x38\x34\ -\x36\x20\x30\x76\x31\x34\x35\x2e\x30\x39\x32\x39\x32\x33\x61\x32\ -\x35\x30\x2e\x30\x31\x33\x35\x33\x38\x20\x32\x35\x30\x2e\x30\x31\ -\x33\x35\x33\x38\x20\x30\x20\x30\x20\x30\x20\x33\x30\x2e\x32\x34\ -\x37\x33\x38\x34\x20\x31\x31\x39\x2e\x30\x39\x39\x30\x37\x37\x6c\ -\x31\x35\x30\x2e\x36\x30\x36\x37\x36\x39\x20\x32\x37\x36\x2e\x37\ -\x39\x35\x30\x37\x37\x68\x32\x31\x32\x2e\x36\x37\x36\x39\x32\x33\ -\x56\x38\x32\x39\x2e\x31\x32\x34\x39\x32\x33\x41\x31\x34\x35\x2e\ -\x37\x32\x33\x30\x37\x37\x20\x31\x34\x35\x2e\x37\x32\x33\x30\x37\ -\x37\x20\x30\x20\x30\x20\x30\x20\x34\x32\x36\x2e\x32\x39\x39\x30\ -\x37\x37\x20\x37\x32\x34\x2e\x36\x37\x36\x39\x32\x33\x7a\x22\x20\ -\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x44\x32\x39\x46\x22\x20\x70\ -\x2d\x69\x64\x3d\x22\x32\x32\x39\x38\x36\x22\x3e\x3c\x2f\x70\x61\ -\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\x39\x39\ -\x2e\x35\x34\x34\x36\x31\x35\x20\x33\x38\x31\x2e\x30\x38\x35\x35\ -\x33\x38\x61\x36\x36\x2e\x36\x33\x38\x37\x36\x39\x20\x36\x36\x2e\ -\x36\x33\x38\x37\x36\x39\x20\x30\x20\x30\x20\x30\x2d\x36\x36\x2e\ -\x34\x38\x31\x32\x33\x20\x36\x36\x2e\x34\x38\x31\x32\x33\x31\x76\ -\x38\x31\x2e\x34\x34\x37\x33\x38\x35\x61\x36\x36\x2e\x34\x38\x31\ -\x32\x33\x31\x20\x36\x36\x2e\x34\x38\x31\x32\x33\x31\x20\x30\x20\ -\x30\x20\x30\x2d\x37\x36\x2e\x35\x36\x33\x36\x39\x33\x20\x31\x32\ -\x2e\x36\x30\x33\x30\x37\x37\x4c\x35\x38\x35\x2e\x32\x35\x35\x33\ -\x38\x35\x20\x37\x31\x32\x2e\x38\x36\x31\x35\x33\x38\x61\x31\x36\ -\x33\x2e\x33\x36\x37\x33\x38\x35\x20\x31\x36\x33\x2e\x33\x36\x37\ -\x33\x38\x35\x20\x30\x20\x30\x20\x30\x2d\x34\x38\x2e\x32\x30\x36\ -\x37\x37\x20\x31\x31\x36\x2e\x32\x36\x33\x33\x38\x35\x76\x31\x35\ -\x39\x2e\x34\x32\x38\x39\x32\x33\x61\x31\x37\x2e\x38\x30\x31\x38\ -\x34\x36\x20\x31\x37\x2e\x38\x30\x31\x38\x34\x36\x20\x30\x20\x30\ -\x20\x30\x20\x31\x37\x2e\x38\x30\x31\x38\x34\x37\x20\x31\x37\x2e\ -\x38\x30\x31\x38\x34\x36\x68\x36\x30\x2e\x34\x39\x34\x37\x36\x39\ -\x61\x31\x37\x2e\x38\x30\x31\x38\x34\x36\x20\x31\x37\x2e\x38\x30\ -\x31\x38\x34\x36\x20\x30\x20\x31\x20\x30\x20\x30\x2d\x33\x35\x2e\ -\x34\x34\x36\x31\x35\x34\x68\x2d\x34\x32\x2e\x38\x35\x30\x34\x36\ -\x32\x76\x2d\x31\x34\x31\x2e\x37\x38\x34\x36\x31\x35\x61\x31\x32\ -\x38\x2e\x30\x37\x38\x37\x36\x39\x20\x31\x32\x38\x2e\x30\x37\x38\ -\x37\x36\x39\x20\x30\x20\x30\x20\x31\x20\x33\x37\x2e\x38\x30\x39\ -\x32\x33\x31\x2d\x39\x31\x2e\x32\x31\x34\x37\x36\x39\x4c\x37\x38\ -\x31\x2e\x33\x39\x30\x37\x36\x39\x20\x35\x36\x37\x2e\x31\x33\x38\ -\x34\x36\x32\x61\x33\x31\x2e\x35\x30\x37\x36\x39\x32\x20\x33\x31\ -\x2e\x35\x30\x37\x36\x39\x32\x20\x30\x20\x30\x20\x31\x20\x34\x33\ -\x2e\x39\x35\x33\x32\x33\x31\x20\x30\x20\x32\x36\x2e\x33\x30\x38\ -\x39\x32\x33\x20\x32\x36\x2e\x33\x30\x38\x39\x32\x33\x20\x30\x20\ -\x30\x20\x31\x20\x37\x2e\x35\x36\x31\x38\x34\x36\x20\x31\x32\x2e\ -\x34\x34\x35\x35\x33\x38\x20\x34\x38\x2e\x35\x32\x31\x38\x34\x36\ -\x20\x34\x38\x2e\x35\x32\x31\x38\x34\x36\x20\x30\x20\x30\x20\x31\ -\x20\x30\x20\x31\x37\x2e\x33\x32\x39\x32\x33\x31\x20\x33\x31\x2e\ -\x35\x30\x37\x36\x39\x32\x20\x33\x31\x2e\x35\x30\x37\x36\x39\x32\ -\x20\x30\x20\x30\x20\x31\x2d\x38\x2e\x30\x33\x34\x34\x36\x31\x20\ -\x31\x34\x2e\x30\x32\x30\x39\x32\x33\x4c\x36\x35\x34\x2e\x32\x35\ -\x37\x32\x33\x31\x20\x37\x38\x31\x2e\x38\x36\x33\x33\x38\x35\x61\ -\x36\x36\x2e\x33\x32\x33\x36\x39\x32\x20\x36\x36\x2e\x33\x32\x33\ -\x36\x39\x32\x20\x30\x20\x30\x20\x30\x2d\x31\x39\x2e\x35\x33\x34\ -\x37\x36\x39\x20\x34\x37\x2e\x32\x36\x31\x35\x33\x38\x20\x31\x37\ -\x2e\x38\x30\x31\x38\x34\x36\x20\x31\x37\x2e\x38\x30\x31\x38\x34\ -\x36\x20\x30\x20\x30\x20\x30\x20\x33\x35\x2e\x34\x34\x36\x31\x35\ -\x33\x20\x30\x20\x33\x31\x2e\x35\x30\x37\x36\x39\x32\x20\x33\x31\ -\x2e\x35\x30\x37\x36\x39\x32\x20\x30\x20\x30\x20\x31\x20\x39\x2e\ -\x31\x33\x37\x32\x33\x31\x2d\x32\x32\x2e\x32\x31\x32\x39\x32\x33\ -\x4c\x38\x35\x30\x2e\x37\x30\x37\x36\x39\x32\x20\x36\x33\x35\x2e\ -\x36\x36\x37\x36\x39\x32\x61\x36\x36\x2e\x34\x38\x31\x32\x33\x31\ -\x20\x36\x36\x2e\x34\x38\x31\x32\x33\x31\x20\x30\x20\x30\x20\x30\ -\x20\x31\x37\x2e\x39\x35\x39\x33\x38\x35\x2d\x36\x30\x2e\x39\x36\ -\x37\x33\x38\x34\x76\x2d\x31\x32\x37\x2e\x31\x33\x33\x35\x33\x39\ -\x61\x33\x31\x2e\x35\x30\x37\x36\x39\x32\x20\x33\x31\x2e\x35\x30\ -\x37\x36\x39\x32\x20\x30\x20\x31\x20\x31\x20\x36\x32\x2e\x30\x37\ -\x30\x31\x35\x34\x20\x30\x76\x31\x34\x35\x2e\x30\x39\x32\x39\x32\ -\x33\x61\x32\x33\x32\x2e\x33\x36\x39\x32\x33\x31\x20\x32\x33\x32\ -\x2e\x33\x36\x39\x32\x33\x31\x20\x30\x20\x30\x20\x31\x2d\x32\x38\ -\x2e\x31\x39\x39\x33\x38\x35\x20\x31\x31\x30\x2e\x32\x37\x36\x39\ -\x32\x33\x4c\x37\x35\x36\x2e\x31\x38\x34\x36\x31\x35\x20\x39\x37\ -\x30\x2e\x39\x30\x39\x35\x33\x38\x68\x2d\x33\x38\x2e\x32\x38\x31\ -\x38\x34\x36\x61\x31\x37\x2e\x38\x30\x31\x38\x34\x36\x20\x31\x37\ -\x2e\x38\x30\x31\x38\x34\x36\x20\x30\x20\x31\x20\x30\x20\x30\x20\ -\x33\x35\x2e\x34\x34\x36\x31\x35\x34\x68\x34\x39\x2e\x36\x32\x34\ -\x36\x31\x36\x61\x31\x37\x2e\x36\x34\x34\x33\x30\x38\x20\x31\x37\ -\x2e\x36\x34\x34\x33\x30\x38\x20\x30\x20\x30\x20\x30\x20\x31\x35\ -\x2e\x37\x35\x33\x38\x34\x36\x2d\x39\x2e\x32\x39\x34\x37\x36\x39\ -\x6c\x31\x35\x30\x2e\x36\x30\x36\x37\x36\x39\x2d\x32\x37\x36\x2e\ -\x37\x39\x35\x30\x37\x37\x61\x32\x36\x37\x2e\x38\x31\x35\x33\x38\ -\x35\x20\x32\x36\x37\x2e\x38\x31\x35\x33\x38\x35\x20\x30\x20\x30\ -\x20\x30\x20\x33\x32\x2e\x34\x35\x32\x39\x32\x33\x2d\x31\x32\x37\ -\x2e\x36\x30\x36\x31\x35\x34\x76\x2d\x31\x34\x35\x2e\x30\x39\x32\ -\x39\x32\x33\x61\x36\x36\x2e\x36\x33\x38\x37\x36\x39\x20\x36\x36\ -\x2e\x36\x33\x38\x37\x36\x39\x20\x30\x20\x30\x20\x30\x2d\x36\x36\ -\x2e\x37\x39\x36\x33\x30\x38\x2d\x36\x36\x2e\x34\x38\x31\x32\x33\ -\x31\x7a\x4d\x34\x33\x38\x2e\x37\x34\x34\x36\x31\x35\x20\x37\x31\ -\x32\x2e\x38\x36\x31\x35\x33\x38\x4c\x32\x36\x37\x2e\x38\x31\x35\ -\x33\x38\x35\x20\x35\x34\x31\x2e\x36\x31\x37\x32\x33\x31\x61\x36\ -\x36\x2e\x34\x38\x31\x32\x33\x31\x20\x36\x36\x2e\x34\x38\x31\x32\ -\x33\x31\x20\x30\x20\x30\x20\x30\x2d\x37\x36\x2e\x35\x36\x33\x36\ -\x39\x33\x2d\x31\x32\x2e\x36\x30\x33\x30\x37\x37\x76\x2d\x38\x31\ -\x2e\x34\x34\x37\x33\x38\x35\x61\x36\x36\x2e\x34\x38\x31\x32\x33\ -\x31\x20\x36\x36\x2e\x34\x38\x31\x32\x33\x31\x20\x30\x20\x31\x20\ -\x30\x2d\x31\x33\x33\x2e\x31\x32\x20\x30\x76\x31\x34\x35\x2e\x30\ -\x39\x32\x39\x32\x33\x61\x32\x36\x37\x2e\x38\x31\x35\x33\x38\x35\ -\x20\x32\x36\x37\x2e\x38\x31\x35\x33\x38\x35\x20\x30\x20\x30\x20\ -\x30\x20\x33\x32\x2e\x34\x35\x32\x39\x32\x33\x20\x31\x32\x37\x2e\ -\x36\x30\x36\x31\x35\x34\x6c\x31\x35\x30\x2e\x34\x34\x39\x32\x33\ -\x31\x20\x32\x37\x36\x2e\x37\x39\x35\x30\x37\x37\x61\x31\x37\x2e\ -\x36\x34\x34\x33\x30\x38\x20\x31\x37\x2e\x36\x34\x34\x33\x30\x38\ -\x20\x30\x20\x30\x20\x30\x20\x31\x35\x2e\x37\x35\x33\x38\x34\x36\ -\x20\x39\x2e\x32\x39\x34\x37\x36\x39\x68\x34\x39\x2e\x36\x32\x34\ -\x36\x31\x36\x61\x31\x37\x2e\x38\x30\x31\x38\x34\x36\x20\x31\x37\ -\x2e\x38\x30\x31\x38\x34\x36\x20\x30\x20\x31\x20\x30\x20\x30\x2d\ -\x33\x35\x2e\x34\x34\x36\x31\x35\x34\x48\x32\x36\x37\x2e\x38\x31\ -\x35\x33\x38\x35\x6c\x2d\x31\x34\x35\x2e\x35\x36\x35\x35\x33\x39\ -\x2d\x32\x36\x37\x2e\x38\x31\x35\x33\x38\x34\x61\x32\x33\x32\x2e\ -\x33\x36\x39\x32\x33\x31\x20\x32\x33\x32\x2e\x33\x36\x39\x32\x33\ -\x31\x20\x30\x20\x30\x20\x31\x2d\x32\x38\x2e\x31\x39\x39\x33\x38\ -\x34\x2d\x31\x31\x30\x2e\x32\x37\x36\x39\x32\x33\x76\x2d\x31\x34\ -\x35\x2e\x32\x35\x30\x34\x36\x32\x61\x33\x31\x2e\x35\x30\x37\x36\ -\x39\x32\x20\x33\x31\x2e\x35\x30\x37\x36\x39\x32\x20\x30\x20\x31\ -\x20\x31\x20\x36\x32\x2e\x30\x37\x30\x31\x35\x33\x20\x30\x76\x31\ -\x32\x37\x2e\x31\x33\x33\x35\x33\x39\x41\x36\x36\x2e\x34\x38\x31\ -\x32\x33\x31\x20\x36\x36\x2e\x34\x38\x31\x32\x33\x31\x20\x30\x20\ -\x30\x20\x30\x20\x31\x37\x33\x2e\x32\x39\x32\x33\x30\x38\x20\x36\ -\x33\x35\x2e\x36\x36\x37\x36\x39\x32\x6c\x31\x37\x31\x2e\x34\x30\ -\x31\x38\x34\x36\x20\x31\x37\x31\x2e\x32\x34\x34\x33\x30\x38\x61\ -\x33\x31\x2e\x35\x30\x37\x36\x39\x32\x20\x33\x31\x2e\x35\x30\x37\ -\x36\x39\x32\x20\x30\x20\x30\x20\x31\x20\x39\x2e\x31\x33\x37\x32\ -\x33\x31\x20\x32\x32\x2e\x32\x31\x32\x39\x32\x33\x20\x31\x37\x2e\ -\x38\x30\x31\x38\x34\x36\x20\x31\x37\x2e\x38\x30\x31\x38\x34\x36\ -\x20\x30\x20\x30\x20\x30\x20\x33\x35\x2e\x34\x34\x36\x31\x35\x33\ -\x20\x30\x20\x36\x36\x2e\x34\x38\x31\x32\x33\x31\x20\x36\x36\x2e\ -\x34\x38\x31\x32\x33\x31\x20\x30\x20\x30\x20\x30\x2d\x31\x39\x2e\ -\x35\x33\x34\x37\x36\x39\x2d\x34\x37\x2e\x32\x36\x31\x35\x33\x38\ -\x4c\x31\x39\x38\x2e\x36\x35\x36\x20\x36\x31\x30\x2e\x36\x31\x39\ -\x30\x37\x37\x41\x33\x31\x2e\x35\x30\x37\x36\x39\x32\x20\x33\x31\ -\x2e\x35\x30\x37\x36\x39\x32\x20\x30\x20\x31\x20\x31\x20\x32\x34\ -\x32\x2e\x36\x30\x39\x32\x33\x31\x20\x35\x36\x37\x2e\x31\x33\x38\ -\x34\x36\x32\x6c\x31\x37\x31\x2e\x30\x38\x36\x37\x36\x39\x20\x31\ -\x37\x30\x2e\x37\x37\x31\x36\x39\x32\x61\x31\x32\x38\x2e\x30\x37\ -\x38\x37\x36\x39\x20\x31\x32\x38\x2e\x30\x37\x38\x37\x36\x39\x20\ -\x30\x20\x30\x20\x31\x20\x33\x37\x2e\x38\x30\x39\x32\x33\x31\x20\ -\x39\x31\x2e\x32\x31\x34\x37\x36\x39\x76\x31\x34\x31\x2e\x37\x38\ -\x34\x36\x31\x35\x68\x2d\x34\x32\x2e\x38\x35\x30\x34\x36\x32\x61\ -\x31\x37\x2e\x38\x30\x31\x38\x34\x36\x20\x31\x37\x2e\x38\x30\x31\ -\x38\x34\x36\x20\x30\x20\x30\x20\x30\x20\x30\x20\x33\x35\x2e\x34\ -\x34\x36\x31\x35\x34\x68\x36\x30\x2e\x34\x39\x34\x37\x36\x39\x61\ -\x31\x37\x2e\x38\x30\x31\x38\x34\x36\x20\x31\x37\x2e\x38\x30\x31\ -\x38\x34\x36\x20\x30\x20\x30\x20\x30\x20\x31\x37\x2e\x38\x30\x31\ -\x38\x34\x37\x2d\x31\x37\x2e\x36\x34\x34\x33\x30\x37\x56\x38\x32\ -\x39\x2e\x31\x32\x34\x39\x32\x33\x61\x31\x36\x33\x2e\x33\x36\x37\ -\x33\x38\x35\x20\x31\x36\x33\x2e\x33\x36\x37\x33\x38\x35\x20\x30\ -\x20\x30\x20\x30\x2d\x34\x38\x2e\x32\x30\x36\x37\x37\x2d\x31\x31\ -\x36\x2e\x32\x36\x33\x33\x38\x35\x7a\x4d\x35\x33\x37\x2e\x33\x36\ -\x33\x36\x39\x32\x20\x33\x32\x37\x2e\x38\x33\x37\x35\x33\x38\x68\ -\x2d\x36\x35\x2e\x38\x35\x31\x30\x37\x37\x61\x31\x38\x2e\x32\x37\ -\x34\x34\x36\x32\x20\x31\x38\x2e\x32\x37\x34\x34\x36\x32\x20\x30\ -\x20\x30\x20\x31\x20\x30\x2d\x33\x36\x2e\x33\x39\x31\x33\x38\x34\ -\x68\x36\x35\x2e\x38\x35\x31\x30\x37\x37\x61\x31\x38\x2e\x32\x37\ -\x34\x34\x36\x32\x20\x31\x38\x2e\x32\x37\x34\x34\x36\x32\x20\x30\ -\x20\x30\x20\x31\x20\x30\x20\x33\x36\x2e\x33\x39\x31\x33\x38\x34\ -\x7a\x4d\x35\x33\x37\x2e\x33\x36\x33\x36\x39\x32\x20\x35\x30\x31\ -\x2e\x31\x32\x39\x38\x34\x36\x68\x2d\x36\x35\x2e\x38\x35\x31\x30\ -\x37\x37\x61\x31\x38\x2e\x32\x37\x34\x34\x36\x32\x20\x31\x38\x2e\ -\x32\x37\x34\x34\x36\x32\x20\x30\x20\x30\x20\x31\x20\x30\x2d\x33\ -\x36\x2e\x33\x39\x31\x33\x38\x34\x68\x36\x35\x2e\x38\x35\x31\x30\ -\x37\x37\x61\x31\x38\x2e\x32\x37\x34\x34\x36\x32\x20\x31\x38\x2e\ -\x32\x37\x34\x34\x36\x32\x20\x30\x20\x30\x20\x31\x20\x30\x20\x33\ -\x36\x2e\x33\x39\x31\x33\x38\x34\x7a\x22\x20\x66\x69\x6c\x6c\x3d\ -\x22\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\x39\x38\x37\x22\x3e\ -\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x06\x22\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x32\x35\x36\x33\x33\x33\x39\x36\x39\x39\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x38\x30\x35\x37\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\ -\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\ -\x3d\x22\x33\x32\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x32\ -\x22\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x35\x31\x32\x2e\ -\x34\x30\x39\x36\x20\x35\x30\x39\x2e\x36\x39\x36\x6d\x2d\x34\x33\ -\x32\x2e\x33\x33\x32\x38\x20\x30\x61\x34\x33\x32\x2e\x33\x33\x32\ -\x38\x20\x34\x33\x32\x2e\x33\x33\x32\x38\x20\x30\x20\x31\x20\x30\ -\x20\x38\x36\x34\x2e\x36\x36\x35\x36\x20\x30\x20\x34\x33\x32\x2e\ -\x33\x33\x32\x38\x20\x34\x33\x32\x2e\x33\x33\x32\x38\x20\x30\x20\ -\x31\x20\x30\x2d\x38\x36\x34\x2e\x36\x36\x35\x36\x20\x30\x5a\x22\ -\x20\x66\x69\x6c\x6c\x3d\x22\x23\x42\x36\x38\x38\x46\x46\x22\x20\ -\x70\x2d\x69\x64\x3d\x22\x32\x38\x30\x35\x38\x22\x3e\x3c\x2f\x70\ -\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x38\ -\x37\x2e\x34\x33\x36\x38\x20\x34\x31\x35\x2e\x35\x39\x30\x34\x63\ -\x2d\x38\x35\x2e\x30\x34\x33\x32\x20\x30\x2d\x31\x36\x30\x2e\x34\ -\x30\x39\x36\x20\x34\x31\x2e\x33\x36\x39\x36\x2d\x32\x30\x37\x2e\ -\x31\x30\x34\x20\x31\x30\x35\x2e\x30\x36\x32\x34\x20\x34\x2e\x35\ -\x35\x36\x38\x20\x31\x38\x32\x2e\x37\x33\x32\x38\x20\x31\x32\x32\ -\x2e\x33\x36\x38\x20\x33\x33\x37\x2e\x33\x30\x35\x36\x20\x32\x38\ -\x35\x2e\x39\x35\x32\x20\x33\x39\x36\x2e\x30\x33\x32\x20\x31\x30\ -\x33\x2e\x32\x31\x39\x32\x2d\x33\x33\x2e\x32\x38\x20\x31\x37\x37\ -\x2e\x39\x32\x2d\x31\x33\x30\x2e\x30\x34\x38\x20\x31\x37\x37\x2e\ -\x39\x32\x2d\x32\x34\x34\x2e\x33\x37\x37\x36\x20\x30\x2d\x31\x34\ -\x31\x2e\x37\x37\x32\x38\x2d\x31\x31\x34\x2e\x39\x34\x34\x2d\x32\ -\x35\x36\x2e\x37\x31\x36\x38\x2d\x32\x35\x36\x2e\x37\x36\x38\x2d\ -\x32\x35\x36\x2e\x37\x31\x36\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\ -\x22\x23\x43\x33\x41\x34\x46\x46\x22\x20\x70\x2d\x69\x64\x3d\x22\ -\x32\x38\x30\x35\x39\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\ -\x61\x74\x68\x20\x64\x3d\x22\x4d\x36\x33\x39\x2e\x38\x39\x37\x36\ -\x20\x33\x35\x38\x2e\x37\x35\x38\x34\x63\x32\x31\x2e\x35\x30\x34\ -\x20\x30\x20\x33\x36\x2e\x34\x30\x33\x32\x2d\x32\x31\x2e\x37\x30\ -\x38\x38\x20\x32\x38\x2e\x33\x36\x34\x38\x2d\x34\x31\x2e\x36\x37\ -\x36\x38\x2d\x31\x36\x2e\x35\x38\x38\x38\x2d\x34\x31\x2e\x32\x31\ -\x36\x2d\x35\x36\x2e\x39\x38\x35\x36\x2d\x37\x30\x2e\x34\x2d\x31\ -\x30\x34\x2e\x30\x33\x38\x34\x2d\x37\x30\x2e\x34\x48\x34\x36\x30\ -\x2e\x35\x34\x34\x63\x2d\x36\x31\x2e\x39\x30\x30\x38\x20\x30\x2d\ -\x31\x31\x32\x2e\x30\x37\x36\x38\x20\x35\x30\x2e\x31\x37\x36\x2d\ -\x31\x31\x32\x2e\x30\x37\x36\x38\x20\x31\x31\x32\x2e\x30\x37\x36\ -\x38\x76\x36\x34\x2e\x30\x35\x31\x32\x68\x36\x31\x2e\x34\x34\x56\ -\x33\x35\x38\x2e\x37\x35\x38\x34\x63\x30\x2d\x32\x37\x2e\x39\x35\ -\x35\x32\x20\x32\x32\x2e\x36\x38\x31\x36\x2d\x35\x30\x2e\x36\x33\ -\x36\x38\x20\x35\x30\x2e\x36\x33\x36\x38\x2d\x35\x30\x2e\x36\x33\ -\x36\x38\x68\x31\x30\x33\x2e\x36\x38\x63\x32\x30\x2e\x39\x34\x30\ -\x38\x20\x30\x20\x33\x38\x2e\x39\x36\x33\x32\x20\x31\x32\x2e\x38\ -\x20\x34\x36\x2e\x36\x34\x33\x32\x20\x33\x30\x2e\x39\x37\x36\x20\ -\x34\x2e\x39\x36\x36\x34\x20\x31\x31\x2e\x36\x37\x33\x36\x20\x31\ -\x35\x2e\x38\x32\x30\x38\x20\x31\x39\x2e\x37\x31\x32\x20\x32\x38\ -\x2e\x35\x31\x38\x34\x20\x31\x39\x2e\x37\x31\x32\x68\x30\x2e\x35\ -\x31\x32\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x44\x37\x43\x37\ -\x46\x46\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x38\x30\x36\x30\x22\ -\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\ -\x22\x4d\x36\x37\x30\x2e\x30\x30\x33\x32\x20\x33\x39\x35\x2e\x32\ -\x31\x32\x38\x48\x33\x35\x34\x2e\x37\x36\x34\x38\x63\x2d\x34\x38\ -\x2e\x39\x34\x37\x32\x20\x30\x2d\x38\x38\x2e\x36\x32\x37\x32\x20\ -\x33\x39\x2e\x36\x38\x2d\x38\x38\x2e\x36\x32\x37\x32\x20\x38\x38\ -\x2e\x36\x32\x37\x32\x76\x31\x38\x36\x2e\x30\x36\x30\x38\x63\x30\ -\x20\x34\x38\x2e\x39\x34\x37\x32\x20\x33\x39\x2e\x36\x38\x20\x38\ -\x38\x2e\x36\x32\x37\x32\x20\x38\x38\x2e\x36\x32\x37\x32\x20\x38\ -\x38\x2e\x36\x32\x37\x32\x68\x33\x31\x35\x2e\x32\x33\x38\x34\x63\ -\x34\x38\x2e\x39\x34\x37\x32\x20\x30\x20\x38\x38\x2e\x36\x32\x37\ -\x32\x2d\x33\x39\x2e\x36\x38\x20\x38\x38\x2e\x36\x32\x37\x32\x2d\ -\x38\x38\x2e\x36\x32\x37\x32\x56\x34\x38\x33\x2e\x38\x34\x63\x30\ -\x2d\x34\x38\x2e\x39\x34\x37\x32\x2d\x33\x39\x2e\x36\x38\x2d\x38\ -\x38\x2e\x36\x32\x37\x32\x2d\x38\x38\x2e\x36\x32\x37\x32\x2d\x38\ -\x38\x2e\x36\x32\x37\x32\x7a\x20\x6d\x2d\x31\x33\x30\x2e\x31\x35\ -\x30\x34\x20\x31\x38\x38\x2e\x32\x31\x31\x32\x76\x36\x34\x2e\x35\ -\x31\x32\x61\x32\x37\x2e\x34\x34\x33\x32\x20\x32\x37\x2e\x34\x34\ -\x33\x32\x20\x30\x20\x30\x20\x31\x2d\x35\x34\x2e\x38\x38\x36\x34\ -\x20\x30\x76\x2d\x36\x34\x2e\x35\x31\x32\x61\x35\x35\x2e\x33\x31\ -\x36\x34\x38\x20\x35\x35\x2e\x33\x31\x36\x34\x38\x20\x30\x20\x30\ -\x20\x31\x2d\x32\x37\x2e\x39\x35\x35\x32\x2d\x34\x38\x2e\x30\x37\ -\x36\x38\x63\x30\x2d\x33\x30\x2e\x36\x31\x37\x36\x20\x32\x34\x2e\ -\x37\x38\x30\x38\x2d\x35\x35\x2e\x33\x39\x38\x34\x20\x35\x35\x2e\ -\x33\x39\x38\x34\x2d\x35\x35\x2e\x33\x39\x38\x34\x73\x35\x35\x2e\ -\x33\x39\x38\x34\x20\x32\x34\x2e\x37\x38\x30\x38\x20\x35\x35\x2e\ -\x33\x39\x38\x34\x20\x35\x35\x2e\x33\x39\x38\x34\x63\x30\x20\x32\ -\x30\x2e\x36\x33\x33\x36\x2d\x31\x31\x2e\x32\x36\x34\x20\x33\x38\ -\x2e\x35\x35\x33\x36\x2d\x32\x37\x2e\x39\x35\x35\x32\x20\x34\x38\ -\x2e\x30\x37\x36\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\ -\x46\x46\x46\x46\x46\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x38\x30\ -\x36\x31\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\ -\x3e\ -\x00\x00\x07\x07\ -\x00\ -\x00\x1e\x03\x78\x9c\xd5\x59\x4b\x6f\x1b\x37\x10\xbe\x07\xc8\x7f\ -\x60\xb7\xe7\xa5\xf8\x5c\x72\x0b\xcb\x01\xf2\x40\x52\xa0\x69\x03\ -\x24\x75\xd1\xa3\xb1\x76\x23\x01\x8a\x6d\x44\x82\x9c\xe6\xd7\x77\ -\x28\x89\x33\x13\x0d\xa3\x38\x87\x1c\xaa\x13\xc1\x25\x87\x33\xdf\ -\xbc\x3e\x52\x67\x4f\x3e\x7d\x58\xa9\xed\xf5\xc7\xf5\xf2\xf6\x66\ -\xde\x59\x6d\x3a\xb5\xde\x5c\xde\x5c\x5d\xae\x6e\x6f\xae\xe7\xdd\ -\xcd\x6d\xf7\xe4\xfc\xec\xa7\xe7\x7f\x3c\x7b\xf7\xf7\x9b\x17\x6a\ -\xbd\x7d\xaf\xde\xfc\xf9\xf4\xb7\x5f\x9f\xa9\xae\x9f\xcd\xfe\xf2\ -\xcf\x66\xb3\xe7\xef\x9e\xab\xb7\x17\x2f\x95\xd5\x76\x36\x7b\xf1\ -\x7b\xf7\xf8\x91\x3a\xfc\xba\xc5\x66\x73\xf7\xcb\x6c\x76\x7f\x7f\ -\xaf\xef\xbd\xbe\xfd\xf8\x7e\xf6\xf2\xe3\xe5\xdd\x62\x39\xad\x67\ -\xb0\x63\x56\x76\xc0\xee\x19\x48\xb5\x56\x5f\x6d\xae\xba\xf3\xc7\ -\x8f\xce\xca\x19\x1b\x50\x25\x19\x33\xc4\xec\xc7\x21\xd9\xb1\x53\ -\xd3\xea\x72\xbd\x9e\x77\xcb\xe9\xf6\xa6\x53\xdb\xe5\xf5\xfd\xd3\ -\xdb\x4f\xf3\xce\x28\xa3\x5c\x18\xac\xb2\xc6\x85\x8e\xdb\x61\x3b\ -\x05\x96\xdd\xc0\x16\xa9\x84\x33\xc6\x94\x43\x3b\x75\xd7\x2f\xaf\ -\xe6\x5d\x1a\xb2\xa9\x6a\xdf\x2f\xaf\x36\x8b\x79\xe7\x4d\xd2\x83\ -\x8b\x9d\x5a\x5c\x2f\xdf\x2f\x8a\x3a\x2e\x17\xed\xca\x92\xb3\xbb\ -\xcb\xcd\x42\xc1\xbe\xd7\x3e\x8e\xda\x8d\x19\x34\x50\xce\x46\x1d\ -\x53\x1e\x43\x5a\xd8\x34\x18\x1d\x07\x1b\x8c\x9f\xd2\xa8\x4d\x28\ -\x63\x50\xd4\x06\xaf\xc1\x16\xd8\xa0\x86\xa0\x87\xe4\x87\x1c\xf8\ -\x24\x0e\xc7\xad\xcb\x49\x07\x9f\xe3\x38\x4c\x46\xa1\x8c\xbe\xb5\ -\xad\x6f\x49\xc8\xaf\x48\xb5\xa9\x67\x4a\xb0\xd5\x24\x8d\x26\x47\ -\xf6\xfd\x82\x89\x30\x4c\x46\x63\x1b\xd7\x9d\x09\xfb\xcc\x62\x41\ -\xa9\x7f\x96\xab\xd5\xbc\xfb\xd9\x7a\xe7\xd2\x65\xa7\x6e\xef\x2e\ -\xa7\xe5\xe6\xdf\x79\xa7\xe3\x98\x98\x27\x6c\x77\x7e\x36\x2b\x08\ -\x0b\xb4\x2d\x28\xa0\x63\x01\x39\x2a\x9f\x33\xe8\xe3\xac\x89\x0b\ -\x0f\x60\x03\xd4\xd1\x6e\x01\x78\x6d\x8a\x8e\x76\x31\x66\x9d\x4d\ -\x32\x36\x5d\xc4\xd1\xe9\xbc\x5f\xd9\x5b\x0f\x81\xb1\xc3\xf5\x82\ -\x04\x7c\x7e\x6d\xed\x38\xe8\x30\x78\x1b\xb3\x8a\x76\xd4\xb6\x00\ -\x1f\xc1\x68\x3b\x68\x3b\x94\xcd\x10\xdc\x69\x1c\xc2\x68\x7b\x37\ -\x68\xf0\x31\x98\xaf\x3c\x28\x5e\xe0\xe9\x7d\xd4\xbb\x41\xa4\x55\ -\xe9\x20\x43\xd5\x01\xa0\xa2\x3d\xa0\xe2\x95\x75\x10\x27\x31\x78\ -\x00\x6a\xd4\x69\x17\x25\x24\x2a\x6a\x5f\x42\x28\xa8\xac\x0b\xf0\ -\x71\xe8\xeb\x40\xa1\x2e\x3d\x4a\x20\xe9\x55\x00\x5b\x85\xa2\x50\ -\xe3\x3a\xe5\xd7\xce\x56\x1c\xab\xc6\xca\x65\x9d\x00\x99\x41\xd5\ -\x45\x13\xda\x40\xc2\xf1\x60\xa9\x15\xfb\x88\x27\xe3\xc0\x1a\x9d\ -\x76\xb9\xc1\x56\xb1\x11\xe2\x80\xda\xa0\x7c\x3a\xfb\xb0\x28\xd0\ -\x14\xe2\xbe\xee\xc9\x0c\x34\x56\x2c\x0b\x13\x2d\x43\xe0\xd0\xc8\ -\xea\x1f\x86\x2e\xa2\xb4\x92\xfe\x64\xb2\xd0\xe9\x68\x2e\xba\x13\ -\xcd\xa8\x9f\x7a\x01\x2a\x8b\x31\x5c\x84\xbe\xa0\xe8\x41\x00\x0d\ -\x86\x4d\xe8\x65\x50\xf6\xc2\xb0\x9e\x0e\xc2\xc0\x23\xb1\x32\xa6\ -\xd0\x0a\x1a\x60\x2c\xb2\xd0\xc5\x11\x82\xd4\x0b\xab\xd9\xd1\xa8\ -\xb2\x48\x9a\xf0\x59\x7d\xc8\xa3\xde\x6d\x20\x2c\x4b\xee\x71\x93\ -\x93\xde\x4d\x3b\x66\xb2\xd7\x3e\x16\x90\x7a\x81\x7f\x43\x13\xfc\ -\x54\x15\xcf\xb4\x4d\x24\x5f\xc3\xf2\x06\x9a\x75\x7b\xc3\xda\x1a\ -\x4a\x87\x19\x4f\x91\x61\x58\x3e\x57\x01\x87\xe5\x6e\x54\xb8\x9e\ -\xa2\x5e\x14\x94\x63\xdb\x12\x0b\x92\x1a\x91\x04\x72\x95\x83\x6b\ -\x6a\x76\x2b\x09\x04\xc5\x1f\x85\x36\x39\x1c\x13\x0c\x4b\x87\x61\ -\x69\x0d\xe3\xea\x22\xd5\x58\x2a\x8e\xa0\x24\x3e\x4e\x11\xa6\x99\ -\x12\x06\x35\x4a\x8b\x80\x41\x09\xf0\x5a\xd5\x44\x60\x4e\x12\x99\ -\x5d\x0c\x89\x63\x9f\x2a\x11\x09\x02\x64\x56\xc5\xa5\xfb\x84\x49\ -\xb4\x46\x06\xab\x12\xc1\xca\xc2\x87\x6a\x2b\x4e\xd5\x74\x83\xd6\ -\x16\x1c\xb4\xbf\xd2\xe6\xc0\xc2\x6c\xb4\x1b\xe0\x97\xa6\x53\xc7\ -\xcb\x74\x67\x80\x50\x49\xc7\xc3\x70\x15\xda\x86\xb9\xd9\xaa\x72\ -\x06\xcb\x1b\x2b\x06\x49\x27\x07\xfd\x77\x60\xf9\x29\x3a\x20\xe5\ -\x15\x2b\x07\xe8\x16\xa7\x7d\xe1\x24\xae\x54\x8b\x86\x46\x14\x8a\ -\x18\xd2\xc8\x1b\xc8\x71\x94\x9c\x54\x63\x49\x58\x6d\x37\x34\xb7\ -\x08\x56\xfb\x1d\x01\xda\x92\x85\x13\xd3\x80\x29\x4f\x25\xb0\x9e\ -\xcb\xec\x40\xf0\xb9\xf6\xac\xee\x9d\x0a\x80\x46\xdc\x1c\xdc\x95\ -\xd1\x97\x2b\x5e\x2f\xab\xd0\x89\xc5\x79\x65\x27\xd4\x49\x08\xb2\ -\x90\x75\x34\xd1\x0d\x81\xc3\x88\x9a\x19\x45\xd8\xa3\x72\x40\x01\ -\xad\x2d\x2b\x15\xe9\x42\x81\x4a\x4d\x97\xd8\x03\xb6\x77\x9a\xab\ -\x51\x11\xbf\xe0\x70\x35\x7a\xb6\x14\x2b\xd0\x42\x4c\x5f\xb5\xf4\ -\x0b\x22\x64\xd3\x97\x71\x17\xb5\x8d\x26\xa7\xc4\x3a\x2d\x4e\x71\ -\x83\x44\x90\x53\x05\x21\xd5\x31\x37\x89\x68\xa0\x6b\xd0\x52\x22\ -\x61\x88\x1c\x09\x27\x47\xd3\x67\x56\x68\xab\x6a\x8d\x5c\x95\x75\ -\x5d\x82\x4b\xce\xda\xd2\x57\x28\x08\x31\xa5\x43\xcc\xaa\x08\x7c\ -\x79\x4f\xe5\x27\x16\xfa\x18\x14\xcc\xdb\xc8\x13\x30\x53\xd9\x1c\ -\x6e\x35\x9c\x50\xc8\x46\x5d\x2b\xfc\x77\x73\x93\xa3\xda\xcb\x3a\ -\xb5\xb4\xbf\x4e\x05\x8c\x73\xdf\x60\x08\x54\xbd\x8e\x99\x05\x63\ -\x26\x6b\xc3\x6a\x04\x7d\xae\x08\x4c\x27\x9a\x33\xe6\x93\xd0\xc6\ -\xb5\xea\x2b\x73\x3f\x2e\xf3\xa3\x8e\xce\xc1\x25\x86\x4a\x07\x45\ -\x9f\x51\x74\x9f\x90\xed\x56\x76\xc9\x46\x68\xb6\x92\xb0\x2a\xb4\ -\xed\x93\xd7\xc3\xfe\x26\x55\xf3\xed\x6b\x49\x58\x77\x43\x12\xd6\ -\xe9\x08\x7c\xc1\x38\x0d\x51\xd5\xac\x6b\x04\x3e\xa5\xfa\x03\x98\ -\xcf\x31\x2b\x4b\xad\x3e\x2d\xfb\xab\xe0\x67\x08\xdd\x16\x0b\xd7\ -\xd4\xca\x79\x82\x4a\xec\x3c\xc5\x4c\x8e\xfb\x68\x6a\x0a\x3a\x41\ -\x4d\x04\x28\xeb\x06\x0d\x63\x19\x79\x58\x35\x7d\x9b\xf5\x31\x42\ -\xd2\x60\x0d\xa2\x8e\xf5\x42\x39\x8c\xeb\x2d\x4f\x4f\xd6\xf8\x1a\ -\x09\x86\x3e\x92\xfc\x58\x52\x70\x1c\x88\x96\xdc\x14\x74\x82\x83\ -\x0b\x7c\xa0\xf4\x0d\xc1\x68\x7b\xf0\x1b\xbd\x1f\x60\x2c\xd7\x01\ -\x0f\xef\x3a\x2a\x2d\x46\x95\xf7\x90\x22\xf3\xdb\x49\x51\x1e\x2a\ -\x76\xfd\x0f\x4e\x4d\x26\xd7\xc7\x85\x10\xa0\xf6\xee\x8a\x07\x9d\ -\x4a\xf0\x35\x9c\xd3\x2c\x0c\xb5\x2d\x72\x7a\xc0\x7b\x89\x60\x5f\ -\xac\x43\x33\x4a\x89\x87\x50\xe9\x47\x16\x20\x2b\x3f\x1e\xdb\xb4\ -\x39\x42\xc9\xc8\x83\x76\xa0\x55\x1a\xf9\xe5\x8d\x79\x04\x2b\x2d\ -\xda\x29\x5a\x43\x90\x17\xb5\x26\x85\xaa\x53\x6b\x59\x42\x38\xd7\ -\xab\xcb\xa6\x5e\x54\x44\xd6\xef\xc4\x41\x84\x20\x33\xf5\x15\xf8\ -\x11\xba\xe5\x8e\x3e\x1f\x39\x78\x04\xb6\x93\xa1\x49\x98\xf1\x47\ -\x74\xd4\x53\x57\xdf\x53\x1d\xf5\xb8\x21\xc6\x5e\x3e\x71\x3c\xac\ -\xa3\x92\x03\xa4\x2e\xe2\xf2\xd9\x7a\x9e\xc0\x56\x56\x3a\x2a\x85\ -\xa2\xf8\x7c\xb2\xa3\x8a\xb7\x27\x6a\xf0\x0f\x7b\x3f\x3b\xb6\x3e\ -\x37\xf8\x14\x2e\x22\xe2\x26\x62\x94\xd2\xc4\x10\x5d\x66\xad\x96\ -\xfc\x59\xe1\x62\xd5\x72\x41\x09\x03\xcd\x15\x88\xc6\xce\x6e\x4e\ -\x00\xc9\x74\xba\x14\xe1\x03\x19\x51\xf1\xd6\xe5\x8c\xb4\xa1\x50\ -\x0a\x41\x83\x06\x2e\xf3\x96\x41\x84\xc2\x10\x57\x66\x8f\x25\x46\ -\x7b\x63\x41\x38\xd2\xe3\xbc\x6a\x5d\x1f\x24\xf1\x15\xcf\x64\xac\ -\xde\x88\xb7\xb0\x16\x29\x39\xd1\x05\xdb\xaf\x0d\xe4\x3a\xd2\x50\ -\xbe\xba\x35\xfa\xdf\x71\x38\x25\x4a\x2b\xe2\xcb\x19\xb2\x3b\x43\ -\x5d\xf3\xfb\xbb\x4c\x74\xa6\x56\x94\x6f\x3c\x7e\x30\x75\xca\x05\ -\x49\xb4\xfd\x63\x52\xc3\xad\x13\x0f\x8b\xff\xfb\x57\x8f\x95\xb8\ -\x99\xa6\x0b\xc2\x72\x4b\xc8\x43\xe7\x90\xcd\x5d\x1c\xd0\x4b\x4d\ -\x1b\x14\xff\x47\x3e\xe2\xb5\xde\x5c\xbe\xeb\x15\x4f\x72\xd9\x87\ -\xbc\xe2\x1d\xdb\xf6\x65\x4e\x48\xd7\x08\x9c\x58\x58\x9e\xfc\x6f\ -\x06\xff\x8c\x71\x5f\xfd\x33\x26\x1a\xaf\x77\x45\x02\x18\xaf\x85\ -\xaa\xb4\x7f\xb6\xfd\xca\xab\x2d\x19\x47\x1d\xa4\x8e\xd6\xf2\xa3\ -\x6a\x2c\x9b\x46\xaf\xc3\xfe\xbc\x92\x6f\xe6\xd0\x8a\x7b\xb8\xcd\ -\xba\xf2\xdd\xf3\x49\x1a\xbe\x8d\xe5\xaf\x1d\xe8\xcd\x19\x2e\xea\ -\xe5\xb5\x66\xf7\x53\x4c\x7b\x9a\xfd\x91\xda\x5b\xeb\xb5\xad\x9e\ -\x72\xc0\x24\xf6\x80\x29\xb2\x8a\x4d\xd2\xf0\xed\x50\x0a\xe1\x21\ -\xd1\x10\x66\xd5\x04\xff\x61\x1e\xf5\xcc\xa3\x67\xe5\x4f\xd0\xf3\ -\xff\x00\x24\x0f\x2c\xf9\ -\x00\x00\x03\x12\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\ -\x72\x61\x70\x68\x69\x63\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\ -\x44\x54\x44\x2f\x73\x76\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\ -\x0a\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x36\x39\x39\x37\x30\x32\ -\x33\x35\x38\x37\x34\x34\x22\x20\x63\x6c\x61\x73\x73\x3d\x22\x69\ -\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ -\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\x22\x20\x76\x65\x72\ -\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x78\x6d\x6c\x6e\x73\ -\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\ -\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0d\x0a\x20\ -\x20\x20\x20\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x38\x38\x30\x22\ -\x0d\x0a\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x31\x36\ -\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\x3e\x0d\x0a\ -\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x39\x30\ -\x33\x20\x39\x32\x39\x2e\x35\x48\x31\x33\x32\x2e\x35\x63\x2d\x32\ -\x30\x2e\x31\x20\x30\x2d\x33\x36\x2e\x35\x2d\x31\x36\x2e\x34\x2d\ -\x33\x36\x2e\x35\x2d\x33\x36\x2e\x36\x56\x31\x31\x39\x2e\x35\x63\ -\x30\x2d\x31\x33\x2e\x38\x20\x31\x31\x2e\x32\x2d\x32\x35\x20\x32\ -\x35\x2d\x32\x35\x73\x32\x35\x20\x31\x31\x2e\x32\x20\x32\x35\x20\ -\x32\x35\x76\x37\x36\x30\x68\x37\x35\x37\x63\x31\x33\x2e\x38\x20\ -\x30\x20\x32\x35\x20\x31\x31\x2e\x32\x20\x32\x35\x20\x32\x35\x73\ -\x2d\x31\x31\x2e\x32\x20\x32\x35\x2d\x32\x35\x20\x32\x35\x7a\x22\ -\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x70\x2d\x69\x64\ -\x3d\x22\x31\x32\x38\x38\x31\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\ -\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\ -\x32\x34\x31\x20\x35\x33\x36\x2e\x37\x68\x35\x30\x56\x37\x39\x36\ -\x68\x2d\x35\x30\x7a\x4d\x34\x31\x37\x2e\x37\x20\x34\x35\x38\x2e\ -\x35\x68\x35\x30\x56\x37\x39\x36\x68\x2d\x35\x30\x7a\x4d\x35\x39\ -\x34\x2e\x33\x20\x35\x33\x36\x2e\x37\x68\x35\x30\x56\x37\x39\x36\ -\x68\x2d\x35\x30\x7a\x4d\x37\x37\x31\x20\x34\x31\x31\x68\x35\x30\ -\x76\x33\x38\x35\x68\x2d\x35\x30\x7a\x4d\x32\x34\x36\x2e\x39\x20\ -\x34\x36\x37\x2e\x32\x4c\x32\x31\x37\x20\x34\x32\x36\x2e\x38\x6c\ -\x32\x31\x38\x2e\x39\x2d\x31\x35\x36\x2e\x39\x20\x31\x38\x35\x2e\ -\x38\x20\x31\x31\x34\x2e\x33\x20\x31\x38\x32\x2e\x38\x2d\x31\x35\ -\x30\x2e\x34\x20\x33\x32\x2e\x35\x20\x33\x38\x2e\x34\x2d\x32\x31\ -\x31\x20\x31\x37\x33\x2e\x36\x2d\x31\x38\x37\x2e\x39\x2d\x31\x31\ -\x35\x2e\x37\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x38\x38\x32\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\ -\x20\x64\x3d\x22\x4d\x37\x31\x35\x2e\x32\x20\x31\x38\x34\x2e\x32\ -\x6c\x31\x39\x34\x2e\x36\x2d\x33\x2e\x39\x2d\x34\x33\x2e\x39\x20\ -\x31\x38\x37\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x38\x38\x33\ -\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\ -\x3e\ -\x00\x00\x1f\x46\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\xbd\x00\x00\x00\x5e\x08\x06\x00\x00\x00\x76\x07\x15\x1c\ -\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x12\x74\x00\x00\x12\x74\ -\x01\xde\x66\x1f\x78\x00\x00\x1e\xf8\x49\x44\x41\x54\x78\xda\xed\ -\x7d\x79\x7c\x5d\x55\xb5\xff\x77\xad\xbd\xcf\xb9\x37\x43\xd3\x34\ -\x6d\xc6\x86\x74\x4e\xdb\xd0\xc2\x93\xa1\x2a\x08\xe2\xac\xa0\x22\ -\x52\xda\xd2\x89\x99\x02\x65\x50\x64\x78\xc8\xd3\x0a\x3f\x7d\xbe\ -\xdf\x53\x11\x05\xa9\x20\x88\x05\x3a\x23\x45\xf1\xa9\xa8\x0f\x15\ -\xd0\x87\x0f\x27\x84\x4e\x69\xd3\x21\xcd\xd0\xb4\xb4\x74\x4e\xee\ -\x3d\x7b\xef\xf5\xfe\xb8\x43\xee\x4d\x6e\xd2\xa4\x13\xc5\x9e\x2f\ -\x9f\x43\x9b\x93\xd3\x3d\x9d\xef\x5e\x7b\xad\xb5\xd7\x5e\x07\x08\ -\x11\x22\x44\x88\x10\x21\x42\x84\x08\x11\x22\x44\x88\x10\x21\x42\ -\x84\x08\x11\x22\x44\x88\x10\x21\x42\x84\x08\x11\x22\x44\x88\x10\ -\x21\x42\x84\x08\x11\x22\x44\x88\x10\x21\x42\x84\x08\x11\x22\x44\ -\x88\x10\x21\x42\x84\x08\x11\x22\x44\x88\x10\x21\x42\x84\x08\x11\ -\x22\x44\x88\x10\x21\x42\x84\x08\x11\x22\x44\x88\x10\x21\x42\x84\ -\xe8\x05\x9f\x07\xf2\x8e\xd7\xb6\x3d\x8c\xca\xfc\xe3\x7d\xfc\xe8\ -\x44\x25\xce\xa2\xd2\xda\xbb\x3c\xe5\x9f\x21\xb0\x55\xc2\xea\xd5\ -\x5d\x12\xbf\x77\x4e\x6b\xfd\x9b\x47\xba\x9e\xe5\xa5\x63\xbf\xcd\ -\xcc\x17\x19\x42\x81\x63\xda\x29\xd0\x6b\x3d\x91\xf5\x4e\xcc\x56\ -\xc3\x6e\xc7\x8c\x96\xb5\x8f\xf5\xa7\xbc\x65\x15\x63\x1f\x62\xc7\ -\xe7\xc6\x7d\x99\x37\xbd\x69\xcd\x8f\x8f\x97\xf1\x5c\x5c\x3c\x7c\ -\x78\x24\x12\xfd\x91\x23\xbc\xdb\x29\xef\xee\x29\xcd\xaf\xdf\x17\ -\x92\xbe\x07\x3c\x55\x3e\x72\x62\x54\xa2\x5f\x02\xe3\x24\x47\x6e\ -\x90\x23\xbe\x73\x5a\xcb\xaa\x9f\x1c\x8d\xba\x96\x0c\x1e\x33\x5e\ -\x69\xaf\x36\x50\x7c\x09\x94\x9e\x01\x00\x42\x89\x21\xd0\x62\x77\ -\x5b\x04\xdf\x98\xbe\x65\xf5\xd7\x8e\x48\x5d\x83\x46\x4d\x60\x3f\ -\xba\xcc\x69\x1a\x0f\x00\x8e\x24\xf9\x1b\x95\xf8\xbf\x24\x7e\x66\ -\xc2\xb6\xb8\x98\xaf\xcc\x68\x5e\x3d\xbf\x4f\x93\xb5\xea\x54\x49\ -\x94\x62\xc4\x89\x5b\x71\x69\xeb\xea\x8b\xdf\x76\xc2\x97\x8e\x7e\ -\x97\xf6\xf2\x9e\xb7\xcc\xa5\xc2\x89\x7e\x19\xeb\xa6\xce\x6a\x7e\ -\x63\x59\x48\xfa\x1c\x78\xba\xac\x6e\x99\xd5\xea\x12\x21\x02\x41\ -\xc0\xe2\xe2\x16\x32\xe5\x48\x13\x7f\x59\xd5\xb8\xc7\x19\x6a\xb6\ -\x25\x66\xcb\x9c\xee\x7a\x26\xe9\x01\xa0\x1d\x7b\x3f\x7d\xf9\x96\ -\x8d\x2f\x1e\xd6\x2a\x52\x36\xf6\x76\x4f\xf9\xf7\x58\xa2\x3c\x90\ -\x43\x6f\xa4\x17\x26\x28\x91\x6d\xed\x41\xfc\x3d\xb3\xdb\xd6\x6e\ -\xec\xad\xdc\x47\x2b\xc7\x9c\x9b\x4f\xf9\xbf\x4f\x36\x18\xda\xc9\ -\x1b\x53\x9a\x5e\x9f\xd8\x6d\xc2\x0d\x19\xf7\x49\x52\xfc\x11\x06\ -\xde\x23\x84\x7c\x47\xbc\xc4\x28\xf3\xd3\x99\x4d\x6b\x5e\x3f\xd2\ -\xef\x6f\x61\x59\xcd\x48\x4f\x15\xfd\xd1\x29\x55\x9e\xe8\x4f\xa2\ -\x5f\x64\xed\xef\xa6\x35\xaf\xfc\xc0\xf1\x48\x7a\x7e\x3b\x2b\xff\ -\x61\x45\x4d\x5d\xe0\xeb\x4b\x1c\x13\x8c\x62\x04\x4a\xc1\xb0\xf2\ -\x19\xfc\xc8\xa2\xb2\x09\xe5\x47\xec\xc5\x54\x8e\x9d\x2f\xca\xbf\ -\xdc\x2a\xc5\x56\x33\xc0\x80\x90\x40\x48\x40\xc9\x0b\x70\x85\x80\ -\x2b\x8c\x73\xc4\x1c\x4e\x5d\x4b\x2b\xc6\x3d\x48\x91\xe8\x7f\x06\ -\x8a\xf2\x1c\x03\x0e\x02\x07\x63\xad\xc4\xe7\xef\xb5\x3b\x4b\x21\ -\xf1\x27\x88\x00\xa3\x14\x8c\x52\x70\x44\x08\x98\xcb\xac\x32\x77\ -\x1d\xac\x6c\x9f\xd5\x6d\xa2\x19\xa2\x19\x04\x86\x65\x35\xe1\x89\ -\xf2\x89\x5f\x07\x80\x05\x83\x46\xd6\x2c\x2f\x3f\xf9\xbe\xe5\x15\ -\x13\x76\xba\x3c\xff\x39\xd1\xfa\x66\xab\xf5\x24\xa7\xbd\x09\x50\ -\xea\xab\x1e\xfc\xbf\x2c\x3a\x69\xfc\x67\x8e\xe4\xfb\x7b\xb4\xa8\ -\xba\xc4\x57\x45\xff\x65\x3c\x55\x6e\x19\xb0\x0c\x58\x30\x2c\x18\ -\x44\xba\x72\x1e\xa0\x8f\x47\xd2\xbf\xad\x8d\xca\xe7\xfc\xeb\x25\ -\xc7\x7d\xcb\x5c\xe6\x79\xf6\x41\x00\x97\x1c\x89\x7a\x3c\x51\x17\ -\x49\x1f\x9f\xbd\x76\xf3\x9a\x3f\x1e\x6a\x3d\x3f\xaa\x1c\x39\xc3\ -\xe9\xc8\xdc\xcc\x7b\x02\xb3\xa5\xc3\x05\xd3\xaf\x6a\xdd\xf0\x72\ -\x42\x9d\xcb\xaf\xd7\x9e\xd7\x6d\x8d\x65\x50\x4b\x6f\x65\x7f\xbb\ -\xb8\xb8\x38\x02\x7d\x7e\xd7\x19\xe9\x79\x7c\xd9\x92\xa1\x13\xaa\ -\x94\xf0\x54\x47\x88\xd8\x1e\xc4\x98\x53\xe4\xc1\xc9\xbd\x00\x9e\ -\xcd\xbc\xff\x64\xd9\x88\x53\xf3\x10\x9d\xe3\x18\x1f\x14\xa2\x21\ -\xc4\x68\x07\xf3\x1f\x4c\x6c\xff\x2d\xd3\xb7\x6d\x6c\xeb\x4d\x60\ -\x0e\x28\x28\x78\x32\xf0\xd4\xb8\x1e\xc4\x69\xed\xc9\xd5\x13\x9f\ -\x7d\x3c\xb6\xf7\xea\x2b\xb6\x6f\xda\x1a\x4a\x7a\x00\xf3\x2a\x2b\ -\xf3\x1d\x68\x86\x28\x86\x28\x06\xc4\x01\xe2\x60\x18\x30\x0c\x58\ -\xa2\x8b\x17\x56\x8c\x3d\xec\xe5\xf1\x5b\x25\x55\x27\x09\xcb\x20\ -\x43\x80\xa1\x94\xe4\x95\x04\xe9\x08\x70\x22\x70\x22\x08\x98\x55\ -\xc0\xac\xe6\x97\x8f\x2a\x3b\xf4\xc9\xa5\xbf\x28\x22\x10\x11\x08\ -\x2c\x04\x16\xfb\xc4\xfd\x6b\x8a\xf0\x00\x60\x8c\x21\x11\x01\x25\ -\xaf\x54\xfd\xb1\x78\xc7\x6f\x7b\x2b\x7b\x60\xb4\xf8\x42\x4b\x50\ -\x22\x16\x22\x36\x59\xba\xc0\x11\x2a\x2d\xab\xd9\x71\x85\x88\x61\ -\xc0\x11\xe0\x90\xe8\x6b\xe2\x12\x18\x12\x58\x11\x10\x68\x7f\xaa\ -\xbc\xc7\x06\xd6\x8c\x5c\x5a\x3e\x7e\x91\xe7\x15\xfe\xdd\x78\xfa\ -\xfa\xc0\xf3\xc6\x1a\xad\x07\x07\xac\xaa\x03\xd0\x54\xf6\xf3\x5e\ -\x9c\x87\x3a\xbf\xa7\xf6\x2c\xa8\x18\xf5\x31\xab\x22\xe7\x8b\x00\ -\x09\x4d\x4d\x12\x57\xf2\x46\x00\xa6\x38\xeb\x0b\x0a\x22\x05\x0b\ -\x96\xa5\x74\xba\x13\x9d\xf4\xc3\x78\xd0\xf9\xa4\xfc\x41\x3d\xfd\ -\xde\x11\x93\xd2\x91\x7b\x0e\xb7\x9e\xa1\x91\xa2\x5b\x84\x3d\xbf\ -\xaf\xcf\x17\x69\xff\x63\x87\x5a\x97\xb0\xec\xed\xae\x92\x48\x96\ -\x04\x8f\x2a\x3d\x80\x28\x87\x29\x15\xdf\x5f\xd9\x5b\xd9\x79\x2a\ -\xff\x3e\xe1\x83\xbf\x2e\x71\xe6\xe7\x60\xf7\x5a\x2e\xe3\xcd\x08\ -\xed\x78\xaa\x7c\xdc\xc4\xa5\x15\x13\x16\x14\x16\x0c\x7c\xdd\x69\ -\xef\xd2\x1e\xcb\x21\x8c\x19\x5e\x6d\x3e\x9c\xdb\x98\x1e\x73\xbb\ -\xa7\x0b\x7e\xde\xa7\x31\x21\xf5\x11\x77\xd2\xc4\x6f\x86\xa4\x07\ -\x10\x01\x9d\x05\xa2\x94\xc0\x05\x2b\x4a\x5c\xc4\x60\x62\x80\x18\ -\x8e\xf9\x9c\x85\x15\x75\x93\x0e\xb5\x8e\x07\x07\x0c\x1d\xec\xbc\ -\xc8\x17\x1c\x13\x88\x12\x97\x22\x86\x22\x4e\x4b\x7a\x62\x02\x31\ -\x81\x05\x89\x8b\xe8\xbc\x43\xa9\x6b\xfe\xa0\x9a\x4f\x42\xf9\x6b\ -\xc0\x0c\x30\x43\x41\x02\x05\x09\xae\x68\x5a\xff\xbb\xcc\xe7\x8c\ -\xf2\xc7\x0a\x31\x40\x04\x10\x81\x93\x2f\x41\xf2\xf3\x06\xf7\xaa\ -\x87\xb2\x1e\xe4\x0b\x04\x8a\x01\xc5\x19\x2f\x30\x26\x8c\x98\x00\ -\x1d\xeb\x8d\xec\x3f\x7f\x56\xd3\xaa\x0b\x7c\xeb\x76\x26\x9b\x91\ -\xee\x37\x40\x60\xf6\xdf\xc7\xbe\xf7\x0f\xeb\xd1\x6c\xa3\x5c\xbe\ -\x63\x0b\xab\x01\xab\x13\x6e\x24\x30\x25\x0d\x6d\x05\x02\x59\xa3\ -\x64\x63\x77\x15\xae\xe6\x74\x2d\xea\xdf\x1d\xc5\x7f\x0a\x96\x20\ -\x3d\x8e\x70\x00\xd9\x35\x9a\xcd\x66\x8f\x29\x5d\x9c\x61\x45\x96\ -\xf5\xe7\x96\x56\x9d\x3c\xf7\x84\x27\xbd\x02\x4e\x49\x2c\x89\x07\ -\x79\x4e\xa9\xeb\x0f\xb5\x8e\xa2\xc2\x82\x2f\xf4\xdf\x9d\x45\xef\ -\x3a\x94\xba\x06\x14\x0e\x98\xac\x1d\x5d\x96\x2d\x75\xed\x2b\x99\ -\x3f\xff\xa0\xac\xac\x1c\xc4\x1f\x74\x39\x8d\x54\xbf\xb0\x67\x43\ -\xbc\xe6\xf4\xde\xea\xb6\x08\x1e\x6e\x89\xef\xfe\x97\xcb\x9a\x1a\ -\x7e\xf1\xff\x87\x9c\x54\x05\xc1\xd9\x3d\xc8\xdd\x81\x39\x56\x80\ -\x86\x9c\x2b\x2d\xb0\xef\x9a\xcd\xeb\xd6\x74\x5b\x71\xc4\xff\x57\ -\x27\x6e\x4b\xdc\xc4\x96\xb3\x15\xdd\x69\xbb\xd8\x3d\x07\x4c\xec\ -\x23\xbc\x79\xe5\x28\x72\xf6\xd5\xee\xf5\xc8\xed\x27\x34\xe9\x7f\ -\x50\x36\xa2\x5c\xb4\xfe\x50\x42\x4a\x48\xe2\xca\x1c\x6e\x38\x48\ -\xf2\x3f\x86\x5c\xfc\xbd\xd2\xd2\xc2\x43\xa9\x23\x4a\xfe\x8d\x29\ -\x5d\x33\xe1\xef\x20\xa4\x74\xee\x4c\x53\x13\x10\x08\x31\x84\x18\ -\x04\x4c\x7c\xbc\xb4\xae\xa2\xbf\xf5\xf9\xce\x7e\x46\x98\x52\x9a\ -\x2d\x00\xf2\x08\xf4\x9b\x84\x97\x6a\x74\xdd\xe2\xaa\xba\xe9\x85\ -\xba\xf4\x77\xac\x78\x00\xc1\x81\x10\x24\x2f\x0b\x76\xed\x9b\x10\ -\xec\x5f\xd0\xd3\x3b\x12\x8e\x7e\xd1\x10\x91\x21\x4a\x57\xc0\x08\ -\x0c\x23\x30\x71\x32\x53\x66\x6e\x69\xb8\xfe\xf6\xb6\xb6\xfd\x00\ -\x30\x0c\xfc\x01\x11\xf1\x05\x04\x41\xe7\x4a\x4a\xb0\xd0\x62\xa1\ -\xe1\xe0\x49\xe0\xb4\x98\x56\xb8\xf8\x1c\xe7\xcc\xe3\xda\x75\xd1\ -\x83\x08\x20\x31\x45\xdf\x28\x2f\xef\xb6\xbb\xaa\x44\x9d\x4f\x90\ -\xef\xe7\x51\x74\x1e\x84\x40\x12\x4f\x5c\xb0\x5f\xbf\xa6\x79\x7d\ -\xd3\x14\xc0\x92\x31\xcf\x2b\x71\x50\xd2\xf9\x1e\x41\xaa\x66\x51\ -\x65\xe5\x90\x13\x96\xf4\x85\xca\xef\xf3\x52\x27\x84\x01\xc5\xde\ -\xe0\x7e\x4b\xec\x3c\xf6\xee\x76\xc4\x03\xfa\xad\x97\x13\xb4\xf6\ -\xe5\xa3\xfd\xf9\x37\xcb\x2a\x46\x97\x5a\xf6\x06\x76\x51\xf0\x11\ -\x00\xeb\x7e\x58\x31\xba\x2e\xca\xde\x1f\x08\xbc\x50\x98\xbb\x79\ -\x3a\x9c\x8b\xcf\xdf\x11\x0f\xde\x7b\xc5\xf6\xed\x39\x3d\x1c\xf7\ -\x97\x95\x95\xe6\x89\xbe\x30\xb7\x34\x96\x1f\x5f\xd6\xb8\xfe\xe9\ -\xcc\x7b\xc1\x01\xbc\x00\x96\xfa\x6e\xfd\x82\xd9\x2d\x12\xdc\x01\ -\x15\x7f\xd7\x4e\xd5\x5e\x3d\xb5\x69\x6d\xd5\x8c\xe6\x75\x8f\xf8\ -\x16\x03\x73\x1b\x55\xb6\xb9\x32\x08\xb2\x0c\xd0\xa7\x2a\x46\x9e\ -\xe9\x88\xf2\x3b\x58\x9f\x45\xd0\xa3\xd2\xf3\x44\xb0\x73\x7a\x63\ -\xfd\x7f\xa4\xcd\x13\x89\xbf\x90\x63\x5c\x89\x54\xc1\x84\x13\xd6\ -\x65\xa9\xc5\xbb\xd4\xa4\xa4\x6d\xd2\xa8\x4b\xc9\x5e\x91\xae\x83\ -\x45\xf0\x49\x9d\xd6\x2f\xfd\xba\xbc\xbc\x4c\x79\xd1\x9b\x04\x99\ -\x0a\x54\x72\x33\x08\x2e\xf7\x7c\x4f\x56\x4c\x00\x3c\x76\xbb\xfb\ -\x53\x5f\x93\xdd\x3f\xae\xdc\xcb\xcf\xea\x87\x23\x07\x05\xef\x2b\ -\x4a\x73\x6d\xc2\x0d\x9b\xdc\x04\x73\x56\x48\xcc\x7e\x4b\xf2\xfd\ -\x3d\xf1\x8e\xef\xcf\xd9\xb6\xa5\xa1\x57\xaf\x8d\x2a\xa8\x15\x56\ -\x70\x94\x26\x58\xaa\x3b\x1a\xe4\x9e\xee\x66\x0f\xe7\x07\x45\xd6\ -\x45\x5f\xf2\x48\x6a\x13\xfd\xb1\x02\x00\xed\x30\x53\xae\x6a\x5a\ -\xff\xab\x1c\x33\x67\x94\xa8\x04\x2b\x01\x80\x5c\xe0\x00\x60\x27\ -\xe8\xce\xb9\x3b\x77\xee\xc9\x96\xf2\xfa\xb6\x40\x7b\xa2\x81\x4f\ -\x5b\x4a\x74\x88\x44\xc1\xc1\x3e\x99\xf9\xdc\x8c\xad\x0d\xbf\x5d\ -\x7a\xd2\x44\x49\xbc\x5e\x45\xe9\x71\x21\x35\x12\xc0\xef\x4e\x48\ -\xd2\x13\x51\x51\x9f\x25\x2f\x08\x20\x3a\xb3\x5f\x52\x9e\x8a\xbe\ -\x70\xc8\x8d\x13\x20\x86\xf8\xc6\xfe\xfc\x93\x7c\xaf\xa0\x36\x77\ -\x47\x5d\xd6\x7d\xe5\x4c\xbd\x71\xb1\x45\xcf\xb6\x6c\xf8\xfa\x72\ -\x20\xde\xa7\xb2\x11\x99\x25\x44\xdd\x5d\x7e\x62\x5d\x7b\x17\x9b\ -\x21\x39\xdb\x4a\xf2\x84\x2f\x33\x59\x5d\x72\x2b\xaf\xda\x92\x83\ -\xf0\x89\xf1\x1d\x23\x39\x9c\x49\x03\x20\x53\x01\x2c\xce\x26\x3d\ -\x0f\x74\x39\xac\x20\x76\xf4\xbf\x59\x36\x48\x55\xed\x8d\x39\x1e\ -\x03\x01\x3b\x4e\x48\x49\x7f\x1e\xa0\x85\x5c\x91\x63\xdd\x45\xd0\ -\x4a\xce\x9f\x49\x04\x16\x54\xb9\xa8\x6a\xfc\x47\xa6\xb7\xac\xfe\ -\xf5\xc1\xca\xff\x46\x79\x79\x99\x4f\xde\xf5\xa9\x17\x99\x7a\x9f\ -\x2e\xbd\xb2\xa4\x0d\xd6\xe4\x4b\x97\xd4\xf2\x9b\x32\xb8\xac\x66\ -\xbb\xa5\x5f\x06\xb3\xf3\xee\x10\x45\x59\x92\x98\x05\x20\x58\x47\ -\x24\xbb\x20\xf2\x8a\x98\xd8\xaa\xa9\x2d\x0d\xfd\x36\xe6\x94\xb8\ -\xb3\x2c\x65\x72\x27\x9e\xe4\xb6\xcc\xbf\xa6\x69\x7d\x53\x37\x7d\ -\x55\xab\x42\x30\xab\xf4\x0a\xea\x88\x44\xe4\x57\x3d\xba\x86\x7d\ -\x9d\x1d\xc6\x40\x09\xbf\xa8\x8b\xe8\x87\xba\x19\xcc\x6c\x97\x40\ -\x45\x3e\x96\x18\xcf\xd4\xca\x85\x8e\x80\x50\xf8\xf0\xa0\x91\x03\ -\xa3\x11\x3d\x56\xc1\xbb\x8c\x88\x6f\x30\xc4\x29\x6b\x3e\xf5\x46\ -\xb7\xac\xde\xb2\xf6\xbf\x4e\x48\xd2\x5f\x3a\x64\x58\x29\x11\x47\ -\xfa\xdd\x50\xe2\xff\xb7\x0c\x78\x61\x0a\x60\x7b\x7b\xae\x8a\x8a\ -\x6f\x27\x56\x03\xe4\x50\x1b\x48\xbd\x97\xdf\x15\xf3\x00\xed\xb1\ -\x0c\x8b\x77\xf7\x7e\x2c\x30\x26\xb8\x63\x76\x5b\xc3\x76\xf4\xc5\ -\x4d\xd5\x0b\x72\x79\x7b\xde\x34\x66\x49\x2f\x7d\xc8\xf4\x9a\x40\ -\x41\xfe\x94\xeb\xb1\x47\x8b\x47\x0c\xeb\xa9\x88\x03\x31\xd9\xdc\ -\xed\xdd\x6d\x5d\xf7\xa3\x65\xd5\x27\x7f\x2d\x60\x5d\x95\x79\xdf\ -\x83\xfa\x8e\x17\x2d\x78\x88\x48\xd8\xe5\xdc\x84\x00\xc4\xc6\x96\ -\xde\x03\x98\xe3\x81\xf4\xc7\xdc\x90\x2d\x52\xaa\x4e\xc8\xa5\xbd\ -\x0a\x22\x04\x11\x4a\x88\x5a\x21\x10\xa4\x85\x13\x2a\x0d\x40\x04\ -\x43\x8c\x84\xd4\xa0\x49\x52\x39\xfe\x53\xbd\xea\xf2\x83\xab\x87\ -\x92\x17\xb9\x2d\xd3\x8b\xd2\xb9\x63\x98\x96\x64\x00\x71\xd2\xb7\ -\x21\xe9\xe7\x52\x3b\xa4\x00\xb0\xaf\xb1\x71\x5f\x5f\xfb\x33\xbc\ -\xb8\x74\x02\x1c\xfc\x54\x87\x52\x5d\x31\x50\xd1\xd9\x6d\x0d\xdb\ -\x0e\x97\xf0\xa2\xb0\x91\xba\xc8\x29\xe7\xf0\xf7\xcf\x65\xec\xf2\ -\x76\x79\xbe\x3c\x41\x3b\x4a\xaf\x67\x71\xb8\xfd\xb9\x9e\x8d\xfa\ -\xea\x1c\x6d\x1d\xb4\x75\x19\x93\xc4\x81\xc8\xfc\xed\x86\x96\xb5\ -\x6b\x73\xce\xa7\xc0\xce\x89\xc2\xb5\x47\xc8\xc1\x23\x81\xcf\x70\ -\x3e\xc3\x39\x25\xca\x32\x88\xd8\x82\xd8\x26\xcb\xb1\xd0\x62\x04\ -\xe8\x78\xf4\xd2\x96\x75\xc7\x8d\xcb\xf2\x98\x4b\x7a\x16\x9c\x23\ -\x90\x00\x40\xce\x5d\x52\xb2\xf2\x9c\x62\x37\xc7\x12\x77\x31\x68\ -\x99\x84\xdc\x29\xe8\x12\x3b\x92\x35\xa1\xfc\x82\xbb\x0f\xdf\xe0\ -\xe8\xdf\xe3\x9b\x76\x6d\xaf\x9f\x50\x51\xfc\x26\x80\xd2\x2c\x17\ -\x26\xd1\x27\x16\x56\x4d\xf8\x0a\x89\x7b\x25\x60\xb7\xe1\xb2\xe6\ -\x35\xf5\x00\xf0\x78\xf1\xf0\x62\x15\x89\x0c\x52\x46\x4a\x89\x5c\ -\x1e\x11\xf6\x5c\xba\x7d\xfd\xdf\x7a\x2a\x3f\xce\xd8\xac\x12\xd3\ -\x32\xad\xee\xf5\x6a\x03\x38\x7f\xae\x03\x53\xb6\xf9\x9e\x1b\x1e\ -\x49\x49\xae\xfb\x16\xd2\x63\x98\xf3\x25\x6d\x6b\x7e\xf6\x50\x4d\ -\xcd\xd0\xc1\x3c\xe0\xe3\x4a\x68\x32\x84\x3e\x9e\xfb\x3d\x9b\x7a\ -\x12\x7c\xdf\xba\xf8\x6b\x33\x9a\x1b\x5e\xc0\x71\x84\x63\x4f\x7a\ -\xe3\xce\x12\x1f\xbf\x10\xe0\xc2\x4c\x96\x69\x67\x0c\x00\x58\x67\ -\x56\x28\xd2\xd7\x2a\x4e\xfc\x42\x92\xba\xa3\x23\x40\x31\x7d\x18\ -\xc0\xbd\x39\xa5\x7c\xc5\xf0\xe1\x8a\xbd\x2b\x53\x5e\x0e\x08\x27\ -\x4b\x37\xc9\x49\x23\x49\x0d\x24\x11\x92\x20\xc8\x72\x1e\x75\xfe\ -\xc5\xf5\xaf\x3f\xf7\x00\x07\x96\x08\xdd\xec\x8b\x3c\x0a\x00\x86\ -\x50\x90\x74\x27\x16\x11\xf3\x3c\x61\x86\x06\xb0\x78\xe8\x29\x36\ -\x59\x6f\x42\x0e\x7b\xc9\x06\xc2\x60\x71\xf5\x78\x18\x2b\xbf\x3f\ -\x00\x77\xdd\x9c\xd6\xfa\xf4\x86\xd0\x7d\x45\xd5\x25\x9e\xe1\xeb\ -\x81\xc0\x89\xe7\x71\xda\xf4\x14\xd7\xa3\xcd\xa1\x88\xca\x1d\x00\ -\x4e\x76\x84\xc4\x41\x05\xf1\x9d\xb9\x1d\x0a\xd8\x43\xa9\x5d\x05\ -\xb1\x29\x75\x68\xf7\xee\xf6\x1d\x8b\x7b\xeb\xf3\x0d\x8d\x8d\x6f\ -\x25\x8d\xdc\xc5\x00\xb0\x62\x58\xed\x27\xa2\x86\xce\x12\x71\x11\ -\x68\xfe\xf3\x81\x58\x6c\xf3\xec\xb6\x4d\x7f\xc2\x71\x8a\x63\xae\ -\xde\x28\x74\x8f\x4f\x49\xeb\xae\x62\xf6\xd7\xb7\x76\xfc\x1e\x70\ -\x1d\x39\x25\x10\xe9\x73\x16\x56\x8e\xcb\xb9\x3b\x59\xcc\xfe\x3c\ -\xf4\x62\x2b\x1c\x10\xd3\xa7\xe5\x55\x44\x3c\x2e\x1b\x51\xd2\x9f\ -\x3e\x4d\x6b\xab\x5f\x22\x62\xae\x3d\xac\x71\x61\xf7\xfe\xa8\x0a\ -\xce\xc8\xbc\x77\xeb\x9e\xa6\x9d\xaa\x0b\xc1\x15\x0c\x98\xcc\xc8\ -\x1e\xdb\xef\xe8\x0b\x0a\xd8\x9d\x31\xde\xa2\x95\x6a\xce\xf5\x6c\ -\x47\x6c\xdf\x9f\xbb\xcf\x04\x79\x69\xee\xf6\xed\xfb\xfa\xd3\xf6\ -\x8b\x36\xd7\xff\xe2\xe2\xe6\xb5\x5f\x9a\xdc\xb2\xee\x8e\xc9\x8d\ -\x6b\x97\x1d\xcf\x84\x3f\xe6\xa4\x5f\x34\xa8\xf2\x7d\x16\x58\x69\ -\x89\x4a\x32\x0d\x2d\x82\x40\x98\xb4\x23\x7e\xee\x1e\x6c\xea\x20\ -\xb1\x7f\x4d\xed\x94\x26\x55\x7b\x80\x1c\x40\x0e\x9a\xf5\x35\x5d\ -\xcb\x7d\xa4\x6c\xf8\x75\xc4\xd1\xcb\x53\x2e\xce\xc4\x4e\x64\xf2\ -\x6f\x22\x70\x12\xfc\xfd\x57\x8d\x6b\xbf\x97\x67\xcc\x26\x2d\x89\ -\x9d\xc9\x4c\x17\x25\x24\xeb\x2f\xa4\x58\x0d\xee\x6f\xdf\xa6\x34\ -\xad\x5a\x24\x62\xfe\xc5\x27\x2c\xf4\x20\x71\x4d\x02\x26\x01\x27\ -\x76\x95\x01\x05\x25\x9a\x14\xb3\xb0\x66\xcb\x0c\x97\xd4\x7b\x09\ -\x0a\x22\x0a\xae\x39\x12\x98\xbf\x77\x2d\xd7\x38\x37\xc7\x63\xac\ -\xf4\xc5\xbe\xaa\x24\x58\xa1\x9c\x59\xaa\x83\xf8\xff\xf4\xd8\x8e\ -\x6d\xf5\x2b\x3c\xb1\x67\x44\x4d\xec\x87\xbe\xc4\x1e\x66\x17\x7c\ -\x7d\x4a\xeb\x86\xc6\x5c\xcf\xce\x7e\xab\xed\x0d\x16\xf3\x4d\xa5\ -\x64\x5b\xc4\x19\xf1\x5d\x4c\xb4\x0d\xea\xf1\x4f\x8e\x63\xaa\xde\ -\x08\x7b\xa7\xc5\x23\xf9\xb7\x10\xba\xef\x94\x0a\x04\x4a\x68\x53\ -\x42\xe2\xbb\x97\x81\x1e\xe2\x47\x48\xba\x46\xfe\x51\x91\xca\xfb\ -\x7c\xcf\x95\x3a\xb1\x30\xb7\x2e\x07\xec\x25\x70\xdb\x00\xd4\xf6\ -\x2e\xe9\xd1\xb0\x79\xeb\xfa\xf5\x87\xd2\xbf\x29\x4d\xab\xd6\x03\ -\x98\xf9\x44\xf9\xa8\x5b\xa3\x79\xde\xf9\x9e\xe5\xd3\x9d\xe5\xb2\ -\x44\xc4\x57\x2a\x1c\xc2\xc6\x13\xea\x9a\x8d\x91\xa5\x6d\xa2\xe8\ -\x35\x4b\xe6\xd5\x69\x4d\xeb\x37\xe6\x52\xae\xa6\x6e\x5b\xff\x3c\ -\x80\xe7\xfb\xd3\x8e\x0b\x13\xed\xb8\xaa\x2f\xcf\x7e\xb6\x65\xed\ -\xed\x00\xee\x58\x58\x53\x33\x22\x12\x48\xc9\xe4\xd6\x2d\x7f\x0e\ -\x49\x7f\x04\xb1\xd3\x0f\x7e\x55\xa2\xbd\xef\x08\x3a\xfd\xe6\x69\ -\xc3\x4c\x1c\x84\x5d\x14\x00\xda\x45\x7e\xeb\x09\xee\x04\x00\x9b\ -\xf4\xf3\xa6\xfc\xea\x04\x1a\xb1\xa0\xba\x76\xe8\x65\x4d\xf5\xcd\ -\x00\xb0\xa0\x6c\xc4\x44\x52\x6a\x8c\x49\xda\x6e\x69\x3b\x4f\x52\ -\xfe\x6c\xbb\xe2\xb2\xa6\x86\xdf\x02\x80\x11\x15\x97\xe4\x3e\x4f\ -\x6a\x1f\x20\xe5\xa7\x67\x97\x72\xad\xc9\xcb\xa7\x7b\x98\x85\x00\ -\x8f\xf5\xb7\x7f\xf7\xa1\x3a\xef\x56\x34\xb5\x27\xbd\x36\x3f\x4a\ -\x5e\xef\x04\xc8\x8c\xc6\xc6\x0d\x00\x36\xe0\x04\xc0\x31\x55\x6f\ -\x06\xab\x81\x1f\xe9\x45\xd7\x17\x21\x79\x0d\x00\x66\xb7\xae\xef\ -\x51\xb2\x11\x31\x47\xa1\xd3\x87\x4b\xf2\x75\xe4\x5a\x47\xdc\xa3\ -\xcf\x65\x3f\xb9\x3b\x3a\x3d\x0a\xea\xa0\xbe\x19\x2b\xa2\xd6\x46\ -\xf0\x5c\x7f\xfb\x76\x67\x49\xcd\xc9\xc3\xca\x0b\x77\x2d\xa9\x18\ -\xf7\xdb\x27\xaa\xc6\x4f\x43\x88\x90\xf4\x0b\x86\x8e\xac\x55\xa4\ -\xbe\x9a\x8a\xef\x4e\xc5\xaf\xa7\xa2\xf1\x2c\xdc\xd6\xfd\xc1\x9e\ -\x67\xd2\xee\x34\x1b\x3c\x45\xe8\x8c\x77\x47\x32\xf2\x5c\x1c\x19\ -\x88\x9a\x06\x00\x8b\x86\x8e\xbd\xdf\x68\x7f\x2e\x32\xfc\xd2\x29\ -\x1d\x9a\x09\x60\x96\x47\xe6\x6c\x59\xdf\xd0\xe9\xd9\x40\x24\xed\ -\xb8\x4f\x45\x13\x26\xdb\x23\xa4\x20\xa4\x40\x4c\x54\x90\x5f\xd6\ -\xef\xa8\xce\xd3\x74\x74\x8c\x63\xcf\x77\x5e\xe4\x3c\xad\xfc\xc5\ -\x8b\xab\xea\x5e\xfe\x6e\xc5\xe8\xd2\x90\x62\x27\x30\xe9\xb5\x53\ -\x5f\x25\x51\x3d\xc7\xdc\x10\x3d\x3c\xa7\xb5\xf5\x40\xea\xc7\x98\ -\xb5\x8b\xb9\x07\x9f\xb4\x80\x3f\xf6\x78\xe5\xd8\x7b\x35\xfc\x9b\ -\x7b\x2c\x4e\x9c\xb5\x2e\xfe\x60\x56\x67\x45\x06\xf6\x45\x25\xd6\ -\x71\xff\xa4\xfe\xf6\xcf\x82\x27\xdb\xcc\x93\x4d\x24\x67\x17\x33\ -\x7f\x2d\xa4\xd8\x09\x4c\x7a\x4f\x69\x6d\x33\x76\x4a\x53\x12\xd6\ -\x91\x82\x23\x05\xe5\x24\xcb\x78\x7c\x65\x6b\xfd\x7f\x93\xd8\x3d\ -\xe9\x9d\xd5\x64\xf6\x02\xa7\xa0\x9d\x82\x8e\xe8\xe8\x97\x0c\x33\ -\x59\x10\x6c\x46\x9c\x3c\x4b\x5c\x58\xe2\x12\x90\xfb\xf7\x99\x4d\ -\x1b\x5e\xcf\x56\x5d\xec\xa0\x5e\x47\x82\x01\x51\x8a\x3b\xa2\x5e\ -\x7b\xbf\x5d\x8e\xa0\x8f\x27\x56\x8f\xa4\xbb\x89\x09\x4a\xd1\xee\ -\x90\x62\x27\x28\xe9\x1f\xa9\x18\x79\xa6\x65\xff\xa2\x5e\x2d\x29\ -\x17\xcf\xf2\xdf\x3f\x00\xc4\xc4\xc9\x21\xed\xe4\x59\xc2\x4b\xb3\ -\xb6\xac\xfb\x72\xd7\xfb\x06\x36\x7a\xf0\x01\x91\xfc\x01\x5e\xf4\ -\x8c\x7e\x5b\x82\xbe\xdf\xc5\xcd\x29\xbb\x0f\xc4\xe2\xdf\x0c\x29\ -\x76\x82\x92\x3e\xa2\x75\x8b\x72\x02\xe5\x3a\x4f\x30\xa5\x62\x6f\ -\xb4\x8b\x89\x76\x31\x21\x92\x6d\xdd\x55\x06\xfb\x1b\xcf\x59\x78\ -\xce\xa6\x9f\x4f\xb9\xfe\x1c\x25\xae\x94\x8e\xce\xc9\x8c\x2b\x04\ -\xc0\xb2\xe4\x3c\x50\xce\xc4\xe9\x50\xdc\xce\xf2\x52\x41\x33\x29\ -\x5d\x9f\xa0\xc8\x6d\xef\x4f\xff\x7e\x50\x36\xa2\x3c\x15\x73\x43\ -\x62\x40\x62\x00\xe0\xd9\x6b\x7a\x4f\xa1\x11\xe2\x9f\x99\xf4\xda\ -\xd1\x41\x25\xe7\x86\x3d\xc1\xba\xae\xf7\x9c\x74\xbc\xd2\xdf\xba\ -\x1c\xb9\x3f\xcd\xde\xbc\x36\xe7\x0a\xa1\x89\xfa\xb2\xd3\xd8\xd1\ -\x1e\xec\xe9\x57\x08\x6c\x14\xa8\xe8\xbe\x72\xc9\xeb\x21\xbd\x8e\ -\x4f\x1c\x13\x3f\xbd\xef\xf4\x38\xab\x53\x69\xf4\x92\xa4\x30\x2e\ -\x69\xb0\xba\x3f\x88\x48\xfd\x17\xf7\x36\x77\x3b\x60\x30\xa3\xb5\ -\xf1\x2f\xcb\xab\xeb\x7e\x6f\x95\x7e\x7f\x86\x85\x98\xb4\x13\x53\ -\xf1\xf1\xc9\x18\x1b\x17\x24\x54\x18\x4d\x3d\xa6\x0d\x09\xac\x0c\ -\x21\x2f\x65\x0c\xa7\x83\x74\x92\x7f\xa4\xfe\xa4\xff\x09\xf6\x71\ -\x1e\x80\x03\x7d\x56\x6d\x48\xd5\xa4\xe2\xc6\x25\x29\x47\xc4\x71\ -\xcd\xa2\xf2\xba\x9b\x58\x6c\xd4\x91\x1a\x94\x3a\x50\xe2\x38\xd8\ -\x30\xb3\xa5\xe1\x8e\xc3\x19\xcf\x65\xe5\x23\x27\x32\xf4\xb5\x01\ -\xab\x17\x2e\x6d\x5d\xbd\x22\xa4\xf1\x71\x48\x7a\x30\xce\xea\x91\ -\x30\x22\xf5\x03\xf6\xed\xea\x31\xca\xd0\x58\x79\x4c\xb1\x9c\x6b\ -\x7b\x88\xd3\xee\xa2\x10\xfd\x62\xd6\xa6\xfa\x5f\x1e\x56\x5b\xc5\ -\xbd\xdf\xcf\xf3\xce\xc0\xde\x9e\x77\x41\x17\x55\xd4\x9d\x4c\x56\ -\x26\x10\x63\xb4\x65\xae\x23\xc8\xfb\xbb\x3b\xa3\xf8\x66\x28\x81\ -\x83\x06\x40\x89\x50\x0a\x11\x78\x2c\x5b\x01\xdc\x89\x2e\x01\x90\ -\x0b\x2b\x46\x7f\xcb\x73\xea\x53\x46\xf3\xb3\x7b\x85\x1e\x9c\xd3\ -\xba\xaa\x5b\xe8\xc0\x13\xe5\xc3\xdf\xad\xa9\xe0\x6e\x21\xba\xc0\ -\x91\xb0\x06\xe6\x2e\xae\xae\xfb\xd6\xa5\x4d\xab\x7a\x8d\x2b\x5a\ -\x34\xb8\x76\x9c\x28\x1e\xc6\xa0\x32\x4b\x18\xac\x80\x42\x16\x14\ -\x3a\x45\x79\x20\xa7\x04\xb4\x6a\x7a\xcb\xea\x87\x8e\x35\xf9\x16\ -\x95\x8c\x3e\xb9\x03\xb2\xe7\xca\x9d\x0d\x5b\xfe\xa9\x48\x3f\x0f\ -\xc3\xa3\x2c\xfc\xa1\xa0\x0b\x65\x49\x27\x24\x62\x7e\x87\x7d\xd5\ -\xef\xb0\x3d\xee\x04\x6e\x6d\x6f\x7f\xae\x5a\x15\x76\x90\x92\xbc\ -\x6c\x09\x9d\x8a\xa2\xb4\x49\x69\x2b\x4d\x6f\xa9\xf8\x95\x87\xdc\ -\xd0\xd4\x8a\x41\x12\x44\xfd\xe8\x5d\x0f\x56\x8e\x58\x73\x63\xeb\ -\xc6\xac\x83\x14\x4f\x97\x8f\xbe\x12\x1c\xf9\x4f\x4b\xaa\xc4\xa9\ -\x64\x4a\xd6\x54\x82\x02\x56\xc9\x15\x27\x19\xad\xc8\x2e\x1d\xa6\ -\x9c\xce\x68\x06\x27\xb0\x76\x21\x72\x44\xfc\x6a\xab\x4f\x26\xad\ -\xc7\x30\xd3\xed\x03\xad\xbd\x6e\xfe\xe0\xda\xf1\xd7\xef\x48\xec\ -\x3a\xaf\x28\x2e\x2e\xee\xc8\x2b\x5b\xe6\x0b\xbd\xa7\x43\x51\x9b\ -\x83\x74\x38\xb2\xf9\x09\x27\x98\xbb\xe5\xa1\xaa\x11\x8f\xde\xd0\ -\xb2\x71\x6d\xb6\x9d\x51\x56\x3e\x04\xc5\xcf\x04\xca\x7b\x6f\xd2\ -\xb8\xa7\xc4\xa8\x59\x08\x00\x9b\x98\x85\x60\x78\x20\x00\x8b\x87\ -\x4e\x9c\xdd\xe1\xed\x3d\xef\x8a\x4d\x9b\x3a\x8e\x36\x27\x96\x94\ -\x8e\xb9\x49\x22\xfe\x77\x01\x20\xdf\x89\x2c\xa9\xaa\x03\xc0\x6b\ -\x04\xee\x4d\x30\x2f\x50\x4d\x6f\xfc\xe8\x60\x87\x85\x8e\x6b\xd2\ -\x8f\xac\xf0\x4f\x21\x42\x8f\x89\xfa\x85\xd5\x57\x76\x15\x78\xef\ -\x45\x0f\xce\xbd\xcf\xef\xda\xb4\x6b\x79\xc1\xf8\x17\x00\xbe\xa0\ -\x77\x5d\x1e\xd7\xcf\xdd\x74\x64\x72\x26\x7a\xa0\xf7\xc4\x55\xd0\ -\x2d\x1a\x34\xee\x8c\x55\x2a\xbf\x4f\x11\x98\x24\xae\x8d\x19\x7f\ -\x26\x87\x16\x81\xdb\x61\x9d\xdb\xe6\x4c\xfc\xd5\xe9\xdb\x1b\x73\ -\x1f\xfe\x00\x95\x5a\x52\x00\x1c\xa0\xd4\x80\x81\x11\x75\x33\x80\ -\x3b\x17\x17\x55\xcc\x35\x91\xc2\x7b\x00\xfc\x35\x4e\xf2\x0a\x43\ -\xce\xee\x5c\x40\x5d\x53\xcc\xc4\x3e\x77\x43\xeb\xe6\x6e\x07\x3e\ -\xae\xd9\xb6\x6d\xdb\x33\x15\x03\xff\x00\xe0\xbd\xdd\xe7\x37\x6d\ -\x01\x28\x4f\x44\x86\x74\x1a\xf9\x32\x49\xc7\x0a\xbe\x08\xe0\xcb\ -\x07\xeb\xdb\xa3\x45\xd5\x25\xc5\xd1\xc2\x0f\x18\xf0\x29\x60\x19\ -\x22\x2c\x1b\x0d\xa9\x5f\xcf\x6a\x5e\xf9\x5a\xaf\x92\xbd\x6c\x44\ -\xb9\xcf\x05\x0f\x09\xd3\x45\xa6\x4b\x98\x91\x28\x35\x9e\xc0\x20\ -\x71\xef\x8b\x0d\x1d\x37\x09\xcd\x6b\xe6\xbc\x63\x49\x2f\x12\x54\ -\x38\x8a\x52\x4a\x3b\x49\xfd\xe9\x92\xb2\x4e\x29\x35\xe0\xe5\xdd\ -\x6d\x4d\xbd\x2a\x2d\x26\xf6\x6b\xd2\xfe\x05\x89\xf2\x08\x29\x89\ -\x95\x20\x97\x85\xc0\x2e\x9d\xb9\x65\xed\xcf\x0e\xaa\x65\x11\xa5\ -\xb3\x0a\xa4\xe3\xe7\x25\x65\x6b\xa4\x0e\xb7\xea\x88\x48\xf0\xcb\ -\x5b\xb7\x34\x75\x8b\x41\x9f\xbe\x7d\xd3\x82\xe5\x43\xc7\x7d\x96\ -\x89\x3f\x25\x02\x58\xc2\x5e\x07\x69\x20\x52\xa7\x74\x06\xf0\xdb\ -\x00\x00\xa6\x35\xad\xe9\x57\xee\x1c\x66\x0c\x21\x17\xec\x8b\x7b\ -\x91\x42\x00\xd0\x62\x6f\x5c\x5a\x56\x7b\x4a\x00\xeb\x59\xed\xbf\ -\xe9\x21\x98\x94\xb4\x5d\xf2\x1c\xb9\x7f\x68\xc8\xb7\x63\xc6\xbc\ -\x78\x79\xdb\xe6\x9e\x0e\xb1\xcb\x67\xb7\xae\xbb\xe3\xe9\xf2\x71\ -\x2f\x69\x25\x53\x03\xe5\xfe\x1e\x37\xe6\x7f\x67\xb4\x26\xd2\x90\ -\x3f\x59\x39\xf6\x16\x4f\x45\xef\xb7\x2a\xb1\x42\xb1\xb3\x14\xd1\ -\xf1\x0b\x7a\x22\xfd\x77\x4b\x4a\x8a\x00\xa0\xd2\x2b\xbf\x87\x49\ -\xcd\x89\x73\x62\xe5\x4d\xc5\xb4\x46\xc4\xc9\xe2\xea\x71\x2f\x3a\ -\x1b\xbb\x6c\x46\x97\x15\x12\x00\x16\x54\x8e\xac\xf1\x29\xff\x85\ -\x80\x31\x2a\x79\x26\x40\x2c\xec\x6f\x0e\x30\xdd\x56\x80\xc8\x0f\ -\x40\x3c\x29\xb1\x1f\x03\x62\xeb\x66\xdf\x5f\x36\xe2\xcb\x9f\x3b\ -\x4a\xde\xaf\xa3\x4e\xfa\x88\xa7\x4a\x85\x7a\x3e\xbf\x43\x64\xfe\ -\xf6\x08\x10\xf4\x56\xc6\xb4\xb6\x0d\xdf\x59\x3e\xb4\xee\xd3\x46\ -\x7b\x1f\xec\x26\xe1\x11\xdc\xff\x56\xc7\xae\x2f\xf5\x8d\x59\x7d\ -\x38\xb9\x47\x80\x86\x5e\xd4\xd3\xaf\x2f\x69\x5e\xf3\x99\xa7\xab\ -\x47\x8e\x66\xa7\xf4\xef\x63\x3b\x9a\x1f\xd8\xb9\x73\xef\xe2\xea\ -\xf1\x2d\x42\xaa\x22\x63\xa6\xaf\xee\xb7\x76\x45\x54\x62\x3d\x2f\ -\x3b\xfc\xc1\x8b\x9e\xcb\xb0\x79\x22\x8e\x40\xd8\x2d\x90\xc7\x05\ -\xf1\x47\xa6\xb5\x6c\xee\x73\xf9\x93\xdb\xd6\x3c\x07\xe4\x88\x25\ -\xf2\xed\x4b\xec\x1c\x6c\x2a\xb7\x2a\xe1\xa0\x07\x1b\xab\x22\x55\ -\x3f\x27\xc1\x69\xb9\xb5\x43\x07\x4f\xcc\xa9\x86\x31\x09\x40\x37\ -\xd2\xe7\x71\xf4\xfb\x06\x6a\x54\x4a\x6b\xd9\x8f\xe0\xd6\xab\x9a\ -\xd7\xdf\x0f\x00\x4b\x87\x4e\xdc\x6c\x81\x49\x9d\xab\x1e\x07\x9f\ -\x3b\x8a\xee\xde\xa3\x4e\x7a\x12\x7d\x53\x40\x00\x92\xba\xae\x74\ -\x8a\x5d\xc0\xe1\x6f\x93\x5b\xd6\xbf\xaf\x2f\xe5\x5c\xd2\xbc\xea\ -\x43\x4f\x57\x4f\xbc\x91\x88\xee\x10\xb1\xd5\x71\x09\x7e\xd3\x2e\ -\xc1\x4d\x57\x75\xd1\x65\x7b\x5d\x75\xe0\x4c\x3a\xff\x58\x3a\xca\ -\x32\xf5\xce\x3b\xef\x3b\x09\x7a\x1b\x17\x99\xdc\xb4\x61\x5d\xf6\ -\x5c\x72\x6f\x39\x4a\xb9\x2d\xd9\x13\x31\xfb\xfb\xef\x6a\x45\x01\ -\x99\x40\xa0\x3d\x02\x80\x80\x24\x3f\xe1\xee\xb5\xe2\x60\x17\xef\ -\xd8\x17\x9b\x7b\xc3\xee\xc6\xb7\x8e\xc4\x3b\x59\x5c\x5a\x7b\x8e\ -\x8a\x7b\xf7\xc6\x35\x01\xe9\xb3\x05\x02\x0b\x97\xf3\x5b\x56\x2b\ -\x22\x83\x3e\x11\x44\x2b\xef\x6a\xd7\xfa\x6c\x95\x3a\x61\x25\x30\ -\x8e\xcc\x5d\xbe\xf0\x4a\x51\xf1\x5d\xd6\x61\xdb\xb4\xa6\x86\x1e\ -\x73\xf8\x04\xac\x3f\x91\xb0\x21\x12\x6e\xb6\xab\x9a\x12\x84\x4f\ -\x8c\xbd\x51\x92\xf6\x9e\x0b\xb4\xa3\xbf\xbd\x63\x0d\xd9\xc7\x2a\ -\x47\x9e\xe1\xd8\x3b\x35\xa7\xca\x22\x00\x89\x1b\xb6\xa4\x72\xec\ -\xf3\xd3\x5a\xd7\xf6\x29\x53\xf0\xe4\xa6\xd7\x1f\x5c\x06\xcc\x8f\ -\x8f\x1c\x59\x37\x73\xc3\x86\x37\xd0\xdf\x43\xd7\xc2\x07\x3d\x8d\ -\x1f\x80\xa0\x9d\xba\x1b\xc0\xe3\x7d\x9a\x8c\x80\xb2\x82\x11\xe9\ -\x54\x23\x00\x1c\x68\x44\x7f\x9a\xf5\x60\x65\xcf\x59\x09\x0c\x62\ -\x0f\xfc\xa4\x65\xe3\xad\xcb\x8f\x80\x61\xf7\xbd\xd2\xe1\x15\xc5\ -\x3a\xfa\x04\x91\xf7\xe1\xb8\xca\xf6\x86\x39\x11\x88\xa0\xdb\x37\ -\xb7\x96\x01\x63\xdb\x0b\x0b\xa7\x5a\xed\x9d\x93\xdd\x2e\xbb\x64\ -\xd6\x96\x35\x7d\xda\x71\xfe\x61\xd5\xe8\xd3\x1c\xf0\x22\x03\xe7\ -\x26\x55\xdb\x2c\x95\xcc\x82\x86\x66\xb6\x03\xec\x2a\xde\xb1\xa4\ -\xcf\x63\xff\x64\x24\x83\xb0\xd2\x12\x35\xf5\xad\x25\x10\xc0\xaa\ -\xc4\x69\x5b\x3b\xaf\xb2\x32\xff\x9e\x8c\x60\xb3\xde\x30\x05\xb0\ -\xd8\xb0\xe1\x90\x36\x7e\x3c\xe2\x3d\x1d\x9d\x71\xf9\x59\x7e\x7a\ -\x49\xdf\x57\xb0\x4a\x8d\x7a\x72\xe8\xd8\x7b\x67\x35\xaf\x3d\xa8\ -\x51\x77\x52\x49\xf9\x99\x1e\x71\xc4\xa4\xd3\xea\x30\x14\xdb\xbf\ -\xf4\xa7\x5d\x7e\x10\x8f\xb8\xbc\x22\xca\x5a\x71\xc8\x04\xed\x14\ -\xcc\xbc\xaa\x69\xe3\x61\x7d\xb7\xe9\xa9\x92\x92\x22\x9f\x2b\xce\ -\x13\x8f\x4e\x71\xc4\x37\x83\x4d\xa9\xc0\x24\x32\x43\x03\x90\xe4\ -\xf9\x7c\x22\x07\x06\x77\x3b\x35\x45\x91\xa2\x8f\x3a\xbf\x60\x04\ -\x53\xaa\x5d\x36\x06\x00\xd6\x05\x5f\xe9\x6b\x1b\xa2\xca\xbb\x19\ -\x49\xc2\x43\xc8\x63\xea\xcc\xc3\xf3\x54\xc5\xe8\x3a\x12\x35\x36\ -\xf5\x36\x14\x01\x02\xaa\x7c\xc7\x92\x5e\x89\x3b\xbd\x4f\xe2\xa9\ -\xb5\xf5\xa8\xbb\xc9\x12\x52\xd8\xf5\xf9\xec\xa7\xe5\xbe\x65\x20\ -\x1b\x07\x7d\x56\xfa\xc3\x55\x49\xd2\xf6\x3b\xe7\x47\x0e\xef\x96\ -\x01\xbd\x70\x55\xe3\xfa\xe5\x87\xd3\xdf\x65\x25\xa3\xeb\x94\xf6\ -\x57\x58\xc5\xb5\xc2\x94\x95\x28\x57\xc4\xbd\x4c\xc4\xef\xcb\x54\ -\xfe\x02\x31\xdd\x72\x4d\xba\x81\x55\xb7\x41\x69\xca\x5e\xa5\xe5\ -\x97\x97\x67\x84\x6c\x1f\x7c\x85\x55\x17\x22\x63\x84\x60\xdd\xcb\ -\x8f\x96\x8e\x1a\x5d\xa8\xf3\xee\x04\xd1\x64\x61\x14\xa7\x1f\xb5\ -\x66\xaf\xb0\xbb\xe6\x68\xf2\xe0\xe8\x86\x21\x38\x3a\x9b\x9d\x03\ -\x3b\xd7\xf9\xa1\x8a\x54\x6e\x18\xa4\xf3\xcd\xac\xbc\xa7\xdf\x39\ -\x08\x0e\xb5\x39\x66\x7b\xaa\xe2\xd4\x19\xda\x8c\x57\x91\x95\xfd\ -\xc3\x1a\xd7\xa7\x0f\x39\x94\x44\xf2\xb6\x49\xc6\x17\x4d\x20\x0e\ -\xce\xba\xa6\xfe\xb4\x6b\xb7\xd8\xe2\x74\x08\x10\x33\x84\x19\xca\ -\xb9\x33\x0f\xa7\xaf\x3f\x28\x1f\xfe\x1e\x8a\xf8\xcf\xc7\x7c\xaa\ -\x35\x4a\xe0\xd8\x02\x12\xec\x20\x31\xff\xb6\x2f\xbe\xa3\xe2\xe5\ -\x3d\x2d\x9f\xf6\x2c\x1b\x16\x01\x27\xe3\x8e\x44\xe8\x0f\x99\x65\ -\x3c\x59\x5a\x7b\x4e\x10\x8d\xd4\x10\xab\x48\x46\x7e\x22\xbf\x43\ -\x4c\x9f\x3f\x97\x79\x43\x69\x69\xa1\x16\x2a\x4c\x65\x85\x16\xb1\ -\x30\xcc\x1f\x2c\xf4\xa3\xbf\x10\x36\x57\x0b\xdb\x62\xc0\x40\xb9\ -\xd8\x0e\xd8\xf6\xfb\xac\x09\x46\xcf\xdc\x52\xbf\xf4\x1d\x2b\xe9\ -\xb5\x92\x95\x01\xd0\x63\xf2\x55\xe5\xe2\x9b\x58\x3a\x96\xe3\x18\ -\x41\x40\x9b\xfb\xac\x9a\x11\x55\xcc\x03\x74\x6f\x59\xb9\x6e\x07\ -\x2a\x02\x91\x0a\xce\xae\x44\x20\xae\x5f\x5f\x27\x2c\x24\xbf\xdb\ -\x27\x7f\x14\x64\x0b\x0e\x23\x51\x54\x31\xe7\x2f\xb7\xac\xab\x53\ -\xa6\x00\xd9\x60\x45\xbb\xdb\x3b\xe7\xca\xad\x5b\xb7\x03\xc0\x7d\ -\xd5\xd5\x79\x5d\x4a\x17\x80\xb2\xdc\xbe\x11\xc2\x99\xf1\xc4\x2f\ -\x32\xda\xa7\x1a\xaf\xde\xb2\xae\xcf\xfd\x7b\x97\x2e\x1a\xeb\xba\ -\xe4\xe2\x54\xe2\xae\x4d\x1f\xd3\x14\xb3\xde\x38\xf7\xd0\x9a\xfd\ -\x1d\x0b\xee\xd9\xd3\xb4\xf3\x58\xf0\xe0\xa8\x92\xde\xb9\x60\x8d\ -\x26\x0d\xc3\x8c\xa8\xb3\x3b\x01\xe0\x00\xcb\x66\x1f\x7c\xaa\x88\ -\x21\xe7\xdc\x77\xa6\x36\x6f\x5a\x70\xac\x48\x0f\x76\x1b\x95\x4b\ -\x2e\x2a\x4a\x75\xd1\xe9\xd3\x9e\x98\x94\x2f\x63\xc2\x80\xca\xca\ -\x62\xb4\xb6\xf6\xf8\x41\xe5\x12\x20\x1f\xce\x95\x8b\xca\xc8\x86\ -\x2c\x62\xde\x6c\xb7\x2f\xf7\x8b\xa0\x14\xb9\xd1\xa1\xcb\xbe\x01\ -\xa8\xe1\x50\xbb\xb9\xb4\xac\x76\x9e\x51\xaa\x3a\xd1\x2b\xd7\xdc\ -\xe1\xe2\x53\xae\x6c\x69\xc8\xfa\x80\x5c\xb9\xc9\x9f\x28\x4a\x74\ -\xda\x9d\xec\x1c\x3a\x92\x9f\x15\xed\xf4\xbc\xb9\x32\x9d\xfc\xbd\ -\x4d\xc5\x26\x65\x24\xa7\x4b\x1a\xba\xca\x14\x8c\x18\xe2\x7c\x3b\ -\x3a\xb0\xd6\x5e\xb1\xa7\x39\x2b\x48\xb0\x10\x91\xab\x33\x4c\x15\ -\x30\xab\x80\x5d\xfc\xaf\xe4\xdc\x3f\x2c\xdc\xca\xa9\xad\x1b\xbe\ -\x83\x63\x8c\xa3\x4a\xfa\xf8\x01\x3b\x3f\xaf\xc8\xb6\x7a\x84\xb3\ -\x01\xbe\xc8\xc1\x36\xcf\x6a\x5c\x7d\xfa\x93\x35\x27\xff\xc5\x77\ -\xe6\x2d\xdd\x5c\x7f\x4c\xe3\x3d\xc4\x79\x33\xa9\x8f\x0a\x9d\x70\ -\x64\xf1\x6d\x4d\x0d\xbd\x7e\x41\xfc\x2e\x60\xc3\x62\x00\x16\x02\ -\x81\x7d\x96\xa0\x3e\x03\x07\x6f\x60\xc4\x1f\x09\xa0\xb1\xcf\x06\ -\xb6\x92\x9d\xb1\x6e\x6d\x95\x43\x52\xf9\x6e\x02\x22\x1a\xea\xee\ -\x94\x41\x62\x88\x9e\xeb\x4a\xf8\xc4\x4a\x42\x17\x23\xc3\x81\x93\ -\x48\xff\x87\x6a\x00\x7f\x4d\xbf\xbf\xc0\xce\x8f\x5a\x7b\x75\xa0\ -\x32\x52\xa2\x10\x4e\x5a\x5c\x7d\xca\x26\xe7\xac\x26\x41\xc4\x42\ -\xf2\x59\x5c\x34\x91\x54\xcb\x2e\xc3\x1e\x4c\xcb\xae\xc7\x8d\xb3\ -\x4c\x69\xa9\x12\x88\x5a\x36\xab\xb9\x7e\x26\xde\x46\x1c\x55\xd2\ -\xcf\xd8\xdd\xf8\x16\x76\xe3\xf1\xa4\xfb\xef\xea\xe5\x95\xa3\x3f\ -\x0a\x40\x06\xb5\xef\xb9\x25\xa6\x41\x17\xf7\x31\x5d\xf5\x91\xc0\ -\x03\xe5\xc3\x46\x68\x51\xd3\xe2\x49\x6f\x12\xf7\xc0\x29\x97\x9c\ -\x15\x5a\x6c\xd5\xc1\xca\xbc\x03\x98\x24\xc4\xc5\x1a\x24\xed\x82\ -\xa1\x9e\x24\xce\xda\x7a\x96\x82\x85\xa5\xe3\xc7\x88\xc8\xa7\x7d\ -\xc8\x78\x51\x6a\x40\xea\xe8\x7a\x9c\x63\x8d\xfb\xda\x0f\x3c\x30\ -\xe7\xad\xd6\xce\x49\x41\xf6\xcd\x54\x46\xb2\x54\x96\x06\x47\x92\ -\x77\x48\xfd\x04\x62\xe7\xb1\x6c\x26\xd0\xe8\xc4\xe2\xa6\xdf\xf5\ -\xd4\xd0\x09\xd7\x05\xe2\xf6\x1c\x08\xf0\xd3\xb9\xdb\x57\xed\x03\ -\x00\x1f\x18\x62\xd1\x99\x0d\x82\x40\x31\x73\xc0\x64\xa9\x2d\x33\ -\x76\x6d\xdc\xbc\xa4\x60\xfc\x27\x95\xf0\xb3\x0c\x94\x0b\x00\x0d\ -\x6b\x40\xa8\x74\x9c\x70\xd8\x07\x40\x54\x04\x60\xb0\x10\x5c\x77\ -\x3e\x89\xc4\x88\x3a\x23\xa6\x94\xe0\x03\x4f\x95\xd7\x7d\x88\xd9\ -\xbc\x36\xbd\xb5\x7e\x47\x6a\xc5\x78\x6c\xc8\x49\x55\x00\xb0\xdf\ -\xed\xdf\x77\x73\x97\xbc\xf8\xef\x28\xd2\x77\xf3\x69\xb7\x26\x72\ -\xa4\x7f\x72\xfb\x96\x97\xde\x8e\x19\x9e\xb1\x03\x72\x70\x87\x8a\ -\xb8\x41\x07\x7b\x66\x68\x61\x61\x81\x28\x1e\x26\xc4\x31\x0d\x1e\ -\x92\x12\x67\xac\xf9\x65\x80\xc0\xe2\x60\xa9\xf3\xd0\x0b\x48\xa0\ -\xc4\xc5\xc4\x77\xbf\xcc\x5c\x09\xf6\x5a\xd3\x16\xd5\xdd\x24\xf1\ -\x21\x8f\x91\x11\xf3\x12\xe0\x8f\x4e\xb8\x18\xe5\xdd\x24\x78\x77\ -\x84\x18\x11\xdf\xbd\xf9\x64\x65\xed\x6a\x23\xf1\xd9\x24\xa6\x25\ -\x91\x70\x30\x19\x86\x00\x59\xf3\xf9\x5d\x9b\x76\x75\x2d\x6b\x5a\ -\xf3\xea\x57\x1e\x1b\x32\x64\x4c\x51\x41\xe9\x54\x6d\xf9\x42\x21\ -\x7c\x2c\xc3\x7c\xd9\xa4\xc4\x35\x88\xc8\x2a\x63\xe5\x99\x99\x6d\ -\x1b\xba\x9d\x7f\x68\xb7\xf6\xae\x3c\x71\x67\x39\xa8\x64\xae\x23\ -\xa9\x62\xa5\x7e\x03\x61\xb7\xa4\x62\xc2\x3e\x07\x31\x04\xf8\x04\ -\x44\x89\x44\x15\xa2\xc0\x2e\xaa\x1c\xd2\xd8\xa1\xf0\xf5\x2b\x9b\ -\xea\x1f\x3d\x1a\x3c\x20\x9c\x40\x78\xba\x6a\xdc\xca\x40\xfb\x75\ -\x19\xaa\x73\x5a\x9b\x77\x92\x1d\xbd\xa9\x6d\xc7\xcf\xa6\x35\xaf\ -\xe9\x35\x4b\xf2\x0f\x07\x0e\x39\xad\x38\x3a\xe4\x4f\x56\x6b\xcd\ -\x90\xfd\x00\x10\x23\x29\x48\xb9\x2e\x93\xc9\x38\xc1\x02\x23\xe4\ -\xde\x10\xc2\x4f\x3b\x4c\xc7\xb2\xcb\xb7\x36\xae\xec\x5a\xd6\x33\ -\x43\xc7\xbe\x65\x59\x15\x8b\x38\x11\xb1\x60\x67\x67\x5d\xd2\xba\ -\x61\xe1\xa1\xf4\xf3\x89\xf2\x51\x65\x51\x1d\x7d\x15\xcc\x35\x2e\ -\x65\x5b\x03\x60\xb1\x20\x17\xc0\x09\x9f\xeb\xf6\x1f\xd8\x5a\x58\ -\x58\xf0\xa7\x38\xcb\xa0\xa4\x4e\xff\x93\x4b\x5a\xd6\x7f\xe6\x68\ -\x8c\xfb\xc2\xca\x51\xa7\x47\xbc\xfc\xa7\x44\x78\x9c\x85\x40\xc4\ -\x22\x0f\x76\x7f\x62\x82\x26\xd5\x1e\xe8\x02\x90\x80\x90\xf8\x4e\ -\xae\x90\xfc\x78\x7a\xd3\xfa\xc9\xef\x78\x49\xff\xb6\x83\xe4\x45\ -\x00\x75\x7d\x93\x06\x72\x50\x49\x7f\xe5\xee\x37\xff\xfa\xe3\xc2\ -\xe2\x11\x1a\x7c\x9b\x10\x7d\x4a\x04\xe5\x49\xa9\xf9\x8c\x22\xbb\ -\xdc\x00\xcd\x41\x10\x6b\x6a\x43\xc7\xb6\xd4\x87\xd0\x7a\xb4\xb1\ -\xe3\xb1\xeb\x28\x12\x39\x2d\x66\xcd\xd9\x31\xd7\xf1\x1f\xde\x01\ -\xf7\xca\xa1\x76\x73\x76\x5b\xc3\xb6\x45\x65\x23\x26\x45\xa2\x91\ -\xeb\x94\x4d\xf8\xe2\x1d\x8b\x88\x98\xdd\x4a\xb0\x3d\x46\x41\x74\ -\xc6\x9e\xa6\x75\x0f\x17\x54\xd6\x2a\xe7\x8d\xf5\x45\x62\x85\xfb\ -\xdc\xc6\xa3\x35\xec\x33\x5a\x1b\xfe\x32\x0f\x38\x75\x62\xcd\x84\ -\x29\x11\x91\x29\x02\x77\x06\x80\xa2\xec\x55\x58\xda\x20\x00\x31\ -\x5e\x75\x22\x7f\x8e\x8b\x5d\x72\xd4\x68\x70\x22\x71\x7e\x71\xd5\ -\xc8\xe9\xe2\x0d\x58\x98\xe5\xb5\x11\xca\x1a\x88\x54\x7c\x3e\xbb\ -\xf8\xc6\xa9\x4d\xf5\x23\xfb\x53\xfe\x8a\xe2\xe2\xe2\xbd\x91\x88\ -\x3f\xbb\xad\x6d\x1b\x42\x1c\x54\xdb\xcc\x5a\x6a\x8f\xd1\x5e\xcd\ -\x09\x47\x7a\x00\x58\x5e\x5d\xb7\x39\x50\x5e\xcd\xc1\x48\x2f\x2e\ -\xf6\xc0\xf4\xa6\x75\x37\x87\xdc\xfc\xe7\x23\x3d\x9f\x68\x23\x1d\ -\x04\xf6\x0a\xdf\x99\xfd\xbe\x4b\x7e\x57\x55\x2c\xb4\x38\xb0\x18\ -\x28\x17\x08\x9c\xf9\x23\xb9\xf8\xf9\x21\xe1\x8f\x3a\x6c\xf2\x72\ -\xc7\x92\xf0\x27\xa4\xa4\x07\x12\xdf\x7d\x75\x24\xd7\x7a\x9e\x6a\ -\x24\xe1\x52\x08\xd5\x88\x93\x9a\xb8\xb8\x27\x2f\x6d\xad\x0f\x0f\ -\x5a\x87\x08\x11\x22\x44\x88\x10\x21\x42\x84\x08\x11\x22\x44\x88\ -\x10\x21\x42\x84\x08\x11\x22\x44\x88\x10\x21\x42\x84\x08\x11\x22\ -\x44\x88\x10\x21\x42\x84\x08\x11\x22\x44\x88\x10\x21\x42\x84\x08\ -\x11\x22\x44\x88\x10\x21\x42\x84\x08\x11\x22\x44\x88\x77\x18\xfe\ -\x0f\x6f\x35\xc3\xe3\x6f\xd7\x12\x65\x00\x00\x00\x00\x49\x45\x4e\ -\x44\xae\x42\x60\x82\ -\x00\x00\x0d\x08\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x34\x32\x39\x35\x31\x36\x30\x38\x30\x39\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x34\x32\x36\x38\x22\x20\x78\ -\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ -\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\ -\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x39\x32\x32\x2e\x33\ -\x34\x34\x31\x37\x36\x20\x31\x35\x32\x2e\x32\x30\x39\x31\x38\x36\ -\x76\x2d\x30\x2e\x30\x35\x30\x35\x37\x35\x63\x30\x2d\x30\x2e\x37\ -\x36\x35\x38\x35\x31\x2d\x30\x2e\x30\x38\x36\x37\x2d\x31\x2e\x35\ -\x31\x37\x32\x35\x31\x2d\x30\x2e\x31\x33\x30\x30\x35\x31\x2d\x32\ -\x2e\x32\x38\x33\x31\x30\x31\x2d\x30\x2e\x30\x33\x36\x31\x32\x35\ -\x2d\x30\x2e\x36\x37\x39\x31\x35\x2d\x30\x2e\x30\x34\x33\x33\x35\ -\x2d\x31\x2e\x33\x36\x35\x35\x32\x36\x2d\x30\x2e\x31\x30\x38\x33\ -\x37\x35\x2d\x32\x2e\x30\x33\x37\x34\x35\x32\x2d\x30\x2e\x30\x38\ -\x36\x37\x2d\x30\x2e\x37\x39\x34\x37\x35\x31\x2d\x30\x2e\x32\x33\ -\x31\x32\x2d\x31\x2e\x35\x35\x33\x33\x37\x36\x2d\x30\x2e\x33\x36\ -\x31\x32\x35\x2d\x32\x2e\x33\x33\x33\x36\x37\x36\x2d\x30\x2e\x30\ -\x37\x32\x32\x35\x2d\x30\x2e\x34\x35\x35\x31\x37\x35\x2d\x30\x2e\ -\x31\x32\x32\x38\x32\x35\x2d\x30\x2e\x39\x31\x37\x35\x37\x36\x2d\ -\x30\x2e\x32\x30\x39\x35\x32\x35\x2d\x31\x2e\x33\x37\x39\x39\x37\ -\x36\x6c\x2d\x30\x2e\x30\x34\x33\x33\x35\x2d\x30\x2e\x32\x39\x36\ -\x32\x32\x36\x2d\x30\x2e\x30\x35\x30\x35\x37\x35\x2d\x30\x2e\x32\ -\x38\x31\x37\x37\x35\x63\x2d\x30\x2e\x31\x35\x38\x39\x35\x2d\x30\ -\x2e\x37\x39\x34\x37\x35\x31\x2d\x30\x2e\x33\x39\x37\x33\x37\x35\ -\x2d\x31\x2e\x35\x35\x33\x33\x37\x36\x2d\x30\x2e\x35\x39\x39\x36\ -\x37\x36\x2d\x32\x2e\x33\x33\x33\x36\x37\x37\x2d\x30\x2e\x31\x35\ -\x38\x39\x35\x2d\x30\x2e\x36\x30\x36\x39\x2d\x30\x2e\x32\x38\x39\ -\x2d\x31\x2e\x32\x32\x38\x32\x35\x31\x2d\x30\x2e\x34\x36\x39\x36\ -\x32\x35\x2d\x31\x2e\x38\x32\x30\x37\x30\x31\x2d\x30\x2e\x32\x36\ -\x30\x31\x2d\x30\x2e\x38\x31\x36\x34\x32\x36\x2d\x30\x2e\x35\x38\ -\x35\x32\x32\x35\x2d\x31\x2e\x36\x31\x38\x34\x30\x31\x2d\x30\x2e\ -\x38\x38\x38\x36\x37\x36\x2d\x32\x2e\x34\x32\x30\x33\x37\x37\x6c\ -\x2d\x30\x2e\x32\x37\x34\x35\x35\x2d\x30\x2e\x37\x35\x38\x36\x32\ -\x35\x2d\x30\x2e\x31\x36\x36\x31\x37\x35\x2d\x30\x2e\x34\x35\x35\ -\x31\x37\x36\x2d\x30\x2e\x31\x33\x30\x30\x35\x2d\x30\x2e\x33\x32\ -\x35\x31\x32\x35\x63\x2d\x30\x2e\x33\x35\x34\x30\x32\x35\x2d\x30\ -\x2e\x38\x33\x30\x38\x37\x36\x2d\x30\x2e\x37\x35\x38\x36\x32\x36\ -\x2d\x31\x2e\x36\x32\x35\x36\x32\x36\x2d\x31\x2e\x31\x36\x33\x32\ -\x32\x36\x2d\x32\x2e\x34\x32\x37\x36\x30\x32\x2d\x30\x2e\x32\x32\ -\x33\x39\x37\x35\x2d\x30\x2e\x34\x35\x35\x31\x37\x35\x2d\x30\x2e\ -\x34\x31\x39\x30\x35\x2d\x30\x2e\x39\x31\x37\x35\x37\x36\x2d\x30\ -\x2e\x36\x36\x34\x37\x2d\x31\x2e\x33\x35\x38\x33\x30\x31\x2d\x30\ -\x2e\x34\x33\x33\x35\x2d\x30\x2e\x38\x30\x31\x39\x37\x36\x2d\x30\ -\x2e\x39\x32\x34\x38\x30\x31\x2d\x31\x2e\x35\x35\x33\x33\x37\x36\ -\x2d\x31\x2e\x34\x30\x31\x36\x35\x31\x2d\x32\x2e\x33\x31\x39\x32\ -\x32\x36\x2d\x30\x2e\x31\x34\x34\x35\x2d\x30\x2e\x32\x32\x33\x39\ -\x37\x35\x2d\x30\x2e\x32\x36\x37\x33\x32\x35\x2d\x30\x2e\x34\x36\ -\x32\x34\x2d\x30\x2e\x34\x31\x31\x38\x32\x36\x2d\x30\x2e\x36\x37\ -\x31\x39\x32\x36\x2d\x30\x2e\x30\x38\x36\x37\x2d\x30\x2e\x31\x33\ -\x30\x30\x35\x2d\x30\x2e\x31\x35\x31\x37\x32\x35\x2d\x30\x2e\x32\ -\x36\x37\x33\x32\x35\x2d\x30\x2e\x32\x33\x38\x34\x32\x35\x2d\x30\ -\x2e\x33\x39\x37\x33\x37\x35\x6c\x2d\x30\x2e\x31\x31\x35\x36\x2d\ -\x30\x2e\x31\x37\x33\x34\x63\x2d\x30\x2e\x35\x30\x35\x37\x35\x2d\ -\x30\x2e\x37\x35\x31\x34\x30\x31\x2d\x31\x2e\x30\x36\x32\x30\x37\ -\x36\x2d\x31\x2e\x34\x34\x35\x30\x30\x31\x2d\x31\x2e\x36\x31\x31\ -\x31\x37\x36\x2d\x32\x2e\x31\x35\x33\x30\x35\x32\x2d\x30\x2e\x33\ -\x30\x33\x34\x35\x2d\x30\x2e\x33\x39\x30\x31\x35\x2d\x30\x2e\x35\ -\x37\x38\x2d\x30\x2e\x38\x30\x31\x39\x37\x36\x2d\x30\x2e\x38\x38\ -\x38\x36\x37\x36\x2d\x31\x2e\x31\x38\x34\x39\x30\x31\x2d\x30\x2e\ -\x35\x35\x36\x33\x32\x35\x2d\x30\x2e\x36\x36\x34\x37\x2d\x31\x2e\ -\x31\x36\x33\x32\x32\x36\x2d\x31\x2e\x32\x39\x33\x32\x37\x36\x2d\ -\x31\x2e\x37\x35\x35\x36\x37\x36\x2d\x31\x2e\x39\x32\x39\x30\x37\ -\x36\x2d\x30\x2e\x33\x35\x34\x30\x32\x35\x2d\x30\x2e\x33\x38\x32\ -\x39\x32\x35\x2d\x30\x2e\x36\x37\x39\x31\x35\x2d\x30\x2e\x37\x38\ -\x30\x33\x30\x31\x2d\x31\x2e\x30\x34\x30\x34\x30\x31\x2d\x31\x2e\ -\x31\x34\x31\x35\x35\x31\x6c\x2d\x30\x2e\x30\x36\x35\x30\x32\x35\ -\x2d\x30\x2e\x30\x36\x35\x30\x32\x35\x2d\x30\x2e\x30\x31\x34\x34\ -\x35\x2d\x30\x2e\x30\x32\x31\x36\x37\x35\x2d\x30\x2e\x30\x37\x32\ -\x32\x35\x2d\x30\x2e\x30\x35\x37\x38\x63\x2d\x30\x2e\x35\x32\x37\ -\x34\x32\x35\x2d\x30\x2e\x35\x32\x37\x34\x32\x35\x2d\x31\x2e\x30\ -\x39\x38\x32\x30\x31\x2d\x31\x2e\x30\x30\x34\x32\x37\x36\x2d\x31\ -\x2e\x36\x36\x38\x39\x37\x36\x2d\x31\x2e\x35\x31\x30\x30\x32\x36\ -\x2d\x30\x2e\x34\x32\x36\x32\x37\x35\x2d\x30\x2e\x33\x37\x35\x37\ -\x2d\x30\x2e\x38\x32\x33\x36\x35\x31\x2d\x30\x2e\x37\x38\x30\x33\ -\x30\x31\x2d\x31\x2e\x32\x37\x31\x36\x30\x31\x2d\x31\x2e\x31\x34\ -\x38\x37\x37\x36\x2d\x30\x2e\x35\x39\x39\x36\x37\x35\x2d\x30\x2e\ -\x34\x39\x31\x33\x2d\x31\x2e\x32\x34\x39\x39\x32\x36\x2d\x30\x2e\ -\x39\x33\x32\x30\x32\x36\x2d\x31\x2e\x38\x37\x38\x35\x30\x31\x2d\ -\x31\x2e\x34\x30\x31\x36\x35\x31\x2d\x30\x2e\x34\x38\x34\x30\x37\ -\x35\x2d\x30\x2e\x33\x36\x31\x32\x35\x2d\x30\x2e\x39\x35\x33\x37\ -\x30\x31\x2d\x30\x2e\x37\x34\x34\x31\x37\x36\x2d\x31\x2e\x34\x35\ -\x32\x32\x32\x36\x2d\x31\x2e\x30\x38\x33\x37\x35\x31\x61\x35\x2e\ -\x30\x38\x36\x34\x30\x34\x20\x35\x2e\x30\x38\x36\x34\x30\x34\x20\ -\x30\x20\x30\x20\x31\x2d\x30\x2e\x33\x33\x32\x33\x35\x31\x2d\x30\ -\x2e\x32\x30\x32\x33\x6c\x2d\x30\x2e\x35\x33\x34\x36\x35\x2d\x30\ -\x2e\x33\x31\x30\x36\x37\x35\x61\x32\x36\x2e\x37\x30\x33\x36\x32\ -\x20\x32\x36\x2e\x37\x30\x33\x36\x32\x20\x30\x20\x30\x20\x30\x2d\ -\x31\x2e\x31\x34\x31\x35\x35\x31\x2d\x30\x2e\x36\x39\x33\x36\x30\ -\x31\x63\x2d\x30\x2e\x35\x32\x30\x32\x2d\x30\x2e\x33\x31\x37\x39\ -\x2d\x31\x2e\x30\x32\x35\x39\x35\x31\x2d\x30\x2e\x36\x35\x37\x34\ -\x37\x35\x2d\x31\x2e\x35\x36\x37\x38\x32\x36\x2d\x30\x2e\x39\x35\ -\x33\x37\x2d\x30\x2e\x36\x37\x39\x31\x35\x2d\x30\x2e\x33\x36\x38\ -\x34\x37\x35\x2d\x31\x2e\x33\x39\x34\x34\x32\x36\x2d\x30\x2e\x36\ -\x37\x31\x39\x32\x35\x2d\x32\x2e\x30\x39\x35\x32\x35\x32\x2d\x31\ -\x2e\x30\x30\x34\x32\x37\x36\x2d\x30\x2e\x35\x36\x33\x35\x35\x2d\ -\x30\x2e\x32\x36\x37\x33\x32\x35\x2d\x31\x2e\x31\x31\x32\x36\x35\ -\x31\x2d\x30\x2e\x35\x37\x30\x37\x37\x35\x2d\x31\x2e\x36\x39\x30\ -\x36\x35\x31\x2d\x30\x2e\x38\x30\x39\x32\x30\x31\x2d\x30\x2e\x31\ -\x35\x31\x37\x32\x35\x2d\x30\x2e\x30\x37\x32\x32\x35\x2d\x30\x2e\ -\x33\x32\x35\x31\x32\x35\x2d\x30\x2e\x31\x32\x32\x38\x32\x35\x2d\ -\x30\x2e\x34\x39\x31\x33\x2d\x30\x2e\x31\x38\x30\x36\x32\x35\x2d\ -\x30\x2e\x31\x38\x37\x38\x35\x2d\x30\x2e\x30\x37\x39\x34\x37\x35\ -\x2d\x30\x2e\x33\x39\x30\x31\x35\x2d\x30\x2e\x31\x33\x37\x32\x37\ -\x35\x2d\x30\x2e\x35\x37\x38\x30\x30\x31\x2d\x30\x2e\x32\x32\x33\ -\x39\x37\x35\x6c\x2d\x31\x2e\x30\x31\x38\x37\x32\x35\x2d\x30\x2e\ -\x33\x36\x38\x34\x37\x35\x63\x2d\x30\x2e\x36\x32\x38\x35\x37\x35\ -\x2d\x30\x2e\x32\x32\x33\x39\x37\x35\x2d\x31\x2e\x32\x34\x32\x37\ -\x30\x31\x2d\x30\x2e\x34\x38\x34\x30\x37\x35\x2d\x31\x2e\x38\x39\ -\x32\x39\x35\x32\x2d\x30\x2e\x36\x39\x33\x36\x30\x31\x2d\x30\x2e\ -\x36\x34\x33\x30\x32\x35\x2d\x30\x2e\x31\x38\x37\x38\x35\x2d\x31\ -\x2e\x33\x30\x37\x37\x32\x36\x2d\x30\x2e\x33\x32\x35\x31\x32\x35\ -\x2d\x31\x2e\x39\x36\x35\x32\x30\x31\x2d\x30\x2e\x34\x39\x31\x33\ -\x2d\x30\x2e\x37\x32\x39\x37\x32\x36\x2d\x30\x2e\x31\x39\x35\x30\ -\x37\x35\x2d\x31\x2e\x34\x34\x35\x30\x30\x31\x2d\x30\x2e\x34\x31\ -\x39\x30\x35\x2d\x32\x2e\x31\x38\x39\x31\x37\x37\x2d\x30\x2e\x35\ -\x36\x33\x35\x35\x31\x2d\x30\x2e\x31\x35\x31\x37\x32\x35\x2d\x30\ -\x2e\x30\x33\x36\x31\x32\x35\x2d\x30\x2e\x33\x31\x30\x36\x37\x35\ -\x2d\x30\x2e\x30\x33\x36\x31\x32\x35\x2d\x30\x2e\x34\x36\x32\x34\ -\x2d\x30\x2e\x30\x36\x35\x30\x32\x35\x6c\x2d\x30\x2e\x34\x32\x36\ -\x32\x37\x35\x2d\x30\x2e\x30\x37\x32\x32\x35\x63\x2d\x30\x2e\x35\ -\x32\x37\x34\x32\x35\x2d\x30\x2e\x31\x30\x31\x31\x35\x2d\x31\x2e\ -\x30\x36\x39\x33\x30\x31\x2d\x30\x2e\x31\x36\x36\x31\x37\x35\x2d\ -\x31\x2e\x36\x31\x38\x34\x30\x32\x2d\x30\x2e\x32\x33\x38\x34\x32\ -\x35\x2d\x30\x2e\x35\x39\x39\x36\x37\x35\x2d\x30\x2e\x30\x39\x33\ -\x39\x32\x35\x2d\x31\x2e\x31\x38\x34\x39\x30\x31\x2d\x30\x2e\x32\ -\x31\x36\x37\x35\x2d\x31\x2e\x37\x38\x34\x35\x37\x36\x2d\x30\x2e\ -\x32\x38\x31\x37\x37\x35\x61\x34\x32\x2e\x37\x37\x32\x30\x33\x31\ -\x20\x34\x32\x2e\x37\x37\x32\x30\x33\x31\x20\x30\x20\x30\x20\x30\ -\x2d\x34\x2e\x34\x32\x38\x39\x32\x38\x2d\x30\x2e\x32\x32\x33\x39\ -\x37\x35\x68\x2d\x30\x2e\x31\x35\x31\x37\x32\x35\x6c\x2d\x33\x34\ -\x33\x2e\x30\x37\x39\x33\x37\x37\x20\x31\x2e\x32\x33\x35\x34\x37\ -\x36\x61\x34\x33\x2e\x33\x35\x30\x30\x33\x32\x20\x34\x33\x2e\x33\ -\x35\x30\x30\x33\x32\x20\x30\x20\x30\x20\x30\x20\x30\x2e\x31\x35\ -\x31\x37\x32\x36\x20\x38\x36\x2e\x37\x30\x30\x30\x36\x33\x68\x30\ -\x2e\x31\x35\x31\x37\x32\x35\x6c\x32\x33\x38\x2e\x34\x31\x37\x39\ -\x34\x39\x2d\x30\x2e\x38\x36\x37\x2d\x31\x35\x36\x2e\x37\x36\x30\ -\x39\x34\x20\x31\x35\x37\x2e\x38\x39\x35\x32\x36\x35\x63\x2d\x35\ -\x33\x2e\x37\x31\x30\x36\x38\x39\x2d\x34\x32\x2e\x31\x37\x39\x35\ -\x38\x31\x2d\x31\x32\x31\x2e\x31\x37\x30\x35\x36\x34\x2d\x36\x37\ -\x2e\x34\x36\x37\x30\x39\x39\x2d\x31\x39\x34\x2e\x31\x35\x30\x33\ -\x34\x32\x2d\x36\x37\x2e\x34\x36\x37\x30\x39\x39\x6c\x2d\x34\x2e\ -\x32\x31\x39\x34\x30\x33\x20\x30\x2e\x30\x32\x31\x36\x37\x35\x63\ -\x2d\x31\x37\x34\x2e\x30\x39\x33\x37\x32\x38\x20\x32\x2e\x32\x39\ -\x30\x33\x32\x37\x2d\x33\x31\x33\x2e\x38\x35\x34\x32\x33\x20\x31\ -\x34\x35\x2e\x37\x38\x36\x31\x35\x37\x2d\x33\x31\x31\x2e\x35\x36\ -\x33\x39\x30\x33\x20\x33\x31\x39\x2e\x38\x35\x38\x32\x30\x39\x20\ -\x32\x2e\x32\x36\x31\x34\x32\x37\x20\x31\x37\x31\x2e\x38\x31\x37\ -\x38\x35\x31\x20\x31\x34\x33\x2e\x38\x34\x39\x38\x35\x35\x20\x33\ -\x31\x31\x2e\x35\x39\x32\x38\x30\x33\x20\x33\x31\x35\x2e\x36\x33\ -\x31\x35\x38\x31\x20\x33\x31\x31\x2e\x35\x39\x32\x38\x30\x33\x6c\ -\x34\x2e\x32\x31\x39\x34\x30\x33\x2d\x30\x2e\x30\x32\x38\x39\x63\ -\x38\x34\x2e\x33\x33\x30\x32\x36\x32\x2d\x31\x2e\x31\x30\x35\x34\ -\x32\x36\x20\x31\x36\x33\x2e\x31\x38\x33\x39\x37\x2d\x33\x34\x2e\ -\x39\x38\x33\x34\x37\x36\x20\x32\x32\x32\x2e\x30\x33\x31\x36\x33\ -\x38\x2d\x39\x35\x2e\x33\x39\x38\x39\x37\x20\x35\x38\x2e\x38\x35\ -\x34\x38\x39\x33\x2d\x36\x30\x2e\x34\x31\x35\x34\x39\x34\x20\x39\ -\x30\x2e\x36\x34\x34\x39\x31\x36\x2d\x31\x34\x30\x2e\x31\x33\x36\ -\x32\x30\x33\x20\x38\x39\x2e\x35\x33\x32\x32\x36\x35\x2d\x32\x32\ -\x34\x2e\x34\x35\x32\x30\x31\x34\x2d\x30\x2e\x38\x38\x31\x34\x35\ -\x31\x2d\x36\x37\x2e\x38\x32\x38\x33\x35\x2d\x32\x33\x2e\x35\x35\ -\x33\x35\x31\x37\x2d\x31\x33\x30\x2e\x36\x31\x33\x36\x34\x36\x2d\ -\x36\x31\x2e\x31\x35\x39\x36\x36\x39\x2d\x31\x38\x31\x2e\x38\x33\ -\x31\x37\x30\x38\x6c\x31\x35\x37\x2e\x36\x31\x33\x34\x39\x2d\x31\ -\x35\x38\x2e\x37\x34\x37\x38\x31\x36\x56\x34\x39\x35\x2e\x34\x31\ -\x38\x36\x31\x33\x61\x34\x33\x2e\x33\x35\x30\x30\x33\x32\x20\x34\ -\x33\x2e\x33\x35\x30\x30\x33\x32\x20\x30\x20\x30\x20\x30\x20\x38\ -\x36\x2e\x37\x30\x30\x30\x36\x34\x20\x30\x56\x31\x35\x32\x2e\x33\ -\x34\x36\x34\x36\x32\x76\x2d\x30\x2e\x30\x35\x30\x35\x37\x35\x2d\ -\x30\x2e\x30\x38\x36\x37\x30\x31\x7a\x4d\x35\x37\x37\x2e\x31\x39\ -\x38\x34\x34\x38\x20\x37\x35\x31\x2e\x39\x37\x38\x35\x35\x31\x63\ -\x2d\x33\x39\x2e\x39\x39\x30\x34\x30\x34\x20\x34\x31\x2e\x30\x36\ -\x36\x39\x33\x2d\x39\x33\x2e\x35\x38\x35\x34\x39\x34\x20\x36\x34\ -\x2e\x30\x38\x35\x37\x39\x37\x2d\x31\x35\x30\x2e\x39\x30\x31\x34\ -\x36\x31\x20\x36\x34\x2e\x38\x34\x34\x34\x32\x32\x6c\x2d\x32\x2e\ -\x38\x39\x30\x30\x30\x32\x20\x30\x2e\x30\x31\x34\x34\x35\x63\x2d\ -\x31\x31\x36\x2e\x37\x33\x34\x34\x31\x20\x30\x2d\x32\x31\x32\x2e\ -\x39\x35\x37\x30\x33\x31\x2d\x39\x35\x2e\x30\x30\x31\x35\x39\x35\ -\x2d\x32\x31\x34\x2e\x34\x39\x35\x39\x35\x37\x2d\x32\x31\x31\x2e\ -\x37\x37\x32\x31\x33\x43\x32\x30\x37\x2e\x33\x35\x37\x36\x35\x32\ -\x20\x34\x38\x36\x2e\x37\x34\x38\x36\x30\x37\x20\x33\x30\x32\x2e\ -\x33\x35\x32\x30\x32\x31\x20\x33\x38\x39\x2e\x32\x33\x32\x37\x31\ -\x20\x34\x32\x30\x2e\x36\x36\x38\x37\x30\x38\x20\x33\x38\x37\x2e\ -\x36\x37\x32\x31\x30\x39\x6c\x32\x2e\x38\x39\x30\x30\x30\x32\x2d\ -\x30\x2e\x30\x30\x37\x32\x32\x35\x63\x31\x31\x36\x2e\x37\x34\x31\ -\x36\x33\x36\x20\x30\x20\x32\x31\x32\x2e\x39\x37\x31\x34\x38\x31\ -\x20\x39\x34\x2e\x39\x39\x34\x33\x37\x20\x32\x31\x34\x2e\x34\x38\ -\x38\x37\x33\x32\x20\x32\x31\x31\x2e\x37\x37\x39\x33\x35\x35\x20\ -\x30\x2e\x37\x35\x38\x36\x32\x36\x20\x35\x37\x2e\x33\x30\x31\x35\ -\x31\x37\x2d\x32\x30\x2e\x38\x35\x31\x33\x36\x35\x20\x31\x31\x31\ -\x2e\x34\x37\x34\x36\x30\x37\x2d\x36\x30\x2e\x38\x34\x38\x39\x39\ -\x34\x20\x31\x35\x32\x2e\x35\x33\x34\x33\x31\x32\x7a\x22\x20\x66\ -\x69\x6c\x6c\x3d\x22\x23\x31\x32\x39\x36\x64\x62\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x34\x32\x36\x39\x22\x3e\x3c\x2f\x70\x61\x74\x68\ -\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x06\x9c\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x34\x32\x39\x35\x32\x30\x32\x32\x34\x35\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x35\x35\x38\x22\x20\x78\ -\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ -\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\ -\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\x37\x30\x2e\x36\ -\x39\x39\x35\x32\x20\x31\x35\x33\x2e\x33\x30\x30\x34\x38\x63\x2d\ -\x36\x36\x2e\x31\x30\x36\x38\x38\x2d\x36\x36\x2e\x31\x30\x39\x34\ -\x34\x2d\x31\x35\x34\x2e\x30\x30\x34\x34\x38\x2d\x31\x30\x32\x2e\ -\x35\x31\x37\x37\x36\x2d\x32\x34\x37\x2e\x34\x39\x36\x39\x36\x2d\ -\x31\x30\x32\x2e\x35\x31\x39\x30\x34\x2d\x39\x33\x2e\x34\x39\x32\ -\x34\x38\x20\x30\x2d\x31\x38\x31\x2e\x33\x38\x38\x38\x20\x33\x36\ -\x2e\x34\x30\x38\x33\x32\x2d\x32\x34\x37\x2e\x34\x39\x36\x39\x36\ -\x20\x31\x30\x32\x2e\x35\x31\x36\x34\x38\x2d\x36\x36\x2e\x31\x31\ -\x30\x37\x32\x20\x36\x36\x2e\x31\x30\x39\x34\x34\x2d\x31\x30\x32\ -\x2e\x35\x31\x36\x34\x38\x20\x31\x35\x34\x2e\x30\x30\x35\x37\x36\ -\x2d\x31\x30\x32\x2e\x35\x31\x36\x34\x38\x20\x32\x34\x37\x2e\x34\ -\x39\x39\x35\x32\x2d\x30\x2e\x30\x30\x31\x32\x38\x20\x37\x36\x2e\ -\x31\x39\x39\x36\x38\x20\x32\x34\x2e\x31\x39\x30\x37\x32\x20\x31\ -\x34\x38\x2e\x36\x37\x38\x34\x20\x36\x38\x2e\x39\x33\x30\x35\x36\ -\x20\x32\x30\x38\x2e\x36\x37\x35\x38\x34\x6c\x2d\x36\x30\x2e\x32\ -\x30\x34\x38\x20\x36\x30\x2e\x32\x30\x33\x35\x32\x4c\x31\x33\x38\ -\x2e\x31\x38\x34\x39\x36\x20\x35\x32\x35\x2e\x39\x34\x36\x38\x38\ -\x63\x2d\x31\x39\x2e\x39\x39\x34\x38\x38\x2d\x31\x39\x2e\x39\x39\ -\x34\x38\x38\x2d\x35\x32\x2e\x34\x31\x32\x31\x36\x2d\x31\x39\x2e\ -\x39\x39\x34\x38\x38\x2d\x37\x32\x2e\x34\x30\x37\x30\x34\x20\x30\ -\x2d\x31\x39\x2e\x39\x39\x34\x38\x38\x20\x31\x39\x2e\x39\x39\x33\ -\x36\x2d\x31\x39\x2e\x39\x39\x34\x38\x38\x20\x35\x32\x2e\x34\x31\ -\x32\x31\x36\x20\x30\x20\x37\x32\x2e\x34\x30\x37\x30\x34\x6c\x31\ -\x34\x33\x2e\x37\x32\x39\x39\x32\x20\x31\x34\x33\x2e\x37\x32\x39\ -\x39\x32\x2d\x35\x35\x2e\x37\x35\x35\x35\x32\x20\x35\x35\x2e\x37\ -\x35\x35\x35\x32\x63\x2d\x31\x39\x2e\x39\x39\x33\x36\x20\x31\x39\ -\x2e\x39\x39\x33\x36\x2d\x31\x39\x2e\x39\x39\x33\x36\x20\x35\x32\ -\x2e\x34\x31\x32\x31\x36\x20\x30\x20\x37\x32\x2e\x34\x30\x35\x37\ -\x36\x20\x31\x39\x2e\x39\x39\x36\x31\x36\x20\x31\x39\x2e\x39\x39\ -\x36\x31\x36\x20\x35\x32\x2e\x34\x31\x33\x34\x34\x20\x31\x39\x2e\ -\x39\x39\x34\x38\x38\x20\x37\x32\x2e\x34\x30\x38\x33\x32\x20\x30\ -\x6c\x35\x35\x2e\x37\x35\x34\x32\x34\x2d\x35\x35\x2e\x37\x35\x34\ -\x32\x34\x20\x31\x34\x33\x2e\x37\x33\x31\x32\x20\x31\x34\x33\x2e\ -\x37\x32\x39\x39\x32\x63\x31\x39\x2e\x39\x39\x33\x36\x20\x31\x39\ -\x2e\x39\x39\x34\x38\x38\x20\x35\x32\x2e\x34\x31\x30\x38\x38\x20\ -\x31\x39\x2e\x39\x39\x34\x38\x38\x20\x37\x32\x2e\x34\x30\x35\x37\ -\x36\x20\x30\x20\x31\x39\x2e\x39\x39\x36\x31\x36\x2d\x31\x39\x2e\ -\x39\x39\x34\x38\x38\x20\x31\x39\x2e\x39\x39\x36\x31\x36\x2d\x35\ -\x32\x2e\x34\x31\x32\x31\x36\x20\x30\x2d\x37\x32\x2e\x34\x30\x37\ -\x30\x34\x4c\x33\x35\x34\x2e\x33\x32\x31\x39\x32\x20\x37\x34\x32\ -\x2e\x30\x38\x35\x31\x32\x6c\x36\x30\x2e\x32\x30\x34\x38\x2d\x36\ -\x30\x2e\x32\x30\x33\x35\x32\x63\x35\x39\x2e\x39\x39\x38\x37\x32\ -\x20\x34\x34\x2e\x37\x33\x38\x35\x36\x20\x31\x33\x32\x2e\x34\x37\ -\x36\x31\x36\x20\x36\x38\x2e\x39\x33\x31\x38\x34\x20\x32\x30\x38\ -\x2e\x36\x37\x35\x38\x34\x20\x36\x38\x2e\x39\x33\x31\x38\x34\x20\ -\x39\x33\x2e\x34\x39\x32\x34\x38\x20\x30\x20\x31\x38\x31\x2e\x33\ -\x38\x37\x35\x32\x2d\x33\x36\x2e\x34\x30\x38\x33\x32\x20\x32\x34\ -\x37\x2e\x34\x39\x36\x39\x36\x2d\x31\x30\x32\x2e\x35\x31\x37\x37\ -\x36\x73\x31\x30\x32\x2e\x35\x31\x37\x37\x36\x2d\x31\x35\x34\x2e\ -\x30\x30\x35\x37\x36\x20\x31\x30\x32\x2e\x35\x31\x37\x37\x36\x2d\ -\x32\x34\x37\x2e\x34\x39\x38\x32\x34\x43\x39\x37\x33\x2e\x32\x31\ -\x37\x32\x38\x20\x33\x30\x37\x2e\x33\x30\x34\x39\x36\x20\x39\x33\ -\x36\x2e\x38\x30\x37\x36\x38\x20\x32\x31\x39\x2e\x34\x30\x37\x33\ -\x36\x20\x38\x37\x30\x2e\x36\x39\x39\x35\x32\x20\x31\x35\x33\x2e\ -\x33\x30\x30\x34\x38\x7a\x4d\x37\x39\x38\x2e\x32\x39\x32\x34\x38\ -\x20\x35\x37\x35\x2e\x38\x38\x37\x33\x36\x63\x2d\x34\x36\x2e\x37\ -\x36\x37\x33\x36\x20\x34\x36\x2e\x37\x36\x37\x33\x36\x2d\x31\x30\ -\x38\x2e\x39\x34\x39\x37\x36\x20\x37\x32\x2e\x35\x32\x34\x38\x2d\ -\x31\x37\x35\x2e\x30\x38\x39\x39\x32\x20\x37\x32\x2e\x35\x32\x34\ -\x38\x73\x2d\x31\x32\x38\x2e\x33\x32\x31\x32\x38\x2d\x32\x35\x2e\ -\x37\x35\x37\x34\x34\x2d\x31\x37\x35\x2e\x30\x38\x39\x39\x32\x2d\ -\x37\x32\x2e\x35\x32\x34\x38\x63\x2d\x34\x36\x2e\x37\x36\x38\x36\ -\x34\x2d\x34\x36\x2e\x37\x36\x37\x33\x36\x2d\x37\x32\x2e\x35\x32\ -\x34\x38\x2d\x31\x30\x38\x2e\x39\x34\x39\x37\x36\x2d\x37\x32\x2e\ -\x35\x32\x34\x38\x2d\x31\x37\x35\x2e\x30\x38\x39\x39\x32\x20\x30\ -\x2e\x30\x30\x31\x32\x38\x2d\x36\x36\x2e\x31\x34\x32\x37\x32\x20\ -\x32\x35\x2e\x37\x35\x36\x31\x36\x2d\x31\x32\x38\x2e\x33\x32\x33\ -\x38\x34\x20\x37\x32\x2e\x35\x32\x34\x38\x2d\x31\x37\x35\x2e\x30\ -\x39\x31\x32\x20\x34\x36\x2e\x37\x36\x37\x33\x36\x2d\x34\x36\x2e\ -\x37\x36\x38\x36\x34\x20\x31\x30\x38\x2e\x39\x34\x39\x37\x36\x2d\ -\x37\x32\x2e\x35\x32\x34\x38\x20\x31\x37\x35\x2e\x30\x38\x39\x39\ -\x32\x2d\x37\x32\x2e\x35\x32\x34\x38\x20\x36\x36\x2e\x31\x34\x30\ -\x31\x36\x20\x30\x2e\x30\x30\x31\x32\x38\x20\x31\x32\x38\x2e\x33\ -\x32\x32\x35\x36\x20\x32\x35\x2e\x37\x35\x37\x34\x34\x20\x31\x37\ -\x35\x2e\x30\x38\x39\x39\x32\x20\x37\x32\x2e\x35\x32\x36\x30\x38\ -\x20\x34\x36\x2e\x37\x36\x37\x33\x36\x20\x34\x36\x2e\x37\x36\x37\ -\x33\x36\x20\x37\x32\x2e\x35\x32\x34\x38\x20\x31\x30\x38\x2e\x39\ -\x34\x38\x34\x38\x20\x37\x32\x2e\x35\x32\x34\x38\x20\x31\x37\x35\ -\x2e\x30\x38\x38\x36\x34\x43\x38\x37\x30\x2e\x38\x31\x37\x32\x38\ -\x20\x34\x36\x36\x2e\x39\x33\x37\x36\x20\x38\x34\x35\x2e\x30\x36\ -\x32\x34\x20\x35\x32\x39\x2e\x31\x31\x38\x37\x32\x20\x37\x39\x38\ -\x2e\x32\x39\x32\x34\x38\x20\x35\x37\x35\x2e\x38\x38\x37\x33\x36\ -\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x64\x38\x31\x65\x30\x36\ -\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x35\x35\x39\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x06\x9c\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x34\x32\x39\x35\x32\x30\x32\x32\x34\x35\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x35\x35\x38\x22\x20\x78\ -\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ -\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\ -\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\x37\x30\x2e\x36\ -\x39\x39\x35\x32\x20\x31\x35\x33\x2e\x33\x30\x30\x34\x38\x63\x2d\ -\x36\x36\x2e\x31\x30\x36\x38\x38\x2d\x36\x36\x2e\x31\x30\x39\x34\ -\x34\x2d\x31\x35\x34\x2e\x30\x30\x34\x34\x38\x2d\x31\x30\x32\x2e\ -\x35\x31\x37\x37\x36\x2d\x32\x34\x37\x2e\x34\x39\x36\x39\x36\x2d\ -\x31\x30\x32\x2e\x35\x31\x39\x30\x34\x2d\x39\x33\x2e\x34\x39\x32\ -\x34\x38\x20\x30\x2d\x31\x38\x31\x2e\x33\x38\x38\x38\x20\x33\x36\ -\x2e\x34\x30\x38\x33\x32\x2d\x32\x34\x37\x2e\x34\x39\x36\x39\x36\ -\x20\x31\x30\x32\x2e\x35\x31\x36\x34\x38\x2d\x36\x36\x2e\x31\x31\ -\x30\x37\x32\x20\x36\x36\x2e\x31\x30\x39\x34\x34\x2d\x31\x30\x32\ -\x2e\x35\x31\x36\x34\x38\x20\x31\x35\x34\x2e\x30\x30\x35\x37\x36\ -\x2d\x31\x30\x32\x2e\x35\x31\x36\x34\x38\x20\x32\x34\x37\x2e\x34\ -\x39\x39\x35\x32\x2d\x30\x2e\x30\x30\x31\x32\x38\x20\x37\x36\x2e\ -\x31\x39\x39\x36\x38\x20\x32\x34\x2e\x31\x39\x30\x37\x32\x20\x31\ -\x34\x38\x2e\x36\x37\x38\x34\x20\x36\x38\x2e\x39\x33\x30\x35\x36\ -\x20\x32\x30\x38\x2e\x36\x37\x35\x38\x34\x6c\x2d\x36\x30\x2e\x32\ -\x30\x34\x38\x20\x36\x30\x2e\x32\x30\x33\x35\x32\x4c\x31\x33\x38\ -\x2e\x31\x38\x34\x39\x36\x20\x35\x32\x35\x2e\x39\x34\x36\x38\x38\ -\x63\x2d\x31\x39\x2e\x39\x39\x34\x38\x38\x2d\x31\x39\x2e\x39\x39\ -\x34\x38\x38\x2d\x35\x32\x2e\x34\x31\x32\x31\x36\x2d\x31\x39\x2e\ -\x39\x39\x34\x38\x38\x2d\x37\x32\x2e\x34\x30\x37\x30\x34\x20\x30\ -\x2d\x31\x39\x2e\x39\x39\x34\x38\x38\x20\x31\x39\x2e\x39\x39\x33\ -\x36\x2d\x31\x39\x2e\x39\x39\x34\x38\x38\x20\x35\x32\x2e\x34\x31\ -\x32\x31\x36\x20\x30\x20\x37\x32\x2e\x34\x30\x37\x30\x34\x6c\x31\ -\x34\x33\x2e\x37\x32\x39\x39\x32\x20\x31\x34\x33\x2e\x37\x32\x39\ -\x39\x32\x2d\x35\x35\x2e\x37\x35\x35\x35\x32\x20\x35\x35\x2e\x37\ -\x35\x35\x35\x32\x63\x2d\x31\x39\x2e\x39\x39\x33\x36\x20\x31\x39\ -\x2e\x39\x39\x33\x36\x2d\x31\x39\x2e\x39\x39\x33\x36\x20\x35\x32\ -\x2e\x34\x31\x32\x31\x36\x20\x30\x20\x37\x32\x2e\x34\x30\x35\x37\ -\x36\x20\x31\x39\x2e\x39\x39\x36\x31\x36\x20\x31\x39\x2e\x39\x39\ -\x36\x31\x36\x20\x35\x32\x2e\x34\x31\x33\x34\x34\x20\x31\x39\x2e\ -\x39\x39\x34\x38\x38\x20\x37\x32\x2e\x34\x30\x38\x33\x32\x20\x30\ -\x6c\x35\x35\x2e\x37\x35\x34\x32\x34\x2d\x35\x35\x2e\x37\x35\x34\ -\x32\x34\x20\x31\x34\x33\x2e\x37\x33\x31\x32\x20\x31\x34\x33\x2e\ -\x37\x32\x39\x39\x32\x63\x31\x39\x2e\x39\x39\x33\x36\x20\x31\x39\ -\x2e\x39\x39\x34\x38\x38\x20\x35\x32\x2e\x34\x31\x30\x38\x38\x20\ -\x31\x39\x2e\x39\x39\x34\x38\x38\x20\x37\x32\x2e\x34\x30\x35\x37\ -\x36\x20\x30\x20\x31\x39\x2e\x39\x39\x36\x31\x36\x2d\x31\x39\x2e\ -\x39\x39\x34\x38\x38\x20\x31\x39\x2e\x39\x39\x36\x31\x36\x2d\x35\ -\x32\x2e\x34\x31\x32\x31\x36\x20\x30\x2d\x37\x32\x2e\x34\x30\x37\ -\x30\x34\x4c\x33\x35\x34\x2e\x33\x32\x31\x39\x32\x20\x37\x34\x32\ -\x2e\x30\x38\x35\x31\x32\x6c\x36\x30\x2e\x32\x30\x34\x38\x2d\x36\ -\x30\x2e\x32\x30\x33\x35\x32\x63\x35\x39\x2e\x39\x39\x38\x37\x32\ -\x20\x34\x34\x2e\x37\x33\x38\x35\x36\x20\x31\x33\x32\x2e\x34\x37\ -\x36\x31\x36\x20\x36\x38\x2e\x39\x33\x31\x38\x34\x20\x32\x30\x38\ -\x2e\x36\x37\x35\x38\x34\x20\x36\x38\x2e\x39\x33\x31\x38\x34\x20\ -\x39\x33\x2e\x34\x39\x32\x34\x38\x20\x30\x20\x31\x38\x31\x2e\x33\ -\x38\x37\x35\x32\x2d\x33\x36\x2e\x34\x30\x38\x33\x32\x20\x32\x34\ -\x37\x2e\x34\x39\x36\x39\x36\x2d\x31\x30\x32\x2e\x35\x31\x37\x37\ -\x36\x73\x31\x30\x32\x2e\x35\x31\x37\x37\x36\x2d\x31\x35\x34\x2e\ -\x30\x30\x35\x37\x36\x20\x31\x30\x32\x2e\x35\x31\x37\x37\x36\x2d\ -\x32\x34\x37\x2e\x34\x39\x38\x32\x34\x43\x39\x37\x33\x2e\x32\x31\ -\x37\x32\x38\x20\x33\x30\x37\x2e\x33\x30\x34\x39\x36\x20\x39\x33\ -\x36\x2e\x38\x30\x37\x36\x38\x20\x32\x31\x39\x2e\x34\x30\x37\x33\ -\x36\x20\x38\x37\x30\x2e\x36\x39\x39\x35\x32\x20\x31\x35\x33\x2e\ -\x33\x30\x30\x34\x38\x7a\x4d\x37\x39\x38\x2e\x32\x39\x32\x34\x38\ -\x20\x35\x37\x35\x2e\x38\x38\x37\x33\x36\x63\x2d\x34\x36\x2e\x37\ -\x36\x37\x33\x36\x20\x34\x36\x2e\x37\x36\x37\x33\x36\x2d\x31\x30\ -\x38\x2e\x39\x34\x39\x37\x36\x20\x37\x32\x2e\x35\x32\x34\x38\x2d\ -\x31\x37\x35\x2e\x30\x38\x39\x39\x32\x20\x37\x32\x2e\x35\x32\x34\ -\x38\x73\x2d\x31\x32\x38\x2e\x33\x32\x31\x32\x38\x2d\x32\x35\x2e\ -\x37\x35\x37\x34\x34\x2d\x31\x37\x35\x2e\x30\x38\x39\x39\x32\x2d\ -\x37\x32\x2e\x35\x32\x34\x38\x63\x2d\x34\x36\x2e\x37\x36\x38\x36\ -\x34\x2d\x34\x36\x2e\x37\x36\x37\x33\x36\x2d\x37\x32\x2e\x35\x32\ -\x34\x38\x2d\x31\x30\x38\x2e\x39\x34\x39\x37\x36\x2d\x37\x32\x2e\ -\x35\x32\x34\x38\x2d\x31\x37\x35\x2e\x30\x38\x39\x39\x32\x20\x30\ -\x2e\x30\x30\x31\x32\x38\x2d\x36\x36\x2e\x31\x34\x32\x37\x32\x20\ -\x32\x35\x2e\x37\x35\x36\x31\x36\x2d\x31\x32\x38\x2e\x33\x32\x33\ -\x38\x34\x20\x37\x32\x2e\x35\x32\x34\x38\x2d\x31\x37\x35\x2e\x30\ -\x39\x31\x32\x20\x34\x36\x2e\x37\x36\x37\x33\x36\x2d\x34\x36\x2e\ -\x37\x36\x38\x36\x34\x20\x31\x30\x38\x2e\x39\x34\x39\x37\x36\x2d\ -\x37\x32\x2e\x35\x32\x34\x38\x20\x31\x37\x35\x2e\x30\x38\x39\x39\ -\x32\x2d\x37\x32\x2e\x35\x32\x34\x38\x20\x36\x36\x2e\x31\x34\x30\ -\x31\x36\x20\x30\x2e\x30\x30\x31\x32\x38\x20\x31\x32\x38\x2e\x33\ -\x32\x32\x35\x36\x20\x32\x35\x2e\x37\x35\x37\x34\x34\x20\x31\x37\ -\x35\x2e\x30\x38\x39\x39\x32\x20\x37\x32\x2e\x35\x32\x36\x30\x38\ -\x20\x34\x36\x2e\x37\x36\x37\x33\x36\x20\x34\x36\x2e\x37\x36\x37\ -\x33\x36\x20\x37\x32\x2e\x35\x32\x34\x38\x20\x31\x30\x38\x2e\x39\ -\x34\x38\x34\x38\x20\x37\x32\x2e\x35\x32\x34\x38\x20\x31\x37\x35\ -\x2e\x30\x38\x38\x36\x34\x43\x38\x37\x30\x2e\x38\x31\x37\x32\x38\ -\x20\x34\x36\x36\x2e\x39\x33\x37\x36\x20\x38\x34\x35\x2e\x30\x36\ -\x32\x34\x20\x35\x32\x39\x2e\x31\x31\x38\x37\x32\x20\x37\x39\x38\ -\x2e\x32\x39\x32\x34\x38\x20\x35\x37\x35\x2e\x38\x38\x37\x33\x36\ -\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x64\x38\x31\x65\x30\x36\ -\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x35\x35\x39\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x02\x69\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x35\x31\x36\x33\x39\x30\x31\x39\x32\x37\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x34\x33\x31\x39\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\ -\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\ -\x3d\x22\x36\x34\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x34\ -\x22\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x39\x38\x20\x35\ -\x31\x32\x2e\x34\x63\x30\x20\x31\x32\x36\x2e\x31\x20\x31\x30\x32\ -\x2e\x32\x20\x32\x32\x38\x2e\x33\x20\x32\x32\x38\x2e\x33\x20\x32\ -\x32\x38\x2e\x33\x68\x33\x37\x33\x2e\x35\x63\x31\x32\x36\x2e\x31\ -\x20\x30\x20\x32\x32\x38\x2e\x33\x2d\x31\x30\x32\x2e\x32\x20\x32\ -\x32\x38\x2e\x33\x2d\x32\x32\x38\x2e\x33\x20\x30\x2d\x31\x32\x36\ -\x2e\x31\x2d\x31\x30\x32\x2e\x32\x2d\x32\x32\x38\x2e\x32\x2d\x32\ -\x32\x38\x2e\x33\x2d\x32\x32\x38\x2e\x32\x48\x33\x32\x36\x2e\x33\ -\x43\x32\x30\x30\x2e\x32\x20\x32\x38\x34\x2e\x32\x20\x39\x38\x20\ -\x33\x38\x36\x2e\x34\x20\x39\x38\x20\x35\x31\x32\x2e\x34\x7a\x20\ -\x6d\x33\x39\x34\x2e\x33\x20\x30\x63\x30\x2d\x31\x31\x34\x2e\x36\ -\x20\x39\x32\x2e\x39\x2d\x32\x30\x37\x2e\x35\x20\x32\x30\x37\x2e\ -\x35\x2d\x32\x30\x37\x2e\x35\x73\x32\x30\x37\x2e\x35\x20\x39\x32\ -\x2e\x39\x20\x32\x30\x37\x2e\x35\x20\x32\x30\x37\x2e\x35\x2d\x39\ -\x32\x2e\x39\x20\x32\x30\x37\x2e\x35\x2d\x32\x30\x37\x2e\x35\x20\ -\x32\x30\x37\x2e\x35\x53\x34\x39\x32\x2e\x33\x20\x36\x32\x37\x20\ -\x34\x39\x32\x2e\x33\x20\x35\x31\x32\x2e\x34\x7a\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x32\x34\x33\x32\x30\x22\x3e\x3c\x2f\x70\x61\x74\ -\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x02\x20\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x34\x38\x30\x36\x38\x39\x39\x39\x36\x34\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x39\x30\x36\x36\x22\x20\x78\ -\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ -\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\ -\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x35\x31\x32\x20\x31\ -\x32\x38\x63\x32\x31\x31\x2e\x32\x20\x30\x20\x33\x38\x34\x20\x31\ -\x37\x32\x2e\x38\x20\x33\x38\x34\x20\x33\x38\x34\x53\x37\x32\x33\ -\x2e\x32\x20\x38\x39\x36\x20\x35\x31\x32\x20\x38\x39\x36\x20\x31\ -\x32\x38\x20\x37\x32\x33\x2e\x32\x20\x31\x32\x38\x20\x35\x31\x32\ -\x73\x31\x37\x32\x2e\x38\x2d\x33\x38\x34\x20\x33\x38\x34\x2d\x33\ -\x38\x34\x6d\x30\x2d\x36\x34\x43\x32\x36\x32\x2e\x34\x20\x36\x34\ -\x20\x36\x34\x20\x32\x36\x32\x2e\x34\x20\x36\x34\x20\x35\x31\x32\ -\x73\x31\x39\x38\x2e\x34\x20\x34\x34\x38\x20\x34\x34\x38\x20\x34\ -\x34\x38\x20\x34\x34\x38\x2d\x31\x39\x38\x2e\x34\x20\x34\x34\x38\ -\x2d\x34\x34\x38\x53\x37\x36\x31\x2e\x36\x20\x36\x34\x20\x35\x31\ -\x32\x20\x36\x34\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x35\x31\ -\x35\x31\x35\x31\x22\x20\x70\x2d\x69\x64\x3d\x22\x39\x30\x36\x37\ -\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x04\x9b\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\ -\x72\x61\x70\x68\x69\x63\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\ -\x44\x54\x44\x2f\x73\x76\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\ -\x0a\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x36\x39\x39\x37\x30\x31\ -\x37\x31\x30\x34\x39\x39\x22\x20\x63\x6c\x61\x73\x73\x3d\x22\x69\ -\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ -\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\x22\x20\x76\x65\x72\ -\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x78\x6d\x6c\x6e\x73\ -\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\ -\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x37\x32\x32\x30\x22\x0d\x0a\x20\x20\x20\x20\x20\ -\x77\x69\x64\x74\x68\x3d\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\ -\x74\x3d\x22\x31\x36\x22\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\ -\x74\x68\x20\x64\x3d\x22\x4d\x39\x35\x36\x20\x38\x30\x37\x2e\x32\ -\x20\x36\x35\x37\x2e\x36\x20\x38\x30\x37\x2e\x32\x63\x2d\x31\x36\ -\x2e\x38\x20\x30\x2d\x32\x39\x2e\x36\x2d\x31\x33\x2e\x36\x2d\x32\ -\x39\x2e\x36\x2d\x32\x39\x2e\x36\x20\x30\x2d\x31\x36\x2e\x38\x20\ -\x31\x33\x2e\x36\x2d\x32\x39\x2e\x36\x20\x32\x39\x2e\x36\x2d\x32\ -\x39\x2e\x36\x6c\x32\x39\x39\x2e\x32\x20\x30\x63\x31\x36\x2e\x38\ -\x20\x30\x20\x32\x39\x2e\x36\x20\x31\x33\x2e\x36\x20\x32\x39\x2e\ -\x36\x20\x32\x39\x2e\x36\x43\x39\x38\x36\x2e\x34\x20\x37\x39\x33\ -\x2e\x36\x20\x39\x37\x32\x2e\x38\x20\x38\x30\x37\x2e\x32\x20\x39\ -\x35\x36\x20\x38\x30\x37\x2e\x32\x7a\x4d\x39\x35\x36\x20\x36\x32\ -\x37\x2e\x32\x20\x36\x35\x37\x2e\x36\x20\x36\x32\x37\x2e\x32\x63\ -\x2d\x31\x36\x2e\x38\x20\x30\x2d\x32\x39\x2e\x36\x2d\x31\x33\x2e\ -\x36\x2d\x32\x39\x2e\x36\x2d\x32\x39\x2e\x36\x20\x30\x2d\x31\x36\ -\x2e\x38\x20\x31\x33\x2e\x36\x2d\x32\x39\x2e\x36\x20\x32\x39\x2e\ -\x36\x2d\x32\x39\x2e\x36\x6c\x32\x39\x39\x2e\x32\x20\x30\x63\x31\ -\x36\x2e\x38\x20\x30\x20\x32\x39\x2e\x36\x20\x31\x33\x2e\x36\x20\ -\x32\x39\x2e\x36\x20\x32\x39\x2e\x36\x43\x39\x38\x36\x2e\x34\x20\ -\x36\x31\x34\x2e\x34\x20\x39\x37\x32\x2e\x38\x20\x36\x32\x37\x2e\ -\x32\x20\x39\x35\x36\x20\x36\x32\x37\x2e\x32\x7a\x4d\x35\x30\x38\ -\x20\x35\x36\x34\x2e\x38\x20\x35\x30\x38\x20\x35\x36\x38\x63\x2d\ -\x31\x39\x38\x2e\x34\x20\x30\x2d\x33\x35\x38\x2e\x34\x20\x31\x37\ -\x33\x2e\x36\x2d\x33\x35\x38\x2e\x34\x20\x33\x38\x38\x2e\x38\x20\ -\x30\x20\x31\x30\x2e\x34\x20\x30\x2e\x38\x20\x32\x30\x20\x31\x2e\ -\x36\x20\x32\x39\x2e\x36\x6c\x2d\x31\x2e\x36\x20\x30\x4c\x33\x31\ -\x2e\x32\x20\x39\x38\x36\x2e\x34\x63\x2d\x30\x2e\x38\x2d\x39\x2e\ -\x36\x2d\x31\x2e\x36\x2d\x32\x30\x2d\x31\x2e\x36\x2d\x32\x39\x2e\ -\x36\x20\x30\x2d\x32\x30\x31\x2e\x36\x20\x31\x31\x30\x2e\x34\x2d\ -\x33\x37\x35\x2e\x32\x20\x32\x37\x30\x2e\x34\x2d\x34\x35\x36\x2e\ -\x38\x2d\x35\x35\x2e\x32\x2d\x34\x39\x2e\x36\x2d\x39\x31\x2e\x32\ -\x2d\x31\x32\x30\x2d\x39\x31\x2e\x32\x2d\x32\x30\x30\x20\x30\x2d\ -\x31\x34\x38\x2e\x38\x20\x31\x32\x30\x2e\x38\x2d\x32\x36\x38\x2e\ -\x38\x20\x32\x36\x38\x2e\x38\x2d\x32\x36\x38\x2e\x38\x20\x31\x34\ -\x38\x2e\x38\x20\x30\x20\x32\x36\x38\x2e\x38\x20\x31\x32\x30\x2e\ -\x38\x20\x32\x36\x38\x2e\x38\x20\x32\x36\x38\x2e\x38\x43\x37\x34\ -\x37\x2e\x32\x20\x34\x33\x36\x2e\x38\x20\x36\x34\x32\x2e\x34\x20\ -\x35\x34\x39\x2e\x36\x20\x35\x30\x38\x20\x35\x36\x34\x2e\x38\x7a\ -\x4d\x34\x37\x38\x2e\x34\x20\x31\x34\x39\x2e\x36\x63\x2d\x38\x32\ -\x2e\x34\x20\x30\x2d\x31\x34\x39\x2e\x36\x20\x36\x37\x2e\x32\x2d\ -\x31\x34\x39\x2e\x36\x20\x31\x34\x39\x2e\x36\x53\x33\x39\x36\x20\ -\x34\x34\x38\x20\x34\x37\x38\x2e\x34\x20\x34\x34\x38\x73\x31\x34\ -\x39\x2e\x36\x2d\x36\x37\x2e\x32\x20\x31\x34\x39\x2e\x36\x2d\x31\ -\x34\x39\x2e\x36\x53\x35\x36\x30\x2e\x38\x20\x31\x34\x39\x2e\x36\ -\x20\x34\x37\x38\x2e\x34\x20\x31\x34\x39\x2e\x36\x7a\x4d\x36\x35\ -\x37\x2e\x36\x20\x39\x32\x36\x2e\x34\x6c\x32\x39\x39\x2e\x32\x20\ -\x30\x63\x31\x36\x2e\x38\x20\x30\x20\x32\x39\x2e\x36\x20\x31\x33\ -\x2e\x36\x20\x32\x39\x2e\x36\x20\x32\x39\x2e\x36\x20\x30\x20\x31\ -\x36\x2e\x38\x2d\x31\x33\x2e\x36\x20\x32\x39\x2e\x36\x2d\x32\x39\ -\x2e\x36\x20\x32\x39\x2e\x36\x4c\x36\x35\x37\x2e\x36\x20\x39\x38\ -\x35\x2e\x36\x63\x2d\x31\x36\x2e\x38\x20\x30\x2d\x32\x39\x2e\x36\ -\x2d\x31\x33\x2e\x36\x2d\x32\x39\x2e\x36\x2d\x32\x39\x2e\x36\x43\ -\x36\x32\x37\x2e\x32\x20\x39\x34\x30\x20\x36\x34\x30\x2e\x38\x20\ -\x39\x32\x36\x2e\x34\x20\x36\x35\x37\x2e\x36\x20\x39\x32\x36\x2e\ -\x34\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x70\ -\x2d\x69\x64\x3d\x22\x37\x32\x32\x31\x22\x3e\x3c\x2f\x70\x61\x74\ -\x68\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x09\x14\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\ -\x72\x61\x70\x68\x69\x63\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\ -\x44\x54\x44\x2f\x73\x76\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\ -\x0a\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x36\x39\x38\x35\x39\x32\ -\x30\x39\x35\x34\x39\x36\x22\x20\x63\x6c\x61\x73\x73\x3d\x22\x69\ -\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ -\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\x22\x20\x76\x65\x72\ -\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x78\x6d\x6c\x6e\x73\ -\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\ -\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x35\x32\x34\x33\x22\x0d\x0a\x20\x20\x20\x20\x20\ -\x77\x69\x64\x74\x68\x3d\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\ -\x74\x3d\x22\x31\x36\x22\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\ -\x74\x68\x20\x64\x3d\x22\x4d\x32\x31\x37\x2e\x39\x20\x33\x35\x36\ -\x2e\x35\x63\x2d\x31\x34\x2e\x31\x20\x30\x2d\x32\x35\x2e\x35\x20\ -\x31\x31\x2e\x34\x2d\x32\x35\x2e\x35\x20\x32\x35\x2e\x35\x73\x31\ -\x31\x2e\x34\x20\x32\x35\x2e\x35\x20\x32\x35\x2e\x35\x20\x32\x35\ -\x2e\x35\x20\x32\x35\x2e\x35\x2d\x31\x31\x2e\x34\x20\x32\x35\x2e\ -\x35\x2d\x32\x35\x2e\x35\x2d\x31\x31\x2e\x34\x2d\x32\x35\x2e\x35\ -\x2d\x32\x35\x2e\x35\x2d\x32\x35\x2e\x35\x7a\x4d\x32\x31\x37\x2e\ -\x34\x20\x34\x33\x33\x2e\x37\x63\x2d\x31\x31\x2e\x32\x20\x30\x2d\ -\x32\x30\x2e\x34\x20\x39\x2e\x32\x2d\x32\x30\x2e\x34\x20\x32\x30\ -\x2e\x34\x76\x31\x37\x34\x2e\x34\x63\x30\x20\x31\x31\x2e\x32\x20\ -\x39\x2e\x32\x20\x32\x30\x2e\x34\x20\x32\x30\x2e\x34\x20\x32\x30\ -\x2e\x34\x73\x32\x30\x2e\x34\x2d\x39\x2e\x32\x20\x32\x30\x2e\x34\ -\x2d\x32\x30\x2e\x34\x56\x34\x35\x34\x2e\x31\x63\x30\x2d\x31\x31\ -\x2e\x32\x2d\x39\x2e\x32\x2d\x32\x30\x2e\x34\x2d\x32\x30\x2e\x34\ -\x2d\x32\x30\x2e\x34\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x36\x42\x34\x30\x30\x44\ -\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x32\x34\x34\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\ -\x20\x64\x3d\x22\x4d\x38\x37\x38\x2e\x37\x20\x33\x37\x39\x2e\x35\ -\x76\x2d\x38\x36\x63\x30\x2d\x39\x36\x2e\x33\x2d\x35\x37\x2e\x35\ -\x2d\x31\x35\x33\x2e\x37\x2d\x31\x35\x33\x2e\x37\x2d\x31\x35\x33\ -\x2e\x37\x48\x32\x31\x38\x63\x2d\x39\x36\x2e\x33\x20\x30\x2d\x31\ -\x35\x33\x2e\x37\x20\x35\x37\x2e\x35\x2d\x31\x35\x33\x2e\x37\x20\ -\x31\x35\x33\x2e\x37\x76\x33\x32\x30\x2e\x37\x43\x36\x34\x2e\x33\ -\x20\x37\x31\x30\x2e\x35\x20\x31\x32\x31\x2e\x38\x20\x37\x36\x38\ -\x20\x32\x31\x38\x20\x37\x36\x38\x68\x34\x35\x2e\x38\x76\x31\x32\ -\x30\x2e\x34\x4c\x34\x34\x39\x2e\x39\x20\x37\x36\x38\x68\x31\x31\ -\x2e\x32\x63\x31\x37\x2e\x32\x20\x31\x31\x2e\x33\x20\x33\x39\x20\ -\x31\x37\x2e\x35\x20\x36\x34\x2e\x36\x20\x31\x37\x2e\x35\x68\x31\ -\x36\x31\x2e\x36\x6c\x31\x33\x30\x2e\x37\x20\x38\x35\x76\x2d\x38\ -\x35\x2e\x31\x68\x33\x33\x2e\x35\x63\x36\x36\x2e\x36\x20\x30\x20\ -\x31\x30\x37\x2e\x39\x2d\x34\x31\x2e\x33\x20\x31\x30\x37\x2e\x39\ -\x2d\x31\x30\x37\x2e\x39\x56\x34\x38\x34\x2e\x38\x63\x2d\x30\x2e\ -\x31\x2d\x35\x36\x2e\x39\x2d\x33\x30\x2e\x33\x2d\x39\x35\x2e\x33\ -\x2d\x38\x30\x2e\x37\x2d\x31\x30\x35\x2e\x33\x7a\x4d\x34\x31\x37\ -\x2e\x38\x20\x34\x38\x34\x2e\x38\x76\x31\x39\x32\x2e\x38\x63\x30\ -\x20\x31\x36\x2e\x32\x20\x32\x2e\x35\x20\x33\x31\x20\x37\x2e\x32\ -\x20\x34\x34\x6c\x2d\x31\x30\x36\x2e\x31\x20\x37\x30\x2e\x31\x76\ -\x2d\x37\x34\x2e\x39\x68\x2d\x31\x30\x31\x63\x2d\x36\x37\x2e\x37\ -\x2d\x30\x2e\x33\x2d\x31\x30\x32\x2e\x32\x2d\x33\x34\x2e\x38\x2d\ -\x31\x30\x32\x2e\x35\x2d\x31\x30\x32\x2e\x35\x56\x32\x39\x33\x2e\ -\x35\x63\x30\x2e\x33\x2d\x36\x37\x2e\x37\x20\x33\x34\x2e\x38\x2d\ -\x31\x30\x32\x2e\x32\x20\x31\x30\x32\x2e\x35\x2d\x31\x30\x32\x2e\ -\x35\x48\x37\x32\x35\x63\x36\x37\x2e\x37\x20\x30\x2e\x33\x20\x31\ -\x30\x32\x2e\x32\x20\x33\x34\x2e\x38\x20\x31\x30\x32\x2e\x35\x20\ -\x31\x30\x32\x2e\x35\x76\x38\x33\x2e\x33\x48\x35\x32\x35\x2e\x37\ -\x63\x2d\x36\x36\x2e\x35\x20\x30\x2e\x31\x2d\x31\x30\x37\x2e\x39\ -\x20\x34\x31\x2e\x34\x2d\x31\x30\x37\x2e\x39\x20\x31\x30\x38\x7a\ -\x20\x6d\x34\x39\x30\x2e\x34\x20\x31\x39\x32\x2e\x37\x63\x2d\x30\ -\x2e\x32\x20\x33\x38\x2e\x36\x2d\x31\x38\x2e\x32\x20\x35\x36\x2e\ -\x36\x2d\x35\x36\x2e\x37\x20\x35\x36\x2e\x37\x68\x2d\x38\x37\x2e\ -\x32\x76\x34\x30\x2e\x33\x6c\x2d\x36\x31\x2d\x34\x30\x2e\x33\x48\ -\x35\x32\x35\x2e\x37\x63\x2d\x33\x38\x2e\x35\x2d\x30\x2e\x32\x2d\ -\x35\x36\x2e\x36\x2d\x31\x38\x2e\x32\x2d\x35\x36\x2e\x37\x2d\x35\ -\x36\x2e\x37\x56\x34\x38\x34\x2e\x38\x63\x30\x2e\x32\x2d\x33\x38\ -\x2e\x36\x20\x31\x38\x2e\x32\x2d\x35\x36\x2e\x36\x20\x35\x36\x2e\ -\x37\x2d\x35\x36\x2e\x37\x68\x33\x32\x35\x2e\x37\x63\x33\x38\x2e\ -\x35\x20\x30\x2e\x32\x20\x35\x36\x2e\x36\x20\x31\x38\x2e\x32\x20\ -\x35\x36\x2e\x37\x20\x35\x36\x2e\x37\x76\x31\x39\x32\x2e\x37\x7a\ -\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\ -\x6c\x3d\x22\x23\x36\x42\x34\x30\x30\x44\x22\x20\x70\x2d\x69\x64\ -\x3d\x22\x35\x32\x34\x35\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\ -\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\ -\x35\x31\x2e\x34\x20\x34\x32\x38\x2e\x31\x48\x35\x32\x35\x2e\x37\ -\x63\x2d\x33\x38\x2e\x35\x20\x30\x2e\x32\x2d\x35\x36\x2e\x36\x20\ -\x31\x38\x2e\x32\x2d\x35\x36\x2e\x37\x20\x35\x36\x2e\x37\x76\x31\ -\x39\x32\x2e\x38\x63\x30\x2e\x32\x20\x33\x38\x2e\x35\x20\x31\x38\ -\x2e\x32\x20\x35\x36\x2e\x36\x20\x35\x36\x2e\x37\x20\x35\x36\x2e\ -\x37\x68\x31\x37\x37\x2e\x35\x6c\x36\x31\x20\x34\x30\x2e\x33\x76\ -\x2d\x34\x30\x2e\x33\x68\x38\x37\x2e\x32\x63\x33\x38\x2e\x35\x2d\ -\x30\x2e\x32\x20\x35\x36\x2e\x36\x2d\x31\x38\x2e\x32\x20\x35\x36\ -\x2e\x37\x2d\x35\x36\x2e\x37\x56\x34\x38\x34\x2e\x38\x63\x2d\x30\ -\x2e\x31\x2d\x33\x38\x2e\x36\x2d\x31\x38\x2e\x31\x2d\x35\x36\x2e\ -\x36\x2d\x35\x36\x2e\x37\x2d\x35\x36\x2e\x37\x7a\x4d\x35\x36\x37\ -\x20\x36\x32\x37\x2e\x34\x63\x2d\x32\x31\x2e\x31\x20\x30\x2d\x33\ -\x38\x2e\x33\x2d\x31\x37\x2e\x32\x2d\x33\x38\x2e\x33\x2d\x33\x38\ -\x2e\x33\x20\x30\x2d\x32\x31\x2e\x31\x20\x31\x37\x2e\x32\x2d\x33\ -\x38\x2e\x33\x20\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x20\x32\x31\ -\x2e\x31\x20\x30\x20\x33\x38\x2e\x33\x20\x31\x37\x2e\x32\x20\x33\ -\x38\x2e\x33\x20\x33\x38\x2e\x33\x20\x30\x20\x32\x31\x2e\x31\x2d\ -\x31\x37\x2e\x32\x20\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x20\x33\ -\x38\x2e\x33\x7a\x20\x6d\x31\x32\x32\x2e\x32\x20\x30\x63\x2d\x32\ -\x31\x2e\x31\x20\x30\x2d\x33\x38\x2e\x33\x2d\x31\x37\x2e\x32\x2d\ -\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x20\x30\x2d\x32\x31\x2e\x31\ -\x20\x31\x37\x2e\x32\x2d\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\x2d\ -\x33\x38\x2e\x33\x20\x32\x31\x2e\x31\x20\x30\x20\x33\x38\x2e\x33\ -\x20\x31\x37\x2e\x32\x20\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\x20\ -\x30\x20\x32\x31\x2e\x31\x2d\x31\x37\x2e\x32\x20\x33\x38\x2e\x33\ -\x2d\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\x7a\x20\x6d\x31\x32\x32\ -\x2e\x33\x20\x30\x63\x2d\x32\x31\x2e\x31\x20\x30\x2d\x33\x38\x2e\ -\x33\x2d\x31\x37\x2e\x32\x2d\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\ -\x20\x30\x2d\x32\x31\x2e\x31\x20\x31\x37\x2e\x32\x2d\x33\x38\x2e\ -\x33\x20\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x20\x32\x31\x2e\x31\ -\x20\x30\x20\x33\x38\x2e\x33\x20\x31\x37\x2e\x32\x20\x33\x38\x2e\ -\x33\x20\x33\x38\x2e\x33\x20\x30\x20\x32\x31\x2e\x31\x2d\x31\x37\ -\x2e\x32\x20\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x20\x33\x38\x2e\ -\x33\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\ -\x69\x6c\x6c\x3d\x22\x23\x46\x46\x44\x35\x32\x34\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x35\x32\x34\x36\x22\x3e\x3c\x2f\x70\x61\x74\x68\ -\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\ -\x4d\x35\x36\x37\x20\x35\x35\x30\x2e\x38\x63\x2d\x32\x31\x2e\x31\ -\x20\x30\x2d\x33\x38\x2e\x33\x20\x31\x37\x2e\x32\x2d\x33\x38\x2e\ -\x33\x20\x33\x38\x2e\x33\x20\x30\x20\x32\x31\x2e\x31\x20\x31\x37\ -\x2e\x32\x20\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\x20\x33\x38\x2e\ -\x33\x20\x32\x31\x2e\x31\x20\x30\x20\x33\x38\x2e\x33\x2d\x31\x37\ -\x2e\x32\x20\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x20\x30\x2d\x32\ -\x31\x2e\x31\x2d\x31\x37\x2e\x32\x2d\x33\x38\x2e\x33\x2d\x33\x38\ -\x2e\x33\x2d\x33\x38\x2e\x33\x7a\x4d\x36\x38\x39\x2e\x32\x20\x35\ -\x35\x30\x2e\x38\x63\x2d\x32\x31\x2e\x31\x20\x30\x2d\x33\x38\x2e\ -\x33\x20\x31\x37\x2e\x32\x2d\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\ -\x20\x30\x20\x32\x31\x2e\x31\x20\x31\x37\x2e\x32\x20\x33\x38\x2e\ -\x33\x20\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\x20\x32\x31\x2e\x31\ -\x20\x30\x20\x33\x38\x2e\x33\x2d\x31\x37\x2e\x32\x20\x33\x38\x2e\ -\x33\x2d\x33\x38\x2e\x33\x20\x30\x2d\x32\x31\x2e\x31\x2d\x31\x37\ -\x2e\x32\x2d\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x2d\x33\x38\x2e\ -\x33\x7a\x4d\x38\x31\x31\x2e\x35\x20\x35\x35\x30\x2e\x38\x63\x2d\ -\x32\x31\x2e\x31\x20\x30\x2d\x33\x38\x2e\x33\x20\x31\x37\x2e\x32\ -\x2d\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\x20\x30\x20\x32\x31\x2e\ -\x31\x20\x31\x37\x2e\x32\x20\x33\x38\x2e\x33\x20\x33\x38\x2e\x33\ -\x20\x33\x38\x2e\x33\x20\x32\x31\x2e\x31\x20\x30\x20\x33\x38\x2e\ -\x33\x2d\x31\x37\x2e\x32\x20\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\ -\x20\x30\x2d\x32\x31\x2e\x31\x2d\x31\x37\x2e\x32\x2d\x33\x38\x2e\ -\x33\x2d\x33\x38\x2e\x33\x2d\x33\x38\x2e\x33\x7a\x22\x0d\x0a\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\ -\x36\x42\x34\x30\x30\x44\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x32\ -\x34\x37\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x3c\x2f\x73\ -\x76\x67\x3e\ -\x00\x00\x9d\x49\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x01\x94\x00\x00\x01\x7f\x08\x06\x00\x00\x00\x6e\x46\x3f\xe1\ -\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\x00\x00\x9c\ -\xf3\x49\x44\x41\x54\x78\x5e\xed\x9d\x09\x80\x24\x45\x95\xf7\x23\ -\x32\xeb\xea\x7b\x7a\xee\x19\x86\xb9\x07\x01\x01\x15\x04\x41\x45\ -\x11\x75\x11\x65\xf1\x06\xd7\xd5\x55\xd8\x55\x57\xdd\xdd\x6f\x75\ -\x0f\x6f\xd1\xf5\xda\xc3\x5b\x17\x0f\x3c\x38\xc4\x03\x3c\x40\x90\ -\xc3\x01\x41\x50\x90\x73\x05\x01\x19\x18\x60\xae\xee\x19\x98\x99\ -\x9e\xe9\xaa\xae\xee\xae\x23\x33\xbe\x78\xd9\xf5\x8a\xd7\x6f\x22\ -\xab\xaa\xbb\xb2\xae\x9e\xf8\xc1\x7f\xe2\xa8\xcc\xa8\x8c\x97\x2f\ -\xe2\x75\x9e\x25\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\ -\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\ -\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\ -\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\ -\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\ -\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\ -\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\ -\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\ -\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\ -\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\ -\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\ -\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\ -\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\ -\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\ -\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\ -\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\ -\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\ -\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\ -\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\ -\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\ -\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\ -\xc5\x62\x89\x1a\x59\x4a\x2d\x96\x76\xa7\xd9\xbe\xaa\x4a\xa9\xc5\ -\x62\xa9\x11\x1b\x50\x2c\xed\x80\xbc\x69\xb5\x18\x10\x49\xb1\xde\ -\xcf\x8b\xee\x52\xdd\x14\xae\x18\x50\xa2\x6b\x83\xf4\xfa\xa7\xd7\ -\x33\x94\x5b\x18\x77\x62\x23\x5b\x55\x4e\xec\x2e\x55\x09\xe9\x8a\ -\xbd\xa7\x6e\x16\x7f\x2e\x15\x81\xa8\x82\x84\x0d\x36\x16\x8b\x01\ -\x1b\x50\x2c\x0d\xe5\x6e\x21\xba\xb3\x0b\xc4\x2a\x7f\x9e\x58\xe5\ -\x39\xdd\xab\x84\xea\x59\x25\x95\xb7\x5a\x08\x7f\x95\x92\xde\x6a\ -\xe9\xab\x45\xb0\x1c\x38\xa2\x9e\xa5\x0f\xf0\xc7\xa0\x5e\xc9\x1a\ -\xfd\x34\x68\x81\x4f\xf6\x41\x59\xb7\xb1\x47\x3a\xb1\xbb\x84\xe3\ -\x6c\x55\x05\xb1\x59\xc8\xbd\x7f\xf6\x12\x62\xf3\x69\x9b\xc4\xd6\ -\x60\xa9\x70\x6a\x0d\x1e\xb5\x2e\x67\xb1\xcc\x59\x6c\x40\xb1\xd4\ -\xcd\x4d\x87\x89\x85\xc2\x13\xcf\x35\x05\x0c\x47\x07\x8c\x60\x9a\ -\x07\x74\x60\x80\x7c\xc9\xe9\x64\xf0\x5f\x33\x51\xc1\xa4\x3f\x25\ -\xa9\x4a\x01\x40\xee\x97\x7e\x4c\xc7\x3d\x71\x8b\x97\xdf\x77\xeb\ -\xf8\xb0\xb8\xef\xd5\x42\x8c\x4f\x7d\x16\x50\x5a\xee\x00\xc2\xea\ -\x91\x6a\x9f\x5b\x2c\x73\x0e\x1b\x50\x2c\x33\x02\x82\x87\xef\x8b\ -\x93\x84\x4c\x3d\x4b\xa8\xee\x67\x29\xaf\xf8\x2c\x47\xfa\xab\xf5\ -\xec\xa9\x8f\x0d\x5a\x1c\x30\x66\xcb\x54\xa0\xf1\xa7\x82\x8c\xcc\ -\x2a\xe9\xde\x2f\x3d\xe7\xe7\xb9\xd8\xc8\x55\xaf\xdc\x5c\x3e\x82\ -\xe1\x01\x82\x97\x01\x53\x1d\x10\x56\x6f\xb1\xcc\x29\x6c\x40\xb1\ -\x84\x12\x16\x3c\xf4\x47\x7a\xea\x0d\xe2\x86\xd4\xff\x06\x41\x24\ -\x58\x61\xae\x50\x0a\x30\xca\x11\x59\x29\xdc\xfb\x7c\xcf\xf9\x85\ -\xe7\x8e\x5c\xf5\x8a\xc7\x82\xe0\x42\x83\x43\x58\x1e\xe0\x65\xc0\ -\x54\x67\xb1\xcc\x19\x6c\x40\xb1\x04\xdc\x2d\x44\x7c\x74\xb1\x58\ -\xa9\xfa\xba\x5f\x26\x65\xea\x65\x07\x4d\xf0\xa8\x06\x1e\xbd\x08\ -\xb1\xdb\x97\xf2\xe7\x93\x2a\xfd\xed\xbf\x7c\x22\xb8\xd0\x4f\x83\ -\x03\xe6\x4d\x75\x00\xcd\x23\xa6\x3a\x8b\xa5\xa3\xb1\x01\xe5\x20\ -\x06\x8e\x40\x54\xb1\xf7\x45\xca\x4f\xbe\x4c\xc9\x82\x0e\x24\xfe\ -\x1a\x38\x6d\xa5\x3f\x3a\x38\x83\x47\x35\x54\x10\x58\x9e\xf2\x84\ -\xb8\x7a\x22\x97\xb9\xf0\xd5\xc3\x10\x87\xcb\x81\xa1\x5a\x0a\xd0\ -\x3c\x62\xaa\xb3\x58\x3a\x12\x3b\x61\x1c\x44\xc0\x1d\x57\x99\x43\ -\xc4\x31\x5e\x57\xea\x74\xa5\x52\x2f\x96\xca\x7b\xb6\x8e\x1a\xbd\ -\xfa\x23\x1b\x40\x66\x02\x04\x16\x29\x86\x8b\xca\xbd\x70\xe4\x89\ -\xfd\xdf\xfe\x2b\x7d\xf4\x52\xfe\xe4\xe9\x00\xc1\xf3\xa6\x94\x62\ -\xaa\xb3\x58\x3a\x0a\x3b\x81\xcc\x61\xf0\x34\x96\xdb\xdd\xf3\x22\ -\xcf\x49\xbc\x4c\x39\xc5\x53\xa4\xaf\x16\x2b\x25\x1d\xbd\xe3\xe1\ -\x92\xb9\xdd\xff\x75\xa0\x23\x40\x4e\x87\xe1\x7b\x0a\x62\xec\xf3\ -\xa7\x3f\x26\xae\x9f\xaa\x9a\x16\x34\xa8\x80\xb0\x14\xe1\x65\x8b\ -\xa5\xa3\xb0\x13\xca\x1c\x03\x82\x48\x76\xad\x38\xbc\x20\x52\x7f\ -\x25\x54\xf2\x74\x29\xbd\xa3\xf0\x34\x96\xfe\xcf\x99\x5a\xca\x12\ -\x19\x0a\x1e\x71\x11\xc3\x05\xe1\x7e\xe7\x81\xc7\xf7\x9f\xff\x6f\ -\x42\x64\x83\x5a\xb3\x00\x9e\xa7\x29\xc2\xcb\x16\x4b\x47\x60\x03\ -\xca\x1c\x00\x82\x48\x66\xb5\x58\xe7\x25\xbb\xce\x14\xc5\xe4\xab\ -\xa5\x2a\x9e\x00\x47\x21\xfa\x30\xc4\x9e\xc6\x6a\x16\x4a\xee\x2b\ -\xfa\xe2\x47\xb7\x6f\x4d\x7f\xea\x13\xd3\x83\x0a\x5c\x77\xc1\x3c\ -\x0a\x30\x95\x29\xbc\x6c\xb1\xb4\x0d\xe5\x39\x27\xde\xfd\x62\x7c\ -\xf6\x4c\x09\x7f\xd8\x4e\x36\x1d\xcc\x2d\xab\xc4\xb2\x7c\xac\xfb\ -\x4c\x29\x13\xaf\x17\x7e\xf1\x25\xa5\x23\x11\x27\x38\x16\xb1\xb4\ -\x82\x9c\x27\xc4\x0d\x3b\x55\xe6\xc3\x6f\x7b\x22\xb8\xc5\x98\x06\ -\x13\x53\x60\x41\x01\x3c\x05\x68\xde\x62\x69\x29\xf4\x1a\xac\x50\ -\xa9\x97\xc1\x1f\xae\xd3\x9e\x3d\x93\xe2\xb7\x76\xe2\xe9\x30\xe0\ -\xce\xac\x82\xdf\x73\xba\x2b\x13\x6f\x52\x5e\xf1\x05\xa5\x8b\xea\ -\x36\x88\xb4\x09\xfa\xc8\x70\xd4\xf3\xd4\x8f\x6f\xdc\x96\xf9\xf4\ -\x7f\x4f\x1d\xa9\x60\x20\xe1\x69\x98\x00\x4c\x01\x9a\xb7\x58\x9a\ -\x4e\x70\x2d\x76\xd5\xc2\xa3\x95\xe3\xff\x93\x94\x85\xd7\x28\x25\ -\xfa\xf4\x64\x03\x33\xce\xb4\x39\x47\xd7\xdf\x6c\x27\xa1\x0e\x60\ -\xe3\x5a\x31\xe0\x38\x7d\x2f\x12\x7e\xec\x4d\xc2\x29\x9e\x22\x3c\ -\xb1\x44\x57\xdb\x20\xd2\xae\x28\xb9\x3f\xef\x8b\x4b\x4f\xdf\x9a\ -\xfe\x84\x2e\xd1\x40\x52\x6b\x70\x01\x30\x05\x68\xde\x62\x69\x1a\ -\xd7\xaf\x5e\x70\xb8\x2b\xd5\x07\x21\x90\x68\x2f\xec\xd3\x33\x4e\ -\xe8\x75\x58\x1b\x50\xda\x9c\x8d\x47\x8a\x95\x4e\x3e\x75\xae\xf0\ -\x12\x6f\xd6\x07\x96\x6b\xf4\x0e\x83\x20\x62\x2f\xac\x77\x00\xbe\ -\x90\xdb\x27\x84\x7b\xfe\x99\x8f\xef\xfb\x5e\x50\x9c\x2e\x08\x10\ -\x34\x8f\x65\xcc\x03\x34\x0f\xd0\xbc\xc5\xd2\x50\x82\x3f\x62\x45\ -\xcf\xeb\x84\x72\x3f\xac\x5d\x6f\x6d\x2d\xf3\x8e\x0d\x28\x6d\x48\ -\xf9\xf0\x32\xe6\xbf\x5b\xff\x55\xf0\x4a\xe5\x89\xa5\xf6\xe2\x7a\ -\xe7\xa1\x77\x96\xf2\x7d\xf9\xc4\xb8\x1f\xfb\xda\x99\xdb\x46\x7e\ -\xac\xab\x30\x80\x80\x3c\x92\x87\x40\x81\x69\x98\x10\x9a\xb7\x3c\ -\x4d\xad\x63\xc3\xda\xaf\x06\x6e\x5c\x2f\xd6\x09\x95\xfc\x80\xf0\ -\x13\xe7\x4a\x1d\x48\xb4\xd1\x6a\xb2\xaf\x0d\x28\x6d\x04\x5c\xf0\ -\x4a\x1f\xda\x7f\xb2\x4a\xb9\xff\x24\xbc\xe2\x0b\xb4\xeb\x57\x3c\ -\xbc\xb4\xb4\x3f\x10\x54\x8a\xc2\xbf\x7f\xb7\xca\x7e\xe6\xaf\x9f\ -\x10\xbf\xd7\x55\x3c\x98\xcc\x24\xb0\x20\x34\x3f\x27\x81\xb1\x00\ -\x3f\x79\x50\xec\x17\x8b\x1c\x47\x74\xc3\x5b\xac\x65\xb1\x2f\xf8\ -\x99\x03\x21\xbd\x3d\x42\xed\x79\xc8\x75\x45\x41\xc5\xc4\xce\x97\ -\x3c\x5c\xf5\xe7\x07\xaa\x31\xe7\xed\x59\x2b\xf0\xc7\xec\xde\x55\ -\x03\x27\xc7\x62\xf2\x53\xc2\xf7\x4e\x9c\xe9\xfc\x63\x03\x4a\x1b\ -\x00\x17\xd9\x8b\xc5\xe0\x4e\xad\xbf\x95\xca\x3b\x41\xbb\xb7\xab\ -\x77\xa4\xdd\x2f\x73\x07\xe5\x29\xf5\xfb\x07\x73\x63\x1f\x7c\xdf\ -\x70\x30\xf9\x61\x10\x81\x94\x07\x17\x98\xdc\x0e\xba\xa0\x82\xaf\ -\x00\xf2\x55\xf2\xc5\x42\x14\x5f\xe4\x48\xef\x99\xba\x83\x4f\x8f\ -\x81\xa9\xbb\x17\x9f\xa6\xf4\xd3\x03\x4a\xc8\x71\xe9\x3a\x0f\xea\ -\xec\x2d\x4a\x8c\xde\x38\xf2\xa8\xb8\xfd\xac\xe9\x3f\x3d\x60\xa2\ -\x9a\xed\xe6\x94\x6d\x6b\x85\x9d\xe2\x5a\x37\x9b\x39\xc8\x06\x94\ -\x16\x42\xaf\x8f\xe8\x5d\xb1\x56\x57\xd9\x8b\xec\x73\x14\x5f\xc9\ -\x91\x09\x25\x7e\x70\xe6\x96\xf4\x97\x75\xb1\x08\x55\x5a\x18\x50\ -\x78\x60\x41\xc1\xc4\x66\x12\x42\xf3\x1d\x05\x1c\x81\xc0\xed\xa7\ -\x7e\x2a\xf9\x7a\xe5\x27\x5f\x1d\xfc\xfc\x81\x92\xf0\xd7\xf0\x6c\ -\x5e\x01\xa4\xf4\x44\xa6\x1c\xa9\x72\x9e\x70\xef\x97\x22\xfe\xb5\ -\xec\xe3\x7b\x7e\xc9\x7e\xd3\x86\xc2\xed\x16\x66\xc7\x8e\xb5\xef\ -\x4c\xb9\x6e\x95\x58\x16\x73\x53\x7f\x2f\x65\xfc\x9f\xb5\xf1\xfb\ -\x66\x68\xff\x32\x36\xa0\x34\x19\x7b\x7d\xe4\xe0\xa5\xa0\xfc\xbb\ -\x1e\x9d\xc8\x9e\xf7\x8f\xbb\xc4\x26\x5d\xc4\x20\x02\xc1\x05\x83\ -\x89\x29\xb0\xc0\xa4\x86\x29\x00\x29\xe6\x01\x9a\x6f\x7b\xe0\x8f\ -\x28\xe9\x75\xbd\xa9\x61\x0f\xdf\xc2\x9b\xa1\xa5\xc8\xe9\xbf\xcd\ -\xee\x2b\xfa\xf1\x2f\x9f\xb6\x65\xcf\xcf\xca\x9f\x4c\x27\xcc\x86\ -\x26\x7b\x9a\xea\xe6\x0c\x78\xbd\x44\xf9\x89\xbf\x85\xeb\x25\xa5\ -\xea\x59\x61\x03\x4a\x13\x81\xc1\xe4\x16\x53\xef\xf2\xbd\xf8\x39\ -\xd2\x17\x4b\xb4\xe3\xdb\xeb\x23\x07\x11\x70\x94\x92\xf5\xc5\x8f\ -\x5e\xb3\x35\xfd\x55\x5d\xe4\x01\x85\x0b\x03\x0c\x4c\x66\x18\x50\ -\x50\x00\x4f\xdb\x16\xc3\xb5\xc1\xc6\x3f\x37\xa5\x03\x8b\x3e\xd4\ -\xd9\x52\x70\x75\x50\x79\x74\xef\xb7\x82\x9a\xa7\xa9\x64\x43\x53\ -\x1d\xc0\xcb\x73\x82\x1b\xd7\x2f\x3c\x56\xa9\xe2\x7f\x49\xdf\x3b\ -\x35\x8a\xf9\xc8\x06\x94\x26\x00\xe7\x87\x3d\xaf\xfb\xf5\xd2\x8f\ -\xbf\x5b\x09\xff\xe8\x7a\xff\x0a\xb0\x74\x2e\x9e\xf0\x1f\xd8\xe1\ -\x67\x3f\x7f\xee\x16\xf1\x87\xa0\xf8\x74\x40\xa9\x14\x58\x78\x40\ -\xc1\xc9\x8d\xa7\x6d\x05\x9c\x93\x77\xdd\xde\x97\x2a\x15\xfb\x7b\ -\xe1\x7b\x2f\xd1\x5b\xd9\xd4\x6b\x83\xfa\x8b\x94\x3e\x02\xda\xe7\ -\xfb\xe2\xd2\x4d\x5b\xd3\x9f\xfc\x87\xa9\x87\x4c\x01\x93\xfd\x4c\ -\x75\x34\x45\x78\xb9\x23\x81\x33\x25\xfb\x57\xf6\x9d\x26\x5d\xf9\ -\x25\xdd\xa5\x59\x5d\x2f\x31\x61\x03\x4a\x03\x09\xce\x13\xaf\xec\ -\x3b\xd5\x8f\xbb\x1f\xd2\x03\xea\x79\x33\xb9\xfd\xee\x60\x47\xf9\ -\x32\xab\x67\xd8\x61\x4f\xc9\x5c\xa9\x4a\x38\x52\xf5\xc4\x1c\xb5\ -\x5c\x47\xe3\x64\xa9\xaa\x13\x99\x18\x57\xea\x97\x7f\xf9\xc4\xd8\ -\xa7\x74\x1e\x02\x06\x04\x12\x1e\x54\x68\x70\xc1\x80\x62\x0a\x2a\ -\x20\x00\xd3\xb6\x00\xff\x80\x12\xfa\x0f\x28\x29\xfc\xa3\x74\x55\ -\x4b\xaf\x0d\x4a\x1d\x54\x0a\x4a\x5c\x74\xda\x96\xf4\x47\x4b\x55\ -\x26\xfb\x85\xd5\x01\x98\x22\xbc\xdc\x51\x4c\x05\xfa\xee\xb3\x7d\ -\xdf\xfd\x84\x9e\x90\x96\xea\xce\x44\xb6\x6f\x6c\x40\x69\x00\x10\ -\xfd\xf7\x1d\x32\xff\x38\x27\xae\x3e\x20\x9d\xe2\x19\xda\xc8\xf6\ -\xae\x2d\x8d\x76\xdc\x9c\x27\xe5\x53\xb9\xa2\xb3\x2d\xab\xfc\x47\ -\xb3\x22\xfd\x64\x26\x27\x46\x8b\x9e\xc8\x6d\xdb\x27\x9e\xd4\x7f\ -\xb2\xa7\x4b\x8b\xc2\x4c\xaa\x70\x46\x45\xdc\xa7\x25\x57\xeb\xa0\ -\x72\x4c\x97\x58\x34\xaf\x5b\x2c\xec\x75\x93\xf3\x07\xe2\xdd\x1b\ -\x52\xae\x77\x58\xdc\x11\x8b\x1d\xa5\x06\x82\x15\xda\x14\x7d\x94\ -\xf2\xd0\x56\x2f\xfb\xc5\x77\x6c\x15\x77\xe8\x22\x0f\x28\xb4\x4c\ -\x85\x01\x85\x06\x16\x80\xa7\x2d\x83\x07\x92\xb6\xfa\x03\xca\x97\ -\x8f\xe5\xbc\xf8\x17\x5e\xb9\x7d\xef\xa5\xba\x84\xf6\xab\x45\x00\ -\x4f\x01\x9a\xef\x18\x82\x1b\x81\x0a\xc9\x7f\x14\x7e\xe2\x9d\xba\ -\x07\xfd\xa5\xea\xc8\xb0\x01\x25\x62\x66\xf2\x9a\x82\xb9\x8a\x76\ -\x2a\xaf\xa8\x03\xc7\xa4\x72\x1e\x9a\xf0\xfc\xed\x10\x38\x86\xb2\ -\x62\xfb\x95\xfb\xc5\x56\x98\x19\xf3\x7a\x11\x38\xec\xc8\x7b\xf0\ -\x8c\xc6\xd4\x6c\x99\xd5\x75\xd5\xee\xf5\x24\xa8\x98\xfe\xa7\x4f\ -\x4f\x56\x70\xa8\x12\x48\x87\xec\x6e\x5d\x3e\x4c\x88\xd4\x49\x03\ -\x62\xcd\xa1\x7d\x89\x13\x7b\x9d\xd4\xf1\x71\xa9\x56\xc2\x0a\xed\ -\x84\x52\x32\x93\xf5\xd4\x2f\x5e\xbd\x2d\xf3\x45\x5d\x84\xee\xd3\ -\x40\x82\xc2\x7a\x48\x41\x95\x8e\x54\x90\x96\x4c\x72\xe5\x6b\x24\ -\x49\xe7\x5f\x84\xe7\x9d\xda\x8e\x47\xe2\x7a\x63\x94\xaf\xfc\xbb\ -\x76\xe7\xb3\x1f\xfe\xab\x21\x71\xaf\xae\xe2\x76\x34\xd9\x95\x0b\ -\xc0\x14\xa0\xf9\xb6\x07\xe6\xa6\x98\xe3\x7f\x4c\xa9\xe2\x9b\x1a\ -\x75\xda\xdd\x06\x94\x88\x80\xdb\xee\xe2\x4e\xea\x5c\xe1\xc6\xdf\ -\xa3\x87\xff\xd2\x83\x2d\x90\xc0\x29\xaa\x49\x5f\x3e\xbc\xdf\x13\ -\x77\x3d\x36\x39\xfa\xc0\xcf\x75\xf0\xa0\x81\x03\x4e\x5e\xef\xab\ -\x7d\x00\x56\x5b\x2e\xf4\x73\x08\x34\x83\x7a\xfe\x18\xd4\x01\xe6\ -\x59\x3a\xb8\xbc\x74\x41\xea\xe8\x43\xfb\x92\xaf\x49\x28\xff\xc8\ -\x76\x3a\x55\x56\xf0\xd4\x6d\xbf\xde\x3a\xf6\x71\x1d\x51\xf6\xe8\ -\x22\x0d\x2a\x85\x52\x4a\x03\x0a\xa6\x61\x01\x05\xed\x81\x69\x53\ -\x80\x23\x71\x7c\x61\xa0\x70\x0a\xaf\x95\x7e\xf0\x07\x54\xdb\xce\ -\x27\xf0\xcc\x4a\xd1\x51\x3f\x79\xc5\xe6\xcc\xbf\x07\xc5\x29\xa1\ -\x3d\xb9\x6d\x6b\xb5\x33\xcd\xb7\x25\xc1\xf5\x92\x35\x83\x27\xea\ -\x30\xff\xf1\xa8\x2e\xbe\x87\x61\x03\x4a\x9d\xe0\xce\x92\xae\xfa\ -\x18\xfc\x75\xa6\x77\x16\x9c\x95\x99\xf3\xe8\x51\x94\x2b\x28\xf9\ -\x44\x26\x2f\xee\x1a\x9a\x4c\x3f\x70\xdb\x7e\xf1\xf8\x9f\x85\x98\ -\xcc\xe8\xe0\x91\xd6\x1f\x97\x82\x07\xf5\xad\xb0\x81\x67\xaa\xe7\ -\x75\xb5\x2c\x73\x00\x3a\xb8\xc8\x45\x5a\x47\xba\x22\xfe\xda\x85\ -\xa9\xa3\xd7\x75\x27\xde\x96\x90\xea\x19\xa5\x8f\x5b\x4a\x51\xf9\ -\x0f\x3f\x51\xcc\x7e\xe5\xef\xb7\x8b\xbb\xa0\x58\x45\x18\x54\x60\ -\x92\x83\x3c\xf4\x9d\x4f\x78\x40\x55\x9b\x44\x45\xa7\xde\xb1\xa8\ -\x84\x7f\xdf\x1e\x91\xfd\x8f\x37\x3d\x5e\x7e\x6b\x01\xda\x92\x0a\ -\xeb\x68\x4a\x05\x60\x0a\xd0\x7c\x5b\x11\x1c\x3d\x1e\xd2\x7b\x86\ -\x4a\x38\x9f\xd1\x9b\x19\xd9\xc5\x77\x0e\x18\x00\x1a\xb6\x01\xa5\ -\x0e\xe8\xc5\x2d\x3d\xa8\xe0\xa8\x64\x4e\xdb\x52\x3b\x4d\x10\x44\ -\xf6\x8e\xcb\xdf\xde\xb1\x67\xf4\xd6\x5b\x84\x18\x2d\x05\x90\xe0\ -\xe8\x03\x66\x3a\x03\xa6\xc1\x16\x36\x18\x6b\xc9\x03\xbc\x5c\x11\ -\x38\x6a\x59\x2c\x84\xf3\xb6\xc5\x62\xe9\xf3\x7a\x12\x6f\xe8\x93\ -\xc9\x33\xa7\x3e\x69\x1d\xbe\x90\x7b\x46\x3c\x71\xd9\xd9\x5b\xd3\ -\x17\xe9\x22\x0f\x20\x20\x3c\x52\x01\x99\x8e\x52\x6a\x99\xe8\x22\ -\x07\x26\xa8\xd1\x15\x7d\xa7\x89\xb8\x73\x5e\x27\xde\xb1\xa8\x94\ -\xdc\x3b\xa9\xc4\xc5\x67\x6c\x49\x7f\x41\x17\x69\xd0\xe0\xb6\x45\ -\xe1\xe7\x68\x63\x14\xc0\xd3\xb6\x02\xe6\xa7\x98\xd3\xfd\x16\x4f\ -\xb9\x9f\x75\xea\x78\x58\xb1\x1a\xd0\x79\x6c\x18\x02\xca\x41\xf1\ -\x17\x75\xd4\x4c\x5d\x2b\x49\xfd\xb7\x76\xb5\x0f\x68\x63\xf6\xcf\ -\xe5\x60\x52\x14\x72\xf7\x7e\x5f\x5e\xf3\x50\x26\x73\xf1\x17\x9f\ -\xcc\xfd\xf8\xfa\x4c\xee\x91\x5b\x95\x98\xd8\xa1\x82\x23\x91\xe0\ -\x71\x64\x36\xa2\xf8\x00\xa3\x65\xcc\x43\xca\xf3\x28\xd3\x40\x0e\ -\xcb\x53\x41\xfd\x01\x9f\xe9\x0a\x95\xd1\xfa\x53\x56\x64\x96\xc6\ -\xbc\xad\x8b\x12\x22\x96\x94\xb1\xc3\xf5\x67\xad\x24\xa1\xb5\xef\ -\x47\xfb\xf3\xb7\x4e\x15\x03\xff\x81\xed\x05\x30\x45\xb0\x2f\x00\ -\xfd\x8c\x2f\xd7\x50\xe0\x01\xb8\xc9\xf9\xc9\xf3\x84\xeb\x7e\xdc\ -\x11\x6a\xa5\xde\xe2\x8e\x3b\xad\xab\x03\x60\xb7\x23\x95\x7f\x5c\ -\x57\xfe\x9e\xeb\x32\x62\x0c\xaa\x98\x00\x9a\x07\x68\xde\x44\xb5\ -\xcf\x9b\x4e\x70\xf1\x5d\x25\x3f\xac\xbc\xf8\x79\x7a\xe3\xba\x74\ -\x55\xc3\xb6\x91\x35\xbc\xc5\x06\x94\x19\x00\x7f\xa1\xbd\xe9\x90\ -\xde\xd7\x3a\x31\xf5\x1d\x3d\x77\x9d\xac\xad\x39\x27\xed\xe7\x2b\ -\x99\xce\x2a\xf5\xfb\xc7\x0a\x63\x17\xfe\x7c\x47\xee\xa2\x1f\xa6\ -\x73\xf7\xdc\x98\x15\x7b\x9e\xd0\x7f\x96\xc2\xd1\x08\xfc\xf9\x6c\ -\x20\x6c\xb2\xa3\x93\x21\x17\x06\x00\x1a\x0c\x2a\xa5\x3c\x4f\x05\ -\xf5\xa6\xcf\x82\xba\x9c\x4e\x1f\x1c\x17\x99\x35\xae\x37\xb4\x30\ -\x21\xba\x13\x32\xb6\x5e\xd7\xb7\x04\x3d\x08\xf5\x9c\xec\x67\x8f\ -\x74\x0b\x0f\xff\x66\x42\xec\x2f\x55\xc3\x76\xd2\x14\xc0\x3e\xf1\ -\xba\x30\x22\x9f\x38\xc0\xe7\xcf\x5e\xd1\x77\x86\x90\x5d\xe7\x4b\ -\xe5\xbc\x4a\x7f\x41\x4a\x57\x37\x6c\x82\x6a\x38\x4a\x4d\x38\xb2\ -\xf0\xe8\xcf\x46\xc5\x36\x5d\x82\x7e\x70\x21\x34\xdf\x31\x6c\x5c\ -\xbb\xe4\x68\x37\x9f\xf8\x1f\xa1\xe4\x5b\x75\x0f\x1a\x32\x3f\x81\ -\x03\x86\x18\xc7\x06\x94\x5a\xc1\xbf\xd0\x54\x2c\xf6\x51\xfd\xa7\ -\xd9\x9c\xbb\xf0\x1e\xdc\x9d\xe5\xc8\xa1\xbd\x45\x79\xc5\xc6\x1d\ -\xe9\xaf\x7f\x3b\x9d\xbf\xf9\xd7\xa3\x62\xf8\x1e\x25\xf2\x7b\xf4\ -\xd1\x48\x85\xbb\xb0\x4c\x93\x1d\xa4\x61\x2a\x4f\xf2\x44\xb4\x1c\ -\xb6\x4c\x35\xe1\x69\x8b\xb0\xb6\xd5\xa4\x4e\xef\x9b\x10\xa3\xc7\ -\x26\x13\x63\x83\x71\xf7\x08\x47\x8a\x79\xba\x7e\xd6\x40\xc3\xb3\ -\x9e\x75\x94\xf4\x5c\xd1\xb5\xf3\x17\x63\xb9\xcd\x50\x9a\xaa\x0c\ -\xc0\x3c\xad\x03\xa0\x8c\x42\xf8\x32\x91\x32\x17\x8e\x4a\x38\xf0\ -\x8b\xb5\x9e\x4c\x0d\xff\x64\x7f\xee\xff\x74\x11\xfa\x03\xbb\x10\ -\x53\xbe\x3b\x4d\xbb\x97\xda\x1c\x3f\x37\x2d\xd7\x54\xe0\x7a\xee\ -\xeb\x57\x0d\x9c\xe2\xb8\xc5\x2f\xe9\xa1\xd0\xd0\x8b\xef\x15\x3a\ -\x6b\x03\x4a\x35\xca\x3b\xca\xe9\xfa\x9a\xf4\x9d\xd7\x68\x63\x76\ -\xf6\x5f\x68\x0c\x08\x24\x05\x29\x1f\x1f\x9a\x94\x97\x5c\x36\x94\ -\xfe\xce\x0f\x32\xb9\xfb\x6f\xf5\xc4\xc4\x4e\x3d\x6c\xe0\x9c\x40\ -\xc8\x8c\x65\x9a\xd4\x20\x0d\x13\x9d\xe0\x51\x61\xf5\xa8\xb0\xf3\ -\xda\x58\x1f\xf6\x39\x15\x7e\x47\x39\x85\xa0\xd2\x97\x2d\xee\x5b\ -\x93\x12\xf9\x9e\xb8\xfb\x02\x5d\x37\x6b\xea\x73\x02\x98\xd8\xc4\ -\xf0\xe5\xa3\xc1\xc4\x86\xc0\x76\xf2\x94\x0b\xa0\x79\x4e\xdd\xbe\ -\x39\xc7\x7d\x1e\xee\xf6\x1b\xf9\xe1\xfe\xfc\xcd\x3a\x85\x3e\xf1\ -\x60\x42\xf3\x94\x4a\x36\x6f\x29\x70\xbd\x24\x3f\xd8\x73\xb6\x23\ -\xe5\x7f\x4b\xa5\x8e\xd1\x5b\xdf\x90\x60\x02\x9d\x37\x19\x86\x60\ -\x03\x4a\x25\x60\x47\xe5\x16\x74\x9f\xe3\x38\xf2\x02\xe9\x07\x77\ -\x49\x34\x2c\xea\x37\x1b\xed\x1c\xb9\xbc\x90\x9b\x74\x20\xf9\xe1\ -\x65\xc3\xe9\x8b\x2e\x4d\xe7\x1e\xbd\x53\x89\xc2\x88\xfe\x80\x9c\ -\xd2\xe2\x03\x08\xcb\xa6\xd4\x24\x3a\xb9\xd7\x2a\x08\x14\x34\x68\ -\xf0\x00\x82\x29\xcf\x57\x53\x79\x7b\x1e\xd1\x5d\x7c\x59\x6f\xb2\ -\x67\x9e\xeb\x1e\x2b\x25\x3c\xd2\xd2\x7c\xf4\xf7\xea\x49\x5a\x8d\ -\x96\x26\x36\x00\xb6\x8f\xa7\xb5\x28\x52\xe8\xe4\x24\x94\xdf\xb0\ -\xc9\x69\x26\x40\x27\xab\x4c\x64\x35\xa3\xdb\x71\x3c\xa5\x86\x2e\ -\xdd\x9f\xbf\x41\x17\x69\x30\xa9\xf7\x2b\xa2\xda\xc4\x19\x11\xbc\ -\xfa\x5f\x75\xbd\x43\x4a\xf7\xb3\x7a\x03\x1a\x7a\x73\x50\x0d\x0d\ -\xdb\x80\x12\x06\x5e\xd8\x92\x78\x61\x6b\x8e\x5c\x78\xd7\x83\x33\ -\x37\x29\xfd\xfb\x37\xe5\xc6\xbe\xf5\xb9\xa1\xdc\x8f\x7e\x9d\xce\ -\x3d\x0e\x81\x04\x4e\xe4\xb3\xd9\x89\x16\x31\x4f\x53\x9e\x47\xe1\ -\x04\x1e\x36\xd9\x43\x7d\x35\xf1\xe5\xb0\x6c\x4a\x67\x2c\xfd\x8f\ -\x3a\xae\xb7\xe0\x2f\x8a\xab\xc1\x84\x8c\x3d\x53\xd7\xcd\x1a\xe8\ -\xf0\x6c\x1d\xa3\xa8\xc4\x36\x16\x50\x40\x80\x29\x0f\xdb\x1e\xf6\ -\x79\x24\x94\x7c\xfe\xdf\x84\x88\x7d\x44\xf7\xa9\x6d\xee\x5c\x8c\ -\x7a\x23\x7c\xa1\xf6\x6c\x48\x16\xee\xbb\x39\x3b\xed\xc2\x3c\x60\ -\xfa\x2a\x6a\xdf\xc8\x6d\x5e\x0f\xb0\xbf\x84\x97\xfc\x80\x9e\xa3\ -\x3e\xa4\x8b\x0d\xb9\xf8\x0e\x1d\x9d\x41\xa3\x36\xa0\x98\x80\xb7\ -\x70\x8a\x62\xe2\x6b\xd2\x73\xde\xa4\xad\x39\x27\x6c\xa4\x1d\xa3\ -\x1c\x48\xfe\x73\x47\xe1\xb2\x5f\x8f\x8a\x5d\x5b\x94\xf0\x47\xa7\ -\x3e\xa3\xd0\x22\xe6\x69\x4a\x35\x6d\xa2\xd6\xe2\x93\x3c\x2d\x43\ -\xde\xf4\xb9\x49\xfc\x33\x2c\xd3\x7a\x6c\xa3\x56\xd1\x75\x54\x7c\ -\x4c\x8c\x1f\xd3\x13\xef\xeb\x8e\xb9\x2f\xd5\xe5\xba\x98\xed\x28\ -\x2e\xf8\x62\xfb\x8f\x46\xf3\xbf\xd5\x59\x93\x7d\x01\xcc\x07\xdb\ -\x4c\x04\x60\x6a\x62\xc6\x9b\x84\x17\x73\x95\x92\x6f\xd7\x2b\xcf\ -\xa9\xd3\xba\x1c\x5f\xa9\xdd\xbb\x73\x85\xbb\x6e\x1c\x17\xe0\xfe\ -\xd0\xcf\xb0\xbe\x52\x7b\x23\xb4\x8c\x79\x5c\xbf\x69\x36\x6b\xc6\ -\x1c\x05\x9d\x9b\xe1\xe1\xe9\x96\x39\x73\x0a\x27\x0a\xe0\xdc\xf1\ -\xc6\x43\xfb\x4f\x13\x5e\xe1\x7b\xd2\xf7\x5e\xaa\x77\x54\xc7\xdb\ -\x07\xae\x91\xe4\x85\xdc\xbc\x75\xd2\xf9\xea\xbf\x6f\xc9\x7e\xf2\ -\xb3\x43\xe2\xbe\x87\x3c\xe1\x3d\x69\x1e\x28\x58\x87\x79\x10\x4e\ -\x66\x38\x19\xa3\x70\x62\x47\xd1\x67\x26\x40\xf4\x59\x0a\xcc\x43\ -\x5a\x8b\xf2\x21\x65\x5e\x8f\x82\x7a\x14\xaf\xa7\xe5\xb2\x6e\x11\ -\x62\x22\x27\xdc\x9d\xca\x77\x86\x74\xb9\x25\xb8\x52\x0d\x7c\x72\ -\x91\x58\xa3\xb3\xe0\x67\x33\x11\x4e\x82\x75\x4f\x60\xe8\xf3\x8e\ -\x9a\xbc\x44\xc9\xe2\x5f\x76\xda\xb3\x25\xb3\x41\x3b\xb3\x9e\x87\ -\x83\x47\x94\x60\x22\xae\x45\xdc\xe6\x68\x77\x9a\x6f\x0a\xcd\x9c\ -\xa3\xa0\x63\x30\xf0\x67\xc2\x9c\x77\x9e\x5a\x81\x73\xc7\xa3\x6b\ -\x7b\xde\xe2\xc4\xc4\xd7\xa5\x0c\xce\x1d\x37\xd5\x51\x1a\x81\xe7\ -\xcb\x9d\x3b\x27\x9c\x6f\x7d\x77\x6b\xfa\xc3\x1f\x1f\x1e\xbd\x65\ -\x96\x81\x04\xf3\x3c\x80\xa0\x30\x68\xf0\xc0\x31\x93\x00\x62\x52\ -\x68\x30\x30\xa8\xda\x77\x1d\xd0\x56\x4e\x6b\xc2\x73\x77\x7b\x4a\ -\x3e\xa2\xcb\xb3\xa6\x5e\x27\xd1\x01\x1f\x27\x25\x10\x8c\xc7\x30\ -\xd1\xe5\x70\x59\xcc\xcf\x0a\x98\x9c\xe0\x35\xe6\xc4\xe7\xa1\xcd\ -\xb6\x05\x1c\x31\x22\xa4\x6e\x0c\xfa\x4a\x83\x06\x0f\x30\x68\x77\ -\x2e\xba\x0f\x9a\x0a\xcc\x51\xe9\x0d\xdd\xe7\xc8\x84\xfa\x7e\x23\ -\xe7\xa8\x7a\xec\x0c\x06\x3a\xe8\x81\x0b\x5b\x52\x76\xbd\x4b\x48\ -\xe7\xcb\x52\xaa\x75\xda\xa0\x4d\x77\x96\x28\x81\xe7\x48\xf6\x15\ -\xc4\x15\x57\x6e\x4f\x7f\xe0\x23\xbb\x46\xaf\xfd\x85\x27\xc6\xf5\ -\x9f\xe1\x26\x3f\xc1\x3a\x48\x51\x78\x04\x02\x79\x1a\x38\x68\x50\ -\xc1\x00\x62\x12\x4c\xd8\x98\x56\x52\xb5\x80\x41\xdb\xe0\xed\x9a\ -\xda\x87\x3a\x5e\x6f\x5a\xbe\x9c\x2f\xc8\x74\xc6\x77\xc6\xe1\x7d\ -\x5a\x2d\x41\x0f\xbe\x58\x4a\x95\xcf\x7d\xa3\xe8\xc4\x85\x79\x5a\ -\x47\x05\xd0\x3c\x40\xf3\xa1\xc0\xe4\xb4\x7f\x7d\xf7\x3b\x45\x5c\ -\x5c\xda\x29\x3e\xcf\x3b\x3a\x5b\xa0\xaf\x5a\x68\x53\x1a\x40\x78\ -\x1e\x97\x41\xc1\xd7\x63\x0a\xd0\xcd\x89\x62\xd3\x42\x81\xf7\x05\ -\x4a\x91\x7a\xbf\xf2\xdd\xff\xd1\x1b\xbf\xac\x91\xfb\xab\x9e\x86\ -\xc1\x38\x07\x35\x70\xaf\xbd\xef\x25\x3f\x2b\xfd\xd8\x67\xb5\xa7\ -\xf5\x77\xc2\xc0\x0a\x43\x6f\x7b\x6e\x5c\xa9\xdb\x6f\x4f\xa7\x3f\ -\xf2\xc1\xe1\xcc\xf7\xbe\xef\x89\x91\x6d\xba\x1a\x22\x00\x43\x2f\ -\x7a\x80\x30\x90\xa0\x4c\x41\x24\x2c\x98\xe0\x64\x3d\x6d\xc2\xae\ -\x43\xb4\x8d\xb0\xf6\x21\xa5\xa2\x9f\xd3\x3a\x9a\x4e\xab\x1b\xf5\ -\xc5\x88\x3e\x8a\xdb\xaa\xf3\x2d\x41\x4a\xb7\x67\x61\x62\x60\x09\ -\x64\xb5\xf8\xa4\x85\x79\x2a\x53\x1d\xc2\xcb\xa1\x40\x30\x81\xd7\ -\x72\x48\xe5\x7e\x56\x4f\x4e\x1d\xe5\xf3\xe0\xa8\x34\x9d\x2d\xda\ -\xb1\xc1\x96\x34\x68\x54\x0a\x26\x68\x5b\x9a\x47\x9b\xd1\x7c\x43\ -\x80\x39\x2a\x1e\x4b\x7e\x52\xa8\xf8\x47\x75\xc7\x23\x7f\xed\x3c\ -\x50\xaf\x3d\x11\x30\xd0\x41\xcb\xd4\x4f\x60\xce\xfb\xa6\xf0\x13\ -\x7f\xab\x5d\x02\x9c\xa8\x23\x81\xeb\x24\x39\xe5\x6f\xda\x9c\xcb\ -\xfc\xcf\x07\xb7\x8d\x7d\xee\x4b\x7b\xc5\x96\xcd\x9e\xf0\x0d\x0f\ -\x23\x82\xdf\x70\x41\xd0\xc0\x94\x0a\x03\x49\x58\x10\x01\xe1\x24\ -\x5e\xab\xe8\x3a\xbc\x2d\x2a\xfa\x79\xb5\x65\x51\xd5\xb6\x95\x2a\ -\x68\xb3\xe0\x8b\x49\xe9\x4a\xb8\xd3\x67\xd6\x80\xe1\x66\x8b\x5e\ -\x17\x7f\x4f\x9d\x4f\x4e\x28\x3a\xa9\xf1\xc9\x8c\x8b\x63\xaa\x2b\ -\xff\xa5\xeb\xeb\x60\xa2\x37\xa0\x21\x93\x53\x33\x30\x76\x6e\x06\ -\x90\x53\x8d\xdc\xc6\x5c\x74\x19\x5c\x07\x65\x22\xac\x7e\xc6\xc0\ -\x29\xc9\x1b\xd6\x0c\x9e\x8c\x73\x54\x23\xaf\x6f\x45\xd5\x70\xc3\ -\x36\xb0\x9d\x81\x1d\x75\xfd\xaa\x81\x53\x95\x2a\x7c\xbd\xd3\x2f\ -\xbe\xc3\xe9\xad\xfd\x45\x71\xd5\x55\xdb\xb2\x9f\xfe\xd4\x90\xb8\ -\xe3\x41\x1d\x48\x42\x5e\x15\x8f\x75\x90\x72\xc1\x44\x5c\x4b\x20\ -\xc1\x60\x50\xab\xca\x93\xb7\xa1\x8e\x0a\xdb\x47\xd1\xef\xc6\x3c\ -\xdd\x26\xcc\xcf\x54\xd8\x66\xa0\xef\xec\x16\x23\x45\xdf\xdd\xa2\ -\xf3\xb3\xa6\x9e\xd9\x23\x98\x95\xe0\xf7\x0c\xa7\x08\x8a\x44\xa6\ -\x09\x8c\xd6\x03\x58\x57\x13\x70\x9b\x69\x3c\x91\xfc\x40\x23\xff\ -\xd2\xed\x04\x60\xcc\x7c\x75\x8f\xd8\xae\xb3\x60\xcb\x5a\x84\x76\ -\xa6\xf6\xa6\xf9\xc8\xc1\xeb\x5b\x52\x78\x4d\xb9\x41\x08\x26\x81\ -\x28\x68\xe8\x46\xb6\x23\xb8\xa3\x62\x8e\xfa\x96\xf4\xfd\x13\xf5\ -\x8e\x6a\x98\x53\x34\x12\x3c\x2a\x79\x2c\x9f\xfe\xea\x07\x87\x33\ -\xdf\xbf\xc8\x13\xfb\x2b\x5c\x27\x31\x89\x06\x90\x5a\x8f\x48\xa8\ -\x78\x50\x08\x13\x2e\xcb\xd7\x07\x99\xbe\x0f\xcb\xf8\x19\x88\x6e\ -\x1f\xdf\xd6\x4a\xaa\xb8\xec\x0e\xfd\x3d\xae\x1f\xe4\x5b\x0d\x9f\ -\xa8\x4c\x93\x18\x0a\xa0\x79\x84\x97\xa7\x01\xc1\x44\x16\x92\xff\ -\x22\x8a\x89\x7f\xec\xe4\x3b\xb9\xc0\x71\xeb\x01\xc6\x8d\x27\x45\ -\x6e\x64\xaa\x88\x76\xa4\x32\xd9\xde\x54\x87\xd0\x7c\x24\xf0\xeb\ -\x5b\xfa\x1b\x22\xff\x0e\xa0\x5e\x5b\x9a\x38\xa8\x02\x4a\xf9\x4e\ -\x2e\x57\x7e\xa9\x91\x3b\xaa\xd1\x94\x8e\x4a\xae\xfe\xd5\xb6\xec\ -\x67\xfe\x63\x48\xdc\x59\x3a\xbd\xc5\xfd\x03\x03\x07\x80\x79\x98\ -\x60\xa9\x60\x32\xa5\x93\x2e\x9d\xd8\xb9\xc2\x02\x05\xe6\xe9\x72\ -\x95\xca\x20\xfe\x7d\x58\xe6\xdb\x44\xb7\x0d\xf2\xb4\xbe\x16\x99\ -\xd6\xc3\xf6\x02\xe9\xc9\x15\xea\xda\x05\x3a\x59\x61\xbe\x56\x01\ -\xbc\x1c\x80\xc1\x44\x16\x13\xff\xa0\x3f\xe9\xe8\x31\x3f\xad\x63\ -\xb3\x40\x09\x99\x9d\xf4\x9c\x27\x75\x96\xda\x0a\x85\x81\x03\x52\ -\x2a\xbe\x1c\x15\x60\x2a\xcf\x8a\xe0\xe1\x52\x37\xf9\xd1\x66\x5c\ -\xdf\x6a\x44\xc3\x60\xac\x83\x02\xbc\x10\x09\x77\x72\x89\x0e\xbd\ -\x93\x8b\x1d\x95\xc0\x45\xf7\x7d\xc3\x4f\x07\x0b\x0a\x96\x21\x85\ -\x09\x13\x97\xc1\xc9\x95\x4e\xac\x74\xa2\x37\x89\x06\x0d\xcc\xd3\ -\x3a\x5e\x8f\x75\xa8\x69\x13\xb8\x41\xb8\x2d\xa6\xd4\x24\x53\x5f\ -\x4c\xaa\xb6\x5c\xf0\x1d\x8e\x94\x90\x6f\x19\xe4\x5c\xfe\x6c\x55\ -\x09\x39\x97\x82\x49\x14\xf8\x4a\x64\x27\x8a\x02\x02\x0a\x60\xb2\ -\x67\x25\x35\x14\xf8\x59\x0c\x67\x72\xf0\x73\xaa\x98\x78\xbf\xf6\ -\xdc\x8e\x3c\x25\x79\x50\x38\x18\x46\x7d\xbc\x10\xa9\x67\x99\x86\ -\x3b\x47\xd4\x54\x38\x2a\x01\x21\x58\xe6\x2a\x4f\xa0\xa5\x34\x4c\ -\x34\x10\xd0\x00\x61\xca\x53\xd1\xf5\x50\xa6\xf6\xa9\x70\x62\x37\ -\x09\xb7\x19\xf3\xbc\x2f\xa6\x7a\x2e\x5c\x8e\x2e\x8b\xf9\xf2\x67\ -\x7a\x00\x40\xb9\x25\x78\xc2\x1b\x1d\xca\x8f\x9a\xee\x32\xe3\x13\ -\x99\x49\x08\x2f\x97\xb9\xf1\x08\x1b\x4c\x38\x4a\x16\xb3\xfb\xdd\ -\x34\x1e\xa1\x20\xd4\x86\x98\xa7\x9f\x03\xb4\xde\xf4\xf9\xac\xc1\ -\x6b\xba\x31\xd7\xfb\xae\x68\xe0\x6f\xbe\x37\x83\x39\xef\x64\xf8\ -\x17\x5a\xa7\x46\xfd\x59\x1e\x95\x80\xca\x93\x26\x11\x4e\xe6\xa6\ -\x00\x40\x85\x41\x82\x07\x0e\xac\x0f\x13\x0d\x18\x61\x32\x6d\x17\ -\x8a\x6e\x3b\xe6\xeb\x15\x40\xcb\xd3\xbe\x47\xc1\x23\x6e\xad\x42\ -\x6f\x89\xfe\x1f\xbe\x3f\x6c\xa2\x32\xd5\xd3\x14\xf3\x00\xcd\x07\ -\xc1\x44\x15\x93\xef\xb7\xc1\x64\x3a\x9e\x27\x47\xff\xbc\x43\x84\ -\xdd\x2a\x6e\xb2\x29\xaf\xa3\x84\xd5\xd7\x8c\x0e\x26\xf0\x33\xbd\ -\xaf\x85\x6b\xba\xc2\xf7\x4e\xd2\x2d\x36\x7d\x5f\x45\x39\x00\xe6\ -\xb4\xa3\xe1\x21\x24\x0c\xaa\x4e\x8c\xfa\xbe\x2f\xc7\xc7\x3c\x75\ -\xd3\x6f\x33\xd9\x2f\x90\xa3\x12\x80\xfa\x00\xe4\xc3\x04\x93\x27\ -\xc8\x34\xb1\x83\x68\x30\x08\x0b\x1e\x98\xd2\x65\xb0\x0c\xc2\x76\ -\x78\xdb\x54\xb8\x1d\xb8\x4d\xa6\xb4\x56\xcd\x14\x53\x1b\x65\xc5\ -\xa6\xbe\xbf\x65\xe8\x8d\x30\x4d\x4a\x61\x93\x18\xd6\xd1\xcf\x0e\ -\x58\x4e\x07\x93\x43\xe7\x6a\x30\x81\x9d\x36\x5b\xe0\x8f\xb3\x82\ -\x23\xd3\x97\x08\x01\xbf\x5c\x0d\xa0\x9d\x51\x88\xa9\x0e\xe0\xe5\ -\xba\x80\xd3\xf0\x99\xf5\xdd\xe7\xf8\x29\x79\x41\x2b\xaf\xe9\x46\ -\xf9\xa5\x73\x36\xa0\xc0\x33\x26\xae\xeb\x7d\x0d\x0e\x21\xb5\xc5\ -\x3a\xae\x9f\x9e\x90\xbb\x77\x2b\xf9\xe3\x0b\x87\xc6\x2e\x38\x7f\ -\x8f\xd8\x49\x8e\x4a\xe8\x98\xc2\x3c\xd6\xc3\xe4\x88\xc2\x89\x9c\ -\x4f\xee\x20\x1a\x10\x40\x3c\x48\x60\x1d\xd6\xd3\x3c\x5d\x1f\xdb\ -\xe3\xdf\x43\xb7\x83\x6f\x17\x96\x71\x9b\x01\xcc\xd3\x3a\x0a\xff\ -\x7c\x36\xa2\x04\x75\xdf\x17\x22\xa6\x3c\xd5\x3d\x55\xd5\x7c\xf4\ -\x04\x97\x7b\x6a\x4f\xf0\x82\x42\x0a\x1d\xdf\x90\x37\x89\x53\xae\ -\xbb\xf6\x70\x71\xa8\xb4\x47\x26\x46\x3c\x29\x47\xd2\xbe\x7c\xb4\ -\xc2\x8f\xc5\x99\xa8\x64\xf7\x59\x53\x3a\x0d\xff\x49\xdf\x73\xbf\ -\xd2\x69\x0f\x97\x22\xa6\x0d\x9e\x93\x0e\x07\xc1\x44\xaa\xe2\x7f\ -\x75\xe2\x33\x26\xf0\x57\xd4\xa4\xf0\x1f\x7a\x28\x97\xfe\xea\x47\ -\x76\x8c\x5e\x79\x95\x27\xc6\x33\xa5\x8f\xa6\x92\x32\x58\x0e\x26\ -\x47\x22\x3a\x79\xd3\x49\x1e\x83\x00\x17\x0f\x1a\x34\x78\xd0\x3c\ -\x08\xdb\xa1\xed\xa2\xe8\xf7\xa2\x70\x7b\xf8\x36\x72\x51\xaa\x7d\ -\x3e\x5b\x78\x7b\x6a\xf9\x3a\xd1\x2f\x1d\x6f\x75\xa9\xdc\x74\x7c\ -\x29\x73\xfa\xaf\x65\x1e\x50\x80\x5a\x26\xb0\x03\x96\xb9\x7a\x83\ -\x58\x99\xf0\x92\xef\x57\x6d\x16\x4c\x82\xd3\xb6\xc2\x7f\x70\x54\ -\xe5\x7e\x55\xaa\x9a\x15\xb0\xe3\xaa\x19\xa5\x12\x4a\x14\x47\xf7\ -\x7a\x99\xba\x9e\x3b\xd2\xd4\xb2\x6f\x2a\x12\xcc\x4f\xb9\x79\xdf\ -\x85\x5b\xb8\x75\x4b\x1d\xf9\x40\x35\x18\xc0\x34\x30\xe7\x5c\x40\ -\xc1\x60\xa2\xa6\x82\x49\x5d\x3b\xbe\xd9\xe8\x1d\x94\x9b\x90\xea\ -\xb6\x5b\xd2\xd9\x2f\x7f\x6e\x48\xdc\xf7\x84\x27\x7c\x98\xa9\xa7\ -\x3e\x2a\x03\x79\x2e\x9c\xc0\x71\x62\xa7\x13\x3d\x88\x06\x03\x54\ -\x58\xe0\xa0\x01\x04\xc5\xdb\x03\xe1\x77\x72\xe1\xf6\xd0\x94\x8b\ -\x52\xe9\xb3\x46\xf1\xf4\xf7\xb4\x68\x04\xc0\xe9\xcc\x9c\x27\x9f\ -\xaa\xf2\xd7\x32\x4e\x5e\xdc\x8f\x0f\xf0\xeb\x2b\xd7\x89\x95\x49\ -\x95\x7c\x9f\x9e\xa4\xde\xab\x3f\x6d\x9f\x60\xe2\xcb\x6c\xd6\x53\ -\xbf\x79\x3c\x97\xfd\xb1\xa3\x44\xbc\x54\x3d\x2b\xea\x1d\xcc\x45\ -\x4f\xa6\x1f\x1a\x0a\x7e\x4b\x7e\xa6\x50\xdf\x9c\xb5\x9f\xc2\xc5\ -\xf7\x76\x7d\x9b\xf9\x4c\x6d\x1b\x66\x80\x39\x15\x50\x3a\x39\x98\ -\xf8\x4a\x8e\xec\x2e\xc8\x9f\x7d\x77\xeb\xd8\xd7\xe1\x14\x57\xe9\ -\xad\xc0\xdc\x79\x31\x8f\xf5\x74\x22\x47\xd1\x49\x9f\x07\x06\x10\ -\x0d\x1e\xbc\xcc\x83\x09\x6d\x0b\x65\xfa\x4e\x10\xdd\x26\xcc\x53\ -\x51\xc2\xea\x9b\x89\x92\x4a\x0c\x48\xc7\x6f\xc9\x11\x8a\x92\xa2\ -\x58\x94\x72\xb2\x54\x04\x5f\x45\x85\x11\xfa\xd9\x8f\xd7\x8a\x43\ -\xbb\x65\xf2\xff\x39\x5e\xe2\x3d\x7a\xa9\xb6\x19\xd3\x70\x67\xe2\ -\xbe\xa2\xba\xf6\xa2\xa1\xb1\x6f\x8f\x15\xba\xc6\x93\x32\xb5\xaa\ -\xf4\x51\xd3\x81\x00\x3e\xe1\x39\xdb\x2f\x15\x02\x7e\x4b\xae\x1a\ -\xd4\x3f\x23\xf1\xd1\xf2\x33\x70\x6d\xf8\x36\xf3\x99\x76\xb2\xd2\ -\xb2\x73\x22\xa0\x40\xe4\xbf\x61\x65\xdf\x19\xc2\xcb\xff\xa4\x13\ -\x83\x49\x41\x79\x5b\x1e\xcd\xa7\xcf\xff\xf0\x70\xfa\x27\x55\x4e\ -\x71\x71\xd1\x09\x9d\x4f\xfc\x18\x10\x30\x38\xf0\x60\x41\x03\x49\ -\x98\x68\x7b\xf4\xbb\xb8\x70\x5b\x20\x05\x70\xfb\x28\x58\xc7\xeb\ -\x5b\x86\xaf\x16\x77\x0b\xaf\x67\x51\xa9\xd8\x54\xd4\xf4\xe7\x21\ -\x6a\xe5\x80\xa0\xf3\x83\x95\x62\xe5\x02\xa7\xfd\x82\x49\x51\xc8\ -\xdd\xbb\x3c\xf9\xe3\x0f\xef\xcc\x5c\xb4\xcd\x13\xf9\x45\x8e\xbf\ -\x3c\x21\xd5\x61\xa5\x8f\x9b\x8e\x76\xce\xd1\xac\x27\xb7\xb2\x9b\ -\x5a\xa8\x4f\xd2\xba\x30\x2a\x7d\x16\x4a\xbb\xbf\xcd\x7c\x26\x1b\ -\x03\x06\xa8\xb4\x7c\xc7\x07\x14\x7c\x95\x4a\x27\x3e\xfd\x0e\xe7\ -\x96\xc7\x95\x7f\xd7\x4d\x99\xf1\xcf\x7e\x7a\x48\xdc\x59\xe3\x29\ -\x2e\x3a\x91\x83\xe8\xa4\x8f\x32\x05\x07\x10\x06\x11\x1a\x48\x68\ -\xde\xd4\x16\xff\x3e\x2a\xba\x5d\x00\xcd\x03\xfc\xf3\xb6\x42\x8a\ -\xfc\x80\x90\x1e\xfc\xc0\x55\xf3\xd1\x47\x28\x85\xa7\x8f\x50\x66\ -\xc5\xc5\x87\x8a\x15\x4b\x12\xc9\x7f\xd0\xc1\xe4\xef\x75\x7b\x6d\ -\x33\x96\xe1\x0f\xa4\xc7\x73\xe9\x6f\x9e\x37\x34\x7a\xd5\xa3\x9e\ -\x50\x2f\x5c\x20\xe6\x0f\x76\xa9\x0d\xfa\xa3\x96\x8d\xcd\xa2\xf0\ -\x76\x3f\x54\x4c\xdf\x5f\x2a\x86\xc1\xfd\x94\xfa\x6f\xd8\x67\x15\ -\x69\xf7\xb7\x99\x57\xed\x00\x01\x96\xad\xb6\xf1\x1d\x1d\x50\x68\ -\x30\xe9\xb4\xa7\xdf\xe1\x10\x3c\x5d\x10\xd7\x7d\x77\x5b\xf6\xf3\ -\xe4\x2e\x2e\x80\xee\x63\x5a\x47\x05\x93\xb9\x69\xf2\xc7\xc0\x80\ -\xaa\x74\x04\x12\xf6\x19\xb6\xc5\x83\x07\x15\xdf\x1e\x14\xc2\xcb\ -\x6d\x89\xeb\xf8\xdd\x4a\x8a\x96\x1c\xa1\x78\xca\x4b\x6f\xcf\x8d\ -\xce\xe6\x7c\x7e\xc0\xb7\x57\x97\x83\x89\xfe\xcb\xb7\x3d\xc6\x31\ -\x5e\x7c\x7f\x24\x3f\x7e\x81\xfe\x03\xe9\x8e\xc7\x75\x30\x81\xfa\ -\xa5\x6e\xd7\xfc\x2e\x91\x7a\x46\xb0\x50\x0b\xd0\x1b\x91\xcb\x09\ -\x67\xf8\x1b\xbb\x2b\x1e\x11\xa2\xbf\xa2\xef\x62\x99\x52\xe9\x33\ -\x4a\xf0\x39\x9c\x82\x6f\xf7\xb7\x99\xd7\x3a\x61\x42\x87\x6a\x59\ -\xb6\x63\x03\x4a\x27\x07\x13\xbc\x25\xf8\x92\x9d\x99\x8b\xd8\x29\ -\x2e\xea\xa8\x58\x46\xe1\x64\xce\x27\x7b\x0c\x00\x28\x1e\x20\xf0\ -\x88\x84\x8a\x7e\x4e\xd7\x35\xb5\x4f\xc5\xb7\x09\x44\x31\xd5\xb5\ -\x2d\x8e\xf2\xbb\xa5\x52\x8b\x4b\xc5\xa6\xe2\xfb\x22\x7b\xcf\xde\ -\x19\x9f\xf2\x0a\xec\xfb\xb5\x43\xc5\x21\x2b\xdd\xe4\x7b\x62\x7e\ -\xe2\x1d\xed\x14\x4c\x26\x85\x7f\xcf\xad\x99\xec\x97\xe0\x67\xa6\ -\xf1\x77\x95\x9f\xa3\xe3\x76\xab\x4f\x77\x15\x95\xb3\x7b\x6f\xde\ -\xf9\x93\x1e\x67\xd4\x37\xd1\x57\x51\x00\x4d\x4d\xaa\x44\x79\x19\ -\x7a\x0a\xbe\x9d\xef\x34\xad\xd6\x21\x04\x96\xab\x75\x72\xed\xc8\ -\x80\xd2\xc9\xc1\xa4\xa0\x9c\x1d\xdb\x26\xe5\x45\x70\x4b\xf0\x2f\ -\x3d\x31\x01\xb3\xb7\x86\xee\x5b\xc8\x53\xd1\xc9\x1c\xf3\x34\x08\ -\x80\x68\x80\xa8\x55\xb8\x1e\xb6\x81\xed\xe2\x77\x50\xf1\x6d\x02\ -\x51\x4c\x75\x6d\x0d\x9c\xd7\x56\xaa\x78\x64\xa9\xd8\x54\xb4\xa1\ -\x72\x79\xc7\x19\xb9\x5e\x08\x3c\xe5\x85\xf6\xe3\x36\xa4\xf5\xc1\ -\x67\x5f\x3d\x44\x1c\xb2\x3e\x9e\xfc\xfb\xf8\xd4\x5f\xbd\xed\x11\ -\x4c\x4a\x77\x72\xfd\x2e\x93\xbd\xe0\x7f\x77\x8b\x5d\xbb\x4a\xf5\ -\xc0\xcb\xe6\x8b\xc5\xf3\x53\xea\x68\x9d\x6d\xd9\x18\x2d\xfa\xc5\ -\xa7\xee\x1e\x1e\xad\xf5\x74\x17\xb7\x79\x35\x01\x98\x8a\x9b\x56\ -\x4f\xfd\x4c\xaf\x88\x8b\x6f\xb7\xfb\x29\xf8\x5a\x37\x6c\x26\x1d\ -\xe8\xb8\x80\xd2\xa9\xc1\xa4\xf4\x17\xdc\x43\x0f\xe7\x47\xbf\x05\ -\xbf\xef\x5e\xe1\x7a\x09\xa6\x54\x30\xa9\xe3\xc4\x4f\xc5\x83\x03\ -\xc8\x74\x44\x02\x32\x2d\x8b\xed\xd2\x14\xc5\xb7\x01\xc0\x14\xa1\ -\x9f\x75\x14\xc5\xdc\x82\x45\x4a\x74\x1f\x55\x2a\x36\x15\x5f\xc9\ -\xec\xa4\x2f\x9f\x04\x83\xcf\x84\xff\x5e\xa6\x83\x49\x32\xf1\xce\ -\x84\x4a\x9c\xa3\xbd\xbe\x6d\x82\x49\xba\xa8\x6e\x82\x3b\xb9\xe0\ -\xd4\x2d\x3e\x82\x8e\x1c\xda\x95\x5a\xda\xe3\x26\x8f\x2f\x15\x9b\ -\x0e\x9c\x5a\x9e\xf4\x9c\xed\x97\x4c\xbf\xbb\x8b\xfa\x2c\xf5\x61\ -\xcc\x57\x13\xa5\x5c\x86\xd7\xdd\xf8\xf1\xe4\x47\x9a\xf1\x33\xbd\ -\xed\x4a\xc7\x05\x94\x7d\x6b\x07\x9f\x27\x62\xce\x67\x3a\x2d\x98\ -\x4c\x08\xff\x5e\x7c\xbe\x64\x06\xd7\x4b\xe8\x04\x8f\x82\x79\x88\ -\x06\x05\x90\x29\x70\x54\x92\x29\x88\xd0\xef\xa5\x02\x68\x1e\xe0\ -\xe5\x8e\x43\x3a\xfe\x42\x29\xbd\x67\x96\x8a\x4d\x45\x1b\x2e\x3b\ -\x56\x94\x61\xa7\xbb\xd0\xb6\xd3\xec\xfb\x99\xa5\x62\xf9\x91\xdd\ -\x89\xbf\x4d\xaa\xe4\xdb\xda\x25\x98\xc0\x9d\x5c\x3b\x7d\x79\xe9\ -\x07\x76\x66\xbe\x75\xa5\x3e\xda\xe6\xc1\xe4\x0d\xbd\xa2\x7b\xa1\ -\xab\x56\xba\x4a\x0c\x96\xaa\x9a\x4e\xd1\x29\xee\xdc\xae\x32\x77\ -\x91\xe7\x7d\xd0\xae\xd4\xc6\x98\xaf\x24\xca\x01\x75\x1b\x57\x2d\ -\x78\x86\xc8\x0d\x7e\xb6\x93\xdf\x14\x1c\x05\x1d\x15\x50\xe0\x22\ -\x97\x2b\xd5\x79\x8e\xf0\x8f\xd6\x7b\xb3\x23\x82\x09\xfc\x85\x94\ -\x29\xa8\x1b\x7e\xb5\x2d\xfb\xb5\x2a\xcf\x97\x50\xe1\x24\x8f\x93\ -\x3e\x17\x0d\x0c\x34\x50\x84\x09\x97\xc3\xf5\xb1\x5d\xfa\x3d\x28\ -\xbe\x2d\x20\x84\x97\x3b\x16\xe9\x14\x17\x4a\xe1\xb7\x24\xa0\xc0\ -\x05\xf9\xe1\x5c\xf9\x2d\xc3\x95\xec\x19\xd8\xfb\x93\x8b\xc5\xb2\ -\x63\x7a\x12\xe7\x74\xf9\xc9\xb7\xb6\x4b\x30\x29\x9d\xba\xbd\x10\ -\xef\xe4\x02\x67\x62\xa8\x67\xf7\x74\x2d\xeb\x8f\xa5\x4e\x28\x95\ -\x9b\x0e\xfc\x21\x97\xf7\x9d\xe1\x1b\x87\xc4\x26\x28\x4e\xd5\x06\ -\xa0\x1f\x73\x85\xf9\x7f\xa8\xe0\xf5\x3d\xd7\xaf\x99\xf7\x02\x37\ -\xe6\x7d\xb5\xd3\xdf\x14\x1c\x05\x1d\xd3\x79\xfa\xd0\xa2\xde\x93\ -\x1d\x13\x4c\xe0\x74\xc0\xc5\x3b\xc7\xbe\x7b\xb1\x27\xf6\xd5\xf0\ -\x7c\x09\x9f\xdc\x51\x18\x08\x68\x50\x80\x7c\x2d\x47\x24\x74\x3d\ -\x53\xdb\xf4\xfb\xb9\x10\x5e\xee\x68\xe0\xfa\x89\xf0\x0b\xcf\xd4\ -\x1d\x6a\x89\x1f\xc1\x05\xf9\x3b\xab\x5f\x90\x0f\xec\xfd\xf1\xa5\ -\x62\xd9\xb1\xbd\x89\xb7\x75\xfb\xc9\xbf\x6e\x97\x60\x92\x17\xde\ -\x63\x8f\xe4\x47\xbf\xf1\x89\xe1\xd1\x5b\xf0\x4e\x2e\x86\x3a\x56\ -\x08\x77\xb1\xa3\x96\xa6\x84\xdf\xb2\x8b\xf1\xa5\x77\x77\xfd\xf9\ -\xda\xa7\xaf\x55\x99\x40\xdf\x46\xd5\x32\x46\x02\x3e\x21\x44\xfc\ -\x90\x43\xfb\xfe\x22\x26\xfc\xef\x96\x9e\x7f\x6b\xeb\xf9\xb4\xbc\ -\xe1\x0d\xa4\x23\x02\x4a\x27\x3e\x01\x0f\x77\x72\xed\x54\xf2\xd2\ -\x0f\xef\xcc\x7c\x1b\x2e\xbe\xcf\xe0\x2d\xc1\xe8\xc4\x18\x38\xb8\ -\x78\xc0\xa0\xe2\x01\x06\x97\x87\x14\xdb\xe4\x83\x84\xe6\x01\x4c\ -\x01\x5a\x3f\x67\x68\xe9\xf5\x13\x38\xa7\xaf\xff\x6a\x2e\x5d\x90\ -\xa7\x36\xa7\xb6\x0e\xd2\x8f\x2c\x11\x4b\x8f\xef\x4e\xbc\xa5\x5b\ -\x25\xff\xaa\x9d\x82\xc9\xa3\xb9\xf1\xef\x95\xee\xe4\xc2\xed\xa5\ -\x04\x75\xa7\x2c\x10\x83\x0b\x92\xfe\x33\xf5\x60\xed\x0a\x6a\x5b\ -\x40\xd1\xf7\x76\x3f\x92\xcd\xfc\x09\x9c\xbe\x04\xda\x98\x0a\x80\ -\x94\x8e\x83\xaa\xba\x6c\xbd\xe8\x7f\xfe\x9a\xee\x37\xc7\x62\xf2\ -\x0b\x9d\xf2\xfc\x5b\x33\x36\xb0\xed\x03\xca\x4d\xab\x17\x1c\xae\ -\x47\xe1\xbf\x76\x5a\x30\xd9\xe5\xc9\x2b\xce\xdb\x31\x7a\xf5\xa6\ -\xda\x2f\xbe\xe3\x44\x4f\x05\xab\xa2\x68\xa0\xe0\x81\x03\xaf\x9f\ -\xd0\xe5\x70\x3d\xda\x1e\xfd\x1e\xfa\xdd\x54\x08\xcd\xcf\x29\x5a\ -\x79\xfd\x44\x1b\x7e\x74\xcc\x93\xdb\x60\xc7\x84\x10\xd8\xfd\x43\ -\x8b\xc5\x92\x13\x7a\x12\x6f\xd6\xc1\xa4\x2d\xde\x96\x0d\xa7\x8f\ -\xe0\x21\xdc\xdf\xa6\xc7\xff\x13\x82\x09\xbd\x93\xab\x04\xf5\x21\ -\xb5\x26\x95\x3a\xb4\xcf\x4d\x9e\x0c\x1f\xb4\x02\x08\xdc\x13\x45\ -\xe7\xd1\xaf\xef\x15\xf0\x32\xc8\x30\x5f\x9e\xb6\xcd\xb5\xea\x82\ -\x35\xa2\x7f\x9e\xec\x7a\xb3\xeb\xb8\x5f\xe8\x94\x6b\xb9\xb0\xe1\ -\xcd\xa0\xad\x03\x0a\xbc\xe2\xd9\x8b\x8f\xbd\x5b\xa8\xc2\xd9\x9d\ -\x12\x4c\xe0\x29\xe1\xcd\xb9\xf4\xb7\x20\x98\xc0\x9d\x5c\xa5\x6a\ -\xba\x3f\x31\x1f\x38\x67\x49\x38\xc9\x63\x10\xa0\xa2\x81\xc3\x24\ -\x0c\x2e\x74\x59\xba\x3e\xb6\x8d\xa2\xdf\x4b\x85\xf0\xf2\x9c\x02\ -\xee\x12\x14\x5e\x7e\x55\xcb\xae\x9f\x08\x2f\xbd\x2b\x97\x0e\xfb\ -\x81\xa7\x80\x0f\x2e\x16\x8b\x4f\xec\x49\xfc\x55\xaf\x4a\x9e\xd5\ -\x2e\xc1\x24\x78\xc6\x64\x2c\xfb\x2d\xb8\x0e\x18\x12\x4c\xca\xe9\ -\xdb\x7a\x45\xdf\x42\xc7\xdf\xd0\x0e\x17\xe3\xf7\x95\xca\x04\xf4\ -\x6f\xba\xcd\x28\x3e\x56\x70\xbc\x94\xf3\x97\xad\x11\x2b\x56\xc7\ -\x92\x1f\x74\xfd\xd8\x7f\xe8\x4f\x3a\xe6\xb5\xf3\xcd\xda\xc8\xb6\ -\x0d\x28\xf8\x4b\x8b\x8d\xf8\x5d\x07\xf4\x9e\xa8\x81\xd3\x01\x0f\ -\xe7\xc7\xbf\x8b\xaf\x51\x29\x55\xd3\xaf\xc2\x3c\x6e\x02\x3a\x2a\ -\x17\x06\x07\x1a\x24\x50\xa6\xd3\x5a\x74\x39\x2c\x83\xb0\x3d\xfc\ -\x3e\x93\x10\x5e\x9e\x93\xec\x3b\x52\x2c\x93\xc9\xe2\x09\xba\xa3\ -\x2d\x99\x08\x3c\x25\x47\x3e\x3f\x22\x1e\x29\x15\x81\x69\xfb\xe0\ -\x03\x8b\x82\x60\xf2\xa6\x5e\x91\x7c\x43\x5b\x04\x93\xd2\x33\x26\ -\xb7\x8c\x65\xbf\xfd\xcd\xdd\x62\x17\xbf\x93\x4b\x83\xdb\x8f\xfe\ -\xe3\x1f\xd5\xd3\xb5\x74\xb0\x7d\x2e\xc6\x23\xb8\x7d\x61\x0a\x1b\ -\x27\xe5\xfa\x1f\xac\x14\x2b\x06\xdd\xe4\x3f\x39\xc5\xc4\x3f\xe9\ -\x9a\x83\xf6\x4e\xae\x4a\xb4\x65\x40\x81\x37\x73\x3a\xb9\xae\x33\ -\xa5\x1f\xfd\xfd\xf6\xe0\x19\x40\x94\xb3\x49\xe9\x2f\xb8\x87\x36\ -\xe5\xc6\x2f\x9c\xc1\x6d\xc1\x38\xd9\xa3\x68\x20\x40\x61\x80\xc0\ -\x60\xc1\x83\x09\x15\x5d\x8f\xb7\x8d\xc2\xef\x06\x30\x05\x68\x7e\ -\x6e\x93\x9f\xbf\x5c\x78\xad\x99\xec\xe0\xed\xbb\x59\xdf\xd9\xb6\ -\xe7\x40\x7b\x07\xfb\xe5\x5f\x16\x8a\x25\x27\xf6\x26\xce\xea\x13\ -\xc9\xd7\xb5\x4b\x30\xc1\x67\x4c\x6a\x0c\x26\xea\x74\x21\x12\xcb\ -\x84\xbf\x26\x2e\xd5\xe1\xc1\x27\x2d\x40\xdb\xf9\xa9\x91\x49\xe7\ -\x8f\xa5\x8b\xf1\xdc\xd6\x08\x6e\x33\x1d\x1b\x74\xac\xd0\x7a\x75\ -\xd9\x21\xf3\x8f\x58\xea\x0e\xfe\x57\xbb\xbd\x37\xad\x1e\x1a\xf1\ -\x17\x55\xdb\x19\x06\x82\x49\xcc\xe9\x7e\x8b\x10\xb1\xcf\xe8\x5d\ -\xd9\x57\xaa\x8e\x04\xf4\xac\xa8\x83\x09\x7d\xc6\xa4\x74\x5b\x70\ -\xf0\x51\x29\x05\x02\xa7\x2c\x89\x3b\x2c\x0d\x02\x90\xf2\x40\x51\ -\x29\x88\xa0\x4c\x81\x84\x7e\xa7\x49\x00\xcd\x1f\x14\x38\xaa\xb0\ -\x4c\xcf\x94\x2d\x09\x28\x9e\x90\xe9\xb4\x27\xe9\xe9\xae\xb2\xed\ -\xdf\xd3\x2b\x16\x9c\x94\x4a\x9c\xd1\x2f\x92\xaf\x6d\xa7\x60\x72\ -\xf1\xce\xcc\x85\x57\x7a\x62\xbc\x96\x60\xa2\xe5\x1f\x3f\xbf\x67\ -\xe1\x40\xaa\xeb\x59\x3a\xdf\x92\x23\x40\x20\xaf\xbc\x9d\x7f\xd8\ -\x95\xbe\x13\x06\x04\x83\x6e\x2b\x40\xcb\x74\xec\x4c\x1b\x43\x97\ -\xaf\x9e\x77\xf4\xfc\x94\xff\x19\x29\x8a\xaf\x9a\x4b\xc1\x04\x8d\ -\x10\x15\x4a\x3a\xfb\xdb\xca\x38\xc1\xf9\x6d\xd5\x7b\x9a\xaf\xdc\ -\xe0\xcd\x9c\xa5\xea\x48\x40\xe3\x35\x22\x98\xfc\x3e\x93\x0d\x9e\ -\x12\xae\x31\x98\x60\x4a\x85\x01\x81\xca\x14\x38\xb8\xf8\x3a\xbc\ -\x7d\xfa\xdd\x00\xa6\x00\xcd\x1f\x14\x5c\xb7\x4a\x2c\x13\x5e\xe1\ -\x04\xed\x04\x2d\x99\xec\x3c\x55\x1c\x79\xa4\x30\x8a\xa7\xbb\xca\ -\xfb\xe4\xaf\xfa\x44\xf7\x0b\x06\x93\x2f\x1c\x48\xa4\x5e\xd3\x0e\ -\x13\x16\x3c\xb0\xf8\xa4\x92\x3f\x86\x60\x72\xd5\xd4\xeb\x81\xb8\ -\xbd\xa8\x3f\xa1\x20\x4a\x3b\xab\x53\xde\xea\x2e\xd7\x3b\x11\x3e\ -\x6c\x05\x70\x43\xcc\x3e\xe5\xdc\x5d\x7a\x32\xde\xb4\x9d\x54\x95\ -\xc6\x8b\x7a\xb5\x10\xee\x15\xcb\x7b\x5e\x36\x28\xfc\xef\x4a\xdf\ -\x3b\xa5\x55\x7e\x33\x1b\xa0\x03\x95\x36\x16\x3a\x1b\x25\xc1\x5d\ -\xad\x9e\xfc\x5d\x5b\x05\x94\xfd\xab\xe6\xbd\xd0\x51\x4e\xe4\xc1\ -\x04\x00\xe3\x46\xe9\x0d\x34\x98\xfc\xef\x1e\xb1\xab\xf4\x8c\x09\ -\x00\xfb\x12\x99\xe6\xa0\x5a\xe8\xb8\x54\x18\x0c\x4c\x01\xc3\x24\ -\x5c\x1e\x85\xed\xd0\xf6\xf9\xf7\xa2\x10\x9a\x3f\x68\x90\xb1\x85\ -\xcb\x45\x8b\xce\xed\x07\xe7\xf5\x85\x1c\xf9\x16\x7b\xe3\xed\xd9\ -\xbd\xa2\xe7\x8c\x79\xc9\x97\x2e\x8e\x27\xcf\x75\x44\xeb\x7e\xdf\ -\x1e\x81\x60\xb2\xbb\x28\x7f\xfe\xb1\x1d\xa3\x57\xcc\x24\x98\x80\ -\x5e\xb6\x40\x2c\x5a\x98\xf0\x9f\xab\x57\x68\xd9\xad\xc2\x85\xd2\ -\xad\xc2\x86\x5f\xc2\xa4\xdb\x8b\xdb\x4c\x53\xcc\x07\x7a\x8d\x0e\ -\x26\x6f\x5d\xd6\xf3\xe2\x9e\x84\xfb\x69\xc7\x51\x6b\xb4\x15\xa2\ -\x9c\x3e\x1a\x0e\x6c\x2c\x74\xc8\x04\xd4\x47\xd9\x19\xbc\xab\xf5\ -\x63\x43\xfb\x6f\x6f\x9b\x80\x02\xcf\x9a\x38\x31\xf1\x61\xe9\xa8\ -\xb5\xa5\xaa\xb6\xa5\x86\x60\x82\x0e\x4a\x85\xce\xca\x03\x02\x95\ -\x29\x80\x50\xd1\x65\xe8\x7a\xd8\xb6\xe9\x7b\x41\x08\x2f\x1f\x54\ -\xb8\x2a\xd7\xba\xd3\x5d\x52\x8e\x64\x7c\xf9\x08\x7d\xe3\xed\x59\ -\xbd\xa2\xfb\x2f\x07\x93\xa7\xb6\x5b\x30\xf9\xf8\xd0\xe8\xd5\x8f\ -\x4f\xdd\xee\x4e\xe7\x1d\xea\x3b\x98\x47\xbf\x0b\xb4\x22\xd9\xb5\ -\xac\xcb\x49\xb6\xec\xe8\x04\xae\x51\x8d\x79\xee\x03\x5f\xdf\x2b\ -\xf8\x69\x45\xdc\x6e\x04\xeb\x0e\xe8\x03\xe8\x5f\x07\x45\xef\xb9\ -\x6b\x52\x6f\x1e\xec\x76\xce\x77\x1d\xb5\x5a\x2f\xd4\x51\xc1\x84\ -\x77\x96\x02\x9f\x45\xd9\x99\xe0\x4d\x20\x79\x75\xe7\x4f\x77\x8c\ -\x6e\xdc\x5a\x14\xaa\x2d\x02\x0a\xfc\x08\x8d\xf2\x33\xef\xe9\x84\ -\xa7\xe0\x6b\x0c\x26\x98\xa2\x0e\x70\x5a\x2d\x1a\x10\x78\xc0\xa8\ -\x76\xf1\x9d\xb6\x43\xbf\x87\x0a\xc0\x14\xa0\xf9\x83\x0e\xb8\x6b\ -\xd0\x71\xf3\x2f\xd7\x3b\xb0\xb7\x54\xd5\x54\x3c\xdf\x1b\x19\x1a\ -\xcb\x94\xef\xee\x7a\x23\x04\x93\x05\xc9\x53\x97\xc4\x93\xe7\xb4\ -\x63\x30\xd1\x55\x3c\x98\x20\x90\xa7\xbe\x17\xe4\xff\x6d\x91\x58\ -\xb8\x2c\xe9\x3d\x4f\x4f\x28\xf3\x75\xb9\x25\x14\x94\xb7\xe3\x81\ -\xf1\xf4\xad\xfb\xa6\xb6\x8b\xfb\x3b\xd6\x51\x4d\xeb\x03\xe8\xfd\ -\x8b\x45\xef\xc9\xf3\x52\xaf\xe9\x71\xe2\x1f\xd4\x9f\xf4\xe9\x0f\ -\x3b\x2e\x98\x54\xda\xe0\xa8\x83\x09\x5c\x67\xfb\xc1\xce\xcc\x45\ -\xbf\xd2\x47\xb3\x50\xd7\xf2\x80\x02\xe7\xb5\x55\x31\xf5\xb7\x72\ -\xea\x0d\xaa\x91\xf5\x17\x0c\x1b\x35\x21\xc1\x04\xbe\x0a\xbf\x8e\ -\xa6\xa8\xb2\xb3\x12\x85\x05\x92\x30\xe1\xf2\x54\xa6\x76\xe9\xf7\ -\x82\x10\x9a\x3f\x28\x91\x13\x83\xab\x7c\x2f\xf5\x92\x52\xb1\xa9\ -\x94\x4e\x77\xed\xfc\xc2\xc8\xd4\x6d\xac\x67\xeb\x60\x72\xa6\x0e\ -\x26\x4b\xdd\xe4\xdb\x3b\x28\x98\xa0\x4f\xa1\x9f\x41\x5a\xf6\xc7\ -\xd5\x4e\xd7\xf2\x1e\x95\x3c\x49\xe7\x5b\x82\xde\xa0\xdc\xa4\x70\ -\xb6\xb1\xa3\x13\x04\xb7\x9d\x0a\xc7\x4c\x59\xff\xb9\x4c\x2c\x3d\ -\xb5\x2f\xf9\xde\x5e\x27\xfe\xef\x7a\x89\x48\x6f\x08\x6a\x16\xcd\ -\x8a\x7e\x34\x98\xd0\x9f\xe1\x68\x69\x40\x81\x3b\xba\x92\xf1\xee\ -\xd7\x49\x37\x1e\xf9\xb3\x26\x51\x77\xac\x42\x30\x41\x30\x5f\xc9\ -\x69\xcb\x03\x90\x88\x06\x0e\xd3\x91\x09\x2e\x03\x29\x6f\x8f\x7e\ -\x17\x15\xc2\xcb\x07\x25\x77\x0b\xd1\x2d\xbc\xdc\x91\x8e\xf0\x5b\ -\xf2\xba\x95\xd2\x3b\xa5\x1e\xd9\xa3\xf3\x10\x4c\xce\x58\x90\x7c\ -\x89\x0e\x26\x6f\x6b\x87\x60\x82\x3f\xd7\x5b\x43\x30\x01\xd0\xe7\ -\xa8\x0f\xfa\xef\xec\x17\x7d\x4b\x92\xfe\x91\x31\x47\x2c\xd3\xe5\ -\x96\x50\x10\xde\x8e\xad\x85\xcc\xef\xd8\xd1\x09\xe6\xa9\xb0\x0f\ -\xb4\xec\x7f\x66\xa9\x58\x7a\x54\x77\xe2\xdc\x2e\xf8\x9d\x99\x0e\ -\x0d\x26\xcd\x22\x98\x0b\x95\x7f\xdf\xc6\x9d\x99\x9f\xf0\xdf\x74\ -\x6a\x59\x40\x81\x3b\xba\x64\xb1\xef\x64\xbf\x18\x7b\x5f\x23\x76\ -\x20\x78\x49\x54\x44\x18\x4c\x30\xe5\x41\x83\x0b\x96\x31\x09\xdb\ -\xa2\xdf\x83\x02\x30\x05\x68\xfe\xa0\x26\xb3\x7a\xc1\x4a\x19\x4b\ -\x9d\xa2\x0d\xd2\xac\x3f\xe0\xa6\x81\xa7\xbb\x9e\x2d\x84\x7b\x4a\ -\x5f\xea\x59\x4b\xdc\xc4\x9b\xda\x22\x98\x08\x6f\xf3\xc3\x4f\xff\ -\x5c\x2f\xf8\xd5\x8c\x83\x89\x96\x77\x74\x4f\x37\xbc\x66\xe5\xd4\ -\x56\xd9\x57\x7f\x6f\x6e\xc2\x77\x1f\xfd\xcf\x21\x61\xfa\x11\x2d\ -\xd8\x66\xae\x69\x7d\xf8\xc2\x92\xbe\xd5\xcf\xe9\x1a\x7c\x7f\x3b\ -\xbd\xcd\xb9\x5d\xc1\xb9\xf0\xb6\xec\xd8\xf7\xe0\x85\xb7\x30\x29\ -\x41\xf5\x54\xd2\xc2\x80\x92\xde\xb0\xe0\x58\x11\x77\x1a\x72\x11\ -\x1e\x7a\x17\xa5\x67\xe7\x95\xff\xa0\xe1\x9a\x09\x82\xc6\x34\x3a\ -\x6b\x49\x18\x10\x68\xc0\xa0\x01\x24\xac\x1e\xd7\xa3\x6d\xe1\xf7\ -\x50\x01\x98\x02\x34\x7f\xd0\x53\x8c\x15\x56\x09\x59\x6c\xc9\xe9\ -\x2e\xc0\xf3\x45\xfa\xbe\x11\xb1\xe3\x1d\x0b\x53\xcf\x59\x9b\x8c\ -\x9f\xeb\x8a\xd6\xbd\x92\x04\x09\x82\x49\x6e\xfc\xfb\x7a\x12\xc6\ -\x97\x3c\x86\x05\x13\x10\xfa\x1d\xf5\xc3\xc0\x37\xdf\xa5\x8f\x4e\ -\x96\xc5\xbd\x67\xc5\xe1\x05\x89\x2d\x02\x8f\x4e\xc8\x4f\x43\x00\ -\x98\x0f\x53\xd0\x8f\xaf\x2d\xef\x3d\xfc\xa8\x5e\xf7\x43\xc9\x0e\ -\x7f\xc6\xc4\x34\xdf\x45\x1d\xdd\xf9\x1f\xd6\xa6\x17\xde\xb6\xc4\ -\x80\x70\x11\xde\xf7\xc6\xde\x21\x7d\xff\x44\xbd\x35\x91\xf4\x1b\ -\x7a\x85\x0d\x45\x69\xc8\xe0\xed\xaa\x85\xec\x65\x2c\x98\xa0\x11\ -\x69\x0a\x0a\x1d\x78\x4c\xa6\xe0\x81\xe2\xcb\x62\x3b\xbc\x5d\xfc\ -\x4e\x14\x42\xf3\x07\x3d\xf0\xaa\x7a\xc7\xcb\x1f\xaf\x47\xc3\x92\ -\x52\x55\x53\xf1\x95\x1c\xc9\x0a\xf7\x91\x17\x2e\x4c\x1d\xb9\xbe\ -\x37\xfe\xce\x56\x9e\x16\x42\x68\x30\xd9\x35\xe5\x2f\x74\xc8\xa0\ -\xff\xa0\x5f\xa1\xa8\xef\xa1\x5f\x7a\x87\x75\xf7\x2c\xee\x89\xa5\ -\x8e\xd3\x0b\x44\x3d\x7f\xd5\x84\xfe\xde\x6a\x47\x27\xc8\xb4\x7e\ -\xbc\x40\xff\x31\xfd\xed\x65\xdd\xc7\x6d\x48\xba\x1f\x8a\xf9\xde\ -\x49\x7a\xeb\x5b\xb2\xfd\x51\x41\x3b\x0a\x40\x67\x78\x5d\xbd\x14\ -\x94\xbf\xf9\xc1\xd1\x03\xe6\x42\x24\xf8\xba\xa6\x07\x14\xb8\x6e\ -\x22\x45\xd7\x99\x51\x5f\x84\x87\x8e\x44\x6d\x40\x08\x26\xf0\x3a\ -\x95\xcf\x6a\x67\x8d\x28\x98\x98\x02\x08\x8a\x7e\x4e\xd7\xa1\xed\ -\xe1\x77\x51\x21\xbc\x6c\xd1\xe4\xbd\x85\xab\x84\xdb\x9a\x8b\xf1\ -\x80\x27\x8a\xe9\x98\x9c\xec\xd9\xd0\x1b\x7f\xc7\x5c\x0b\x26\x6f\ -\x10\x22\x7e\xa8\xf4\x0e\x4b\x28\xff\xb9\xba\xdc\x12\xaa\x1c\x9d\ -\x00\x98\x07\x05\x63\xe8\x44\x3d\x5d\x9c\xbb\xa4\xeb\xc4\xd5\xc9\ -\xd8\xc7\xe2\xd2\x3f\x26\xca\x79\xa8\x5d\x80\x8e\x46\x49\xf0\x1b\ -\x38\x85\xec\x25\x9f\x1f\x11\x9b\x2a\xcc\x85\xcd\x0d\x28\x70\xdd\ -\xc4\x91\x7d\xa7\x2a\x15\xfb\x77\xbd\x0b\xdb\xfa\xf0\x12\x83\x49\ -\x85\xd7\xa9\x00\x50\x06\x05\x8e\x5a\x4a\x83\xc1\x66\x10\x0f\x1a\ -\x34\x78\xd0\x3c\x8a\xb6\x89\xdf\x83\x02\x30\x05\x68\xde\x52\x02\ -\x2e\xc6\xc7\x0b\xe3\xc7\x09\xcf\x6b\xd9\xdd\x5d\x8e\x13\x1b\xec\ -\x8f\x25\x5f\xdc\xa1\xc1\x04\xfd\xd9\xe4\xd3\xc5\x93\x97\xf7\x1c\ -\xda\xdf\x95\x7c\x79\xab\x26\x64\xbd\x81\x95\x8e\x4e\x00\xda\x97\ -\x40\x70\x64\xf2\x8e\xc5\x5d\xcf\x3b\xb4\x2b\xfe\xfe\x98\xa3\x56\ -\xe8\xba\x8e\x0d\x26\xd0\x21\x13\x50\x1f\x65\xa7\xe8\x1f\xd6\xe4\ -\x3d\x74\xa6\xb4\xb9\xa7\xbc\x82\xeb\x26\xc2\xf9\x37\xfd\xd5\x4b\ -\x4b\x55\x91\x81\xbd\x8a\x82\xa2\x2f\x77\x3d\x35\x1e\xbb\xa6\xc6\ -\x77\x73\xa1\xe8\xc0\xe3\x03\x90\x07\x0e\x2e\xba\x2c\xb6\x83\xe2\ -\xdf\x03\x60\x0a\xd0\xbc\x85\x00\x17\xe3\x55\x4c\x1f\x9d\xb4\x68\ -\xc2\x93\x52\xb8\xae\x52\x03\xad\x7c\x8d\x3b\x52\x47\x30\xa1\x7e\ -\x89\xf9\xe2\x1b\xf5\x1f\x87\xcb\x85\x77\x78\x5c\xf9\xc7\xeb\x72\ -\x4b\x28\x2a\x67\xf7\xde\xbc\xf3\xa7\x1a\xae\x9d\x04\xe3\xe8\xad\ -\xfd\xa2\xfb\xdd\x87\xa6\x4e\x3b\xb4\x2b\xf6\x3e\x08\x26\xfa\x83\ -\x8e\x0d\x26\x40\xd8\xc6\x47\xd9\xa9\x1a\xe6\x42\xa0\x6c\xe7\xa6\ -\x05\x14\xbc\x6e\x22\x7c\x3f\xb2\x27\x69\xc3\x7a\x57\x0f\xf0\x1a\ -\x81\x27\x7d\x79\xd5\xc7\x76\xa5\x37\xd6\x18\x4c\x70\xe0\x51\xe1\ -\xc0\x0b\x06\x9f\x41\x58\x4f\x97\x03\xd1\x36\xf8\xf7\x80\x00\x4c\ -\x01\x9a\xb7\x30\x3c\x27\xbf\x5e\xc8\xe2\x19\xa5\xe2\x41\x4b\x9d\ -\x47\x26\xa8\x69\xbe\xfa\xa2\xe5\xbd\x2b\xfb\x52\xc9\xbf\xd0\x2d\ -\xb5\x64\x52\x86\xa3\xbf\x9c\xf2\x9e\xb8\x62\x78\xf4\xae\x52\x15\ -\x87\xf6\x47\xbd\xa5\x5f\x74\x9d\x3e\x98\xfc\x8b\xa5\xf1\xf8\x3f\ -\xc7\x5c\x71\x88\xae\xec\xe8\x60\x02\x9d\x6a\x34\xb3\x98\x0b\x9b\ -\x73\xda\xa9\x11\xd7\x4d\x60\xeb\xb1\xa1\xa8\x3c\x03\x5e\xdd\xb0\ -\xaf\x20\x6e\x3a\x6f\x68\xf4\xea\x6d\x25\x03\x69\x30\x05\xd0\x70\ -\xa8\x8a\x83\x4e\x8b\x07\x10\x2a\xfe\x39\x6d\x87\x7f\x0f\x15\x42\ -\xf3\x16\x46\xab\x9f\x8c\x6f\x17\x1a\x11\x4c\xfe\x5a\x88\xd8\x72\ -\x51\x84\xa3\x93\x96\xbc\xc6\x06\x28\x0a\x67\xe7\x53\x79\xf7\x0f\ -\xd7\x89\xe0\x09\x6d\xec\x07\x42\xfb\x13\x1c\x99\xbc\x4a\x07\x93\ -\xc5\x6e\xe2\x5d\xba\xf3\x3d\xba\x32\xaa\x29\xa3\x25\x40\xa7\x1a\ -\xdd\x01\x7c\x3f\xd7\x4c\xe7\xc2\xa6\x04\x14\xe9\xcd\x3b\x56\x15\ -\xe3\xef\xd5\x56\x88\xec\xfb\xa2\x36\x68\xf0\xe4\x67\x41\xdd\x7a\ -\xe9\x70\xfa\xa7\x15\x7e\x1c\xeb\x00\x03\x12\x4d\x1b\x74\x5a\xa6\ -\xc0\xc1\xcb\x90\xa7\xeb\x42\x9e\x7f\x0f\x8a\xc2\xcb\x16\x4e\xbe\ -\xff\x08\xdf\x4f\x9c\x5d\x2a\x1d\x94\x34\x20\x98\x04\x7e\xfb\xfc\ -\x43\x7a\x57\xf5\x76\x25\x4f\xd3\xad\xb5\x64\x62\xa6\x47\x27\xb0\ -\x51\x04\xda\x97\x40\xff\xb6\x48\x2c\x7a\xed\xc2\xc4\x5b\x17\xb9\ -\x89\x77\xea\x8d\xed\xd1\x75\x1d\x0f\x37\x7a\x83\xe6\xc2\xdb\xaa\ -\xfc\xea\x2c\x15\xfa\x4a\xe3\xaf\xa1\x04\xbf\x09\xef\x3a\xef\x8c\ -\xea\x79\x13\xda\xab\xa8\x00\x07\x9d\x94\xde\x83\x7f\x98\xcc\x5c\ -\x81\xef\xa4\x81\xea\x52\x0a\x50\xe3\x81\xd0\x80\x28\x3a\xe8\x70\ -\xe0\xd1\x3c\x0d\x20\xf4\x33\x5c\x17\x52\xde\x2e\xfd\x3e\x84\x97\ -\x2d\x06\xf0\x56\x61\xa9\x44\x4b\x6e\x15\x6e\x07\x1a\x14\x4c\xbc\ -\xbf\xd1\x47\x27\x4b\x45\xf1\x88\x58\x84\xa7\xae\x67\x4a\xad\x47\ -\x27\xff\xb2\x50\x2c\x7e\x7e\x6f\xe2\x8d\x03\x2a\x79\xd6\x5c\x09\ -\x26\x26\x60\x47\x45\x05\xbe\x52\xe5\xd2\xe1\xcc\xa5\xb3\xf9\xc3\ -\xba\xa1\x01\x05\x4e\x75\xa9\xd8\xf8\xe9\x52\x15\xce\xd2\xdf\x1c\ -\x49\x20\xc5\x46\xa0\x27\x51\x81\x0f\x2e\x7e\x73\x8f\xd8\x05\x23\ -\x87\x41\x8d\x07\x9a\x66\x40\x2d\x0c\x08\xd3\x06\x5e\x29\xa5\xa2\ -\x9f\x51\xc1\xba\xd8\x2e\x7e\x07\x40\xf3\x00\xcd\x5b\x2a\x50\x2c\ -\x0e\x1e\xae\x64\xf2\xac\x52\xf1\xa0\x23\xe2\x60\x32\xcd\x7f\x4f\ -\x5a\xd1\xb7\xba\x27\x95\x3c\x5d\xb7\x18\xc9\x78\x9e\x29\xb5\x1e\ -\x9d\xbc\x4f\x07\x93\x17\xf4\x26\xde\xd0\x2e\x3f\x58\xd6\x28\xa0\ -\xb3\x51\xed\x08\xfe\x7e\xae\x52\x35\x7c\x05\x32\xcd\xc6\x5a\x07\ -\xf8\x4d\x43\x0d\xdd\x88\x53\x5d\x48\x54\x46\xac\xf1\xc1\x45\x80\ -\x1a\x12\x44\x0d\x89\x83\x0f\x85\x83\x70\xda\x60\x2c\xa5\x28\x5c\ -\x17\xdb\xe2\xed\x83\x10\x9a\xb7\x54\x00\x8e\x4e\x64\x31\xf7\xcc\ -\x56\xbd\xb7\xab\xd5\x34\x20\x98\x60\x5a\x7c\xbb\x3e\x3a\x59\xa6\ -\x0a\x47\xc4\xdb\xfc\xe8\xe4\x03\x0b\xc4\xb2\x53\xfa\x12\x6f\x1e\ -\x90\xc9\xb6\xf8\xc1\xb2\x46\x12\xd5\x3c\x08\x81\x3a\xec\xfd\x5c\ -\x25\xd0\x5f\x50\x26\xbf\x69\x5c\x40\x89\xfa\x54\x17\x12\xe5\x9f\ -\x45\x05\xe5\xec\xd8\x3e\x19\xff\x45\x0d\x0f\x2e\x82\xb1\x4c\x46\ -\xc4\x81\x87\xc2\x00\x82\xa2\xf5\x98\xa7\xeb\xd3\xb6\x51\x00\xa6\ -\x00\xcd\x5b\xaa\x00\x47\x27\x32\x9e\x88\xec\x88\xb8\x93\x68\x60\ -\x30\x09\xd2\xe7\x2f\xed\x5f\xd1\xd5\xc2\xdb\xb0\x6b\x39\x3a\xf9\ -\xdc\xd2\xee\xf5\x2f\x1e\x18\xf8\xa7\x5e\x91\x7c\xa5\xde\xca\x39\ -\x1d\x4c\xa2\x22\x08\x26\x15\xde\xcf\xa5\xc1\x7c\xd9\xce\x44\xd4\ -\x6f\x1a\x13\x50\xa2\x3e\xd5\x05\x5b\x8d\xc0\x96\x47\x01\xdc\xd1\ -\x35\x5a\x54\xb7\x7d\x62\x78\xf4\x96\x2a\xf7\x57\xc3\x57\x62\x4a\ -\x8d\x47\x85\x01\x04\x45\xeb\xe9\x72\xb8\x2e\x6d\x13\x52\x14\x80\ -\x29\x40\xf3\x96\x2a\xc0\x83\x8c\x70\x74\x22\xfc\xd6\x3c\xc8\xd8\ -\x4a\x0c\xc1\x84\x42\x7d\x0b\x85\xbe\x8c\xa2\x7e\x8a\x7e\x5b\xf6\ -\xe9\x73\x84\x88\x2f\x72\x0b\x47\xba\xae\xdf\xb2\x57\xd4\x97\xde\ -\xda\xfc\xe7\xb0\xa3\x93\xcf\xe8\x60\xf2\xac\xee\xf8\xdf\x26\x95\ -\x7f\x6c\xab\x82\x5e\x27\x92\x57\xfe\xa6\x7b\xd2\xd9\x8b\xc9\xfb\ -\xb9\x28\x33\xf1\x9d\xc6\x04\x94\xa8\x4f\x75\x51\xcf\x88\xc2\x4b\ -\xb4\x45\x72\x59\xe1\xdf\x09\x77\x74\x0d\x4f\x37\x18\x82\x86\x43\ -\x71\x03\xa2\xd0\x90\x5c\x38\x10\x31\x0f\x29\x2e\x0f\x29\xb6\x49\ -\xbf\x03\xc0\x14\xa0\x79\x4b\x0d\x8c\xae\x5f\x18\x1c\x9d\x1c\x6c\ -\x93\x49\x48\x30\x41\x1b\x50\xdf\x42\xa1\xff\xa2\xa8\x7f\x52\xbf\ -\x2d\xe7\x5f\xb4\xaa\x7f\x75\x77\x2a\xf9\x5a\x29\x54\xcb\x2e\x6e\ -\x17\x3c\x6f\xfb\xef\x86\x32\xb7\xc2\x06\x11\x82\x3e\xe9\x60\xb2\ -\xee\x39\xdd\xf1\x73\x75\x30\x79\xce\x5c\xdb\xff\x8d\xec\x0c\xfc\ -\x7c\xc1\x96\x42\xf6\xe7\x5f\xd9\x2b\xb6\xce\xe2\x2c\x0d\xec\x8a\ -\x69\x8a\x3c\xa0\x74\xc2\x5d\x5d\x79\xdf\xdf\xf4\xfb\xcc\xd8\x4f\ -\x6a\xb8\xa3\x8b\x1a\x2f\xcc\x88\x38\xf0\xb8\xf0\x33\x48\x71\x3d\ -\x48\xb1\x5d\xfa\x3d\x00\xa6\x00\xcd\x5b\x6a\x20\x38\x3a\xc9\x8f\ -\x3f\xf7\x60\x3b\x3a\x81\x1f\xc7\xda\x53\x74\x6f\x64\xa7\xb9\x22\ -\x0d\x26\xef\xd5\x47\x27\xf3\x0b\x85\xa3\x62\xbe\xf7\x7c\x5d\x6e\ -\x09\xf0\x5c\xc4\x3e\xe5\xdc\x7d\x89\x27\xf6\x97\xaa\xca\x7c\x7a\ -\x69\xd7\x9c\x0d\x26\x00\xee\x44\x80\xe6\xeb\x05\x6c\xfa\x94\xe7\ -\x6e\xfc\xf4\x90\xb8\xb3\xf4\x3b\x32\x80\x29\x45\x85\xf9\x0d\x2a\ -\xda\x23\x14\x78\x57\x97\x92\xb9\x63\xa4\x2c\x9e\xa1\xbf\x3d\x92\ -\x1d\x1b\xb5\x77\xe0\x45\x78\x72\x47\x17\x1a\x0e\xa0\xc6\xe3\xe2\ -\xc6\xa3\x83\x2e\x4c\xdc\xf8\xd8\x0e\x6d\x17\xc0\x14\xa0\x79\x4b\ -\x8d\xc0\xd1\x89\x8a\x27\xce\x9e\x8b\x13\x4a\x18\x4f\xff\xd2\x62\ -\xe6\xea\x59\x5e\x33\x41\xbf\x84\xd4\x18\x4c\x40\xcf\x3b\xb4\x7f\ -\x4d\x77\x57\xf2\x8c\x56\xda\x36\x5f\x3a\x3a\xa1\xaf\x4c\x87\xf7\ -\x38\x7d\x6d\x51\xea\x39\xc7\xa5\xe2\xef\x9b\xab\xc1\x84\x13\x55\ -\x07\xe1\x8e\xae\xe0\xb7\xe0\x87\x32\x1b\x43\xce\xd2\x00\x61\x7e\ -\x83\x02\x1f\x41\x05\x3e\x13\x69\x40\xd1\x83\xfa\x68\xe5\xc4\xde\ -\x29\x22\x7a\x3a\x19\x8d\xc7\x7b\x39\x5b\x20\x22\xc3\x5f\x73\xec\ -\x22\x3c\x42\xbf\xa6\x56\x23\xa2\x21\xb9\xf8\x32\xb0\x1e\xb6\x09\ -\x29\x0a\xc0\x14\xa0\x79\x4b\x8d\xc0\xd1\x89\x28\x4e\x3c\x4b\x9b\ -\xb7\x65\x4f\x6e\x37\x9b\x19\xfe\x6c\x2f\x08\xfd\x97\x0b\x7d\x18\ -\xd3\x69\xf9\x7f\x14\x22\x31\xdf\x2b\x1c\xed\xf8\xde\x0b\x75\xb9\ -\x25\x98\x8e\x4e\x9e\x23\x84\xfb\xb7\x0b\x53\xc7\x1e\xd6\x13\x7f\ -\x4f\xd2\x51\x6b\xe6\x5a\x30\x69\xe4\x44\x40\xef\xe8\xaa\xf1\x2c\ -\x0d\xcd\xa3\xcf\x50\x95\xe7\xbc\xc8\x02\x0a\xdc\xae\xe9\x7b\x63\ -\xaf\x14\xbe\x77\x6a\xa9\xaa\x6e\xa0\x07\x40\x14\x9e\x82\x11\xf9\ -\xf2\xa1\xcc\x0d\x86\x8b\xf0\x34\xad\xc5\x80\x20\x1c\x7c\x65\x63\ -\x1a\x84\xeb\x63\x7b\x54\x00\xa6\x00\xcd\x5b\x66\x00\x1c\x9d\x08\ -\x37\xfe\x96\xa8\xfe\x90\x69\x77\x58\x30\x01\xbf\x99\x4d\x30\x41\ -\x1f\x45\xff\xa5\xbe\x8c\xf9\xe2\x89\x2b\x07\xd6\x24\xbb\x92\x67\ -\xb6\x72\xc2\xe6\x47\x27\x10\x4c\xfe\x6e\x61\xea\x39\xa5\xdf\x97\ -\x59\xae\x3b\x38\xa7\x82\x09\x40\x3b\x14\x75\xe7\xe0\xb9\xbb\x2a\ -\x77\x74\x71\x99\xfc\x86\x2b\xf0\x9d\xc8\x02\x8a\x97\x9b\x77\xb4\ -\xa3\x12\x6f\x6f\xa5\xe3\x85\x01\x11\xb9\xc2\x93\xf0\x34\xe5\x06\ -\xa4\xf9\x03\x8c\xc7\xca\xb4\x0e\xd7\xc1\x36\xb0\x1d\xcc\x03\x98\ -\x02\x34\x6f\x99\x01\x07\xdb\xb5\x13\x08\x26\x4f\x15\xe5\x2f\x3e\ -\x36\x34\xfa\xab\x52\x30\xa1\x50\xdf\x42\x51\x5f\x44\x51\xbf\xe5\ -\xfe\x8b\xf9\xe2\xbf\xe8\xa3\x93\x79\x5e\xfe\x98\x76\x3a\x3a\x29\ -\x05\x93\x63\x75\x30\x79\x17\x04\x93\x60\xa1\x39\x0e\xdf\xc9\xf5\ -\x40\x9f\xbb\x0b\xb9\xa3\xab\x9a\xef\x80\xa8\xff\x50\x45\x13\x50\ -\xe0\x4d\xc2\x8e\x3b\xf1\xd7\x51\x5c\x88\x8f\xd2\x78\x48\x51\x78\ -\xdb\x77\xe4\xb3\xd7\x85\x5c\x37\x01\xc2\x0c\x88\x86\x03\xf1\x72\ -\xd9\x88\x4c\xb8\x1c\xb6\x81\x6d\x53\x68\x99\x7f\x66\x99\x01\x07\ -\xd3\xb5\x13\x38\xca\x1e\x0b\xce\x7b\x8f\x6e\x24\xaf\xc5\x40\xd0\ -\x8f\xd0\xdf\x40\xe8\x83\x54\xe8\xa7\xe8\xbb\xd4\x8f\x31\x1f\x94\ -\x8f\x5b\x35\xb0\x2e\xde\x95\x7c\x75\x2b\x6d\x4b\x8f\x4e\x74\x30\ -\x71\x4a\xc1\xa4\x2d\x7e\xf9\xb2\x11\xf0\xc9\x80\x97\xeb\x21\xe4\ -\x94\x3f\x7e\x05\xfd\x2a\x93\xef\xa0\xdf\x54\x52\xfd\x17\xe5\xe1\ -\x42\xbc\xf4\x7a\x8f\x53\x32\x9a\x87\xc9\xa2\xf6\xdc\xa9\xe7\x4d\ -\x62\x77\x7e\x6a\x48\xdc\x15\x72\xdd\x24\x4c\xdc\x98\x74\xb0\x05\ -\x03\xae\x24\x9a\x47\xe1\x7a\xa6\x76\x41\x08\xcd\x5b\x66\xc8\xc1\ -\x74\x74\x52\x7e\xc7\xd2\xce\xcc\x85\x57\x3f\x7d\x94\x8d\xa0\x1f\ -\x51\x1f\xa3\xfe\x47\xfd\x98\x8a\xfa\x32\xe6\x83\xf2\xbf\xc3\xd1\ -\x49\x31\x7f\x8c\xeb\x79\x27\xeb\x72\x4b\xa0\x47\x27\xcf\x7e\xfa\ -\xc8\x64\xce\x06\x13\x80\xcf\x7f\x51\xcd\x87\x81\xff\x14\xd4\x6d\ -\x1f\x1f\xca\xfc\x6a\x06\xa7\xfc\xb1\x6c\xf2\x1f\xea\x2f\xa8\xfa\ -\x03\x4a\x66\xf5\x82\x75\x3a\x98\xbc\x56\x7f\x75\x5f\xa9\x2a\x12\ -\xb0\x87\xf5\x00\xa7\xba\xc6\x7d\xff\xfe\x90\xe7\x4d\x68\x0a\xa2\ -\x86\x33\x19\xb0\x9a\xf8\xba\xd8\x2e\x17\x42\xf3\x96\x59\xb0\x6f\ -\xed\xe0\xb1\x2a\x16\x3c\xef\xd4\xb2\xbf\xa0\x9b\x01\x0d\x26\x57\ -\x3e\xfd\x5a\x0c\x0e\xf5\x31\xf4\x3f\x48\xd1\x37\xa9\xaf\xe2\x04\ -\xc0\xcb\xe5\xba\x13\x56\x0e\x1c\x1e\x4f\x26\xde\xdc\x4a\xdb\xe2\ -\xd1\xc9\x61\x3a\x98\xbc\xe3\xe9\x6b\x26\x73\x36\x98\x34\x6a\x42\ -\x08\xe6\x41\xe5\xdf\x5b\xe1\x85\x8f\x00\xfa\x0e\xfa\x0d\x15\xfa\ -\x49\x55\xd5\x15\x50\xf0\x36\xe1\xa8\x7e\xc4\x88\x7a\x6e\x14\x5e\ -\x0c\x3f\xaa\xff\xe7\xcc\xd8\x95\x21\x77\x32\x00\xd4\x88\x28\x6a\ -\x40\x93\x31\xf9\x60\xa4\x82\xe5\x4d\x6d\xa2\x10\x9a\xb7\xcc\x82\ -\xe0\x8d\xc2\x6a\xe2\x14\x29\xfc\xa3\x4b\x55\x73\x92\x1a\x82\x09\ -\xf7\x31\x14\x4e\x06\xdc\x87\xa9\xef\xa2\x2f\x4f\xf3\xe9\xaf\x2e\ -\x16\xf3\x7a\xdc\xdc\x8b\x9d\x16\xfe\x56\x3c\x1e\x9d\xdc\xed\x89\ -\xb1\x83\xe1\xc8\x04\x76\x58\xa3\x22\x37\x5c\x84\xbf\x3d\x3b\x56\ -\xcb\x0b\x1f\xa9\xcf\x50\xa1\xbf\x98\x7c\x06\x05\x9f\xd5\x77\x84\ -\xf2\xf4\xd1\x49\xfd\x77\xd7\x60\x8f\xa2\xc2\x57\x72\x64\x9f\xef\ -\xde\x01\x3f\xaa\x0f\x3d\xd5\xd0\xe6\xf1\xeb\x50\xd5\x8c\x08\xa2\ -\x86\xc3\x32\xa4\xa6\x75\x79\xfb\x20\x84\xe6\x2d\xb3\x04\xdf\x28\ -\xac\x8d\x39\x67\x8f\x4e\xe8\xcd\x24\x3a\x98\x4c\x82\xb3\x31\xb8\ -\x5f\x81\xa8\x1f\xa2\xaf\xa2\xd0\x67\xd1\x97\x51\xd3\x96\x5b\x99\ -\xec\x5f\x1f\x87\x71\xdd\xe2\xa3\x93\x3f\x0d\x65\xee\x7c\xf7\xa2\ -\xd4\x89\x1b\x7a\xe3\xef\x98\xcb\xc1\x04\xa0\x86\x8e\x72\x82\xa0\ -\x17\xe1\x61\xe7\x6a\x4c\x3e\x63\x92\xc9\x7f\xaa\x69\xf6\x01\x25\ -\xca\xa3\x13\xd8\xfa\x28\x3d\x57\xb7\x07\xaf\x56\xb9\xf7\xc7\x43\ -\xe9\xab\xc9\x8f\xea\x23\x68\x30\x10\x1d\x7c\x54\x81\x71\x4a\xa9\ -\x71\xd0\x19\x84\xeb\xd2\xf6\x51\x08\xcd\x5b\x66\x09\x1e\x9d\xcc\ -\xe5\x37\x0a\x07\xcf\x0a\x68\x1f\xae\xf2\xb3\x0a\x98\xa2\xdf\xa1\ -\x0f\x82\xb8\x7f\xa2\x68\x20\x41\xbf\x2e\xfb\xf7\xd7\x96\x88\xc1\ -\x54\x2c\xff\x02\x47\xa8\x23\x75\xb9\x25\xc0\xef\x98\xef\xcb\xb9\ -\x7f\x58\xbf\x28\xb5\x61\x55\x5f\xe2\x1f\xe7\x7a\x30\xe1\x93\x42\ -\x54\x73\x21\xfe\x1e\x7c\x95\xe7\xee\x20\x35\xf9\x0e\xf7\x21\xee\ -\x37\x28\xba\xcc\xec\x03\x4a\x94\x47\x27\x51\xff\x19\x54\xf0\xfd\ -\x2d\x0f\x8d\x8e\x5d\x5f\xe3\x2d\xc2\x28\xd3\x20\xe4\x06\xa3\xa2\ -\x3b\x00\x64\x6a\x13\x84\xd0\xbc\xa5\x0e\x0e\x86\xa3\x13\xfc\x8d\ -\x1e\xf2\xb3\x0a\x26\x5f\x82\x14\x7d\x8f\xfa\x22\xf5\x4f\xf4\xd7\ -\xb0\x89\x60\x9a\x8f\xaf\x4c\x0e\xe8\xa3\x93\xe4\x6b\x5b\x65\x5b\ -\x08\xa4\x39\xe5\x3f\x31\x59\xcc\x65\x57\xa5\xe2\x7f\xa3\x03\x5b\ -\x77\xe9\xa3\xb6\x40\xdb\x25\xe7\x39\x72\x44\xa7\x93\xa5\xaa\xba\ -\x80\x1d\xd7\x08\x43\xc3\xcd\x48\xfb\x3d\x71\x4b\xc8\xef\xc1\xd3\ -\x14\x44\x7d\x87\xfa\x0d\xa6\xb5\x28\x58\x6f\x56\x01\x25\xea\x6b\ -\x27\x08\xf6\xb2\x1e\xf0\x54\xd7\x17\xcd\xa7\xba\x00\x34\x22\x8a\ -\x1a\x11\x0d\x08\xe9\xb4\x81\x56\x41\xb0\x2c\xb6\x43\xdb\xa5\xf0\ -\xb2\x65\x96\xc0\x6f\xc5\xbb\xee\xf8\x1b\xe7\xf2\xd1\x89\xe1\x37\ -\x7a\xa8\xff\x60\x1e\xfd\x0c\x84\xbe\x0b\x42\x9f\x84\x14\x7d\x18\ -\x83\x08\xf5\x69\x5e\xf6\xbe\xb3\x4c\xcc\xef\x8a\xe5\x5e\x28\x85\ -\xff\x4c\x5d\x6e\x09\x7a\xfc\x3e\x25\xfc\x58\x6e\x65\x6f\xe2\x2d\ -\xed\x76\x64\xa2\x7c\x99\xcd\x7b\xce\xa3\x05\x5f\x0e\xe9\x20\x90\ -\x2a\x55\xd7\x45\x23\x82\x89\x76\x88\xf2\xcb\x6f\x43\x7e\x0f\x1e\ -\x40\xbf\x81\x14\xc5\xfd\x88\xcb\xe4\x47\x20\x5c\x7e\x76\x3f\x01\ -\x1c\xe5\xd1\x09\xa5\x5e\xe3\x06\xa7\x09\x7c\x7f\xd3\x6f\x87\xd2\ -\x1b\xab\x9c\xea\xa2\xc6\xa3\x79\x34\x0e\x35\x58\x98\x01\xa9\x78\ -\xdb\x00\x4f\x2d\x51\x50\xfa\xad\x78\x6d\xd4\x96\xfc\x05\xdd\x68\ -\x20\x98\x6c\xca\x8d\x5f\x38\x8b\xd3\x14\x20\xf4\x4d\xea\xab\xdc\ -\x77\x4d\xfe\x0c\xf2\x97\xa6\xfa\x9e\xe5\xc8\xf8\xbb\x5a\x69\x5b\ -\xc7\x51\x83\xa9\x84\xff\xac\x76\x0b\x26\x70\x73\x44\xd6\xf3\xef\ -\xcd\x7a\x13\x0f\xa7\x22\xfa\x63\x06\x77\x26\x40\xf3\xf5\x10\xcc\ -\x81\xca\xbf\xbf\xc6\x97\xdf\x82\x4c\x3e\x84\x42\x5f\x09\xf3\x19\ -\x14\xae\x3b\xbb\x80\xe2\x39\xf9\xf5\xed\x78\x74\x02\x0f\x30\x0e\ -\x15\xc7\x6e\x20\xef\xfc\xc1\x66\x69\xca\x45\x0d\x09\x69\x25\xc3\ -\x51\x05\x06\x24\xa2\x60\x99\xd7\x5b\xea\x20\x38\x3a\x91\xb9\x57\ -\xce\xd5\xdf\x8a\x87\x57\x89\x3f\x91\x1b\xff\xd1\xe7\x86\xc4\x7d\ -\xb3\x3c\x4d\x01\x42\xff\xa4\x7e\x4c\x27\x05\xac\xa7\x9f\xfb\x97\ -\xad\x11\x2b\x92\x6e\xfe\xb4\x56\xdb\x16\xfe\xf2\x77\x95\x1a\x2c\ -\x15\xdb\x02\xb8\xe3\x6c\xb7\x2f\x7e\x3a\x52\x28\xdc\x35\x90\x48\ -\xbe\x54\x57\xd5\x1d\x70\x61\x07\xd2\x46\xa2\x8a\xe0\x05\xe9\x6d\ -\x79\x3c\x9f\xbd\x72\x86\x2f\xbf\x0d\xf3\xa1\x6a\xa2\xeb\x04\x6d\ -\xcd\x38\xa0\xc0\xa0\x76\xdc\xfc\xcb\xa3\xbe\x76\x52\xaf\x41\xe1\ -\x2f\x88\xb1\x82\x7b\x1f\x3c\xc0\x48\xdf\x48\x4a\x08\x33\x1e\x08\ -\x8d\xc3\x0d\x66\x12\x5f\x17\xdb\xa5\xb2\x44\x0c\x9c\x66\x75\x27\ -\x7a\x4f\x54\x7e\xe2\x9c\x52\xd5\x9c\x02\x26\x2d\x7c\x95\x78\x95\ -\x1f\x7c\x03\x51\xbf\x43\x3f\xa4\x3e\x4a\x83\x06\x17\x5d\x0e\x14\ -\xac\xdf\x23\xfb\x36\x48\x95\x78\xbd\xce\x5b\x08\xb0\x5f\x9e\xf4\ -\xe5\x2f\x36\x67\x0b\x77\x2d\x4a\xa6\x5e\xe0\x0a\x11\x49\xb0\x8b\ -\x2a\x80\x50\x42\x7e\x81\x16\x41\x5f\xe2\x7e\x63\xf2\x1f\xaa\x4a\ -\xbe\x03\xc2\xf5\x83\x76\x67\x1c\x50\x9c\xec\xc0\x7a\x55\x48\x46\ -\x72\x67\x17\xf6\x30\x0a\x0a\xc2\xdb\xf2\xc0\x44\xe6\x06\xf2\x00\ -\x23\x82\x5f\xc5\x45\x0d\x59\xc9\xa0\x7c\x39\x94\xa9\x4d\x10\x42\ -\xf3\x96\x3a\x69\xd4\x03\xb4\xed\x00\x4c\x5a\xbb\x3c\x79\xc5\x79\ -\x43\x99\xab\x6b\xfc\xc1\x37\x10\xf5\x45\xee\xb3\xa0\x5a\x27\x02\ -\xff\x8a\x95\x62\x4d\x4a\xe4\x5e\x37\x57\x8f\xfc\x66\x0b\x06\x93\ -\x9b\x46\x46\x6f\xd9\xd0\xe5\x9d\xd0\xe5\x44\xf3\x36\x6b\xd8\x79\ -\x51\x03\xd7\x8e\x47\x3c\xf5\x9b\x90\x5f\xa0\xa5\x29\x88\xfa\x0e\ -\x15\xf5\x8f\x9a\x7c\xa7\x24\x6c\x77\x66\xbf\xa8\x08\xb7\x6b\x0a\ -\x27\xf7\x7c\x09\xaf\x8b\xae\x03\xf8\xe6\x28\x23\x34\xdc\x1e\xb7\ -\x7b\xd2\xbd\x11\x7e\x75\xac\x54\x15\x74\x8e\xa5\x54\x68\x04\x34\ -\x08\x1a\x2a\xcc\x80\x20\x5c\x96\xae\x4b\xdb\xa4\xf0\xb2\xa5\x0e\ -\xe0\x15\x2b\xca\x9f\x78\x91\x50\x85\xb3\x4a\x55\x73\x06\xb8\x1b\ -\x67\x5f\x41\xdc\x74\xde\x8e\xd1\xab\x43\x9e\x62\xa6\x3e\x06\xa2\ -\x7e\x48\xfd\x12\xfd\xd4\x34\x11\x84\x4d\x0e\xfe\x27\x84\x70\x53\ -\xb2\xe7\xd9\x42\x26\xdf\xa0\xcb\x96\x12\x18\x4c\x3e\xbe\x7d\xf4\ -\xea\xa3\x93\xa9\x95\x83\xb1\xe4\xcb\xf5\xa4\x55\xf7\xb4\x05\x3b\ -\x10\x1b\x81\x7c\x14\x94\x5e\xab\x72\x3b\x3c\x26\x51\xe5\x8d\x20\ -\xe0\x27\x90\xa2\xa8\x0f\xa1\x4f\x84\xf9\x0a\x17\x6f\x2b\xd0\x8c\ -\x02\x4a\xde\x5b\xb8\x4a\xbb\xdf\x4b\xf4\x9a\x75\x19\x36\xca\x60\ -\x12\x3c\xfc\x25\xfc\x47\x7f\xb6\x2b\x7d\x2b\xf9\xd5\x31\x0a\x76\ -\x16\x0c\x80\x82\xb2\xc9\x48\xd5\x44\xd7\xe7\x60\x9d\xe9\x33\x4b\ -\x1d\xa4\x37\x2c\x38\xda\x8f\xc7\xcf\xd1\x8e\x33\xab\x6b\x7e\xed\ -\x4a\x69\x22\xb8\x15\xee\xc6\x99\x45\x30\x41\x51\xff\xa4\x13\x01\ -\x4e\x0c\x61\x93\x43\xb0\xfe\xf1\x6b\x97\xac\x89\x39\xc9\x33\x75\ -\xeb\x73\xee\xc8\x6f\xb6\x78\xbe\xdc\xb9\x6b\x42\xfc\x08\x82\xc9\ -\x5f\xf7\x77\x2f\x5f\xd7\x9d\x3a\x2d\xee\x88\xa5\xa5\x8f\xeb\x82\ -\xce\x7d\x51\xcc\x83\xc1\xfc\x17\xfe\x26\x75\x64\x26\x3e\x54\x4d\ -\x7c\x5d\xda\x76\xed\x01\x05\xfe\x4a\x8c\x17\xc6\x8f\x13\x5e\x7b\ -\xbd\x88\x0f\x2e\xc4\x0f\x17\xc6\x6e\xfe\x95\x30\x3e\x73\x12\x26\ -\x6e\x14\x93\xe1\x50\x7c\x59\x53\x7b\x20\x4b\x03\x80\xa3\x62\x55\ -\xcc\xbe\x5c\xfa\xfe\xf3\x4a\x55\x73\x02\x98\x08\xe0\xfd\x4a\x3f\ -\xd8\x99\xb9\x28\xa2\xbb\x71\x68\x9e\x07\x13\xfa\x39\x28\x68\xe3\ -\x5b\xfa\xe8\x24\xee\x8f\x1d\x25\x9d\xe2\xab\x74\xd9\xa2\x81\xbb\ -\xec\xfe\x5c\x48\xff\xef\x47\x77\xa6\x37\x3e\xc3\x13\xf1\x0d\x09\ -\xef\xa8\x1e\xc7\x7b\x51\xe9\xe3\xba\xc0\x9d\x1b\xe5\x1f\xd4\xf0\ -\x7a\xa9\x07\x47\x6b\xfa\x05\x5a\xee\x3f\x28\xea\x17\x54\xd4\x7f\ -\x40\xb8\x2c\xae\x47\xdb\x46\xd5\xfe\x17\xdf\xe8\x7a\xb1\xcc\x8f\ -\x15\x9f\xa7\xad\x51\x97\x3d\x82\x6f\x8d\x08\xdd\x56\x6e\x42\x39\ -\x9b\xe0\x42\x3c\xf4\x74\xaa\xea\x00\xb0\xb3\x20\x34\x06\x0a\x8d\ -\x15\x26\x5c\x06\x52\xda\x0e\x17\x42\xf3\x96\x08\xf0\xfd\x81\x63\ -\x85\x33\xb7\x5e\x00\x19\xdc\xda\x29\xfc\x7b\xf1\xfd\x4a\xe0\x60\ -\x50\x3d\x95\x04\x50\xdf\x02\x51\x9f\xa5\x3e\x89\x7e\x0a\xc2\x09\ -\x80\x4f\x04\x5c\xd8\x86\x5a\x75\xd8\x82\xa3\x5c\x37\xfe\x77\x51\ -\xdc\x60\x33\x17\x80\x60\xf2\x48\x6e\xfc\xfb\x9f\x1d\x12\xf7\xc1\ -\xf3\x1b\x2f\x5d\xdc\xb5\x6e\x71\x44\x3f\x7d\x0c\x3b\x11\x1b\x01\ -\xe3\x47\x01\x3e\x73\x07\xaf\x97\xaa\xe1\x22\x3c\x15\xf7\x1d\x54\ -\x35\xff\x29\xfb\x0e\x49\x51\x01\xb5\x9f\x42\x28\x0c\xac\x92\x7e\ -\xea\x94\x52\x69\xd6\x44\x1a\x9d\x7d\x7f\xcb\xc3\xe9\x31\xfa\x9b\ -\xc8\x08\xed\x28\x8a\x1a\xc2\x64\x2c\x2e\x5c\x0e\x52\x14\x6f\x93\ -\xc2\xcb\x96\x3a\xb9\x69\xf5\x82\xc3\x85\xef\x9e\xa3\x2d\x1b\xc9\ -\xe9\x86\x76\x81\x3e\x05\x0f\x0e\xc6\xe0\x3e\x46\xfd\x8e\xfa\x22\ -\xfa\x69\xd8\xe0\xa7\xf5\x74\x3d\x90\xfa\x81\x10\xa9\xf8\xc4\xc4\ -\xb1\x07\xcb\x0f\x93\x55\x83\x06\x13\xb8\xa8\xfd\x6f\xf3\xc5\xb2\ -\xf5\xdd\xde\xcb\x92\x8e\x5a\x55\x5a\xa4\x2e\xe8\xbc\x17\xc5\x1c\ -\xa8\x9d\xc1\xf4\x7a\x29\x53\x0a\xe2\xfb\x1f\x45\x7d\x25\xcc\x8f\ -\x40\x7c\x3d\x6c\x17\x05\x04\x69\x4d\x01\x65\xe3\x5a\x31\x20\xe3\ -\xf9\x67\xd5\x7b\x31\x3e\x4a\xe0\x62\x66\xda\x73\xef\xfb\xc2\x88\ -\x78\xa4\x54\x35\xad\x63\xa5\x14\x85\x46\xe0\x86\xa9\x64\x38\x5a\ -\xa6\x6d\xa1\x00\x9e\x5a\x22\x02\x4e\xb1\xfa\xde\xe4\x49\x51\x3f\ -\xef\xd4\x6a\x0c\x4f\xc1\x03\x26\x3f\x82\x3c\x8a\xfb\x25\x88\x4e\ -\x00\x38\x21\x50\xe1\x67\x54\xe5\x36\x17\x1c\xb6\xe0\x19\x22\x91\ -\x78\xa3\x9e\xdd\xa2\xfc\x1b\xaf\x23\xe1\xc1\xe4\x15\x42\x24\x8f\ -\x8c\x27\x9f\xd9\xe7\x24\x4f\xd6\xc6\xaa\xdb\x3e\x60\xf0\xa8\xc9\ -\xfb\xfe\x63\x7f\x4c\x57\x7d\x93\x3a\x9f\xbb\xa8\xff\xcc\x54\xe8\ -\x7f\xd8\x16\xa5\x5c\xae\x29\xa0\x24\xc4\x92\x95\xca\xab\xff\x62\ -\x7c\x94\x14\x94\xb7\xe3\x81\xf1\xf4\xad\x86\x27\xe2\x01\xec\x34\ -\x35\x02\xe6\xc3\x8c\x65\xaa\xa3\xeb\x62\x9b\x08\xcd\x5b\x22\x06\ -\x2e\xc4\xab\x44\xec\x9d\x73\xe9\x74\x0c\x3e\xb8\xc8\x9e\x13\x40\ -\x3f\xa2\x29\xf5\x3b\x14\xf7\x4f\x50\xad\x81\x84\xb6\xa7\xae\x5c\ -\x23\xe6\xc7\x0b\xd9\x57\xd8\xa3\x93\x03\x83\x09\xd4\xbd\x68\x71\ -\xd7\xea\xc5\xdd\xc9\x57\xe8\xc9\xae\x2b\x58\xa8\x0e\xa0\xc1\xa8\ -\x27\x4d\x78\xde\x64\x47\x3e\x76\x0d\xdc\xd5\x0a\x3b\x57\x13\x6c\ -\x77\x09\xc8\x53\x51\x1f\xa2\xe2\x3e\x62\x12\x5f\x87\xb7\x8d\x42\ -\x6a\xbb\x28\x9f\x77\x26\x96\x0b\xc7\x8b\xe4\x1e\xec\x28\x80\x5b\ -\xfa\xf6\xfa\xce\xef\xbe\x6e\xbe\x4d\xd8\x24\x6e\x98\x5a\x8c\x47\ -\x65\x6a\x13\xa1\x79\x4b\x04\xcc\xc5\x0b\xf1\xe0\xb3\x35\x3e\xb8\ -\x88\xfe\x46\xfd\x0f\xfd\x13\x7d\x35\x2c\x70\x80\xf8\x67\xb4\x1d\ -\x68\x57\xa5\xc4\xbc\x67\x08\x99\x3c\xe8\x8f\x4e\x4c\xc1\xe4\x1d\ -\x3d\x62\xfe\xfa\xb8\x77\x62\x4a\xaa\x67\x04\x0b\xd5\x09\x1a\x98\ -\xef\xe8\xd9\x32\xf5\x00\xb7\x7f\x0f\x3c\x6f\x62\xb8\xab\x35\xd8\ -\xbf\x06\x51\x1f\xa0\xbe\x81\xa2\x7f\x90\x54\xf5\x1f\x26\x24\xc8\ -\x57\x0d\x28\xc1\xab\xc2\xbd\xfc\xf1\xfa\x2f\xc5\xba\x1e\x7a\xa2\ -\xdf\x5c\x2f\xf8\x4b\x6e\x25\x83\xf2\xa6\xb1\x0e\x45\x0d\x42\x8d\ -\x44\x53\x2e\x5c\x1e\xdb\x00\x68\x1e\xe1\x65\x4b\x04\xcc\xb5\x0b\ -\xf1\x70\xf1\x74\x4f\x51\x5c\x3b\x83\x07\x17\xd1\xff\xa8\xb8\x8f\ -\xf2\x49\xa0\xd2\x44\x00\x0a\xda\xbe\x7e\x9d\x98\xef\x8a\xc9\x17\ -\xcf\xe5\x97\x6b\x56\xa3\x74\x87\xdd\x5d\xbf\x4d\x8f\xff\x27\x0d\ -\x26\xcf\x11\xc2\x3d\xa1\x3f\x75\xe4\x60\x32\x05\x77\xbd\x45\xea\ -\x7b\x51\x34\x16\xdc\xcc\xa1\xfc\xfb\x6e\xd8\x99\xf9\x59\x95\xe7\ -\x4d\x40\x7c\xff\x53\xbf\xc0\xbc\xc9\x6f\x50\x74\x5d\x6c\x93\x8a\ -\x52\x2e\x57\x0d\x28\xf8\xec\x49\xa9\x38\x6b\xa2\x8a\xd4\xf0\x97\ -\x1e\xfe\xce\x74\xa9\x0a\xa1\x1d\xc5\x3c\x35\x06\x1a\xc7\x64\x3c\ -\x10\x7e\xce\x85\xeb\x23\x98\xa7\x75\x96\x88\x98\x6b\x17\xe2\xe9\ -\x43\x67\x35\x3c\x6b\xc2\x7d\x0f\xc4\xfd\xb4\xd2\x24\x80\xc2\xf5\ -\x20\xa5\xed\x2b\x57\xf4\x1f\x2b\x9d\xf8\x7b\x74\x61\x4e\x04\xeb\ -\x99\x12\x3c\xb7\x21\xfc\x7b\xe0\xa6\x88\xf3\xf7\x88\x9d\xe4\x68\ -\x51\xbc\x6e\x49\xd7\x9a\x65\x5d\xc9\xd3\xa3\x78\x65\x7e\xb9\xd1\ -\x08\xc1\x77\x15\x5e\xec\x09\xfd\xb7\x74\x00\xff\x9a\x60\x1f\x13\ -\x51\x3f\x42\x9f\x40\xd5\x12\x48\x50\xbc\x5d\x80\xa7\xe2\xa8\x13\ -\x4f\x39\xbb\x6a\x40\x71\x64\x7e\xa1\x50\xd1\xbc\xce\x1a\x3c\xb8\ -\x5e\x2f\xc6\xa3\x13\xf6\xbe\x2e\x9a\xa2\xd0\x10\x90\xa2\xa1\xc2\ -\x52\xcc\xd3\x32\x6d\x8b\xca\xd2\x20\xe6\xda\x13\xf1\xda\x59\x72\ -\x59\xe9\xdf\x36\x83\x67\x4d\xa8\xa8\x4f\x9a\x84\x81\x85\x07\x18\ -\x5c\x0f\x7d\xb8\xec\xcb\xd7\x1e\x2e\x0e\x95\x4e\xee\x95\xba\x34\ -\xa7\xee\x9a\xab\x15\x0c\x26\xbf\xcb\x64\x2f\x80\x60\x92\x2e\xd5\ -\x03\x6f\xeb\x11\xfd\xeb\xe3\xde\x71\x5d\xc2\x3f\xa6\x54\x55\x17\ -\x51\xfd\x01\x8d\x4c\xbd\x5a\x25\x76\x4b\xc8\xbb\x0a\x83\xfd\x4b\ -\x04\xfb\x9c\xee\x7f\x10\xf5\x8d\xb0\x60\x42\x45\xdb\x00\x51\xb0\ -\x3c\xad\x7e\xd0\xcf\xbf\xaa\x62\x40\x81\x01\x2e\xf3\xc5\xd5\xf5\ -\x9e\xee\x42\x60\xeb\xea\xa1\xc2\xd1\x09\x80\x1d\xa7\x86\xc0\x3c\ -\x08\x8d\xc4\x8d\x46\xf3\x28\x6c\x0b\xa0\x79\x84\x97\x2d\x11\xb0\ -\x6f\xed\xe0\xb1\x2a\x16\x9c\xea\xaa\xe9\xda\x5e\x3b\x53\x3a\x3d\ -\x11\xbc\x46\x7c\x16\xcf\x9a\x50\x7f\x44\xff\xe4\x01\x04\x85\x9f\ -\x53\xc1\x7a\xd8\x66\xd0\xfe\x57\x85\x88\xc5\xf2\xbd\xc7\x2a\x3f\ -\x31\xe7\x5e\x5f\x53\x0b\x95\x82\x09\xf0\x9c\xee\xd4\xaa\xe0\xf5\ -\x2a\x11\x1f\xb9\x45\xd1\x18\x6c\xfb\xb8\xef\x3f\xc4\x5e\xad\x82\ -\xa0\xff\x70\xa1\xff\xa0\x0f\x41\x5a\xc9\x67\x40\x74\x1d\x90\xa9\ -\x5d\xd0\x01\xac\x7f\xfe\xf3\xd7\xcd\x2f\x16\xe6\x55\x1c\xb8\xf0\ -\x30\xa3\x88\x15\xeb\xba\x18\x4f\xbf\xbd\x81\x47\x27\x61\xe2\x06\ -\xa2\x86\x33\x19\xd1\xd4\x06\x82\x79\x5a\x67\x89\x88\xeb\x56\x69\ -\x5f\xf3\x27\x5e\x25\x85\x7f\x74\xa9\xaa\xa3\xc9\x2b\x7f\xd3\x3d\ -\xe9\xec\xc5\x15\x7e\xbe\x97\x8a\xfa\x20\x0a\xfd\x73\x26\xc2\x75\ -\x79\xfb\x62\xfd\xca\xf9\xeb\x1c\x91\x78\xe3\xc1\xf8\x02\xc8\x6a\ -\xc1\xe4\xa3\x83\xdd\x2b\xd6\x76\xa7\x5e\xd1\x88\xd7\xab\x44\x01\ -\xf8\xd2\xff\x8d\x19\x7f\xdf\x04\x53\x00\xf2\xd4\x7f\x40\xd4\x37\ -\x2a\x05\x12\x2a\xba\x3e\xfa\x0f\x15\x42\xf3\xa2\x7b\x52\x2e\x9a\ -\xe7\x15\x64\xc5\x80\xe2\x8b\xf9\x8b\xa4\xe8\x6a\xd9\xaf\xb7\x51\ -\xaa\x1c\x9d\x00\xbc\xe3\xd4\x30\xdc\x60\xdc\x70\x5c\xbc\x2d\x90\ -\xa5\x41\xe8\x23\xe1\x78\xc2\xe9\x3d\xd9\x71\xe3\xef\xd5\x86\x8e\ -\x7a\x3c\x36\x9d\xd2\xb3\x26\x3f\x84\xdb\x3a\xeb\x7c\xd6\x04\x85\ -\x7f\x59\x52\xd1\xcf\xe9\xba\xb4\xcd\x80\xcb\xe0\x05\x90\x6e\xfe\ -\xa8\xb9\xf6\x4c\x4f\x2d\x54\x0b\x26\xaf\x10\x22\xb1\x3e\xe1\x3d\ -\xa3\xdb\x8d\xee\x2e\xd6\x69\xc6\xaf\x13\xfa\xe2\x5b\xd8\xd1\x1a\ -\xde\x34\x7e\x1d\x15\xf5\x07\xf4\x0f\xea\x2f\x26\xd1\x75\x4c\x6d\ -\x52\x78\x59\xa4\x47\xe2\x5b\x86\xdc\xae\x5b\x2a\x06\x14\x47\x15\ -\x96\x09\x55\xdf\x2b\x9b\xa3\x9a\x1d\x0a\xbe\xb7\xf3\xfe\xf1\x0c\ -\x3f\x7f\x48\x3b\x4c\x45\x8d\x83\xc6\x32\xa5\x28\x5c\x16\x84\x6d\ -\x98\x08\xab\xb7\xd4\x41\x76\xed\x92\xc3\x95\x88\xbf\x45\x5b\xb7\ -\xe3\x5f\x50\x08\x13\xc0\x53\xe3\xb1\x6b\xe0\x59\x13\x72\x5b\xa7\ -\x29\x45\x5f\xa3\xbe\x07\xa2\xfe\xc9\x03\x07\x55\x58\x50\x81\x36\ -\xa7\x69\xfe\x9a\xc5\x25\xfb\x1e\x5c\xaf\x58\x09\x4e\x3b\x0a\xff\ -\xde\xb0\x60\xa2\x51\x2f\x5f\xdc\xb5\x6e\x69\x57\xf2\x35\x7a\x9e\ -\xaa\xfb\x99\x13\x4a\x14\xf3\x1e\xdc\xd0\x91\x29\xaa\x3b\xe0\x77\ -\xe1\xab\xdc\x22\x8c\xfb\x9e\x0b\xfd\x82\xfb\x0a\xff\xa3\x84\xaf\ -\x47\xdb\x06\x01\x3c\x9d\xc6\x96\x2d\x8b\x76\xef\x55\xb1\x0b\x43\ -\x03\x4a\xf0\xaa\x7a\xbf\xf0\x4c\x6d\x99\xba\x6c\x13\x89\x61\x95\ -\x4c\x8f\x79\xee\xc3\x70\xfa\xa0\x54\xc5\xa1\x9d\x47\x83\x50\x03\ -\xa1\xd1\xd0\x80\x26\x23\x82\x68\x3b\x54\x96\x06\x01\x7e\x96\x57\ -\xa3\xaf\xd6\xfe\xdd\xf1\x2f\x28\x84\x0b\xa7\x7b\x7d\xf1\x6b\x98\ -\x00\x66\xf1\xac\x09\x88\xfa\x27\x0a\x07\x3f\x15\xfd\x9c\xae\x0f\ -\x6d\x4e\xd3\xf5\x7a\xa2\x74\xbc\xb1\x13\xf5\x6a\x07\xd5\x0b\x20\ -\xa7\xee\xae\x13\xd7\x7d\x77\x5b\xf6\xf3\xf0\x56\x02\x53\x30\x79\ -\x57\x8f\x98\xbf\x32\xee\x1d\x9f\x70\xd4\xea\x52\x5d\x5b\x51\x10\ -\xde\xe6\x3b\x26\x33\x57\x1b\x7e\x17\x9e\xa6\x5c\xd4\x97\x20\xe5\ -\xfe\x42\x7d\xc6\x54\x87\xed\x50\xb0\xcc\xeb\x09\x97\x7b\xff\xf7\ -\x7f\xb7\xee\x0e\x0d\x28\xc5\xdc\x82\x45\x4a\x74\xd7\x75\xaf\x3a\ -\x6e\x59\x85\xad\xa8\x89\xa2\x2c\xee\xde\xe9\xa7\xef\x2b\x9d\x3e\ -\xa0\x9d\x0b\x13\x1a\x07\x8d\x46\xd3\x30\x99\xda\xa1\xf0\xf2\x5c\ -\x01\x62\x7e\x98\x1a\x8e\x97\x9b\x77\xb4\xa3\x12\x6f\xd7\xdf\x56\ -\xf1\x68\xb9\xdd\xa1\xb7\x07\x1b\x26\x00\x00\x7d\x0a\x65\xf2\x41\ -\x1c\xdc\x38\x09\x84\x05\x11\x10\x5f\x97\xb7\x1f\xc8\x59\x3f\x7f\ -\x4e\xbe\xfa\xbf\x12\xc1\xbe\x28\xaa\x9b\x2e\xd9\x99\xb9\xe8\x2a\ -\x4f\x8c\x9b\x5e\x9c\x78\xac\x10\xee\x71\xfd\xa9\x23\xe7\x25\x53\ -\x67\x68\x43\x45\xe6\xeb\x60\xf4\x28\x80\xb7\x2a\x6c\x29\x64\x7f\ -\x49\xfe\x88\xe6\x4d\xe3\x3e\xe6\x7e\x00\x42\xff\xe0\x3e\x63\x12\ -\x5d\x0f\xdb\xe4\xaa\x99\x50\x43\x6e\x5c\x3f\xff\x44\xc7\xf7\xbe\ -\xa2\xbf\x67\xd6\xa7\xbc\x60\x4b\xea\xdd\x53\xba\x8d\x5c\xda\x17\ -\x37\xbd\x7b\x4b\xe6\xfc\xd2\x5f\x7d\xd8\x41\xcc\x53\x83\x50\x43\ -\xe1\x40\x2c\x94\x84\x79\xac\x47\x71\xc3\x62\xbb\x28\x00\xd3\xb6\ -\x26\x78\xe7\x9a\xec\x3f\xc9\x51\xa9\x93\x94\x2a\x2e\x57\x52\x1d\ -\xa2\xf7\xc0\xb0\x54\xf1\x2d\xba\xab\xa3\x22\xb7\xf7\x9e\xe2\xb0\ -\xb8\xef\x34\x21\x4a\x67\x0e\x67\x45\x64\xb6\x80\x67\x4e\x3c\x47\ -\x9d\xe7\x88\xc2\xd9\xba\xd1\xa6\x04\xb0\x46\x00\xa7\x56\xb2\xbe\ -\xba\xfd\xc2\x1d\x63\x5f\xad\xe1\x8e\x2e\xea\xaf\x28\xea\xb3\x98\ -\x9a\x44\x97\x01\xd1\x36\xe8\x77\x04\xba\x66\xbd\x58\x98\xf4\x52\ -\xef\x12\x22\xfe\x1f\xda\xba\x1d\x6b\xdf\x99\x80\xc1\x04\x6e\xd5\ -\xae\xb0\x2f\xc4\x27\x07\xbb\x57\x3d\xb7\x3f\xfe\x37\x29\xd7\xd7\ -\x47\x6f\xed\x05\x9c\x91\x19\x29\x8a\xeb\xde\xb7\x3d\xfd\x83\xd2\ -\x5d\x5d\x7c\xfb\x51\x74\xff\xa3\x3f\x50\x3f\x01\x99\xe6\x3c\x54\ -\x2d\x7e\x84\xd0\x7c\x28\xa1\x7f\xb5\xb8\xa2\x38\xa0\x27\xa4\xba\ -\x0e\x05\xa3\xf0\xe0\xa2\xf2\x76\xee\x2c\x64\xee\x0a\x09\x26\x61\ -\x42\xe3\x50\x83\xd1\x94\x1b\x11\x64\x6a\xa7\x23\xb8\x71\xbd\x58\ -\x77\xc3\x86\xe4\x97\xa5\xd3\xf7\x90\x54\xea\x2a\x5f\x4d\x7c\x54\ -\xfb\xd1\xb9\x52\x15\x5f\x21\x55\xe1\x1c\x1d\x3f\x3e\x21\x44\xfe\ -\x4b\x22\xd5\xfb\xdb\xd8\xda\xfe\x87\x36\xae\xef\xff\xea\x75\xcf\ -\x10\xf0\xe6\x68\xd8\x45\xd5\xc4\xa9\xf4\x59\xcd\xe0\xcb\x1f\xa5\ -\x2c\x46\xfa\x17\x62\xb3\xc1\xf3\xf4\x33\x78\x15\x3d\x15\xf5\x47\ -\x93\xf8\xc0\xaf\x75\x12\x00\x89\x84\x37\x78\xb8\x92\xc9\xb3\xb4\ -\x75\x3b\xd6\xbe\x33\xa1\xd6\x60\x72\x56\xaf\xe8\x5a\xdf\xe7\x3d\ -\x3b\xe5\xb4\xdf\xab\x7d\xc0\x9f\xc6\x7d\xff\x7e\xf8\xd1\xb5\x59\ -\xdc\x22\x8c\x7e\x81\x3e\x52\x49\xb8\x0e\x8a\xb7\x49\xe1\xe5\x50\ -\x8c\x01\x05\xee\xba\xf1\xf3\xde\x22\x3d\x39\x2d\x2e\x55\xcd\x9a\ -\x9a\xb7\xc4\x00\x18\x37\xa7\x9c\xed\xd7\x0e\x89\xfb\x4b\x55\x1c\ -\x6a\x00\x6e\x20\x6a\x34\xcc\x57\x33\xa4\x89\xb0\xfa\x96\x03\x93\ -\xf2\x8d\x2b\xfa\x5e\x2b\xbc\x81\x9f\xc9\x62\xe2\x1f\xa5\x2f\x96\ -\xeb\xea\x98\x84\xd3\x1b\x53\x82\xff\x20\x75\x03\x09\x19\x93\x42\ -\x1d\xea\x78\xea\x3d\xf1\x62\xdf\x15\x37\xae\xef\xfd\xd1\xaf\xd6\ -\x0a\xb8\x8b\x8f\x06\x89\x6a\xa2\x98\xea\x6a\x02\x9e\x39\x11\xf1\ -\xd8\x3f\xeb\x9d\xdc\xd1\x17\x8a\xf1\x07\x8e\x66\xf0\x2a\x7a\x14\ -\xf7\x4f\x14\x06\x11\x53\x20\xa1\xeb\x83\x78\xfb\x28\x71\xe3\x11\ -\x62\xa5\x13\x1b\x7f\xc3\xc1\xf2\x8a\x95\x5a\x83\x09\xa4\x27\x74\ -\x77\xad\x5e\xe0\x44\xf7\x93\xbe\x34\xad\x17\xf0\xa7\x3f\x67\x8c\ -\x6f\x11\xe6\x7d\xe1\xbe\x80\x42\x9f\xa1\x7e\xc3\x85\xcb\x41\x0a\ -\x6d\x71\x01\x3c\xad\x05\xf3\x6d\xc3\x99\xc3\xc4\x80\x74\xbd\xba\ -\x8e\x4e\x70\x2b\xea\xd9\x63\x9e\x94\x23\x69\x5f\xfe\xf9\x5a\x21\ -\x26\x75\x91\x76\xb0\x92\xb8\x71\x4d\x79\x14\x2e\xcf\xdb\x00\x01\ -\x98\xb6\x1d\x10\xf4\xf7\xaf\xec\x3b\x55\x87\x8f\xff\x91\xd2\x3f\ -\x46\x1b\xba\xa6\x73\xe4\xba\x43\x53\x41\x46\x89\x7e\x6d\xe0\x37\ -\xa4\x54\xff\xe5\x37\xae\x5e\xf4\x37\xfa\x23\x0c\x0e\x5c\xd0\xae\ -\xa9\x1e\x84\xf0\x72\x45\xe6\xca\x33\x27\xc1\xdb\x83\x0b\xd9\xcb\ -\xd9\x0f\x1c\x99\x7c\x07\xf2\xdc\xf7\x40\x38\xc0\x41\x38\xf8\x79\ -\x30\x31\x09\xd6\xc5\x36\x21\x45\x95\xf1\x0b\xfd\x87\xfb\x7e\xa2\ -\xa3\x4f\x25\xd6\xca\x4c\x82\xc9\x3f\x2f\x10\x0b\xd7\x76\x7b\x27\ -\x47\x71\x21\x1e\x1a\x45\xe3\x46\x61\xe4\xe0\x0e\xc1\x49\xf7\xd7\ -\xe0\x4f\x86\x3e\x00\x50\xe6\x0a\xf3\xa7\x30\xe1\x72\x74\x3d\x6c\ -\x0b\xa1\xf9\x19\x61\x9c\x84\xa2\xb8\x20\x1f\x05\x45\xdf\xdb\xfd\ -\x48\x36\xf3\x27\xe8\xbd\x01\x34\x02\x88\x1a\x07\x44\x0d\x46\x0d\ -\x69\xd2\xac\x8d\xd7\x4a\xf4\x5f\xf8\xcf\x13\x31\xe7\x33\xd2\x51\ -\x6b\x75\x07\x66\xe7\xcf\x3a\xb0\x48\xa9\x0e\x93\x4e\xee\x63\x1b\ -\x37\x2c\x78\xb7\xae\x01\x7f\xe0\x82\xb6\x31\xa5\x02\x68\x1e\xa0\ -\x79\x23\x73\xe5\x99\x13\xfa\xf6\xe0\x2a\x3f\x70\x84\x3e\x86\xa2\ -\xbe\x87\xbe\x89\xa2\x81\xc4\x14\x58\x70\x3d\x53\xbb\x40\x90\x6e\ -\x5c\xb5\xe0\x70\xc7\x8f\xbd\xfd\x60\x78\x88\x71\x26\xc1\xe4\x38\ -\xed\xc7\xcf\x4c\xa4\x0e\xef\x77\x52\x2f\xd7\x95\x75\xfb\x5e\x94\ -\xce\xab\xb7\x27\x37\x21\xfd\x07\x7e\xb6\xcb\xf8\x93\x1c\x50\x46\ -\xa1\x0f\x70\x51\x3f\xa9\x26\x58\x9e\xb6\xc9\x85\xd0\x7c\x4d\xc0\ -\x44\x71\x20\x71\x35\x20\xa5\x57\xd7\x8f\x69\x81\xb1\x67\xbc\x35\ -\x04\xbd\x6e\x2e\x27\x9c\x6d\x5f\xdf\x2b\xb6\x4c\x15\xa7\x01\x65\ -\x93\x4c\x06\xa6\x75\x28\xd3\xba\x54\x00\xa6\x6d\x47\xf0\x06\x68\ -\x35\x71\x8a\xa3\xff\xc2\xd7\x1b\x59\x97\x5f\x4f\xad\xaf\x56\x3b\ -\x5e\xe1\xfd\xbf\xde\x30\x1f\x82\x8a\xab\x45\x03\x0a\x15\x7c\x17\ -\xa6\x28\x00\x53\x80\xd6\x1f\x40\x7a\xc3\x82\x63\x95\xe3\xfe\xb3\ -\xfe\xe2\x8e\x7d\xe6\x04\x2e\x9a\xee\x2b\x88\x9b\x2a\xbc\x3d\x18\ -\x80\x32\x8a\xfb\x1f\x1d\xdc\x54\x61\x47\x27\x74\x5d\xda\x2e\x08\ -\x09\xf2\x97\xe9\xd1\xeb\x3a\xb9\xa3\x0f\x86\x87\x18\x67\x12\x4c\ -\x40\xaf\x19\xec\x5e\xb1\x34\x91\x3c\x55\x46\xf0\xf2\xc7\xa8\xc9\ -\xfb\xfe\x26\x78\x4d\xcf\xaf\x44\xe8\xa9\xae\xa0\x0f\x4c\xd4\x9f\ -\x30\x45\x55\xf3\x23\x10\x6f\x8f\xc2\xcb\x35\x01\x93\xc3\x01\x48\ -\x4f\xc5\x75\x7b\x3d\xa5\xe2\xac\x09\x9d\x55\x6a\x40\x3b\xcb\x48\ -\x3a\x27\x1f\xc1\xd7\x6a\x96\xe0\x06\x00\xa1\x61\xd0\x48\x26\xc3\ -\x85\x09\xd6\x03\xb0\xad\x8e\x00\xdf\x00\xad\x37\xb8\x1e\x13\x97\ -\x81\x76\xf4\x20\x5b\xe5\x7a\xb9\x73\xaf\x5e\x2b\x4e\xd7\x55\x10\ -\x54\x30\xb0\xf0\x00\x03\xdf\x49\xf3\x54\x14\x5e\x2e\xff\xce\x89\ -\xde\xb9\x6d\x77\x67\x4d\xad\x04\x93\x58\x41\xdd\x0a\x17\x4d\x67\ -\xf9\xf6\x60\x10\x1d\xe4\x18\x44\xe8\x04\x50\x69\x32\xc0\x76\xf1\ -\x3b\xf1\xbb\x02\x96\xac\x5d\xf2\x8c\x83\xe1\x21\xc6\x99\x06\x93\ -\x37\xf5\x4d\x5d\x88\xef\x6e\xc3\x0b\xf1\xa5\x1f\xcc\xfa\x35\x79\ -\x4d\x0f\xed\x07\x10\xf4\x81\x08\x7d\x81\x8a\xfa\x0a\x17\x5f\x96\ -\xb6\x45\xc1\x32\xaf\xaf\x19\x98\x14\x0e\x40\x3a\xc5\x85\x7a\x82\ -\x39\xb2\x54\x6c\x09\x79\xe5\xed\xbc\x7d\x67\xfa\xae\x52\x91\x42\ -\x8d\x81\xe2\x06\xa3\x46\xe4\x06\x35\xad\x8f\x60\x9e\xd6\xb5\x1d\ -\xae\xef\x75\xeb\x11\x15\xe9\xe9\x0c\xdd\x61\x1d\x00\x9c\xc3\x93\ -\xa2\xef\xad\xdf\x12\xc1\x3b\x8d\x20\x90\xc4\x4a\x29\x95\x29\x90\ -\x70\x21\xe5\x7c\x70\xa3\x87\xd7\x77\xb2\xe8\xe0\xdf\x39\x81\x9b\ -\x44\x26\xa5\xf7\xe0\x1f\x26\x33\x57\xd4\xf0\xf6\x60\xea\x6b\xe8\ -\x7b\x74\x90\xd7\x22\x5c\x0f\x85\xed\x21\xd3\xca\xda\xc6\x5d\x5e\ -\x31\x73\x92\x8e\x47\x73\xfa\x21\xc6\x99\x06\x13\x2d\x1f\x2e\xc4\ -\x0f\x3a\xc9\xd3\xa2\xf4\x3d\xfa\x85\xb3\x05\xfa\x82\x3f\x98\xc5\ -\x9e\xb3\x03\x70\xfb\x51\xd4\x0f\x20\xe5\xfe\x42\x85\xcb\xe2\x72\ -\xb4\x0c\xe2\x6d\x83\xea\xc6\x1c\x50\x94\x92\xba\xf5\xba\x0c\x5f\ -\xcf\xd6\x81\x91\x27\x3d\x67\xfb\x25\x22\x78\x6f\x17\x36\xc5\x3b\ -\x8d\x65\x10\x37\x16\x28\xcc\x88\x34\x0f\x60\x1b\x9d\x83\x2c\x0e\ -\xe8\xbd\xb3\xaa\x54\x8a\x92\x84\x1e\x6f\xc7\x2d\x5f\x37\xf8\x7a\ -\x9d\xe7\xc1\x04\x8f\x4a\x68\x1e\x05\xbe\x82\x02\xa8\xef\x04\x79\ -\x78\xbd\x8a\xf0\x63\x1d\xfd\x3b\x27\x78\x47\x57\x8d\x2f\x7c\x04\ -\x51\xdf\xc3\x81\x8e\xa2\x47\x26\x54\x7c\x39\xf4\xd5\x30\x21\x0a\ -\x7e\x36\x79\xae\x3f\xc4\x08\xd7\xae\x76\x2a\x79\xe9\x87\x77\x66\ -\xbe\x5d\x6b\x30\xf9\xd7\x85\x62\xe1\xea\xae\xe8\x2e\xc4\x23\xd4\ -\xc9\x67\x4b\x41\x78\x5b\x1e\x98\xc8\xdc\x10\x72\x8b\x30\xa6\x54\ -\xd4\x9f\x4c\x7e\x65\x12\xae\x03\xe2\xed\x81\x28\xbc\x3c\x23\x0e\ -\x70\xbc\xe0\xb4\x84\x2a\xd6\x7d\x74\x52\x8f\xb1\x3d\x59\x7c\xea\ -\x49\x3f\x73\xbf\xe1\xe9\x3b\x6e\x08\x10\x1a\x89\x1a\xad\x92\xf8\ -\xfa\x08\xe6\x69\x5d\x5b\xa2\xa3\xbd\x8e\xf9\x8d\x99\x34\x1c\xa1\ -\x56\xa4\xfc\xc2\x5f\x7c\x49\x04\x17\x74\x21\xa8\x60\x60\xc1\x14\ -\xbe\x97\x06\x15\xd8\xd5\x5c\x00\xa6\xe2\x9a\xf5\x62\x51\xa7\xbf\ -\x5e\xa5\xc6\x3b\xba\x20\x05\x99\xfc\x0e\x64\x1a\xec\x26\x99\xd6\ -\xc5\xb6\xa9\x10\x85\xa7\x13\xe7\xd2\xcf\x26\x73\x20\x98\xec\xf2\ -\xe4\x15\xe7\xed\x18\xbd\x7a\x93\x27\x7c\x30\x94\x66\x9a\x1d\x48\ -\x0a\xf2\x8f\xd7\x3e\x7a\x58\x22\xb5\xbe\x2f\x96\x7c\xb1\xae\x28\ -\xfb\xe4\x6c\xa9\xbb\x01\x02\x7d\xf1\x63\xa9\x8a\xf6\x05\x28\xf7\ -\x83\x08\xca\xe8\x23\xd4\x67\xc2\x44\xd7\xc5\xf5\xa9\x00\x9e\xce\ -\x1a\xe3\xa4\xa4\x8d\x56\x97\xdd\xea\xdd\x2a\x4f\xc9\xf4\x13\x85\ -\xc0\xc8\xb4\xa3\x3c\x0f\x42\x03\xd1\x94\xcb\xb4\x3c\x08\xa0\xf9\ -\x0e\xc2\x1d\xd5\xff\xc0\xcd\x0a\x91\xa3\x8d\xa1\xf7\xbd\x5a\xbe\ -\x62\x8d\xd0\x63\xb1\x1c\x50\x30\x98\xa0\x30\x98\xd4\x14\x54\x92\ -\x85\x81\x8e\x7e\xbd\xca\x0c\xee\xe8\x02\x71\xff\x33\x0d\xf2\x5a\ -\x8e\x4c\x40\xd8\x06\xb6\x4d\x85\x04\x79\x78\x85\x8d\x98\xb2\x31\ -\xda\x7e\x4e\x41\x83\x49\x85\x6b\x57\x98\xa2\xdd\xfc\x57\x2d\xe8\ -\x59\xba\x2c\x9e\x7a\xb1\xe3\x8b\xf9\xf0\x61\x14\xd0\x2f\x9d\x2d\ -\xc1\xe9\x53\xe1\x3f\x0a\x77\x75\x19\x7e\xca\x1c\xcb\x5c\xd0\x27\ -\xf4\x0b\x9a\x82\x4c\x3e\x44\x97\x03\x61\x3b\x14\x5e\xae\x07\x75\ -\xc0\x00\xcf\x79\x62\x9e\xef\xfa\x2d\x7b\x42\x5e\xf7\x0e\xee\xee\ -\x1a\xfe\xd6\x6e\xf1\x64\xa9\x8a\x82\x06\xa1\x42\x63\xd5\x22\x5c\ -\x1e\xd7\x45\x30\x4f\xeb\xda\x96\xb8\x48\xec\x77\x94\xfb\x44\xa9\ -\x18\x39\x52\xba\xab\x7a\x9d\xbe\x97\xe9\x6c\x5c\x8b\x06\x15\x1e\ -\x5c\xaa\x06\x15\xb8\x85\x55\xb9\xee\x3b\xe0\xf6\x66\x28\x77\x1a\ -\xa5\x8b\xf0\xb7\xcd\xe0\x8e\x2e\x14\xf7\x3d\x1c\xe4\x61\xc1\x83\ -\xd6\xe3\x3a\xa6\x76\x29\x41\x79\xe3\x91\x62\xa5\x93\x98\x78\x4d\ -\xa7\xda\xb8\x1a\xb3\x08\x26\x41\xaa\x0f\xd5\x9c\x95\x49\x6f\x4d\ -\x97\xeb\x9d\x04\x1f\xd6\x4b\xe0\xd0\x24\xad\x87\x82\x84\x77\x75\ -\x8d\x5d\x4f\xee\xea\x42\x78\x5f\x2a\x89\xfa\x4f\x98\x70\x59\x68\ -\xcf\x24\x84\xe6\x67\xcd\x01\x01\xc5\x2d\x2e\x88\x3b\x5e\x6f\xdd\ -\x77\x78\xcd\x16\x3d\x80\x83\xbb\xbb\x4c\x2f\x74\xab\x20\x6a\xe4\ -\x30\xd1\xe5\x01\x9a\xef\x28\x3c\xe7\xa9\x71\xe5\x66\x9f\x2a\x15\ -\x23\x07\x6e\xab\x94\xbe\x5a\xfe\x0e\x11\xdc\xda\x6b\x0a\x26\xd5\ -\x82\x4a\xc0\xd5\x2b\xc5\x80\x1b\x1f\x87\xd7\xbf\x9c\xa5\x0d\x1d\ -\xc5\x38\x6c\x2a\x7a\x9b\x83\x9f\xf0\xbd\x74\x38\x73\x69\x44\xbf\ -\x07\x8f\x32\x1d\x95\xf0\x75\xb1\x4d\xfa\x1d\xc0\xb4\x14\x6e\x76\ -\x70\x72\x7d\xc7\xcd\xd5\x87\x18\x67\x1b\x4c\x40\xaf\x5f\xd6\xbd\ -\x7a\x69\x2a\x79\x86\x36\x4a\x24\xaf\xa6\xa7\x5f\x5a\x0f\x70\xdb\ -\x79\xba\x10\xbb\x07\x7e\xe2\x00\x76\xbc\x86\x37\x0d\x65\xae\xa0\ -\x4f\x25\x51\xbf\x31\x89\x2e\x8b\xe2\xed\x51\x78\x79\xd6\x1c\x10\ -\x50\x00\xdd\x7a\xcb\x1c\xb3\x28\xbc\xf4\xae\x5c\x3a\xec\x74\x17\ -\x80\x65\x90\xc9\x70\x26\xe1\xb2\xd8\x0e\xa6\x80\xa9\xae\xad\xd9\ -\xfd\x98\xd8\xa6\xbc\xc4\x35\x52\xca\xdd\xa5\xaa\xc8\xd1\x41\x65\ -\xe0\xe8\xa5\x02\x8e\x54\xe1\x28\x05\x55\x2d\xa8\x80\xdf\x94\x95\ -\x10\x03\xc7\xaa\x62\x67\xfe\xa4\x2f\x9c\x92\xa0\x3f\xe1\x8b\xd5\ -\xa5\x14\x80\x3c\x0a\x7d\x0b\xf3\x54\x30\xc0\x31\x80\xf0\x40\xc2\ -\x83\x0a\x08\xd7\xa3\xed\x23\x98\x2f\xd7\x65\x56\x2f\x58\x27\x54\ -\xfc\xac\xb9\xf8\x10\x63\x3d\xc1\xe4\x4c\x21\x12\x2b\x94\x77\x58\ -\x52\xf9\xcf\xd1\xe5\xba\xa0\x5f\x18\x05\x39\xdf\xdb\x7c\xf3\x70\ -\xfa\x2a\xf2\x13\x07\x08\x94\x4d\x42\x9f\x00\x71\x7f\x41\xf1\x65\ -\x30\x4f\xdb\xa1\x60\x99\xd7\xd7\x45\xdb\x0d\x74\x4f\xc9\x91\xcf\ -\x8f\x88\x47\x4a\x45\x0a\x35\x0c\x15\x35\x24\x15\x5f\x86\x96\x3b\ -\x9a\xb3\x84\xc8\xcb\xc2\xd8\xed\x7e\x31\x77\x61\xa9\x2a\x72\x1c\ -\xe1\xce\x5f\x18\x9f\x7f\xb8\xce\xf2\x60\x42\x83\x0a\xd5\xb4\xa0\ -\x72\xed\x1a\xb1\xce\x89\x4d\xbc\xb9\x53\x4f\xc3\xc0\x29\x89\xc7\ -\xf3\xd9\x2b\x23\xba\xa3\xab\x9a\xe8\xba\x20\x6c\x13\xe1\xe5\x00\ -\x7d\x74\x12\xbc\x60\x73\x2e\x3e\xc4\x58\x63\x30\x41\xa1\xcd\xca\ -\x36\x3c\x75\x69\xd7\xfa\xf9\xa9\xe4\x6b\xb4\x37\xd6\xfd\xc7\x71\ -\xdd\x0d\x10\xe0\x99\x93\xe1\x42\xec\x37\x17\x3d\xfd\xcb\xb3\xd8\ -\x27\x9a\x52\x95\xfb\x54\x12\xf5\x1b\xd3\x1f\x24\x20\xba\x3c\x6f\ -\x0f\xd5\x10\x0e\x08\x28\xd2\xf1\x17\x0a\xe9\xb5\xe4\x19\x14\x38\ -\x14\xcc\xfa\xce\xb6\x3d\xa5\x32\xc1\x64\x10\x6a\xb4\x6a\x32\xad\ -\x8f\x02\x30\xed\x18\x6e\xdd\x21\x76\xfa\xb1\xee\x2b\xf5\x2e\x34\ -\x3d\xab\x13\x05\x71\xd7\xf3\xe1\xe1\x38\x1e\x48\x50\x3c\x90\x94\ -\x03\xca\xf9\x42\xf4\xb8\x7e\xf7\xc9\x52\x26\xdf\xa8\x0d\x1b\xe5\ -\x78\x6c\x0a\x30\xe8\xb7\x4f\xc6\x7f\x01\xa7\x24\x22\xbe\xa3\x8b\ -\x1f\xa1\x50\xc1\x3a\xd8\xa6\x49\x48\x39\x3f\xba\x7e\xe1\xe1\x22\ -\x31\xf7\x1e\x62\x9c\x41\x30\x01\xd0\x6e\x68\x77\xff\x5d\x7d\xa2\ -\xef\x90\x84\xff\xac\x44\x84\x7f\xcc\xd0\x2f\x9f\x2d\xba\x8d\xdc\ -\xa4\xf0\x1e\xbe\x72\x78\xf4\x4e\xf6\xcb\xb3\x08\x94\xa7\xf5\x85\ -\x09\xfd\x84\xfb\x0e\x15\x5d\x1e\xdb\xc2\x76\x41\x14\x5e\xae\x9b\ -\x03\x02\xca\x14\xaa\x25\x93\x80\x76\xa4\x74\xda\x93\xa6\xd3\x5d\ -\x5c\x26\x63\xa1\x11\xb9\x01\xb9\xe6\x04\x9f\xd0\x7d\x19\x7a\x6c\ -\xdf\x3d\x5e\xde\xff\x9c\xde\x5d\x78\xdb\x61\x64\x68\x07\xe8\x8b\ -\xc7\xd4\x0a\x9d\xc5\xa3\x13\xd3\x91\x8a\xe9\x08\xc5\x39\x74\xe5\ -\xc0\xb1\x8e\x1b\xff\x27\x6d\xed\x8e\x7b\xbd\x0a\x4c\x66\x4f\x79\ -\xe2\x5a\x78\xd0\xcc\xf0\xab\x8b\x34\x05\x51\x9f\x03\xf1\xc1\x8d\ -\x01\x84\x07\x12\xcc\xf3\xf5\x41\xd8\x36\x15\x52\xce\xc3\x6d\xc2\ -\xbe\x37\xf6\x4a\xe1\x7b\x2f\x29\x55\xcd\x09\xea\x3d\x32\xd1\xf2\ -\x8e\xee\xee\x5a\x33\xe0\x24\x4e\xd7\x1f\x44\x76\x74\x12\xc5\x84\ -\x98\xf7\xfd\xc7\xfe\x98\x1e\xbb\xf2\x3a\xf3\x85\x78\x93\xa6\xf5\ -\xcb\x20\x5e\x4f\x97\xc7\x36\x00\x9e\xa7\x69\xa4\x84\x04\x94\xd6\ -\xe0\xab\x62\x76\xcf\xe4\xa8\xe9\xee\x2e\x04\x0d\x03\x42\xa3\x51\ -\x23\x9a\x44\xd7\x01\x68\x1e\xa0\xf9\x4e\x21\xf0\xef\x73\xc0\x47\ -\xbb\x13\x43\xc2\x75\x1a\x73\x0b\x71\xf0\xca\xfb\x40\x34\x78\xf0\ -\x40\x02\x2a\x07\x93\x4b\xd6\x88\xf5\xc9\xf8\xc4\x5b\x3b\xf1\xb5\ -\xe9\x70\x47\x57\x26\xaf\xee\xfc\xe9\xd0\xe8\xc6\x3a\xee\xe8\xa2\ -\x03\xbc\x56\x71\x3f\xa5\x42\x68\x5e\x14\x8b\x83\x87\xeb\x23\xc0\ -\x39\xf5\x5b\x27\x33\x0c\x26\xa8\x69\xb6\xff\xd0\x62\xb1\xe8\xd0\ -\x6e\xef\x05\x31\x27\xf8\x29\x87\xba\xc0\x2f\x88\x02\xf8\x79\xe8\ -\xfd\xbe\x7b\x37\x3c\x73\x02\x3b\x5c\x83\x4d\xd3\x94\x8a\xf6\x2b\ -\xe8\x5b\x88\xf8\x72\x54\xd8\x16\x42\xf3\x0d\xe1\x80\x80\x22\x5b\ -\x74\x74\x02\x78\xbe\x48\xdf\x36\x22\xb6\x95\x8a\x08\x1a\x05\x8d\ -\x41\xcb\x95\x8c\x48\x97\x81\x14\xc0\x14\xa0\xf9\x8e\x45\x7a\xb1\ -\x71\xb8\xed\xab\x54\x8c\x0c\x6d\x1c\xa9\x54\x70\x5b\x39\x3d\x22\ -\x31\x05\x93\xb2\x3e\x22\x44\xcf\xc2\x62\xf7\x0b\x5c\x91\x7c\x1d\ -\xac\xaf\xeb\x3a\x86\xd2\x45\xf8\xfb\x36\xee\xcc\xfc\xa4\xc6\xd7\ -\xaa\x70\xd1\x01\x4e\x07\xbc\xe9\x08\x85\xae\x47\xdb\xa4\xdf\x41\ -\x99\x56\xc6\xd7\xff\xcf\xa5\xdf\x3a\x89\x22\x98\x9c\xa4\xe7\xb3\ -\xc3\x62\x5d\x1b\xba\x9d\xe4\x4b\xf5\x87\x75\xf9\x1f\x34\x1e\x95\ -\x03\x07\xbe\xe5\xfb\x9b\x7e\x3b\x94\xde\x68\x78\xe6\x04\xc0\x3a\ -\xda\x1f\x2a\xf4\x19\xf4\x1f\x93\xe8\xf2\xd8\x1e\x17\x42\xf3\x91\ -\xd2\x36\x47\x28\xba\x87\xb9\x82\xe3\xec\x2d\xfd\xf6\x49\xa9\xaa\ -\xa2\xa8\x01\xa9\x11\x4d\x75\xa8\x39\x07\xfc\xbe\x67\xa3\xd0\x06\ -\x83\x31\x65\x0c\x1e\x44\xe5\xa3\x93\x63\x0e\xed\x3f\x2a\x16\x8f\ -\xbf\x5d\xaf\xd8\x71\xa7\xba\xf2\xca\xdf\x74\xef\xd8\xd8\x0f\x2f\ -\xf6\xc4\x3e\x18\x9d\x1a\xea\x2f\xd4\x87\xc2\x7c\x0d\x04\xab\xd2\ -\x00\x42\x83\x88\x49\x74\x5d\xfa\x1d\x00\x4f\xcb\xc4\xe3\x03\x47\ -\x3b\x6e\xfc\xed\xfa\x83\x8e\x0a\xda\x61\x44\x11\x4c\x20\x3d\x63\ -\x61\xef\xb2\x45\x89\xe4\x4b\x1d\x25\x16\xe8\x72\x5d\x44\x69\xd8\ -\xa2\xf0\xb6\x0f\x15\xc7\x6e\xb8\xe4\xe9\x0b\xf1\x88\xa9\x5f\x20\ -\xde\xb7\x6a\xa2\xcb\x83\x78\x7b\x14\x5e\x8e\x94\xf6\x09\x28\x4a\ -\xe6\xf2\x9e\x1c\xd5\xd6\x09\xeb\x30\x35\x90\xc9\x68\x26\x63\x9a\ -\x96\x43\x01\x98\x76\x2c\x09\x2f\xb7\x40\xc8\xfa\x5f\x95\x63\xa0\ -\xe8\x0b\x95\xd3\x29\x06\x8c\xb0\x40\x12\xe4\xff\x7b\x91\x58\xda\ -\x2b\x73\xaf\x74\x94\xff\x5c\x5d\xee\x28\xe0\xb5\x2a\x5b\x0a\xd9\ -\x9f\xc3\xe9\x88\x90\xd7\xfd\x60\x8a\x42\x5f\x03\xf1\xc1\x5d\x8b\ -\xe8\xfa\xb4\x5d\x04\xf3\xb4\x2e\x00\x7e\x87\x5f\xf8\x6e\x24\xef\ -\x44\x3b\xa0\xf1\x16\x10\x55\x30\x79\x81\x8e\x01\x87\xc6\x8b\x6b\ -\x52\x0e\x64\xa3\x01\xbe\xa8\x5e\xa6\x5e\xfe\xe8\xde\xf7\xa9\x21\ -\x71\x57\x95\x0b\xf1\x5c\xbc\x8f\x61\xfe\xc3\x85\xeb\x53\xb0\xcc\ -\xeb\x23\xa7\x6d\x02\x8a\x76\x2c\xbc\x20\x4f\x41\xe3\x50\x83\xa0\ -\x2a\x19\x93\x0a\xc0\x74\xce\xe1\xf8\x2a\x2e\x7d\x11\xf9\xef\x3b\ -\x68\x83\x65\x33\x53\xa7\xd2\x8c\x01\x84\xd6\x9d\x21\x44\x72\x6d\ -\xaa\xfb\xa4\x64\x3c\x71\xae\xfe\xd3\xae\xa3\xfe\x6a\x86\x09\x0d\ -\x5f\xab\x52\x3a\x1d\x01\x98\x52\x90\xc9\xe7\x40\x7c\xc0\x57\x3a\ -\x42\xa1\xeb\x61\xbb\x08\x2f\x4f\x03\x1e\x62\xd4\x7f\x77\x1d\x13\ -\xc5\x6d\xc2\xf0\x25\xb0\xa3\x42\xbf\xac\x09\x94\xaf\x59\xed\x18\ -\xdd\x58\x25\x98\x00\x98\xa7\xf6\x2b\xdb\xf5\xcc\x45\xbd\x4b\x17\ -\x26\xbb\x5e\x0c\x0f\xe5\xea\x72\x24\x44\xe1\xc8\x55\x5e\xfe\xc8\ -\x45\xfb\x36\xad\x7f\x15\x44\x97\x37\xb5\x09\x6a\x1a\x6d\x13\x50\ -\xb4\xe9\x8b\x79\x31\xca\x4f\x77\x51\xa8\x81\xc2\x14\x66\x5c\x13\ -\x61\xf5\x1d\xc3\x65\x42\x74\x4b\x55\x58\x2f\x22\x78\x8b\x2a\x47\ -\x1b\x50\x2a\x3f\x18\x53\x28\x0c\x28\xd3\x82\x89\x96\x7c\xf5\x8a\ -\xde\xa3\xfb\xe2\xf1\xbf\x93\x4a\xd4\x7d\xfb\x6a\x33\x77\x4a\x95\ -\xd7\xaa\xd0\x94\xfb\x13\x94\xf9\xc0\x0e\x0b\x22\xb4\x8c\xbe\xc9\ -\xdb\xa3\x42\x68\x3e\x60\x74\xfd\xc2\xa3\x95\x13\x7b\x67\x14\xb7\ -\x09\xe3\x64\x19\xc5\xa4\x39\x1b\x02\xdb\x97\x5e\x41\x5f\xe5\x9a\ -\x15\x80\xf6\xa2\xf6\x2b\xdb\x18\x0e\x49\x96\xc7\xbd\x75\x09\xc7\ -\x3b\x59\x67\xdb\x86\x0a\x2f\x7f\xa4\x29\xed\x17\xe6\xa9\xaf\x60\ -\x9e\xa6\x28\x5c\x06\x85\xed\xa1\x28\xbc\xdc\x10\x60\x42\x98\x86\ -\x97\x88\x8d\x2b\xc7\x69\xd8\x13\xd8\x61\xf8\x4a\x66\x9f\xca\x09\ -\x7e\x71\x99\x1b\x08\xc5\x0d\x69\x32\xa6\xa9\x0e\x35\x27\x98\xb7\ -\x56\x2c\x53\xf1\xe2\xf1\xba\x43\x91\xcf\x0b\xbe\xef\x8d\x0e\x17\ -\x46\xe1\x06\x09\x0c\x1c\xe5\x00\x42\xe4\x7c\x64\x9e\x58\xba\xc4\ -\x29\xfc\x45\x2c\x82\x27\x92\x81\x66\x4d\x70\x70\xa1\x74\x5c\xf9\ -\xf7\x56\x78\xad\x0a\x40\x7d\x86\xfa\x1a\x15\x1d\xe0\x95\x84\xcb\ -\xe2\x7a\xb4\x6d\x14\x42\xf3\x01\x1b\xd7\x8a\x01\x29\xb2\x2f\x16\ -\xbe\x77\x6a\xa9\xaa\x63\xa1\xc1\xa4\xca\x2b\xe8\x01\xb4\x15\xda\ -\x0d\x44\xed\xea\xbd\x7e\x51\xef\xca\x85\xf1\xe4\xe9\x51\x1e\x9d\ -\xd4\x4b\x95\x97\x3f\x02\x58\x47\x15\xda\x47\x22\xba\x0c\x15\xb6\ -\x41\xc1\x32\xaf\x8f\x94\x63\x8e\x7b\xf1\xbb\x5f\x78\xfc\x0b\x6e\ -\x79\xdd\x73\x8e\x3f\xff\x80\x80\xe2\x4c\xc4\xc6\xa5\xd7\xfc\x80\ -\xa2\x7b\x5c\x1c\x73\x0e\xb8\x3f\x1b\x41\x63\x55\x12\x35\x2a\x08\ -\xa1\xf9\xb9\xc2\x54\x9f\x8a\x03\x2b\xa5\x9f\x3a\x25\xc8\x47\x8c\ -\x36\x66\xf6\xee\x3d\xc1\x0b\x3a\x69\x00\x09\x82\x08\x4a\xff\x39\ -\x18\x7f\x66\x4f\xd7\x73\xbb\x63\x89\xb7\xe8\x4f\x22\x8d\x05\x8d\ -\xde\x69\x79\xe5\x3f\x78\x7b\x76\x2c\x98\xd0\x4a\x55\xdc\x67\x50\ -\x74\xd0\x82\x70\x50\xf3\x81\x8e\xe2\x47\x2a\x7c\x7d\xda\x36\x8a\ -\xc2\xcb\x25\x06\x8f\xf6\xfd\x04\xfc\xd6\x49\xa4\x76\x6e\x36\x33\ -\x08\x26\x90\xa2\xbd\xa8\xfd\xa8\xad\xbd\x37\x6a\x1f\x3c\x34\x5e\ -\x3c\x4a\x1f\x9d\xbc\x48\x97\xdb\x86\x2a\x2f\x7f\x34\x89\xf6\x91\ -\xf6\xf3\x80\x3e\x97\x44\x97\x35\xb5\x07\x6a\x0a\x7e\x4c\x3e\xe3\ -\xc5\x93\x23\xc7\xbf\x69\x6c\xe7\x11\x07\x04\x14\x3d\xd4\xe0\x9f\ -\xa6\x6d\x0c\xe2\x29\x39\xfe\x9d\xe9\x6f\x18\x36\x19\x06\xf2\x95\ -\x0c\x68\x92\x89\xb0\xfa\x8e\xe1\x9a\xf5\x62\xa1\xe3\xe6\x9e\x2f\ -\x1d\x55\xd7\x6f\xff\x9b\x50\xbe\xcc\xe6\x3c\x67\xb8\x74\xc7\x1d\ -\x0d\x26\xd3\x74\xf6\xb2\x9e\x67\x2e\x48\x26\xfe\x46\x17\x22\x79\ -\x99\x28\x34\x8a\xd0\x7c\xd4\xe4\x85\xf7\xd8\xa3\x85\xec\x65\xff\ -\x5b\xfb\x6b\x55\x50\x38\x80\xf9\xe0\xe6\x41\xc4\x24\xf4\x5b\xee\ -\xbf\x00\x4f\xa7\x31\x57\x6e\x13\x8e\x30\x98\x94\xf3\x2f\x5a\xde\ -\xbb\xb2\x2f\x95\xfc\x0b\xed\x30\x8d\x74\x99\x19\x31\x8b\x97\x3f\ -\x56\xec\x23\x29\x9b\xc4\xdb\x02\x51\x78\x39\x72\x94\x74\xf6\x14\ -\xa4\xe3\xf7\xfb\x63\xc1\x5f\x9a\xd3\xf0\x63\x23\x05\xe5\x8c\x19\ -\x6e\x76\x69\x2c\xda\x1b\x54\xba\x94\xd7\x98\x8c\x42\x55\xab\x61\ -\x41\x00\x2f\x77\x3c\xf0\x1b\x23\x52\x25\xde\xa6\x3b\x14\xf9\x40\ -\xf2\xa4\x18\xd9\xe7\x3b\x8f\xe8\xd9\x91\xb7\x0d\xe5\x40\xff\xd2\ -\x2f\x16\xad\x88\x15\x5e\x12\x13\xfe\x31\xc1\x27\x11\x60\xda\x39\ -\x51\xef\x30\x38\xaf\xfd\xd4\x78\xec\x9a\x59\xbc\x56\xc5\x34\xc8\ -\x2b\x05\x11\xba\x2e\x0a\xdb\xc5\xef\x01\x30\x4f\xeb\xa6\xd1\xc8\ -\xdb\x84\x43\xbf\x34\x62\x22\x0a\x26\x98\x0f\x6c\xfe\xd7\x42\xc4\ -\x96\x8a\xe2\x11\x71\xe5\x9f\xa0\xcb\x75\x11\xa5\x1d\x66\xf8\xf2\ -\x47\xda\x47\x14\xf5\x23\xec\x37\xcd\x73\x41\x3b\x14\x2c\xf3\xfa\ -\x06\x21\xf3\x63\x72\x6a\x6a\x38\x20\xa0\x28\x29\x46\x85\x72\x1a\ -\xf6\x5b\x1b\x35\x40\x8d\x51\xaf\x00\x4c\xe7\x0c\xf0\xfb\x17\x32\ -\x31\xf9\xea\x46\xbd\x78\xb1\xa8\xbc\x91\x47\x0a\xa3\x9b\x4a\xc5\ -\x72\x10\x09\x4a\x9a\xe7\xeb\x81\x7c\x74\x4f\xea\xd8\xde\x78\xf2\ -\x2c\x5d\x8c\x7c\x92\xa3\x44\xd9\x38\xfc\xe5\xb8\xdf\x13\xb7\x7c\ -\x6c\x57\x7a\xe3\x2c\x5e\xab\x02\xe2\x83\xbb\x16\xc1\xf2\xd8\x26\ -\x7e\x07\xc0\xcb\x46\x1a\x7d\x9b\x30\xd8\xb7\xea\x46\xd4\x49\x84\ -\xc1\x04\x52\x0c\xe0\xc5\xe7\x1f\xd2\xbb\xaa\xbf\x2b\x9a\xa3\x93\ -\xa8\xec\x30\x83\x97\x3f\xd2\xfe\x61\x19\xfa\x45\xfb\xca\xeb\x68\ -\x3d\x08\xdb\xe2\x6a\x3a\x4b\xbc\x9c\xde\x22\xc3\xcf\xc8\xea\xbf\ -\x4e\x9b\xbe\x41\x70\x01\x4b\x7f\x2f\x3c\xf3\x50\x09\x6e\xb4\x6a\ -\x02\x30\xa5\x98\xea\x3a\x86\x46\xff\xfe\x05\xec\x8b\x82\x90\x23\ -\xdf\xdc\x2d\x76\x95\xaa\x28\xf0\x7d\xf2\xac\x65\xdd\xcf\x58\xd2\ -\x95\x3c\x5b\x17\x5a\xf6\xbb\x39\x33\x25\xb8\x08\xef\xfb\xf7\x5f\ -\x3a\x9c\xfe\xe9\xb6\x70\xff\x80\x32\x17\x0e\x5e\x1c\xcc\x5c\x78\ -\x94\x42\x8f\x54\xe8\x3a\x28\x53\xdb\x08\xcd\x97\x69\xc4\x6d\xc2\ -\x26\x22\x77\x22\x42\xa3\x82\xc9\x5b\xb4\x6d\x96\xa8\xe2\x91\x31\ -\xdf\x3f\x51\x97\x23\xa1\x5e\x3b\xe8\x0d\xaf\xf5\xe5\x8f\x5c\xbc\ -\xbf\x54\xb4\x8e\x2e\x87\xeb\x02\x34\x8f\xf0\x72\xc3\x70\x7c\xff\ -\x98\xb8\x52\x31\x47\x7f\xe5\x01\x01\xe5\xce\xcd\x62\xaf\x50\xb1\ -\x87\x4a\xc5\xa6\xa0\x44\x70\xce\x9e\x5f\x3f\x41\xd0\x58\x33\x11\ -\x80\xe9\x9c\x22\xbb\x76\x89\xfe\x8b\x35\x76\x4e\xa3\x7e\xff\xc2\ -\x53\xf2\xa9\xfd\x39\xe7\x3e\x72\xfa\x71\x1a\xef\xe8\x13\x03\xcb\ -\xe2\xde\x09\x89\x26\x9c\xcf\x8f\x72\x07\xe2\x45\xf8\x3a\x5f\xab\ -\x82\x32\x05\x11\x93\x70\x7d\xda\x3e\x0a\xa1\xf9\x69\x34\xe2\x36\ -\xe1\x66\xa2\x3b\x16\xfc\x40\x59\xd4\xc1\x04\xd2\x17\xac\xe8\x5b\ -\xd5\xdb\x95\x7c\x85\xee\x58\x5d\x5d\xa3\x1b\x50\x2f\x75\xbc\xfc\ -\x11\xfa\x85\xe2\xfd\xc6\x3c\x15\x6f\x07\xc1\x3c\xad\x6b\x3c\xc1\ -\x9b\x31\x82\x73\x5e\x07\x06\x14\x78\x8b\xad\x6a\xf2\x51\x0a\xb7\ -\x4a\x09\x53\x35\xd6\xd5\x2a\x80\xe6\x3b\x1a\x78\xc3\x6c\x5e\x8d\ -\xbe\x5a\x8f\xa9\x57\x95\xaa\x22\xa7\xe8\x7b\xc3\xb7\xef\x4c\xdf\ -\x59\x2a\x4e\xe3\x79\x42\xc4\x9e\xd7\x9f\x3a\x66\x7e\x3c\xf1\x5a\ -\x5d\x6c\xf8\x1c\x15\xd5\x17\x18\x2e\xc2\x53\x7f\x40\xff\xe0\xe2\ -\x83\x18\x07\x77\x3d\x41\x04\x44\xe1\xe5\x32\x9d\x7e\x9b\x30\x1c\ -\x11\xd2\x1f\x28\x03\xc3\x40\xf5\x54\x12\x80\x79\xb4\x0b\x88\xda\ -\x1b\xc5\xed\xeb\xfd\x8d\xf6\xc3\x25\xaa\x70\x64\x3c\x82\xa3\x13\ -\xf4\xb1\x7a\x7d\x6d\x86\x2f\x7f\x34\xf5\x13\xc4\xfb\x6a\x5a\x06\ -\xd7\xa7\xed\xa1\x5a\x82\xef\x38\xf7\x6d\x49\xf4\x14\x7f\xd5\xbf\ -\xf6\xc0\x80\x02\x28\x3f\xb6\x47\x9b\xb8\xa9\x47\x29\x04\x6e\x18\ -\x6e\xb4\x6a\xa2\xd0\x32\xff\xac\xa3\x80\xd3\x1f\xbe\xd7\x77\xb2\ -\xe3\x34\xee\x17\x10\xe1\x1a\xc3\x98\x72\x1f\xbd\x44\x1c\xf0\xce\ -\xa1\x80\x33\xe7\x77\xaf\x5c\xe6\xa6\x4e\x8f\xe2\x5d\x49\xcd\x02\ -\x9e\x84\xdf\x53\x74\x6f\x64\x17\xe1\x11\xf4\x09\xf4\x1d\x3e\x78\ -\xf9\x00\xaf\x55\xb8\x3e\xb6\x8b\x02\x78\x1a\x42\xe7\xde\x26\x1c\ -\x04\x13\xe1\xdf\xfb\xfb\x4c\xf6\xdb\xe4\x07\xca\x68\x7f\xa9\x0d\ -\x40\xd4\xe6\x28\x6a\x4f\x7a\x74\x52\x7c\xe1\xa1\x7d\xab\x7b\x53\ -\xa9\xd3\xeb\xb5\x4d\x95\x1d\x30\x23\x72\xbe\xb7\x85\xbc\xfc\x91\ -\xc3\xfb\x69\xea\x33\xf4\x0f\x53\x93\xe8\xb2\xd8\x9e\x89\xb0\xfa\ -\x86\x31\x99\x89\x5d\xfc\x84\xec\xf9\xf4\x9f\x9c\xbe\xf3\x42\x26\ -\xa6\xf8\xa8\xf0\xdd\x86\xbc\x12\xdd\x84\x2b\x55\x7f\x8f\xe3\xaf\ -\x2c\x15\x4d\x98\x0c\x18\x66\xd4\xb0\x7a\x20\xac\xbe\xed\x81\xd3\ -\x1f\xda\x52\xef\xd5\x3d\xa8\xfb\xe2\x6c\x18\x45\xe5\x0d\x6f\xc9\ -\xa6\xef\x30\xdd\xe2\x77\x6e\xaf\x18\x58\xdf\x53\x7c\x7e\xca\x85\ -\x97\xba\x36\x8e\x28\x67\xcf\xe0\xfc\x7d\x41\xdd\xf6\xf1\xa1\xcc\ -\xaf\x66\x79\x11\x1e\xc4\x07\x76\x30\xa9\x11\x61\x3d\x5f\x0f\xdb\ -\xa5\xd0\xef\x0c\x05\x6e\xba\x70\xdd\xf1\x37\x76\xe2\x6d\xc2\x34\ -\x98\xc0\x11\x61\x29\x88\xd3\xfe\x52\x1b\x80\xb8\xdd\x40\xdc\xde\ -\x98\x16\xdf\xa1\x27\xa7\xc5\x7e\xe1\x28\xd7\xf7\x9e\xaf\xcb\x75\ -\x11\x95\xaf\x05\x4f\xc4\xe7\xdc\xdf\x93\x97\x3f\xf2\x3e\x72\x85\ -\xf5\x15\x45\x3f\xe7\x32\xb5\x07\x6a\x19\x8f\x3d\x94\xdb\x32\x22\ -\xe3\xdf\xde\x96\x19\xbe\xc3\x7c\x84\x92\xdc\x3d\x2a\x63\xe3\xad\ -\xb8\xd3\x0b\x0d\x13\x66\xac\x6a\x75\xbc\x7e\x4e\x70\xe3\x7a\xb1\ -\x4e\xf9\x99\xf7\x34\xf2\xf4\x87\x36\x56\x2e\x27\x9c\xc7\x3f\x3f\ -\x22\xf0\xee\xae\x32\xcf\x15\x22\x76\x52\x7f\xea\xa8\xf9\xf1\xe4\ -\xab\xeb\xfd\xab\xb0\x1a\x51\xed\xb4\xe0\x22\x7c\xf8\x93\xf0\x34\ -\xe5\xa2\x83\x17\x07\xb8\x29\x80\x98\x54\x69\xc0\x83\xaa\x02\x47\ -\xa2\xee\x44\xef\x89\x4a\x1f\x9d\xe8\x15\x1a\x6a\xeb\x46\x34\x0e\ -\x6f\x6d\xbe\x27\x9d\xbd\x98\x04\x13\x0a\xda\x00\xed\x41\x6d\x8d\ -\xa2\xf6\x9c\x16\x4c\x40\x2f\x58\xd5\xbf\xba\x3b\x95\x7a\x65\xbd\ -\x7e\x58\xd3\xce\xa8\x01\xf0\x33\x78\x22\xfe\x17\xbb\xd2\xb7\xce\ -\xe0\x42\x7c\xa5\x3e\x73\xd1\xe5\x4c\x6d\x51\x78\xb9\x49\xdc\xec\ -\xdd\x73\xcf\xcd\x7b\x37\x6f\xde\x9c\x37\x06\x94\xc9\x4d\x62\x8f\ -\x9f\x73\x5b\x75\xca\xcb\x04\x37\x62\x98\x00\x9a\xef\x78\xe0\xaf\ -\x55\x25\x93\xff\x24\x55\x63\x4f\x7f\xc0\xc5\xf8\xbd\x79\xe7\xfe\ -\xdd\x07\xda\x4e\xbd\x66\xb0\x7b\xc5\xb2\x78\xf2\x34\xed\x2c\xf3\ -\xa7\xaa\x1a\x43\x94\x3b\x0d\x26\xb6\xff\x1b\x9b\x3a\x7f\x5f\xaa\ -\x3a\xa0\x5f\x25\xd1\x01\x8b\x32\x0d\xec\x4a\xe2\xeb\x63\xdb\x54\ -\x08\xcd\x1f\x00\xdc\x74\xa1\x04\xfc\xac\x6f\xfd\x3f\x01\x50\xf1\ -\x8b\x34\xd5\x3e\x9f\x29\xa5\x6b\x55\x3f\x84\xeb\x08\xb3\xfc\xe9\ -\x64\x6a\xd3\x03\x82\xc9\x3b\x85\x48\xcc\x2f\xb4\xd9\xd1\x89\xf0\ -\xb6\x0f\x17\xc6\x6e\xae\xf0\x44\x3c\xc0\xfb\x8c\x79\xda\x5f\x2c\ -\xe3\x32\x5c\xb8\x0e\xb6\x89\x60\x99\xd7\xb7\x04\x63\x40\xf9\x81\ -\x10\xe3\x2a\xe9\x0e\x29\x21\x9b\xfe\x80\xe3\x0c\x00\x03\x86\x19\ -\x77\x4e\x00\x17\x66\x9d\x5c\xd7\x99\x72\xea\x5c\x7a\xc8\xe9\xc9\ -\xfa\xd1\x46\xcb\x4d\x08\xff\xcf\x57\x0d\x8f\xde\x51\xaa\x42\xd4\ -\xdb\x7b\x45\xff\xfa\xde\xe2\x49\x5d\x4e\x74\xb7\x67\x86\x11\xd5\ -\x20\xa7\xaf\xa3\x87\x11\xaa\xa1\x7e\x81\x7e\xc3\xc5\x07\x30\x1d\ -\xec\x61\xe2\xeb\x98\xda\xa5\xf0\xf2\x34\x60\x7f\x7b\x4e\xfa\x65\ -\x7a\x9a\xaa\xfb\xa6\x0b\xf8\xa2\x4a\xf6\xac\xb8\x21\xb3\x00\x82\ -\xc9\xa6\xdc\xf8\x85\x70\xad\x6a\x96\x6f\x6d\x36\xd9\x17\x83\x49\ -\x50\x3e\x71\xf1\xc0\x8a\x54\x22\x75\xaa\xee\x58\xc3\xfe\xb0\x9a\ -\x09\xba\x23\xb9\x09\xe5\x6c\x82\x57\xd3\xc3\x06\x4e\x55\x1d\x90\ -\xd2\x3e\x62\x19\x16\xc7\x3a\xcc\x07\x7d\x64\xc2\x65\x70\x3d\x48\ -\xb9\xda\x0a\xe3\x24\x75\x39\x6c\x68\xd1\x1d\xd5\x7b\xad\x69\xd7\ -\x51\xf4\xb1\x63\xec\x15\x42\x24\x4b\x25\x84\x1a\x8d\x1a\x11\xeb\ -\x00\x9a\x07\xf8\x67\x7c\xf9\x8e\xe0\x6e\x21\xba\x9d\x42\xcf\xeb\ -\x84\x88\x7d\x46\x6f\x7d\xdd\x7f\xad\x56\xc2\x13\xfe\xb6\x6d\x85\ -\xb1\xdf\x5c\xfd\xf4\x8f\x9b\x05\x1c\x27\x84\x7b\x62\x7f\xea\xa8\ -\x05\xf1\xe4\x99\x8d\x1c\xc4\x51\x36\x0c\x77\xdb\x18\x5e\x47\x8f\ -\x60\x19\x7d\x02\x07\x2c\xca\x34\xa8\x41\xe5\xbf\x92\x4b\xe2\x9f\ -\xe3\x60\xc7\x14\x05\xf0\xb4\x02\xe5\x0b\xf1\x75\xff\xf1\x50\x2d\ -\x98\x44\x69\x73\x0c\x26\x9f\x1b\x12\xf7\xd5\x78\xad\x8a\xe6\x4d\ -\x76\xe7\x76\x2e\xbe\x46\x6f\xf2\x40\xaa\xb0\xce\x71\x82\x97\x0b\ -\xb7\x05\x05\xdf\xdf\xf2\x70\x7a\x8c\xfe\x5c\x34\x05\xfb\x48\x85\ -\xfd\x35\xf5\x19\x44\x3f\xe7\x82\xf5\xc3\xa8\xf4\x59\xa3\x99\xe6\ -\x4a\x61\x8e\xab\xa4\xb3\x7f\x58\xc9\xc9\xbb\x4a\xe5\x86\xe3\x4a\ -\xd1\x7d\xfc\xc2\xd0\x67\x2b\x4c\x06\xc3\x9d\x04\xd0\x3c\x60\x5a\ -\xbe\x63\x80\xf3\xe8\xfb\x57\xf6\x9d\x2a\x5c\xf7\x23\xba\x27\xfd\ -\xa5\xea\x86\xa0\x0d\x95\x9b\xf0\x9d\x47\x3f\xb7\x43\xdc\x07\x23\ -\x58\x53\x76\x90\x57\x0f\x76\x1f\x7a\x68\x3c\xf9\x17\xda\x49\x3a\ -\xe2\x54\x57\xe9\x22\xfc\xed\x3f\x1d\xca\x98\x7e\x13\x9e\xa6\x20\ -\xd3\xa0\x05\xd1\x01\x1e\x16\x40\x40\x7c\x3d\x6c\x17\x05\xf0\x34\ -\x94\x66\x5e\x88\x8f\x32\x98\xc0\x93\xe1\xdb\x27\xe3\xbf\x08\x09\ -\x26\x08\x94\x41\x68\x27\x6e\x3b\x10\xda\x75\x5a\x20\x41\xbd\x6a\ -\xd9\xe0\xa1\x7d\x4e\xea\x34\x29\x54\x5b\x3c\x4c\x1b\xbc\xaf\xcb\ -\x73\xef\xfb\xc2\x88\x78\xa4\x54\x45\xfb\x6e\x52\x58\x9f\x31\xe5\ -\xa2\xcb\x99\xda\x03\xb5\x1d\xa1\x7f\x09\x65\x1f\x17\x3b\x45\x3e\ -\x66\x7c\x1e\xa1\x11\x38\x8e\x3b\xb0\x32\x3e\xb0\x4a\x67\xeb\x31\ -\x14\x5d\xb7\x2d\x0d\x5e\x8d\x52\x30\x39\xcd\x71\xe5\x97\x1a\xf5\ -\x6a\x15\x4a\x70\x74\x52\xcc\xdc\xb2\x93\xd9\xeb\x6d\xbd\xa2\x6f\ -\x43\x6f\xf1\xc4\x94\xe3\x3f\xaf\x54\xd5\x10\xa2\xda\x49\xc1\xc5\ -\x51\xe9\x3d\xf8\x87\xc9\xcc\x15\x21\x0f\x2f\x02\x50\xe6\x03\x94\ -\x0e\x5c\x1c\xc8\xd5\x02\x09\xcd\xd3\xb6\x28\xbc\x1c\x0a\xec\xf3\ -\x46\xbe\xfd\xa0\x51\x4c\xfd\x38\x99\xb8\xf6\x13\xc3\xa3\xb7\x84\ -\x04\x13\xc8\x73\x71\x5b\x43\x8a\xb6\xa6\x69\x59\xfa\x30\x5d\x2e\ -\x4a\xe4\x9e\xe1\xba\xc5\x97\xeb\x72\xdd\xc0\x46\xd4\x4b\x41\x79\ -\x3b\x1e\x18\x4f\xdf\xba\xe7\xe9\x7e\x71\xb0\x1e\x84\x7e\x42\xfb\ -\xce\x85\x9f\x71\xd1\x76\x50\x14\x5e\x6e\x29\xa1\x01\x05\xae\xa3\ -\x88\x58\xfc\x51\x7d\xac\xc2\x7f\x45\xb1\x21\xe8\x0d\xe9\xe9\x89\ -\x95\x8f\x50\x4c\x86\xa3\xb4\x95\x11\xa3\x02\x4e\x73\xa5\x0f\xe9\ -\x7d\x2d\x04\x13\x21\xd5\x3a\xdd\xc9\x86\x4e\x2e\x5e\xf0\x56\x54\ -\xf7\x6e\x7d\x74\xf2\xc7\x52\x55\xc0\xb1\xfa\x80\xf1\xf9\x4d\x38\ -\xd5\x05\x44\xd5\x78\x41\xf9\x9b\x1f\x1c\xcd\x5e\x56\xe1\xb9\x07\ -\x2a\x3e\x68\xe9\xc0\xc6\x49\xad\x92\xf8\xfa\xbc\x7d\x10\x42\xf3\ -\x46\x32\xab\x17\xac\x13\x2a\x7e\x56\xa3\xde\x7e\xd0\x08\xca\x3f\ -\xdd\x3b\x34\x6a\xfa\x71\x32\x00\xed\x80\xe2\x36\x03\x99\x6c\x3b\ -\x2d\x98\x40\xdd\x19\xcb\xe7\xaf\xec\x96\xa9\xd3\xf5\x5f\x0d\x75\ -\xbd\x31\x00\x37\xae\x5e\x9f\x83\xbe\xef\xf5\x9d\xdf\x7d\xfd\xe9\ -\x1f\xce\x42\x78\x9f\x41\xd0\x4f\x4c\xb1\xcf\x61\x29\xe6\xb9\x60\ -\x7d\x0a\x96\x79\x7d\xcb\x09\x0d\x28\x70\x1d\xc5\x73\x52\x3b\x95\ -\x88\x35\xe5\xb4\x97\x1e\x4c\xc9\x84\xf2\x07\x4a\x45\x13\x61\xc6\ -\x6b\x3b\xa3\xce\x06\xb8\x20\x9b\x59\xdf\x7d\x8e\x9f\x92\x17\x34\ -\x23\x98\x00\x45\xe1\x6d\xfb\xf3\x44\xfa\x66\x7d\x74\x02\xc0\xf7\ -\x05\xdf\x09\xa7\xba\x56\xc4\x93\x2f\x77\x85\x18\x84\x72\xbb\x13\ -\xbc\x41\x78\xd2\xfd\x35\xdc\xf2\x1c\x72\xab\xaa\x49\x7c\xd0\xe2\ -\x80\xa6\x2a\x4f\x6a\x4c\xb8\x8e\xa9\x5d\x10\x42\xf3\x46\xe0\x8f\ -\x08\xe5\x4f\xbc\x48\xa8\x02\xbc\x68\xb3\x6e\x1a\xee\x34\x1a\xb8\ -\x4e\xb5\xa7\x28\xae\x9d\xc1\xef\xc0\xa3\xbd\x50\xd4\x96\x68\x5f\ -\xb4\xf5\x01\x36\x1f\x48\xe6\x97\x3b\x6e\xf1\x85\x3a\x5f\x17\x60\ -\x1b\xba\x91\xb3\x25\xef\x79\xdb\x7f\x37\x94\x69\xc6\x0f\x67\x99\ -\xda\x02\xb5\x13\xd3\xb6\x27\x34\xa0\x00\xd9\xf8\x93\x3b\x1d\x67\ -\xa2\x29\xa7\xbd\x1c\x47\xf5\xa4\x5c\x55\xed\x2f\xb4\x76\x34\x68\ -\xdd\x40\x30\x89\x39\xdd\x6f\xf1\x95\xfb\x59\x1d\x58\xfb\x75\x07\ -\x1b\x3e\x2f\x78\xbe\x1c\xde\xab\x27\xe1\x2f\xef\x99\xfe\x57\xd6\ -\x39\xbd\xa2\xff\x19\x4d\x38\xd5\x15\x15\x70\x2e\x1b\xdf\x20\x5c\ -\x3a\xfd\x00\x98\x52\x90\x69\xd0\x9a\x06\xf7\x01\x93\x5a\x49\x74\ -\x3d\x6c\x0f\xdb\x06\x51\x78\xd9\xc8\xbe\xb5\x83\xc7\xaa\x58\x74\ -\x6f\x3f\xe0\x5f\x1a\xb5\x23\xe1\x75\xaa\x1f\x0f\xa5\xa3\x08\x26\ -\x28\x53\x20\x09\xf2\x17\xac\x11\xcb\xfa\x9c\xc2\xcb\xa4\x52\x8b\ -\x75\x79\xd6\xc0\x86\x80\x2d\xea\xb5\x07\x1c\x9d\xec\x53\xce\xdd\ -\xe4\x21\x46\x84\xf7\x1b\xc4\xfb\x8e\x82\xfe\xd1\xd4\x24\x6c\x03\ -\xa0\x79\x84\x97\xdb\x02\x93\x13\x97\x37\xf4\xab\x0f\x8b\xd1\x9c\ -\x17\xbf\xbf\x59\xa7\xbd\x62\x8e\x5a\xfc\xa5\x15\x22\xec\xf7\x35\ -\xd0\x1f\xa2\x1e\x23\x2d\x05\x7e\x3c\x49\x8a\xd4\xfb\x21\x98\x68\ -\xcb\x37\xf4\x02\x3c\xa2\x77\x30\xdc\x26\xfc\xa7\x5f\xec\x4c\xff\ -\x76\x64\xaa\x2a\xb0\x2b\x9c\xea\x3a\xb1\x3f\xf5\xcc\xf9\xf1\xe4\ -\x5f\xea\x9a\x86\xd9\x39\xaa\x91\x10\x3c\xbc\x18\xfe\x06\x61\x9a\ -\x52\xd1\x41\x4b\x07\x36\xca\x14\x48\x40\x74\x3d\x10\x6f\x17\xe0\ -\x69\x45\xf0\x87\xb3\xa4\xf0\x8f\x2e\x55\xcd\x9a\xb0\x2f\xac\x69\ -\x43\x6a\x84\xbe\x39\xb8\x86\x97\x6c\x82\xb8\xcd\xb8\x4d\xc3\x02\ -\x49\xb9\xbc\x40\xf5\x2f\x77\x54\x32\x92\xa3\x13\xd8\x80\x7a\x00\ -\x7f\x9b\xf0\xfc\x4d\x97\x0f\x65\x6e\x60\x0f\x31\xd2\x94\xf6\x9b\ -\x96\xb1\x7f\x20\x2c\x9b\xea\xe9\x7a\x28\x04\xf3\xb4\xae\xad\xa8\ -\xf8\x57\xd1\xcd\x7a\xc3\x55\x2c\xbd\x59\xb8\xb9\x6b\x4a\x55\x0d\ -\xc5\x15\xee\xfc\x25\xb2\xef\x19\x3a\x5b\x2d\x70\xd0\xcf\x1a\x36\ -\xf1\x35\x12\xb8\x10\x7b\xc3\x9a\xc1\x93\xe3\xf1\x79\x17\x09\x15\ -\xff\xa8\x76\x91\xa6\x04\x13\x20\xaf\xfc\x47\xef\x1b\x1b\xfb\xf9\ -\x2f\xd9\x6d\xc2\xcd\x3a\xd5\x15\xd5\x0e\xc3\x87\x17\xab\x5c\x84\ -\x47\xd1\xc1\x8a\x79\x3a\x98\x41\x74\x62\x43\xd1\xe5\x68\x1b\x20\ -\x0a\x96\x79\xbd\x11\xd8\xff\xf1\x58\xdf\x89\x51\xfd\x70\x96\xa9\ -\x81\x9a\x36\xa4\x46\xe8\x4d\x0f\x15\x5e\xf6\x48\x85\xb6\x42\x71\ -\x5b\x72\x5b\x63\x20\x29\xd7\x7f\x61\xb9\xe8\xe9\x71\xf2\xcf\x76\ -\x84\x3a\x52\x97\x67\x0d\x6c\x0c\xd8\xa7\x5e\x23\x17\x85\xb3\xf3\ -\xa9\x82\x7b\x3b\xf1\x37\x0a\xef\x3f\xa8\x9a\x0d\xb0\x6c\x92\xa9\ -\xbd\xb6\xa7\x52\x40\x09\x3a\xf0\xb1\xcd\x62\x5b\xde\x8f\xdf\xd0\ -\x8c\x87\x1c\x1d\xa9\x16\xf4\x4b\xff\x98\x77\x08\x51\xe9\x5a\x4a\ -\x25\xa8\xcf\xd4\x3d\x48\x1b\x05\x9c\xe2\x4a\x6f\xe8\x3e\x47\x38\ -\xc5\x9f\x08\xcf\x7b\x99\x6c\xe0\x43\x8b\x1c\x72\xaa\x6b\x8b\x1e\ -\xb9\xe5\x71\xd6\x69\xa7\xba\xe0\x76\xd5\x1d\xf9\xd8\x35\x35\x3c\ -\xbc\xc8\x07\x2a\x1d\xcc\xa8\x69\x13\x99\x41\x74\x7d\xda\x36\xd5\ -\x8c\xc0\x0b\xf1\x7a\xcd\x86\xbd\x9b\x2d\xaa\x01\x10\xfc\x65\x5e\ -\xfd\x65\x8f\x61\xa2\xb6\xe3\x76\x45\xbb\x1b\xed\xbf\x32\x39\xb8\ -\xda\x71\x52\xaf\xd0\x8d\xd4\xd5\x15\x58\x19\xbe\xbc\x1e\xc0\x06\ -\x39\xe5\x3d\x71\xc5\xf0\xa8\xe9\x21\x46\x93\x68\xbf\xb1\xef\x98\ -\x62\xde\x24\xda\x86\x89\xb0\xfa\xb6\xa0\xda\x44\xa6\xee\x81\x0e\ -\xa8\xee\xcd\x42\xc4\xae\x2d\xd5\x35\x94\x98\xab\x16\x1c\x7b\x88\ -\x80\xa3\x94\x6a\x94\x27\x43\x03\x51\x8d\xa5\xc8\xb9\x7e\xf5\x82\ -\xc3\x1d\x31\x78\xbe\x2a\xba\xe7\x4b\x25\x96\xe9\x2d\x6d\xda\xb6\ -\x6a\x4f\xe4\xa7\xba\x02\x8e\xd5\x66\x6f\xc6\xa9\xae\xa8\x80\xeb\ -\x26\xa3\x45\x75\x1b\xdc\xae\x5a\xc3\xc3\x8b\x54\x74\xe0\xe2\xc0\ -\xae\x16\x48\x30\x05\x99\xda\x04\x21\x34\x1f\x4a\xd4\x17\xe2\x1b\ -\x4d\x8d\xef\xe7\x02\xd0\x1e\x68\x2f\x14\xb7\x2b\x0f\x24\xb8\x0f\ -\x30\xf5\xde\xad\xe7\xa6\x5e\x3f\x77\x98\xe3\x79\x2f\xd2\xe5\xba\ -\xa9\xd7\xa9\xf1\x15\x2b\x86\xdf\x3a\x41\xb0\xef\xd8\x7f\x4c\xb1\ -\xcf\x61\x79\x2c\x53\xd1\xb6\x50\x1d\x41\x4d\x7f\x19\xef\x7a\xe2\ -\xa9\x6d\x2a\x3f\xf1\xdb\x52\xb1\xa1\xc4\xa4\xbb\x6c\x59\xbc\xef\ -\xf9\xa7\x0b\x91\xd2\x45\xf0\x83\x30\x21\xbc\xae\xd2\x67\x2d\x03\ -\x8e\x4a\x6e\x58\xdf\xf3\x96\x98\x2c\xfe\x58\xa8\xe2\x9b\xf4\x16\ -\xb9\xa5\x8f\x9a\x06\x3b\xd5\x55\xb6\x4d\x33\x4e\x75\x45\x35\x22\ -\xe8\x75\x93\x88\x1e\x5e\xac\x26\x5c\x07\xdb\xc3\xb6\x41\x14\x5e\ -\x0e\x25\xca\x0b\xf1\x35\x7f\xe9\x2c\x99\xc1\xfb\xb9\xa8\x8d\x50\ -\xdc\x96\x34\x78\x98\x3e\xc3\xbc\xff\xd2\x55\x8b\x56\xc7\x9d\xd4\ -\x69\xda\x46\x75\x8d\x5d\xd8\x20\xdc\xc8\xd9\xa2\xd7\xaf\xf4\x8a\ -\x95\x30\x51\x3b\x50\x5b\x60\x9e\x7f\x4e\xd7\x05\x68\x1e\xe1\xe5\ -\x76\xa1\xbc\x5d\xb5\x38\xb4\xfa\xba\x10\xd9\x62\xaa\xeb\x6e\x25\ -\xdd\x5b\x4b\x75\x0d\x43\x7b\x4f\xaa\x5b\x88\xa3\xdf\xb4\x7c\xa0\ -\xda\x5f\x26\x38\x21\x02\x98\xc7\x72\xdb\x00\x7f\x8d\xfe\xe6\xd0\ -\xfe\xd3\x1c\x67\xde\xe5\xd2\x73\x2e\x94\xd2\x3f\x46\x6f\x65\xd3\ -\x4e\x71\x21\x45\x7d\xb8\xbe\x3d\x9f\xbd\xac\xd1\xa7\xba\xc2\x3c\ -\x3e\xaa\x1d\x53\xe3\x75\x13\x3e\x40\xa1\x8c\x03\xda\x24\x9c\xe8\ -\xa6\x4d\x6a\x4c\xb4\x3d\x10\xc0\xd3\xaa\x44\x7d\x21\x9e\xda\x35\ -\x6a\xe7\x87\x77\xa2\x3d\x91\x1b\xff\x51\x0d\xef\xe7\x42\xfb\x50\ -\x7b\x51\x1b\xa2\x8d\xd1\xb6\xd4\xde\xb4\x1e\x14\x2c\xdf\xe3\x4e\ -\xac\x91\x4e\x51\xff\x5d\x59\x1f\x65\x47\xaf\x83\x82\xf0\x76\x6c\ -\x29\x8c\xdd\x5a\xfa\x03\x06\xfb\x8d\x60\x1d\x0a\xfb\x4c\x35\xad\ -\x6f\xa5\xd4\x24\xda\x0e\x82\x79\x5a\xd7\x8e\x04\xdb\x17\x36\xb1\ -\x4d\xdb\xf8\x7b\xb4\x46\x36\x8f\x3c\xec\xe5\xf3\x3f\x6a\xc6\xb5\ -\x94\x98\x23\x96\x2f\x4a\x14\xff\xe2\x13\x8b\x04\x3c\x39\x0f\xa0\ -\x5f\x84\x09\x09\xab\x47\x4c\x75\x0d\x01\x2e\xba\xde\xb8\x6a\xe1\ -\xb1\xa3\x6b\x07\x2f\x50\x71\x75\x35\x5c\x2b\xd1\xdf\xee\x6a\xc3\ -\x36\x6d\x1b\x10\x4f\xc8\xa7\xf6\xfa\xb1\x6b\x3f\x39\x24\xee\x18\ -\x21\xb6\x89\xfa\x54\x17\x38\x0d\x6f\x24\xca\xce\xce\xe0\xba\x09\ -\xc8\x34\x60\x41\x38\xb8\x51\x7c\x42\xa3\xc2\x75\xb0\x4d\x0a\x2f\ -\x57\xa5\xd1\x17\xe2\x67\xbc\x41\x15\x98\x7a\x0a\x7e\xea\x9d\x68\ -\x35\xbc\x52\x05\x44\x6d\x8c\x02\x1b\x52\xfb\xd2\x20\xc2\xeb\x21\ -\x0d\xd6\xf9\xf1\x5a\xb1\x22\xee\x14\x4e\xd5\x87\xa3\x75\xff\xf4\ -\x31\xdf\xe0\x99\xa2\xd7\xcf\x4d\xf8\xee\xa3\xff\xa9\x83\x6a\xa9\ -\x0a\xc1\x7e\x03\x98\x87\xed\xc7\x94\xda\xa0\xdc\xb7\x52\x6a\x12\ -\xb6\x41\xd5\x71\x54\xfb\x4b\x19\x3b\xa5\x3e\x03\x47\x29\x6e\xcf\ -\xed\x4a\xc4\xae\x2b\xd5\x35\x0c\xfd\xa5\x32\xe1\x38\x87\x3d\xbb\ -\xb7\xef\x75\x67\x56\x3f\xf5\x45\x05\xf0\x3c\x42\xf3\x0d\x03\x03\ -\xc9\xfe\x35\xf3\x2f\x10\x6e\xee\x37\xc1\xe9\x2d\x3d\x71\xeb\x6f\ -\x6f\xca\xf7\x73\x20\x98\xec\xf6\xe4\xcf\x3e\x3c\x94\xfe\xa5\xfe\ -\x0b\x8b\x12\xf9\xa9\x2e\x53\x07\xa3\x1a\x15\x35\x5c\x37\x31\x89\ -\x0e\x58\x1c\xd8\x28\x3e\xa9\x81\x70\x39\xba\x9e\xa9\x5d\x10\x42\ -\xf3\x15\x69\xe4\x85\xf8\x9a\x37\xa2\x06\xca\x0f\x2e\x0e\x65\x6a\ -\x79\x0a\x9e\xda\x0a\x45\x6d\x0a\x32\xd9\x1a\xeb\x21\xa5\xeb\xf9\ -\x03\x7e\xff\x1a\x51\x4c\xbe\x52\xe7\xeb\xa6\xde\x41\x07\x47\x27\ -\x5b\x0b\x99\xdf\x95\x82\x2a\xb5\x01\x40\xed\x80\x82\x7e\x60\x7a\ -\x40\xdf\x4a\x29\x0a\x97\xa5\xeb\x51\xb0\xcc\xeb\xdb\x15\x55\xd3\ -\x29\x2f\xf8\x07\x7e\x1c\xe5\x81\x2d\xbb\x1f\x2b\xfa\xb9\x5f\x36\ -\xe3\x28\x45\x3b\x42\xaa\x57\xc8\x17\x9d\xbb\xb2\xef\x3d\x1f\x5e\ -\x54\x1e\x80\xe0\x1f\x26\x41\x3f\x50\xb4\x1e\xa0\x79\x80\xe6\x23\ -\xe3\x96\x55\x62\xd9\x8d\x6b\xba\xfe\x61\xff\xba\x79\x37\xeb\x40\ -\x72\x87\x14\x85\xb7\xea\xea\x01\xfd\x6d\xb5\xd8\xb8\x21\xe8\x89\ -\x61\xef\x5e\x4f\x5e\xfd\xd1\xa1\xd1\x2b\xb6\x14\x83\xfd\x88\xb6\ -\x90\xcd\xb8\xab\x2b\xaa\x51\xa0\xdb\xc9\x65\x85\x7f\xe7\x2c\xaf\ -\x9b\xd0\xc1\x8b\x79\xd3\xe4\x86\xa2\xeb\x62\x9b\x54\x14\x5e\x0e\ -\xa5\xd1\x17\xe2\xa3\x72\xea\x59\x3c\xb8\x88\x42\x9b\x99\x6c\x8a\ -\xc2\xc0\x82\xe2\x9f\xfb\xdf\xd7\xe3\x3e\xee\x15\xd7\x39\x8e\x5a\ -\xad\xcb\x75\x01\x1b\x55\x0f\x7a\xfd\x6a\x47\x27\xb4\xdf\x5c\x41\ -\x7f\x4a\x29\xcd\xd3\x65\xa8\x00\xda\x2e\xa8\xe3\xa8\x75\xb2\x0b\ -\x3a\x78\x81\x10\xf9\x8c\xcc\xfe\x41\xc9\xdc\x0f\xa6\xaa\x1b\x8b\ -\x94\xaa\xaf\x2f\x26\x5e\xf1\xfc\xde\xde\x7f\xf8\xc8\x62\xb1\x0c\ -\xaa\x0c\xe2\x41\x84\xcb\x44\x58\xfd\x8c\x80\x49\xe2\xe6\x65\x83\ -\x27\xdf\xb0\x6e\xfe\x05\x85\x78\x9f\x2e\xc6\xbe\x2c\xfd\xe0\x27\ -\x72\xe1\x88\xa4\x65\x81\x04\x50\xbe\xcc\x8e\x15\xd5\xef\x2e\xdf\ -\x31\x7a\xe5\x13\x30\x74\x89\x3d\x9a\xf5\x00\x63\x54\x0d\xe7\x7d\ -\x7f\xd3\xef\x33\x35\x3f\x6f\x82\xe2\x03\x16\x07\xb6\x69\x22\x03\ -\xd1\x65\x20\x8f\x6d\xd0\x36\x01\x9e\xd6\x44\x27\x5c\x88\x0f\x6e\ -\x78\x50\xfe\xbd\x75\x3c\xb8\x08\xa2\x36\xa5\xc1\x83\x8a\x2e\x03\ -\x82\xf5\x82\x36\x97\xad\x5a\xb8\x56\xc6\x92\xa7\xeb\x42\xdd\xee\ -\x53\x6f\x03\x35\x1c\x9d\x20\xf8\x39\x08\x6d\x40\x6d\x41\xeb\x4c\ -\xc2\x75\x4d\x84\xd5\xb7\x25\x95\x9c\x9b\x77\x44\x6d\xd6\xfa\xd2\ -\x13\x62\x5b\xce\x4b\xfe\x5c\xff\xf5\xfb\x70\xa9\xbe\xd1\xc4\xbb\ -\x84\x7c\xe1\x29\xbd\x7d\x5f\xb9\x7c\x55\xff\x5f\xff\xf3\xd4\xab\ -\xd4\x61\xbb\x51\xe0\x37\x33\x11\x42\xf3\x35\x73\xd3\x61\x62\xe1\ -\x6f\xd6\xf6\xbe\xee\x86\x35\x0b\xbe\xb2\x7f\xcd\xc0\xef\xbd\xae\ -\xe2\x6f\xa4\x5f\x38\x57\xbb\xc5\x72\xdd\xa2\xab\x35\xab\x76\xa3\ -\x04\x82\x49\xc6\x53\x37\x5c\x32\x9c\xf9\xde\x2f\xbd\x69\x77\x74\ -\x01\x4d\xb9\xab\x2b\x2a\x4a\x3f\x96\xf5\xcb\x59\xbe\xf4\x11\x84\ -\x83\x1a\x64\x9a\xcc\xa8\xe8\x7a\xf8\x3d\xd8\x36\xc0\xd3\x9a\x68\ -\xe4\x85\xf8\xa8\xc0\x67\x4d\x6e\xcf\x8e\x5d\x34\xcb\x07\x17\x41\ -\xd4\x96\xd5\x6c\x8d\xa2\xeb\x2b\xc7\xcd\x2f\x15\x8e\x77\xbc\xce\ -\xcf\x1a\xba\xd1\xb3\x45\xb7\x31\x93\xa3\x13\x9a\x47\xd1\xbe\xf1\ -\x7e\x82\x68\x3b\x26\x01\x98\x76\x0c\xd5\x7c\xb3\x3c\x09\x69\x95\ -\x27\xf1\x4f\xe8\xc3\xd2\xe7\xae\xea\x7e\x5d\xca\x8d\x7d\x4d\x0a\ -\xd5\x0d\x0b\x34\x03\xed\xf4\xfa\x88\x5c\x0c\x8f\x29\x79\xd9\x5d\ -\x4f\xa4\xaf\xf8\x9c\x10\x4f\xe9\xea\x42\x49\xf4\x2f\x20\x74\xe6\ -\x4a\x3b\xaf\x26\x6e\x5a\x2d\x06\x3c\xb7\xff\x44\xe1\xc7\x4f\xd7\ -\xcd\xbe\xc8\x91\xde\x33\x95\x92\x41\x20\x93\x3a\x78\xe8\x86\x1a\ -\x31\xbe\x67\x0d\x0f\x26\xda\x10\xb0\x7d\xe5\xfd\x08\xa7\xba\x4e\ -\x1b\x4c\xbc\x72\x51\x2c\xf9\x56\x5d\xdb\x90\x6d\x07\xe3\x46\xd1\ -\x30\x9c\xcb\xdf\xed\x89\xab\xff\x75\x5b\xe8\xa9\x2e\x2a\xdc\xd7\ -\xb8\xdf\x21\xa5\xbe\x60\xf2\x11\x14\x7c\x8e\xaa\xc5\x67\x68\xbe\ -\x22\x70\x4d\x6d\x74\x5d\xdf\x19\x3a\x7b\xbe\x5e\xab\x61\x0f\x31\ -\xd6\x0b\x1c\x05\xde\x97\xce\x7e\xe7\x33\x23\xe2\xe1\x90\xdb\x83\ -\xa9\xd0\x46\x28\x6a\x3f\xb4\x27\xb7\x31\x8a\x2e\x0b\xc2\x36\xd4\ -\x15\xcb\xc5\x92\xde\x44\xea\xbd\xd2\x89\x7f\x40\x97\x67\x0d\x6c\ -\x60\xbd\xfe\x07\xb7\x4b\x3f\x9c\x1b\xff\xfe\xfb\x86\xc4\x7d\xba\ -\x08\x4d\x22\x61\xfd\x87\x14\xfb\x88\xbe\x16\x36\x37\x81\x68\xff\ -\xb1\x4d\xfc\x1e\x9e\x76\x0c\xd5\xec\x5e\x9e\x88\x4a\x0a\x02\xca\ -\x0a\xad\xff\x5a\x24\x56\x2c\xea\x49\xbe\xd7\x75\x12\xff\x0f\x16\ -\x68\x26\x10\x58\xf4\x96\x8c\x7b\xd2\xd9\x9c\xf7\xd4\xef\x47\xb3\ -\xe9\x1b\x6f\x7b\x4a\xfc\xe9\x7c\x21\x60\x2c\xd0\x1d\x86\x3b\x1b\ -\x76\x0c\x17\xa2\xae\x17\xa2\x3b\xb5\x40\xac\x2c\x0e\x8a\xf5\xc2\ -\xef\x3a\x52\xa8\xae\xf5\xc2\xf1\x8f\x54\xd2\x5b\xed\xf8\x6a\x91\ -\xd2\xb1\x43\xaf\xe1\xb4\x63\x00\xa1\xc0\x35\x93\xfd\x7a\x02\xfe\ -\xd1\x50\xfa\xe7\xa6\x60\x02\xff\x7c\x79\x51\xd7\x31\x47\xf4\xc4\ -\xfe\x5f\xcc\x09\x4e\x21\xb6\x2d\xda\xce\xb9\x31\xa5\x6e\xfd\xde\ -\xb6\xb1\x6f\xc3\x5f\xcc\x4f\x57\x4f\x4b\xe9\x60\x44\xe1\x40\x05\ -\xa1\x2f\x54\x12\x2e\x87\xeb\x62\x9b\x5c\x08\xcd\x57\xe5\xa6\xd5\ -\x0b\x0e\xf7\x1d\x75\x9e\x9e\x57\xe0\xe6\x8c\xc8\x80\x8d\x88\xca\ -\x11\xe1\x28\xf0\xf1\xfc\xf8\x0f\x3e\x3e\x24\xee\xac\xf2\x82\x4d\ -\xb4\x0d\xb5\x35\xa6\xd4\x96\x26\xd1\x65\x50\xd8\x0e\xb4\xa9\xae\ -\x5f\x37\xff\xf8\x98\xf2\xbe\xa8\xab\xea\xba\xae\x07\x8d\xd5\x63\ -\x1b\xbd\x7e\x2e\xed\x8b\x9b\xde\xbd\x25\x73\x3e\x3b\xdd\x85\x79\ -\xdc\x6e\x14\xf6\x07\xfb\x4a\x03\x09\x4f\x71\xb9\x03\xfa\x4f\x04\ -\x60\xda\x51\x54\xb3\x3b\x9d\x8c\x50\x41\x50\x39\x46\x08\xf7\x63\ -\xab\xe7\x1d\x3f\xcf\x15\x9f\x76\x54\xcb\x7e\x96\x53\xe9\xe0\xa2\ -\x0d\xaf\x8f\x19\x60\xca\x87\xb1\x21\x9d\x9d\xca\x77\xb6\xe9\x2d\ -\x0d\x76\x88\xde\xe0\x20\x85\x85\x20\x05\x74\x54\x88\xeb\xfd\xb8\ -\x4c\x4a\x3f\xb8\xf0\x07\x9d\xd2\x1f\xea\x26\x4a\x2d\x4d\x55\xc1\ -\xdf\xef\x90\x76\x04\xf0\x4a\x95\x27\x73\xe2\xc7\x9f\xdc\x9d\xbe\ -\x1e\x2e\xc0\x6b\x8f\x7d\xba\x1f\x53\x12\x1f\x9d\xdf\xbd\xe2\xf8\ -\xbe\xc4\x5f\xf7\xba\xde\x8b\xa1\xdc\xce\xe4\x7c\xff\xfe\x9b\xc6\ -\xb2\x5f\xfb\xe2\x81\xa7\xba\x68\x8a\x83\x91\x0f\x6c\x1c\xb4\x26\ -\x99\x06\x36\x08\xdb\xc0\x36\x51\x00\x4f\x6b\x02\xae\xb1\xa5\x57\ -\x76\xbf\x45\xb9\xee\x37\xf4\x1e\x80\x71\xd3\x76\xc0\xed\xc1\xbb\ -\x8a\xea\x8a\x0f\x6e\xcb\x5c\x55\xe5\x86\x07\xb4\x0b\xb5\x13\xda\ -\x8e\xda\x12\xed\xcc\x45\x97\xc1\x75\xb1\x4d\xf5\x7d\x3d\x9f\xac\ -\x5c\xd9\xf3\x46\xe1\x3a\x17\x69\x5b\xb5\x74\xdc\xcd\xe2\xe8\x04\ -\x05\xfd\xa3\x01\x84\x07\x13\xec\x3f\x0a\xfb\x8f\x29\xc0\xd3\x8e\ -\xa2\x96\xa7\xb5\xe9\xce\x2d\x4f\x50\x3a\x72\xcb\xc5\xfb\x27\x47\ -\x56\xf7\xb8\xfb\x62\x8e\x73\x82\x9e\x86\x67\xfb\xfe\xad\x7a\x08\ -\x4e\x3b\x69\xf4\x60\x0d\x14\xd7\xff\xcc\xd3\xb1\x64\x35\xd1\x1a\ -\x83\x56\x39\x12\xae\xc5\x48\xdd\xff\xb2\xa6\xda\x80\x81\x3f\x15\ -\x4a\x5a\xea\xd4\x33\xa1\x20\xfc\x47\x1f\x2d\x8c\x9d\xff\xd9\xe1\ -\xdc\xef\x1f\xd7\xae\xa9\xff\x87\xc9\xab\xbc\xaf\x60\x99\xb3\x7a\ -\x45\xf7\x0b\x07\x9c\x93\xe7\xbb\xce\xeb\xda\xbd\x6f\xc1\xcf\xca\ -\xe6\x9d\x2b\x3f\xfb\x64\xee\xc1\xd2\xdb\x2b\xf9\xe0\x82\x32\x0a\ -\x06\x23\x17\x1d\xb4\x54\x38\xa0\x71\x19\xbe\x1e\x6d\x17\x04\xf0\ -\xb4\x66\xde\xb8\x76\xf0\x79\xd2\x71\x3e\xa1\xff\x82\xa9\xfb\x54\ -\x17\x7c\x79\xd4\x3b\x4d\x1f\xd1\xa6\xf7\x15\xc5\x0d\x1f\x1d\xce\ -\xfc\x6c\x7b\xf0\x87\x59\x00\xef\x27\x94\x51\xd4\x56\xd4\xae\x28\ -\x9c\x34\xa9\xe8\xe7\x74\x5d\x48\xcb\x6d\xbf\x73\xad\x58\xed\x3a\ -\xf2\x2d\x52\xc6\x8e\xd5\xe5\x96\xa1\x37\x26\x97\xf5\x9d\x7b\x3e\ -\xb4\x3d\x7f\x75\xb6\x54\x57\xa2\xbc\xad\x4c\xb4\x3f\xd8\x5f\xda\ -\xf7\x30\x1b\xd0\x36\x10\xcc\xd3\xba\x8e\x02\x26\x9e\x99\x40\x8d\ -\xa0\x7e\x2a\xc4\xe4\xcd\x3b\xb2\xbf\x9e\xf0\x8a\x9f\xd2\x15\x61\ -\xef\xb8\x69\x2a\x7a\x3b\x30\x1c\x54\xfc\x2f\x58\xae\xc3\x81\x0b\ -\xa9\x93\xca\xbf\xfb\xae\x74\xf6\x7f\x3e\xbb\x43\xfc\xf1\x89\xa9\ -\x6a\x0c\x22\xb4\x7f\xea\x84\xee\xae\xd5\x0b\x9c\xe4\xcb\xa1\xef\ -\xa5\xba\x48\x01\x87\x88\x02\x98\xe4\xf0\x79\x93\x2a\x3f\x96\x85\ -\x03\x93\x8a\x0e\x5c\x2e\x3e\xb0\x51\xb0\x1e\x6d\x97\xc2\xcb\x35\ -\xd3\x88\x0b\xf1\x51\xee\xb8\xd2\xed\xc1\xb7\xc2\xad\xd8\x35\xdc\ -\x1e\x4c\x6d\xcc\x05\x36\xa4\x93\x27\xb7\x33\x2f\xc3\x3a\xb4\xed\ -\x40\xf1\xe2\xc0\xa1\xd2\x4f\x9d\xa2\xf3\xb3\x06\x1b\xab\x87\x19\ -\x3e\x77\x82\x36\x80\x3c\xf6\x0d\x53\x9e\x07\xf1\xf5\xa9\xe6\x04\ -\x33\x09\x28\xd8\xe9\xb2\x11\xc0\xe8\x17\xe9\x88\xbe\x39\x3f\xbe\ -\x31\xef\x14\x3e\xad\x2b\xdb\x22\xa8\x1c\x0c\xc0\xc5\xf7\xac\xa7\ -\x6e\xb8\x2d\x9b\xfd\xea\x97\xf6\x88\x2d\xc3\xe6\x40\x02\xa8\x7f\ -\x9f\x2f\x96\xad\xef\xf6\x5e\x96\x88\xe0\xde\xfe\x30\xa2\x98\xec\ -\x20\x40\xce\xe0\x3d\x5d\x54\x74\xf0\x42\xca\x45\x27\x35\xba\x2c\ -\x95\xa9\x5d\x84\xe6\xab\x02\x17\xe2\x1b\xf1\x44\x3c\x6c\x64\x14\ -\x04\x7f\x88\x54\xfe\xfd\x7d\xec\x3f\x88\xda\x06\x6d\x85\xb6\xa4\ -\xa2\x36\x36\x05\x16\x10\xae\x4f\xdb\x54\x97\x09\xd1\x15\x17\x85\ -\xf5\xd2\x51\x6b\x74\x79\xd6\x98\x9c\x7f\x26\xe8\x8d\xa9\xe5\xce\ -\x2e\x2e\xda\x27\xec\xa3\xa9\xbf\x54\xb8\x2e\x05\xcb\xbc\xbe\xa3\ -\xa8\x25\xa0\xd0\x0e\xa2\x21\xca\x82\x8b\x78\x5f\xdb\x25\xf6\xed\ -\x18\x9b\xbc\xb2\xe0\xe5\xbf\xa7\xeb\x2c\x0d\x06\x2e\xbe\xef\xf3\ -\xc5\x4f\x2f\x1d\x1a\xfb\xdf\xaf\x3f\x25\x9e\x24\xaf\x53\x39\x60\ -\x3c\xbd\x52\x88\xe4\x11\x89\xe4\x51\xbd\x4e\xf2\xc5\x7a\x87\xd5\ -\x33\xde\x02\x60\xa7\x37\x0a\xf8\x5d\xf8\x3f\x67\xc6\xae\x9c\xc1\ -\xf3\x26\x7c\xa0\xe2\x40\x46\xf1\x89\x0d\x97\xa1\xeb\xf0\x36\x41\ -\x14\x5e\xae\x4a\xa3\x9e\x88\xaf\x7b\xe7\x95\x30\xfc\xfe\x3e\x85\ -\xdb\x02\x44\xed\x85\x42\xfb\xa2\x6d\xb1\x5c\x2d\x90\x80\xa6\xb5\ -\x3f\x6f\xad\x58\xe6\xc5\x8a\x27\xe8\x42\x54\x5d\x9c\x15\x45\xe5\ -\xed\xdc\x59\xc8\xdc\x55\xc7\xd1\x09\xc8\xd4\x5f\x10\xae\x43\xdb\ -\xa0\x9a\x13\xcc\xf4\x94\x17\x42\x0d\xe1\x3f\xae\xf5\xe9\x5d\x62\ -\x78\xa7\xc8\x7d\xaf\xe0\xe4\xbe\x0f\x0b\x58\xa2\x27\xf8\xcb\xd2\ -\xf7\xff\x78\x5f\x3a\xfd\xc9\x0f\x0d\xa7\x7f\xf8\x73\x4f\x4c\x8e\ -\x4e\x7d\x64\x0c\x26\xc0\x4b\x17\x77\xad\x5b\x9e\x4a\xbe\x46\x7f\ -\xd8\x55\xaa\x9a\x35\xb0\xb3\xf9\x97\x44\x35\x12\xe8\xef\xc2\xc3\ -\x88\xd4\xd0\xa6\xd1\xd7\x50\x7c\x90\x82\x70\xf2\xaa\x26\x5c\x1e\ -\xd7\xe7\x02\x78\x5a\x33\x70\x21\xbe\x9d\x5f\x4d\x3f\x75\x7d\x2a\ -\x76\x15\xfb\xfd\x7d\x53\xbf\x41\xd4\x56\x28\x6e\x4f\x0c\x22\xa6\ -\x40\x02\xc2\x75\x20\xc5\x76\xa9\x84\xeb\xd5\x7f\xba\xab\x5e\x60\ -\x6c\xe5\x94\xb3\xfd\xda\x99\x1f\x9d\xf0\x3e\xf2\x3c\x15\x5d\xd7\ -\x44\x58\x7d\xc7\x50\x6b\x40\xc1\x8e\x52\x83\x4c\xd3\x36\x6d\xb0\ -\xff\xde\x2a\xb6\x6e\xc9\xe5\xcf\x2f\xc8\xdc\x85\xba\xce\x12\x21\ -\xc1\x51\x89\x27\x7f\x70\xd1\xf6\xec\xc7\xff\x7b\xaf\x78\x78\xb3\ -\x1e\xbe\xfa\x7f\xd8\x7f\x61\xc1\x44\xfd\x7d\xaf\x98\xb7\x32\xee\ -\x1d\x1f\xaf\xf3\x54\x02\x62\xfa\x12\x53\xdd\x4c\x81\xf3\xf9\x63\ -\x45\x75\xcf\xcf\x76\xa5\x6f\x25\xb7\xad\x22\xd4\xcf\xe8\xa0\xc4\ -\x41\x0a\x83\xd7\x24\x3e\xc1\xd1\x65\x71\x5d\x6c\x8b\x82\x65\x5e\ -\x5f\x13\x51\x3f\x11\x1f\x85\x7d\x11\xed\x43\x23\x23\x9e\xfa\x0d\ -\x5c\x9f\xaa\xe1\xf7\xf7\x51\xd5\xec\x6c\x12\xb5\x3d\xb5\x35\xb5\ -\x39\x48\x5c\xaf\xff\xd0\x51\xaa\xb0\xa1\xde\xd3\x5d\x41\x63\x75\ -\x10\xfc\x1a\x63\xde\xfd\xc3\xb5\x53\x3f\xed\xc0\x9b\xa3\xdb\x0c\ -\xe2\x7d\x42\xd1\xfe\x9a\xc4\xdb\x41\xcd\x19\xea\x71\x7a\x6a\x90\ -\xc0\x60\x0f\x6b\x83\x7e\x7e\xbb\xd8\xfa\xc7\xb1\xfc\x17\xc7\xfd\ -\xfc\x7f\xeb\x0f\xec\x35\x95\x3a\x09\x8e\x4a\x84\xff\xc0\xa6\x42\ -\xfa\xbf\xf0\xa8\xe4\xa9\xa7\x83\x08\x8a\xa3\x9e\xab\xf7\xed\x73\ -\xfb\x52\xcf\x9c\x97\x4c\x9d\xa9\xf7\x43\xdd\xf3\x12\xec\xe4\x46\ -\x51\x10\xde\xe6\xe0\x7c\xfe\xd3\xfe\x82\x5f\x47\xbf\x16\xf2\x20\ -\x3a\x40\x71\x00\xe3\xe4\x85\x0a\x0b\x26\x74\x5d\x6c\x8f\x6b\xd6\ -\x6c\x3c\x52\xac\x74\xdd\xf1\x37\x46\x79\x21\x1e\x36\x34\x0a\xe8\ -\x3b\xba\x0c\xd7\xa7\x10\xb4\x01\x88\xda\x8a\x0a\xed\x6b\x12\xb5\ -\x37\x15\xb6\x47\xdb\x07\x94\x5a\x27\x96\x89\x08\x4e\x77\xd5\xeb\ -\xe0\x45\xbf\xf8\xd4\xdd\xc3\xa3\xf7\xc3\xc6\x13\xe8\xf6\x72\x41\ -\x7f\xb0\xaf\xb4\xcf\x61\xfd\xa7\x32\x11\x56\xdf\x51\xcc\x24\xa0\ -\x60\x87\xa9\x61\xb8\xfc\xcd\xda\xa0\x5f\x7a\x52\x3c\xf9\xc7\x5c\ -\xee\xc2\x09\x51\xf8\x2f\x5d\x67\x83\xca\x2c\xd1\x7f\x51\x8e\x8e\ -\x16\xc4\x15\xbf\xde\x9a\xfd\x0f\xb8\x8b\x4b\x1f\x95\xf0\xe7\x4b\ -\x38\xe5\x7d\xf1\x86\xa5\xdd\xab\x97\xa5\x92\xaf\x72\x22\x78\x93\ -\x01\x34\xc8\xbf\x0c\xea\xa2\xa0\xca\xab\x55\x00\x28\xd3\x41\xc9\ -\x07\x2b\xac\x56\x8b\xe8\x3a\xd8\x16\x17\x42\xf3\x35\x01\x17\xe2\ -\xdd\x89\xde\x13\x95\x9f\x38\x47\xaf\x5c\xef\xfc\x56\x6e\xa0\xee\ -\x86\x34\xb3\xb8\x08\xcf\x65\xb2\xa7\x49\x34\xa8\x80\x70\x7d\xda\ -\x3e\x12\xe4\xe3\xc5\x81\x95\xad\x3e\xdd\x05\xcf\xe2\xec\x53\xce\ -\xdd\x97\x08\xb1\x5f\x17\xe9\x36\x02\x74\xdb\x41\xb4\x4f\x98\x07\ -\xf1\x3e\x73\xf1\x76\x50\x73\x8a\x7a\x0f\xcb\xa9\x61\xd0\x68\xfe\ -\x93\xda\xb0\x5f\xdd\x29\xf6\xdd\x34\x34\xf9\xa3\x74\xb6\xf8\x21\ -\xe5\x3b\x43\xba\xde\x52\x23\x30\x01\x14\x94\xff\xe7\x2d\xf9\xf4\ -\x17\x3e\xb2\x2b\xf3\xed\xef\x78\x62\xb4\x74\x17\x57\xc5\x53\x5c\ -\x25\xf9\x7f\xd7\x2b\x7a\xd7\xc4\x8b\xc7\xa7\x84\xff\xec\xe0\x93\ -\x3a\x31\x7d\x59\x14\x13\xdd\xd4\x2d\xc2\xb1\x3b\xe1\x37\x37\x4a\ -\xe7\xf3\x61\xfb\x11\xec\x4f\xb9\x5f\x25\xd1\x3c\x9d\xbc\x50\xa6\ -\x49\x0d\x53\xba\x3e\x6d\x9b\xc2\xcb\x35\x91\x5d\xbb\xe4\x70\x25\ -\xe2\x6f\xd1\x6b\xf7\x95\xaa\xda\x06\xc3\x45\x78\xda\x47\x6a\x07\ -\x6a\x17\xb4\x17\x0a\x56\xc5\x23\x11\x93\xd0\xde\xd4\xd6\x20\x6c\ -\x0f\x29\x97\xe1\x0d\x15\x51\x9c\xee\xaa\x97\xbc\xe7\x6d\xff\xdd\ -\x50\xe6\x56\xf6\x0a\x75\xdc\x4e\x93\xd0\x1e\x34\x0d\x13\x5d\x07\ -\x52\x13\x61\xf5\x1d\xc7\x6c\x03\x0a\x1a\x89\xab\x6c\xc8\xdd\xda\ -\xc9\xbe\x99\x13\x99\xcb\x9f\x9c\xb8\x6a\xa7\x57\xfc\xb7\xa2\x70\ -\xee\xd0\xf5\x96\x2a\x04\x4f\xbc\x4f\xca\xff\xfd\xfe\xb6\xec\x87\ -\xce\x1b\x12\x77\x3c\xac\x87\x6a\xf6\xe9\x20\x82\xe2\x4c\xdb\x07\ -\xcf\xee\xee\x5a\x3d\xe8\x26\xeb\xfe\xf9\x54\x13\x51\x35\x08\x41\ -\xd3\x70\x8b\x30\x42\xfb\xc3\x85\x3e\x46\x27\xb0\x30\xe1\x72\x65\ -\xbf\xd4\xa2\x6d\x21\x98\xa7\x75\x35\x03\x3f\xef\xec\x39\xe9\x97\ -\x69\x97\x7f\x55\xa9\xaa\x6d\x08\xb9\x08\x8f\xd0\x7e\xa3\xa8\xad\ -\xb8\x3d\xab\x89\xae\x47\xdb\xe4\x0a\x88\xad\x17\x4b\xa3\x38\xdd\ -\x55\x0f\xf0\x47\x4d\xc6\x77\x37\x5f\xe2\x05\x47\x27\x1c\xbe\xdd\ -\xd8\x3f\x9a\xc7\xfe\xd2\xfe\x73\xc1\xf2\x00\x6d\x8b\xd6\xcd\x19\ -\x66\x1a\x50\x78\xe7\xa9\x71\x50\x65\x43\xea\x88\xef\x5d\x21\xc4\ -\xc4\x67\xb7\x67\x6f\x7b\x30\x3f\xfa\x81\x09\x99\xbb\x48\xd7\xdb\ -\x53\x60\x06\xe0\x87\xb0\xf6\x78\xce\xf7\x7e\xb5\x3d\xfd\xfe\x8f\ -\xec\x4c\x5f\xf3\x33\x4f\x4c\xe8\x89\x16\xc0\x20\x62\x1a\x74\x07\ -\xd8\xfc\xc3\x0b\xc4\xb2\x15\xdd\xde\x4b\x5d\x47\x2c\xd7\xe5\xba\ -\x80\x86\x39\xf0\x25\x51\x50\xe1\xa7\x7c\xe9\xd7\x4e\xeb\x5b\x49\ -\x74\xf0\x62\x1e\x45\xff\x52\xc6\xcf\xe9\xba\xd0\x1e\x6f\x9f\x96\ -\x67\x85\xf4\xe6\x1d\xab\x8a\xed\xf7\x6a\xfa\xa9\x23\xc0\xa9\x87\ -\x44\x6b\xb8\x08\x4f\xed\x44\x85\xf6\xac\x55\xb0\x0e\xb6\x87\x6d\ -\x53\x21\xca\x17\xf3\x17\x49\xd1\xf5\xcc\x52\xb9\x25\xc0\xad\xc2\ -\x5b\xb2\xe9\x3b\x4b\x47\x27\xb8\x7d\x07\x6c\x2b\x13\xb5\x0d\xe6\ -\x4d\xe2\xeb\xcd\x79\x6a\x79\xf5\x8a\x09\x9c\xdc\xc2\xfe\xb2\x28\ -\x4f\x80\x05\x9d\x6a\x67\x16\xf7\xa5\x45\xc6\xcd\x7a\xf7\x2e\x8a\ -\xbb\x8f\x27\x5d\x77\xc3\xd4\xab\x4f\x2c\x10\x48\x46\x3c\xe7\x27\ -\xbf\xd9\x9e\xfe\xfa\x37\x33\xb9\x7b\x6e\xd1\x13\xac\x3e\xba\x03\ -\x6f\x44\x1b\x9a\x6c\x8c\xce\x89\x8e\x1a\x38\xef\x99\x42\x24\x5e\ -\x3c\x90\x3a\x61\x41\x22\xf1\x26\xbd\x52\x1c\x16\xa8\x07\xd3\x17\ -\x9b\xea\x66\xca\xd4\x2d\xc2\xce\xd5\x9f\xdc\x9d\xbb\x97\x0d\x64\ -\x04\xfb\x45\x05\x7d\xa4\x03\x18\xf2\xfc\x54\x4b\x2d\xa7\x5e\xb8\ -\x10\x9a\xaf\x99\x1b\xd7\x8b\x75\x8e\x54\xef\x91\xd2\x3d\x55\x17\ -\xeb\x32\x0f\x6c\x40\x14\xf6\x05\xa6\x8e\x00\xd5\x3d\x17\x0d\x65\ -\xbe\x7f\xb7\x0a\xde\x25\x15\x54\x1b\x52\x2e\xb4\x2d\x17\xd8\xd6\ -\x24\xf8\x8c\xda\x19\x65\x6a\x1b\x09\xf2\x6f\x1f\x8c\x1d\xaf\x37\ -\xf4\xfd\xba\xd3\x51\x75\x7b\x46\xe8\x8d\xc8\x65\x95\xfc\xbf\x0f\ -\xef\xcc\x5f\x67\xf8\xc5\x40\xba\xdd\xd8\x1f\xec\x2b\xb7\x0b\x2d\ -\x53\x85\xd9\x01\x04\x60\x3a\x67\x88\x32\xa0\x40\x1e\x05\x4c\xcb\ -\x8f\x69\xe3\x3d\xe0\x89\xe2\x7d\x63\xc5\xc7\xe6\x8b\xdc\xcd\x03\ -\x09\x39\x91\x70\x63\xeb\xf5\x02\x75\x3f\x1f\xd1\x89\x18\x02\xc9\ -\xe4\x93\xda\xfd\x20\x00\xeb\x8f\x6b\xb9\x56\x42\x05\x8e\xeb\xbf\ -\x73\x59\xf7\xfa\xd5\xdd\x89\xb7\xb8\x42\x1d\xa2\xcb\x91\x62\xda\ -\x90\xd9\x10\xdc\x6d\x54\x54\xb7\x7c\x70\x38\xf3\xd3\xd2\x03\x64\ -\x94\x03\xfa\x14\x22\x1c\xb0\x95\x06\x33\x08\x97\xc7\xf6\x68\xfb\ -\x14\x5e\xae\x09\xb8\x10\x9f\x1f\xe8\x3d\x55\x39\xb1\x0f\xe9\x62\ -\x72\xaa\x76\xf6\x44\x65\x63\x40\x1f\x01\x3e\x7c\xcf\x58\xf6\xc2\ -\xef\x64\xc5\x9e\x52\xe7\x4c\x7d\x06\xa1\x8d\x4c\x42\x3b\x56\xb3\ -\x33\x08\xd7\xc1\x76\xb9\x90\x20\x0f\xbf\x2b\xa4\x3c\xe7\x95\x62\ -\x2a\x10\xb7\x84\xa2\x72\x76\xed\xca\xcb\x1b\x7f\x92\xc9\x6d\xd5\ -\x45\xdc\x46\xba\xbd\x98\xe7\x36\xe1\xf6\x30\xd9\x87\xdb\xe3\xa0\ -\xa0\x9e\x6b\x28\x34\x05\xb8\xe1\x51\x65\x23\x4f\x6a\xc3\xff\x59\ -\xcf\x99\x5f\xdd\x2f\x86\x7e\xb0\x33\xf7\xcd\xcd\x63\xde\x7b\x27\ -\x7d\x77\xa3\xfe\xec\xa0\xc1\x53\x72\x64\xbf\x27\x7e\x76\x47\x3a\ -\xfd\xf1\x0f\x0f\x8d\x5e\xfe\x1d\x4f\xec\x87\x67\x4a\x4a\x2f\xa2\ -\x0b\x0b\x22\x00\x3a\x26\x6a\x9a\x7d\xdf\xd1\x27\xfa\x56\xc6\xbd\ -\xe3\xe2\xc2\x8f\xe4\x14\x02\xdf\x08\xf8\xa2\x28\x80\x5b\x84\xef\ -\x98\xcc\x5c\xbd\x6d\xaa\x0f\x80\x29\xe5\xc2\xbe\x96\xfb\xab\x55\ -\x6b\x30\x01\xf1\xf6\x00\x9e\xce\x98\xf4\x86\x05\xc7\x2a\xc7\xfd\ -\x67\xdd\x42\x24\x17\xe2\x67\xbd\x21\x0c\xb8\x6e\xb2\x23\x1f\xbb\ -\xe6\x2b\x7b\xc5\x56\x30\x84\x86\x36\x0d\x79\x14\xb5\x0d\xb5\x17\ -\xb7\x25\x0a\x6c\x4e\xed\x4e\xd7\x01\xf1\x36\x41\x94\x72\xb9\x98\ -\x5b\xb0\x48\x89\xee\xa3\x4a\xc5\x96\x50\xf0\x8a\x3b\xaf\x18\x1e\ -\xbd\xab\x54\xa4\xd0\xed\xa7\xa2\x7d\x35\xf5\x9f\xcb\xd4\x06\x08\ -\xc0\x74\x4e\x31\xdb\x23\x14\xc4\x34\xf9\xf1\x49\x91\xe7\xe1\x07\ -\xe9\xd5\xe3\x9e\xf0\xfe\x98\x2d\xec\x2e\x66\x27\x6f\xeb\x93\xb1\ -\xbb\x52\xf1\x44\xdc\x95\xfe\x0a\xbd\x40\x6c\x6a\xd1\xb9\x03\xbc\ -\x77\x2b\xe7\xab\x7b\x87\x0a\x63\x97\xfc\x76\x28\x77\xe1\xb7\x33\ -\xf9\xdb\x6e\x1c\x13\xa3\xc3\xbe\x50\xa5\x73\x11\xdc\x66\x14\xea\ -\x80\x28\x74\xd6\xc0\x71\x4f\xd2\x7f\x18\x9c\xb9\x30\x75\xdc\x92\ -\x64\xe2\x6f\x75\x23\x0d\xf9\xc1\xb3\xb0\x8d\x9b\x09\xf4\x2d\xc2\ -\xf9\xa9\x2a\xec\x1b\x42\xfb\x58\xee\x1f\x11\x4e\x64\xa0\x4a\x01\ -\x85\xae\x83\x6d\x51\x78\x79\xc6\x04\x7f\x61\x17\xd5\xd9\x42\x39\ -\x91\xfd\x50\x59\x14\x8d\xc0\x11\x60\xa6\xa8\x7e\xf7\x81\xa1\xf4\ -\x15\xbb\xc3\xfb\x8d\x36\x01\x51\x5b\x71\x3b\x62\x00\xe1\x81\x84\ -\x8b\xb6\x41\xdb\x06\x78\x1a\xf0\xb6\xf9\xa9\x23\xa4\xf4\xcf\xd1\ -\xd5\x8b\x4b\x55\x4d\x05\x6e\x15\xde\xeb\xcb\x9b\x3e\x3f\x9a\x7f\ -\x50\x6f\x18\xdd\x46\x9e\xa7\x7d\xe3\xfd\x0e\xb3\x09\xb7\xc5\x41\ -\x43\x54\x01\x85\x8e\x05\x53\x1e\xd2\x69\xf5\xda\xea\x12\x5e\x1b\ -\xf2\x27\x5f\x14\xfe\x38\x5e\x18\x1e\xca\x4e\xfe\xae\xdf\x89\xdf\ -\xd1\x9b\x88\xc7\x63\x8e\x5a\xac\x17\x4e\x4d\x2d\xda\x99\xd0\x20\ -\x72\xf3\x70\xee\x3b\xdf\x4a\xe7\xaf\xbf\x6e\x54\x6c\xbd\x5d\x89\ -\x89\x9d\xda\xd5\x26\x9e\xb6\x09\xb5\x0b\x85\x3b\x36\x0a\x9d\xb5\ -\xac\xbf\x5f\xd4\x7b\xc8\xfa\xae\xc4\xeb\x13\x52\x45\xfe\x17\x5f\ -\xd8\xc6\xcd\x14\x3a\xd1\xed\x9d\xaa\xc2\xfe\x01\x61\x7d\xa4\x79\ -\x3a\x60\x67\x33\xb9\x51\x21\x34\x5f\x33\x70\xaa\x6b\x72\x5e\xdf\ -\xcb\x85\x74\x3f\xa9\x8b\x75\x1f\x9d\xc0\x46\x44\x61\x67\xb8\x6e\ -\x32\xa1\xd4\xbd\xd7\x0f\x8f\x5d\x7c\x93\xf6\x33\xac\x36\xa4\x20\ -\x6a\x27\x2a\xb4\x63\x25\x1b\x83\xf8\x7a\xd8\x2e\x7e\x0f\x80\x79\ -\x5a\x17\xf0\xb6\x05\xf1\xe3\xa4\x50\xff\xa0\xb3\x51\xb9\xd8\x8c\ -\x28\xf8\xfe\x8e\x47\x33\x63\x1b\x37\x4e\x88\x92\x3b\x4e\x83\xf6\ -\x05\xfb\x87\xfd\xae\x66\x17\x10\xb7\x07\x15\x80\xe9\x9c\xa3\xde\ -\x80\x02\xa0\x43\x84\xa5\x26\xca\x9f\x69\xeb\xab\x7d\x3a\x7d\xdc\ -\x17\xde\x3d\xe3\x85\x3d\x7f\xd0\x81\x25\xe1\xe5\x36\x76\xc7\xe4\ -\xce\x98\x1b\x8f\xbb\x42\xcd\xd7\x0b\x77\xc4\x51\x8b\xf6\x92\x5c\ -\x5e\x38\x0f\xef\x9c\x10\x3f\xbc\x69\x67\xfa\x9b\xdf\x49\xe7\x7f\ -\x7d\xed\xa8\xd8\x02\x41\x64\x58\x09\x95\xd6\xfd\x2e\x5d\x23\x09\ -\xb3\x0d\x75\x34\x74\x40\x14\x3a\xf6\x34\x07\x7f\x9d\x9e\xdc\x5e\ -\x38\xcf\x39\x71\x20\xee\x9c\xad\x1b\xad\xfb\x42\x3c\x07\xbe\x38\ -\x6c\x63\x6b\x25\x64\xa2\x43\xe0\x2b\x30\xa5\x2a\xf7\xd1\xa0\x6a\ -\x7f\x19\x82\xb0\x0d\xda\x26\x85\x97\x6b\xe6\xaf\x56\x2f\x38\x4c\ -\x49\xe7\xbd\xba\xf9\x13\x4b\x55\xb3\x06\x37\xa2\x5e\x1b\x03\x05\ -\xe5\x3f\xfa\x40\x26\x7b\xe9\xff\x8c\x8b\x1d\xa5\x76\x4d\x7d\xe6\ -\x42\x7b\x99\xec\x59\x4d\xd4\xd6\x20\x84\x97\xa7\xd1\xea\xeb\x27\ -\x7a\xc3\xf0\x62\xfc\xb5\x70\xb6\xa4\x54\x0d\xe0\x76\x53\xa1\x6d\ -\xc2\x6c\xc4\x7d\x31\xcc\x26\x07\x05\x51\xf8\x31\x6d\x03\xf2\x54\ -\x70\x8d\x06\x05\xc1\x0b\x53\x10\x04\x09\x9e\x06\xf9\x01\x2d\x7d\ -\x1c\x1c\x1f\x88\x89\xd8\xa9\xbd\x62\xc9\xb3\xfb\x92\x27\x0f\x24\ -\x52\x27\x27\x94\x7f\x94\x6e\xa0\xee\x8b\x9f\x51\x11\x1c\x85\x28\ -\xf9\x44\xce\xf1\x1f\x4b\x17\x33\x8f\x6e\x9e\x14\x0f\x5d\x39\x22\ -\x9e\xcc\x78\xc1\x73\x38\x78\x5d\xa4\x16\xd0\xf1\x68\x8a\x42\xe7\ -\xa4\x69\xd9\x71\xbf\xbe\xb4\xe7\x99\xeb\xbb\x63\xef\x8f\x0b\xff\ -\x18\x5d\xae\x0b\x68\x9c\xee\xcc\xa8\x80\xa7\xe1\x9f\xc8\x8f\x5f\ -\xf2\x2f\x43\x82\xdf\x9e\x09\x40\x1e\xfb\x45\x45\x07\x29\x0c\x5a\ -\x2a\x38\x53\xc8\xeb\xe8\xf2\x20\xda\x2e\x7e\x1f\x4f\x67\x0c\x3c\ -\x73\xe2\x3a\x5d\xe7\x2a\x2f\xf6\x79\x6d\x2c\xf0\xe7\xb6\x00\x4e\ -\xe1\x3c\x59\x54\xbf\x78\xdf\xb6\xcc\xd5\xa5\x5b\x84\x69\x1f\xb1\ -\x0c\x9a\xad\x9d\xf1\x73\xba\x3c\xb6\x41\xdb\x47\x21\x34\x1f\xb0\ -\x71\xd5\x82\x23\xa4\xa3\xce\x93\xb2\x70\x76\xa9\xaa\xa9\x78\xbe\ -\xdc\x39\x9c\x13\x97\xbf\x7d\x67\x1a\xae\xdf\xe2\xf6\xe1\x76\x57\ -\xb2\x0d\xd8\x83\x2a\xcc\x46\xb4\x0d\x6c\x97\x7e\xcf\x9c\x25\xaa\ -\xf9\x83\xb6\x83\xc1\x04\x04\x03\x0e\x53\x0c\x26\x98\x86\x05\x15\ -\xfc\x2c\x50\xbf\xd6\x22\x5d\xdf\x1f\x13\xee\x09\x7d\x62\xe0\xd8\ -\x1e\x71\xf8\xfc\x58\xe2\xa8\x6e\xa7\xeb\x19\x09\xa9\x0e\x77\x94\ -\x6a\xca\x2f\x45\x7a\x4a\xa6\x73\xbe\x7c\x28\xe7\xab\x6d\xe3\x22\ -\x3d\xb4\x75\x5c\x3c\x7a\xe5\x7e\xb1\x35\xa7\x3f\xd3\x52\x39\xed\ -\x4a\xfa\x48\x0b\x8e\x42\x6a\x85\x3b\x18\x4d\x41\xe8\x8c\x34\xa5\ -\xf2\xfe\x69\x9e\x18\x38\x65\x20\xf9\xfa\x01\x37\xf1\x1e\x5d\xa6\ -\xfb\x60\xc6\xc0\x17\xd4\xd5\x40\x08\xf0\x2c\xc4\x48\x51\x5c\xf7\ -\xbe\xed\xe9\x1f\x94\x1e\x60\x04\x21\x58\x06\x4d\xeb\x1b\x11\x0e\ -\x56\x14\x1d\xc0\x28\x3a\x90\x21\x0f\x29\x6d\x1b\x85\xd0\xfc\x8c\ -\xd8\xb8\x76\xf0\x85\x52\xf8\xe7\x47\xf1\xbe\x2e\x00\x36\xa4\x5e\ -\xbb\xeb\x36\xaa\xfd\xfe\x3e\x15\xb5\x31\xb5\x35\xb7\x29\xb7\x33\ -\x2e\x83\xcb\x63\x3b\xbc\x7d\x10\x42\xf3\x65\x6e\x58\x33\x78\xb2\ -\x94\xfe\xf9\x7a\xf5\x96\x5c\x94\x9f\xf0\xfc\x7b\xaf\xda\x9a\xfd\ -\xd2\xb7\xa6\xbf\x6a\x05\x52\xec\x13\x8a\xdb\x06\x03\x09\x0a\xeb\ -\xa9\x2a\xd9\x06\xc0\x74\x4e\x12\xe5\x1c\x42\xdb\x82\x3c\x0a\x83\ -\x09\x17\x0d\x1c\x34\x90\x1c\x10\x54\x4a\x72\xba\x74\xba\x50\xab\ -\x27\x26\x9c\x84\x2e\xaf\x10\x22\xf1\xec\x6e\xb1\x70\x65\x9f\x58\ -\xdd\x17\x4b\x2e\x4d\x89\x9e\x25\x71\xc7\x5f\xaa\xff\x5a\x5f\x1c\ -\x73\xc4\x92\x6a\xc1\x06\x4e\xc5\xf8\x52\xee\x2d\xf8\xf0\x8b\xc6\ -\x01\xc5\x82\x94\x23\xf9\xa2\x1b\x94\x7d\xa7\x98\x1b\x13\xa3\x43\ -\x8f\x8f\x8b\x27\xae\xd7\x47\x1e\x10\x3c\xf2\x7a\x35\x1d\x3c\x82\ -\xc0\x01\x01\x04\x96\xab\x11\xba\x2c\x77\x2e\x48\xb9\xd0\x21\xd1\ -\x39\xa9\x02\xa7\xfd\xde\xca\xee\x93\x56\xc6\xdd\x4f\x4b\x25\xb4\ -\x59\xa2\x05\xbe\xb8\x5e\xe7\x28\x3d\x0b\x71\xe7\xb5\x3b\xc6\xce\ -\xff\xc6\xd3\x4f\x22\x43\xd3\x98\xa2\x4c\xfd\xc3\x81\x0c\x29\x1d\ -\xbc\x7c\x20\xd3\xe5\x68\x1b\xb4\x7d\x10\x42\xf3\x33\x02\x9e\x39\ -\x91\x7e\xf2\x43\xda\xed\xce\xd5\x8d\xd4\x6b\x9e\xc8\x98\xc1\xef\ -\xef\x53\xa1\xbd\xa8\x0d\x41\x95\x26\x4a\x14\x6d\x07\xda\x46\x01\ -\x3c\x3d\x80\x1b\xd6\xf6\x9d\x21\xa5\xfc\x91\x76\x90\xde\x52\x55\ -\xd3\x80\x6b\x79\xa3\x45\xb5\xf1\x6f\x76\x64\xbe\x43\x4e\x77\xe1\ -\xf6\xd3\x7e\x81\xa8\x5d\x40\x18\x48\x50\xf4\x33\x10\xb7\x0f\xb6\ -\x4b\xbf\x67\x4e\x13\xf5\xa0\xc0\xf6\x68\x0a\xc2\x20\x82\xf9\x20\ -\x40\x94\x52\x93\x4c\x41\x85\xae\x17\x48\x2f\x24\xb5\x47\x3a\x3d\ -\x5a\x49\x1d\x64\x92\xba\xac\x3f\x70\xf4\x42\xd2\x55\x5a\x53\xdf\ -\x17\xa0\xf7\x64\x39\x4f\x41\x8f\x41\x74\x59\x41\xe0\x40\xf2\x53\ -\xc1\x63\x26\x47\x1e\x00\x77\x1c\x5a\xa6\xce\x15\x26\xea\x90\x98\ -\x47\x05\x0e\xfb\xa5\xa5\xfd\xab\x9e\x91\x72\xdf\x93\x74\x8a\xaf\ -\xd4\xe5\xb6\x24\xc2\x53\x5d\x74\xf0\xd2\x3c\x2e\x83\xcb\xc3\xfa\ -\xd8\x26\xb6\x0f\xf0\x74\xc6\xc0\xef\x9c\x8c\x1e\xda\x73\xb6\x48\ -\x38\x5f\xd1\xad\xb4\xcd\xfb\xba\xe0\xce\xb9\x6d\x39\xf1\xe3\x7f\ -\x19\x1e\xfd\x6d\x85\xf7\xa1\x51\xbb\x70\x1b\x83\x4c\xb6\xa5\xe2\ -\xcb\xcf\xda\xce\x60\xc7\xcc\xca\xee\xb7\xfa\x31\xf7\x9b\xa5\xaa\ -\xa6\x02\x3e\xf9\x58\x6e\xfc\x92\xf7\x0e\x8b\x3b\x75\x91\x6e\x2f\ -\xed\x13\xf6\x11\xfb\x8e\x76\x81\x94\x2a\xcc\x46\xd4\x2e\x28\x00\ -\xd3\x39\x8b\x71\x92\xad\x13\x6c\x93\xa6\x20\x08\x02\x98\x82\x78\ -\x90\x80\x14\x55\x2d\xa0\x60\x4a\xdb\x0d\x13\xc0\x53\x80\xe6\xa3\ -\x84\x3b\x0d\x77\x26\x48\x2b\x09\x9c\xb1\xa2\xfe\x42\xf7\xf9\xdc\ -\x15\x5d\x2f\x5d\x98\x88\x7f\x46\x0a\xa5\xe3\x69\xfb\x11\xf1\xa9\ -\x2e\x3e\x78\xa9\xe8\x20\x06\xd1\xb6\x51\x00\xa6\xb3\xe2\x37\x1b\ -\x16\x3c\xcf\xf7\x8b\x5f\x96\xaa\xfe\x0b\xf1\x00\x6c\x4c\xbd\x0e\ -\xa8\xdb\xc8\x65\x7c\x75\xf3\x7b\xb7\x8c\xfd\x2f\x79\x1f\x1a\x4d\ -\x51\xd4\xc6\x20\x93\x9d\x6b\xb5\x31\xa4\xb4\x5d\x48\x01\x9e\x1a\ -\xb9\x65\x95\x58\x56\x90\xa9\x7f\x12\x4e\xfc\x83\xa5\xaa\xa6\x02\ -\xa7\xbb\xae\xde\x9a\xfd\xa2\x8e\x66\xf4\x88\x19\x15\x66\x1f\xb4\ -\x0d\x06\x12\x14\xb5\x0f\xa6\xd8\x06\xb6\x09\xd0\xfc\x9c\x06\x26\ -\xe3\x46\xc1\x8d\x89\x46\x36\xed\x34\x2a\xd3\x8e\xc3\x9d\xc7\x53\ -\x14\x5d\x9f\xb7\x8f\x65\x2a\xba\x1d\xb8\x7d\xf5\x28\xac\x6d\xfc\ -\x7e\x9a\x9a\x84\xfd\xe0\xfd\xe2\x0a\x6c\xf1\xba\xa5\xfd\x2b\x07\ -\xdd\xe4\x19\xed\x1a\x4c\x82\xbb\xba\x7c\xff\xc1\x9b\x87\xd3\x57\ -\x55\x79\xf1\x23\xda\x89\x8b\xdb\x86\x96\xa9\xe8\x3a\xb4\x5d\xaa\ -\xba\x99\x7a\xe6\x24\xfb\x72\xe9\xfb\xcf\x2b\x55\xd5\x4d\x14\x7f\ -\xcd\xe4\x7d\xff\xb1\xfb\x32\x63\xa6\xdf\x37\xa1\x29\x57\x3d\x36\ -\x06\xd1\xb6\x10\x9a\xaf\x48\x4e\x2c\x98\xa7\x64\x77\x4b\xde\x2e\ -\x0c\xa7\xbb\x26\x3d\x67\xfb\xc5\x42\x94\x7e\xe8\x74\x1a\xb4\x5f\ -\x28\xde\x77\x2a\xbe\x1c\x2d\x53\x78\x79\x4e\xd3\x88\x80\x42\x0d\ -\x88\x79\x34\x34\x1a\x9e\xee\x18\x74\x5c\x9c\x34\x69\x9e\xaa\x5a\ -\x50\x01\xf1\x76\xa8\xf0\xbb\xe8\x77\x57\x12\x6e\x33\xdf\x5e\x2e\ -\xde\x26\xff\x2e\x48\x41\x7c\x9b\x70\x3b\x51\xb4\x5f\x61\x2a\xfe\ -\x9d\x3e\x7a\x5b\x22\xf3\xcf\x8a\x39\xde\x4b\x75\xb9\x2e\xa0\x63\ -\x94\xa8\x0e\xd9\x8a\xc2\xdb\x3e\x54\x1c\xbb\xe1\x22\xf3\x75\x13\ -\x4c\xb9\x4c\xf6\xab\x24\x5c\x1e\x64\x6a\x8f\xc2\xcb\x33\xc2\xf7\ -\x07\x8e\xd5\x7f\x51\xc3\xcb\x1f\x1b\x75\x54\x3b\x63\xe0\x7d\x68\ -\xbb\x27\xdd\x1b\xe1\x69\xf8\x52\x95\xa9\xcf\x20\x6a\x27\x14\xda\ -\x8f\xdb\x94\x8b\x2e\x8b\xc2\x76\xa9\x10\x9a\x37\x13\x57\x03\x52\ -\x7a\x2d\x09\x28\x9e\x2c\x3e\xf5\xa4\x9f\xb9\xbf\x74\xfa\x95\xc2\ -\xfb\x43\x45\xfb\x1e\x26\xba\x3c\x40\xf3\x07\x15\x8d\x3a\x42\xa1\ -\xc6\xe4\x46\xe6\x3b\x83\x3b\x31\x4c\xaa\x98\xd2\x09\xd6\x34\xe9\ -\xe2\x32\x26\xf1\x76\x4d\xe2\xdf\x1f\xb6\x5d\xb4\xde\xf4\x19\x2d\ -\x83\xf0\xfb\xf9\xb6\x60\x99\x6e\x3b\xcf\x57\xd4\x4b\x56\xf4\x1e\ -\xd1\x93\x4a\x44\xf2\x74\x36\x6f\x00\x3a\x52\x2f\xf8\x1b\x27\x9f\ -\x1a\x12\x77\x19\xae\x9b\x00\xe8\x07\x26\x7f\x00\x1b\x99\xec\xc9\ -\x45\xd7\x01\xf1\x36\x01\x9e\xce\x8a\x9b\x56\x2f\x38\x5c\xf8\xee\ -\x39\xba\x95\xa5\xa5\xaa\x59\x53\xd7\x86\x10\x74\x3b\xb9\x09\xe9\ -\x3f\x00\x3f\x99\x5c\xba\x31\x84\x36\x8d\x65\x2e\xb4\x15\xda\x0f\ -\x6d\x09\x7e\x87\x79\x93\xc2\x6c\x0c\xa2\xf0\xb2\x11\xa7\xe0\x75\ -\x2b\x5f\x2d\x2a\x15\x9b\x8a\x0e\xc2\x23\x7f\x1a\x16\x9b\x74\x16\ -\xb7\x95\xf7\x03\xcb\x20\xec\x77\x35\xe1\xb2\x74\x5d\x04\xf3\xb4\ -\x6e\x4e\xd3\x8c\x53\x5e\x00\x35\x2c\x0a\x76\x02\x75\x58\x2c\x83\ -\x70\xb2\xa5\x82\x09\x95\xa6\x98\x47\x99\x3e\xc3\x3c\x8a\xb6\x8d\ -\x79\xfc\x4e\x53\xd9\xa4\xb0\x75\x20\x45\xf1\x32\xdd\x4e\xdc\x2e\ -\x5e\x47\x65\x5c\xef\x33\x83\xa2\x7f\x30\x56\x3c\x21\x26\xd5\xe1\ -\xba\x1c\x39\xf5\x46\xa8\x19\x9c\xea\xc2\xfd\x0f\xa2\x79\xea\x03\ -\x61\xc2\x65\x70\x79\xda\x26\x42\xf3\xb3\x06\x2e\x20\xfb\xde\xe4\ -\x49\x42\x16\xcf\x28\x55\xb5\x05\x70\xaa\xeb\x8f\xe9\xb1\x2b\xc9\ -\x4f\x26\x23\xd8\x6f\x48\xa9\x6d\xd0\x56\xd4\x7e\x20\xf0\x31\xcc\ -\x73\xe1\x3a\x28\x6c\x0b\x05\xf0\xb4\x3a\x31\x7f\xc0\x71\xd4\xea\ -\x52\xa9\x69\xe8\x0d\xcc\xe5\xa5\xf3\x54\x8d\xa7\xbb\xb0\xbf\xdc\ -\x06\x28\xd3\xb2\xa0\x7a\x81\x21\x18\xa6\x8e\xa0\x91\x01\x05\xa0\ -\x46\xc6\x3c\x1a\x1f\x05\x3b\xc4\xe4\xd0\x20\x3a\xb1\x1e\x30\xc1\ -\x56\x10\x5d\xaf\xd2\x67\x98\x47\xd1\xef\x0c\x53\x2d\xcb\x98\xda\ -\xc6\x7a\xba\x1d\xb4\x6c\xd2\xb4\xf5\x0f\xef\xe9\xdb\x90\x10\x89\ -\xb3\xb5\xd1\xea\x76\xb0\x46\x78\x68\x51\x38\x3b\x9f\x2c\xb8\xbf\ -\x9b\xc1\xa9\x2e\x3a\x48\xe9\x7e\x37\x89\x2e\x87\x79\xde\x1e\x0a\ -\xa1\xf9\x19\x93\xde\xb0\xe0\x68\x95\x88\xbd\xb3\x15\xb7\xb7\x86\ -\x11\xfc\x20\x94\xe7\x3e\x10\xf2\xe2\x47\x80\xda\x01\xed\x44\x45\ -\x6d\x1a\x26\xba\x3c\x6d\x8f\x82\x65\x5e\x5f\x11\xa9\x94\xd4\x2b\ -\x34\x7d\x82\xf4\x84\x4c\x8f\xf9\x62\x1b\x3b\xdd\x85\xfd\x32\x89\ -\xdb\x80\x96\xa9\xf8\x7a\x65\xdd\xb4\x5a\x0c\xdc\xb0\xae\xff\xb4\ -\x1b\xd6\x2c\xf8\xca\x8d\xeb\xe6\xfd\x5e\xe7\x1f\xba\x71\xcd\xbc\ -\xdf\xde\xb8\xae\xff\x1b\x1b\xd7\x8b\x57\x5f\x2f\x04\x5c\x03\xc5\ -\x80\x51\xcd\x26\x74\xb9\x5a\x96\x6f\x09\x8d\x0e\x28\x00\x18\x17\ -\xe1\x46\xa7\x3b\x05\x52\x93\x73\xa3\xe8\xe4\x6a\x9a\x7c\x41\xa6\ -\xcf\xe8\x7a\x28\x5a\xcf\xf3\x61\xeb\x80\xe8\xe7\x3c\x1f\xf6\x39\ -\x55\x58\x3d\x0a\x3e\x37\x2d\x53\xfc\xee\x1a\xb1\xb4\x37\x99\x7f\ -\x85\xfe\xeb\x6e\x95\x2e\xd7\x05\x1a\x3f\x4a\xe0\x82\xe7\x58\xc1\ -\xbf\xe7\xbc\xe1\x51\xfc\x29\x55\xfe\x15\xf8\xb5\x28\xbe\xdf\xc3\ -\xf6\x3f\xd4\xd3\xcf\xe8\x7a\xb4\x3d\x10\x85\x97\x67\x44\xd4\x17\ -\xe2\x61\x63\xa2\x98\x01\x72\xbe\xb7\x19\x8e\x00\x0d\xcf\x40\xa1\ -\x0d\xb8\xd0\x7e\xd4\x86\x95\x84\xcb\xd1\xf5\x4c\xed\xce\x98\xc0\ -\xa6\xaa\x78\x64\xa9\xd8\x54\x3c\xdf\x1b\x19\x1a\xcb\x3c\xa2\xb3\ -\xb8\xed\x34\xa5\xc2\xfe\xd2\x7e\x57\xb3\x05\x4a\x5c\xbd\x52\xf4\ -\x6f\xdc\xd0\xfb\xda\x1b\x37\x0c\x5e\xed\x39\x7d\x5b\x74\x00\xbd\ -\x4a\x8a\xfc\x3f\x08\xdf\x3b\xc9\x51\x70\x66\xc1\x3b\x59\xff\x55\ -\xf0\x4e\xd7\xef\xfd\x91\xbb\x6e\xe0\x86\x1b\xd7\x2c\x7a\x83\x5e\ -\x8d\x07\x8a\x30\x71\x2a\x7d\xd6\x12\x9a\x11\x50\x80\xc0\xd8\x04\ -\xbe\x23\xe8\x0e\x03\xa1\x73\xe3\x04\x5b\x49\x7c\xf2\xad\x57\x95\ -\xda\xa4\x9f\xcd\xe6\xbb\xe1\x25\xbb\xbc\x2e\xac\x1d\xa8\x2f\x6b\ -\xa1\xec\x5d\x17\x13\x89\x57\x6b\x63\xd5\xe5\x3c\x60\xec\x46\x78\ -\x1f\xbe\x96\x7e\x16\xa7\xba\xe8\x24\x56\x49\xb8\x1e\x0a\xdb\xa3\ -\x60\x99\xd7\xcf\x98\x62\x71\xf0\x70\x25\x93\x67\x69\x63\x45\x62\ -\xae\x28\x1a\x81\x67\x4e\x86\x0b\xb1\xdf\xcc\xf2\x08\x10\x65\xb2\ -\x2d\x0a\x3f\xc7\x65\x79\x7b\x28\x84\xe6\x6b\x42\xdb\xa1\x11\xee\ -\x57\x15\xcf\x17\xe9\xdf\x8f\x94\x6f\x60\x40\x78\x5f\x50\xd8\x77\ -\xb4\x43\x98\x82\xe5\xbf\x2f\x44\xd7\x0d\x8b\x07\x4e\xb9\x71\xed\ -\xfc\x8b\xbb\x12\x7d\x0f\x38\x45\xf9\x13\xed\x40\xa7\xeb\x8e\xc2\ -\x83\xd5\x31\xdd\x63\x47\x6b\xea\xc8\x6c\xea\x3f\x47\x09\xd9\x15\ -\xfc\xb1\xe2\xe4\xbe\x7b\xc3\x86\xde\x8b\x6f\xd8\x20\xe0\x34\x20\ -\xd8\x26\x4c\x00\x2f\x53\x4c\x75\x4d\xa7\x59\x01\x05\xc0\x9d\x85\ -\x60\x1e\xeb\x41\x74\x67\x71\x67\xa7\x13\x2c\x9f\x78\x69\x99\xcb\ -\x34\x89\xb7\xa3\xb0\x1f\xb4\x9f\x20\xef\x07\x2b\xc5\xb2\x2e\x59\ -\x78\xb9\xb6\xd0\x12\x5d\xae\x8b\x46\x78\x5d\xe9\xf7\x37\x7e\xfd\ -\xcd\x3d\x62\x57\xa9\x8a\xee\x5b\x4c\xb9\x2a\xed\x6b\x2e\x5c\x06\ -\x52\x53\x5b\xa8\x48\x80\xbf\xa4\x1d\x35\x71\x8a\xd3\xa2\x57\x83\ -\x98\xd0\x9d\xcb\x4d\x0a\xef\xe1\x2b\x87\x47\x4d\x0f\x89\x02\x68\ -\x03\x6a\x57\x2a\x6e\x53\x2e\x5c\x86\xae\x83\x6d\xa2\x28\xbc\x5c\ -\x15\xf8\x0d\x14\x5f\x74\x37\xfd\x27\x7f\xe1\xe8\x39\xe7\x3b\xc3\ -\xd7\x0a\x31\x59\xaa\x02\x70\xfb\x69\xff\x50\xd4\x06\x54\xd3\x96\ -\xfb\xe1\x6a\xb1\xe2\xfa\xf5\xa9\x7f\x5f\xb9\x66\xe0\x66\xd9\xeb\ -\x5f\x23\x54\xe1\x6c\xbd\xd4\x72\x3d\xc8\x5c\xad\xea\x43\x0d\x96\ -\x51\xaa\x4f\x7a\xf2\x0d\xc2\xef\xfb\xe2\x35\xeb\x2b\x06\x15\x98\ -\xab\x4d\xf5\x20\x84\x97\x9b\x4e\x33\x03\x0a\x02\x3b\x03\xc1\x3c\ -\xdd\x51\x7c\x27\x72\xc7\x0f\x26\xd9\x52\x0a\xa2\x93\x71\x98\x20\ -\xa8\x50\x99\x96\xa9\x45\x74\xdd\x4a\xed\xcc\xf4\x3b\x68\x3f\x40\ -\xb4\x9f\xde\xbc\x44\xdf\x7a\x57\x24\x5e\xab\xf3\x6d\x87\xde\x61\ -\xe5\x89\xce\xf0\xa4\x36\x40\xf7\x2d\xa8\xd2\xbe\xa5\xe2\xcb\xd1\ -\x32\x6f\x93\xc2\xcb\x33\x06\x6f\x13\xd6\x0d\xb5\x74\x70\x52\x0a\ -\xbe\xbf\xe5\xa1\xd1\xb1\xeb\xaf\x33\x5f\x88\x37\x89\xda\x8b\xdb\ -\x96\x0b\x97\xc1\xe5\x69\x3b\x14\x2c\xf3\xfa\x9a\xd1\x06\x6d\xba\ -\x4d\x7d\x47\x64\x27\x9c\xe0\xb5\x34\x7c\xfb\x21\xe5\xc2\xfe\xa3\ -\x2d\xa8\x4d\xfc\xf7\x0b\x91\xbc\x72\x49\xdf\x0b\x37\xae\x1e\xbc\ -\x68\x89\xd3\xf7\x87\x98\x17\xff\x98\x94\xc1\x8b\x59\xa7\x8e\x44\ -\x66\x47\x52\xc7\x96\x97\xc6\x55\xff\xbf\xea\x3c\xb4\x61\x12\xd8\ -\x0d\x53\x2a\x00\x53\x84\x97\x9b\x06\x6c\x60\x2b\x80\x9d\x83\xe0\ -\x8e\xa4\xe2\x3b\x93\x3a\x3f\x88\x4e\xba\x54\x74\x72\xae\x45\x38\ -\xf1\xd7\x12\x28\xaa\x05\x89\x5a\x82\x08\xdf\x5e\x2a\xda\xb7\x72\ -\xf9\xc7\x6b\xc5\xf2\xa4\xc8\x9f\xa6\xad\x52\xf7\xd1\x49\x23\xc0\ -\x3b\x8e\x6a\x98\xe8\x70\x5f\x62\x1e\xfa\x17\xb6\x7f\xb9\xe8\xba\ -\x28\x0a\x96\x79\xfd\x8c\xd9\x78\xa4\x58\x29\xe5\xe4\xab\x74\x4b\ -\x75\xdf\x26\x1c\x15\x70\x21\x3e\xed\xb9\xf7\x7d\x71\x44\x6c\x02\ -\x63\x68\x78\x7f\x21\xa5\x42\x7b\xa1\xb8\x3d\x51\xf4\x73\xba\x3c\ -\x88\xb7\x09\xea\x48\x94\x2a\x66\x33\xc5\x0c\xbe\xaf\x0f\xa1\xfd\ -\xe1\xfd\x3c\xa0\xff\xff\xbd\x50\x2c\xba\x66\x55\xea\x1d\xa7\xaf\ -\x1d\xb8\xa6\xb7\x47\xfc\xcc\x91\xc5\x33\x75\xfd\x80\x9e\xba\x5d\ -\xbd\x40\xfd\x13\xb8\x52\xbd\x52\x78\x27\xe8\xa3\x94\x53\x74\x89\ -\xbe\x1d\xc4\x24\xf8\x3e\x4c\xb9\x10\x9a\x6f\x1a\xb0\x51\xad\x02\ -\x77\x16\x82\x79\xac\x47\x51\x27\xa7\x83\x81\x4e\xbc\x98\x07\x55\ -\x9b\xb8\xf9\x24\x6f\x12\x0f\x0e\x95\x82\x45\x2d\x81\x24\x4c\xa6\ -\xed\xc3\xfe\x05\x7d\x9e\x27\xfa\x37\x48\x95\x78\xbd\xce\x47\x0e\ -\x1a\x7c\xb6\x4c\xfd\xea\x9d\xf3\x3b\xc3\x1d\x47\xb4\x69\xdc\x8f\ -\xa8\xb0\xfd\x89\x7d\xe6\x65\x14\x6f\x87\x2a\x32\xe4\xc4\xe0\x2a\ -\xdf\x4b\xbd\xa4\x54\x6c\x39\xf4\x56\x6c\xc3\x6b\xe9\x01\xac\xa3\ -\xb6\xa2\x32\xd9\x95\x8b\x2e\x8f\xed\x71\x21\x34\xdf\x11\xe8\x80\ -\x9c\xdd\x95\x13\x4f\x95\x8a\x14\xde\x47\x2a\xff\x65\x7a\x52\xbf\ -\x60\x49\xdf\x91\xd7\xac\x9d\xff\xb9\x63\x07\xfa\xae\x49\x3a\xf1\ -\xf3\xdc\xa9\x9f\xd8\xae\xe7\x68\x24\x14\xa9\xdc\x67\xc4\x45\x1f\ -\x5c\xa4\xc7\xc0\x41\x03\x0b\x0f\x30\x3c\x90\x60\x00\xc1\x14\xa0\ -\xf9\xa6\x00\x1b\xd6\x6a\x60\xe7\x21\xb8\x33\x81\x60\xa7\x96\x52\ -\xcc\x9b\x64\x1a\x20\x74\x82\x36\x4d\xe2\xa6\x7c\x25\x55\x5a\x0e\ -\x3f\xa3\x29\xcf\x53\x99\xb6\x17\x35\xad\x5f\xbf\x58\x2f\x0e\x89\ -\x3b\xb9\x57\xc8\x06\x1d\x9d\xd4\xe3\x6d\xc1\x44\xe7\xf9\x9b\x2e\ -\x1f\xca\xdc\x10\xf2\xd6\x65\xdc\x6f\xa6\xfd\x67\xea\x3b\x8a\x2f\ -\x47\xcb\x20\xde\x2e\x42\xf3\xb3\x02\x9e\x3b\x11\x5e\xee\xc8\x76\ -\xba\x76\x62\xb8\x15\x1b\xe1\x76\x40\x51\x5b\x71\xdb\x9a\x44\x97\ -\x07\xf1\xf6\x28\xbc\xdc\x11\xc0\x4f\x4f\x7c\x6d\xfa\x1b\x05\xb8\ -\x00\xcc\xfb\x7f\x37\x28\x7a\x2e\x5d\xdd\x75\xea\xbf\xae\x9b\xf7\ -\xcd\xb5\x3d\xe2\xa7\x49\x55\x38\x2b\x18\x83\x51\x1d\x8d\x84\xa2\ -\x7a\x64\x51\xac\xf8\xb0\x10\xfd\xba\x00\xef\x33\xe4\xef\x34\xa4\ -\x01\x85\x0a\xb6\x09\x05\x34\x70\x1b\x2b\x03\x1b\xd3\x0e\xd0\x1d\ -\x0b\xd0\x32\xe6\x51\xd4\xf9\x4d\x03\xc4\x34\x81\xf3\x3a\x54\xa5\ -\x00\x00\x65\x2a\x5e\x4f\xcb\xa6\x94\x8b\x6f\x1f\x96\x41\xb4\x3f\ -\xe5\xfe\x75\xab\xfe\xc3\x94\x4a\xbc\x51\xe7\xeb\x02\x0d\x19\x25\ -\xf0\x7a\x95\xe1\xe2\xd8\x4d\xbf\xaa\xfc\xfb\x1b\xe5\xbe\x18\xca\ -\x20\x6a\x03\x93\x70\x39\x6c\x0f\xa0\x79\x84\x97\x67\xc5\xe8\xfa\ -\x85\x87\xcb\x78\xe2\x2c\xdd\x58\xcb\x06\x24\xa5\xce\x5b\xb1\x51\ -\x61\x36\x35\x09\xdb\xa1\x60\x99\xd7\xcf\x18\x37\x26\xbb\x85\xeb\ -\xb7\xe2\x29\x79\xf8\x55\xd8\x4a\xdb\x1f\x7c\xf6\xa1\xc5\x62\xf1\ -\x4f\x57\x27\xcf\x79\xe3\xbc\xfe\x0b\x96\xca\xd8\x17\xe2\xbe\x77\ -\x92\xae\x6e\xc8\xd1\x48\x18\x4a\xaa\x79\x47\x2c\x17\xf0\x6a\x1a\ -\x0c\x26\x95\x02\x0b\x0d\x24\x54\x00\x4f\x9b\x42\xbb\x04\x14\x04\ -\x76\x2c\xdd\xf1\x58\x46\xa1\xd3\xf3\x81\x00\xa2\x03\x86\x0e\x20\ -\xd3\x64\x1e\xa6\xb0\x60\x80\xaa\xf4\x39\xfd\x2e\x9e\x72\xe1\x36\ -\xd2\x6d\xc7\x7c\xa0\x6b\x0f\x17\x2b\x62\x4e\xee\xf4\x28\x8e\x4e\ -\xa2\xf6\x28\xbd\x03\x72\x13\xca\xd9\x04\xaf\x57\x81\x0d\x9f\xaa\ -\x3a\x00\xdc\x67\x28\xda\x57\x2e\x5e\x5f\xb6\x83\x16\xae\x8b\xed\ -\x20\x34\x1f\x0d\x85\xc2\x3c\xe5\xf9\x2d\x79\xcf\x14\x27\x38\x02\ -\x54\xfe\x7d\x37\xec\xcc\xfc\xac\x86\x5b\xb1\x41\xd4\x56\x20\x6a\ -\xcf\x30\xe1\xb2\xb8\xae\x49\x91\xe1\x17\xfc\x09\xe1\x39\xf0\x63\ -\xa6\x4d\x03\xae\x3f\x65\x7d\x67\x7b\xa9\x88\x94\xfb\xf7\x3c\x3d\ -\x41\xff\xe7\xfc\xee\x0d\x57\xac\x1e\xfc\xb7\x53\xfb\xfa\x2e\x98\ -\x27\x13\xef\x8a\x4b\x75\x98\x1e\x34\xb5\xdd\xa9\x15\x3d\xd2\x73\ -\xcb\x41\x04\x7e\xd2\x9b\x07\x13\x1e\x54\xc2\x02\x0b\x85\x97\x1b\ -\x46\xbb\x05\x14\x84\x3b\x33\x2d\x63\x1e\x45\x07\x05\x17\x0e\x1a\ -\x3e\x90\x40\x74\xd2\xa7\x13\x3f\x96\x4d\xc2\x65\xc2\xd6\xa3\x9f\ -\x87\x89\x6f\x23\x08\xfb\x51\xee\x97\x93\x9b\xb7\x52\x79\x29\xb8\ -\x40\x57\x17\xd0\x58\xd4\x18\xde\x72\x8b\x94\xb7\x9f\x89\xf7\x17\ -\x84\xb6\x30\xd9\x85\x97\x4d\x6d\x22\x34\x5f\x1f\x2d\x7a\x2d\x88\ -\x89\x82\xf2\x37\x3f\x94\x19\xfb\xf9\xc5\x1e\xfc\x8e\x5b\x00\xf6\ -\x93\xa6\x20\x6a\x23\x48\x4d\x76\xe5\x75\x58\xa6\xc2\xf6\x50\x14\ -\x5e\xee\x18\x60\xc3\xf5\x6c\x4a\xb7\x3f\xc8\xbf\xbd\x57\x0c\x7c\ -\x6f\x45\xea\x65\x1f\x5f\x3b\xf0\xd9\xe3\x07\xdc\x6f\xf4\xc9\xe2\ -\x19\x8e\x12\x0b\x65\xf0\x8c\x48\xf3\x26\x60\x8e\xaf\x87\xfe\xa4\ -\x1f\x04\x12\x0c\x26\x5c\x3c\xa8\xc0\xb6\xd2\xa0\x42\x69\x7a\x3f\ -\xda\x35\xa0\x20\xb0\xf3\xb9\x33\x54\x12\x1f\x24\x54\x7c\x50\xd1\ -\x7c\x14\x32\xb5\x0d\x29\x95\x69\x1b\x79\x1f\xd4\x35\xeb\xc5\x82\ -\x98\x98\x7c\x51\x14\xe7\xf2\xa3\xf6\x28\xbd\x81\xb9\x49\xe1\x6c\ -\x33\xbc\xe5\x96\xa6\x54\xb4\xaf\x68\x9f\x6a\xe2\xb6\x09\xa3\xd2\ -\x67\x33\xa6\x55\xaf\x05\xe1\xc0\x9b\x84\x9f\x9a\x74\x7f\xfd\xf9\ -\x11\xb1\xa9\xc6\x53\x5d\x20\x6e\x67\x4c\x4d\x76\xe5\xc2\x36\x28\ -\x58\xe6\xf5\x1d\xcb\xb1\x7a\xbe\xfb\xf0\xa0\x38\xf4\xf2\xb5\x89\ -\xb7\xfd\xf5\x92\xbe\x6f\xac\x8c\xc7\xff\x2d\xa5\xfc\x63\xf5\x1e\ -\x6f\xd5\xd1\xc8\x01\x28\x21\x33\xff\x37\x24\x76\xea\x2c\x04\x0f\ -\x0c\x2a\x34\xb8\xd0\x60\x82\x79\xd8\x76\x93\x9a\x4e\xbb\x07\x14\ -\x24\xcc\xe1\x2b\xc9\x34\x70\xa8\xf8\x00\xab\x36\xf0\xe8\xe7\xa6\ -\x65\xc2\xd6\x03\xd1\xed\xe1\xdb\x79\x80\x52\x6a\xe1\x4a\xe1\xa6\ -\x5e\xa2\x0b\x75\x39\x05\x34\x16\x35\x7a\x83\x92\xbd\x8e\x78\xce\ -\x57\x56\xf5\x9f\x5e\xaa\xa2\x4c\xeb\x87\x16\xef\x3b\xc8\x64\x47\ -\x9a\x47\xd1\xf5\xb9\x1a\x82\x8e\x27\x05\x3d\xa0\xd9\xeb\x9e\x9a\ -\x0b\xdc\x39\xf7\xa4\x2f\xaf\xfa\xd8\xae\xf4\x46\xc3\x5d\x5d\xd4\ -\x06\x54\xd4\x6e\xd4\xb6\x61\xa2\xcb\x9b\xda\x03\x45\x8e\x1f\x1b\ -\x29\x08\x77\x2c\x5b\x2a\x36\x8d\x84\xf0\xe7\x5f\x72\x48\xf2\x55\ -\x9f\x5e\xdb\xff\x9f\xa7\xce\xeb\x3d\x7f\xbe\x4a\x9e\xa5\x0f\x43\ -\x16\xc0\xd1\x88\x76\xe8\x96\x4c\xbc\x21\x14\x7d\x21\xb3\x17\x4e\ -\x9d\xed\x08\x0b\x26\x34\xa8\x80\x60\x0e\x47\x61\x20\xe1\x02\x30\ -\x6d\x28\x9d\x12\x50\x90\x30\x87\xa7\xf5\x5c\x74\xd0\xf0\x41\x84\ -\xe5\x5a\x54\x6d\x79\xfe\x39\x7e\x07\xd6\xd3\xb2\x49\x01\x97\x69\ -\x07\xf2\x0b\x13\x47\x08\xcf\xab\xfb\xd6\xd5\x46\x79\x90\xf6\xe2\ -\x25\x0b\xa5\x77\xca\x67\xe6\x8b\x0d\xa5\x2a\xc4\xd4\x2f\x6a\x1b\ -\x9c\xcc\x68\x4a\x27\x38\xcc\xd3\xf5\xa8\x28\xbc\x1c\x01\x2e\xbc\ -\x89\x76\xcb\x54\xbe\xf9\x40\x30\xd9\xe5\xc9\x2b\xce\x1b\x1a\xbd\ -\x7a\x9b\xb9\xbf\x28\xb4\x17\x17\xb7\x2b\x8a\x2f\x87\xa2\x6d\xa2\ -\x28\xbc\x5c\x17\x29\x47\xec\x57\xbe\xd3\x54\xfb\xba\x52\xf5\xf7\ -\xc7\xe4\xcb\x97\x25\x12\xef\x4a\x0a\x75\x84\x94\x12\x8e\x46\xda\ -\x72\xde\xf3\x94\xdc\x3e\x5a\x8c\xdf\x9a\x9b\x0a\x22\x28\x0c\x26\ -\x34\xa8\x54\x0b\x26\x2d\xa3\xd3\x02\x0a\xa5\xd2\x20\xe0\x9f\xf1\ -\xba\x4a\x03\x0a\x44\x07\x1d\x95\x69\x59\x50\xb5\xcf\x4d\xa2\x94\ -\xeb\x07\x8f\x14\x4b\x65\xb2\x78\x82\x76\x8b\xba\x1c\x83\x7f\x41\ -\xd4\xc4\xa5\xbb\x7c\x6d\x4f\xef\xf1\xa5\x22\xef\x13\xe4\xa9\xdd\ -\x40\x74\xb2\xa3\x69\x98\x4c\x5d\xc0\x3a\xd3\x67\x75\xe3\x38\xfb\ -\x87\xa5\x9c\x84\xdf\x1a\x6f\x3a\x70\x47\x57\x26\xaf\xee\xfc\xe9\ -\x8e\xd1\x8d\x4f\x78\x41\xff\x01\xde\x5f\x48\xb9\xd0\x5e\x18\x3c\ -\x4c\x76\xa6\xf5\x5c\xd0\x06\x05\xcb\xbc\xbe\x6e\xc6\xb4\xf4\x91\ -\x41\xe4\xed\x56\x45\x8f\xa5\xe0\x68\xa4\xc5\x93\x6d\x35\x3c\xdf\ -\xdf\x75\xdf\xf6\x91\x7b\x75\x16\x02\x87\x29\x98\x50\xb5\x65\x50\ -\xe9\xe4\x80\x42\x01\x27\xa5\xa2\xf0\xcf\x5a\x21\x4e\xe8\xe7\xf0\ -\x60\x5d\x14\x17\xe3\x2b\x79\x54\x14\xde\xe6\x48\x35\xd0\xe7\xa8\ -\xb5\xaf\x10\x22\x59\xaa\x02\x78\xbf\x50\x7c\x12\x0b\x9b\xec\x4c\ -\xeb\x52\x35\x94\xfc\x63\x62\xa7\x93\x8f\xdd\x51\x2a\x36\x0d\x38\ -\x32\xd9\xad\xe4\x8f\x7f\xb0\x33\x73\x51\xc8\x6d\xd8\x98\x52\x51\ -\x7b\x52\x51\x9b\xa2\x5d\xe9\x67\x98\xe7\xed\xa1\x1a\x46\x57\x51\ -\x14\x7c\xa7\xb5\xa7\x14\xdb\x15\x4f\x39\x3b\xf6\x17\x63\x37\x7e\ -\x43\x88\xb4\x2e\x56\x0a\x26\x61\x47\x28\x34\xa0\x00\x98\xe7\x75\ -\x0d\x65\xae\x04\x14\x4e\xad\x03\xc5\xb4\xdc\x6c\x14\x86\x69\x59\ -\x90\x91\xa8\x1e\xac\x0b\xfd\x82\x12\xd5\x3e\xaf\x15\xed\x3c\xbd\ -\xcf\x5d\x10\xdc\xd6\x4c\xfb\xc6\xc5\x27\x34\x9c\xd4\xf8\x64\x47\ -\xc5\xdb\xa0\xf0\x72\x64\x9c\x26\xc4\xb8\x9f\x48\xdd\xaf\x7b\x76\ -\x57\xa9\xaa\xe1\xc0\x8b\x35\xb7\x4d\xca\x8b\x3e\xb2\x63\xf4\xca\ -\x5f\xea\x60\x02\x46\xd1\x98\xfa\x8c\xa2\x36\xc2\x3c\xda\xb5\x9a\ -\xe8\xba\x5c\x14\x5e\x8e\x84\xdf\x6e\xd1\x93\xa5\xef\xf2\x37\xfe\ -\x5a\x94\x1c\x9b\x28\xf8\x7f\xb8\x6a\x68\xff\x6f\x46\xcd\x41\x04\ -\x54\x29\x90\x80\x20\x58\x40\x0a\x34\x3c\x70\x84\x81\x1b\x70\x30\ -\xc0\x07\x50\x98\x2a\x61\x5a\xbe\x92\x66\xc4\xc4\x91\x62\xa1\x4c\ -\x7a\xcf\xd4\x2b\xd6\xe5\x10\x4d\xf4\x26\x15\x93\xe5\x7e\xd2\x7e\ -\xa3\x70\x02\xab\x26\x5c\x96\xae\x4b\xc1\x32\xaf\x8f\x1a\x95\x7b\ -\x6c\xe4\x1e\xe5\x15\xbf\xd2\xe8\x8b\xf3\xf0\x9c\xc9\xa4\xef\xdf\ -\xff\xc7\xd1\xd1\xaf\x7c\x7c\x78\xf4\x16\x38\xcd\x05\x33\x3e\x7c\ -\x34\x95\x94\xed\x80\xe2\x36\xe3\xc1\x82\x8b\x2e\x43\xd7\xa3\x6d\ -\x52\xb0\xcc\xeb\x23\xe3\x13\xba\x6d\x5f\xc5\x76\x6b\x0f\x7d\xa8\ -\x54\x65\x11\xa2\x38\x29\xfd\xfb\xff\xaf\x98\xb9\xfc\xb2\xa9\xe7\ -\xdc\xaa\x05\x13\x53\x50\x81\x21\x8f\xc3\x9e\xe6\x9b\xce\xc1\x14\ -\x50\x6a\x85\x0e\x38\xae\x86\x92\x9b\x58\x3c\x4f\x14\xbb\xdb\xe2\ -\xc1\xba\x5a\x50\x52\x78\x63\x52\xe4\x4a\x45\x0a\xb7\x1b\x9d\xd0\ -\xc2\x84\xcb\x01\x7c\xfd\xa6\xf1\x4a\x21\xf2\xe9\xae\xec\x75\x8e\ -\x53\xf8\x68\xa3\x82\xca\xd4\x9d\x5c\xce\xc5\xdf\xdb\x9e\xfd\xcc\ -\xe7\x47\xc4\xc3\xc3\x4f\xf7\x1f\xfb\x4a\x53\x10\xfd\x1c\xed\x85\ -\xa2\x41\x84\x3f\x0b\xc5\x97\xe5\x6d\x51\x35\x89\xf8\xa8\x3e\x4a\ -\x69\xd9\x8d\x0f\xed\x46\x41\xf9\x8f\x6f\x2d\x8c\xfd\xec\xcb\xbb\ -\xc4\x53\x7a\xe7\xd1\xe0\x41\x03\x06\xaf\x83\x80\x81\xa9\x49\x00\ -\xa6\x4d\x05\x36\xca\xd2\x36\x14\x06\x84\xf4\x3a\x22\xa0\xc0\x5f\ -\xd8\x05\x21\x47\xbe\xbd\x5b\xc0\x5b\x5c\x4d\x13\x14\xca\x34\x81\ -\x85\x4d\x6a\x28\x13\x61\xf5\x51\x12\x0c\xc2\x1f\x3d\x2c\xf6\x67\ -\x9d\x89\x4b\x84\x53\xf8\x58\x94\x41\x05\x9e\xda\x1e\xf5\xc4\x75\ -\x7f\x18\x4d\xff\xc7\x47\x77\x8c\xfe\xe2\x0a\x4f\x64\x4b\xb7\x06\ -\x53\xb0\x8c\xb6\xa0\x81\x00\x45\x83\x46\x35\xe1\xf2\xb8\x2e\xb6\ -\x6b\x22\xac\x3e\x32\x54\x72\xf7\xa8\x8c\x8d\x3f\x51\x2a\x1e\xb4\ -\xc0\xf8\xc9\x09\xff\x4f\x8f\x15\xb3\x17\x7c\x66\xbb\xb8\x6f\xff\ -\xd3\xc1\x02\x03\x87\x29\x88\xd4\xa2\x96\x02\x1b\x6a\xb1\xcc\x18\ -\x4f\xc9\xa7\x46\x73\xce\xfd\x70\x05\xd1\x00\x4e\x5a\x28\x9c\xcc\ -\xe8\xa4\x46\xf3\x28\x80\x96\x69\x5d\xd3\xb8\x5c\x7f\xdf\x17\x1e\ -\x11\xfb\x87\x33\x13\xdf\x2a\x14\xdd\xd3\x94\x8a\xff\xa4\x9e\xc0\ -\x52\xd4\x47\x24\x7b\x7c\xf9\xe3\xdb\xd2\xe9\x0f\x7f\x78\x47\xe6\ -\x7f\xbf\xb4\x57\x6c\x21\xa7\xb8\x10\xde\x6f\x10\xb5\x19\x88\x06\ -\x06\x0c\x18\x28\xd3\x9b\x1a\xe8\x3a\xa6\xf6\x51\x4d\x63\x72\x93\ -\xd8\xe3\xe7\xdc\x83\xfa\x94\x57\x70\xba\x53\xf8\x77\xff\x7e\x2c\ -\xfb\x3f\x10\x4c\x86\xa6\x02\x01\x0d\x1e\x34\x80\x60\x9e\xd6\x81\ -\x00\x4c\x39\x61\xf5\x0d\x07\x3a\x61\x69\x13\xfe\x66\xb0\x6b\x95\ -\x94\xea\x0c\x9d\x5d\x3c\x55\xd3\x9e\x04\xef\x99\x12\xea\xbe\x1f\ -\xec\xc8\x5c\xf6\xc8\xd4\x79\xdf\xa0\xba\x24\x9c\xbc\xc2\x26\x3e\ -\x9c\xe0\x30\xa5\x6a\xea\xe4\x66\xa0\x3c\x50\xb7\x68\x6d\xcb\x0a\ -\xff\xae\xd1\xc9\x5d\x8e\x3f\xf1\xeb\x01\x37\xf7\xab\x58\x52\x4e\ -\x48\x19\x5b\x2f\x95\xe8\x2e\x2d\x67\x44\xf9\x32\x9b\x57\xce\xa6\ -\x31\xa9\x7e\xb7\x2d\x97\xf9\xe1\x2f\x86\x72\x17\x5e\x9c\xce\xdd\ -\x7b\x73\x56\xec\xdf\xa1\x84\x9a\x34\xf7\x13\xeb\x20\x45\x71\xfb\ -\x80\xb8\x2d\x21\x90\xd4\x12\x4c\x30\xa5\xa2\xf0\x72\x23\x90\x7a\ -\x83\x8a\xc7\x2d\x4e\x2d\x13\x4a\x9e\xa9\x8d\x0d\x77\x33\x1d\x54\ -\x68\x23\xe7\x26\x1c\x75\xdb\x6d\x99\xec\x05\xff\xbb\x5b\xec\xd2\ -\x47\xa8\xe0\x73\x54\x26\x60\xdf\xd0\xfd\xc8\xf3\x5c\xf0\x19\xaa\ -\xa9\x84\x75\xc0\xd2\x02\x7e\xbb\x6a\xc1\x11\x45\x47\x7d\x52\xc8\ -\x42\xdd\x6f\x18\x6e\x24\x79\xdf\xdf\xf4\xc7\x74\xf6\x82\x8f\x8e\ -\x88\x87\xf5\x04\x61\x72\x68\x9c\xe4\x40\x10\x70\xb8\xb0\x9e\x4f\ -\x84\x38\x48\xe8\x60\x68\xe6\xa0\xc0\xf1\x00\x69\xf9\x2f\xc3\xe5\ -\xfa\x0f\xaf\x43\x85\x88\x2d\xef\x13\xf1\x1e\x4f\x24\x56\x7b\xa2\ -\x7f\x4d\x8f\x58\xd5\xdd\x2b\x56\xa5\xdc\xd4\x4a\xbf\x98\xec\x1a\ -\x2d\x8e\x0e\x15\xa4\xc8\x8f\x17\xc4\xc4\xdd\x23\x62\xe7\x43\x3a\ -\xaf\x03\x87\x33\xaa\x0f\x4f\xe0\x87\x38\x74\x47\xa1\x2d\x14\x87\ -\xf6\x95\x8a\xda\x14\xec\x83\x29\xda\x0d\xd2\x30\xa1\x4d\x71\x3d\ -\x10\x6f\x1f\x04\x60\xda\x68\x82\xfe\xdf\x70\xd8\x82\xe3\xa4\xef\ -\xfd\x8f\x3e\x46\x7b\xf1\x54\xf5\xc1\x81\xa7\x5d\x61\x8f\x27\xaf\ -\xfc\xd9\x8e\xd1\x6b\x36\x7a\x62\xa2\xc2\xd1\x3d\xee\x2f\x14\xee\ -\x6b\x3a\x76\xf8\x38\xa2\x0a\xdb\xe7\x40\x43\xf7\xb5\xc9\xb9\x2d\ -\x2d\xe2\xc6\x23\xc4\x2a\x51\x48\xfe\xab\xf0\x13\xff\x50\xaa\x6a\ -\x3b\xf2\xc2\x7b\xec\x91\xdc\xf8\xf7\x3f\x35\x24\xfe\x48\x5e\x0d\ -\xc2\x9d\x9f\x0e\x00\x93\xda\x66\x00\x30\x70\x3c\xe0\xc4\x8f\xa7\ -\x1f\xf0\x7c\x36\x28\xa6\x0f\x4f\xe2\x4b\xb5\x52\x42\x24\xdc\x84\ -\x88\x69\xa3\xc4\xf5\xe4\x10\xd7\x1b\xef\xe6\xf4\xe7\x23\x3a\xd5\ -\x9d\xc2\xe5\xf9\xa9\x0a\x10\x85\xf6\x93\x0a\xed\x81\x42\xbb\x52\ -\xfb\x72\x1b\xd2\x3c\x15\xb6\xc7\xbf\x03\xa1\xf9\x46\x12\xf4\xfd\ -\xba\x23\xc5\x60\x2c\xd7\xf5\x77\x52\xc5\xfe\x2b\xa8\x9d\xe3\x04\ -\xa7\xb8\x94\xff\xc0\x9f\xd3\xd9\x0b\xbf\x39\x2a\x36\x6d\xf5\x84\ -\x82\x9d\x64\x00\xf7\x8b\x69\xbf\xe3\xbe\xa5\x63\x88\xa7\x20\x5c\ -\x1e\xd7\xc7\x36\x71\x1f\x63\xda\x10\xc0\xe1\x2d\x6d\xc2\x19\x7b\ -\xc4\x44\x77\x7f\xaa\x4f\x49\xe7\x74\x3d\xf2\xda\xee\x74\x00\x04\ -\x93\x4d\xb9\xf1\x0b\x3f\x37\x24\xee\xdf\x3d\xdd\x31\xd1\x61\xd1\ -\x81\xf9\x60\xe0\xc2\xcf\x71\x79\x5c\xa7\xd5\xe0\x64\x8f\x13\x3f\ -\xaa\x7c\xb4\x02\xa9\x1e\xbd\xce\x3e\x2d\xb8\xff\xf5\x29\x4f\x38\ -\xfa\x08\x44\x8e\x6a\xe9\xa0\x22\xb3\x5a\xba\x23\xb8\x6c\x18\xd8\ -\xe7\x30\x51\xfb\x80\xd0\x66\x90\xe2\xa4\x41\x27\x0f\x53\x19\x04\ -\xeb\x60\x7b\xb4\x7d\x0a\x2f\x37\x12\xb0\x8b\xc8\xed\x16\xf9\xe3\ -\x06\xbb\x07\x1c\x29\x5f\xae\x8b\x3d\x50\x37\x57\xf1\x94\x1c\x19\ -\xf1\xe4\x2f\x7e\xb8\x63\xec\x5b\x3f\x1c\x17\xbb\xe0\x94\xa7\xde\ -\x19\xe8\x57\x54\x08\xdd\x4f\x20\xd8\x77\x28\xdc\xa7\x74\xff\xd2\ -\x7a\x5c\x1e\xd3\xa6\x63\x03\x4a\x1b\x71\xb9\x76\x8c\x37\x2f\x5c\ -\xa0\x5c\x5f\x2d\xd7\xd3\x12\xfc\xd4\x68\x5b\x10\x5c\x33\x51\xfe\ -\x7d\x77\xa7\xc7\xbf\xf9\xa5\x27\xc5\xa6\x27\xa7\x3b\x2b\x75\x7e\ -\x74\x64\x14\x75\x7a\x2e\xfe\x19\xac\xdb\x6a\x70\x60\xf3\xc1\x0e\ -\xa2\x47\x1a\xd3\x02\x0c\x49\xa9\x00\x4c\x39\x26\x9b\x61\xca\x85\ -\x76\x82\x14\xc4\x03\x0a\xa4\x34\x98\xf0\xf5\xa1\x5d\x0e\xd6\x99\ -\x3e\x6b\x24\x81\x3d\xe0\x8a\xfc\x9b\xe7\xe5\xa4\x23\xd5\x32\x29\ -\x62\xcf\x82\xba\xb9\x86\x36\x6c\x4e\x1f\x95\xdc\xf3\xe0\xe8\xd8\ -\x37\xfe\x73\x77\xee\xe6\x3f\x78\xa2\x00\xaf\x9e\xd1\x98\x7c\x82\ -\xee\x0f\x2e\xba\xef\x2b\xe5\x51\xb8\x0e\xa4\x4d\xc7\x06\x94\x36\ -\xe3\xcd\x23\x63\x69\xb7\x2f\x36\xa9\x47\xdb\x49\xda\xf5\xe6\x95\ -\xaa\x5b\x46\xf0\xab\x81\x45\x75\xf3\xb5\x43\xd9\x6f\x7f\x37\x1b\ -\x5c\x44\x44\x47\x45\x87\x07\x30\x4f\x9d\x9a\x3b\x3d\x15\x2e\x87\ -\xcb\xa2\x38\xa6\xba\x46\x83\x01\x01\x07\x3e\xa4\xa6\x80\x51\xa9\ -\x1e\x85\xd0\x3e\x72\x51\x5b\x80\x4c\xf6\xa2\xa2\xc1\x83\xe6\xa9\ -\xb8\x5d\xb9\x5a\x05\xda\x44\x9e\xbe\x5f\xe4\x7b\x7b\x93\x0b\xa5\ -\xeb\xbc\xb2\x54\x37\x27\x80\x3f\xbe\x0a\x52\x3e\xbe\x7d\xd2\xb9\ -\xf0\xd3\xc3\x99\x1f\x5c\x3f\x2e\xf6\x0c\xe9\xa3\x12\x6d\xf4\x4a\ -\xbe\x01\xf0\x7d\x66\xf2\x09\xbe\xbf\xe9\x32\x5c\x26\xf0\xbb\x1a\ -\x86\x0d\x28\x6d\xc6\xa5\xda\x19\xde\x94\xce\x0f\xc7\xfb\xdd\x7d\ -\xca\x71\x5f\xaa\x3d\xaf\x65\xa7\xbe\xe0\x01\xbc\x3d\xbe\xfc\xf9\ -\x8f\x86\x33\x97\xff\xdc\x13\x99\xcc\x54\x35\x77\x4a\x3a\x08\x40\ -\xe8\xd0\xe8\xf0\x74\x00\xa0\x70\x19\x14\x6f\xa3\x95\xd0\x01\x8f\ -\x79\x2e\x1a\x48\x78\x50\x01\x30\x45\x78\xff\x50\xd8\x77\xb4\x83\ -\xc9\x56\x20\x3c\x0a\xe1\x13\x4a\xa5\x09\x86\x7f\x17\x88\xc2\xcb\ -\xcd\xa0\x6c\x9f\x11\xbd\xed\x27\x2f\xec\x05\xdf\x3e\x46\x0a\x7d\ -\x44\x3e\x07\x80\xdb\xc3\x77\xfb\xce\x4f\x2e\xdd\x9e\xfe\xe6\xa5\ -\xe9\xdc\xe6\xcd\x4a\xf8\xe3\xd3\xfd\x02\x41\xdb\xd3\x7d\x03\xa2\ -\xfb\x0f\x44\xf7\x6d\x35\xe1\xf2\xbc\x4d\x54\x53\xb0\x01\xa5\xbd\ -\x08\x1c\x2f\xaf\x7d\xf3\xc8\x25\x85\x2d\x31\xe9\x3c\xe9\x08\xf7\ -\xb9\xba\xaa\xa9\xe7\x99\xe1\xaf\xac\xbc\xf0\x1f\x7d\x3c\x3f\x76\ -\xf1\xa7\x86\x73\xbf\xb9\x53\x1f\xae\xeb\x6d\xa2\x4e\x89\x79\xea\ -\xb0\x28\x3e\x18\xf8\xc0\xc0\xcf\x51\xb8\x0e\xa4\x08\xcd\x37\x9b\ -\xf2\xa4\x47\xd2\x5a\x05\x60\x0a\xa0\x4d\xb8\xb8\x0d\x40\x26\x5b\ -\xf1\x80\x51\x49\xb4\x0d\xfc\x0e\xfa\x9d\x00\x4f\x5b\x41\x60\x2b\ -\x78\x54\xfe\x2f\xf7\x4d\xee\x4f\xf5\x38\x42\x1f\xa5\x98\x7e\x5b\ -\xa7\x63\x08\x9e\x33\x2a\xca\x9f\xfe\x7a\x7b\xfa\xfc\x0b\xd2\xb9\ -\x3f\xde\xa1\xc7\x0b\xfc\x0e\x82\x86\xfa\x02\x42\xf7\x01\x8a\xee\ -\x33\xba\x2f\x67\x22\x58\x87\xee\xf3\x96\x60\x03\x4a\x7b\x11\x38\ -\x20\x9c\x63\xde\xb9\x57\xe4\x36\xc4\x8b\x7f\x4a\xf9\x5d\xb7\x3b\ -\x8e\xbb\x44\x4a\x7f\x3d\x7c\xd6\x48\x82\x40\x22\xe5\x13\xbb\x26\ -\xe4\x0f\x6f\xde\x39\xf6\xe3\x6f\x8f\x8a\xc7\xb6\xeb\xbf\xb2\x98\ -\x77\x62\x11\x1d\x97\x0a\x9d\x1a\x1d\x9c\x3b\x3c\x75\x7c\x2a\x5c\ -\xbf\x1d\xa0\x81\x01\x05\x98\xf2\xb4\x4c\x53\x84\xda\x06\x85\xfd\ -\xe5\x36\xa2\x79\x2a\xd3\x91\x09\x8a\xaf\x8f\x6d\x63\x8a\x02\x78\ -\xda\x2a\xca\xb6\x7b\x5c\xf7\xeb\x45\x03\xf3\x0a\xae\x94\x2b\x9b\ -\xe1\xdf\x51\x03\x6f\x3e\x48\xfb\xe2\x37\xf7\x66\x32\x17\x7c\x71\ -\x77\xee\xf6\xdf\x79\x62\xe2\x29\x6d\xdd\x10\x03\x9b\xf6\x03\xdd\ -\x5f\x54\x74\x1f\x57\x13\x2e\x4f\xdb\x03\x20\xc5\x7c\xd3\xe0\x03\ -\xc0\xd2\x5a\xe8\xc4\x04\x72\x4e\xd1\x41\xff\xdc\x55\x62\xd9\x22\ -\xd9\xf5\x97\x71\x37\xf1\x36\x09\x3f\x59\x1a\x31\x30\x30\xb2\xca\ -\xbf\x67\x6b\x61\xec\xc6\xef\xee\x12\x7f\xda\xef\x09\x1f\xae\x95\ -\xb0\x47\xc3\xa9\x73\x52\xe7\xa5\x83\x00\x52\x9c\xfc\xf8\xed\x8d\ -\xf4\xd6\x46\x14\x0e\x0a\x1c\x10\x54\x00\xa6\xcd\x84\xee\x03\x00\ -\x4f\x69\x41\x0a\x82\x3f\xc2\x30\x45\x55\x7a\x81\x1f\xee\x4b\x2a\ -\x84\xf7\x19\x6d\xc9\x85\x36\x32\xe5\xe9\x72\xd8\x06\xb6\x07\xd0\ -\x3c\x40\xf3\xad\x00\xfb\x1f\xd8\xe6\x7f\x84\x48\x1e\xbd\xa6\xe7\ -\xf5\x31\xe9\x7e\x43\x0a\x55\xf1\x81\xd1\x76\x01\xee\xdc\xca\xf8\ -\xea\xb7\x0f\x8c\x65\x6e\xfc\xd1\x7e\xb1\xf5\x49\x4f\xa8\x7d\xe1\ -\x76\xe5\xb6\xa7\xa2\xfb\x8e\x0a\xf7\x31\x8e\x11\x9a\x52\xe1\x72\ -\x28\x5c\x9f\x7f\x0f\x80\x69\x43\xa1\xce\x6d\x69\x3d\xb8\x3f\x70\ -\xe2\x09\x26\xb1\xe3\xf4\xe4\xb4\x58\x4f\x5a\x47\xf5\x88\xee\xe7\ -\xcc\x13\x47\x0e\x26\x93\xaf\x72\x9c\xae\xe7\xb8\xc2\x7f\x96\xf4\ -\xd5\x7c\x58\x61\x26\x40\x00\xc9\x29\xf9\xe8\xb8\xf2\x9f\xd8\x3e\ -\x96\xb9\xfb\xb6\xfd\xe2\x89\x07\x85\x98\xd8\xa7\x07\xc6\x93\xd3\ -\x1d\x8f\x3b\x21\x3a\x28\x8a\x0f\x02\x48\xa9\xc3\xd3\x80\x42\xeb\ -\x51\x74\x20\xf0\xb6\x01\x4c\x9b\x0d\xdf\x0f\xe5\x7d\x51\x12\x06\ -\x0b\x1e\x3c\x78\x19\x44\xdb\x40\x21\xbc\xcf\x68\x07\x6a\x4f\x14\ -\x96\x79\x3d\x8a\xb7\x01\x60\x1d\x42\xf3\xad\x02\xfb\x0f\xa9\x73\ -\xa4\xd6\xa7\xd7\x8a\xd5\xfd\x32\xf9\x7e\xa9\x12\xef\x9a\xfa\xa8\ -\x3d\x81\x53\x5b\x23\x45\x71\xcd\xef\x87\xd2\x37\x5c\x2f\xc4\xfe\ -\x3d\x95\x03\x09\xc0\xf7\x03\x15\xdf\x7f\x28\x1c\x13\x28\x3a\x56\ -\x78\x1e\x97\xa1\xeb\x63\xdb\x90\x02\x3c\x6d\x28\xd4\xb9\x2d\xad\ -\x87\x0e\xb6\x60\xc0\x95\x14\x4c\x50\xf3\x74\x50\x81\xc0\xb2\xa0\ -\x4b\x24\x93\x4a\xc4\xbb\x95\x48\x3c\xab\x57\x0c\xae\xeb\x12\xeb\ -\x12\x8e\x58\x98\x74\x93\x87\xc6\xfd\xde\x05\xbe\x12\x8e\x5e\x59\ -\x6a\x0f\x0a\x54\xf4\x8b\xe3\xfb\xf3\xa3\xc3\x63\xbe\xc8\x6c\xdb\ -\x27\x9e\xfc\xbd\x10\x69\x78\x45\x30\x5c\x17\x81\x20\x02\x83\x02\ -\xbc\xd2\x00\x75\x42\xea\x98\xd4\x71\x51\xe8\xdc\x20\x70\x76\x1a\ -\x44\x66\x7a\x74\x82\x6a\x15\x74\x3f\x00\x18\x18\x70\x7f\x50\xf1\ -\x60\x42\xeb\x61\x1d\x93\x10\xde\x5f\x93\x5d\xd1\xb6\xbc\x0e\xc5\ -\xd7\x05\x01\x34\x0f\xd0\x7c\x2b\xc1\xfe\xa3\x2d\x82\xa3\xf0\x7f\ -\x5d\xd5\xff\xd2\x94\x23\xce\x97\x52\xad\x0c\x3e\x6d\x23\x68\x20\ -\xf9\x95\x10\xa3\xfa\x88\x04\x2e\xb6\x03\x61\x36\x35\xed\x03\xbe\ -\xaf\x4c\xa2\x63\x02\x85\x63\x85\xa7\x54\xb8\x3e\xb6\x4f\x85\xd0\ -\x7c\xc3\xa0\xce\x6d\x69\x3d\x07\x0c\x36\x22\x9c\xb0\xf0\x37\x12\ -\xe0\x0e\x99\x78\x9f\xd6\xa0\x96\x5e\x20\x9e\x88\xeb\x54\x89\x98\ -\xce\xc7\xb4\x77\xb9\x20\xed\x45\x4e\x51\x8f\x08\x08\x20\xda\x13\ -\x83\x07\xef\xb4\x90\x4a\xfb\xdf\xe4\x8c\x90\x82\xd0\x79\xd1\x91\ -\xb9\x83\x83\xd3\xa3\xaa\x05\x13\x6c\x03\xdb\x06\x01\x98\xb6\x02\ -\x6a\x17\xdc\x17\x28\xba\x4f\xa8\x68\x30\x41\xe1\xf2\x90\x02\xd8\ -\x06\x40\xfb\x49\x85\xf6\x40\x9b\xd0\x32\xaf\xa7\x29\x0a\xa0\x79\ -\x80\xe6\x5b\x0d\xb7\x45\x60\xab\x0f\x08\x91\x3a\x65\x4d\xcf\x5f\ -\x26\x5c\xf7\x4b\xfa\x10\x7a\x21\x2c\xd0\x4a\xe0\x7a\x62\xd1\x11\ -\x3b\x47\x0a\xf2\x37\x10\x48\xae\xd1\x47\x24\x24\x90\x20\xdc\xae\ -\x26\xfb\x43\x6a\xda\x67\x54\x38\x0e\xe8\xb8\x00\xd1\xb1\xc2\xc7\ -\x0d\x88\xb7\x83\xdf\x0b\x02\x78\xda\x70\x70\xe7\x5a\xda\x03\xe3\ -\x60\x23\xe2\x01\xc5\x94\xa2\x30\x00\xc1\x7a\xd8\x16\xb6\x0b\x60\ -\x5a\x09\x93\x63\xa2\xe3\x52\x47\xe6\x8e\x4e\x83\x07\x17\x7e\x8e\ -\xeb\x61\x7b\x54\x00\xa6\xad\x82\xda\x07\xed\x06\xa2\xf6\xa4\xe2\ -\x75\x74\x59\x14\x80\x29\xef\x27\xb5\x03\xda\xd5\x94\xa7\xa9\x49\ -\x00\xa6\x00\xcd\xb7\x0b\x68\x83\xb2\x9d\x56\x6b\x7d\x60\x85\x58\ -\xb0\x26\xd1\xf5\x96\x98\x88\x9d\xa7\x2b\xbb\x82\x25\x9a\x0c\x3c\ -\x77\x05\x0f\xf1\x6e\xf7\xc6\xae\xbf\x69\xa7\x78\xe8\x1e\x21\x26\ -\x23\x08\x24\x98\xa7\xfb\x0f\x7d\x9f\xe6\x21\xa5\xc2\xf1\x62\x12\ -\xae\x0b\xa2\xdf\x05\xe0\x77\x02\x98\x36\x05\xdc\xb1\x96\xf6\x01\ -\xf6\x09\x15\x4e\x50\x18\x20\x4c\x41\x85\xe7\x71\x19\x5c\x8f\xb6\ -\x05\x29\x80\x69\x25\xb8\x63\x82\xb8\x13\xa3\x73\xa3\xa3\xf3\xc0\ -\x41\x85\xcb\xa0\xb0\x1d\x2e\x00\xd3\x56\xc2\x6d\x05\x29\xaa\x3c\ -\x19\xb2\x3c\x4d\x4d\xa2\xd0\xbe\x52\x51\xfb\xf2\xba\x4a\x02\x30\ -\x05\x68\xbe\x9d\x40\x3b\x40\x8a\xf6\x83\x97\x70\x3a\x1f\x59\xae\ -\x83\x4a\x57\xd7\xd9\x09\x19\xff\xa0\xf4\xd5\x02\x58\xa8\xd1\x04\ -\x47\x23\x42\x6e\xdf\x3b\x29\x7f\x7d\xdb\x53\xa3\xbf\xbb\xb9\x74\ -\x7d\x04\x6e\x4c\x01\x27\x25\x70\x7b\x52\x9b\xd3\xbc\x69\xbf\x41\ -\xca\x85\x63\x80\x8e\x89\x4a\xa2\xeb\xa0\xf0\x7b\xb8\x10\x9a\x6f\ -\x38\xdc\xc1\x2d\xad\xc7\x38\xd8\x4a\xaa\x16\x54\x50\xa6\x80\x02\ -\x79\x48\x51\x00\xa6\x1c\x74\x42\x9a\x82\xd0\x81\xa9\x43\x53\x47\ -\x07\xf1\x60\x42\xeb\xa8\x70\x7d\x6c\x1b\x85\xd0\x7c\xab\xa0\xf6\ -\xa1\x36\xa3\xa2\x76\xe5\x36\xe6\x32\x81\xfd\xa4\x36\x40\x99\xec\ -\xc3\x05\xf0\x14\xa0\xf9\x76\x03\x6d\x81\x76\x01\xbb\x05\x5a\xa4\ -\xfd\xf5\x84\x01\x11\x7f\xe3\x80\x58\xbb\x24\x9e\x7c\x67\x5c\x25\ -\xde\xaa\x17\x68\xc8\xd1\x8a\x0f\x77\x6b\x29\x75\xc7\xf6\x42\xe6\ -\xf7\x70\x77\x63\x66\xea\xa6\x14\x7e\x34\x02\x98\xec\x4a\x53\xcc\ -\xd3\xfd\x85\x79\xf4\x73\x2e\x1c\x03\x34\x35\x89\x7e\x86\xeb\xa2\ -\xf0\xbb\xb8\x10\x9a\x6f\x0a\x61\x4e\x6e\x69\x1d\xa1\x83\xad\x24\ -\x0c\x16\x34\xa8\x70\xc1\x67\x28\x5c\x0f\xdb\xa2\xed\xd3\x14\xe1\ -\x0e\xc9\xc5\x9d\x9a\x3b\x3d\x0d\x1e\x3c\x4f\x97\x07\x99\xda\x07\ -\x30\x6d\x07\xa8\x7d\xa8\xcd\x66\x22\x00\x53\x0e\xed\x33\xcf\x87\ -\x09\xe0\x79\x0a\x2f\xb7\x23\xdc\x46\xd4\xbf\xdd\x23\xb5\x1f\xbf\ -\xb4\x4b\x74\x3f\x6f\x50\x1c\x39\x3f\x99\x7c\x7d\x5c\x24\x5f\xe2\ -\x48\xb5\x41\x7f\x36\x6b\xe0\x74\x56\x5e\xc9\x47\xd3\x45\xf5\xc7\ -\x47\x26\xd3\xf7\x5c\xb1\x5f\x6c\x9d\xd0\xb6\x32\xdc\xdd\x08\x84\ -\x95\x69\x6a\x12\xfa\x35\xfa\xb8\x49\x38\x06\x68\x8a\x32\x95\xe9\ -\xb2\xf4\x3b\xb8\x00\x9e\x36\x95\x30\x27\xb7\xb4\x0e\xdc\x27\xa6\ -\xc1\x56\x1e\x70\x25\x61\xf0\xa0\x81\xa4\x96\x80\x02\x02\x30\xe5\ -\x50\xa7\xa4\x42\xe7\xe6\xa2\x03\xa0\x92\x70\x59\x6c\x8b\xb7\x8f\ -\xd0\x7c\x3b\x40\xed\xc4\x6d\x07\x29\x15\x60\x2a\xd3\x14\xe1\x7d\ -\xc6\xb2\x29\x4f\xcb\xa6\x14\xa0\xf9\x76\x87\xda\x84\xfa\x67\xd9\ -\x77\xfb\xb4\x2f\xaf\xd0\x47\xe0\x83\x29\x91\x38\xcc\x17\x5d\xcf\ -\xe9\x15\xab\x97\xa7\x52\x27\x76\xc7\xba\x8e\x75\x1d\xff\x10\x29\ -\x55\x9f\x2b\xd5\xa1\x7a\xc5\x94\x5e\xbe\x8c\x36\x42\xae\x08\x2f\ -\x82\xf6\x24\xfc\x1c\x4d\x7a\xcc\x53\x7f\x7e\x6a\x62\xf4\x91\xdf\ -\xef\x17\x4f\xfc\x59\x88\xc9\x89\xd2\x9d\x8d\x35\xde\xf2\x0b\x60\ -\x9e\xa6\x5c\xe8\xcf\x38\x26\xc2\x44\xc7\x01\xa6\x61\x79\x48\xb9\ -\xf8\xf7\xa2\x00\x4c\x01\x9a\x6f\x1a\xdc\xc1\x2d\xad\x87\xee\x13\ -\x3e\xd8\x50\x34\x60\xd0\x00\xc2\x83\x09\x08\xd7\x81\x36\x4c\x32\ -\x41\x1d\x14\x85\xce\xcc\x1d\x9c\x0f\x0c\x2e\xba\x0c\x8a\xb6\x07\ -\x02\x78\xda\x6e\x50\x5b\xf1\x3c\x96\x69\xca\xeb\x00\x9a\x07\x68\ -\x5f\xc3\xec\x50\x2d\x45\x78\xb9\xdd\xe1\xb6\xa2\xfe\x0d\x42\x7f\ -\x0e\xa4\x23\x46\x6c\x91\x0e\x2e\x03\x42\x24\xba\xe3\x22\xa1\x57\ -\x80\xfa\xb8\xee\x75\x0c\xf2\x0b\x75\xfd\x80\x12\x89\xcd\x52\xe4\ -\xb5\x63\x39\x45\x25\xa4\x3e\x24\x06\x89\x9c\xf6\x3e\x78\x0f\xdd\ -\x88\xb6\x11\x38\x62\x0d\x50\x5b\x52\x7b\x87\x89\xfa\x74\x25\xf1\ -\xf1\x50\x2d\x45\xd1\xef\x30\x09\xc0\x14\xa0\xf9\xa6\x82\x3b\xd5\ -\xd2\x5e\xe0\x7e\x81\x14\x65\x1a\x70\xd5\x44\x97\xc7\x36\xb0\x3d\ -\x00\x53\x0e\x75\x52\x2a\xea\xe4\x54\x30\x00\x4c\x83\x82\x0f\x0c\ -\x10\x6f\x13\x85\xd0\x7c\xbb\xc1\xed\x45\xcb\xdc\xa6\x3c\xad\x86\ -\xc9\x06\x3c\x05\xb8\x7d\x78\xb9\x93\x00\xdb\xa0\x7d\xa8\xaf\x82\ -\xd0\x87\xcb\x41\xa5\x24\xd3\x35\xc3\x98\xfe\x27\x58\x5e\x07\x10\ -\x5c\x1f\xdb\xa6\xdf\x81\x69\x18\x26\x3b\x43\xca\xf3\x20\xf4\x65\ -\x9a\x9a\x44\xc7\x00\x1f\x23\x61\x75\x54\xfc\xfb\x50\x00\xcd\x03\ -\x34\xdf\x12\xaa\x19\xd8\xd2\x1a\xf8\x00\x80\x94\x0e\x36\x2a\x1a\ -\x3c\x30\x4f\xcb\x90\xe2\xfa\x90\xa2\x00\x4c\x39\xdc\x61\x51\xdc\ -\xd9\xa9\xaa\x0d\x0c\x10\x6f\x0f\x85\xd0\x7c\x3b\xc3\xed\x46\xcb\ -\x61\xf9\x5a\xa8\x64\x0b\x93\x6d\x3a\xc5\x5e\x61\xa0\x7d\x20\x05\ -\x81\x8f\x52\x81\xff\x42\xc0\xc0\x14\x64\x0c\x28\x5a\xd4\xef\x51\ -\xd8\x2e\xfd\x9e\x4a\x70\xfb\x63\x19\xf3\x20\xea\xc7\xd4\xaf\x31\ -\x8f\xe2\xe3\x80\x8f\x8f\x4a\xe3\x04\xc4\xbf\x8b\x0b\xc0\x14\xe1\ -\xe5\xa6\x53\xcd\xc0\x96\xd6\x41\x07\x01\x15\x1d\x30\x28\x1c\x48\ -\x3c\x45\xe1\x7a\xb4\x1d\x00\x53\x0e\x75\x58\x2a\xee\xec\xa0\x7a\ -\x06\x06\xc0\xd3\x4e\x21\xcc\x76\xbc\x3e\x6c\x39\x8e\xa9\xff\xb5\ -\xd6\x75\x2a\xd4\x0f\x51\xd4\x6f\x31\x48\x80\x4c\x41\x04\x85\x9f\ -\x9b\xfc\x9e\x0a\xc0\x94\x43\xed\x0a\x79\x2c\x63\x9e\xfa\x30\xf5\ -\xeb\x30\x85\x05\x14\xd3\x67\xa8\xb0\xef\x01\x01\x3c\x8f\xd0\x7c\ -\x4b\x09\x33\xae\xa5\xf5\xd0\x7d\x83\x03\x02\x84\x03\x85\x0e\x1c\ -\x2a\x3a\xa8\xf8\xf2\xd8\x06\x08\xc0\x94\xc3\x1d\x18\x45\x9d\x9e\ -\x8b\xd7\xd3\xe5\x4d\x02\x30\x05\x68\xbe\xd3\x08\xb3\x23\x50\xe9\ -\x33\x4a\xb5\xfe\x77\xb2\x7d\x2a\x41\x7d\x11\x84\xbe\x8b\xc2\x80\ -\x82\x41\xc3\x14\x48\x30\x8f\xc2\x75\xb1\x4d\x14\x80\x29\x87\xfb\ -\x24\xa4\x5c\x26\x3f\xaf\x24\x53\xe0\xa0\x75\xb4\x2d\xda\xbe\x49\ -\x00\x4f\x01\x9a\x6f\x39\x61\xc6\xb5\xb4\x07\x7c\x10\x40\x0a\xc2\ -\xc1\x42\x53\x2e\xd3\x72\x28\x80\xe6\x39\xd4\x71\xa9\xa8\xc3\xf3\ -\x81\x40\xf3\x74\x19\xcc\x03\x3c\x8f\xd0\x7c\xa7\x13\x66\xd3\x99\ -\x32\x97\x6c\x52\x09\xee\x8f\x20\xea\xc7\x20\x1a\x2c\x4c\x81\xa4\ -\xd6\x80\x02\x02\x30\x45\xb8\x4f\x42\xca\xc5\x7d\xdd\x54\x0e\x3b\ -\xf2\x40\xc1\xe7\x74\x1d\xde\x2e\xa4\x5c\x00\x4f\x11\x5e\x6e\x39\ -\xdc\xb0\x96\xf6\x82\xee\x1f\x3a\x18\x50\x74\xd0\xd0\x41\xc4\x53\ -\x93\x00\x4c\x39\xd4\x81\xc3\x64\x1a\x08\x61\x83\x02\x04\xd0\x3c\ -\xc2\xcb\x73\x15\x93\xad\x0f\x96\xbe\x57\x83\xfa\x23\x0a\xfd\x19\ -\x44\x83\x05\x8a\x06\x11\x9a\xc7\xe5\xc3\x7c\x1f\xc0\x14\xa1\xfe\ -\x89\x29\x8a\xfb\x37\x8a\x97\xa9\x78\x60\x09\x5b\x17\xdb\xa5\x65\ -\x80\xd6\x23\x61\xf9\xb6\x82\x1b\xd6\xd2\x7e\xd0\x7d\x44\x07\x84\ -\x49\x74\x10\x55\x1b\x50\x98\x0f\x03\x9d\x16\x1d\xbb\x92\xf8\xe0\ -\x40\x01\x3c\x4f\xe1\x65\xcb\xc1\x09\xf5\x4b\x00\x7d\x17\x52\x2a\ -\x0c\x1a\x54\x61\xc1\x04\x84\x6d\x40\xca\xbf\x83\xc3\xfd\x95\x8a\ -\x06\x01\x14\x2f\x87\x89\x2e\x47\xdb\xaa\x24\x80\xa7\x08\x2f\xb7\ -\x15\x61\xc6\xb5\xb4\x17\x74\x3f\xd1\x81\xc1\xf3\xb5\x08\xe0\x29\ -\x87\x3a\x2d\xe4\xa9\x73\x57\x13\xc0\xf3\x34\x05\x68\xde\x62\xa1\ -\x7e\x88\x7e\x8a\xc2\xe0\x00\xa2\x41\x83\x8b\x7f\x8e\xeb\xf2\xf6\ -\x10\xcc\x73\xbf\x34\x29\x2c\x30\x70\xf1\x7a\xbe\x2e\xa4\x95\x04\ -\xf0\x14\xe1\xe5\xb6\x84\x1a\xd8\xd2\xde\x98\x06\x03\x4d\x79\xde\ -\x54\x07\xf0\x34\x8c\x30\x07\x87\x94\xe7\xc3\x3e\xa3\x29\xc2\xcb\ -\x16\x0b\x40\xfd\x11\xfd\x15\x04\x41\xc1\x24\x1a\x3c\x78\x40\x01\ -\xe1\xba\xb4\x2d\x10\x82\x79\xea\x8f\x90\x37\x89\x06\x85\x99\xe4\ -\xb1\x8c\xf9\x30\x01\x3c\x45\x78\xb9\xad\xa1\x06\xb6\xb4\x3f\x7c\ -\x7f\x61\xd9\x94\x56\xfa\x8c\xa6\x26\xc2\x9c\x9a\xa6\xa6\x3a\x53\ -\x4a\x31\xd5\x59\x2c\x88\xc9\x47\x41\x3c\x48\xd0\xc0\x61\x2a\x83\ -\x70\x59\x6c\x03\x15\x06\xf5\x5b\x2e\x1a\x2c\xc2\x52\xcc\xd3\xfa\ -\x6a\x02\x30\x05\x68\x1e\xe0\xe5\xb6\xa7\x92\x81\x2d\xed\x09\xdf\ -\x67\xb4\x8c\xf9\x5a\xeb\xaa\x11\xe6\xec\x98\xaf\x56\x87\x98\xea\ -\x2c\x16\x13\xdc\x5f\x21\x05\xd1\x20\x51\x4d\x74\x79\x2a\x00\x53\ -\x0e\xf5\x5f\xae\xb0\x60\x81\x79\x53\x00\xc1\x3a\x80\x7f\x06\x60\ -\x0a\xd0\x3c\xc0\xcb\x1d\x43\x98\x71\x2d\xed\x8f\x69\xdf\xd1\xba\ -\x5a\xf2\xb5\x50\xab\xe3\x9b\x06\x41\xc7\x0e\x0c\x4b\xcb\x30\xf9\ -\x2a\xa4\x20\x1e\x2c\x78\x00\xe1\x9f\x73\x01\x98\x72\xd0\x57\x21\ -\xad\x24\x1e\x3c\x4c\xc1\x84\x0a\xe0\x79\x84\xe6\x01\x5e\xee\x38\ -\xc2\x8c\x6b\xe9\x1c\x4c\xfb\xb0\xd6\xba\x99\x60\x72\xf6\xb0\x01\ -\xd0\xf1\x03\xc3\xd2\x52\xa8\xaf\x62\x1e\x52\x14\x0d\x18\x61\x41\ -\x04\xcb\x00\xad\xaf\x04\xf8\x2d\xfa\x2e\xe6\xeb\x11\x10\x96\x52\ -\x4c\x75\x1d\x49\x35\x03\x5b\x3a\x87\x6a\xfb\x32\x8a\x7d\x5d\xc9\ -\xf1\xe7\xcc\xa0\xb0\xb4\x05\xd4\x5f\x31\x0f\x69\x25\x99\x8e\x4c\ -\x00\x9e\xe7\x50\xdf\x85\x3c\x96\x31\x5f\xa9\x0e\x05\xf0\xbc\x29\ -\xa5\x98\xea\x3a\x1a\x93\x71\x2d\x73\x83\x46\xef\xdb\x39\x37\x18\ -\x2c\x6d\x07\xf5\x61\x1e\x10\x20\x0d\x13\x60\x2a\xd3\x94\x42\x7d\ -\x99\x06\x80\x7a\xf2\x08\xcd\x23\xa6\xba\x39\x81\xc9\xb8\x96\xb9\ -\xcb\x6c\xf7\xf7\x9c\x1d\x00\x96\xb6\x87\xfa\x2c\xcf\x63\xd9\x94\ -\xa7\x65\x9a\x56\xc2\x14\x08\x20\xa5\xf9\x5a\x52\x80\xe6\x11\x53\ -\xdd\x9c\xa2\x16\x23\x5b\x2c\x16\x4b\x2b\xe1\xf3\x54\x58\xb0\x08\ -\x4b\x01\x9a\xaf\x84\x29\x28\xf0\x14\xa8\x54\x47\x31\xd5\xcd\x59\ -\x6a\x35\xb2\xc5\x62\xb1\xb4\x1a\x3e\x5f\x99\x02\x86\xa9\x0e\xe0\ -\xeb\x9a\xe0\x93\x7f\x58\xb0\x08\xcb\x53\xc2\xea\xe7\x34\xb5\x18\ -\xd9\x62\xb1\x58\xda\x05\xd3\x9c\xc5\xeb\xaa\x95\xab\xc1\x83\x41\ -\xb5\x32\x72\x50\x06\x11\x8a\x0d\x28\x16\x8b\xa5\x13\x09\x9b\xbb\ -\x2a\xcd\x69\xd5\xe6\xbb\xd9\x04\x8a\x83\x3e\x88\x50\x6c\x40\xb1\ -\x58\x2c\x9d\x4e\x2d\xf3\x58\x2d\xcb\xd4\x1a\x1c\x6c\x10\x09\xc1\ -\x06\x14\x8b\xc5\x32\xd7\x88\x72\x5e\xb3\xc1\xc3\x62\xb1\x58\x2c\ -\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\ -\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\ -\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\ -\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\ -\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\ -\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\ -\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\ -\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\ -\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\ -\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\ -\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\ -\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\ -\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\ -\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\ -\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\ -\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\ -\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\ -\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\ -\x8b\xc5\x62\xb1\x58\x2c\x16\x8b\xc5\x62\xb1\x58\x2c\x16\x4b\x0d\ -\x08\xf1\xff\x01\xab\xe7\xb7\x55\xf5\x7e\xcd\x69\x00\x00\x00\x00\ -\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x0a\x9c\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x32\x35\x36\x32\x32\x32\x36\x32\x39\x38\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x37\x39\x35\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\ -\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\ -\x3d\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\ -\x22\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x33\x38\x34\x20\ -\x31\x32\x38\x56\x31\x36\x68\x2d\x31\x32\x38\x76\x31\x31\x32\x22\ -\x20\x66\x69\x6c\x6c\x3d\x22\x23\x44\x37\x33\x36\x33\x36\x22\x20\ -\x70\x2d\x69\x64\x3d\x22\x31\x32\x37\x39\x36\x22\x3e\x3c\x2f\x70\ -\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x33\x33\ -\x36\x20\x31\x32\x38\x56\x31\x36\x68\x2d\x38\x30\x76\x31\x31\x32\ -\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x37\x33\x42\x32\x46\x22\ -\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x37\x39\x37\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\ -\x38\x20\x34\x31\x36\x76\x35\x32\x38\x68\x39\x32\x38\x56\x34\x31\ -\x36\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x45\x31\x38\x33\ -\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x37\x39\x38\x22\x3e\x3c\ -\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\ -\x39\x37\x36\x20\x34\x31\x36\x76\x35\x32\x38\x68\x2d\x36\x34\x56\ -\x34\x38\x30\x48\x34\x38\x76\x2d\x36\x34\x68\x39\x32\x38\x7a\x22\ -\x20\x66\x69\x6c\x6c\x3d\x22\x23\x44\x39\x42\x46\x36\x46\x22\x20\ -\x70\x2d\x69\x64\x3d\x22\x31\x32\x37\x39\x39\x22\x3e\x3c\x2f\x70\ -\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x35\x37\ -\x37\x2e\x34\x30\x38\x20\x33\x35\x32\x48\x31\x36\x76\x36\x34\x68\ -\x34\x38\x38\x2e\x32\x38\x38\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\ -\x46\x37\x33\x42\x32\x46\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\ -\x38\x30\x30\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\ -\x68\x20\x64\x3d\x22\x4d\x38\x33\x33\x2e\x32\x33\x32\x20\x34\x31\ -\x36\x48\x31\x30\x30\x38\x76\x2d\x36\x34\x48\x37\x36\x38\x2e\x37\ -\x38\x34\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x37\x33\x42\x32\ -\x46\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x38\x30\x31\x22\x3e\ -\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\ -\x4d\x33\x36\x38\x20\x36\x35\x36\x61\x39\x36\x2e\x30\x34\x38\x20\ -\x39\x36\x2e\x30\x34\x38\x20\x30\x20\x30\x20\x30\x2d\x32\x38\x2e\ -\x31\x31\x32\x2d\x36\x37\x2e\x38\x38\x38\x41\x39\x36\x20\x39\x36\ -\x20\x30\x20\x30\x20\x30\x20\x31\x37\x36\x20\x36\x35\x36\x76\x39\ -\x36\x68\x31\x39\x32\x76\x2d\x39\x36\x7a\x22\x20\x66\x69\x6c\x6c\ -\x3d\x22\x23\x46\x46\x46\x46\x46\x46\x22\x20\x70\x2d\x69\x64\x3d\ -\x22\x31\x32\x38\x30\x32\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\ -\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x33\x32\x30\x20\x35\x39\x32\ -\x68\x33\x32\x76\x31\x36\x30\x68\x2d\x33\x32\x7a\x22\x20\x66\x69\ -\x6c\x6c\x3d\x22\x23\x44\x39\x44\x39\x44\x39\x22\x20\x70\x2d\x69\ -\x64\x3d\x22\x31\x32\x38\x30\x33\x22\x3e\x3c\x2f\x70\x61\x74\x68\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x35\x36\x20\x33\ -\x35\x32\x76\x36\x34\x63\x30\x20\x31\x32\x2e\x37\x33\x36\x2d\x35\ -\x2e\x30\x35\x36\x20\x32\x34\x2e\x39\x34\x34\x2d\x31\x34\x2e\x30\ -\x36\x34\x20\x33\x33\x2e\x39\x33\x36\x61\x34\x37\x2e\x39\x33\x36\ -\x20\x34\x37\x2e\x39\x33\x36\x20\x30\x20\x30\x20\x31\x2d\x36\x37\ -\x2e\x38\x37\x32\x20\x30\x41\x34\x37\x2e\x39\x33\x36\x20\x34\x37\ -\x2e\x39\x33\x36\x20\x30\x20\x30\x20\x31\x20\x31\x36\x30\x20\x34\ -\x31\x36\x76\x2d\x36\x34\x48\x33\x32\x4c\x31\x32\x38\x20\x31\x32\ -\x38\x68\x31\x38\x2e\x37\x33\x36\x61\x34\x38\x2e\x30\x33\x32\x20\ -\x34\x38\x2e\x30\x33\x32\x20\x30\x20\x30\x20\x31\x20\x39\x30\x2e\ -\x35\x32\x38\x20\x30\x68\x32\x30\x31\x2e\x34\x30\x38\x41\x38\x30\ -\x2e\x30\x34\x38\x20\x38\x30\x2e\x30\x34\x38\x20\x30\x20\x30\x20\ -\x31\x20\x35\x31\x32\x20\x38\x30\x61\x38\x30\x2e\x30\x34\x38\x20\ -\x38\x30\x2e\x30\x34\x38\x20\x30\x20\x30\x20\x31\x20\x37\x32\x2e\ -\x33\x32\x20\x34\x35\x2e\x37\x39\x32\x41\x36\x33\x2e\x37\x31\x32\ -\x20\x36\x33\x2e\x37\x31\x32\x20\x30\x20\x30\x20\x31\x20\x36\x32\ -\x34\x20\x31\x31\x32\x63\x31\x36\x2e\x32\x30\x38\x20\x30\x20\x33\ -\x31\x2e\x30\x32\x34\x20\x36\x2e\x30\x34\x38\x20\x34\x32\x2e\x33\ -\x32\x20\x31\x36\x68\x34\x39\x2e\x38\x32\x34\x41\x37\x31\x2e\x39\ -\x32\x20\x37\x31\x2e\x39\x32\x20\x30\x20\x30\x20\x31\x20\x37\x37\ -\x36\x20\x39\x36\x63\x32\x34\x2e\x39\x34\x34\x20\x30\x20\x34\x36\ -\x2e\x39\x34\x34\x20\x31\x32\x2e\x37\x30\x34\x20\x35\x39\x2e\x38\ -\x35\x36\x20\x33\x32\x48\x38\x39\x36\x6c\x39\x36\x20\x32\x32\x34\ -\x48\x34\x30\x30\x76\x35\x36\x61\x34\x30\x20\x34\x30\x20\x30\x20\ -\x31\x20\x31\x2d\x38\x30\x20\x30\x56\x33\x35\x32\x68\x2d\x36\x34\ -\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x43\x42\x45\x39\x45\x41\ -\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x38\x30\x34\x22\x3e\x3c\ -\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\ -\x38\x39\x36\x20\x31\x32\x38\x6c\x39\x36\x20\x32\x32\x34\x48\x34\ -\x31\x36\x63\x33\x32\x34\x2e\x37\x36\x38\x20\x31\x39\x2e\x39\x30\ -\x34\x20\x35\x33\x31\x2e\x32\x31\x36\x2d\x32\x38\x2e\x31\x31\x32\ -\x20\x34\x38\x30\x2d\x32\x32\x34\x7a\x22\x20\x66\x69\x6c\x6c\x3d\ -\x22\x23\x41\x44\x43\x36\x43\x37\x22\x20\x70\x2d\x69\x64\x3d\x22\ -\x31\x32\x38\x30\x35\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\ -\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x39\x36\x20\x35\x32\x38\x6c\ -\x31\x37\x36\x2d\x31\x37\x36\x20\x31\x37\x36\x20\x31\x37\x36\x76\ -\x33\x35\x32\x48\x34\x39\x36\x56\x35\x32\x38\x22\x20\x66\x69\x6c\ -\x6c\x3d\x22\x23\x46\x46\x44\x31\x34\x30\x22\x20\x70\x2d\x69\x64\ -\x3d\x22\x31\x32\x38\x30\x36\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\ -\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x36\x34\x20\x38\x38\ -\x30\x68\x34\x31\x36\x76\x36\x34\x48\x34\x36\x34\x7a\x22\x20\x66\ -\x69\x6c\x6c\x3d\x22\x23\x35\x41\x42\x39\x34\x37\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x31\x32\x38\x30\x37\x22\x3e\x3c\x2f\x70\x61\x74\ -\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x37\x36\x38\x20\ -\x36\x35\x36\x61\x39\x36\x2e\x30\x34\x38\x20\x39\x36\x2e\x30\x34\ -\x38\x20\x30\x20\x30\x20\x30\x2d\x32\x38\x2e\x31\x31\x32\x2d\x36\ -\x37\x2e\x38\x38\x38\x20\x39\x36\x2e\x30\x34\x38\x20\x39\x36\x2e\ -\x30\x34\x38\x20\x30\x20\x30\x20\x30\x2d\x31\x33\x35\x2e\x37\x37\ -\x36\x20\x30\x41\x39\x36\x2e\x30\x34\x38\x20\x39\x36\x2e\x30\x34\ -\x38\x20\x30\x20\x30\x20\x30\x20\x35\x37\x36\x20\x36\x35\x36\x76\ -\x32\x32\x34\x68\x31\x39\x32\x56\x36\x35\x36\x7a\x22\x20\x66\x69\ -\x6c\x6c\x3d\x22\x23\x44\x37\x33\x36\x33\x36\x22\x20\x70\x2d\x69\ -\x64\x3d\x22\x31\x32\x38\x30\x38\x22\x3e\x3c\x2f\x70\x61\x74\x68\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x36\x34\x38\x20\x35\ -\x36\x33\x2e\x34\x34\x61\x39\x32\x2e\x34\x20\x39\x32\x2e\x34\x20\ -\x30\x20\x30\x20\x31\x20\x34\x33\x2e\x38\x38\x38\x20\x32\x34\x2e\ -\x36\x37\x32\x41\x39\x36\x2e\x30\x34\x38\x20\x39\x36\x2e\x30\x34\ -\x38\x20\x30\x20\x30\x20\x31\x20\x37\x32\x30\x20\x36\x35\x36\x76\ -\x32\x32\x34\x68\x2d\x31\x34\x34\x56\x36\x35\x36\x63\x30\x2d\x32\ -\x35\x2e\x34\x35\x36\x20\x31\x30\x2e\x31\x31\x32\x2d\x34\x39\x2e\ -\x38\x37\x32\x20\x32\x38\x2e\x31\x31\x32\x2d\x36\x37\x2e\x38\x38\ -\x38\x61\x39\x32\x2e\x34\x20\x39\x32\x2e\x34\x20\x30\x20\x30\x20\ -\x31\x20\x34\x33\x2e\x38\x38\x38\x2d\x32\x34\x2e\x36\x37\x32\x7a\ -\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x37\x33\x42\x32\x46\x22\ -\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x38\x30\x39\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\ -\x39\x36\x20\x35\x32\x38\x76\x36\x34\x6c\x31\x37\x36\x2d\x31\x37\ -\x36\x20\x31\x34\x34\x20\x31\x34\x34\x76\x33\x32\x30\x68\x33\x32\ -\x56\x35\x31\x32\x4c\x36\x37\x32\x20\x33\x35\x32\x20\x34\x39\x36\ -\x20\x35\x32\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x44\x39\ -\x42\x32\x33\x36\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x38\x31\ -\x30\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\ -\x64\x3d\x22\x4d\x36\x34\x30\x20\x37\x32\x30\x6d\x2d\x31\x36\x20\ -\x30\x61\x31\x36\x20\x31\x36\x20\x30\x20\x31\x20\x30\x20\x33\x32\ -\x20\x30\x20\x31\x36\x20\x31\x36\x20\x30\x20\x31\x20\x30\x2d\x33\ -\x32\x20\x30\x5a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x37\x33\ -\x42\x32\x46\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x38\x31\x31\ -\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\ -\x3d\x22\x4d\x36\x37\x32\x2e\x30\x36\x34\x20\x32\x36\x31\x2e\x35\ -\x38\x34\x76\x2d\x30\x2e\x30\x31\x36\x6c\x32\x34\x32\x2e\x36\x32\ -\x34\x20\x32\x33\x34\x2e\x36\x38\x38\x61\x33\x32\x20\x33\x32\x20\ -\x30\x20\x30\x20\x31\x20\x30\x2e\x37\x36\x38\x20\x34\x35\x2e\x32\ -\x33\x32\x6c\x2d\x30\x2e\x30\x31\x36\x20\x30\x2e\x30\x31\x36\x61\ -\x33\x32\x20\x33\x32\x20\x30\x20\x30\x20\x31\x2d\x34\x35\x2e\x32\ -\x34\x38\x20\x30\x2e\x37\x38\x34\x4c\x36\x37\x32\x2e\x30\x36\x34\ -\x20\x33\x35\x30\x2e\x39\x36\x20\x34\x37\x34\x2e\x34\x39\x36\x20\ -\x35\x34\x31\x2e\x37\x34\x34\x61\x33\x31\x2e\x39\x33\x36\x20\x33\ -\x31\x2e\x39\x33\x36\x20\x30\x20\x30\x20\x31\x2d\x34\x35\x2e\x32\ -\x34\x38\x2d\x30\x2e\x38\x6c\x2d\x30\x2e\x30\x31\x36\x2d\x30\x2e\ -\x30\x31\x36\x61\x33\x32\x20\x33\x32\x20\x30\x20\x30\x20\x31\x20\ -\x30\x2e\x37\x36\x38\x2d\x34\x35\x2e\x32\x33\x32\x6c\x32\x34\x32\ -\x2e\x30\x36\x34\x2d\x32\x33\x34\x2e\x31\x31\x32\x7a\x22\x20\x66\ -\x69\x6c\x6c\x3d\x22\x23\x46\x37\x33\x42\x32\x46\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x31\x32\x38\x31\x32\x22\x3e\x3c\x2f\x70\x61\x74\ -\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x30\x2e\x33\ -\x32\x20\x39\x36\x30\x2e\x37\x38\x34\x41\x31\x30\x34\x2e\x30\x36\ -\x34\x20\x31\x30\x34\x2e\x30\x36\x34\x20\x30\x20\x30\x20\x31\x20\ -\x31\x33\x36\x20\x38\x31\x36\x61\x31\x30\x33\x2e\x36\x38\x20\x31\ -\x30\x33\x2e\x36\x38\x20\x30\x20\x30\x20\x31\x20\x37\x31\x2e\x36\ -\x20\x32\x38\x2e\x35\x39\x32\x20\x37\x39\x2e\x35\x38\x34\x20\x37\ -\x39\x2e\x35\x38\x34\x20\x30\x20\x30\x20\x30\x20\x37\x31\x2e\x33\ -\x31\x32\x20\x32\x30\x2e\x38\x36\x34\x41\x31\x30\x38\x2e\x39\x34\ -\x34\x20\x31\x30\x38\x2e\x39\x34\x34\x20\x30\x20\x30\x20\x31\x20\ -\x32\x39\x36\x20\x38\x36\x34\x63\x34\x38\x2e\x35\x37\x36\x20\x30\ -\x20\x38\x38\x20\x33\x39\x2e\x34\x32\x34\x20\x38\x38\x20\x38\x38\ -\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x43\x42\x45\x39\x45\x41\x22\ -\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x38\x31\x33\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\ -\x36\x20\x39\x34\x34\x68\x39\x39\x32\x76\x36\x34\x48\x31\x36\x7a\ -\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x35\x41\x42\x39\x34\x37\x22\ -\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x38\x31\x34\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x04\x80\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x32\x35\x36\x32\x30\x38\x33\x36\x35\x37\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x33\x39\x32\x22\x20\x78\ -\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ -\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\ -\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x30\x20\x30\x6d\x30\ -\x20\x30\x6c\x31\x30\x32\x34\x20\x30\x71\x30\x20\x30\x20\x30\x20\ -\x30\x6c\x30\x20\x31\x30\x32\x34\x71\x30\x20\x30\x20\x30\x20\x30\ -\x6c\x2d\x31\x30\x32\x34\x20\x30\x71\x30\x20\x30\x20\x30\x20\x30\ -\x6c\x30\x2d\x31\x30\x32\x34\x71\x30\x20\x30\x20\x30\x20\x30\x5a\ -\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x45\x38\x45\x46\x46\x38\x22\ -\x20\x70\x2d\x69\x64\x3d\x22\x35\x33\x39\x33\x22\x3e\x3c\x2f\x70\ -\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x34\ -\x31\x2e\x36\x33\x37\x38\x31\x38\x20\x34\x30\x35\x2e\x36\x34\x33\ -\x36\x33\x36\x41\x32\x33\x2e\x32\x37\x32\x37\x32\x37\x20\x32\x33\ -\x2e\x32\x37\x32\x37\x32\x37\x20\x30\x20\x30\x20\x30\x20\x31\x36\ -\x30\x2e\x38\x31\x34\x35\x34\x35\x20\x34\x34\x32\x2e\x31\x38\x31\ -\x38\x31\x38\x68\x33\x35\x30\x2e\x34\x38\x37\x32\x37\x33\x61\x32\ -\x33\x2e\x32\x37\x32\x37\x32\x37\x20\x32\x33\x2e\x32\x37\x32\x37\ -\x32\x37\x20\x30\x20\x30\x20\x30\x20\x31\x38\x2e\x34\x35\x35\x32\ -\x37\x33\x2d\x33\x37\x2e\x34\x36\x39\x30\x39\x31\x4c\x33\x36\x34\ -\x2e\x36\x38\x33\x36\x33\x36\x20\x31\x39\x30\x2e\x31\x36\x31\x34\ -\x35\x35\x61\x34\x36\x2e\x35\x34\x35\x34\x35\x35\x20\x34\x36\x2e\ -\x35\x34\x35\x34\x35\x35\x20\x30\x20\x30\x20\x30\x2d\x37\x35\x2e\ -\x31\x37\x30\x39\x30\x39\x20\x31\x2e\x38\x38\x35\x30\x39\x6c\x2d\ -\x31\x34\x37\x2e\x38\x37\x34\x39\x30\x39\x20\x32\x31\x33\x2e\x36\ -\x32\x30\x33\x36\x34\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x36\ -\x39\x43\x42\x39\x31\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x33\x39\ -\x34\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\ -\x64\x3d\x22\x4d\x33\x33\x37\x2e\x34\x35\x34\x35\x34\x35\x20\x38\ -\x38\x34\x2e\x33\x36\x33\x36\x33\x36\x61\x31\x37\x34\x2e\x35\x34\ -\x35\x34\x35\x35\x20\x31\x37\x34\x2e\x35\x34\x35\x34\x35\x35\x20\ -\x30\x20\x31\x20\x30\x20\x30\x2d\x33\x34\x39\x2e\x30\x39\x30\x39\ -\x30\x39\x20\x31\x37\x34\x2e\x35\x34\x35\x34\x35\x35\x20\x31\x37\ -\x34\x2e\x35\x34\x35\x34\x35\x35\x20\x30\x20\x30\x20\x30\x20\x30\ -\x20\x33\x34\x39\x2e\x30\x39\x30\x39\x30\x39\x7a\x22\x20\x66\x69\ -\x6c\x6c\x3d\x22\x23\x32\x34\x37\x41\x44\x45\x22\x20\x70\x2d\x69\ -\x64\x3d\x22\x35\x33\x39\x35\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\ -\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x39\x30\x37\x2e\x36\x33\ -\x36\x33\x36\x34\x20\x31\x38\x36\x2e\x31\x38\x31\x38\x31\x38\x61\ -\x32\x33\x2e\x32\x37\x32\x37\x32\x37\x20\x32\x33\x2e\x32\x37\x32\ -\x37\x32\x37\x20\x30\x20\x30\x20\x30\x2d\x32\x33\x2e\x32\x37\x32\ -\x37\x32\x38\x2d\x32\x33\x2e\x32\x37\x32\x37\x32\x37\x68\x2d\x32\ -\x30\x39\x2e\x34\x35\x34\x35\x34\x35\x61\x32\x33\x2e\x32\x37\x32\ -\x37\x32\x37\x20\x32\x33\x2e\x32\x37\x32\x37\x32\x37\x20\x30\x20\ -\x30\x20\x30\x2d\x32\x33\x2e\x32\x37\x32\x37\x32\x37\x20\x32\x33\ -\x2e\x32\x37\x32\x37\x32\x37\x76\x36\x37\x34\x2e\x39\x30\x39\x30\ -\x39\x31\x61\x32\x33\x2e\x32\x37\x32\x37\x32\x37\x20\x32\x33\x2e\ -\x32\x37\x32\x37\x32\x37\x20\x30\x20\x30\x20\x30\x20\x32\x33\x2e\ -\x32\x37\x32\x37\x32\x37\x20\x32\x33\x2e\x32\x37\x32\x37\x32\x37\ -\x68\x32\x30\x39\x2e\x34\x35\x34\x35\x34\x35\x61\x32\x33\x2e\x32\ -\x37\x32\x37\x32\x37\x20\x32\x33\x2e\x32\x37\x32\x37\x32\x37\x20\ -\x30\x20\x30\x20\x30\x20\x32\x33\x2e\x32\x37\x32\x37\x32\x38\x2d\ -\x32\x33\x2e\x32\x37\x32\x37\x32\x37\x56\x31\x38\x36\x2e\x31\x38\ -\x31\x38\x31\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x41\x30\ -\x42\x46\x46\x37\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x33\x39\x36\ -\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x06\xca\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\ -\x72\x61\x70\x68\x69\x63\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\ -\x44\x54\x44\x2f\x73\x76\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\ -\x0a\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x36\x39\x38\x33\x32\x38\ -\x33\x30\x34\x39\x37\x31\x22\x20\x63\x6c\x61\x73\x73\x3d\x22\x69\ -\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ -\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\x22\x20\x76\x65\x72\ -\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x78\x6d\x6c\x6e\x73\ -\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\ -\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x32\x36\x32\x34\x22\x0d\x0a\x20\x20\x20\x20\x20\ -\x77\x69\x64\x74\x68\x3d\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\ -\x74\x3d\x22\x31\x36\x22\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\ -\x74\x68\x20\x64\x3d\x22\x4d\x31\x30\x32\x34\x20\x32\x39\x38\x2e\ -\x36\x36\x36\x36\x36\x37\x56\x38\x35\x2e\x33\x33\x33\x33\x33\x33\ -\x63\x30\x2d\x32\x35\x2e\x36\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\ -\x37\x2d\x34\x32\x2e\x36\x36\x36\x36\x36\x37\x2d\x34\x32\x2e\x36\ -\x36\x36\x36\x36\x37\x2d\x34\x32\x2e\x36\x36\x36\x36\x36\x36\x48\ -\x32\x39\x38\x2e\x36\x36\x36\x36\x36\x37\x63\x2d\x32\x35\x2e\x36\ -\x20\x30\x2d\x34\x32\x2e\x36\x36\x36\x36\x36\x37\x20\x31\x37\x2e\ -\x30\x36\x36\x36\x36\x37\x2d\x34\x32\x2e\x36\x36\x36\x36\x36\x37\ -\x20\x34\x32\x2e\x36\x36\x36\x36\x36\x36\x76\x32\x31\x33\x2e\x33\ -\x33\x33\x33\x33\x34\x6c\x33\x38\x34\x20\x38\x35\x2e\x33\x33\x33\ -\x33\x33\x33\x20\x33\x38\x34\x2d\x38\x35\x2e\x33\x33\x33\x33\x33\ -\x33\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\ -\x69\x6c\x6c\x3d\x22\x23\x34\x31\x41\x35\x45\x45\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x32\x36\x32\x35\x22\x3e\x3c\x2f\x70\x61\x74\x68\ -\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\ -\x4d\x31\x30\x32\x34\x20\x32\x39\x38\x2e\x36\x36\x36\x36\x36\x37\ -\x48\x32\x35\x36\x76\x32\x31\x33\x2e\x33\x33\x33\x33\x33\x33\x6c\ -\x34\x30\x35\x2e\x33\x33\x33\x33\x33\x33\x20\x38\x35\x2e\x33\x33\ -\x33\x33\x33\x33\x20\x33\x36\x32\x2e\x36\x36\x36\x36\x36\x37\x2d\ -\x38\x35\x2e\x33\x33\x33\x33\x33\x33\x7a\x22\x20\x66\x69\x6c\x6c\ -\x3d\x22\x23\x32\x42\x37\x43\x44\x33\x22\x0d\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x70\x2d\x69\x64\x3d\x22\x32\x36\x32\x36\ -\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\ -\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x30\x32\x34\x20\x35\x31\ -\x32\x48\x32\x35\x36\x76\x32\x31\x33\x2e\x33\x33\x33\x33\x33\x33\ -\x6c\x33\x38\x34\x20\x36\x34\x20\x33\x38\x34\x2d\x36\x34\x7a\x22\ -\x20\x66\x69\x6c\x6c\x3d\x22\x23\x31\x38\x35\x41\x42\x44\x22\x20\ -\x70\x2d\x69\x64\x3d\x22\x32\x36\x32\x37\x22\x3e\x3c\x2f\x70\x61\ -\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\ -\x3d\x22\x4d\x31\x30\x32\x34\x20\x37\x32\x35\x2e\x33\x33\x33\x33\ -\x33\x33\x48\x32\x35\x36\x76\x32\x31\x33\x2e\x33\x33\x33\x33\x33\ -\x34\x63\x30\x20\x32\x35\x2e\x36\x20\x31\x37\x2e\x30\x36\x36\x36\ -\x36\x37\x20\x34\x32\x2e\x36\x36\x36\x36\x36\x37\x20\x34\x32\x2e\ -\x36\x36\x36\x36\x36\x37\x20\x34\x32\x2e\x36\x36\x36\x36\x36\x36\ -\x68\x36\x38\x32\x2e\x36\x36\x36\x36\x36\x36\x63\x32\x35\x2e\x36\ -\x20\x30\x20\x34\x32\x2e\x36\x36\x36\x36\x36\x37\x2d\x31\x37\x2e\ -\x30\x36\x36\x36\x36\x37\x20\x34\x32\x2e\x36\x36\x36\x36\x36\x37\ -\x2d\x34\x32\x2e\x36\x36\x36\x36\x36\x36\x76\x2d\x32\x31\x33\x2e\ -\x33\x33\x33\x33\x33\x34\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x31\x30\x33\x46\x39\ -\x31\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x36\x32\x38\x22\x3e\x3c\ -\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\ -\x68\x20\x64\x3d\x22\x4d\x35\x38\x38\x2e\x38\x20\x32\x35\x36\x48\ -\x32\x35\x36\x76\x35\x39\x37\x2e\x33\x33\x33\x33\x33\x33\x68\x33\ -\x32\x34\x2e\x32\x36\x36\x36\x36\x37\x63\x32\x39\x2e\x38\x36\x36\ -\x36\x36\x37\x20\x30\x20\x35\x39\x2e\x37\x33\x33\x33\x33\x33\x2d\ -\x32\x39\x2e\x38\x36\x36\x36\x36\x37\x20\x35\x39\x2e\x37\x33\x33\ -\x33\x33\x33\x2d\x35\x39\x2e\x37\x33\x33\x33\x33\x33\x56\x33\x30\ -\x37\x2e\x32\x63\x30\x2d\x32\x39\x2e\x38\x36\x36\x36\x36\x37\x2d\ -\x32\x31\x2e\x33\x33\x33\x33\x33\x33\x2d\x35\x31\x2e\x32\x2d\x35\ -\x31\x2e\x32\x2d\x35\x31\x2e\x32\x7a\x22\x0d\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x2e\ -\x35\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x36\x32\x39\x22\x3e\x3c\ -\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\ -\x68\x20\x64\x3d\x22\x4d\x35\x34\x36\x2e\x31\x33\x33\x33\x33\x33\ -\x20\x38\x31\x30\x2e\x36\x36\x36\x36\x36\x37\x48\x35\x31\x2e\x32\ -\x43\x32\x31\x2e\x33\x33\x33\x33\x33\x33\x20\x38\x31\x30\x2e\x36\ -\x36\x36\x36\x36\x37\x20\x30\x20\x37\x38\x39\x2e\x33\x33\x33\x33\ -\x33\x33\x20\x30\x20\x37\x35\x39\x2e\x34\x36\x36\x36\x36\x37\x56\ -\x32\x36\x34\x2e\x35\x33\x33\x33\x33\x33\x43\x30\x20\x32\x33\x34\ -\x2e\x36\x36\x36\x36\x36\x37\x20\x32\x31\x2e\x33\x33\x33\x33\x33\ -\x33\x20\x32\x31\x33\x2e\x33\x33\x33\x33\x33\x33\x20\x35\x31\x2e\ -\x32\x20\x32\x31\x33\x2e\x33\x33\x33\x33\x33\x33\x68\x34\x39\x39\ -\x2e\x32\x63\x32\x35\x2e\x36\x20\x30\x20\x34\x36\x2e\x39\x33\x33\ -\x33\x33\x33\x20\x32\x31\x2e\x33\x33\x33\x33\x33\x33\x20\x34\x36\ -\x2e\x39\x33\x33\x33\x33\x33\x20\x35\x31\x2e\x32\x76\x34\x39\x39\ -\x2e\x32\x63\x30\x20\x32\x35\x2e\x36\x2d\x32\x31\x2e\x33\x33\x33\ -\x33\x33\x33\x20\x34\x36\x2e\x39\x33\x33\x33\x33\x33\x2d\x35\x31\ -\x2e\x32\x20\x34\x36\x2e\x39\x33\x33\x33\x33\x34\x7a\x22\x0d\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\ -\x23\x31\x38\x35\x41\x42\x44\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\ -\x36\x33\x30\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\ -\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x33\x35\x2e\ -\x32\x20\x36\x38\x32\x2e\x36\x36\x36\x36\x36\x37\x48\x33\x37\x31\ -\x2e\x32\x4c\x32\x39\x38\x2e\x36\x36\x36\x36\x36\x37\x20\x34\x34\ -\x38\x20\x32\x32\x36\x2e\x31\x33\x33\x33\x33\x33\x20\x36\x38\x32\ -\x2e\x36\x36\x36\x36\x36\x37\x48\x31\x36\x32\x2e\x31\x33\x33\x33\ -\x33\x33\x4c\x39\x33\x2e\x38\x36\x36\x36\x36\x37\x20\x33\x34\x31\ -\x2e\x33\x33\x33\x33\x33\x33\x68\x35\x39\x2e\x37\x33\x33\x33\x33\ -\x33\x6c\x34\x36\x2e\x39\x33\x33\x33\x33\x33\x20\x32\x33\x38\x2e\ -\x39\x33\x33\x33\x33\x34\x20\x37\x32\x2e\x35\x33\x33\x33\x33\x34\ -\x2d\x32\x33\x30\x2e\x34\x68\x35\x31\x2e\x32\x6c\x36\x38\x2e\x32\ -\x36\x36\x36\x36\x36\x20\x32\x33\x30\x2e\x34\x4c\x34\x34\x33\x2e\ -\x37\x33\x33\x33\x33\x33\x20\x33\x34\x31\x2e\x33\x33\x33\x33\x33\ -\x33\x68\x35\x39\x2e\x37\x33\x33\x33\x33\x34\x6c\x2d\x36\x38\x2e\ -\x32\x36\x36\x36\x36\x37\x20\x33\x34\x31\x2e\x33\x33\x33\x33\x33\ -\x34\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\ -\x69\x6c\x6c\x3d\x22\x23\x46\x46\x46\x46\x46\x46\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x32\x36\x33\x31\x22\x3e\x3c\x2f\x70\x61\x74\x68\ -\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x02\x64\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x36\x30\x39\x36\x31\x36\x37\x32\x32\x34\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x37\x32\x38\x31\x22\x20\x77\ -\x69\x64\x74\x68\x3d\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\ -\x3d\x22\x31\x36\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\ -\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\ -\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x39\x30\x37\x2e\x31\ -\x20\x32\x39\x39\x2e\x39\x63\x2d\x31\x34\x2e\x36\x2d\x31\x34\x2e\ -\x36\x2d\x33\x38\x2e\x34\x2d\x31\x34\x2e\x36\x2d\x35\x33\x20\x30\ -\x4c\x35\x31\x33\x20\x36\x34\x30\x2e\x35\x20\x31\x37\x32\x20\x32\ -\x39\x39\x2e\x39\x63\x2d\x31\x34\x2e\x36\x2d\x31\x34\x2e\x36\x2d\ -\x33\x38\x2e\x34\x2d\x31\x34\x2e\x36\x2d\x35\x33\x20\x30\x2d\x31\ -\x34\x2e\x36\x20\x31\x34\x2e\x36\x2d\x31\x34\x2e\x36\x20\x33\x38\ -\x2e\x34\x20\x30\x20\x35\x33\x6c\x33\x36\x34\x2e\x37\x20\x33\x36\ -\x34\x2e\x32\x63\x30\x2e\x38\x20\x31\x20\x31\x2e\x37\x20\x32\x20\ -\x32\x2e\x37\x20\x33\x20\x37\x2e\x33\x20\x37\x2e\x33\x20\x31\x37\ -\x20\x31\x31\x20\x32\x36\x2e\x37\x20\x31\x30\x2e\x39\x20\x39\x2e\ -\x37\x20\x30\x20\x31\x39\x2e\x33\x2d\x33\x2e\x36\x20\x32\x36\x2e\ -\x37\x2d\x31\x30\x2e\x39\x20\x31\x2d\x31\x20\x31\x2e\x38\x2d\x31\ -\x2e\x39\x20\x32\x2e\x37\x2d\x33\x6c\x33\x36\x34\x2e\x37\x2d\x33\ -\x36\x34\x2e\x32\x63\x31\x34\x2e\x34\x2d\x31\x34\x2e\x36\x20\x31\ -\x34\x2e\x34\x2d\x33\x38\x2e\x34\x2d\x30\x2e\x31\x2d\x35\x33\x7a\ -\x22\x20\x66\x69\x6c\x6c\x3d\x22\x22\x20\x70\x2d\x69\x64\x3d\x22\ -\x37\x32\x38\x32\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\ -\x76\x67\x3e\ -\x00\x01\x00\x63\ -\x00\ -\x06\xf6\xde\x78\x9c\xec\xbd\x09\x7c\x5c\x67\x75\x36\xfe\x22\x59\ -\x8b\x2d\xaf\x92\x35\xcb\x5d\x67\x46\xb3\xef\x23\x27\xa1\xd0\xb2\ -\x43\x4b\x4b\xcb\xd2\x42\xa1\x05\xfe\xe4\x6b\x29\x14\x28\x7b\x81\ -\xf0\x01\x25\xac\x09\x94\x84\x25\x40\x42\x48\x62\x5b\x9a\x7d\xb4\ -\xdb\x59\x08\x04\x28\x6d\x69\x29\x94\xf4\x2b\x3b\x94\x12\x5a\x42\ -\x42\x08\x84\x80\x49\x82\x8d\x7d\xff\x67\x7b\xef\x8c\x59\x42\x16\ -\xcb\x72\x92\x7b\x7e\xbf\x37\x33\x92\x15\xe9\xea\xea\x9e\xfd\x9c\ -\xe7\x51\xea\x41\x6a\xb3\x42\x79\x90\x8a\xa9\x6c\x6c\x93\xfa\x20\ -\xbc\x3f\xfb\x6c\xf9\x78\xfc\x41\xea\xe3\xf0\xb9\x33\xcf\xe4\x8f\ -\xdb\xef\x57\xea\xbb\xd9\x11\xf5\xe4\x27\xf3\xc7\x37\x3e\x5f\xa9\ -\xf3\xaf\x19\x51\x8f\x7f\x3c\x7f\x7c\xee\x53\x95\x7a\x75\x6a\x54\ -\x3d\xf2\x91\xf2\xff\x3f\x5a\xa9\x63\xaf\x1d\x55\xd5\xaa\xfc\xff\ -\x29\xa5\xd2\x1f\x1b\x55\xb1\x98\x7c\xbc\x53\xa9\xcf\x7f\x7b\x54\ -\xed\xdc\xc9\x1f\xff\xf5\x26\xf8\xff\x7f\x3c\xaa\xb2\x7c\x41\x4a\ -\x0d\xf1\xe7\x49\xe0\x3a\x02\x09\x24\x90\x40\x02\x09\x24\x90\x40\ -\x02\x09\x24\x90\x40\x02\x09\x24\x90\x40\x02\x09\x24\x90\x40\x02\ -\x09\x24\x90\x40\x02\x09\x24\x90\x40\x02\x09\x24\x90\x40\x02\x09\ -\x24\x90\x40\x02\x09\x24\x90\x40\x02\x09\x24\x90\x40\x02\x09\x24\ -\x90\x40\x02\x09\x24\x90\x40\x02\x09\x24\x90\x40\x02\x09\x24\x90\ -\x40\x02\x09\x24\x90\x40\x02\x09\x24\x90\x40\x02\x09\x24\x90\x40\ -\x02\x09\x24\x90\x40\x02\x09\x24\x90\x40\x02\x09\x24\x90\x40\x02\ -\x09\x24\x90\x40\x02\x09\x24\x90\x40\x02\x09\x24\x90\x40\x02\x09\ -\x24\x90\x40\x02\x09\x24\x90\x40\x02\x09\x24\x90\x40\x02\x09\x24\ -\x90\x40\x02\x09\x24\x90\x40\x02\x09\x24\x90\x40\x02\x09\x24\x90\ -\x40\x02\x79\x40\xc9\x10\x1c\x24\xbb\x7f\xd0\xdd\xfc\x7f\x46\xe1\ -\x8c\xc3\xd9\x22\xef\x87\x4f\xfc\xa5\x05\x12\x48\x20\xeb\x2c\x13\ -\x70\xa2\x8a\x6d\xc0\x5d\x95\x9d\x70\x8a\x70\x1e\x0a\xe7\xb1\xa0\ -\xfe\xf8\x7e\x72\x1d\xae\x2d\x90\x40\x02\x59\x3f\x49\xc3\xf9\x0b\ -\x70\xe6\x97\xc2\x79\x03\xbc\xff\x43\x38\xb3\x70\xce\x90\xf7\x7f\ -\x36\xa2\xd4\x8b\xe1\xdf\xce\x52\xfc\xef\x17\x2b\x65\xec\x1d\x1e\ -\x7a\x54\x73\x62\xf3\xf3\xd6\xa6\x76\xbd\xf5\xaa\xb4\x79\xf6\x35\ -\xf0\xb9\x0b\xe0\xdf\x9e\x0c\x67\xb3\xba\x7b\x71\x44\x20\x81\x04\ -\x72\xf2\x04\xe3\x76\xf4\xf7\xe9\x4d\xe4\xb7\x77\xbf\x69\x52\xbd\ -\xea\x9a\x64\x78\xe1\xc7\x79\x77\xed\x1b\xc9\xc8\xc5\x0b\x91\xad\ -\x6f\x7a\x9f\x6d\xbc\xeb\x03\xf1\xf8\xfc\x42\x36\xff\xd1\xab\xf2\ -\xc5\x7f\xfc\x5c\x3e\xff\xd1\xaf\xe6\x33\x57\xfc\x57\x36\xb3\x7a\ -\x38\x9b\x5a\xf2\x52\xee\xb2\x97\x72\xd6\xbc\x64\xf4\x80\x97\x88\ -\x1c\xf4\x5c\x77\xe9\xba\x6c\xf4\xf5\x4d\xf8\xbe\xff\x1f\x9c\x07\ -\xc3\x09\xa9\xbb\x17\x4f\x04\x12\x48\x20\xeb\x2b\xa8\x8f\xbb\x47\ -\x48\x3f\x63\xaf\x49\xd9\xdd\x4f\x54\x33\x57\xff\xb4\x98\xbc\xda\ -\x2b\xce\x7c\xd4\x2b\x24\x3e\xea\xe5\x62\x57\x7b\x85\x14\x9c\xcc\ -\x95\x5e\x2e\x75\xa5\x97\x9d\xb9\xc2\xcb\xc6\x0f\x7a\x19\x77\xcd\ -\xcb\xba\x2b\x5e\xc6\x81\x63\x2d\x79\xd9\x28\x9e\x45\x2f\x6f\x2e\ -\x78\x45\xf8\x38\x6f\xc2\xe7\xcd\x83\x87\x73\x85\xb5\xef\xee\x9e\ -\x7e\xda\x25\xf0\x73\x9e\xa2\xd4\x58\x42\xb1\xad\x19\xda\xd8\x5f\ -\x3b\x90\x40\x02\x01\x29\x28\xb5\xeb\x6d\x99\xc4\xe2\x4f\x8a\xf1\ -\x8f\x1c\xcd\xb8\xa0\xe3\xa0\xb7\xb9\xe8\x9a\x97\x37\x0e\x78\x05\ -\xf3\x20\xe8\xf1\x41\xaf\x60\x1d\xf0\xf2\x70\x0a\x36\x7c\xde\x82\ -\x7f\xb7\x96\xbd\xbc\xbd\x0c\xaf\x4b\x74\x8a\x0e\xbc\x07\xbd\xcf\ -\x99\x8b\x70\x7a\xfc\xde\x46\x5b\x00\xff\x1e\xed\x7a\x99\xf0\x92\ -\x97\x48\xac\xdd\x7e\x7a\xf6\xd2\x7f\x57\x6a\xe4\x85\xf0\x73\x73\ -\x70\x76\xc3\x19\x53\x41\x6e\x10\x48\x20\x1b\x22\x43\x6a\xe2\xd5\ -\xee\x4c\xfb\x8b\x15\xe3\xc0\xd1\xb4\x79\xb9\x97\x33\x2e\x27\x9d\ -\x2f\x80\xee\x17\x4d\x3c\xab\xf0\x7e\x19\x3e\xb7\xe2\x95\x40\xef\ -\xcb\x10\xdf\xa3\x6f\x2f\xda\x4b\x5e\xc9\x59\x82\xcf\xf7\xc0\x26\ -\x2c\x80\x4d\xe8\x91\xdf\xcf\x19\x5d\xb0\x15\x5d\xfe\xd8\x5a\xf0\ -\x4a\x2e\x7c\x0d\xd8\x89\x02\xfc\x3f\x65\x67\xe1\x58\xce\x5a\xb8\ -\x23\x13\x3b\x70\x7d\xd6\x78\xfd\xbf\x2a\x35\x8a\xb5\x83\x3d\x8a\ -\xeb\x03\x81\x04\x12\xc8\xc9\x13\xec\xcf\xfd\x6e\x3e\xff\xe1\xb5\ -\x62\x64\xf5\x50\x36\x02\x3a\x1a\x5d\xf6\xca\xee\x01\x8a\xdb\xf3\ -\xa4\xf3\xcb\xa0\xeb\x2b\x70\x16\xc1\x0e\x2c\x7a\x25\xf0\xe7\xf8\ -\x3e\x0f\x3a\x5e\x04\x9d\x47\x3d\x2f\xd8\x3d\x78\xcf\x27\x6f\x77\ -\x21\x16\xc0\xcf\xa1\xfe\x77\xe0\xfb\xb4\xc5\x16\xc8\xe7\xf0\x98\ -\xf8\x35\x8b\x47\x93\xe6\xe2\xa1\x74\xba\xf7\xa5\x8c\xf5\x86\x65\ -\xb8\x8e\xb3\x21\x0d\xf9\x3d\x78\x9d\x52\x41\x7d\x20\x90\x40\xd6\ -\x5b\xd0\xdf\x16\x26\xc2\x2f\xba\x34\x17\x5e\xf9\x76\x7a\x7a\xc5\ -\x2b\x44\x40\xcf\x41\xdf\x0b\x36\xc4\xf6\x06\xe6\xee\xa8\xff\x8b\ -\xf0\x31\xf8\x6f\x6b\x81\x6d\x00\xbe\x92\xde\xf7\x48\x9f\xf9\xc0\ -\x7b\xd0\x75\xfd\x9e\xf4\xde\x6a\x79\x79\xa7\x05\x39\x01\xea\x7f\ -\x0b\xbe\x0f\x7c\x8c\xc7\x68\x7b\x39\xa7\xe3\x65\xe0\x6b\xb3\x60\ -\x4b\x32\x90\x43\xd8\x91\xa5\x9f\x25\x67\x0e\x7e\xc3\xdd\xfd\xf2\ -\x79\xb8\xa6\x67\xc0\xb1\x37\xf8\xde\x04\x12\xc8\xfd\x59\x30\xd7\ -\x8e\x8f\xa8\x91\x17\xc4\xad\xc6\xf7\x92\x53\x07\x21\x37\x5f\xa5\ -\xf8\xbe\x68\xaf\x92\xcf\x2f\x80\xcf\x27\xbd\xc7\xb8\x1d\x6b\x79\ -\xf0\x1e\x75\x1f\xe3\x7c\xed\xf7\x8b\xce\x82\x6f\x03\x8a\x0e\xf8\ -\x7f\x07\xfd\x7c\x5b\xf4\x1f\xf4\xdc\x06\x7d\xb7\x9a\xf0\xef\x2d\ -\xb6\x01\x78\x6c\xfe\xf7\x2c\x9c\xb4\x0d\x07\xec\x48\x06\xbe\x57\ -\xc6\xe8\x79\x8e\xb3\x74\x5b\x2d\x73\xfe\xa7\xe0\xda\x9e\xa0\x82\ -\x99\xa1\x40\x02\x59\x2f\x19\x01\xf5\x7a\x5a\xd8\x7a\xf3\x7f\x66\ -\xa7\x97\xef\x48\x85\xb0\xbe\xb7\xc6\xfe\x1e\x63\x7d\xca\xeb\x97\ -\xc9\xdf\x17\xe0\x94\x1c\x1d\xf7\xf7\x48\xf7\x4b\x8e\xd6\x7f\xfc\ -\x58\xeb\x3f\x1c\x17\x62\x00\xa7\x43\x3a\x8e\x07\x3f\xce\x9b\x4d\ -\xfe\xbc\x2d\x76\xc0\x85\x7f\x83\x98\x20\x0f\x5f\x9f\x73\x7b\xa4\ -\xff\x49\xb0\x2f\xc9\xe8\x22\xbe\x1e\x33\xcc\xf9\xdb\x8c\xc8\xf3\ -\xde\x08\xd7\x38\xbd\xd1\x37\x29\x90\x40\xee\xa7\x32\x3d\xa4\x46\ -\xff\x2e\x11\xe9\xfe\x34\x35\x7d\xf9\x51\xf4\xfd\x39\x63\x85\xea\ -\xfa\x58\xa3\x2b\x90\xde\x2f\x88\xde\xf7\x48\xef\x4b\x78\x9c\x05\ -\xc9\xf3\x45\xdf\xe9\xb0\xbe\x97\x62\xac\xef\x25\xd1\x6f\x8a\xfb\ -\xe1\x94\xdc\x4e\xdf\x16\x80\x0d\xc8\x83\x0d\xc8\xe1\x2b\xc4\x02\ -\x45\x17\x6c\x00\x7c\x8f\x2c\xd8\x91\x4c\xa4\xe7\x65\x21\xd7\x48\ -\x42\x4c\x90\x48\xb6\xae\x56\x3c\x67\x14\x48\x20\x81\x9c\x78\xc9\ -\x8c\x6c\x79\xca\xfe\xcc\xee\x65\x6f\x26\x74\x15\xd5\xf9\x73\xc6\ -\xa0\xef\x5f\xa4\xfc\xbe\xe4\xa2\xfe\x63\xde\xdf\x25\x9d\x2f\x49\ -\x8c\x8f\x3a\x4f\x87\xf4\xbd\x43\x7e\xbd\xe4\x62\xae\x2f\x07\x6d\ -\x00\xfa\x7b\xc9\xff\xf3\xfa\x73\xf0\x3e\x07\x7a\x9f\xa3\xdc\xa0\ -\x49\x9f\xcf\xc3\xf7\xc1\x7a\x61\x06\xfb\x06\x60\x73\xb2\x6e\xdd\ -\xb3\xdd\xb5\xff\x50\x9b\x70\x06\x29\x90\x40\x02\x59\x07\x79\x84\ -\x63\x5d\xfa\x99\x7c\x68\x0d\xf2\x7e\xd4\x7d\x89\xfd\xa9\x47\x07\ -\x71\x3e\xc6\xfa\xe0\xe7\xd9\xf7\x77\xbd\xb2\x8b\xbe\x5f\x5e\xc1\ -\x67\x97\x44\xef\x4b\x8e\xf8\x7d\xd2\xf3\xa6\x57\x8e\x75\xc4\x0e\ -\xc0\x7b\x7c\x75\xd1\x06\x60\xfc\xdf\x22\x5b\x90\xb3\x50\xe7\xdb\ -\x74\x72\x36\xdb\x82\x2c\xda\x02\xb3\xed\x65\xa3\x3d\x9a\x19\x48\ -\xc2\xd7\xa6\xe2\xcb\x1f\x83\x6b\xfc\xad\x8d\xbe\x49\x81\x04\x72\ -\x7f\x94\x61\xa5\x9e\x9c\x8c\x74\xaf\xcf\x45\x0f\x82\xde\xad\xd1\ -\x41\xfd\x2f\x82\xfe\xa3\xef\x2f\xc2\x29\xa3\xef\x77\x7b\xe4\xe7\ -\x59\xff\x59\xe7\xcb\x6e\x9b\x62\x7c\xd2\x7f\xd0\xf7\x72\xac\xed\ -\xfb\xfe\x12\xe8\x7a\xc9\x95\x13\x6b\xb2\xfe\xdb\x0d\xb2\x01\xfa\ -\x60\x0e\x40\x75\x41\xaa\x0d\xa2\x0d\xe8\x50\x3c\x90\x35\x3a\x34\ -\x2b\x10\x8f\xcc\x7b\xe9\xc4\x22\xf6\x03\xab\x1b\x7d\x9f\x02\x09\ -\xe4\xfe\x28\x23\x6a\xf8\xd9\xa9\xd0\xea\x91\xac\xb9\x0a\xba\x8f\ -\xf3\x7c\x38\xe3\xb7\x44\xfa\x4f\xf5\x3d\xec\xf1\x41\xae\x8f\xfe\ -\x1f\xfd\x7d\xd9\xe9\xb2\xce\xa3\xae\xc7\x38\xd6\xc7\x57\xb6\x05\ -\xac\xef\xe8\xef\xcb\xf4\xaa\x6d\x40\x03\xbe\x47\x83\xec\x00\x7e\ -\x5c\xd4\x36\xc0\xe5\x7c\x80\xfa\x83\x90\xeb\xe7\x4c\x8e\xff\xb3\ -\x46\x97\x72\x8d\x0c\xfc\x7b\xd2\xed\x06\xfa\x1f\x48\x20\xeb\x23\ -\xd1\xf1\xa1\xfc\x6b\x8b\xe1\x83\x5e\x06\xe2\xfe\x92\x7d\x90\xf2\ -\xfe\x1c\xea\xbf\xb3\xe0\xd7\xf7\x8b\xe0\x97\x4b\x94\xf3\xb3\xdf\ -\x2f\x6a\xbf\xef\xdb\x80\xbe\x5e\x97\x50\xcf\xe1\xf8\xfa\x8f\x1f\ -\xbb\x7d\xdd\xc7\xaf\x2f\xc6\x5a\x12\x0b\x60\x0f\x00\x0f\xf7\x0a\ -\x68\x1e\xc8\xc6\xda\x5f\x87\x6a\x0e\x69\xf8\x9a\x58\x6c\xee\x52\ -\xb8\xce\xd4\x46\xdf\xa8\x40\x02\xb9\x1f\xca\x83\xb7\xdb\x2f\xbc\ -\xb0\x80\x79\x3f\xce\xf2\x9b\x70\xac\x65\xe9\xef\xeb\x7c\x7f\x01\ -\xe7\x74\x25\xe7\xc7\xd3\xa1\x3a\x1e\xbe\x72\x8e\x0f\x36\x00\xe2\ -\xf8\x0a\xd8\x82\x0a\xe8\x72\x05\x6c\x40\xc5\xe5\x53\x06\xbd\x2f\ -\xa3\x2d\x88\xf5\xe3\x00\x1d\x1f\x60\x3e\x90\xa7\x18\xa0\x25\xfd\ -\x00\x89\xff\x71\x66\x10\x67\x02\x21\x07\x48\x5a\x4d\x2f\x6a\x7f\ -\xe0\x7c\xb8\x4e\x6b\xa3\x6f\x54\x20\x81\xdc\x0f\xe5\x69\xf1\xc4\ -\xc5\x07\xf3\xc6\x95\x5e\x06\xf2\xfe\x02\xce\xf6\x53\xec\x0f\xf9\ -\xbe\xc5\xf5\x7e\x8c\xfb\xcb\x4e\x8f\xe3\x7e\x87\x75\x1f\x75\x1e\ -\x73\x7d\xd4\x63\xca\xf3\x1d\xf6\xf5\x15\xd0\xf5\x0a\xe8\x38\xbe\ -\x56\x41\xe7\xcb\x7e\x1c\x50\x17\x5b\xd0\x8f\x01\x0a\xf0\x31\xf6\ -\x05\x8a\x31\xe9\x0f\xd8\x1d\x9a\x21\x28\x38\xe8\xff\x79\x67\x20\ -\x0e\xf6\x20\x3c\xfd\x86\x73\xe0\x3a\x23\x1b\x7d\xa3\x02\x09\xe4\ -\xfe\x26\x9b\x94\x7a\xe5\x4c\xac\xfe\x9f\x29\x5d\xf7\x33\x64\xc6\ -\x17\x4e\xd9\x5e\xec\xeb\xbe\xcd\x79\x7f\x19\xeb\x7f\x0e\xd7\xf5\ -\xcb\xfa\xc4\x24\xd7\x77\x44\xff\x9d\x3a\xe8\x3e\xbc\xe2\xc1\xcf\ -\x69\x3b\x10\x6b\xf4\x73\x04\xd4\x7f\xa7\x41\x39\x80\xee\x07\xe0\ -\x6e\x40\x51\x66\x89\x72\xb2\x23\x30\x03\x31\xc0\x74\xf8\x85\x81\ -\xfe\x07\x12\xc8\x3a\xc8\xc8\xd0\xe4\x7b\x33\xe6\xe2\x8f\xd2\xd1\ -\x65\x2f\x1b\xc1\x1d\x1f\x3c\xb8\xdb\xb3\x40\x33\x3e\x45\xb3\x43\ -\xfa\x5f\x02\xdf\x5c\xc1\x5e\x1f\xfa\x7e\x87\x6b\x7d\x95\x18\xd7\ -\xfb\xc8\xa7\xdb\xec\xef\x59\xff\xfb\x07\xed\x40\xd9\x9e\x27\x5b\ -\x50\xb2\xeb\x03\xf1\x00\xf7\x05\xc9\xff\xdb\xb2\x17\x40\x73\x82\ -\x3c\x3f\x88\xfe\x1f\x6b\x01\x29\xb0\x09\xdb\x76\x3d\xea\x55\x70\ -\xa9\xdb\x36\xfa\x5e\x05\x12\xc8\xfd\x48\x46\xe0\xcc\x44\x63\xaf\ -\x59\x2a\x51\xcf\x1f\xf7\xfb\x97\xc5\xff\x2f\xd1\xac\x2f\xf9\x7e\ -\xf2\xfb\xf8\xda\x11\xdf\x0f\xba\x0f\xfa\x5a\x11\xfd\x2f\x8b\x7f\ -\xe7\x7c\x1f\xf4\x5d\xc7\xfe\x10\xef\x57\xd0\x26\x48\x3c\x40\x31\ -\x81\xd4\x04\x30\x57\x28\xda\x12\xfb\xeb\x19\x21\x9c\x09\x94\x1a\ -\x23\xfa\x7f\x9c\xff\xc3\x5e\x40\xc2\xe8\x7a\x4a\xed\xf8\x4b\x15\ -\x60\x83\x04\x12\xc8\x89\x94\x2d\x10\xfb\x3f\x3e\x91\xfc\xd0\xc7\ -\x0b\xe1\x15\xf0\xfd\x4b\x5e\x3e\xba\x42\xbb\x3e\x79\x83\x7d\x7f\ -\x19\xfb\x7d\xa0\x8b\x25\x0b\xf5\x1e\x6b\x7b\xfc\x8a\xb5\x3e\xb4\ -\x03\x54\xdf\xd3\xf9\x3e\xe5\xfe\x75\xd6\x7f\xf0\xf7\x35\x87\x5f\ -\xab\x2e\xdb\x02\x8a\x01\xd0\x0e\xe8\x7e\x00\xe9\x7c\x53\xf2\x08\ -\xfc\x9e\xf0\xb1\xd9\xe6\x19\x23\x7b\x81\xb0\x42\xb0\x1f\x98\x84\ -\x9f\x0d\xd7\x7a\xe6\x46\xdf\xac\x40\x02\xb9\x9f\xc9\x0e\x38\x2f\ -\x48\x44\xda\x9f\xcb\x86\x56\xc8\xff\xe7\xc9\xff\xf3\x3e\x3f\xf6\ -\xfc\x51\xf7\x2b\xa0\x8f\x55\xaa\xff\x43\xfc\x8f\x36\x80\xec\x00\ -\xfa\x7e\xae\xf3\xa3\x4f\xa7\xb8\x1f\xf4\xbc\x16\x67\x1b\x50\x73\ -\xd9\xef\x57\xe1\xfd\x6c\x8c\x5f\x07\xe3\x80\xe3\x72\x00\xd4\x7b\ -\x0b\xf3\x07\xd0\x7d\xab\xcd\x39\x07\x62\x87\x80\x0d\xca\x3b\xed\ -\x63\x99\x44\xeb\x30\x5c\xe7\xb3\x37\xfa\x66\x05\x12\xc8\xfd\x4c\ -\xa6\xb7\x8c\x4c\x5f\x90\xda\xdd\xf8\xef\x4c\x68\xc9\xcb\x1a\x4b\ -\x5e\x2e\xb2\x08\x36\xa0\x27\xb8\x1e\x3d\x8a\xc5\xcb\xd8\xff\x03\ -\x3f\x5c\x85\xdc\x1f\x75\x1f\xfd\x7f\x15\xf5\x9f\xfc\x7d\x53\x7c\ -\x3f\xc7\xfd\x98\xeb\xa3\xaf\xe7\x1c\x60\x9e\xec\xc0\x6c\x8c\x7d\ -\x7f\x95\x7c\x3f\xff\x1b\xd6\x01\xa8\x5f\x20\x7d\x03\xca\x07\xac\ -\x96\x57\xc2\xfa\x1f\xe4\xfd\xd8\x77\xc4\xb9\xe3\x9c\xd3\x3e\x1c\ -\xb7\xbb\x5f\x57\xc3\x84\x17\x1c\x48\x20\x81\x9c\x38\x31\x43\x91\ -\xa7\x5e\x93\x9c\xaa\xff\x28\x1d\xea\x78\x99\xe8\x22\x61\x75\x16\ -\xc1\xff\x97\x2d\x3c\xe0\xff\xcd\x9e\xd4\xfc\xd1\x06\xb0\xde\x97\ -\xfd\xfe\xbe\xe8\x3d\xd6\xf7\xdc\x7a\x5f\xf7\x51\xef\xe1\x7d\x8d\ -\xde\x83\xff\x77\xb5\x4d\x40\xbf\xcf\xf9\x00\xf5\x01\x5d\xad\xfb\ -\x6d\xca\x25\xd0\xf7\xa3\x9d\x29\xa1\xfe\x9b\x3d\xaa\x3f\x66\xed\ -\xf6\x1d\x29\xb7\xfd\xef\x70\xad\x7f\xb0\xd1\x37\x2b\x90\x40\xee\ -\x67\x62\x4f\x1b\x7f\xf9\xb9\x64\x78\xf1\x76\xd4\xfd\x4c\x74\x81\ -\xea\x7f\xa8\xff\x25\xe9\xfd\x61\xfe\x5f\xc6\xdc\x1f\xf5\x12\xe2\ -\x74\xf6\xfb\x2d\xf2\xdb\x55\xa9\xf9\x91\xde\xc7\x50\xbf\xe7\xe9\ -\x70\xfc\xcf\x07\xf3\x7f\xad\xff\x68\x13\xf0\x63\x6d\x37\xca\x32\ -\x2f\x40\x35\x00\xd2\xff\x16\xff\x1c\xc4\x05\x93\x18\x20\xeb\x74\ -\x6e\x8f\xc5\xe7\xff\x55\x6d\x52\x8f\xdf\xe8\x9b\x15\x88\x2f\x88\ -\x15\x83\x78\x6c\x5b\x15\x63\x32\x20\x36\x93\xa1\x8e\xc7\x67\xc1\ -\xaf\x41\x0c\xd7\x30\x9c\xd8\x38\x1c\x78\x75\x54\x1f\xdb\x35\x90\ -\x8d\x17\xe3\x41\xca\xb9\xdc\x31\x7a\x3f\x48\x83\xdf\x47\x1b\x90\ -\x37\x96\xb8\xef\x8f\xb8\x9c\x54\x03\x40\x3d\xe4\x7c\xbf\x1a\xeb\ -\xf2\x7c\x8f\xcb\x39\xbf\xee\xf3\xd7\xe2\x1c\x03\x54\x40\xf7\xf1\ -\xfd\x6c\xbc\xc9\xfa\x1f\xab\x53\xec\x8f\xf1\x80\x8e\x09\x38\x2f\ -\xa8\xb3\xfe\xdb\x0d\xbf\x8e\x88\xaf\x14\xff\x63\x0c\x20\xfa\x8f\ -\x3f\x3b\x1f\xeb\xde\x16\x8b\xef\xfd\x14\x3c\x6d\xbf\xbb\xd1\x37\ -\x2b\x10\x5f\x50\xf7\xa3\xc3\x84\xdb\xae\x3e\x30\xa6\x66\x3f\x3f\ -\xbd\xe3\x15\x1f\x51\xac\xeb\x5a\x50\xc7\x6b\x4a\x9d\xbe\x6f\x72\ -\xe2\xfc\x6f\x4d\x6c\xeb\x7e\xcb\xdc\x79\xd6\x17\xe0\x73\xef\x84\ -\x53\xd9\x80\x6b\x0e\xe4\x97\x65\x3b\xfc\x0d\xff\x22\x61\xef\xfb\ -\x4c\x1a\x73\x7f\x83\x71\xba\xb1\xee\x46\x31\x00\xc6\xff\x94\xff\ -\x73\xcd\x9f\xea\xfd\x52\xf3\xaf\xe8\x9a\x1f\xea\x72\xac\xee\xc7\ -\xf7\x55\xb7\xef\xfb\x6b\xa8\xf3\x0e\xfa\xff\xba\xe4\x02\xf3\xd2\ -\x13\xac\xfb\xb5\x83\x92\xd8\x00\x5f\xff\x71\xfe\x0f\x71\x03\xa3\ -\x5c\x73\x48\x9b\xcd\x1f\x3b\xe1\x0f\xcc\xab\x91\x60\xf7\xf7\x14\ -\x10\xe4\x6d\x7b\x9e\x52\xee\xfc\xce\xf0\xf9\x5f\x9f\x89\xaf\x7e\ -\x3f\x61\x2d\x1f\x4a\xc7\x97\x7e\x38\xb9\x63\xf1\x22\xf8\xb7\x5d\ -\x03\x5f\xbb\x63\x4c\x4d\xbd\x60\x3a\xd2\xf9\x9c\x39\xb5\xe8\x99\ -\x3b\x0e\x1e\x35\x26\xff\xf1\x2b\x4a\x6d\x46\x0e\xb8\xad\x1b\x73\ -\xf9\x81\xfc\x82\x68\x7e\x9f\xf7\x65\x53\x9d\x1f\x10\x57\x87\xcd\ -\x7d\x7f\xd4\x3f\xcc\xc3\x2b\x84\xf7\x21\x7d\x7f\x9c\xef\x47\xfd\ -\x8f\x89\xff\x47\x5f\x1e\xe3\xf8\x9f\xf3\x7d\xae\xf3\x93\xde\xbb\ -\x9c\xf7\xfb\xfa\xaf\xeb\x01\x7e\x6d\x50\x76\x02\x74\xfd\xcf\xd6\ -\xf5\x7f\x8e\xff\x31\xff\x2f\xd3\xfe\x4f\xf7\x96\x54\xe6\x1d\xef\ -\x55\xe4\x4b\x02\x39\x89\x82\x1c\x8f\x0f\x1e\x55\xea\xa9\xf0\xfa\ -\x42\x08\xdf\xcf\x49\xb8\x8d\xe5\x5c\xfa\x8a\xcf\xe6\x66\xd6\xae\ -\x9f\x71\x97\x8e\x24\xcc\x65\x2f\x65\xac\x7a\x19\x6b\xe5\x96\xad\ -\x3b\x1b\xef\x51\xcc\xf3\xa8\x65\xf7\xd0\xd8\xc3\xde\x69\xec\xee\ -\x7d\xc3\x9a\x5c\xf2\x8c\x5d\xcb\xc7\xec\xed\x07\x6e\x4c\xe5\xe6\ -\xde\xaa\x46\xc9\x8e\x04\x72\x8a\x08\xc4\x00\x7f\x9e\xa9\xbc\xfe\ -\x23\x19\xe3\x00\xf8\x5b\xe4\xe6\x00\xfd\xc7\x18\x40\x76\x7f\x8a\ -\x32\xf7\x87\xb5\xff\x2a\xee\xf7\x38\xfd\x19\x7f\xf2\xe7\x31\xc9\ -\x01\x7c\x3d\x87\xf7\x36\xd7\xfe\x49\xff\x21\x1f\xe0\xf8\x5f\x66\ -\x80\x74\xff\x4f\xd7\xff\x49\xf7\x5b\x94\x67\xa0\xef\xc7\xfa\x7f\ -\x09\xf1\x45\x0d\x9c\x33\xec\xdd\x12\x8d\xbe\x10\x9f\xad\x60\xf7\ -\x77\xfd\x05\x75\x1e\xf3\xac\x67\xc1\x79\xed\xf6\xb1\x17\x5c\xe8\ -\xa4\xae\x3a\x90\x4a\x7d\xec\xdf\xb2\xc9\x83\x37\x24\xdd\xcb\x8f\ -\x24\xed\x03\x5e\xdc\x5c\xf3\x92\xe6\xaa\x97\xb6\x41\xff\xad\x55\ -\x2f\x65\x2e\xff\x64\xeb\xd8\xc5\xb8\x9f\xed\x2a\x9e\x29\xa3\xef\ -\xf5\xa0\xa9\x3f\x5c\x36\xb7\xae\xde\x14\xda\xd9\xf1\x42\x53\xcb\ -\x9e\x35\xb5\xfc\x33\x27\xba\xf6\x45\x48\x1f\x5e\xa9\x98\x4b\x32\ -\x90\x53\x43\xd2\xe3\x4a\xbd\x29\xeb\xb6\x6e\xc7\x1e\x60\x1e\x39\ -\xba\x2c\x99\x01\x70\xa4\x07\xe8\xca\xdc\x9f\xd4\xfe\x30\x7e\xaf\ -\x51\xfd\x8f\xf3\xfc\x5a\xbc\x1f\xff\x93\xbf\x77\xfa\xaf\xe4\xf7\ -\x6d\x8e\x03\xaa\xd2\xff\xef\xfb\xff\x96\xdf\xfb\x23\xfd\xb7\xb9\ -\xee\x47\xfa\x6f\xd2\x9c\xf1\x0f\x2c\xeb\x59\x67\x2b\xe6\x05\x0a\ -\x64\xfd\x64\x08\xfc\xc0\xef\x8f\x6c\x7b\xfe\xa7\xd2\xb1\x4f\xdc\ -\x96\x9e\xf9\xa4\x17\x8f\x7f\xd4\x9b\x71\xae\xf6\x66\xac\x2b\x41\ -\xd7\x2f\xf7\xb2\xd6\x9a\x97\x8a\x1e\xf0\xb2\x38\x27\x6a\xae\xc0\ -\xeb\x22\x61\xc2\x67\x8c\xa5\x23\x69\x6b\xe5\x06\xa5\x46\x9f\xa4\ -\xd4\x38\xda\x80\x1d\xc8\xf1\x3c\x65\x9e\xf3\xe5\x99\xa9\x95\xc3\ -\x76\x78\xc9\x73\xc2\x8b\x9e\xbd\x7b\x05\x0e\xf8\x18\x77\xe1\xb3\ -\x4a\x8d\xbd\x5c\x71\x1e\x10\xcc\x74\x9e\x0a\x32\x3c\xfc\xc4\x5c\ -\xae\xf1\x6d\xe4\xef\xca\x82\x5d\x47\xdc\xcd\x9c\x21\xb3\x7f\x36\ -\xe3\x7a\x95\xf5\xcc\x0f\xd9\x00\xe9\xf7\x53\x2d\x1f\xf3\xf9\x39\ -\xb6\x03\xe0\xff\x29\xee\x17\x3b\x50\x1d\xe8\x05\xf8\x35\x00\xa7\ -\x1f\xff\xeb\xd8\xbf\x48\x7c\x00\x6d\xe2\x0c\x28\x4a\xfc\x4f\xfe\ -\x3f\xd2\xbe\x69\xfb\x74\xf1\xc5\x70\x85\xf1\x8d\xbe\x45\xf7\x73\ -\xd9\x39\xb4\xf9\x4f\x5f\x1d\x71\xaf\xb9\x2d\x16\xbe\xe6\x98\x1b\ -\xba\xc6\x4b\x44\xae\xf6\x92\xc6\x55\x5e\x3a\x7a\x25\xf1\xbc\x21\ -\xf7\x5b\x2e\xba\x42\x3c\x30\x88\x0d\xc9\x7c\x10\xa4\xff\xc7\x92\ -\xe6\xd2\x91\x62\xfa\x0d\xdf\x80\xef\x83\x7b\xda\xcf\x07\xb5\x7e\ -\xb3\x1b\x5d\xfc\xfe\x4c\x64\x19\xbe\x57\xcf\x8b\x85\xe1\x44\x96\ -\xbc\x04\xd8\x82\xf0\xee\xc5\xdb\x67\xcb\x8d\x6b\xe0\xeb\xfe\x54\ -\x05\xb5\x80\x53\x45\xf2\xbb\xed\xbf\x69\x10\xee\x2e\xf2\xf3\xd9\ -\xc8\xd9\xc9\x9c\x1e\xb4\xf3\x8f\xfa\x6f\x73\xfd\x8f\x7b\x7f\x2d\ -\x9a\xef\xa1\xfa\x7f\x42\xd7\x00\xfa\xf1\xbf\x9f\xff\xbb\xfd\xbc\ -\x7f\x16\xbf\x0e\xfb\x83\xb2\x07\x5c\xd2\xfe\xdf\x8f\xff\x3b\x7d\ -\x1b\x60\x20\x6f\x18\xe2\x7f\x75\x7e\x34\x32\xbc\xfb\x42\x08\x2b\ -\xf7\x6c\xf4\x0d\xba\x9f\x4b\x6a\xca\x6a\x5d\x1a\x0b\x1d\xf0\xdc\ -\xd0\x55\x5e\x2a\x7c\x90\x70\xa0\x10\x0f\x2e\x17\x01\xbd\x8f\xac\ -\xc2\x01\xbd\xc7\x19\x71\xf4\xff\x06\xfb\x07\x8c\x13\xd1\x06\x64\ -\xad\x05\x2f\xe7\x36\x0f\x17\xf6\x7c\xe4\x1b\x56\xe4\xc3\x9f\x4b\ -\x17\x56\xbe\x94\x75\x16\x7f\x36\x63\x30\x9e\xfb\x8c\xd1\x85\xdc\ -\x72\xc1\x4b\x20\xa6\x7b\xb4\xe7\x65\xf3\x97\x7f\x15\x7e\xe6\xdb\ -\x14\x73\x3b\x05\xb2\xf1\x62\x6f\x9a\x78\xc2\xbb\x33\xb1\x25\x2f\ -\x87\x87\x38\x3c\x17\x69\x0f\x87\xe2\x7f\x9c\xfd\x45\xff\x4f\xbb\ -\x3f\xd8\xdf\x6b\xf7\x7b\xff\xae\xd4\xff\xa4\xc6\xd7\xf7\xf5\x5c\ -\x0b\xe4\xd9\xdf\x79\xdf\x0e\x70\xef\xbf\xee\xd7\xfe\x8a\x76\x3f\ -\xfe\x47\xfd\x47\x2e\x30\xe4\x17\xc9\x82\xff\x8f\x47\xe6\x0f\xc7\ -\xa6\xfe\xf0\xeb\x10\x9b\xee\x57\xc4\x41\x1e\x3c\x2f\xeb\x24\x0f\ -\x9e\x8c\x36\x3f\x9a\xda\x75\xc0\x9b\x99\xba\xca\xcb\x84\x40\xff\ -\x23\x97\x7b\x99\xf0\x1a\xeb\x7f\x74\x95\xf5\x3e\xba\xe4\xef\x87\ -\x61\x9d\x08\xf1\x99\x73\x38\xa7\x41\xbc\xae\xa0\xe3\xce\x82\x97\ -\x4a\xc0\xdf\x30\xae\xb9\x9c\xe0\x63\xe4\x73\x20\x1c\x17\xe6\x75\ -\xc8\xc0\xdf\x37\x6e\x1c\xb8\x39\x6d\x9e\x73\x50\xf1\xdc\x40\x20\ -\x1b\x2f\xee\x4e\xeb\x6f\x2e\xc8\xc7\x97\xe0\x6f\xc8\xf1\x7f\xde\ -\xe6\x1d\x20\xcc\x01\xf4\xec\x7f\x35\xc6\x7d\xc0\xaa\xdb\xe2\xb9\ -\x7f\x57\x66\x7f\x68\xc6\x7f\x5e\x7a\xfe\x0d\x7f\xe6\x7f\xd6\xf7\ -\xff\x3c\x03\xe0\xf7\xfe\xa5\x06\xa8\x7b\x7f\x05\xab\xc9\xfe\x1f\ -\xb9\x82\xd0\xef\x83\xdf\xc8\x46\xdb\xde\x4c\xb8\xee\x4d\xe7\xe7\ -\xbd\xe2\xd3\x3e\xfc\x03\xc8\x14\xd1\x5f\x04\x7d\x80\xf5\x91\xc7\ -\xb8\xbb\x57\xaf\xcd\x84\x56\xbd\xd4\xf4\xe5\x5e\x7a\x7a\xcd\xcb\ -\xa0\xef\x37\xd6\x38\xee\x37\xfa\x7b\xa1\x79\x88\x0b\xf3\xd4\x27\ -\xee\x31\x46\x93\xc5\x38\xcd\x69\xf4\xeb\x0e\xf8\x0e\xb0\x01\xa8\ -\xf7\x59\x1b\x7d\xff\x02\x1c\xd0\x7d\x13\xf7\xb8\x3b\x70\xba\x60\ -\x0b\xba\xcc\xef\x94\xbd\xfc\xdb\xf0\x73\xcb\x8a\x7b\x50\xa3\x2a\ -\xe0\x7b\xde\x48\x29\x3a\xc9\x0f\xb6\x73\x31\xf0\xfb\xb1\x35\xc2\ -\xdd\x2d\x08\xd7\x47\x85\x66\x00\x04\xd7\x6b\x60\x06\xb0\x1a\x6b\ -\xfa\xbb\x7d\x94\xf7\xc7\xa5\xf6\x2f\xfe\x7f\x76\xa0\x1e\x50\x95\ -\x3a\xa1\xef\xff\x5d\xc1\x03\x44\xec\x20\xe4\x0a\xb0\xdb\x12\xfb\ -\xb7\x09\xf3\x0b\xb9\x44\x91\x1f\x1c\xe2\x46\xc8\x2d\x2f\xbf\x6d\ -\x77\xe1\xfc\xef\x0f\x29\x75\x89\x52\xc1\x1c\xd0\x3a\xc9\x1f\xc4\ -\x77\x2f\x7e\x23\x19\x5a\xf6\x92\xa1\x83\xe4\xf7\xb3\x91\x03\x8c\ -\x07\xa1\x77\x42\x2d\xd6\x7f\xda\xcb\x24\x1e\xe7\x1e\xe1\x34\x32\ -\x56\x23\xe3\xb5\xa2\x1d\x40\xdc\xc6\x8c\xc9\x7c\x8e\x29\x8b\xf9\ -\xdc\xd2\xa0\xef\x69\x8c\x0f\xe0\xf3\x18\x0b\xa0\x5d\x88\x5b\xdd\ -\x5b\x53\xe6\xd9\x97\xc1\xcf\x7e\xb1\x52\x9b\xf0\xef\x1a\xdd\xe8\ -\x9b\xf0\x00\x96\xdf\xca\x66\xba\xd7\x94\xe2\xe0\xfb\x1d\xf1\xfd\ -\xee\x02\xe1\x7d\x63\xfd\xaf\x16\xeb\x80\xbe\x77\x04\xdb\xaf\x05\ -\xfa\xdd\x92\x1a\x5e\x9d\x76\xfe\x6a\x32\x07\x80\x36\x60\x36\xd6\ -\x14\x9f\xdf\xcf\x07\x74\x8e\xc0\xbb\x7f\x75\xda\x17\x20\x0c\x30\ -\xdf\xf7\xeb\xfa\x1f\x63\xfe\xe5\xe8\x79\x6a\xc1\xfb\x7d\x3f\xdd\ -\xb1\xfb\x25\x57\xaa\x61\xf5\x4c\x75\x7c\x7f\x39\x90\x13\x28\x90\ -\x5f\x3d\x63\x26\xbc\xf4\x63\xc4\x7f\xc5\x78\x1f\xf9\x9f\xf2\x88\ -\x05\x67\xad\xca\x4c\xe8\x32\xe5\xf9\xb8\x93\x45\xbe\x41\xf4\x3e\ -\xef\x2c\x10\x5e\x23\xe2\xb5\x21\x5e\x13\xe1\x36\x3a\xa0\xe7\x60\ -\xc7\x33\x2e\xd6\x92\xc0\xe7\xa3\xee\xa3\xbf\x27\x6e\x47\x8e\x01\ -\xf0\x7b\xa4\x8c\x85\xa3\x49\xe7\xca\x5b\x63\x89\xab\x6f\x2a\x64\ -\x3f\xf4\x25\xb8\x8c\x57\x6e\xf4\x7d\x78\x00\xcb\xef\xce\xc4\x1a\ -\x5f\xcc\x20\xde\x36\xce\x00\xb9\x8b\xcc\xe1\x47\xfb\xff\xbc\xf3\ -\x5b\x16\xdf\x5f\xf5\x73\xff\xa6\x8f\xef\x43\xf5\xbf\xf8\x40\xdf\ -\xdf\xe5\x3c\xe0\x97\xf4\xdf\xf7\xff\x75\xc6\x03\x47\xec\x2f\xe1\ -\x02\xd5\xbc\xe0\xa8\xfb\x79\xf0\x23\x19\xe2\x05\x6e\xfd\x64\xe7\ -\xe4\xf3\x16\xe1\xfa\x1e\xa9\x82\x5e\xd1\x7a\xc9\xe8\x88\xda\xf2\ -\xdc\x74\x64\xf9\x08\x71\x3f\x44\x56\x41\xff\x11\x03\x6a\xd5\x2b\ -\x18\x9c\xf7\x13\xf7\x2b\x61\x42\x32\x2e\x24\xe2\x32\x15\x1c\xc6\ -\x67\x2a\x08\x5e\x33\xf1\x37\x12\x77\x1b\xf8\x7e\x78\x5e\xe8\x15\ -\xed\x80\xd3\x21\xfd\xcf\x61\x6d\xd9\x64\x6c\x57\xac\x01\xa4\xa2\ -\x4b\x70\x16\xbc\x24\xfc\xed\xe3\x76\xef\x8e\x68\xf4\x35\x3d\xb8\ -\x96\xd3\xe1\x8c\x6f\xf4\x0d\x79\x00\xca\x9f\xa4\xdd\xc6\x4d\x59\ -\xb0\xd1\x79\xc8\xe1\xd0\xff\xe3\xdf\x95\x66\xff\xf0\x58\xba\xfe\ -\x3f\x88\xef\xdb\xe8\xe7\x00\xf1\xfe\xfe\xef\x60\x0d\xb0\xe6\xea\ -\x9c\x60\x7e\x40\xff\xeb\x82\x07\xae\xeb\x7f\xc2\x01\x8c\xfa\x6f\ -\x72\x0c\x49\x71\x24\xc4\xff\xa9\x48\xeb\x70\x3a\x5b\xbf\x0e\x9e\ -\x88\xe7\xa8\xe0\xb9\x58\x2f\xb1\xc7\x55\xee\xf5\x19\xac\xef\x47\ -\x57\x49\xff\x73\x1a\x07\x2e\xba\x4c\x1c\xd0\x1c\xff\x2f\x0a\x0f\ -\x64\x97\xe2\x42\xe2\x75\x45\x1b\x80\x7c\x6d\xf4\xdc\xa0\xce\xc3\ -\x81\xbf\x27\xbe\x66\xe0\x15\xed\x00\x73\xbb\x77\x28\x26\x48\x9b\ -\x6d\xd6\x7f\xea\x07\xf4\xb8\x16\x80\x18\x2f\x60\xeb\x0d\xeb\x55\ -\xd8\x13\xc4\x1a\xef\x96\x8d\xbe\x21\x0f\x40\x79\x56\xca\x69\xff\ -\xac\x14\xef\x51\x2f\x87\x38\xbd\xad\xde\xf1\xfa\x6f\xb5\xa8\xfe\ -\x47\xfe\x5f\x66\x00\xab\xf1\xe6\x00\xce\xe7\xbc\xe4\x02\x32\x07\ -\x1c\xab\xfb\x3d\xc1\xaa\x8f\xfb\xc1\xfe\xbf\xe4\xd4\xfd\xda\x7f\ -\xc1\xf7\xff\x1d\xa9\x27\x09\xef\x5f\x14\x9f\x91\x86\x37\x03\xdf\ -\x43\x8d\x2a\xe4\xff\x0d\x6a\xff\xeb\x23\x0f\xdb\xa2\x8a\x97\xa6\ -\xc3\xec\xf7\xb9\xcf\xcf\xbe\xbf\x00\x36\xa0\x68\xf1\x41\x1e\x58\ -\xe6\x7a\x65\xce\xc7\x82\xab\xf9\x9d\x35\x7f\x73\x8b\x4e\x16\xf9\ -\x9c\xfc\xf7\x72\xe0\xef\x8b\xb1\x00\x62\x39\xa2\xef\xcf\x0a\xc7\ -\x7b\x0a\x72\xbd\x2c\xd8\x81\x14\xfc\xdb\x96\x5d\x7f\x85\x33\x84\ -\xc8\xf1\x30\xf2\x9b\x2e\x38\x90\x13\x2b\xc3\x6a\xe4\x39\x69\xcc\ -\xed\x88\x7f\xa7\x47\x35\x1e\x9a\xfd\x71\xb0\xfe\x87\xb5\x7f\x8d\ -\xfd\xc3\x31\x40\x2d\xce\xf5\xbf\xf2\x00\x06\x00\xd5\xf6\x64\xc7\ -\xa7\x3f\x0b\x2c\x73\x81\xfa\xdf\x5d\xb6\x01\xda\xff\x17\x05\xfb\ -\x33\x2f\xf1\x7f\xde\xe2\x9f\x5d\xb0\xb1\xbf\xdc\x3d\x9c\x9d\x5a\ -\xb9\xb5\x96\x5f\xfb\xc9\xe8\xc4\x04\xe2\xff\x06\xbd\xa2\xf5\x91\ -\xc7\x8d\xab\xa9\x7a\x26\x82\x3d\x3f\xee\xf7\x53\xdc\x4f\xbb\xe0\ -\x2b\xe4\xff\x8b\x70\x90\xff\x9d\xb1\x99\xba\xc4\xd3\x5c\x8a\x75\ -\x99\xc3\x95\x0e\x73\xb8\xe4\x91\xcf\x01\x4e\xce\x65\x1b\x90\x73\ -\xf0\x15\x75\xbe\x41\xfa\x9f\xc5\x3a\x00\xea\x3c\xd6\x02\x2d\xa9\ -\x11\x42\x0e\x80\xb5\x41\xdb\xbe\x00\x7b\xbc\xa8\xfb\x41\x1f\xe0\ -\x24\xcb\xb0\xda\xf9\x9c\x84\xb1\x48\x31\x5e\x16\x71\xb7\x4c\x9e\ -\xfd\x67\x0c\xc0\x0e\xf9\xfe\xca\x00\xee\x27\xf7\xff\x8e\xd7\x7d\ -\xad\xff\x54\xe7\x77\xfa\xf5\x7e\xca\x03\xe2\x4d\x7f\xf7\xb7\x2c\ -\xdc\x40\x3a\xf6\x3f\x2e\xfe\xc7\x5c\x12\xe7\x0e\x29\xcf\x5c\xf8\ -\xfa\xf6\xc9\xd7\xec\x55\xe3\x13\x1d\xc5\x75\xff\x4d\x1b\x7d\x9f\ -\xee\xa7\x92\x81\xc4\xea\xed\xa9\xe8\x15\xcc\xfd\x0a\xb1\x7f\x01\ -\xfd\x3f\xd6\xfd\xb1\xe7\x07\xa7\x68\xf1\x29\x09\x1e\x7c\x89\x38\ -\x9f\xdb\xc4\xf7\x58\x74\x35\x7f\x53\x43\xb8\x5c\x1a\xa0\xf3\xf0\ -\x1e\x5f\x5d\x89\x03\xc8\x16\xb0\xde\x67\xb0\x27\x60\xf2\xc9\xc0\ -\xf3\x45\x75\x00\x78\xee\x32\x85\xf6\x9a\xec\x06\x8d\x6e\xf4\x0d\ -\x79\x80\x49\x74\x54\x25\x5e\x9b\xb1\xb0\xc6\xbb\xc0\x73\x7f\x60\ -\xa3\x8b\x7a\xf7\x97\xf6\xf2\x58\xff\xfd\xd8\x5f\xea\x7f\xba\xf6\ -\x57\xd1\x73\x00\x7e\xbd\xaf\x3f\xef\x53\x13\x3c\x50\xc6\x01\x97\ -\xd9\x7f\xb7\x79\x5c\xfc\x8f\xbc\x9f\x79\x8b\xf9\xbe\x50\xff\xb1\ -\x9e\x5c\x9a\x69\x7e\x53\x0d\x8f\x5d\x08\xd6\xe9\xf7\xe1\x1a\x43\ -\x1b\x7d\x93\xee\xc7\xb2\x0d\x12\xee\xbf\x4a\x98\xcb\x87\x72\x21\ -\x3d\xef\x03\xcf\x42\x04\xf4\xdd\x94\x83\xb1\x3f\x62\xc2\x39\xcc\ -\x03\x4d\x38\xed\xc2\x01\x83\x1c\x4e\x45\xe2\x6f\x62\x9d\xd7\x1c\ -\xcf\x79\xf8\x5b\x67\xed\x06\x9d\xdc\x40\x0e\x90\x31\xb9\x0e\x90\ -\x32\xda\xd4\x0b\xc8\xc0\xf7\x4d\x41\xbe\x97\x49\x2f\x7d\x46\x31\ -\xce\xeb\xf6\x0d\xbe\x1f\x0f\x34\xc9\x6e\xde\xfc\xe8\x73\xc9\xef\ -\x5b\x3c\xdb\x51\xb4\x18\xf7\x9b\x31\xb9\xda\x14\xff\x53\xfe\xef\ -\xf2\xfc\x5f\x55\xfa\xff\x1a\xcf\xaf\xaa\x31\x3e\x75\x1d\x40\xef\ -\x05\x69\xdc\x2f\x6b\x4e\xe6\x7f\x06\xe6\xfe\x1d\xf1\xfd\xa4\xfb\ -\x6d\xe2\xfa\xc8\x4b\xed\x1f\xf9\x7f\x53\x6e\xf3\xe6\xe9\xc9\xa7\ -\x5e\x0d\x6e\x1f\x6b\x42\x93\x1b\x7d\x93\xee\xe7\xf2\xf0\xb8\xdd\ -\xfa\x97\x42\x78\xd9\xcb\x86\xa5\xee\x17\xc5\xb8\x1f\xfc\x3e\xf8\ -\x67\xd4\xff\x92\xb3\xc4\xf1\xbf\xd5\xf5\x79\xa0\x68\x7e\x43\xf3\ -\xba\xbb\xc2\xef\x8c\x9c\x2e\x68\x0b\x10\xdf\x5d\xb8\x5d\x33\x86\ -\xd8\x00\x1b\x75\xbf\xc9\xb5\x00\xd4\x7f\xaa\x03\x76\xbd\x64\xb4\ -\xe5\xc5\x23\x0b\x37\x28\x35\xd1\x54\x01\xcf\xcb\xc9\x96\xec\xe6\ -\x6d\x4f\x39\x37\x15\x59\xa4\xdc\x1f\xfd\x2f\xed\xe0\x62\xdf\x0f\ -\x7c\x72\x45\xdb\x00\xd2\x7b\x8e\xfd\x39\x16\xe8\xd7\xfc\x2b\xda\ -\xc7\xcb\x0c\x90\xc6\xfa\x1a\x9c\xff\xaf\xf8\xfa\xaf\xf7\x7e\x7f\ -\x41\xff\x65\xf6\x1f\x73\x00\xec\x29\x27\xc3\x5d\xcf\xb1\x97\x7e\ -\x3a\xbe\xf5\x11\x88\x2d\x83\x31\x40\x50\x17\x5a\x3f\x99\x89\xa5\ -\xe7\x3f\x94\x0b\x2f\x49\xfd\x7f\x09\xfc\xff\x12\xd8\x80\x25\xaf\ -\x6c\x2e\x11\x1e\x1c\xc5\xfe\x18\x97\xc9\x4e\x28\xf3\xc0\x68\x1e\ -\xb8\x96\xc4\x01\x4d\xdf\x16\x70\x0c\xc0\x39\x01\xd6\x04\xb3\xa2\ -\xff\x19\xd0\x7f\xac\xeb\xa6\x0c\x3c\x2d\xf0\xfd\x2d\xd2\xff\x58\ -\xa8\x75\x38\x19\x79\x2b\xce\x01\x60\x0d\x70\xf8\x37\x5d\x70\x20\ -\x27\x4c\x8a\x9b\x77\x3c\xeb\xef\x93\xd1\x45\xea\xf1\x16\x8c\x05\ -\x7f\xef\x0f\x75\xbf\x4a\xf9\x7f\x93\xf3\x7e\xa7\xcf\xed\x39\xb8\ -\xff\xa7\xf7\x7f\x7c\x9e\x0f\xda\xfb\x9b\x97\x19\x20\xf9\x1a\xe9\ -\xfd\x13\xfe\xbf\xdd\xfa\x15\xfa\xdf\xa1\x18\x20\x47\xf3\x63\xe0\ -\x1b\xd0\x27\x84\x5a\x5e\x3a\xdd\xf4\x20\x25\x7c\xb5\x0a\xe2\xc2\ -\xf5\x14\xc3\x99\x79\xe3\x3b\xd3\x11\xf4\xff\x5c\xfb\x43\x1b\x40\ -\xbe\x1f\xf1\x60\x31\x26\x44\x4c\x16\x9b\x31\xa1\xf8\x68\xfd\x6f\ -\x71\x2c\xe7\xf7\x74\x39\x07\x28\x92\xfe\x37\x89\xdf\x2d\x67\x49\ -\x3d\x10\x5e\xb3\x16\xd6\x02\x1b\x64\x03\xd2\xa8\xfb\xf0\xef\x29\ -\xfc\x9c\xbd\xef\x58\x3a\xb7\xf4\x1d\xc5\xb8\x62\xd3\x1b\x7d\x43\ -\x1e\x40\xf2\xe8\x9d\xbb\x5f\x36\x87\x78\x9f\x05\x5b\xb8\x3f\xe0\ -\xef\x3c\x58\xf7\xa3\x79\x5f\xa7\xe5\xeb\xbf\x9e\xfd\x1f\xac\xff\ -\x0d\xc6\xfb\xd5\x81\x3e\x00\xd6\x05\x2a\x03\xba\x5f\x91\xb9\x7f\ -\xae\xfd\xb7\x8f\xf7\xff\x36\xcf\xfd\x65\x2c\xcc\x17\xb1\x96\x3c\ -\xe7\x65\xc1\xb7\x6c\xd9\xf1\x28\x9c\xfd\x0f\xff\xc6\xdf\x24\x90\ -\x7b\x2a\x91\xb1\xd1\xda\xb9\xb8\xf3\x53\x80\xfc\x3f\x1f\xe1\x9a\ -\x7f\x01\x62\xc2\x12\xf8\x85\x12\x3d\x13\x8b\x10\xd3\x2d\x08\x1f\ -\x9c\xcc\x86\x20\x0f\xb4\x2d\x3a\xaf\x7b\x3a\xa2\xff\x79\x4b\x5e\ -\x6d\x3e\xa8\xfb\xa8\xf7\x19\xb3\x0e\x7a\x5f\x67\xff\x8f\xfd\x5d\ -\x73\x1e\x3e\x5f\xf7\x66\x22\xfb\x6e\x9c\x8e\x5d\x86\xb3\x5e\x25\ -\x38\x9b\x37\xfa\x86\x3c\x50\x04\x02\xad\x3f\x9c\x8a\xbe\x69\x81\ -\xf0\x1c\xb0\xf7\x86\x33\x1e\x66\x97\xb1\x7f\x05\xf7\xbb\xec\xf7\ -\xfe\x58\xff\x6b\xb1\xe3\xf1\xbf\xfb\xba\x2e\xfd\x7f\xb7\x3e\x50\ -\xff\xab\x0f\xec\xfd\x34\xa8\x7e\x50\x1a\xdc\xf9\x93\xde\x5f\x0e\ -\xf4\x3e\x6f\xa0\xde\xb7\xbd\x2c\xc4\x88\x59\x78\x4e\x32\x4e\xfd\ -\x76\xcb\xb8\xec\xb3\x70\x99\xcf\x50\xc1\x33\xb1\x9e\x12\x19\x53\ -\x8a\xf5\x3f\x7a\xc0\x2b\x84\x25\xfe\x0f\xb3\xee\x97\x4d\xc6\x83\ -\x27\x3e\x28\xc4\x85\xa3\x1c\x80\x9f\x8b\x92\xc4\x86\xba\xa7\x5b\ -\xd6\x39\x80\xe6\x75\xd5\xfa\x6f\x62\x4d\x00\x62\x00\x78\x8f\x36\ -\x20\x43\xfe\xbf\x09\x36\x60\x0e\xf4\x7f\x3f\xd6\x88\x3e\xbf\x7d\ -\xfb\x19\x7f\xa3\x98\x97\x26\x90\x93\x27\x4f\x9e\x0a\xbd\x6e\x05\ -\xf3\x7f\xb4\x01\x05\xe1\xfd\xc4\xda\x3f\xf2\x71\x50\xed\xcf\x6e\ -\xf9\xfb\x3f\x14\x0b\xb8\xc7\xe7\xff\x1a\x03\x50\xef\x03\x69\xdc\ -\x8f\xe3\x79\x7f\x06\x30\xff\x30\xee\x37\x9b\xc7\xcd\xfe\xa2\xee\ -\xe7\x4c\xd6\xfd\x8c\x51\xf7\xb2\xd1\x7d\x47\x4b\xce\xfe\x1b\xd4\ -\xa6\xd2\xeb\xe1\x1a\xb3\x1b\x7d\x93\xee\xe7\x32\xbd\x45\xa9\x37\ -\x27\x90\x77\x3d\x74\x85\x97\xc7\x1a\x20\x3c\x0f\x18\xff\x97\xc1\ -\xff\x97\xd1\x06\x58\x3d\xe2\x82\x62\x9f\xc0\x7d\xa1\x8a\xe0\x42\ -\x69\xee\xf7\x92\xdf\xdb\xe5\x1a\x2f\xf6\x00\x34\xcf\xa3\x8e\x03\ -\xf2\x98\x03\x80\xee\x63\x1e\x90\x32\xe6\x21\xf6\x47\xfd\xdf\x0b\ -\xb1\xde\xbe\x2b\xe1\x3a\x10\xe7\x35\x98\xf3\x3c\x89\x32\x8c\xfa\ -\x1f\x7e\xdb\x72\xd6\xec\xf3\x7e\x32\x06\x97\xf8\x7e\xbb\xed\xcf\ -\xfe\x54\xdd\x7e\xfe\xcf\xf8\x7f\x4d\xaf\xfa\x0b\x31\xc0\x60\x0e\ -\xc0\x7c\x80\x12\xfb\x6b\xce\x2f\x67\x20\xff\xb7\x58\xff\x0b\x12\ -\xff\xe7\x4d\xf0\xff\x70\xd0\x4f\x94\xdd\xc6\x4f\x2a\xd9\x0f\xff\ -\xb3\x62\xdd\x0f\x6a\x7f\xeb\x2b\x58\x6f\x7b\x6e\xcc\x3e\x1f\xfc\ -\xff\x95\x90\xff\xaf\x12\x17\x94\x8e\xff\xab\xe8\xff\x31\xff\x97\ -\xbe\x10\xf5\x85\xad\xfe\x73\x41\xb3\x21\xf8\xb7\x8d\xb5\x24\x0e\ -\x60\x1b\x40\xfb\x1d\xa0\xe7\x05\x38\xa8\xf7\xfa\xe4\x4c\x3e\x99\ -\xe8\x3c\xf9\xfe\x54\xf4\x62\x2f\x16\x6d\x05\xfa\xbf\x01\x82\xfa\ -\xbf\xdb\x38\x77\xb9\x68\xaf\x82\xde\xad\x32\xfe\xb7\xd8\x7a\xe6\ -\xe3\x6b\x91\x9d\xa7\xde\xbf\xcd\xb8\xdd\x7e\xef\x2f\xf6\xcb\xfa\ -\xef\xc7\x00\x03\xef\x35\xe6\x4f\xd9\x6d\x1c\xa7\xff\x05\xd9\xfb\ -\x43\x8c\x51\xf4\xff\x58\xff\xcf\x45\xe1\xd9\x81\xef\xbb\x27\x3d\ -\x7f\xad\xda\x1c\x7b\x99\xe2\xde\x5f\x30\x13\xb6\xfe\xf2\xfb\x93\ -\xdb\x1e\xf3\xd9\x82\xb9\x72\x3b\xf5\xff\x70\xf6\x07\xfd\xbf\xc1\ -\xfa\x5f\x91\xf8\xbf\x6c\xb2\xfe\xe3\x5c\x68\xf5\x17\x70\xa1\x34\ -\xa7\x23\xea\x7e\xc1\xaa\x8b\x0d\x90\x39\x0f\xd4\x7d\xec\x01\x60\ -\x9e\x87\xfa\x6f\x60\x2d\x60\xde\x4b\x9b\xfb\xc0\x26\x7c\xd8\x9b\ -\x9c\xb8\xf4\xbe\xaa\xff\xf8\x6c\x6e\x56\xf7\xd1\x67\x74\x58\x0d\ -\x3f\x39\x64\x9d\xbf\x82\x73\x18\x39\xd9\xf1\xc4\x5a\x2f\x71\x7f\ -\x3b\x1a\xfb\x5f\xdb\x7a\xc6\xfe\x22\xfc\x2f\x77\x20\xee\x8f\x0d\ -\xee\xfe\xff\x2a\x5b\xd0\x9f\xfd\xf3\xf5\xdf\x61\xfd\x27\xbe\x6f\ -\xe9\xfd\x61\x4d\x29\x67\x20\x56\x48\xeb\xe6\xb8\xfb\x16\xdc\xf7\ -\x0f\xe6\xc1\x4f\x9e\x38\xe3\x43\xea\x79\xc9\xd8\xde\xef\xa5\x22\ -\x2b\x90\x7f\xad\x78\xb9\x30\xf8\x82\x48\xdf\xff\x57\x2c\x8d\x07\ -\xc1\xfe\x5f\xeb\x3f\x61\xc3\x4b\xee\x5f\xf6\xe7\xbb\x34\xc7\x6b\ -\x93\xf8\x5d\x49\xff\xad\x16\xd7\x79\x4c\xca\x0d\x7e\x9a\x0d\x37\ -\x3e\x12\xb7\x2e\xfa\x54\xce\x7a\xff\x75\xbb\x9d\xf3\x56\xe0\x1a\ -\x32\xea\xd4\x9e\xff\x43\xdb\x64\x11\x56\xaa\x52\x2f\x55\x6a\xe8\ -\xbc\x61\x15\xbd\x64\x48\xed\xf8\x7b\xb8\xec\x82\x62\x2c\x93\xfb\ -\x94\x90\xff\xb7\xce\x5d\xc9\xe0\xcc\x17\xe1\xba\x70\xaf\xb7\x8c\ -\x35\x1e\x99\xff\xd3\x36\x9e\xe2\x7f\x8c\xfd\x63\xad\xfe\xfc\x9f\ -\xd4\x01\x6a\x6e\xff\xfd\xa0\xde\xf7\x31\x42\x07\x39\xff\xa4\x67\ -\x64\x09\xe6\x3f\xf1\x7e\x70\xae\x81\x71\x40\x3a\xb1\x7f\x1e\x2e\ -\xed\x31\x1b\x7d\x6f\x1e\x60\x82\xcf\x76\xd9\x49\xbc\xf1\xdf\xd3\ -\xe1\x95\xdb\xb2\xba\x06\x10\x59\xa0\x18\xa0\x6c\xf4\x98\x0b\x96\ -\x74\x9f\xf7\xc2\x2a\x34\x17\x22\x35\x40\xc9\x0b\x39\x0e\x68\xf4\ -\xe7\xbc\xed\x86\xf8\x7f\xd9\xf3\xa0\x3a\x4f\xcb\xab\x39\x73\x3f\ -\x18\x1a\xfd\xa3\xb7\x8d\x8c\xa9\x97\x81\xc6\xbf\x6d\x13\xef\xff\ -\x63\xac\x77\x2a\xf6\xfe\xb1\x26\x39\x0b\x17\xf6\x34\xa5\xdc\xd7\ -\x19\x3b\x2e\x6a\x67\x9c\x8f\x5f\x9b\x8d\x5d\xf5\x03\xd7\xbc\xfc\ -\xc8\x94\xdd\xbb\x7e\x6c\xa8\xfc\x4e\xb8\xf2\x3f\x52\xcc\x73\x76\ -\x9f\x11\xd4\xff\x90\xfd\xee\x15\xdc\xf1\xce\xe3\x9e\x17\xc6\xff\ -\x36\xd7\x7b\x4a\xb2\xf7\xc7\xf8\x9f\x4d\xc9\xff\x1b\x12\x03\x0c\ -\xf0\xff\x0d\xe0\x00\xf5\xe7\xfe\xb5\xee\xf7\x8f\xf6\x07\xac\xff\ -\x6d\xa9\x21\x77\x19\x63\x14\x6d\x81\xdd\x3c\x5c\x9d\xe9\x7e\x1d\ -\x3c\xfe\x5f\xaa\x60\xdf\x6f\x23\x24\xb2\x79\x38\xd9\x48\x18\x97\ -\x7f\x97\x76\x7f\xa2\x38\xff\xbb\xe2\x95\x74\x0c\x60\x71\xfc\x5f\ -\xd5\x98\x50\xa8\xff\x56\xbf\x2f\xec\xfb\x7f\x87\x77\x3c\x75\xbc\ -\x47\x35\x40\xb3\x41\x75\x9e\x22\xed\x98\x41\x1e\xe0\xce\xfd\x40\ -\x8d\x8f\x9f\xad\x18\xdb\x1d\xfd\xe6\xa9\x36\xe3\xa9\x79\x0e\x27\ -\xe1\x3f\x0f\xdf\xa1\xfe\xe2\x03\xe5\xd4\xc1\x2f\x96\x32\x07\xbd\ -\x5c\xe2\x0a\x2f\xe7\x72\xbe\x8c\x98\x67\x4e\xf8\x80\x67\x43\x7e\ -\xec\xd8\x2f\xff\x08\x84\xab\xcf\x55\xbc\xab\x86\xbf\xd3\xa9\x68\ -\xcb\x8e\x13\xd4\xff\xb0\x7d\xde\x72\x16\x71\x9d\x4d\xc6\xfd\x2f\ -\x18\xc8\xc1\xd1\x11\xee\x9f\xf6\xf1\x7b\xbf\xee\x40\xfd\x8f\xf4\ -\xbd\xdf\xf3\xa3\x7a\xbf\xdb\x9f\x05\xd6\x1f\x6b\xff\xaf\x63\x42\ -\x9f\xef\x07\x67\x48\xc9\xff\x33\xcf\xe0\x69\xb1\xe6\x8f\xa6\xb6\ -\xbe\xf2\x03\x70\x59\xb3\x1b\x7d\x5f\x1e\xa0\x32\x0d\x71\xed\x7b\ -\x4c\xb7\xf5\x4d\xda\x07\x0c\xf3\x0c\x20\xe6\x00\x65\x73\x81\x63\ -\x00\x93\x73\x00\xca\xff\x45\xff\xa9\x2f\xe4\x70\x0c\xc0\xf1\x3f\ -\x63\x43\x95\x2c\x8d\xf3\xd8\xa0\xf8\xbf\x60\xb6\x78\xe6\x03\xbe\ -\x7e\xc6\x6a\xdf\x3e\xba\xe5\x77\x3e\xa3\x86\xc7\x70\xb6\x13\xb1\ -\x5d\x4e\x35\x5d\xc1\xbc\x13\x7c\xb9\xf9\xfa\x6c\xae\xfb\xcf\xa5\ -\xf8\xe5\x3f\xca\xc5\x0e\xfe\x2c\x63\x1d\xf0\xb2\x70\x32\x60\x1f\ -\x33\xe0\x2f\x73\xf6\x92\x97\x84\x58\x09\x31\x50\xe3\x91\xee\x4f\ -\x4b\xb1\xee\xb7\x8c\xd1\x47\x1f\x50\xcc\x59\x7d\xca\xcf\x31\x91\ -\xfe\xbb\xe7\x2d\x67\x08\xdf\x71\x91\x0e\x71\xff\x98\x1c\xe7\x61\ -\x6f\x97\xe6\xff\x9c\x76\x3f\xfe\x77\x8f\x8f\xfd\x7f\x11\x0b\x90\ -\x67\x80\x9b\xd4\xfb\x1b\x8c\x01\xfa\xb9\x61\x93\xe6\x46\xc9\x06\ -\x20\xcf\x07\xfe\x3c\xf8\xfe\xa7\xcf\x34\x6e\x54\xbc\x03\x62\x6d\ -\xf0\x6d\x79\xa0\x0a\xd6\xb1\x1e\xe6\xe6\xde\x70\x20\x15\x86\x67\ -\x1d\xf7\x81\xc2\x32\x07\x18\x95\xda\x1f\xf6\xff\xa9\xfe\xd7\x65\ -\xfd\xc7\xba\x90\xae\x01\x88\xef\xd7\x18\x8f\x5a\xf7\x4b\x76\xdd\ -\xcf\xf7\xf4\xac\x57\x2a\xda\x3a\x9a\x36\xea\xb7\x6c\xdd\xfc\xd0\ -\x3a\xfc\xcc\x17\xc0\x41\x6e\xc0\x53\x25\xfe\x77\x91\x17\x2b\x14\ -\x7e\x6f\xbd\x92\x58\xf8\x42\x25\xbe\xfc\xe3\xbc\xb3\x46\x38\x08\ -\x65\x6b\x99\x4e\x11\xee\x47\xc1\x64\x2c\x34\xc4\x47\x4d\xd3\xee\ -\x3a\xc4\x36\x91\x85\x23\x31\x73\xf1\xe6\x52\xee\xb2\x4f\x28\x95\ -\x79\x0f\xfc\x36\x7f\xae\xd4\xd8\xcc\x46\xff\x42\xbf\x4e\x50\xff\ -\xa3\xf6\x79\x2b\x39\x8b\x39\x5d\x74\xfc\x8f\xb3\x5e\xdc\xfb\x67\ -\xcc\x5f\x8a\xff\x07\x77\xff\xe4\x55\xf7\xfd\x6b\x3a\x16\x18\xac\ -\x03\x6a\xfd\x1f\x9c\xff\x19\xd8\xff\xa1\xf8\xdf\x96\x3d\x63\xc4\ -\x18\x48\x5f\x71\x83\xe2\x59\x9f\x60\x07\x64\x63\x84\x6a\xd9\xe3\ -\x5b\x8a\xaf\x4b\x59\xed\xaf\x94\x64\x17\xb8\x0c\xb1\x21\xd6\x00\ -\x2a\x34\x0b\x24\x35\x00\x9c\x0d\xb1\x3b\x72\x34\x3f\xac\xf6\xff\ -\x75\xe1\x77\xa8\x33\xcf\xb3\xd5\xc7\x79\xe3\xf8\xbf\xe3\xa5\x23\ -\x6d\xf0\x9b\x0d\xcf\x31\x5a\xdf\x75\x76\x77\x3e\xe3\x4e\xbf\xe6\ -\x2d\x8a\xf1\x9d\x37\x92\x1f\x1c\x7f\x76\x45\xa9\x9d\x2f\xb5\x66\ -\x3a\x57\x16\xed\x95\xdb\x8b\xce\xf2\xb1\x92\xbb\x04\xb6\x6e\x85\ -\x76\x21\x90\x1b\x9b\xe6\x21\x89\x27\xb3\x43\xb3\x72\x58\x37\xcb\ -\x0a\xbe\x21\xe3\x21\x23\xc6\xf9\xa2\x67\xc4\x97\xbe\x5b\x49\x7c\ -\xe0\x6a\xa5\xb6\xbc\x01\xc2\x09\xe4\xb0\x3b\xe5\x38\x8f\x48\xff\ -\x9d\x77\xaf\xe4\x04\xd3\xbd\x40\xdc\x5b\x8c\xfb\x8d\x7f\x5b\x8c\ -\xd5\x2b\x31\xe6\x00\x67\xdc\xdf\x96\xef\xf3\x89\x07\xcc\x6d\x0e\ -\xe0\x7c\x35\xa5\xe7\x3f\x38\x13\xd4\xe4\xbd\xdf\x01\xff\x5f\xf4\ -\xb9\xbf\x3b\x7d\xfd\x47\x7f\x92\x38\x78\x23\x72\x12\x2b\xe6\x94\ -\x0f\x64\x83\x04\xf2\xdd\x47\xc7\xdd\xfa\x5c\x61\x7a\x91\x71\x00\ -\xa8\x0e\x88\x35\x80\x05\xee\x03\x4a\x0d\x00\x77\x43\x4a\x66\xab\ -\x3f\x1f\xe6\x70\xdd\x5f\xe7\x7a\xba\xfe\x47\xbb\xde\x4e\x7f\xce\ -\x03\xb9\x1d\xd2\x51\xd4\xff\x96\x97\x01\x1b\x30\x33\x3d\x07\xba\ -\xb3\xf8\xcf\xc3\xc3\x64\xfb\xb7\x6d\xd0\xaf\x8d\x7d\x87\x84\x52\ -\xa7\xbf\x2b\xe9\xb4\xbf\x9e\x31\x31\xbf\xc7\x99\xe7\x15\xaf\x6a\ -\x61\xff\x73\xc9\xab\xe0\x1e\x14\xe8\x75\xd1\xc0\x7c\x95\xf7\x64\ -\xd0\x9e\x15\xa2\xbc\xb3\x9a\xb3\xb8\x8f\x85\xbb\x2c\x88\x87\x9e\ -\x81\x93\x8c\x40\x5e\x90\x6c\xff\x04\xbe\xf5\xbb\x15\xf7\x37\x43\ -\xea\x14\xea\x71\x90\xfe\xbb\xe7\xd1\xfc\x0f\xe6\xff\xdc\xff\xeb\ -\x52\xad\x57\xe3\xfe\xf0\x8c\xa7\xcc\xfd\xc5\x5a\x3e\xff\x1f\xcf\ -\xff\x70\x9c\x5f\x13\xdc\xff\xbe\x2d\xa8\x0f\xec\x04\xd7\x09\x2b\ -\x8c\xe2\x43\x7a\x1e\x34\xee\x77\x47\xe6\x49\xb8\xd7\x50\x4b\x2d\ -\xde\x3c\x3e\x3e\xf3\x3a\xc5\x7d\xa0\x40\x36\x48\xe0\xe1\x2c\xa6\ -\xca\x17\xfd\x3d\x62\x82\xe5\xc2\xcb\x5e\x5e\xfa\x80\xe8\xff\xa9\ -\x07\x88\xcf\x86\xd5\xf5\xf7\x43\xab\xf4\x9c\x88\xff\xb7\xfb\xfc\ -\x4e\x7d\x9c\x17\xee\xff\xa1\xff\xcf\x1a\x4d\x2f\x1b\x6d\x79\x69\ -\xdc\xfd\x83\x18\x20\x05\xfa\x9f\x0c\x35\xbd\x58\xa4\xf7\xf9\x21\ -\xc2\x02\xdf\x30\x9c\xe7\x3c\x84\x9d\x67\xbb\x66\xf7\xdb\xb9\xf0\ -\xca\x61\xe4\x39\xab\xd8\xcb\x5e\x0d\x6c\x40\x15\x72\xfc\x8a\xc5\ -\x33\x10\x25\xd9\x83\xc2\x79\x68\xcc\x91\xa9\x87\x65\x74\x69\xae\ -\x09\x71\xd1\x98\xc7\x02\xf4\x9f\x78\x0e\x16\xe0\x15\x6c\x43\xb4\ -\x77\x74\xc6\x59\xbe\x39\x1d\x7d\x0b\xce\xb2\xbf\x1a\xf9\x11\x37\ -\xe8\x77\xfc\x25\x41\xfd\xb7\xdc\xf7\x2c\x67\x0d\xee\xff\x21\xbe\ -\x6b\x01\xeb\x3c\x88\xfd\xef\x74\xb9\xbf\x83\x31\x80\x3f\xfb\x33\ -\xc0\xff\x01\x36\x60\x36\xd1\x92\xf8\xbf\x29\xb8\x3f\x03\xf3\xff\ -\x7e\x1d\x90\x7b\x06\xfe\xfc\x9f\xd3\xc7\xfd\xe7\x3d\x23\xf6\xff\ -\x39\xb7\xfd\xe3\x52\xe9\x6d\x0d\xb8\xac\x87\x6c\xf4\x7d\x79\x80\ -\x4b\x76\x22\xfc\x92\x73\x32\xd3\x88\x03\xb2\x46\xfe\x1f\xe7\x80\ -\x2b\xe0\xcf\x2a\x26\xeb\x7e\x55\xf6\x43\x69\x1e\xc0\x6e\xfb\xbc\ -\x90\x25\xa9\xff\xe9\x9d\x20\x3c\x1a\xe3\x91\x75\xbf\xc1\xb3\x7f\ -\x46\x1d\x7c\xe4\xbc\x97\x8c\xe2\x6b\xc3\x73\xc3\xad\xef\x6c\x19\ -\x7e\x38\x62\x80\x6d\xc4\x9e\xd7\xc4\x88\xda\xfa\x22\xd7\xea\xdc\ -\x9a\xdb\xbd\x7c\xb4\x04\xbe\xbf\x82\x79\x3e\xea\xbe\xb3\x44\xb9\ -\x70\xd5\x5d\x64\x5f\x25\x33\xd0\x25\xe2\xab\x42\xfc\x83\x2e\xf1\ -\xd5\x15\xf4\x3e\xa4\xdd\xa6\x5c\x27\x6b\x74\x08\xc3\x1a\x31\xcf\ -\x52\x84\x67\xdf\x39\x96\xb7\x97\x8e\xe4\x72\x0b\x3f\x52\xca\x5c\ -\x80\x28\xeb\x61\xea\x14\xd8\x69\x41\xfd\x37\xc0\xff\xf3\xec\xcf\ -\x12\xc7\xff\x46\x87\xed\xbb\xf4\xfe\xcb\x4e\x3f\xc6\xe3\xbe\xbf\ -\xae\xf7\xe9\x38\xa0\xe1\x0d\x72\xff\xe9\xb9\x7f\x5d\x1f\x2c\xcb\ -\xfc\x7f\xc5\x6d\xf9\xbb\x7f\x74\xaf\x74\xff\xdf\xec\x90\x5f\x29\ -\xd8\x9d\x9f\x57\x32\x4b\xdf\x83\xcb\x7a\xce\xa9\x70\x6f\x1e\xc0\ -\x92\x8d\x65\xfe\xee\xdc\xf4\xae\x45\xa9\xff\x2f\xd0\xa9\x52\x0d\ -\xa0\x6f\x03\x2a\x32\x07\xe8\xef\x89\x4a\xfe\xef\xfb\x7e\x17\x75\ -\xbf\xce\x18\x8f\x26\xcf\xfe\xe0\x7c\x77\x26\x5a\xe7\xd9\x3f\xd0\ -\xff\xb4\x01\x36\x20\x3c\xef\xc5\x43\xcd\x5b\xc2\xe6\x5b\x21\x57\ -\x56\xe6\x06\xfc\xbe\xf9\xed\x3b\x5e\xda\x2c\x84\xbb\x54\xef\xf0\ -\x31\x4f\x2c\xa9\x83\x91\xce\xf7\xf9\x70\x29\x67\xc5\xde\x15\xea\ -\xba\xdb\xf1\xeb\xd7\xe4\xd3\x2c\xde\x6b\x47\x6c\x74\xc4\xb4\xca\ -\x12\xe6\xb1\xe6\x48\xc1\xb8\x60\xc9\x3b\xbd\xb0\xf0\x2d\xd0\xbc\ -\x0f\x2a\x9e\x15\xd8\x50\x5c\x3b\xf2\xff\xce\xf9\x2b\xc8\xef\x90\ -\xa3\xfd\x9f\x1e\xcf\xff\xa2\xef\x87\x43\x33\x5e\x8e\xee\xfd\xb7\ -\xfc\xf9\x3f\x8e\x03\x9a\x52\xf3\xab\xfb\x35\x7f\xe2\xfc\x8a\xf7\ -\xed\x41\x55\x66\xff\x69\xef\x5f\x76\xc5\x34\xee\x27\xf6\x82\x8a\ -\x68\x43\xa9\xd7\x40\xf7\xeb\x58\xd6\xe9\x1e\x36\x43\x4f\x3c\x0f\ -\x2e\xad\xba\x91\xf7\xe5\x01\x2e\xd9\xd1\xa1\xda\xb9\x99\x9d\xab\ -\x5e\x76\x1a\xe2\xd9\x48\x8f\x6a\x5e\x35\xec\x01\x62\x0c\x60\x48\ -\x0c\x40\xf1\x3f\xd6\x02\x5b\x7e\x0f\x80\xe2\x3b\xb7\xe9\xef\x02\ -\xd3\x1e\xa0\x23\xf3\x7f\x26\xcf\xfe\x64\xc0\xdf\xa7\xd0\xef\x47\ -\x20\xef\x37\xe6\x20\x0f\xd8\xef\xcd\x84\xf6\xde\x11\x4f\xf7\x3e\ -\xaf\x36\xa6\xf6\xf3\x98\x84\x7b\xf1\xb5\x95\xf0\x12\xe1\x1f\x32\ -\xe6\x19\xd8\x3a\x67\x91\xfd\xbd\xdb\xa3\x9d\xc7\x8a\xdb\xf5\xb1\ -\x4f\x8a\x36\xcf\xb0\x94\x63\xec\x2b\x71\x17\xba\xe4\xea\x59\xb6\ -\x16\x61\xd8\xe4\x4c\xc6\xb5\xc0\xf7\xbc\xd7\xca\x98\xe9\x19\xbb\ -\x73\xc7\xef\xe4\xbb\x5f\x56\x34\x4f\xb4\xb1\xb5\x6e\xd6\xff\xf3\ -\x56\xb2\x7a\xf6\xd7\x62\xfc\xbf\xb2\xcd\xfe\xbf\x22\x76\x8d\xfb\ -\xbb\x7d\xbd\xd7\x75\xc0\x59\xe9\x01\x30\xc6\x67\xfd\xb8\x5c\x80\ -\xfa\x03\x54\xff\x93\xba\x9f\xd9\xe0\xbe\x1f\xe2\x45\x9b\xdc\x0f\ -\x2e\x80\x4f\xa0\x3c\x4a\xf0\x3f\xb2\x18\x3f\x16\x1a\x1f\x83\x4b\ -\x7b\xf6\x46\xde\x97\x07\xb8\xcc\x8c\xab\x4d\x6f\x4e\x4e\x2e\x7a\ -\x59\xcc\xff\x43\xe0\x13\xc2\xa0\x07\x60\x07\xaa\x06\x1e\x78\xde\ -\x0d\xe9\x0f\xcb\x1c\x90\x9e\x11\x2d\x49\x0c\x50\x24\x3b\xa0\x73\ -\x00\x8d\xf3\xc8\x87\x62\x00\xa3\x01\xfa\x3f\xcf\x71\x00\xe8\x7f\ -\x22\xf4\x21\x2f\x91\x58\xb9\x4e\x71\xed\xe7\x64\xf6\x00\xb1\xe7\ -\xf1\x94\x4c\xa4\x77\x3d\x62\x1e\xe2\xdc\x53\x09\xf2\xfe\x32\xc6\ -\xfd\xce\xa2\xec\x3a\x83\x2e\xc4\xd8\x27\x96\xf1\x15\x75\x3e\x0e\ -\xbf\x3f\x1e\x97\x7b\x58\xf8\x5a\xa2\x1c\x88\xe3\x82\x3c\xfb\x33\ -\xc1\xb6\xe3\x93\x23\x8c\x0b\xb6\x0b\xc9\x54\xf7\x27\x93\x3b\xfe\ -\xb8\x0b\xee\xff\x91\x6a\x03\x67\xdc\x39\xff\x7f\x17\xc5\xff\x39\ -\xc4\xfe\x94\xfd\x5f\x9d\xd7\xd1\xec\xbf\x5f\xfb\x6f\xfb\x35\xc0\ -\x9a\xcb\xfd\x40\xde\xf5\x3d\xbe\xf7\x4f\x76\xc1\xe5\x7f\xab\xf8\ -\xfe\x5f\x66\x7e\x05\xf3\x53\x73\x7e\xa1\x4f\xe0\x9a\x89\xec\xff\ -\xb8\xf3\xde\xcc\x4c\xf3\x7a\xb8\xb4\xb7\xab\x53\xac\x57\xf2\x00\ -\x92\x11\x78\x20\x9f\x9b\x9c\x5e\xf5\xca\x61\xcc\xff\xe1\xb9\x40\ -\xfd\x87\x53\x11\xff\x5f\x1d\xa8\xff\xf1\x1c\x70\x4b\xf2\x3b\xae\ -\xf9\x95\x63\x18\xe3\xf1\xfe\x2f\xed\x02\x93\xff\x97\xdd\x3f\xda\ -\x01\x6e\x32\x06\x80\x59\x27\xff\x1f\x9f\xbe\xd8\x33\x76\x75\xbe\ -\xab\x4e\x3e\xfe\xcf\xe6\x11\x35\xf2\xbc\x7c\x64\xf5\x48\xc9\x5e\ -\x11\xac\xe3\x25\xca\xfd\xd1\xef\x63\xae\xcf\x7b\xce\x1d\x7a\xad\ -\xc4\xf8\x63\xc6\x3d\xe3\x83\xf5\x4f\x3d\xd7\x5a\x96\x1a\x00\x71\ -\xa4\x69\x4c\x6b\x9c\x7b\x74\x3a\xbc\xff\x40\xef\x17\x90\x03\xe5\ -\x68\x3e\xd7\xfa\x09\xfc\xfc\x37\xc0\xd9\xb0\xf9\x00\xd6\xff\xf3\ -\x96\xf3\xc2\xf1\x96\x8f\x76\x19\xff\xd3\xe2\x3d\x6f\xcd\xfd\x45\ -\xfd\xdd\x58\x5b\x6a\xff\x2d\xe9\xf5\x21\xe7\x5f\x6b\x80\xf3\x43\ -\xd7\x03\xea\xfd\x18\xc0\x9f\x09\x6d\xd2\xf7\xd0\xb5\xe0\xa2\xdd\ -\xf6\xf5\x1f\xe3\x00\xc4\x8b\x29\x10\x67\x44\x1d\x6c\x40\xe3\xc8\ -\xc8\x96\x02\xd6\x82\x4e\xb9\x7e\xe9\x03\x45\x40\xff\xcf\x8c\x23\ -\x07\xc0\xd4\x01\xaf\x18\xc2\xfc\x1f\xfc\xa0\xe8\x3f\xc6\x00\x58\ -\xaf\xa9\x9a\xa2\xff\x56\x7f\x0f\xa8\x64\x37\xfd\xba\xbf\x5f\x03\ -\xc4\xbf\xad\xc9\x7f\x77\xda\xfb\xc3\xda\x1f\xe1\x00\x21\xfe\x47\ -\xdd\x4b\x46\xe7\xbc\x78\xf8\x62\x6f\x72\x67\xf7\xfb\x4a\x85\x5e\ -\xa1\x4e\xae\x3e\xe4\x36\xed\xf8\xfd\x77\xd4\x22\xf0\x7b\x3a\xe0\ -\xfb\x2d\x8e\xfd\x89\xfb\x16\xf5\x1f\x75\x9f\xe2\xff\x0e\xfb\x7d\ -\xa7\xaf\xf7\xb8\xef\x8c\xa7\x86\x36\x22\x26\xfa\x21\x3e\xb3\xa8\ -\xb9\xd1\x2c\x7e\xd5\xf1\x4f\x41\x66\x5e\x30\x2f\xc0\xaf\x39\x63\ -\x76\xff\x27\x41\x0b\xcf\x3c\x89\xbf\xef\x71\xa2\xf3\x7f\xec\xfd\ -\x51\xfd\x9f\xfa\xff\x5d\x3f\xfe\xc7\xfe\x2e\xf9\x7f\xa7\x5f\xff\ -\xd3\xfa\x8f\x3c\x20\x3a\xfe\xef\x73\x7f\xf6\xe7\x81\xf4\xd7\x56\ -\xe2\x1a\x23\xa2\xc5\x98\xd1\x58\x3b\x15\xec\x2f\xd2\x7d\xc4\x86\ -\x21\xfd\x6f\x80\x5f\x98\x83\xcf\xef\xf5\xf6\x64\x3e\x7c\x95\xe2\ -\x99\xb0\xfb\xda\x3e\xe8\xfd\x45\x9e\x6e\xec\xfe\xfb\x9b\x4a\xd3\ -\x57\xfe\x3c\x1f\xe2\xfe\x7f\x31\x8c\x3d\x00\x78\x36\xa2\x12\xff\ -\x1b\xf0\x5c\xa0\x0d\xc0\x19\x00\x4b\x63\x3b\x88\xde\xa3\xef\x77\ -\x74\x1f\xa0\x0e\x7f\xe3\x3a\xe1\x80\xe4\x10\x03\xcc\x60\xcc\xbf\ -\x14\xc4\xfe\x29\xbb\xf9\xa3\xac\xd9\xb8\x6e\x26\xf2\xfe\xeb\xb7\ -\xee\x6c\xfc\x70\x93\x7a\x0a\x72\xbd\x9c\xcc\xfe\xd8\x93\x62\xc5\ -\x0b\x96\x8a\xe6\x2a\x5c\xe7\xaa\x8f\x75\x5c\x06\x1f\x5d\x76\xbb\ -\x7d\x9c\x23\x57\xe2\xe0\x58\xdb\xf7\x83\xf8\x5c\x97\xc9\xcf\x09\ -\x2f\x1e\x61\xe4\x88\xfe\x13\x3e\x72\xd7\xe7\xd1\xc4\xe7\x1d\x6d\ -\x5f\x5e\xea\x5e\x79\x93\x71\x6e\x13\xc9\xb9\x1f\x6c\xdf\xfe\xcc\ -\xbd\x6a\x83\xf6\x86\xfc\xfc\xdf\x58\xa2\xdd\x7f\xec\xfd\x15\x2d\ -\xbd\xfb\x87\xb5\x79\x9e\xd3\xe1\xd9\xff\x96\x60\x7f\xf2\xd1\xb3\ -\x3f\xfe\xec\x6f\xbc\x49\x36\x40\xef\x05\x54\x1c\x3d\xfb\xdb\x24\ -\x1f\xc0\x73\xff\x3c\x07\xca\xf1\x7f\xcb\x8f\x0b\xf3\xd6\x3c\x9c\ -\x39\xaf\x08\xf1\x7f\xc1\xbe\xc4\x2b\x27\x2e\xbe\x16\x2e\xef\x25\ -\x2a\xe0\xfd\xdd\x28\x79\xdc\xd6\xb1\xc7\xfd\x43\x79\x7a\xf5\x36\ -\xc4\x03\x44\x2c\xb0\x32\x9d\x2e\xf7\x00\xa2\xf8\xda\x91\x1c\xa0\ -\x45\xa7\x2c\x38\x00\x25\x7f\x06\x00\x75\x7e\x9e\x5e\xf1\xef\xab\ -\xb1\x40\x11\xdb\x11\xf1\xff\x92\x60\xeb\x73\xd1\xe6\xd7\x46\xc6\ -\x9f\xde\xde\x39\xf6\xf8\x9e\xda\xfa\xe1\x9b\x94\x7a\xe1\x7b\x15\ -\xcf\x01\x9e\x0c\xc1\xd8\xf2\x55\xe9\x58\xe3\x8b\x84\x7f\x83\xba\ -\x6f\x2f\x11\x0f\x05\xe2\x1c\x13\xd6\x11\x61\x5e\x73\x7d\x8f\xfc\ -\x3f\xd9\x00\xf6\x69\x34\x03\x07\xef\x67\x1d\xdd\x17\xd3\x58\x08\ -\x2d\xd2\x7f\xec\x09\x60\xbe\x8f\x87\xe6\x84\x68\xfe\xa9\x21\xfe\ -\xae\x4d\xb9\x10\x71\xa7\x94\x9a\x5f\x02\x4d\x7c\x96\xda\x00\xfe\ -\x23\xee\xff\xbd\x6b\x99\x38\x1e\x8d\x45\x99\x6b\x92\x79\x3c\xb7\ -\xe3\xd7\xff\xca\x32\xdf\xa5\xfb\xff\x1c\xdf\x37\x29\xcf\xaf\xb9\ -\x7a\xf6\xa7\xd9\xc7\xfc\xf5\x77\x7f\x34\xee\x4f\x8b\xf6\xc0\xb9\ -\x76\xda\x96\x7c\xbf\xd5\xaf\x0b\x11\x4f\xc4\x1c\xe2\x40\xc1\xeb\ -\x87\xbd\x74\xe8\xc2\xff\x1d\x52\x93\x68\x17\x03\xdc\xcf\x8d\x91\ -\xd2\xa8\x52\xef\x28\x18\xf3\x3f\xc4\x19\xa0\x02\xe6\x00\xe8\xff\ -\x71\x0e\x08\x72\x01\xec\x03\x94\x7d\xfd\x67\x2c\x00\xaa\xff\xd9\ -\x7a\xe6\x8f\xe7\xfe\x8b\x62\x0b\x8a\x16\xc7\x00\x79\xc1\x02\xc2\ -\x9e\x7f\x06\xfe\xde\x69\x67\xdf\xf5\x43\x13\xe6\xdb\xc7\x94\xfa\ -\xfd\xad\xdb\x5e\xfa\xf1\x21\x75\xee\xa5\xea\xe4\xcc\x7f\x60\x8d\ -\x31\xbc\x7d\xf7\x13\x3b\x45\x83\x73\xfe\xa2\xcd\x1c\x47\x58\xf3\ -\xaf\x52\xec\x2f\xfb\x0d\x82\x7f\x53\x8d\xb3\xee\x63\xdc\x5b\x9b\ -\xe9\x30\xef\x25\xc6\xbe\xb4\x23\xc7\xcf\xb9\xde\x93\xc7\xff\x97\ -\xf5\xbf\x45\xbd\x42\xe6\xb7\xe3\x3a\x08\xe1\xa1\x99\x3c\x0f\x55\ -\x8c\x75\x28\xee\x7d\xc8\x69\x1f\x44\x9c\xfb\x87\x2b\xde\x1b\x3c\ -\x69\x36\xa0\x9f\xff\x2f\xf1\xee\x0f\xf2\x80\x18\xc2\xfb\x29\x38\ -\x6f\x58\xf7\xab\x91\xed\x1b\x98\xf9\x93\x18\x7f\x4f\x9c\x6b\x81\ -\xfe\xfc\xdf\x00\x2e\x00\xcd\x7f\x6b\xfd\x8f\x89\x5d\xb4\x78\xee\ -\xa7\x40\xf6\x4f\xeb\x3e\xf3\x44\x15\x62\xcd\x63\xf9\xd8\xbe\x3b\ -\x8a\xc9\x4b\x6f\xcf\xc7\x2e\xb9\x21\xed\xbc\x12\xf7\xa8\x02\xde\ -\xbf\x8d\x11\xec\xc3\x3f\x27\x1d\xdb\x7b\x63\x26\x84\xfa\x0f\x39\ -\x31\xfa\x7f\xc4\x03\x88\x80\x6f\xc0\x39\xb8\x28\xf6\xfe\x64\x07\ -\x40\xd7\x00\xc8\xff\x6b\x9b\x8f\xfa\x3f\x4f\xfb\x00\x68\x07\x10\ -\x13\x88\xb1\xc0\x1a\x84\x07\x9a\x45\xec\xdf\x48\xe3\xc8\x6e\xf7\ -\x77\x2e\x51\x6a\xb4\xbc\x75\xfc\xb7\xdf\xb6\x59\xfd\xdd\xc7\xe1\ -\xe7\x3e\xe1\x24\xfc\x7e\x13\xf0\xec\x3f\xc1\xcd\x5e\xf4\x89\x6a\ -\x84\xeb\x7e\x65\xd0\xff\xaa\xbb\x40\x1c\x27\xd8\xeb\xf3\x6b\xdf\ -\xa4\xdf\x5d\xc1\xbd\x15\xfc\x5b\xbd\xef\x82\x31\x2f\xfa\xc5\xb8\ -\xcc\xc5\xc8\x9c\x5c\x49\xea\x04\xd4\xe7\x76\x38\x06\xa0\x5a\x37\ -\xe5\x06\xd2\x0f\xa1\x78\xa8\x45\x1c\xca\xa9\x64\xfb\xfb\x9b\xb7\ -\x3c\x02\x9e\xf7\xb1\xb4\x3a\x89\xfd\x00\xf6\xff\xef\x5c\xce\x19\ -\x3c\xfb\x43\x36\x80\xf8\x3f\x06\x30\xde\x34\xfe\x87\x83\xba\xde\ -\x1a\xb0\x01\xf0\xbb\xc7\x75\xfe\xdf\xf4\xb9\x3f\xaa\x12\x0b\xe8\ -\xbe\x3f\xcf\xfc\x71\x0c\x40\x33\x13\x82\xfd\x9b\xa7\x3e\x09\xf7\ -\x84\xf3\x36\xc6\x87\xf3\x77\x94\xa2\x73\x9f\xcf\xa5\x2e\xfb\x97\ -\x6d\x13\x67\xed\x57\x9b\xe3\x7f\xaa\xb8\x06\x18\xc8\xc9\x17\x9c\ -\xbf\xda\x13\x31\xde\xf0\xb5\xec\xf4\xf2\x91\x52\x18\x74\x24\xd4\ -\x23\x2c\x00\xec\x03\x62\x0e\x50\xc6\x39\x00\xf0\x6b\x65\xd9\x01\ -\xd0\x87\xf4\x5f\x6a\x00\x25\x87\x75\xbf\x04\xf1\x7f\x11\x4e\xce\ -\xd0\x36\x80\x7b\x01\xb8\x07\x94\x75\xcf\x5a\xda\xac\x36\xff\xd6\ -\xb8\x1a\xff\xab\x6d\x0f\xfa\x9b\xaf\xc3\xcf\xfd\xb3\x93\xf0\xfb\ -\x4d\x2a\x35\x7e\x76\xda\x5e\xfa\x72\x29\xca\x3c\x67\x15\xbb\x5f\ -\xf7\xab\x48\xec\x4b\xbc\x17\xb1\x0e\xc5\xc2\x35\xb2\x05\xc2\x77\ -\x2d\xfc\x16\x88\x6f\x3f\xeb\xf4\xe7\xe0\x08\x0b\x41\xd7\x41\x69\ -\xf6\xa1\xd5\x9f\x75\xb1\xb9\x1f\x48\xf3\x90\xc8\x8d\xea\x63\xa3\ -\xe3\xbc\x60\xef\x48\xb9\xb0\x74\xbd\x52\x9b\x70\xf6\xa5\x72\x12\ -\x7e\x7f\x12\x9d\xff\x53\xff\x4f\xb0\xff\xfc\xfe\xbf\xa3\x71\x5e\ -\x05\xfb\x4b\xb0\xff\x2b\x34\xef\xdf\xf2\xeb\xfd\x9a\xf7\x9b\x8f\ -\x60\x84\xb8\xfd\xdc\x9f\x77\xfe\x1b\x7e\x7f\xa4\x28\x35\x7f\xc2\ -\x83\xb0\x74\x8e\x54\xbf\xbd\x9c\xfc\xf0\x97\x87\x47\x27\x9e\xa5\ -\xc6\xd4\xe3\x15\xef\x4a\xa0\xef\x0f\x78\x3f\x37\x4e\x8c\xf1\x2d\ -\x8f\xb9\xb2\x30\xbd\xf2\xc3\x52\x68\x89\xe2\xff\x52\x64\x89\x62\ -\x00\xdd\x07\x64\xfd\xe7\x5d\xc0\xb2\xcc\x8a\xf3\x6e\x57\x43\xec\ -\x80\xec\x00\x0a\x06\x08\xd6\x81\x8a\x16\xe3\x81\xe3\x2c\x30\xf8\ -\x7f\x2f\x5f\x6c\x7d\x72\x74\xdb\x96\x27\x6d\x56\xa3\xcf\x18\x1d\ -\x7a\xe6\x0d\x43\x2a\xf4\x7c\xb5\xbe\x75\x5f\xcc\xfb\xdd\x89\xc9\ -\x27\x5f\x5e\x8c\xae\xdc\x5c\xb4\x57\x68\xd6\x8f\x7a\x7e\xd8\xf7\ -\xa6\x7a\x57\xdf\xff\x93\xfe\xeb\xb9\x77\xa7\xd1\x7f\xde\xe3\x0d\ -\xdf\xff\xfb\x7b\xb0\x0e\xef\xc3\x94\x2c\xf1\x79\x94\x07\xb4\x98\ -\x27\xdd\xd6\x1c\x57\x6d\x8e\x81\xa8\xe6\x2d\xb1\xb0\xd1\xf6\xe2\ -\x76\xe7\xf0\x43\x8a\x1f\xfe\x2f\xb8\xb6\x17\xa9\x93\x14\xf7\x6a\ -\xfd\xa7\xde\x1f\xea\x3f\xf6\xff\x1d\xe6\x79\x61\x4c\x9e\x16\xc5\ -\x3e\x3c\xf3\xdf\x66\xff\x2f\xf3\xfc\xd8\xfb\xf3\xe7\x80\x21\xc6\ -\x9b\xa5\xcf\xf1\x0e\xa0\xb6\x0b\x7d\xce\x9f\x06\xd5\x10\x74\x0e\ -\xc0\x36\x40\xf4\xdf\xc0\xdd\xa9\xc6\x4f\xed\xf4\x9b\x90\x03\x32\ -\xa1\x82\x9e\xdf\xa9\x22\x53\x60\x7c\xdf\x96\x0f\xad\x7d\xb5\x18\ -\x5e\x22\xdd\x2f\x49\x0d\x80\x63\x00\xee\x03\x54\xcc\x8e\x8f\x07\ -\x44\x35\x40\x99\xf3\xd6\xb5\xc0\x12\xe6\x00\x52\x0f\x28\x98\x75\ -\xea\x01\x63\x0d\x2c\x0d\xba\x8f\xb3\xc0\xae\xd1\xfe\xe2\xc4\x58\ -\xe8\x15\xe3\x6a\xea\xd9\xe0\xfa\x6f\x9c\x18\x7d\x1c\xf2\x3d\xad\ -\x67\xdd\x67\x0b\x9c\x33\xac\xc4\xa5\xff\x53\xc4\x79\x3f\xaa\xfb\ -\x2d\xf2\xdc\x0b\xcd\xf9\xb6\x04\xef\x42\xfb\x3e\x7e\xf6\xfd\x99\ -\x37\xd4\xff\x38\xd7\xbc\x67\x49\xff\x5b\xfe\x0c\x4c\xc5\xaa\xcb\ -\x5c\x2c\xf7\x04\x08\x03\x99\x72\x00\xae\x75\xb1\xaf\x6b\x49\xfc\ -\x23\xdc\x48\xd4\x03\xc3\xf9\x60\x38\xc9\x05\x6f\xc7\xd8\xa3\x97\ -\x41\x33\x71\x0e\x62\xdd\xf5\xc0\x9f\xff\xc1\xfa\x3f\xf6\xfe\x2c\ -\xc9\x7f\x06\xfc\x7f\x79\x00\xdf\x85\xfc\xbe\x2b\xf3\x3f\x03\xfb\ -\x7e\x7a\xff\x57\x73\x7d\x0f\xe6\x08\x95\xd8\xc0\x0c\x80\xcc\x48\ -\x97\x65\x57\x0a\xb1\xbf\x30\x07\x48\x59\xf3\x87\x1d\xeb\x7d\x5f\ -\x81\x4b\x7a\xb0\xba\x0f\xe2\x28\xde\x4f\x05\x77\x71\x9f\x39\x13\ -\xe9\x7c\x3a\x1f\x5a\x21\xff\x5f\x0c\xa1\xee\x2f\x7a\x55\xc4\x02\ -\xa0\x3e\x60\x8f\x6b\x00\x03\xf9\x62\x5f\xff\xf5\xdc\x47\xa3\xaf\ -\xff\x16\xcf\x04\xe9\x9e\x6f\x16\xe7\x80\x8d\xf6\x2d\x21\x95\x5d\ -\x50\x2a\xf5\x7a\xa5\x66\x6f\x56\x5b\xcf\x44\xbe\xa7\xf4\x3a\xfe\ -\x5e\x31\x30\x00\x2f\x4a\x5a\xbd\x9b\xca\xc6\x01\xea\xf9\x57\xdd\ -\x25\xe9\x79\x33\xae\x09\x1d\xb1\x01\x58\xfb\xa2\x67\x7e\x30\xe6\ -\xc5\xb8\x3f\xc6\xbc\x57\xb3\xb6\x9e\x77\x87\x8f\xe1\xf7\xae\x11\ -\xe7\x45\x9f\xeb\xaa\xcf\x75\xdf\x16\xdf\xdf\xe6\xbc\x5f\x6a\xdf\ -\x98\x07\x65\xa3\x4d\xe2\x58\xc6\xf8\x3b\x5b\xe8\x7d\x1f\xae\x11\ -\xfb\x20\xeb\x3e\xff\x82\xfa\xef\xe2\xfe\xaf\xb1\x24\xdc\xbf\x0b\ -\xb4\xdf\x5c\xd6\x98\x1c\x36\xcf\x76\xfb\x3b\x7f\x2e\xeb\xff\x6c\ -\x8c\x6b\xff\xb3\x52\x0f\xd1\xbd\xff\x9a\xcc\x07\x91\xef\xf7\xb9\ -\xc1\xfb\xf8\xd0\xbc\x23\xa1\x71\x3f\x78\xce\x00\x63\xc2\xda\xcc\ -\xa5\xc7\xaa\x0f\x69\xdc\xa4\x46\xd5\x6b\xd4\xfa\xfe\xed\x03\xb9\ -\xeb\x82\x7b\xea\x59\x3b\xf6\xa1\xd5\x42\xf8\x80\x57\xa4\x3e\x20\ -\x72\x82\x2c\x30\x16\x08\xea\xbf\xc9\x35\x40\xcd\x15\x5f\x21\x4c\ -\xb7\xa6\x5f\x03\xd0\x78\x60\x94\x0b\xfb\xba\x8f\xbd\x00\xde\xfd\ -\xc1\x1c\x20\x3e\xd5\x3a\xe2\x4c\xbc\xf7\x3b\x9b\x1e\x74\xd6\x7f\ -\x8c\x6c\xba\xe0\x8e\x89\x89\x0b\xcf\x87\x9f\x5b\x5e\xc7\xdf\xeb\ -\xc1\x86\xf9\xb4\xbd\x15\x6b\xe5\x56\x9c\xf9\x21\x5c\x0f\x9c\xf5\ -\x85\xbc\xbf\xe6\x76\xe1\x74\xe8\x54\xfc\x9e\x57\x5b\x9e\xe3\x81\ -\x5d\x37\xd4\xfb\x38\xee\xb9\xcd\x71\xfc\x8f\xbc\xd7\xbf\xc4\x77\ -\x53\x97\x99\xb7\x3e\xe7\x1d\xd7\xfd\x5a\xfd\xb9\xe0\x81\x8f\x0b\ -\xc8\x7f\x19\x6d\x7b\x33\xc6\xf2\x91\x5a\xfe\xbc\x7f\x02\xed\xc4\ -\x19\xf8\x75\xc5\x43\xe8\xe7\xff\xcb\x12\xff\x2f\x0a\xff\x5f\xcf\ -\xc7\x78\xd5\xd8\x7f\xd5\x81\xb9\x1f\xdf\x16\x52\xcd\xa3\xe9\xe3\ -\xfc\xd7\xb4\xdf\xd7\x1c\x61\x52\x33\xc5\xbf\x3f\xcd\x87\xa2\xef\ -\x27\xfd\x67\x9e\x61\x8c\xb7\xc0\x17\xdc\x98\x8d\x5d\xf4\x9f\xa9\ -\xfc\x9b\xbf\x09\x97\x74\xae\x5a\xdf\xbf\x7d\x20\x77\x5d\x08\x0f\ -\x68\x72\xf2\x65\x7b\x0b\xa1\xd5\xa3\x45\xac\x01\x82\xfe\x57\x70\ -\x0f\x30\xca\xb3\x40\x8c\x07\xc2\x78\x60\x58\x07\xa0\x78\xd1\x6a\ -\x0a\x27\x48\x8b\x6a\x7f\x95\x41\x2c\x00\x6d\x03\xe0\xf3\x59\x6b\ -\x9e\x78\xde\x92\xa1\xb9\x43\x56\xe8\x7d\x37\x85\x22\x6f\x39\x3c\ -\xae\xde\x79\x6c\x74\x74\xff\xa5\x6a\x93\x7a\xd8\x3a\xfd\x4e\x9b\ -\x86\xd5\xe6\xa7\x24\x4a\x97\x7d\xb1\x12\x39\xf8\xb3\xaa\xbb\x46\ -\x3d\x7f\xdc\xf3\xab\xc5\x7a\xd4\xeb\x47\xbf\x5f\x83\x9c\x77\x16\ -\xfb\x7e\x12\xf3\x52\xae\xeb\x63\xdb\x31\xaf\x25\x71\xde\xda\x73\ -\xde\x1e\xa7\xd5\xef\x7f\x61\x6e\x4c\xbf\x33\xeb\x81\xae\x87\xb0\ -\xee\x0b\xe7\x95\xcd\x58\x21\xdc\x13\x6c\x73\x0e\x60\x34\x85\x03\ -\xa7\xe7\xe5\x40\x27\x0a\xc5\xe5\xef\x29\x35\x8d\x7c\x88\x38\x0b\ -\xb9\x6e\xfd\x00\xd4\x7f\x5b\xf0\x7f\x88\xff\x33\xda\x65\xae\x47\ -\x8b\xf5\x1f\x67\x9b\x6b\x34\xf7\xcf\xf5\xcf\x5a\xbc\xcd\xaf\x52\ -\x03\xdc\x43\xf3\x8f\xfc\xbb\xef\xf1\x63\x7f\xc1\x07\x12\x8c\x10\ -\x8d\x19\x58\x96\xf9\x1f\xc2\x8c\xc1\xbe\x31\xfc\xae\xf8\xfd\xf7\ -\xb8\xf3\xdf\x18\x52\xc3\x17\x6d\x1a\x52\x6f\x85\x4b\x7a\xba\xba\ -\x8f\x61\x28\xdf\xdf\x65\xb3\xda\xf5\xce\xdc\xee\xe5\x1f\xe7\xb1\ -\x0f\x88\x3d\x40\xe4\x04\x81\x18\xa0\xea\xd7\x00\x25\x06\xb0\xfb\ -\x71\xc0\x60\x2f\x50\xef\x03\x93\xde\x83\xfe\xe7\xe8\xcc\x91\xfe\ -\x67\x90\xef\xc1\xbd\xec\x7f\xd5\x83\x9e\xb8\x14\x4d\xbc\xb8\x37\ -\xb9\xed\xfc\xef\x8d\x6c\xde\x8f\x3d\xc0\xbf\x3c\xc1\xbf\x06\xda\ -\x32\xd4\xa3\x87\x84\x12\x7f\x71\x61\xde\x58\x05\xff\x73\x39\xf9\ -\x7e\xac\xfb\xa3\x1f\xaa\x3a\x3d\x7a\xb6\xab\x92\xef\xd3\x73\x1f\ -\x63\x5f\xa7\x7b\x5a\x83\x3c\xb7\xb3\x82\x75\x31\x6b\xeb\x1d\xd8\ -\x7e\x0c\x50\x15\xbc\x3c\xc4\x3e\x1b\xe4\xbc\xcc\xeb\xfd\x60\x8a\ -\xff\xb9\x07\x9e\xb3\xdb\xc4\x89\xa6\x77\xa4\x71\x06\x2f\x87\x5c\ -\xcb\xe5\x03\xb8\x0b\xff\x3c\xb5\x8e\xfa\x80\xfa\x1f\x8b\xbd\x97\ -\xf7\xff\xec\x45\x9a\x83\x28\x18\x82\xff\x83\xb9\x90\x60\x00\xd5\ -\x68\x06\x42\xef\xfc\xb6\xe8\xf7\xeb\x63\x7f\xf5\x31\xc0\xf4\x3c\ -\xf0\x71\xd8\x9f\x3a\xff\x17\xdc\x5f\xf6\x11\x88\x1f\xdb\xe3\xb9\ -\x91\xc4\xdc\xf7\x20\xcb\xf9\xbf\xeb\xf5\x3b\x06\x72\xef\x64\x5c\ -\xa9\xb3\x72\xbb\x57\x6e\x28\x84\xd7\xb8\x06\x88\xf1\x7f\x54\x7a\ -\x00\xa6\xce\xff\xbb\x7d\x2c\x40\xdd\x07\x74\x9a\xfd\x19\x60\x9a\ -\x07\xd6\xbc\xe0\xa0\xff\x36\xf8\x7e\x38\xd8\x03\x4f\xb9\xf3\x37\ -\x0d\xa9\x87\xbe\x67\x4c\x9d\xf6\x07\x3b\xd4\xf3\xff\x7d\xcb\xc8\ -\x7b\xbe\x31\xa2\x9e\xf8\x2e\xc5\xb3\x9f\x27\x2a\xff\xc5\x79\x1f\ -\xc4\x94\x3f\x3f\x1e\xbf\xec\xfa\x1c\xe6\x33\xd6\x01\x78\x0e\x57\ -\x18\xe7\x83\xf6\xfc\x75\x9f\xaf\xe3\xe7\xfc\x15\x57\xef\xb8\x48\ -\xbd\x0b\x6b\xdb\x8e\xf8\x7f\xd4\x77\xf4\x7b\xe8\x0b\xe1\x3d\xd5\ -\x03\x74\x0e\x40\x98\x39\x0d\x8a\x85\x30\xe6\xe1\x3a\x80\xae\x03\ -\x32\x17\x0a\xce\x02\xe8\x5a\x40\xce\x6c\xfa\xb5\x00\xac\x05\xe6\ -\xe1\x7a\x12\x89\x95\x43\xbb\x76\xfc\xf9\x15\x8a\xb9\x30\xd6\xa5\ -\x0e\x80\xfc\x3f\x6e\xe2\xbc\xe5\x9c\xb5\x0c\xb9\x58\x4f\xf0\x7f\ -\x17\x05\xff\xab\xcb\xbb\x0d\x54\x0f\x69\xb1\xae\xda\xfd\x1a\x40\ -\x75\x60\xfe\x77\x36\xa6\xeb\x00\x03\xb3\x80\x82\xff\xc7\xbc\xdf\ -\xec\xff\x69\x86\xd2\x66\x6e\x51\xb4\xb7\x65\xe9\x89\x0c\x8f\x8c\ -\xcf\x29\xc6\x5f\xbc\x4f\xf2\x28\xdd\x9f\x65\x68\x48\x9d\x55\x08\ -\xad\xdc\x50\x8c\xac\xf2\x1e\x40\x04\x7c\x93\xee\x01\x9a\x5c\x03\ -\x60\x3c\xc0\xae\xe4\x76\xd2\x07\xd0\xf3\x80\xc4\x09\xac\xf7\x80\ -\xa5\xee\x87\xf3\x80\x4e\x83\xf4\x3f\x63\x36\x7e\xee\x86\xde\xfe\ -\x8d\x1d\x63\x67\x5d\xb1\x7b\xdb\xbe\x5b\x27\x27\x1b\x87\x77\x4f\ -\xae\x7d\x76\x68\xec\x84\xce\x7f\xe3\xb3\xb5\x67\xd7\xee\x27\xac\ -\x66\x23\x6b\x47\x8a\xd1\x35\xb8\xf6\x65\x78\x4e\x97\x05\xdf\x07\ -\xe3\xfd\x2e\xc5\xfd\x1c\xff\x77\xfc\xe7\xbc\xe6\xd7\xfd\x1b\xc4\ -\x6b\xc9\x31\x40\x83\x73\x7e\xd0\xfb\xd3\xec\xa6\xf0\x5e\xcc\xfb\ -\xf1\x3f\xcd\x01\x89\xef\x2f\xdb\x6c\x03\x0a\x56\xc3\xcf\x03\xb4\ -\xbe\x93\xcf\x97\x5a\x20\xf6\x02\xf3\x32\x1b\x57\xc1\x1d\x41\x6b\ -\xe9\x68\xa5\xb8\x78\x48\x31\x2e\xda\xba\xd4\xc4\xc9\xff\xcf\xbc\ -\x6f\x39\x0f\x39\x50\xde\x5a\x26\xfc\x5f\x9a\x7f\xb6\xbb\x12\x13\ -\x0d\x60\xbc\xdb\x32\x03\x44\x7b\x4e\x0d\xb9\x37\x38\xf3\xd4\xdf\ -\xfd\x99\x95\x39\x80\xd9\xf8\x2f\xc4\xfe\xc2\xfb\xe5\xf7\x56\x09\ -\x3b\x86\xf7\x8c\x11\x43\x75\x72\xcb\xb3\x0e\xaa\x8d\xc7\x7f\x0d\ -\xe4\x57\xc8\xf0\xb0\xfa\xb3\x5c\xa4\xfb\x25\xec\x01\x94\x84\x0f\ -\xa0\x10\xea\xf9\xfe\xbf\x8a\xbb\x80\x16\xef\x04\x57\xa9\x86\xce\ -\x35\xde\x8a\xf8\x3c\xc2\x01\xc0\xfe\x3f\xed\x01\xd4\x85\x0f\xb8\ -\x21\xfa\xdf\xf4\xd2\xf0\xb5\x8e\xd1\xbc\xcd\x9c\x6e\xdc\x14\x0b\ -\xd5\x7f\x6e\x4c\xd7\xbd\xe9\xe9\xde\x2d\x23\x9b\xa2\x1f\x55\x27\ -\x0e\x0f\x88\x7a\x19\xc9\xdc\x25\x9f\x2e\x4d\xaf\xd2\xac\x3b\x62\ -\x7b\x52\xdd\x0f\x74\xcd\xaf\xfb\x81\xde\xcf\xc6\xc1\x16\xa0\xff\ -\x8f\xe9\x7e\x57\xd3\xc7\xb4\xae\x49\x0c\x30\x2b\xf1\xbf\xaf\xff\ -\xfa\xdf\xd1\xff\xa3\xfe\x5b\x32\xff\xe6\xb0\xde\x14\xa5\x0f\x40\ -\x35\x00\xbd\x0f\x6d\x4b\xef\x0f\x31\x01\x50\xef\xdd\x16\xd5\x02\ -\xf2\xb2\x1f\x8b\xb5\x80\x4c\x6c\xc1\xb3\x8d\x17\x36\x15\xe1\x13\ -\x9e\x78\x41\xfd\x77\x72\xc8\xff\x03\x7f\x53\x5b\x66\x80\xad\xc1\ -\xfa\x9f\xd4\x00\xd0\x26\x3a\x6d\xa9\xfd\xb7\xe9\xf8\x71\xbf\xf8\ -\x7d\xd2\x7f\xfa\x77\x8c\x7f\xea\xbc\x0b\x14\x6f\xf9\xfb\x12\xcc\ -\x0f\x2b\xfe\x81\x9e\x13\xc6\x55\xc2\x9e\x68\x39\xbf\xff\xd3\x10\ -\x68\x3e\x53\x6d\x1c\xfe\x6b\x20\xbf\x5e\xf6\x24\x8c\xb9\x8f\x67\ -\x77\x1f\xf4\xf2\x88\x09\x8c\xb3\x00\xc2\x09\x56\x35\x7b\x03\x58\ -\x60\xfc\x4a\x73\x40\x56\xcb\x9f\xf7\xf0\x71\x40\xdc\xa6\xcc\xbc\ -\x72\xdf\x3b\x4f\xfb\xde\x2d\xde\x03\x36\x70\x27\xa0\xe5\xc5\x23\ -\x4d\xcf\x98\x6e\x78\xe1\xdd\x3d\x6f\xdb\xd0\x53\xbe\x05\x3f\x3b\ -\x76\x82\x7e\x07\xe4\x16\x78\x9d\x63\x75\xbf\x58\x08\x83\x1d\x73\ -\x18\xc7\x9f\x62\x7f\xd0\xb1\xaa\xe4\xba\x9c\xf7\x77\xa5\xbe\xdd\ -\x1e\xe8\xf7\x71\xdd\xcf\xef\xf3\x49\xae\x8f\x9f\xdb\xe3\xeb\x3f\ -\xea\xfe\x3c\xe8\x7e\x9d\x7d\xbf\xce\xfd\x4d\xc6\x40\x2f\xd1\xee\ -\x3b\xbf\xf2\x1e\x80\xc4\xfb\xb8\x1f\x00\xf7\x2c\x63\x32\x37\x3a\ -\xef\x08\x22\x17\x6e\xcf\xcb\x83\x5d\xca\x66\x7b\x38\x13\x89\xf3\ -\x00\xeb\x31\x13\xf5\xa8\x68\xfa\x9c\xfd\x39\xc8\xfb\xb1\x07\x58\ -\xa0\xf9\xff\x05\xe2\xff\xe6\xfc\x9f\xb1\x1e\xe9\xde\xd8\x2d\xbf\ -\xae\xc1\xf1\xbf\x9e\x03\x6c\xf9\x3b\xc0\x3e\x06\x88\xa3\xf9\x81\ -\x35\x26\x7c\x8b\xf0\x51\xf4\x0c\x20\xed\x16\x52\xff\xbf\x47\xb8\ -\x48\xb9\x64\xeb\x1b\x90\xe1\xbc\x13\xae\x67\xf7\x3a\xfc\x8e\x81\ -\xdc\x3b\x99\x34\xac\x73\x9a\xc5\xd0\xe5\x47\x2a\x38\x2f\x13\xc2\ -\x59\xa0\x9e\xf4\x01\x65\x0e\x58\x63\x02\xfb\x3e\xa3\x2d\xf1\x3f\ -\xef\x7d\x13\x16\x98\xf4\x00\x08\xe7\x01\xe7\xff\x08\x07\x84\xb1\ -\x80\x93\x26\xc7\x01\x71\xd0\xfd\x44\xb8\xed\xb9\xa1\x8e\x17\xdb\ -\xdd\xb8\x4e\x9d\x38\x3c\xa0\xe9\xa1\xb1\xc2\x05\x79\x63\xf5\xbf\ -\x0b\x16\xef\xf9\x96\xc1\xdf\xd5\x62\x8b\xf4\x8c\xcf\xc6\x7a\x1c\ -\xff\xbb\x6d\xff\x54\xc9\x97\xb5\xfc\x9d\xb6\x3d\xe2\xfb\xf7\x08\ -\xce\xe5\x1e\xa9\x01\xec\xc1\xf8\x17\xf5\xdf\xef\x01\xa2\xff\xe7\ -\x39\x60\xda\x8b\x96\x53\x1a\x88\x01\x34\x1e\x32\xcd\x03\xe8\xfe\ -\x9f\xcd\x3b\x42\x78\x6f\x0a\x82\x99\x98\xc5\x3c\x20\xd9\xf5\x14\ -\xe3\x84\xac\x47\x1d\x30\x93\xac\x9e\xf3\xf6\xbc\xd1\x23\xdc\x23\ -\xec\xff\x51\x0f\x40\x70\x9e\xab\xf2\xf7\xac\x09\xdf\x13\xc6\x00\ -\xac\xff\xcd\x7e\xaf\x7f\x90\x03\x4c\xb0\x3f\x66\xa5\x57\x5a\x91\ -\x99\x81\x92\xdb\x14\x8c\x24\xc6\xff\x2a\x52\x5d\xa4\x2d\xf3\x3f\ -\x1d\xc4\x44\xbb\x65\x26\xf2\xf2\x8f\xc9\xef\x18\xcc\xff\x9d\x5a\ -\x32\x1c\xde\xf5\xd4\xb7\xe7\x77\x1f\xbc\xbe\x8c\xbe\x3f\xcc\x98\ -\xa0\x25\x03\xf9\xc1\x05\x13\x10\x9e\x97\x9a\xb3\x40\xcf\x0b\xd5\ -\x03\x05\x13\x1c\xfd\x1e\xc6\x7f\xf8\xf7\x2f\x50\x0e\xd0\xe4\xd9\ -\x77\x8b\xe7\xdf\x33\xc4\x03\x0e\x36\x80\xf4\xbf\xe9\x25\x21\x0e\ -\x48\x85\x17\xbc\x99\x68\xd3\xb3\xed\x8f\x9c\x48\x3c\x20\x73\x6b\ -\xec\xf9\xd7\xe4\xc3\xcb\x3f\x2a\xf8\x18\x1f\xe2\xfb\x51\xf7\x63\ -\xbd\xe3\x74\x7f\x96\x7a\x5e\xdc\xeb\xd6\xf5\x2d\xc4\xb6\xc4\xd8\ -\x7e\x0f\xed\xb9\xd7\xfd\x73\x9a\xdd\x92\xd9\x1f\xd0\x7f\x4b\xe2\ -\x7f\xcc\x97\x41\x8f\x69\x2f\xda\x92\x79\x60\x99\x8b\x20\x3c\x14\ -\xd9\x7b\x67\xfd\x6f\x53\xfc\x9f\x77\xd8\x16\x60\x4e\x50\x90\x3e\ -\x21\xce\x04\xe6\x10\x87\x20\xf7\x81\x8f\x28\x35\xfa\xe7\x27\xe0\ -\x3e\xfc\xa2\xb8\x89\xfc\x3b\xde\x58\xa0\x19\x88\x15\xee\xff\x5b\ -\xc2\xf3\x26\xbb\x5d\x98\x1b\x55\x05\xe7\xbd\x46\x7b\x40\xcd\x7e\ -\x9f\xdf\xd5\xfb\x7f\xcd\x7e\x9d\x94\xee\x17\x7f\x5e\xcf\xff\x30\ -\x26\xa4\xe0\x7f\x08\x46\x32\x61\x00\xb8\x8c\x95\x92\x77\x9a\x47\ -\xab\xc5\x83\xd8\xff\xc7\xb9\xff\x60\xfe\xef\x14\x93\x6d\x6a\xc7\ -\xb9\x95\xf0\xe2\x8d\x34\xfb\x1b\x16\x4e\x40\x43\xfa\x00\x86\x60\ -\x82\x41\xcc\x58\x1b\xe0\x07\xa7\x3a\x80\xdd\x14\xec\xb7\xa6\x5f\ -\xff\x2b\x50\x0f\x00\x9e\x73\x07\xb1\x00\x1a\xac\xfb\x88\x07\x06\ -\xcf\x45\x12\x9e\xfd\x64\xb4\x03\xfa\xdf\xf0\x5c\x0b\x7b\xe0\xc4\ -\x0d\x16\xbb\x97\x97\x8f\xf1\x43\xd5\x4d\x5e\xf8\x95\x92\xb5\x72\ -\xa4\xec\x68\xfd\x5f\xa0\x3d\x5f\xcc\xf7\x31\xf7\x9f\x15\x7c\xbb\ -\x3d\x71\xac\x01\xb4\xa5\xef\xdf\xe6\xf7\xf0\xfc\xf2\xae\x6b\x43\ -\xfa\x7e\xf3\x5c\xeb\x86\x98\x77\x8f\x25\xb5\x2f\x8c\x0b\xec\x06\ -\xe5\x00\x15\xb3\xc9\x36\x00\x6b\xe7\x96\xe0\xa3\xe8\xbd\x20\x8b\ -\x6b\xa1\xba\x0f\x88\x75\xbf\x9c\xcc\x02\x91\xef\x77\xd1\x16\xe8\ -\x1d\x61\xd6\x95\x64\xba\xf5\x3d\xe4\x1b\x57\xbc\x97\x75\x22\x6a\ -\xe4\x78\x4f\x26\xc7\x70\x07\x32\x77\xfe\x7c\x8e\xb8\xcc\x56\x89\ -\xf3\x00\x77\x00\x70\xfe\x8f\xfa\x73\x92\xd3\x71\x6e\xa4\x67\x01\ -\x9a\xbe\x7e\xeb\x1a\x60\x4d\xb0\x3e\xd1\x06\x54\x34\xf6\x67\xbc\ -\xaf\xff\x14\xff\xc7\xda\x3e\x16\xac\xe6\x81\xd4\x27\x87\x75\xe0\ -\xc4\x7e\xfc\x7b\xe3\xee\x87\x7b\x02\x7e\xbf\x40\x4e\xa0\x6c\x53\ -\xea\xa2\x7c\x68\xf1\x8e\x4a\x08\x74\x27\xbc\x4c\x73\x40\xa5\xf0\ -\x02\xcd\x02\x51\x2e\x60\x32\x1e\x08\xe3\x02\xb6\xfd\xbe\x31\xf5\ -\x01\x62\x3c\xfb\xa9\x6b\x00\x14\x03\x60\xad\xcb\x66\xfd\xcf\xa0\ -\x0d\x40\x4c\xa0\x28\x9f\x04\xf2\x82\x98\x58\x13\x5c\xfa\x01\x3c\ -\x0a\x38\x0b\x7c\x6f\xf1\x80\x36\x8f\xa8\xf1\xe7\xa4\x63\xcd\x1b\ -\x6b\xf6\x01\xc9\xfd\xc1\xdf\x21\xa6\xbf\xc5\xb9\x8a\x9e\xf9\xd3\ -\xfa\x4e\xf5\xad\x78\x4b\x76\x5c\x5b\x82\x69\x5f\x3f\xbe\xc6\x1d\ -\xe3\x1e\xc0\x1e\x78\x7e\x67\x25\x27\xa8\x59\x98\xff\xcf\x73\xfc\ -\x8f\x35\x40\x9b\x5f\x29\xfe\xf7\x31\x70\x9a\x12\x03\xf0\x1c\x34\ -\xf6\x04\x79\x07\x5e\xfa\x81\x82\x93\x84\xf5\x41\xc4\x14\xa6\x1e\ -\x01\xbc\x9e\x5e\xdd\xfb\x49\xc5\xbb\xd1\x27\xc2\x3f\x62\x9d\xbd\ -\x3c\xb4\xed\x11\x1f\x9a\xb1\x56\xae\xc7\xfd\x1f\xc2\x41\x30\x96\ -\x18\xfb\x18\x67\x22\x8c\xfe\x6e\xb7\xae\x8d\x30\x16\x40\x5b\xf6\ -\xfc\x34\x16\x58\x1f\xef\x67\x10\xfb\x8b\x31\x92\x9a\x82\x05\xc3\ -\xfe\x5f\xef\x41\x68\x0c\x10\xda\x83\xc0\x1a\x90\x31\xe7\x25\xac\ -\xb9\x43\xae\x75\x36\xf6\x3b\x1f\x75\x02\x7e\xbf\x40\x4e\x9c\xec\ -\x80\x07\xae\x9d\x0f\xc1\xdf\x3a\x8a\xfe\x7f\x99\xe6\x00\xaa\x78\ -\x0c\xde\x05\xaa\x5a\x0b\xc4\x95\x53\xb3\x30\x06\x60\xbf\xc1\xf3\ -\xc0\x8c\x1f\x87\xb5\x5f\xda\xfd\x13\xfe\xd7\xa2\xdb\x62\x1f\x07\ -\x07\xf5\x3f\x43\x9c\x20\x10\x07\xe0\x41\x7e\x50\x88\x3d\x63\x66\ -\xe7\x96\xc9\xad\x4f\x7b\x8f\xba\xf7\x58\xf0\x3b\x76\xec\x3a\xe3\ -\x1d\x25\x67\xf1\x87\x25\x67\x95\xea\x7e\xc4\xe7\x03\xfe\x7f\x16\ -\xf2\x7f\xd4\xfb\x3d\x38\xef\x17\x93\xfc\x5f\x6a\x7f\x7b\x68\x06\ -\x40\xe3\xdc\xb5\xfc\xfa\x7e\x4d\x70\x2d\x75\xad\xff\x74\xb0\x21\ -\xb3\xf0\xec\x63\x5d\x00\x77\x01\x7c\xfd\xa7\x18\x00\xbe\x9f\xcc\ -\x44\x96\x8c\xba\x6f\x13\x71\x17\x92\xe7\x21\xa5\x1e\x80\x3a\xe1\ -\x0a\x4e\x80\xec\x08\x17\x75\xad\x00\xf1\x03\xe0\xe7\xa7\x53\x9d\ -\x6f\x8d\x0c\xd5\x90\x37\x00\x7b\x22\xf7\x36\x47\x1e\x1f\x81\x58\ -\x7b\xdb\xe4\xb3\xaf\x8c\x47\xd6\x20\xcf\x40\xec\xaf\x45\xaf\x18\ -\x5d\xa0\xfb\x83\xf3\x10\x55\xe1\x79\xab\x39\xec\xff\x67\x5d\x5d\ -\x1f\x6d\x8b\xdf\x6f\x1f\xd7\x0b\xd4\x58\x40\x9a\xff\xaf\x22\x33\ -\x80\x1a\xff\x83\x6a\x9f\x31\xc6\x47\xf7\x75\x1f\xf9\x60\x04\xf7\ -\x33\xe3\x5e\x76\x24\x97\xda\x87\xd8\xbf\x88\x85\x14\xe0\xfe\x9d\ -\x3a\x92\x1d\x55\xea\xca\x3c\xe8\x66\x71\xaa\xcd\x38\x20\xe0\xfb\ -\xd1\x0e\x54\x89\x17\x64\x81\xfa\x00\xc8\x0f\x50\x1b\xa8\x03\x10\ -\x2e\xee\x40\x0d\x10\x0f\xe7\xff\x18\xe3\x4a\xff\x0f\x9e\x8d\xac\ -\x8d\x39\x00\xc6\x01\x68\x0b\x5a\xa4\xff\x69\x78\x4d\x3a\x8d\x5b\ -\xa2\xd1\x97\x9c\x08\xfd\x9f\x9e\x29\xbc\xf5\x60\xcd\x38\x70\x88\ -\xf4\xdf\xe1\xba\x3f\xf6\xfd\x66\x71\xe6\x1f\x9f\xed\x18\xcf\xb7\ -\xee\xc1\x58\xdf\xc1\xb8\x1f\x6c\x42\xa2\xdd\xd7\x7b\x7f\xef\x85\ -\x77\x5f\xaa\xd2\xe7\xc7\x7e\xff\x1e\x93\xf5\x9f\x30\xaf\x51\x17\ -\x30\xff\x07\x9f\x4d\x39\x33\xe6\x41\x66\x4b\x30\xd2\x98\x4b\xaf\ -\x2c\xfe\x9f\x78\x30\x88\x17\xb1\x29\x98\x00\x3a\x1f\x68\x91\xef\ -\x47\x9d\x67\xfd\xe7\xd8\x39\xe7\xd6\x0f\x9f\x76\x5a\xf7\xab\x4a\ -\x6d\x42\x5c\xcc\x7b\x8b\x8b\x81\xfa\xf5\x5b\x63\x9b\x7e\xef\xca\ -\xc4\x6e\xe6\xfe\xe3\x18\x80\x31\x40\xab\x0e\xcf\x00\x73\x0e\xd0\ -\x21\xae\x87\xaa\xae\x8b\xc6\xda\x82\xfd\xdd\xc7\x01\x1f\x9c\x01\ -\xd4\x35\x00\xaa\xfb\xc7\xc4\xff\xc7\x5a\x82\x03\xdd\xe0\xdf\xc9\ -\x6c\xf4\xb1\xa0\xd1\x0e\xe0\x3c\xa8\x7b\xe9\xd1\x78\xe6\xb2\x5b\ -\xc0\xb2\xbd\x50\x71\xbf\x26\x90\x53\x43\xb2\x90\x2c\x5e\x99\x8a\ -\x2f\x7a\x99\xd0\xaa\x97\xdd\xcd\x58\x40\xc8\x97\x51\x95\x5d\x40\ -\xf4\xfd\x58\x2f\x42\xdf\x5f\x73\x25\x6f\x94\x1d\xfa\xb2\xe0\x66\ -\x12\x26\xb8\xf0\x83\x70\x1e\x80\x98\x6f\x75\xb2\xfd\x68\x03\xa8\ -\x1f\x00\xcf\x7f\x86\xea\xde\xa0\xff\xee\xfc\x2d\x96\xf9\xc6\x13\ -\xa1\xff\x76\x62\xa6\xfe\xbd\x52\xe4\xc0\xcf\x2b\x3a\xb6\x85\x33\ -\x1b\x17\xfd\x77\x45\xff\xb1\xaf\xed\xe7\xfe\xfc\xde\xaf\x6b\x89\ -\x7f\xd3\x7b\x6f\x35\xb7\x8f\x7d\xbf\x07\xec\x15\xe9\x3f\xce\x01\ -\x62\x2d\x00\x6d\x80\xc5\x79\x3f\xe9\x8d\xc5\xfb\x84\x65\x5d\x07\ -\xb0\x9a\x82\x85\xd7\xea\x73\xe1\x38\x7d\xbc\xb0\xbc\xce\x8b\xd1\ -\x5e\xea\xb9\x09\xac\x11\x38\xad\x63\x71\xbb\xf9\x83\xcd\xdb\x7f\ -\xef\x3d\xc2\x27\x7c\x6f\x84\xfd\xff\xf0\x13\xae\x8c\x4d\x2f\x79\ -\x59\x88\xeb\x72\xd1\x45\xde\x41\x44\x7b\x6e\xe9\x9a\x6e\x4f\xea\ -\x7e\x5d\x99\x01\xe6\x9d\x68\xae\x03\xe8\x57\x3d\x23\xd1\xe8\xf7\ -\x02\x04\x1b\xb1\x1c\x63\x1e\x28\xfc\xdb\x73\x0d\x58\x6a\x40\xb6\ -\x9e\x77\x94\x1d\x68\x67\x1f\xdc\xa3\x7d\xb7\x4c\x8c\x3d\x0e\xf7\ -\x1e\xf7\xa8\x53\x83\x07\x3e\x10\x96\x1d\x70\x3e\x18\x73\x2e\xb9\ -\x39\x1f\x5e\xf5\xf2\x60\x03\xb0\x07\x50\x81\xf8\x1f\xf7\x80\x08\ -\x0b\xc0\xe2\x59\xc0\x9a\xcc\x74\x69\x3c\x90\x7e\x0d\xa0\xdd\xe7\ -\x05\xc0\x1c\x00\xf3\x01\x7c\x1e\x5c\xce\x01\x74\x2d\x80\xb8\x41\ -\x6c\xee\x07\xb0\xfe\xbf\xeb\xde\xea\x3f\x5e\xfb\xa3\xf3\xce\xf2\ -\xe1\x8a\x75\xe0\x58\x15\x7c\x3f\x72\xfa\xd5\x90\xd3\xdb\xe5\xb9\ -\x1f\x9e\xf7\x81\x6b\x8f\x77\xfc\xf9\x36\x6d\x0f\x08\xef\x2b\xce\ -\xfe\x6e\x36\xae\x9f\xf3\x26\xcd\xb7\x54\xe5\x9c\x86\xfa\x6f\x6b\ -\xfd\x6f\xc9\xe1\xb8\x1f\xf1\x51\x08\x23\xdd\x44\x9e\xd0\x86\xf0\ -\x24\xb5\x28\x0e\x28\x58\x03\x33\xc1\x16\xf7\x02\x68\x06\xd0\x6a\ -\xca\x3c\xa0\xae\x95\xc8\x7d\xc2\x7b\xe4\x74\x0e\x57\xb2\x6d\x9c\ -\x07\xc0\xba\x68\xf4\x5e\xdc\x17\xe2\x3a\x1f\x1d\x7b\xec\xc1\x74\ -\x68\x85\xb0\x7f\x0a\xe2\xfb\x71\xfe\x87\xf6\x7f\xd0\x9e\x3b\x6c\ -\xcb\x69\x2e\x12\xf5\x3f\xd6\xf6\xb1\xc0\xaa\x6e\xff\xe8\x39\x29\ -\x5d\x33\xa1\xbe\xbf\x8e\xff\x63\x2d\xa9\x77\x6a\x2e\x28\xbd\xff\ -\xdd\xf4\x4f\xce\xbe\xec\x8e\x62\x72\xdf\x17\xd4\x26\xf5\x68\x15\ -\x60\xfe\x9e\x8a\xf2\xb4\xa9\xe9\x27\x2f\x66\x8c\xc5\x5b\xf2\x91\ -\x95\xa3\x88\x03\x56\x32\x96\xa9\xfe\x87\xdc\xa0\x35\x7b\xc9\xf7\ -\x19\xf8\x4a\x71\x00\x71\xc8\xf1\xee\x58\x25\xde\x1e\xc0\x80\xd7\ -\xb5\xa0\xa6\xe4\x00\x0d\xae\xff\xd2\x5e\x50\xd3\x9f\x89\x4f\xbb\ -\xfb\x6e\x4d\xcf\xec\x43\x0c\xd8\x07\xdf\x8b\xeb\x8e\x8f\xa8\xb1\ -\x17\x97\xa3\x88\xeb\x7b\xc0\x43\xfd\x47\x5e\x9f\x9a\xbb\x48\xd7\ -\xd7\xaf\x6b\x63\xbc\xdf\x13\x9f\x3f\x50\xe3\xf2\xb1\x3c\x24\xce\ -\x95\xd9\x17\xcc\x11\x6a\xc2\x7f\x73\xba\xd9\x96\xd9\x80\x79\xf6\ -\xff\x74\xa4\x67\x0e\xff\x46\xef\x1d\xc6\x49\xe7\xf9\x08\xe6\xbf\ -\x2d\x18\x7d\x3e\xac\x82\xe4\x02\x8c\x15\x38\x90\x07\xe8\x7e\x29\ -\xc6\x00\x34\x37\xd9\xf1\x66\x9c\xfd\xde\xe9\x99\x4b\x56\xc1\x45\ -\x22\x5f\xfa\x3d\xdd\x91\x40\x5c\x2d\x63\xdb\x96\x3f\xee\x25\x71\ -\x9e\x93\xb8\xbf\x97\xb8\xf6\x8f\x3c\xef\x58\xcf\xc5\xfc\xdf\x65\ -\x5b\x5e\x93\xfb\xb4\x47\xfa\xa4\x3e\x0e\x40\xbc\x7f\xaf\xf4\x6e\ -\x10\x61\x80\x08\x47\x60\x59\xf4\xbf\x1c\x6f\xf9\x7c\xb0\x45\xc1\ -\x3d\xc3\xdf\x0f\xff\xee\x88\x09\x51\x46\xfd\x2f\x5d\xf2\x1f\x70\ -\x4d\x25\x15\xcc\x00\x9f\x8a\xb2\x79\x6c\x58\x3d\xb1\x12\xbf\xe0\ -\x53\xd9\xc8\xda\x6d\x38\x07\x5c\x8a\xe2\x3e\xf0\x02\xcd\x01\x56\ -\x30\x67\xc4\xda\x1f\xe5\xfe\x3c\x3b\xa2\xf5\xcb\x8f\x01\xdc\x96\ -\xf0\xe4\x34\xfd\x5d\x20\xce\x01\xe6\xfb\x79\x00\xce\x06\xda\x3c\ -\x13\x9f\x8d\xed\xfb\xe9\xcc\xcc\x1c\xce\x00\x3f\xe6\x5e\x5c\xf7\ -\x69\xa1\xd0\x63\x2e\x2a\x47\x91\xd7\x6f\x05\x9e\x51\x99\xf7\xa7\ -\xdc\x5f\xe6\x7e\xe2\xbc\xeb\x5b\xd3\xbe\x4c\xf6\x5c\xfb\x5c\x97\ -\x7d\xdc\xcf\x9a\xf6\xfd\x62\x0b\x30\xdf\x3f\x03\xeb\x7f\xd4\x17\ -\xc0\xb9\x1f\xf0\xf1\x46\x93\x74\xbf\x62\xb4\x99\x23\xc5\xec\xd7\ -\x00\xca\x96\xe6\x4a\xe4\x3d\x29\xaa\xff\x61\x5d\x6c\x20\xfe\x2f\ -\x58\x7a\x17\x80\x7b\x24\xda\x46\x66\xc5\x3e\x62\x7c\xe4\xce\x34\ -\x6e\xdf\xb6\xf3\xf1\x6b\xa0\xc6\x8f\x50\xf7\xa2\x1f\x30\x31\xfe\ -\xd0\xbd\x89\x28\xeb\x7e\x3e\xca\xfc\xe6\x25\xb2\x01\x5d\xba\x47\ -\x3c\xff\xc7\x35\x40\xae\x03\x6a\x1c\x50\xe1\x02\x73\x06\xfa\x00\ -\x84\x89\xa6\xb9\x81\xb8\xf7\xd7\xc7\x81\x64\x1e\x08\x8a\xf9\xa4\ -\xb7\xc1\xb3\x0f\x58\x0b\x98\x87\x7b\x31\x7f\xd8\x36\x5e\xf1\x0d\ -\xb8\xa4\x27\xa9\x93\xcb\xff\x14\xc8\x5d\x13\xec\x39\x4f\x6f\x19\ -\x0d\x3f\x29\x6b\x2c\x7e\x17\x63\x45\xe4\x05\xa7\x3e\x00\x3c\x3b\ -\x55\x93\x73\x46\xae\x17\xa1\x8f\x58\x10\x3c\xb0\x0e\xe3\xe7\x4b\ -\x1f\x40\xe3\x83\x53\x3d\xd8\x66\x7e\x50\xac\x05\x12\xef\x93\xe0\ -\x82\x16\x5d\x9c\x7b\x69\x78\xe9\x58\xfd\xf6\xb8\xd5\xfa\xf4\xa6\ -\x4d\xea\xf7\xee\xe9\x45\x43\x12\xf9\x07\xc9\xcc\xfb\xff\x7d\xd6\ -\x3c\x00\xf1\xf9\x2a\x3c\xd7\xe8\xf7\x17\xc1\x8f\xb1\xff\x9f\x95\ -\xbd\x1f\xec\x01\xee\xf1\xeb\xff\xfc\x6c\x57\xdc\xbe\x1f\xc3\x1a\ -\xb7\xe6\xb5\xc6\x67\xbd\x6c\x31\xd6\x0f\xda\x81\x33\xb0\xc6\x4f\ -\x35\xef\x39\xaf\x06\xd7\x5d\x8e\x40\xae\x80\xfb\x6d\xa0\xff\xb3\ -\xd4\x0f\xd1\xbe\x5f\x30\xd2\xd0\x0e\xe0\xfc\xab\xc4\x01\x25\xa9\ -\x01\x94\x5c\xc6\x06\x2c\x48\x3d\x80\xb0\x01\x9d\x0e\xf9\x48\xb4\ -\x01\x19\x63\x3f\xd5\x01\xb2\x60\x6f\xd2\x76\xfb\x58\xbe\xd0\xbd\ -\x05\x34\xf8\x13\xe0\x2e\x71\x46\xf2\x1e\xf5\x03\x26\x46\xab\x7b\ -\x53\x86\x9e\xf9\x5b\x82\x6b\x5b\xe0\xb9\x0e\xd9\x89\xf4\xeb\x7f\ -\xd2\x07\xa4\x1a\x80\xe4\x48\xb5\x01\x5e\x40\xb2\x97\x3e\xe6\xa7\ -\xc6\xfc\x61\xbd\xaf\x08\x0e\x04\xf3\xc1\x32\x06\x3c\xd7\xff\x79\ -\xd7\x29\x0f\xf7\xac\x10\xae\x7f\x6b\xe7\xd4\x43\x70\x07\xf0\x65\ -\x8a\x67\x3e\x03\x39\xf5\xe4\x8c\x1d\xc3\x13\x97\x65\x23\x2b\xb7\ -\x96\x71\x56\x1c\xfc\x05\x72\x66\xe2\x1e\x1d\xce\x01\xd5\x90\x33\ -\x93\xf0\x40\xd8\x06\xd0\x5e\xa0\xab\x79\x73\xa5\x0f\xe8\x0c\xe4\ -\x01\xfe\x3c\x50\x43\xf8\x1f\x18\x17\x9c\x62\x61\x7c\x36\x9c\xfa\ -\xb1\x4c\xa2\x79\x87\xba\xe7\x5c\xb0\x93\xa0\x1b\x2f\x4d\xdb\x2b\ -\x87\x2b\xc6\x0a\xe8\x21\xf8\x7f\xcc\x53\x08\xeb\x63\x81\xf4\x7f\ -\x4f\x7c\x81\xf5\x9e\x8e\xec\xfb\xc7\x3b\xbe\xde\xf3\x73\xdd\x9f\ -\x73\x2b\x9b\xf3\xe2\xf7\x78\xbf\x0f\x63\x00\x9c\xff\x3d\x3d\xde\ -\xf8\x7a\x29\xb1\xff\x96\x62\x08\xfc\xdc\x6e\xec\x03\xa2\xee\xc3\ -\xf7\x31\xf8\x60\x2f\x90\xb9\x92\xdb\x3e\xae\x7e\xd1\x68\xd2\xfc\ -\x6b\x49\xe6\xe1\xca\x7a\x36\x4e\xb0\x42\xf3\x7a\x36\xd0\x62\x7c\ -\x7c\xf4\x95\xc8\x99\x88\xf5\xd1\x3c\xe4\xe5\xb1\x50\xe7\x58\xb9\ -\xba\x00\x36\x40\x5d\xa2\xee\x61\xbd\x7c\x72\x3c\xbd\x37\x49\xbd\ -\xf8\x65\xda\xfb\x2d\x51\xec\xbf\xc8\x39\x80\xf0\xbc\x61\xae\x44\ -\x75\x4c\x9b\xf7\x80\x34\x16\x28\x63\x9c\x88\xad\x8c\x35\x7d\x7c\ -\xa4\x8a\xe0\x83\x56\x64\xf6\xbf\xe2\xf6\xf1\x1f\x4a\x92\xff\xf3\ -\xfc\xaf\xc4\x3a\xe6\x9c\x97\x2f\xbe\x66\x41\xf1\xdc\x0f\xe6\x33\ -\x1b\xc6\x87\x1a\xc8\x9d\xca\x63\x27\x54\xe8\x9a\x8a\x53\xff\x69\ -\x1e\x72\x7f\xf4\xa5\x79\xc1\x03\x21\xfd\xb7\xd0\x5f\x2c\x92\x0d\ -\xc0\xdd\x6e\xaa\xff\xa3\xdf\x10\x2c\xfd\xb2\x70\xc9\x17\x6d\xc1\ -\xc5\x15\x7c\xec\x7e\x0e\xc0\x7e\xae\x40\x38\x81\x2d\x7a\x9f\x4a\ -\xd4\x71\xf6\xfd\xcc\x7b\x78\xbd\x7b\x36\x6f\x7d\xc2\x05\xa5\xe8\ -\x2a\x5c\xd3\x1a\x5c\xdb\x0a\x3d\xd7\xe8\xff\x67\xe1\xfa\xf0\xd4\ -\x64\xf6\x5f\xef\xfe\x55\xa5\xf7\x5f\x8d\x0f\x72\xdd\xa2\xbf\xae\ -\xf7\x63\x7f\x8d\x03\x6c\xcb\xee\x6b\xea\x62\x6f\x7c\xbc\x72\x4e\ -\x68\xea\x55\x0b\x45\xab\x71\x5d\x36\x8c\xf1\x3e\xc6\x07\xc8\x0d\ -\xc4\xbd\xb3\x72\xb4\x25\x3e\x54\x8e\xe0\x60\x94\xa4\x27\x48\x71\ -\x80\xc3\x33\xbf\xbe\x0d\x70\x64\x26\xd8\x91\x99\x20\xe9\x93\x64\ -\x68\x87\x0a\xfd\x66\xdb\x8b\x1b\x9d\xc3\x0f\xad\x5d\x78\x9d\xe2\ -\xbc\xf9\x6e\xf7\xcc\xb7\x8d\x26\xf6\xa6\xdd\x36\xe7\xff\x38\xcb\ -\x65\xf2\xc1\x98\xae\x42\xb6\x72\x51\xfa\x00\xb2\x0b\x14\xd3\xf3\ -\xff\x7a\x47\x42\xdb\x83\xa6\x8f\x11\xc6\xfb\x3e\x4d\xe1\xfe\xa8\ -\x33\xfe\x97\xdb\xe8\xef\x81\x5a\x5c\xe7\x20\xee\xcf\x68\x13\x62\ -\xbd\x39\x6f\x62\xeb\x23\xb0\xa6\xf9\x6e\x38\x98\xcf\x4c\xdd\xc3\ -\xbf\x77\x20\xeb\x2b\x8f\x80\x44\xf3\x40\x21\xb5\x78\x28\x6b\xac\ -\x7a\x39\xb0\x01\xc8\x1b\x55\xc4\xd9\x71\xe4\x05\x95\x78\x91\xf1\ -\x00\x59\xf7\x8b\x96\xe6\xc4\xe5\x7a\x5f\x45\x6a\xc1\xd4\x03\x94\ -\x5e\x10\x61\x81\x81\x5f\x45\x5c\x20\x8a\x05\x68\x57\x9e\xf3\xde\ -\x19\x77\xde\x1b\x19\x9a\x46\x3c\xec\x7b\x52\x13\x7a\xf6\x4c\xfe\ -\x7d\x1f\xab\x44\x57\x48\xf7\x6b\x38\xdf\x8a\xb9\x0a\xea\x3f\xd6\ -\xfe\x85\xe3\x12\x7b\x00\xc4\xf1\x13\xe3\xfa\xb6\xd6\x7d\xce\x61\ -\x39\xc6\xaf\xc8\xfc\x5f\x19\x67\x7b\x34\xc6\x17\xe8\xf8\x1e\xa7\ -\x7e\x34\x13\x7f\xf7\xa1\x4d\x4a\x3d\x6a\x78\x58\x3d\x3d\x11\x3b\ -\xbb\xe1\x4c\x36\x0f\x83\x1d\x38\x86\xff\xee\xf3\xa3\x22\x57\xa2\ -\x70\x25\x95\x04\x33\x9d\xb8\xc2\x85\x5f\xb7\xe8\x68\xfd\x97\x9e\ -\x3f\x61\x03\x30\x37\x40\x4e\xcf\x4a\xdb\x5c\x03\xc0\x5c\x09\xf9\ -\x53\x11\x33\x2c\x8b\xd8\xd9\xa9\x26\xda\xc8\x7b\x84\x13\xb4\x73\ -\xd8\x78\x7f\x2a\xd6\x3a\x94\x87\x78\x8e\x38\x90\xf0\x15\xb1\xdd\ -\xac\x45\x9a\xe9\xc2\x39\x60\xbc\x5e\xde\xe7\xe8\xf8\x75\xff\x3e\ -\x1e\x10\xe7\x46\x34\xdb\x8c\x75\x3c\xe1\xfc\x2e\x69\xee\x1f\xc1\ -\x7f\xa4\x1a\x80\xcd\x7e\x3f\x2f\xd8\x07\x88\xfb\x81\x79\x47\x1a\ -\xe2\xa3\xb0\x7b\xde\x91\xc2\xc3\x5f\xf1\x5d\x35\x34\xf1\x0e\x15\ -\xe0\xff\x9d\xaa\x92\xdf\xa4\x86\xde\x64\x4e\x3d\xeb\xc6\xbc\xbd\ -\x7c\x34\x6f\xaf\xc1\xdf\x73\x85\x66\x69\x31\x66\xc4\x1d\x00\xaa\ -\xff\x49\xef\xa8\xea\x74\x05\x0f\xb4\x9f\xfb\xf3\xdc\x4b\x43\x78\ -\x60\x9b\x3e\x1e\x00\xc5\x00\x60\x03\x68\x2e\x88\xea\x45\xac\x0f\ -\x33\xd6\x9c\x37\x13\x7f\x0b\xee\x85\xe2\xcc\xdb\x5d\x9d\x7b\xc7\ -\xaf\xdb\x34\xa4\x86\xce\xc9\xcc\xb4\xaf\xdf\x63\x5d\x01\xfa\xba\ -\x06\xcf\xf4\x32\xe8\xfd\x32\x5d\x23\xea\xfe\x6c\x8c\xf3\x00\xbd\ -\xe3\x8e\x38\xf7\xba\x56\x59\x11\xdf\x56\xb6\xf5\x3c\x4b\x93\x72\ -\x7e\x8a\xff\xad\x06\xed\xf7\xe3\xdc\xff\x1e\x67\xfe\x67\x56\xf4\ -\xef\x10\xb7\x1a\xf1\xfa\x37\x8f\x0e\x0f\x3f\x33\x31\x75\xde\xb7\ -\xf2\x66\xfb\x30\xe5\xf2\x66\x43\xe6\x67\xba\x54\x0f\xd4\x7d\x01\ -\x8d\x95\x88\x58\x78\xc8\x0f\xa6\x6b\x00\x6c\x13\x98\x3b\x50\xf7\ -\x05\x78\x1e\xb8\x49\x73\x72\x19\xd0\xfb\x8c\xec\x4f\xd3\xac\xa0\ -\x81\xb3\x73\x1d\x6f\x62\xfc\x91\x38\x37\xfb\xe8\xbb\x71\x8f\x48\ -\xb6\xab\xc9\xb3\x33\x33\xdd\xeb\x70\x26\xaa\x20\xf8\x9f\x65\xd4\ -\x7d\xc4\x44\x34\xc5\xa6\x3b\x72\x8f\x6c\xee\xe5\xa0\x0d\xa0\x3a\ -\xa6\xcc\x00\x10\x26\x90\xd4\x05\x19\xf3\x74\x9e\x30\xdf\x19\xfb\ -\x9d\xfd\x3f\xf3\x3f\x35\x85\xff\xa7\x43\x38\x67\x39\xc2\xfd\xef\ -\x79\x49\xab\xfb\x73\x27\xf2\xc1\xdb\x13\xbf\x73\xd1\x2d\xdb\x92\ -\xcf\xff\x07\xb8\xac\xdf\xbd\x3b\xbf\x43\x20\x27\x4d\x46\x47\x95\ -\xca\x4e\x6c\x7d\xec\xc7\xc2\xf6\xdc\x2d\x4e\xa8\xe7\xcd\x84\xba\ -\x5e\x36\x02\xcf\x61\xb8\x43\xbc\x80\x55\xbd\x0f\x1c\xed\xd0\xfc\ -\xa8\xe6\x09\x46\x7b\x50\xb2\xda\x3e\x36\x00\x71\xc0\x9a\x9a\x0b\ -\xa6\xe9\x73\x82\xe5\x34\x17\x34\xe6\xb8\xf0\x8c\x20\xef\xf8\x4c\ -\xa2\xfe\x25\xc5\x75\xe1\xcd\x77\xf1\x3a\xb1\xb7\x15\x35\xac\x67\ -\x36\x21\x4e\x39\x52\xc0\xda\xbf\xb1\x2c\xbc\x96\x0b\x5c\xa3\xa0\ -\xb9\x1c\x9e\x55\xe8\x73\x17\x0c\xe2\xdd\x6b\x3e\x23\xc1\x32\xc6\ -\x67\x17\xf9\xbb\xf0\x9a\xf1\xf7\x11\x0c\x94\xb2\xd9\xbd\x65\xf3\ -\xd8\x13\x10\xaf\x18\xf3\x56\xd4\xbd\xcc\xc4\x68\xf2\x35\xa6\xb3\ -\xef\xfb\x56\xb4\xed\xa5\xc2\x0d\x8a\xd3\x4b\x11\x8c\x75\xe1\x1e\ -\x44\xf0\x3e\x71\x4f\xa0\xea\xf7\x05\x98\x43\xc9\xc7\x51\xc4\xbd\ -\x78\xfc\x59\x56\x47\xb8\xb2\xb8\x4f\x90\x17\xdc\x94\xac\xc9\x33\ -\xf3\x39\xb3\x43\x3c\xe2\xf9\x30\xc4\xe7\xa9\x1e\xe2\x04\x3d\xf7\ -\x6e\xdc\x23\x92\x09\xb5\xed\xb5\x89\x44\xe3\x6b\xe9\xf0\xaa\x97\ -\x89\xe2\x1c\x00\xcf\x00\x96\x88\x07\xac\xe7\xd7\x73\x34\xd7\xa3\ -\xde\xed\xa2\x57\x47\xef\x07\x74\x64\xb6\x89\x6b\x9b\x1a\xef\x94\ -\xee\x9f\x5c\x7b\x89\xf2\xfd\x0e\xdd\xbf\x5c\x04\x9f\x99\x05\x2f\ -\x17\x5a\xf0\xb2\x70\xed\xc9\xc8\xda\x4d\x93\xe6\x3b\xfe\x65\x53\ -\xe8\xaf\x41\xf7\x77\x62\x2d\xe3\xb7\xee\xce\xef\x10\xc8\x49\x95\ -\xad\xa3\x38\x0b\xb0\xed\x95\x1f\x4f\x84\xe6\x7f\x36\x13\x6e\x92\ -\x2d\x2f\x42\x7e\x5b\x36\xf0\x34\x79\xd6\x15\x5e\x79\xfe\xad\x25\ -\xb5\xef\xe6\x00\x26\x06\x73\x01\xe8\x9a\x10\x72\x04\x16\x9d\x79\ -\xca\xfb\x73\xc8\x11\x86\x1c\xf0\xf8\x79\x7c\xce\x8d\xba\x97\x32\ -\x1b\x87\x76\x4c\x54\x31\x2e\xbc\xab\x73\x40\xc8\xef\xf1\xf8\x4c\ -\xf2\xd2\x8f\x53\x9f\xc2\x66\x3c\xab\x12\xe9\x37\xe3\xd8\xe1\x6e\ -\x1e\xd7\xb2\x8e\xe7\xb4\xac\xe8\x9d\x55\x39\x8c\xe5\x5d\x17\xbf\ -\xa6\xe3\xdc\x26\x3d\xeb\x45\xac\xf5\x5b\x97\x5e\x0f\xa9\xc9\x1f\ -\xa9\x7e\x7e\x82\xbd\xb8\xf2\xd8\x50\xfe\x5d\xd6\xf4\x85\x5f\x70\ -\x43\x8d\x9f\xa5\x09\xd3\x53\xdf\x23\xf8\xfe\xf0\xff\x55\x71\x37\ -\x98\x4e\x93\xf7\x84\x2c\xbe\x3f\xbc\x33\xc8\x33\xc2\x54\x3f\xb7\ -\xf4\x7d\xaa\x73\x5d\x84\xe6\x00\xea\x1c\x2b\x49\x2e\x9d\x33\x78\ -\x7f\xd2\x9c\x7e\xea\xbb\xef\xc6\x3d\x22\x19\x57\xdb\xce\x9a\x71\ -\xf7\x7f\x35\x8b\xfc\x23\x66\x8f\x30\x87\x0a\x66\xc7\xe7\xff\xd6\ -\xfd\x8a\xaa\xe6\x01\xb4\xfb\x3d\x3f\xee\x89\x34\x05\xf3\x1c\xef\ -\xcd\x3c\xe1\xa3\x21\x36\x62\x99\x78\x9f\xf9\xef\x5a\xb4\xe7\x7c\ -\x0c\x44\xe6\x80\x6a\x13\xf7\x4f\x2e\x82\x18\x27\x2d\x2f\xb1\xbb\ -\xfd\xa9\xe1\x51\xf5\x54\xb8\x9c\xc7\x29\xd6\xfd\x00\x03\xe4\xd4\ -\x15\xda\x1b\x05\x07\x7b\x96\x1d\x7d\xff\x7f\x24\x22\xbc\xbb\x83\ -\x3d\x9c\x22\x3e\xe3\x86\xc6\xbb\x69\x0a\xd6\x7b\x83\x3e\x26\x4e\ -\x4c\xab\xee\x73\x02\x97\x84\x1b\xb4\x48\x1c\xe1\x73\x90\xeb\xcf\ -\x73\x0d\x10\x5e\x33\x16\x7f\x9c\x65\x6c\x40\x2f\x15\x9d\xf7\x66\ -\xcc\x37\x7c\x12\x7e\xf4\x99\x77\xf1\x1a\xa7\x36\xa9\x89\x73\x32\ -\x76\xe3\x6b\x59\xe4\xb3\x77\x19\x5f\x87\x77\xcf\xb9\x76\x8f\xb1\ -\x3c\xe3\x52\x32\x6e\x7d\x19\x9f\x59\x7c\x75\xe7\xe4\x15\x9e\xdf\ -\x98\x1c\x67\xce\xe7\x30\xd2\xbc\x66\x45\xb8\xa6\x82\xb5\xff\x50\ -\x3e\x76\xe1\xa7\xe1\xe7\xa5\xd4\xf1\x71\xf7\xb8\x52\x23\xa7\x8f\ -\xaa\xed\x6f\xb4\x22\x1f\xf8\xf4\x4c\xa4\x71\x38\x03\x5f\x8f\xf6\ -\xac\x68\xb2\x4f\x2c\xc3\xef\xc5\x47\xdb\x13\xb1\x8b\x16\xeb\x91\ -\xe6\x50\xc7\x7b\x43\xf7\x08\xee\x07\xdd\x23\xa7\x4e\xb8\xa9\x59\ -\xc2\x4f\x86\x83\xf8\x69\xb8\x33\x0d\x76\x33\x9f\xb9\x0c\xee\xd1\ -\xdd\xab\x95\x4e\xa8\x71\xd0\xff\x4b\xbe\x9a\xc1\x3c\x02\xf9\x07\ -\xf0\x98\xfd\x1d\x7d\xda\xdb\x33\x19\xcf\xbd\xa4\xf9\x1c\x1c\xe6\ -\x74\x2a\xb9\x7c\x8d\x74\xff\x1c\xbe\x4f\x65\xb8\x5f\x15\x17\xed\ -\xf7\x3e\xc8\xe5\xf0\xda\xf1\xfd\x7e\xba\x7e\xc6\x7f\xe3\xfe\x0e\ -\xe2\x3e\xa1\xfe\xe3\xcf\xb5\xe3\x97\xac\xc0\xa5\x58\x8a\x7b\x98\ -\x18\x47\x61\x2e\x15\xd4\x00\x4f\x6d\x29\xee\x1a\x2f\x9d\x13\x8b\ -\xec\xbf\x2d\x65\xb4\x8e\xe5\x90\xbf\x06\xe3\x5c\x8a\xf7\x3b\x14\ -\x0b\xe8\xd9\x57\x3d\xf3\x42\x31\x35\xe1\xc0\xd6\xc9\x1f\x50\x2f\ -\x40\xf8\x41\xb5\x5f\x23\x7c\x70\x93\x5f\x71\x06\x00\x79\x71\xd2\ -\x91\xa6\x67\x1b\x97\xfd\x50\x0d\x8d\xe1\x6c\x38\xf6\x86\xee\x2c\ -\xc7\xc5\x67\x28\xb1\x6b\xea\xd9\xff\x9a\x0f\x2f\xff\x14\x71\xed\ -\x8a\xe4\xfb\x07\xf1\xec\x84\xdb\xc7\x6e\x0a\x86\xad\xf8\x33\xd9\ -\x55\x19\xec\x63\xe3\xb3\x5d\x11\x0e\x43\x8a\x61\x1c\xc6\x36\x2c\ -\x52\xde\xde\xfe\xe6\xc4\xce\x3f\xc4\xf9\xe4\x5f\x37\xaf\x62\x6c\ -\x55\x5b\x5e\x94\x32\x2f\xf8\xaf\x4c\xb4\x73\x14\x6b\xdd\xa5\x28\ -\xe6\xfc\x72\x7f\x68\x3e\x88\x71\x02\x34\x46\x00\xcf\x08\x68\xec\ -\x50\xb1\xa3\xd2\x3b\x67\xec\x64\xc1\x0e\xb1\x74\xce\xd4\xa2\x1a\ -\x60\x0a\xef\x91\xb5\xef\x87\x23\x23\x95\xf7\x2b\x4c\xeb\xef\xe2\ -\x3c\xc0\xf8\xd0\xa6\xb3\xf2\xee\xbe\xaf\xa0\xef\x27\xfd\x87\x58\ -\x09\xf3\x8a\xa2\xc9\x18\xbd\x65\xd9\x5b\x2a\xeb\x19\x2e\xc1\x75\ -\x2f\x3b\x1a\xd3\x57\xf0\xce\xa5\x46\x5a\x71\xd8\xef\xe3\x7d\x2b\ -\x11\xef\xf3\x1c\xd7\xff\x28\x0e\x68\x70\xae\x87\xfb\xcc\xc8\x75\ -\x80\xb9\x1d\xd8\x67\x23\x3c\x8f\xdc\xe7\x05\xc5\x7c\x33\xb8\xeb\ -\x8d\x71\xc0\xec\x5d\x7c\x0e\x03\xd9\x20\xd9\xb4\x49\x3d\x74\x26\ -\xf1\xb7\xad\x74\xb4\x7b\x6b\x8e\x74\x82\x73\x64\x8c\xf7\xab\x76\ -\x3f\x5e\xa4\x98\xd1\x96\x58\xda\x66\xff\xc0\x3a\x35\x47\xcf\x4a\ -\xd9\x99\xf3\xe3\x00\xf4\x19\x78\x90\x0f\x3a\xef\x70\x3d\x20\x13\ -\xea\x7a\xce\xd4\xa2\x97\xcf\xbd\x1b\x6b\x5c\x67\xa8\x3b\xef\x73\ -\x85\x37\xab\xd1\xa7\xc6\x8c\xfd\xdf\xcd\x85\xd7\x64\xcf\x8f\xeb\ -\x90\x54\xbb\x92\x79\x5e\xe4\xec\x61\xac\x6a\xc6\xee\x25\x2c\xaf\ -\x38\x62\x57\xcd\x41\xfc\x3a\xcf\xc7\x9d\xa7\x78\xa0\x1a\x9b\xf7\ -\x7d\x1c\xc6\xbc\x34\xcb\x8f\x3e\x37\x71\x29\x3e\xb7\xc8\x53\x72\ -\x67\x39\xf7\xce\xf1\x71\xf5\x28\x3b\x7a\xe9\xff\x22\xc7\x2f\xd9\ -\x0d\x8b\x73\x7f\xdc\x11\xc4\x59\xe1\xaa\xf4\x11\xab\x8e\x7e\x65\ -\x1c\x41\xbe\x47\x3a\x07\xc0\xd9\xb9\xf9\xfe\xd1\xf6\xd2\x95\xba\ -\x60\xb4\xe3\xc5\xc2\x8b\x5e\x36\xd6\xfe\xa2\x62\xac\x30\x8c\xa1\ -\x7f\x63\x2d\x70\x5c\x4d\x9c\x15\xb7\xba\x5f\x29\x38\x4b\x14\x93\ -\x17\x10\x8f\x17\xeb\x8f\xb6\xe0\xfe\x3a\x8c\xd9\x59\xb1\x65\xde\ -\x51\xf6\x9e\x11\xf7\x8c\xae\x93\x30\x91\xf8\x9a\x2b\x36\xeb\x3f\ -\x72\x23\x97\x1d\xe6\x46\xaa\xb8\xfb\xe1\xff\xdf\x4f\x71\x00\x9e\ -\x92\x70\x9f\xa3\x7d\x29\x46\xba\xe0\xff\x17\x3d\x23\xda\xfb\x67\ -\xc5\x7d\x3f\xcc\xa1\x10\x03\x18\xf7\xff\xef\x2d\xe6\x43\x20\xeb\ -\x2f\x88\xd5\xfa\x30\xc7\xf9\xd0\x57\xb2\xe0\xdf\x72\x60\xcf\x0b\ -\x91\x25\xe2\x08\x41\x8e\x80\x62\x94\xe7\x80\x4b\x46\x97\x7c\x1e\ -\xd5\xff\xa8\xff\xd5\xf4\x67\x5f\x99\x17\xaf\x8f\x83\x47\x3c\x38\ -\xc2\x0d\xce\xbe\x8d\xe3\xc4\x44\xb8\xeb\x25\xed\xd6\x97\x87\x86\ -\xd4\xd9\xea\xce\x67\x5d\x66\xb7\x0c\xed\xba\x20\x69\xae\xdc\x92\ -\x33\xaf\xf2\xb0\x4f\x49\xb3\x2d\xf6\x02\xd5\x9e\x70\x16\x81\xf6\ -\x11\x6c\x3d\xc3\xa2\xfb\x7c\x2d\x7f\x4f\x9d\xe7\x94\x79\x5f\x91\ -\x66\x95\xe2\x58\x9f\xef\x70\x0d\xc1\x5e\xa0\x7a\x42\xd6\x58\xf6\ -\x9c\xf4\x5b\xe6\xd5\x6f\xc6\xe3\x41\x3f\x3c\x1d\x4d\xfc\x9f\xf7\ -\xc4\xc2\x2b\xb7\x20\xce\x5e\x01\x31\x36\x10\x3f\x2d\xdc\xf5\xf1\ -\x93\x4b\xd1\x0e\xef\x50\x09\x7e\x4a\x49\xf7\x07\x24\x8f\xa2\x1a\ -\x20\x61\x02\x33\x2e\x20\xe5\xfd\xf8\x1e\xf2\xf4\x2c\xfa\x52\xe4\ -\x0c\x31\x17\xbc\x94\xbd\x78\x28\x6b\xbe\xf3\x5f\xc1\x95\xe6\xd4\ -\x5d\x98\xa3\x19\x1f\x9a\x3a\x2b\x1e\x6b\x7f\x25\x0d\x7a\x98\x36\ -\x16\xbc\x0c\xfc\xed\x10\x0b\x14\xef\x17\xe2\x72\x23\x47\x5f\xc9\ -\x62\x2c\x70\xe6\x76\xe9\xc2\xbd\xe9\xf8\x18\x9e\x55\x57\xcf\x77\ -\xb7\x29\x87\x61\xce\x74\xce\x15\x4a\xb2\xf3\xed\xf3\x1f\x52\x4d\ -\xb3\x4b\x33\x86\x58\x63\xcc\xe3\xfc\xa8\xbd\xec\xc5\xa7\xd7\x3e\ -\x0f\x97\xf2\x44\xb9\x8f\x63\x72\x4f\x47\xef\xda\x23\x18\xc8\x06\ -\x0a\x3e\xdb\xc6\x98\x4a\x7c\x20\x13\x59\x3c\x94\x8f\x2e\x81\xae\ -\x32\x3e\x30\xe2\x48\x14\xa2\x5d\x89\x23\x39\x9e\x64\xdf\x27\xf9\ -\xae\xcd\x78\x20\x7a\x07\x96\x31\xc1\x05\x13\xc8\x90\xdd\x50\xb1\ -\x03\x79\xc8\x27\xd2\xe1\x96\x37\x13\xad\xff\x70\x7c\xb4\x76\x95\ -\xba\x73\x6e\xec\xc7\x45\x43\x2f\xf9\x87\x5c\xe4\xc0\x6d\x59\x63\ -\xcd\xcb\x53\xdd\x7f\x49\xb8\x26\xf9\x59\xad\xf8\xdc\x9e\x2d\x99\ -\x4f\x6b\xc9\xae\xaa\xd6\x7f\x79\xc5\x9d\xc5\x18\xcf\xe5\x72\x8f\ -\xae\x4b\xf3\x71\x79\x0b\x7b\xd6\xcb\xdf\xdd\xbc\xeb\xf4\x73\xee\ -\xe2\x7d\x1a\xc1\xbd\x36\xd7\x9a\xff\x42\xc1\x5c\xbc\x3d\x4f\xfc\ -\x09\xa8\xf3\x70\x22\x5d\xc1\xd9\xe8\xf9\x5c\x8a\x15\xbf\xc6\xae\ -\xf1\x02\xda\xfd\x59\x39\x8d\x9d\x61\xf6\xef\x11\xf2\x86\x51\x2f\ -\x00\xbe\x5f\x2e\xda\x3b\x1a\x4f\xaf\xdc\x00\x9a\xfd\x7a\x50\xa1\ -\xec\x6f\xba\xb0\x09\x35\x75\x96\x1b\x6f\x7e\x35\x09\x76\x3b\x1d\ -\x5d\x24\x1c\x90\x1c\xd6\x00\xc1\x16\xa1\xae\x62\xde\x54\xb2\x59\ -\xef\x69\x9e\xcb\x95\x99\x05\xc1\xf1\x65\x9e\x37\xe1\x49\xa6\x99\ -\xe9\x96\xd8\x52\x3d\x03\xc4\xb3\x1e\x7d\x1b\xd0\xa6\x99\x02\xde\ -\x33\xc6\x98\x03\xed\xd6\xc1\x6b\xe1\x52\x9e\xac\xa4\xb6\xa4\x38\ -\x7f\x09\xf4\xff\xbe\x21\xdb\x46\x87\xd5\x33\xb3\x56\xfd\xe6\x42\ -\x74\x91\xe6\x81\x0b\x51\x9e\x0d\x46\xfd\x2f\x18\x1d\xea\xfb\x50\ -\x2f\x8f\xf8\xe4\xdb\xfe\xac\x5b\x1f\xfb\x46\xf7\xb6\x98\x13\x0b\ -\xf5\x5f\x73\xe2\xe4\x0c\xe6\xc5\x42\xfd\xcf\x44\xf7\x1f\x09\x6f\ -\x7d\x29\xf6\xda\x7f\x1d\x3e\xdc\x26\xdc\x89\x73\x67\x2e\xbe\x3e\ -\xb5\xfb\x8a\x23\x59\x63\x05\x74\x62\x59\x38\x2d\x7b\x1c\x7f\x48\ -\xee\x5f\x91\x39\x96\xb2\xe4\xfd\x15\xd9\x4f\xe6\x1d\xe5\x16\xe1\ -\x13\x95\xe3\x18\x03\xc0\xf3\x4e\xf3\x8b\x0b\xf4\x3d\x88\x1f\x23\ -\xd6\xf3\xd2\xd6\x81\xcf\x80\xf5\x7b\xc1\xdd\xb8\x4f\x91\x88\xfd\ -\xda\x4e\x32\xbc\x72\x23\xdb\x46\xde\xb3\x2f\x11\x87\xaa\x3e\xcc\ -\xa3\x54\x1e\x98\x13\x2e\x59\xbc\x23\xd0\xd7\x7f\x9e\x99\x67\xde\ -\x80\x76\x9f\x3f\xd8\xc4\xfb\xd6\xa3\x3d\x5e\xc7\x5c\xb8\x3d\x67\ -\x9d\xf7\x59\x75\x17\x30\xc3\x27\x86\x26\xff\x36\x06\x39\x43\xc6\ -\x5c\x85\x58\x7c\x99\x71\x00\x90\x0b\x00\x74\x14\x63\x0b\x8e\x79\ -\x3a\xc4\xd7\x5d\x12\xbb\x84\x7f\x43\xe4\xf1\x41\xbd\xaf\xc6\x3b\ -\xe2\xe3\x79\x1e\xa0\xac\xf5\x9f\x76\xfe\x64\xdf\x5b\x62\x01\xb4\ -\xa1\xd4\x5b\xc0\xdf\x95\xe2\xb1\x25\x9a\x39\xce\x38\x8b\x58\x43\ -\xc5\x98\x7f\x1b\x18\x00\xe4\x00\x40\x0e\xc0\x7b\x8b\x6f\x10\xc8\ -\xfa\x0b\xf6\xd9\x77\xc1\x79\x48\x3a\xfd\xbe\x1b\x70\x06\x08\x79\ -\x01\x08\x47\x2e\xca\xfc\xae\xe4\xf7\x2d\xee\x27\x51\xdf\xc7\x90\ -\x1a\xb8\xd4\x92\x68\xef\xdd\xe1\x9d\x9f\x9c\x35\xf8\x4c\x4b\x2e\ -\x20\xb1\x6e\x3e\x8a\x36\x60\x2f\xf8\xdd\xfa\x9d\x71\x02\xec\x18\ -\x51\x43\x2f\x49\x82\xbf\x4f\x87\x0e\x7a\xc8\xf1\x97\xc7\xf9\x44\ -\xda\x6b\x6d\xd3\x3c\x52\x4d\x66\x7c\x74\x3d\xb2\xea\x3f\xaf\x4d\ -\xda\x51\x2e\xeb\x67\x18\x63\x7e\x57\x7c\x3f\xcd\x09\x32\x2f\x06\ -\x62\x1e\x23\x57\x5e\x3a\xb1\xd6\x55\x8c\xc5\x77\x57\x05\xfc\xda\ -\x96\xd7\xe5\xed\xab\xbe\x58\xb6\x65\x66\xd2\xd4\x73\x53\x3c\x33\ -\x81\xbb\xf6\xbc\x23\xa0\xb9\xd4\x65\x0e\x40\x6a\x06\x78\x1f\x68\ -\x26\x88\xe6\x67\xbb\x12\xff\xf7\xef\x57\xc1\x05\x9d\x45\xbc\x60\ -\xf0\xa9\xc9\xd8\x82\x37\xaa\x46\xcf\x86\x9f\x1b\xbf\xb3\x8b\x9a\ -\x50\x93\x2f\x4d\xc4\x17\xae\xcd\xc0\x7d\xca\x42\x9e\x84\x33\x9d\ -\xc8\x05\x44\xf9\x12\xd8\x22\xb4\xdb\x65\x87\xb9\x3a\x2a\x7a\x06\ -\xd8\xed\xf8\xfb\x1c\x15\x8d\x07\x04\xf7\xab\x22\xfb\x12\x15\xc1\ -\xfe\xa0\x7e\x81\xec\xfd\xa2\x1d\xad\xc8\xbd\xa4\x99\x42\xcc\x01\ -\x70\x7f\x04\xfe\x36\x49\x67\x09\xeb\x28\x98\xef\x5b\xdb\xe3\xd9\ -\x7f\xda\xbc\xbd\xf4\x29\x78\xff\x92\xbb\x71\x6f\x03\xd9\x18\xc1\ -\x38\x1c\x6b\xb5\x8f\x9a\x9c\xfc\xeb\x1b\xca\xe6\x1a\xcd\x8d\x10\ -\x96\x3c\x3c\x3b\x45\xf4\xfd\x70\xb0\xf7\xad\xf5\x5f\x63\xbf\x0f\ -\xc6\x01\x05\xe9\x09\x11\x27\x90\x60\xdf\xe4\x6d\xcd\x95\xd9\x66\ -\x1b\x81\x7b\x41\xe6\x5e\x2f\xe5\xb4\xef\x4c\xff\x4b\x23\xdb\x1e\ -\xf9\xae\x5c\x78\xc5\x4b\x85\xaf\x80\xaf\x5f\xe5\xf9\x64\xdc\x6b\ -\xb1\xf8\xd9\xad\x48\x5d\xab\x36\x10\x03\x54\x24\x4e\xad\xc4\xfa\ -\xf9\xaa\xc6\x2b\x23\xcc\x7a\xca\x1d\x98\x17\xaf\x80\x3e\x12\x6b\ -\x56\xee\x7b\x90\x9f\xb0\x74\x37\xee\xd5\x0e\x48\x96\x9e\x57\x98\ -\xe9\x7e\x36\x6b\x1c\xa4\x38\xa2\x14\x5d\xf4\x31\xd4\x2b\x26\xef\ -\xda\x94\xe5\x3a\x99\x47\xad\xe5\xcf\x1d\xd1\xbd\xd2\xf7\xc3\xd4\ -\xb1\x00\x63\x05\x52\x2d\xdd\xd2\x7c\x62\x1d\x8a\x01\xb2\x88\x71\ -\x52\xfc\x10\xc4\x00\x63\x7f\x73\x67\x17\xb5\x59\xed\x7a\xcd\xcc\ -\x4c\xe7\xcb\x90\xcf\x80\x6d\x65\xdb\x96\x27\x0e\x30\x8e\xfd\x29\ -\x07\xb0\x85\xdb\xc5\xee\xfa\xf9\xbe\xae\xa1\xe8\x39\xc9\x8a\x70\ -\xa6\x56\x65\xdf\x67\x30\xfe\x67\xec\x1f\xe1\xfe\xb0\xa4\xff\x41\ -\x73\x45\x4b\x54\x9b\x49\xda\x0b\xff\x02\x51\x0a\xce\x2e\x62\x0f\ -\xf0\x1f\xb7\xed\x7c\xfc\xa7\xc6\x02\xfd\xbf\x2f\x08\xd6\x98\x5e\ -\xa3\xc6\xfe\x6c\x69\x72\xba\x77\x5b\x21\x72\xc0\xcb\x87\xf9\xef\ -\x8b\xbd\x40\x9c\x77\xc3\xf8\x3f\x1f\x6d\x93\x0d\xd0\xcf\x6d\x51\ -\x66\xdc\x35\x17\x54\xd1\x1e\xe4\xc5\x6c\xd2\x1e\x00\xd7\x00\x65\ -\x4f\xd4\xe0\xb9\xf1\x9c\x01\xfa\x6f\x77\xef\x4c\xff\x9f\xe0\x38\ -\xe7\xf6\xb2\x91\x35\x88\x65\x51\xc7\x56\xc9\xcf\xe2\x4e\x3b\x73\ -\xcd\x75\xfa\xb9\xbf\xd3\x92\x59\x9f\xb6\xec\x25\x36\x7d\x9e\x02\ -\xca\x05\x84\xaf\x06\x67\x07\x90\x0b\x0b\xbf\x47\x5e\xfc\x55\xce\ -\x5e\xf1\xc6\xb6\xef\x79\xa9\x62\x6c\xa1\xbb\x2a\x18\x87\x9f\xb1\ -\x6b\xd7\x73\xae\x4c\x9b\x07\xa9\x2e\x81\x79\x52\xc9\x60\x1e\x15\ -\x9e\x9b\xe4\xde\x69\xd5\xe7\x53\x12\x1e\x25\x8b\xfd\x7f\x49\xea\ -\x00\x1a\x3b\x97\xf2\x00\xab\xcf\x21\x4e\x9c\x42\x70\x9f\xf3\x11\ -\x9e\xaf\x4d\xc6\x9a\x3f\x1a\x1f\xc9\xed\x03\x1b\x30\xf3\xeb\x2e\ -\x6a\x42\xed\x3a\x6b\x66\xa6\x0d\xf9\xff\x32\xc5\xff\xc8\x03\x8e\ -\xf6\xa3\x48\x39\x7a\x87\x78\x88\x34\x17\xa0\xde\x01\xe0\x1a\x5f\ -\xa7\x5f\x3f\x8d\x71\xee\x5f\xd3\xbb\xd2\x31\xc9\xff\x05\xf3\x0b\ -\x5f\x0b\x76\x1f\xf3\x9c\x6a\x8a\x94\xef\xc0\xfd\x84\x93\xb3\x7a\ -\xff\x0f\x32\xff\x3f\xc1\xfb\x39\x34\xa2\xc0\x5e\x0d\xe3\x1c\xe3\ -\x19\x77\xe3\xde\x06\xb2\x31\x92\x19\x57\x0f\x7d\xdd\xc8\xd4\x85\ -\x37\x87\x76\xb4\xbc\xc4\x24\xfc\x2d\xc3\x3d\x2f\x1b\x92\x7a\x9f\ -\xd1\xa5\x1c\xa0\x40\x31\x40\x5b\xfa\x4b\x9a\x03\x86\x77\xdc\x4b\ -\xb2\xeb\x5b\xd4\xb9\x80\xad\xf1\xaf\xf4\x8e\x08\xe7\xbe\x5c\x03\ -\x9f\x3b\x9a\x89\x2d\xe0\x9e\xd8\xaf\xcb\xff\x5f\x90\x89\xed\xfd\ -\x4c\xc9\xba\x1c\x9e\x2b\xd0\x7d\x0b\xcf\x32\xf1\x7c\x94\xc5\x7f\ -\x55\xec\xbe\xff\xa2\xf9\x7e\x8d\x4d\xe8\xb0\x1d\x60\xdf\xcf\xd7\ -\xc7\x75\xee\xae\xc4\xac\x8b\x64\x4b\x0a\x76\xef\x68\xda\x5d\xc6\ -\x9d\xdb\x3f\xbb\x9b\xf7\x8a\x6a\x5b\x23\x4a\xbd\x3f\xe9\x2c\xde\ -\x5c\x88\xae\x82\x0e\x2c\xf1\xce\xfd\x00\x97\x2a\xf3\xa9\xcb\xa1\ -\x7a\x63\x5b\x62\x81\x8e\x3f\x37\x5d\xb2\x39\xa7\x62\xac\x80\x8e\ -\xf4\x00\x5a\x90\xbb\x37\x24\x5f\x42\xfd\xef\x78\x29\xf8\xda\xdf\ -\xae\xee\xc3\xda\xfa\x8b\x7f\xdd\x45\x8d\xab\xe9\xb3\x52\xa0\xff\ -\x79\x73\x85\xf8\xbf\x72\xbe\xff\x67\x1b\xc0\xf9\xbf\xf4\x4f\x1d\ -\x8d\xe9\xd4\x91\x7d\x29\xc6\x45\x22\xfd\xc7\x1e\xa6\xc6\x03\x8e\ -\xe9\x7c\x4a\x6a\xa8\xae\x60\xff\x0a\xd6\x11\xed\x3c\x4b\x0d\x00\ -\x6b\x2a\x19\xab\xf5\xbf\x70\x29\xaf\x54\x3c\xb7\x99\x54\x1c\x07\ -\x04\x3c\x80\xa7\xbe\xec\xda\xa4\xd4\xe3\xb7\x0e\x5f\x72\xbd\x3d\ -\x05\x79\x5c\x68\xe1\xf6\x14\x9c\x1c\x72\x83\xa2\x0f\xc1\x79\x20\ -\x97\xf9\x5d\xd1\x1e\x14\xcc\x8e\xec\xb6\xb6\x04\xfb\x4e\xf6\x02\ -\x6d\xb1\x07\x12\xeb\xe7\x05\x0f\x9b\xb1\x70\xda\xe4\x83\x28\x17\ -\x76\xe6\x7f\x9c\x98\x59\xc2\xdc\xd0\xfa\x15\xd7\x32\x32\xb6\xc9\ -\x79\x37\xe4\xfb\x3f\x28\x42\x1e\x82\x27\x67\xac\x80\xce\x2c\x8b\ -\xef\x62\x1c\xcb\x8a\xdd\x92\x5d\xdf\xae\x8f\x65\xc9\x75\xab\x36\ -\xed\xff\x95\xe5\x19\xa5\xfe\x1f\xd5\xfd\x7a\x5c\x3b\x44\xdd\x0f\ -\x83\xbf\xb2\x97\x6f\x83\x78\xf9\x93\x6a\x13\xe5\x3d\xf7\x44\x9e\ -\x31\x13\x7f\xdd\x95\xe9\xc8\x95\xe2\x67\x17\x68\xd7\x06\x6d\x00\ -\xe2\x27\x23\x8e\x72\x39\xda\x11\xee\xad\xae\x3f\x73\x5f\x12\xcc\ -\x00\xbf\x06\xe0\x73\x86\x75\xa8\xfe\xcf\x33\x35\x62\x03\x0c\x6d\ -\x53\xdb\x38\x1f\x70\xc7\x6c\xfc\xc3\x5f\x80\x18\x00\x67\x14\x7f\ -\xa9\x1f\x38\xae\x62\x67\xe5\x13\xcd\xaf\xe6\xe0\x3a\xb2\x98\xbb\ -\xe1\x2b\xf6\x6b\xf1\x77\xc6\xdf\xdd\xd2\xb5\x3f\xae\x47\xd0\xae\ -\xa4\xc4\x00\xd5\x18\xf7\x01\x6a\x82\x91\xd4\xc7\x4c\x69\x4b\x1e\ -\xd5\xe0\x7a\x4a\xbc\x4d\x35\x1e\x9a\xbf\x74\xf8\xef\x59\x76\x17\ -\xa8\xa6\x5a\xa0\x19\x80\xee\x91\xbc\xf5\xbe\x65\xb8\x3a\xc4\xfd\ -\x0c\xb0\xbf\xee\x3b\x32\x32\xaa\x54\x61\xeb\xd8\x05\xdf\x8c\x6c\ -\x5b\x38\x16\x09\x5d\xfd\xed\x99\xe9\xd6\x97\x8b\xe9\x8b\xbe\x93\ -\x8a\xac\xdd\x96\x33\xbb\x47\x73\x34\xeb\xcd\x3d\x64\x8c\x01\x74\ -\xbf\xbf\x28\xb9\x3f\xf3\x03\x4b\x5d\x40\xe3\xde\x10\x2f\x6e\xdd\ -\xc7\xc2\x2a\x8b\xef\x29\xbb\xf5\x1b\x9d\x64\x13\xeb\x6e\x91\x5f\ -\x71\x2d\xd3\xd3\xe1\x17\xb4\x0b\xe1\x35\x78\x76\x91\xc7\x6a\xd9\ -\xa3\x9d\x56\xaa\xfd\x8b\xff\xd2\xb3\x75\xb4\xaf\x26\x79\x6b\x4c\ -\x7a\x56\x52\xc7\x66\xbd\x97\xbc\x5f\x62\x7f\xc4\x0b\x43\xbe\xb3\ -\x42\x74\x19\x9e\xe7\xe5\x1f\x19\xd3\x7f\xfb\x01\x75\xcf\xe7\xd3\ -\x8a\xf0\x80\xbf\x33\x61\xb5\x8f\xa6\x8c\xcb\x19\x77\x07\x77\xee\ -\x20\x17\x40\x9b\x59\x25\x4e\x55\xe6\x52\x29\x47\x65\x4f\x58\x7a\ -\x01\xc5\xe3\xf2\x27\x8d\x15\xaa\xfb\x24\x4d\xaa\xd5\xe5\x25\x5f\ -\x2a\x0c\xd4\x51\xd2\x85\x36\xc6\x2b\x88\xab\x83\xbd\xb5\xe3\x66\ -\x15\xc6\x87\x92\xaf\x2d\xc4\x5a\x5f\xe3\xbe\x1f\xea\x3f\xe2\x00\ -\x77\xe1\xba\xfa\x75\xdb\xb2\xd4\x23\xb0\xe6\xcf\x7c\x0e\x7a\xf7\ -\x8f\x63\xfd\xaa\x8f\xfd\x27\x9c\x1f\x4e\x43\x66\x2a\xb4\x1d\x80\ -\x03\x36\xa0\xa8\xf9\xff\xfc\xb8\xaa\x47\x3f\x2b\x8d\x5c\x0f\x49\ -\x9a\x5b\x7a\xbd\x0a\x70\xbf\xef\x4b\x82\xcf\x92\xb3\x75\xf4\xec\ -\x7f\x99\xdc\xb1\x74\x64\x87\x7a\x6e\x03\xec\xc1\xd3\xc7\x37\xa9\ -\xc7\x4c\xef\x7e\xf3\x27\x33\x56\xfb\x16\x9c\x27\x2b\xea\x5a\x20\ -\xed\x7f\x49\x0e\xe8\xb4\xfd\x57\x9e\xcb\xd7\x3e\x7f\xa0\x27\x68\ -\xb2\x2f\xa3\x5a\x33\x7e\x0f\xbb\x75\x73\x2e\xbd\x84\x3c\xf1\xbf\ -\xd4\xff\x87\x38\xe4\x11\x49\xe7\xe2\xab\xab\x51\xe4\xf7\x39\x00\ -\x3f\x67\xc5\xc3\x3a\x3b\xe1\xd9\x20\x86\x15\xf9\xad\x56\x5f\xef\ -\xf5\x8e\x6f\x8c\xeb\xfc\x65\x89\x01\xca\x8e\x8e\x51\xf1\x79\xef\ -\xd1\xec\x12\xe2\x9c\x14\xc2\xcb\xf4\xfd\x2a\xb1\xee\x8d\x10\x9a\ -\x9e\xa9\x7e\x75\x0c\x72\x57\x64\x14\x12\x81\x33\x23\x91\x77\xfd\ -\xc4\x8d\x5c\x71\x94\x30\x37\xad\x45\xaa\x01\x10\x86\x02\xea\xbf\ -\xc1\x79\x00\xe1\x28\x9a\x03\x78\x61\x56\xdb\x3f\x45\xe9\x07\x14\ -\x24\xde\x27\xdd\x17\xde\xc0\xbc\xc9\x38\x01\xd8\x4b\xa9\x60\x4f\ -\xc0\xee\x1e\x31\x76\x3c\xf7\xd3\x32\x0f\x70\x5c\x0c\x30\xbe\xa9\ -\xf2\x26\xf0\xd7\xd7\x55\x5d\x88\xfb\xc5\xff\x17\x30\x2e\xa7\xfc\ -\xbf\x2d\x71\x87\xec\x70\x3b\x1a\xfb\x5b\x70\x12\xdc\xf6\x71\x58\ -\x60\x8c\x05\xd0\x24\xfc\x24\x3f\x2f\x88\x31\x77\x01\xd7\x52\xc4\ -\x7e\xe9\x1c\xc0\xc1\xfc\x1f\x67\x29\xda\x5e\x74\xf7\xbe\x43\x93\ -\x3b\x9e\xf4\xe9\x7b\x71\x5f\x03\xd9\x18\x89\x4c\xa8\x3f\xea\x8c\ -\x8e\xac\xde\x1e\x99\x98\x6b\xc3\xc7\x4f\xd8\xac\x94\x19\x8d\x3e\ -\xeb\x92\x8c\xb9\xf0\x3f\x45\xbb\xe7\xeb\x3f\xd6\xd0\x30\xf6\xe3\ -\x1a\xd0\x00\xfe\xc5\x80\xff\xd7\xd8\x77\xba\x1e\x40\xf8\x21\xc4\ -\xa1\x47\xf3\x3b\x77\x94\xd2\x2b\x5f\x02\x6d\xc7\x5e\xf1\x2f\xd4\ -\xde\x46\x5e\x90\xb7\x96\x3f\x57\x8e\xae\x51\xdd\x1f\x71\x09\x30\ -\x5f\xa7\xd8\x5a\x70\x3e\x78\xe6\xaf\xbf\xe3\xcf\x76\x40\x6a\x59\ -\x71\x8d\x51\xd6\x15\xbc\x32\xe1\xa7\xa6\x9a\xfc\x22\x61\x62\x60\ -\xdf\xaa\x96\x59\xf8\x1f\xf8\x61\xa7\xab\xbb\xb9\x67\xfb\x0b\xf2\ -\x48\x38\x07\x13\x56\xe3\xd0\x0c\xce\x27\x60\x9e\x2d\x33\x81\x35\ -\xc2\x52\xea\x52\x1e\x40\x71\x00\xf6\x2d\x6d\x7e\x2d\x8b\x2e\x52\ -\x3f\xd0\x16\x1b\x20\x33\x75\x05\xca\x01\xda\x12\x17\xb4\x18\x57\ -\x81\x76\x95\xa8\x7e\x72\xac\x54\x58\xf8\xae\x52\x13\x90\x63\x8f\ -\x25\x07\x2f\x64\xcb\x96\x47\xbd\x1f\xe2\xa2\x43\x1a\xf7\x1b\x71\ -\x80\x8a\x54\xeb\xe8\xf2\xac\x8e\xe6\x45\x17\x2c\xd7\xb2\xec\x4d\ -\xfa\xf8\x3f\x9a\x0f\x58\x73\x02\xb9\xfc\xca\xf8\x69\x12\x5f\xc5\ -\x75\x3d\xb5\xcd\xfc\x3f\x76\xdb\xaf\x2b\xe2\xf3\x81\xbb\xcc\x33\ -\xd1\xb9\xa3\xf1\xf8\x39\x77\x56\xdb\x09\xe4\xd4\x94\xdd\x63\x6a\ -\xd7\x3b\x47\xd5\xc7\x7e\xb2\x63\xf8\xe3\x9f\x50\x13\xea\x39\xf0\ -\xb9\xa9\xed\x3b\x4f\x7f\x73\x29\xda\xfe\x0a\xfa\xa4\x22\xcd\xcd\ -\xb4\xfd\x59\x80\xa2\xee\xfd\xd9\x1a\x17\x48\xe3\x60\x0e\x62\xe1\ -\x0b\x37\x8e\xc9\xbd\xc2\x9a\xec\xea\xe7\x63\x9d\x9b\x77\x6e\xfd\ -\x03\x8c\x13\x8f\x9b\x6d\x1b\x1a\x0a\x9f\x5f\x35\x56\xff\xab\x88\ -\xba\x8f\x7d\x35\xc8\xfb\xcb\x88\x47\x28\x75\xff\xda\x71\x73\x7f\ -\x6d\xbf\x66\xcd\xf3\x2a\x7d\xdf\x5f\x71\x79\xaf\x9d\xf4\xdf\x61\ -\x1e\xec\x12\xe6\xe9\x88\x73\x66\x2e\x1e\xb2\x92\xef\xc1\x59\xf5\ -\x7b\xeb\xa3\x10\xa7\xe7\xff\x44\x26\x9e\xf1\x19\x27\xba\x74\x2b\ -\xce\xdd\xd1\xbe\x7d\x94\x39\x55\xab\xc4\xa7\xda\xf1\xf5\xbf\x62\ -\xf6\x77\xee\xa9\x17\x68\xea\x7b\xc7\xf5\x79\xaa\x05\x0a\x9e\x66\ -\xce\xc7\xd5\xe7\xfd\x00\xda\x11\x36\x90\x4f\xa9\x79\xdb\xe9\x33\ -\xe7\x7c\x4a\xa9\x61\xdc\x55\xc6\x5e\x04\xc6\x6e\x23\xbb\x76\x3e\ -\x69\x8e\xf1\x07\x3a\x5c\xf3\xc7\xde\xbf\xd5\xf5\xbf\x7f\xd9\xef\ -\x99\xf4\xb1\xdc\x75\xff\xc4\x7f\x1d\xe0\x48\xa8\xe9\x3e\x80\xdb\ -\x14\xdc\xe4\x86\x3f\x17\xe4\xf3\x99\x69\x8c\x33\xba\xee\x0e\x5d\ -\x73\x2c\x74\xf1\x61\x2b\xf6\xe6\x2f\xaa\xf5\xe1\x38\x0f\x64\xfd\ -\x64\xc7\x56\xa5\x5e\xf4\x20\xf5\xa9\x1f\xee\x50\xd7\x7c\x6d\x68\ -\x7c\xe2\xb5\xf0\xb9\x9d\x13\xdb\xcd\x97\x41\xac\x7f\x2d\xe2\xbb\ -\x20\xce\x0b\xcd\x03\x98\x7a\x06\xa0\xe5\xf7\xfe\x4b\x32\x3b\x5e\ -\x74\xfa\xb8\x11\x5c\x0b\xec\x9f\x82\x60\x67\xe2\xc9\xdb\xbd\xdb\ -\x32\xce\x3b\xb0\x06\x78\x1c\x46\xcc\x68\xe8\x69\xcb\xe5\xf0\xea\ -\x4d\x88\xf1\xcd\x1c\x96\x8c\x4f\xc8\x7d\xf5\x8e\xcf\x47\x46\x18\ -\x5f\x92\xc3\xea\x3a\x95\x9e\x5f\xe5\xdc\xbf\xe3\x3f\xfb\xe4\x9f\ -\xd0\x0f\x22\x3e\x36\xf8\xe9\x3d\xce\xda\x7f\x0f\x8f\x15\x2e\x50\ -\x27\x06\x9f\x7a\x17\x28\xe1\xff\x35\xac\x0f\x7e\xce\x35\xd6\x6e\ -\x2f\x20\xff\x2e\x71\x29\x83\xfe\x4b\x1e\x50\x81\xfc\x9f\x76\x04\ -\x07\x39\x95\xa5\x1e\x58\xf4\xf3\x00\xb6\xa7\x84\x9b\x6c\xb5\xfd\ -\xbe\x69\x5e\x70\x54\x70\xcf\x92\xb8\x06\xe1\xdf\x4e\xcb\xce\x7b\ -\x4a\x85\xce\x06\xf5\xc7\x99\x20\xec\x47\x4c\x19\xd3\x7f\xd9\xaa\ -\xc8\xac\x71\xc1\xe8\x8a\xff\x5f\x10\x7c\xe2\x36\xe7\xfe\x03\xfd\ -\x12\x9f\x03\xcc\x69\xf9\x3b\x14\x55\x8d\x9b\xea\xf3\x81\x08\x9e\ -\x02\xd5\x56\x44\xff\x35\xff\xa7\x2b\x75\x5e\xbd\xcb\x00\x3f\x07\ -\xe7\x3d\x13\xa1\x4b\x6e\xdd\xba\xf3\x79\x9f\x54\x8c\xf3\x14\xc8\ -\x7d\x47\x26\x90\x43\x7a\x5c\x2d\xdd\x34\xaa\xae\xbc\x6e\x74\xa8\ -\xf2\x26\xf8\xdc\xce\x9d\x13\xbb\x5f\x06\xcf\xe3\xb5\x79\x78\x7e\ -\x30\x2e\x45\x3f\x5a\x30\xfd\xbd\x59\xd2\xff\x72\xac\xcb\xf3\xad\ -\x8e\xf8\x06\xab\x2e\x9c\x78\xe2\x27\x84\x1f\x47\xcf\xbe\xe0\x5e\ -\x21\xe4\xe9\xc7\x2a\x4e\xf3\x36\x78\x7a\x9f\x35\x78\x11\xa1\xc4\ -\xb9\x5f\x9d\x8d\x2c\xff\x9c\xb8\x3d\x4d\xe4\xf8\x59\x65\x0e\x7b\ -\xc4\xae\x47\x0c\x62\xc1\xde\xa6\xdc\xd5\x6d\xf9\x18\x5f\x5c\xff\ -\xe7\x7e\x16\xea\x3e\xe6\xcb\x65\xdf\xf7\x77\xa8\x46\x55\x8c\xac\ -\x80\x3e\x1e\xf4\x6a\xe9\xe5\xcf\x29\xe6\xdd\xb9\x3b\x7d\xff\x5f\ -\x27\xb8\x3b\x81\xb3\x93\xaf\x48\xc5\xf7\xfe\x1b\xee\xde\xe4\x69\ -\x26\x08\x7e\x5e\xa8\x23\xf1\x7f\x87\x7c\x3f\xf1\x70\x58\x9c\xc3\ -\x94\x08\x2f\x40\x7c\xbf\x29\xbd\x51\x47\xfc\xbf\xd9\xea\xd7\x05\ -\x70\x37\xd8\x98\x87\xcf\xd5\x69\xcf\x82\x66\x0a\xe1\x3e\x9e\x96\ -\x7b\xbf\x9e\x09\x1a\x1b\x51\x6a\x4f\x2a\xf5\xaa\xcb\x6b\x62\xef\ -\xb0\x4e\x4b\x31\x13\xce\x3a\x4b\xcf\x81\xee\x0b\xe5\xfe\x1d\x99\ -\x9b\x1e\xb0\x01\xd2\xf7\xc3\xf7\xc8\x03\x52\x15\x1e\xd0\xe3\xe6\ -\x00\x68\x9e\x5a\x66\xab\x63\xfd\xf8\xbf\x20\xf8\x46\x3c\xcb\xdc\ -\xf4\xb2\x6e\xe7\x7b\x63\xea\x49\x3d\xf5\xab\x6b\xbb\x81\x9c\xba\ -\x82\xf5\xa4\x99\x2d\xaa\xf9\x9d\x61\xd5\x39\xb4\x43\xbd\x1a\xf1\ -\x9b\x12\x93\x13\x93\xaf\xcc\x5b\x9d\x6b\xa9\x7f\x87\xfb\xa4\xe2\ -\xff\xb5\x5f\x21\xfd\x97\x5e\x3c\xc7\xde\x52\x83\x8b\xb5\x24\x06\ -\x10\x9c\x68\xd9\x13\xa2\x19\x3d\x7c\xa5\xcf\x75\xbc\x91\x3e\xce\ -\x05\xfd\xfc\xa4\x73\xf1\x77\x66\xc9\xdf\x23\x6e\xe5\x22\xe3\x7c\ -\xda\x8c\x43\x5c\xd3\x1c\xdf\x03\xf8\xfe\x54\xfb\x8b\xb7\x65\x6e\ -\x9d\x9f\xf3\x8a\x23\xb5\x6e\xe9\x79\x97\xa8\x0e\x86\x3e\x79\xc5\ -\x2b\x47\x57\xae\xb3\xed\xe7\xe3\x6e\x3d\x62\x53\x9e\xb0\x1e\xd5\ -\xa8\x52\xc5\xa8\x75\xe6\x39\xf1\xc8\xf2\xcf\xa8\x1f\x88\xb3\x93\ -\xd1\x2e\xcf\x03\x50\x0e\xc0\x3c\x22\x74\xb0\x06\x22\xf1\x7f\x59\ -\xd7\x4f\x04\x8b\x80\x72\x26\x99\x11\xc2\xdd\x20\xee\x0f\xe2\xac\ -\x35\xfa\xff\x3a\xd9\x0e\x8c\x05\xb2\xf1\xfd\x3f\x8a\x3a\x7f\xbd\ -\x0f\x7e\x74\x05\xce\xd3\x8b\x85\xf7\xfd\x23\xcd\x3e\xc5\xb9\x1e\ -\x47\xdc\x1f\x96\xf0\xb7\x59\x7a\x4e\x5a\x6c\xa7\xe4\xfb\x84\x8f\ -\xee\xea\x7c\x9f\xf1\x54\x90\x2f\x7d\x0f\x71\x27\xb6\x7e\x99\x03\ -\x48\x38\x9f\x8a\x0e\xdb\x5d\xaa\xef\xd0\xef\xd1\xe1\x99\x10\x78\ -\x9f\x0a\xef\xfd\xce\x54\xe4\xd9\xc8\xf5\x14\x3e\x51\xf7\x36\x90\ -\x93\x22\x9c\x47\x8e\xbe\xfc\x9f\x37\xa9\xde\xa1\xe9\xcd\x6b\x1f\ -\x1f\x1d\x55\x4f\xdd\x36\xae\xce\xcc\xc6\xbb\xff\x54\xd2\x75\x29\ -\x8a\x2f\x35\x6e\x9c\xcc\xb5\x39\xba\xde\xde\x9f\xbb\x2d\x69\x9e\ -\x38\xab\xe1\xbf\xc7\xe7\x97\x30\x39\x08\x77\x13\xf7\xe1\xe7\xbc\ -\x1d\xaa\x88\x79\x06\xf2\xdf\x6d\x03\x2d\x7a\x26\xd8\x86\x9b\xab\ -\xa8\xfb\xfa\x10\x87\x5d\x97\x70\x3e\x89\x7f\x53\xcf\xfc\xe9\x39\ -\xd5\x81\x98\x5f\xcf\xb4\x92\xaf\xb3\x25\xcf\xb6\x79\xe6\xb7\x44\ -\x7b\xaa\xe0\x9b\x67\xba\xc8\x4d\xf1\x58\xf5\x9b\xf1\x47\xee\xae\ -\x6c\xda\xa4\xd4\x63\x62\xce\xde\x7f\x4b\x45\x57\x68\x87\xaf\x24\ -\xf5\x7f\xea\x01\x08\x7f\x00\xfa\x7f\xc4\x11\xaf\xc8\x2e\x00\xe1\ -\x2c\xf9\x73\x51\xfd\x98\xba\x60\xea\xb9\x09\xcd\xb5\xdb\xf0\xb1\ -\x56\x70\xae\x12\x71\x38\xd2\xf9\xb9\x6f\x0e\x8f\xfc\x36\xee\x2e\ -\x5f\x9c\xcf\xcd\x7f\xb5\x82\x1c\x9d\x0e\xcf\x6c\x6b\x3e\x02\xdd\ -\xe3\x2f\x3b\x7d\x2c\x44\x9e\x9d\x90\x1a\x9f\xd4\x00\x67\xe5\xd4\ -\x88\x1b\xb5\xc5\x58\xa9\x78\xe2\x6d\x99\xab\x6e\xc9\x2e\x80\x70\ -\x3e\x3a\x82\xfd\x4f\xb3\x8d\xac\xff\xd8\xe3\x29\xb8\xcd\x2f\x8f\ -\x6e\x7d\xf8\xd9\x2a\xe8\xff\xdd\x27\x65\x9b\x2a\xef\x53\xea\xc0\ -\x77\xc6\xd5\xda\x7f\x6e\x1f\xb5\xce\xde\xb9\x59\xfd\xb1\x9d\x6d\ -\x7e\x14\xf1\x80\x78\xf6\x9f\xf7\x81\x74\x2f\x7e\xb0\xfe\xe7\xcf\ -\xde\x89\xdf\xaf\xf8\xdc\x20\x75\xc6\x0a\xb6\x19\x93\x87\x38\x77\ -\xc8\x9f\xcd\x7b\xc9\x89\x57\x9c\xab\xb8\x06\x38\xa5\x86\xb6\xbe\ -\xed\x0c\xa3\xf7\xe3\x59\xe2\xac\x67\x2e\xe2\x9a\xbd\xe0\xf3\x8f\ -\xd5\xa4\xf7\x4f\xbe\x8b\x62\x7c\xbd\xb7\x2a\x3b\x6b\x94\x0b\x68\ -\x4c\xfe\x0e\xc5\xbf\x15\xd2\x87\x1e\x73\x1b\x98\x2b\x47\x22\xd6\ -\xcb\x5e\xad\xee\x1d\xdf\xe6\x9d\x49\x6c\x6a\xea\x39\x17\xc4\x42\ -\x2b\x87\xf3\xe6\xd2\x31\xda\x9d\xa2\x79\x40\xee\x01\xd4\xa8\x0e\ -\xc8\x5c\x82\x15\x83\x39\x85\x79\x26\x40\xe3\x6b\xea\x39\xc9\xb6\ -\x5f\x0b\xd0\x3c\x4a\xb4\x5f\x61\xa2\xcd\x84\x5c\xc0\xa8\xf3\x0c\ -\x6e\xac\x75\x47\x3a\xd7\xbb\x71\x9b\xfa\xeb\xff\x57\x8c\xb7\x6e\ -\xc6\xde\x7c\x25\xde\x23\x3b\x58\x76\x79\xcf\x87\x73\xa3\x8e\xe0\ -\x10\xf6\xeb\xa6\xda\x8e\x22\x5f\xea\xac\xd8\x01\xb6\x01\xcc\x8b\ -\xce\x78\x2a\x32\x5b\xed\xf4\x67\x81\x28\x07\x71\x3b\xf2\x37\xd6\ -\xbb\x4d\x8c\x01\x8b\x39\x4d\xce\x69\x5f\xbb\x79\xe7\xef\xe1\x8c\ -\x42\xc0\xfd\x79\x1f\x14\x70\xc2\xaf\x19\x57\x1f\xfd\xcf\x51\xb5\ -\x72\xfd\xf4\xb6\x37\x63\x1e\xf7\x27\xf1\xec\xfe\x8f\x94\x65\x17\ -\x00\x75\x89\x74\x4a\x7a\x71\x65\xe9\xc7\xf5\xe3\x00\xd6\x7d\x8d\ -\x19\x51\x91\x3d\xfc\xa2\xd8\x00\xc4\xc1\x41\xfd\x9f\x45\x1f\x16\ -\x9d\xf3\x0a\xbb\x2f\x46\x3c\x50\xdc\x3f\x88\x6e\xda\xf5\xd8\xe5\ -\xd3\x22\xcb\x77\xd4\x88\x7b\x74\x81\xb9\x08\x71\xde\xcf\x62\xbd\ -\x9f\x75\xa5\xf6\xe7\x48\xdc\x4a\xbb\x6a\x6d\xbf\xf6\xcf\xb6\x47\ -\x7a\x7f\x14\xff\xf7\xe8\x70\xce\xd2\xf5\x0a\x91\xe5\x9b\xe1\xe7\ -\x3c\x75\x1d\x6f\xdf\xc8\xb8\x52\xcf\x8e\xbb\xfb\xae\x4f\x45\xaf\ -\x3c\x42\x98\xa5\x7a\x1f\x28\xd2\x21\xfd\xaf\x69\xde\x10\xb3\xcf\ -\x21\xc6\xbb\xc1\x92\xbb\xdb\x8c\x09\xe0\xfb\x7f\xe4\xd6\xb4\x98\ -\x6b\x93\x74\x4f\xea\xab\x65\x8b\x39\x45\xb3\x18\x77\x25\x40\x07\ -\x63\xec\xa3\xf7\xc4\xa5\xfe\xe1\x48\x7e\xe4\xf3\xfc\x68\x3e\xa4\ -\x36\xc5\xf8\xb3\x9a\x23\x19\xbf\xce\x61\x1e\xd4\x3d\xb1\x01\xdd\ -\xd7\x1c\xc9\x31\xd9\xfd\x71\x5a\xfe\x5e\x85\xce\xf3\x4a\xb6\xce\ -\x5d\x78\x4e\x1c\x73\x9a\xb2\xbb\x00\xfa\xff\xd8\x40\xff\xef\xa3\ -\xb2\x65\x58\xfd\xd1\xd8\xf0\x65\x9f\x1c\x53\xad\x23\x5b\xb6\x5c\ -\x8d\x3d\xf2\x97\x26\xd2\x4b\x9f\x2a\xcb\xfc\x1d\xef\xdf\x77\x84\ -\x0f\x43\xb8\xf0\x74\x8c\x39\x80\x29\x47\x7b\xe3\x36\xef\x8e\x95\ -\x04\x73\x77\x50\xff\x6b\xe0\xfb\x4b\xe6\x3e\x2f\x3f\xdd\x44\xdc\ -\x3d\xc4\x8a\x72\x77\xbb\x7f\xfb\xd5\x4a\x78\xe9\x58\x55\xf0\xaa\ -\x89\x7f\xc8\xe6\xf9\x5e\x7e\x4e\xdb\x82\xf5\x2b\xbb\xff\xae\xde\ -\x59\xe9\xcf\xfd\xb3\x0d\x62\x9c\x0b\x9c\x53\x20\xfe\x12\xc4\xc4\ -\x8b\x36\xbc\x64\x64\xf9\x2a\x88\xfa\x4f\x5f\xc7\xdb\x87\xf9\xc4\ -\x19\x5b\xb6\xfc\xf6\x25\xa9\xe8\xc2\xad\x05\xc2\xe0\x95\xd9\xa3\ -\x48\x87\xe7\x81\xa2\x82\x19\xa6\xf9\x44\x7c\xac\x6d\xe9\x03\x50\ -\x3c\xa5\xfb\x2b\x1d\xa9\x07\xc8\xde\x8d\xcd\x7a\x48\xbb\x0d\x56\ -\x4b\x6a\x7d\x3a\xf7\x69\x4b\x9d\xbe\xe5\xf3\x7b\x1f\x57\xc7\x97\ -\x7c\x69\x56\xfa\x26\x1c\xfb\xb7\x08\xb3\x4c\xe7\xff\xb3\xa4\xff\ -\x0d\xca\xfd\xf1\x3d\xe1\x01\xba\x83\xf8\x0a\xb2\x57\x2d\x75\x40\ -\x9f\xe7\xc0\xd2\x98\x50\xf4\xf1\xb5\x9b\x27\x67\x03\xfd\xbf\xef\ -\xca\xcc\xf0\xd8\xcb\x97\x46\x55\xc7\xdb\xa2\x56\x7e\x6a\x4c\x9c\ -\x7b\x75\x31\x7a\xe0\xdb\x58\x3f\xc3\x5d\x0f\xc2\xbe\x97\xe7\xb6\ -\x22\x18\xfb\xfe\x91\xfd\x3b\xd6\x79\xc1\x98\xa5\x9c\x94\x71\xee\ -\x08\x67\x56\xf4\xbf\x4a\xfe\x7f\xaf\x97\x0d\x2d\xd6\xd5\xb0\x7a\ -\x2a\xe6\xce\x8e\x73\xfe\x77\xaa\xd1\x25\xaa\x99\x57\x88\x73\x80\ -\xe7\xe6\xfb\x33\x2a\xec\xa7\x06\x75\x9f\x62\x0d\x5b\xf6\x7c\x6d\ -\xee\xfb\x95\x6d\xa9\x51\x62\xac\x82\xb8\xc1\x88\x4d\x1f\xed\x7a\ -\x33\xd6\x02\xda\x1a\x7b\x9d\xef\x5f\x68\xf3\xb0\x7a\x4a\x2a\x3e\ -\xf7\xcd\x64\x78\xe9\x08\xd6\x01\x10\x3f\xa5\x0c\xa7\x86\x75\x00\ -\xd1\x7f\xea\x09\x0a\xae\xaa\xde\x0f\x2c\xca\x1c\x20\xbd\xea\xd9\ -\x60\x99\x03\x2c\x6a\x3c\x7e\x87\x63\xa9\xb2\xae\xbd\xd9\xfd\x7d\ -\xa7\x8a\xee\x87\x38\x8c\x6f\xea\x73\xa0\x49\x0c\xe0\xcf\xf7\x39\ -\x2d\xc1\xfb\x96\x3a\x00\x71\x20\xb7\xfc\xd8\x9f\xf9\x91\xb9\xfe\ -\x47\x9c\xc0\xf1\xb6\x9f\xcb\xe9\x7d\xea\xa2\xe6\x3a\xb5\xfb\xf3\ -\xc5\x58\xcf\xcc\x83\xff\x1f\x19\x32\x03\xfd\xbf\xef\xca\xe6\x11\ -\xf5\xdb\x17\x6d\x19\xe9\x1d\xda\xf9\xa0\xfa\xcf\xdd\x9d\x8d\x1f\ -\xa6\xa7\x7a\x77\x14\xa3\xbc\x7f\xdb\xc7\xb7\x69\xfb\xb1\x78\x59\ -\x78\x00\xab\xb4\x17\xd2\x94\x1c\xa0\x4e\x31\x00\xd6\xa4\x08\x3b\ -\x36\x56\xef\xef\x93\xa3\xfe\xe3\x4e\xb0\x71\x99\x37\x13\x6d\x21\ -\x66\xf4\x4b\xb7\xa8\x2d\xcf\x9f\x71\x2e\xfc\x1e\xd6\xe8\x29\xff\ -\xb7\x79\x77\xa6\xe2\xe7\xfb\x2d\xbf\x5f\x45\xfd\xea\x18\xf3\xfc\ -\xe9\xda\x9f\xc6\xae\x23\x3f\x4a\xb3\xb6\x82\x4f\x17\xd5\x3b\x4c\ -\x8b\xde\x36\xf3\x6f\x5f\xa1\xee\x05\xc7\xf6\x5d\x14\xc4\x52\x89\ -\x6f\x55\xd9\xa5\x54\x74\xf9\x7b\x19\xdc\xc1\xd3\xf1\x0c\xd8\x80\ -\x3d\x54\x0b\x60\x4e\xe1\xaa\x3f\x0b\x00\x7a\x64\x34\xfb\xbb\x81\ -\xe2\x57\xfd\xb9\x6a\xbd\x43\x65\x6a\x8e\x71\xa9\xbf\x6b\x3c\x01\ -\x87\x39\x98\x09\x03\xcd\xcf\xd9\x1b\x7d\x0e\x74\xdf\x7e\x4a\x7d\ -\x3f\xc6\x1c\xe9\x7b\xe8\x7d\xdb\xb7\x01\x7b\xa4\xf7\x3f\xeb\x32\ -\x46\x28\xc5\x0a\x2e\xd7\x00\xab\x32\xff\xa7\x39\xc0\x19\x07\xa0\ -\x2d\xf3\x0b\x32\x67\x65\x22\xaf\x29\xe4\xff\x13\xa7\x05\xfa\x7f\ -\x1f\x96\x21\x35\xf4\xfa\x2d\xe3\xcd\xff\x8a\x6c\x6a\x79\xf1\xed\ -\x6d\x2f\x3b\xd5\x61\x8e\x70\xa3\x27\x3d\x6c\xbd\x83\xd3\xaf\xb9\ -\x73\xfe\xdf\xc7\xdf\x2c\x09\xbe\x3c\xfa\x7f\xc6\x94\x67\xee\x0d\ -\xac\xf9\x69\xce\x5d\xc2\x01\xb1\x1b\x6b\xf0\x23\xdf\x38\x3d\xfd\ -\x90\x73\xf2\xd6\x65\x3f\x2c\xd1\xf7\x67\x0c\x3d\xec\xf7\xd3\x8e\ -\x9f\x3b\x90\xc3\x8a\x3f\xa3\x3e\xa3\xd4\xa5\xcb\xd2\xfb\xd3\xb1\ -\x3f\xfb\xa2\x1e\xc5\x2b\x45\xda\xcb\xe9\x1e\xcb\x1a\xbd\xc3\xea\ -\x9e\xf3\x0f\xdf\x5d\xd9\xbe\x45\xa9\xe7\xe6\xe3\x7b\x3f\x93\xb6\ -\x56\x8e\xe1\x4c\x50\x89\xf6\x02\x30\x06\x80\xdf\xc9\xe4\x7e\x20\ -\xdd\x47\x1d\x47\x99\xba\x0e\xa0\x79\x82\xf4\x4c\x40\xdb\x8f\xab\ -\x8a\xb6\x3e\x7a\xff\x8a\x7b\x71\xba\xcf\x5a\xd2\xb9\x97\xe6\xee\ -\x15\xbe\xe3\xaa\xf8\xf7\x9a\xcc\xf5\xcd\xd2\x6b\x53\x74\x1e\x31\ -\x94\x39\xae\xa2\xf8\xdf\x6d\x88\xee\xff\xff\xec\xbd\x09\x78\x5c\ -\x57\x79\x30\x7c\x2c\x59\xb6\x64\xd9\x96\x17\x69\x96\xbb\xcd\x8c\ -\x96\xd9\x57\x29\x09\xd0\x52\x02\x4d\x59\x5a\x0a\x5d\x3e\x5a\x42\ -\x69\x7f\x28\xfd\x80\x52\x4a\x57\x28\x29\xcb\x67\x43\x5a\xf6\x35\ -\x90\x04\x08\x38\x8e\x34\xfb\x8c\x56\x27\x21\x14\xda\x1a\xfe\x16\ -\x5a\x4a\x4b\xfb\x03\xa5\x85\xb4\x71\xbf\x12\x42\x81\x10\x07\x42\ -\xe2\xd8\xb1\xee\xff\x2e\xe7\xdc\x19\x39\x5e\x24\x59\xf2\x48\xce\ -\x79\x9f\x9c\x8c\xae\x8e\x75\xe7\xde\x73\xce\xbb\x6f\x55\xd6\x01\ -\x42\x32\x17\x28\xc4\xb9\x40\xaa\xae\x92\xca\xaf\x66\x99\xa5\x5d\ -\xfe\x6f\x80\xfe\xaf\xe5\xff\xcd\x0c\xbd\xdd\xe2\x25\x7b\x87\x0e\ -\xfd\x55\xa0\xb7\xe2\x3a\x3b\xeb\x6e\x74\x3f\xc8\xa1\xe8\x3b\xf3\ -\x37\x96\xc4\xe1\xa9\x1a\xfc\xca\x17\x97\x53\xb5\xe4\xbd\xbe\xf1\ -\xaa\x86\x4c\x5b\x5f\x0e\x9b\x6b\x6f\x53\x3f\x11\x67\xd2\x8d\x86\ -\x0f\x7f\xb6\x5b\x0c\xde\x32\x1c\x7f\x53\x39\x67\x15\x7f\x98\x93\ -\xb5\xb3\x0a\x36\xdb\xfb\x0b\x4e\xd5\xb3\x53\xb1\xef\xbf\x26\x75\ -\x5c\xfe\x3e\x15\xff\x93\xb5\x95\x3d\xaa\xce\xb1\x74\x41\xc6\x7d\ -\xf4\xc3\xc7\x8d\xca\xc9\x61\x63\xf6\x1b\xa0\x67\xfc\xe2\x25\x5a\ -\x42\x94\x01\x0c\xd1\x95\x98\x1c\xb3\x8a\x0f\x27\x54\x2d\x25\xac\ -\x0d\xe2\xaf\x92\x1d\x70\x1c\x7d\x9a\xd2\x17\x40\xf9\xcc\x5e\x4d\ -\xbe\x56\x9f\xd5\x8c\xcc\xa7\x66\x99\x40\xc5\x54\xca\xfa\x21\x0a\ -\xf7\x9d\xb2\xe7\x63\x25\x3d\xc8\x61\x5c\xa5\x3e\x07\x9e\x8c\xaf\ -\xec\xfa\x4c\x03\xa8\x66\x3a\xfa\xf9\x88\xd7\x57\xa5\xec\xcf\xb2\ -\x00\xc9\xff\xb2\x57\xea\x78\xa8\x95\x0f\x48\x76\x40\x29\x5f\xa8\ -\x9e\x8f\xea\x59\x54\x0e\x03\xf6\x40\xc9\x86\x9b\x5f\xde\xbe\x3d\ -\xac\xf1\x7f\x13\x43\x8f\x10\x4f\xda\x31\xf8\x96\x9b\x02\xfd\x35\ -\x77\x64\xef\x9c\x1b\xf7\xcf\xb8\xb1\xc1\x9a\xf4\x65\xd5\x5b\x3d\ -\x70\x65\x2e\x7b\x4e\xd5\x8f\x95\xb5\x77\xb2\xb2\xdf\xae\xea\x31\ -\x43\x78\xef\xf5\xdd\x2a\x71\xef\x6d\x3a\xaf\x68\x17\x28\x7f\xad\ -\x5b\x3c\xe3\xb3\xf1\xc8\xc7\xff\x19\xf0\xfb\x04\xc5\xa7\xc8\xbe\ -\x5e\xca\x4f\x4d\x3f\x3b\x2d\x1b\x96\xaa\x55\xa7\x74\x52\xf6\x6b\ -\x33\xef\xe7\x1a\x7b\x75\xae\x59\x0c\x23\xe1\xc3\x3a\x7a\xcd\x1f\ -\xa7\x92\xb5\xbf\x04\xac\xbc\xe6\x12\x2e\x63\xd7\x36\x21\x5e\x94\ -\x1c\x7b\xcb\x5d\xa3\xe6\x9c\x8b\x32\x00\xd6\x51\xa1\x9a\x00\xd8\ -\x53\x51\xf5\x10\xc5\x78\x00\xb4\x9b\x9b\x15\xcf\x9f\xc2\xba\xbd\ -\xca\xaf\xac\x78\xb8\x9d\x56\xb5\x77\xe4\x48\x39\x5c\x6f\x0d\xe3\ -\xf1\xd8\x37\x50\x92\xf6\xd7\x12\xd5\xee\x23\xfd\x5d\xda\xf7\xa8\ -\xcf\xb9\x53\xf6\x68\x00\xf9\xf9\x81\x4e\x8c\xab\xdf\x4b\xb9\x9f\ -\xe6\x65\x8f\xf4\x42\x5b\x4f\xb5\x9c\xd4\xfd\x3d\x39\xc3\xe3\xfd\ -\x15\x19\x13\xce\x35\xce\xb2\xe1\x99\x2f\xf7\x08\xad\xff\x6f\x72\ -\x08\xf6\xee\x7d\xce\x9f\xfa\x77\xd6\xdc\xc8\xae\xa6\x1b\x1f\x9a\ -\x76\xb1\x16\x48\xc2\x57\xa5\xfa\xf6\x6c\xbb\x96\xf5\xed\x1c\xc9\ -\xbf\x3c\xdc\x2c\x7b\xf8\x9f\x57\xbc\xc8\x69\xe9\xfe\xd8\x03\x83\ -\xfb\xcc\xb0\x7f\x20\x13\xaa\xff\xa7\x33\xf8\xbe\xaf\x67\x42\x87\ -\x1f\x00\x3a\x71\x1a\xf9\x0f\xf7\xd1\x90\x7c\xc7\x91\x83\xce\x21\ -\xe7\xf9\x7a\xf5\x3e\xbc\xfa\x3e\xca\xee\x57\xf3\x62\xe9\x53\x92\ -\xf7\xc7\x06\x11\x07\x9a\x0f\x0e\x8f\x7d\x18\x63\xd2\x9e\x74\x89\ -\xd7\x71\x14\x68\xc0\xc1\x31\x67\xea\x61\xa0\x01\x8b\x9c\x83\x50\ -\x23\x9b\x24\xe9\xff\x6a\xe0\x7a\xca\x7e\x8b\x59\x99\x27\xa9\xe4\ -\x19\x65\x03\xc8\x4a\x9c\x57\xf5\xf7\x30\xfe\x26\xe5\xb4\x7c\x02\ -\x59\xaf\xaf\x17\xf7\x19\xca\xc9\xde\xe6\x4a\xce\x1f\x97\xfd\x91\ -\xf0\x93\xf4\x7c\x98\x27\x7c\xc7\x39\xbb\xcc\x3a\x00\xec\xc7\x84\ -\xa2\x01\x1e\xfe\x97\x3c\x1a\xe0\xd9\x76\x6d\xe9\x83\x74\xaa\xd2\ -\x2e\x59\x97\x3e\x21\xca\x5d\xfa\x72\x5f\x9f\xe6\xff\x9b\x1c\xb6\ -\xf5\x8a\xfe\xdf\xf4\xed\x6a\x3e\x34\x32\x30\x7f\x3a\x36\x34\x03\ -\x32\xc0\x34\xd5\x04\xcb\xca\x1a\x40\xaa\x96\x85\xc7\xfb\xad\xb2\ -\xd7\x83\xa3\x55\x8f\xbf\xd5\x87\xd3\xd3\x03\xa4\xec\xaf\x7a\x63\ -\x26\x82\xc5\xfb\x93\xf6\xe4\xfd\xb9\x08\xc6\x06\x2a\xda\xc0\xfd\ -\x7c\xda\xeb\x50\xe6\xe5\x7d\xf3\xca\xe6\xa7\xea\x52\x58\x2a\xd7\ -\x4f\xe6\xa2\x61\x2c\x0a\xf1\x7f\xec\x61\x82\x34\x8b\x7a\x16\x7d\ -\x5f\x88\xd8\x1b\xe1\xbd\x62\x97\x7a\x1d\x01\xff\x7f\x71\x38\xfa\ -\x8e\x2f\x0d\x07\x3e\x79\x02\x6b\x72\x60\xfe\x34\xf5\x57\x47\x3a\ -\xaa\x7c\x81\x86\xea\xb3\x2a\xf1\xde\xaa\xb4\xd9\x03\xb8\x77\x00\ -\xf7\x5a\xaf\x78\x35\xf8\x39\xc6\xa2\xc4\x3d\x45\x1d\xfe\x54\x3e\ -\x17\xae\xdb\xc1\x7d\x7c\xd8\xb6\x5f\x96\xfc\xbf\xe4\xe1\x38\xf2\ -\x78\xa4\x03\x13\x21\x69\xf7\xa7\x7f\x57\xf2\xe8\x02\xf6\x01\x52\ -\x31\x40\xf9\x30\xdb\x12\x55\x7f\x15\xee\xf5\x5a\xf2\xf2\x39\x32\ -\xb2\x1f\x30\xda\xff\x13\x4e\xed\xcb\x3d\x3d\x7e\x8d\xff\x9b\x1c\ -\xfa\x84\xf8\xe5\xbd\xfb\x9a\xf7\x8c\x0d\xcc\x9d\x8c\xed\x9f\x21\ -\xfe\x8f\x79\xed\x14\xd7\xae\x64\x7f\x53\xe5\x94\xa8\x5a\xfc\xdc\ -\x87\x37\x6b\x97\x3c\xbb\x11\xe5\x8e\xaa\xbe\xbb\x92\xff\x17\x94\ -\xfd\x5a\xd5\xb8\x31\xa7\xd8\x2e\x80\xfd\xa8\x1c\xee\x41\xa5\x74\ -\x50\x95\x8f\x9e\x97\xbe\xa8\xac\x97\xf3\x57\xf3\x7a\x57\x70\x9c\ -\xab\xcc\xf5\xc7\x38\x25\xa4\x51\x68\x77\x87\x67\x2e\x04\xeb\xa7\ -\x9e\x92\xac\xff\x87\xe0\xbe\xe3\x6b\x91\xef\xb7\x52\x48\x6d\x15\ -\xe2\xfa\x51\x63\xea\x7b\x09\x6b\x66\x11\xf3\x82\xa8\x46\x38\xd6\ -\x20\x90\x31\x81\x2a\x1e\x80\x6c\xaa\xd4\x47\xac\xea\xc9\x01\x69\ -\xd9\x4b\x90\x7d\x2a\x2d\x3c\x27\xdc\x57\x78\xe8\xc8\xde\xe6\x5e\ -\x2f\xbf\x92\xf4\xdd\x33\xff\x56\x78\x4d\xfd\xbe\x28\xb7\x87\xf1\ -\x1f\x07\xe2\xfe\x15\xa8\xf7\x13\x5d\x50\xb6\xff\x92\x47\x33\xf2\ -\xca\x97\x10\x51\xcf\xa0\xea\x01\xc8\xd8\x4f\xea\x85\x5a\x95\x7d\ -\x86\x11\xff\xb5\xff\xef\x72\x80\xed\x42\xfc\xac\xdf\x38\xfc\x0f\ -\xc9\x81\xb9\x47\x92\xbe\x19\x8a\x9d\xa7\x5e\x20\x58\xcf\xca\xac\ -\x7b\xf6\x2a\xac\xc3\xa1\xea\xf1\x2d\xe9\xc5\x21\xf3\x46\x29\xde\ -\xd7\x96\xfd\xe5\xd0\x76\x64\x95\xbc\x73\x44\x36\x6e\x43\xf5\xca\ -\xe5\xfe\x9c\x05\xe2\x35\x52\x16\x08\xf1\x59\xcd\x79\x7d\x29\xcb\ -\x5c\x9f\x5e\xf6\xa8\xc9\x3a\x2d\x7e\xc9\x79\xbe\x0d\x99\x37\xc7\ -\x35\x69\x51\x57\x79\x4a\xa4\x72\x6f\xdf\xee\x67\x61\x8c\x3c\xe6\ -\xa3\x77\x77\x60\x29\xfb\x7b\x84\x78\xb2\x69\xbc\xf6\x5f\x47\xcc\ -\xd9\x93\x48\x9b\xa8\x56\x18\xc6\x03\x22\x1d\xa0\xbc\x00\xd9\x43\ -\x54\xc6\x04\xb5\xe2\xaa\xda\xe2\x2a\xa4\xfe\xcf\xb8\x2f\xfd\x2b\ -\x6d\xf5\xce\xd3\xd4\x07\xb9\xc2\xfd\xbb\x2d\xa6\xa3\x85\x90\xec\ -\x41\xa8\x7e\xa6\xdf\x17\x59\xef\x0f\xb5\x78\xfd\x04\xd2\x59\xbb\ -\xe4\xc9\x00\x6a\xce\xd3\x01\x64\xfc\x2f\x8e\x0c\xf5\x4e\x6d\xb3\ -\xb7\xaa\x1c\x6b\x59\x6b\x00\xfd\xff\x7d\xfd\x31\x8d\xff\x9b\x1c\ -\x80\x67\xfd\x54\x60\xec\x43\xd3\xa9\x3d\x73\x3f\x4a\x82\xfe\x8f\ -\xb2\x74\xd2\x57\xa7\xbe\xc0\xaa\xa6\x25\xf5\xe1\x90\xf9\xa4\x79\ -\x19\x77\xef\xf5\x8e\x92\xb5\xe3\xb8\x96\xa4\x94\x49\x6d\x3e\xa3\ -\x19\x2f\x8e\x55\xea\xad\x24\x4b\x72\xff\xee\xbc\xe4\xff\x39\x3a\ -\xb7\x4c\x07\xd8\x86\xc0\xba\x44\xbb\xee\x4f\xb9\xac\xe1\x3a\xf3\ -\x49\x53\xf6\x2a\xb0\x39\x16\x35\x85\xf5\xcb\x03\x8d\x47\xd3\xd1\ -\x8f\xdd\x81\x3d\xbb\xc4\xc5\xd5\xf9\xb9\x18\xa0\xde\x6a\x3b\x84\ -\xb8\x71\xd8\xac\xde\xc3\xfd\x38\x6a\xbc\x8e\x81\x2a\xc7\x04\xa1\ -\x2d\x10\xed\x67\xc1\x0a\xe1\xbe\xd7\x73\x55\xe1\xbf\xd4\xf1\xd3\ -\x32\x9e\x32\x6b\x97\x3d\x79\xa0\xdd\xd6\xaa\x7c\x7e\x6c\x5f\x2d\ -\xb2\xfe\x6f\xb7\xe1\xba\x67\xfb\x67\xfd\x6a\x5c\xca\x05\x13\x61\ -\x65\x23\x60\x1a\x31\x1e\x52\xfa\x7f\x45\xd2\xdf\xb2\x57\x07\x30\ -\x63\xab\x5c\xee\xf2\x12\xf9\x9f\x06\x9c\x83\x44\xb8\xf1\xe5\xed\ -\x7d\x8e\xc6\xff\x4d\x0e\xc0\xb3\xae\xd8\x67\xbe\xf6\x23\xe9\x7d\ -\xf3\xc7\x63\x83\xb3\x80\x4f\x0d\xf2\xff\x71\x5e\x2b\xeb\xff\xaa\ -\xc7\x25\xf3\xfd\x9a\xac\xc5\x25\xfb\xf0\x58\x12\xff\x23\x15\xe9\ -\x8f\xe2\xd8\xbf\x5c\xa8\x15\xaf\x97\xb1\x55\x4f\xc9\x32\xe5\xb5\ -\x64\x1d\x1e\x39\xc5\xb7\x24\xee\xab\x1a\x14\xd9\x50\xcb\xe7\x9f\ -\x93\xb5\xc6\xb8\x17\x8d\xac\xed\x8f\xfc\xdf\x6e\xc8\x9a\x77\x78\ -\xbe\x27\xbf\xd2\xd5\xeb\x5c\x27\x2e\xdc\xdb\x73\xbd\xa1\x1f\x04\ -\x8f\xe7\x1a\xbe\x83\x77\x45\xcd\xe9\x93\x18\x43\x89\xbe\x09\xf4\ -\xa5\x2a\xfc\x57\x7d\x84\x73\xe4\x07\xe0\x98\xaa\xbc\x8a\xa9\xb6\ -\xd9\x07\x92\xc1\xfc\x1f\xbb\xe5\xef\xe3\xbe\xe2\xb2\xa7\xb9\x8c\ -\xb3\xce\x4b\x3a\x5b\x90\x3c\x9e\x68\x80\xa3\x78\x3f\x5f\x63\x4f\ -\xe2\xf1\x36\xbd\x60\x5c\xf1\xff\x50\xb9\xa5\x1f\x38\xdc\xc3\x38\ -\x27\xaf\x55\x6c\x47\x46\xc6\x7a\x65\xda\x62\x93\x58\xff\x67\xfe\ -\x1f\x0b\x21\xfe\x6b\xfb\xdf\x66\x87\x6d\x42\x64\xfa\xf7\x3e\xff\ -\x9d\x89\xc1\xd9\x1f\xc4\xf6\xcf\x49\xf9\x7f\xda\x4d\x07\x64\x1d\ -\x0b\x87\x6b\xd9\xe4\xbd\xba\x72\x2d\x99\x95\xea\xf2\x86\x54\x2c\ -\x3a\xcb\xef\x05\xea\xd1\x2d\xfd\x81\xb6\x8a\x55\xe5\x5a\x21\x19\ -\x5b\xf9\xae\x64\xdf\x79\x6b\xaa\x65\x0b\x0c\xb1\x2f\x2b\xaf\xe2\ -\xda\xc2\x2a\xd7\x5f\xc6\xfa\xc8\x18\xd4\x8c\xec\x73\x99\x26\x5b\ -\x74\x63\x31\xe9\xaf\x9d\x8a\x8f\xdc\x72\x83\x10\xeb\x1a\xef\xbf\ -\x5c\x40\x19\x60\x27\xfc\xef\xed\xa3\x66\xfd\x7e\xec\xcf\x91\xa4\ -\x3e\x21\x0d\xf2\x05\xa2\x0e\x80\xb1\x00\x18\x13\xc0\x75\x02\x95\ -\x0e\x50\x91\xbd\xbb\x55\xff\xd0\x92\x94\x09\xa4\x9f\x0f\x65\x7e\ -\xe5\xef\x93\xf6\x3e\xd2\xb5\x08\xcf\xa7\x24\x1e\xb7\x74\x7f\xe2\ -\xf9\x21\xc6\x77\xe6\xf9\x45\x89\xff\x25\xd2\xff\x55\x4c\x00\xf5\ -\x01\xb7\x4b\x9e\x9f\x90\x6d\x39\x95\x16\xed\x76\xca\xad\x7a\xef\ -\x5e\xfc\x2f\xd7\x84\x8c\x85\x41\xfe\xef\x4b\x69\xfc\xdf\xfc\x10\ -\xd8\xd6\x6d\x5c\x1b\x1d\xaa\xde\x97\x0a\x2c\xb8\x09\x3f\xf6\xcc\ -\x9a\xa6\x1a\x7a\x59\xa3\x2e\x6d\x7f\xb2\x8f\x9c\xd7\x87\xaf\x55\ -\x3b\x36\xa7\x7c\x76\x2a\x76\x04\xed\x7b\xa1\xa2\x67\x0b\xcc\x49\ -\x3b\x21\x9e\xdd\x8c\x55\x6a\x9d\x61\xec\x47\x4f\x43\xca\x00\x61\ -\x96\x21\x38\x86\xa0\x44\xb1\xe8\x4a\x76\xc8\x29\x9f\x9f\xcc\x4b\ -\xa2\xfa\x9b\xf0\x4c\x89\x60\xf5\xd1\xa8\x51\xc2\xfe\xa2\xcf\xef\ -\xf4\x22\xb6\x03\xc8\x54\x57\x8e\x0d\xdf\xfc\x99\x51\x73\xe6\x31\ -\xd2\x57\x30\x2f\x00\xf5\x80\x20\xfb\x01\x73\xc1\x0a\xc5\x3d\x91\ -\x0c\x60\xb2\x3f\x30\x27\x6b\x77\xe4\xa5\x0f\x90\x7d\x27\x3c\xb2\ -\xb6\xb2\x93\x96\x24\x2d\x98\x62\x5d\x9f\x62\x78\xa4\x0f\x05\x7e\ -\xa7\xf0\x1c\x3f\xf3\x56\xfb\x35\xe2\x7b\x91\xfd\x01\xd2\x4f\x40\ -\xfc\x5f\xe9\xfe\x32\x07\x88\x69\x0e\xfb\x77\x54\xad\x37\xd5\xf7\ -\x85\xe3\x14\x65\x5d\x18\x78\xf6\x44\xa4\xfa\x2f\xbb\xf6\xfe\xe4\ -\xeb\x04\xd7\x44\xd2\xb0\x79\x21\x00\x32\xeb\xb5\x51\x7f\xf9\xbe\ -\x38\xc8\xff\x09\xdf\xb4\x1b\xf7\xcd\x70\xaf\x3b\xd9\xeb\x9a\xec\ -\x00\xb2\x26\x17\xc6\x7e\xa9\x58\xfd\x9c\x8c\x33\xcd\xd9\xd2\x6e\ -\x17\x52\x76\x3d\xb6\xf1\x93\x2e\x80\xbf\xb7\x39\x1e\x88\xec\xd5\ -\x14\x5f\x36\x45\x67\x38\xe7\xc9\xfe\x4a\xf7\x2f\x7a\x3c\x28\xdf\ -\x56\xdf\x9b\x73\x5d\xb8\xa7\x15\xf9\xfc\x2c\xae\x11\x9a\x0d\xd5\ -\x1e\xf0\xf9\xde\xf7\x3e\x40\xb8\x5c\xa7\x17\xf1\x0c\xe8\x05\xb6\ -\x78\xc3\x98\x7d\xf8\x7e\xec\xd1\x93\xa4\xfa\x00\x35\xd2\xfb\x0b\ -\x66\x95\x46\x1e\xf5\x7f\xb4\xab\x2a\xfc\x47\xbc\x33\xca\x5e\xbf\ -\x03\xa2\xb3\xde\xcf\x25\xcf\x5e\xa2\xe8\x25\xe1\xb6\xc7\xdb\x5b\ -\xf6\x3e\xb2\xf5\x2b\x1f\x9f\x67\xfb\x6f\xd9\xfd\x54\x2c\x40\xcb\ -\x5f\x58\xa6\x5a\x60\x39\x19\x47\xa8\xea\xac\x7b\x75\xdc\x54\x4d\ -\x47\x55\xbb\x90\xd6\xbf\x0e\xf2\x7f\xed\x9e\x9d\x03\x3f\x83\x7d\ -\x15\x3a\xe1\x6b\xd1\xb0\x76\x40\xf8\x3f\x1c\x40\xfc\x67\xfe\x1f\ -\x1b\x44\xf9\x1f\xf3\xe9\x38\x46\xdf\xeb\x6d\x23\xeb\x73\xb4\x78\ -\x15\xc7\x9c\xb7\xf4\x80\xa2\xb4\xff\x01\x7f\x0a\x73\x0c\xb0\xb2\ -\x07\xe4\xdb\x63\xcb\xa5\x7c\xc0\x3a\xbf\xb2\x17\x32\xad\xe0\x1a\ -\xb4\xca\x06\x50\x93\xb6\x28\xf6\x41\xe6\x6c\x69\xfb\xa3\xfa\xd9\ -\x15\x37\x6e\x1c\xba\x57\x88\x08\xd6\xc7\x1d\xec\xf4\x22\x9e\x09\ -\xa0\x57\xfd\x5a\x62\xec\x83\x9f\x1a\xf6\xcf\x71\x9d\x40\x83\xdf\ -\x01\xe9\x29\xdb\x01\x2a\x5c\xe3\xd4\xae\x49\xfe\x5f\x91\xba\x15\ -\xf3\xfe\xac\x5c\x57\xb2\xa5\x48\xfc\xcf\x39\x4a\xe6\x67\xbd\x3f\ -\x4f\x73\x53\xac\x03\x10\x0d\x98\x6a\xa3\x07\x25\x4f\xe6\xf7\x64\ -\x00\x65\x1b\xb4\x5b\x79\x02\x79\x45\x07\xbc\x58\xeb\x36\x9b\x9f\ -\x57\xd3\xb5\x2a\xed\xad\xb2\xbe\x2a\x9c\x89\x98\x5d\xbb\xd7\xe7\ -\x7f\x25\xfa\x5b\x74\xfd\xaf\xcd\x0d\x58\x1b\xf3\x9a\x61\xf3\xd0\ -\xb7\x62\x43\x0b\x6e\x7c\x88\x65\x00\x8c\x01\xc8\x04\x1a\x7c\x6e\ -\x49\x87\xe5\x18\x1c\xb6\x07\x54\x3c\xfe\xcf\x32\xaa\xf4\x01\x12\ -\xff\x98\xe2\x33\xd9\xe6\x0f\x24\x7d\xb5\x3d\x5e\x45\xea\xff\x18\ -\x6f\xe2\x9d\x63\x47\xc5\x10\xb5\xf2\x5b\xbd\x3a\xbf\xaa\x9f\xb5\ -\xdd\xe4\x3a\x1f\x70\x06\x13\x56\xe9\x44\x3c\x54\xff\x67\x78\xf6\ -\xa8\xe0\x38\xfc\x8d\x06\xd1\x1d\x62\xf7\x5b\xc6\x8c\xca\x43\x89\ -\xc0\xf4\x69\xca\x4f\x52\xfd\x42\xcd\x6a\x5b\x6d\xa0\xaa\x8c\x07\ -\x6c\x93\xab\x2c\x8e\x8b\x6c\xf5\x3e\x52\x74\x56\xe9\xeb\x6d\x32\ -\x7e\x48\xda\xf3\x08\xf7\x4b\x2d\x59\xc0\x69\xd9\xfd\x70\x7d\x51\ -\x47\x40\xbf\x7f\xcb\xff\xd7\x8a\x0f\xce\x2b\xde\x6f\xb7\xd9\xff\ -\x9c\x96\xed\x8f\xf2\x93\x2d\xae\x37\x8a\xb8\x8f\xf2\x57\x32\x5c\ -\xfb\x81\x35\xf2\xce\xbb\xc4\x59\x7a\xbb\x68\xd8\x74\x10\x0e\xfb\ -\x3e\x78\x4f\x02\x70\x3f\x89\xf2\xff\xd0\x0c\xf9\x01\xb2\xa8\x03\ -\x04\x65\x7e\xbe\x8c\x05\xf0\xfc\xd6\x4e\x5b\xdc\xbe\xa3\xfc\x80\ -\x25\xaa\x23\x89\x67\x2d\x47\xf9\x3f\x45\x59\x93\xa2\xe5\x17\xc8\ -\xb7\xd9\xff\x38\x16\x48\xfa\x01\xc2\x25\x4f\xf6\x27\x5f\xb7\xd3\ -\x92\x41\xb3\xca\xee\x6f\x35\x64\x6f\xdf\xaa\x1b\x35\xcb\xdf\x31\ -\x23\xef\xdb\xd0\xf5\x67\xb7\x0b\xf1\xfc\xf8\xe8\x0d\x5f\x1b\xf1\ -\x7f\xf2\xd1\xb8\xd1\xa0\x78\x00\xaa\xd5\x29\xe3\x01\x0b\x4b\xe2\ -\x00\x14\x0d\x68\xb3\xab\x22\xfe\x5b\x8a\xc6\x96\x3c\xde\xcf\xb6\ -\xfe\x96\xef\x6f\x5c\xd9\xf7\x96\xc4\xfa\x97\x5a\x72\x80\xfc\x5b\ -\x25\xf3\x8f\xab\x3a\xa0\x76\x8b\xff\xb7\x62\x3a\xb0\xae\x6b\xad\ -\xd5\xe3\x0d\xf1\xdf\xe1\xbe\x05\x29\x4b\xe2\x3f\xf6\x01\x0e\x55\ -\x4f\x5a\xa3\x87\x74\xfd\xff\xcb\x03\xc2\xc1\x3d\x7f\x78\x0f\xea\ -\xff\xc9\xa1\xa6\x9b\x00\xfc\x4f\x07\xa6\xb9\xcf\xad\xc9\xf9\xac\ -\x9c\x0f\x28\x6b\x5a\x5a\x55\x4f\x56\xcd\xab\x58\x60\x2f\x17\xa0\ -\xe4\xc5\xf7\x30\x8f\x57\xb1\xe5\x6d\xf2\x80\xa3\x62\x80\xdb\x3e\ -\xc3\xad\x5c\x76\xce\x6d\x97\x7d\x3d\x65\x8d\x1f\xaa\x71\x6d\x32\ -\xfe\x50\x7d\x92\x70\xfd\x9f\xba\xfa\xae\xc0\xba\xd8\x6b\x51\xdb\ -\x7b\xbd\x20\xd9\x25\x76\xbe\x75\x34\x58\xbd\x1f\x79\x26\xc6\x54\ -\x51\x5f\x25\x7f\xa5\xcd\x17\x58\xf5\x6c\x80\x19\x53\xe2\xbf\x55\ -\xf6\xf8\xb1\xf2\xc9\x7b\xfc\xdf\xd3\xff\xa5\x0c\x60\x97\x5a\xfc\ -\xbe\x3d\x06\xd0\x2e\xb5\xf2\x7b\xec\xb6\x6b\x65\xef\x5f\x22\xff\ -\x57\x96\xe0\xbf\x17\xf3\xa7\x78\x3f\x0d\xb6\xbb\xa4\x24\xfe\xc7\ -\xc3\x8d\xc5\xd1\xb1\x59\x8c\xb7\x0c\x77\x7a\x91\x35\x5c\x34\x84\ -\xfb\xbb\x9f\x01\xfc\x7f\xce\xc5\x18\x80\xe4\x20\xc6\xd4\xce\x50\ -\x8f\xbb\x1c\xe5\xb3\x37\xa9\xb7\x65\x9a\x7a\x5b\xc8\x38\x20\xbb\ -\xd5\x37\x82\xf9\x55\xd9\x8b\xed\xcb\xa1\x5f\x4f\xda\xa8\x73\x8e\ -\xb2\x5d\xb1\xec\x9a\x77\x94\x1c\xd0\xb2\xff\xa9\xfc\x13\xef\x0c\ -\xca\x9c\x13\xd5\x6b\x84\xf3\x4e\x1a\x54\xeb\x1a\xe5\x91\x64\xa0\ -\xec\x26\x47\x4a\x7f\x05\xcf\xfd\x1c\xc1\x3d\xa8\x37\x2a\xec\xdd\ -\xbe\x55\x3c\x7b\x6c\xf8\xa6\xbb\x23\xbe\xe9\x53\x49\x83\xfb\x74\ -\x52\x6e\x15\xf9\x02\x5b\x7a\x80\xca\x09\xca\xd9\xad\xcf\x9c\xad\ -\xec\x71\x52\xbe\x52\x76\x00\x9b\x71\x3d\x67\x2d\x8d\xfd\xc9\xcb\ -\xf9\x71\xa5\x13\xa8\x98\x00\xbb\x65\x03\x60\xda\x50\xf6\x68\x80\ -\xca\xbb\x52\x39\x1d\x2a\xc7\xa8\xa5\xf7\xb7\xe1\x3f\xf6\x85\xb2\ -\xb1\x07\x20\x8c\x70\xdd\x8d\x8e\xdd\x81\x7d\xc0\x7f\x42\xac\x7f\ -\xad\x15\x0d\xeb\x0b\xe1\x3e\xb1\xf7\x9e\xb4\xef\x88\x9b\x0e\xde\ -\x4e\xfa\x3f\xca\x01\x68\x03\xc8\x23\xee\x93\x2f\x10\x63\xd9\xb8\ -\x8e\x7d\x5e\xc6\xad\x28\x7c\xcd\xcb\xbc\xd3\xac\x39\xe9\xc5\xf2\ -\x2e\x89\xed\x73\xd4\xb9\x55\x72\xab\xf2\xf9\x29\x59\xa0\x15\xfb\ -\x93\x93\x31\xb0\x59\xaf\xe7\x28\xf7\x22\xca\x5a\x5c\xeb\x1e\x6d\ -\x12\xf8\x0c\xc3\x89\x9b\x67\xe0\xb9\x47\xc4\x59\x7a\x64\x6f\x20\ -\xa0\x1a\x41\x3b\xc4\xc0\x4c\x34\x38\xfb\x3f\x63\x41\xec\x19\x22\ -\xe3\xaa\x65\x6e\x30\xd9\x01\xa5\x3f\x40\xd9\x00\x3c\xbc\x97\xb6\ -\x40\x8f\xff\xcb\x38\x09\x25\x03\x20\x9d\x1d\x6f\xf3\xfd\xe7\xad\ -\xa9\x33\xe4\xff\x36\x59\xc0\xcb\xfb\x29\x33\xfe\x87\x94\xbd\x46\ -\xf9\xfe\x65\x1c\xa2\xb4\xbb\x2c\xed\xef\x5c\x73\x93\xd4\xcb\xa9\ -\x4e\xf8\x8f\x7d\x0f\x12\x20\x97\x25\x46\x66\xbe\x2d\x38\xdf\x62\ -\xc3\xd9\x5f\x35\xac\x08\x9c\x5e\x21\xbe\x9a\x35\x66\x4e\x26\x7c\ -\xf3\x84\xff\xc8\xff\x33\xa4\x03\x34\xa8\xcf\x6d\x4e\xc6\x02\x28\ -\x7b\xb5\xb2\xff\xe1\xf9\x64\x1a\x20\xed\x7c\x36\xc7\xf4\xb4\xf2\ -\x7b\x54\x1d\x80\xa2\x97\x9b\x46\xb4\xc0\x9a\x92\xb4\xa2\xe4\xe5\ -\x12\x29\xff\x93\x57\xdf\x4b\xd5\xca\x0d\x56\xa9\xce\x0f\xc6\x26\ -\xa7\x02\x68\x87\x2e\x9d\x0c\x3a\x2f\xfc\x48\xa7\x17\x6d\x99\x40\ -\xfd\x96\x2c\xdf\x9f\x7d\x26\xe4\x6b\x9c\xc2\x77\x41\x5b\x60\x56\ -\xf6\x0c\x27\xde\x8f\x76\x40\xaa\x0d\xa0\x6a\x1c\xc8\x1c\x7b\xa7\ -\x15\x03\xdc\xb2\x9f\xb6\xec\xa8\xbc\x8e\xad\x78\xbf\x25\xbc\x5e\ -\xda\x09\xf2\x6d\x74\x60\xa9\xdf\xaf\xd2\xca\xb7\x26\xdb\x6b\x45\ -\xda\xfe\x19\xff\xd3\xed\xf2\x3f\xf6\x2d\x47\x9f\x3f\xf6\xfe\xc3\ -\xfe\x9f\xd8\xfb\x08\xfb\x80\x85\xa7\xff\x47\x88\xe0\x2b\x85\xee\ -\x01\xba\xd9\xc1\xd8\x22\xc4\x1d\xe9\xd1\x5b\xee\x1f\xf6\xdd\x49\ -\x3e\x00\xc4\xff\xb4\x1f\xe4\xff\x00\xcb\xdc\x5c\x0f\xa4\x26\xfb\ -\x5b\x57\x25\xaf\x2a\x2f\xe1\xff\x39\xa9\x83\xaa\xcf\x7c\xdb\xe7\ -\x92\xfc\x14\xa7\xec\xd1\x05\xe6\xff\x6c\x8f\xca\xa9\xde\x15\x5e\ -\xed\x9b\xaa\x8c\xf3\xe3\x3c\x3f\x8c\x4b\x4e\x06\x40\xee\x0c\x54\ -\x1e\xec\xda\xba\xff\x9d\x9d\x5e\xb4\x65\x82\x8a\x09\xbc\x21\x14\ -\x3c\xf4\xfd\x11\xdf\x1c\xd6\x29\xe1\xd8\xaa\x40\xd5\x93\x01\xb2\ -\x98\x17\x2c\x65\xfe\x6c\xbb\xec\x2f\xe5\x00\xcf\x37\xd2\xa6\x53\ -\xb5\xfc\x81\xa5\x25\x34\xa0\x65\xf7\x2b\x7a\x7c\x7f\x49\xac\x9f\ -\x1a\x2a\xe7\x27\xd4\xea\xb3\xb2\x94\xff\x73\x2f\x28\xc4\xff\x84\ -\xc5\x34\x20\x8e\xbe\x17\xb4\x65\x62\x0c\xb0\x55\xbd\xdf\xef\xff\ -\xcd\xeb\xe1\xfd\x52\x9d\x5e\x64\x0d\x17\x05\xbb\x61\xbc\x2c\x12\ -\x7c\xe9\xdf\x0f\x83\x0e\x90\xf0\x2f\x00\xae\xcd\xb8\xa9\x41\xac\ -\x63\x85\x35\xed\xb9\xb6\x76\x56\xda\xfe\xa8\x26\x00\xf2\x27\x4b\ -\xf9\xa8\x55\xec\x68\xb9\x0d\xd7\x5b\xfc\xc7\xe3\xfb\x76\x1b\x0d\ -\x08\x49\x1f\xb6\xca\xf9\x97\xb9\x2f\x9c\x73\xc6\x35\xb1\xc9\xe7\ -\xec\x48\x7f\x3f\xd6\xf7\x82\xe7\x49\x80\x0c\x10\xf7\xd5\x81\xef\ -\x88\x37\x74\x7a\xd1\x56\x00\x5d\xdd\x42\xbc\x68\xc4\x79\xed\x5d\ -\x11\x03\xd6\x56\xd6\x0a\xcf\x20\xfe\xab\x9e\xe1\x96\xb4\x03\xda\ -\x2d\xfd\xa7\x15\x8f\xa7\x70\xff\x0c\x39\x40\xc9\x55\x52\xdf\x52\ -\x7e\x01\xe6\xfd\xa5\x25\x31\x7e\xed\xb9\x80\x2d\x5b\x80\x92\xff\ -\x65\x2c\x87\xb2\xbd\x2c\xe9\xef\xce\xf6\x7f\xec\x55\x8c\x36\x00\ -\xa4\x01\x31\xcc\xbb\x82\xdf\x27\x9c\xea\x03\xe1\xf0\x1b\xde\x27\ -\xc4\x86\x8b\xbf\xd2\xb0\x32\xd8\x06\x23\xde\x2b\x7a\xeb\xa3\x46\ -\xe5\xd1\x84\x0f\x63\x00\x9a\xe4\x03\xc4\x38\xc0\xac\x8a\x03\x90\ -\xbd\x1f\x72\xb2\xc7\xf4\x92\x1c\x00\xa5\x9f\x7a\xe7\x51\xe1\x76\ -\x69\x89\xdc\xbf\x34\xe7\xbc\x24\xe3\x7d\xd4\x3d\xb8\xb6\x00\xf7\ -\xc9\xae\x52\x6f\xab\xa4\x21\xeb\x7c\x00\xce\x24\xfc\x18\x4b\x37\ -\xed\x5e\x69\xd7\xef\x83\xe7\xbd\xae\xd3\x8b\xb6\x42\xa0\x1a\x41\ -\x23\xf6\xd4\xc3\x23\xc6\xdc\x62\x52\xfa\x02\xb2\x41\x55\x1f\x48\ -\xe6\x04\x29\x3b\x60\x5b\x2c\x6e\x2b\x2f\x4f\xd5\xe8\x2a\xb5\xd6\ -\xb8\x3d\x1e\xc8\xcb\x05\x6c\xf9\xfd\xb0\xfe\x6a\x7b\xfc\x4f\x2b\ -\x57\xa0\xbd\xe6\x52\x45\xd2\xf0\x76\xfe\x5f\x93\xba\x3f\x8c\x10\ -\xe3\x3f\xd9\x00\x4c\xd4\x01\x60\x5f\xd8\x56\x70\xdc\xbf\xef\xc5\ -\xa8\x87\x5d\xd1\xe9\xc5\xd5\x70\x51\x80\x39\x73\x7d\x5b\x85\x38\ -\x10\x09\x1d\xfe\x66\x6c\xff\xac\x1b\xf7\xa3\xbc\xdd\x74\xd3\x14\ -\x07\x04\x3c\xd8\x5f\x93\x36\x40\xd5\x13\x40\xd9\xaa\x59\x77\xcc\ -\xcb\x3c\x95\xbc\xaa\x49\xeb\x14\x3d\x19\xb3\x3d\x2e\xa5\xa5\x17\ -\xb4\xea\x4e\xa8\xde\xf4\x59\xd5\x67\xc2\x96\xbc\xdf\x66\x7f\x33\ -\xc5\x9c\x1b\x0d\xaa\xf1\x97\xf1\xcf\x1e\xbf\x22\x59\xfe\x3c\x3c\ -\xef\xaf\x75\x7a\xd1\x56\x08\x54\x23\xc8\x09\x5f\xff\xa5\x70\xe0\ -\xae\x13\x71\xaa\x57\x8c\xbe\x00\xd9\x33\x5c\xd5\x05\x30\xd9\xff\ -\xc7\x75\x41\xca\x1e\x1d\x50\x35\x3f\x3c\xf9\x5f\xae\x73\xb6\x4d\ -\xc6\x6a\xd7\x05\xda\x87\x8a\x19\x68\x9f\x53\xbe\xff\x76\xf9\x3f\ -\xd7\x26\xfb\xb3\xef\xbf\xce\xbd\x60\x9d\x3a\xc5\xff\x12\xfe\xa3\ -\x0d\x80\xe3\xaf\x30\x0f\xf1\x7e\x50\x6d\xb4\xfc\x7f\xf9\xc0\xb3\ -\xa3\x89\x37\x54\x22\x83\x0b\x6e\x14\x6b\x81\xf8\xa6\x29\x0e\x80\ -\x71\x5f\xda\xff\x64\x3d\x10\xc5\xa3\x72\xca\x46\x65\xb7\xec\xd4\ -\x8f\xd7\xf7\xdb\x74\xd2\x90\xca\x5b\x69\xf9\xb4\x5b\x75\x85\xab\ -\x32\xcf\x47\xd2\x00\x19\xeb\x8b\x34\x20\x19\x80\xb3\x17\xa8\x00\ -\x2d\xaa\xfc\xd3\xd6\x6d\x63\x7f\x26\xd8\xf6\xbf\xd9\x20\x05\x34\ -\xe0\xfa\xe1\x20\xd5\x08\xe2\x58\x00\xa4\xa7\xd2\x0e\x88\x32\x00\ -\xd9\x00\x65\x7d\xb0\xdc\x99\x3a\x40\x1b\x0d\x50\x7e\xc0\xbc\x67\ -\x5f\x95\x9f\x76\x9b\x1c\xe0\xd9\xfa\x8a\x67\xd0\x82\x96\x3c\xe6\ -\xd1\x00\x65\xfb\x97\xf9\x16\x8c\xff\x35\x1a\x49\x15\xff\x87\x7c\ -\x1f\x3e\xe3\x06\xca\x04\xc5\xc5\xf1\x78\xf9\x5b\xf0\x4e\x58\x6b\ -\x59\xe7\x00\x5c\x1e\xb0\x1f\x54\xd5\x3f\x0a\x0f\x22\xef\xc7\x5c\ -\x60\x90\x03\x86\xea\x6c\x07\x04\xf9\x3b\x1d\x90\xba\xbf\xd9\x26\ -\xff\x2b\xbe\xe1\xe1\xff\x52\x7b\x9f\xa2\x01\xed\x31\xe9\x2a\xd7\ -\x94\xea\x7e\x7a\x75\x27\xd4\xd9\x93\xfd\xc6\x49\xe6\xe7\x1a\x84\ -\x44\x03\xb0\xc6\x9f\x7f\xd2\x4d\x18\x9f\xf8\x18\x3c\xe7\xd3\xc4\ -\xc6\xf6\xfb\x9d\x0b\xbc\x1a\x41\x61\xdf\xec\x69\x8c\x07\xa2\x78\ -\x80\x00\xd7\x05\xa2\x9e\x81\x46\x89\x64\x80\x56\x4d\x00\x69\x67\ -\x71\x5a\x35\xbf\x14\x0d\xc8\xaa\xb8\xe9\x25\xeb\xbd\xb4\x0e\x40\ -\xab\x1e\x50\x3b\xef\x57\xf8\x5f\xf6\x68\x80\x47\xc7\xcf\x90\xff\ -\xd9\xff\xaf\x70\xbf\x4e\x76\xc0\x04\xd5\xff\x9e\x3a\x99\xc9\x50\ -\xfc\xdf\x98\xe8\x4c\xbd\x25\x0d\x6b\x0f\x5b\xb7\x0b\xf1\x3c\xc3\ -\x38\xfc\x0f\x29\xd0\xb5\x13\xfe\x59\xd2\x01\xb0\xbe\x5e\x96\xea\ -\xd9\x49\xfe\x2f\xfb\x02\xa9\x9e\xa0\x8f\xe3\x4d\xa1\xf2\x12\xfb\ -\x3f\x8f\xf6\x5a\x55\x6d\x75\x3e\xbd\x3a\x42\x32\xd6\x0f\xf1\xdf\ -\x91\x75\xa6\x64\x9e\x3f\xd6\xfa\x02\xde\xbf\x08\x78\xf2\xb0\x3f\ -\xf8\xca\xdf\x17\x44\xa7\x36\x25\x78\x35\x82\x22\x81\xe9\x87\x28\ -\x9e\xc6\x94\x32\x00\xf9\x02\x94\x3f\x90\x71\x5e\xd9\x00\xbd\x3c\ -\xc0\x36\xf9\x7f\xe9\xcf\xad\xbc\x40\xea\xb9\x7e\x36\x1d\xe0\x0c\ -\xfc\xcf\x2f\xa1\xd5\xad\x38\x23\xd5\x8f\x80\x78\xbf\xcc\xfb\x21\ -\xfc\x47\xfe\xef\x30\xff\xa7\xde\xc5\xe1\xe2\xb7\x83\xe1\x3f\x2d\ -\x8b\x0d\x1c\x7f\xad\x61\x55\x10\xdd\xef\x3c\xf7\xf5\x63\x83\xf3\ -\x6e\x74\x68\xce\x4d\x61\x3d\x00\x7f\x93\xf1\x5f\xf9\x01\x4d\xd5\ -\xcf\xaa\xda\x16\xa7\xd6\x16\xab\x1a\x2a\xb7\x7c\x53\x32\xbe\x57\ -\xe9\xfe\x6c\xf3\xaf\x78\x67\x2e\xaf\x6c\xfe\x5e\x2f\x8c\x5a\x2b\ -\xcf\x9c\x74\x7f\xac\xa1\x03\x3c\x27\x50\x7a\x24\x12\xb8\xed\xf3\ -\x62\xab\x78\x76\xa7\x17\xe8\x22\x01\x48\xac\x98\x18\x89\x7c\xf8\ -\x3f\x1c\xdf\xf4\xa9\x04\xc5\x04\x56\xe9\x1d\x51\x06\xe0\x58\x80\ -\xb2\x67\x0b\xcc\x79\x34\x40\xf9\x46\x5b\x71\xd4\xed\xbe\x80\xf6\ -\xf8\x4b\xcf\xb6\x2a\xed\x80\xb9\x25\x7e\xc0\xf6\x98\x80\x96\x0d\ -\xa0\xe5\x7b\xad\xc8\x1a\xcb\x35\xb2\xbf\x12\xfd\xa5\xb8\x9f\x1a\ -\xf1\x7f\x1a\xd8\xb3\x38\x3c\xf9\xf7\x40\x86\x5f\x2a\xd8\x77\xa4\ -\xe1\xf2\x81\x81\xad\x42\xfc\x74\x74\x70\xee\x64\xd2\x3f\xbf\x88\ -\xf8\x4f\x36\x40\x8c\x05\x36\x64\x0c\x00\xf5\xeb\xab\x2d\xcd\x5b\ -\x71\x5a\xb6\x69\x65\x93\x6a\xc9\xf7\xca\x4f\x55\x6a\xf3\x39\xcb\ -\xba\xdf\xb2\xa7\x0f\xe7\xf9\xd5\x5a\x35\xa6\x65\x9d\x8f\x14\xe0\ -\x43\xca\x87\x3a\x71\xe9\x07\xfb\x07\x5e\xf7\x76\x78\xbe\x74\xa7\ -\x17\xe8\x22\x81\x6c\xad\x7d\x62\xcf\xd4\x88\x31\x7d\xef\xa8\x1f\ -\xe3\xe9\x38\x26\x90\xe4\xab\xb6\x78\x80\x9c\x94\x01\x94\x9f\xd5\ -\xcb\xb7\xf4\xf4\xff\xf6\x7c\x8a\xd6\xa7\xf2\xab\x2a\x9a\x9b\xf3\ -\xfa\x03\x94\xce\xa0\x07\x4b\xf1\xdf\x93\xff\x25\xfe\x23\x9f\x67\ -\xbd\x9f\x6d\x80\xcc\xfb\x29\xfe\xca\x4d\x8d\x7c\xe4\x76\xc1\xfd\ -\x9c\xb7\x77\x78\x3d\x35\xac\x3d\xd8\xa1\xc1\xf9\xef\x66\x86\x16\ -\x1e\x4b\x63\x2c\x20\xd6\x03\x97\x71\x00\x39\x43\xd6\x03\xb1\x64\ -\xae\xaa\xb4\x53\xe5\x3d\x3f\x55\x4b\x1f\x55\xe7\x71\x5c\xe5\x00\ -\x29\xdf\xa0\x97\x33\xa8\xea\xdd\xb4\x74\xff\xb4\xac\x31\x9b\xb6\ -\xb8\xd7\x44\x2a\x80\x3d\xc9\xca\xa7\xc7\x23\xb7\xfc\x17\xa8\x27\ -\x3f\x23\x2e\x93\x7a\x53\x80\x34\x3f\x37\x16\xb9\xf9\x33\x23\xe6\ -\xec\x63\x69\xd9\xbf\x90\xf4\x2a\xe9\x07\x2c\x58\xb2\x1f\x52\xbb\ -\x0c\xe0\xa8\x5a\xab\x2a\x8f\xba\x74\xc6\xba\x96\x38\xfe\xb2\x3d\ -\x36\xa0\xcd\xee\xa7\x62\x32\x79\x94\x5b\xd7\x2a\xfe\xc7\xe3\xff\ -\x35\x2f\xfe\x82\xea\x7e\x48\x5f\x0c\xe1\x3e\xc5\x00\x14\x4f\x47\ -\x46\x3f\x70\x1b\xbc\xc6\x4e\xc1\x3a\x8d\x86\xcb\x0b\xfc\x61\xdf\ -\xd4\x67\xaf\xf0\x2d\x3c\x9c\xf1\xab\x5a\x20\x58\xc3\x0e\x6b\xd9\ -\x37\xa8\xa7\x25\xd7\xaf\xab\x79\x35\xec\x1e\x8f\xff\x92\x07\x79\ -\xb8\x2f\x75\xd0\xb0\xaa\x1b\xd2\x6e\x3b\xe4\xbe\x3e\x19\x2f\xd7\ -\xa7\x4e\x7a\x71\x9a\xfc\x63\xd8\x4b\xab\xf4\x50\x34\xf4\xa1\x2f\ -\xc0\x73\x45\xc4\xe5\x73\xde\xfa\x61\x99\x6f\x18\xb5\x6e\xbd\x3f\ -\x1a\x9c\x71\x13\xc1\x3a\xc5\x39\xab\x58\x20\xaa\x0f\x64\xcb\x7c\ -\x00\xcf\x16\x40\x72\x90\x67\x67\xf5\xea\x00\x2b\x3a\xd0\x9e\x5b\ -\xd9\x5e\x13\xdc\xc3\xff\xd6\x68\xb7\x01\x8e\x87\x5b\xfa\x98\xaa\ -\xd7\x4c\x76\x3f\xab\x55\xf7\x07\x73\x7f\x31\x16\x03\xf7\x27\x1d\ -\x2a\x3d\x60\x3a\xaf\x7a\x9b\xb8\x7c\xf6\x42\xc3\x52\xd8\xe7\x38\ -\xef\xb8\x35\x33\x78\xfb\x83\x69\x8c\x03\xf4\x73\xde\x4d\x0e\x46\ -\x3e\x58\x97\x39\x6b\x35\x96\x53\x65\x2e\x80\xca\x07\x5e\x12\x9b\ -\xe6\xe5\x03\x2f\xed\x2f\x95\x73\x5a\xb1\x3e\xdc\x4b\x56\xea\xff\ -\x18\x6b\x2a\xfb\xfa\x50\xcc\x4f\x80\x6b\xfe\x80\xec\xfa\xef\x5d\ -\xdb\x9e\x82\xe7\x6d\xb3\xda\xfd\xce\x0a\x58\x23\x28\x36\xfc\xde\ -\x4f\x45\x02\x73\x14\x53\x8b\xf9\x95\x98\x63\x45\xb5\x01\x31\x1e\ -\xd8\x64\x3f\x7d\x56\xc6\x03\xb4\x72\x82\x97\xea\xfb\x5e\x1d\x35\ -\x69\x6f\x69\xd7\x03\xd0\xee\x9a\x93\x75\x80\x95\x1d\x66\x89\x2d\ -\xd0\xf3\x03\xa8\xf8\xff\x32\xd7\x59\xf7\x86\xdc\x13\xf9\x99\x23\ -\xd9\xa0\xf4\x7f\x7b\xfa\xc2\xbf\xdf\xe9\xf5\xd3\xb0\x6e\x30\x30\ -\xb0\xff\x79\x7f\x9e\xf6\x2d\xdc\x8f\xf8\xdf\xe2\xff\x75\xee\x65\ -\x61\x72\xfe\xaa\xca\x5b\x53\x3a\x00\xf3\x26\x69\x97\x6a\xc3\x7f\ -\xae\x01\x50\x6c\xd9\x08\xbc\x78\x93\x1a\x9f\x27\xbb\xea\xf1\x9c\ -\xb4\x94\x31\xa9\xbe\xe7\x10\xda\xc1\xa6\x4f\xa5\xc7\x3e\x82\x75\ -\x66\xb0\xa7\xe7\x46\xce\xf5\x5d\x0d\x44\x77\x0a\xdf\x5b\x22\x81\ -\xca\x43\x29\x6b\xf6\x34\xd5\x08\x44\x1f\xa0\x59\x93\x79\x81\xaa\ -\x1e\x40\xc5\xf3\xb3\xa8\x38\x5d\xd5\x6b\x41\xd1\x55\xaf\xa7\x4a\ -\x5b\x0c\xa6\xf2\xb7\x78\x75\xc2\xcf\xf0\xcd\x16\x3c\x79\xa1\xe5\ -\x8b\xc9\x52\xed\x2f\xd5\x77\xbc\xea\xc9\xff\x64\x03\xa0\xb8\x0f\ -\x78\xbe\x70\x03\x6b\xae\x5e\xaa\x1e\xeb\x1a\x2e\x3d\xec\xec\x11\ -\x3d\x7f\x90\xf4\x95\xbe\x9b\xf2\x2f\xb8\x19\x3f\xe7\x02\x23\xff\ -\x57\xf8\x4f\xbd\xad\x51\xfe\xf7\x6a\xd7\xaa\x38\xb2\x33\xed\xd1\ -\x2d\x19\x95\x7e\x0e\xb7\xe5\x99\xb4\xc5\xfa\x67\x54\x8d\x39\x29\ -\xfb\xa7\x0c\xd2\xfb\x81\xee\x54\x1f\xb0\x8c\x97\x7e\x58\x5c\xa6\ -\xba\x26\xd6\x08\x1a\x8d\x7c\xf8\xeb\xc3\xfe\xbb\x1e\xc5\xbc\xfa\ -\x94\x21\xeb\xab\xc8\x3e\x01\x05\x4b\xe1\x7f\xb9\x2d\xe7\x5a\xd5\ -\x5b\x59\x2a\x5b\x15\x64\x3e\xb5\x87\xd7\x8e\x8a\xfd\x2f\x7b\xf2\ -\xff\xb8\x27\x17\x94\xbd\xdc\x4b\xd5\xaf\x85\x6b\x35\xb7\xf2\xff\ -\x55\x0e\x56\x46\xd9\x01\xcc\x2a\xe5\x00\x5e\x11\xaf\x7e\x09\x1e\ -\xfd\xb9\x9d\x5e\x3b\x0d\xeb\x06\x7d\xdd\x42\xbc\x38\xe3\xdc\x76\ -\x5f\x1a\xf1\x3f\x30\x43\xf8\x9f\xf5\x63\x0d\xfb\x86\x3b\x4e\xbc\ -\xbf\x06\xf8\x5f\x5f\xda\xcf\x4e\xc5\x03\x5a\x45\xaf\x9e\x2c\xe3\ -\x7b\x9b\x6f\x30\x5c\xf5\xfc\x7d\x5c\xd7\x4b\xf1\x7f\x19\xeb\x87\ -\xb2\x26\xd6\xf7\x09\xd4\x65\x9f\xea\xc9\x2f\xc2\xf3\xbc\x5a\x5c\ -\x86\xb8\x2f\x21\xd7\xb3\x35\xf8\xbe\x88\xbf\xf6\x00\xe6\x38\xa4\ -\x4d\x8e\xb1\xe2\xfa\x60\x15\x29\x5f\xb5\xec\xac\xec\x0b\x54\xf5\ -\x12\xd4\xba\x72\x2d\x05\xae\xa7\x50\xf2\xfc\x2c\xe3\x6d\x31\x18\ -\xaa\x36\xb0\xf2\x09\x8c\x87\x5b\x71\xd8\x05\xd9\x77\x81\xeb\xb4\ -\xb7\x6c\x00\x19\x19\x8f\x91\x96\x76\x80\xac\xc5\x3e\xc1\xc2\xd8\ -\xa1\xbf\x80\xe7\xce\x74\x7a\xe1\x34\xac\x1b\xa0\x8f\x2a\xb6\xa7\ -\xf7\x45\xc7\xb2\x81\x79\x37\x1b\x9c\xa5\x5a\x80\xc8\xff\x73\xbe\ -\x9a\x3b\x61\xd4\x65\x4f\xcb\x1a\xd5\xb0\x53\x35\x2c\x0b\xaa\x26\ -\x80\x8c\x07\xf6\x7a\x79\x78\xb1\x01\xaa\xbe\x87\x1c\x5e\x8c\x09\ -\xe3\x3f\xeb\xfe\x6c\xf7\x4b\x07\x2a\xee\x38\xe8\x13\x81\xc1\xdf\ -\x7d\xb3\xb8\xbc\x6b\xcc\x61\x4c\xe0\x55\x8e\x73\xf0\x5f\xc7\x8c\ -\xf9\x93\x49\xac\xb7\x82\xb5\xd6\x40\xf6\xc1\xfa\x40\xe3\x88\xfb\ -\x18\x13\xe8\xf9\x00\x55\xae\x74\xc9\xa3\x03\x05\x59\x3b\x2d\xa7\ -\xec\xad\x4e\x8b\xbf\xb7\xe2\xb0\x5a\xbc\x5f\xe5\x5e\x92\xdd\x4f\ -\xc6\x02\x65\xa5\x6c\xc6\x7d\x7f\xa4\x2d\xd6\x51\xb1\xd8\x6c\x0b\ -\xc4\x7a\x8c\x13\xe1\x9a\x3b\x36\xf2\xa7\x15\xa1\xfd\xfe\x97\x3b\ -\x98\x70\x2e\x3f\x93\x0e\x4c\x1f\x4f\x07\x66\xb9\x16\x20\x8c\x42\ -\xb0\x01\xf8\x0f\x32\x80\xc2\x7f\x55\xcb\xde\x6e\xf3\x07\x2a\x5f\ -\x80\xd7\x4f\x4a\xe5\xae\x56\x5b\xc3\x5e\x2a\xf3\x67\x2c\xf5\x59\ -\xa7\x5a\xf9\x19\xa3\x7c\x32\xe9\x1c\xba\x5b\x74\x8b\x6b\x05\xd5\ -\xd3\xbf\x6c\x41\xc6\x04\x76\xdf\x68\xfa\xa6\xef\x89\x61\xcd\x55\ -\xf4\xaf\x9a\x35\xd9\x2f\x50\xad\x6f\xc5\x5b\x5f\xae\x9f\x50\x65\ -\xf9\x5f\xc5\xfb\x87\x2b\xde\xb5\xea\xe7\xd1\x9e\x6f\xd1\xa2\x09\ -\x65\xe2\xfd\x9c\x83\x21\x75\x89\x48\x5b\x1e\x87\x27\xfb\xcb\x9e\ -\xe4\x26\xd3\xe7\x64\x10\xfb\x91\x4e\xb9\x85\x91\xca\xb7\xfb\x07\ -\x62\x58\x7b\x61\x23\xd6\x5c\xd6\xb0\x76\xb0\x7f\x7b\x97\x78\x47\ -\xde\x2c\x7d\x23\xe5\xbf\x93\x74\x80\xac\xbf\xe9\xe6\x61\x8c\x4b\ -\xfc\x1f\x37\x65\x6f\x6b\xec\x0f\x06\x32\x40\x81\xe4\xd4\x56\x2f\ -\x3b\x96\x25\xcb\xb2\x87\xa7\xec\xe7\x15\xaa\xb5\xe1\x7e\xd5\x8b\ -\xef\x55\x7e\x3f\xce\x8b\xaf\xbb\x57\x44\x8a\x0f\x1a\x81\xeb\x3e\ -\x01\xcf\x71\x55\xa7\x17\xe2\x12\x40\xff\x0e\xd0\xa7\x47\x42\xb7\ -\x7e\x66\xc4\xbf\x70\x2a\x25\x73\x82\x30\xd6\x9a\xfa\x05\xc9\x7e\ -\x81\xaa\x3e\x48\x7b\xce\x75\xb6\xcd\x1f\x90\x0b\x4b\x9b\x40\xa8\ -\x5d\x0f\x68\x8b\x07\x92\x63\x3c\xac\x62\xb4\xdb\x6a\x8b\x7a\xb9\ -\x05\x15\xd9\x77\xa9\x95\x8b\x41\x7a\x1a\xc5\x64\x4d\xba\x57\xc4\ -\x26\xff\x16\x9e\xf7\xe5\x9d\x5e\x30\x0d\xeb\x0e\x58\xd3\xf1\xb9\ -\xf6\xe0\xef\xfe\x75\xdc\xb7\xe0\xa6\x7c\x73\x6e\xc6\x37\xed\xe6\ -\x03\xd3\x6e\x01\x75\x73\xa3\xce\x34\xc0\x62\x3b\x40\x4e\xc6\x03\ -\x53\x4f\x7b\xc9\xe3\x15\xde\xb7\xf8\x7e\xcd\xcb\xef\xa5\xd8\x52\ -\xaf\xa7\x8c\xf4\xf5\x63\x5c\x31\xe5\xc3\x54\x17\x9f\x1c\x3d\x74\ -\x8f\x78\xe2\xe4\x96\x51\x8d\xa0\xbe\xee\xf1\x0f\x87\xfc\xa5\x07\ -\xb0\xf6\x4a\xc6\x68\xc8\xbc\x40\x8e\x0b\x2e\xa8\x5e\x81\x56\xab\ -\xee\x32\xc9\x01\xd4\xaf\x9b\xf5\x81\xf1\x48\xc5\xcb\x0b\x6e\xe5\ -\x58\x32\xae\x8f\x47\x54\x9f\xb0\x76\xdf\xa0\x8a\xdb\xac\xc8\x1a\ -\x63\xdc\xa7\x35\x2b\xeb\xff\x67\x3d\xfd\x9f\xeb\xbe\x25\x8d\xdb\ -\xdc\x54\xe4\xa6\xc3\xf0\xac\xcf\xe8\xf0\x7a\x69\x58\x7f\xc0\x9c\ -\x2e\xbf\x10\x7b\x6b\x09\x8c\x49\xf3\xcf\xba\xb9\xe0\x0c\xd5\x02\ -\x29\x80\x8e\x3a\x1e\xac\xbb\x13\x56\x83\x7a\x59\x16\x64\x5d\x70\ -\xea\x11\x24\xf1\x3f\x63\x55\x3c\x1d\x9f\xe3\x7a\x2b\x5e\x5e\x6f\ -\x46\xfa\x92\xa8\x9f\xa4\x2d\x73\xfc\x64\x6d\x6f\xcc\x83\xb9\x2a\ -\xd2\x38\xe1\xf7\xfd\xf1\xac\xe0\xda\xd2\x4f\x94\xdc\xb2\x2e\xd0\ -\xb7\x5e\x3d\x16\x9e\xfc\x22\xe6\x5d\xa6\xad\x19\xaa\xbd\x8e\xb9\ -\x81\x14\x6f\xa5\x74\x2c\xa9\x67\xe5\x65\x9d\x40\xd2\x03\x54\x1d\ -\x1f\xd9\x83\xb9\x55\x73\x1d\xf1\x9e\x07\xdb\xfd\xca\xad\xfc\x6b\ -\x19\x9b\x9d\x0d\xb1\x4d\x96\xf0\x3f\xa4\xfa\xfd\xb5\x6a\xb0\x65\ -\x65\xef\x3f\xec\xff\x7e\x05\xe8\xfe\x83\x83\x2f\x78\xab\xd8\x9c\ -\xb9\xd7\x1a\x56\x06\x68\x03\xec\xd9\xb9\x55\x5c\x1f\x75\x4a\xc7\ -\x52\x81\x23\xc0\x87\x66\xa9\x1e\x78\x3e\xd8\x60\xfe\x8f\x03\x68\ -\x40\xc1\x6a\x32\x0d\xb0\x65\x5e\x80\x87\xf3\xb2\x77\x17\xf5\xed\ -\xac\x49\x39\x5f\xc5\x95\x2a\x5f\x9f\xa4\x03\x74\xc6\x31\xcf\xa8\ -\x0c\xb2\xff\xa1\xef\xc3\x77\xbf\x08\xc6\xae\x0e\xaf\xc1\x25\x05\ -\xc0\xff\x71\xc7\x78\xd9\x0d\x63\x92\xff\x67\x54\xdd\x55\xcc\x0d\ -\x94\x39\x17\x2a\xe6\x92\x6d\x01\x2d\x7b\xc0\x12\xdf\xab\xd2\xf7\ -\xc3\x4a\xdf\x6f\xcb\xb7\x6e\x8f\x1b\x54\xb1\x18\x61\xd5\x6f\x5d\ -\xf6\x5c\xf5\xfa\x2e\xd6\x69\x60\x0e\x46\x26\x54\x7e\x2c\x3f\x56\ -\xbb\x1f\x1e\xf3\xb7\x84\xae\xf7\xfd\x44\x82\x6b\xed\xc1\xd7\x7c\ -\x32\x11\xbc\x13\xce\xe4\x3c\xd9\x01\xb1\x26\x78\x5e\xea\x00\x18\ -\x0f\x3c\x0e\x78\x4b\xe7\xd3\x92\x3c\x1c\x87\xcd\xb9\x3c\x2a\xa7\ -\x47\xe5\xf5\x65\x65\x1c\x39\xe3\xbd\xea\x2b\x57\xa3\xfa\x62\x69\ -\x7f\xd9\x9d\x70\x4a\x3f\xcc\x87\x6e\xfa\x1b\xc1\x7d\xa5\x9e\x68\ -\x36\xa6\x5d\xbd\x42\xbc\x24\xe4\xaf\x1c\xa3\x9a\x4b\x68\x0b\xc4\ -\x5a\x81\xf0\x73\xc1\x56\x3d\xd8\x54\x0d\x76\x89\xff\xb2\x27\x3b\ -\xd1\x03\xd5\x87\xbd\x2d\xc7\xaa\x20\xfb\x32\xa3\x6c\x80\x76\x41\ -\xcf\x3e\x28\xff\x1d\xf5\x5a\x0a\x57\x3c\xde\xef\xe1\x3f\xda\x69\ -\x08\xff\x31\xff\x92\xe4\x8a\x47\x33\xb1\xc9\xaf\x80\x34\xf6\xbc\ -\x4e\x2f\x92\x86\x4b\x0a\xe9\xed\x62\xeb\xbb\x12\x56\xe3\x54\xce\ -\xba\x73\x31\x0b\xfa\x7f\x0e\xce\x65\xde\x98\x76\x0b\x46\x93\xec\ -\x7f\x79\xf4\x57\x99\xaa\x47\x58\x83\xfb\xf4\xc8\x5e\x9d\x19\xec\ -\xd9\xab\x6a\xf8\x9a\xaa\x7f\x6c\xcd\xcb\x2b\xc5\x3c\x3f\xcc\x7d\ -\xc3\x9e\x18\x05\xab\xb6\xf8\x94\xb1\xc9\xaf\x8a\xad\xe1\xff\xd3\ -\xe9\x97\xee\x14\x00\xc1\x7b\xda\xe8\xf0\x27\x66\x31\xef\x2a\x03\ -\xf2\x56\x3a\xc8\x72\x00\xda\x45\xb2\xb2\xff\x4a\xce\xae\xcb\xda\ -\x0b\x55\x90\xcb\xeb\x5e\xff\xc0\x42\xa4\xe6\xc5\x61\x23\x8e\xa3\ -\x7f\xaf\x20\x6d\x03\x44\x0f\xda\x6b\x2d\x2a\x9f\x8c\xe2\xff\xaa\ -\xef\xaf\x2d\xe5\x7f\x85\xff\x16\xd7\x2a\x1f\x1f\xae\xfd\xd8\x30\ -\x6e\xba\x0b\x1e\x50\xeb\xfe\x4f\x30\x00\x05\xfc\x17\xc6\x9c\xf7\ -\xfc\x5b\xc6\xfa\xd4\xa3\x59\x63\x8e\x6a\x82\x92\x0c\x80\xc3\xc0\ -\x7c\xa0\x26\x9c\xc1\x69\xf2\x5b\x73\x8f\xae\x26\xf1\x2d\xf2\xe7\ -\xc9\x1a\x17\x9c\xcb\xdf\xe0\x3c\x72\xe0\xfd\x14\xe3\x87\x7c\x1f\ -\xe9\x04\xe5\x14\x54\xdc\x09\xbb\xfc\x3d\x33\xf0\x5b\x37\xc1\x57\ -\x06\x3b\xfd\xce\x1d\x84\x67\xc7\x42\x6f\xfa\x3c\xd6\x5c\x4a\x62\ -\xde\x25\xac\x2d\xca\x01\x68\x0b\xc8\x1b\x75\x59\x87\xad\xce\x71\ -\xb8\x0e\xd3\x81\x3c\xf5\x65\x56\x3d\xd9\xdb\xfa\x32\xcb\x58\x81\ -\x82\xec\xa7\x9e\x97\x35\x3e\xf2\xf2\x5a\xf5\x59\xce\x38\xaa\xe6\ -\x7f\x99\x78\x7f\x5a\xe6\xff\xaa\x9e\x8b\x29\xa0\x3f\xf9\x48\xe3\ -\x21\xd3\x7e\xef\x3c\xe0\xff\xd3\x3a\xbd\x40\x1a\x2e\x39\x5c\xd1\ -\xd3\xe5\x7c\x2c\x63\xd7\x8f\xa7\xcd\x19\xee\x07\x84\x71\x2a\x98\ -\x0f\x64\xb0\x8e\x9a\xb7\x9a\x12\xff\x25\xee\xe3\xb9\xf5\xfa\xc5\ -\xc2\xcf\xd4\x37\x0a\x6b\x48\x34\xb8\x96\x94\x21\xed\xfd\x16\xdf\ -\xe3\x8a\x70\xc9\x7d\x52\xf8\x23\x68\xf3\xfb\x25\xf1\xc4\x93\xfb\ -\xdb\xe1\x1a\x63\xf0\xe7\x3f\x1d\x0b\xcc\xbb\x31\x5f\x9d\xf2\x02\ -\xd3\xe6\x2c\xc8\x02\x58\x7f\x81\x07\xd1\x00\xd4\xb7\x1c\xee\x85\ -\x4a\xf5\x18\x65\x4d\xe6\x7c\xa8\xde\xca\x11\xf0\x72\x05\x24\xbe\ -\xcb\xd8\x3e\xc6\x7d\xf6\xcd\xe4\xc3\x1c\xeb\x83\x3d\x3f\xd3\x16\ -\xe2\x7f\x8d\x06\xd7\xff\x00\xb9\x03\xfb\x2e\xc2\x1e\x25\xac\xe9\ -\x13\xb1\xc8\xad\xff\x0c\xcc\xe0\xe7\x3b\xbd\x40\x1a\x2e\x39\x18\ -\xbd\xdd\xe2\xc5\xf1\x48\xf1\xbe\xb8\xb1\xe0\xa6\x55\x3c\x70\x80\ -\x73\x82\xf9\x4c\x36\xd8\x66\x85\x03\xe9\x80\xd5\xa4\x9a\xfd\x14\ -\xd3\x8a\xf5\x3b\xb1\x67\x84\x51\xf7\x7a\xc8\xe2\xc8\x28\xba\x11\ -\x2c\x9f\x7a\xd2\xe8\xd4\xbd\xa2\x67\x0c\x73\xca\x9e\xe8\xfd\xa4\ -\x27\xba\x45\xef\xcd\x71\xe3\x08\xd0\xcb\x19\xe0\xbd\xd3\xc4\xff\ -\xb1\x0e\x6b\x06\x6b\x30\x10\x0d\x68\x70\x3f\x06\xea\xc9\xc0\x74\ -\x00\x07\xf7\x49\xad\xb5\xd9\x05\x6a\x32\xae\xbf\xea\x8d\xac\xa4\ -\x05\xaa\xcf\x27\x0d\x94\xf5\x43\xad\xda\x6b\x5e\xdd\x6f\xa9\xbf\ -\x65\x81\x76\xa7\x9c\xe6\xe9\xd4\x48\xe3\x01\xc0\xff\x97\x08\xae\ -\x17\xaf\xe1\x89\x03\xbd\xb0\xe1\x99\xc0\xee\x17\x7e\x2e\x69\x1d\ -\xf9\x61\xc6\x9c\x77\xd3\x06\xd7\x05\x42\x7b\x60\xd6\xe0\x3e\xe1\ -\x58\x23\x28\x6d\x4e\x93\xce\xca\x72\x2b\x9c\x1b\xb8\x26\x3a\x60\ -\x29\xfc\xe7\x9f\xb3\xf6\x34\xd5\xbc\x28\x18\x15\xf7\xaa\x48\xf5\ -\xc1\x91\x91\xb7\x63\x3d\x89\x27\x75\xfa\x45\x37\x00\x84\x7a\x84\ -\x78\x25\xf5\xdd\xb1\x6f\xa7\xf5\x4b\x5b\xd3\xb2\x0f\x03\xd0\x5d\ -\xaf\x16\x23\xe0\xbc\xcd\xb2\x56\x46\xd1\x01\xc2\xff\x3a\xe5\x10\ -\xe7\x48\x7e\xaf\x32\x6e\xab\x78\x0c\xa7\x26\x3f\x97\xd6\x5c\x61\ -\xdb\x6c\x45\xe6\xf9\x71\xbf\x0f\xb6\xcf\xa2\xed\x86\xed\x37\x23\ -\xfe\xb2\x9b\x0c\x37\x5c\x40\x7d\xac\xbd\x3c\xda\xe9\x45\xd2\x70\ -\xc9\x61\xff\x4e\x21\xde\x9a\x09\x95\xbf\x1e\x33\x3e\x09\x7c\x69\ -\x46\xd6\x05\xc2\x73\x39\xcd\xb8\x4f\xbc\x6a\x86\x3e\xb1\x57\x57\ -\x0a\xf1\x9f\x68\x00\xd6\xb8\xaa\x53\xdf\x1b\x1c\x29\xb2\x17\x34\ -\xc9\x6e\x78\x85\x53\x39\x31\x3e\xfc\xb1\xaf\xc1\xfd\x7f\x5a\x5c\ -\x26\xb5\x7d\x2e\x12\xd0\xb7\x76\xd5\x48\xf0\x63\x0f\x0e\xfb\xef\ -\x38\x9d\x30\xe7\xdc\xa4\x0d\x6b\x4d\x34\x76\x86\x68\x00\xc6\x61\ -\x52\x5f\x46\xb3\xe9\xd9\x5c\x32\xaa\x96\xb8\xb4\x0f\x2a\x79\x20\ -\xeb\xb4\xf9\x63\xed\x36\x3a\x60\xab\x18\x8d\xa5\xfe\x59\x55\xf3\ -\x07\x6b\x7d\x60\x9d\x7f\xc4\xff\x24\xd0\x99\x18\xd6\x61\x8b\xcc\ -\xb8\xdb\xba\x53\x4d\x78\x3e\xad\x03\x3c\xf1\x60\x07\x28\xe5\xd7\ -\x8c\x45\xfe\xcf\x67\xa2\xc6\xbc\x9b\x84\x73\x98\x0c\x4c\xcb\xda\ -\x20\x4d\xe2\x4f\x28\x0f\x20\xee\xa7\x02\xd3\x2d\x1a\x80\x7d\xfb\ -\x0c\xb6\x01\xa4\x08\xf7\xeb\xa4\x1b\xa0\xaf\x60\x22\x54\x76\x9f\ -\x14\xbd\xed\x9f\x45\xd7\xe8\x1f\x09\x8e\xf3\xbb\x5c\x73\xfc\x56\ -\x02\xb8\x06\x43\xfd\xdb\xc2\x87\x62\x81\xc9\x07\xc7\x10\xff\x49\ -\x66\x9a\x96\x32\xd7\x34\xc7\x62\x07\x9b\xe4\x17\xc8\xc8\x5e\x62\ -\xac\x0b\xa8\xc1\x75\x53\xb2\x32\xaf\x82\x62\x30\x9c\xba\x8c\xc5\ -\xe0\xb8\x0c\xe5\x9f\xc5\xf8\xab\x5c\xa8\x21\xe3\xb0\xeb\x84\xff\ -\xc9\xb6\x7e\xbf\x09\xac\xc3\x80\xdf\x01\xff\x26\x01\x34\x63\x60\ -\xc7\x53\x6f\x14\x4f\x8c\x98\x6c\x0d\x4b\x01\xe3\xf0\x86\xba\xc5\ -\x8e\x9b\xc6\xcc\xf2\xf7\xe3\xc6\x9c\x9b\x80\xb3\x88\x36\x6a\xec\ -\x15\x8e\xf5\x41\xd2\xfe\x3a\xd3\x80\x00\xcb\xfe\x34\x17\x6c\x70\ -\xbf\x78\x03\xed\x01\x75\xd2\x0b\xd0\x96\x95\x0d\x01\xfe\x47\xa6\ -\xbe\xbd\xdf\xf7\x1a\xb4\xf7\x63\x0d\xf9\xcd\x58\xcf\x7f\xbd\x00\ -\xf5\xeb\x9f\xb6\x77\xbf\x7c\x2e\xe2\xab\x7e\x27\x1c\x9c\x75\xe3\ -\xf6\x2c\xe1\x7f\x06\xf4\x81\xac\xc1\xf6\x17\xac\xc9\x94\xc7\x6b\ -\xb4\xc1\x98\x6d\x76\x01\xab\x41\xfd\x1a\xd0\x6e\x87\x23\xeb\x48\ -\x7b\x0b\xda\xf3\x6d\xb6\x1d\x62\xfc\xb5\xf2\xc9\xaa\x7a\x0b\xc8\ -\xeb\x53\x16\xd7\xfb\xc7\x3c\xff\x38\x0e\xd0\x03\xe2\x06\xc7\x68\ -\xe0\x5c\x5f\xff\x04\xd2\xea\xcb\xaa\x0e\x93\x86\xe5\x43\x4f\x8f\ -\x78\x65\x76\xf4\xe6\x2f\x24\xad\x3b\xe0\x9c\xcc\x02\x7e\x83\x1c\ -\xe0\x67\xb9\x9f\x64\x00\x94\xf7\xfd\x75\xee\xd5\x8d\xb2\x80\xc1\ -\x03\xed\x02\x59\x6b\x16\xce\xef\x0c\xc5\x08\x8c\x3b\x8d\x87\xd2\ -\x91\x1b\x6b\xdd\xdd\xe2\xf9\x9d\x7e\xa7\x0d\x0a\x3b\x77\x6e\x13\ -\x2f\x1c\x1e\xba\x6e\x66\x38\x50\xf9\x4e\xd4\x3f\x0f\xf8\xc7\x7e\ -\x00\x92\xfb\x91\x16\x20\x0d\x30\xd8\xfe\x9a\xb7\xd8\x06\x93\xb5\ -\x78\x9e\x62\x07\xf1\x77\xd2\x26\x8b\xfd\xd3\x32\xf6\x34\xd3\x04\ -\x94\xc3\x30\xcf\xca\x96\x34\x19\x65\xb3\x60\x83\xec\x7d\x29\xe2\ -\xf7\x5c\xe7\x23\x49\x3d\x3f\xe0\xe7\x60\x85\x64\x8a\xb8\x79\xd8\ -\xb5\x02\xbf\xf1\x16\x78\xb6\xe1\x4e\x2f\x8e\x86\x8e\x41\xb4\x57\ -\x88\xb7\x8c\x18\xcd\x47\x12\xc0\x97\x12\x41\xd6\xe7\x31\x6f\x1d\ -\xe9\x00\xd1\x02\x83\x6b\x06\x27\x49\xff\x9f\x26\x5b\x41\x9a\xec\ -\x57\x18\x2f\xd4\x5c\x1c\xb7\xeb\x27\x13\x89\xf7\xd7\x04\xe7\x91\ -\x68\x5b\xf2\xf9\xe1\x69\x03\x62\xdb\x9f\x1b\xfb\x6e\xfa\xdb\x61\ -\x5f\xf3\xc1\xd1\xc0\xdc\xe9\x18\xac\x3b\xfa\x02\x72\x20\x07\xe4\ -\x61\x5d\x0b\x18\x8f\x01\xb4\x21\x2b\x6d\xaf\x48\x63\xd1\x56\x90\ -\x0a\xb2\xbc\xc0\x3e\x59\x8c\x29\x9e\x26\xba\x9c\x36\x66\x78\xbf\ -\x82\xac\x9f\x21\x6d\x26\x1d\xcd\xa8\x91\x6d\x96\xfa\xfb\x19\x55\ -\xf2\xd1\x92\x2d\x20\x58\x21\xfd\x20\x6e\x1d\x76\x13\xc3\x37\xdc\ -\x09\xcf\xf4\xab\x9d\x5e\x14\x0d\x9d\x03\x50\x04\x9e\x1f\xb1\x4b\ -\xff\x35\x1c\xfc\x94\x3b\x1a\x9c\x73\xe3\x01\xb4\xed\xe3\x79\x03\ -\x9d\x00\xfb\x06\x22\x5d\x20\x5a\x30\x43\x9f\x68\x0f\xc8\x9a\x54\ -\x43\x60\x31\x67\x37\x4f\xa4\x43\xb7\xdc\x0d\xb7\x79\xba\xd0\xf6\ -\xbe\xe5\x82\xd1\xd7\x2d\xae\x0d\xf4\x3e\xef\xb3\xa1\xbd\x1f\xff\ -\xef\xe8\xd0\xec\x0f\xe3\x81\xb9\xc7\x32\x14\x87\xcd\xf9\x17\xe3\ -\xf6\x0c\x7c\x22\x0d\x50\x72\x18\xf6\x17\x9c\x95\x36\x59\xb6\xcb\ -\xa0\xec\x90\xc4\xbd\xf2\x4b\xda\x8c\xf4\x00\x70\x3f\x21\xfd\xb4\ -\x29\x69\xa7\x49\x9a\x75\x1e\x06\xc7\x69\x61\x6f\x92\xac\x53\x5e\ -\x4c\x87\x6b\x27\x1c\xe7\xfd\x93\xf0\x3c\xcf\xea\xf4\x82\x68\xe8\ -\x28\x24\x77\xf6\x16\x4a\x69\xec\xc9\x1d\xba\xcb\xcd\x84\x80\x06\ -\x80\xcc\x8f\xf6\x80\xd8\x10\xd6\xb2\x9e\xa3\x5e\xbd\xa4\x1b\x00\ -\x2d\x48\x05\x80\x4f\x81\xec\x99\xb3\x2b\x27\xf3\xe1\x8f\xdd\xdd\ -\xdb\x9b\xc0\xda\x91\x58\x3f\x46\xdb\xfb\x96\x07\x18\x0f\x85\xeb\ -\x15\xef\x17\xe2\x37\xc3\xfb\x7e\xb3\x1c\x1b\x3c\x7c\x7f\x7a\x08\ -\x71\x79\x96\xea\xb3\xa2\xfc\x9e\x73\xe6\x28\x66\x00\x7d\x2b\x69\ -\xc9\xf3\x93\xa4\x83\xcd\x72\xcc\x86\x8c\x25\x48\x05\x25\xff\x27\ -\xdb\xec\x34\x7f\x2a\x39\x8e\x64\x01\xb6\xd1\x52\xec\x9f\x51\x86\ -\xcf\x49\x37\x1f\x29\x9d\x48\x58\x93\xff\x04\xcf\xf0\x02\x71\xf9\ -\xd5\x61\xd5\xb0\x32\xd8\x8d\x3e\xea\x90\xff\x9d\x77\x47\xf6\x37\ -\x4f\x46\xe0\x3c\x8d\x84\x66\xdd\x31\xc0\xf1\x31\x38\x73\x71\xe0\ -\x43\x71\x38\x47\x71\xec\xd9\x4b\xe7\x0a\xf9\x48\xf9\x87\x49\xf3\ -\x63\x47\x45\xd7\x28\xd6\xf2\x0b\x09\x8d\xfb\x2b\x05\xca\xc7\x84\ -\x61\xc1\x78\x0a\xfc\xf0\xd2\x3e\xe1\x7b\xdd\x9e\xad\x4f\x7b\xd3\ -\xee\xed\x4f\x7d\xf5\xfe\xdd\xff\xeb\xd5\x81\xc1\xf7\xbc\x6b\xc4\ -\x98\xfe\x6a\xdc\xb8\xf3\xa1\x8c\x05\xf8\x0e\xfa\x3f\xe2\x3f\xc9\ -\x62\x41\xd5\xcb\x11\x69\x00\xd3\x64\x92\x03\xd0\x86\x4b\x72\x80\ -\xa4\x01\x48\x23\x28\x5e\xb3\x4e\x71\x81\x85\x91\xf2\xa3\x13\xa1\ -\xc3\xdf\x4c\xc7\x6e\x40\xbe\x8f\xb8\x6f\x76\x74\x15\x34\x6c\x14\ -\xc8\x6c\xeb\x12\x6f\xea\x15\x57\x7e\x6c\xc7\xae\x9b\x1b\x83\xfe\ -\xea\x91\x48\xa0\x76\xd7\x58\xb0\xf9\xd9\x68\xb0\xf9\xc5\x44\xa0\ -\xfe\xaf\xa0\x5b\xde\x13\x1b\xaa\x7d\x2b\xb6\xaf\xfa\xff\x99\x83\ -\xef\xaf\xc2\xf1\x7d\x85\x78\x62\xe6\xf5\xad\x07\x60\x4d\x34\xf4\ -\x99\xda\x82\x63\x06\x70\xa4\x7b\xc5\xd6\x03\xc6\xe0\xe4\x3f\x8e\ -\x05\x66\x4e\xc6\x51\x0e\x23\x3e\x3f\x43\x9f\x89\x00\xda\x63\x98\ -\x0e\x10\xdf\x47\xdc\x27\x3b\x00\xd3\x09\xd4\x0d\x54\xdc\x76\xce\ -\x29\x9e\x4c\x85\x6f\xbd\x67\xcc\xb8\xe9\xc8\xce\x3d\xcf\x3f\xb0\ -\x75\xab\x78\xa6\xd0\x7c\x5f\xc3\xd9\xc1\x00\x7e\x94\x03\xa4\xfe\ -\xc9\x1d\xa2\xfb\x17\x77\x88\x2b\x5f\xde\xd5\xf5\xf2\xb7\xec\xe8\ -\xfd\xa3\x9b\x7a\xc4\xb5\x87\x85\xd8\xfb\x27\xf0\x6f\xc6\x61\xf4\ -\x75\xf8\x39\x2f\x77\x40\xba\x1a\xdc\x26\xc4\x9f\xf9\x7c\x1f\xf9\ -\x8f\x90\x7f\xe1\xa1\x61\xff\xed\x6e\xd4\x37\x07\xa3\x46\x74\x20\ -\x89\xbd\x46\x80\xf7\xa7\xcc\x79\x37\x0e\x72\x5b\x1c\xe9\x01\xd0\ -\x02\xd4\xdd\x50\x5e\x00\x7d\xff\x64\xd2\x2e\x3f\x18\x33\x3f\xfa\ -\x6f\xa6\x4d\xb9\x58\x3f\x25\xf4\xbe\x69\x38\x3f\xe0\xb9\xc3\x3e\ -\x90\xc8\x93\x90\x0f\xa1\xae\xba\x4f\x30\x7f\xf2\xc3\xd8\x2b\xe7\ -\xb7\x74\xea\x01\x9f\x20\x80\xeb\x8b\x7b\xb1\xbf\x7f\x9b\x78\xb1\ -\x15\x7c\xd7\x5c\xd2\x42\xbd\xec\x93\x6e\xca\x9e\x07\x19\x00\x73\ -\xfb\xe6\xa4\xdf\xb6\x09\xb8\x0f\x78\x6f\xcd\x91\xed\x3f\x13\xae\ -\xbb\xd9\x48\xd1\xcd\x98\xc5\x7b\xc6\x46\x3f\xf8\x89\x9e\x1e\x8a\ -\xc5\xc6\x3c\xcc\x3e\xa1\xf7\x4d\x83\x86\xcd\x06\x46\x97\x10\xbf\ -\x17\xd8\xf7\x86\x7b\x9d\xfd\xa5\x53\x91\xa1\xe9\xef\x8f\x99\x8d\ -\xef\x8c\x19\xd5\x87\x47\xcd\xda\x62\x14\x63\x7a\xed\x86\x1b\xa7\ -\x9e\xde\xd5\x93\x19\xa3\x7c\x77\xd4\xbc\xe1\x56\xd1\x73\x35\xd6\ -\xf6\xc4\xf8\x3e\xa4\xe3\xda\x46\xa3\x41\xc3\xe6\x05\xb4\x0d\xfc\ -\x62\x4f\xb7\xf8\x8d\x6d\xdd\xe2\x05\x30\x7e\x79\x5b\xb7\xff\xd7\ -\xfa\x7b\xaf\x79\xc9\x8e\xde\xd7\xbf\x61\x67\xef\xc1\xeb\xb7\x6f\ -\x7d\xdd\xbb\xbb\xc4\x53\xdf\x21\x38\xef\x3a\x2a\x74\x6d\x2f\x0d\ -\x1a\x9e\x08\x80\x76\x58\xcc\xe3\x4b\xc9\xa1\xe3\xb0\x34\x68\xd0\ -\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\ -\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\x0d\ -\x1a\x34\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\ -\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\ -\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x68\ -\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\x0d\x1a\ -\x34\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\ -\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\ -\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\ -\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\ -\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\x0d\ -\x1a\x34\x68\xd0\xa0\x41\x83\x86\x4d\x06\xae\x06\x0d\x1a\x9e\x60\ -\x70\xc2\x3d\x7a\x51\xf3\xc7\x85\xb8\xfa\x7c\xf3\x40\x58\x06\xce\ -\x33\xbd\x08\xf3\xdd\x17\x98\x17\x07\x56\x3f\x7f\x42\x9c\xff\x01\ -\x8e\x5f\x60\xfe\x18\xce\x6f\xbf\x7c\xe7\x8f\x6e\xf0\x79\xb1\x9c\ -\xf9\xf3\xec\xdf\x25\x9f\x7f\x6c\xdb\x96\x8b\x9a\x3f\x7e\xfe\xf9\ -\x45\xb1\x74\xfe\xe8\x19\xf3\xc7\x45\x97\x38\xdf\x3c\x9e\x87\xab\ -\xdd\xa5\xd7\x17\x3d\xdf\xbd\xb2\xf9\xed\x2b\x9d\xdf\xbe\xfc\x79\ -\x7c\xdf\x2d\x1b\x68\xfe\xcc\xf5\xbf\xd0\xfc\xb1\xb3\xcd\x9f\xf1\ -\xfe\x62\x9d\xe7\x57\xfc\x7c\x2b\x98\x3f\xee\xcd\x7f\xa1\x35\x1f\ -\x3a\xcb\xfc\x89\xee\xd6\xfc\x81\xb3\xcc\x1f\xdb\x72\xd6\xf9\x13\ -\xea\x75\xe4\x31\x3c\x7a\xc6\xfb\x2e\x67\x1e\xef\xbc\x28\x9f\xfa\ -\x5c\xf3\x27\xe4\x63\x9c\x39\xbf\x28\xe7\x8f\xcb\x5f\xaf\x76\x5e\ -\xe1\xd1\x99\xef\xd7\x3e\x1f\x5a\xe5\xbc\x90\xbf\x1f\x50\xf3\x57\ -\x5f\x60\x3e\xd4\xf6\x80\x2b\x98\xdf\x7e\x9e\xf9\x83\xf2\x39\xcf\ -\x35\x2f\xda\xee\xb3\xa6\xf3\x07\x69\x3d\xe8\x35\x71\x5d\xce\x5c\ -\xff\x25\xf3\x57\x5f\x60\x3e\xb4\xea\xf9\xc7\x68\x7e\xe0\x2c\xf3\ -\xc7\x68\xfe\x78\xfb\xfc\xf6\x33\xe7\x43\x72\x7e\xfb\xe3\xe9\xc9\ -\x9a\xce\x77\x9f\x63\x7e\x60\xe9\xfc\xe3\x9e\xff\x7c\xf3\xc7\x69\ -\xfe\x98\x90\x1b\x24\x56\x3a\x7f\xac\x7d\xfe\x80\xab\xf6\x71\x8d\ -\xe7\x8f\xf2\xfc\xd5\xe7\x7a\x3e\x39\x3f\x70\xc1\xf9\x73\xbc\xbf\ -\x9c\xdf\xfe\xf8\xf9\x13\x34\x7f\x70\x79\xf3\xdd\x67\x9f\xdf\x7e\ -\x81\xf9\x6e\x3e\x9e\xb8\xb3\x2b\x9e\x7f\x4c\xcd\x6f\xbd\xc0\xfc\ -\xb6\xd6\x7c\xfb\xfa\xd2\x8a\xe1\x3f\x1a\xc0\x67\x3c\xf0\xf8\xf9\ -\x83\x6a\x1e\xa7\xae\x5e\xfd\xfc\xd5\xc7\xce\x3e\x8f\xbf\xc1\x97\ -\xbc\x1a\x77\x22\x74\xf6\xbf\x5f\xb3\xf9\x81\x73\xcf\x1f\x38\xcf\ -\x3c\x4e\x1d\xa0\x95\x3c\x2a\xce\xc0\xbf\xa5\xf3\x5b\x56\x3e\x8f\ -\xbf\xf9\x03\x9c\x5f\x3c\xff\xbc\xab\x0e\xc1\xb9\xe6\xdd\xd5\xcf\ -\x3f\x9d\xe6\x8f\x9e\x73\x5e\x9c\x67\x9e\x49\x0b\xd2\x96\x63\xe7\ -\x9b\xdf\x7e\xf1\xf3\xc7\x57\x35\x7f\x82\x7f\x39\xe0\xfd\xb4\xea\ -\xf9\xc7\x2e\x30\xbf\xb8\xaa\xf9\xc7\xbc\x79\xf7\x62\xe6\x43\xcb\ -\x98\x3f\x78\x9e\xf9\x03\x17\x98\xc7\x1f\x8f\x5d\xe4\xfc\xf1\xd5\ -\xcc\x2f\xb6\x7e\x77\x62\x6d\xe6\xc5\x2a\xe6\xb7\xb7\x3d\xea\xaa\ -\xe7\x17\x2f\x30\xef\xae\x66\x9e\x77\x6d\x7b\xeb\xc7\x55\xcd\x0f\ -\xb4\xcd\x2f\x5d\xbf\x76\x91\xed\xe8\x6a\xe6\x8f\xb5\xe6\x8f\x2f\ -\x6b\xbe\xfb\x2c\xf3\x57\xd3\x8f\x27\xda\xd6\x62\x35\xf3\x8f\x9d\ -\x73\xfe\xc0\x05\xe6\xdd\x73\xcf\x1f\x5f\xc6\xbc\x7c\x65\xde\xcb\ -\x81\x55\xcf\x9f\xd5\xfc\x71\xbc\x6d\xc9\x0e\x9e\x65\xfe\xb1\x33\ -\xe7\x43\x8f\x9f\x57\x7f\x72\xf4\x2c\xf3\x8b\x6b\x30\x1f\x6a\x9f\ -\x1f\x78\xfc\xfc\xd5\xe7\x99\x77\xd7\x60\xfe\x80\xfc\xf1\xd8\xd9\ -\xe6\x8f\xb6\x4e\xe4\x59\xcd\x8f\x6d\xf3\x8f\x9d\x6d\xfe\x58\xeb\ -\xc4\x2e\xae\x6e\xbe\x75\x62\xce\xb2\x7e\xf0\x50\x03\x6d\x3f\x3f\ -\xde\xbe\xbb\xd8\xfe\x9b\x83\x8f\x77\x1c\x5d\x68\xfe\x8c\x2f\x3b\ -\x9f\xf9\x17\x51\xec\xcc\xc7\x3b\xf3\x06\x07\xce\x3f\xaf\x41\x83\ -\x06\x0d\x1a\x2e\x00\x71\x20\xf5\xc4\xaf\xb7\xe0\x7f\x61\x62\xfd\ -\xa2\x77\x8b\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\ -\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\ -\x41\x83\x06\x0d\x1a\x34\x68\xd0\xb0\x6a\x08\xc3\x78\x29\x0c\x07\ -\x46\x02\xc6\x93\x61\x3c\x47\xfe\xee\x0d\x5b\x45\xec\xdd\xf0\xf9\ -\x1b\x30\xba\x3a\xf3\x78\x1a\xd6\x09\x76\x0a\x11\x7f\x7b\x66\xec\ -\xaf\xbe\x9d\x89\x7c\xea\x54\x7c\xf4\xe8\xff\xa4\xa2\x9f\xb9\x3f\ -\x3e\xfc\xc9\x1f\x46\x43\x77\x3e\x12\xb5\xe7\xdd\xd1\xc0\xbc\x9b\ -\x32\xe7\xdc\xa8\xb9\xf0\x70\xcf\xf6\x89\x9b\xf8\x6f\x34\x5c\x06\ -\xb0\x7b\x34\xda\xf8\x56\xcc\xb9\xc3\x4d\x5a\xb7\xbb\x69\xf3\x08\ -\xec\xf3\x02\x8c\x79\x37\x61\xce\xba\x49\x7b\xc6\x4d\x39\x33\xf0\ -\x73\xc3\x8d\x1b\x75\x37\x6e\x35\xe0\xdf\x2d\xb8\xe1\xd1\xdb\xef\ -\xef\x12\xbe\x83\x42\x6c\x4b\x09\x8a\xe0\xd2\xb0\x19\xa1\x77\xf7\ -\xb3\xdf\x12\xf5\x2d\x2c\xa6\xed\x39\x37\x09\xf8\x9d\xb6\x67\xdd\ -\x94\xd5\x74\x33\x76\xd3\x4d\x06\xab\xf0\x73\x1d\x7e\xd7\x70\x13\ -\x56\xcd\x4d\xd9\x30\x2c\xfe\x5d\x1c\xce\x43\xca\x69\x2e\x46\xc2\ -\xcd\xef\x03\x3b\x78\x33\xdc\xaa\xaf\xd3\xef\xa2\x61\x45\x80\x38\ -\xfb\x3b\x49\xdf\x2c\xe1\x7a\xd2\x9c\x81\x7d\x86\x61\xe1\x67\xd3\ -\x4d\x3b\x30\xec\x3a\xec\x75\xcd\x4d\x87\x1a\xb4\xf7\x49\xd8\x7b\ -\x1c\x29\xbb\x02\x7b\x5f\x75\x63\xf0\xf3\x18\x9c\x83\x28\xd0\x84\ -\x42\xf6\xbd\x1f\x87\xfb\xf5\x74\xfa\xa5\x34\x2c\x1b\xfa\xfd\xe6\ -\xbb\x8f\x8e\xfa\x80\xde\x5b\xf3\x6e\xd6\x81\x73\x00\xfb\x9e\x81\ -\xbd\x4c\x3b\x38\xea\x6e\x06\xf7\x1d\xf6\x39\x0d\x23\xe3\xc0\x9e\ -\xdb\x65\x18\x78\x5d\x01\x7a\x50\x76\x13\x36\x7e\xd6\xe1\x1c\x4c\ -\xbb\xb6\x39\xfb\x6d\xb8\x67\xa0\xd3\x2f\xa5\x61\xd9\xe0\x1f\xf3\ -\xcf\x7f\x2b\x16\x04\x5e\x6f\xcd\x02\xae\x4f\xc3\x1e\x37\xe1\x1c\ -\x34\x79\xbf\x43\x35\x37\x0b\x03\xf7\x3a\xe3\xd4\x68\xef\xd3\x0e\ -\xee\x7f\x09\x64\x02\xf8\x0c\x01\x2d\x80\xdf\x27\x90\x26\xa0\x6c\ -\xe0\xd4\xbf\x0a\xf7\xdc\xd7\xe9\x97\xd2\xb0\x6c\x88\x45\x7d\xf3\ -\x6e\x3c\x38\x0f\x34\x7f\x96\xf0\x3e\x05\xf4\x3e\x0d\x7b\x9e\x09\ -\x57\x79\xe0\x7e\x3b\x25\x38\x0b\x70\x06\x42\x25\x1a\xd9\x70\x85\ -\x7e\x87\x74\x21\x61\x55\x80\x1f\x20\x5f\x00\xf9\x60\xa4\xfe\x8f\ -\x70\xcf\x81\x4e\xbf\x94\x86\xe5\xc1\xae\x5d\x99\x77\xc6\x8d\x3b\ -\xdd\xa4\x31\x07\x7b\x8f\xf2\x5e\x03\x46\x9d\x70\x3e\x0b\xb8\x9d\ -\x85\x3d\xcf\xc1\x67\x0e\xf6\x3a\x87\xfb\x8e\xe7\x20\x5c\x02\x1a\ -\x50\xa4\xf3\x90\x74\x24\x2f\x08\x35\x41\x37\xa8\xbb\xa3\xe1\xfa\ -\x5d\x70\xdb\xde\x4e\xbf\x97\x86\xe5\xc1\xc8\xc8\xc7\xef\x8e\x1b\ -\x40\xfb\x0d\xa0\xfd\x66\x83\xe4\xfd\x8c\x8d\x7b\x0f\x67\x00\x69\ -\x3e\xd0\xf9\x1c\xec\xb1\xda\x7f\xfc\xc4\x33\x90\x0d\x95\x61\xff\ -\xcb\xc4\x17\x90\x4f\xa4\xec\x06\xe1\x7f\x78\xf4\xb6\x79\xc1\x35\ -\x38\x34\x6c\x7c\x18\xc9\x06\xa7\x41\xbf\x9b\x83\xfd\x07\x79\x1f\ -\xf0\x37\x63\x02\xce\x03\x3f\xc7\xbd\x27\xbc\x07\x1c\xcf\x87\xcb\ -\xb4\xf7\x79\xd8\xf7\x3c\xd1\x80\x29\xf8\x1d\x9e\x8d\x0a\xcb\x83\ -\x66\x45\xea\x08\x4d\xd7\x17\xb8\xee\x70\xa7\x5f\x4a\xc3\xb2\xe1\ -\x57\x12\x7e\xa0\xdb\x81\x19\xd8\x7f\x90\xfb\x40\x86\xcf\xc2\x3e\ -\x22\xfe\x33\xcd\x2f\xd3\xde\xe3\x9e\xe7\xec\xa2\x5b\x20\xfc\x9f\ -\xe2\x4f\x94\x03\x60\x3e\x0d\x32\x60\x06\xe9\x3f\xfc\x6d\x12\x68\ -\xc6\x7e\xdf\xf3\x3f\xdc\xe9\x97\xd2\xb0\x3c\xd8\x21\xc4\x8d\xc9\ -\x00\xc8\xec\x41\xc0\x7d\x83\x75\xbe\x2c\x9e\x01\x47\xf1\x7d\xd8\ -\xe7\x30\xe2\xfc\x14\xfc\x8c\xfb\x5e\xa4\x91\x47\xfc\x87\xcf\x2c\ -\xec\x3f\xfe\x3b\xda\x7f\xb3\x46\x7a\xa0\xe8\x1a\xb8\xae\xd3\xef\ -\xb5\x46\x80\x32\xcc\x8b\x84\x08\xbf\x53\xfd\xa2\x1b\xf0\x65\x87\ -\x78\xf6\xad\xf0\xe3\x9f\xc3\xe8\xef\xd8\x93\xad\x11\xc0\xfb\xfc\ -\xda\x58\x60\x0e\xe4\x36\xe4\x01\x4d\xc6\x7f\xd0\xf7\x11\xf7\xf3\ -\x72\xff\x71\x9f\x0b\x91\x12\xed\xfb\xb8\xda\x7f\x18\x39\x87\xf7\ -\x3f\x83\xf8\x0f\xfc\x02\x79\x47\xd4\x2c\x62\x59\x87\x97\x77\xfa\ -\xbd\x56\x09\x68\x07\x43\xbd\x25\x08\xe3\x37\x46\xc2\xcd\xaf\x8e\ -\x59\x73\xae\xb5\xeb\xd3\xb3\xea\x1f\xec\x37\xea\x47\xac\x1d\x73\ -\x6e\xc8\xf8\xab\xa2\xb8\x4c\x6c\x5c\x89\xf8\xbb\xbe\x16\x37\xe7\ -\x81\x77\x4f\xb3\xdc\x4f\xfb\x5f\x61\xda\x8f\x7b\x4d\x7b\x8f\x03\ -\xf0\xdf\xe1\x33\x90\x97\x83\xf7\x1f\x78\x3f\xda\x84\xc9\xfe\x53\ -\xc6\xfd\xff\xc5\x4e\xbf\xd3\x2a\xe0\x99\x42\x44\x27\x93\xc3\x9f\ -\xf9\x52\x34\x72\xe4\xbb\x31\xfb\xf6\xc5\x11\xd0\x87\xe3\xe6\x9c\ -\x1b\xf6\x7d\xf6\x6b\x42\xda\x33\x8c\x7d\x33\xf7\x05\x06\x1a\x6e\ -\x68\xdf\xdc\x43\x42\x6c\x7f\x6d\x87\x9f\x79\xad\xe0\xa7\x46\xcc\ -\x99\x47\xe2\x68\xf7\xb1\x9b\x44\xfb\x33\xc4\xf7\x2b\xb4\xf7\x84\ -\xff\xe1\xe2\x12\xfc\xc7\x4f\xd6\x05\x81\xff\xc3\x9e\xa7\x4c\xe4\ -\xff\xc0\x47\x02\xb4\xff\x3f\xd5\xe9\x17\x5a\x21\xec\xd8\xe7\x2c\ -\xfc\x65\xd8\x77\xa7\x3b\xe6\xbf\xc3\x4d\x18\x47\x80\x16\xc2\xde\ -\x07\x66\x88\x2e\xa2\x7f\x23\x5e\x98\xfd\xbe\x10\xcf\x6e\x46\x02\ -\x75\x77\xd8\x5f\x77\x43\xc1\xba\x6b\x0f\x56\xf1\x5d\x27\x3a\xfd\ -\xf0\x6b\x00\xfd\xf1\x44\xf5\xaf\x93\xa1\x39\xb2\xf7\xe7\xd0\xde\ -\x0b\x32\x7d\x1e\xe5\x3f\x94\xf9\x22\x65\xda\xff\x3c\xe1\x3e\x9f\ -\x87\xf1\x30\xca\x7f\x45\x96\xff\x70\xff\xad\x2a\xac\x5b\xcd\x8d\ -\x05\x91\xfe\x6f\xfd\x20\xdc\xd3\xe8\xf4\x4b\xad\x00\x86\x46\xf6\ -\xdd\x7e\xcf\xe8\xe0\x82\x1b\xf5\xcf\xbb\x89\x20\xfb\xbf\xd0\x16\ -\x9a\x04\x7d\x06\x75\x9a\xb8\x35\xe3\xc6\x41\xbf\x8d\x01\x8e\x44\ -\x81\x46\x8e\xc0\xbb\x8e\x9a\x4d\x17\x18\xe8\xaf\x77\xfa\xe1\xd7\ -\x00\x76\x8d\x8d\xcc\x7c\x21\x1e\x9a\x21\xff\x5e\xd6\x52\xf6\x9e\ -\x0a\xed\x71\x1e\xf6\xba\x30\x0c\x03\x3f\x9d\x36\xfe\x8f\xf2\xbf\ -\x5d\x82\xfd\xaf\xc0\x7a\xb1\xed\x77\xc4\x57\x74\x87\x27\x0e\x9d\ -\x16\x5d\xe2\x6d\x9d\x7e\xa9\x15\x80\x11\xdb\x3f\xff\x83\xa8\x7f\ -\x01\xe4\xe0\x39\x8a\x6d\x48\xc2\x7e\xe3\xfb\xa0\x3d\x0b\xfd\x1a\ -\xe8\xf3\x8e\x81\x7c\x1b\x83\xbd\x1f\x83\xeb\x51\x83\xfd\x5d\xf6\ -\x70\x15\x6d\x9d\x6f\x85\x11\xe9\xf4\x4b\x5c\x04\x0c\xa6\xc2\x0b\ -\x77\x27\xc3\x33\x40\xcf\x1b\xb0\xef\xb5\x96\xfc\xe7\x30\x9e\xe7\ -\x9d\x96\xec\xcf\xba\x1f\xf0\x7e\x89\xff\x19\xb2\xfd\x80\xee\x87\ -\x6b\x05\xf4\x42\x6c\x15\xaf\x13\x5c\xa3\x75\xb3\x40\x3a\x19\x38\ -\xb2\x98\x00\x9a\x4f\x76\x10\x13\xfd\xde\x33\x64\xcf\x4a\xc1\x7a\ -\x24\x41\x17\x4e\xc0\x9a\xc4\x41\xc7\x89\xa3\xaf\xd3\x46\x39\xa7\ -\x4e\xe7\x61\x0c\x74\x66\xa0\x09\x58\xea\xec\x86\x4e\xbf\xc4\x45\ -\x80\x1d\xb7\x9a\x8f\xc4\x41\xfe\x4b\x5b\x55\xde\x7f\x45\xff\x49\ -\xdf\x2f\x92\xfe\x9f\x97\x7a\x3f\xd2\x81\x7c\xb8\xa5\xff\xa3\xed\ -\x57\xd9\xfe\x47\x8c\x92\x2b\xfa\x82\x93\x62\x13\xed\x7f\x97\x10\ -\x6f\x8a\x19\x80\xfb\x01\xb4\x81\xcd\x91\x0f\x04\x7d\x60\xe8\xf7\ -\x46\xdf\x46\x4a\xda\xb8\x93\xa1\x32\x9c\x83\x0a\x9c\x83\x0a\xec\ -\x7f\x8d\xf6\x3f\x6a\x4a\x3e\x20\xc4\xab\x3b\xfd\x1e\x17\x01\xe1\ -\x58\x10\xe3\x3a\x40\xff\x33\x6b\x72\xff\xab\xd2\xf6\xc7\x7b\xcd\ -\xf2\xfe\x94\x47\xfb\xc9\x06\x18\x2a\xb1\x1f\x90\xe8\x3f\xec\x3f\ -\xac\x43\x21\xf2\xe9\xcf\x89\x9d\x5d\xa8\x1b\x6f\x9a\xfd\x07\x78\ -\x52\x34\xb0\x70\x1a\xf7\x3f\x03\xb4\x3f\x63\xc3\xfe\xa3\x2e\x04\ -\x72\x10\xda\xb5\xd3\xe8\xe7\x82\x77\xc5\xfd\xc7\x11\xb7\x4a\x70\ -\x06\x78\xff\x63\xa8\xf3\x02\x0d\x18\xc9\xd4\x3e\xd2\xe9\x97\x58\ -\x2d\x6c\x13\xdd\xd7\xa6\x4c\x8c\xf1\x41\xdb\x9f\xdc\x7f\xa2\xfd\ -\x4a\xff\x47\x5d\xa0\xc8\xf6\x1f\xfa\x94\xfb\x0f\xbc\x21\x6d\xa3\ -\xdf\x0f\x86\x51\x23\x7e\x19\x1e\x7e\xdb\xe7\x04\x99\x95\x36\x15\ -\xec\x1d\xf3\xdd\xf1\x95\x78\x00\xe8\x7e\x80\xe3\x5e\x32\xa4\x0b\ -\x35\xd8\xff\x0d\xfb\x9f\x46\x3f\x47\x08\xfd\x9d\x18\xeb\x80\x67\ -\xa0\x0c\x7b\x5f\x01\xfa\x0f\x3c\x00\xce\x80\xe3\x9b\xfd\xef\x4e\ -\xbf\xc4\x6a\xa1\x4f\xf4\x5d\x1b\x33\x41\xd7\x31\xd0\xf6\x8f\x74\ -\xbf\x46\xb4\x5f\xd9\x7f\x72\x0e\xdb\xff\xc8\xe6\x27\xe5\x80\x9c\ -\xd4\xfd\x79\xff\x41\xf6\x27\xf9\xaf\xe6\x0e\x0f\x01\xfd\x17\xdb\ -\xd0\x5e\xd6\xdd\xe9\xf7\x5a\x01\xf4\x86\x43\xc5\x4f\x26\x61\xff\ -\x93\xfe\x69\x37\x0b\x3a\x5f\x9a\x7c\x60\x75\x92\x6d\xc8\xbe\x8d\ -\x67\x3d\x54\xf6\xf6\x3f\x41\x3c\xa0\x04\xb4\xbf\x0c\xa3\xe4\x46\ -\x83\x95\x47\xe0\x3e\x85\x4e\xbf\xc8\x6a\x60\xc7\xd6\xb1\xeb\x11\ -\x77\x53\x46\x83\xf0\x3f\x6b\x57\xa4\xec\x57\x96\x7b\xcf\xf8\x8e\ -\x3a\x5f\xde\x61\x3e\xa0\x6c\x7f\x2c\xfb\x57\xe0\xec\x54\x38\xfe\ -\xc3\xbe\xcd\x0d\x26\xde\x3c\x0d\xb7\xdd\xde\xe9\xf7\x5a\x01\xf4\ -\x6e\x11\xf6\x27\x53\xa0\xfb\xa5\x83\x20\x03\x03\x3d\xcf\x82\x2c\ -\x83\xbc\x90\xec\xe0\xe8\x03\x45\x1b\x37\xc6\x3a\x60\xcc\x0b\xec\ -\x7b\x02\xf6\x1c\xf9\x40\xcc\x98\x02\x19\x60\xd2\x0d\xfb\x0f\xbf\ -\xbf\xd3\x2f\xb1\x5a\xe8\xeb\x99\xf8\x40\xd2\x64\x99\x27\x6b\xb3\ -\xef\x8f\xf6\xbe\xcd\xfe\x9b\x27\xfd\x7f\xd2\xb3\xfb\xb1\x0f\xb8\ -\xec\xe9\x7e\xb4\xff\x26\xfa\x02\x0e\xff\x08\x6e\x39\xd4\xe9\x77\ -\x5a\x29\x6c\xdd\x2a\xde\x99\x0e\xc0\xfe\x83\xfc\x97\x33\x9a\x70\ -\x06\x40\x0f\x02\xfc\xcf\xd9\x2c\x07\xb1\x9f\xab\x08\x03\xce\x80\ -\x55\xa2\xb8\xc7\x38\xbc\x6f\xcc\x28\xba\xd1\xc0\x21\x77\x9b\xf8\ -\xa5\x77\xac\xe7\xe3\xad\xe3\xbd\x45\x7f\xdf\x35\x1f\xc0\xf8\xee\ -\x14\xd0\xff\xac\xc5\x7e\x5f\x1c\x68\xff\xcb\x49\x7f\x6f\xbe\xcd\ -\xe6\x4b\xb8\x1f\x6a\xed\x7f\xca\xa8\x50\x8c\x20\xd0\xc9\xd3\x40\ -\xf5\x5f\xbc\x9e\xcf\xba\x8e\xe0\x44\x02\x20\x03\x01\x0f\x40\x7f\ -\x38\xed\x3f\xac\x05\xee\x7f\x16\x78\x3d\xfb\xb9\xd0\xd6\x5d\x24\ -\x7e\x90\xc2\x98\xc7\x20\xd2\xbc\xc6\xa7\x52\x23\x37\x7e\x4e\x6c\ -\xb3\xfe\x64\xad\x1f\x08\x36\xfd\xa9\x5b\xc4\x33\x3e\x6d\xf9\x5e\ -\xf2\x05\xb8\x1c\x5b\xeb\xfb\x2b\xe8\xeb\xff\xd9\x0f\x60\xcc\x37\ -\xc9\x3d\x16\xd3\x3c\xc6\x7d\xf6\xfd\xa2\x0d\x90\xcf\x00\xd3\x7f\ -\x2f\x06\x08\xe3\x00\xad\xaa\x37\x72\x91\xc3\xf7\x89\x4d\x1c\xf7\ -\x13\x4f\xbe\xf9\x2f\x69\xff\x8d\x19\x37\x0f\xf2\x7f\xce\x42\xfc\ -\x67\x5d\x28\x6b\x97\x3c\x7b\x17\xbd\x37\xf9\x3c\xaa\xee\xee\x81\ -\x5f\xb9\x53\xb0\xac\xb3\x56\xef\x8d\x3e\xa5\x6b\xe3\x23\x47\xfe\ -\x36\x16\xb9\xdd\x8d\x87\xe6\xdc\xb0\xbd\xe0\x9a\x76\xe3\xc7\x42\ -\xec\xc2\x33\xb6\xe6\x71\x75\xfd\x3b\x7f\x16\xf0\x7f\x8e\x75\x1e\ -\x89\xff\xec\xfb\xa9\x78\xbe\xff\xd6\x90\xb2\x1f\xe9\x7f\xec\xf7\ -\xcd\xa2\x9c\x0c\x7f\x07\xab\xf0\xbf\xd7\xfa\xd9\x2e\x31\xc4\x13\ -\xbe\x23\xa7\x92\x01\xc0\xff\x60\x83\x68\x21\xf1\x00\x8b\xd7\x23\ -\x23\xe3\x9e\x32\x6d\x7c\x2f\xea\x07\x59\x20\xf8\xd1\xcf\x82\xcc\ -\xfb\x0b\x6b\xf0\xfd\x56\x72\xb8\x7e\x2c\xe5\xcc\xc2\x77\xa2\x2e\ -\x3a\xed\xa6\xe0\x39\x46\xd1\xee\x8c\xb1\x15\xc1\x9a\x6b\x47\x2a\ -\xdf\x15\xa2\xeb\x15\x62\x0d\x73\xae\x78\xff\x59\xe7\x55\xf2\x1f\ -\xeb\x7e\x1c\xf3\x53\x80\x33\x30\x2e\xcf\x81\x8a\xfb\xc0\x39\xb2\ -\xfd\xc1\xfe\x67\x28\x2f\x60\x06\x6d\x20\x4f\x5d\xab\x67\xea\x10\ -\xec\x88\x0f\x2d\xfc\x4f\x0a\xf6\x3f\x03\x3c\x20\x07\xeb\x9e\x77\ -\x58\x06\x60\x9e\x58\xa2\x33\x80\x34\x00\xe3\x9d\x12\x94\xf3\x00\ -\xc3\x57\x71\x47\x9d\x3b\xaa\x17\xf9\xdd\xe3\x11\xb3\xfe\x8d\x2c\ -\xec\xc1\x78\x08\xf6\xdf\x44\x19\x94\xfd\xf1\x51\x8a\xbd\xad\xc1\ -\x77\xd6\xdc\x28\xf0\xe8\x58\xa0\xee\xfe\x44\xf4\xa3\x9f\x01\x0e\ -\xf1\xb4\xb5\x78\x69\xdc\xff\x38\xd0\xbc\x94\xc9\xfa\x7f\xc6\xaa\ -\x10\xbf\x6b\xf9\x80\x25\xff\x27\xfd\xaf\x28\x79\x40\xd9\xc3\x83\ -\x2c\xc5\x0b\x37\xdc\xad\x5b\xbb\x5e\xbf\x16\xcf\xd3\x41\xe8\x1d\ -\x19\xaa\xdd\x97\xc6\xbd\x07\x19\x30\x67\xd6\x59\x06\xb0\x98\x1f\ -\x92\xbd\x83\x74\x80\x32\xd9\x3c\x62\x06\xe8\x7d\x81\x49\x77\xcc\ -\x3f\xe5\x9a\x43\xf5\x6f\x5c\xc4\xf7\x6e\x0b\xf8\xae\x9b\x8f\xfb\ -\x90\xff\xe2\xb9\x83\x11\x6a\x92\x1f\x3e\x0d\x67\x2f\x06\xf2\x27\ -\xea\x9d\x69\x13\x65\x4e\xb6\x3b\xc5\x0d\x78\xa6\x14\xe1\x5c\xf4\ -\x62\x5f\x1a\xf7\x1f\x73\x7e\xd0\xe6\xc1\xf2\x5f\x59\xda\x7f\xd1\ -\xef\x57\xf1\xf0\x7e\x1c\xfd\x80\x4e\x51\xfa\x04\x60\xff\x2d\xe6\ -\x83\x39\xca\x15\xa9\xb9\x57\x16\x16\xbe\x2e\x36\x97\xdd\xef\x4c\ -\xe8\x1d\x0e\xdc\x76\x5f\x0a\xf0\x2b\x03\x23\x2f\xf7\x3f\xef\xb0\ -\x2f\xac\x15\xef\x5a\xa2\xfd\x47\x9b\x07\xee\x7f\xdc\x9c\x72\x47\ -\x7c\x93\x27\x2e\x7c\xfb\x73\x42\x00\x78\xce\x7d\x18\x7f\x8b\xf1\ -\xd7\xb4\xf7\x14\x7b\x5b\x23\x3f\x6c\x22\x52\xa1\x38\xec\x0c\xe5\ -\x5b\xd5\xd8\xd6\x8e\x3e\x09\xf8\xfe\xde\x9e\x89\x9b\x2f\xf6\xa5\ -\xfb\xfb\x7f\x96\xf5\x3f\xf8\x6e\xd2\xff\x70\x4f\x43\x2c\xff\x2b\ -\xbb\x3f\xeb\xfd\x45\xe2\x05\x28\x13\xb0\x0c\xc4\x72\x70\x9a\x62\ -\xff\xe0\x5c\x86\xca\x0f\xc1\xed\x7c\x17\xfb\x3c\x9d\x84\xfd\x7b\ -\xdf\x78\x4f\x0a\xf4\x80\x6c\xb0\xe9\xe6\x81\xf7\xe6\x10\xcf\x2c\ -\x8e\x83\xcc\x4a\x19\x80\xec\x00\xf0\xde\x71\xc4\x7f\xb3\x04\xf8\ -\x5f\x74\xcd\xc1\x8f\xa3\xdf\xeb\x39\xab\xf9\x4e\x40\x98\xe7\xe4\ -\x8c\x3b\x49\xfe\xce\x86\xa7\x65\xdc\xbd\x8c\xbf\x0c\x57\xdd\x64\ -\x84\xcf\x5d\x8e\x72\x6f\x40\x0e\x40\x59\xc0\x2c\xd1\x59\x88\x87\ -\x29\x06\xe1\x95\x17\xf3\xce\xfd\xfd\x3f\xf7\x81\x24\xc5\xfe\x36\ -\xe4\xfe\xf3\x79\x47\xdc\xcf\xa2\xff\x3f\xcc\xf8\xaf\x64\xc0\x6c\ -\x9b\xed\x07\x73\x02\x93\x66\x99\xfc\x7e\x49\x7b\x0a\x9f\x65\x55\ -\x6b\xb0\x51\x60\x8b\x10\xb3\x29\xf4\x01\xfa\xa7\xdd\x7c\x00\xf8\ -\x3f\xc9\x7f\xb8\x26\x65\xc9\xff\x8b\x34\x92\x66\x11\xf0\x1e\xf6\ -\x1e\x46\x22\x36\xf3\xb9\x01\xdf\xcd\xdf\xd8\x2e\xf6\xff\xde\x6a\ -\xbe\x33\x12\xbf\x6e\x3e\x85\xfa\x97\x3d\x03\x7b\x0e\x67\x2e\x54\ -\x97\xbe\x17\xf8\x5e\xc0\xb5\x64\x04\x63\x30\xcb\x44\x87\x30\x17\ -\x2b\x65\xc9\xdc\x5b\xca\xbd\xac\xbb\x63\xd1\xea\x77\x80\x85\x24\ -\x57\xfb\xce\x8c\xff\x33\x44\x7b\x48\xfe\xb3\x24\xfe\x87\x2a\x84\ -\xef\x9e\xcf\x4f\xc5\xfe\x93\xdf\x8f\x63\xfe\x71\xef\xd1\xff\x93\ -\x80\xbd\x4f\xd8\xb7\xba\xfe\xc1\x97\xcf\xaf\xf6\x39\x36\x08\xbc\ -\x38\x3a\x78\xc4\x4d\xf9\x60\xff\x83\x28\x03\xe0\x19\x40\x3d\x00\ -\x74\x1d\xab\x28\x7d\x1e\x53\xf0\xce\x45\xb2\x05\x26\xe0\x1c\x0c\ -\x5f\xf5\xc1\xbf\xed\x12\xe2\xd5\x3b\xc4\x0b\x3f\xb4\x8a\xef\xb3\ -\x31\xb6\x24\x03\xeb\x9f\xa5\xd8\x9b\x2a\x0d\xb2\xc1\x03\xfe\x15\ -\x86\x61\x9d\x23\xac\x73\xe7\x65\xbe\x25\xc6\x5a\x92\xcf\x45\xe6\ -\xdf\x25\x31\xee\x7e\xe4\xad\x15\xb1\xca\x78\x44\xda\x7f\x92\xff\ -\x50\xe7\xa9\x12\xaf\xc9\x85\x2a\x1e\xef\x57\xfc\x5f\xd1\xfe\xac\ -\x94\xfd\x52\x84\xff\x55\x69\xf7\xc5\xdf\xdd\x7a\x5f\x6a\xf4\xa6\ -\xcd\xbe\xff\xdb\x63\x46\xf5\xe1\x8c\x1f\x78\xb1\x0f\xf9\x00\xec\ -\xbd\x89\xeb\x51\x93\xb1\x8e\x45\xf6\x05\x58\x53\x6c\x0b\x44\x1a\ -\x30\x7c\xc7\xb7\xb7\x8a\xad\xcf\xe8\xef\xf9\xc3\xd5\xc8\x80\xbf\ -\x9d\x33\xe6\x60\x8d\x67\x29\xf6\x82\xf7\xbd\xe6\x16\x22\x28\x77\ -\x94\x29\xd6\x1e\xf7\x9f\xe2\x6f\x65\x4c\x76\x26\xc4\x79\xb8\x24\ -\x83\x18\x45\x92\x05\xa2\x56\x13\xdb\xb5\xdd\xb8\x9a\x17\xc6\xfd\ -\x4f\x99\x33\x32\xf6\x4b\xe2\x3f\xc9\xfd\x80\xfb\x91\x96\xfc\x47\ -\xba\x3f\xda\x83\xc2\x65\x7a\x77\x8c\xfb\x24\xdf\x3f\xc8\xa5\x39\ -\xb3\x7c\xbf\xe8\xa7\x9c\xdf\x4d\x5f\x0b\xc4\x8a\xbc\xaf\x91\x1a\ -\x02\x7a\xec\x07\x7a\x1c\x04\x5a\x8c\x7e\x00\x4b\xca\x80\xb6\xe2\ -\x7f\x6c\x07\x46\xfa\x17\x0d\x16\x1f\xde\xd9\xe5\x7b\xcb\x96\x6d\ -\x2f\xba\x57\xac\xd0\xef\x61\x8d\x7d\xe8\xae\x5c\x08\xf7\x7f\x5a\ -\xda\x9a\x2a\xbc\xff\x88\xfb\x24\x7f\xc3\x59\x0b\x4f\xc9\xfd\x67\ -\x9b\x0c\xc5\xdb\xd2\xda\xd7\x38\xf7\x12\xed\xee\xa0\x83\x0d\x3b\ -\xd3\xe8\x83\x5a\x71\x1c\xd2\xce\xfe\x67\x7f\x20\x16\x6c\xe9\x7f\ -\x59\x29\xef\xe6\xe5\xf7\x17\x1c\xce\xfb\x21\x5e\x20\xf7\x3f\x6b\ -\xb7\xe2\x7e\xd1\x4f\x1a\x1b\xab\x9d\x82\x5b\x5d\xb3\xd2\xef\xde\ -\x88\xb0\x5d\x04\x5f\x99\xf1\x2f\x90\x1d\x38\x07\x7a\x40\xd6\x64\ -\x3b\x90\xa7\x17\x87\xcb\x4c\xff\x31\x0e\x00\x3e\xa3\xfe\xe2\xa2\ -\x11\xb9\xe9\xe4\x56\x31\xf5\x5d\xb1\xb2\x9c\x80\xae\x8c\x31\x77\ -\x6f\xd6\x99\x03\xbc\x06\x79\x13\x70\x6f\x3c\x82\x7b\x5f\xf5\xf8\ -\x2e\xc5\x58\x47\xa4\xdf\xdd\x6a\xf3\xbb\x50\x0e\x36\xd3\x5e\xca\ -\xbf\x47\xdd\x10\xe4\xd5\xad\x5b\xae\x54\xf6\xc8\x65\xc3\xce\xfe\ -\x67\x12\xff\x4f\x9b\x4d\xd2\xff\xf2\x36\xc7\xfe\x14\x22\x55\x3a\ -\x83\xe3\x70\x16\xd1\xf7\x87\x67\x21\x27\xe9\xbf\x8a\xfb\xce\x61\ -\xbe\x88\x53\xfc\x91\x10\xa3\xf8\xbd\x2f\x5b\xc9\xf7\x6e\x54\xd8\ -\x26\xc4\x2f\x64\x07\x17\x1e\x4d\xfb\x41\x16\x43\x1d\x00\xed\xc0\ -\xc8\x03\x6c\xa6\xbf\x69\xa9\x03\x24\x61\x3f\x12\xd6\xa4\x9b\x0c\ -\x1d\x7a\xb8\x5f\x3c\xeb\x5d\x03\xfb\x6e\xf9\x96\x58\xbe\xfe\x83\ -\x7a\xf2\x75\x69\xf3\x76\xb8\xff\x0c\x9d\xaf\x02\xe2\x7d\x1b\xdf\ -\x25\x9c\x87\x7d\x4f\x87\x27\xe1\x73\xca\x9d\x40\xfc\x77\x14\xee\ -\x95\x49\xfe\x4b\x62\x4c\x9a\xc9\xba\x08\xfa\xab\xa3\xce\x34\xc6\ -\xdf\x3e\x6b\x25\xef\xbb\x73\xe7\x33\xd9\xfe\x83\xf6\x5f\x53\xee\ -\x3d\x8d\x0a\x7d\x1f\xd9\xff\x42\x65\x8f\xff\xd3\x19\x90\x71\x7f\ -\xb8\x36\xe3\x23\xa5\x93\x70\x9b\x5f\x5e\xe9\x3a\x6f\x60\xf8\x99\ -\xcc\xd0\xfc\xc3\x69\x65\x07\x06\xba\x88\x7a\x00\xcb\x46\x15\x19\ -\xf3\x58\x66\x3f\x30\x9c\x03\x8c\x03\x08\xa4\xca\x77\x1b\x83\x25\ -\x57\x74\x3f\xbd\xbe\xcc\xef\x30\x87\xa3\x87\xbf\x93\x01\xbd\x3b\ -\xe7\xcc\x00\xde\x63\xec\x54\x9d\x70\x3f\x4f\x38\x87\xf6\x16\xb6\ -\xb9\x64\x60\xff\xc7\x61\xff\xc7\xd1\x07\x61\x61\x1e\x1e\xd3\x1f\ -\xa4\x01\x09\xb2\x43\x00\xee\x5b\x9c\x83\x99\xb0\xa7\x5d\x27\xfc\ -\xdb\x2b\xca\xbf\xdd\xbd\xe7\x9a\x0f\xa4\x64\xbc\x2b\xd1\xba\x10\ -\xdb\x3c\xc6\xc3\x2d\xfc\x9f\x18\xae\x4a\x19\x90\x7d\x02\xb4\x06\ -\xc4\x13\x1b\x94\x33\x36\xd0\x97\x7d\xcf\xea\x96\x7a\x43\xc2\x9e\ -\xa8\xff\xb6\x6f\xa5\xfd\xd2\x0e\x6b\x36\x98\x37\xdb\x35\x19\x0b\ -\xc0\x36\x20\xb4\xc9\xa1\x0e\x18\x85\x75\x8f\x1a\x15\x37\x34\x54\ -\x75\x03\xfb\xe6\xdd\x0b\xdf\x9e\xe0\x27\x33\xc6\xfc\x0f\xd1\xde\ -\x97\x0f\xc3\xde\x87\xeb\x24\xdf\x29\xda\x8f\xf6\x76\x8a\xb5\x06\ -\xf9\x2f\x13\x99\xe4\xfc\x0b\x1b\x75\x80\x32\xe9\x22\x8a\x07\xa4\ -\xe4\x19\x40\x3a\x90\x20\x5b\x4c\xcd\x4d\x44\xa6\x01\x1f\x7b\x9e\ -\xb4\xec\x97\xdd\x9f\x7a\x49\x0c\x78\x1d\xc6\xb9\xa3\xcd\x1b\xdf\ -\x93\x68\x80\x23\x65\x90\x50\x4b\x06\xc4\x6b\x92\xff\x88\x06\x56\ -\xc9\x06\x80\x71\x92\x63\xa1\xca\x37\x57\xb9\xd6\x1b\x12\xa2\xf6\ -\x4d\x9f\x4e\x81\xfc\x9f\xf6\x01\xee\xc3\xba\x14\x70\x6d\xa4\x2d\ -\x90\xd6\xde\xe1\x58\x20\x8c\x01\x89\x52\x1c\x58\xd9\x1d\x0e\x56\ -\x5c\xcb\x47\xf6\x98\xfc\x85\xbf\xa1\xe7\xa5\x19\xe3\xf6\xc7\x48\ -\xe7\x77\x90\xee\xd7\x98\xfe\x23\xfe\xe3\xfe\x47\x58\xf6\x42\x3a\ -\x80\xf8\x8f\x32\x58\xc1\x2c\x11\x6f\xce\x91\xcd\x1d\xed\x2f\x6c\ -\x87\x4a\xd9\x5c\x7f\x03\xf7\x9f\xf4\x41\xe0\x55\xa3\xa1\x77\xff\ -\x83\x58\x9e\x2d\xb6\x77\xe7\x4e\xfb\x55\x68\x7f\xc8\x18\x4c\xeb\ -\xc8\xde\x65\x55\x68\xdf\xc7\x3d\x39\xb4\xe2\xc9\x80\x39\xa5\xff\ -\x23\xff\x31\xcb\xcc\x83\x9c\x49\x7c\xef\xab\x2e\x6e\xd5\x37\x0e\ -\xf4\xf6\xbe\xf0\xee\x6c\x00\xf6\x06\x47\x10\xf6\x1f\xf8\x6a\xde\ -\xaa\x7b\x32\x00\xe9\x80\x61\x8c\x07\x96\x67\x00\xf8\xef\x18\xd0\ -\x80\x61\xe0\x13\xf0\xe7\xcf\xbf\xd0\xfd\x77\x98\xaf\xba\x29\xe7\ -\x2c\xc0\xda\x4a\xb9\x2f\xcc\xfc\x7f\x3c\x22\x65\x3f\x5a\x77\xc6\ -\xb9\x6c\xb8\x48\xfc\x77\x1c\xbe\x27\x0f\x7b\x8c\x67\x80\x63\x12\ -\x2a\xb4\xff\x49\x1c\x52\x16\x24\x3f\x01\xfa\x0c\x40\x8e\x84\xed\ -\x7f\xf6\x32\x5e\x35\xba\xdf\xaa\xfd\x88\x62\x5e\x8d\x69\x92\xe7\ -\xd0\xde\x81\xcf\xc4\x31\x80\xe5\x25\x34\x80\x7c\x82\x61\x8e\x87\ -\x42\x5b\x04\xea\x7e\xa8\x87\x8e\x99\x53\x6e\x60\xe8\x79\xcd\x8b\ -\x5f\xf9\x0d\x01\x81\x5d\x5d\x99\xfb\x92\x83\x75\x37\x3d\x34\x43\ -\x76\xe0\x3c\xf0\x80\x82\xc5\xb4\x31\x63\xb1\xef\x1b\xed\x3f\x14\ -\x0f\xe8\xb0\x1d\x18\xe3\x41\x47\x42\xc5\x65\xe5\x3f\xc6\x46\xca\ -\xff\x9a\xb5\x90\xf7\xc3\xd9\x0a\x81\x0c\x15\xaa\x11\xbf\x1d\xf7\ -\x64\x7f\x35\xd4\xfe\x33\xfe\x17\x10\x37\x0d\xd4\xb7\xe1\x0c\x98\ -\x4c\x03\x38\x06\x93\x7d\x52\xa8\x8f\x20\x6d\x8a\xc1\xb8\x2a\xfd\ -\x91\x85\x65\xbc\x6b\x3c\x34\xb8\xe0\x26\x61\xef\xd3\xa0\x03\xe4\ -\x48\xd6\xa9\xd1\x28\xc8\x1c\x20\x92\x01\x3d\x5f\x90\xb4\x83\x62\ -\x2c\xbc\x59\x24\xfc\x47\xd9\x03\x64\x60\xd7\x1f\x7f\x35\x7e\xdf\ -\x66\x8a\xfb\x3c\x27\xf4\x08\x71\x38\x11\x5c\x38\x95\x35\xe6\x41\ -\x06\x9c\x05\xd9\x6b\x9a\xd7\x86\xf2\x63\x38\x1e\x0c\xeb\x1f\xa5\ -\x65\x5d\xa4\x18\xd9\x83\x01\x0f\x42\x64\x03\x7f\xc1\xf9\xee\x0d\ -\x44\xf9\xea\x42\x70\x01\xd6\x78\x16\xee\xd7\x24\xda\x3f\x0e\xb2\ -\x1f\xea\x7e\x38\xc8\xf6\x86\xeb\xed\xf0\x9a\x23\xbd\x9d\x40\xfd\ -\x0b\xf6\xbd\x00\x3c\xa8\x80\x72\x88\x51\x26\x1c\xc5\xdc\x3b\xa2\ -\xc5\xe4\x23\xac\x4a\x7b\x40\x91\x6c\x83\x78\x2e\xe1\xeb\x7e\x5e\ -\x9c\xbf\x46\xaf\x31\x66\x61\x3d\xd7\x69\xd2\xff\x94\xcf\x1b\x6d\ -\x8d\x48\x93\xf2\x52\x07\x40\xba\x94\x57\xf1\x40\xf8\xde\x98\xf7\ -\x45\xb2\x47\x99\x62\x21\x73\xce\xad\x3f\x10\x97\x49\x3e\xb4\x84\ -\x9e\xd1\xd1\x43\x9f\x48\x04\x51\x06\x84\x7d\xb2\x81\x4e\xc3\xda\ -\x14\x42\x0d\x19\x13\x2a\xfd\xdf\xa8\x07\x3a\x53\xd2\xff\x01\xb8\ -\x10\x26\xfc\x3f\x6f\x5e\x70\x77\xf7\xe8\xc7\x73\xf6\x02\xac\xf5\ -\x0c\xe1\x19\xae\xf3\xb8\xd4\xfd\xf2\xc4\xff\x2b\x94\x73\x99\xb7\ -\x95\xdd\xa5\x44\xf2\x7f\x2e\x88\xf8\x5f\x27\xdc\xa7\x98\x14\xe9\ -\xab\xa1\xfc\xfb\xb6\xfd\x4f\xda\xec\x8f\x41\xd9\x74\x24\xd6\x7c\ -\x00\x4e\xdc\x33\xcf\xf7\x3c\x0e\xc6\xfe\x9a\xd3\x24\xc7\x33\xfd\ -\x87\xf7\x44\x99\xc4\x51\x39\x60\x98\x07\x2c\xe3\x00\x48\xff\x67\ -\x3f\x78\x9a\x62\x61\xcb\xa4\x33\xc6\xf7\x97\xff\x1d\x6e\xf5\xbc\ -\xb5\xdc\x80\x4e\x43\x60\xf4\x6d\x9f\xe7\x18\x9c\x59\x8a\x09\xce\ -\x11\x7e\x20\x5f\xac\xb7\xe2\x82\x65\x1d\xbc\x04\xd0\x5d\xd4\x07\ -\x31\x3f\xc4\x17\x78\xfa\xad\xe7\xb9\xed\x9e\xe1\xb1\xc3\xdf\xca\ -\xd9\xf3\xb0\xb7\xa0\xf7\xc1\x79\x1a\x0f\x37\x88\x06\x10\xae\xc9\ -\xb8\x7b\xe2\xb5\xd6\x14\xed\xff\x55\x71\x90\xff\x46\xdf\xfb\x37\ -\xa9\xc1\xfa\xa9\x09\xdc\x13\xd0\xd1\xf2\x24\x03\x72\xbc\x7e\x56\ -\xca\xe1\x94\x87\x43\xb6\xf8\x2a\xc5\xa7\x23\x4f\x4a\x00\xbd\xba\ -\x32\x7d\xc3\x79\x65\xc1\x30\xfa\x14\xb1\xf6\x0b\xbe\x9f\xa4\x01\ -\x28\xeb\x2a\x7d\x24\x2f\x6d\xc1\x18\x07\x48\xb1\x7f\x98\xf7\x27\ -\xe3\x60\x39\x0e\x0a\xce\xfc\x36\xf1\x46\x71\x99\xd5\x7d\xed\x15\ -\x3d\x7f\x9d\xc0\x98\x60\x53\xee\xbd\xa9\x74\x40\xae\x81\xa9\xe2\ -\x5f\xbc\xfd\x47\x1a\x00\x7b\x96\xca\xbe\xbf\x21\xce\xbd\xde\xcf\ -\xc8\x5b\x47\x1e\xca\x5b\xf3\x92\xf6\x4b\x7d\x8b\x68\x6d\x55\xda\ -\xf7\x64\x8c\x05\xae\xb7\x51\x04\x59\xee\x1d\x3f\x14\x88\xa6\x43\ -\xef\xbe\x23\x05\xf7\x27\xf9\x1c\x6b\x34\x99\x15\xb2\x49\x72\x0d\ -\x26\xf6\x0d\x25\xa5\x3c\x48\x39\x0a\x4e\x91\xf4\x82\x18\xe0\xb7\ -\x38\x8f\x6d\x2e\x12\xa9\xdc\x9b\x21\xfb\xdf\x8c\x9b\xc1\x1c\x20\ -\x8b\x75\x00\xd4\x75\xf2\x92\x06\x70\xbc\xe7\x94\xf7\x6c\xe8\x07\ -\x21\xd9\x13\x78\x52\x34\x50\x73\x7b\x42\x07\x4e\x75\x75\x89\xeb\ -\xd7\x63\x1f\x3a\x05\xc0\xcc\xae\x1c\x1e\xaa\x9c\xc4\xbc\x16\xb2\ -\x8b\x90\x9f\xa3\xca\xfa\xb7\xb4\xc1\x91\x1d\x00\x6d\xc1\xc4\x03\ -\xa6\xc8\x26\x17\x0b\x4e\x62\x1c\xc4\xcf\x9d\xed\x9e\xbd\xfd\xcf\ -\x7c\x1b\xc5\x5a\xda\xcc\x47\x38\xb6\xa4\xad\xb6\x1a\xe5\xd5\xb0\ -\x7f\x01\xe9\x4b\x3a\x58\x73\xfb\xb7\xff\x8c\xca\x2d\x08\x85\x86\ -\x3e\xfa\xf5\x68\xb0\xb2\x98\x81\x75\xcf\xc2\xc8\x5b\x1c\x9f\x9c\ -\x23\x1f\x80\x8c\xc9\xa1\x18\x25\x79\x1e\x49\x1f\x04\x99\x35\xd6\ -\x40\xdf\xc4\xe0\xd9\x9e\x69\x38\x74\xeb\xdf\x25\x4c\xb6\xff\x50\ -\xfc\x27\xdd\x93\xed\x9d\x54\xfb\x4d\xfa\xbe\xe9\x6c\x62\xfc\x33\ -\x3c\x5f\xda\x2a\xca\x18\xe8\x9a\x9b\x1c\x6a\x3e\xb0\x75\xeb\xee\ -\x37\xc1\xad\xd6\x22\x06\x72\x23\x41\x57\x5f\xd7\xfe\xd7\xc7\xe8\ -\x9c\xc3\xba\x06\x79\xcd\xc9\x17\x0c\x34\x0f\x7d\x41\x1c\x0b\x02\ -\xfb\x8e\x31\x01\xb0\x26\xe4\x0f\x80\x7f\x63\x05\x0f\x7e\xfd\x6c\ -\x37\x8c\xda\x9f\xf8\xef\x34\xd5\x56\xac\x73\x8c\xa5\x8c\x2b\x26\ -\xfa\x2a\x73\xaa\xb3\xa0\x4b\xa3\x8d\x05\xf7\x12\x64\x81\x87\xe1\ -\xcf\xda\xf5\xb8\x61\xd3\x78\xff\xdd\xf1\xe0\x14\xe8\xeb\xf0\x37\ -\x38\x00\xc7\xc9\x2e\x80\xfb\x64\xb3\x6f\x32\x25\xe3\x31\x92\x28\ -\x9b\x82\x6e\x1a\x31\xaa\x8f\x82\x64\x7e\xd6\xfd\x19\x1e\xfe\x10\ -\xec\x7f\x8d\xea\x7a\x63\x8c\x19\xc7\x80\xc8\x1a\x7f\xb6\xa4\x43\ -\xf8\x5c\xf6\x24\xd5\x7d\x4b\xc3\x67\xca\x9a\x64\x1f\x04\xc8\x0b\ -\x11\x63\x1a\xeb\xfd\xfa\x61\x64\xc5\x65\xc6\x03\x00\x76\x47\x8d\ -\x5b\xbe\x90\x86\xf5\xce\x62\x2c\x10\xae\x37\xda\x61\x30\x16\xc0\ -\x84\xf5\x80\xb5\xce\xd0\x5a\x4c\x02\xfe\xc0\x30\x26\xdd\x84\xbf\ -\xea\x0e\x0f\x7d\xcc\xed\x11\x3d\x4f\x6e\xbf\x11\x5c\x5f\x99\x06\ -\xfa\x5a\xb0\xeb\xec\x63\x41\x1b\xab\x53\x92\xf5\xb4\x26\x69\xe4\ -\xec\x29\xf2\xf9\x62\xcc\x15\x7e\xcf\xf8\xc8\x27\x10\x6f\xf7\x9f\ -\xf1\x4c\x46\xd4\xb8\xf9\xeb\x39\xb9\xff\x79\x13\x47\x91\xe4\x45\ -\xf4\x11\x21\x8e\x66\xd0\x3f\x8d\xbe\x09\xd0\xcb\x93\xc0\x43\x30\ -\xa6\xed\xc9\xd1\x0f\x7c\x51\x9c\x85\x2f\xa5\xe2\xef\xf9\xbb\x34\ -\xbc\x5b\x0a\x46\xc6\x60\x1b\x73\xd6\x94\x79\x1e\x16\xd7\xfc\xc9\ -\xe3\x19\xb0\x6f\xa3\x67\xcb\x58\x87\xe1\xde\x30\xe0\xf9\xd2\x46\ -\x0d\xe4\xa3\xc3\xdf\xdf\xc6\x3d\x42\x70\x5c\x76\x75\x1f\x41\xa1\ -\x7d\x11\xd6\xc6\xc2\xb8\xe0\xb4\xd1\xa0\x77\xc6\x1a\x89\x44\x6b\ -\x2d\xb6\x05\x26\x3d\x5b\x3c\xd2\x8a\xaa\x3b\x1a\x20\x3d\xe0\x03\ -\x67\xdc\xea\xcd\x51\xe3\x0e\x58\xb7\x59\xaa\xb1\x97\x93\x36\x16\ -\x95\x6b\x95\x95\x76\x15\xaa\xb7\x8b\x7e\x55\x90\x3b\x82\xc3\xef\ -\x9a\x3d\xc7\x33\xfd\x3f\x69\x63\xfa\x54\x3a\x00\xb2\x23\xfa\xed\ -\x89\x67\xcb\xfc\x1d\xaa\xc5\xd6\x92\x07\x39\x56\x19\xeb\x15\xd4\ -\x17\x61\x7b\x5e\x74\xe6\xbd\x8c\xe1\xc9\xbf\x8b\x1b\x58\x03\x6c\ -\x86\x62\x8c\xa9\x06\x94\x55\xf7\xea\x40\x50\xec\x73\x88\xe3\x1f\ -\xb3\xd2\xf6\x9d\xa1\x78\xc4\x3a\xec\x3d\xfa\x8d\x66\x41\xc7\x20\ -\x9b\x27\xd6\x7c\xb9\xdc\xfa\xc1\xe0\x79\xfe\xc9\x54\x1c\x64\x23\ -\xb2\x91\xc0\xda\x1a\x15\xde\x7f\x9b\xe5\x2f\xaa\x87\x6d\x29\x5d\ -\xb8\x4c\xeb\x8d\x32\xb1\xb1\xef\xda\x76\x3d\x60\xfb\x90\xf3\xf6\ -\xdb\x13\xc6\x3c\xc5\xf9\xb1\x2d\x99\xfd\xfd\x59\x19\x5b\x8a\xfb\ -\x4f\x71\x9e\x14\x83\xdf\x24\x9d\x4c\x9c\x5b\xa7\xca\xa5\x8d\xd9\ -\x1f\x64\xd1\x67\x8b\x32\x9b\xf2\xdd\xa3\x4c\x88\xb5\x38\xc9\x2e\ -\x5f\x93\xf1\x19\x55\xf2\x11\xa5\x80\x56\x5f\x91\x9d\xfc\x17\xf8\ -\xdb\xbd\xed\x37\x72\x46\xca\x9f\x43\xff\x5f\x1c\x7d\x00\x58\xff\ -\x93\xce\x66\xbd\x15\xf7\x8a\x7c\x4a\xea\x01\x4b\x9e\x93\x74\x51\ -\x90\x1b\xec\xc6\xf7\xe0\x36\x23\x7d\xbb\xa2\xa8\x03\x6e\xea\xf8\ -\xcf\xb3\xc0\x80\x18\xbc\xe1\x4b\x41\x1f\xe8\x48\x81\x06\x9f\x79\ -\xb3\xc6\xe7\x80\xf4\x80\x2a\xd3\x00\x19\x93\x41\x3e\x18\xab\x4a\ -\x72\x41\x60\xff\x4b\x0e\xb5\xdd\x67\x7f\xdc\x38\xf2\x6f\x49\xb4\ -\x27\xc9\x3c\x0b\xb2\xb1\xca\x1a\xab\x54\x67\x59\xda\x14\x28\xee\ -\x1b\xce\x48\xc2\x6e\x9c\x3e\xcf\x73\xf5\x87\x23\xd7\x7f\x83\x64\ -\x76\x38\x97\x79\xcc\x57\xc3\x33\x80\x7a\x01\xea\x04\x98\x93\x85\ -\xcf\x68\xd7\x64\xcc\x30\xc7\x8b\xe0\x39\x80\xa3\xf8\xaa\xf6\x1b\ -\x0d\x8f\x4d\xfd\x5d\x02\xf0\x38\x49\x75\x2f\xb8\xfe\x33\xd5\x01\ -\xb0\xaa\x5e\x3c\x52\x5e\xc6\x03\x52\xdc\x77\x58\xd6\x7c\x35\xca\ -\x14\x33\x98\xb2\x6a\x3f\x04\xae\x82\xb9\x1f\x57\x8a\xcd\x1d\xff\ -\x7d\x36\xd8\xba\xa5\xfb\xba\xa6\x39\x50\x7f\x6c\x64\x68\xfa\x11\ -\x94\xdd\xb0\x17\x4a\x86\x7a\xa1\xf0\x9e\xa7\xc9\x0e\x8f\xb6\x60\ -\xb6\x85\x63\x4c\x5c\x16\xf0\x65\xdf\xfe\xa7\xb7\xeb\x43\xd1\x94\ -\x7f\xe1\x04\xd6\xd8\xce\xda\xb0\x5f\xa4\xf7\x55\xc9\xef\x97\x8f\ -\x70\x9c\x2f\xe1\x94\xc3\xf9\x54\x19\xcc\x43\x0e\xcf\xfd\xe7\xf9\ -\x1e\x6c\x47\x97\x78\x45\xcc\xe4\x9a\xdd\xe8\xa3\xc0\x58\x25\x94\ -\x51\xd0\x57\x4d\x7b\x4f\x31\xa2\x1c\x9f\xc5\x7b\x5f\xa2\x73\x91\ -\x1c\xa9\xff\x18\xc8\x5a\x5a\xdd\x27\x31\x0a\xfb\x8f\xf5\x1f\xe0\ -\x3e\x28\xcf\x21\xef\x61\xde\xa4\xfc\x51\x55\x19\x0b\x0e\x7c\x0a\ -\x63\xd1\xc3\x55\xb2\x37\x52\x2c\x22\x3c\x6b\xdc\x9c\x5e\x1c\x19\ -\xfd\x9d\xd5\xc4\x3e\x6e\x0a\xd8\x2a\x46\xdf\xb1\x6b\xd7\x1d\xdf\ -\xeb\xdf\x26\xb2\x49\xbb\xf2\x1f\x58\xe7\x94\xe4\x1e\xd4\x03\xb1\ -\x46\xbe\x17\x8f\xc5\xfe\x18\xcc\x89\xc2\x78\x8e\xe1\xf0\xeb\xbc\ -\xba\xa1\x3b\xc5\xce\xd7\x64\xcd\x05\xae\xaf\x6f\x32\x6d\x2d\xc8\ -\x3a\x0b\xec\x4f\xe2\x5c\xba\x5c\xb8\x41\xf9\x1f\x18\x7f\x1c\x8f\ -\x4f\xde\x7e\xa1\x67\x1b\x36\x9b\x0f\x11\x3f\xc1\x9c\x45\x92\x2d\ -\x9b\xa4\x13\x92\x9f\x42\x9e\x81\xb4\xad\x7a\xb5\x94\x89\x2f\xe1\ -\xde\xf5\x89\xf1\x29\x21\x71\x35\x37\x5a\xfc\x26\x9e\xa1\xa4\xd1\ -\xa4\x73\x83\xb4\xbf\xbd\x06\x0c\xea\xba\x79\x19\x97\xc2\xf1\x7f\ -\x2a\x0e\xa6\x4a\x31\x8b\x71\x78\x1f\xbf\xef\xf0\x23\xeb\xb8\x05\ -\x1d\x05\x90\xb5\x5e\xb0\x45\x7c\xfa\x61\xb1\x4f\x3c\x33\x15\x2e\ -\x2f\x60\x9d\x2b\x3a\x03\x16\xeb\x4a\xbc\x77\x15\xaa\x0f\xc2\x39\ -\x11\x80\x67\x06\xd0\x89\x70\xfd\x6e\x75\x8f\x91\x91\xf7\x7f\x2e\ -\x8d\xb6\x64\xca\xed\xe3\xbc\x52\xda\x7f\x89\xf7\x1c\x73\x8b\xf5\ -\x26\x1a\x84\xcf\x69\xae\x29\x74\xc1\xfa\x92\x3d\x42\xfc\x61\x88\ -\x64\x4a\xd8\x77\x1c\xc1\x1a\xef\xbf\xd4\xe1\xd3\x92\x0f\x30\x0d\ -\x40\x39\x60\x8a\x62\x56\x61\xff\x4e\x82\xaa\x86\x31\x02\x7d\xf9\ -\xc8\x14\xd5\x3a\xe0\xfc\xdf\xaa\xf4\x47\xd7\xdb\xfc\x3f\x8c\xfb\ -\x79\x59\x13\x92\x65\x55\xc6\xff\x14\xe5\xfe\x57\xdd\x88\xff\xd0\ -\xfd\xeb\xb9\x07\x1d\x86\x91\x6e\x31\x77\x6a\x77\xaf\xf8\xf5\x44\ -\xe2\xe3\x73\x69\xa7\xe1\xd5\xc9\x46\x3d\x3e\x63\x97\x65\x3c\x06\ -\xfb\x44\x50\x2f\xa0\x9a\x01\x76\x51\xc5\x82\x0c\x20\xfe\xe5\x81\ -\x57\x17\x90\xf6\xdb\x35\x89\xff\x55\x99\x67\xa7\xf2\x3d\xea\x4c\ -\xfb\xd1\x16\x1b\xb8\x1d\xf5\xbe\x65\xc4\x11\x00\x1f\xd8\xf9\xd3\ -\x6f\x4c\xd9\xb3\xa7\x51\x37\x29\x18\x1c\xaf\x9a\xf7\xe2\x15\x6b\ -\x5e\xbc\x78\xca\x64\x5b\x25\xc9\x18\x70\x16\xf2\xd1\x9b\xf0\x7c\ -\x3e\x15\xe3\x4b\xf3\x91\x86\x17\xff\x4f\xfb\x1f\x66\xff\xdf\xb8\ -\xe4\xfd\xe3\x18\xff\x13\xae\x78\xfe\x5f\xd2\x55\x1c\xce\xfb\x41\ -\xbd\x31\x6a\x37\xbf\xba\x6e\xab\xdf\x79\xd8\xd2\xbb\xa5\xf8\x8d\ -\xa1\xde\x37\xde\x1a\xc9\x1f\xbc\x11\x6d\x77\x69\x95\x2b\x69\xb7\ -\x6c\xc1\x1c\x9b\xcd\x3e\xd9\x9c\x8c\xdd\x81\xbf\x2d\x00\xfd\x78\ -\xee\x84\x51\xa7\x9c\xf2\xbc\xc5\xbe\x15\xb6\xab\xca\x1a\xdb\x61\ -\x59\x67\x84\xf6\x0c\x70\x1f\x78\xf9\xbe\x1d\x2f\xc4\x5c\xea\xe5\ -\xf6\xd2\xdb\x1f\xb5\x4a\x5f\xc5\xfc\xad\x8c\x0f\xee\x6d\x20\x0d\ -\xa8\x79\xf6\x61\xe2\x4d\x52\x2e\x21\x5d\xc5\x66\xbb\x0e\xd6\xb4\ -\x12\x62\xd7\x9d\x18\xc7\x80\xfd\x9d\x26\x90\xf7\x84\x54\xfd\x97\ -\x2a\xd9\xff\xc9\x37\x45\x3f\xcb\x58\xf0\x30\xcb\xab\x14\xff\xed\ -\x30\x6d\x41\x9d\x33\x6a\x35\x8e\xac\xe3\xfa\x77\x1c\xba\xba\x32\ -\xef\xec\x17\xd3\xc7\x1c\xe7\x95\xef\xcf\xa9\x3a\x99\x12\x57\x32\ -\x96\x94\xdb\x43\xb2\x4e\x10\xd0\xd8\xac\x55\x74\x27\xec\x49\x17\ -\x18\xec\x4f\xf5\x6e\xeb\x7f\xfb\x38\xd2\x66\xf4\xad\x91\x5f\xad\ -\xe2\xed\x3f\xc5\xd0\x86\xd8\x8f\x87\x31\xdc\x59\xea\xa1\x51\xff\ -\x1f\xc1\x35\xa8\x97\x0b\x78\x4e\x0e\x60\xff\x1e\xac\x5b\x81\xfb\ -\x3f\x6e\x73\xcc\x2a\xd9\x02\x6c\xd6\x55\xd2\x44\x07\x38\x66\x2c\ -\x43\x71\x03\x30\x8f\x7b\x1a\xe1\x7c\xa3\x2c\xc5\x17\x97\x49\xe6\ -\x43\x1b\x27\xc7\xff\x55\x64\x5c\x82\x94\xff\xc2\xad\xf8\x0f\xf2\ -\x3b\x23\x9f\xc1\x9c\x54\xa7\x3a\xb7\x4e\x4b\xbf\x21\x60\xdb\x36\ -\x91\xda\xb3\xad\x71\x3a\x3a\x58\xfd\x01\xfa\x48\xd2\x52\xcf\xca\ -\x49\xfd\x88\x75\xe2\xb2\xf4\x91\x94\x68\x2d\xf3\xc6\x94\xdb\xdf\ -\x3b\xfa\xa7\xce\xf0\x81\x4f\xe1\xde\xb7\x62\x2b\x2a\xec\xef\x0d\ -\xab\xbc\xf2\x2a\xd7\x51\x40\xd9\xdb\xdf\x70\x47\x47\x3f\x81\x36\ -\x9f\x95\xfa\xd2\xfb\xe2\x63\x87\xef\x45\x9b\x41\x5e\x9e\x01\xf4\ -\x13\x72\xee\x62\x95\xe5\x52\xaa\x65\xc5\xf4\x20\x23\x6d\x16\x19\ -\x9b\x9f\x9b\xf8\x7b\x88\x6d\xc8\xb4\xdf\x6d\xf1\xbf\x68\x57\xa4\ -\xf8\x23\x19\x9b\x4a\xf4\x5f\xe6\x21\x90\x9d\x2a\x58\x01\xfc\xaf\ -\x9d\xd5\x4e\x75\x19\xc1\xd0\x9e\x9e\xc6\x7f\x8e\xec\x03\xfc\x09\ -\x00\x9e\x1a\xd2\x17\x28\x73\x65\x55\x6e\x50\x56\xd9\xf0\xf1\x67\ -\x38\x03\x56\xe0\xf9\x1f\x4a\x84\x0e\x7f\x2d\x27\xf5\x7d\x5e\x53\ -\xf6\xab\xe6\xc2\x9c\xeb\xc1\xbd\x56\x6a\x14\x7f\x97\x08\x54\xdc\ -\x9e\xfe\x9f\x78\xef\x6a\x1e\xb0\xaf\x5b\xfc\x52\xd4\x9c\x5b\x44\ -\x39\x20\x17\x64\x1e\x90\xb7\x59\x0e\x24\x3b\x95\x3c\x03\xa4\xbb\ -\x4b\xbe\x40\x79\x5b\x32\xae\x0b\x79\x82\xc2\xf7\x89\xb0\x8c\xfd\ -\xc3\xfd\xb7\x78\xff\x29\x06\x51\xc6\xff\x64\x55\xdf\x1f\xf2\x43\ -\x02\xff\xb7\x2a\x97\x35\xfe\x03\xf4\xed\xdc\x5d\xf9\x8b\xb1\xc1\ -\x69\x37\xe1\x63\x7b\x1b\xd5\x86\x70\x54\x7f\x1c\x15\x1b\x55\xe4\ -\xfe\x68\x80\xfb\xe8\x37\x49\x46\x6e\xfe\x9b\xbc\x53\x7a\x80\x6c\ -\x67\x16\xe3\x10\xe2\x18\xe7\x57\x71\xae\x35\xee\x3d\xd5\x50\x82\ -\x7d\x8b\xf9\xd1\x3e\x23\x7e\x67\x95\xcf\xb8\x3b\x66\x4e\x7d\x2f\ -\x89\xfb\x4f\xb2\x60\xd5\xf3\x0f\x72\x9c\x48\x45\xf6\x6a\xa8\xc8\ -\xfc\x11\x99\xcf\x6e\xf3\x7e\x62\xac\xc1\x78\xa8\x22\x3f\x39\xe6\ -\x7f\x02\xcf\x03\x9d\x89\x56\x3c\x4a\x5e\xc5\xc0\x23\x2d\xa1\x38\ -\x34\xcc\xfd\xae\x5f\xee\xf8\xbf\xa5\x7b\xe7\x8b\x6f\x8c\xec\x99\ -\x71\x93\x98\x1f\x6e\xd6\x3d\x1f\x29\xe9\xc7\x32\x2e\xd6\xf3\xdf\ -\x92\x8c\x55\x76\x63\xc1\xa9\x07\xb2\xc0\x13\xd0\x7f\xa2\xe2\x28\ -\x58\x8f\x92\xf5\x55\x1d\xd6\x23\xd1\xff\x92\x0e\x36\xdc\x71\x93\ -\xe2\x47\x97\x1d\xbb\x7d\xe6\x33\xf6\x09\x71\xe3\x28\xc5\xab\xc8\ -\xfa\x05\x46\xf5\x8c\x58\xa1\x0a\xf9\xab\xc9\x86\x17\xe2\x33\x80\ -\x75\xcd\x54\x9d\x2f\x2f\xee\xcc\x3b\x03\x15\x38\x03\x2a\x16\x5d\ -\xd6\x82\x95\x3a\x60\x9a\x7c\xa0\x9c\x03\x12\x75\xea\x97\x3b\xfe\ -\x23\x43\x7e\x4d\x7c\x70\xc6\x4d\xf8\xeb\x64\xc3\x21\xff\xab\xcc\ -\x95\xcf\xc9\x58\x3d\xf4\x97\xe5\x65\x6d\x34\xce\x8f\x2b\xc9\xdf\ -\xb1\x3f\x8d\xe2\x67\xc8\xe7\xcb\x39\xa5\xdc\x37\xa7\xca\xbd\xb3\ -\x02\xf5\xc5\x9d\xbb\x9f\xf6\x67\x17\xf9\x98\x7d\xf1\xd1\xea\x37\ -\x99\x06\xf0\xfe\xe7\x6d\x3e\xa7\x9c\xc3\x2c\xfb\xb5\xa0\xfc\xae\ -\x7c\x85\x36\xd7\x73\x24\x1c\xb7\x26\x79\xdf\x69\xff\x4b\xfc\xe9\ -\x94\x65\x1c\xb8\x8c\x4b\x0a\x57\x64\xec\x13\xdb\xac\x70\x2d\x92\ -\x23\xcd\xcb\x7e\xff\xbb\x81\xbf\xc6\x86\xe6\x5d\xaa\x0f\x65\x34\ -\x49\x96\xf3\x6a\x25\x79\xb5\x32\xcb\x6d\xf1\x1b\x65\xb9\xde\xec\ -\x3f\x47\xdf\xa9\xaa\xa9\xa4\x7a\x2a\x66\x6d\x65\x4b\xaa\xbb\x57\ -\x3a\x65\xb4\xa1\xec\xb9\xd8\xe7\xdc\xd1\x25\x7e\x3b\xe2\x9f\x3d\ -\x85\xf5\x7c\x31\x5e\xb0\x40\x35\x6c\x28\x47\x97\x6d\x13\x0e\xcb\ -\xff\x59\x19\xcf\x41\xb5\xbc\xa9\xae\x0f\xe7\x7a\xd2\x9e\x87\xe5\ -\xfe\xd3\x59\x28\x7b\x31\xc0\x4c\xe7\xa4\xfc\xe7\xb0\x9f\x12\x75\ -\x96\x58\x68\xf6\x72\xa7\xff\x08\xf1\x14\xf6\x08\x18\x6a\xb0\xbd\ -\x5d\xd6\xca\x46\x3d\x80\x62\xa4\x6c\xce\x8f\x40\x7a\xcf\x75\x73\ -\x19\xcf\x28\x5e\xce\x9a\xe4\xfc\x39\x25\x3f\x85\x99\x16\xd3\xfe\ -\x63\x8f\x6d\x90\xa1\xf7\x9b\xef\x38\x5f\xdc\xe0\x4a\xc0\x3f\xea\ -\x4c\xdd\x9d\xc2\xdc\x65\xd4\x03\x90\x07\x50\x5c\x07\xe7\x0d\x50\ -\x9c\x88\x55\xf2\x62\xcc\xf2\x44\xdb\xcb\x9e\x9f\x9f\x62\xcd\x6d\ -\xa6\x07\x13\x4e\x49\xce\x49\xbe\x45\xe7\x5c\xd5\xc3\x64\xf9\x8f\ -\xfa\x3e\x85\x9a\x9f\x5e\xa3\x67\xdf\xc8\x10\x8f\xee\xbf\xc3\xa5\ -\x3a\x4d\x7e\xae\x0d\x91\x93\x32\xb6\xaa\x97\x9b\x97\x7d\x51\x28\ -\x8e\x43\xf2\x55\xa2\xfb\x0e\xd7\xcf\x52\xb5\x93\x3c\xbd\x8f\xfc\ -\x89\xa0\xf3\x1b\xc4\xf7\x57\xa2\xf3\x9f\x17\x80\x57\xbd\x6c\x14\ -\xe4\x94\xb4\xdc\xff\xbc\x8c\x15\xcb\xe1\xfe\x5b\x72\xff\xa5\x3c\ -\x47\x3d\x5e\xe0\x79\x31\xe7\x28\x2f\xfb\x7b\x50\x5c\x0a\xfc\x3c\ -\x11\xa9\x48\xd9\x5f\xee\xbd\x2d\x6d\x9b\x24\x43\x2a\xfb\x1f\xd6\ -\xa8\x6b\xfe\xeb\x5a\x3d\xfb\x46\x86\x18\xc8\xff\x58\x1b\x24\xed\ -\x67\xbf\x3b\xf9\x5c\x31\x16\x4f\xe6\x65\x52\xbd\x3c\x59\x23\x8d\ -\xea\xa4\xa1\x3d\xc0\xe6\x4f\xaa\xa3\x14\x2e\x4b\x5e\x51\x95\xb5\ -\xf3\x1a\xe4\x2b\x48\x84\x1a\x9f\x59\xeb\x67\x4d\x8c\xdd\xf0\x29\ -\xca\xe9\xc7\x1a\x16\x46\x45\xc6\x08\xb2\x8e\xaf\x62\xc5\x48\xa6\ -\xc7\xfd\x77\x8a\x9e\x8c\xc7\x7c\xbf\x2c\xe9\x40\xa9\x8d\xfe\x57\ -\xa4\xec\x5f\xa5\xb3\x8b\xfe\x04\xae\x47\x34\xed\xc6\x43\xf5\x53\ -\x6b\xfd\xfc\x1b\x11\xa2\xa0\xfb\x27\x7d\x58\x1b\x02\x6d\xf4\x35\ -\x92\x7d\xc8\xc6\x62\x57\x64\x8d\x28\x89\x53\x92\x9f\xb6\x46\x51\ -\xf6\x51\x90\xf1\x1e\xb6\x8c\xf3\x40\x7b\x2f\xec\x7f\x20\x74\xfd\ -\x5b\xd7\xfa\x59\x7b\xb1\x87\x9d\x6f\xd6\xcd\x04\x6b\x32\x66\x5c\ -\xe9\x02\x15\x19\xd7\x51\x6e\xa3\x01\xbc\xef\x44\xff\x25\xee\x17\ -\xa4\x3c\xd0\x4e\xff\xb9\x0e\x5a\x55\xf6\x7c\xa9\x52\x2d\xaa\xb8\ -\xd9\xa4\xde\x28\xf0\x95\xe9\x0b\x3e\xd4\x26\x87\x61\xe3\xfa\x1f\ -\xa2\x0e\x90\x86\x75\xf5\x6a\x03\xd8\x92\xae\xaa\x5a\x89\x6a\xcf\ -\xed\x62\x4b\x67\x96\xe7\x81\xcf\x08\xeb\xfc\x69\xf2\xf5\x60\x9c\ -\x4f\x09\x6b\xb7\x5c\xbb\x0e\x8f\xeb\x1b\xb6\xa7\x1e\xc6\xba\xce\ -\x99\x60\xd5\x2d\x98\x55\x69\x0f\x92\x32\xab\x17\xd7\x2b\xe9\x95\ -\xdd\xb6\xe7\x76\xd1\xb3\x01\x8c\xcb\x5c\xb4\xbc\x8a\x53\x93\x71\ -\x2f\x58\x93\x32\x49\xfe\x7f\xac\x4f\x5a\xc5\xfa\xaf\x97\x53\x0d\ -\x80\xb3\xc2\x0e\x21\x3e\x9c\xf4\x1f\x71\xd3\x58\x27\x38\x20\x6b\ -\x44\x5b\xb2\x46\xb0\xa5\xfa\x63\xb7\x70\xbf\xe0\xe1\xbf\xac\xa7\ -\x2b\xf7\x1e\x71\x1f\x63\x2d\x12\xfe\x06\xc6\x15\x3e\xb2\xda\xda\ -\x71\x17\x82\x6d\x42\x5c\x1f\x33\xa7\x17\x31\xee\x34\x07\x67\x20\ -\x6b\x94\x3d\xfc\x57\x7a\x8b\xaa\xeb\xe5\xd5\x79\x91\xfa\xbf\xd2\ -\x05\xf2\xd2\x2e\xc8\xb1\x4a\x6a\xff\x6b\x32\xef\xb8\xe6\xc6\xe1\ -\x3d\x30\xff\x13\x54\xcf\x3f\x5a\x8f\x77\xd8\x60\x70\x55\xd4\xa8\ -\x3f\x18\xf7\x63\x6e\x78\x83\xf0\x8a\x63\xae\x24\x6d\x54\xfb\x1d\ -\x6a\xe1\x7d\xa1\xed\x9a\x6b\x08\xf1\xfe\x63\x1c\x59\x12\xee\x11\ -\xb7\x6e\xbd\x0b\xee\xeb\xac\xd3\xf3\xee\x4f\x84\xcb\x5f\xc5\xf8\ -\x9f\x4c\x80\x73\x47\xf3\x84\xff\xca\x0e\xd9\xea\xe9\xae\x9e\x91\ -\x68\xbf\xa4\x05\x13\x64\x03\x6e\x9d\x61\xa6\x19\xec\x53\x22\xfe\ -\x4f\xf1\x1f\x70\xfe\x23\x44\xff\x9f\xb1\x4e\xef\xb0\x91\x60\xab\ -\xed\xbc\xf3\xb3\x09\xd0\x01\xd0\x4f\x8b\xb2\x15\xe7\x04\x54\x3d\ -\x9d\x2a\xef\xf1\x81\x62\x8b\xee\xab\x3c\x0a\x5b\xc9\xfd\xec\x43\ -\xce\x18\x0d\x94\x9b\xd6\x93\x6f\x6e\x01\x9a\x75\x60\xd8\x3f\x47\ -\x31\x1e\xa8\x0b\x78\x34\xc0\x56\xb2\xa8\xd2\x03\xa5\x2e\xe0\xf1\ -\x7d\x8e\x73\x47\xfb\x7f\x4b\xf7\x53\xf6\x63\x8e\x2b\x44\xf9\x0f\ -\x63\x0a\x33\x91\xd2\xff\x5d\xc7\x77\xd8\x68\x70\x4d\x74\x68\x8e\ -\x7a\x05\xa1\x9d\x1d\x7d\x41\x59\xb3\x25\x03\xb2\xde\xd7\xe2\x01\ -\x2c\x63\x31\xee\x64\x14\xee\x98\xec\x43\x04\xde\xff\xc5\x4b\xf0\ -\xbc\xfb\x47\x87\x3f\xf6\x23\xec\xd1\x84\xbe\xba\x7c\x5b\xfe\x68\ -\xeb\x0c\x14\xcf\x4a\xb7\x0a\x76\x4b\x2f\x20\xdf\x9f\xd4\x5b\x5b\ -\x71\xa5\x35\xd2\x01\xe3\xf6\x8d\x9b\xb6\xff\xd5\x6a\x60\xc4\x77\ -\xfb\xb7\xd3\xa0\x07\xb2\x1d\x88\xfd\xba\x98\x8f\x9f\x93\x38\xb2\ -\x74\x2d\xa5\x6f\xd5\xe1\xde\x2a\x68\xeb\xc3\x18\xeb\x84\xaf\xe4\ -\xf6\x6d\xff\x89\x55\xd5\x0c\x5d\x29\x80\x1c\xf0\xbf\xa2\xe6\xcc\ -\x49\xea\xef\x66\x55\x64\xfe\x28\xd3\x80\xbc\xb2\x03\x2a\xfb\x7e\ -\xbb\xec\x2a\xe9\x81\xf7\x1e\x32\x1e\x3c\xed\x70\x2d\x62\x3c\x07\ -\xd9\x50\xe5\x74\x6f\x7f\xfc\x25\x97\xe2\x3d\x36\x0a\x84\x43\xb7\ -\x4d\x63\x7d\xa0\x8c\xbf\x4e\x31\x57\xe4\x6b\xb5\xda\xf0\x49\xf2\ -\x54\x75\x1e\x94\x9f\x8f\xec\xfd\x68\xf3\x21\x7f\x4f\x05\xe3\xbb\ -\x2f\xba\x7e\xf7\x32\xa1\x7f\xd8\xb9\xf9\x33\x49\xb2\x05\xd6\x28\ -\x67\xa8\xa5\xb3\x48\xdb\xb5\xec\xe9\x48\x32\x80\xd2\x05\xbd\x6b\ -\x15\x23\x50\x95\x3e\x64\x8e\x27\x49\x51\x6d\xf4\x32\xc6\x7f\xff\ -\xe4\x25\x7a\x8f\x0d\x01\x5b\xc5\xf0\xfb\x33\x81\x05\xd2\x01\xc6\ -\x81\xae\xa2\x9d\xbd\x7d\xff\xd5\x9a\xaa\x5a\xea\x19\xe9\x7b\x53\ -\xf5\x12\xd3\x81\x9a\x3b\x66\x1d\xfa\xbc\xb8\x84\xf9\x32\xbd\x42\ -\xbc\x74\x14\x7d\x17\xb0\xff\xa4\x0b\x9a\x25\x0f\xff\x79\x6f\xa5\ -\x0f\x30\x5c\xf6\xf6\x9c\xfb\xfd\x4a\x79\x20\xcc\x7e\xee\xac\xa3\ -\x62\x3f\xd8\xfe\x07\x67\x04\xeb\x1e\x6e\xe6\xfe\xb7\x2b\x86\x6e\ -\x21\x7e\xbd\x10\xf8\xe4\x22\xd6\x09\x1f\xc7\x78\x9b\x60\x8d\xfc\ -\x2c\x79\xe9\x0f\x56\xba\x15\xd5\x8d\xa6\xdf\x29\xdc\xaf\xb1\xdc\ -\x17\xac\xa2\xce\xbf\x5a\x3f\xef\x6a\xa1\xcf\xf1\x1d\xfe\x7e\x86\ -\x62\xc4\xf1\x79\xd9\x6e\x59\x08\x71\x1e\xaa\xf2\x4d\xa8\x3a\x9f\ -\xf9\x36\x39\xb0\x20\xe3\x43\x94\xfc\x47\x34\x40\xf6\x8a\x18\x4f\ -\x1d\xc2\xba\xb7\x97\x53\xed\x8f\xe5\x40\x21\x1d\x2c\x3e\x90\xa1\ -\x3a\xe1\x75\x77\xdc\x6c\xc8\x98\x3b\xc9\xe7\x55\x5c\x9f\x53\x95\ -\x78\x52\xe1\x7e\xa2\x58\x2f\xdd\x57\x75\x27\x46\x3f\xf6\xf7\x70\ -\x8f\xdd\x97\xfa\xa1\xb7\x89\xc0\xc1\xa4\x39\xb3\x98\x93\xf6\xc0\ -\xbc\xa5\x7a\x3d\xa8\x7e\x2f\x1c\xe7\xc9\x75\xff\xb8\x06\x19\xd7\ -\xfe\x57\xfd\xe0\x54\xec\x57\x55\xea\xb0\x45\xb7\x77\x47\xe2\x4d\ -\x97\xfa\x3d\x36\x00\x6c\xdd\x2d\x12\x9f\xcf\x1b\x5c\x1f\x6a\xc2\ -\x44\x39\xa0\x46\xb5\x53\xb8\x46\x94\xdc\x77\x93\x7d\x7c\x29\xca\ -\x09\xab\x93\xad\x1f\xeb\x38\xc2\xdf\xff\x6a\x87\x9e\x3b\x19\x0b\ -\x54\xef\x4f\x9b\x5c\xeb\x25\xeb\xf9\x85\xa4\x7d\xc7\x8b\x51\x91\ -\xbd\xbe\x6c\xd5\xff\x95\x63\xff\x55\xae\x0a\xc9\x32\xf0\x37\x13\ -\xa3\x0d\xcc\xfb\x30\x3a\xf4\x2e\x1d\x05\xe0\x01\xbf\x94\x36\xe7\ -\xa9\x57\x44\x01\x63\x77\x2c\x8e\xf1\xa5\xba\x2c\x98\x1f\x66\x31\ -\xbe\x73\x0e\x8e\x8c\x19\xf5\xc3\x3a\x8e\xde\x8c\xb5\x72\x3b\x95\ -\x27\xd7\x15\x08\xfc\xee\xcd\x1c\xc3\xd8\x60\x59\x30\xd4\x90\xf5\ -\xad\x5b\x79\x7e\xf9\x90\xaa\x3f\x2c\x7d\x04\xe1\x8a\xec\x81\xc7\ -\xb9\x1f\xb4\xff\xf0\xb7\xa9\x50\xfd\x5f\x3a\xf4\x1e\x1b\x02\x32\ -\x66\xf3\xdb\xd8\x2f\x36\x17\x68\x72\x0e\x26\xf5\x6c\x6a\x90\x6d\ -\x97\x72\xe9\x80\xd7\x62\xfd\x0d\xdc\x7f\xf4\x15\x3d\xc9\x29\x63\ -\x8f\xbc\x44\x27\x9f\x19\x74\xc1\xa9\x24\xc8\x9f\x58\xf3\x87\x72\ -\x06\xb1\xee\x87\x59\x95\xf5\xc7\x39\xef\x2f\x67\xab\xfe\x6f\xaa\ -\x0f\x78\x8b\x9f\x71\xde\x2b\xbf\x4f\x6a\xf8\xc8\x97\x3b\xf9\x2e\ -\x9d\x86\xbd\xbb\x9f\x35\x97\x09\x32\x0d\xc0\x5a\xc1\x19\xaa\x0f\ -\x50\xa7\x7c\x2c\xf4\x8b\x63\xae\x18\xdb\x7a\x80\x3f\x00\x2f\xd8\ -\xdb\xff\x73\xef\x12\x9d\xcf\x91\x7f\x55\xc6\x5e\x80\xe7\x9c\xe1\ -\x1a\xe7\xb2\xdf\x69\x96\x72\x1a\x38\xa6\x35\xaf\xce\x41\x48\xc5\ -\x29\x56\x3d\x9f\x65\xda\xe6\xf3\x8c\xfe\xab\xb8\x43\xf6\xcb\x4d\ -\x5f\xf3\x7f\xb5\x80\xb5\xfc\x12\x16\xac\x65\x80\x63\x02\xb0\x77\ -\x18\xd6\x89\x48\xa1\x5f\xcf\x40\xdc\x6f\x52\x5f\x1d\xac\x1f\x75\ -\x65\xe4\x10\xf6\xf1\x5c\x49\x7d\xf8\xf5\x82\x7e\x73\xf0\xe6\x7f\ -\x8c\x02\xef\xc2\x67\x24\x5f\x36\x9e\x5d\x93\x6b\x5b\x60\x5c\x33\ -\x9e\x05\xcc\x03\x45\x3c\x57\xfe\xaa\x0c\xd9\xad\x60\xef\x9d\x06\ -\xf5\x9e\xc2\x9a\x12\x58\xff\x54\x74\x4e\x96\xd9\x10\x30\x16\xfe\ -\xe3\xbf\x4f\x18\x0b\x54\x0b\x03\x6b\xc6\xe3\x59\xc0\x1e\x52\x29\ -\x93\xcf\x00\xe6\xf3\x15\x42\xb5\x07\xe1\x9f\x5e\xdd\xe9\x67\x6d\ -\x83\x2b\x9c\xc1\xc9\x6f\x27\x83\xb3\x54\x67\x04\x7b\x9e\x62\x4c\ -\x23\xc5\xb4\x50\x1d\xe0\x86\xec\xeb\xa9\xea\x9d\x30\x4d\x43\x99\ -\x06\xf3\x3d\xb9\xef\x40\x8d\x7a\x9f\x89\x35\x88\x59\xdc\xcc\x80\ -\x39\x5e\xe1\xe0\xc2\x23\x98\x3f\x9d\x00\x1a\x90\xf0\x61\x2f\xf5\ -\x69\xa2\x05\x79\x6b\x0e\x75\x82\x47\x41\x3d\xc6\x7c\xbe\x4e\xd3\ -\xfd\x33\xe1\x8a\xa1\x7d\x37\xfd\xf3\x98\x31\x47\xfd\x2e\x89\x07\ -\xd0\x73\xc3\x3e\x07\xe0\x2c\x07\x98\x9e\xa5\xa9\x37\x98\xa2\x69\ -\xdc\x7f\x0c\x7b\x1f\xa3\x2d\x31\x33\x4c\xba\xcc\xeb\x3a\xfd\x22\ -\x1d\x86\x7e\x73\xe8\xe5\x7f\x31\x62\x1c\x71\x63\x3e\xd8\xff\xe0\ -\x9c\x9b\x04\x9a\x4a\xc3\x68\x3e\x2c\xba\xf2\xaf\xee\xf4\x03\x9e\ -\x07\xfa\xb6\x0b\xf1\x9a\xd0\xae\x4f\x7c\x3d\x19\x2c\x7f\xab\x60\ -\x96\xbf\x15\x37\x16\x4e\x61\x2e\x02\xd5\xf6\x09\xf0\x39\x4e\x06\ -\x1b\x7c\x0e\x90\xa7\x61\x3c\x89\x89\x75\x42\x8a\xa7\x33\xce\xad\ -\x9f\xeb\xf4\x0b\x6c\x10\x18\x80\x75\x1c\xeb\x13\xa3\xbf\xb2\x73\ -\xcf\x8d\x6f\xde\xbb\x73\xb2\x32\xb4\xff\x83\x58\x0f\x19\xfb\x76\ -\x6f\x34\xbc\x3f\x1b\x60\xdd\x66\xb4\xe1\xf5\x80\x7e\xf0\x7a\x3b\ -\x50\x3f\x35\xe6\xc7\x7c\x34\x90\x61\x81\x16\x24\xe0\x1c\xe0\xcf\ -\x78\x1e\xb2\xa4\x13\x1c\xba\x47\xd6\x7c\xb9\xec\xea\x7d\x69\x10\ -\xa2\x77\x2b\xf0\x34\x7f\xe9\xa1\xa4\x33\xf3\x83\x84\x59\x3b\x1d\ -\xf3\x97\xa8\xef\x60\x3a\x50\xf9\xca\xf6\x9d\x57\xbd\x06\xfe\xc9\ -\xae\x4e\x3f\xa3\x86\x75\x07\x6b\x87\x10\x46\xaf\x10\xa1\xed\x62\ -\xf0\xb9\xe8\x3f\x12\x5c\x3b\x6c\xb9\x75\x09\x34\x68\xd0\xa0\x41\ -\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\ -\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\ -\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x3c\xc1\xc1\xd5\xa0\xe0\xe8\ -\xf6\xa5\xd7\xa2\x7b\xc9\xe5\xa2\x10\x07\xce\xb8\xbe\xba\xfd\xfa\ -\x84\x10\xa1\xf5\xbc\x3e\x7e\xc6\xf7\x9d\xf3\xfa\xbf\x07\x96\x5c\ -\x2f\x76\x0f\xa8\xfb\xd1\xf5\x63\x5b\x96\x5e\x9f\x10\xdb\x97\x7c\ -\xdf\xe3\xaf\xb7\xac\xf6\xfa\xea\xb3\xcf\x8b\xf3\xfe\xfb\xc7\xf0\ -\xfa\x14\x5d\x1f\xf0\xae\xff\xab\x75\xbd\x88\xd7\xf0\xa3\xba\x0f\ -\x5e\x2f\xc2\xad\xda\xaf\x1f\x13\x03\x4b\xae\xf1\x9d\xda\xff\xbe\ -\xfd\xda\x85\x7f\x77\x02\xf6\x7a\xe9\xf5\x96\x25\xd7\xc7\xe9\x77\ -\xe7\xb8\x3e\x28\x0e\xc0\xf5\x01\xf5\x7d\x78\x7d\x0c\xde\xa5\xfd\ -\xfa\x28\x5d\x6f\x69\xbf\x0e\x9d\xf3\xfa\xa8\xb8\x1a\xae\x07\x8e\ -\xab\xbf\x3f\xf3\xfa\xa0\x77\x7d\x40\xcd\x1f\x14\xa2\xbb\xfd\xdf\ -\xe3\xb5\xf7\xfd\xc7\x28\x4b\x72\x4b\xdb\x75\xe8\x71\xd7\x5d\x42\ -\x2c\xb9\xee\xa6\x6b\xbe\xff\x71\xb1\x5b\x74\x1f\x14\xd7\xa9\xeb\ -\x13\x70\xbd\xfd\x68\xeb\xfa\xb8\xd8\x89\xd7\x4f\x6e\xbf\x1e\x38\ -\xf3\xfa\x98\x08\xa8\xf7\x3b\x81\xd7\xc7\x45\xef\x19\xd7\xa2\x75\ -\xdd\x2b\x06\x4e\xb4\x5f\x8b\x25\xd7\x58\xe7\x27\x74\xe6\xf5\x63\ -\x4b\xaf\xaf\x5e\x5c\xfe\x35\xfe\x78\xc0\x3d\xf3\xfa\xe0\x92\x6b\ -\xf7\x71\xd7\x47\xbd\x6b\x97\x7e\x3a\xf6\xf8\x6b\x71\xbe\xeb\xe3\ -\xe7\xbb\xee\xa6\x6b\x75\xbf\x83\x88\x91\x27\x5a\xd7\x47\xf1\xfa\ -\xb1\x0b\x5c\x2f\xb6\x5f\x0f\x3c\xfe\x9a\xbf\x45\x5e\x87\x96\x5c\ -\x1f\x93\xd7\x8a\x1e\x1e\x27\xc4\x3c\xf8\xb8\xeb\x6e\xef\xfa\xc0\ -\x92\xeb\x13\x82\xef\xba\xf4\xfa\x58\xeb\xba\x9b\xff\x4a\xdd\xef\ -\x31\xba\x7e\x4c\x9c\x41\x7f\x8f\x86\x96\x5e\x1f\xbb\xda\xd5\xb0\ -\xd6\x10\x17\x9c\x84\x72\x14\xcf\xbf\x08\x93\x4c\x70\xf0\xc3\x6b\ -\x2e\x66\x68\xd0\xa0\x41\x83\x06\x0d\x1a\x34\x68\xd0\xa0\x41\x83\ -\x06\x0d\x1a\x34\x68\xd0\xb0\x99\xa0\xb7\x4b\x88\x4f\xc0\xe7\x38\ -\x8c\x17\xc0\xcf\xd7\x09\x61\xdc\xea\x1f\x78\xe3\x1d\xf0\xf9\x21\ -\xa1\xeb\xb9\xac\x1b\x74\x89\xf1\xc9\xdc\xf0\xfc\x8f\x63\xe6\x1d\ -\x6e\xca\xf9\xa4\x9b\x0a\x1d\x71\x13\xce\xbc\x9b\x34\x67\xdd\x84\ -\x39\xe3\x26\x2d\xf8\x8c\x36\xbf\x26\x44\xf7\xaf\x09\xbd\x0f\x6b\ -\x0d\xcf\x8a\x07\x66\xdd\xb4\x35\xef\xa6\x60\xbd\xb1\x86\x61\xda\ -\x9e\x76\x53\x16\xd7\xae\xc5\xfa\x95\x49\x93\x7b\x98\xa6\xec\xa6\ -\x1b\x8d\x36\x60\x1f\xb6\x3e\xbb\xd3\x0f\x7d\x99\xc0\xce\xf8\xd0\ -\xec\x09\x3c\xe7\x54\x07\xd5\x9a\xa6\x5a\xa2\xbc\xf6\x30\x42\xdc\ -\x3f\x30\x69\x96\xe1\xb3\x02\x7b\x51\x71\xa3\x30\x3f\x6a\x36\x17\ -\x45\x8f\x28\x74\xfa\xe1\x37\x3b\x6c\x15\xe2\xf5\xb1\xc0\x9d\x7c\ -\xee\xb1\x8e\x2b\xf6\x1a\xc5\x3a\xbe\x21\x1c\x58\xc3\xbb\x02\x7b\ -\x80\x6b\x5f\x76\x93\xf0\x73\x12\xe6\x12\xd4\xcf\x71\xda\xdd\xde\ -\x1f\xfc\x40\xa7\x9f\x7f\xb3\xc3\x60\xe4\x7d\xdf\x88\x07\x8f\xc0\ -\xba\xcf\x72\xbf\xaf\x10\x0c\xac\x9b\x1f\xae\xc0\xcf\x58\x47\xbf\ -\x4c\x9f\x99\x30\xec\x81\x03\x03\xf6\x24\x61\xd6\xa8\x5e\x3c\xfc\ -\xf9\x1f\x74\xfa\xf9\x37\x3b\x24\xad\xb9\xe3\x29\x73\xde\xcd\xc0\ -\x79\xce\x52\x1d\xeb\x1a\xf7\x2d\x08\x57\x64\xaf\x2b\xde\x83\x2c\ -\xad\x7d\x09\xf6\xa0\x42\x75\xad\x91\x3e\x01\xfd\x79\x72\xa7\x9f\ -\x7f\x93\xc3\xf6\x44\x00\xe4\x1c\x63\x96\x7a\x5d\x61\x1d\xf1\x6c\ -\xa8\xc6\xbd\x23\x64\x9f\x29\xea\x33\x16\x2e\x61\x0d\x59\xa0\x41\ -\x25\xa6\x49\xd4\x4b\xbc\x86\xe7\xff\x09\x5b\x4f\x7e\x8d\xe0\x55\ -\xb1\xe0\x3c\xf5\x77\xa0\x9a\xed\xaa\xdf\xab\x53\x96\xfd\xe7\xb9\ -\x2f\x69\x21\xc4\x7d\x2a\x71\x5f\xd2\xd4\xcf\xab\x01\x7c\xa0\xba\ -\xd8\xe9\x87\xdf\xec\x30\x64\xfc\xd6\x97\xe2\xbe\x9a\x9b\x86\xf5\ -\xc7\x1a\xea\xd8\x2b\x29\x27\xfb\x2b\xe5\x23\xdc\x1f\x3a\x67\x4f\ -\x71\x7f\x1d\xc0\x03\xe2\x05\xb4\xfe\x75\x37\xee\xd4\x1e\xe9\xf4\ -\xf3\x9f\x05\xb0\x57\xcd\x73\xcc\xfd\xb7\x7c\x51\x74\xf5\xff\x3e\ -\xfe\x62\x6f\x64\xfa\xe8\xc0\xbe\xbf\xc0\xde\x0f\xa3\x9d\x7d\xb4\ -\xc7\x43\x8f\x10\x57\xc6\xcd\xf9\xd3\x58\x8f\x1d\x79\x2f\xf7\xe2\ -\x82\x75\x0f\xab\xbe\xa6\x53\x70\xf6\xe5\xfa\xc3\xc8\x00\x3f\xa0\ -\x7e\x66\xf0\x6f\xa3\xc1\xd2\xf1\x4e\x3f\x7f\x1b\xfc\xba\x33\x76\ -\xd7\x91\xe8\xf0\x1d\x8f\x44\xcc\x05\x77\x0c\xf4\x18\xd0\x28\xa9\ -\x96\xb8\xb9\x73\xfe\xbb\xc6\xe0\x0c\x5c\x6f\xfd\xe3\x4e\x3f\xe4\ -\xd9\x20\x93\x78\xf7\xdd\x49\x6b\x06\xd6\xb5\x01\x34\xa7\xc6\x7d\ -\x10\x81\xde\x14\xe0\xfc\x8f\x87\xb8\xa7\x6c\x5e\xd1\x1f\xd9\x1f\ -\x91\xfa\xe5\x38\x95\xfb\x3b\xfd\xec\x12\x7e\x35\xe4\xbb\xcb\x4d\ -\x04\x6f\x77\x93\xc1\x05\xa0\xa5\x73\xc0\x9b\x50\x7f\xac\x9e\xb6\ -\x02\xb7\x7c\x69\xc4\x68\xb8\xc3\x26\xe8\x2b\xc1\x06\xf2\xab\xfd\ -\x9d\x7e\xd8\xb3\xc0\x35\x89\xf0\x0c\xc9\x33\xc4\x7b\xb1\x9f\x0f\ -\x9c\xff\xf1\x48\x99\xe8\x3e\xe1\x80\xec\xf7\x99\x41\x19\xc8\xac\ -\x52\xaf\x9a\x48\x60\xea\x24\xfc\xed\x9f\x74\xfa\xe1\x7b\x06\x5f\ -\x32\x35\x32\xb8\xe0\x52\x5f\x0d\xd0\x61\x70\xed\xa9\xef\x80\xc9\ -\x7a\x3b\xe9\x8a\x46\xc5\x1d\x33\x70\xfd\xad\x57\x88\x0e\xf4\xd2\ -\x3b\x3f\xf4\xbd\x36\x35\xbc\x40\x32\x0d\xf5\xcc\x93\x3d\x61\xc7\ -\x87\xcb\x74\xee\xa9\xaf\xa6\xb7\xfe\x20\x7f\x9a\xa0\x83\xa1\x7e\ -\x6c\x4c\x3e\x0a\x7f\xfc\xda\x4e\x3f\xbd\x15\xf9\xe8\x37\xe3\x01\ -\xec\x0f\x03\xc3\x9a\x25\xbb\x49\x12\xe5\x33\x87\x78\x94\x1b\xb3\ -\xaa\xee\x98\x89\x3a\x63\xdd\x1d\x0b\x36\xdd\x91\xd1\xbb\x1e\x10\ -\xd4\x62\x74\x63\x40\x9f\xef\x45\x9f\x4b\x3a\x33\xd4\xaf\x86\x64\ -\x1f\xea\x65\xc5\x7d\x2d\xe9\xfc\x93\x0c\x5a\xa4\x81\xe7\x3f\x89\ -\xfd\x4c\xe0\x6c\x8d\x05\x2a\x78\xfe\xf7\x75\xfa\xf9\x23\xce\xf4\ -\xfd\x89\x00\xf6\x68\x9a\x83\xb3\x31\x23\x6d\x26\x55\xd0\x55\xe0\ -\x9c\x80\xbc\x80\x7d\x77\xe2\xf0\x6e\x31\x03\x06\xcc\x85\x8d\x23\ -\x14\x12\xdc\xe9\xe7\x56\x60\x86\x3f\x72\x4f\xdc\xe0\x5e\x68\x5e\ -\x0f\x29\x29\xf3\x17\xc2\x92\xf6\xdb\x93\xd4\x6f\x14\x65\x4f\xb2\ -\x05\x01\x2e\xef\xde\xf7\xfa\x5b\xe1\xcf\xfb\x3a\xfd\xfc\x3b\xf7\ -\xbf\xec\xd3\x09\x38\xff\xd8\xfb\x02\x75\x48\xe4\x63\x99\x90\xb4\ -\x99\xc0\x7b\x24\x69\xfd\x2b\x12\x0f\xea\xee\x88\x5d\xde\x50\x7c\ -\x20\x6c\xdd\x72\x1f\xca\x3f\xd8\xbb\x29\xab\xfa\xbc\x7b\xfd\x7d\ -\x8b\xb2\xb7\xe3\x14\xe0\x87\x5c\x7f\xb2\x85\x02\xae\x0c\x4f\x7f\ -\xab\xd3\xcf\x2e\xe1\xa9\x71\x3f\xae\xff\x0c\xaf\x3f\xf6\xcf\xc3\ -\x1e\x64\x28\x2b\xc3\x99\x49\x4a\xbb\x55\xdc\x2a\x01\x2f\xa8\xb8\ -\x23\x16\xf5\xa1\xf9\xa5\x4e\x3f\xb4\x82\x91\x40\xf1\xfb\xb4\xfe\ -\xd8\x57\x33\x5c\xf3\x7a\x82\xe3\xb9\x57\x83\xf4\x00\x3a\xff\x55\ -\xb2\x43\xc7\x0d\xc4\xed\x49\x7c\x8f\x2b\x3b\xfd\xfc\x00\x85\xb8\ -\xef\x4e\x5e\x7f\x3a\x47\xc8\xc7\x6a\x84\xaf\xbc\xfe\xa0\xb7\xc3\ -\x9a\x27\xad\x32\xf0\xe0\x29\xd8\x8b\x5b\xf0\xb9\x37\x0c\xfd\x1f\ -\x31\x6a\x0f\xa4\xd1\xf6\xa3\x74\x2f\xd9\xd7\x14\x79\xae\xd2\x7b\ -\x49\xf7\x82\xdf\x63\x6f\x5e\x5a\x7f\xec\xdd\x1b\xbf\xe5\x6f\x3b\ -\xfd\xec\x0a\x32\xa1\xe2\x83\xd8\x83\x07\x7b\xc7\xe5\xb0\x37\x9f\ -\xec\xd7\x9e\x95\x3a\x63\x12\xd6\x9f\xed\xe6\xb7\x3d\x18\x09\xde\ -\x86\x7a\xfb\xc5\xac\x3f\xf6\x71\xb1\x60\x98\x6b\xf1\xec\xa3\xc6\ -\xf4\x03\x29\xb2\x3f\x54\xe5\xd9\xe7\xf3\xcf\x7d\xa5\x8b\x44\x87\ -\xb2\x24\xfb\x03\x3d\xb5\x24\xfd\xe1\xbe\xb8\x1b\x06\xfa\xba\x47\ -\x4b\xa9\xe0\xac\x9b\xc3\xde\x8e\x40\xe3\x73\x36\xbf\x4b\x96\xfa\ -\xba\x03\xde\x5a\x25\xea\x85\x28\x7a\x7b\x0f\xc2\x3f\x0f\xae\xf2\ -\x6b\x40\xb7\xde\xf1\xbf\x33\x31\xd0\x33\xec\x79\xd7\x09\x4c\xbb\ -\xb2\x57\x58\xf7\xc5\x3c\x7b\x0c\xd6\x3f\x4d\x74\xb3\xd6\xb2\x3d\ -\x10\xef\x65\x1e\xb0\xc4\xf6\xe0\xd4\x48\x4f\xde\xbf\xf3\x8f\x6f\ -\xbc\x98\xef\x5c\x07\xe8\xcb\x04\xe6\xa8\x0f\x19\xaf\x3f\xf6\x25\ -\xad\xc8\xf5\x2f\x92\xcd\x04\xd7\x7f\xd4\x5f\x72\x47\x86\x6f\xbe\ -\x03\xfe\xfd\xf6\x15\xde\x3f\x97\xb6\xe7\x1e\xc9\x3a\xb3\x80\x5b\ -\xa0\x2b\x05\x59\xae\x4d\x80\xcc\x62\x44\x66\xbe\x0d\xf3\xbf\x22\ -\x56\xd9\xbb\x09\xd7\x3f\x45\x78\x8b\xfd\x14\xb9\x77\x72\x4e\xd9\ -\x3e\x95\xec\x1f\xae\x48\x1b\x34\xf2\xe8\xa6\x0b\x1b\xfe\xb2\xd5\ -\x7c\xd7\x7a\xc2\xa8\x7f\xce\x55\x34\x28\x6f\xd7\xc8\x96\x82\x38\ -\x8b\x72\x43\x0a\xe8\x51\x02\x68\x66\x34\x58\x72\x87\x83\xb7\xae\ -\x54\xfe\xe9\x87\xfb\xfe\x38\x87\x6b\x6f\xe3\x3a\x35\xc9\x56\x8c\ -\xfc\x04\x7b\x66\x47\x61\xbf\xc7\x8c\xba\x6b\xed\xf9\xed\x23\x62\ -\x15\xbd\x92\x63\xc6\xcc\x03\xd8\xaf\x4e\xe1\xac\x47\x7f\x22\x4c\ -\x7f\x90\x0e\xe5\x42\x65\xd9\xcb\xbc\x46\xf4\x35\x93\x38\xf4\xf9\ -\x95\x7e\xcf\x7a\x43\x6c\xcf\xbc\x9b\xc4\x9e\x5b\xc1\x86\x9b\x07\ -\x1a\x89\x3c\x80\x78\x16\xc9\x0d\x72\xfd\x03\x93\xee\x70\xe0\x30\ -\xae\xbf\xbd\xdc\xfb\x76\x89\x3d\x1f\x4f\x00\x6e\xe5\x9c\x69\x58\ -\x87\x66\x9b\x7c\xc5\x3d\x5e\x13\xc4\x0f\x41\xdf\x00\xbe\x2f\x18\ -\x0f\x56\xf6\xdc\x46\x13\xe8\x0f\xaf\x3f\xda\x77\xf0\xfc\x93\xec\ -\x29\x65\x50\xe5\x7f\x41\xbb\x3f\xea\xbe\x6c\xfb\xdc\x58\xf4\x1f\ -\x21\x02\xf4\x1f\x7b\x65\xe7\x70\xfd\x51\x3e\xb6\xf0\xbc\xb0\x0c\ -\x8a\xf2\x4f\xc2\x40\xf9\xb3\x0c\xe7\x1f\xd7\xdf\xf7\x47\xcb\xbd\ -\xef\x88\x53\xbd\x2f\x03\x7a\x75\x2e\x84\xfa\x11\xf7\xdc\x45\xdf\ -\x14\xd1\x09\x5b\xc6\x24\x58\xec\x23\x47\xdd\x4f\xac\x50\xb7\x48\ -\x18\x8d\x07\xd2\xa6\x3c\xff\xb0\xc6\xa4\xfb\x46\x2a\xee\x78\x58\ -\xf6\xf5\x6e\x5f\x7f\xab\x4a\x7e\xe0\xb8\x49\xb2\xe7\x4f\xac\x74\ -\x8d\xd6\x13\x7a\x85\xaf\x94\xf2\x33\x0f\xc6\xde\xea\x39\x0b\xfb\ -\x10\xa3\x0c\x5a\x24\xdf\x51\xc2\x2c\xba\xa3\xd6\x6d\xf0\xdc\xfd\ -\xcf\xe9\x13\xef\x5e\x2e\xff\xea\x4b\x1b\x47\x4e\x65\x9c\x19\xea\ -\x67\xcd\x72\x2d\xd0\x83\x30\xf3\x48\xe4\x31\xe8\x1f\xa7\xf5\x47\ -\xd9\x10\xbe\xf3\x29\x13\xe5\xaf\x89\x15\xd0\x21\x5c\xff\x14\xf6\ -\xfd\x05\xda\x8e\x74\x1e\x47\x01\x06\xda\xdf\xd4\xf9\x27\xfa\x0f\ -\xf3\x49\x0b\xe3\x1f\x40\x96\x0e\xdd\xea\xee\xd9\xf6\xb4\xdb\x57\ -\xb7\x52\xeb\x06\x13\xa9\xa1\x59\x37\x83\x34\xc8\x60\x1e\x9c\x25\ -\xbe\x5b\x04\x99\x01\xd6\xdf\xc0\x3d\x00\xdd\xb7\x57\x5c\xb3\x6b\ -\xcb\xef\x7e\x63\x79\xb7\xec\x3d\x98\xb6\x94\x6f\x90\x7b\x8a\x93\ -\x4f\x96\xe4\x43\xb4\xcb\x57\x58\x2f\x85\xdf\x93\x5d\x06\xcf\xa6\ -\x81\xb4\x61\xeb\x7b\x97\xfb\xd0\x31\x3c\xff\x96\x5c\x7f\x47\xf6\ -\xb3\x0f\x4b\xf9\x3f\x5c\xf1\x64\x1f\xfc\xee\x14\xf1\xfc\xa2\xdb\ -\xbd\xad\xff\xd7\xe1\x4f\x8d\x55\xae\xd3\x7a\xc1\xae\x38\xac\x7f\ -\xda\x37\x4d\xbd\x79\xb3\x56\x4d\xae\x99\xf4\x9d\xc2\x73\xa3\x1e\ -\x10\xda\xf3\xc1\x7f\x17\x62\xfc\xfb\xcb\xb9\xe1\xa8\xd5\xf8\x6e\ -\xce\x06\x9e\x0e\x74\x25\x0f\xf7\x2a\x84\xab\xb4\x36\xe3\xe1\x22\ -\x8c\x29\xb7\x80\xb6\x02\xba\xbf\xb4\xcb\xc0\x27\xea\x46\xb8\x9e\ -\x62\x99\xbe\x59\x45\xff\xf1\x7c\x63\x0f\x79\xec\x25\x3f\x8e\x7b\ -\x20\x47\x8e\xe4\x9f\x76\xbf\x17\xd0\x9e\x6d\xe2\xf5\x17\xb5\x52\ -\xeb\x04\xa3\xfe\xe6\x8f\xb0\x47\x36\xf2\x80\xac\x59\x95\x38\x50\ -\x26\x3a\x84\xeb\x1f\xb7\xa6\x5c\x7b\xe8\xf0\xe7\x76\xf4\xbf\xed\ -\xf4\x32\x6e\xd7\x97\xf2\xdf\xbe\x88\x32\x0f\xf6\x58\x2f\xe0\xba\ -\x20\x6d\x40\xdb\x70\xb8\x48\xe7\x1f\x6d\xc3\x44\xe3\xac\x32\xcb\ -\x58\x06\xd2\x87\x32\xd9\x67\x92\x63\x37\xfe\xdb\x72\x9e\x39\x41\ -\xf2\x27\xf6\x70\xae\xc9\x3d\xae\xd0\x77\x15\x9c\x12\xed\x03\xf1\ -\x99\x30\x9f\xff\x1c\xac\xff\xc0\x9e\x97\x37\x05\xf7\xf6\xdb\x70\ -\x60\xda\x7f\xfc\x77\xd8\x53\x9b\xd7\x1f\x71\x80\x65\x0a\xe2\xc1\ -\x36\xda\xe2\x30\x7e\xe0\xf0\x89\xc1\x5d\x87\x1f\xec\xda\x2e\x7e\ -\xef\x7c\xf7\xda\x3b\xf8\xdc\xf9\x9c\x39\x4b\xf2\x66\x21\x5c\xa7\ -\x73\x49\x3a\x11\xfa\x43\x60\x4c\x90\x6d\x1e\xce\xa6\x55\x22\xbe\ -\x89\x32\x16\xd1\x67\xb4\xcf\x03\x2e\xc4\xac\x19\xdc\xe3\x0b\xea\ -\x7a\x49\x6b\x9a\xe5\x4f\x87\x69\x10\xd2\x34\xda\x6b\xe2\xc1\x25\ -\xa2\x47\xf9\x48\x95\xf0\x23\x47\x7d\xb6\x17\x10\xb7\x56\xaa\xbf\ -\x5c\x2a\x78\x52\x0e\x64\xc5\x2c\xf0\x60\x3c\x2b\x74\xfe\xe5\xfa\ -\xa3\xed\x3c\x4e\x36\xa0\x8a\x1b\x19\x2a\xb9\xe1\xc1\xd2\xb1\xf3\ -\xdd\x28\x69\xcc\xff\x67\x56\xd2\x9e\x42\x48\xd2\x05\xf4\x49\xc1\ -\x99\x9f\x40\xfa\x13\x9a\xa4\x9f\xd1\x5e\x89\xb2\x6e\x46\xda\x07\ -\xe2\x66\x99\x74\x83\x24\xec\xc3\xc4\xc4\xed\xf7\x5e\xe8\x81\x47\ -\xc3\xd5\xfb\x30\xde\x13\x9f\x37\x0f\xfb\x56\x40\x1c\xc0\x35\x77\ -\x94\x0d\x0e\x3e\x87\xab\x1c\x77\x82\xf4\x9f\x65\x4f\x67\xad\x16\ -\x6c\x8d\xc1\xca\x81\x0c\x94\x21\x1a\x04\xef\x43\xba\x70\x99\xed\ -\xd1\x0e\xfb\x02\x62\x26\xef\x81\x63\xcc\x7c\xef\x3c\xf7\x09\xa6\ -\x8d\x79\xd2\xb7\x0a\x20\xf3\x14\xc2\xcc\x17\x99\xef\x4a\xfa\x83\ -\xba\x11\xd0\xb4\xbc\x5c\xff\xb4\xc9\x7a\x06\xc5\x68\x22\xad\xc6\ -\x4f\x58\x33\x71\x7e\x3e\x19\x4e\x5a\x8d\x1f\x65\x4c\xd4\x1b\xeb\ -\x24\xb3\x31\x9e\xc1\xa7\x5d\xe2\x3d\x40\xda\x1f\xae\x48\xdb\x3f\ -\xdf\x7b\x60\xcf\xd3\xde\xb3\xc6\xeb\xb6\x56\x70\x6d\x7a\x3f\xe0\ -\x2a\xec\x41\xde\x68\xc0\xfa\x34\x88\x76\x67\x50\x46\x44\xdf\x11\ -\xbc\x4f\xcc\xc2\x51\x71\x47\x9d\xd2\x03\xe7\xb9\xcf\xef\x64\x9c\ -\x79\xa0\x07\x4d\x38\xe7\x35\x77\x02\xf0\x7f\x62\x58\xf1\x5e\xd8\ -\x0b\xe0\xe7\x13\xb8\x1f\xb8\x46\xb8\x66\x76\x95\x78\x00\xae\x3f\ -\xae\x13\xd2\xa1\x94\x5c\xb3\x2b\xae\xa8\x9f\x8f\x0f\x3c\x39\x8a\ -\x32\x83\x81\xe7\xbf\x41\x7a\x3b\xe1\x9a\xa4\x41\x85\x10\xdb\xaf\ -\x32\xe8\xc7\x40\x1d\x06\xce\x4e\x14\xf6\x3c\x12\x3b\x74\xbe\x67\ -\xef\x24\xec\x45\x7b\x4a\xc6\xc0\xf5\x9f\xa1\x77\x2a\x38\x52\x67\ -\xf2\x70\xa0\x44\x3c\x32\x1a\x3a\xfc\xe0\xb9\x6e\x32\x12\x3f\x74\ -\x34\xef\xcc\xd2\xdf\x16\x60\xff\xc6\x23\x8c\x03\xc4\x7f\x9d\x32\ -\x8d\x2b\x10\x17\xe0\x3e\x05\xb4\x09\x18\xcc\xeb\x53\x46\x89\xe3\ -\x65\xe1\x6f\x30\x4e\x90\x78\x0e\xda\xfd\x44\xf7\xb5\xe7\xf8\x2a\ -\x03\xfb\x65\x93\xfe\x65\xa2\x8c\x55\x07\xda\xd6\xa0\xb5\x67\x39\ -\x94\xf5\x3c\xa4\x9f\xa8\xc7\x53\xec\x21\xdb\xfd\x33\xeb\xb3\x7c\ -\x17\x0f\x3b\x84\x78\x45\x06\xf8\x66\xde\x9a\x81\xf3\xd4\x20\xfa\ -\x9d\x25\xdd\xbe\x4c\x76\xd0\x24\xc8\x40\x78\x96\x62\x36\xc5\x0f\ -\x9c\x0d\x7a\x81\x86\x3d\x94\x77\xe6\xe4\xfa\xf3\x79\xcc\xd1\x79\ -\x04\x79\xd0\x2a\xd2\x27\xf0\xc6\x13\x85\x20\xfc\x0e\xd7\x0d\xed\ -\xf1\xb0\xce\x18\xbf\x86\x74\x88\xed\xc4\x55\xf2\xf9\xe0\x08\x59\ -\x4d\x8c\x3f\x4a\x9f\xed\xcb\xf8\xec\x4f\xc3\xf3\xa2\xdd\xaa\xee\ -\x8e\x3b\xc8\xeb\x01\xd7\x22\xcc\x07\x50\xbe\x45\x3b\x7a\x1a\xe8\ -\x1d\xda\x1f\xae\x62\xfa\xff\x73\xeb\xb6\x80\x17\x09\xfd\x42\x1c\ -\xc1\x78\xca\xac\xc1\xeb\x9f\x25\xbb\x2e\xeb\x96\x24\xa3\xa0\x2c\ -\xea\xb0\x2c\x04\xff\x7c\xcf\x59\x6e\xf1\x1b\x59\xeb\x4e\x58\x93\ -\x19\x38\xdb\xb8\x16\x75\x92\xcb\xc9\x9e\x0d\x7b\x87\x23\x07\xba\ -\x74\x20\xfd\xdb\x95\xe1\xf0\xc1\x12\xfe\xac\x68\x37\xca\x28\x19\ -\x49\xa7\x31\x5e\x3f\x8e\xfa\x18\xe9\x7e\x65\x77\xc4\xf9\xc3\xbf\ -\x3c\xdb\xf3\x26\xcd\xe9\xd3\x69\x7c\x56\xb2\x01\xd5\x69\xaf\x91\ -\x07\x90\xdc\x4c\x31\x87\x28\xdf\x4e\xc1\xd9\x29\x93\x9e\x6d\xed\ -\xad\xbb\xa2\xab\xff\x9d\xeb\xbb\x8a\x17\x05\x3b\x87\x7d\x53\x8f\ -\xa6\x80\x26\x64\xe1\xbd\xf3\xe8\xd7\x83\x91\xb5\xd8\x1f\x96\xb6\ -\xa7\x80\xfe\xc0\xfb\xc0\xfa\xe4\x53\xcd\x7f\x3f\xf3\x8f\x63\xa3\ -\x9f\xf8\xab\x2c\xd0\x7d\xd4\x9d\x0b\xa4\xef\xb6\xd9\x83\x91\x1e\ -\x23\x8d\x27\x1d\x57\x44\x60\xf4\x5b\x43\x37\x7f\x25\x19\x2c\xd1\ -\x77\xe5\x4c\x94\x47\x91\x2f\x54\xa4\xdd\x1b\xf7\x9a\xe3\x66\x51\ -\x1e\x82\x7f\x9f\x3f\xf3\xfb\x12\x46\xf5\x91\xa4\x94\xff\xc9\x06\ -\x84\x31\x70\x76\x89\x06\xca\xba\x19\x18\x7c\xf6\x81\x6e\x06\x6a\ -\x6e\xcf\x76\x13\x63\xce\x37\x74\xdc\x73\x7f\xb7\x78\x69\x14\xcf\ -\x23\xda\x41\xcd\x8a\x94\x51\x8a\x7c\x8e\xec\x49\x58\x8f\x22\xd9\ -\xb1\x46\xfd\x65\x94\xd1\xdb\xe5\x93\xfe\xa4\x7f\xf6\x14\xca\xe2\ -\xa4\x0b\xc9\x38\x04\x2f\x16\x01\x74\x2e\x5c\xff\x44\xa8\xf4\x0f\ -\xed\x7f\xe3\x58\x37\x7e\x3e\x03\xfb\x9d\x97\xdf\x85\x72\x4b\x06\ -\xbf\x0f\xfd\xe6\x52\xf7\x40\x9f\x6d\x62\xf8\x7d\x77\x9e\xf9\xac\ -\x70\xfe\x1f\x49\x21\x9e\xe2\xdf\xaa\xfd\x46\xb9\x96\x64\xab\x29\ -\x79\x8f\x22\xfb\x90\x82\xc0\x4b\xba\x7c\xaf\x82\x3f\x9b\x58\xef\ -\x35\xbc\x48\xe8\x1a\x0e\xdf\xf2\x45\xe4\x6d\xa9\x20\xc6\x15\xd7\ -\x58\x3e\xb1\x4a\x52\x86\x2b\x13\x0f\x8e\xc3\x5c\xef\xb6\xc2\x5d\ -\x6d\x7f\xf7\xcc\xb8\xb1\x00\x38\x3f\x4d\x3c\x3b\x1f\x62\xfe\x97\ -\xa5\x81\x3c\x1c\xee\x05\xbc\xb2\x6f\xef\x95\x6f\x3f\xe3\xfb\x8c\ -\x14\xac\x63\x86\x6c\xaf\xc0\x6f\xcc\x1a\xe9\x7e\x1c\xaf\xc0\xf2\ -\x10\xd9\x87\x82\x0d\xd8\xef\x6d\xf1\xf6\x3f\x8c\x19\x33\x8f\xc4\ -\x65\xfc\x67\x46\xc5\xc0\x49\x79\x21\x27\xe3\xd0\x49\x7e\x06\x7d\ -\x1e\xe9\xd4\xce\x9e\xa7\x62\xce\x4b\xc7\xe3\x7e\x2e\x00\xc6\x36\ -\x21\xde\x9e\xc1\x3c\x36\xa3\x46\xcf\x4e\x71\xab\xb6\xe2\x01\x72\ -\x4d\x50\x17\x70\xaa\xf7\xa8\x3f\xea\xd9\xf5\xf4\xf7\x60\x2e\x44\ -\x1a\xed\x91\xb6\x3c\x8b\xe1\xaa\x8c\xc7\xaf\x90\x0f\x20\x05\xbc\ -\x45\x9c\x45\xfe\x48\x8d\xd4\xff\x21\x13\x64\x3e\x9a\x95\xb1\xb4\ -\x59\xb2\x49\x57\xd9\x67\x4b\xdf\x07\x72\x54\xfa\xa3\xed\xb8\x43\ -\xe7\x3f\x6e\x72\xfc\x27\xe9\xbf\x21\xf6\xdd\xd1\xde\x3b\xd2\xf6\ -\x86\xdf\x8f\xf8\x0c\xff\x2e\x34\xf2\x67\x6f\x82\x3f\xfb\x7f\xd7\ -\x7f\x09\x2f\x0a\xcc\x7d\xbb\x6a\x6e\xd4\x87\x32\x61\x8d\xd6\x93\ -\xf2\xa9\x9c\xaa\xb4\x17\x57\x88\x1e\xa7\x61\x3d\xc6\x42\x33\x5f\ -\x51\x7f\x94\x30\x6a\x77\x63\xfc\x68\xd6\x51\xf6\xce\x8a\x5c\xfb\ -\x2a\x9d\xcb\x34\xc5\x34\xd6\xcf\x2a\x37\x6d\x15\xe2\x4f\x32\xa0\ -\x2f\x67\xfd\xf0\xb7\x46\x9d\xec\x4f\xe8\x53\x4f\x19\x65\xf2\x7d\ -\x26\x29\x6e\xb3\x42\xfe\x02\x90\x47\x9f\xa7\xfe\x2e\x67\x34\x1e\ -\x49\xe0\x39\x41\xbc\xb1\x59\x06\x45\x5e\x4f\x76\x20\xe4\xfb\x11\ -\xdc\xc3\x12\xf9\x7e\x71\xff\xc3\x46\xf1\x3e\xb1\x01\xe2\xae\x2e\ -\x00\x5b\x7a\xc5\xf4\xfd\x80\x03\x2f\x8c\x59\xd5\x07\x90\x17\x23\ -\xbf\xa5\xdc\x05\x87\x7d\x18\x49\x93\x7d\xf2\x89\xe8\x8c\xb2\xa3\ -\x9b\xf9\xe0\x11\x58\x83\x59\xcf\xde\x99\x0b\xc9\xb3\x8f\x3f\x83\ -\x5c\x9e\x42\xbb\x46\xb8\xfe\x9d\x73\x7c\xe7\xb6\x50\xe0\xce\xd3\ -\x19\x90\x27\x51\xf7\x23\xd9\xcb\x92\x7b\x20\xe5\x51\x92\x8b\x00\ -\x1f\xa2\xf1\x0a\xea\xde\x3d\xf8\x47\xe3\xc1\xfa\xa3\x49\xc0\x19\ -\xc4\x51\x96\xd5\xaa\x24\x7f\xe2\xf9\xa7\x58\xac\x70\x95\xf4\x16\ -\xbc\x47\x06\xe4\x82\x48\x90\x78\xbf\x75\x29\x16\xf1\x62\x60\x60\ -\xd7\x1b\x9a\x5d\xbd\xfd\x7f\x0a\xeb\xfe\x65\x8c\x19\x46\xdb\x09\ -\xea\xc1\xb8\x96\x4a\x4f\x45\xff\x61\xd2\x6e\x3c\x2c\xff\xe4\xb9\ -\x19\x13\xce\xbe\x39\xcd\xb6\xc8\x30\xdb\x83\x73\xf2\xec\xa3\xdf\ -\x31\x1d\x58\x70\xbb\xb7\xa7\x3e\x74\xae\xef\xec\x15\xe2\x0d\x71\ -\x73\xee\x74\x0e\xed\x69\x41\xf8\x5b\xb4\xc1\x12\xef\xe1\xef\x27\ -\xbb\x10\xd9\xeb\x50\x27\xf3\x1d\x84\x3f\xd9\x8f\xff\x06\x78\x07\ -\xe7\x5e\x38\xbc\xf6\x1e\xfd\x91\xfc\x87\xf6\x20\xc4\x38\x1b\xb5\ -\x48\xff\x5a\x93\xd8\x97\xf5\x84\x1d\x5d\xe2\x15\xfe\x9d\xb7\xce\ -\xc6\xec\xe6\x3f\xe2\xd9\x41\xdc\xa6\xd8\x79\xb4\x07\xe1\xfa\x3b\ -\xcc\x57\xf3\x1c\x4b\xd3\xd3\xb7\xe7\x57\xdf\x93\xb7\xd9\x0e\x83\ -\x76\x00\x5a\x07\xe2\x81\xcc\x0f\x31\xdf\x30\x13\x68\xfe\x48\x5c\ -\xc0\xae\x3f\x3a\x76\xdb\x17\x52\x78\xfe\xd1\x07\x84\x32\xb0\xa4\ -\x43\x69\x69\x93\x4b\x18\x2c\x13\x25\x23\xe8\x8b\x13\xaf\x45\xdf\ -\x0d\xd2\x9e\x7c\x98\x07\xda\x9b\x28\x0e\xc2\x61\x3f\x8c\xb7\xfe\ -\x18\x4b\x00\xf4\x32\xc5\xfa\xef\xd0\xa5\x58\xc3\x8b\x84\x89\x6d\ -\x62\xee\xde\x48\xfc\xb6\x4f\x51\xbe\x02\xc6\x77\x13\x4f\xac\x90\ -\x3c\xc1\x3e\xa5\x92\x3b\x0e\x72\x1e\xfc\xdb\x44\xde\x3c\x7c\x37\ -\xe9\xa0\x70\x5e\x0b\x52\x07\x55\xb4\x1f\xf3\xe2\x50\x3e\x89\x8e\ -\xd6\x97\x13\x73\xb6\x73\x2c\xf8\xc9\x53\x64\xcf\x31\x19\x07\x32\ -\x44\x3b\x6a\xa4\xbf\xa2\xff\x30\x05\x3a\x1b\xc6\x1b\x66\x86\x6b\ -\x64\x5b\x56\xb2\x16\xf2\x7b\xb2\x75\xc0\xe7\x04\xd2\xff\x88\x7a\ -\xce\x0a\xdb\x71\xad\x1a\xf9\xf2\xc4\xd9\xf5\xc6\x8d\x06\x5b\x77\ -\xf4\x34\x1e\x8a\xee\x6f\x9c\xc8\x18\xca\x1f\x5c\x96\x3e\xf9\x22\ -\xe9\x01\x69\x73\x0a\xd6\x88\xce\xff\xef\xe7\x41\xb7\xc9\x2b\x1f\ -\x48\x88\xe9\x0f\xc5\x38\xe0\xbb\xa3\x2d\xdb\x68\x5e\xc8\x96\xe9\ -\xc1\x4e\x11\x9f\x41\x9f\x4a\x81\xf0\xa0\x4a\xb1\x00\x59\xb2\x85\ -\xb3\x7e\x9c\x56\xeb\x49\xfc\xbd\x44\x36\x06\xb2\xbb\xd9\x65\x69\ -\x77\x43\x1f\x18\xdb\x9a\x68\x7f\x42\x7c\x66\x32\xe4\xe7\x3f\xa7\ -\xde\xbe\xe1\x60\xd7\xd0\xcd\x8d\xe8\x3e\xc0\x5d\x94\xcb\xf1\xfc\ -\x3b\xad\x98\x20\xd4\x2b\x51\x1f\x43\x3d\x73\x8b\x88\xce\x50\xec\ -\x87\xb4\x3d\x92\x1f\x36\xcc\xe7\x12\x69\x16\xee\x5f\x0c\xf4\xd4\ -\x15\x7c\x75\x5f\x34\x30\xe7\x66\x40\x5f\x1a\x47\xda\x62\x49\xfb\ -\x90\x5d\xf1\x68\x1f\x0d\x8a\x69\x2e\xd1\xf3\xe4\xa5\x5d\x0f\x7d\ -\x3a\xf8\x39\x4e\xf2\x27\xc7\x82\x66\x65\xfe\x3b\xad\xff\xe6\x39\ -\xff\xc0\x0f\xfb\x7f\x33\x36\x34\xe3\xa6\xfe\xff\xf6\xbe\x04\x4c\ -\xae\xab\x3a\xf3\x75\x57\x2f\xda\xac\xd6\xd2\x5d\xcb\xdb\xab\xba\ -\xbb\xf6\xb5\x0d\xc6\x90\x04\x39\x06\x62\x03\x1f\x03\x81\x84\xb0\ -\x4c\x3e\x3c\x24\x61\x99\x0c\x81\x30\x4c\x80\x0c\x41\x72\x1c\x02\ -\x13\x08\x18\x06\x32\x09\xb6\xb1\xa4\xae\xbd\xab\x37\xb5\x30\x66\ -\x99\xa1\x03\x03\x26\x03\x93\x6d\xc8\x97\x6f\xb2\x8c\x45\xe2\xc4\ -\x21\xc6\x58\xc6\x0e\x28\xb1\xd0\x9b\xfb\x9f\x73\x5f\x55\x75\xab\ -\x77\x55\x55\x4b\xf1\x3b\x49\xf1\xae\x5b\x55\xef\xdd\x7b\xde\x5d\ -\xce\x3d\xf7\x9c\xff\x0f\xd6\xf8\x3c\x52\xea\x16\xf3\x4e\x4e\xfa\ -\x76\x73\xb4\x1f\x38\xfd\x28\x6c\xed\x29\x9b\x63\x9f\x5a\x79\x28\ -\x35\xb6\xdf\xe9\xfd\x95\xb6\x74\x66\xec\x4a\x24\xfa\x81\x6f\x24\ -\xe0\x03\x17\xef\x20\xaf\x56\x78\xee\xa3\xf8\x1d\xde\x4f\x65\x64\ -\x6c\x12\x74\x4f\x71\x6e\xae\xee\x8d\x22\xeb\xde\xe0\xd8\x73\x8a\ -\xb3\xb0\xf8\x5d\x91\xfe\xd7\xf7\x5b\x5d\x75\x22\x6c\xf2\x1f\x4b\ -\x8e\xcd\x52\xff\xcd\x4b\x9b\x92\xfb\x77\x4b\xff\x59\x19\xc3\x90\ -\x6f\x8b\x35\xce\xb9\x76\x0f\xfa\x3e\x72\xcd\x03\x55\x47\xdc\xec\ -\xe6\x6d\x3e\x5e\x8d\x04\x17\xc5\xb3\x6b\x34\x07\x15\xa4\x6f\x87\ -\xfd\x6a\x65\xf9\x7e\x71\x36\xcd\x7a\x9e\x82\x3f\x5b\xf6\x81\xeb\ -\x71\xce\x60\xca\xf3\x77\xfa\x9e\x8c\x65\xc2\x3e\xce\xba\x76\xf4\ -\x2f\x24\x1c\x1f\x13\x36\x25\xfc\xa1\x5a\x8d\xce\x62\x68\x0c\xd0\ -\x99\xfc\x34\xe5\xf4\x70\x8c\x10\xe7\xf8\xa0\xaf\x41\x1f\x1c\x87\ -\x53\xa3\x9c\x5c\xac\xdd\xd9\x50\x75\x27\xb9\x86\x7d\x43\xfb\x6e\ -\xb8\x07\xeb\x00\x6c\x21\x9c\x23\xe0\x9c\x06\xfe\x39\x8c\x81\xac\ -\x8c\x9d\xe0\x18\xdb\x12\xf9\x7a\xf2\x46\xdb\x7b\x90\x67\x30\xe8\ -\x2f\xbc\x6e\x55\xc8\x06\x48\xda\xe5\x6b\x49\xff\xc1\xf8\xe8\x19\ -\x31\xff\xcc\x73\x4c\x16\xf2\xfb\x4d\x9e\x57\x57\xe8\x5b\xe6\x58\ -\xe5\x65\x9c\x3d\xc7\x60\x56\xf9\xbc\x5b\xc3\x7e\x35\xfc\x92\xcd\ -\x1f\xb5\xa6\x1c\x89\x04\x16\xe8\xdd\xe7\xe0\x8b\x35\xf8\x7c\x9d\ -\xdf\x7f\xb1\x99\xdf\x8e\xfc\x16\xca\x73\x84\xfe\x49\xf7\x25\x8a\ -\x6d\xe1\xf9\x9f\xf7\xe1\xd8\xaf\xa0\x2e\x71\x93\xce\x34\x03\x9d\ -\x54\x52\x37\x25\x3e\x3a\xef\x24\xfd\xb3\x9c\x1b\xa0\xf3\x59\x58\ -\x5e\xfa\x94\xa9\xfd\x76\x9b\x2e\x2c\xce\x33\xe1\x39\x42\xac\x97\ -\x68\xaf\x4a\xf6\xf6\xc8\x4e\x9f\xdf\xaf\x1c\xf8\x75\xf8\x40\x0a\ -\x38\x5f\x87\x2d\xaa\xb9\x7d\xbf\xcc\x3e\x66\xcc\x3f\x06\xc7\x7b\ -\xd2\xfc\x8f\x73\x2f\x83\xd7\x03\xd6\x3f\xcf\x3d\x29\xf2\x23\xcd\ -\x38\x71\x8e\x71\xb4\x3b\xa6\xa0\x2e\x4b\x26\xb4\xe4\x24\xc7\x1a\ -\x4e\x16\xb1\xa1\xba\xf4\x2b\xc8\x3e\x4e\xf9\x9d\x74\x8e\x5b\x94\ -\xf1\x06\x25\xd9\xde\x0a\xe5\xd1\xa4\xd5\x19\xf2\x9d\x29\x57\x96\ -\xaf\x77\x74\x3c\x88\x35\x08\x7b\x81\x0a\xe7\x86\x18\xad\xf9\xc7\ -\x7d\x07\xee\xbc\xc3\x73\x0f\xdb\x42\xf4\x6f\x96\xf4\x99\xd0\x67\ -\x46\xec\xe1\x60\x07\xfb\x5e\xd9\x29\xfd\x74\x5b\xc2\xa1\xdb\xfe\ -\x20\x15\x60\xbf\x98\x1b\x13\xc7\x39\x6e\x8c\x71\xc1\x73\x6f\xb1\ -\x19\x6f\xcc\x76\xb9\xb0\x7b\x90\xbf\x3a\x3a\xe3\x3c\x63\xaa\xfc\ -\xf5\xcd\x9f\xb2\xb1\x8c\x9b\xef\xb8\x3f\x85\xf5\x07\xe7\x64\x5a\ -\xbb\xfe\xcb\xcd\x1c\x0b\xaa\x83\xab\x7f\x8b\x6d\xd0\x9c\xdb\xff\ -\xc9\x67\xc5\xb1\xbe\x71\xb1\x96\xd8\xf6\xaf\x7e\xb8\x13\xba\xe9\ -\x91\xdc\x32\xe1\x5f\x74\x10\x97\xe5\xfa\xe5\x73\x66\xab\xed\xad\ -\x71\xcf\x7d\x91\xf1\x47\x78\xbf\x9b\x0c\xd2\x99\x55\x27\x70\xd6\ -\x52\xe3\xda\xc2\x25\x3a\xa3\x51\x2b\xb4\xf7\x65\x5b\xb8\xdc\x8c\ -\x6b\xc9\xb9\xf3\x50\xdb\x1e\x20\x6f\x96\xdb\xfa\x43\x8d\x63\xad\ -\xc9\x77\xa4\xbc\xac\x03\x75\xea\x99\x44\x03\x67\xfe\x3c\x19\x10\ -\xf3\xbf\xca\x3e\x49\x3a\xe3\x6b\xd3\x3f\xc6\x00\xe5\x39\x98\x1c\ -\xe7\x97\x26\xec\x35\x61\xeb\x05\xcb\xeb\xf9\x3a\xb7\x2d\x07\x94\ -\x67\x97\x93\xaa\x8c\x95\x68\x5f\x03\xcc\x52\xcb\x0e\x82\xfe\x0d\ -\xde\x03\xe4\xe5\x9e\x2c\x47\x6b\x6f\x95\xeb\xa3\x43\xff\xd3\x57\ -\x55\xfe\xec\x56\xe4\x48\xe8\x8d\x77\x52\x5c\x6e\xb0\x4e\xfe\xc8\ -\xa6\xfe\xed\xb6\xf1\x4f\x31\x67\x7c\x86\x0e\xfd\xa7\x82\xb0\x33\ -\x06\x9e\xdf\xc1\x6a\xd8\xe3\xda\xfc\x45\x8c\xc1\x82\xce\x3e\x89\ -\x15\xba\x77\xeb\x61\xb6\xd6\x01\xfe\xef\x8a\x3c\xc3\xe1\x73\x9c\ -\xb4\x56\xc4\xf9\xc3\x8e\x72\x9d\x76\x4b\x86\x15\xe5\x85\x69\xb1\ -\x06\x20\x26\xae\xe0\xfa\x03\x74\xde\x7f\xe5\x49\x07\x65\x39\x1f\ -\xf0\x7e\x17\xbe\xd2\x9c\x36\x8b\x98\x91\x7d\x9d\xac\xc7\x01\xc5\ -\x7f\x3b\xce\x70\xc9\x2f\x27\xfb\x00\xed\xbf\x64\x5c\x5d\x5e\xce\ -\x83\x53\xee\x7c\x48\xfd\x82\x31\x4f\x52\xd2\x87\x1d\xb6\x7f\xfb\ -\x54\x27\xeb\xd4\x23\x09\x25\xc5\x1a\x90\x0b\xc2\x27\xe6\xf6\xbf\ -\x72\xd3\x0e\x72\x7d\x0d\xd4\xf7\x11\x47\x25\xe6\xfd\xcc\xe4\x27\ -\xcb\x5d\xa8\x87\x41\xe7\x03\x34\x06\xe4\x1a\x60\xc8\x7e\x20\xf5\ -\xcf\x78\x57\xb2\xef\x23\xf6\x90\xfa\x49\xb5\x19\x1f\x21\xee\x71\ -\x6b\x17\xea\xd5\x75\xc9\x6b\xa5\xbf\xc8\x8a\x35\xa0\x20\xe6\x15\ -\x8c\x81\x82\x3c\xdf\x25\x7f\x9c\xc9\x67\x31\xc8\x1f\xa2\x33\xf0\ -\x20\xed\xf1\x6f\xe8\x46\x3d\xc6\xad\x7b\xbf\x90\x95\x3e\x89\xbc\ -\x51\x69\xd9\x42\x4d\xcc\x8d\xd6\x9a\xc4\xe3\xa3\x24\xfd\x76\xf0\ -\x05\xd2\x5e\x64\xb4\x1b\xf5\xea\xb6\x1c\x18\x50\xee\xc8\xa9\xf3\ -\x42\xff\x75\x67\x4a\x67\x7f\x50\x96\x7c\x92\x35\x3e\x1b\xc3\x18\ -\xa7\xf3\xaa\x86\x93\x1c\xbf\xf7\xde\x6e\xd5\x63\x50\x51\xa6\x28\ -\xde\x50\x75\xf3\x64\xdd\xb9\x48\xe6\xd5\xc8\xfc\x17\xf6\x51\x55\ -\xa4\x0f\xbc\x4a\xfb\x91\xfc\x64\x0d\x7e\x90\x6b\x6a\xee\x6f\x93\ -\xa3\xa9\xd0\x7d\x17\x91\x1f\x56\x40\x7c\x83\xc6\xbe\x05\xb2\x75\ -\x80\xa7\xa3\xf1\xba\x3b\xa5\xd7\x80\xab\xd3\xd5\xf8\xee\xf8\xd8\ -\xd9\xbf\x85\x4f\x35\x07\x7b\xc8\xe0\x3c\x05\x3a\x73\xb0\x2a\xcd\ -\xfc\x0b\x3a\x7b\x93\xb1\x17\x88\xfb\xc4\x5e\xdc\xb6\x3f\xbe\xd8\ -\xcd\x7a\x75\x5b\xe2\xe1\xe2\xc3\x6e\x7e\x06\x7c\xa2\x19\x0d\x7a\ -\x17\x7b\x4a\xd1\x17\x53\xb4\x2e\x8b\xbd\xe5\xe0\xe4\x5b\xbb\x5e\ -\x0f\xe3\x53\x7f\x9a\x02\x5e\x0b\xf6\x84\x9a\x1b\xaf\x52\xe7\x1c\ -\x30\xd2\xbd\xdc\xa3\xd8\xf2\xcc\x06\x71\x47\xf0\xc3\x8e\xcf\x20\ -\xee\xf9\xaa\xc1\xce\xd9\xae\x0c\x28\xca\xf3\xd2\xda\x19\x27\x25\ -\xd6\x01\xe4\xca\xa7\xf0\x51\x1b\xf4\x0e\x30\xef\x3c\x2b\x7a\xea\ -\x8f\x95\x1e\x8c\x6f\x9f\x4f\x79\xed\xa4\xb6\x40\x71\xe7\x19\x7f\ -\x83\xfa\x41\x16\x67\xa4\xc0\xb5\xd5\x79\x4e\x24\x2c\x56\x83\xc7\ -\x27\xf6\x5d\x09\x60\x7a\xf1\xfa\xbb\xbf\xdb\xf5\xeb\xa6\xc4\xb4\ -\x93\x8f\x26\x44\xbb\x31\x0e\x52\x62\x2d\x48\x00\x33\x42\x47\xac\ -\x79\xed\x49\xf1\xcf\xc1\x5e\xd5\x63\xff\x80\xf2\xf6\xf1\xd0\x19\ -\x3a\x9b\xcb\x05\x11\x7f\x3e\x4b\x1f\x60\xb8\xa4\x69\x3c\x36\x28\ -\x2e\x1d\xe3\x12\x78\xc3\xc8\xf3\x4e\x70\xec\xc3\xb5\xe2\x7b\x5e\ -\x53\xf6\xf8\x94\xd7\x27\xac\xfb\x1d\xc4\x26\x26\x82\x73\x4e\x12\ -\xb8\x1d\x46\xe5\x5f\xc4\xba\x98\xdb\x85\xea\xc4\x83\x07\x7e\x4f\ -\xec\xcd\x45\x1d\xcc\x05\xd1\xdf\x67\x45\x7d\xc4\x3b\x08\x21\x6e\ -\x72\x96\x70\x59\xf1\x1e\x92\x62\xdf\x82\x38\x2e\xa1\xff\x3f\x54\ -\xae\xdd\xf5\x77\x85\x88\xb9\xe8\x47\x06\x06\x5e\xfe\x1f\x07\x95\ -\x57\x9d\x54\xae\x8e\x78\xb2\x01\x7b\xf4\x0d\x5f\x8b\x04\xce\x0a\ -\xbd\xcf\x39\x71\xff\x8c\x13\x17\x7d\x03\x98\x52\x29\x7b\xfa\xdb\ -\xe2\xdf\x7f\x6c\xb7\x2b\xf8\x74\x90\xc1\x3e\xe5\x73\x56\xf8\xd4\ -\x72\x4c\x3b\xfd\xad\xc9\xc0\x34\xfc\x4f\xaf\xde\xed\x3a\x79\xe2\ -\x89\x27\x9e\x78\xe2\x89\x27\x9e\x78\xe2\x89\x27\x9e\x78\xe2\x89\ -\x27\x9e\x78\xe2\x89\x27\x9e\x78\xe2\x89\x27\xd7\x96\x38\x57\xa9\ -\x9c\x1b\x69\x95\x97\x7d\xad\xf2\x89\xbe\x56\xb9\xbd\xf6\x5b\x28\ -\x5f\x5a\x51\xee\x5b\x5d\xfe\x96\xd5\x2a\xdf\x6e\xd1\x6f\xa9\xac\ -\x8c\xb4\xee\xa3\x0c\xb7\x95\x7d\x1b\x96\xfb\x36\xfa\xfb\x09\x9f\ -\xf3\xb8\xfb\x97\x13\xc3\xce\xf2\x71\xb7\xec\x73\x4e\x58\xb2\x2c\ -\x5a\x2d\x1e\xbd\x76\x79\x58\xde\x67\xd9\x77\x49\xfc\x71\xed\x72\ -\x9f\xfc\xfe\x39\xdf\xc5\x56\xb9\xef\xa2\xa8\xcc\x5a\xe5\x0b\x8a\ -\xf2\xde\x75\xca\xcf\xe5\xf2\xf9\xbe\xf3\x8a\x62\xc9\xb2\xb2\xaa\ -\x3c\xc2\xe5\x0b\xca\x6d\xbe\xf6\xf2\x89\xe1\x56\x79\xb9\x55\x1e\ -\x5e\xf6\xb9\xe5\x9b\x86\x97\xfb\xb8\x7c\x51\x94\xcf\x29\x6e\x59\ -\x19\x3e\xdf\x2a\x8f\xb4\x97\x2f\xc8\xb2\x78\x9d\x56\x7b\xf9\xe2\ -\xda\xe5\x63\xed\xe5\x4b\xb2\x2c\x5e\xc9\x31\x67\xed\xf2\x71\xe7\ -\xc4\x1a\xe5\x13\xe2\x15\x2e\xaf\x53\x3e\xc7\xbd\x82\xba\xa6\x5b\ -\x5e\xee\x83\x62\x64\xd9\xb7\xb2\x7c\x81\x7b\x94\x73\x6e\x18\xe5\ -\xe1\xcb\xca\xe7\x47\xd0\x50\x59\xb6\x50\x71\x2e\x5f\x3c\x86\x1b\ -\x58\x4e\x53\xce\x1f\x77\xae\x79\x01\x18\x11\x92\x09\x4e\x2a\x08\ -\x2c\xb2\x69\x4e\x5a\x7e\xe3\x2e\x4d\x86\x9e\x78\xe2\x89\x27\x9e\ -\x78\xe2\x89\x27\x9e\x78\xe2\x89\x27\x4f\x0f\x01\x97\xea\xdd\xe2\ -\x73\x9b\xa2\x68\x55\xd5\xf8\xe8\x83\x3a\xb0\x2e\x07\x94\x4e\xe6\ -\xe0\xfe\xab\x94\x88\xbe\xf8\x83\xa4\xb9\xe4\xa4\x88\x83\x7d\xd1\ -\x49\xea\xcc\xc3\xce\x1c\xec\x0d\xc7\x9e\x38\x8b\xbc\x31\x4f\x8f\ -\x6b\x88\xa9\x9f\xa8\x67\x0c\xa1\x33\x6d\xde\x01\x0f\x67\xda\x68\ -\x38\x29\x99\xf3\x02\xac\x50\xe2\x5d\xb3\xc0\xa7\x3e\xeb\x44\x27\ -\xe7\x37\xe5\x33\x79\x9a\xc9\x75\x13\xa3\xf7\x09\x7d\x2d\x10\x36\ -\x4c\xda\x98\x71\x52\x94\xaf\x25\x71\x76\xdb\xf8\x48\x12\xc4\xdd\ -\xd5\x70\xbc\xf1\xbc\x42\xac\x68\x68\x41\xe8\x4d\xf4\x3d\x60\xce\ -\xdb\x75\x27\x63\x57\x09\x9b\x8d\x71\xaf\x99\xb7\x07\xfc\xd9\x49\ -\xca\x55\x6d\xac\x89\x21\xff\x74\x15\xd5\x7e\x53\x09\xdc\x98\xe0\ -\x2f\xcb\x20\x5f\x0d\xfc\xac\x76\x8b\x77\x36\x6b\x15\x85\x0e\xcb\ -\x84\x1d\x9b\x36\x39\xc7\x54\xe9\x61\x8e\xd7\xd5\x2e\x59\xe4\x38\ -\x85\x98\xdf\x8f\x79\xc3\x19\xeb\xd2\xc5\xa3\xc8\x49\xde\x67\xe4\ -\xa7\x23\x47\x37\xc9\xd8\x4f\xd7\x6c\xfe\x65\xa7\x25\xe9\xaf\x09\ -\xfd\x89\xbe\x27\xf9\x0b\x19\x2b\xd7\xe5\x6e\x66\x3c\xaf\xac\xc4\ -\xf0\x43\x8e\x6b\xdc\xa8\x5e\xd8\xe5\x2a\xc7\x0e\x8d\xbc\x6b\x99\ -\x8b\xcf\x3c\xa9\x1d\x7a\xd7\xff\xd9\xf0\xdb\x5d\x96\x49\x6d\x8e\ -\x72\xec\x90\x67\x9a\x95\xb8\x8c\x79\xe2\x36\x2c\x13\x1e\x1c\xf8\ -\x2f\x80\x4d\x47\xf8\x03\x62\xec\x46\xb5\xf2\xf7\x7a\x5d\x47\x9f\ -\xa2\xfc\xb4\x39\x79\xff\xd2\x84\xf5\xe9\xa7\x26\xb4\x05\xc7\x0a\ -\x7c\x91\xb8\x87\xb5\x03\x8b\xff\xa8\x1f\x9d\x47\xae\xfa\xee\x61\ -\xd1\xf9\x94\x57\xa4\x74\xc6\xee\x87\xfe\x18\xaf\x19\x58\x62\xcc\ -\x0f\x36\x25\xf1\xe4\xd2\xc4\xfd\x80\xf9\xb1\xb2\x13\x1c\xc5\x2b\ -\x91\x11\xf3\xe8\xe7\x9d\x78\x70\xc9\xc1\x3c\x9d\x12\x76\x69\x5c\ -\x9b\x75\xc2\x13\x4b\x8f\x4e\x8a\x39\xdb\x0c\xd6\x9c\xc9\xc4\xe7\ -\xbe\xd6\xe3\x3a\xb5\xcb\xde\x64\x78\x81\x6c\x3e\xe0\x0d\xb7\x30\ -\xe1\x8a\x12\x07\x83\xb1\x11\xd3\x92\x3b\x21\x12\x98\x06\x5f\xc9\ -\xeb\x7a\x58\x3f\x75\xc2\x7f\x56\xe8\x6f\x9e\xec\xd3\x94\xb0\x11\ -\x90\x87\x1d\xd7\xc5\x58\x10\x9f\x49\x5c\x55\x9a\x93\x7f\xbd\x87\ -\x75\x6a\x97\x51\xe8\x2f\x2b\x79\x23\x08\xc3\xda\x92\x58\x76\xcd\ -\xf9\xaf\x44\xf8\x15\xc0\x8e\x4a\xe8\xa7\x91\x63\xdd\xb3\xfc\xf1\ -\x41\x45\xf9\x45\xf4\x3b\xac\x71\x69\x31\x4e\x80\x29\x07\xfb\x34\ -\x21\xe6\xe9\x98\x18\x13\x31\x61\x53\x45\x43\x75\x71\xad\xef\x16\ -\xae\x89\x1d\x87\xdd\xac\x4b\xfd\x81\x77\xcf\x2e\x49\x9e\x39\x70\ -\xa0\xb3\xfd\x07\xec\xcb\x84\x78\xcf\xf2\x5d\xf7\x92\x7b\x20\x97\ -\x08\x9e\x71\xc0\x27\x06\x8e\x46\xe2\xb8\x06\x16\xb3\xa8\x5b\x1c\ -\x9c\x3a\x62\x5c\x4c\xaa\xe8\x83\xb3\x84\xa1\xde\xc3\x7a\x91\xec\ -\x05\xdf\x1f\xb8\x4b\x88\x6b\xa8\xc5\x1d\x9c\x03\x96\x28\xfa\x1f\ -\x30\xae\x89\x17\x94\xfb\xdf\xd8\x91\x9f\xfa\x5c\xaf\xab\x98\x80\ -\x7d\x1f\x9a\x63\x0e\x12\xe2\x22\x64\xbb\x3e\x09\x0e\x1e\xb3\x42\ -\x7c\x84\x13\x8c\x81\xde\xf3\x31\xbc\x47\xb1\xde\x93\x24\xfc\x03\ -\xc6\xb9\xcd\x4b\xde\xe5\xa9\x08\xcf\x83\xee\xda\x4b\xbc\x9e\x41\ -\xa1\x47\xc6\xfe\xef\xe5\x7a\x37\x38\x21\xd6\x8e\x74\x68\x96\xb8\ -\x30\x19\xaf\xa7\xdc\xe4\x74\x4a\x49\xbe\xe9\x98\x76\x72\x57\xec\ -\xfa\xbd\xc3\xcf\xbe\x13\xeb\x2f\xe3\x5a\xb6\x30\x5d\xdd\xb9\xaf\ -\xa9\x3f\x70\xbf\xa8\x55\xb1\xee\x7d\xb4\xd6\xeb\x3a\x6a\xf6\xcf\ -\x2d\x26\x43\x73\x84\xb7\xc3\x58\x37\x65\xc9\x49\x5d\x62\x4c\x5d\ -\xe0\x1e\x8d\x7f\xe2\x4b\xe2\xab\x07\x77\x70\xfb\x77\xeb\xfe\xd7\ -\x3d\xb0\xd3\xba\xed\xdd\xff\xc2\x3b\x93\x6a\x83\xc6\x2f\xf4\x07\ -\xbe\x03\xc2\x81\x94\x58\xc4\xac\xbf\xb2\xc4\x67\x22\x4e\xeb\xdd\ -\x90\x9b\xa3\x7e\x60\xd9\x4b\x4e\x6f\xc2\xf0\x66\x4e\x6f\xd8\x05\ -\x78\xb7\xca\x80\xf2\x02\x45\xf2\xc9\x6c\x4d\x62\x6f\x4b\x99\x67\ -\x1c\xf0\x04\x86\xad\x86\x33\x1e\x9a\xbd\xa8\x90\xdf\x73\x7b\xb2\ -\xff\xc0\x0b\xef\x4c\x81\x3f\x11\x38\x52\xa6\xe4\xea\x80\xed\x62\ -\xbb\x58\xaa\x25\x89\x2d\x56\x77\xae\xdb\x7b\xc3\x07\xb6\x7b\xff\ -\x4e\x49\x34\xc0\xf8\xa3\x2e\xfe\x31\xef\x29\x4b\xc4\x99\x1d\x17\ -\xfa\x9b\x18\x23\x9c\xd1\x2d\xe1\x7f\x4c\xd8\x77\xfd\x7e\x0e\x1c\ -\x41\x3a\xcf\x09\x31\xc9\x63\x13\x13\xf6\xe4\xb8\x39\x0f\x8c\xfc\ -\x2d\xf3\xc2\xef\x3f\xf0\xa2\x3b\xc1\x95\x02\xbc\x53\xe0\xa0\x31\ -\x1e\xa4\xe4\x3d\x21\xfc\x39\xc6\x3e\x06\x36\x4e\x32\x55\xfa\x1f\ -\x3b\x6d\xff\x95\x4a\xec\xd0\x22\xe1\xc2\x10\x5e\x95\xe4\xd4\x4e\ -\x4b\xfd\x45\xc5\xfc\x37\x19\xa2\x79\x79\x3d\x8e\xd3\x76\xf1\xc7\ -\x85\x3d\x04\x1e\x29\x70\xec\x81\x13\x2b\x6e\x33\xbe\x2d\xf0\x65\ -\xe2\xe2\xde\x56\xb8\xf8\xc4\x56\xeb\xb5\x5f\x8c\x5f\xc2\xd1\x32\ -\xaa\xcd\xfe\xe7\x72\x74\x13\xae\xb5\xc5\xbc\x49\xe0\x56\x8a\x9b\ -\x95\xdd\x1a\xbf\x4a\x04\x78\x3a\x7e\xb1\x47\x0a\x32\x06\x3c\x71\ -\xa1\x82\x83\x10\x3c\xa8\x6a\xd1\x99\xd4\xa6\x9d\x43\x7b\x3e\x72\ -\x7a\xb3\xfb\xec\x53\x06\x7f\x31\x2d\xf6\x30\xc4\xc5\x45\x9c\x9e\ -\x62\xee\x0c\x33\x46\x6d\x93\x5f\x4a\xcc\x11\x83\x7b\x9e\xb3\x25\ -\xec\x44\x57\x7f\x64\x3f\x93\xed\x27\xf1\xf7\xc2\x2e\xdf\xa4\xd0\ -\x9f\x56\x96\xbc\x61\xc4\x7b\xf1\xe2\x2b\x56\xc6\x0e\x64\x40\x51\ -\xfe\x73\xca\xcf\xb8\x61\x79\xc2\x86\x2a\xcb\xf9\x6f\x9a\x78\x04\ -\x23\x37\x7c\xf4\x2b\x3e\xe5\xdd\x9b\xae\x6d\x71\xec\x55\x8d\x59\ -\xd6\x9d\x55\x25\x8e\xf5\x74\x98\xb1\x57\xd3\xd2\xc7\x09\x7e\x28\ -\xf6\x33\x0d\x6e\x3a\x1f\x90\xfe\x80\xa9\x6b\xb8\x9c\x5d\xac\xb7\ -\x29\xbb\xdc\xec\x7f\x58\xdf\xc8\xf7\x6c\x9d\x3c\x1f\xcf\xfd\xe6\ -\xc7\x3b\xa3\x91\x6d\xcb\x58\x86\xf0\x4f\x1b\x8c\xc1\x2c\x6d\x05\ -\x60\x8f\x82\xd7\xd3\x0e\xce\x7c\x77\x8f\xf2\x8c\xcf\x6c\x72\x8f\ -\xbd\xb0\xc3\x73\x16\xfb\x9a\x0a\x76\x8d\xc6\x5a\x3a\x3c\x4d\x6d\ -\x76\x79\x55\x80\x13\x9e\x10\x63\x6e\xdc\x9c\x59\x8f\xdf\xb7\x29\ -\xac\x3f\x77\xfd\xa8\xd2\xf8\xc5\x3b\x71\xb1\x50\xd9\x4e\x60\xee\ -\x3a\x61\x2c\xbe\xbe\x43\xba\xd8\x89\xf4\xa5\xfc\x8b\x3f\xcc\x06\ -\x19\x43\x1f\xe3\x25\x6b\x55\x9a\x76\xa0\x98\xff\x9e\x1a\xdd\x77\ -\xc7\x0f\x37\xba\xc1\xd0\xd0\xd1\x3b\x32\xfa\x3c\xe9\x0e\x9c\xde\ -\x68\x27\xf8\xec\xb3\x61\xf6\x95\x50\x1f\x94\x38\xf7\xd0\x5f\x9a\ -\xec\x8d\xb1\xd9\x8d\xee\x79\x70\xff\x2d\x77\xa6\x55\xb6\x4b\x79\ -\xff\x5b\x96\x7b\xdf\x12\xe1\x69\xe2\x1d\x83\xfb\xe9\x7a\x8b\xe6\ -\xd4\x37\x74\x54\x23\xdb\x94\x94\x7f\xe1\x61\xf8\x7b\xc1\x47\x42\ -\xbc\xac\xc4\x65\xcd\x3c\xc4\x71\xbd\x78\x49\x3b\xf8\xbe\xbf\xee\ -\x1f\x56\x7e\x69\x9d\x9f\x0f\x27\x47\xcf\xfe\x10\x9c\xdc\x53\xf6\ -\x8c\xe4\x66\x63\x9c\xf4\x4c\x98\xf7\x5a\xc0\xf3\x05\x37\x15\xfa\ -\x60\x82\xf8\x3e\xc5\xfe\x5a\x9f\xc3\x3b\x59\x77\xbf\x7f\xe8\xd0\ -\xf3\xee\x4c\x62\xfd\x00\xdf\xa2\x21\xf9\x36\x24\x17\x41\xde\xc5\ -\xa5\x25\x0c\xba\xc6\xae\x73\x8e\x05\x46\xdf\x73\x37\x30\x8c\xb3\ -\x2a\x63\x48\xbb\xfa\x03\x36\x64\x54\xc5\x07\x5c\x9e\x9f\xf9\x9b\ -\xf5\x7e\x8e\x33\x9e\x02\x71\x8b\x57\xc9\xce\x2d\x48\x9e\x97\x2c\ -\xc6\x2f\xf1\xcd\x32\xd6\x2d\xb8\xc1\x70\x5e\x96\x24\xae\xca\x9a\ -\xb3\xaf\x3f\xfe\xb1\xf5\xea\x74\xd4\x9f\x7e\x39\xf6\xe5\xe0\xe9\ -\x28\x10\x6f\x56\x45\xde\x9b\x7d\xd0\x38\xfb\x60\xec\x74\xd1\x97\ -\x7d\xca\xbf\xed\x92\x6a\xb6\x24\xd7\x29\xca\x3d\xa9\xb1\x06\xcd\ -\x81\xc4\x57\x6d\xc8\xf1\x6b\x96\x99\x27\x5c\x8c\x3b\x5b\x9f\xfd\ -\xee\x5a\xbf\xdd\xab\x1c\x78\x0b\x30\xfa\xf2\x26\xfb\x98\xa6\x22\ -\x35\x69\xa7\x89\x39\xca\x66\x9e\x5e\xe8\x0f\xfb\x58\xf4\x41\xf4\ -\xbd\xb4\x98\x27\x71\xee\x13\xb7\x6b\xeb\xda\x1d\x47\xf5\xda\x13\ -\xe0\x94\xe5\xfa\x30\x07\x1b\xe1\xaf\x4a\x4e\xb0\x34\x71\x24\x31\ -\x77\x6a\xc4\x2e\xfd\x45\xf7\xb4\xb3\xb9\xf4\x2b\xca\x34\xd6\x90\ -\xbc\x06\xae\xee\xba\xc4\xc5\xac\x90\x3f\x26\x21\xc6\x0c\xd6\xe1\ -\x09\xe3\xd4\x63\x6b\xfd\x36\x62\x37\x7e\x90\x37\xe7\x44\xbb\x98\ -\xdf\x9b\x78\xed\x25\xbe\x7e\x2e\x2c\xfa\x8a\xce\xdc\x2c\x39\xe2\ -\xcb\x64\xbb\x92\xf8\x26\xe8\xec\xbb\xe2\x84\x0e\xdf\x56\x5a\xeb\ -\xbe\x46\x60\x81\xf0\xd9\x98\x57\x83\xd7\xa4\x29\xf0\xb6\xa3\x5f\ -\xdb\x6c\xe3\xc3\xdf\x91\x10\x36\xcc\xe1\xf8\xcf\xae\xe6\x0c\xee\ -\xb5\xf4\xc5\xc5\x7e\x2b\xa7\x81\x57\xbd\x41\xef\x9b\xb9\x05\xc4\ -\x3b\xb6\x99\x0f\x39\x6a\x17\xd7\xe4\x38\x9b\xd2\x96\xc4\x5c\xd7\ -\x10\xe3\x75\x46\x62\xc3\x32\x37\x07\xf8\x59\xe1\xa7\x23\xfe\x10\ -\xc9\xef\x81\xf9\x3e\x2b\x71\xcc\xa1\x43\xcc\xaf\x31\x1d\xb8\x99\ -\xbe\xd7\xac\xbe\xaf\x0d\x1c\x60\x0d\xbc\xf7\x8d\x26\x37\x8e\x6b\ -\xc7\x64\x89\x23\xaf\x48\x7d\x2f\xcd\x7b\xcc\xdb\xbb\xaf\xa2\x8d\ -\x25\xa6\x9e\x75\x52\xc4\x6b\xef\x62\x27\x33\x2f\x1e\x38\xce\xe1\ -\xcf\x92\x9c\xf6\xc3\xab\x7e\xf6\xb3\x79\x63\x41\xb4\xad\x41\xdc\ -\xb6\x79\x17\xdb\xd5\x64\x8e\x81\xe4\xc4\x87\x7f\x70\xe0\xe0\x0d\ -\xbf\x01\x1e\xfb\xac\x0a\x7e\x1a\xc6\x3b\x66\xbe\x4a\xf8\xc8\xc4\ -\x3a\x22\xfe\x2d\xa2\x4f\x5f\x36\x8e\xc3\x91\xea\x63\x69\x4d\x72\ -\xd7\xc3\x26\x37\x5c\x0e\x85\x12\xf9\x9d\xc9\xc6\x17\xf7\x8a\x06\ -\xab\xce\x60\x7f\xac\xda\x1b\x2d\x6d\x28\x2f\x01\x0f\x39\xf1\x60\ -\x18\xcc\x83\x42\x1c\x78\xa2\xbe\x09\xbc\x6b\xd1\xde\xb1\x43\x3f\ -\x71\x77\xfb\x0f\x26\xec\x7b\xbf\x82\xf3\x9d\x42\x93\x0f\x14\x73\ -\x9e\x6b\x9b\x55\x9c\x7e\x25\xf0\xcb\xe2\x6b\x7d\x21\xff\x47\xbf\ -\x94\x0c\x95\x25\xe7\x2a\x73\x9c\xf0\xf8\x13\xe3\x99\xfa\x77\xe5\ -\xb2\x3d\x62\x24\xf2\x7b\x5f\x43\x4c\x46\x46\x93\xfc\xce\xe0\x7c\ -\x20\xdb\x19\x6b\x47\x91\xea\x85\xfe\x97\xd1\xe6\x10\xf7\x72\x55\ -\xe0\x7e\x47\xd5\xbb\x1e\xc8\x82\x43\x84\xf8\xa4\xc4\x3c\xad\x83\ -\xc7\xf0\xb4\xa8\xa7\xf8\x68\xa7\x9d\x49\xff\xe9\xf6\x7e\xb2\x3f\ -\xaf\x2d\xd2\xd8\x62\x3e\xb5\xa2\x3c\x53\x9c\x26\x1f\x71\x4e\xad\ -\xac\xe0\xb2\x98\xd4\xee\x7c\x20\x47\x3c\x31\xe2\xde\x7a\x8b\xb3\ -\x3e\x25\x3e\x49\xb1\x4f\x9c\xf0\x7f\x0a\xe7\x17\x4d\xfc\xcf\x54\ -\xfc\x43\x5f\x4b\x85\xc0\x8f\x28\xde\x07\x78\x6d\x75\x69\x4b\x9a\ -\xa7\x84\xfe\x4f\x89\x3e\x7c\x52\xe8\x4e\xf4\xc1\xd0\x49\xf8\x25\ -\x42\xbd\xd3\xd2\x86\x92\xc9\xc0\x67\x0e\x7f\x34\xce\x04\x0d\xb6\ -\xd5\x88\x0f\x5e\xe8\x34\xe6\x2f\xb5\xeb\x2f\x05\xff\x35\xc5\x07\ -\x18\x92\x0b\x5b\xc6\xa7\xe4\x2c\x61\x4b\xda\xf3\xe7\x57\xdd\xfb\ -\x68\x5a\xec\x51\x60\x23\xe5\x4d\xde\x97\x65\x0d\x5e\x3f\x53\x84\ -\xb3\x3e\x87\x7b\xbf\xc5\xfd\xb2\x15\x2d\x7e\x3e\xa1\x2f\x10\xaf\ -\x32\x70\x87\x69\x1f\x17\xae\x32\xe7\x69\x58\x72\x44\x82\x03\x4b\ -\xab\xfd\xc3\x81\x83\x03\xbf\xd6\x13\xed\x6c\x26\x7b\x3e\xf2\xd5\ -\x98\x7f\x86\x31\x7a\x55\x8e\x73\xc2\x5c\x85\x7d\x03\x8d\x15\xbd\ -\xe5\xe7\xb0\xf4\xb7\x2f\xa5\xf5\x45\xc6\xb6\x96\xfa\xe3\xd8\x1e\ -\xd8\xe0\xb3\xce\x44\xac\xfe\x47\xab\xee\xee\x8b\x86\x96\x9e\x64\ -\x1e\x77\xe9\xaf\x35\x98\x7b\x99\x62\xd2\xc4\x18\x9d\xa4\xb5\x84\ -\x25\x12\x9d\xfe\x5a\x82\xe2\xd6\x5c\xee\xf6\x3a\xf9\x24\x98\x37\ -\xbc\x42\xfe\x0d\xbc\xbb\xa4\x31\xf3\x4f\xca\x55\xc2\x99\x3c\xa0\ -\x64\x3e\x3c\xba\x4f\x79\x13\x78\xc1\xd3\xe0\x66\x27\x1f\x74\x99\ -\x6c\x0e\x70\x82\xc3\x96\x70\xbf\x9b\x56\x17\x89\x0f\x9c\xda\x65\ -\xba\xbc\x95\x92\x0b\x3c\x30\x8f\xef\xfd\xf8\xea\xfb\x0f\x2a\xca\ -\x27\x53\x3a\x30\xe6\x67\x99\x03\xdc\x90\x6b\x31\xad\xc7\xcc\xff\ -\xad\x8e\xfc\x3c\x9d\xe1\x67\xc6\x4b\xdf\x64\x9c\x65\xe6\xe8\x65\ -\xce\x6b\xb6\x2d\xa1\x47\x5a\xdb\x84\xbe\xa3\x21\x61\x43\x0e\x29\ -\x3f\xdd\x43\x35\x6d\x24\x2f\x38\xa2\xbc\x73\x56\xcc\xd7\x7f\x04\ -\xfd\x65\x88\xa7\x98\x79\x72\x53\xc4\xe7\x50\x77\xf6\xf7\xdd\x40\ -\x9c\xea\x79\x63\x91\xfd\x2d\x46\xad\xc9\x6b\xc6\x67\x50\x62\xec\ -\x07\xe7\xd7\xb5\x8b\x2d\xad\xfa\x20\x70\xd9\xc1\x19\x97\x75\xf9\ -\x8b\x5d\x3d\xea\x45\xea\xcf\x62\x99\x1f\xc7\x3a\x84\x98\x49\xf8\ -\xef\xb1\xff\x85\xfd\xc7\x36\x8c\xf4\x45\x87\xab\xf4\x3c\x9c\x7d\ -\x08\xfd\xbd\xb4\x77\x2a\xda\x50\xfa\xf6\x2a\xf7\x7d\x67\x72\xbc\ -\xfe\x45\x9a\x73\x48\x1f\x92\x5f\x93\xec\x2e\xac\x0d\x8d\xbf\xf7\ -\x29\xca\x8b\xa7\x8c\x59\xb2\xb5\x89\x9f\x01\xeb\xaf\x5d\x63\x0e\ -\x6f\x31\xde\x62\xa1\xbb\xef\xdc\xe0\x19\x47\x69\x4c\x86\xea\x92\ -\x63\x80\xfb\x39\xf9\xf1\x4c\x5e\xf3\x23\x89\x53\x0f\xc2\xee\xcc\ -\xd9\x6e\xdc\x55\x8d\xd6\xf8\x29\x7c\x6c\xe6\x3d\xa7\xd8\x35\xd8\ -\x93\xe0\xa0\x1b\x54\xa6\x7a\xa6\xa1\x4d\x64\x78\x60\xd6\x99\x3c\ -\x32\xf3\x67\x69\xb9\x6f\xc2\xfc\x97\x21\x7f\x9b\x3c\x17\x51\x4f\ -\x3e\x32\x3a\xf6\xa2\x6a\x1e\x7d\xc8\x64\x9e\x11\xf2\x79\x41\x7f\ -\xf0\x7f\x31\x97\xf3\xe4\x46\xcf\x88\x85\xef\xf9\x42\x46\xf2\xc8\ -\x63\xfd\x4e\x6b\x7c\x0e\x99\xd2\x99\xb7\x19\xff\x5d\x00\x37\x33\ -\xf1\x35\x54\x99\x37\x1a\xfc\xd9\xf0\xc1\x84\x99\xbf\x98\xcf\x5a\ -\xf1\xbc\xda\x55\x15\x37\xb9\x7f\xe4\x3f\x94\xa2\x47\xab\x74\x26\ -\x47\x7c\x60\xb6\xf4\x07\x12\x1f\x2a\xec\x8d\xd3\xdf\x4b\x58\xd3\ -\xff\x37\xaf\xbb\xfb\xb5\x9a\xe4\x80\xad\xd2\xba\x23\x6c\xc8\x4d\ -\x7d\x7b\x42\x8e\x26\xc4\x1c\x98\x0d\x48\xce\x35\x4d\x72\xb8\xe8\ -\x3c\x87\x66\xa4\xff\x2c\x2b\xb9\xaf\x99\x73\xb9\xcc\x3a\xb4\xd9\ -\x3f\x81\x7a\xa1\xdf\x66\xd9\x4e\xba\x6a\xf4\x27\x36\x18\x31\xf0\ -\x2a\x67\xd1\xff\x4c\x97\xd7\x5a\x72\xfa\x32\x5f\xcd\x53\x74\x0e\ -\x66\x32\x9f\x32\xc7\xf6\x80\xe7\xbe\xcc\x5c\xf7\x5b\xe4\x52\x06\ -\x87\x32\xe6\xd8\x5c\xa8\x4c\xfb\x5b\x70\x67\x32\x7f\x72\x99\xfb\ -\x96\xc1\xfc\x38\xc4\x59\xd7\xce\x5d\x67\x95\x9a\xbc\xc9\xcc\xe3\ -\x79\x75\xf5\x3f\x21\x47\xe3\xa3\x73\xd4\x97\xe0\xcb\xca\x4b\x4e\ -\xc6\xbc\xf4\x7b\x64\x0c\xde\x67\xe4\xe4\x39\x4e\x3e\xcc\xb6\x19\ -\x6c\xbe\x2c\xf1\x4f\x2a\xd6\x56\x9f\x43\xb1\x55\x5a\x4d\xf6\xc1\ -\x32\xf3\x8f\x4a\x5e\x21\xda\x07\xea\x92\x77\xd1\x28\xf1\xd8\xb5\ -\xb8\xef\xc1\x47\x91\x95\x7d\x1e\xe7\x6f\xca\xd5\xa5\xbf\x3d\xe0\ -\xd3\xca\x84\xd8\xbe\x20\x3e\x43\xa3\x24\xf9\xdc\xb0\x67\xe0\xd8\ -\xe3\x82\x35\xcd\x31\x51\x34\xbe\x6b\x14\x67\x96\x08\x96\xfe\x64\ -\x3b\x0f\x0a\x8c\xfd\xda\x5c\x5a\xac\x23\x2e\x8f\x3d\xf9\xcd\xf4\ -\x22\x73\x83\x4a\xbe\xb8\x26\x87\x6b\x1b\x6f\x6b\x41\xce\x7f\xc4\ -\xdd\x47\x1c\xbe\xca\xb3\xba\xa4\x8b\x9d\x48\x5f\x62\x6c\x5e\xd8\ -\x20\x73\x92\x8f\x8f\x7d\x6f\xcc\x87\x3a\xcd\x63\xd9\xe5\x01\x93\ -\x5c\xc4\xc4\x47\xc2\xed\xf8\xc9\x6d\x3e\x6b\x4f\x9c\xb8\x66\x2a\ -\xe4\x9f\xc9\xc9\x58\x17\xe6\x5d\x95\xdc\xa3\x46\xab\x0f\x16\x24\ -\xef\x21\xd9\x4b\xf0\x7f\x81\x0f\x0d\x7d\xde\xb7\xa5\xf3\xd5\x9e\ -\x49\xda\xcf\xbc\xb6\x14\xd7\xa1\xf3\xf9\x7f\x56\xec\x7f\x9b\x7d\ -\x82\x7c\x54\xd3\x64\x47\x64\xa9\xcf\xcc\xd0\x7c\xa9\xec\x80\x4b\ -\xd8\xb4\x7f\xf5\x1b\xd0\x7d\xde\xe5\xaf\x95\xf3\xad\xcb\x97\x97\ -\xd7\xa7\x5b\xfa\x93\xbc\xb5\x39\xd3\xe5\x4d\xad\x51\xde\x87\xae\ -\xbf\x7a\xd7\xfd\x57\xed\x02\x5e\xda\x64\x40\xec\x83\x03\x35\xd9\ -\x07\x25\x27\xad\x29\xc7\x10\xfa\x44\xb8\xd2\xe2\x1f\xc5\x3e\x34\ -\x50\x5b\xd3\x3f\xb8\x05\xa1\x79\xb0\xc5\xbd\x59\x69\xfa\x72\xf2\ -\x2e\xff\xb0\xd1\xde\xff\xda\x78\x7f\x0d\x9c\xcb\xcf\x38\xf9\x74\ -\x65\xae\xa3\x0a\xb8\x72\xb9\x21\xe6\x9f\x17\xfb\xb0\x1a\xed\x11\ -\x48\x7f\x46\x8b\xc3\xcf\xed\x83\x59\xe2\x4d\xaf\x51\xff\x3b\xec\ -\x7f\xeb\x8e\x63\x50\xf4\xc0\xfb\xbe\x00\x1e\x6b\x97\xc3\x3a\xe7\ -\xee\x33\x24\x6f\x2d\xf1\x65\xca\xb5\xc4\xe5\xae\xcb\x10\x67\x6c\ -\x8d\xf8\x73\x86\xf6\xaa\xbf\xd2\xc9\xc6\x77\x42\xa2\x62\x0d\x49\ -\x8d\xd5\xc9\x3e\x75\x7d\x76\x39\xb7\xfe\x68\x53\x98\x79\xe9\xc8\ -\xce\x56\xaf\x38\x7e\xe2\x68\x54\x15\xfd\x3d\x58\x6e\xf1\x50\x37\ -\xd7\x61\xf9\xde\x9a\xfe\xab\x52\x8b\xf7\xd5\xe2\xf8\x54\xf1\xfb\ -\x48\x27\xda\xdc\x49\xb1\xed\xbb\xeb\xe0\xd1\xca\x93\x1d\x53\x6d\ -\x72\xea\x52\x0c\x19\xe5\x13\x54\x25\xbf\x1f\x62\xb7\xb6\xb7\xee\ -\xae\x25\x7a\xf8\x9d\x9f\x25\x7b\x50\x2d\xb3\x3f\xc7\xe5\x30\x95\ -\xf1\x6a\x4d\xee\xc4\xb6\xf9\x0f\x9c\x8e\x39\xbb\xbc\xd3\x79\xa3\ -\xab\x22\xf6\xb8\xaf\xcd\x06\x67\x9d\x29\x39\xae\x9a\xeb\xa2\x55\ -\x91\x73\xbc\xcb\x85\x5b\xc7\xf9\xc3\x65\xbe\x96\x1d\xc8\x21\x70\ -\x9d\xb5\xf3\xaf\x72\xdc\x50\xa9\x79\xee\xe6\xea\xcf\xe5\x9d\xc4\ -\xfe\xf7\x59\x13\xb5\x8e\xf1\x20\x77\x58\x8e\x66\xb5\xb3\xce\x94\ -\xb0\x03\xa7\x24\xa7\x67\x56\xfa\x0a\x68\xdc\xd2\x7e\xab\xee\x3c\ -\x23\x5c\x7c\xbc\x53\x0f\x6c\xf2\x77\x4a\xfe\x54\x1a\xbf\x92\x2f\ -\x12\xf1\x0c\xd0\x5f\x56\xac\xc7\xac\x3f\xf6\xbf\x1e\x3a\xf4\xfc\ -\xab\x96\xaf\x3c\xab\xd7\xfe\x2e\x1f\x02\x2f\x6d\x9d\x7c\x7f\x99\ -\x26\x27\x27\xfb\x3d\x61\x63\x8b\xaf\x3d\xa7\x83\x8f\x34\x61\x4f\ -\x67\xc1\x03\x6c\xb0\xff\x02\xb6\xb2\x7b\x9e\xcc\x6b\x56\x59\xfa\ -\xca\xaa\x2e\xe7\xec\x36\x62\x3b\x7b\x2b\x62\x2f\xfc\x9f\xb2\x62\ -\x9f\x5f\x40\x1c\x0a\x7c\xfa\x06\xf3\x09\x22\x5f\x05\xfb\xce\xeb\ -\xad\x53\x7f\xde\xe9\x67\x22\x9e\x1d\xb6\x7b\xd6\xf5\x5f\xb8\xfb\ -\x47\x5b\xfa\xc9\xa4\x4f\x92\xfc\x85\xda\xae\xc5\xed\x6e\x55\x7c\ -\x29\xfd\x3e\xd1\x9e\x59\x27\x1d\x02\x27\x23\xf8\x30\x67\x9c\x84\ -\xe8\x1f\x05\xf6\x1b\x75\xfc\xdc\x26\x61\x9d\x22\xbf\x69\x96\x62\ -\x62\x65\x4c\x18\xe5\xc0\x55\xc9\x1f\x08\x7f\x2a\xf1\x30\x8b\xbf\ -\xc5\x42\x54\x87\x9f\xef\x74\x1d\x3a\x29\x81\xc3\x2f\x5a\x40\x1c\ -\x19\xf1\xe6\x41\x7f\xe0\x17\x0d\x61\xaf\xd1\xbf\x5e\x3c\xd1\x95\ -\xca\x81\x89\xc0\xdc\xe3\x19\xf0\x25\x8a\xf5\x1f\xcf\xc2\x3c\x41\ -\x39\x16\xe0\x34\x15\x3a\x4b\x51\xbe\x91\xb8\xaa\x33\x5b\x8e\x2d\ -\xde\x45\x39\x18\xd5\x97\x98\x13\xd1\x5f\xa7\xb1\xa5\x07\x7e\xad\ -\xdb\xf1\x12\x43\xc1\xe1\xe7\xfc\x76\x1a\x7b\x70\x73\x81\xb9\x26\ -\x45\x39\x15\x04\xef\x61\x83\xf6\xbc\x19\x9c\xab\x47\xe8\x3c\x75\ -\x27\xb9\x01\x3d\x97\x21\x45\x49\x1e\x54\x86\x10\xe7\x74\x4b\x8f\ -\x1f\xed\x1b\x0d\xbc\xff\x4c\x34\x34\x2f\xfa\xfe\x82\x13\x0b\xce\ -\x8b\xf1\x3c\xeb\x58\xa1\xf7\x23\xa6\x78\xa0\xc7\x75\xb9\x96\xc5\ -\xda\x23\x3e\x7b\x95\x51\x70\x0e\x5e\xb7\xdb\x95\xf1\xc4\x13\x4f\ -\x3c\xf1\xc4\x13\x4f\x3c\xf1\xc4\x13\x4f\x3c\xf1\xc4\x13\x4f\x9e\ -\x5e\xd2\x62\x0c\xd9\x95\x72\x5f\xab\x7c\x49\x39\xde\x2c\x5f\x24\ -\xea\x18\x2e\x5f\x50\xac\x6d\x96\xf9\xb7\xff\xb5\x55\xbe\x78\xb8\ -\x55\xbe\xd0\xd7\xfa\xfe\x05\xa5\xbd\x7c\x7c\x75\xf9\xd8\x46\x7f\ -\xbf\xa8\x1c\xff\x67\xfa\x03\x97\xcf\x1d\x97\x65\xd1\x8c\x65\xab\ -\x55\x3e\xd1\x5e\x1e\x91\xbf\x45\x79\xb8\x55\x56\x86\x5b\xdf\x51\ -\x7c\xb2\xec\x28\xcf\x55\xfa\xb6\x50\x56\xda\xcb\xef\x92\xe5\x13\ -\xfa\xca\xf2\x8d\xb2\xbc\x1c\xec\x3b\x11\x6c\x96\x7d\xeb\x95\x97\ -\xf7\xb8\xe5\x3d\xc3\xe7\x14\xb7\xac\xb4\xca\xe7\x88\x46\xc8\x2d\ -\x8f\xb4\x97\x2f\xac\x5d\x06\x75\xd0\xe5\xe5\xf3\x8a\x75\xa9\x55\ -\x3e\xd6\x5e\x76\xdc\x32\xb7\xaf\x55\x06\x35\xd0\xe5\x65\xd4\x8f\ -\xcb\x17\xdb\xcb\xa0\x0e\xea\x6b\x2b\xcb\xbf\x5f\xf2\xb5\x95\x87\ -\xf1\x3c\xd9\x0f\x3f\x22\xfe\xbb\xad\x4f\x3a\xef\xdf\xa5\x71\xb1\ -\xe5\x32\x78\x7e\x6e\x15\x1f\x04\x6d\xbb\x3c\x3f\xb7\xfd\xd4\xee\ -\xcc\x25\x9e\x78\xe2\x89\x27\x9e\x78\xe2\x89\x27\x9e\x78\xb2\x4b\ -\xf2\x59\xf1\x79\x25\xf8\x56\x34\xf3\x77\x1f\x0c\x5b\xb3\x88\xb3\ -\xdc\xbb\xdb\x95\xda\x7d\x39\xf8\xeb\x09\xf3\xd3\x4e\x56\x5f\x72\ -\xd2\xfa\x82\x93\xd4\x66\x9d\xa4\xde\x70\x52\x26\xe2\xea\x1a\x4e\ -\x21\x35\xff\x07\x4a\x1b\x6e\xc0\xd3\x4c\xc6\xa2\x81\x25\x27\xe5\ -\x62\x02\x0b\xbd\x10\xb7\x82\x5e\x23\x8c\x09\xe4\x20\xc7\xd4\xb2\ -\x33\x71\x6d\xc4\x5d\x75\x5c\x0e\xec\xbf\xb9\x94\xd4\x96\x08\x3f\ -\x2c\x6b\x32\x2f\x45\xda\x92\xf9\x96\x16\x70\x9d\xca\x84\x9b\x9c\ -\xd0\x67\x9c\x60\xf0\x8e\xab\x01\x93\xa4\xa7\x02\x2c\x5a\x60\xfe\ -\xe7\xac\x86\x93\xb5\xea\x4e\x36\x5c\x93\xf1\xa2\x92\xef\x04\x98\ -\x8a\x84\xb9\x54\x77\x06\x07\x13\x57\x75\xdc\x63\x37\x24\xa9\x9d\ -\x71\x10\x4b\x89\x7c\xb7\x2c\xe9\xa5\xd2\xcc\x2b\x24\x3c\x39\xea\ -\x47\xac\x1f\xf1\xf5\xeb\x77\xbb\xbe\x3d\x96\x67\x23\xb6\x2e\x23\ -\xe6\xe0\x16\x5f\x09\xf2\x53\xcb\xcd\xbc\x1f\xca\x19\x05\x96\x04\ -\xcf\x3f\xbd\xc4\x4a\x87\xec\x19\x52\x18\x27\xc2\xa7\x28\x3f\x23\ -\x2e\x3f\xd1\xe3\xe7\xdf\x1c\x0d\x71\x8e\x6e\x4e\xe2\x11\x22\xb7\ -\x82\xb0\xe4\x09\xfb\xc6\xe5\x83\xa8\x38\x69\xd6\x8f\xbf\x07\x75\ -\xf2\x09\x9d\xfc\x64\x3e\xfd\x85\x47\x22\x62\xcd\x98\x0c\x9e\xf9\ -\x26\xfe\x68\x8e\xcc\x7e\x7f\x54\x9d\xfd\x66\x0f\x9e\xbf\x42\x26\ -\xcc\xda\x53\x29\x9d\x31\x48\xa9\xdf\x44\x4a\xce\xf5\x61\x89\xb7\ -\x4f\xb8\x4a\x65\xc2\x03\x49\x71\xde\xc1\xb6\x73\x25\xb7\x2b\xfb\ -\xaf\x7b\xe9\xfb\x63\xc1\xb3\x4e\xc2\xbf\x20\xd6\xd4\x05\xe2\x6d\ -\x03\x3f\x46\x9c\xe2\x47\xc5\x18\xef\x57\xde\xdc\xed\x3a\xb4\xcb\ -\x1e\xc5\xf7\xda\x84\x31\x2b\x39\x1d\x24\x96\xa0\xe5\xe6\x85\x15\ -\x69\x7c\x21\x37\x03\x31\xde\xfb\x87\xed\xff\xde\xed\xfa\x98\xa1\ -\xc6\xdf\xc4\x82\x67\xc4\x78\x06\xa7\x1d\x61\xd9\x38\x49\xb1\x6e\ -\x44\x8d\x9a\x33\xa9\x56\x9c\x89\x60\x03\x9c\x26\xef\xec\x76\x3d\ -\x5c\x99\x48\x7f\xfc\xfe\x94\x35\xcb\x78\x63\x2e\xde\xac\xcc\x5d\ -\xca\x4b\xbe\x29\x60\xc6\xc4\x83\x94\x37\x32\xd1\xed\xfa\xc4\x03\ -\x0b\x14\x73\x0c\x5c\x62\xe4\x0b\x10\xe6\x9c\x5d\x71\xe2\x46\xd9\ -\x89\x6a\xe0\x08\xa9\x3b\xe3\x13\x5f\xfe\xdb\x6e\xd7\xc3\x95\x30\ -\xe1\xb5\x37\x56\xf0\x59\x50\x1e\x32\xcd\x3d\xd3\x94\x93\xce\xdc\ -\x7a\x34\xbe\xba\x1e\xa7\x6d\x4e\x9c\xfe\x83\x64\x10\x58\x07\xb3\ -\x92\x23\xac\x42\x78\x7f\x84\x0d\x69\x54\x45\x1f\xaa\x3a\x11\xbd\ -\xfc\x64\xb7\xeb\xe1\xca\x64\x88\xf1\x0c\x28\x67\x46\xf6\x9f\x82\ -\x5d\x6c\xe6\xcc\x12\x1e\x97\xd0\xcf\x64\xb0\xd2\x2b\xcc\xd3\x57\ -\xa5\x82\x0b\x0e\x72\x88\x28\xdf\xca\x64\xdc\x19\xd8\x19\x84\x89\ -\xa8\x95\x9c\x98\x75\x6f\xc7\xf2\xd7\x36\x93\xf1\xe0\x0c\xe7\xaa\ -\xcb\x1c\x69\x97\x47\x8b\xb8\x64\xb0\x76\x01\x67\x4b\xcc\xcf\x31\ -\x95\x70\xca\x8e\xf4\xa0\x4a\x63\x89\x10\x70\x23\x67\x65\x9e\x7d\ -\x95\x70\x53\x08\x7f\x5d\xd4\x31\xae\x01\xaf\xe5\xec\xc3\x3b\xb8\ -\xef\x8e\x72\xca\x26\x44\x3f\x66\xbc\x2f\xc6\x8c\x29\xb4\xf1\x8d\ -\xb1\x7e\x2a\xb4\x17\x4b\xdb\xd3\x3d\xc3\x2b\x8d\x86\x16\x9e\x44\ -\x1e\x0e\x30\xdf\x08\xdf\xdf\x28\x52\xfe\x21\xe1\xd3\x9b\xf7\xfe\ -\x3f\x65\x1b\x9c\x3f\xda\xd1\xdf\x99\x8d\x99\x4b\x0e\xd6\xbf\x42\ -\xf4\x14\xb8\x25\xb6\xa5\xa7\x28\xe5\xad\xd4\x25\x5e\x49\xa9\xc9\ -\x85\x40\x5c\x76\x56\x49\x62\xe8\xd0\xdc\x73\x60\x9b\xcd\xbc\x02\ -\x39\xf4\x72\xe4\xcc\x11\x6e\xab\xc4\x59\x84\x9d\x01\x2c\xa3\xc9\ -\x60\xd9\xb1\xfc\xe5\xad\xe0\xd1\x0c\xa5\x8d\xf9\xef\x17\x4c\xb6\ -\x7f\xd3\x84\xab\x57\x93\xfb\xec\xe0\x89\xad\xd6\x24\xa6\x32\x5f\ -\x5d\xc6\x28\x4b\x6c\x0d\xb6\x7d\xdc\xfd\x05\x6c\xc3\xbc\x31\xd7\ -\x13\xdb\xc7\x15\xf1\x82\x6f\x44\xde\x58\x4e\xe5\x7c\xcc\x8c\xc4\ -\xc4\x04\x5e\x56\x34\x34\xed\x8c\x07\x4e\x3e\xb5\xd9\x3d\xae\xbb\ -\xee\xf9\x8b\x84\x8f\x6e\xce\x30\x5f\x08\xf0\x56\x74\xc6\xe3\x8f\ -\x53\xfe\xfa\xe1\x4f\x6e\xa5\x2e\x31\x1a\x5f\xf5\x26\xbe\x00\x63\ -\xd1\xf0\x38\xcb\x50\x9f\x66\x4c\xc2\xc1\xc1\xe8\x87\xae\xbc\xe5\ -\x5b\x97\x54\x40\xec\x79\x82\x75\xc9\xff\x50\x96\xfc\x0f\x25\xb1\ -\x7e\x15\x85\x0d\xf4\x29\xbc\xaf\x0d\xf3\x65\x32\xa2\xff\xc1\x1f\ -\x91\x93\x18\x81\xf8\x10\x6f\x01\xfa\x91\xea\x62\xee\x6f\x2e\x2d\ -\xfd\x54\x5b\xfa\x09\x97\x9b\x78\xdd\x98\x13\x99\x9b\xe7\xde\x9e\ -\xe6\x7d\x26\xfc\x8b\x4e\x0e\x73\x10\xe5\x51\x32\xbf\x03\xb0\xc8\ -\xe2\xad\x75\x62\x23\xde\xa2\x50\xc6\x5c\x60\x1e\x47\x9b\x79\x1c\ -\xf3\xb2\x4d\xc4\x4b\xa0\x31\x97\xed\xb8\x55\x01\x8e\xfb\x86\xfc\ -\x97\x34\xbe\x0c\x9e\x07\x0b\x34\xb6\x18\x57\x0b\x39\xda\x64\x1b\ -\x6a\x8c\x8f\x9e\x8d\x9c\xec\x78\x5e\xee\x46\x92\x1c\x3d\x73\x3e\ -\x13\x98\x25\x0c\x18\xc6\xe5\x64\xbc\x76\xe0\x9a\x1e\xf6\x61\x6c\ -\x0c\xaf\xbb\x57\x1d\x52\x8c\xf7\x64\x08\x7f\x9b\x79\x16\x0a\x12\ -\x23\x16\xfa\x71\xc7\x04\xda\x14\x07\xce\x9f\x12\x69\x6c\x54\x0f\ -\xe8\x07\x79\x9a\xee\xfa\x45\x58\x77\x92\xeb\x82\x73\xd6\xeb\x4e\ -\xc2\x9c\xbe\xa4\x5c\x8e\x23\xdc\x55\x09\x19\xbf\xf5\x8d\x74\x80\ -\x71\x37\xb3\x72\x8c\x65\x25\xbe\xb6\x7f\xe8\x75\xf7\xf9\x86\x3f\ -\xf8\xbb\xeb\xfc\xb4\x2f\x1d\x3a\x43\xd8\x58\x84\xdd\x4c\xe3\x41\ -\xee\x99\xac\xa2\xd4\x73\x99\xb0\x41\x99\x07\x99\xb8\xd2\x86\xd6\ -\xab\x47\x1c\xe3\x4b\x9b\x69\x62\x22\x4d\x49\x4e\x90\x9c\xe4\x11\ -\x05\xbe\xa3\xb2\x4f\xf9\x9d\xee\x68\x61\x7d\x11\x15\x7e\x35\xfa\ -\x0f\xe1\xe3\x9a\xcc\xd7\x49\x3c\x66\xe2\x1a\x09\x55\x1c\x2d\x58\ -\x5a\x6f\xbc\xbf\x22\x6d\x2c\xd0\xbc\x5c\xb0\x6a\xad\xfd\xa4\xb4\ -\x79\x09\xa7\xd8\xe5\x89\x26\xff\x71\xd5\x39\x32\xfa\xef\xee\x5b\ -\xaf\x1e\x31\x8d\xed\x1f\xe6\x2c\x2b\x33\x6e\x1d\xe1\x1e\xb8\xb8\ -\x62\x75\x27\x1d\xa9\xac\xc6\xa5\xed\x89\xa4\xc1\x91\xa2\x32\x1e\ -\x3a\x61\x2e\x59\x65\xf2\xf7\x46\x35\x31\x77\x70\x1e\xf7\x65\x36\ -\x47\xc0\x78\x53\x05\x18\xea\xc0\x66\x67\x3c\xf1\x0a\xad\xc7\xe4\ -\x8f\x20\x8c\x6c\xc6\x1a\x71\xb9\x29\x52\x56\x59\xe2\x89\xaf\x69\ -\x17\xed\x07\xc7\x4a\x56\x75\xf1\x60\x59\x2f\x2e\x97\x16\xf5\x67\ -\x71\x8f\x98\xa8\x8f\xd2\xfb\xfc\xca\x1b\xd3\x63\xa2\x0f\x84\x1a\ -\x8c\x6d\x2b\x39\x3c\x18\x1f\x9d\xb9\x04\xc5\x77\x0e\xad\xfe\x51\ -\x5a\x5b\xf8\x2e\xf8\x8a\x0a\x96\xab\x9b\x0a\xfb\xfa\x5c\xdc\x2e\ -\x83\xf1\xae\x09\x2b\x84\xf0\x5d\x2b\x84\xf3\x3a\x3e\xfe\x9e\xb5\ -\xd6\xfb\x60\x3c\x50\x27\xec\xdd\xbc\xc4\x44\x25\xce\x04\x89\xbf\ -\x48\xfe\x79\xb1\xdf\x89\x6b\xc5\xed\x60\xdc\x75\x4c\xe2\xfe\xfa\ -\x37\xc1\x31\x01\x3e\x02\xe0\x0d\xe6\x08\xff\x89\x39\x3a\x92\xcc\ -\x9f\x74\xd9\x1a\x96\x13\xb6\x72\xc1\x6e\x08\xbd\xd4\x9b\xed\xc9\ -\x4b\x0c\xb3\x1c\xe9\x87\x6d\x2a\xcc\xf9\x84\x27\x05\x7e\x18\xac\ -\x8b\x06\xf5\x81\x97\xac\xbe\x1f\xf2\xe5\x91\x0b\x4e\x73\xbd\xc4\ -\xa3\x77\x6d\x67\xe0\x96\x92\x7e\xad\x53\xc0\x9f\xec\xf9\x39\xe1\ -\x8d\xd7\x9f\x7e\x88\xf0\xe7\x75\x89\xbb\x67\x31\xc6\x5d\x02\x18\ -\xdd\xdc\x9e\x55\x98\xa2\xfd\x6f\xc9\x9b\x67\x84\x0e\x66\xc4\xbc\ -\xcc\xe3\x8b\xb1\x95\xc0\x31\x5c\xfc\xa1\xa1\xbe\xb5\x02\xdc\x79\ -\xe0\x13\x66\x89\x63\x8e\x39\x60\x30\x4f\xc7\xc5\xda\x18\xd7\x2e\ -\xc7\x5c\xc2\x59\x20\xf6\xca\x59\xbd\xd6\xc4\xac\x63\x8e\x53\xc6\ -\xad\x03\x1f\x5c\x78\xa2\x04\xde\x93\x1e\xee\x2f\x9a\x12\x19\x0f\ -\x14\x09\x5f\x9e\xf0\x90\xdc\x7d\x86\xa8\x5b\x5c\xe8\x28\xa2\x57\ -\x57\xe0\x86\xc6\xcd\xca\x77\x80\x05\xdc\xe4\x84\x08\xbb\x18\xae\ -\x25\x27\x12\xbc\xbd\x2e\xbe\xd2\x67\x04\x3f\xf6\x2d\x60\x9c\x13\ -\x66\x94\xc6\xb8\x3c\xa4\x23\xa1\x9f\x04\xcf\x23\x2b\x70\xf1\x60\ -\x6f\xa7\xe5\xfc\x97\x93\x76\x8f\x8b\x27\x4f\x18\xcf\x98\xbb\x06\ -\x09\xcb\xb1\x5f\xd9\x05\x39\x3c\xfa\xfc\x0f\xc2\x96\x4e\x07\x6b\ -\x4d\x0e\x03\xb4\x03\xf5\x8a\x05\x30\x47\x0f\xa5\xe5\x57\x0f\x26\ -\xf4\xfb\x89\x33\x9e\xd6\x62\x17\xf7\x1c\xf8\x1c\x06\xad\xe1\xcd\ -\xf3\x5f\x53\xab\xfd\x65\x1e\x7d\x42\x65\x2c\x34\xe6\x0b\x16\x7d\ -\x48\xac\x8b\xe3\xea\x1c\x38\xbf\x9b\x36\x23\xd6\x77\xe2\x6c\x86\ -\x0d\x2d\xb9\x9c\x70\x5e\x81\xbe\x4c\x5c\x5f\x8c\x8d\x0b\xae\x20\ -\xa3\xa7\x8a\x69\x49\x2a\x4f\x36\x48\x8d\x30\xd9\x19\x07\xa7\x85\ -\x6f\xae\xb4\x78\x0a\x9f\x07\x5e\x5d\x9c\xc3\x60\x6e\xa6\x3d\x2d\ -\xf6\x15\xb4\xff\x9a\x5d\x31\x6e\x7c\x3e\xe5\x15\x19\x17\x8f\x1b\ -\xfd\x43\xad\x48\xae\x34\xe6\x65\x1d\x54\x06\xdf\xe6\x7e\x17\x98\ -\xb5\x49\x8d\x39\x81\x30\x07\x66\x69\x0e\xaa\x10\x9f\x08\x8d\x77\ -\xc6\x1f\xbd\x75\x78\x4f\x76\x5d\x1b\xa1\x9b\xd2\xdf\xff\x33\xbf\ -\x31\x19\x9c\x7d\x0a\x7b\xc0\x8c\xce\x7b\x4c\xc2\x89\x24\x4c\x62\ -\x5a\xe3\x71\xee\xa3\x44\xc3\x27\xff\x12\x7c\xd7\x2e\x37\xa8\x8b\ -\x45\x0c\x7c\x92\x84\xbe\xf0\x57\xab\xef\x1b\xd5\xee\x27\x2c\x13\ -\xcc\xfd\x19\xc2\x89\x66\xec\x3a\xf8\xba\x12\x6d\xeb\x3d\x6c\x85\ -\x34\xf1\x5d\xd4\xc9\xc7\x4a\xbc\x99\x36\x63\x08\xa7\x0c\xb6\x7f\ -\x52\xda\xbd\x3d\xdd\x5b\xac\x92\x9b\x0e\x2b\xc1\x77\xa6\x43\xb3\ -\xdf\xc3\xd8\xc9\x34\x6d\x97\x32\xe1\xda\xc4\xec\x8f\x12\x6e\x76\ -\x0e\xbc\x02\x5a\x43\xda\xb9\x12\x33\x08\x78\x63\xcc\x25\x7c\x19\ -\x57\x91\x68\xfc\x29\x9c\x8b\xe6\x61\xdb\x68\x3c\x76\xb1\xcf\xc7\ -\xd8\xc5\x3e\xf8\x47\xb3\x77\x83\xc3\xb4\x0f\xf3\x5e\x13\x0f\xdf\ -\x74\x79\xe1\x2a\x34\x0f\x65\xc3\x55\x9a\x9f\xed\xd0\xdd\x97\x7a\ -\xad\x94\x36\xd9\x7b\xc0\xf7\x95\xbf\x16\x76\xcd\x63\xe9\xa6\x9f\ -\x8a\xf7\xe2\xf4\x31\x88\xe7\x64\x2c\xaf\xf3\x3a\x57\x90\x7e\x62\ -\xe6\xcc\x13\x63\x8b\xcf\xa5\xd6\xf4\xa7\x8d\x1b\xa5\x27\x30\xaf\ -\x01\x67\x32\x2b\x39\x3d\xc0\x29\x92\x36\x18\x2f\x51\x8c\xc4\x17\ -\x67\x25\xa6\x20\xef\x4f\xab\x4d\xbc\xe7\x3c\x61\x5d\x96\x25\xf6\ -\x50\xf1\x9f\x7a\xab\x92\x95\xb2\x4f\x99\x79\x2a\x35\x5e\xfb\x36\ -\xf6\x82\x84\x79\x4b\x7e\x29\xde\xaf\xe6\x75\xe0\xd1\xf8\x7e\xa6\ -\x00\x1c\x39\x60\x77\xd1\x39\x5e\x8d\x6c\x1b\xf0\x81\x6a\xc1\xfa\ -\xd9\x0d\x6e\xad\xa2\x0f\x15\x34\xf6\xa3\x10\x3e\xa4\x8c\x59\x21\ -\xac\x7f\xd8\x05\x16\xe3\xeb\x92\x6e\x5c\x5c\xec\x30\x63\xf8\x32\ -\x66\x36\x6c\x85\xd2\x9a\x3c\x4b\xbd\x92\xa3\x23\x77\x2d\x27\xfc\ -\x8c\x1b\xe5\xf2\x18\x81\x2f\x28\x03\xce\x20\x6d\xda\x99\x48\x7e\ -\x68\x11\xfb\x44\xb2\x05\x4d\xc6\xe2\x02\xb6\x54\x9a\xf9\xc3\x37\ -\x5c\x57\xc6\xf5\xe2\x43\x39\x8c\x31\xb5\xdc\x5c\xcb\x32\x2e\x4f\ -\xb0\xce\x7c\x32\xb4\xaf\x30\xab\x8c\xd5\x6c\xf1\x1e\x0c\xfb\x5e\ -\xd8\x0d\xb4\x66\xec\xb2\x7e\xc4\x5e\x35\x15\x1b\x05\x1e\x95\x9c\ -\x03\x6c\xf6\x05\x43\x3f\x59\x9d\x6d\x35\xc6\x27\x2d\xc9\xb9\x87\ -\xd7\xba\x84\xbf\xb6\x15\xbf\xe7\x81\xb8\xd0\x4f\xde\xb5\x89\xe4\ -\xfc\x96\xb1\x2b\xd2\x3e\xa8\xf0\xde\xc4\x94\xe7\x82\xa6\xe4\x93\ -\xb5\xca\x92\xbb\x1a\xe3\xaf\xb8\xab\xfa\x11\x72\x14\xd8\xc1\xc4\ -\x9b\x24\xf1\xef\x18\xab\xbc\xc8\xb6\x88\xc1\x67\x75\xe4\x1f\x26\ -\x1c\x4d\xc6\x22\xcb\x5b\xd3\x5b\xe2\x86\x9d\x50\xab\x8f\x83\x6b\ -\x15\xb8\xe9\xc0\xfc\x86\xdd\x98\x21\x4c\x47\x89\x93\x69\xba\xfa\ -\x29\x31\x2f\x8f\xc4\xfb\x76\x31\xf7\x92\x56\x79\xb7\xf5\xb3\x27\ -\xe9\x3f\x43\x98\x62\x2e\x2f\x17\xf9\xa7\xcc\xd3\x6c\xef\x93\x6e\ -\x8a\x4d\x8e\x51\xd8\x40\x12\x63\x7b\xab\x31\x81\x36\xc6\x62\x41\ -\x63\x3c\x60\x97\x3f\xc8\xc5\xf2\x2e\x90\x5e\x64\xff\x71\x71\xaa\ -\x09\xcf\x96\x79\x38\xe2\x56\x69\xcb\x1c\xbd\xdd\x92\x8c\x5f\xd8\ -\x21\x41\x60\x79\x32\xa7\x78\x5e\x9e\xd5\x71\xac\x92\xc4\x44\x95\ -\x78\x80\xc0\x8e\x8e\x69\x95\x6d\x9d\xb1\x4e\x86\xe6\xbf\x95\xc5\ -\x18\x03\x6e\xbc\xe4\xf5\x6a\xea\xc7\xe4\x3e\xe4\xf6\x1f\x60\xc8\ -\xe7\x29\x56\xaa\x46\x67\x5f\x71\xbb\xbe\x9b\xeb\x3b\x49\x26\x70\ -\xe6\x12\xfc\x41\xc4\x85\x64\x54\x9a\xd8\xc8\x8c\x4d\x2b\xf9\xcd\ -\x69\x6c\xd5\x99\x8b\x29\x59\xfb\xcb\xed\xdc\x7f\x40\x51\x6e\x49\ -\xe2\xde\x5a\x95\x7c\x61\xae\x8e\x72\x4d\x1d\x15\x25\xa6\x3e\xfb\ -\xc9\x98\x73\xbb\x4a\xe7\x21\x49\x83\x6c\xe8\x5d\x8d\xf3\x1d\x19\ -\xca\x3d\x90\x94\xf6\x2e\xf1\x3a\x12\x27\x61\x49\xe2\x6f\xbb\xfc\ -\xb3\x8c\xdf\x9b\x62\x9b\x7f\x4b\xe7\x37\xed\x62\x85\xee\xf9\x0e\ -\x71\x13\x6a\x95\x36\xbc\xd9\xd6\x3b\x98\x32\x25\x6e\xb4\x9c\xe7\ -\x78\x8d\xab\xca\xf3\x22\xe5\x70\xe7\x5b\xbd\x2d\xe9\x4f\xa0\xff\ -\x04\x79\x0e\x82\x9f\xd4\xe5\x25\xe7\x3a\xb3\x0d\x97\xd2\xc0\x43\ -\x55\xde\x0a\x1f\xc8\x5a\x72\x03\xc6\x0b\xc6\x18\x73\x0b\x94\x5b\ -\xe3\x57\xc6\xfb\xb4\xde\x45\x45\x72\x61\x8a\xf7\x61\x9d\xee\x59\ -\xbc\xc4\x46\x92\x1e\x5d\xfc\xc7\xb4\xbf\xce\xb8\xea\x46\x45\x62\ -\x30\x97\x25\x7e\x7f\x0b\x7f\x37\xa4\xbe\x65\xdb\x7d\xc7\x95\x88\ -\x71\xef\xa3\x99\x10\x73\xd8\xf0\x78\x6d\xcd\x6f\xbc\x8e\xb9\x78\ -\xd9\x6d\x78\xe3\x13\xa7\xbf\xd2\xc9\x76\xee\x54\xc6\x03\x9f\xfa\ -\x22\xf6\x94\x64\xef\x6a\xac\x1b\xe2\xf5\xa0\xb5\x9e\xb1\xa9\x13\ -\xa3\xa5\x0d\xcf\x23\xb6\x20\x01\xcc\x43\x53\x12\xd3\x39\x6f\xba\ -\x67\x43\x12\x0f\x9b\x78\x1c\xca\x92\xbf\xa6\x42\x7b\x36\xf1\x9b\ -\xd7\x76\xa8\x89\x57\x24\xfd\x8a\xf2\xb6\xb4\xb0\xa3\xa7\xb0\x16\ -\xd3\x18\x73\x71\xaf\x19\x7f\x15\x7d\x67\x6a\x62\xfa\x7f\x5f\xe9\ -\x73\xc6\x83\xe5\x47\x88\x03\xc5\x90\xfe\x54\x37\x6e\xc3\xc5\xbb\ -\x36\x99\x43\x9e\xf8\x79\xd8\xa7\x76\xb5\x48\x1f\x7c\x3c\x05\xf0\ -\x8f\x68\xcc\x45\x47\x3c\x1c\x06\x7f\xd2\x01\xf2\x07\x75\x02\x1f\ -\x37\x99\x81\x4d\xad\xd7\x9a\xf3\x74\xc1\x76\xf1\xc0\x25\x1e\x33\ -\xf4\xa3\x53\x9c\xf8\x55\x31\xf7\xb8\x92\x0c\x7f\xfc\xab\x59\x70\ -\x58\xab\x12\x7b\x56\xec\xd9\x53\xa4\xab\xba\xb0\x63\x3f\x36\xd3\ -\xa9\xe7\xc4\x30\xcf\x69\x2e\x56\x70\xcb\x26\xa5\x18\x68\x93\x63\ -\xc2\xb3\xf0\xbd\x85\x17\x76\x12\x8b\xd4\x4d\xc9\x25\x02\x33\x84\ -\x75\x9c\x0a\xcd\x3a\x09\xe0\xf4\x8a\x7d\xc7\x33\xad\x3a\xfc\xa2\ -\x1d\xc3\x46\x9d\xf0\xd7\x1f\x05\x97\x33\x38\xe2\x61\x6f\x52\xfc\ -\xbc\x51\x93\x3e\x25\x5e\xdb\xc1\x03\x11\xd7\xaf\xaa\xf1\x45\x92\ -\x34\xeb\x4f\x21\x27\x22\x19\xa8\x91\x8e\x72\xa1\x19\xd8\xaf\x1d\ -\x3f\x3f\x18\x0f\xd4\xce\x83\x03\x3e\x0f\x3d\x81\x0b\x02\xef\x42\ -\x62\xfd\x02\x2f\x9c\xf0\x92\xf5\x2b\xe6\x99\xe8\x86\x8c\x99\xfe\ -\xc6\x43\xd1\xd0\xec\x77\x85\xad\xf3\x3d\xf1\xdf\x6a\x17\x9f\x85\ -\x3e\x39\x38\x19\x98\x7f\x22\x19\x6a\x38\xe8\x53\x78\x37\x09\x51\ -\xce\x84\xa7\xc1\xe3\xf0\x82\x2e\x3e\xfb\x9a\x92\xc0\xa1\xdf\x7c\ -\x2c\xa6\x57\xbe\x1f\x17\xeb\xa5\xe2\x8b\x00\xb3\x77\x57\xce\x74\ -\x3c\xf1\xc4\x13\x4f\x3c\xf1\xc4\x13\x4f\x3c\xf1\xc4\x13\x4f\x3c\ -\xd9\xbe\xb4\x41\x26\xf6\xa8\x7c\xee\x78\xab\x7c\xc2\x6a\x95\x95\ -\x91\x6d\x95\x2f\xc9\xf2\xa5\x97\xb6\xca\xe7\x5f\xda\xfa\xce\xf9\ -\xe1\xb6\xb2\x6f\xdb\xe5\x07\x1d\x85\xeb\x76\xc1\xe7\x0c\xb7\xca\ -\x17\x7d\x6d\xe5\x3e\xb7\x7c\xb1\xaf\xbd\x7c\x41\x39\xbe\x66\xf9\ -\xbc\x72\x8c\xe0\x3b\x57\x96\x2f\x29\xe7\x15\xd3\xfd\x4e\x5b\x19\ -\x7f\x1f\x69\x96\xcf\xad\x28\x0f\xcb\xb2\xa3\xdc\x14\xf4\xb5\xca\ -\x37\xb6\x95\x7f\xb4\x4f\xde\x1f\x65\xa5\x59\x06\x18\xaa\x2c\x9f\ -\x50\xde\xdb\x56\x3e\xbe\x4e\x59\xfc\xff\x1a\xe5\xe5\x3e\x67\x79\ -\x45\xd9\x6a\x96\xcf\x35\xcb\x3e\x51\x96\xdf\x39\xe7\x93\xd0\xa5\ -\xab\xcb\xc3\x12\xc6\x74\x55\xf9\xfc\x08\xb0\x63\x2f\x2f\x5f\xb0\ -\x24\x1c\x2e\xca\xc7\x44\x7b\xda\xfa\xd2\xb9\x1e\xf6\xe1\xad\x97\ -\x81\x43\x7a\x93\xf8\x9c\x50\x5a\x38\xa4\xca\xcd\xdb\x1d\xa5\x9e\ -\x78\xe2\x89\x27\x9e\x78\xe2\x89\x27\x57\x85\xec\x1b\x54\xcc\x2f\ -\x2b\xca\x9e\x37\x68\x87\xef\xfc\x72\x26\xba\xe4\x98\xd6\xd2\xf7\ -\x95\x6d\x60\x3f\x5c\xc3\x32\x14\x53\xcf\x38\x19\x6d\x49\x7c\xe6\ -\x08\x5f\x22\x01\x0e\x66\x7d\x86\x70\x00\x0b\xb1\xbb\x10\x43\xd2\ -\xd3\x7c\xe6\x5e\x8a\x11\x98\x7f\x82\xf1\x20\x67\x1c\xe4\x93\x65\ -\xac\x19\x8a\x85\x02\xee\x61\xd2\x28\x3b\x31\xb5\xea\x44\xc3\x8d\ -\xab\xf1\x5c\xb9\x23\x32\xa9\x2e\x39\x59\x6b\x9e\xf0\x85\xb2\x94\ -\x8b\xc0\xb9\xbf\x69\xca\x6f\x95\x18\x14\x46\xed\x5f\x6b\xfb\x8f\ -\x25\xd4\x45\x27\x8b\x58\x72\x7b\x86\x72\x7a\x11\x6b\x4a\xf1\xd2\ -\xc8\x19\x25\x9c\x93\x9a\x13\xbd\x3a\xe3\x0a\xae\x58\x0e\x07\xde\ -\xf4\x49\xca\x83\x33\x64\x4e\xb3\x1b\xa7\x8c\xdc\x7f\x7d\x9a\x72\ -\xc3\x10\x67\x87\x3c\xf0\xdd\xae\x6b\x37\x64\xdc\x3a\xfd\x1d\xc4\ -\x47\x50\x9e\x1b\x72\xad\xc2\x25\x8e\xff\xa3\x18\xf9\x12\xe5\x3c\ -\x20\x0e\x27\x6e\xd7\xbb\x9c\x93\x36\xfa\x5b\x13\xd6\xfd\x8f\xc7\ -\x8d\x79\xd2\xb3\x7a\x64\xd6\x31\xed\xb7\xff\x97\xee\x3e\x93\x24\ -\x19\xd3\xe7\x08\x33\x90\xe2\x43\xed\x62\x1b\xde\x22\xe3\x9d\x21\ -\x2f\x30\x1a\x99\x9e\xef\x56\x05\xac\x23\x9f\x71\x62\xc0\x81\x13\ -\xe3\x10\xb9\x29\xd1\xc8\xbc\x33\x29\xd6\x9e\x89\x50\x6f\xe6\xdc\ -\x94\x3d\x4f\x79\x75\x14\xff\xd9\xc4\x9b\x64\x4c\x21\xb4\x1f\x39\ -\x8c\xa6\x4d\x78\x30\xdd\xc0\x9b\xec\x8b\x85\x80\x99\x3a\x4f\x58\ -\xc4\xc0\x95\x4b\x88\x71\x18\x15\x73\x71\xdc\x68\x38\xe3\xc6\x22\ -\x9e\xbb\xa7\x0b\xcf\x6d\xca\xa4\x31\x4b\x71\xfc\x14\xbb\x68\xc9\ -\x18\x76\xe4\x42\x88\x0f\x72\x83\x92\x6a\xcd\x99\x88\x94\xbf\xde\ -\xa5\xc7\x5b\xb1\xc0\x59\x6a\x7f\x86\xb0\x98\x2b\x4e\xca\x2e\x33\ -\x4e\x84\x98\x77\xc6\x83\xb5\xed\xe4\xa5\xec\x44\xf6\xc6\x11\x97\ -\x48\x78\x0a\x8c\xf7\xc7\xf8\x27\x1c\x27\x4d\x79\xb1\x3a\xe1\x58\ -\xbe\xab\x5b\x15\x48\x84\x80\x5f\x37\x47\xf8\x3d\xc0\x5a\xa1\x35\ -\xc7\x64\x0c\xc4\x49\xb1\xee\x08\xbb\x74\xba\x5b\xcf\x16\x62\x25\ -\xa8\xfd\x9c\x67\x9a\x97\x58\x5a\x6e\x2e\x0c\xe7\xa8\xd6\x1c\xdd\ -\x7f\xaa\x6b\x63\xd1\xd6\x91\xeb\x36\xcb\xf9\x80\x94\xeb\x27\xf1\ -\xb3\xf4\x92\x13\xd5\x4e\xbb\x6e\xc7\x6e\x49\x1e\xf3\x7f\x46\xaf\ -\x34\x73\x80\x5a\x78\x7d\x65\x99\x5f\x49\x7d\xf0\xa6\x6e\x55\x60\ -\x48\x51\x5e\x95\x0e\xb6\x70\x57\x08\x07\x86\xda\x5f\x75\xc4\x3f\ -\x22\x97\x78\x4b\xe3\x7f\x58\xf9\xf1\x8f\x4f\x1a\x67\x7e\xa8\xf8\ -\x2e\xcf\x3f\xde\x40\xf2\xc8\xf3\x26\x3c\x50\xe4\xaa\x53\xae\x1f\ -\xe7\xf7\x50\xce\xb7\x68\xfb\x94\x59\xfb\xbb\x9d\xb5\x6c\xcb\xd2\ -\x97\x12\x63\x20\xaf\xcf\x72\x2e\x90\xc9\xb9\x98\xc0\x20\x98\xf0\ -\x97\x2e\x8a\x7f\x7f\xd6\x26\xbf\xcf\xa5\xf4\x85\x4b\x39\xac\x63\ -\xb0\xd5\xc4\x7c\x1d\x09\x35\x90\x03\xbc\x95\x18\xd4\x3c\xaf\xff\ -\x1c\xb7\x9d\x97\x78\x72\x05\x69\xff\x61\x5e\x78\x66\xb2\xf2\xa5\ -\x2b\x6f\xe2\xc6\x92\xf4\x37\x28\x06\xbb\x1d\x1f\x2d\xae\x56\x9c\ -\x68\xf0\xb4\xd3\x3f\x1c\xfe\xad\x8d\x7e\x9b\x1e\x5b\x10\x73\x37\ -\x63\xde\xd2\xbe\xc5\xac\x50\x2c\x6c\x3c\x54\xdf\x4a\x9e\x54\x1e\ -\x98\x0d\xc8\x33\xe5\x5c\x7c\xc6\xfb\xca\xdb\x32\x67\x46\xc3\x1e\ -\xa0\xd6\xf5\x7c\xb4\xe8\xd1\xb3\x17\x33\xc0\xd0\xd3\x18\x3f\x2f\ -\x43\xf8\x79\x25\xb1\x06\x94\x2e\x8e\xec\xaf\xfe\xaf\x0d\x7e\x1a\ -\x27\x9c\x02\x8a\x95\x16\xba\xb3\x2b\x12\x17\x8e\xb1\x64\x13\x91\ -\x4d\x73\x55\xf3\x29\x60\x87\x02\x6f\xc4\x74\xf1\x4c\x65\x3e\x30\ -\xed\x7d\xf0\xe9\xfa\x1c\xa4\x1c\x3a\x78\xcb\x52\x06\x73\x00\xc5\ -\xde\x73\xbe\x1b\x72\xc6\x13\x41\x60\xf9\xfc\xc2\xc7\xd6\xfb\xdd\ -\x75\xa1\x5f\x3c\x9d\x35\xe7\x68\xde\x24\x0c\x14\x99\xbb\x42\xeb\ -\x28\xea\x4e\xb8\x32\xea\x3d\x1b\x3c\x3a\x9f\x52\x1b\x4d\xbc\x2e\ -\xce\xf5\x95\xd8\x68\x84\xdf\x23\xec\x7f\xab\x84\xdc\xbe\x6e\xc6\ -\x2c\x43\x12\x99\xc0\x3c\xe5\x3c\xd3\xbb\x40\x3e\xbb\x36\x2d\xc6\ -\x40\xd9\x19\x1a\x7c\xef\x03\xeb\xfd\x28\x2b\x6c\x46\xc6\x21\x01\ -\x6e\x59\x85\xed\x56\x6b\x9a\xf2\x5a\xd3\x06\xb7\x3f\x49\xb8\x6e\ -\xeb\xd6\x3f\x9f\x12\x36\x77\xde\xaa\xb7\x72\xf8\x30\xee\x91\x33\ -\x46\xb6\xbf\xb0\x43\x9f\xfb\xc1\xff\xd9\x9d\x26\xaf\x94\x0c\x70\ -\x6c\x81\x21\x49\xb8\x25\x3c\x07\x24\x0c\xe4\x37\xdd\x88\xf7\x3f\ -\xba\xc6\x4f\x9e\x93\xd5\xb8\xee\x78\xf7\x8c\xa5\xca\x39\x5d\x94\ -\x53\x81\xb6\x1b\x8c\x31\x91\x4c\x34\xd6\xc3\x53\xcd\x03\x13\x08\ -\x98\x68\x2e\x8e\x0e\xe5\xf4\xd8\x9c\xef\x5d\xb0\x1a\x5b\xc9\x29\ -\xef\x88\x64\xfd\xf3\x4f\x66\x29\x67\xb9\x4e\x79\xdc\xb0\x83\xe2\ -\xa2\xee\xd8\x7b\x0f\xf4\xef\x7f\xf7\xea\xef\x4f\x4c\xdc\xfd\x47\ -\xe0\x61\x28\x58\x2e\x56\x98\xcc\x67\x13\xef\x9f\x30\xb5\xf4\x12\ -\xcd\x01\xd4\x87\x39\xbf\x39\xb9\xc6\x63\x47\xc1\x03\x02\x4c\x0e\ -\xc2\x30\x93\x78\x63\x8c\x47\x50\x21\x1f\x90\x31\xf6\x6f\xee\xee\ -\x7e\xeb\x91\x0f\x28\xda\x21\xe6\x80\x82\xd1\x60\xfc\x35\x93\xf1\ -\xd7\x62\x62\x0e\x0e\xeb\x67\x17\x56\x7f\x1f\xeb\xe5\x94\xdd\x70\ -\xae\xb7\x6b\x8c\x2d\x26\xf1\x0c\x28\x2f\x14\xb8\x0a\x5a\xb9\x89\ -\x7d\x80\xb1\x1c\x89\x97\x2e\xcb\xd1\xed\x57\x94\x0f\x10\xa6\x04\ -\x61\x94\xd5\x24\x6e\x04\xe7\xe2\x32\x9e\x18\xea\x70\xf7\x85\x5e\ -\xb4\x7f\xd0\x17\xfc\x38\xf2\x3a\xf2\x46\x83\xfa\x23\xe6\x00\xea\ -\x03\x7a\xd1\x99\xb4\xeb\xab\xd7\x80\x91\x9c\xb9\x20\x71\xe7\x38\ -\xff\xd6\xc5\x72\x28\x88\xf7\x4f\xb9\x58\x84\x6f\x53\x66\xcc\x65\ -\xa3\x2c\x7d\x18\x7b\x6e\x5a\x75\x9f\x9f\x4b\x85\x1a\xfc\xfe\x25\ -\x26\x68\x4e\xe2\x15\xa6\x25\x3e\xe0\xf0\xde\xe1\xd9\x5e\xb4\x5f\ -\xc8\xaf\xa4\x82\xc0\x6a\x06\x7e\x62\x8d\xb0\x3c\x69\x2d\x07\x46\ -\xa5\x39\xbd\xc2\xfe\xde\xd3\x3f\xf4\xee\x9c\x2e\xda\x6f\xd6\x24\ -\x2e\x58\x99\xf2\xa6\xaf\x17\xd7\xa0\xf5\x8e\x46\x41\xcc\xa1\xc8\ -\xad\xce\x10\x2e\x18\xe3\x12\xc6\x0d\x60\x5e\xd1\x5c\xd8\x9e\xb7\ -\xf4\x3a\xf4\xff\x02\x30\xcf\x75\xbe\x0f\xd9\x3d\x16\xe3\x71\x24\ -\xf9\xfb\xf7\xf6\xa8\xfd\x4a\x24\x58\xfa\x97\x0c\x61\xbf\x54\x9a\ -\x38\xa8\x09\x63\x5a\xbc\x3f\xcc\x83\x83\x4d\x3e\x1e\xcc\xe9\x69\ -\x83\xd7\xec\x5c\x18\xd8\x4d\x8c\x15\x96\x09\x9e\x84\xcf\x5e\x31\ -\x47\x7f\xe7\xaf\x52\xa1\x0a\xe5\x8d\x32\x2e\x27\xb0\xdf\x8a\xa2\ -\x2f\x95\x9c\xeb\xae\xbb\xf9\xc3\xee\x7d\x06\x94\x81\x5b\x63\x1a\ -\xfb\x3c\xdd\xfc\x61\x6a\xbb\xf8\xe0\x99\xc0\xc0\x52\x7a\x9b\x17\ -\x72\x20\xe1\x07\x4e\x0e\xb0\x96\x30\x6f\x01\xdb\xab\x4c\xb6\xe0\ -\xa4\xd1\x1a\x03\x71\x6d\x9e\xf0\x71\x78\x9c\x96\x24\xcf\x0a\xcd\ -\xd5\x96\xfb\x9d\xc9\xe0\xe2\x53\xd9\x50\x9d\x31\x99\x80\xfb\x4b\ -\x18\xa7\x62\x4f\xd9\xe6\x57\x11\x1d\xe1\x56\x17\x13\x97\xd7\x5d\ -\xc6\xac\x22\x3c\x26\x60\xef\x84\xe6\x7b\xdd\xfe\x57\x16\xb4\x25\ -\x27\xa5\xca\x1c\x56\xb2\xc1\x18\x7f\x34\xa9\x9e\x74\xeb\xfd\x5a\ -\x61\xef\x93\xcd\xd2\xe2\xde\xa9\x52\xee\x99\xb2\x12\x57\xf2\x8d\ -\x94\x53\xa7\x31\x86\xa0\x8b\xa7\x8c\x3e\x1d\x3a\x70\xdb\xb2\xfc\ -\x8e\x78\xff\xf3\xb4\x6f\x60\x4e\x04\xce\x6f\xcd\x86\x2b\x84\xf7\ -\x06\xac\x3c\xf1\x9d\x1f\xeb\x61\xfb\xf7\x0e\xf9\x3e\xf9\xd9\x38\ -\x7c\xae\xaa\xcc\xe5\xa5\xdc\x7e\x51\x6f\xab\x42\xf3\xb7\x1d\xb9\ -\xeb\xa1\x34\x61\x4f\xb1\xad\xcb\x7b\xe6\x86\x68\xff\xfc\xea\x3d\ -\xfa\x10\xf0\xda\x08\xdb\x4d\xab\xc8\x3e\xc0\x38\x68\x72\x6f\x00\ -\x5d\xbd\x08\x98\xae\x84\x55\x64\x31\xd6\x0c\xdb\x7e\x15\xe2\x32\ -\x02\x26\x91\x78\xfb\xff\xbe\x87\xed\x17\x1b\x96\x2f\xfe\x71\x9c\ -\xf2\xfa\xaa\x4d\x8c\xc4\xb4\xc9\x98\x50\xf8\xf7\xbc\x7a\xe6\x22\ -\xea\xe5\xb6\x9f\x31\x69\x66\x9c\x6c\xb4\xfe\xe9\x35\x6e\xf7\x4b\ -\x84\x07\x49\x39\x95\x35\xd1\xaf\x2a\x84\x91\x00\x2c\xc8\xdc\x64\ -\x55\xec\x0d\x0e\xbd\x07\xf9\x83\xe0\x72\xe2\x3d\x50\x59\xf2\xce\ -\x70\xfb\xe1\xfb\x57\xfa\x07\x8e\xf7\xb2\xfd\xc3\xca\xe7\x9f\x4c\ -\x87\xd8\xef\x44\xed\xb7\x18\x23\x2c\x47\x73\xa0\xb2\x67\x0a\x73\ -\xb5\x29\x73\x8d\x81\x7d\x83\xbd\x8f\xba\x3e\x26\xc6\xb8\xba\xf0\ -\xcf\xc0\xb3\xc9\xaa\x9c\x83\x0c\x0c\xe7\xb4\xcc\x49\x4e\x86\x4b\ -\xdf\xc9\xda\x8c\x87\x4d\xeb\xa8\xe1\xe2\x3d\x57\xe8\x6f\x69\xc6\ -\x92\x78\x59\x2f\xdb\x3f\x72\xe0\xe7\x3f\x97\x1a\x63\xbe\x02\xc2\ -\x17\xa3\xbd\x58\x91\x70\x52\x86\x95\xe1\xb7\xc0\x3e\x2a\x98\x15\ -\x89\xd1\xc8\xd8\x47\x12\x77\x6d\x3d\xb9\x81\xf1\x6a\x66\x58\x07\ -\x34\x17\x30\x36\x36\xcd\x9b\xb4\xe7\x87\x9f\x43\xda\x50\xb0\x9f\ -\x08\x0f\xa9\x42\x7e\x71\xc5\xd7\xdb\xf6\x2b\xe0\xa8\x1b\x13\x7d\ -\x12\xd8\x1f\xd2\x1f\x96\x35\x25\x86\x8e\x75\xf2\x49\xc2\x35\xb5\ -\x39\x17\x9f\xec\x3b\xf4\xed\xe8\xdc\xd2\x46\x37\x14\x7d\xe0\x5f\ -\x72\xc0\x93\x82\x3d\xa0\xb9\xe3\x86\xd7\x0d\x9c\xf3\xe0\x9d\x13\ -\x1e\x8d\xc1\x98\xdf\xee\x1c\xb0\x1b\xef\x1f\x92\xf4\xc3\x17\x32\ -\xc3\xf8\x5f\x84\x8b\x3c\x2d\xf1\x83\xf8\x5c\x02\xf3\x14\x9f\xd5\ -\xd5\x69\xcf\xa8\x6c\xc2\xb3\x00\xbc\x19\xe4\xe8\x17\x54\x17\xf7\ -\x8a\xed\x05\x17\x2b\x04\x58\x33\x84\xc9\x63\xca\xfe\xef\xe2\x67\ -\x6b\xbb\xd3\xfe\x54\x50\xac\x5b\x58\xbb\x81\x77\x6f\xb2\x4f\x8e\ -\x70\xad\x2c\x97\xeb\xa0\x24\x71\xd1\x1a\xc0\x95\xdb\x12\x5e\xc7\ -\x84\x56\x7f\x34\x47\x58\x20\x8c\x39\xcc\x98\x3e\xc0\xa4\x63\x0c\ -\x10\xc2\xb4\x22\x3b\xb2\x85\x59\x90\x66\x9e\xb6\xb7\x76\xb9\xb9\ -\x97\x49\xc6\x3f\xe7\xe4\xd4\x46\xd3\xc6\x71\x39\xe4\xb2\x12\x5f\ -\x8a\xdf\x0f\xe3\x51\x8a\xaf\xff\xc8\x16\x6f\x9b\x48\x0b\x9d\x66\ -\x43\x65\xe6\xaf\x31\xa5\x0e\x0c\xc6\x1c\x62\xdc\xa1\x32\xe1\xce\ -\x31\x96\x2e\xd6\x89\x86\x13\xb1\x6f\x2f\x77\xb3\xad\x6b\xc9\xa4\ -\x7f\xd1\x61\xbc\x7b\xc6\xce\xa1\x35\x49\xe2\x46\xd1\xfb\x37\xd9\ -\x9e\x89\x1e\xdd\xde\xb9\x7c\x38\xf8\x99\x0b\xd9\x50\x8d\xde\x3f\ -\x30\xbb\x18\x6f\xa9\x24\x31\xa9\x4a\xb2\xfd\x65\x89\x97\x53\x25\ -\x5e\x85\xb8\x51\xfd\x46\xb7\xda\xb9\x9e\xf8\x14\xe5\xe5\x31\xf8\ -\x44\x75\x17\x07\xd3\xc5\x1a\x29\xca\xfd\x39\xe3\x9b\x88\xfd\xdf\ -\x76\xf1\x4d\xae\x4f\xa9\xb5\x26\xf6\x5d\x13\x0f\xc7\x68\xb5\x9f\ -\xf0\x70\x70\xee\x0d\xbc\x20\x9c\x41\x4d\xbc\xf9\x74\x57\x1a\xb9\ -\xb1\xf8\xd2\x62\x2f\x98\x57\xeb\x12\xcb\xba\xd4\xea\x03\x98\xf7\ -\xc0\x0f\xc2\x73\xd3\x8d\xdb\xbd\x71\x38\x34\xf3\x3d\xe0\xb9\xe4\ -\xf4\x16\xa6\x14\xdd\xdb\xc5\xdd\x6a\xe2\x25\x31\xde\x96\xd2\x19\ -\x8c\x94\x6d\x4b\xca\xbf\xe4\xe4\xc5\x78\x2d\xd0\x5e\xbe\xd8\xc2\ -\xf3\xb3\x18\x17\x29\x15\x20\x9c\xea\x9d\xc8\x7e\x9c\x69\x16\x24\ -\xee\x58\xd6\x68\xc7\x8a\x9a\x96\x7c\x05\x15\xf2\x1f\x66\xf5\xdd\ -\x8b\x7b\x19\xd9\xf7\x82\x3f\x2c\x88\x3d\xcd\x14\xec\x00\xcc\xd9\ -\xe4\x17\x66\x4c\x31\xbc\xfb\x31\xff\x5b\xe7\x76\x7a\xef\xa8\xd8\ -\x63\xe5\x55\xb9\xe7\x35\x24\x26\xa6\xe5\x72\x1b\x48\x3c\x1f\xc2\ -\xab\xa9\xfe\x63\x27\xdb\xb4\x4d\x19\x83\x4f\x7c\x0a\xfe\x10\xec\ -\x4f\x09\xef\xba\x4e\x36\x89\xa8\xfb\x4e\xdf\x3d\x89\x30\x16\x9e\ -\x95\x21\xbf\x8f\x8b\xbd\xc5\xf8\x5b\xf0\x7b\xc2\xde\xcc\x85\xab\ -\x74\xa6\xb0\x7f\xe4\x86\x0f\x74\xaa\x31\x3b\x91\x98\x7a\x16\x78\ -\x2a\x62\x1d\x60\x5c\x9e\x24\xe1\x2b\xd3\x9a\xfc\xca\x2b\xbc\xf5\ -\x18\xb8\x04\x32\xc1\x3a\xd9\x99\x7c\xfe\x5b\xa3\x7e\x4f\xe3\x8b\ -\xfa\x19\x9e\x73\xf8\x37\x3b\xd1\x8e\x9d\x8a\xd8\xd0\xbc\x3d\x11\ -\x04\x56\x63\x83\x38\x1b\x81\xbd\x23\x6c\xf3\x8e\xf4\x49\xf3\xc8\ -\xe9\x07\xc1\xb9\x84\xbd\x53\x96\x78\x5d\xea\xbc\xe7\x22\x9e\xec\ -\xaa\x13\x83\xbf\x20\xfe\xbb\x67\x3a\xf1\xac\x2b\x11\x6b\xec\x8c\ -\x93\x08\xcc\x3b\xc0\xcc\x2d\x18\x35\x60\xe5\x75\x0c\x77\x28\x72\ -\xf4\xcd\x0d\x3a\x77\x44\xdc\x67\x08\x9f\x59\xe2\xef\x05\xc7\x68\ -\x52\xd8\x09\x91\xc8\x5d\x3b\x9e\x63\x3a\x2c\xd6\x1e\x45\x79\x9e\ -\xb2\x09\x7f\xd1\x15\xc8\x1e\x3b\x34\xf3\xd7\x49\xd1\x1f\x62\xe0\ -\x78\x36\x2a\xc0\xca\x79\x66\x97\x9e\x75\xb5\xcb\x46\x5c\x53\x9e\ -\x78\xe2\x89\x27\x9e\x78\xe2\x89\x27\x9e\x78\x72\x99\x38\x9d\x90\ -\xf3\x16\x5f\xcf\x0d\xaf\x7d\x5d\x5e\xe3\xfa\xf8\x31\xbe\x9e\x3b\ -\x46\xd0\x0c\xce\xf2\x08\x7f\x1f\x57\xfa\xfb\x65\xd7\x0b\xfc\x9d\ -\x91\x73\xc7\x70\x3d\x3f\x72\xce\xe2\xeb\xb2\x85\x7f\x17\xd7\x11\ -\x79\x1d\xc6\xdf\x2f\x0c\x9f\x70\xaf\xbe\x95\x57\xa5\x4f\x5e\x15\ -\x5c\x2f\xfa\xfa\xdc\xeb\x09\xba\xf6\xf7\x9d\xb8\x89\xae\xbe\x13\ -\x8a\xb8\x5e\xea\xf7\x2d\xd3\x55\xf1\x9d\xe3\xeb\xb0\x7b\x3d\x8f\ -\xab\xd3\xbc\x8e\x5c\x58\x79\xb5\x2e\xae\xba\x5e\xa2\xeb\x89\x63\ -\x97\x14\x8b\xae\x0e\x5f\x8f\xf3\x75\xd9\xbd\x12\x3c\x09\xe1\x4a\ -\x2c\xe3\xfa\xb8\x68\xd3\x31\xd6\xdb\xa5\x8e\xbc\xad\x15\x82\x60\ -\x49\x90\xa4\xdd\xa6\xb4\x70\x22\x4e\x4c\xae\xd7\x5b\x3c\xf1\xc4\ -\x13\x4f\x9e\x9e\x32\xa4\x28\x2f\x4d\xd9\x9f\xfe\x9b\x4c\xf2\xbe\ -\xbf\x9a\x54\xe7\x9d\x67\x8d\x7f\x72\x57\xb8\x01\x77\x28\x05\xc4\ -\xdf\x83\x33\x11\x67\xa5\x38\x2f\x43\x2c\x56\x8c\x38\x26\x0f\xf7\ -\x22\x7f\xf1\x8a\x24\x3e\xb6\x74\x21\x63\xce\x31\x2f\x1a\xc5\xda\ -\x30\x67\x76\x12\xb9\x03\x56\x75\xb7\x79\x9c\x36\x95\x78\x70\x91\ -\xce\xc2\xb2\x16\xc7\xcc\xe3\x2c\x8f\xe2\x85\x10\xef\x69\xcf\xff\ -\xfd\x6e\xd7\x6f\x33\x89\x23\xce\x41\xaf\x49\xae\x25\x9c\xc1\x4f\ -\x4b\x4e\xaa\x9a\xa3\x9b\x1f\xb9\x2c\xe6\x79\x27\x32\xa0\x28\x2f\ -\x98\x08\x2f\xd0\x39\x9e\x7d\xe4\x4c\x47\xcf\xf3\xe2\xc4\x85\x5a\ -\xa3\x78\x0c\xe6\xb5\x61\x1e\x5d\xc4\xeb\x29\xfd\xca\xdb\x36\xbf\ -\xc3\xc6\x92\x18\xbb\xef\x89\x44\x68\x91\x38\x57\x13\x66\x5d\x8c\ -\xab\x19\xc7\x52\x17\xbe\xd3\x89\xba\x43\x62\xe3\xb3\x8f\xf0\xd9\ -\x0f\xf3\xbe\x4f\xc9\xdc\x07\xc4\xbd\xd9\xcf\x98\xbe\xa2\x33\x36\ -\x48\xd4\x2f\xea\xae\xce\x39\x69\xb3\x4e\xb1\xd4\xc0\x5a\x8f\x72\ -\xec\xe1\x4b\x3b\x50\x7d\x25\xad\xcd\x11\xcf\x1f\xc7\x2d\xf2\x39\ -\x2e\xc5\xcd\x0b\x3d\x3d\xf3\xfa\xc5\x7f\xb8\xd2\xfb\x27\xfc\x4b\ -\x8f\x66\xd4\x39\x99\x57\x55\xa2\x38\xf2\xa8\x5a\x76\x26\x42\xb5\ -\x6f\x77\xa2\xfe\x93\x81\x06\x9d\xbb\xf1\xd9\xbe\xcc\xb9\x06\x3f\ -\xb1\x56\x73\x22\x47\xdf\xfb\x67\x57\x7a\xff\x7d\xca\xfe\x3f\xa3\ -\x38\x1a\x8a\xa5\x2d\x13\x1f\x77\x82\xb1\x0c\x5e\xb5\xe9\x8f\xb7\ -\x20\x38\x2f\xa1\xdc\x49\x99\x37\x48\x39\xd3\x46\xc5\x8d\x1b\xe8\ -\x88\x24\xe4\x1c\x91\x93\x3c\x60\x29\x8e\x49\x5f\x97\xdf\x2a\x3a\ -\x31\xf3\xf5\x84\x58\x47\x31\x56\xc4\xea\xba\x56\xce\x47\x5b\xfd\ -\x17\x29\x0e\x84\xe3\xe9\x4a\x92\x67\x11\x71\x95\x73\x1d\xab\x7f\ -\x06\xf9\x75\x3a\xc7\x71\x71\x4e\x4b\xc9\x51\x8f\x96\xff\x74\xad\ -\xef\xea\xda\xc9\x6f\x67\x65\x2e\x5f\x8a\xf2\xf8\xea\x8e\x7a\xf0\ -\x35\xeb\xc6\xf6\xa1\x9d\x88\x61\xc8\xdb\xcc\xc9\x03\xfd\xbb\xf9\ -\x7f\x9d\xaa\x7f\x6a\x0c\xbc\x24\x9c\x9b\x8a\x31\x10\x0d\x15\x9d\ -\x91\xc0\x5d\xdf\x5f\xeb\xbb\x49\x7d\x81\x73\xa9\xc3\x1c\xb7\x99\ -\x22\xec\x08\x7a\x5f\xfb\xd6\xfc\x3e\xfa\x8f\x21\xf3\x8e\xc2\x7c\ -\xf6\x4e\x3c\x66\x66\xb1\x63\xf5\xd7\x23\xef\x3a\x9b\x0b\x71\x8e\ -\x5b\x06\x5c\xeb\x42\xff\xfb\x07\x0e\xde\xb2\xc6\x57\xf7\x22\x07\ -\x9d\x73\xe9\x18\x03\x03\x7d\x01\x39\x44\xc0\x25\x58\xbb\xfe\x73\ -\x14\xa3\x46\xf9\x27\x36\xc7\xcd\x22\x4e\xc1\xb4\xca\xe7\x3b\x55\ -\x7f\x21\x21\x70\x9e\x50\x5e\x98\xc5\xdc\xe5\xfb\x94\xe7\xbe\x68\ -\xf5\x97\x26\xac\xc6\x43\x05\x73\xa6\xc9\xb3\x36\x45\x31\x83\x9c\ -\xc3\x9c\x60\xde\x98\xf7\xae\xfe\x0d\xfa\x0f\xf1\xd7\x59\x32\xee\ -\x13\xb1\x1f\x06\xbd\x2f\xb3\x83\xf5\x57\xd2\x41\xe6\x03\xc6\xdc\ -\x96\x12\x63\x60\x92\x79\xa2\x7e\xb4\xfd\x3b\xc0\x1e\xa2\x5c\x2e\ -\x51\x87\xeb\xc3\x9c\x87\xeb\xc6\x78\x27\x10\xff\xce\xfc\xaf\x2b\ -\x24\x8e\x9c\x51\xbd\x26\x73\xd7\x98\xcf\x12\xed\x8d\x85\x3b\x8a\ -\xd7\x32\x98\x09\xcc\x11\xff\x37\xc5\x85\x89\x67\x20\x37\xbf\x5f\ -\xd9\xdb\xbe\xbe\x8f\xe4\xcd\x39\xce\x9f\xb2\x99\x47\x0c\x79\x58\ -\x79\xe6\x93\xa5\x58\xaa\x84\x36\xed\x84\x0e\xdf\x56\x6a\xbf\x71\ -\x92\xf2\x9d\x38\x87\xa9\x20\xe3\xae\x29\xde\x5d\xed\x2c\x87\x71\ -\x4e\x3d\x43\xf9\xd5\xc4\xd7\x28\x73\x8a\xa2\x99\xf2\x83\xee\xbf\ -\x5b\xb1\xdf\xf8\x4c\xc1\x9a\xa5\x38\x68\x5e\x4b\x2b\x4e\xe0\xd0\ -\x2f\x9f\x9d\xd2\x99\x13\x9e\xe6\x74\xf1\x89\xf3\xda\xd1\xcc\x47\ -\x47\xfd\x73\xc0\x88\xa2\xdc\x81\x32\xe5\xcd\xa4\xf8\xdd\xbe\xb3\ -\x93\xf5\x17\xa2\x53\x3e\x8a\x5a\xa4\x18\xe0\xa4\x58\x27\xa3\x81\ -\x52\xf3\x1d\xa7\x90\x33\x46\xb9\x20\x45\xc2\x30\x49\xcb\x5c\x01\ -\x55\xff\xc4\x57\x33\x32\xce\x09\x31\xe4\xc0\x95\xb0\x8d\xe2\x43\ -\xee\xef\xc0\x4d\xce\x39\xf7\x45\xe2\xd5\xcd\x08\xfb\x2d\xc5\xf3\ -\x55\xc7\xf1\xae\xb2\xc6\x1c\xe5\xb5\x70\x3e\x56\x93\x4b\x0e\x32\ -\x08\x1b\x89\xea\x11\x96\xf9\x7a\xf6\x7c\x73\xfe\x48\x23\xc7\xd3\ -\xe0\xfc\x1c\xe4\x6e\xc8\x1c\x2e\xc2\x25\x8b\xc1\xb6\x32\x38\x7e\ -\x87\xe2\xa1\xed\x8a\x9b\xeb\xd8\x71\x7e\x4c\xf3\x48\xed\xc9\xb4\ -\x55\x6f\x72\xa2\xb7\xea\xbf\xef\x0d\x19\xca\x21\xad\x52\xce\x5a\ -\x96\xe2\x86\x8c\xf7\x35\x7f\x67\xbc\xe7\x4b\x79\x6d\x8e\x72\xdb\ -\x29\x27\x19\x1c\x95\xd6\x0c\xf2\xfa\xc5\xfc\x33\x4b\xfb\x17\xce\ -\x3f\x10\xe3\xd7\xe6\xbc\x9f\xa1\xa1\xc0\x1d\x9d\xae\xff\xb0\xb2\ -\xf4\x58\xc6\xaa\x53\xec\x7f\x46\xc6\xb7\x8f\x1f\xfd\xd0\x83\x05\ -\xe4\x3f\x52\x0e\x31\xec\x00\xb4\xef\x72\xdc\x19\xea\xe7\x2a\xe7\ -\x23\x30\x27\x39\xf5\xbd\x97\xa5\x29\xff\xae\x4e\xfd\xdf\xe5\x21\ -\x87\x5e\xcc\xb1\xe2\x57\x3b\x5d\xff\xa1\xa1\xc4\x1d\x69\x60\x35\ -\x50\x3e\x67\x89\xc6\x41\x5a\x3d\xf9\x08\xf2\x05\x0b\x2e\x07\x3b\ -\xb0\x8a\xb4\xfa\x23\xab\x7f\x2b\x16\xdf\x17\xe7\xc0\x83\x87\xd8\ -\x41\x8a\x6b\x2e\xd3\x18\x61\xde\xde\x0a\xe5\x53\x90\xfe\x91\x2b\ -\x27\xe6\xe0\x50\xe0\x8e\x3b\x3b\x5d\x7f\x21\x63\x89\x80\xe8\x27\ -\xa4\xeb\x12\xcd\x15\x69\x6d\xfa\x42\xce\x62\xfe\x5d\xce\x79\xaf\ -\x39\xa3\xc1\x9f\x5e\x13\xef\x00\x63\x27\x4f\xef\x40\x7e\x97\x70\ -\x22\x8a\x6c\x3b\xe8\x45\xb9\x77\x29\x53\x5c\xb4\x1e\xea\x4a\xfd\ -\x95\x14\xea\x6f\xce\xc8\x38\xb9\x22\xad\x67\x39\x8b\xeb\x40\xfd\ -\x4a\x5f\x1f\xb3\x68\xc8\x27\xfa\x4b\xa0\x42\x3c\x8a\x9c\x7f\xc0\ -\xf6\x1a\xe5\x5d\xe0\x23\xe3\x2e\xf1\x7e\xb4\xd0\xfb\xba\x53\xff\ -\x20\xc7\x54\x13\xd6\x43\xd8\xad\xc3\xb4\x8c\x2d\xc5\xfe\xb2\xba\ -\x5e\x9e\x38\x49\x1c\xfc\x6e\x6d\x71\xa3\x39\x7d\x9a\x63\x46\x0d\ -\x8e\x9d\x66\xec\x85\x9a\x13\x0e\x97\x3a\xb6\x47\x5d\xf1\xfc\x20\ -\x78\xad\xeb\xf4\xfc\xa9\xb0\xcb\xa9\x3c\x2d\xb1\x2a\xc8\x46\xd3\ -\x37\xfa\xfd\xa0\xa2\xdc\x98\x09\x56\x88\xf3\xd9\xe5\xac\xe6\xdc\ -\x17\x8e\xfb\xe7\xfa\x57\x85\x7d\x52\xea\xa8\x9f\xc0\x95\x7d\x23\ -\x2f\xbc\x87\xe2\x4e\x65\xec\xb9\x8b\x33\xc4\x3c\x7f\x5b\xb3\xd9\ -\x27\x31\x17\x69\x2e\x67\xb2\x1b\xb7\x5e\x5c\xa1\xff\x6c\x64\xfa\ -\x8a\xf7\xbe\xeb\x09\x62\x31\xb3\x1a\x73\x42\xe7\x0c\xce\x45\x00\ -\x6e\xa2\xd0\xe7\x9f\x6c\xe5\xf7\x03\x8a\x72\x73\x56\xc6\xdd\x72\ -\x2e\x43\x8b\x4b\xd4\xe5\x75\x15\x5f\x0b\x76\xab\xfe\x39\xd1\x87\ -\x0b\x32\xaf\x22\x47\xbc\xf6\x55\xc2\x5e\x52\xb6\x81\xb3\x95\x15\ -\xb6\x94\xcb\x8b\x5d\x70\xf9\x50\x25\x66\x48\x86\xed\x87\x6e\xc5\ -\x29\x2a\x89\xf0\x27\xbe\x0e\x4e\xd3\xac\xce\xf1\xd0\xf0\xd5\x14\ -\xc2\xa7\x36\x1c\xb7\xab\x65\xa0\x3f\x7d\x1c\xeb\x46\xd6\xc5\x3d\ -\xc2\x38\x02\x76\x0a\xe5\x7c\x56\xbb\xd2\xf7\xdb\xc4\x97\x12\xf6\ -\x34\xf8\xb3\x93\x14\x7b\xba\xf6\xde\x6a\x13\x51\xe1\x73\xce\xe9\ -\x9c\x27\x47\xd8\x2f\xd4\x0f\xc5\x1c\x16\xea\x7e\xcc\xbe\x39\xf6\ -\xe9\xa7\x92\x14\x97\x4c\x7e\x82\xf4\x4e\xee\x31\x3c\xa0\xdc\x92\ -\xa1\xd8\x6e\x61\x03\x69\xcc\x2f\x9a\x14\x6d\x49\x86\xae\x3d\xac\ -\xc9\x49\xf5\xb3\x97\x80\x23\x13\xb7\x3f\xd8\x2b\xac\x04\x4f\x3c\ -\xf1\xc4\x13\x4f\xae\x61\xe1\x68\xa1\xed\x5d\xef\x90\x57\x65\xa3\ -\xeb\x7f\x93\x57\x9f\xbc\xf6\x5d\x7e\xed\xc3\xf5\xf6\x0b\xc7\xf9\ -\x7a\xfe\x98\xbc\x5a\x7c\x3d\xe7\x5e\x47\xe8\xba\x2c\xaf\x27\x96\ -\x87\xf9\xbf\x97\x7d\x7c\xfd\x7d\xbe\x9e\xbb\xfd\xf6\x95\x57\xdf\ -\xf2\xaa\xeb\x39\xba\x9e\x1f\x76\xaf\xe7\x57\x5e\x47\x2e\xd0\xf5\ -\x42\xf3\x7a\x91\xaf\x16\x38\x9a\xc4\xf5\x18\x5f\x2f\x1e\xbb\xe4\ -\x93\xed\x7c\x60\x9b\x7a\x5b\xeb\x8a\x38\x2d\x5b\x61\x70\xcb\x66\ -\x9c\xd6\xa1\x5d\xeb\x0e\x9e\x3c\xcd\x24\x17\x59\xfc\xa7\x94\xb5\ -\xe4\x24\x34\xd8\xd1\xbe\xd7\xf4\xf2\xd9\x62\x1f\xfa\x4e\xf0\x1b\ -\xc0\xdf\xc5\x31\x1f\x35\x67\x78\x7f\xa8\x2b\x7e\x97\xb5\x24\x11\ -\x5c\x22\x7f\x7c\x56\xe2\x6d\x22\x6e\x46\xd9\x1a\x66\x69\xbb\x0c\ -\x28\xfd\xfb\xdf\x3a\x72\xe4\x73\x4f\x6d\xf7\xf9\x71\x6d\xf1\x87\ -\x74\xf6\x69\xba\xe7\xe6\xdb\xdb\xf7\x0d\x8e\xbe\x6e\x1a\xbc\x09\ -\xe0\x8a\x98\x50\x69\xcf\x72\x70\x7b\x35\xd8\xfb\x0e\xf8\xd1\xa6\ -\x22\xbc\x7f\x4e\xb1\xcf\xfe\x1d\x5b\xfd\xf5\x81\xa3\xaf\xff\x7c\ -\x06\x71\x47\x74\x1e\x53\x71\xc6\x8d\xed\x61\xd4\xdb\xfa\x5d\x0f\ -\x73\xec\x03\xfc\x18\xd3\x8c\xf5\xb3\x4d\xc9\x01\x87\x09\xf1\x06\ -\x7a\xc9\x09\x87\x4e\xad\x87\x93\xaa\xad\xf5\xc7\x09\x75\xf6\x31\ -\xc2\xad\x24\xbf\x5f\x71\x47\xcf\x4f\x85\xf8\xdc\x00\x58\x55\x91\ -\xd0\xbd\xab\x7f\xbf\x1f\x38\x49\xc0\xcf\x9a\x5c\xe3\xec\x2c\xa6\ -\xce\xf1\xf3\xc3\xec\x07\xc9\x19\xdb\xdf\x87\xa7\x02\xf3\xe4\xd7\ -\x87\x1f\x56\x3c\xee\xd6\xf6\x7f\x4b\xab\x4b\x4f\xe5\xe8\x3c\x8f\ -\xe3\x49\x9e\x7d\x7d\x79\x45\x3c\x43\x42\x9d\x79\x0c\xe7\x5d\x53\ -\x61\x3e\xf7\x4a\xe8\xdb\xf7\xb9\x4d\x04\x1a\x4f\xc0\x97\x04\x7f\ -\xaa\x31\x76\x72\x05\x4e\x2f\xda\x3e\x45\xe7\xb2\xd3\x84\x27\x29\ -\xcf\x40\xdb\x9e\x3f\xfb\x18\xce\x2c\xe0\x3f\xc3\xb9\xf3\xc8\xa1\ -\x5f\x68\x6c\xf7\xf9\x42\x74\xf8\xd5\x11\x37\x16\xd3\x56\xdc\x3f\ -\xc4\xb8\x94\xec\x9b\x83\xbf\x11\x67\x3e\x09\xab\x35\xc6\x92\xfa\ -\xcc\x13\xd0\x1d\xb0\x27\x32\x68\xbf\xb1\xb3\x7d\x7f\x5e\x9f\xe3\ -\x73\x09\xbd\x85\x11\x98\x0b\xcc\x3f\x09\x3c\xc3\x02\xe3\x19\x5f\ -\xc8\x03\xf3\x49\x2b\x11\xfe\x9d\x22\xfd\x15\xc0\x4c\xa2\xb3\x47\ -\xe4\xba\x8b\x7a\xde\x60\xee\xcc\xe7\x19\xa5\x36\xe0\x4c\xe4\xb4\ -\x33\x11\x28\x53\xcc\x50\xce\x9c\x61\x2c\x5a\x9b\xeb\x64\xea\x9f\ -\xf8\x2a\xbe\x93\x31\xa6\x09\xcb\x8e\xda\xaf\xcd\xfe\x80\xce\x8c\ -\x74\xc6\x1a\x54\xfa\xfd\x6f\xde\xc9\xf3\x8f\x5c\x57\x23\xdf\x2f\ -\xe1\xa4\x31\x26\x86\x82\x1c\x6e\xc6\xef\x69\xf5\xe9\x6c\x60\x86\ -\xcf\xd0\xe8\xfc\xcc\xf7\x92\x9c\x3a\xf3\x83\xac\xc1\xd8\xa9\x38\ -\xcf\xb1\xd5\xe2\xc3\x3b\x79\xfe\xbe\x7e\xe5\x0d\x38\xd7\xc2\x99\ -\x0a\xce\xdf\xf6\x1e\x7a\xe5\x87\x70\xce\x42\xd8\x54\xc1\xc6\x13\ -\xee\xf7\x26\x26\x4f\x3d\x90\x53\x19\x7b\x2a\x63\xf2\x99\x30\xce\ -\x9b\x70\x56\x0c\x1c\xaf\x94\x75\x7a\xc7\x7e\x9f\x34\xfc\x48\x38\ -\x0f\xd1\xd9\x17\xce\xf8\xaf\x97\xcf\xe7\xc0\x4a\x02\x5e\x18\x63\ -\xca\xb1\xcf\x7e\x8a\xf0\x44\x70\x6e\xbe\xf3\x98\x8b\xac\x3a\x2f\ -\xb1\x39\x98\x37\x20\x47\xe7\x21\x97\xcf\x27\x43\xfb\x6e\xb8\xa7\ -\x40\xd8\x2d\x12\x67\xd8\x28\x12\xee\x16\x7c\xd9\x49\x7b\xe7\x1c\ -\x23\xc9\xb1\x86\xc4\x89\x61\x2c\x23\x3a\x63\x5d\x67\x3e\xcd\xa8\ -\xd5\xe6\xf9\x85\x8b\xf9\x82\xb5\x2f\xa9\xed\x9c\x6f\x22\x1a\x38\ -\xf3\xe7\x14\x07\x22\xf1\xa3\x25\x6e\xd2\x9a\x72\x40\x79\x76\x39\ -\xa7\x95\x9b\xb8\x33\xf8\x50\xcc\x8b\x35\xbd\xe3\xe7\x2b\x98\x6f\ -\x54\x8e\x91\x42\xbf\x4b\x05\x37\x9e\x4b\x72\xe4\xff\xe6\xf3\x0f\ -\xac\xfd\x59\x5e\xfb\x6f\xdd\xe8\x37\x9b\x09\x62\x6c\x70\xf6\x9c\ -\xe2\x31\xb8\x61\xfc\x48\x7c\xec\xec\xdf\xe6\x8c\x3a\xf9\x9e\x09\ -\xeb\xd9\xbc\x72\x9f\x67\x4c\x3b\xf9\x68\x2a\x58\x07\x26\xea\x93\ -\x5b\xf9\x3e\xc6\x4c\x0e\x7e\x57\xf1\xde\x13\x5c\xe7\x5d\xd9\xf9\ -\xc4\xb4\xd3\xdf\xda\x8d\xe7\x7a\xe2\xc9\x56\xe5\xf2\x0c\xaf\x8b\ -\xc7\x88\xbf\x18\x0e\x8a\xe3\x17\x8e\x89\xff\xb3\xf0\xbf\x17\x9f\ -\x2b\x3e\x37\xbe\x4b\x7c\x6e\xe4\x4f\x3e\x78\xec\x52\x7e\xcf\xb1\ -\x4b\x87\xf1\x39\x71\xec\x52\xdf\x89\x63\x8e\x6f\x59\x7e\xce\x1d\ -\x73\x86\xf1\x39\x7f\xcc\x79\xff\xf9\xe3\xce\x47\xc0\x81\xbc\x76\ -\x32\x1a\xfc\x14\x18\x9c\xb6\xd2\xf2\x53\xdc\xd4\x31\x14\x94\xdd\ -\x11\x9c\x5f\x65\xac\x9d\x9f\xb5\xd1\x79\x9d\xb5\xfe\x9a\x89\x98\ -\x6b\x19\x6b\xbd\xce\xef\x19\x5b\x75\xbd\x7f\xc7\xf9\xa2\x8c\xb5\ -\x25\x41\xac\xe0\xea\xe7\x67\x36\x98\xb7\xb1\x1e\xa4\x5a\xe7\xe8\ -\x7b\x69\x8f\xd7\xb6\xc7\xcc\xcb\x58\xc9\xf5\x7e\x8f\x98\xbb\xb4\ -\x6c\x1f\x62\xeb\x08\xff\x52\xd8\xaf\x6e\x0c\x1d\x62\xe6\x36\xaa\ -\x3f\xdd\x43\xda\xd4\x84\xa7\x6e\xcf\x9f\x47\x2c\x55\x52\x77\xff\ -\xd6\xc4\x85\x5f\x57\x08\x37\x58\x3d\xf9\x48\xb6\xad\x9d\x14\x43\ -\xa3\x71\xcc\x0c\x7c\x07\x1b\xfe\x1e\xf1\x73\x74\xbe\xdf\x7a\x0e\ -\xc5\x50\xc0\xf6\x00\xae\xf7\x26\xbc\x7a\x38\x6b\xc7\x19\xfb\xea\ -\xb3\x75\x9c\x9d\xe3\xbc\x5c\x9e\x95\x6f\x24\xbe\xe4\x1a\xb1\xab\ -\xe8\x7b\x58\xf3\x7b\x71\x56\xda\x4b\x61\xdf\xa6\xf8\x3c\xcc\x9f\ -\x87\xc5\xe7\xef\xc5\xe7\xa1\x37\x8a\x4f\x4c\x51\x9e\x14\x9f\xc7\ -\xdf\x2f\x3f\x0f\x28\xca\x13\x0f\xb4\xfd\x46\x7c\xfe\x3f\x60\x90\ -\xc1\x7e\ -\x00\x00\x03\xaa\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\ -\x72\x61\x70\x68\x69\x63\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\ -\x44\x54\x44\x2f\x73\x76\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\ -\x0a\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x36\x39\x39\x37\x30\x31\ -\x39\x38\x39\x38\x34\x35\x22\x20\x63\x6c\x61\x73\x73\x3d\x22\x69\ -\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ -\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\x22\x20\x76\x65\x72\ -\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x78\x6d\x6c\x6e\x73\ -\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\ -\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x39\x32\x37\x39\x22\x0d\x0a\x20\x20\x20\x20\x20\ -\x77\x69\x64\x74\x68\x3d\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\ -\x74\x3d\x22\x31\x36\x22\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\ -\x74\x68\x20\x64\x3d\x22\x4d\x35\x30\x30\x2e\x33\x32\x20\x35\x39\ -\x2e\x38\x34\x61\x38\x20\x38\x20\x30\x20\x30\x20\x31\x20\x38\x20\ -\x36\x2e\x34\x76\x33\x35\x32\x61\x38\x39\x2e\x36\x20\x38\x39\x2e\ -\x36\x20\x30\x20\x30\x20\x30\x20\x38\x39\x2e\x36\x20\x38\x39\x2e\ -\x36\x68\x33\x35\x30\x2e\x34\x61\x38\x2e\x31\x36\x20\x38\x2e\x31\ -\x36\x20\x30\x20\x30\x20\x31\x20\x38\x2e\x31\x36\x20\x38\x2e\x31\ -\x36\x76\x31\x32\x2e\x38\x41\x34\x34\x38\x20\x34\x34\x38\x20\x30\ -\x20\x31\x20\x31\x20\x34\x38\x37\x2e\x30\x34\x20\x36\x30\x2e\x33\ -\x32\x68\x31\x31\x2e\x35\x32\x7a\x4d\x34\x34\x31\x2e\x34\x34\x20\ -\x31\x33\x32\x2e\x38\x6c\x2d\x35\x2e\x39\x32\x20\x31\x2e\x31\x32\ -\x61\x33\x38\x30\x2e\x39\x36\x20\x33\x38\x30\x2e\x39\x36\x20\x30\ -\x20\x31\x20\x30\x20\x34\x34\x36\x2e\x38\x38\x20\x34\x34\x38\x6c\ -\x31\x2e\x31\x32\x2d\x36\x2e\x32\x34\x48\x35\x39\x38\x2e\x32\x34\ -\x61\x31\x35\x36\x2e\x39\x36\x20\x31\x35\x36\x2e\x39\x36\x20\x30\ -\x20\x30\x20\x31\x2d\x31\x35\x36\x2e\x38\x2d\x31\x35\x31\x2e\x38\ -\x34\x56\x31\x33\x32\x2e\x38\x7a\x20\x6d\x31\x34\x32\x2e\x35\x36\ -\x2d\x36\x36\x2e\x35\x36\x6c\x38\x2e\x36\x34\x20\x31\x2e\x36\x20\ -\x36\x2e\x35\x36\x20\x31\x2e\x32\x38\x68\x32\x2e\x37\x32\x61\x34\ -\x34\x38\x20\x34\x34\x38\x20\x30\x20\x30\x20\x31\x20\x33\x34\x36\ -\x2e\x30\x38\x20\x33\x35\x30\x2e\x35\x36\x6c\x32\x2e\x30\x38\x20\ -\x31\x31\x2e\x33\x36\x61\x38\x2e\x33\x32\x20\x38\x2e\x33\x32\x20\ -\x30\x20\x30\x20\x31\x2d\x36\x2e\x37\x32\x20\x39\x2e\x34\x34\x48\ -\x36\x32\x30\x2e\x36\x34\x61\x34\x34\x2e\x39\x36\x20\x34\x34\x2e\ -\x39\x36\x20\x30\x20\x30\x20\x31\x2d\x34\x34\x2e\x38\x2d\x34\x31\ -\x2e\x36\x56\x37\x34\x2e\x34\x61\x38\x2e\x31\x36\x20\x38\x2e\x31\ -\x36\x20\x30\x20\x30\x20\x31\x20\x38\x2e\x31\x36\x2d\x38\x2e\x31\ -\x36\x7a\x20\x6d\x35\x39\x2e\x32\x20\x38\x39\x2e\x36\x61\x34\x2e\ -\x34\x38\x20\x34\x2e\x34\x38\x20\x30\x20\x30\x20\x30\x20\x30\x20\ -\x31\x2e\x34\x34\x76\x32\x31\x32\x61\x34\x2e\x31\x36\x20\x34\x2e\ -\x31\x36\x20\x30\x20\x30\x20\x30\x20\x34\x20\x34\x2e\x31\x36\x68\ -\x32\x31\x31\x2e\x38\x34\x61\x34\x2e\x31\x36\x20\x34\x2e\x31\x36\ -\x20\x30\x20\x30\x20\x30\x20\x34\x2e\x31\x36\x2d\x34\x2e\x31\x36\ -\x20\x34\x2e\x36\x34\x20\x34\x2e\x36\x34\x20\x30\x20\x30\x20\x30\ -\x20\x30\x2d\x31\x2e\x34\x34\x20\x33\x38\x32\x2e\x37\x32\x20\x33\ -\x38\x32\x2e\x37\x32\x20\x30\x20\x30\x20\x30\x2d\x32\x31\x34\x2e\ -\x34\x2d\x32\x31\x34\x2e\x34\x20\x34\x2e\x31\x36\x20\x34\x2e\x31\ -\x36\x20\x30\x20\x30\x20\x30\x2d\x35\x2e\x32\x38\x20\x32\x2e\x34\ -\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x70\x2d\ -\x69\x64\x3d\x22\x39\x32\x38\x30\x22\x3e\x3c\x2f\x70\x61\x74\x68\ -\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x07\xca\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\ -\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x07\ -\x84\x49\x44\x41\x54\x78\x5e\xed\x9b\x3f\x8c\x1b\x55\x10\xc6\xdf\ -\xc6\xc4\x27\x14\x1d\x82\xf8\xaa\xab\x1c\x05\x9d\x69\x5c\x58\xb6\ -\x69\x82\x94\xa4\xa2\xa4\x85\xee\x0e\x3a\x4a\x8a\x54\x48\x04\x89\ -\x2a\x05\x25\x1d\x49\x3a\x68\x29\xa9\x62\x24\xa0\xe0\x6c\xb9\x70\ -\xc3\x59\x44\x31\x8d\xab\xf8\x84\x64\x45\xe8\x9c\x33\x8b\x66\x93\ -\x8d\xf6\x36\xbb\x6f\xf7\xed\xcc\x5a\x1e\xfb\x5b\xe9\xa4\x5c\xee\ -\xbd\xd9\x99\xef\xfb\xbd\x3f\xfb\xd6\xf6\x4c\xec\x3a\x3e\x3e\xbe\ -\x4b\xff\xe5\x79\xde\x4d\x63\xcc\xad\xf8\xdf\xf1\xbb\x3a\x05\x26\ -\x2f\x33\xee\x79\x9e\xf7\x4b\xbb\xdd\x7e\x18\xad\xc0\x0b\x7f\x19\ -\x0e\x87\xf5\xe5\x72\xf9\x00\xa6\xab\x33\xd8\x35\xe1\x49\xa5\x52\ -\xb9\xdd\x6a\xb5\x02\x30\x02\x00\x5e\x9a\xff\xc4\x35\x12\xda\xab\ -\x55\x60\xe2\xfb\xfe\x51\xb7\xdb\xed\x05\x00\xf4\xfb\xfd\x47\x18\ -\xf9\x6a\xcd\x2c\x9a\xf8\xa4\xd3\xe9\x5c\xf3\x06\x83\xc1\xa1\xef\ -\xfb\x34\xf5\xe3\xda\x32\x05\x7c\xdf\xff\xda\xeb\xf7\xfb\x64\xfe\ -\xe1\x96\xd5\x8e\x72\x5f\x28\xd0\x23\x00\x68\xed\xaf\x43\x91\xad\ -\x54\x60\x42\x00\xf8\x5b\x59\x3a\x8a\x0e\x14\xc8\x05\x40\xb5\x5a\ -\x35\xfb\xfb\xfb\xa6\x56\xab\x41\x36\xa6\x02\x8b\xc5\xc2\x9c\x9d\ -\x9d\x99\xc9\x64\x62\xe8\xdf\x49\x57\x54\xef\x32\xda\x5f\x38\x07\ -\xc8\x9a\x01\x28\x99\x66\xb3\xc9\x2c\x1b\xdd\xe3\x0a\x90\xb1\x27\ -\x27\x27\x89\x10\xb4\xdb\xed\xd7\x04\x93\x6c\xef\x04\x40\xbd\x5e\ -\xc7\xc8\x2f\x89\xdf\xf9\x7c\x6e\xc6\xe3\xf1\x85\xe8\x36\xbd\x25\ -\xda\xc7\x4b\xc9\x5c\x02\x68\xf4\xd3\x2c\x80\x4b\x5e\x01\x1a\xd5\ -\xa3\xd1\xe8\x42\x60\x9b\xde\x12\xed\x01\x80\xbc\x8f\xac\x88\x83\ -\xc1\xe0\x42\xff\x83\x83\x03\xb3\xbb\xbb\x9b\x1a\x93\xdb\xde\x19\ -\x00\x2c\x01\x2c\x7f\xad\x9d\x67\xb3\x59\xb0\x19\x8c\x5e\x36\xbd\ -\x25\xda\x3b\x03\x80\x4d\x60\x39\x00\xa4\x6d\xea\x48\xef\x46\xa3\ -\x91\xb8\xec\xd2\x72\x11\x7f\x72\x70\x6d\xef\x0c\x00\x75\xa0\x9b\ -\xec\xed\xed\x05\x9b\x41\xec\x07\x78\x40\x90\x81\xb4\x99\x8b\x8f\ -\xfc\x68\xd4\xa8\xde\xf4\xff\xd4\x7e\x3a\x9d\x5a\x1f\x1b\x43\x7f\ -\xf2\xb4\x77\x7a\x0a\xe0\x95\x8b\xde\xeb\xae\x40\xe6\x53\xc0\xba\ -\x17\x80\xfc\x78\x0a\x00\x00\x9e\x7e\xea\x7b\x03\x00\xf5\x16\xf2\ -\x0a\x00\x00\x3c\xfd\xd4\xf7\x06\x00\xea\x2d\xe4\x15\x00\x00\x78\ -\xfa\xa9\xef\x0d\x00\xd4\x5b\xc8\x2b\x20\x13\x80\xa4\x57\x93\xbc\ -\x5b\xa2\xf7\x2a\x15\x88\xbf\x3b\x70\x3e\x09\x04\x00\xab\xb4\x4b\ -\xfe\x5e\x00\x40\x5e\x53\x55\x11\x01\x80\x2a\xbb\xe4\x93\x05\x00\ -\xf2\x9a\xaa\x8a\x08\x00\x54\xd9\x25\x9f\x2c\x00\x90\xd7\x54\x55\ -\x44\x00\xa0\xca\x2e\xf9\x64\x01\x80\xbc\xa6\xaa\x22\x02\x00\x55\ -\x76\xc9\x27\x0b\x00\xe4\x35\x55\x15\x11\x00\xa8\xb2\x4b\x3e\x59\ -\x00\x20\xaf\xa9\xaa\x88\x00\x40\x95\x5d\xf2\xc9\x02\x00\x79\x4d\ -\x55\x45\x04\x00\xaa\xec\x92\x4f\x16\x00\xc8\x6b\xaa\x2a\x22\x00\ -\x50\x65\x97\x7c\xb2\x00\x40\x5e\x53\x55\x11\x01\x80\x2a\xbb\xe4\ -\x93\x05\x00\xf2\x9a\xaa\x8a\x08\x00\x54\xd9\x25\x9f\x2c\x00\x90\ -\xd7\x54\x55\x44\x00\xa0\xca\x2e\xf9\x64\x01\x80\xbc\xa6\xaa\x22\ -\x02\x00\x55\x76\xc9\x27\x0b\x00\xe4\x35\x55\x15\x11\x00\xa8\xb2\ -\x4b\x3e\x59\x00\x20\xaf\xa9\xaa\x88\x00\x40\x95\x5d\xf2\xc9\x02\ -\x00\x79\x4d\x55\x45\x04\x00\xaa\xec\x92\x4f\x16\x00\xc8\x6b\xaa\ -\x2a\x22\x00\x50\x65\x97\x7c\xb2\x00\x40\x5e\x53\x55\x11\x01\x80\ -\x2a\xbb\xe4\x93\x55\x09\xc0\xb3\x1f\xef\x9b\xb3\x3f\x7e\x4d\x54\ -\xe3\xed\x2f\xef\x99\x4b\x57\xf7\x0a\x29\xf5\xfc\xaf\x3f\xcd\xf9\ -\xe3\x13\x73\x76\xfc\x9b\xf9\xef\xf4\xe9\xab\x18\x61\xbc\xcb\xef\ -\xbe\x67\xde\xb8\xde\x30\x3b\xdd\x1b\x85\xe2\xa7\x75\x2a\xab\x9e\ -\x3c\x49\xaa\x03\x80\x4c\x9a\x7f\x77\x2f\xb1\xb6\x37\x3f\xfc\xc8\ -\xd0\x8f\xeb\x45\x86\x3f\xfb\xe1\xfb\xdc\xdd\x08\x08\x82\xa0\xc8\ -\xbd\xe2\x37\x29\xa3\x9e\xdc\x85\x18\x63\xd4\x01\x40\xe6\x93\x68\ -\x49\xd7\xd5\x6f\xef\xbb\xd4\x1e\xb4\xb5\xc5\xcb\x0a\x46\x20\xd0\ -\x8c\xc3\xb9\xa4\xeb\x71\xcd\x45\x15\x00\xb6\x91\xba\xfb\xf9\x1d\ -\x43\x53\xb4\xcb\xc5\x31\x3f\xbc\x0f\x07\x02\xe9\x7a\x5c\x6a\x0f\ -\xdb\xaa\x02\xe0\x9f\x6f\xee\x5c\x58\x9b\xc3\x22\xc8\x78\x02\xc0\ -\xe5\x72\x9d\xf6\x6d\xb1\xaf\x7c\xf2\x59\xa1\x7d\x81\x64\x3d\x2e\ -\xb5\x47\xdb\xaa\x01\xe0\xdf\x9f\x7f\x32\xf4\x93\x74\x49\x8f\xfe\ -\x9d\xf7\x3f\x30\x97\xde\xa9\x05\x6b\x3c\x6d\x06\x9f\x3f\x3e\x79\ -\xb1\x39\x4c\xd9\x78\x16\x99\x05\xa4\xeb\xd9\x68\x00\xc8\x04\x1a\ -\x2d\x49\x17\x99\x75\xe5\xe3\x4f\x9d\xea\xb7\x8d\x7e\xdb\x6c\x62\ -\x33\xcd\x65\x16\x90\xae\xc7\xa9\xf8\x58\x63\x15\x33\x80\x6d\xad\ -\x2e\xf2\xd8\x97\x16\x2f\xcf\x52\x92\xd6\xd7\x65\x16\x90\xae\x67\ -\xa3\x01\xb0\x3d\x26\xb9\x8c\xba\x50\x24\x6e\x3c\x5b\xff\x3c\x4b\ -\x11\xf7\xfe\x1c\xb3\x93\xfa\xae\xfd\x0c\x20\x31\xe2\xa2\x85\xdb\ -\xa6\xff\x3c\x8f\x91\xb6\xe9\x3b\xcf\x39\x84\x74\x3d\x5c\x20\xd6\ -\x1a\x80\x32\x36\x4a\x69\x31\x5d\xf6\x12\x69\x26\x66\xc5\x28\xa3\ -\x9e\x8d\x06\xe0\xf4\x8b\xe4\xcd\x5d\xb8\x56\x27\xfd\x3d\x6b\x2d\ -\x4e\x3b\x76\xcd\x32\x2f\x2a\x74\x9a\x91\x59\x7b\x88\x32\xea\xd9\ -\x58\x00\xf2\x6c\x94\x8a\x00\x90\x16\x37\xcf\xf4\x1d\x8a\x9d\x06\ -\x80\x0d\xbe\xb2\xea\xd9\x48\x00\xf2\x9e\x8f\x17\x01\x20\xed\xf0\ -\xc5\x65\x43\x99\x96\x5f\x1a\x00\x65\xd6\xb3\x91\x00\xe4\x3d\x1f\ -\x97\x04\xc0\x65\x06\x70\xdd\x48\x96\x59\xcf\xc6\x01\x60\x13\x97\ -\x46\xe9\xe5\xeb\x8d\x57\x35\x27\x1d\x0e\xd1\x28\x7c\x2b\x72\x2c\ -\x1c\x7f\x35\x2c\xb1\x04\xa4\xe5\x98\x34\x03\x94\x5d\xcf\xc6\x01\ -\x90\xb6\x51\x2a\x5a\x68\xfc\xd1\xae\xcc\x4d\x60\xd2\x46\xb2\xec\ -\x7a\x8a\xea\xb2\xb6\x2f\x83\xca\x16\xac\xe8\x0e\x3e\x2a\xb4\x0b\ -\x44\x65\xd7\x03\x00\x32\x14\x88\xcf\x00\xae\x1b\xb8\xa4\xf0\x2e\ -\x1b\x49\x00\xe0\x88\x68\xd9\x82\x71\x8f\x62\xb3\xd6\xf4\xf8\xc7\ -\xc5\xca\xae\xc7\x51\xde\xd7\x9a\xaf\xdd\x49\xe0\x2a\x04\x5b\xe5\ -\xcb\xa0\x55\xd4\xc3\x81\x60\xed\x00\xa0\x11\x96\xf7\x4a\xfb\x1c\ -\x1f\x3d\x2d\x84\x57\xd2\x07\x38\x6d\xb3\x80\xed\x44\xd0\xf6\xe1\ -\xcd\xb4\x73\x84\x55\xd4\x93\x57\x2f\x95\x2f\x83\x6c\xc5\x15\x39\ -\x07\x08\xe3\xd9\x9e\xcd\xe9\x48\xb7\xda\xbd\x11\x7c\xca\x87\x5e\ -\xfe\x2c\x4f\x9f\x9a\x45\xff\x77\xd1\x0f\x84\x24\xd5\xc5\xa9\xa7\ -\x28\x04\x6b\x37\x03\xb8\x14\xc2\x11\xcc\x36\x0b\xb8\xe4\x40\x6d\ -\x5d\x4e\x11\xcb\x02\xda\x35\xe7\xb5\x7d\x0c\x74\x29\x84\x03\x00\ -\xdd\xc7\xf6\x76\x2e\x6f\x1e\x59\x2f\x80\xf2\xc6\xa1\x76\xdc\x7a\ -\x5c\xee\x05\x00\x8c\x09\xa6\x77\x5a\xa3\xd3\x3e\x6b\x98\x25\xa8\ -\xa4\xf9\x00\x20\x4b\xed\x84\xbf\x4b\x8d\x98\x10\x82\xe8\xb7\x81\ -\x6c\xe9\x48\x7e\x31\x24\x7a\x1f\xa9\x7a\x5c\xa4\xdc\xda\x3d\x40\ -\x5c\xa4\x70\xb3\x47\x9f\xfe\xa5\x1f\xda\xf8\x85\x40\x84\xef\x13\ -\x68\x53\x48\x5f\x0d\x73\xfd\xfe\x41\x5e\x43\x00\x40\x5e\xa5\xd0\ -\x4e\x4c\x01\xd5\x33\x80\x98\x0a\x5b\x1c\x08\x00\x6c\xb1\xf9\x54\ -\x3a\x00\x00\x00\x56\x05\xbc\x7e\xbf\xef\xdb\x5a\xb4\xdb\xed\x2d\ -\x97\x50\x77\xf9\x98\x01\x74\xfb\xc7\xce\x1e\x00\xb0\x25\xd4\x1d\ -\x00\x00\xe8\xf6\x8f\x9d\x3d\x00\x60\x4b\xa8\x3b\x00\x00\xd0\xed\ -\x1f\x3b\x7b\x00\xc0\x96\x50\x77\x00\x00\xa0\xdb\x3f\x76\xf6\x00\ -\x80\x2d\xa1\xee\x00\x00\x40\xb7\x7f\xec\xec\x01\x00\x5b\x42\xdd\ -\x01\x00\x80\x6e\xff\xd8\xd9\x03\x00\xb6\x84\xba\x03\x00\x00\xdd\ -\xfe\xb1\xb3\x07\x00\x6c\x09\x75\x07\x00\x00\xba\xfd\x63\x67\x0f\ -\x00\xd8\x12\xea\x0e\x00\x00\x74\xfb\xc7\xce\x1e\x00\xb0\x25\xd4\ -\x1d\x00\x00\xe8\xf6\x8f\x9d\x3d\x00\x60\x4b\xa8\x3b\x00\x00\xd0\ -\xed\x1f\x3b\x7b\x00\xc0\x96\x50\x77\x00\x00\xa0\xdb\x3f\x76\xf6\ -\x6c\x00\x9a\xcd\xa6\xa9\x56\xab\xec\x44\x10\x60\xf5\x0a\x2c\x16\ -\x0b\x33\x1a\x8d\xac\x37\xce\xfc\x62\x48\xbd\x5e\x37\xb5\x5a\x6d\ -\xf5\xd9\xe3\x8e\x6c\x05\xe6\xf3\xb9\x19\x8f\xc7\x3c\x00\x68\xf4\ -\x37\x1a\x0d\xcc\x02\x6c\x3b\x56\x1f\x80\x46\x3f\xcd\x02\xb6\x2b\ -\x73\x06\xa0\xce\x04\x01\xcd\x04\x3b\x3b\x3b\x00\x61\xf5\x3e\x3a\ -\xdf\x71\x36\x9b\x99\xe9\x74\x9a\x69\x3e\x05\xce\x05\x80\x73\x06\ -\xe8\xa0\x46\x01\x02\xe0\x91\x31\xe6\x96\x9a\x8c\x91\xa8\xa8\x02\ -\x00\x40\x54\x4e\x75\xc1\x1e\x7a\x83\xc1\xe0\xd0\xf7\xfd\x07\xea\ -\x52\x47\xc2\x6c\x05\x3c\xcf\x3b\xf2\x28\x0a\x96\x01\xb6\x96\x1a\ -\x03\xf4\x3a\x9d\xce\xed\x00\x80\xe1\x70\x58\x5f\x2e\x97\x4f\x34\ -\x56\x81\x9c\x8b\x29\x50\xa9\x54\xae\xb5\x5a\xad\x49\x00\x40\x08\ -\xc1\xf9\xf9\xf9\xa1\xe7\x79\x5f\x15\x0b\x89\x5e\x4a\x14\xe8\x55\ -\x2a\x95\x23\x32\x3f\x78\x0c\x8c\x27\xfd\x72\x4f\x70\xd3\x18\x53\ -\xc7\xd3\x81\x12\x4b\xb3\xd3\x24\xb3\x7b\xbe\xef\xff\xdd\xed\x76\ -\xef\x46\x9b\xff\x0f\xbc\x44\x22\x65\x53\x6c\x50\x85\x00\x00\x00\ -\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x6f\xa0\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\ -\x72\x61\x70\x68\x69\x63\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\ -\x44\x54\x44\x2f\x73\x76\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\ -\x0a\x3c\x73\x76\x67\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x34\ -\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x31\x22\x20\x73\x69\ -\x6c\x6c\x79\x76\x67\x3d\x22\x74\x72\x75\x65\x22\x20\x74\x65\x6d\ -\x70\x6c\x61\x74\x65\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x34\ -\x22\x20\x74\x65\x6d\x70\x6c\x61\x74\x65\x2d\x77\x69\x64\x74\x68\ -\x3d\x22\x36\x34\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\ -\x2e\x31\x22\x0d\x0a\x20\x20\x20\x20\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x34\x22\x20\x78\x6d\x6c\ -\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x3e\ -\x0d\x0a\x20\x20\x20\x20\x3c\x64\x65\x66\x73\x20\x6e\x6f\x64\x65\ -\x2d\x69\x64\x3d\x22\x35\x33\x22\x3e\x0d\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x3c\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\x69\x65\ -\x6e\x74\x20\x67\x72\x61\x64\x69\x65\x6e\x74\x55\x6e\x69\x74\x73\ -\x3d\x22\x6f\x62\x6a\x65\x63\x74\x42\x6f\x75\x6e\x64\x69\x6e\x67\ -\x42\x6f\x78\x22\x20\x69\x64\x3d\x22\x6c\x69\x6e\x65\x61\x72\x47\ -\x72\x61\x64\x69\x65\x6e\x74\x2d\x33\x22\x20\x6e\x6f\x64\x65\x2d\ -\x69\x64\x3d\x22\x36\x22\x20\x73\x70\x72\x65\x61\x64\x4d\x65\x74\ -\x68\x6f\x64\x3d\x22\x70\x61\x64\x22\x20\x78\x31\x3d\x22\x30\x22\ -\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x78\x32\x3d\x22\x30\x2e\ -\x35\x22\x20\x79\x31\x3d\x22\x2d\x30\x2e\x31\x31\x37\x31\x35\x38\ -\x32\x37\x22\x20\x79\x32\x3d\x22\x30\x2e\x37\x35\x36\x38\x33\x38\ -\x31\x34\x22\x3e\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x3c\x73\x74\x6f\x70\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\ -\x30\x22\x20\x73\x74\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3d\x22\x23\ -\x64\x30\x38\x37\x38\x37\x22\x3e\x3c\x2f\x73\x74\x6f\x70\x3e\x0d\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x73\x74\ -\x6f\x70\x20\x6f\x66\x66\x73\x65\x74\x3d\x22\x31\x22\x20\x73\x74\ -\x6f\x70\x2d\x63\x6f\x6c\x6f\x72\x3d\x22\x23\x61\x33\x34\x66\x34\ -\x66\x22\x3e\x3c\x2f\x73\x74\x6f\x70\x3e\x0d\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x3c\x2f\x6c\x69\x6e\x65\x61\x72\x47\x72\x61\x64\ -\x69\x65\x6e\x74\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x2f\x64\x65\x66\ -\x73\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x67\x20\x6e\x6f\x64\x65\x2d\ -\x69\x64\x3d\x22\x39\x30\x22\x3e\x0d\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x36\x36\x34\ -\x2e\x36\x35\x20\x39\x30\x33\x2e\x34\x39\x20\x4c\x20\x36\x37\x38\ -\x2e\x35\x30\x20\x39\x31\x30\x2e\x38\x39\x20\x4c\x20\x36\x39\x30\ -\x2e\x36\x34\x20\x39\x31\x38\x2e\x30\x32\x20\x4c\x20\x37\x30\x31\ -\x2e\x32\x33\x20\x39\x32\x34\x2e\x38\x39\x20\x4c\x20\x37\x31\x30\ -\x2e\x33\x39\x20\x39\x33\x31\x2e\x34\x39\x20\x4c\x20\x37\x31\x38\ -\x2e\x32\x36\x20\x39\x33\x37\x2e\x38\x34\x20\x4c\x20\x37\x32\x34\ -\x2e\x39\x35\x20\x39\x34\x33\x2e\x39\x35\x20\x4c\x20\x37\x33\x30\ -\x2e\x35\x38\x20\x39\x34\x39\x2e\x38\x34\x20\x4c\x20\x37\x33\x35\ -\x2e\x32\x36\x20\x39\x35\x35\x2e\x35\x32\x20\x4c\x20\x37\x33\x39\ -\x2e\x30\x36\x20\x39\x36\x31\x2e\x30\x32\x20\x4c\x20\x37\x34\x32\ -\x2e\x30\x39\x20\x39\x36\x36\x2e\x33\x35\x20\x4c\x20\x37\x34\x39\ -\x2e\x38\x38\x20\x39\x38\x32\x2e\x32\x35\x20\x4c\x20\x37\x35\x36\ -\x2e\x39\x35\x20\x39\x39\x37\x2e\x35\x39\x20\x4c\x20\x37\x36\x33\ -\x2e\x33\x31\x20\x31\x30\x31\x32\x2e\x34\x30\x20\x4c\x20\x37\x36\ -\x39\x2e\x30\x30\x20\x31\x30\x32\x36\x2e\x37\x30\x20\x4c\x20\x31\ -\x38\x36\x2e\x31\x38\x20\x31\x30\x32\x34\x2e\x39\x33\x20\x4c\x20\ -\x31\x39\x31\x2e\x39\x35\x20\x31\x30\x30\x38\x2e\x30\x32\x20\x4c\ -\x20\x31\x39\x37\x2e\x36\x39\x20\x39\x39\x32\x2e\x36\x39\x20\x4c\ -\x20\x32\x30\x33\x2e\x34\x30\x20\x39\x37\x38\x2e\x38\x33\x20\x4c\ -\x20\x32\x30\x39\x2e\x30\x37\x20\x39\x36\x36\x2e\x33\x35\x20\x4c\ -\x20\x32\x31\x31\x2e\x38\x33\x20\x39\x36\x30\x2e\x33\x38\x20\x4c\ -\x20\x32\x31\x35\x2e\x31\x35\x20\x39\x35\x34\x2e\x36\x30\x20\x4c\ -\x20\x32\x31\x39\x2e\x30\x36\x20\x39\x34\x38\x2e\x39\x39\x20\x4c\ -\x20\x32\x32\x33\x2e\x35\x39\x20\x39\x34\x33\x2e\x35\x33\x20\x4c\ -\x20\x32\x32\x38\x2e\x37\x37\x20\x39\x33\x38\x2e\x32\x31\x20\x4c\ -\x20\x32\x33\x34\x2e\x36\x36\x20\x39\x33\x33\x2e\x30\x34\x20\x4c\ -\x20\x32\x34\x31\x2e\x33\x31\x20\x39\x32\x38\x2e\x30\x30\x20\x4c\ -\x20\x32\x34\x38\x2e\x37\x37\x20\x39\x32\x33\x2e\x31\x30\x20\x4c\ -\x20\x32\x35\x37\x2e\x31\x32\x20\x39\x31\x38\x2e\x33\x36\x20\x4c\ -\x20\x32\x36\x36\x2e\x34\x32\x20\x39\x31\x33\x2e\x37\x37\x20\x4c\ -\x20\x32\x37\x36\x2e\x37\x34\x20\x39\x30\x39\x2e\x33\x36\x20\x4c\ -\x20\x32\x38\x38\x2e\x31\x38\x20\x39\x30\x35\x2e\x31\x34\x20\x4c\ -\x20\x33\x30\x35\x2e\x32\x33\x20\x39\x30\x32\x2e\x32\x33\x20\x4c\ -\x20\x33\x32\x30\x2e\x33\x30\x20\x39\x30\x30\x2e\x31\x39\x20\x4c\ -\x20\x33\x33\x33\x2e\x35\x35\x20\x38\x39\x38\x2e\x39\x32\x20\x4c\ -\x20\x33\x34\x35\x2e\x31\x35\x20\x38\x39\x38\x2e\x33\x33\x20\x4c\ -\x20\x33\x35\x35\x2e\x32\x36\x20\x38\x39\x38\x2e\x33\x33\x20\x4c\ -\x20\x33\x36\x34\x2e\x30\x33\x20\x38\x39\x38\x2e\x38\x35\x20\x4c\ -\x20\x33\x37\x31\x2e\x36\x30\x20\x38\x39\x39\x2e\x38\x30\x20\x4c\ -\x20\x33\x37\x38\x2e\x33\x33\x20\x39\x30\x31\x2e\x31\x38\x20\x4c\ -\x20\x33\x38\x35\x2e\x34\x30\x20\x39\x30\x33\x2e\x31\x38\x20\x4c\ -\x20\x33\x39\x32\x2e\x38\x34\x20\x39\x30\x35\x2e\x38\x35\x20\x4c\ -\x20\x34\x30\x30\x2e\x36\x38\x20\x39\x30\x39\x2e\x32\x35\x20\x4c\ -\x20\x34\x30\x38\x2e\x39\x37\x20\x39\x31\x33\x2e\x34\x33\x20\x4c\ -\x20\x34\x31\x37\x2e\x37\x33\x20\x39\x31\x38\x2e\x34\x38\x20\x4c\ -\x20\x34\x32\x36\x2e\x39\x39\x20\x39\x32\x34\x2e\x34\x36\x20\x4c\ -\x20\x34\x33\x36\x2e\x38\x30\x20\x39\x33\x31\x2e\x34\x34\x20\x4c\ -\x20\x34\x35\x34\x2e\x37\x38\x20\x39\x32\x32\x2e\x38\x37\x20\x4c\ -\x20\x34\x37\x31\x2e\x35\x34\x20\x39\x31\x35\x2e\x34\x37\x20\x4c\ -\x20\x34\x38\x37\x2e\x31\x34\x20\x39\x30\x39\x2e\x31\x34\x20\x4c\ -\x20\x35\x30\x31\x2e\x36\x36\x20\x39\x30\x33\x2e\x38\x32\x20\x4c\ -\x20\x35\x31\x35\x2e\x31\x35\x20\x38\x39\x39\x2e\x34\x33\x20\x4c\ -\x20\x35\x32\x37\x2e\x36\x39\x20\x38\x39\x35\x2e\x39\x30\x20\x4c\ -\x20\x35\x33\x39\x2e\x33\x33\x20\x38\x39\x33\x2e\x31\x36\x20\x4c\ -\x20\x35\x35\x30\x2e\x31\x33\x20\x38\x39\x31\x2e\x31\x34\x20\x4c\ -\x20\x35\x36\x30\x2e\x31\x36\x20\x38\x38\x39\x2e\x38\x30\x20\x4c\ -\x20\x35\x37\x34\x2e\x32\x36\x20\x38\x38\x39\x2e\x31\x35\x20\x4c\ -\x20\x35\x38\x37\x2e\x36\x36\x20\x38\x38\x39\x2e\x31\x31\x20\x4c\ -\x20\x36\x30\x30\x2e\x33\x39\x20\x38\x38\x39\x2e\x36\x33\x20\x4c\ -\x20\x36\x31\x32\x2e\x34\x38\x20\x38\x39\x30\x2e\x37\x31\x20\x4c\ -\x20\x36\x32\x33\x2e\x39\x38\x20\x38\x39\x32\x2e\x33\x30\x20\x4c\ -\x20\x36\x33\x34\x2e\x39\x32\x20\x38\x39\x34\x2e\x33\x39\x20\x4c\ -\x20\x36\x34\x35\x2e\x33\x32\x20\x38\x39\x36\x2e\x39\x36\x20\x4c\ -\x20\x36\x35\x35\x2e\x32\x32\x20\x38\x39\x39\x2e\x39\x39\x20\x4c\ -\x20\x36\x36\x34\x2e\x36\x35\x20\x39\x30\x33\x2e\x34\x39\x20\x5a\ -\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x66\x69\x6c\x6c\x3d\x22\x23\x34\x64\x38\x30\x63\x66\x22\x20\ -\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\ -\x64\x64\x22\x20\x67\x72\x6f\x75\x70\x2d\x69\x64\x3d\x22\x31\x22\ -\x20\x69\x64\x3d\x22\xe8\x92\x99\xe7\x89\x88\x22\x20\x6e\x6f\x64\ -\x65\x2d\x69\x64\x3d\x22\x31\x31\x22\x20\x73\x74\x72\x6f\x6b\x65\ -\x3d\x22\x6e\x6f\x6e\x65\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\ -\x69\x67\x68\x74\x3d\x22\x31\x33\x37\x2e\x35\x39\x36\x35\x36\x22\ -\x20\x74\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x35\ -\x38\x32\x2e\x38\x31\x39\x37\x36\x22\x20\x74\x61\x72\x67\x65\x74\ -\x2d\x78\x3d\x22\x31\x38\x36\x2e\x31\x38\x31\x38\x32\x22\x20\x74\ -\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x38\x38\x39\x2e\x31\x30\x36\ -\x33\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x35\ -\x37\x39\x2e\x38\x34\x20\x39\x39\x36\x2e\x34\x31\x20\x4c\x20\x35\ -\x37\x39\x2e\x38\x34\x20\x31\x30\x32\x36\x2e\x31\x33\x20\x4c\x20\ -\x33\x37\x30\x2e\x31\x32\x20\x31\x30\x32\x35\x2e\x34\x39\x20\x4c\ -\x20\x33\x37\x30\x2e\x31\x32\x20\x39\x39\x36\x2e\x34\x31\x20\x4c\ -\x20\x34\x30\x35\x2e\x36\x34\x20\x39\x39\x38\x2e\x36\x36\x20\x4c\ -\x20\x34\x33\x34\x2e\x30\x30\x20\x31\x30\x30\x30\x2e\x31\x31\x20\ -\x4c\x20\x34\x35\x36\x2e\x32\x35\x20\x31\x30\x30\x30\x2e\x38\x38\ -\x20\x4c\x20\x34\x37\x33\x2e\x33\x32\x20\x31\x30\x30\x31\x2e\x31\ -\x33\x20\x4c\x20\x34\x37\x34\x2e\x30\x33\x20\x31\x30\x30\x31\x2e\ -\x31\x33\x20\x4c\x20\x34\x39\x31\x2e\x30\x39\x20\x31\x30\x30\x30\ -\x2e\x39\x30\x20\x4c\x20\x35\x31\x33\x2e\x36\x38\x20\x31\x30\x30\ -\x30\x2e\x31\x34\x20\x4c\x20\x35\x34\x32\x2e\x38\x37\x20\x39\x39\ -\x38\x2e\x36\x39\x20\x4c\x20\x35\x37\x39\x2e\x38\x34\x20\x39\x39\ -\x36\x2e\x34\x31\x20\x4c\x20\x35\x37\x39\x2e\x38\x34\x20\x39\x39\ -\x36\x2e\x34\x31\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x37\x66\ -\x61\x63\x66\x31\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\ -\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x67\x72\x6f\x75\x70\x2d\ -\x69\x64\x3d\x22\x31\x22\x20\x69\x64\x3d\x22\xe5\xbd\xa2\xe7\x8a\ -\xb6\xe7\xbb\x93\xe5\x90\x88\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\ -\x3d\x22\x31\x32\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\ -\x6e\x65\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\ -\x3d\x22\x32\x39\x2e\x37\x31\x39\x39\x37\x22\x20\x74\x61\x72\x67\ -\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x32\x30\x39\x2e\x37\x31\ -\x35\x35\x38\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x33\ -\x37\x30\x2e\x31\x32\x34\x31\x35\x22\x20\x74\x61\x72\x67\x65\x74\ -\x2d\x79\x3d\x22\x39\x39\x36\x2e\x34\x30\x37\x22\x3e\x3c\x2f\x70\ -\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x70\ -\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x37\x30\x32\x2e\x31\x32\x20\ -\x39\x32\x35\x2e\x35\x30\x20\x4c\x20\x37\x30\x32\x2e\x31\x35\x20\ -\x39\x32\x35\x2e\x37\x37\x20\x4c\x20\x37\x30\x34\x2e\x35\x37\x20\ -\x39\x34\x36\x2e\x30\x35\x20\x4c\x20\x37\x30\x36\x2e\x32\x31\x20\ -\x39\x36\x33\x2e\x36\x36\x20\x4c\x20\x37\x30\x37\x2e\x31\x38\x20\ -\x39\x37\x38\x2e\x38\x35\x20\x4c\x20\x37\x30\x37\x2e\x35\x35\x20\ -\x39\x39\x31\x2e\x38\x36\x20\x4c\x20\x37\x30\x37\x2e\x34\x31\x20\ -\x31\x30\x30\x32\x2e\x39\x32\x20\x4c\x20\x37\x30\x36\x2e\x38\x36\ -\x20\x31\x30\x31\x32\x2e\x32\x35\x20\x4c\x20\x37\x30\x35\x2e\x39\ -\x35\x20\x31\x30\x32\x30\x2e\x30\x35\x20\x4c\x20\x37\x30\x34\x2e\ -\x37\x35\x20\x31\x30\x32\x36\x2e\x35\x31\x20\x4c\x20\x36\x36\x33\ -\x2e\x39\x32\x20\x31\x30\x32\x36\x2e\x33\x38\x20\x4c\x20\x36\x39\ -\x37\x2e\x30\x34\x20\x39\x32\x32\x2e\x30\x39\x20\x4c\x20\x37\x30\ -\x32\x2e\x31\x32\x20\x39\x32\x35\x2e\x35\x30\x20\x5a\x20\x4d\x20\ -\x32\x35\x34\x2e\x34\x35\x20\x39\x31\x39\x2e\x38\x30\x20\x4c\x20\ -\x32\x38\x37\x2e\x39\x33\x20\x31\x30\x32\x35\x2e\x32\x34\x20\x4c\ -\x20\x32\x34\x37\x2e\x31\x36\x20\x31\x30\x32\x35\x2e\x31\x32\x20\ -\x4c\x20\x32\x34\x36\x2e\x30\x34\x20\x31\x30\x31\x38\x2e\x34\x32\ -\x20\x4c\x20\x32\x34\x35\x2e\x32\x30\x20\x31\x30\x31\x30\x2e\x33\ -\x36\x20\x4c\x20\x32\x34\x34\x2e\x37\x34\x20\x31\x30\x30\x30\x2e\ -\x37\x35\x20\x4c\x20\x32\x34\x34\x2e\x37\x30\x20\x39\x38\x39\x2e\ -\x34\x30\x20\x4c\x20\x32\x34\x35\x2e\x31\x38\x20\x39\x37\x36\x2e\ -\x30\x38\x20\x4c\x20\x32\x34\x36\x2e\x32\x35\x20\x39\x36\x30\x2e\ -\x35\x37\x20\x4c\x20\x32\x34\x38\x2e\x30\x31\x20\x39\x34\x32\x2e\ -\x36\x34\x20\x4c\x20\x32\x35\x30\x2e\x35\x36\x20\x39\x32\x32\x2e\ -\x30\x33\x20\x4c\x20\x32\x35\x34\x2e\x34\x35\x20\x39\x31\x39\x2e\ -\x38\x30\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x33\x63\x36\x64\ -\x62\x38\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\ -\x76\x65\x6e\x6f\x64\x64\x22\x20\x67\x72\x6f\x75\x70\x2d\x69\x64\ -\x3d\x22\x31\x22\x20\x69\x64\x3d\x22\xe5\xbd\xa2\xe7\x8a\xb6\xe7\ -\xbb\x93\xe5\x90\x88\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\ -\x31\x33\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\ -\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\ -\x31\x30\x36\x2e\x37\x30\x36\x34\x38\x22\x20\x74\x61\x72\x67\x65\ -\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x34\x36\x32\x2e\x38\x34\x37\ -\x32\x33\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x32\x34\ -\x34\x2e\x36\x39\x39\x36\x36\x22\x20\x74\x61\x72\x67\x65\x74\x2d\ -\x79\x3d\x22\x39\x31\x39\x2e\x38\x30\x30\x39\x36\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\ -\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x36\x39\x35\x2e\x35\x33\ -\x20\x39\x31\x38\x2e\x33\x30\x20\x4c\x20\x36\x39\x37\x2e\x39\x35\ -\x20\x39\x34\x35\x2e\x30\x38\x20\x4c\x20\x36\x39\x39\x2e\x34\x34\ -\x20\x39\x36\x37\x2e\x32\x30\x20\x4c\x20\x37\x30\x30\x2e\x31\x34\ -\x20\x39\x38\x35\x2e\x32\x34\x20\x4c\x20\x37\x30\x30\x2e\x32\x31\ -\x20\x39\x39\x39\x2e\x37\x34\x20\x4c\x20\x36\x39\x39\x2e\x37\x37\ -\x20\x31\x30\x31\x31\x2e\x32\x32\x20\x4c\x20\x36\x39\x38\x2e\x39\ -\x33\x20\x31\x30\x32\x30\x2e\x31\x33\x20\x4c\x20\x36\x39\x37\x2e\ -\x38\x30\x20\x31\x30\x32\x36\x2e\x38\x39\x20\x4c\x20\x36\x39\x36\ -\x2e\x34\x38\x20\x31\x30\x33\x31\x2e\x39\x31\x20\x4c\x20\x36\x31\ -\x37\x2e\x30\x32\x20\x31\x30\x33\x31\x2e\x39\x36\x20\x4c\x20\x36\ -\x31\x37\x2e\x30\x32\x20\x38\x39\x38\x2e\x38\x30\x20\x4c\x20\x36\ -\x31\x38\x2e\x34\x30\x20\x38\x39\x36\x2e\x38\x32\x20\x4c\x20\x36\ -\x32\x30\x2e\x31\x38\x20\x38\x39\x35\x2e\x31\x39\x20\x4c\x20\x36\ -\x32\x32\x2e\x34\x30\x20\x38\x39\x33\x2e\x38\x39\x20\x4c\x20\x36\ -\x32\x35\x2e\x31\x36\x20\x38\x39\x32\x2e\x39\x32\x20\x4c\x20\x36\ -\x32\x38\x2e\x35\x38\x20\x38\x39\x32\x2e\x33\x34\x20\x4c\x20\x36\ -\x33\x32\x2e\x37\x38\x20\x38\x39\x32\x2e\x32\x32\x20\x4c\x20\x36\ -\x33\x37\x2e\x39\x33\x20\x38\x39\x32\x2e\x36\x36\x20\x4c\x20\x36\ -\x34\x32\x2e\x36\x31\x20\x38\x39\x33\x2e\x35\x39\x20\x4c\x20\x36\ -\x34\x38\x2e\x37\x38\x20\x38\x39\x35\x2e\x34\x36\x20\x4c\x20\x36\ -\x35\x36\x2e\x37\x38\x20\x38\x39\x38\x2e\x35\x35\x20\x4c\x20\x36\ -\x36\x36\x2e\x39\x36\x20\x39\x30\x33\x2e\x31\x36\x20\x4c\x20\x36\ -\x37\x39\x2e\x37\x33\x20\x39\x30\x39\x2e\x36\x32\x20\x4c\x20\x36\ -\x39\x35\x2e\x35\x33\x20\x39\x31\x38\x2e\x33\x30\x20\x5a\x20\x4d\ -\x20\x32\x35\x36\x2e\x36\x38\x20\x39\x31\x38\x2e\x33\x30\x20\x4c\ -\x20\x32\x35\x34\x2e\x32\x37\x20\x39\x34\x35\x2e\x30\x38\x20\x4c\ -\x20\x32\x35\x32\x2e\x37\x38\x20\x39\x36\x37\x2e\x32\x30\x20\x4c\ -\x20\x32\x35\x32\x2e\x30\x37\x20\x39\x38\x35\x2e\x32\x34\x20\x4c\ -\x20\x32\x35\x32\x2e\x30\x30\x20\x39\x39\x39\x2e\x37\x34\x20\x4c\ -\x20\x32\x35\x32\x2e\x34\x35\x20\x31\x30\x31\x31\x2e\x32\x32\x20\ -\x4c\x20\x32\x35\x33\x2e\x32\x39\x20\x31\x30\x32\x30\x2e\x31\x33\ -\x20\x4c\x20\x32\x35\x34\x2e\x34\x31\x20\x31\x30\x32\x36\x2e\x38\ -\x39\x20\x4c\x20\x32\x35\x35\x2e\x37\x33\x20\x31\x30\x33\x31\x2e\ -\x39\x31\x20\x4c\x20\x33\x33\x35\x2e\x31\x39\x20\x31\x30\x33\x31\ -\x2e\x39\x36\x20\x4c\x20\x33\x33\x35\x2e\x31\x39\x20\x38\x39\x38\ -\x2e\x38\x30\x20\x4c\x20\x33\x33\x33\x2e\x38\x31\x20\x38\x39\x36\ -\x2e\x38\x32\x20\x4c\x20\x33\x33\x32\x2e\x30\x34\x20\x38\x39\x35\ -\x2e\x31\x39\x20\x4c\x20\x33\x32\x39\x2e\x38\x31\x20\x38\x39\x33\ -\x2e\x38\x39\x20\x4c\x20\x33\x32\x37\x2e\x30\x35\x20\x38\x39\x32\ -\x2e\x39\x32\x20\x4c\x20\x33\x32\x33\x2e\x36\x34\x20\x38\x39\x32\ -\x2e\x33\x34\x20\x4c\x20\x33\x31\x39\x2e\x34\x33\x20\x38\x39\x32\ -\x2e\x32\x32\x20\x4c\x20\x33\x31\x34\x2e\x32\x38\x20\x38\x39\x32\ -\x2e\x36\x36\x20\x4c\x20\x33\x30\x39\x2e\x36\x30\x20\x38\x39\x33\ -\x2e\x35\x39\x20\x4c\x20\x33\x30\x33\x2e\x34\x33\x20\x38\x39\x35\ -\x2e\x34\x36\x20\x4c\x20\x32\x39\x35\x2e\x34\x34\x20\x38\x39\x38\ -\x2e\x35\x35\x20\x4c\x20\x32\x38\x35\x2e\x32\x35\x20\x39\x30\x33\ -\x2e\x31\x36\x20\x4c\x20\x32\x37\x32\x2e\x34\x38\x20\x39\x30\x39\ -\x2e\x36\x32\x20\x4c\x20\x32\x35\x36\x2e\x36\x38\x20\x39\x31\x38\ -\x2e\x33\x30\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x39\x30\x36\ -\x32\x33\x64\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\ -\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x67\x72\x6f\x75\x70\x2d\x69\ -\x64\x3d\x22\x31\x22\x20\x69\x64\x3d\x22\xe5\xbd\xa2\xe7\x8a\xb6\ -\xe7\xbb\x93\xe5\x90\x88\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\ -\x22\x31\x34\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\ -\x65\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\ -\x22\x31\x33\x39\x2e\x37\x33\x39\x38\x22\x20\x74\x61\x72\x67\x65\ -\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x34\x34\x38\x2e\x32\x30\x35\ -\x38\x37\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x32\x35\ -\x32\x2e\x30\x30\x34\x35\x32\x22\x20\x74\x61\x72\x67\x65\x74\x2d\ -\x79\x3d\x22\x38\x39\x32\x2e\x32\x31\x35\x35\x22\x3e\x3c\x2f\x70\ -\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x3c\x70\ -\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x36\x32\x35\x2e\x38\x37\x20\ -\x39\x30\x30\x2e\x35\x34\x20\x4c\x20\x36\x32\x36\x2e\x31\x31\x20\ -\x39\x31\x36\x2e\x31\x38\x20\x4c\x20\x36\x32\x36\x2e\x33\x37\x20\ -\x39\x33\x37\x2e\x36\x33\x20\x4c\x20\x36\x32\x36\x2e\x34\x37\x20\ -\x39\x36\x32\x2e\x34\x31\x20\x4c\x20\x36\x32\x36\x2e\x32\x37\x20\ -\x39\x38\x38\x2e\x30\x34\x20\x4c\x20\x36\x32\x36\x2e\x30\x30\x20\ -\x31\x30\x30\x30\x2e\x35\x37\x20\x4c\x20\x36\x32\x35\x2e\x35\x39\ -\x20\x31\x30\x31\x32\x2e\x30\x34\x20\x4c\x20\x36\x32\x35\x2e\x30\ -\x30\x20\x31\x30\x32\x32\x2e\x39\x38\x20\x4c\x20\x36\x32\x34\x2e\ -\x32\x37\x20\x31\x30\x33\x31\x2e\x39\x34\x20\x4c\x20\x36\x31\x37\ -\x2e\x30\x32\x20\x31\x30\x33\x31\x2e\x39\x36\x20\x4c\x20\x36\x31\ -\x37\x2e\x30\x32\x20\x38\x39\x38\x2e\x38\x30\x20\x4c\x20\x36\x31\ -\x38\x2e\x32\x35\x20\x38\x39\x37\x2e\x30\x30\x20\x4c\x20\x36\x31\ -\x39\x2e\x37\x39\x20\x38\x39\x35\x2e\x34\x39\x20\x4c\x20\x36\x32\ -\x31\x2e\x36\x38\x20\x38\x39\x34\x2e\x32\x34\x20\x4c\x20\x36\x32\ -\x33\x2e\x39\x38\x20\x38\x39\x33\x2e\x32\x37\x20\x4c\x20\x36\x32\ -\x34\x2e\x39\x31\x20\x38\x39\x36\x2e\x34\x39\x20\x4c\x20\x36\x32\ -\x35\x2e\x38\x37\x20\x39\x30\x30\x2e\x35\x34\x20\x5a\x20\x4d\x20\ -\x33\x32\x36\x2e\x33\x34\x20\x39\x30\x30\x2e\x35\x34\x20\x4c\x20\ -\x33\x32\x36\x2e\x31\x30\x20\x39\x31\x36\x2e\x31\x38\x20\x4c\x20\ -\x33\x32\x35\x2e\x38\x35\x20\x39\x33\x37\x2e\x36\x33\x20\x4c\x20\ -\x33\x32\x35\x2e\x37\x34\x20\x39\x36\x32\x2e\x34\x31\x20\x4c\x20\ -\x33\x32\x35\x2e\x39\x34\x20\x39\x38\x38\x2e\x30\x34\x20\x4c\x20\ -\x33\x32\x36\x2e\x32\x32\x20\x31\x30\x30\x30\x2e\x35\x37\x20\x4c\ -\x20\x33\x32\x36\x2e\x36\x32\x20\x31\x30\x31\x32\x2e\x30\x34\x20\ -\x4c\x20\x33\x32\x37\x2e\x32\x31\x20\x31\x30\x32\x32\x2e\x39\x38\ -\x20\x4c\x20\x33\x32\x37\x2e\x39\x34\x20\x31\x30\x33\x31\x2e\x39\ -\x34\x20\x4c\x20\x33\x33\x35\x2e\x31\x39\x20\x31\x30\x33\x31\x2e\ -\x39\x36\x20\x4c\x20\x33\x33\x35\x2e\x31\x39\x20\x38\x39\x38\x2e\ -\x38\x30\x20\x4c\x20\x33\x33\x33\x2e\x39\x37\x20\x38\x39\x37\x2e\ -\x30\x30\x20\x4c\x20\x33\x33\x32\x2e\x34\x33\x20\x38\x39\x35\x2e\ -\x34\x39\x20\x4c\x20\x33\x33\x30\x2e\x35\x33\x20\x38\x39\x34\x2e\ -\x32\x34\x20\x4c\x20\x33\x32\x38\x2e\x32\x33\x20\x38\x39\x33\x2e\ -\x32\x37\x20\x4c\x20\x33\x32\x37\x2e\x33\x31\x20\x38\x39\x36\x2e\ -\x34\x39\x20\x4c\x20\x33\x32\x36\x2e\x33\x34\x20\x39\x30\x30\x2e\ -\x35\x34\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x36\x30\x34\x36\ -\x33\x30\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\ -\x76\x65\x6e\x6f\x64\x64\x22\x20\x67\x72\x6f\x75\x70\x2d\x69\x64\ -\x3d\x22\x31\x22\x20\x69\x64\x3d\x22\xe5\xbd\xa2\xe7\x8a\xb6\xe7\ -\xbb\x93\xe5\x90\x88\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\ -\x31\x35\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\ -\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\ -\x31\x33\x38\x2e\x36\x38\x39\x30\x33\x22\x20\x74\x61\x72\x67\x65\ -\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x33\x30\x30\x2e\x37\x33\x34\ -\x36\x32\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x33\x32\ -\x35\x2e\x37\x34\x30\x31\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x79\ -\x3d\x22\x38\x39\x33\x2e\x32\x36\x36\x33\x22\x3e\x3c\x2f\x70\x61\ -\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x2f\x67\x3e\x0d\x0a\x20\ -\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x35\x32\ -\x33\x2e\x30\x33\x20\x38\x37\x31\x2e\x34\x30\x20\x43\x20\x35\x31\ -\x31\x2e\x32\x38\x20\x38\x39\x32\x2e\x30\x35\x20\x34\x39\x32\x2e\ -\x37\x35\x20\x39\x31\x30\x2e\x32\x35\x20\x34\x36\x37\x2e\x34\x31\ -\x20\x39\x32\x36\x2e\x30\x30\x20\x43\x20\x34\x33\x35\x2e\x33\x36\ -\x20\x39\x30\x31\x2e\x37\x33\x20\x34\x32\x30\x2e\x38\x34\x20\x38\ -\x38\x31\x2e\x34\x30\x20\x34\x32\x33\x2e\x38\x36\x20\x38\x36\x35\ -\x2e\x30\x32\x20\x43\x20\x34\x31\x38\x2e\x37\x39\x20\x38\x35\x36\ -\x2e\x37\x34\x20\x34\x31\x38\x2e\x37\x39\x20\x38\x33\x39\x2e\x36\ -\x35\x20\x34\x32\x33\x2e\x38\x36\x20\x38\x31\x33\x2e\x37\x36\x20\ -\x43\x20\x33\x39\x30\x2e\x30\x38\x20\x38\x32\x32\x2e\x32\x33\x20\ -\x33\x36\x33\x2e\x39\x38\x20\x38\x33\x30\x2e\x36\x34\x20\x33\x34\ -\x35\x2e\x35\x37\x20\x38\x33\x38\x2e\x39\x38\x20\x43\x20\x33\x31\ -\x37\x2e\x39\x34\x20\x38\x35\x31\x2e\x34\x39\x20\x32\x37\x30\x2e\ -\x33\x34\x20\x38\x38\x31\x2e\x37\x35\x20\x32\x39\x36\x2e\x38\x38\ -\x20\x39\x30\x37\x2e\x36\x35\x20\x43\x20\x33\x30\x31\x2e\x33\x30\ -\x20\x39\x31\x31\x2e\x34\x34\x20\x33\x30\x38\x2e\x39\x31\x20\x39\ -\x30\x36\x2e\x35\x39\x20\x33\x31\x35\x2e\x37\x33\x20\x39\x30\x36\ -\x2e\x33\x32\x20\x43\x20\x33\x32\x39\x2e\x31\x32\x20\x39\x30\x35\ -\x2e\x30\x34\x20\x33\x33\x39\x2e\x30\x34\x20\x39\x30\x36\x2e\x33\ -\x32\x20\x33\x34\x34\x2e\x30\x38\x20\x39\x30\x38\x2e\x32\x32\x20\ -\x43\x20\x33\x38\x33\x2e\x32\x37\x20\x39\x32\x30\x2e\x39\x37\x20\ -\x34\x31\x37\x2e\x31\x34\x20\x39\x33\x38\x2e\x38\x31\x20\x34\x35\ -\x39\x2e\x30\x30\x20\x39\x37\x37\x2e\x33\x36\x20\x43\x20\x34\x36\ -\x36\x2e\x31\x37\x20\x39\x38\x33\x2e\x33\x30\x20\x34\x37\x33\x2e\ -\x39\x38\x20\x39\x38\x33\x2e\x33\x30\x20\x34\x38\x32\x2e\x34\x34\ -\x20\x39\x37\x37\x2e\x33\x36\x20\x43\x20\x35\x32\x36\x2e\x34\x30\ -\x20\x39\x33\x31\x2e\x36\x38\x20\x35\x37\x33\x2e\x32\x34\x20\x39\ -\x30\x36\x2e\x30\x36\x20\x36\x32\x32\x2e\x39\x39\x20\x39\x30\x30\ -\x2e\x35\x30\x20\x43\x20\x36\x32\x39\x2e\x38\x38\x20\x38\x39\x39\ -\x2e\x37\x31\x20\x36\x34\x31\x2e\x39\x39\x20\x39\x30\x30\x2e\x36\ -\x36\x20\x36\x35\x34\x2e\x39\x38\x20\x39\x30\x32\x2e\x32\x35\x20\ -\x43\x20\x36\x36\x33\x2e\x35\x33\x20\x39\x30\x35\x2e\x30\x36\x20\ -\x36\x36\x35\x2e\x32\x31\x20\x39\x30\x36\x2e\x37\x38\x20\x36\x36\ -\x38\x2e\x39\x35\x20\x39\x30\x32\x2e\x32\x35\x20\x43\x20\x36\x38\ -\x36\x2e\x30\x36\x20\x38\x37\x35\x2e\x39\x39\x20\x36\x32\x36\x2e\ -\x38\x30\x20\x38\x33\x35\x2e\x39\x36\x20\x35\x37\x38\x2e\x33\x39\ -\x20\x38\x32\x38\x2e\x35\x30\x20\x43\x20\x35\x34\x36\x2e\x31\x32\ -\x20\x38\x32\x33\x2e\x35\x33\x20\x35\x31\x34\x2e\x35\x35\x20\x38\ -\x31\x38\x2e\x34\x33\x20\x34\x38\x33\x2e\x36\x39\x20\x38\x31\x33\ -\x2e\x32\x32\x20\x43\x20\x35\x31\x32\x2e\x36\x32\x20\x38\x33\x32\ -\x2e\x32\x37\x20\x35\x32\x35\x2e\x37\x33\x20\x38\x35\x31\x2e\x36\ -\x36\x20\x35\x32\x33\x2e\x30\x33\x20\x38\x37\x31\x2e\x34\x30\x20\ -\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\ -\x6c\x6c\x3d\x22\x23\x35\x61\x38\x63\x64\x39\x22\x20\x66\x69\x6c\ -\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\ -\x20\x69\x64\x3d\x22\xe8\x92\x99\xe7\x89\x88\x22\x20\x6e\x6f\x64\ -\x65\x2d\x69\x64\x3d\x22\x31\x36\x22\x20\x73\x74\x72\x6f\x6b\x65\ -\x3d\x22\x6e\x6f\x6e\x65\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x68\ -\x65\x69\x67\x68\x74\x3d\x22\x31\x37\x30\x2e\x30\x37\x38\x36\x31\ -\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\ -\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x34\x31\x35\x2e\x37\ -\x31\x39\x31\x32\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\ -\x32\x37\x30\x2e\x33\x33\x36\x39\x22\x20\x74\x61\x72\x67\x65\x74\ -\x2d\x79\x3d\x22\x38\x31\x33\x2e\x32\x32\x30\x36\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\ -\x20\x64\x3d\x22\x4d\x20\x33\x30\x33\x2e\x39\x37\x20\x39\x30\x30\ -\x2e\x34\x30\x20\x4c\x20\x33\x30\x35\x2e\x37\x32\x20\x39\x30\x30\ -\x2e\x32\x39\x20\x43\x20\x33\x31\x32\x2e\x37\x33\x20\x38\x39\x39\ -\x2e\x37\x33\x20\x33\x32\x33\x2e\x31\x37\x20\x39\x30\x31\x2e\x38\ -\x31\x20\x33\x33\x37\x2e\x30\x34\x20\x39\x30\x36\x2e\x35\x33\x20\ -\x43\x20\x33\x33\x32\x2e\x32\x38\x20\x39\x30\x35\x2e\x38\x32\x20\ -\x33\x32\x36\x2e\x30\x33\x20\x39\x30\x35\x2e\x35\x35\x20\x33\x31\ -\x38\x2e\x35\x38\x20\x39\x30\x36\x2e\x30\x38\x20\x4c\x20\x33\x31\ -\x35\x2e\x37\x33\x20\x39\x30\x36\x2e\x33\x32\x20\x43\x20\x33\x31\ -\x34\x2e\x33\x37\x20\x39\x30\x36\x2e\x33\x37\x20\x33\x31\x32\x2e\ -\x39\x37\x20\x39\x30\x36\x2e\x36\x31\x20\x33\x31\x31\x2e\x35\x38\ -\x20\x39\x30\x36\x2e\x39\x32\x20\x4c\x20\x33\x30\x36\x2e\x30\x37\ -\x20\x39\x30\x38\x2e\x33\x35\x20\x43\x20\x33\x30\x32\x2e\x35\x30\ -\x20\x39\x30\x39\x2e\x32\x34\x20\x32\x39\x39\x2e\x32\x34\x20\x39\ -\x30\x39\x2e\x36\x37\x20\x32\x39\x36\x2e\x38\x38\x20\x39\x30\x37\ -\x2e\x36\x35\x20\x43\x20\x32\x39\x32\x2e\x32\x34\x20\x39\x30\x33\ -\x2e\x31\x33\x20\x32\x38\x39\x2e\x38\x36\x20\x38\x39\x38\x2e\x34\ -\x36\x20\x32\x38\x39\x2e\x32\x35\x20\x38\x39\x33\x2e\x37\x39\x20\ -\x43\x20\x32\x39\x31\x2e\x36\x38\x20\x38\x39\x38\x2e\x34\x35\x20\ -\x32\x39\x36\x2e\x35\x39\x20\x39\x30\x30\x2e\x36\x35\x20\x33\x30\ -\x33\x2e\x39\x37\x20\x39\x30\x30\x2e\x34\x30\x20\x5a\x20\x4d\x20\ -\x36\x37\x30\x2e\x31\x30\x20\x38\x38\x33\x2e\x34\x35\x20\x43\x20\ -\x36\x37\x32\x2e\x37\x38\x20\x38\x39\x30\x2e\x30\x35\x20\x36\x37\ -\x32\x2e\x37\x31\x20\x38\x39\x36\x2e\x34\x38\x20\x36\x36\x38\x2e\ -\x39\x35\x20\x39\x30\x32\x2e\x32\x35\x20\x43\x20\x36\x36\x36\x2e\ -\x35\x33\x20\x39\x30\x35\x2e\x31\x38\x20\x36\x36\x34\x2e\x39\x37\ -\x20\x39\x30\x35\x2e\x35\x30\x20\x36\x36\x31\x2e\x38\x36\x20\x39\ -\x30\x34\x2e\x35\x39\x20\x4c\x20\x36\x35\x39\x2e\x39\x39\x20\x39\ -\x30\x33\x2e\x39\x39\x20\x4c\x20\x36\x35\x39\x2e\x39\x39\x20\x39\ -\x30\x33\x2e\x39\x39\x20\x4c\x20\x36\x35\x36\x2e\x34\x32\x20\x39\ -\x30\x32\x2e\x37\x33\x20\x43\x20\x36\x35\x35\x2e\x39\x36\x20\x39\ -\x30\x32\x2e\x35\x37\x20\x36\x35\x35\x2e\x34\x38\x20\x39\x30\x32\ -\x2e\x34\x31\x20\x36\x35\x34\x2e\x39\x38\x20\x39\x30\x32\x2e\x32\ -\x35\x20\x4c\x20\x36\x34\x39\x2e\x34\x38\x20\x39\x30\x31\x2e\x36\ -\x31\x20\x43\x20\x36\x34\x38\x2e\x35\x38\x20\x39\x30\x31\x2e\x35\ -\x31\x20\x36\x34\x37\x2e\x36\x38\x20\x39\x30\x31\x2e\x34\x32\x20\ -\x36\x34\x36\x2e\x37\x39\x20\x39\x30\x31\x2e\x33\x33\x20\x4c\x20\ -\x36\x34\x31\x2e\x36\x30\x20\x39\x30\x30\x2e\x38\x34\x20\x43\x20\ -\x36\x34\x30\x2e\x37\x35\x20\x39\x30\x30\x2e\x37\x37\x20\x36\x33\ -\x39\x2e\x39\x32\x20\x39\x30\x30\x2e\x37\x31\x20\x36\x33\x39\x2e\ -\x31\x31\x20\x39\x30\x30\x2e\x36\x35\x20\x4c\x20\x36\x33\x34\x2e\ -\x33\x38\x20\x39\x30\x30\x2e\x33\x36\x20\x43\x20\x36\x32\x39\x2e\ -\x38\x35\x20\x39\x30\x30\x2e\x31\x34\x20\x36\x32\x35\x2e\x39\x34\ -\x20\x39\x30\x30\x2e\x31\x36\x20\x36\x32\x32\x2e\x39\x39\x20\x39\ -\x30\x30\x2e\x35\x30\x20\x43\x20\x36\x31\x34\x2e\x34\x39\x20\x39\ -\x30\x31\x2e\x34\x34\x20\x36\x30\x36\x2e\x30\x38\x20\x39\x30\x32\ -\x2e\x39\x38\x20\x35\x39\x37\x2e\x37\x36\x20\x39\x30\x35\x2e\x31\ -\x30\x20\x43\x20\x36\x32\x32\x2e\x39\x38\x20\x38\x39\x36\x2e\x30\ -\x31\x20\x36\x34\x31\x2e\x34\x30\x20\x38\x39\x32\x2e\x37\x34\x20\ -\x36\x35\x33\x2e\x30\x33\x20\x38\x39\x35\x2e\x32\x38\x20\x4c\x20\ -\x36\x35\x34\x2e\x35\x38\x20\x38\x39\x35\x2e\x36\x36\x20\x43\x20\ -\x36\x36\x31\x2e\x34\x39\x20\x38\x39\x37\x2e\x35\x39\x20\x36\x36\ -\x36\x2e\x34\x37\x20\x38\x39\x34\x2e\x31\x34\x20\x36\x36\x39\x2e\ -\x35\x31\x20\x38\x38\x35\x2e\x32\x39\x20\x4c\x20\x36\x37\x30\x2e\ -\x31\x30\x20\x38\x38\x33\x2e\x34\x35\x20\x5a\x22\x0d\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x35\ -\x61\x38\x63\x64\x39\x22\x20\x66\x69\x6c\x6c\x2d\x6f\x70\x61\x63\ -\x69\x74\x79\x3d\x22\x30\x2e\x35\x22\x20\x66\x69\x6c\x6c\x2d\x72\ -\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x67\x72\ -\x6f\x75\x70\x2d\x69\x64\x3d\x22\x32\x22\x20\x69\x64\x3d\x22\xe5\ -\xbd\xa2\xe7\x8a\xb6\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\ -\x31\x37\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\ -\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\ -\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x36\x2e\x32\ -\x32\x33\x36\x39\x34\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x77\x69\ -\x64\x74\x68\x3d\x22\x33\x38\x33\x2e\x35\x32\x37\x39\x35\x22\x20\ -\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x32\x38\x39\x2e\x32\x35\ -\x32\x33\x32\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x38\ -\x38\x33\x2e\x34\x34\x39\x31\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\ -\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\ -\x20\x35\x32\x33\x2e\x30\x31\x20\x39\x31\x36\x2e\x31\x33\x20\x43\ -\x20\x35\x32\x33\x2e\x30\x31\x20\x39\x31\x38\x2e\x32\x35\x20\x35\ -\x32\x31\x2e\x30\x30\x20\x39\x31\x39\x2e\x39\x37\x20\x35\x31\x38\ -\x2e\x35\x33\x20\x39\x31\x39\x2e\x39\x37\x20\x43\x20\x35\x31\x36\ -\x2e\x30\x36\x20\x39\x31\x39\x2e\x39\x37\x20\x35\x31\x34\x2e\x30\ -\x35\x20\x39\x31\x38\x2e\x32\x35\x20\x35\x31\x34\x2e\x30\x35\x20\ -\x39\x31\x36\x2e\x31\x33\x20\x43\x20\x35\x31\x34\x2e\x30\x35\x20\ -\x39\x31\x34\x2e\x30\x31\x20\x35\x31\x36\x2e\x30\x36\x20\x39\x31\ -\x32\x2e\x32\x39\x20\x35\x31\x38\x2e\x35\x33\x20\x39\x31\x32\x2e\ -\x32\x39\x20\x43\x20\x35\x32\x31\x2e\x30\x30\x20\x39\x31\x32\x2e\ -\x32\x39\x20\x35\x32\x33\x2e\x30\x31\x20\x39\x31\x34\x2e\x30\x31\ -\x20\x35\x32\x33\x2e\x30\x31\x20\x39\x31\x36\x2e\x31\x33\x20\x5a\ -\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\ -\x6c\x3d\x22\x23\x32\x61\x33\x35\x34\x37\x22\x20\x66\x69\x6c\x6c\ -\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\ -\x69\x64\x3d\x22\xe6\xa4\xad\xe5\x9c\x86\xe5\xbd\xa2\x22\x20\x6e\ -\x6f\x64\x65\x2d\x69\x64\x3d\x22\x31\x38\x22\x20\x73\x74\x72\x6f\ -\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\x20\x74\x61\x72\x67\x65\x74\ -\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x37\x2e\x36\x37\x36\x32\x30\ -\x38\x35\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\ -\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x38\x2e\x39\ -\x35\x35\x35\x36\x36\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\ -\x22\x35\x31\x34\x2e\x30\x35\x31\x39\x34\x22\x20\x74\x61\x72\x67\ -\x65\x74\x2d\x79\x3d\x22\x39\x31\x32\x2e\x32\x39\x30\x39\x22\x3e\ -\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\ -\x74\x68\x20\x64\x3d\x22\x4d\x20\x35\x31\x35\x2e\x36\x31\x20\x39\ -\x31\x35\x2e\x33\x33\x20\x4c\x20\x35\x31\x35\x2e\x36\x31\x20\x31\ -\x30\x31\x30\x2e\x39\x34\x20\x4c\x20\x35\x32\x31\x2e\x38\x38\x20\ -\x31\x30\x31\x30\x2e\x39\x34\x20\x4c\x20\x35\x32\x31\x2e\x38\x38\ -\x20\x39\x31\x35\x2e\x33\x33\x20\x43\x20\x35\x32\x31\x2e\x38\x38\ -\x20\x39\x31\x34\x2e\x33\x36\x20\x35\x32\x30\x2e\x38\x33\x20\x39\ -\x31\x33\x2e\x38\x37\x20\x35\x31\x38\x2e\x37\x35\x20\x39\x31\x33\ -\x2e\x38\x37\x20\x43\x20\x35\x31\x36\x2e\x36\x36\x20\x39\x31\x33\ -\x2e\x38\x37\x20\x35\x31\x35\x2e\x36\x31\x20\x39\x31\x34\x2e\x33\ -\x36\x20\x35\x31\x35\x2e\x36\x31\x20\x39\x31\x35\x2e\x33\x33\x20\ -\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\ -\x6c\x6c\x3d\x22\x23\x32\x62\x34\x64\x38\x32\x22\x20\x66\x69\x6c\ -\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\ -\x20\x69\x64\x3d\x22\xe8\xb7\xaf\xe5\xbe\x84\x2d\x34\x31\x22\x20\ -\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x31\x39\x22\x20\x73\x74\x72\ -\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\x20\x74\x61\x72\x67\x65\ -\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x39\x37\x2e\x30\x37\x34\ -\x32\x32\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\ -\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x36\x2e\x32\ -\x36\x35\x38\x30\x38\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\ -\x22\x35\x31\x35\x2e\x36\x31\x33\x30\x34\x22\x20\x74\x61\x72\x67\ -\x65\x74\x2d\x79\x3d\x22\x39\x31\x33\x2e\x38\x36\x39\x38\x22\x3e\ -\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\ -\x74\x68\x20\x64\x3d\x22\x4d\x20\x35\x31\x37\x2e\x33\x38\x20\x31\ -\x30\x30\x36\x2e\x37\x35\x20\x4c\x20\x35\x32\x30\x2e\x30\x36\x20\ -\x31\x30\x30\x36\x2e\x37\x35\x20\x4c\x20\x35\x32\x30\x2e\x30\x36\ -\x20\x31\x30\x32\x32\x2e\x31\x30\x20\x4c\x20\x35\x31\x37\x2e\x33\ -\x38\x20\x31\x30\x32\x32\x2e\x31\x30\x20\x5a\x22\x20\x66\x69\x6c\ -\x6c\x3d\x22\x23\x32\x61\x33\x35\x34\x37\x22\x20\x66\x69\x6c\x6c\ -\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x0d\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\xe7\ -\x9f\xa9\xe5\xbd\xa2\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\ -\x32\x30\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\ -\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\ -\x22\x31\x35\x2e\x33\x35\x32\x34\x31\x37\x22\x20\x74\x61\x72\x67\ -\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x32\x2e\x36\x38\x36\x36\ -\x34\x35\x35\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x35\ -\x31\x37\x2e\x33\x37\x37\x35\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x31\x30\ -\x30\x36\x2e\x37\x34\x35\x32\x34\x22\x3e\x3c\x2f\x70\x61\x74\x68\ -\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\ -\x4d\x20\x35\x32\x35\x2e\x34\x33\x20\x31\x30\x30\x37\x2e\x34\x34\ -\x20\x43\x20\x35\x32\x35\x2e\x34\x33\x20\x31\x30\x31\x31\x2e\x36\ -\x38\x20\x35\x32\x32\x2e\x34\x33\x20\x31\x30\x31\x35\x2e\x31\x32\ -\x20\x35\x31\x38\x2e\x37\x32\x20\x31\x30\x31\x35\x2e\x31\x32\x20\ -\x43\x20\x35\x31\x35\x2e\x30\x31\x20\x31\x30\x31\x35\x2e\x31\x32\ -\x20\x35\x31\x32\x2e\x30\x30\x20\x31\x30\x31\x31\x2e\x36\x38\x20\ -\x35\x31\x32\x2e\x30\x30\x20\x31\x30\x30\x37\x2e\x34\x34\x20\x43\ -\x20\x35\x31\x32\x2e\x30\x30\x20\x31\x30\x30\x33\x2e\x32\x30\x20\ -\x35\x31\x35\x2e\x30\x31\x20\x39\x39\x39\x2e\x37\x36\x20\x35\x31\ -\x38\x2e\x37\x32\x20\x39\x39\x39\x2e\x37\x36\x20\x43\x20\x35\x32\ -\x32\x2e\x34\x33\x20\x39\x39\x39\x2e\x37\x36\x20\x35\x32\x35\x2e\ -\x34\x33\x20\x31\x30\x30\x33\x2e\x32\x30\x20\x35\x32\x35\x2e\x34\ -\x33\x20\x31\x30\x30\x37\x2e\x34\x34\x20\x5a\x22\x0d\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x32\ -\x62\x34\x64\x38\x32\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\ -\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x69\x64\x3d\x22\xe6\ -\xa4\xad\xe5\x9c\x86\xe5\xbd\xa2\x22\x20\x6e\x6f\x64\x65\x2d\x69\ -\x64\x3d\x22\x32\x31\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\ -\x6f\x6e\x65\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\ -\x68\x74\x3d\x22\x31\x35\x2e\x33\x35\x32\x34\x31\x37\x22\x0d\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\x65\x74\ -\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\x33\x2e\x34\x33\x33\x33\x35\ -\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x35\x31\x32\x22\ -\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x39\x39\x39\x2e\x37\ -\x36\x33\x33\x37\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\ -\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x34\x32\ -\x30\x2e\x36\x31\x20\x39\x31\x36\x2e\x31\x33\x20\x43\x20\x34\x32\ -\x30\x2e\x36\x31\x20\x39\x31\x38\x2e\x32\x35\x20\x34\x31\x38\x2e\ -\x36\x30\x20\x39\x31\x39\x2e\x39\x37\x20\x34\x31\x36\x2e\x31\x33\ -\x20\x39\x31\x39\x2e\x39\x37\x20\x43\x20\x34\x31\x33\x2e\x36\x36\ -\x20\x39\x31\x39\x2e\x39\x37\x20\x34\x31\x31\x2e\x36\x35\x20\x39\ -\x31\x38\x2e\x32\x35\x20\x34\x31\x31\x2e\x36\x35\x20\x39\x31\x36\ -\x2e\x31\x33\x20\x43\x20\x34\x31\x31\x2e\x36\x35\x20\x39\x31\x34\ -\x2e\x30\x31\x20\x34\x31\x33\x2e\x36\x36\x20\x39\x31\x32\x2e\x32\ -\x39\x20\x34\x31\x36\x2e\x31\x33\x20\x39\x31\x32\x2e\x32\x39\x20\ -\x43\x20\x34\x31\x38\x2e\x36\x30\x20\x39\x31\x32\x2e\x32\x39\x20\ -\x34\x32\x30\x2e\x36\x31\x20\x39\x31\x34\x2e\x30\x31\x20\x34\x32\ -\x30\x2e\x36\x31\x20\x39\x31\x36\x2e\x31\x33\x20\x5a\x22\x0d\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\ -\x23\x32\x61\x33\x35\x34\x37\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\ -\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x69\x64\x3d\ -\x22\xe6\xa4\xad\xe5\x9c\x86\xe5\xbd\xa2\x22\x20\x6e\x6f\x64\x65\ -\x2d\x69\x64\x3d\x22\x32\x32\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\ -\x22\x6e\x6f\x6e\x65\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\ -\x69\x67\x68\x74\x3d\x22\x37\x2e\x36\x37\x36\x32\x30\x38\x35\x22\ -\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\ -\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x38\x2e\x39\x35\x35\x35\ -\x39\x37\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x34\x31\ -\x31\x2e\x36\x35\x31\x39\x35\x22\x20\x74\x61\x72\x67\x65\x74\x2d\ -\x79\x3d\x22\x39\x31\x32\x2e\x32\x39\x30\x39\x22\x3e\x3c\x2f\x70\ -\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\ -\x64\x3d\x22\x4d\x20\x34\x31\x33\x2e\x32\x31\x20\x39\x31\x35\x2e\ -\x33\x33\x20\x4c\x20\x34\x31\x33\x2e\x32\x31\x20\x31\x30\x31\x30\ -\x2e\x39\x34\x20\x4c\x20\x34\x31\x39\x2e\x34\x38\x20\x31\x30\x31\ -\x30\x2e\x39\x34\x20\x4c\x20\x34\x31\x39\x2e\x34\x38\x20\x39\x31\ -\x35\x2e\x33\x33\x20\x43\x20\x34\x31\x39\x2e\x34\x38\x20\x39\x31\ -\x34\x2e\x33\x36\x20\x34\x31\x38\x2e\x34\x33\x20\x39\x31\x33\x2e\ -\x38\x37\x20\x34\x31\x36\x2e\x33\x35\x20\x39\x31\x33\x2e\x38\x37\ -\x20\x43\x20\x34\x31\x34\x2e\x32\x36\x20\x39\x31\x33\x2e\x38\x37\ -\x20\x34\x31\x33\x2e\x32\x31\x20\x39\x31\x34\x2e\x33\x36\x20\x34\ -\x31\x33\x2e\x32\x31\x20\x39\x31\x35\x2e\x33\x33\x20\x5a\x22\x0d\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\ -\x22\x23\x32\x62\x34\x64\x38\x32\x22\x20\x66\x69\x6c\x6c\x2d\x72\ -\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x69\x64\ -\x3d\x22\xe8\xb7\xaf\xe5\xbe\x84\x2d\x34\x31\x22\x20\x6e\x6f\x64\ -\x65\x2d\x69\x64\x3d\x22\x32\x33\x22\x20\x73\x74\x72\x6f\x6b\x65\ -\x3d\x22\x6e\x6f\x6e\x65\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x68\ -\x65\x69\x67\x68\x74\x3d\x22\x39\x37\x2e\x30\x37\x34\x32\x32\x22\ -\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\ -\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x36\x2e\x32\x36\x35\x37\ -\x37\x37\x36\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x34\ -\x31\x33\x2e\x32\x31\x33\x30\x37\x22\x20\x74\x61\x72\x67\x65\x74\ -\x2d\x79\x3d\x22\x39\x31\x33\x2e\x38\x36\x39\x38\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\ -\x20\x64\x3d\x22\x4d\x20\x34\x31\x34\x2e\x39\x38\x20\x31\x30\x30\ -\x36\x2e\x37\x35\x20\x4c\x20\x34\x31\x37\x2e\x36\x36\x20\x31\x30\ -\x30\x36\x2e\x37\x35\x20\x4c\x20\x34\x31\x37\x2e\x36\x36\x20\x31\ -\x30\x32\x32\x2e\x31\x30\x20\x4c\x20\x34\x31\x34\x2e\x39\x38\x20\ -\x31\x30\x32\x32\x2e\x31\x30\x20\x5a\x22\x20\x66\x69\x6c\x6c\x3d\ -\x22\x23\x32\x61\x33\x35\x34\x37\x22\x20\x66\x69\x6c\x6c\x2d\x72\ -\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x0d\x0a\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x64\x3d\x22\xe7\x9f\xa9\ -\xe5\xbd\xa2\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x32\x34\ -\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\x20\ -\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x31\ -\x35\x2e\x33\x35\x32\x34\x31\x37\x22\x20\x74\x61\x72\x67\x65\x74\ -\x2d\x77\x69\x64\x74\x68\x3d\x22\x32\x2e\x36\x38\x36\x36\x37\x36\ -\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x34\x31\x34\x2e\ -\x39\x37\x37\x35\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x31\x30\x30\x36\x2e\ -\x37\x34\x35\x32\x34\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\ -\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x34\ -\x32\x33\x2e\x30\x33\x20\x31\x30\x30\x37\x2e\x34\x34\x20\x43\x20\ -\x34\x32\x33\x2e\x30\x33\x20\x31\x30\x31\x31\x2e\x36\x38\x20\x34\ -\x32\x30\x2e\x30\x33\x20\x31\x30\x31\x35\x2e\x31\x32\x20\x34\x31\ -\x36\x2e\x33\x32\x20\x31\x30\x31\x35\x2e\x31\x32\x20\x43\x20\x34\ -\x31\x32\x2e\x36\x31\x20\x31\x30\x31\x35\x2e\x31\x32\x20\x34\x30\ -\x39\x2e\x36\x30\x20\x31\x30\x31\x31\x2e\x36\x38\x20\x34\x30\x39\ -\x2e\x36\x30\x20\x31\x30\x30\x37\x2e\x34\x34\x20\x43\x20\x34\x30\ -\x39\x2e\x36\x30\x20\x31\x30\x30\x33\x2e\x32\x30\x20\x34\x31\x32\ -\x2e\x36\x31\x20\x39\x39\x39\x2e\x37\x36\x20\x34\x31\x36\x2e\x33\ -\x32\x20\x39\x39\x39\x2e\x37\x36\x20\x43\x20\x34\x32\x30\x2e\x30\ -\x33\x20\x39\x39\x39\x2e\x37\x36\x20\x34\x32\x33\x2e\x30\x33\x20\ -\x31\x30\x30\x33\x2e\x32\x30\x20\x34\x32\x33\x2e\x30\x33\x20\x31\ -\x30\x30\x37\x2e\x34\x34\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x32\x62\x34\x64\ -\x38\x32\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\ -\x76\x65\x6e\x6f\x64\x64\x22\x20\x69\x64\x3d\x22\xe6\xa4\xad\xe5\ -\x9c\x86\xe5\xbd\xa2\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\ -\x32\x35\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\ -\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\ -\x22\x31\x35\x2e\x33\x35\x32\x34\x31\x37\x22\x0d\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x77\x69\ -\x64\x74\x68\x3d\x22\x31\x33\x2e\x34\x33\x33\x33\x38\x22\x20\x74\ -\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x34\x30\x39\x2e\x36\x22\x20\ -\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x39\x39\x39\x2e\x37\x36\ -\x33\x33\x37\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\ -\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x34\x32\x33\ -\x2e\x38\x32\x20\x38\x34\x33\x2e\x30\x30\x20\x43\x20\x33\x37\x32\ -\x2e\x30\x36\x20\x38\x34\x35\x2e\x30\x39\x20\x33\x31\x33\x2e\x39\ -\x33\x20\x38\x36\x33\x2e\x36\x34\x20\x33\x32\x37\x2e\x39\x34\x20\ -\x38\x38\x32\x2e\x31\x35\x20\x43\x20\x33\x34\x31\x2e\x39\x31\x20\ -\x38\x39\x33\x2e\x37\x30\x20\x33\x36\x37\x2e\x37\x34\x20\x38\x37\ -\x32\x2e\x36\x32\x20\x33\x39\x36\x2e\x30\x32\x20\x38\x39\x30\x2e\ -\x31\x30\x20\x43\x20\x34\x31\x32\x2e\x39\x35\x20\x39\x30\x30\x2e\ -\x35\x37\x20\x34\x31\x36\x2e\x34\x32\x20\x39\x30\x33\x2e\x37\x35\ -\x20\x34\x33\x31\x2e\x39\x37\x20\x39\x31\x38\x2e\x38\x31\x20\x43\ -\x20\x34\x33\x39\x2e\x37\x32\x20\x39\x32\x36\x2e\x33\x33\x20\x34\ -\x35\x34\x2e\x33\x31\x20\x39\x34\x39\x2e\x39\x33\x20\x34\x36\x37\ -\x2e\x35\x33\x20\x39\x34\x39\x2e\x35\x32\x20\x43\x20\x34\x38\x30\ -\x2e\x37\x34\x20\x39\x34\x39\x2e\x31\x31\x20\x34\x39\x33\x2e\x32\ -\x34\x20\x39\x32\x39\x2e\x32\x31\x20\x35\x30\x33\x2e\x35\x36\x20\ -\x39\x31\x39\x2e\x33\x36\x20\x43\x20\x35\x30\x39\x2e\x36\x35\x20\ -\x39\x31\x33\x2e\x35\x34\x20\x35\x33\x30\x2e\x30\x32\x20\x38\x38\ -\x39\x2e\x35\x31\x20\x35\x34\x39\x2e\x33\x31\x20\x38\x38\x32\x2e\ -\x38\x31\x20\x43\x20\x35\x37\x30\x2e\x30\x39\x20\x38\x37\x35\x2e\ -\x35\x39\x20\x35\x38\x32\x2e\x31\x38\x20\x38\x38\x32\x2e\x33\x30\ -\x20\x36\x31\x32\x2e\x35\x36\x20\x38\x38\x31\x2e\x34\x35\x20\x43\ -\x20\x36\x34\x32\x2e\x39\x34\x20\x38\x38\x30\x2e\x35\x39\x20\x36\ -\x31\x30\x2e\x32\x38\x20\x38\x34\x35\x2e\x37\x35\x20\x35\x32\x36\ -\x2e\x31\x34\x20\x38\x34\x33\x2e\x30\x30\x20\x43\x20\x34\x39\x32\ -\x2e\x36\x38\x20\x38\x33\x38\x2e\x38\x32\x20\x34\x38\x30\x2e\x38\ -\x37\x20\x38\x33\x33\x2e\x38\x31\x20\x34\x32\x33\x2e\x38\x32\x20\ -\x38\x34\x33\x2e\x30\x30\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x33\x63\x36\x64\ -\x62\x38\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\ -\x76\x65\x6e\x6f\x64\x64\x22\x20\x69\x64\x3d\x22\xe8\xb7\xaf\xe5\ -\xbe\x84\x2d\x32\x38\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\ -\x32\x36\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\ -\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\ -\x22\x31\x31\x36\x2e\x31\x32\x33\x34\x37\x34\x22\x0d\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x77\ -\x69\x64\x74\x68\x3d\x22\x33\x32\x39\x2e\x30\x31\x34\x37\x37\x22\ -\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x33\x31\x33\x2e\x39\ -\x32\x35\x37\x32\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\ -\x38\x33\x33\x2e\x38\x30\x36\x31\x35\x22\x3e\x3c\x2f\x70\x61\x74\ -\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\ -\x22\x4d\x20\x34\x30\x30\x2e\x32\x39\x20\x38\x32\x38\x2e\x31\x34\ -\x20\x43\x20\x33\x39\x39\x2e\x36\x31\x20\x38\x34\x35\x2e\x38\x33\ -\x20\x34\x30\x30\x2e\x30\x33\x20\x38\x35\x37\x2e\x31\x31\x20\x34\ -\x30\x31\x2e\x35\x37\x20\x38\x36\x31\x2e\x39\x37\x20\x43\x20\x34\ -\x30\x37\x2e\x39\x34\x20\x38\x38\x36\x2e\x30\x37\x20\x34\x33\x35\ -\x2e\x33\x30\x20\x39\x32\x35\x2e\x34\x37\x20\x34\x36\x32\x2e\x36\ -\x30\x20\x39\x32\x34\x2e\x30\x35\x20\x43\x20\x34\x39\x32\x2e\x37\ -\x30\x20\x39\x32\x34\x2e\x37\x34\x20\x35\x32\x31\x2e\x36\x39\x20\ -\x38\x38\x34\x2e\x30\x37\x20\x35\x32\x36\x2e\x31\x38\x20\x38\x36\ -\x31\x2e\x39\x37\x20\x43\x20\x35\x32\x39\x2e\x39\x33\x20\x38\x35\ -\x31\x2e\x31\x31\x20\x35\x32\x34\x2e\x38\x36\x20\x38\x33\x35\x2e\ -\x33\x38\x20\x35\x32\x36\x2e\x38\x37\x20\x38\x32\x38\x2e\x31\x34\ -\x20\x43\x20\x35\x33\x31\x2e\x37\x32\x20\x38\x32\x33\x2e\x35\x32\ -\x20\x35\x31\x31\x2e\x39\x32\x20\x38\x32\x35\x2e\x31\x35\x20\x34\ -\x36\x37\x2e\x34\x37\x20\x38\x33\x33\x2e\x30\x33\x20\x4c\x20\x34\ -\x30\x30\x2e\x32\x39\x20\x38\x32\x38\x2e\x31\x34\x20\x5a\x22\x0d\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\ -\x22\x23\x66\x66\x62\x35\x61\x31\x22\x20\x66\x69\x6c\x6c\x2d\x72\ -\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x69\x64\ -\x3d\x22\xe8\x92\x99\xe7\x89\x88\x22\x20\x6e\x6f\x64\x65\x2d\x69\ -\x64\x3d\x22\x32\x37\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\ -\x6f\x6e\x65\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\ -\x68\x74\x3d\x22\x31\x30\x31\x2e\x39\x35\x32\x36\x34\x22\x0d\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\x65\x74\ -\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\x33\x32\x2e\x31\x31\x32\x38\ -\x35\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x33\x39\x39\ -\x2e\x36\x30\x38\x39\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\ -\x22\x38\x32\x33\x2e\x35\x31\x36\x35\x34\x22\x3e\x3c\x2f\x70\x61\ -\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\ -\x3d\x22\x4d\x20\x35\x30\x35\x2e\x37\x30\x20\x38\x39\x39\x2e\x36\ -\x31\x20\x43\x20\x34\x39\x34\x2e\x34\x33\x20\x39\x31\x32\x2e\x37\ -\x35\x20\x34\x37\x39\x2e\x38\x30\x20\x39\x32\x33\x2e\x34\x31\x20\ -\x34\x36\x34\x2e\x37\x35\x20\x39\x32\x34\x2e\x30\x33\x20\x4c\x20\ -\x34\x36\x32\x2e\x36\x30\x20\x39\x32\x34\x2e\x30\x35\x20\x43\x20\ -\x34\x34\x38\x2e\x37\x37\x20\x39\x32\x34\x2e\x37\x37\x20\x34\x33\ -\x34\x2e\x39\x33\x20\x39\x31\x35\x2e\x30\x32\x20\x34\x32\x33\x2e\ -\x38\x30\x20\x39\x30\x32\x2e\x30\x38\x20\x43\x20\x34\x35\x30\x2e\ -\x37\x36\x20\x39\x30\x38\x2e\x35\x38\x20\x34\x37\x37\x2e\x35\x32\ -\x20\x39\x30\x37\x2e\x39\x33\x20\x35\x30\x34\x2e\x30\x36\x20\x39\ -\x30\x30\x2e\x31\x32\x20\x4c\x20\x35\x30\x35\x2e\x37\x30\x20\x38\ -\x39\x39\x2e\x36\x31\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x66\x66\x66\x66\x66\ -\x66\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\ -\x65\x6e\x6f\x64\x64\x22\x20\x69\x64\x3d\x22\xe8\xb7\xaf\xe5\xbe\ -\x84\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x32\x38\x22\x20\ -\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\x20\x74\x61\ -\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x35\x2e\ -\x31\x35\x37\x32\x38\x38\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\ -\x22\x38\x31\x2e\x38\x39\x35\x39\x39\x36\x22\x20\x74\x61\x72\x67\ -\x65\x74\x2d\x78\x3d\x22\x34\x32\x33\x2e\x38\x30\x34\x33\x38\x22\ -\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x38\x39\x39\x2e\x36\ -\x31\x33\x33\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\ -\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x34\x33\x30\ -\x2e\x36\x34\x20\x38\x33\x30\x2e\x33\x34\x20\x4c\x20\x34\x36\x37\ -\x2e\x34\x37\x20\x38\x33\x33\x2e\x30\x33\x20\x4c\x20\x34\x37\x39\ -\x2e\x32\x33\x20\x38\x33\x30\x2e\x39\x39\x20\x4c\x20\x34\x37\x39\ -\x2e\x32\x33\x20\x38\x33\x30\x2e\x39\x39\x20\x4c\x20\x34\x38\x39\ -\x2e\x37\x32\x20\x38\x32\x39\x2e\x32\x38\x20\x4c\x20\x34\x38\x39\ -\x2e\x37\x32\x20\x38\x32\x39\x2e\x32\x38\x20\x4c\x20\x34\x39\x38\ -\x2e\x39\x32\x20\x38\x32\x37\x2e\x38\x39\x20\x4c\x20\x34\x39\x38\ -\x2e\x39\x32\x20\x38\x32\x37\x2e\x38\x39\x20\x4c\x20\x35\x30\x34\ -\x2e\x39\x39\x20\x38\x32\x37\x2e\x30\x36\x20\x4c\x20\x35\x30\x34\ -\x2e\x39\x39\x20\x38\x32\x37\x2e\x30\x36\x20\x4c\x20\x35\x31\x30\ -\x2e\x33\x33\x20\x38\x32\x36\x2e\x34\x32\x20\x4c\x20\x35\x31\x30\ -\x2e\x33\x33\x20\x38\x32\x36\x2e\x34\x32\x20\x4c\x20\x35\x31\x34\ -\x2e\x39\x36\x20\x38\x32\x35\x2e\x39\x35\x20\x4c\x20\x35\x31\x34\ -\x2e\x39\x36\x20\x38\x32\x35\x2e\x39\x35\x20\x4c\x20\x35\x31\x37\ -\x2e\x36\x34\x20\x38\x32\x35\x2e\x37\x35\x20\x4c\x20\x35\x31\x37\ -\x2e\x36\x34\x20\x38\x32\x35\x2e\x37\x35\x20\x4c\x20\x35\x32\x30\ -\x2e\x30\x30\x20\x38\x32\x35\x2e\x36\x32\x20\x4c\x20\x35\x32\x30\ -\x2e\x30\x30\x20\x38\x32\x35\x2e\x36\x32\x20\x4c\x20\x35\x32\x32\ -\x2e\x39\x35\x20\x38\x32\x35\x2e\x35\x38\x20\x43\x20\x35\x32\x33\ -\x2e\x32\x34\x20\x38\x32\x35\x2e\x35\x39\x20\x35\x32\x33\x2e\x35\ -\x31\x20\x38\x32\x35\x2e\x36\x30\x20\x35\x32\x33\x2e\x37\x37\x20\ -\x38\x32\x35\x2e\x36\x31\x20\x4c\x20\x35\x32\x35\x2e\x31\x37\x20\ -\x38\x32\x35\x2e\x37\x33\x20\x4c\x20\x35\x32\x35\x2e\x31\x37\x20\ -\x38\x32\x35\x2e\x37\x33\x20\x4c\x20\x35\x32\x36\x2e\x32\x36\x20\ -\x38\x32\x35\x2e\x39\x33\x20\x43\x20\x35\x32\x37\x2e\x38\x30\x20\ -\x38\x32\x36\x2e\x33\x33\x20\x35\x32\x38\x2e\x30\x30\x20\x38\x32\ -\x37\x2e\x30\x36\x20\x35\x32\x36\x2e\x38\x37\x20\x38\x32\x38\x2e\ -\x31\x34\x20\x43\x20\x35\x32\x36\x2e\x32\x35\x20\x38\x33\x30\x2e\ -\x34\x30\x20\x35\x32\x36\x2e\x33\x31\x20\x38\x33\x33\x2e\x34\x39\ -\x20\x35\x32\x36\x2e\x35\x38\x20\x38\x33\x37\x2e\x30\x31\x20\x4c\ -\x20\x35\x32\x37\x2e\x31\x38\x20\x38\x34\x33\x2e\x37\x30\x20\x43\ -\x20\x35\x32\x37\x2e\x37\x33\x20\x38\x34\x39\x2e\x38\x39\x20\x35\ -\x32\x38\x2e\x30\x35\x20\x38\x35\x36\x2e\x35\x34\x20\x35\x32\x36\ -\x2e\x31\x38\x20\x38\x36\x31\x2e\x39\x37\x20\x43\x20\x35\x32\x35\ -\x2e\x32\x33\x20\x38\x36\x36\x2e\x36\x32\x20\x35\x32\x33\x2e\x32\ -\x31\x20\x38\x37\x32\x2e\x30\x38\x20\x35\x32\x30\x2e\x33\x32\x20\ -\x38\x37\x37\x2e\x38\x31\x20\x43\x20\x35\x31\x38\x2e\x38\x33\x20\ -\x38\x37\x37\x2e\x39\x34\x20\x35\x31\x37\x2e\x33\x30\x20\x38\x37\ -\x38\x2e\x30\x31\x20\x35\x31\x35\x2e\x37\x32\x20\x38\x37\x38\x2e\ -\x30\x31\x20\x43\x20\x34\x39\x30\x2e\x30\x36\x20\x38\x37\x38\x2e\ -\x30\x31\x20\x34\x35\x34\x2e\x30\x32\x20\x38\x36\x34\x2e\x35\x35\ -\x20\x34\x30\x37\x2e\x35\x37\x20\x38\x33\x37\x2e\x36\x32\x20\x4c\ -\x20\x34\x30\x30\x2e\x31\x32\x20\x38\x33\x33\x2e\x32\x35\x20\x4c\ -\x20\x34\x30\x30\x2e\x31\x35\x20\x38\x33\x32\x2e\x33\x34\x20\x4c\ -\x20\x34\x30\x30\x2e\x31\x35\x20\x38\x33\x32\x2e\x33\x34\x20\x4c\ -\x20\x34\x33\x30\x2e\x36\x34\x20\x38\x33\x30\x2e\x33\x34\x20\x5a\ -\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\ -\x6c\x3d\x22\x23\x66\x35\x39\x38\x37\x66\x22\x20\x66\x69\x6c\x6c\ -\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\ -\x69\x64\x3d\x22\xe8\xb7\xaf\xe5\xbe\x84\x22\x20\x6e\x6f\x64\x65\ -\x2d\x69\x64\x3d\x22\x32\x39\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\ -\x22\x6e\x6f\x6e\x65\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\ -\x69\x67\x68\x74\x3d\x22\x35\x32\x2e\x34\x32\x32\x39\x31\x33\x22\ -\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\ -\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\x32\x37\x2e\x39\x33\ -\x34\x39\x30\x36\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\ -\x34\x30\x30\x2e\x31\x31\x39\x37\x32\x22\x20\x74\x61\x72\x67\x65\ -\x74\x2d\x79\x3d\x22\x38\x32\x35\x2e\x35\x38\x34\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\ -\x20\x64\x3d\x22\x4d\x20\x38\x34\x35\x2e\x32\x32\x20\x33\x35\x36\ -\x2e\x35\x32\x20\x4c\x20\x38\x34\x30\x2e\x38\x38\x20\x33\x36\x34\ -\x2e\x31\x38\x20\x4c\x20\x38\x33\x36\x2e\x33\x34\x20\x33\x37\x31\ -\x2e\x32\x33\x20\x4c\x20\x38\x33\x31\x2e\x36\x30\x20\x33\x37\x37\ -\x2e\x36\x39\x20\x4c\x20\x38\x32\x36\x2e\x36\x36\x20\x33\x38\x33\ -\x2e\x36\x31\x20\x4c\x20\x38\x32\x31\x2e\x33\x32\x20\x33\x38\x39\ -\x2e\x32\x38\x20\x4c\x20\x38\x31\x35\x2e\x37\x39\x20\x33\x39\x34\ -\x2e\x35\x31\x20\x4c\x20\x38\x31\x30\x2e\x30\x37\x20\x33\x39\x39\ -\x2e\x33\x31\x20\x4c\x20\x38\x30\x34\x2e\x31\x37\x20\x34\x30\x33\ -\x2e\x37\x30\x20\x4c\x20\x37\x39\x35\x2e\x39\x32\x20\x34\x30\x39\ -\x2e\x30\x37\x20\x4c\x20\x37\x38\x37\x2e\x33\x38\x20\x34\x31\x33\ -\x2e\x38\x38\x20\x4c\x20\x37\x37\x38\x2e\x35\x31\x20\x34\x31\x38\ -\x2e\x31\x34\x20\x4c\x20\x37\x36\x39\x2e\x34\x32\x20\x34\x32\x31\ -\x2e\x39\x32\x20\x4c\x20\x37\x36\x30\x2e\x30\x38\x20\x34\x32\x35\ -\x2e\x33\x32\x20\x4c\x20\x37\x35\x30\x2e\x34\x37\x20\x34\x32\x38\ -\x2e\x33\x33\x20\x4c\x20\x37\x33\x35\x2e\x38\x33\x20\x34\x33\x32\ -\x2e\x32\x34\x20\x4c\x20\x37\x32\x30\x2e\x38\x31\x20\x34\x33\x35\ -\x2e\x36\x31\x20\x4c\x20\x37\x30\x35\x2e\x36\x33\x20\x34\x33\x38\ -\x2e\x36\x30\x20\x4c\x20\x36\x39\x30\x2e\x33\x31\x20\x34\x34\x31\ -\x2e\x33\x38\x20\x4c\x20\x36\x35\x39\x2e\x37\x33\x20\x34\x34\x36\ -\x2e\x39\x39\x20\x4c\x20\x36\x34\x32\x2e\x39\x32\x20\x34\x35\x30\ -\x2e\x35\x35\x20\x4c\x20\x36\x32\x35\x2e\x32\x36\x20\x34\x35\x34\ -\x2e\x37\x35\x20\x4c\x20\x36\x30\x36\x2e\x37\x33\x20\x34\x35\x39\ -\x2e\x36\x34\x20\x4c\x20\x35\x38\x37\x2e\x32\x39\x20\x34\x36\x35\ -\x2e\x32\x35\x20\x4c\x20\x35\x36\x36\x2e\x38\x39\x20\x34\x37\x31\ -\x2e\x36\x31\x20\x4c\x20\x35\x34\x35\x2e\x35\x31\x20\x34\x37\x38\ -\x2e\x37\x37\x20\x4c\x20\x35\x32\x33\x2e\x31\x31\x20\x34\x38\x36\ -\x2e\x37\x36\x20\x4c\x20\x34\x39\x39\x2e\x36\x33\x20\x34\x39\x35\ -\x2e\x36\x33\x20\x4c\x20\x35\x30\x31\x2e\x37\x36\x20\x34\x37\x38\ -\x2e\x37\x37\x20\x4c\x20\x35\x30\x34\x2e\x32\x36\x20\x34\x36\x33\ -\x2e\x33\x37\x20\x4c\x20\x35\x30\x37\x2e\x31\x30\x20\x34\x34\x39\ -\x2e\x33\x35\x20\x4c\x20\x35\x31\x30\x2e\x32\x34\x20\x34\x33\x36\ -\x2e\x36\x31\x20\x4c\x20\x35\x31\x33\x2e\x36\x36\x20\x34\x32\x35\ -\x2e\x30\x37\x20\x4c\x20\x35\x31\x37\x2e\x33\x32\x20\x34\x31\x34\ -\x2e\x36\x32\x20\x4c\x20\x35\x32\x31\x2e\x32\x30\x20\x34\x30\x35\ -\x2e\x32\x31\x20\x4c\x20\x35\x32\x35\x2e\x32\x39\x20\x33\x39\x36\ -\x2e\x37\x34\x20\x4c\x20\x35\x32\x39\x2e\x35\x37\x20\x33\x38\x39\ -\x2e\x31\x35\x20\x4c\x20\x35\x33\x34\x2e\x30\x32\x20\x33\x38\x32\ -\x2e\x33\x36\x20\x4c\x20\x35\x33\x38\x2e\x36\x33\x20\x33\x37\x36\ -\x2e\x33\x33\x20\x4c\x20\x35\x34\x33\x2e\x34\x31\x20\x33\x37\x30\ -\x2e\x39\x39\x20\x4c\x20\x35\x34\x38\x2e\x33\x36\x20\x33\x36\x36\ -\x2e\x32\x39\x20\x4c\x20\x35\x35\x33\x2e\x34\x38\x20\x33\x36\x32\ -\x2e\x32\x30\x20\x4c\x20\x35\x35\x38\x2e\x37\x38\x20\x33\x35\x38\ -\x2e\x36\x37\x20\x4c\x20\x35\x36\x30\x2e\x37\x37\x20\x33\x35\x37\ -\x2e\x32\x34\x20\x4c\x20\x35\x36\x32\x2e\x32\x34\x20\x33\x35\x35\ -\x2e\x37\x33\x20\x4c\x20\x35\x36\x33\x2e\x32\x38\x20\x33\x35\x34\ -\x2e\x31\x34\x20\x4c\x20\x35\x36\x33\x2e\x39\x34\x20\x33\x35\x32\ -\x2e\x34\x36\x20\x4c\x20\x35\x36\x34\x2e\x33\x35\x20\x33\x35\x30\ -\x2e\x30\x32\x20\x4c\x20\x35\x36\x34\x2e\x32\x39\x20\x33\x34\x37\ -\x2e\x33\x31\x20\x4c\x20\x35\x36\x33\x2e\x37\x31\x20\x33\x34\x34\ -\x2e\x32\x37\x20\x4c\x20\x35\x36\x32\x2e\x32\x33\x20\x33\x33\x39\ -\x2e\x36\x39\x20\x4c\x20\x35\x36\x30\x2e\x30\x31\x20\x33\x33\x34\ -\x2e\x34\x38\x20\x4c\x20\x35\x35\x34\x2e\x37\x34\x20\x33\x32\x33\ -\x2e\x34\x34\x20\x4c\x20\x35\x35\x32\x2e\x31\x32\x20\x33\x31\x37\ -\x2e\x35\x38\x20\x4c\x20\x35\x34\x39\x2e\x38\x31\x20\x33\x31\x31\ -\x2e\x35\x32\x20\x4c\x20\x35\x34\x38\x2e\x35\x35\x20\x33\x30\x37\ -\x2e\x34\x30\x20\x4c\x20\x35\x34\x37\x2e\x36\x35\x20\x33\x30\x33\ -\x2e\x32\x36\x20\x4c\x20\x35\x34\x37\x2e\x31\x30\x20\x32\x39\x39\ -\x2e\x30\x39\x20\x4c\x20\x35\x34\x37\x2e\x30\x32\x20\x32\x39\x34\ -\x2e\x39\x31\x20\x4c\x20\x35\x34\x37\x2e\x34\x39\x20\x32\x39\x30\ -\x2e\x37\x33\x20\x4c\x20\x35\x34\x38\x2e\x35\x34\x20\x32\x38\x36\ -\x2e\x35\x30\x20\x4c\x20\x35\x34\x39\x2e\x37\x30\x20\x32\x38\x33\ -\x2e\x34\x39\x20\x4c\x20\x35\x35\x31\x2e\x33\x31\x20\x32\x38\x30\ -\x2e\x34\x33\x20\x4c\x20\x35\x35\x33\x2e\x34\x30\x20\x32\x37\x37\ -\x2e\x33\x32\x20\x4c\x20\x35\x35\x36\x2e\x30\x33\x20\x32\x37\x34\ -\x2e\x31\x32\x20\x4c\x20\x35\x35\x38\x2e\x38\x34\x20\x32\x37\x31\ -\x2e\x32\x39\x20\x4c\x20\x35\x36\x32\x2e\x32\x39\x20\x32\x36\x38\ -\x2e\x33\x39\x20\x4c\x20\x35\x36\x36\x2e\x34\x36\x20\x32\x36\x35\ -\x2e\x33\x39\x20\x4c\x20\x35\x37\x31\x2e\x34\x35\x20\x32\x36\x32\ -\x2e\x33\x32\x20\x4c\x20\x35\x37\x36\x2e\x33\x38\x20\x32\x35\x39\ -\x2e\x36\x38\x20\x4c\x20\x35\x38\x32\x2e\x31\x37\x20\x32\x35\x36\ -\x2e\x39\x39\x20\x4c\x20\x35\x38\x38\x2e\x39\x32\x20\x32\x35\x34\ -\x2e\x32\x34\x20\x4c\x20\x35\x39\x36\x2e\x37\x33\x20\x32\x35\x31\ -\x2e\x34\x35\x20\x4c\x20\x36\x30\x37\x2e\x30\x34\x20\x32\x34\x38\ -\x2e\x32\x37\x20\x4c\x20\x36\x31\x39\x2e\x33\x31\x20\x32\x34\x35\ -\x2e\x30\x38\x20\x4c\x20\x36\x33\x33\x2e\x37\x36\x20\x32\x34\x31\ -\x2e\x38\x39\x20\x4c\x20\x36\x34\x39\x2e\x39\x35\x20\x32\x33\x37\ -\x2e\x39\x31\x20\x4c\x20\x36\x36\x35\x2e\x30\x38\x20\x32\x33\x34\ -\x2e\x35\x39\x20\x4c\x20\x36\x37\x39\x2e\x32\x30\x20\x32\x33\x31\ -\x2e\x38\x38\x20\x4c\x20\x36\x39\x32\x2e\x33\x37\x20\x32\x32\x39\ -\x2e\x37\x36\x20\x4c\x20\x37\x30\x34\x2e\x36\x34\x20\x32\x32\x38\ -\x2e\x31\x36\x20\x4c\x20\x37\x31\x37\x2e\x36\x36\x20\x32\x32\x36\ -\x2e\x39\x30\x20\x4c\x20\x37\x32\x39\x2e\x37\x31\x20\x32\x32\x36\ -\x2e\x31\x35\x20\x4c\x20\x37\x34\x30\x2e\x38\x36\x20\x32\x32\x35\ -\x2e\x38\x37\x20\x4c\x20\x37\x35\x31\x2e\x31\x36\x20\x32\x32\x36\ -\x2e\x30\x32\x20\x4c\x20\x37\x36\x30\x2e\x36\x35\x20\x32\x32\x36\ -\x2e\x35\x37\x20\x4c\x20\x37\x37\x30\x2e\x36\x37\x20\x32\x32\x37\ -\x2e\x36\x31\x20\x4c\x20\x37\x37\x39\x2e\x38\x35\x20\x32\x32\x39\ -\x2e\x30\x31\x20\x4c\x20\x37\x38\x38\x2e\x32\x34\x20\x32\x33\x30\ -\x2e\x37\x33\x20\x4c\x20\x37\x39\x35\x2e\x39\x31\x20\x32\x33\x32\ -\x2e\x37\x35\x20\x4c\x20\x38\x30\x32\x2e\x39\x30\x20\x32\x33\x35\ -\x2e\x30\x36\x20\x4c\x20\x38\x31\x30\x2e\x30\x38\x20\x32\x33\x37\ -\x2e\x39\x33\x20\x4c\x20\x38\x31\x36\x2e\x35\x37\x20\x32\x34\x31\ -\x2e\x30\x32\x20\x4c\x20\x38\x32\x32\x2e\x34\x33\x20\x32\x34\x34\ -\x2e\x33\x33\x20\x4c\x20\x38\x32\x37\x2e\x37\x31\x20\x32\x34\x37\ -\x2e\x38\x34\x20\x4c\x20\x38\x33\x32\x2e\x34\x34\x20\x32\x35\x31\ -\x2e\x35\x35\x20\x4c\x20\x38\x33\x37\x2e\x30\x31\x20\x32\x35\x35\ -\x2e\x37\x35\x20\x4c\x20\x38\x34\x31\x2e\x30\x36\x20\x32\x36\x30\ -\x2e\x30\x38\x20\x4c\x20\x38\x34\x34\x2e\x36\x32\x20\x32\x36\x34\ -\x2e\x35\x36\x20\x4c\x20\x38\x34\x37\x2e\x37\x32\x20\x32\x36\x39\ -\x2e\x32\x30\x20\x4c\x20\x38\x35\x30\x2e\x33\x36\x20\x32\x37\x34\ -\x2e\x30\x30\x20\x4c\x20\x38\x35\x32\x2e\x36\x35\x20\x32\x37\x39\ -\x2e\x30\x36\x20\x4c\x20\x38\x35\x34\x2e\x35\x32\x20\x32\x38\x34\ -\x2e\x32\x30\x20\x4c\x20\x38\x35\x35\x2e\x39\x39\x20\x32\x38\x39\ -\x2e\x34\x36\x20\x4c\x20\x38\x35\x37\x2e\x30\x37\x20\x32\x39\x34\ -\x2e\x38\x34\x20\x4c\x20\x38\x35\x37\x2e\x37\x35\x20\x33\x30\x30\ -\x2e\x33\x35\x20\x4c\x20\x38\x35\x38\x2e\x30\x37\x20\x33\x30\x37\ -\x2e\x32\x37\x20\x4c\x20\x38\x35\x37\x2e\x38\x33\x20\x33\x31\x34\ -\x2e\x32\x36\x20\x4c\x20\x38\x35\x37\x2e\x30\x34\x20\x33\x32\x31\ -\x2e\x33\x34\x20\x4c\x20\x38\x35\x35\x2e\x36\x37\x20\x33\x32\x38\ -\x2e\x35\x34\x20\x4c\x20\x38\x35\x33\x2e\x38\x31\x20\x33\x33\x35\ -\x2e\x35\x39\x20\x4c\x20\x38\x35\x31\x2e\x34\x36\x20\x33\x34\x32\ -\x2e\x36\x30\x20\x4c\x20\x38\x34\x38\x2e\x36\x30\x20\x33\x34\x39\ -\x2e\x35\x37\x20\x4c\x20\x38\x34\x35\x2e\x32\x32\x20\x33\x35\x36\ -\x2e\x35\x32\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x65\x64\x62\x34\x31\x66\x22\ -\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\ -\x6f\x64\x64\x22\x20\x67\x72\x6f\x75\x70\x2d\x69\x64\x3d\x22\x33\ -\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x38\x38\x22\x20\x73\ -\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\x20\x74\x61\x72\ -\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x36\x39\x2e\ -\x37\x35\x34\x37\x33\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\ -\x33\x35\x38\x2e\x34\x33\x33\x31\x37\x22\x20\x74\x61\x72\x67\x65\ -\x74\x2d\x78\x3d\x22\x34\x39\x39\x2e\x36\x33\x33\x35\x34\x22\x20\ -\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x32\x32\x35\x2e\x38\x37\ -\x31\x31\x32\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\ -\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x38\x34\x33\ -\x2e\x33\x38\x20\x33\x37\x34\x2e\x38\x37\x20\x4c\x20\x38\x33\x38\ -\x2e\x31\x35\x20\x33\x38\x32\x2e\x31\x39\x20\x4c\x20\x38\x33\x32\ -\x2e\x37\x37\x20\x33\x38\x38\x2e\x38\x36\x20\x4c\x20\x38\x32\x37\ -\x2e\x32\x34\x20\x33\x39\x34\x2e\x39\x30\x20\x4c\x20\x38\x32\x31\ -\x2e\x35\x37\x20\x34\x30\x30\x2e\x33\x35\x20\x4c\x20\x38\x31\x35\ -\x2e\x35\x31\x20\x34\x30\x35\x2e\x35\x30\x20\x4c\x20\x38\x30\x39\ -\x2e\x33\x30\x20\x34\x31\x30\x2e\x31\x37\x20\x4c\x20\x38\x30\x32\ -\x2e\x39\x35\x20\x34\x31\x34\x2e\x33\x38\x20\x4c\x20\x37\x39\x36\ -\x2e\x34\x34\x20\x34\x31\x38\x2e\x31\x35\x20\x4c\x20\x37\x38\x39\ -\x2e\x37\x32\x20\x34\x32\x31\x2e\x35\x37\x20\x4c\x20\x37\x38\x32\ -\x2e\x38\x35\x20\x34\x32\x34\x2e\x36\x35\x20\x4c\x20\x37\x37\x35\ -\x2e\x38\x34\x20\x34\x32\x37\x2e\x33\x39\x20\x4c\x20\x37\x36\x38\ -\x2e\x36\x37\x20\x34\x32\x39\x2e\x38\x31\x20\x4c\x20\x37\x35\x38\ -\x2e\x39\x38\x20\x34\x33\x32\x2e\x35\x37\x20\x4c\x20\x37\x34\x39\ -\x2e\x30\x36\x20\x34\x33\x34\x2e\x39\x33\x20\x4c\x20\x37\x33\x38\ -\x2e\x39\x33\x20\x34\x33\x36\x2e\x38\x36\x20\x4c\x20\x37\x33\x32\ -\x2e\x34\x38\x20\x34\x33\x37\x2e\x39\x31\x20\x4c\x20\x37\x33\x32\ -\x2e\x34\x38\x20\x34\x33\x37\x2e\x39\x31\x20\x4c\x20\x37\x32\x35\ -\x2e\x39\x37\x20\x34\x33\x38\x2e\x38\x33\x20\x4c\x20\x37\x32\x35\ -\x2e\x39\x37\x20\x34\x33\x38\x2e\x38\x33\x20\x4c\x20\x37\x31\x39\ -\x2e\x34\x33\x20\x34\x33\x39\x2e\x36\x35\x20\x4c\x20\x37\x31\x36\ -\x2e\x31\x34\x20\x34\x34\x30\x2e\x30\x33\x20\x4c\x20\x37\x30\x39\ -\x2e\x35\x33\x20\x34\x34\x30\x2e\x37\x31\x20\x4c\x20\x37\x30\x39\ -\x2e\x35\x33\x20\x34\x34\x30\x2e\x37\x31\x20\x4c\x20\x37\x32\x38\ -\x2e\x36\x35\x20\x34\x32\x36\x2e\x36\x39\x20\x4c\x20\x37\x34\x31\ -\x2e\x32\x34\x20\x34\x32\x34\x2e\x34\x37\x20\x4c\x20\x37\x35\x32\ -\x2e\x39\x38\x20\x34\x32\x31\x2e\x38\x30\x20\x4c\x20\x37\x36\x33\ -\x2e\x39\x31\x20\x34\x31\x38\x2e\x37\x31\x20\x4c\x20\x37\x37\x34\ -\x2e\x30\x39\x20\x34\x31\x35\x2e\x32\x32\x20\x4c\x20\x37\x38\x33\ -\x2e\x35\x36\x20\x34\x31\x31\x2e\x33\x35\x20\x4c\x20\x37\x39\x32\ -\x2e\x33\x37\x20\x34\x30\x37\x2e\x31\x31\x20\x4c\x20\x38\x30\x30\ -\x2e\x35\x35\x20\x34\x30\x32\x2e\x35\x31\x20\x4c\x20\x38\x30\x38\ -\x2e\x31\x34\x20\x33\x39\x37\x2e\x35\x37\x20\x4c\x20\x38\x31\x35\ -\x2e\x31\x38\x20\x33\x39\x32\x2e\x32\x37\x20\x4c\x20\x38\x32\x31\ -\x2e\x36\x39\x20\x33\x38\x36\x2e\x36\x32\x20\x4c\x20\x38\x32\x37\ -\x2e\x36\x39\x20\x33\x38\x30\x2e\x36\x31\x20\x4c\x20\x38\x33\x33\ -\x2e\x32\x31\x20\x33\x37\x34\x2e\x32\x33\x20\x4c\x20\x38\x33\x38\ -\x2e\x32\x36\x20\x33\x36\x37\x2e\x34\x37\x20\x4c\x20\x38\x34\x32\ -\x2e\x38\x36\x20\x33\x36\x30\x2e\x33\x30\x20\x4c\x20\x38\x34\x37\ -\x2e\x30\x30\x20\x33\x35\x32\x2e\x37\x31\x20\x4c\x20\x38\x35\x30\ -\x2e\x37\x30\x20\x33\x34\x34\x2e\x36\x37\x20\x4c\x20\x38\x35\x33\ -\x2e\x39\x34\x20\x33\x33\x36\x2e\x31\x34\x20\x4c\x20\x38\x35\x36\ -\x2e\x37\x32\x20\x33\x32\x37\x2e\x31\x30\x20\x4c\x20\x38\x35\x39\ -\x2e\x30\x32\x20\x33\x31\x37\x2e\x35\x31\x20\x4c\x20\x38\x36\x30\ -\x2e\x38\x32\x20\x33\x30\x37\x2e\x33\x34\x20\x4c\x20\x38\x36\x31\ -\x2e\x34\x38\x20\x33\x31\x32\x2e\x39\x35\x20\x4c\x20\x38\x36\x31\ -\x2e\x37\x33\x20\x33\x31\x38\x2e\x36\x30\x20\x4c\x20\x38\x36\x31\ -\x2e\x35\x37\x20\x33\x32\x34\x2e\x33\x31\x20\x4c\x20\x38\x36\x30\ -\x2e\x39\x39\x20\x33\x33\x30\x2e\x31\x30\x20\x4c\x20\x38\x36\x30\ -\x2e\x30\x33\x20\x33\x33\x35\x2e\x38\x31\x20\x4c\x20\x38\x35\x38\ -\x2e\x37\x31\x20\x33\x34\x31\x2e\x35\x32\x20\x4c\x20\x38\x35\x37\ -\x2e\x30\x31\x20\x33\x34\x37\x2e\x32\x34\x20\x4c\x20\x38\x35\x34\ -\x2e\x39\x33\x20\x33\x35\x32\x2e\x39\x37\x20\x4c\x20\x38\x35\x31\ -\x2e\x36\x38\x20\x33\x36\x30\x2e\x33\x39\x20\x4c\x20\x38\x34\x37\ -\x2e\x38\x33\x20\x33\x36\x37\x2e\x36\x38\x20\x4c\x20\x38\x34\x33\ -\x2e\x33\x38\x20\x33\x37\x34\x2e\x38\x37\x20\x5a\x22\x0d\x0a\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\ -\x64\x31\x39\x38\x30\x30\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\ -\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x67\x72\x6f\x75\ -\x70\x2d\x69\x64\x3d\x22\x34\x22\x20\x69\x64\x3d\x22\xe8\xb7\xaf\ -\xe5\xbe\x84\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x33\x33\ -\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\x20\ -\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x31\ -\x33\x33\x2e\x33\x37\x30\x39\x34\x22\x0d\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\ -\x68\x3d\x22\x31\x35\x32\x2e\x31\x39\x34\x30\x39\x22\x20\x74\x61\ -\x72\x67\x65\x74\x2d\x78\x3d\x22\x37\x30\x39\x2e\x35\x33\x33\x31\ -\x34\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x33\x30\x37\ -\x2e\x33\x34\x30\x31\x35\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\ -\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\ -\x36\x39\x37\x2e\x33\x32\x20\x35\x38\x30\x2e\x30\x36\x20\x43\x20\ -\x37\x32\x31\x2e\x38\x31\x20\x35\x32\x32\x2e\x36\x34\x20\x37\x35\ -\x34\x2e\x35\x33\x20\x35\x30\x32\x2e\x36\x30\x20\x37\x39\x35\x2e\ -\x34\x37\x20\x35\x31\x39\x2e\x39\x36\x20\x43\x20\x38\x35\x36\x2e\ -\x38\x37\x20\x35\x34\x35\x2e\x39\x39\x20\x37\x39\x33\x2e\x32\x37\ -\x20\x36\x37\x31\x2e\x37\x38\x20\x37\x32\x32\x2e\x34\x31\x20\x36\ -\x35\x36\x2e\x39\x33\x20\x43\x20\x36\x37\x35\x2e\x31\x38\x20\x36\ -\x34\x37\x2e\x30\x33\x20\x36\x36\x36\x2e\x38\x31\x20\x36\x32\x31\ -\x2e\x34\x31\x20\x36\x39\x37\x2e\x33\x32\x20\x35\x38\x30\x2e\x30\ -\x36\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x66\x69\x6c\x6c\x3d\x22\x23\x66\x66\x62\x35\x61\x31\x22\x20\x66\ -\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\ -\x64\x22\x20\x69\x64\x3d\x22\xe8\xb7\xaf\xe5\xbe\x84\x2d\x32\x34\ -\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x33\x34\x22\x20\x73\ -\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\x20\x74\x61\x72\ -\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x39\x2e\ -\x31\x37\x39\x35\x33\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\ -\x31\x39\x30\x2e\x30\x35\x38\x31\x37\x22\x20\x74\x61\x72\x67\x65\ -\x74\x2d\x78\x3d\x22\x36\x36\x36\x2e\x38\x31\x34\x33\x22\x20\x74\ -\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x35\x30\x32\x2e\x36\x30\x32\ -\x39\x34\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\ -\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x37\x31\x35\x2e\ -\x34\x38\x20\x36\x31\x35\x2e\x30\x35\x20\x43\x20\x37\x32\x39\x2e\ -\x33\x33\x20\x35\x38\x38\x2e\x39\x33\x20\x37\x34\x35\x2e\x38\x32\ -\x20\x35\x37\x35\x2e\x30\x31\x20\x37\x36\x34\x2e\x39\x37\x20\x35\ -\x37\x33\x2e\x32\x38\x22\x20\x66\x69\x6c\x6c\x3d\x22\x6e\x6f\x6e\ -\x65\x22\x20\x69\x64\x3d\x22\xe8\xb7\xaf\xe5\xbe\x84\x2d\x34\x32\ -\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x33\x35\x22\x0d\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x6f\x6b\x65\ -\x3d\x22\x23\x63\x32\x36\x62\x36\x62\x22\x20\x73\x74\x72\x6f\x6b\ -\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x22\x72\x6f\x75\x6e\x64\ -\x22\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x22\ -\x31\x31\x2e\x30\x35\x32\x39\x37\x38\x35\x22\x20\x74\x61\x72\x67\ -\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x34\x31\x2e\x37\x37\ -\x31\x37\x39\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x74\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x34\x39\ -\x2e\x34\x38\x39\x38\x30\x37\x22\x20\x74\x61\x72\x67\x65\x74\x2d\ -\x78\x3d\x22\x37\x31\x35\x2e\x34\x38\x34\x39\x22\x20\x74\x61\x72\ -\x67\x65\x74\x2d\x79\x3d\x22\x35\x37\x33\x2e\x32\x38\x32\x36\x22\ -\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\ -\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x37\x33\x35\x2e\x35\x31\x20\ -\x35\x38\x39\x2e\x35\x37\x20\x43\x20\x37\x34\x38\x2e\x31\x34\x20\ -\x35\x39\x32\x2e\x32\x38\x20\x37\x35\x36\x2e\x35\x31\x20\x35\x39\ -\x39\x2e\x32\x34\x20\x37\x36\x30\x2e\x36\x31\x20\x36\x31\x30\x2e\ -\x34\x34\x22\x20\x66\x69\x6c\x6c\x3d\x22\x6e\x6f\x6e\x65\x22\x20\ -\x69\x64\x3d\x22\xe8\xb7\xaf\xe5\xbe\x84\x2d\x34\x33\x22\x20\x6e\ -\x6f\x64\x65\x2d\x69\x64\x3d\x22\x33\x36\x22\x0d\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x23\ -\x63\x32\x36\x62\x36\x62\x22\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\ -\x69\x6e\x65\x63\x61\x70\x3d\x22\x72\x6f\x75\x6e\x64\x22\x20\x73\ -\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\x31\x2e\ -\x30\x35\x32\x39\x37\x38\x35\x22\x20\x74\x61\x72\x67\x65\x74\x2d\ -\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x30\x2e\x38\x37\x35\x33\x30\ -\x35\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\ -\x72\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x32\x35\x2e\x31\ -\x30\x31\x31\x39\x36\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\ -\x22\x37\x33\x35\x2e\x35\x30\x36\x36\x22\x20\x74\x61\x72\x67\x65\ -\x74\x2d\x79\x3d\x22\x35\x38\x39\x2e\x35\x36\x35\x32\x22\x3e\x3c\ -\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\ -\x68\x20\x64\x3d\x22\x4d\x20\x32\x35\x33\x2e\x32\x34\x20\x35\x38\ -\x37\x2e\x32\x38\x20\x4c\x20\x32\x34\x38\x2e\x32\x36\x20\x35\x37\ -\x36\x2e\x33\x35\x20\x4c\x20\x32\x34\x33\x2e\x32\x33\x20\x35\x36\ -\x36\x2e\x37\x32\x20\x4c\x20\x32\x33\x38\x2e\x31\x39\x20\x35\x35\ -\x38\x2e\x32\x39\x20\x4c\x20\x32\x33\x33\x2e\x31\x32\x20\x35\x35\ -\x30\x2e\x39\x35\x20\x4c\x20\x32\x32\x38\x2e\x30\x35\x20\x35\x34\ -\x34\x2e\x36\x31\x20\x4c\x20\x32\x32\x32\x2e\x39\x36\x20\x35\x33\ -\x39\x2e\x31\x38\x20\x4c\x20\x32\x31\x37\x2e\x38\x36\x20\x35\x33\ -\x34\x2e\x35\x38\x20\x4c\x20\x32\x31\x32\x2e\x37\x33\x20\x35\x33\ -\x30\x2e\x37\x34\x20\x4c\x20\x32\x30\x37\x2e\x35\x37\x20\x35\x32\ -\x37\x2e\x36\x30\x20\x4c\x20\x32\x30\x32\x2e\x33\x35\x20\x35\x32\ -\x35\x2e\x31\x31\x20\x4c\x20\x31\x39\x37\x2e\x30\x35\x20\x35\x32\ -\x33\x2e\x32\x34\x20\x4c\x20\x31\x39\x31\x2e\x36\x35\x20\x35\x32\ -\x31\x2e\x39\x37\x20\x4c\x20\x31\x38\x36\x2e\x31\x31\x20\x35\x32\ -\x31\x2e\x32\x38\x20\x4c\x20\x31\x38\x30\x2e\x33\x39\x20\x35\x32\ -\x31\x2e\x31\x37\x20\x4c\x20\x31\x37\x34\x2e\x34\x37\x20\x35\x32\ -\x31\x2e\x36\x37\x20\x4c\x20\x31\x36\x38\x2e\x33\x31\x20\x35\x32\ -\x32\x2e\x38\x31\x20\x4c\x20\x31\x36\x31\x2e\x38\x36\x20\x35\x32\ -\x34\x2e\x36\x33\x20\x4c\x20\x31\x35\x35\x2e\x30\x39\x20\x35\x32\ -\x37\x2e\x31\x38\x20\x4c\x20\x31\x35\x31\x2e\x30\x36\x20\x35\x32\ -\x39\x2e\x31\x35\x20\x4c\x20\x31\x34\x37\x2e\x34\x38\x20\x35\x33\ -\x31\x2e\x33\x34\x20\x4c\x20\x31\x34\x34\x2e\x33\x31\x20\x35\x33\ -\x33\x2e\x37\x35\x20\x4c\x20\x31\x34\x31\x2e\x35\x33\x20\x35\x33\ -\x36\x2e\x33\x37\x20\x4c\x20\x31\x33\x39\x2e\x30\x39\x20\x35\x33\ -\x39\x2e\x32\x32\x20\x4c\x20\x31\x33\x36\x2e\x34\x35\x20\x35\x34\ -\x33\x2e\x31\x35\x20\x4c\x20\x31\x33\x34\x2e\x32\x38\x20\x35\x34\ -\x37\x2e\x33\x35\x20\x4c\x20\x31\x33\x32\x2e\x36\x30\x20\x35\x35\ -\x31\x2e\x38\x35\x20\x4c\x20\x31\x33\x31\x2e\x33\x38\x20\x35\x35\ -\x36\x2e\x36\x38\x20\x4c\x20\x31\x33\x30\x2e\x36\x36\x20\x35\x36\ -\x31\x2e\x35\x38\x20\x4c\x20\x31\x33\x30\x2e\x33\x34\x20\x35\x36\ -\x36\x2e\x36\x38\x20\x4c\x20\x31\x33\x30\x2e\x34\x35\x20\x35\x37\ -\x32\x2e\x30\x30\x20\x4c\x20\x31\x33\x31\x2e\x30\x30\x20\x35\x37\ -\x37\x2e\x35\x36\x20\x4c\x20\x31\x33\x32\x2e\x33\x31\x20\x35\x38\ -\x34\x2e\x38\x36\x20\x4c\x20\x31\x33\x34\x2e\x32\x39\x20\x35\x39\ -\x32\x2e\x33\x30\x20\x4c\x20\x31\x33\x36\x2e\x39\x36\x20\x35\x39\ -\x39\x2e\x39\x30\x20\x4c\x20\x31\x34\x30\x2e\x31\x38\x20\x36\x30\ -\x37\x2e\x33\x30\x20\x4c\x20\x31\x34\x33\x2e\x39\x36\x20\x36\x31\ -\x34\x2e\x35\x37\x20\x4c\x20\x31\x34\x38\x2e\x33\x31\x20\x36\x32\ -\x31\x2e\x37\x32\x20\x4c\x20\x31\x35\x33\x2e\x31\x34\x20\x36\x32\ -\x38\x2e\x35\x36\x20\x4c\x20\x31\x35\x38\x2e\x33\x39\x20\x36\x33\ -\x34\x2e\x39\x39\x20\x4c\x20\x31\x36\x34\x2e\x30\x37\x20\x36\x34\ -\x31\x2e\x30\x33\x20\x4c\x20\x31\x36\x38\x2e\x36\x33\x20\x36\x34\ -\x35\x2e\x32\x38\x20\x4c\x20\x31\x37\x33\x2e\x33\x35\x20\x36\x34\ -\x39\x2e\x31\x36\x20\x4c\x20\x31\x37\x38\x2e\x32\x33\x20\x36\x35\ -\x32\x2e\x36\x39\x20\x4c\x20\x31\x38\x33\x2e\x32\x38\x20\x36\x35\ -\x35\x2e\x38\x36\x20\x4c\x20\x31\x38\x38\x2e\x35\x35\x20\x36\x35\ -\x38\x2e\x36\x37\x20\x4c\x20\x31\x39\x33\x2e\x39\x32\x20\x36\x36\ -\x30\x2e\x39\x39\x20\x4c\x20\x31\x39\x39\x2e\x33\x38\x20\x36\x36\ -\x32\x2e\x38\x34\x20\x4c\x20\x32\x30\x34\x2e\x39\x36\x20\x36\x36\ -\x34\x2e\x32\x33\x20\x4c\x20\x32\x31\x30\x2e\x36\x33\x20\x36\x36\ -\x35\x2e\x30\x39\x20\x4c\x20\x32\x31\x36\x2e\x33\x36\x20\x36\x36\ -\x35\x2e\x33\x37\x20\x4c\x20\x32\x32\x32\x2e\x31\x39\x20\x36\x36\ -\x35\x2e\x30\x36\x20\x4c\x20\x32\x32\x38\x2e\x31\x35\x20\x36\x36\ -\x34\x2e\x31\x36\x20\x4c\x20\x32\x33\x36\x2e\x33\x37\x20\x36\x36\ -\x32\x2e\x31\x36\x20\x4c\x20\x32\x34\x33\x2e\x34\x32\x20\x36\x35\ -\x39\x2e\x39\x33\x20\x4c\x20\x32\x34\x39\x2e\x34\x30\x20\x36\x35\ -\x37\x2e\x35\x30\x20\x4c\x20\x32\x35\x34\x2e\x34\x35\x20\x36\x35\ -\x34\x2e\x39\x30\x20\x4c\x20\x32\x35\x38\x2e\x36\x37\x20\x36\x35\ -\x32\x2e\x31\x35\x20\x4c\x20\x32\x36\x32\x2e\x31\x37\x20\x36\x34\ -\x39\x2e\x32\x36\x20\x4c\x20\x32\x36\x35\x2e\x30\x31\x20\x36\x34\ -\x36\x2e\x32\x34\x20\x4c\x20\x32\x36\x37\x2e\x32\x38\x20\x36\x34\ -\x33\x2e\x30\x36\x20\x4c\x20\x32\x36\x39\x2e\x30\x31\x20\x36\x33\ -\x39\x2e\x37\x33\x20\x4c\x20\x32\x37\x30\x2e\x32\x34\x20\x36\x33\ -\x36\x2e\x31\x39\x20\x4c\x20\x32\x37\x30\x2e\x39\x37\x20\x36\x33\ -\x32\x2e\x34\x32\x20\x4c\x20\x32\x37\x31\x2e\x31\x39\x20\x36\x32\ -\x38\x2e\x33\x36\x20\x4c\x20\x32\x37\x30\x2e\x38\x37\x20\x36\x32\ -\x33\x2e\x39\x37\x20\x4c\x20\x32\x36\x39\x2e\x39\x35\x20\x36\x31\ -\x39\x2e\x31\x38\x20\x4c\x20\x32\x36\x38\x2e\x33\x35\x20\x36\x31\ -\x33\x2e\x39\x35\x20\x4c\x20\x32\x36\x35\x2e\x39\x39\x20\x36\x30\ -\x38\x2e\x32\x30\x20\x4c\x20\x32\x36\x32\x2e\x37\x37\x20\x36\x30\ -\x31\x2e\x38\x39\x20\x4c\x20\x32\x35\x38\x2e\x35\x36\x20\x35\x39\ -\x34\x2e\x39\x33\x20\x4c\x20\x32\x35\x33\x2e\x32\x34\x20\x35\x38\ -\x37\x2e\x32\x38\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x66\x66\x62\x35\x61\x31\ -\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\ -\x6e\x6f\x64\x64\x22\x20\x67\x72\x6f\x75\x70\x2d\x69\x64\x3d\x22\ -\x35\x22\x20\x69\x64\x3d\x22\xe8\xb7\xaf\xe5\xbe\x84\x2d\x32\x34\ -\xe5\xa4\x87\xe4\xbb\xbd\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\ -\x22\x33\x37\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\ -\x65\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\ -\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x34\x34\ -\x2e\x31\x39\x38\x35\x35\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x77\ -\x69\x64\x74\x68\x3d\x22\x31\x34\x30\x2e\x38\x35\x35\x36\x35\x22\ -\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x31\x33\x30\x2e\x33\ -\x33\x38\x38\x37\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\ -\x35\x32\x31\x2e\x31\x37\x31\x37\x35\x22\x3e\x3c\x2f\x70\x61\x74\ -\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\ -\x22\x4d\x20\x32\x32\x33\x2e\x37\x30\x20\x36\x31\x36\x2e\x31\x34\ -\x20\x4c\x20\x32\x31\x39\x2e\x33\x32\x20\x36\x30\x38\x2e\x34\x33\ -\x20\x4c\x20\x32\x31\x34\x2e\x39\x32\x20\x36\x30\x31\x2e\x37\x31\ -\x20\x4c\x20\x32\x31\x30\x2e\x35\x31\x20\x35\x39\x35\x2e\x39\x31\ -\x20\x4c\x20\x32\x30\x36\x2e\x31\x30\x20\x35\x39\x30\x2e\x39\x35\ -\x20\x4c\x20\x32\x30\x31\x2e\x36\x37\x20\x35\x38\x36\x2e\x37\x33\ -\x20\x4c\x20\x31\x39\x37\x2e\x32\x33\x20\x35\x38\x33\x2e\x32\x31\ -\x20\x4c\x20\x31\x39\x32\x2e\x37\x36\x20\x35\x38\x30\x2e\x33\x33\ -\x20\x4c\x20\x31\x38\x38\x2e\x32\x34\x20\x35\x37\x38\x2e\x30\x33\ -\x20\x4c\x20\x31\x38\x33\x2e\x36\x36\x20\x35\x37\x36\x2e\x32\x38\ -\x20\x4c\x20\x31\x37\x38\x2e\x39\x39\x20\x35\x37\x35\x2e\x30\x37\ -\x20\x4c\x20\x31\x37\x34\x2e\x32\x31\x20\x35\x37\x34\x2e\x33\x37\ -\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\ -\x6c\x3d\x22\x6e\x6f\x6e\x65\x22\x20\x67\x72\x6f\x75\x70\x2d\x69\ -\x64\x3d\x22\x36\x22\x20\x69\x64\x3d\x22\xe8\xb7\xaf\xe5\xbe\x84\ -\x2d\x34\x32\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x33\x38\ -\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x23\x63\x32\x36\x62\x36\ -\x62\x22\x20\x73\x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\ -\x70\x3d\x22\x72\x6f\x75\x6e\x64\x22\x0d\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x73\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\ -\x68\x3d\x22\x31\x31\x2e\x30\x35\x32\x39\x37\x38\x35\x22\x20\x74\ -\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x34\x31\ -\x2e\x37\x37\x31\x37\x39\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x77\ -\x69\x64\x74\x68\x3d\x22\x34\x39\x2e\x34\x38\x39\x37\x39\x22\x20\ -\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x31\x37\x34\x2e\x32\x30\ -\x38\x34\x37\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x35\x37\x34\x2e\x33\x37\ -\x32\x35\x36\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\ -\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x32\x30\x36\ -\x2e\x30\x30\x20\x35\x39\x33\x2e\x33\x38\x20\x4c\x20\x32\x30\x31\ -\x2e\x32\x35\x20\x35\x39\x34\x2e\x36\x37\x20\x4c\x20\x31\x39\x37\ -\x2e\x30\x36\x20\x35\x39\x36\x2e\x33\x34\x20\x4c\x20\x31\x39\x33\ -\x2e\x33\x36\x20\x35\x39\x38\x2e\x33\x37\x20\x4c\x20\x31\x39\x30\ -\x2e\x31\x31\x20\x36\x30\x30\x2e\x37\x35\x20\x4c\x20\x31\x38\x37\ -\x2e\x32\x35\x20\x36\x30\x33\x2e\x35\x31\x20\x4c\x20\x31\x38\x34\ -\x2e\x37\x37\x20\x36\x30\x36\x2e\x36\x35\x20\x4c\x20\x31\x38\x32\ -\x2e\x36\x35\x20\x36\x31\x30\x2e\x32\x32\x20\x4c\x20\x31\x38\x30\ -\x2e\x39\x30\x20\x36\x31\x34\x2e\x32\x36\x22\x0d\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x6e\x6f\x6e\ -\x65\x22\x20\x67\x72\x6f\x75\x70\x2d\x69\x64\x3d\x22\x37\x22\x20\ -\x69\x64\x3d\x22\xe8\xb7\xaf\xe5\xbe\x84\x2d\x34\x33\x22\x20\x6e\ -\x6f\x64\x65\x2d\x69\x64\x3d\x22\x33\x39\x22\x20\x73\x74\x72\x6f\ -\x6b\x65\x3d\x22\x23\x63\x32\x36\x62\x36\x62\x22\x20\x73\x74\x72\ -\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x22\x72\x6f\x75\ -\x6e\x64\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\ -\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\x31\x2e\ -\x30\x35\x32\x39\x37\x38\x35\x22\x20\x74\x61\x72\x67\x65\x74\x2d\ -\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x30\x2e\x38\x37\x35\x33\x30\ -\x35\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\ -\x22\x32\x35\x2e\x31\x30\x31\x31\x36\x36\x22\x20\x74\x61\x72\x67\ -\x65\x74\x2d\x78\x3d\x22\x31\x38\x30\x2e\x38\x39\x36\x34\x35\x22\ -\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\ -\x65\x74\x2d\x79\x3d\x22\x35\x39\x33\x2e\x33\x38\x31\x39\x22\x3e\ -\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\ -\x74\x68\x20\x64\x3d\x22\x4d\x20\x34\x36\x34\x2e\x38\x38\x20\x32\ -\x32\x34\x2e\x33\x32\x20\x4c\x20\x34\x37\x34\x2e\x35\x30\x20\x32\ -\x32\x34\x2e\x33\x32\x20\x43\x20\x36\x31\x36\x2e\x33\x34\x20\x32\ -\x32\x34\x2e\x33\x32\x20\x37\x33\x31\x2e\x33\x32\x20\x33\x33\x39\ -\x2e\x33\x30\x20\x37\x33\x31\x2e\x33\x32\x20\x34\x38\x31\x2e\x31\ -\x34\x20\x43\x20\x37\x33\x31\x2e\x33\x32\x20\x34\x38\x32\x2e\x35\ -\x32\x20\x37\x33\x31\x2e\x33\x31\x20\x34\x38\x33\x2e\x39\x31\x20\ -\x37\x33\x31\x2e\x32\x39\x20\x34\x38\x35\x2e\x32\x39\x20\x4c\x20\ -\x37\x32\x39\x2e\x34\x32\x20\x36\x30\x30\x2e\x33\x34\x20\x43\x20\ -\x37\x32\x37\x2e\x32\x37\x20\x37\x33\x33\x2e\x37\x37\x20\x36\x32\ -\x33\x2e\x32\x38\x20\x38\x34\x33\x2e\x33\x31\x20\x34\x39\x30\x2e\ -\x31\x35\x20\x38\x35\x32\x2e\x34\x31\x20\x4c\x20\x34\x36\x36\x2e\ -\x36\x38\x20\x38\x35\x34\x2e\x30\x31\x20\x4c\x20\x34\x36\x36\x2e\ -\x36\x38\x20\x38\x35\x34\x2e\x30\x31\x20\x4c\x20\x34\x35\x31\x2e\ -\x34\x30\x20\x38\x35\x32\x2e\x39\x30\x20\x43\x20\x33\x32\x31\x2e\ -\x35\x34\x20\x38\x34\x33\x2e\x34\x35\x20\x32\x31\x39\x2e\x33\x31\ -\x20\x37\x33\x38\x2e\x33\x31\x20\x32\x31\x33\x2e\x34\x39\x20\x36\ -\x30\x38\x2e\x32\x34\x20\x4c\x20\x32\x30\x38\x2e\x33\x31\x20\x34\ -\x39\x32\x2e\x36\x32\x20\x43\x20\x32\x30\x31\x2e\x39\x37\x20\x33\ -\x35\x30\x2e\x39\x33\x20\x33\x31\x31\x2e\x37\x30\x20\x32\x33\x30\ -\x2e\x39\x32\x20\x34\x35\x33\x2e\x33\x39\x20\x32\x32\x34\x2e\x35\ -\x38\x20\x43\x20\x34\x35\x37\x2e\x32\x32\x20\x32\x32\x34\x2e\x34\ -\x30\x20\x34\x36\x31\x2e\x30\x35\x20\x32\x32\x34\x2e\x33\x32\x20\ -\x34\x36\x34\x2e\x38\x38\x20\x32\x32\x34\x2e\x33\x32\x20\x5a\x22\ -\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\ -\x3d\x22\x23\x66\x66\x63\x64\x62\x63\x22\x20\x66\x69\x6c\x6c\x2d\ -\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x69\ -\x64\x3d\x22\xe8\x92\x99\xe7\x89\x88\x22\x20\x6e\x6f\x64\x65\x2d\ -\x69\x64\x3d\x22\x34\x30\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\ -\x6e\x6f\x6e\x65\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\ -\x67\x68\x74\x3d\x22\x36\x32\x39\x2e\x36\x39\x35\x32\x22\x0d\x0a\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\x65\x74\ -\x2d\x77\x69\x64\x74\x68\x3d\x22\x35\x32\x39\x2e\x33\x34\x37\x32\ -\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x32\x30\x31\x2e\ -\x39\x37\x31\x33\x39\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\ -\x22\x32\x32\x34\x2e\x33\x31\x38\x34\x35\x22\x3e\x3c\x2f\x70\x61\ -\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\ -\x3d\x22\x4d\x20\x32\x35\x36\x2e\x39\x34\x20\x36\x32\x30\x2e\x31\ -\x33\x20\x43\x20\x32\x39\x30\x2e\x35\x34\x20\x36\x32\x30\x2e\x31\ -\x33\x20\x33\x31\x37\x2e\x37\x38\x20\x36\x34\x37\x2e\x33\x36\x20\ -\x33\x31\x37\x2e\x37\x38\x20\x36\x38\x30\x2e\x39\x36\x20\x43\x20\ -\x33\x31\x37\x2e\x37\x38\x20\x37\x31\x33\x2e\x38\x33\x20\x32\x39\ -\x31\x2e\x37\x31\x20\x37\x34\x30\x2e\x36\x31\x20\x32\x35\x39\x2e\ -\x31\x32\x20\x37\x34\x31\x2e\x37\x36\x20\x4c\x20\x32\x35\x38\x2e\ -\x30\x37\x20\x37\x34\x31\x2e\x37\x37\x20\x43\x20\x32\x33\x36\x2e\ -\x37\x37\x20\x37\x31\x30\x2e\x36\x37\x20\x32\x32\x32\x2e\x31\x34\ -\x20\x36\x37\x34\x2e\x36\x36\x20\x32\x31\x36\x2e\x32\x30\x20\x36\ -\x33\x35\x2e\x37\x39\x20\x43\x20\x32\x32\x36\x2e\x39\x38\x20\x36\ -\x32\x36\x2e\x30\x35\x20\x32\x34\x31\x2e\x32\x37\x20\x36\x32\x30\ -\x2e\x31\x33\x20\x32\x35\x36\x2e\x39\x34\x20\x36\x32\x30\x2e\x31\ -\x33\x20\x5a\x20\x4d\x20\x36\x38\x32\x2e\x37\x39\x20\x36\x31\x32\ -\x2e\x35\x32\x20\x43\x20\x37\x30\x30\x2e\x32\x31\x20\x36\x31\x32\ -\x2e\x35\x32\x20\x37\x31\x35\x2e\x39\x33\x20\x36\x31\x39\x2e\x38\ -\x35\x20\x37\x32\x37\x2e\x30\x32\x20\x36\x33\x31\x2e\x35\x39\x20\ -\x43\x20\x37\x32\x31\x2e\x38\x39\x20\x36\x36\x38\x2e\x37\x36\x20\ -\x37\x30\x38\x2e\x38\x30\x20\x37\x30\x33\x2e\x34\x35\x20\x36\x38\ -\x39\x2e\x34\x38\x20\x37\x33\x33\x2e\x38\x33\x20\x43\x20\x36\x38\ -\x37\x2e\x32\x38\x20\x37\x33\x34\x2e\x30\x37\x20\x36\x38\x35\x2e\ -\x30\x35\x20\x37\x33\x34\x2e\x31\x39\x20\x36\x38\x32\x2e\x37\x39\ -\x20\x37\x33\x34\x2e\x31\x39\x20\x43\x20\x36\x34\x39\x2e\x31\x39\ -\x20\x37\x33\x34\x2e\x31\x39\x20\x36\x32\x31\x2e\x39\x35\x20\x37\ -\x30\x36\x2e\x39\x36\x20\x36\x32\x31\x2e\x39\x35\x20\x36\x37\x33\ -\x2e\x33\x36\x20\x43\x20\x36\x32\x31\x2e\x39\x35\x20\x36\x33\x39\ -\x2e\x37\x36\x20\x36\x34\x39\x2e\x31\x39\x20\x36\x31\x32\x2e\x35\ -\x32\x20\x36\x38\x32\x2e\x37\x39\x20\x36\x31\x32\x2e\x35\x32\x20\ -\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\ -\x6c\x6c\x3d\x22\x23\x66\x66\x62\x35\x61\x31\x22\x20\x66\x69\x6c\ -\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x2e\x34\x33\x38\ -\x31\x35\x31\x30\x33\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\ -\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x67\x72\x6f\x75\x70\ -\x2d\x69\x64\x3d\x22\x38\x22\x20\x69\x64\x3d\x22\xe5\xbd\xa2\xe7\ -\x8a\xb6\xe7\xbb\x93\xe5\x90\x88\x22\x20\x6e\x6f\x64\x65\x2d\x69\ -\x64\x3d\x22\x34\x31\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\x20\ -\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x31\ -\x32\x39\x2e\x32\x35\x30\x38\x22\x20\x74\x61\x72\x67\x65\x74\x2d\ -\x77\x69\x64\x74\x68\x3d\x22\x35\x31\x30\x2e\x38\x31\x38\x34\x38\ -\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x32\x31\x36\x2e\ -\x32\x30\x30\x32\x36\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x36\x31\x32\x2e\ -\x35\x32\x32\x34\x36\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\ -\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x31\ -\x38\x34\x2e\x36\x32\x20\x33\x39\x30\x2e\x38\x34\x20\x43\x20\x31\ -\x37\x30\x2e\x33\x31\x20\x34\x32\x36\x2e\x32\x39\x20\x31\x37\x30\ -\x2e\x33\x31\x20\x34\x35\x38\x2e\x37\x36\x20\x31\x38\x34\x2e\x36\ -\x32\x20\x34\x38\x38\x2e\x32\x35\x20\x43\x20\x32\x30\x36\x2e\x30\ -\x37\x20\x35\x33\x32\x2e\x34\x38\x20\x32\x37\x36\x2e\x32\x35\x20\ -\x35\x30\x33\x2e\x32\x35\x20\x33\x30\x38\x2e\x32\x31\x20\x34\x37\ -\x37\x2e\x32\x39\x20\x43\x20\x33\x36\x34\x2e\x34\x39\x20\x34\x39\ -\x34\x2e\x34\x38\x20\x34\x30\x38\x2e\x37\x34\x20\x34\x38\x37\x2e\ -\x39\x34\x20\x34\x34\x30\x2e\x39\x37\x20\x34\x35\x37\x2e\x36\x37\ -\x20\x43\x20\x34\x38\x30\x2e\x32\x34\x20\x34\x38\x31\x2e\x31\x31\ -\x20\x35\x32\x31\x2e\x30\x30\x20\x34\x38\x37\x2e\x36\x32\x20\x35\ -\x36\x33\x2e\x32\x35\x20\x34\x37\x37\x2e\x32\x31\x20\x43\x20\x36\ -\x30\x32\x2e\x31\x34\x20\x34\x39\x38\x2e\x34\x33\x20\x36\x34\x32\ -\x2e\x35\x35\x20\x34\x39\x39\x2e\x35\x33\x20\x36\x38\x34\x2e\x34\ -\x37\x20\x34\x38\x30\x2e\x35\x32\x20\x43\x20\x37\x30\x32\x2e\x38\ -\x30\x20\x35\x32\x30\x2e\x37\x32\x20\x37\x32\x31\x2e\x35\x37\x20\ -\x35\x33\x31\x2e\x35\x30\x20\x37\x34\x30\x2e\x37\x37\x20\x35\x31\ -\x32\x2e\x38\x36\x20\x43\x20\x37\x35\x35\x2e\x37\x30\x20\x34\x39\ -\x32\x2e\x36\x31\x20\x37\x35\x39\x2e\x36\x37\x20\x34\x35\x32\x2e\ -\x38\x35\x20\x37\x35\x32\x2e\x36\x37\x20\x33\x39\x33\x2e\x35\x38\ -\x20\x43\x20\x36\x31\x37\x2e\x32\x32\x20\x32\x36\x38\x2e\x38\x38\ -\x20\x35\x31\x37\x2e\x34\x31\x20\x32\x30\x36\x2e\x32\x39\x20\x34\ -\x35\x33\x2e\x32\x35\x20\x32\x30\x35\x2e\x37\x39\x20\x43\x20\x33\ -\x38\x39\x2e\x30\x39\x20\x32\x30\x35\x2e\x32\x38\x20\x33\x30\x35\ -\x2e\x38\x34\x20\x32\x36\x36\x2e\x34\x35\x20\x32\x30\x33\x2e\x35\ -\x30\x20\x33\x38\x39\x2e\x32\x38\x20\x4c\x20\x31\x38\x34\x2e\x36\ -\x32\x20\x33\x39\x30\x2e\x38\x34\x20\x5a\x22\x0d\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x33\x38\ -\x32\x32\x32\x32\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\ -\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x69\x64\x3d\x22\xe8\x92\ -\x99\xe7\x89\x88\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x34\ -\x32\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\ -\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\ -\x33\x32\x37\x2e\x31\x39\x38\x31\x22\x0d\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\ -\x68\x3d\x22\x35\x38\x39\x2e\x33\x35\x39\x31\x22\x20\x74\x61\x72\ -\x67\x65\x74\x2d\x78\x3d\x22\x31\x37\x30\x2e\x33\x31\x30\x31\x32\ -\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x32\x30\x35\x2e\ -\x32\x38\x33\x33\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\ -\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x36\x39\ -\x30\x2e\x36\x30\x20\x34\x35\x36\x2e\x31\x32\x20\x43\x20\x37\x30\ -\x34\x2e\x38\x34\x20\x34\x39\x31\x2e\x35\x32\x20\x37\x31\x38\x2e\ -\x36\x35\x20\x35\x31\x32\x2e\x35\x39\x20\x37\x33\x32\x2e\x30\x32\ -\x20\x35\x31\x39\x2e\x33\x34\x20\x43\x20\x37\x31\x35\x2e\x38\x36\ -\x20\x35\x32\x37\x2e\x35\x33\x20\x37\x30\x30\x2e\x30\x31\x20\x35\ -\x31\x34\x2e\x36\x30\x20\x36\x38\x34\x2e\x34\x37\x20\x34\x38\x30\ -\x2e\x35\x32\x20\x43\x20\x36\x34\x32\x2e\x35\x35\x20\x34\x39\x39\ -\x2e\x35\x33\x20\x36\x30\x32\x2e\x31\x34\x20\x34\x39\x38\x2e\x34\ -\x33\x20\x35\x36\x33\x2e\x32\x35\x20\x34\x37\x37\x2e\x32\x31\x20\ -\x43\x20\x35\x32\x36\x2e\x33\x31\x20\x34\x38\x36\x2e\x33\x31\x20\ -\x34\x39\x30\x2e\x35\x31\x20\x34\x38\x32\x2e\x34\x38\x20\x34\x35\ -\x35\x2e\x38\x35\x20\x34\x36\x35\x2e\x37\x31\x20\x4c\x20\x34\x34\ -\x38\x2e\x31\x39\x20\x34\x35\x36\x2e\x31\x32\x20\x43\x20\x34\x39\ -\x31\x2e\x30\x38\x20\x34\x36\x39\x2e\x34\x39\x20\x35\x33\x32\x2e\ -\x30\x33\x20\x34\x37\x31\x2e\x39\x38\x20\x35\x37\x31\x2e\x30\x32\ -\x20\x34\x36\x33\x2e\x35\x38\x20\x43\x20\x36\x30\x39\x2e\x34\x39\ -\x20\x34\x38\x39\x2e\x35\x36\x20\x36\x34\x39\x2e\x33\x35\x20\x34\ -\x38\x37\x2e\x30\x37\x20\x36\x39\x30\x2e\x36\x30\x20\x34\x35\x36\ -\x2e\x31\x32\x20\x5a\x20\x4d\x20\x32\x38\x32\x2e\x30\x33\x20\x34\ -\x36\x33\x2e\x35\x38\x20\x4c\x20\x33\x30\x37\x2e\x38\x33\x20\x34\ -\x37\x37\x2e\x35\x39\x20\x43\x20\x33\x30\x31\x2e\x31\x35\x20\x34\ -\x38\x32\x2e\x39\x38\x20\x32\x39\x32\x2e\x38\x33\x20\x34\x38\x38\ -\x2e\x34\x39\x20\x32\x38\x33\x2e\x36\x37\x20\x34\x39\x33\x2e\x34\ -\x35\x20\x4c\x20\x32\x37\x39\x2e\x30\x32\x20\x34\x39\x35\x2e\x38\ -\x38\x20\x43\x20\x32\x35\x30\x2e\x37\x33\x20\x35\x31\x30\x2e\x31\ -\x34\x20\x32\x31\x35\x2e\x39\x33\x20\x35\x31\x38\x2e\x33\x38\x20\ -\x31\x39\x35\x2e\x35\x31\x20\x35\x30\x32\x2e\x31\x34\x20\x43\x20\ -\x32\x32\x33\x2e\x36\x32\x20\x35\x31\x35\x2e\x31\x31\x20\x32\x35\ -\x31\x2e\x38\x30\x20\x35\x30\x33\x2e\x31\x33\x20\x32\x38\x30\x2e\ -\x30\x36\x20\x34\x36\x36\x2e\x32\x30\x20\x4c\x20\x32\x38\x32\x2e\ -\x30\x33\x20\x34\x36\x33\x2e\x35\x38\x20\x5a\x20\x4d\x20\x35\x36\ -\x32\x2e\x31\x32\x20\x32\x36\x36\x2e\x36\x31\x20\x43\x20\x35\x36\ -\x33\x2e\x32\x33\x20\x32\x36\x36\x2e\x36\x31\x20\x35\x36\x34\x2e\ -\x31\x39\x20\x32\x36\x37\x2e\x38\x34\x20\x35\x36\x35\x2e\x30\x32\ -\x20\x32\x37\x30\x2e\x33\x32\x20\x4c\x20\x35\x36\x35\x2e\x35\x30\ -\x20\x32\x37\x31\x2e\x39\x35\x20\x4c\x20\x35\x36\x35\x2e\x35\x30\ -\x20\x32\x37\x31\x2e\x39\x35\x20\x4c\x20\x35\x36\x35\x2e\x39\x35\ -\x20\x32\x37\x33\x2e\x38\x38\x20\x4c\x20\x35\x36\x35\x2e\x39\x35\ -\x20\x32\x37\x33\x2e\x38\x38\x20\x4c\x20\x35\x36\x36\x2e\x33\x37\ -\x20\x32\x37\x36\x2e\x31\x31\x20\x4c\x20\x35\x36\x36\x2e\x33\x37\ -\x20\x32\x37\x36\x2e\x31\x31\x20\x4c\x20\x35\x36\x36\x2e\x37\x35\ -\x20\x32\x37\x38\x2e\x36\x33\x20\x4c\x20\x35\x36\x36\x2e\x37\x35\ -\x20\x32\x37\x38\x2e\x36\x33\x20\x4c\x20\x35\x36\x37\x2e\x31\x31\ -\x20\x32\x38\x31\x2e\x34\x35\x20\x4c\x20\x35\x36\x37\x2e\x31\x31\ -\x20\x32\x38\x31\x2e\x34\x35\x20\x4c\x20\x35\x36\x37\x2e\x34\x33\ -\x20\x32\x38\x34\x2e\x35\x37\x20\x4c\x20\x35\x36\x37\x2e\x34\x33\ -\x20\x32\x38\x34\x2e\x35\x37\x20\x4c\x20\x35\x36\x37\x2e\x37\x31\ -\x20\x32\x38\x37\x2e\x39\x38\x20\x4c\x20\x35\x36\x37\x2e\x37\x31\ -\x20\x32\x38\x37\x2e\x39\x38\x20\x4c\x20\x35\x36\x38\x2e\x30\x38\ -\x20\x32\x39\x33\x2e\x36\x36\x20\x4c\x20\x35\x36\x38\x2e\x30\x38\ -\x20\x32\x39\x33\x2e\x36\x36\x20\x4c\x20\x35\x36\x38\x2e\x32\x39\ -\x20\x32\x39\x37\x2e\x38\x32\x20\x4c\x20\x35\x36\x38\x2e\x32\x39\ -\x20\x32\x39\x37\x2e\x38\x32\x20\x4c\x20\x35\x36\x38\x2e\x35\x33\ -\x20\x33\x30\x34\x2e\x36\x31\x20\x4c\x20\x35\x36\x38\x2e\x35\x33\ -\x20\x33\x30\x34\x2e\x36\x31\x20\x4c\x20\x35\x36\x38\x2e\x36\x36\ -\x20\x33\x30\x39\x2e\x35\x31\x20\x4c\x20\x35\x36\x38\x2e\x36\x36\ -\x20\x33\x30\x39\x2e\x35\x31\x20\x4c\x20\x35\x36\x38\x2e\x38\x31\ -\x20\x33\x32\x30\x2e\x32\x30\x20\x4c\x20\x35\x36\x38\x2e\x38\x31\ -\x20\x33\x32\x30\x2e\x32\x30\x20\x4c\x20\x35\x36\x38\x2e\x38\x34\ -\x20\x33\x32\x39\x2e\x30\x30\x20\x4c\x20\x35\x36\x38\x2e\x38\x34\ -\x20\x33\x32\x39\x2e\x30\x30\x20\x4c\x20\x35\x36\x38\x2e\x37\x39\ -\x20\x33\x33\x38\x2e\x34\x36\x20\x4c\x20\x35\x36\x38\x2e\x37\x39\ -\x20\x33\x33\x38\x2e\x34\x36\x20\x4c\x20\x35\x36\x38\x2e\x36\x31\ -\x20\x33\x35\x32\x2e\x31\x32\x20\x4c\x20\x35\x36\x38\x2e\x36\x31\ -\x20\x33\x35\x32\x2e\x31\x32\x20\x4c\x20\x35\x36\x38\x2e\x34\x30\ -\x20\x33\x36\x33\x2e\x31\x34\x20\x4c\x20\x35\x36\x38\x2e\x34\x30\ -\x20\x33\x36\x33\x2e\x31\x34\x20\x4c\x20\x35\x36\x38\x2e\x31\x31\ -\x20\x33\x37\x34\x2e\x38\x33\x20\x4c\x20\x35\x36\x38\x2e\x31\x31\ -\x20\x33\x37\x34\x2e\x38\x33\x20\x43\x20\x35\x34\x34\x2e\x34\x31\ -\x20\x33\x34\x34\x2e\x35\x32\x20\x35\x30\x34\x2e\x34\x34\x20\x33\ -\x32\x39\x2e\x33\x36\x20\x34\x34\x38\x2e\x31\x39\x20\x33\x32\x39\ -\x2e\x33\x36\x20\x43\x20\x33\x39\x32\x2e\x38\x32\x20\x33\x32\x39\ -\x2e\x33\x36\x20\x33\x37\x30\x2e\x32\x39\x20\x33\x36\x35\x2e\x34\ -\x31\x20\x33\x38\x30\x2e\x35\x39\x20\x34\x33\x37\x2e\x34\x39\x20\ -\x4c\x20\x33\x38\x31\x2e\x31\x30\x20\x34\x34\x30\x2e\x39\x35\x20\ -\x4c\x20\x33\x30\x30\x2e\x39\x38\x20\x34\x35\x30\x2e\x39\x38\x20\ -\x4c\x20\x33\x31\x33\x2e\x39\x39\x20\x33\x32\x36\x2e\x33\x36\x20\ -\x4c\x20\x33\x31\x33\x2e\x39\x39\x20\x33\x32\x36\x2e\x33\x36\x20\ -\x4c\x20\x33\x31\x37\x2e\x33\x36\x20\x32\x39\x31\x2e\x36\x37\x20\ -\x4c\x20\x33\x31\x37\x2e\x33\x36\x20\x32\x39\x31\x2e\x36\x37\x20\ -\x4c\x20\x33\x31\x37\x2e\x39\x36\x20\x32\x38\x34\x2e\x35\x32\x20\ -\x4c\x20\x33\x31\x37\x2e\x39\x36\x20\x32\x38\x34\x2e\x35\x32\x20\ -\x4c\x20\x33\x31\x38\x2e\x31\x35\x20\x32\x38\x31\x2e\x32\x32\x20\ -\x43\x20\x33\x31\x38\x2e\x31\x35\x20\x32\x38\x31\x2e\x31\x30\x20\ -\x33\x31\x38\x2e\x31\x36\x20\x32\x38\x31\x2e\x30\x31\x20\x33\x31\ -\x38\x2e\x31\x36\x20\x32\x38\x30\x2e\x39\x32\x20\x43\x20\x33\x31\ -\x38\x2e\x31\x36\x20\x32\x38\x30\x2e\x34\x30\x20\x33\x31\x39\x2e\ -\x30\x34\x20\x32\x37\x39\x2e\x38\x39\x20\x33\x32\x30\x2e\x37\x30\ -\x20\x32\x37\x39\x2e\x34\x30\x20\x4c\x20\x33\x32\x32\x2e\x33\x30\ -\x20\x32\x37\x38\x2e\x39\x37\x20\x43\x20\x33\x32\x32\x2e\x36\x30\ -\x20\x32\x37\x38\x2e\x39\x30\x20\x33\x32\x32\x2e\x39\x32\x20\x32\ -\x37\x38\x2e\x38\x33\x20\x33\x32\x33\x2e\x32\x35\x20\x32\x37\x38\ -\x2e\x37\x36\x20\x4c\x20\x33\x32\x35\x2e\x34\x30\x20\x32\x37\x38\ -\x2e\x33\x35\x20\x4c\x20\x33\x32\x35\x2e\x34\x30\x20\x32\x37\x38\ -\x2e\x33\x35\x20\x4c\x20\x33\x32\x39\x2e\x32\x36\x20\x32\x37\x37\ -\x2e\x37\x33\x20\x4c\x20\x33\x32\x39\x2e\x32\x36\x20\x32\x37\x37\ -\x2e\x37\x33\x20\x4c\x20\x33\x33\x33\x2e\x38\x35\x20\x32\x37\x37\ -\x2e\x31\x33\x20\x4c\x20\x33\x33\x33\x2e\x38\x35\x20\x32\x37\x37\ -\x2e\x31\x33\x20\x4c\x20\x33\x34\x31\x2e\x30\x30\x20\x32\x37\x36\ -\x2e\x33\x35\x20\x4c\x20\x33\x34\x31\x2e\x30\x30\x20\x32\x37\x36\ -\x2e\x33\x35\x20\x4c\x20\x33\x35\x31\x2e\x34\x33\x20\x32\x37\x35\ -\x2e\x34\x30\x20\x4c\x20\x33\x35\x31\x2e\x34\x33\x20\x32\x37\x35\ -\x2e\x34\x30\x20\x4c\x20\x33\x36\x38\x2e\x34\x33\x20\x32\x37\x34\ -\x2e\x31\x35\x20\x4c\x20\x33\x36\x38\x2e\x34\x33\x20\x32\x37\x34\ -\x2e\x31\x35\x20\x4c\x20\x33\x38\x34\x2e\x37\x37\x20\x32\x37\x33\ -\x2e\x31\x34\x20\x4c\x20\x33\x38\x34\x2e\x37\x37\x20\x32\x37\x33\ -\x2e\x31\x34\x20\x4c\x20\x34\x31\x31\x2e\x34\x34\x20\x32\x37\x31\ -\x2e\x37\x33\x20\x4c\x20\x34\x31\x31\x2e\x34\x34\x20\x32\x37\x31\ -\x2e\x37\x33\x20\x4c\x20\x34\x32\x36\x2e\x39\x34\x20\x32\x37\x31\ -\x2e\x30\x32\x20\x4c\x20\x34\x32\x36\x2e\x39\x34\x20\x32\x37\x31\ -\x2e\x30\x32\x20\x4c\x20\x34\x36\x31\x2e\x39\x37\x20\x32\x36\x39\ -\x2e\x35\x39\x20\x4c\x20\x34\x36\x31\x2e\x39\x37\x20\x32\x36\x39\ -\x2e\x35\x39\x20\x4c\x20\x35\x31\x37\x2e\x37\x30\x20\x32\x36\x37\ -\x2e\x37\x33\x20\x4c\x20\x35\x31\x37\x2e\x37\x30\x20\x32\x36\x37\ -\x2e\x37\x33\x20\x4c\x20\x35\x36\x31\x2e\x32\x31\x20\x32\x36\x36\ -\x2e\x36\x31\x20\x4c\x20\x35\x36\x31\x2e\x32\x31\x20\x32\x36\x36\ -\x2e\x36\x31\x20\x4c\x20\x35\x36\x32\x2e\x31\x32\x20\x32\x36\x36\ -\x2e\x36\x31\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x32\x32\x31\x30\x31\x30\x22\ -\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\ -\x6f\x64\x64\x22\x20\x69\x64\x3d\x22\xe5\xbd\xa2\xe7\x8a\xb6\x22\ -\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x34\x33\x22\x20\x73\x74\ -\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\x20\x74\x61\x72\x67\ -\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x36\x30\x2e\x39\ -\x32\x39\x38\x34\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x74\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x35\ -\x33\x36\x2e\x35\x31\x38\x37\x34\x22\x20\x74\x61\x72\x67\x65\x74\ -\x2d\x78\x3d\x22\x31\x39\x35\x2e\x35\x30\x36\x32\x33\x22\x20\x74\ -\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x32\x36\x36\x2e\x36\x30\x35\ -\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\ -\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x34\x38\x30\x2e\x37\x30\ -\x20\x39\x33\x2e\x30\x39\x20\x43\x20\x34\x39\x35\x2e\x30\x31\x20\ -\x39\x33\x2e\x30\x39\x20\x35\x30\x37\x2e\x31\x36\x20\x31\x30\x33\ -\x2e\x33\x37\x20\x35\x31\x31\x2e\x35\x30\x20\x31\x31\x37\x2e\x36\ -\x34\x20\x43\x20\x36\x38\x36\x2e\x31\x38\x20\x31\x34\x31\x2e\x31\ -\x31\x20\x37\x36\x39\x2e\x31\x34\x20\x32\x34\x38\x2e\x30\x39\x20\ -\x37\x36\x30\x2e\x34\x31\x20\x34\x33\x38\x2e\x35\x37\x20\x43\x20\ -\x36\x38\x30\x2e\x39\x33\x20\x34\x35\x35\x2e\x32\x35\x20\x35\x38\ -\x30\x2e\x37\x35\x20\x34\x36\x33\x2e\x35\x38\x20\x34\x35\x39\x2e\ -\x38\x38\x20\x34\x36\x33\x2e\x35\x38\x20\x43\x20\x33\x33\x39\x2e\ -\x30\x30\x20\x34\x36\x33\x2e\x35\x38\x20\x32\x34\x33\x2e\x36\x37\ -\x20\x34\x35\x38\x2e\x35\x34\x20\x31\x37\x33\x2e\x38\x39\x20\x34\ -\x34\x38\x2e\x34\x34\x20\x43\x20\x31\x36\x36\x2e\x31\x36\x20\x32\ -\x33\x35\x2e\x32\x36\x20\x32\x35\x38\x2e\x33\x37\x20\x31\x32\x34\ -\x2e\x33\x37\x20\x34\x35\x30\x2e\x35\x31\x20\x31\x31\x35\x2e\x37\ -\x36\x20\x4c\x20\x34\x35\x30\x2e\x35\x32\x20\x31\x31\x35\x2e\x37\ -\x37\x20\x43\x20\x34\x35\x35\x2e\x33\x31\x20\x31\x30\x32\x2e\x34\ -\x38\x20\x34\x36\x37\x2e\x30\x32\x20\x39\x33\x2e\x30\x39\x20\x34\ -\x38\x30\x2e\x37\x30\x20\x39\x33\x2e\x30\x39\x20\x5a\x20\x4d\x20\ -\x34\x35\x39\x2e\x38\x38\x20\x33\x30\x32\x2e\x35\x34\x20\x43\x20\ -\x33\x37\x34\x2e\x34\x31\x20\x33\x30\x33\x2e\x38\x39\x20\x33\x33\ -\x34\x2e\x30\x34\x20\x33\x34\x36\x2e\x35\x31\x20\x33\x33\x38\x2e\ -\x37\x36\x20\x34\x33\x30\x2e\x34\x31\x20\x43\x20\x34\x31\x37\x2e\ -\x34\x39\x20\x34\x34\x32\x2e\x33\x31\x20\x34\x39\x32\x2e\x35\x30\ -\x20\x34\x34\x32\x2e\x33\x31\x20\x35\x36\x33\x2e\x37\x38\x20\x34\ -\x33\x30\x2e\x34\x31\x20\x43\x20\x35\x38\x32\x2e\x39\x31\x20\x34\ -\x30\x30\x2e\x39\x31\x20\x35\x34\x34\x2e\x38\x35\x20\x33\x30\x32\ -\x2e\x33\x31\x20\x34\x35\x39\x2e\x38\x38\x20\x33\x30\x32\x2e\x35\ -\x34\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x66\x69\x6c\x6c\x3d\x22\x23\x66\x66\x63\x36\x33\x31\x22\x20\x66\ -\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\ -\x64\x22\x20\x69\x64\x3d\x22\xe8\x92\x99\xe7\x89\x88\x22\x20\x6e\ -\x6f\x64\x65\x2d\x69\x64\x3d\x22\x34\x34\x22\x20\x73\x74\x72\x6f\ -\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\x20\x74\x61\x72\x67\x65\x74\ -\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x37\x30\x2e\x34\x39\x32\ -\x36\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\ -\x72\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x36\x30\x32\x2e\ -\x39\x38\x30\x32\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\ -\x31\x36\x36\x2e\x31\x36\x31\x31\x33\x22\x20\x74\x61\x72\x67\x65\ -\x74\x2d\x79\x3d\x22\x39\x33\x2e\x30\x39\x30\x39\x31\x22\x3e\x3c\ -\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\ -\x68\x20\x64\x3d\x22\x4d\x20\x35\x31\x38\x2e\x30\x38\x20\x31\x31\ -\x39\x2e\x39\x36\x20\x4c\x20\x35\x31\x34\x2e\x31\x32\x20\x31\x31\ -\x38\x2e\x30\x30\x20\x4c\x20\x35\x32\x31\x2e\x38\x37\x20\x31\x31\ -\x39\x2e\x31\x35\x20\x43\x20\x36\x38\x39\x2e\x34\x36\x20\x31\x34\ -\x35\x2e\x34\x32\x20\x37\x36\x38\x2e\x39\x37\x20\x32\x35\x31\x2e\ -\x38\x39\x20\x37\x36\x30\x2e\x34\x31\x20\x34\x33\x38\x2e\x35\x37\ -\x20\x43\x20\x36\x38\x37\x2e\x30\x34\x20\x34\x35\x33\x2e\x39\x36\ -\x20\x35\x39\x36\x2e\x30\x34\x20\x34\x36\x32\x2e\x32\x35\x20\x34\ -\x38\x37\x2e\x34\x30\x20\x34\x36\x33\x2e\x34\x34\x20\x4c\x20\x34\ -\x36\x39\x2e\x31\x33\x20\x34\x36\x33\x2e\x35\x37\x20\x43\x20\x34\ -\x36\x36\x2e\x30\x36\x20\x34\x36\x33\x2e\x35\x38\x20\x34\x36\x32\ -\x2e\x39\x38\x20\x34\x36\x33\x2e\x35\x38\x20\x34\x35\x39\x2e\x38\ -\x38\x20\x34\x36\x33\x2e\x35\x38\x20\x4c\x20\x34\x33\x39\x2e\x37\ -\x31\x20\x34\x36\x33\x2e\x35\x34\x20\x43\x20\x34\x33\x33\x2e\x30\ -\x36\x20\x34\x36\x33\x2e\x35\x30\x20\x34\x32\x36\x2e\x35\x30\x20\ -\x34\x36\x33\x2e\x34\x36\x20\x34\x32\x30\x2e\x30\x32\x20\x34\x36\ -\x33\x2e\x33\x39\x20\x4c\x20\x34\x30\x30\x2e\x38\x32\x20\x34\x36\ -\x33\x2e\x31\x35\x20\x4c\x20\x34\x30\x30\x2e\x38\x32\x20\x34\x36\ -\x33\x2e\x31\x35\x20\x4c\x20\x33\x38\x32\x2e\x31\x31\x20\x34\x36\ -\x32\x2e\x38\x32\x20\x4c\x20\x33\x38\x32\x2e\x31\x31\x20\x34\x36\ -\x32\x2e\x38\x32\x20\x4c\x20\x33\x36\x33\x2e\x38\x38\x20\x34\x36\ -\x32\x2e\x33\x38\x20\x43\x20\x33\x36\x30\x2e\x38\x39\x20\x34\x36\ -\x32\x2e\x33\x30\x20\x33\x35\x37\x2e\x39\x31\x20\x34\x36\x32\x2e\ -\x32\x32\x20\x33\x35\x34\x2e\x39\x35\x20\x34\x36\x32\x2e\x31\x33\ -\x20\x4c\x20\x33\x33\x37\x2e\x34\x35\x20\x34\x36\x31\x2e\x35\x36\ -\x20\x4c\x20\x33\x33\x37\x2e\x34\x35\x20\x34\x36\x31\x2e\x35\x36\ -\x20\x4c\x20\x33\x32\x30\x2e\x34\x34\x20\x34\x36\x30\x2e\x38\x38\ -\x20\x4c\x20\x33\x32\x30\x2e\x34\x34\x20\x34\x36\x30\x2e\x38\x38\ -\x20\x43\x20\x33\x32\x36\x2e\x30\x34\x20\x34\x34\x36\x2e\x31\x38\ -\x20\x33\x33\x32\x2e\x30\x35\x20\x34\x33\x32\x2e\x36\x34\x20\x33\ -\x33\x38\x2e\x33\x39\x20\x34\x32\x30\x2e\x31\x36\x20\x43\x20\x33\ -\x33\x38\x2e\x34\x34\x20\x34\x32\x33\x2e\x35\x31\x20\x33\x33\x38\ -\x2e\x35\x36\x20\x34\x32\x36\x2e\x39\x32\x20\x33\x33\x38\x2e\x37\ -\x36\x20\x34\x33\x30\x2e\x34\x31\x20\x43\x20\x34\x31\x37\x2e\x34\ -\x39\x20\x34\x34\x32\x2e\x33\x31\x20\x34\x39\x32\x2e\x35\x30\x20\ -\x34\x34\x32\x2e\x33\x31\x20\x35\x36\x33\x2e\x37\x38\x20\x34\x33\ -\x30\x2e\x34\x31\x20\x43\x20\x35\x38\x32\x2e\x39\x31\x20\x34\x30\ -\x30\x2e\x39\x31\x20\x35\x34\x34\x2e\x38\x35\x20\x33\x30\x32\x2e\ -\x33\x31\x20\x34\x35\x39\x2e\x38\x38\x20\x33\x30\x32\x2e\x35\x34\ -\x20\x43\x20\x34\x35\x33\x2e\x30\x33\x20\x33\x30\x32\x2e\x36\x35\ -\x20\x34\x34\x36\x2e\x34\x38\x20\x33\x30\x33\x2e\x30\x32\x20\x34\ -\x34\x30\x2e\x32\x31\x20\x33\x30\x33\x2e\x36\x36\x20\x43\x20\x34\ -\x36\x32\x2e\x38\x35\x20\x32\x38\x38\x2e\x39\x32\x20\x34\x38\x35\ -\x2e\x34\x37\x20\x32\x37\x38\x2e\x37\x33\x20\x35\x30\x36\x2e\x33\ -\x35\x20\x32\x37\x30\x2e\x34\x39\x20\x4c\x20\x35\x31\x34\x2e\x36\ -\x30\x20\x32\x36\x37\x2e\x32\x39\x20\x4c\x20\x35\x31\x34\x2e\x36\ -\x30\x20\x32\x36\x37\x2e\x32\x39\x20\x4c\x20\x35\x32\x32\x2e\x36\ -\x35\x20\x32\x36\x34\x2e\x32\x37\x20\x4c\x20\x35\x32\x32\x2e\x36\ -\x35\x20\x32\x36\x34\x2e\x32\x37\x20\x4c\x20\x35\x34\x31\x2e\x36\ -\x38\x20\x32\x35\x37\x2e\x32\x31\x20\x4c\x20\x35\x34\x31\x2e\x36\ -\x38\x20\x32\x35\x37\x2e\x32\x31\x20\x4c\x20\x35\x34\x38\x2e\x38\ -\x30\x20\x32\x35\x34\x2e\x35\x30\x20\x43\x20\x35\x35\x36\x2e\x39\ -\x32\x20\x32\x35\x31\x2e\x33\x34\x20\x35\x36\x34\x2e\x33\x39\x20\ -\x32\x34\x38\x2e\x31\x39\x20\x35\x37\x31\x2e\x30\x32\x20\x32\x34\ -\x34\x2e\x38\x30\x20\x43\x20\x36\x31\x34\x2e\x36\x33\x20\x32\x32\ -\x32\x2e\x34\x39\x20\x36\x30\x39\x2e\x30\x33\x20\x31\x39\x30\x2e\ -\x34\x33\x20\x35\x37\x38\x2e\x30\x38\x20\x31\x36\x30\x2e\x35\x32\ -\x20\x4c\x20\x35\x37\x35\x2e\x30\x31\x20\x31\x35\x37\x2e\x36\x33\ -\x20\x43\x20\x35\x37\x33\x2e\x39\x36\x20\x31\x35\x36\x2e\x36\x37\ -\x20\x35\x37\x32\x2e\x38\x39\x20\x31\x35\x35\x2e\x37\x32\x20\x35\ -\x37\x31\x2e\x37\x38\x20\x31\x35\x34\x2e\x37\x36\x20\x4c\x20\x35\ -\x36\x38\x2e\x34\x31\x20\x31\x35\x31\x2e\x39\x31\x20\x43\x20\x35\ -\x36\x37\x2e\x38\x34\x20\x31\x35\x31\x2e\x34\x33\x20\x35\x36\x37\ -\x2e\x32\x36\x20\x31\x35\x30\x2e\x39\x36\x20\x35\x36\x36\x2e\x36\ -\x37\x20\x31\x35\x30\x2e\x34\x39\x20\x4c\x20\x35\x36\x33\x2e\x30\ -\x38\x20\x31\x34\x37\x2e\x36\x37\x20\x4c\x20\x35\x36\x33\x2e\x30\ -\x38\x20\x31\x34\x37\x2e\x36\x37\x20\x4c\x20\x35\x35\x39\x2e\x33\ -\x36\x20\x31\x34\x34\x2e\x38\x37\x20\x4c\x20\x35\x35\x39\x2e\x33\ -\x36\x20\x31\x34\x34\x2e\x38\x37\x20\x4c\x20\x35\x35\x35\x2e\x35\ -\x30\x20\x31\x34\x32\x2e\x31\x30\x20\x43\x20\x35\x35\x34\x2e\x38\ -\x34\x20\x31\x34\x31\x2e\x36\x34\x20\x35\x35\x34\x2e\x31\x39\x20\ -\x31\x34\x31\x2e\x31\x38\x20\x35\x35\x33\x2e\x35\x32\x20\x31\x34\ -\x30\x2e\x37\x32\x20\x4c\x20\x35\x34\x39\x2e\x34\x38\x20\x31\x33\ -\x38\x2e\x30\x30\x20\x43\x20\x35\x34\x38\x2e\x31\x31\x20\x31\x33\ -\x37\x2e\x31\x30\x20\x35\x34\x36\x2e\x37\x32\x20\x31\x33\x36\x2e\ -\x32\x30\x20\x35\x34\x35\x2e\x33\x31\x20\x31\x33\x35\x2e\x33\x30\ -\x20\x4c\x20\x35\x34\x31\x2e\x30\x33\x20\x31\x33\x32\x2e\x36\x35\ -\x20\x43\x20\x35\x34\x30\x2e\x33\x31\x20\x31\x33\x32\x2e\x32\x31\ -\x20\x35\x33\x39\x2e\x35\x38\x20\x31\x33\x31\x2e\x37\x37\x20\x35\ -\x33\x38\x2e\x38\x35\x20\x31\x33\x31\x2e\x33\x33\x20\x4c\x20\x35\ -\x33\x34\x2e\x34\x31\x20\x31\x32\x38\x2e\x37\x33\x20\x43\x20\x35\ -\x33\x33\x2e\x36\x36\x20\x31\x32\x38\x2e\x33\x30\x20\x35\x33\x32\ -\x2e\x39\x30\x20\x31\x32\x37\x2e\x38\x37\x20\x35\x33\x32\x2e\x31\ -\x35\x20\x31\x32\x37\x2e\x34\x34\x20\x4c\x20\x35\x32\x37\x2e\x35\ -\x35\x20\x31\x32\x34\x2e\x39\x30\x20\x4c\x20\x35\x32\x37\x2e\x35\ -\x35\x20\x31\x32\x34\x2e\x39\x30\x20\x4c\x20\x35\x32\x32\x2e\x38\ -\x36\x20\x31\x32\x32\x2e\x34\x31\x20\x4c\x20\x35\x32\x32\x2e\x38\ -\x36\x20\x31\x32\x32\x2e\x34\x31\x20\x4c\x20\x35\x31\x38\x2e\x30\ -\x38\x20\x31\x31\x39\x2e\x39\x36\x20\x4c\x20\x35\x31\x38\x2e\x30\ -\x38\x20\x31\x31\x39\x2e\x39\x36\x20\x5a\x20\x4d\x20\x35\x31\x30\ -\x2e\x39\x32\x20\x31\x31\x35\x2e\x38\x38\x20\x4c\x20\x35\x31\x31\ -\x2e\x33\x38\x20\x31\x31\x37\x2e\x32\x31\x20\x4c\x20\x35\x30\x37\ -\x2e\x37\x36\x20\x31\x31\x36\x2e\x35\x34\x20\x43\x20\x35\x30\x31\ -\x2e\x38\x36\x20\x31\x31\x35\x2e\x35\x31\x20\x34\x39\x33\x2e\x39\ -\x37\x20\x31\x31\x34\x2e\x35\x30\x20\x34\x38\x35\x2e\x38\x31\x20\ -\x31\x31\x35\x2e\x31\x36\x20\x43\x20\x34\x38\x39\x2e\x38\x36\x20\ -\x31\x30\x39\x2e\x31\x37\x20\x34\x38\x39\x2e\x35\x30\x20\x31\x30\ -\x31\x2e\x39\x31\x20\x34\x38\x34\x2e\x37\x32\x20\x39\x33\x2e\x33\ -\x38\x20\x43\x20\x34\x39\x36\x2e\x30\x34\x20\x39\x34\x2e\x39\x32\ -\x20\x35\x30\x35\x2e\x35\x37\x20\x31\x30\x32\x2e\x39\x34\x20\x35\ -\x31\x30\x2e\x31\x39\x20\x31\x31\x34\x2e\x30\x30\x20\x4c\x20\x35\ -\x31\x30\x2e\x39\x32\x20\x31\x31\x35\x2e\x38\x38\x20\x5a\x22\x0d\ -\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\ -\x22\x23\x65\x39\x61\x39\x30\x30\x22\x20\x66\x69\x6c\x6c\x2d\x72\ -\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x69\x64\ -\x3d\x22\xe5\xbd\xa2\xe7\x8a\xb6\x22\x20\x6e\x6f\x64\x65\x2d\x69\ -\x64\x3d\x22\x34\x35\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\ -\x6f\x6e\x65\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\ -\x68\x74\x3d\x22\x33\x37\x30\x2e\x32\x30\x36\x22\x0d\x0a\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x77\ -\x69\x64\x74\x68\x3d\x22\x34\x34\x38\x2e\x35\x32\x37\x32\x22\x20\ -\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x33\x32\x30\x2e\x34\x33\ -\x39\x35\x34\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x39\ -\x33\x2e\x33\x37\x37\x35\x32\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\ -\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\ -\x20\x36\x32\x31\x2e\x35\x37\x20\x36\x30\x31\x2e\x38\x30\x20\x43\ -\x20\x36\x32\x31\x2e\x35\x37\x20\x36\x32\x31\x2e\x37\x35\x20\x36\ -\x30\x38\x2e\x36\x33\x20\x36\x33\x37\x2e\x39\x32\x20\x35\x39\x32\ -\x2e\x36\x37\x20\x36\x33\x37\x2e\x39\x32\x20\x43\x20\x35\x37\x36\ -\x2e\x37\x31\x20\x36\x33\x37\x2e\x39\x32\x20\x35\x36\x33\x2e\x37\ -\x38\x20\x36\x32\x31\x2e\x37\x35\x20\x35\x36\x33\x2e\x37\x38\x20\ -\x36\x30\x31\x2e\x38\x30\x20\x43\x20\x35\x36\x33\x2e\x37\x38\x20\ -\x35\x38\x31\x2e\x38\x35\x20\x35\x37\x36\x2e\x37\x31\x20\x35\x36\ -\x35\x2e\x36\x38\x20\x35\x39\x32\x2e\x36\x37\x20\x35\x36\x35\x2e\ -\x36\x38\x20\x43\x20\x36\x30\x38\x2e\x36\x33\x20\x35\x36\x35\x2e\ -\x36\x38\x20\x36\x32\x31\x2e\x35\x37\x20\x35\x38\x31\x2e\x38\x35\ -\x20\x36\x32\x31\x2e\x35\x37\x20\x36\x30\x31\x2e\x38\x30\x20\x5a\ -\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\ -\x6c\x3d\x22\x23\x36\x32\x33\x64\x33\x64\x22\x20\x66\x69\x6c\x6c\ -\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\ -\x69\x64\x3d\x22\xe6\xa4\xad\xe5\x9c\x86\xe5\xbd\xa2\xe5\xa4\x87\ -\xe4\xbb\xbd\x2d\x33\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\ -\x34\x36\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\ -\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\ -\x22\x37\x32\x2e\x32\x34\x31\x36\x34\x22\x0d\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x77\x69\x64\ -\x74\x68\x3d\x22\x35\x37\x2e\x37\x39\x33\x33\x33\x35\x22\x20\x74\ -\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x35\x36\x33\x2e\x37\x37\x37\ -\x34\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x35\x36\x35\ -\x2e\x36\x37\x37\x37\x33\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\ -\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\ -\x33\x37\x35\x2e\x39\x35\x20\x36\x30\x31\x2e\x38\x30\x20\x43\x20\ -\x33\x37\x35\x2e\x39\x35\x20\x36\x32\x31\x2e\x37\x35\x20\x33\x36\ -\x33\x2e\x30\x31\x20\x36\x33\x37\x2e\x39\x32\x20\x33\x34\x37\x2e\ -\x30\x35\x20\x36\x33\x37\x2e\x39\x32\x20\x43\x20\x33\x33\x31\x2e\ -\x30\x39\x20\x36\x33\x37\x2e\x39\x32\x20\x33\x31\x38\x2e\x31\x36\ -\x20\x36\x32\x31\x2e\x37\x35\x20\x33\x31\x38\x2e\x31\x36\x20\x36\ -\x30\x31\x2e\x38\x30\x20\x43\x20\x33\x31\x38\x2e\x31\x36\x20\x35\ -\x38\x31\x2e\x38\x35\x20\x33\x33\x31\x2e\x30\x39\x20\x35\x36\x35\ -\x2e\x36\x38\x20\x33\x34\x37\x2e\x30\x35\x20\x35\x36\x35\x2e\x36\ -\x38\x20\x43\x20\x33\x36\x33\x2e\x30\x31\x20\x35\x36\x35\x2e\x36\ -\x38\x20\x33\x37\x35\x2e\x39\x35\x20\x35\x38\x31\x2e\x38\x35\x20\ -\x33\x37\x35\x2e\x39\x35\x20\x36\x30\x31\x2e\x38\x30\x20\x5a\x22\ -\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\ -\x3d\x22\x23\x36\x32\x33\x64\x33\x64\x22\x20\x66\x69\x6c\x6c\x2d\ -\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x69\ -\x64\x3d\x22\xe6\xa4\xad\xe5\x9c\x86\xe5\xbd\xa2\xe5\xa4\x87\xe4\ -\xbb\xbd\x2d\x34\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x34\ -\x37\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\ -\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\ -\x37\x32\x2e\x32\x34\x31\x36\x34\x22\x0d\x0a\x20\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\ -\x68\x3d\x22\x35\x37\x2e\x37\x39\x33\x33\x33\x35\x22\x20\x74\x61\ -\x72\x67\x65\x74\x2d\x78\x3d\x22\x33\x31\x38\x2e\x31\x35\x35\x36\ -\x37\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x35\x36\x35\ -\x2e\x36\x37\x37\x37\x33\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\ -\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\ -\x35\x36\x32\x2e\x31\x33\x20\x35\x32\x35\x2e\x38\x38\x20\x4c\x20\ -\x35\x36\x38\x2e\x37\x35\x20\x35\x32\x34\x2e\x31\x30\x20\x4c\x20\ -\x35\x37\x37\x2e\x31\x30\x20\x35\x32\x32\x2e\x33\x36\x20\x4c\x20\ -\x35\x38\x37\x2e\x34\x36\x20\x35\x32\x30\x2e\x37\x30\x20\x4c\x20\ -\x36\x30\x30\x2e\x31\x33\x20\x35\x31\x39\x2e\x31\x36\x20\x4c\x20\ -\x36\x30\x39\x2e\x33\x30\x20\x35\x31\x38\x2e\x35\x32\x20\x4c\x20\ -\x36\x32\x30\x2e\x36\x35\x20\x35\x31\x38\x2e\x34\x30\x20\x4c\x20\ -\x36\x33\x34\x2e\x35\x33\x20\x35\x31\x38\x2e\x39\x31\x20\x4c\x20\ -\x36\x35\x31\x2e\x33\x31\x20\x35\x32\x30\x2e\x32\x30\x20\x4c\x20\ -\x36\x37\x31\x2e\x33\x37\x20\x35\x32\x32\x2e\x34\x31\x20\x4c\x20\ -\x36\x36\x33\x2e\x39\x35\x20\x35\x31\x37\x2e\x30\x36\x20\x4c\x20\ -\x36\x35\x36\x2e\x36\x34\x20\x35\x31\x32\x2e\x34\x36\x20\x4c\x20\ -\x36\x34\x39\x2e\x34\x32\x20\x35\x30\x38\x2e\x35\x36\x20\x4c\x20\ -\x36\x34\x32\x2e\x32\x39\x20\x35\x30\x35\x2e\x33\x31\x20\x4c\x20\ -\x36\x33\x35\x2e\x32\x32\x20\x35\x30\x32\x2e\x36\x39\x20\x4c\x20\ -\x36\x32\x38\x2e\x32\x30\x20\x35\x30\x30\x2e\x36\x36\x20\x4c\x20\ -\x36\x32\x31\x2e\x32\x31\x20\x34\x39\x39\x2e\x32\x32\x20\x4c\x20\ -\x36\x31\x34\x2e\x32\x33\x20\x34\x39\x38\x2e\x33\x33\x20\x4c\x20\ -\x36\x30\x37\x2e\x32\x33\x20\x34\x39\x38\x2e\x30\x30\x20\x4c\x20\ -\x36\x30\x30\x2e\x32\x30\x20\x34\x39\x38\x2e\x32\x32\x20\x4c\x20\ -\x35\x39\x33\x2e\x31\x31\x20\x34\x39\x39\x2e\x30\x30\x20\x4c\x20\ -\x35\x38\x36\x2e\x39\x37\x20\x35\x30\x30\x2e\x34\x36\x20\x4c\x20\ -\x35\x38\x31\x2e\x37\x33\x20\x35\x30\x32\x2e\x32\x34\x20\x4c\x20\ -\x35\x37\x37\x2e\x32\x37\x20\x35\x30\x34\x2e\x32\x39\x20\x4c\x20\ -\x35\x37\x33\x2e\x35\x31\x20\x35\x30\x36\x2e\x36\x30\x20\x4c\x20\ -\x35\x37\x30\x2e\x33\x36\x20\x35\x30\x39\x2e\x31\x34\x20\x4c\x20\ -\x35\x36\x37\x2e\x37\x36\x20\x35\x31\x31\x2e\x39\x31\x20\x4c\x20\ -\x35\x36\x35\x2e\x36\x35\x20\x35\x31\x34\x2e\x39\x34\x20\x4c\x20\ -\x35\x36\x34\x2e\x30\x32\x20\x35\x31\x38\x2e\x32\x35\x20\x4c\x20\ -\x35\x36\x32\x2e\x38\x34\x20\x35\x32\x31\x2e\x38\x38\x20\x4c\x20\ -\x35\x36\x32\x2e\x31\x33\x20\x35\x32\x35\x2e\x38\x38\x20\x5a\x22\ -\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\ -\x3d\x22\x23\x36\x32\x33\x64\x33\x64\x22\x20\x66\x69\x6c\x6c\x2d\ -\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\x20\x67\ -\x72\x6f\x75\x70\x2d\x69\x64\x3d\x22\x39\x22\x20\x69\x64\x3d\x22\ -\xe8\xb7\xaf\xe5\xbe\x84\x2d\x32\x37\x22\x20\x6e\x6f\x64\x65\x2d\ -\x69\x64\x3d\x22\x34\x38\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\ -\x6e\x6f\x6e\x65\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\ -\x32\x37\x2e\x38\x38\x32\x35\x30\x37\x22\x20\x74\x61\x72\x67\x65\ -\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x31\x30\x39\x2e\x32\x34\x32\ -\x36\x37\x36\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x35\ -\x36\x32\x2e\x31\x32\x35\x33\x37\x22\x20\x74\x61\x72\x67\x65\x74\ -\x2d\x79\x3d\x22\x34\x39\x37\x2e\x39\x39\x38\x30\x35\x22\x3e\x3c\ -\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\ -\x68\x20\x64\x3d\x22\x4d\x20\x33\x38\x34\x2e\x34\x37\x20\x35\x32\ -\x35\x2e\x38\x38\x20\x4c\x20\x33\x37\x37\x2e\x38\x34\x20\x35\x32\ -\x34\x2e\x31\x30\x20\x4c\x20\x33\x36\x39\x2e\x34\x39\x20\x35\x32\ -\x32\x2e\x33\x36\x20\x4c\x20\x33\x35\x39\x2e\x31\x33\x20\x35\x32\ -\x30\x2e\x37\x30\x20\x4c\x20\x33\x34\x36\x2e\x34\x36\x20\x35\x31\ -\x39\x2e\x31\x36\x20\x4c\x20\x33\x33\x37\x2e\x33\x30\x20\x35\x31\ -\x38\x2e\x35\x32\x20\x4c\x20\x33\x32\x35\x2e\x39\x34\x20\x35\x31\ -\x38\x2e\x34\x30\x20\x4c\x20\x33\x31\x32\x2e\x30\x36\x20\x35\x31\ -\x38\x2e\x39\x31\x20\x4c\x20\x32\x39\x35\x2e\x32\x39\x20\x35\x32\ -\x30\x2e\x32\x30\x20\x4c\x20\x32\x37\x35\x2e\x32\x33\x20\x35\x32\ -\x32\x2e\x34\x31\x20\x4c\x20\x32\x38\x32\x2e\x36\x35\x20\x35\x31\ -\x37\x2e\x30\x36\x20\x4c\x20\x32\x38\x39\x2e\x39\x36\x20\x35\x31\ -\x32\x2e\x34\x36\x20\x4c\x20\x32\x39\x37\x2e\x31\x37\x20\x35\x30\ -\x38\x2e\x35\x36\x20\x4c\x20\x33\x30\x34\x2e\x33\x30\x20\x35\x30\ -\x35\x2e\x33\x31\x20\x4c\x20\x33\x31\x31\x2e\x33\x37\x20\x35\x30\ -\x32\x2e\x36\x39\x20\x4c\x20\x33\x31\x38\x2e\x33\x39\x20\x35\x30\ -\x30\x2e\x36\x36\x20\x4c\x20\x33\x32\x35\x2e\x33\x38\x20\x34\x39\ -\x39\x2e\x32\x32\x20\x4c\x20\x33\x33\x32\x2e\x33\x37\x20\x34\x39\ -\x38\x2e\x33\x33\x20\x4c\x20\x33\x33\x39\x2e\x33\x37\x20\x34\x39\ -\x38\x2e\x30\x30\x20\x4c\x20\x33\x34\x36\x2e\x34\x30\x20\x34\x39\ -\x38\x2e\x32\x32\x20\x4c\x20\x33\x35\x33\x2e\x34\x39\x20\x34\x39\ -\x39\x2e\x30\x30\x20\x4c\x20\x33\x35\x39\x2e\x36\x32\x20\x35\x30\ -\x30\x2e\x34\x36\x20\x4c\x20\x33\x36\x34\x2e\x38\x37\x20\x35\x30\ -\x32\x2e\x32\x34\x20\x4c\x20\x33\x36\x39\x2e\x33\x32\x20\x35\x30\ -\x34\x2e\x32\x39\x20\x4c\x20\x33\x37\x33\x2e\x30\x38\x20\x35\x30\ -\x36\x2e\x36\x30\x20\x4c\x20\x33\x37\x36\x2e\x32\x33\x20\x35\x30\ -\x39\x2e\x31\x34\x20\x4c\x20\x33\x37\x38\x2e\x38\x34\x20\x35\x31\ -\x31\x2e\x39\x31\x20\x4c\x20\x33\x38\x30\x2e\x39\x34\x20\x35\x31\ -\x34\x2e\x39\x34\x20\x4c\x20\x33\x38\x32\x2e\x35\x38\x20\x35\x31\ -\x38\x2e\x32\x35\x20\x4c\x20\x33\x38\x33\x2e\x37\x36\x20\x35\x32\ -\x31\x2e\x38\x38\x20\x4c\x20\x33\x38\x34\x2e\x34\x37\x20\x35\x32\ -\x35\x2e\x38\x38\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x36\x32\x33\x64\x33\x64\ -\x22\x20\x66\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\ -\x6e\x6f\x64\x64\x22\x20\x67\x72\x6f\x75\x70\x2d\x69\x64\x3d\x22\ -\x31\x30\x22\x20\x69\x64\x3d\x22\xe8\xb7\xaf\xe5\xbe\x84\x2d\x32\ -\x37\xe5\xa4\x87\xe4\xbb\xbd\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\ -\x3d\x22\x34\x39\x22\x20\x73\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\ -\x6e\x65\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\ -\x61\x72\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x32\x37\ -\x2e\x38\x38\x32\x35\x30\x37\x22\x20\x74\x61\x72\x67\x65\x74\x2d\ -\x77\x69\x64\x74\x68\x3d\x22\x31\x30\x39\x2e\x32\x34\x32\x36\x37\ -\x36\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\x22\x32\x37\x35\ -\x2e\x32\x32\x36\x39\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x79\x3d\ -\x22\x34\x39\x37\x2e\x39\x39\x38\x30\x35\x22\x3e\x3c\x2f\x70\x61\ -\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\ -\x3d\x22\x4d\x20\x34\x36\x34\x2e\x35\x30\x20\x35\x34\x35\x2e\x38\ -\x31\x20\x43\x20\x34\x36\x35\x2e\x35\x37\x20\x35\x34\x32\x2e\x39\ -\x36\x20\x34\x36\x38\x2e\x38\x34\x20\x35\x34\x31\x2e\x34\x38\x20\ -\x34\x37\x31\x2e\x38\x31\x20\x35\x34\x32\x2e\x35\x31\x20\x43\x20\ -\x34\x37\x34\x2e\x37\x38\x20\x35\x34\x33\x2e\x35\x33\x20\x34\x37\ -\x36\x2e\x33\x32\x20\x35\x34\x36\x2e\x36\x37\x20\x34\x37\x35\x2e\ -\x32\x35\x20\x35\x34\x39\x2e\x35\x32\x20\x4c\x20\x34\x37\x33\x2e\ -\x31\x38\x20\x35\x35\x35\x2e\x31\x30\x20\x43\x20\x34\x35\x31\x2e\ -\x36\x35\x20\x36\x31\x33\x2e\x37\x35\x20\x34\x34\x37\x2e\x37\x34\ -\x20\x36\x34\x34\x2e\x37\x34\x20\x34\x35\x36\x2e\x37\x34\x20\x36\ -\x34\x36\x2e\x37\x38\x20\x4c\x20\x34\x35\x36\x2e\x38\x37\x20\x36\ -\x34\x36\x2e\x38\x30\x20\x4c\x20\x34\x35\x38\x2e\x36\x36\x20\x36\ -\x34\x36\x2e\x37\x37\x20\x43\x20\x34\x36\x38\x2e\x32\x30\x20\x36\ -\x34\x36\x2e\x33\x39\x20\x34\x37\x37\x2e\x39\x31\x20\x36\x34\x33\ -\x2e\x35\x38\x20\x34\x38\x37\x2e\x38\x33\x20\x36\x33\x38\x2e\x32\ -\x37\x20\x4c\x20\x34\x39\x30\x2e\x31\x32\x20\x36\x33\x37\x2e\x30\ -\x30\x20\x43\x20\x34\x39\x32\x2e\x38\x33\x20\x36\x33\x35\x2e\x34\ -\x35\x20\x34\x39\x36\x2e\x33\x34\x20\x36\x33\x36\x2e\x33\x30\x20\ -\x34\x39\x37\x2e\x39\x35\x20\x36\x33\x38\x2e\x39\x30\x20\x43\x20\ -\x34\x39\x39\x2e\x35\x37\x20\x36\x34\x31\x2e\x35\x30\x20\x34\x39\ -\x38\x2e\x36\x38\x20\x36\x34\x34\x2e\x38\x36\x20\x34\x39\x35\x2e\ -\x39\x37\x20\x36\x34\x36\x2e\x34\x31\x20\x43\x20\x34\x38\x33\x2e\ -\x36\x32\x20\x36\x35\x33\x2e\x34\x38\x20\x34\x37\x31\x2e\x32\x35\ -\x20\x36\x35\x37\x2e\x32\x38\x20\x34\x35\x38\x2e\x39\x32\x20\x36\ -\x35\x37\x2e\x37\x32\x20\x4c\x20\x34\x35\x36\x2e\x34\x36\x20\x36\ -\x35\x37\x2e\x37\x37\x20\x4c\x20\x34\x35\x35\x2e\x37\x35\x20\x36\ -\x35\x37\x2e\x37\x33\x20\x43\x20\x34\x33\x32\x2e\x36\x37\x20\x36\ -\x35\x34\x2e\x39\x34\x20\x34\x33\x37\x2e\x33\x39\x20\x36\x31\x38\ -\x2e\x31\x32\x20\x34\x36\x34\x2e\x35\x30\x20\x35\x34\x35\x2e\x38\ -\x31\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x66\x69\x6c\x6c\x3d\x22\x23\x66\x32\x38\x30\x38\x30\x22\x20\x66\ -\x69\x6c\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x6e\x6f\x6e\x7a\x65\x72\ -\x6f\x22\x20\x69\x64\x3d\x22\xe8\xb7\xaf\xe5\xbe\x84\x2d\x33\x30\ -\x22\x20\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x35\x30\x22\x20\x73\ -\x74\x72\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\x20\x74\x61\x72\ -\x67\x65\x74\x2d\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x31\x36\x2e\ -\x32\x38\x36\x31\x33\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\ -\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\ -\x36\x36\x2e\x38\x39\x38\x31\x36\x22\x20\x74\x61\x72\x67\x65\x74\ -\x2d\x78\x3d\x22\x34\x33\x32\x2e\x36\x37\x30\x33\x35\x22\x20\x74\ -\x61\x72\x67\x65\x74\x2d\x79\x3d\x22\x35\x34\x31\x2e\x34\x38\x32\ -\x34\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\ -\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x20\x34\x31\x37\x2e\x30\ -\x35\x20\x37\x30\x31\x2e\x34\x36\x20\x4c\x20\x35\x31\x35\x2e\x36\ -\x38\x20\x36\x38\x37\x2e\x30\x31\x20\x43\x20\x35\x31\x35\x2e\x36\ -\x38\x20\x37\x32\x37\x2e\x31\x38\x20\x35\x30\x32\x2e\x37\x35\x20\ -\x37\x35\x30\x2e\x33\x36\x20\x34\x37\x36\x2e\x39\x30\x20\x37\x35\ -\x36\x2e\x35\x34\x20\x43\x20\x34\x35\x31\x2e\x30\x35\x20\x37\x36\ -\x32\x2e\x37\x31\x20\x34\x33\x31\x2e\x31\x30\x20\x37\x34\x34\x2e\ -\x33\x36\x20\x34\x31\x37\x2e\x30\x35\x20\x37\x30\x31\x2e\x34\x36\ -\x20\x5a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\ -\x69\x6c\x6c\x3d\x22\x75\x72\x6c\x28\x23\x6c\x69\x6e\x65\x61\x72\ -\x47\x72\x61\x64\x69\x65\x6e\x74\x2d\x33\x29\x22\x20\x66\x69\x6c\ -\x6c\x2d\x72\x75\x6c\x65\x3d\x22\x65\x76\x65\x6e\x6f\x64\x64\x22\ -\x20\x69\x64\x3d\x22\xe8\xb7\xaf\xe5\xbe\x84\x2d\x33\x31\x22\x20\ -\x6e\x6f\x64\x65\x2d\x69\x64\x3d\x22\x35\x31\x22\x20\x73\x74\x72\ -\x6f\x6b\x65\x3d\x22\x6e\x6f\x6e\x65\x22\x0d\x0a\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x74\x61\x72\x67\x65\x74\x2d\x68\x65\x69\ -\x67\x68\x74\x3d\x22\x37\x35\x2e\x37\x30\x33\x32\x35\x22\x20\x74\ -\x61\x72\x67\x65\x74\x2d\x77\x69\x64\x74\x68\x3d\x22\x39\x38\x2e\ -\x36\x33\x33\x38\x38\x22\x20\x74\x61\x72\x67\x65\x74\x2d\x78\x3d\ -\x22\x34\x31\x37\x2e\x30\x34\x37\x32\x37\x22\x20\x74\x61\x72\x67\ -\x65\x74\x2d\x79\x3d\x22\x36\x38\x37\x2e\x30\x31\x30\x39\x22\x3e\ -\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x09\xa0\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x34\x38\x30\x37\x36\x32\x31\x35\x32\x31\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x31\x35\x33\x39\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\ -\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\ -\x3d\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\ -\x22\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x30\x20\x33\x30\ -\x2e\x37\x32\x68\x39\x36\x30\x76\x39\x36\x30\x48\x30\x7a\x22\x20\ -\x66\x69\x6c\x6c\x3d\x22\x23\x30\x30\x30\x30\x30\x30\x22\x20\x66\ -\x69\x6c\x6c\x2d\x6f\x70\x61\x63\x69\x74\x79\x3d\x22\x30\x22\x20\ -\x70\x2d\x69\x64\x3d\x22\x31\x31\x35\x34\x30\x22\x3e\x3c\x2f\x70\ -\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x37\ -\x34\x2e\x32\x38\x38\x36\x34\x20\x37\x31\x36\x2e\x34\x33\x31\x33\ -\x36\x63\x32\x37\x2e\x34\x32\x32\x37\x32\x2d\x31\x33\x2e\x37\x31\ -\x31\x33\x36\x20\x34\x37\x2e\x39\x39\x34\x38\x38\x2d\x35\x38\x2e\ -\x32\x38\x36\x30\x38\x20\x36\x35\x2e\x31\x33\x36\x36\x34\x2d\x36\ -\x35\x2e\x31\x33\x36\x36\x34\x20\x31\x30\x2e\x32\x39\x31\x32\x2d\ -\x33\x2e\x34\x33\x30\x34\x20\x35\x31\x2e\x34\x33\x35\x35\x32\x2d\ -\x32\x34\x2e\x30\x30\x32\x35\x36\x20\x32\x37\x2e\x34\x33\x32\x39\ -\x36\x2d\x38\x35\x2e\x37\x30\x38\x38\x2d\x35\x34\x2e\x38\x35\x35\ -\x36\x38\x2d\x35\x34\x2e\x38\x36\x35\x39\x32\x2d\x39\x32\x2e\x35\ -\x36\x39\x36\x2d\x31\x30\x36\x2e\x32\x39\x31\x32\x2d\x39\x32\x2e\ -\x35\x36\x39\x36\x2d\x32\x32\x36\x2e\x33\x30\x34\x68\x34\x31\x31\ -\x2e\x34\x32\x32\x37\x32\x63\x30\x20\x31\x31\x36\x2e\x35\x38\x32\ -\x34\x2d\x33\x37\x2e\x37\x31\x33\x39\x32\x20\x31\x37\x31\x2e\x34\ -\x33\x38\x30\x38\x2d\x39\x32\x2e\x35\x36\x39\x36\x20\x32\x32\x36\ -\x2e\x33\x30\x34\x2d\x32\x34\x2e\x30\x30\x32\x35\x36\x20\x36\x38\ -\x2e\x35\x36\x37\x30\x34\x20\x31\x33\x2e\x37\x32\x31\x36\x20\x38\ -\x35\x2e\x37\x30\x38\x38\x20\x32\x30\x2e\x35\x37\x32\x31\x36\x20\ -\x38\x35\x2e\x37\x30\x38\x38\x20\x32\x34\x2e\x30\x30\x32\x35\x36\ -\x20\x36\x2e\x38\x36\x30\x38\x20\x38\x32\x2e\x32\x38\x38\x36\x34\ -\x20\x35\x34\x2e\x38\x35\x35\x36\x38\x20\x31\x30\x36\x2e\x32\x39\ -\x31\x32\x20\x36\x35\x2e\x31\x33\x36\x36\x34\x20\x33\x2e\x34\x32\ -\x30\x31\x36\x20\x30\x2d\x31\x33\x33\x2e\x37\x32\x34\x31\x36\x20\ -\x33\x37\x2e\x37\x31\x33\x39\x32\x2d\x32\x34\x30\x2e\x30\x30\x35\ -\x31\x32\x20\x33\x34\x2e\x32\x39\x33\x37\x36\x2d\x36\x38\x2e\x35\ -\x36\x37\x30\x34\x20\x30\x2d\x31\x33\x37\x2e\x31\x34\x34\x33\x32\ -\x2d\x31\x33\x2e\x37\x32\x31\x36\x2d\x32\x30\x35\x2e\x37\x32\x31\ -\x36\x2d\x33\x34\x2e\x32\x39\x33\x37\x36\x7a\x22\x20\x66\x69\x6c\ -\x6c\x3d\x22\x23\x46\x46\x45\x35\x38\x46\x22\x20\x70\x2d\x69\x64\ -\x3d\x22\x31\x31\x35\x34\x31\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\ -\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x38\x30\x20\x33\x37\ -\x2e\x35\x38\x30\x38\x63\x2d\x36\x35\x2e\x31\x34\x36\x38\x38\x20\ -\x30\x2d\x32\x30\x32\x2e\x32\x38\x30\x39\x36\x20\x34\x37\x2e\x39\ -\x39\x34\x38\x38\x2d\x32\x31\x39\x2e\x34\x33\x32\x39\x36\x20\x31\ -\x36\x34\x2e\x35\x36\x37\x30\x34\x68\x34\x34\x32\x2e\x32\x38\x36\ -\x30\x38\x43\x36\x38\x32\x2e\x32\x39\x31\x32\x20\x39\x32\x2e\x34\ -\x33\x36\x34\x38\x20\x35\x34\x35\x2e\x31\x34\x36\x38\x38\x20\x33\ -\x37\x2e\x35\x38\x30\x38\x20\x34\x38\x30\x20\x33\x37\x2e\x35\x38\ -\x30\x38\x7a\x20\x6d\x32\x32\x36\x2e\x32\x38\x33\x35\x32\x20\x31\ -\x39\x38\x2e\x38\x36\x30\x38\x73\x2d\x33\x2e\x34\x33\x30\x34\x20\ -\x30\x20\x30\x20\x30\x48\x32\x35\x33\x2e\x37\x31\x36\x34\x38\x63\ -\x2d\x31\x30\x2e\x32\x39\x31\x32\x20\x31\x30\x2e\x32\x38\x30\x39\ -\x36\x2d\x33\x37\x2e\x37\x31\x33\x39\x32\x20\x31\x37\x2e\x31\x33\ -\x31\x35\x32\x2d\x34\x38\x2e\x30\x30\x35\x31\x32\x20\x36\x38\x2e\ -\x35\x36\x37\x30\x34\x68\x35\x34\x38\x2e\x35\x37\x37\x32\x38\x63\ -\x2d\x31\x37\x2e\x31\x34\x31\x37\x36\x2d\x35\x31\x2e\x34\x33\x35\ -\x35\x32\x2d\x34\x31\x2e\x31\x34\x34\x33\x32\x2d\x35\x38\x2e\x32\ -\x38\x36\x30\x38\x2d\x34\x38\x2e\x30\x30\x35\x31\x32\x2d\x36\x38\ -\x2e\x35\x37\x37\x32\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\ -\x46\x41\x41\x44\x31\x34\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x31\ -\x35\x34\x32\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\ -\x68\x20\x64\x3d\x22\x4d\x37\x30\x32\x2e\x38\x35\x33\x31\x32\x20\ -\x32\x33\x36\x2e\x34\x34\x31\x36\x73\x33\x2e\x34\x33\x30\x34\x20\ -\x30\x20\x30\x20\x30\x76\x2d\x31\x30\x2e\x32\x39\x31\x32\x63\x30\ -\x2d\x36\x2e\x38\x36\x30\x38\x20\x30\x2d\x31\x37\x2e\x31\x34\x31\ -\x37\x36\x2d\x33\x2e\x34\x32\x30\x31\x36\x2d\x32\x34\x2e\x30\x30\ -\x32\x35\x36\x48\x32\x36\x30\x2e\x35\x36\x37\x30\x34\x63\x30\x20\ -\x36\x2e\x38\x36\x30\x38\x2d\x33\x2e\x34\x32\x30\x31\x36\x20\x31\ -\x37\x2e\x31\x34\x31\x37\x36\x2d\x33\x2e\x34\x32\x30\x31\x36\x20\ -\x32\x34\x2e\x30\x30\x32\x35\x36\x20\x30\x20\x33\x2e\x34\x33\x30\ -\x34\x2d\x33\x2e\x34\x33\x30\x34\x20\x36\x2e\x38\x36\x30\x38\x2d\ -\x33\x2e\x34\x33\x30\x34\x20\x31\x30\x2e\x32\x38\x30\x39\x36\x68\ -\x34\x34\x39\x2e\x31\x33\x36\x36\x34\x7a\x22\x20\x66\x69\x6c\x6c\ -\x3d\x22\x23\x44\x34\x36\x42\x30\x38\x22\x20\x70\x2d\x69\x64\x3d\ -\x22\x31\x31\x35\x34\x33\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\ -\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\x35\x30\x2e\x32\x38\x38\ -\x36\x34\x20\x38\x34\x33\x2e\x32\x39\x34\x37\x32\x6c\x2d\x31\x37\ -\x2e\x31\x34\x31\x37\x36\x2d\x33\x34\x2e\x32\x39\x33\x37\x36\x63\ -\x2d\x32\x34\x2e\x30\x30\x32\x35\x36\x2d\x35\x31\x2e\x34\x32\x35\ -\x32\x38\x2d\x36\x35\x2e\x31\x34\x36\x38\x38\x2d\x38\x35\x2e\x37\ -\x30\x38\x38\x2d\x31\x31\x33\x2e\x31\x35\x32\x2d\x31\x30\x39\x2e\ -\x37\x31\x31\x33\x36\x2d\x32\x30\x2e\x35\x36\x31\x39\x32\x2d\x31\ -\x30\x2e\x32\x38\x30\x39\x36\x2d\x34\x34\x2e\x35\x36\x34\x34\x38\ -\x2d\x31\x37\x2e\x31\x34\x31\x37\x36\x2d\x36\x38\x2e\x35\x36\x37\ -\x30\x34\x2d\x32\x30\x2e\x35\x37\x32\x31\x36\x2d\x32\x30\x2e\x35\ -\x37\x32\x31\x36\x2d\x33\x2e\x34\x33\x30\x34\x2d\x33\x37\x2e\x37\ -\x31\x33\x39\x32\x2d\x33\x2e\x34\x33\x30\x34\x2d\x35\x38\x2e\x32\ -\x38\x36\x30\x38\x20\x30\x2d\x33\x37\x2e\x37\x31\x33\x39\x32\x20\ -\x33\x2e\x34\x33\x30\x34\x2d\x37\x31\x2e\x39\x39\x37\x34\x34\x20\ -\x36\x2e\x38\x36\x30\x38\x2d\x31\x30\x36\x2e\x32\x39\x31\x32\x20\ -\x36\x2e\x38\x36\x30\x38\x2d\x33\x37\x2e\x37\x30\x33\x36\x38\x20\ -\x30\x2d\x37\x35\x2e\x34\x31\x37\x36\x2d\x33\x2e\x34\x33\x30\x34\ -\x2d\x31\x31\x36\x2e\x35\x36\x31\x39\x32\x2d\x36\x2e\x38\x36\x30\ -\x38\x2d\x32\x30\x2e\x35\x38\x32\x34\x2d\x33\x2e\x34\x33\x30\x34\ -\x2d\x34\x31\x2e\x31\x34\x34\x33\x32\x20\x30\x2d\x35\x38\x2e\x32\ -\x38\x36\x30\x38\x20\x30\x2d\x32\x34\x2e\x30\x30\x32\x35\x36\x20\ -\x33\x2e\x34\x33\x30\x34\x2d\x34\x38\x2e\x30\x30\x35\x31\x32\x20\ -\x31\x30\x2e\x32\x39\x31\x32\x2d\x36\x38\x2e\x35\x37\x37\x32\x38\ -\x20\x32\x30\x2e\x35\x38\x32\x34\x2d\x34\x37\x2e\x39\x39\x34\x38\ -\x38\x20\x32\x33\x2e\x39\x39\x32\x33\x32\x2d\x38\x39\x2e\x31\x33\ -\x39\x32\x20\x35\x38\x2e\x32\x37\x35\x38\x34\x2d\x31\x31\x33\x2e\ -\x31\x34\x31\x37\x36\x20\x31\x30\x39\x2e\x37\x30\x31\x31\x32\x6c\ -\x2d\x31\x37\x2e\x31\x34\x31\x37\x36\x20\x33\x34\x2e\x32\x39\x33\ -\x37\x36\x63\x2d\x31\x30\x2e\x32\x38\x30\x39\x36\x20\x31\x33\x2e\ -\x37\x31\x31\x33\x36\x2d\x31\x33\x2e\x37\x32\x31\x36\x20\x32\x37\ -\x2e\x34\x32\x32\x37\x32\x2d\x31\x33\x2e\x37\x32\x31\x36\x20\x34\ -\x34\x2e\x35\x36\x34\x34\x38\x20\x30\x20\x35\x38\x2e\x32\x38\x36\ -\x30\x38\x20\x34\x34\x2e\x35\x38\x34\x39\x36\x20\x31\x30\x32\x2e\ -\x38\x36\x30\x38\x20\x31\x30\x32\x2e\x38\x36\x30\x38\x20\x31\x30\ -\x32\x2e\x38\x36\x30\x38\x68\x35\x35\x35\x2e\x34\x33\x38\x30\x38\ -\x63\x31\x37\x2e\x31\x34\x31\x37\x36\x20\x30\x20\x33\x30\x2e\x38\ -\x35\x33\x31\x32\x2d\x33\x2e\x34\x33\x30\x34\x20\x34\x34\x2e\x35\ -\x36\x34\x34\x38\x2d\x31\x30\x2e\x32\x38\x30\x39\x36\x20\x35\x34\ -\x2e\x38\x35\x35\x36\x38\x2d\x32\x37\x2e\x34\x33\x32\x39\x36\x20\ -\x37\x35\x2e\x34\x32\x37\x38\x34\x2d\x38\x39\x2e\x31\x34\x39\x34\ -\x34\x20\x34\x38\x2e\x30\x30\x35\x31\x32\x2d\x31\x33\x37\x2e\x31\ -\x34\x34\x33\x32\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\ -\x43\x35\x33\x44\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x31\x35\x34\ -\x34\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\ -\x64\x3d\x22\x4d\x36\x35\x31\x2e\x34\x32\x37\x38\x34\x20\x36\x37\ -\x38\x2e\x37\x31\x37\x34\x34\x76\x31\x30\x36\x2e\x32\x39\x31\x32\ -\x63\x30\x20\x33\x37\x2e\x37\x31\x33\x39\x32\x2d\x33\x30\x2e\x38\ -\x35\x33\x31\x32\x20\x36\x38\x2e\x35\x36\x37\x30\x34\x2d\x36\x38\ -\x2e\x35\x36\x37\x30\x34\x20\x36\x38\x2e\x35\x36\x37\x30\x34\x48\ -\x33\x37\x37\x2e\x31\x33\x39\x32\x63\x2d\x33\x37\x2e\x37\x31\x33\ -\x39\x32\x20\x30\x2d\x36\x38\x2e\x35\x36\x37\x30\x34\x2d\x33\x30\ -\x2e\x38\x35\x33\x31\x32\x2d\x36\x38\x2e\x35\x36\x37\x30\x34\x2d\ -\x36\x38\x2e\x35\x36\x37\x30\x34\x56\x36\x37\x35\x2e\x32\x38\x37\ -\x30\x34\x63\x2d\x32\x34\x2e\x30\x30\x32\x35\x36\x20\x33\x2e\x34\ -\x33\x30\x34\x2d\x34\x38\x2e\x30\x30\x35\x31\x32\x20\x31\x30\x2e\ -\x32\x39\x31\x32\x2d\x36\x38\x2e\x35\x37\x37\x32\x38\x20\x32\x30\ -\x2e\x35\x38\x32\x34\x56\x39\x39\x30\x2e\x37\x32\x68\x34\x38\x30\ -\x2e\x30\x31\x30\x32\x34\x56\x36\x39\x35\x2e\x38\x35\x39\x32\x63\ -\x2d\x32\x30\x2e\x35\x38\x32\x34\x2d\x36\x2e\x38\x36\x30\x38\x2d\ -\x34\x34\x2e\x35\x37\x34\x37\x32\x2d\x31\x33\x2e\x37\x31\x31\x33\ -\x36\x2d\x36\x38\x2e\x35\x37\x37\x32\x38\x2d\x31\x37\x2e\x31\x34\ -\x31\x37\x36\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x41\x41\ -\x44\x31\x34\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x31\x35\x34\x35\ -\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x04\xf3\ -\x00\ -\x00\x11\x18\x78\x9c\xcd\x58\x6d\x6f\xdb\x36\x10\xfe\x2b\x37\xed\ -\x33\x29\xbe\x89\xa2\x8a\x24\x45\x9a\xb4\xcd\x80\x66\x2b\x90\x2e\ -\xc3\xf6\xcd\x70\xb2\xc8\x98\x62\x07\xb1\xa1\x14\xf9\xf5\x7b\x8e\ -\x94\x13\xc9\x96\x9d\x61\xcd\x87\x34\xb6\x48\xf3\x78\x6f\xcf\x1d\ -\x79\xa7\x1e\xbc\xff\x7e\xdb\x50\x7b\x7d\xbf\x9c\x2d\xe6\x87\x99\ -\x96\x2a\xa3\xe5\x6a\x32\xbf\x9a\x34\x8b\xf9\xf5\x61\x36\x5f\x64\ -\xef\x8f\x0e\x7e\x3a\xfd\xed\xe4\xdb\x9f\x5f\x3f\xd2\xb2\xbd\xa1\ -\xaf\xbf\x7f\xf8\xf2\xcb\x09\x65\x22\xcf\xff\xb0\x27\x79\x7e\xfa\ -\xed\x94\x2e\x2e\x3f\x93\x96\x3a\xcf\x3f\xfe\x9a\x51\x56\xaf\x56\ -\x77\xef\xf2\xfc\xe1\xe1\x41\x3e\x58\xb9\xb8\xbf\xc9\x3f\xdf\x4f\ -\xee\xea\xd9\x74\x99\x63\x63\xce\x1b\xc1\x94\x43\x98\xd6\xf2\x6a\ -\x75\x95\x1d\x1d\xb0\xe0\x15\xf4\x97\xca\x14\xde\x58\x15\x4c\x51\ -\x64\x34\x6d\x26\xcb\xe5\x61\x36\x9b\x2e\xe6\x19\xb5\xb3\xeb\x87\ -\x0f\x8b\xef\x87\x99\x22\x45\x5a\x19\x17\x1f\x59\xdf\x78\x9d\x11\ -\xdc\x99\x83\x65\xdb\x04\xa3\x94\x62\x95\x19\xdd\x89\xd9\x15\x76\ -\x3b\xa3\x7c\xb7\xff\xdd\xf7\x66\x36\xff\x67\x8c\x4b\x57\x55\x95\ -\x47\x6a\x46\x0f\xb3\xab\x55\x0d\x46\x70\xd5\xd7\xb3\x9b\x7a\x15\ -\xe7\x47\x07\x77\x93\x55\x4d\x90\x78\xae\x3d\x0c\x0b\xae\x2e\xb4\ -\x69\xe1\xc6\x19\x7e\x3f\x66\xf4\xf7\xac\x69\x0e\xb3\x9f\x3f\x7d\ -\x3a\x2d\x9d\xea\x6b\x2f\xc1\x9b\x33\x73\x4f\x84\x2f\x0d\x39\x17\ -\x98\x75\x12\x28\x50\xf4\x55\x04\x11\x5a\x01\x89\xcf\x4b\x84\x25\ -\xd6\xd3\x5f\xa1\xd0\x0e\xf6\x08\xcc\x1e\xe9\x56\x14\xca\x09\xed\ -\x6b\x57\xf9\x4b\x5d\x99\x5a\x60\xd2\x1a\xd7\x33\xcd\x78\x6b\x6c\ -\xe8\x9b\x16\x46\x4c\x2b\x95\xa3\xca\xb9\x33\x6d\xc2\x54\x18\x2f\ -\x9d\x77\xa4\x84\x0b\xc2\x68\x59\x58\xcf\x33\x17\x2e\xb5\x73\x53\ -\xb5\x26\x3f\x51\x28\x12\xeb\xa2\xf4\xd3\x35\x27\x96\x3a\x3a\x45\ -\x7a\x5b\x16\x66\xaa\x28\x91\xc5\x13\x25\x31\x3f\x9e\x43\x2b\x69\ -\x6d\xa6\x42\x97\xd2\x63\x4d\x09\x6b\x48\x3b\x69\x0b\xc3\x33\x6b\ -\x3a\xfe\x8e\x9c\x28\x64\xbb\x4f\xd4\xbc\xe6\xc4\x6f\xf1\x44\x07\ -\x73\x67\x73\x22\x8b\x27\x99\xe9\xc3\xee\xee\x43\xaa\x1a\x43\x2a\ -\xa4\xdc\x3c\x03\xdc\xbb\xa1\x6a\x45\xe8\x45\x4f\x7b\x52\x6d\xd8\ -\xe3\x00\x44\xed\x74\xc0\x98\xdd\x0e\xd4\x03\x35\x8a\x33\x21\xfc\ -\xdf\x20\x84\x38\xd6\xc2\xbb\x4d\x91\xc3\x15\x78\xb3\x07\x33\xad\ -\x46\x30\x0b\x00\x20\x6c\xe5\xfc\x40\x6c\x84\xa8\xbf\x12\x13\xfc\ -\xbc\x82\x89\xda\xfa\x1f\xb6\x4a\x8f\x58\x55\x21\xe7\xb5\x0f\x43\ -\xb3\x2e\x2b\xff\xb2\x55\x38\x60\x64\xab\xde\xf9\x14\x5e\x5a\x3e\ -\x88\x46\x86\xca\x37\x48\x65\x04\xaa\x6f\x9e\x97\x0a\x40\x5b\xa9\ -\x42\xa0\x52\x3a\xdc\x03\xe9\xb9\xa6\xe2\xbe\x33\xd2\x87\xd0\x68\ -\x84\xc5\xeb\xe8\xb3\x64\xd4\xb4\x02\x6b\xe5\x05\xff\x5e\x0b\xd4\ -\xfc\x87\xed\x60\xaa\x64\x50\xa1\x11\x50\x48\x03\x85\x6c\x89\x81\ -\x2e\x25\x1d\xa8\x49\xa6\xe8\x64\x8a\x4e\x66\xd4\xe1\x8e\x9f\x8d\ -\xec\xbc\xda\x07\xa3\x19\x81\x31\xb2\x05\x77\x2b\x60\x8f\x9a\xb0\ -\x27\xae\x0b\x49\x4c\xe7\xde\x02\x67\x9a\xfa\xab\x77\x69\xf2\xbf\ -\xbe\x78\xbb\x43\xbc\xd3\x7e\x70\x37\x0c\x8e\xc1\xb2\x7f\x51\xa4\ -\xe7\xe0\x80\x0d\x4e\x13\x9e\xb8\x35\xd9\x92\x89\x06\x0a\x8c\x70\ -\x1a\x54\xf7\xc7\xcc\x63\x04\xf0\xee\x03\xc6\x8d\x58\xee\xc2\xab\ -\x01\x53\xec\x10\xff\xf6\x81\xf1\x23\x96\xb3\x52\x84\xf5\x35\x80\ -\x19\x2b\xb3\x51\x7c\x69\xde\x38\x30\x63\x55\x18\x75\xe0\xb5\x80\ -\x19\x2b\x5d\x51\xfc\xdb\x00\xe6\x1c\x35\x9b\x82\x77\x53\x51\x94\ -\xd2\x3a\xae\xa0\x1a\x17\xa8\xf3\xd2\x17\x3e\x4e\xf1\xbd\x28\x74\ -\xe0\xdf\xc4\x5f\x66\xc0\xb8\xc4\x3a\xa5\x6d\xc4\x53\xde\xe6\xad\ -\x8d\x32\x20\x8f\x3a\xb9\xd1\xb2\x58\xa1\x5d\x90\x85\x61\x5f\x71\ -\x1d\xda\x4a\xba\x10\x78\x16\xc2\x45\x61\xd2\x1d\xcc\x75\x2f\x72\ -\xb9\xb0\x04\x31\xed\xa1\xb8\xed\x02\x77\x6c\xe4\xe6\xce\x2d\x1a\ -\x50\xc2\x74\xaf\xc0\x60\xc2\x19\x0a\xf3\x66\x4d\xc2\x71\xdf\x2c\ -\x4a\x71\x3b\xbe\xff\x71\xfb\xee\x8c\x31\x63\x95\xd5\x3b\x2b\x03\ -\x3b\x01\x67\x30\x36\x4a\x2a\x04\x47\x31\xdc\xc7\xb8\xe2\xab\x35\ -\xe8\xd1\x78\xef\x5a\x54\x27\x1f\x77\x52\x1a\x9e\xf5\x39\x75\xe2\ -\x06\x29\x64\xc6\x6a\x66\xd4\xc7\xf0\xd8\x42\x86\x41\x3f\x5a\x48\ -\xcf\x5d\x85\xb4\xd6\x37\x22\x09\xef\x86\x49\x29\xb9\x8c\xa7\x67\ -\xda\x6c\x62\x9a\x15\x9c\x85\xad\xa8\x36\x5a\xdf\xe9\x3a\x25\x68\ -\x3b\xd6\x13\xad\x10\x6b\x6e\x17\xbb\x31\xc9\xb3\x28\x74\x48\xb7\ -\xd2\x22\x5a\x34\xb0\x09\x2d\x10\x9b\x84\x84\x43\xdf\x56\x16\x3e\ -\x56\xd9\xa2\x92\x40\x97\xd2\x70\x1c\xa0\x0e\xe1\x8f\xcf\x84\x16\ -\x3c\xa1\x92\x9b\xf4\x20\xb9\x35\xed\x86\x94\xbc\x01\x9f\x78\x7c\ -\xda\xe0\xa2\xe4\x3d\x11\x1b\x2b\x97\x31\xd5\x80\x5c\x15\x8d\x4b\ -\xcf\x4e\x2b\x10\x42\xe2\x1b\x68\x73\xee\x0b\xef\x83\x0d\x35\xc3\ -\xd3\x8f\x64\x9c\xf7\xdf\x3c\x0a\x53\x98\xbe\xd2\xb1\x22\xda\x9d\ -\x0a\xa0\xe7\xa2\x2b\xeb\xb1\x6b\x16\xd2\x71\xa3\x41\x14\xea\x0a\ -\xed\xbc\xe4\xce\x02\xb7\x8f\xe4\xd3\x2b\xe3\x49\xe1\x30\x27\x4c\ -\x9b\x64\x70\xcc\xa4\xc1\xeb\x0b\xbe\x9a\x83\x73\xcc\x41\x72\xf1\ -\x5d\x2e\x8d\x89\xfc\x7c\x44\x3b\x24\xe1\xe2\xd4\x71\x87\x84\xb7\ -\x23\x89\x87\xe6\xae\x06\x0d\x23\x25\x72\x6c\x1d\xb7\x62\x84\x50\ -\xc2\x06\x61\x94\xc4\x29\x02\x5a\xb1\x7f\x02\x62\xe8\x60\x5f\x0e\ -\xcc\x58\xb9\xb6\x08\x04\x44\xd4\xe8\x97\xb6\x9a\xea\x8d\xa5\x17\ -\x0e\xea\x58\xb5\x66\xe9\xd1\xb8\x1f\x96\x3e\x5a\x51\x21\x3d\xb8\ -\xd7\x90\x3e\x56\x50\xab\xf4\x72\xb8\xd9\xbf\x5b\xb3\xd9\x29\xf7\ -\x57\x62\xa7\xbc\x47\xd1\x58\xfd\x63\x45\x61\xfb\x45\x01\x9d\xec\ -\xa6\xa6\xc1\xd2\x4b\xaa\x7a\xb5\x90\xff\x93\xe0\xe8\x5f\xba\xe3\ -\xd4\x26\ -\x00\x00\x05\x9b\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\ -\x72\x61\x70\x68\x69\x63\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\ -\x44\x54\x44\x2f\x73\x76\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\ -\x0a\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x36\x39\x39\x32\x37\x33\ -\x37\x37\x31\x30\x35\x39\x22\x20\x63\x6c\x61\x73\x73\x3d\x22\x69\ -\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ -\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\x22\x20\x76\x65\x72\ -\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x78\x6d\x6c\x6e\x73\ -\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\ -\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x0d\x0a\x20\ -\x20\x20\x20\x20\x70\x2d\x69\x64\x3d\x22\x31\x32\x35\x37\x39\x22\ -\x0d\x0a\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3d\x22\x31\x36\ -\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\x3e\x0d\x0a\ -\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x37\x30\ -\x30\x2e\x33\x37\x31\x32\x32\x38\x20\x33\x39\x34\x2e\x35\x32\x35\ -\x34\x37\x32\x20\x31\x37\x34\x2e\x30\x32\x38\x35\x36\x39\x20\x33\ -\x39\x34\x2e\x35\x32\x35\x34\x37\x32\x6c\x32\x35\x35\x2e\x39\x35\ -\x32\x34\x31\x36\x2d\x32\x32\x37\x2e\x35\x30\x36\x35\x35\x31\x63\ -\x31\x32\x2e\x33\x38\x39\x31\x36\x38\x2d\x31\x31\x2e\x30\x31\x31\ -\x37\x39\x38\x20\x31\x33\x2e\x35\x30\x35\x35\x39\x35\x2d\x32\x39\ -\x2e\x39\x38\x30\x38\x32\x35\x20\x32\x2e\x34\x39\x32\x37\x37\x34\ -\x2d\x34\x32\x2e\x33\x36\x39\x39\x39\x33\x2d\x31\x31\x2e\x30\x31\ -\x31\x37\x39\x38\x2d\x31\x32\x2e\x33\x38\x36\x30\x39\x38\x2d\x32\ -\x39\x2e\x39\x37\x37\x37\x35\x35\x2d\x31\x33\x2e\x35\x30\x36\x36\ -\x31\x39\x2d\x34\x32\x2e\x33\x36\x37\x39\x34\x37\x2d\x32\x2e\x34\ -\x39\x32\x37\x37\x34\x4c\x37\x36\x2e\x34\x32\x35\x36\x32\x33\x20\ -\x34\x30\x30\x2e\x39\x37\x35\x33\x37\x31\x63\x2d\x36\x2e\x39\x36\ -\x30\x35\x32\x39\x20\x35\x2e\x34\x39\x36\x31\x37\x38\x2d\x31\x31\ -\x2e\x34\x33\x34\x34\x32\x33\x20\x31\x34\x2e\x30\x30\x33\x39\x34\ -\x35\x2d\x31\x31\x2e\x34\x33\x34\x34\x32\x33\x20\x32\x33\x2e\x35\ -\x36\x31\x36\x32\x35\x20\x30\x20\x30\x2e\x30\x31\x33\x33\x30\x33\ -\x20\x30\x2e\x30\x30\x31\x30\x32\x33\x20\x30\x2e\x30\x32\x36\x36\ -\x30\x36\x20\x30\x2e\x30\x30\x31\x30\x32\x33\x20\x30\x2e\x30\x33\ -\x39\x39\x30\x39\x20\x30\x20\x30\x2e\x30\x31\x32\x32\x38\x2d\x30\ -\x2e\x30\x30\x31\x30\x32\x33\x20\x30\x2e\x30\x32\x35\x35\x38\x33\ -\x2d\x30\x2e\x30\x30\x31\x30\x32\x33\x20\x30\x2e\x30\x33\x37\x38\ -\x36\x32\x20\x30\x20\x30\x2e\x34\x37\x33\x37\x39\x31\x20\x30\x2e\ -\x30\x31\x35\x33\x35\x20\x30\x2e\x39\x34\x36\x35\x35\x38\x20\x30\ -\x2e\x30\x33\x37\x38\x36\x32\x20\x31\x2e\x34\x31\x38\x33\x30\x32\ -\x20\x30\x2e\x30\x30\x31\x30\x32\x33\x20\x30\x2e\x30\x31\x36\x33\ -\x37\x33\x20\x30\x2e\x30\x30\x31\x30\x32\x33\x20\x30\x2e\x30\x33\ -\x32\x37\x34\x36\x20\x30\x2e\x30\x30\x31\x30\x32\x33\x20\x30\x2e\ -\x30\x34\x39\x31\x31\x39\x20\x30\x2e\x33\x39\x32\x39\x35\x20\x38\ -\x2e\x30\x33\x30\x39\x30\x37\x20\x33\x2e\x39\x39\x32\x39\x34\x31\ -\x20\x31\x35\x2e\x35\x39\x35\x31\x38\x36\x20\x31\x30\x2e\x30\x33\ -\x34\x35\x34\x31\x20\x32\x30\x2e\x39\x36\x32\x34\x32\x37\x6c\x33\ -\x31\x35\x2e\x30\x34\x30\x31\x36\x33\x20\x32\x38\x30\x2e\x30\x32\ -\x38\x37\x36\x34\x63\x35\x2e\x37\x31\x37\x32\x31\x32\x20\x35\x2e\ -\x30\x38\x33\x37\x38\x35\x20\x31\x32\x2e\x38\x33\x35\x33\x33\x20\ -\x37\x2e\x35\x38\x30\x36\x35\x32\x20\x31\x39\x2e\x39\x32\x35\x38\ -\x31\x38\x20\x37\x2e\x35\x38\x30\x36\x35\x32\x20\x38\x2e\x32\x37\ -\x34\x34\x35\x34\x20\x30\x20\x31\x36\x2e\x35\x31\x34\x31\x31\x35\ -\x2d\x33\x2e\x34\x30\x33\x35\x31\x36\x20\x32\x32\x2e\x34\x34\x32\ -\x31\x32\x38\x2d\x31\x30\x2e\x30\x37\x34\x34\x35\x20\x31\x31\x2e\ -\x30\x31\x31\x37\x39\x38\x2d\x31\x32\x2e\x33\x38\x37\x31\x32\x32\ -\x20\x39\x2e\x38\x39\x36\x33\x39\x34\x2d\x33\x31\x2e\x33\x35\x37\ -\x31\x37\x32\x2d\x32\x2e\x34\x39\x32\x37\x37\x34\x2d\x34\x32\x2e\ -\x33\x36\x37\x39\x34\x37\x6c\x2d\x32\x35\x36\x2e\x31\x32\x38\x34\ -\x32\x35\x2d\x32\x32\x37\x2e\x36\x36\x35\x31\x36\x33\x20\x35\x32\ -\x36\x2e\x35\x31\x38\x36\x36\x38\x20\x30\x63\x31\x30\x39\x2e\x32\ -\x31\x39\x35\x31\x37\x20\x30\x20\x31\x39\x38\x2e\x30\x37\x35\x32\ -\x34\x31\x20\x38\x38\x2e\x38\x35\x35\x37\x32\x34\x20\x31\x39\x38\ -\x2e\x30\x37\x35\x32\x34\x31\x20\x31\x39\x38\x2e\x30\x37\x35\x32\ -\x34\x31\x73\x2d\x38\x38\x2e\x38\x35\x35\x37\x32\x34\x20\x31\x39\ -\x38\x2e\x30\x37\x35\x32\x34\x31\x2d\x31\x39\x38\x2e\x30\x37\x35\ -\x32\x34\x31\x20\x31\x39\x38\x2e\x30\x37\x35\x32\x34\x31\x4c\x33\ -\x35\x34\x2e\x33\x32\x34\x38\x38\x38\x20\x38\x35\x30\x2e\x36\x39\ -\x36\x39\x35\x35\x63\x2d\x31\x36\x2e\x35\x37\x34\x34\x39\x20\x30\ -\x2d\x33\x30\x2e\x30\x31\x31\x35\x32\x34\x20\x31\x33\x2e\x34\x33\ -\x37\x30\x33\x34\x2d\x33\x30\x2e\x30\x31\x31\x35\x32\x34\x20\x33\ -\x30\x2e\x30\x31\x31\x35\x32\x34\x73\x31\x33\x2e\x34\x33\x37\x30\ -\x33\x34\x20\x33\x30\x2e\x30\x31\x31\x35\x32\x34\x20\x33\x30\x2e\ -\x30\x31\x31\x35\x32\x34\x20\x33\x30\x2e\x30\x31\x31\x35\x32\x34\ -\x6c\x33\x34\x36\x2e\x30\x34\x36\x33\x34\x31\x20\x30\x63\x31\x34\ -\x32\x2e\x33\x31\x36\x33\x31\x20\x30\x20\x32\x35\x38\x2e\x30\x39\ -\x38\x32\x38\x39\x2d\x31\x31\x35\x2e\x37\x38\x33\x30\x30\x33\x20\ -\x32\x35\x38\x2e\x30\x39\x38\x32\x38\x39\x2d\x32\x35\x38\x2e\x30\ -\x39\x38\x32\x38\x39\x53\x38\x34\x32\x2e\x36\x38\x36\x35\x31\x35\ -\x20\x33\x39\x34\x2e\x35\x32\x35\x34\x37\x32\x20\x37\x30\x30\x2e\ -\x33\x37\x31\x32\x32\x38\x20\x33\x39\x34\x2e\x35\x32\x35\x34\x37\ -\x32\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\ -\x69\x6c\x6c\x3d\x22\x23\x32\x37\x32\x36\x33\x36\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x31\x32\x35\x38\x30\x22\x3e\x3c\x2f\x70\x61\x74\ -\x68\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x02\xc2\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x36\x30\x39\x36\x32\x30\x36\x39\x36\x33\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x38\x33\x30\x33\x22\x20\x78\ -\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ -\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\ -\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x39\x33\x36\x2e\x31\ -\x37\x30\x36\x36\x37\x20\x36\x36\x39\x2e\x39\x35\x32\x4c\x35\x33\ -\x34\x2e\x36\x31\x33\x33\x33\x33\x20\x32\x36\x38\x2e\x33\x39\x34\ -\x36\x36\x37\x61\x33\x32\x20\x33\x32\x20\x30\x20\x30\x20\x30\x2d\ -\x34\x32\x2e\x39\x38\x36\x36\x36\x36\x2d\x32\x2e\x30\x36\x39\x33\ -\x33\x34\x6c\x2d\x32\x2e\x32\x38\x32\x36\x36\x37\x20\x32\x2e\x30\ -\x36\x39\x33\x33\x34\x4c\x38\x37\x2e\x38\x32\x39\x33\x33\x33\x20\ -\x36\x36\x39\x2e\x39\x35\x32\x61\x38\x2e\x35\x33\x33\x33\x33\x33\ -\x20\x38\x2e\x35\x33\x33\x33\x33\x33\x20\x30\x20\x30\x20\x30\x2d\ -\x32\x2e\x34\x39\x36\x20\x36\x2e\x30\x33\x37\x33\x33\x33\x76\x36\ -\x36\x2e\x33\x34\x36\x36\x36\x37\x61\x38\x2e\x35\x33\x33\x33\x33\ -\x33\x20\x38\x2e\x35\x33\x33\x33\x33\x33\x20\x30\x20\x30\x20\x30\ -\x20\x31\x34\x2e\x35\x37\x30\x36\x36\x37\x20\x36\x2e\x30\x35\x38\ -\x36\x36\x37\x6c\x34\x31\x32\x2e\x30\x37\x34\x36\x36\x37\x2d\x34\ -\x31\x32\x2e\x30\x39\x36\x20\x34\x31\x32\x2e\x31\x31\x37\x33\x33\ -\x33\x20\x34\x31\x32\x2e\x30\x39\x36\x61\x38\x2e\x35\x33\x33\x33\ -\x33\x33\x20\x38\x2e\x35\x33\x33\x33\x33\x33\x20\x30\x20\x30\x20\ -\x30\x20\x31\x34\x2e\x35\x37\x30\x36\x36\x37\x2d\x36\x2e\x30\x33\ -\x37\x33\x33\x34\x76\x2d\x36\x36\x2e\x33\x34\x36\x36\x36\x36\x61\ -\x38\x2e\x35\x33\x33\x33\x33\x33\x20\x38\x2e\x35\x33\x33\x33\x33\ -\x33\x20\x30\x20\x30\x20\x30\x2d\x32\x2e\x34\x39\x36\x2d\x36\x2e\ -\x30\x35\x38\x36\x36\x37\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\ -\x33\x33\x33\x33\x33\x33\x22\x20\x70\x2d\x69\x64\x3d\x22\x38\x33\ -\x30\x34\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\ -\x3e\ -\x00\x00\x03\xf3\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x32\x35\x36\x32\x34\x31\x33\x36\x33\x37\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x31\x33\x31\x35\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\ -\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\ -\x3d\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\ -\x22\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x37\x38\x31\x2e\ -\x32\x38\x20\x34\x32\x35\x2e\x32\x38\x76\x33\x37\x37\x2e\x31\x32\ -\x48\x32\x39\x30\x2e\x34\x56\x34\x34\x35\x2e\x31\x32\x63\x30\x2d\ -\x31\x30\x2e\x38\x38\x20\x31\x30\x2e\x38\x38\x2d\x31\x39\x2e\x36\ -\x38\x20\x32\x34\x2e\x33\x32\x2d\x31\x39\x2e\x36\x38\x68\x34\x36\ -\x36\x2e\x35\x36\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x42\x33\ -\x43\x38\x46\x45\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x31\x33\x31\ -\x36\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\ -\x64\x3d\x22\x4d\x35\x36\x31\x2e\x34\x34\x20\x33\x36\x31\x2e\x37\ -\x36\x68\x31\x37\x31\x2e\x32\x76\x31\x38\x35\x2e\x37\x36\x68\x34\ -\x38\x2e\x36\x34\x56\x33\x33\x37\x2e\x34\x34\x63\x30\x2d\x31\x33\ -\x2e\x34\x34\x2d\x31\x30\x2e\x38\x38\x2d\x32\x34\x2e\x33\x32\x2d\ -\x32\x34\x2e\x33\x32\x2d\x32\x34\x2e\x33\x32\x48\x35\x33\x33\x2e\ -\x39\x32\x6c\x2d\x37\x38\x2e\x34\x2d\x38\x38\x2e\x33\x32\x63\x2d\ -\x34\x2e\x36\x34\x2d\x35\x2e\x32\x38\x2d\x31\x31\x2e\x32\x2d\x38\ -\x2e\x31\x36\x2d\x31\x38\x2e\x32\x34\x2d\x38\x2e\x31\x36\x48\x32\ -\x30\x34\x2e\x39\x36\x63\x2d\x31\x33\x2e\x34\x34\x20\x30\x2d\x32\ -\x34\x2e\x33\x32\x20\x31\x30\x2e\x38\x38\x2d\x32\x34\x2e\x33\x32\ -\x20\x32\x34\x2e\x33\x32\x76\x35\x33\x37\x2e\x32\x38\x63\x30\x20\ -\x31\x33\x2e\x34\x34\x20\x31\x30\x2e\x38\x38\x20\x32\x34\x2e\x33\ -\x32\x20\x32\x34\x2e\x33\x32\x20\x32\x34\x2e\x33\x32\x68\x32\x37\ -\x38\x2e\x30\x38\x76\x2d\x34\x38\x2e\x36\x34\x48\x32\x32\x39\x2e\ -\x32\x38\x56\x32\x36\x35\x2e\x31\x32\x68\x31\x39\x37\x2e\x31\x32\ -\x6c\x37\x38\x2e\x34\x20\x38\x38\x2e\x33\x32\x63\x34\x2e\x36\x34\ -\x20\x35\x2e\x32\x38\x20\x31\x31\x2e\x32\x20\x38\x2e\x31\x36\x20\ -\x31\x38\x2e\x32\x34\x20\x38\x2e\x31\x36\x6c\x33\x38\x2e\x34\x20\ -\x30\x2e\x31\x36\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x35\x31\ -\x38\x36\x46\x35\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x31\x33\x31\ -\x37\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\ -\x64\x3d\x22\x4d\x38\x30\x34\x2e\x33\x32\x20\x36\x39\x35\x2e\x32\ -\x6c\x2d\x37\x37\x2e\x39\x32\x2d\x37\x37\x2e\x39\x32\x2d\x33\x34\ -\x2e\x34\x20\x33\x34\x2e\x34\x4c\x37\x32\x38\x2e\x31\x36\x20\x36\ -\x38\x38\x68\x2d\x31\x35\x32\x2e\x33\x32\x76\x2d\x39\x35\x2e\x30\ -\x34\x68\x2d\x34\x38\x2e\x36\x34\x76\x31\x31\x39\x2e\x33\x36\x63\ -\x30\x20\x31\x33\x2e\x34\x34\x20\x31\x30\x2e\x38\x38\x20\x32\x34\ -\x2e\x33\x32\x20\x32\x34\x2e\x33\x32\x20\x32\x34\x2e\x33\x32\x68\ -\x31\x37\x36\x2e\x36\x34\x6c\x2d\x33\x36\x2e\x33\x32\x20\x33\x36\ -\x2e\x33\x32\x20\x33\x34\x2e\x34\x20\x33\x34\x2e\x34\x20\x37\x37\ -\x2e\x39\x32\x2d\x37\x37\x2e\x39\x32\x63\x39\x2e\x36\x2d\x39\x2e\ -\x32\x38\x20\x39\x2e\x36\x2d\x32\x34\x2e\x38\x20\x30\x2e\x31\x36\ -\x2d\x33\x34\x2e\x32\x34\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\ -\x35\x31\x38\x36\x46\x35\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x31\ -\x33\x31\x38\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\ -\x67\x3e\ -\x00\x00\x03\xa3\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x35\x31\x36\x33\x38\x33\x39\x33\x36\x32\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x35\x35\x30\x32\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\ -\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\ -\x3d\x22\x33\x32\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x32\ -\x22\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x39\x34\x2e\ -\x39\x31\x32\x20\x32\x34\x35\x2e\x37\x36\x43\x31\x34\x31\x2e\x33\ -\x31\x32\x20\x32\x34\x35\x2e\x37\x36\x20\x31\x38\x2e\x34\x33\x32\ -\x20\x33\x37\x30\x2e\x36\x38\x38\x20\x31\x38\x2e\x34\x33\x32\x20\ -\x35\x32\x32\x2e\x32\x34\x20\x31\x38\x2e\x34\x33\x32\x20\x36\x37\ -\x35\x2e\x38\x34\x20\x31\x34\x33\x2e\x33\x36\x20\x37\x39\x38\x2e\ -\x37\x32\x20\x32\x39\x34\x2e\x39\x31\x32\x20\x37\x39\x38\x2e\x37\ -\x32\x68\x34\x33\x30\x2e\x30\x38\x63\x31\x35\x33\x2e\x36\x20\x32\ -\x2e\x30\x34\x38\x20\x32\x37\x38\x2e\x35\x32\x38\x2d\x31\x32\x32\ -\x2e\x38\x38\x20\x32\x37\x38\x2e\x35\x32\x38\x2d\x32\x37\x36\x2e\ -\x34\x38\x43\x31\x30\x30\x33\x2e\x35\x32\x20\x33\x37\x30\x2e\x36\ -\x38\x38\x20\x38\x37\x38\x2e\x35\x39\x32\x20\x32\x34\x35\x2e\x37\ -\x36\x20\x37\x32\x37\x2e\x30\x34\x20\x32\x34\x35\x2e\x37\x36\x48\ -\x32\x39\x34\x2e\x39\x31\x32\x7a\x20\x6d\x30\x20\x35\x30\x37\x2e\ -\x39\x30\x34\x63\x2d\x31\x32\x36\x2e\x39\x37\x36\x20\x30\x2d\x32\ -\x33\x31\x2e\x34\x32\x34\x2d\x31\x30\x32\x2e\x34\x2d\x32\x33\x31\ -\x2e\x34\x32\x34\x2d\x32\x33\x31\x2e\x34\x32\x34\x20\x30\x2d\x31\ -\x32\x36\x2e\x39\x37\x36\x20\x31\x30\x32\x2e\x34\x2d\x32\x33\x31\ -\x2e\x34\x32\x34\x20\x32\x33\x31\x2e\x34\x32\x34\x2d\x32\x33\x31\ -\x2e\x34\x32\x34\x68\x34\x33\x30\x2e\x30\x38\x63\x31\x32\x36\x2e\ -\x39\x37\x36\x20\x30\x20\x32\x33\x31\x2e\x34\x32\x34\x20\x31\x30\ -\x32\x2e\x34\x20\x32\x33\x31\x2e\x34\x32\x34\x20\x32\x33\x31\x2e\ -\x34\x32\x34\x20\x30\x20\x31\x32\x36\x2e\x39\x37\x36\x2d\x31\x30\ -\x32\x2e\x34\x20\x32\x33\x31\x2e\x34\x32\x34\x2d\x32\x33\x31\x2e\ -\x34\x32\x34\x20\x32\x33\x31\x2e\x34\x32\x34\x68\x2d\x34\x33\x30\ -\x2e\x30\x38\x7a\x20\x6d\x31\x37\x34\x2e\x30\x38\x2d\x32\x33\x31\ -\x2e\x34\x32\x34\x63\x30\x2d\x39\x34\x2e\x32\x30\x38\x2d\x37\x35\ -\x2e\x37\x37\x36\x2d\x31\x36\x39\x2e\x39\x38\x34\x2d\x31\x36\x39\ -\x2e\x39\x38\x34\x2d\x31\x36\x39\x2e\x39\x38\x34\x53\x31\x33\x31\ -\x2e\x30\x37\x32\x20\x34\x33\x30\x2e\x30\x38\x20\x31\x33\x31\x2e\ -\x30\x37\x32\x20\x35\x32\x32\x2e\x32\x34\x63\x30\x20\x39\x34\x2e\ -\x32\x30\x38\x20\x37\x35\x2e\x37\x37\x36\x20\x31\x36\x39\x2e\x39\ -\x38\x34\x20\x31\x36\x39\x2e\x39\x38\x34\x20\x31\x36\x39\x2e\x39\ -\x38\x34\x73\x31\x36\x37\x2e\x39\x33\x36\x2d\x37\x35\x2e\x37\x37\ -\x36\x20\x31\x36\x37\x2e\x39\x33\x36\x2d\x31\x36\x39\x2e\x39\x38\ -\x34\x7a\x20\x6d\x30\x20\x30\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\ -\x43\x43\x43\x43\x43\x43\x22\x20\x70\x2d\x69\x64\x3d\x22\x31\x35\ -\x35\x30\x33\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\ -\x67\x3e\ -\x00\x00\x02\xe4\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x36\x31\x39\x31\x33\x32\x31\x38\x33\x30\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x39\x39\x31\x35\x22\x20\x78\ -\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ -\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\ -\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x34\x31\x36\x20\x31\ -\x39\x32\x43\x35\x33\x37\x2e\x36\x20\x31\x39\x32\x20\x36\x34\x30\ -\x20\x32\x39\x34\x2e\x34\x20\x36\x34\x30\x20\x34\x31\x36\x53\x35\ -\x33\x37\x2e\x36\x20\x36\x34\x30\x20\x34\x31\x36\x20\x36\x34\x30\ -\x20\x31\x39\x32\x20\x35\x33\x37\x2e\x36\x20\x31\x39\x32\x20\x34\ -\x31\x36\x20\x32\x39\x34\x2e\x34\x20\x31\x39\x32\x20\x34\x31\x36\ -\x20\x31\x39\x32\x4d\x34\x31\x36\x20\x31\x32\x38\x43\x32\x35\x36\ -\x20\x31\x32\x38\x20\x31\x32\x38\x20\x32\x35\x36\x20\x31\x32\x38\ -\x20\x34\x31\x36\x53\x32\x35\x36\x20\x37\x30\x34\x20\x34\x31\x36\ -\x20\x37\x30\x34\x20\x37\x30\x34\x20\x35\x37\x36\x20\x37\x30\x34\ -\x20\x34\x31\x36\x20\x35\x37\x36\x20\x31\x32\x38\x20\x34\x31\x36\ -\x20\x31\x32\x38\x4c\x34\x31\x36\x20\x31\x32\x38\x7a\x22\x20\x66\ -\x69\x6c\x6c\x3d\x22\x23\x32\x37\x32\x36\x33\x36\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x39\x39\x31\x36\x22\x3e\x3c\x2f\x70\x61\x74\x68\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\x33\x32\x20\x38\ -\x36\x34\x63\x2d\x36\x2e\x34\x20\x30\x2d\x31\x39\x2e\x32\x20\x30\ -\x2d\x32\x35\x2e\x36\x2d\x36\x2e\x34\x6c\x2d\x31\x39\x32\x2d\x31\ -\x39\x32\x63\x2d\x31\x32\x2e\x38\x2d\x31\x32\x2e\x38\x2d\x31\x32\ -\x2e\x38\x2d\x33\x32\x20\x30\x2d\x34\x34\x2e\x38\x73\x33\x32\x2d\ -\x31\x32\x2e\x38\x20\x34\x34\x2e\x38\x20\x30\x6c\x31\x39\x32\x20\ -\x31\x39\x32\x63\x31\x32\x2e\x38\x20\x31\x32\x2e\x38\x20\x31\x32\ -\x2e\x38\x20\x33\x32\x20\x30\x20\x34\x34\x2e\x38\x43\x38\x35\x31\ -\x2e\x32\x20\x38\x36\x34\x20\x38\x33\x38\x2e\x34\x20\x38\x36\x34\ -\x20\x38\x33\x32\x20\x38\x36\x34\x7a\x22\x20\x66\x69\x6c\x6c\x3d\ -\x22\x23\x32\x37\x32\x36\x33\x36\x22\x20\x70\x2d\x69\x64\x3d\x22\ -\x39\x39\x31\x37\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\ -\x76\x67\x3e\ -\x00\x00\x02\x2c\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x32\x35\x36\x32\x37\x38\x34\x34\x38\x37\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x36\x30\x33\x32\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\ -\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\ -\x3d\x22\x33\x32\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x32\ -\x22\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x33\x38\x30\x2e\ -\x36\x37\x37\x20\x31\x37\x36\x2e\x32\x37\x39\x6c\x33\x39\x30\x2e\ -\x31\x38\x32\x20\x32\x32\x35\x2e\x32\x37\x32\x63\x38\x35\x2e\x30\ -\x32\x34\x20\x34\x39\x2e\x30\x38\x39\x20\x38\x35\x2e\x30\x32\x34\ -\x20\x31\x37\x31\x2e\x38\x31\x20\x30\x20\x32\x32\x30\x2e\x38\x39\ -\x39\x4c\x33\x38\x30\x2e\x36\x37\x37\x20\x38\x34\x37\x2e\x37\x32\ -\x31\x63\x2d\x38\x35\x2e\x30\x32\x34\x20\x34\x39\x2e\x30\x38\x39\ -\x2d\x31\x39\x31\x2e\x33\x30\x34\x2d\x31\x32\x2e\x32\x37\x32\x2d\ -\x31\x39\x31\x2e\x33\x30\x34\x2d\x31\x31\x30\x2e\x34\x34\x39\x56\ -\x32\x38\x36\x2e\x37\x32\x38\x63\x30\x2d\x39\x38\x2e\x31\x37\x37\ -\x20\x31\x30\x36\x2e\x32\x38\x2d\x31\x35\x39\x2e\x35\x33\x38\x20\ -\x31\x39\x31\x2e\x33\x30\x34\x2d\x31\x31\x30\x2e\x34\x34\x39\x7a\ -\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x37\x42\x31\x35\x22\ -\x20\x70\x2d\x69\x64\x3d\x22\x32\x36\x30\x33\x33\x22\x3e\x3c\x2f\ -\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x04\xe7\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x36\x30\x39\x34\x32\x37\x36\x38\x31\x30\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x32\x34\x39\x22\x20\x78\ -\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ -\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\ -\x22\x33\x32\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x32\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x35\x34\x39\x2e\x35\ -\x34\x36\x36\x36\x37\x20\x33\x32\x30\x76\x31\x37\x36\x2e\x36\x34\ -\x6c\x31\x32\x34\x2e\x35\x38\x36\x36\x36\x36\x20\x31\x32\x34\x2e\ -\x35\x38\x36\x36\x36\x37\x61\x32\x31\x2e\x33\x33\x33\x33\x33\x33\ -\x20\x32\x31\x2e\x33\x33\x33\x33\x33\x33\x20\x30\x20\x30\x20\x31\ -\x20\x30\x20\x33\x30\x2e\x32\x39\x33\x33\x33\x33\x6c\x2d\x32\x32\ -\x2e\x36\x31\x33\x33\x33\x33\x20\x32\x32\x2e\x36\x31\x33\x33\x33\ -\x33\x61\x32\x31\x2e\x33\x33\x33\x33\x33\x33\x20\x32\x31\x2e\x33\ -\x33\x33\x33\x33\x33\x20\x30\x20\x30\x20\x31\x2d\x33\x30\x2e\x32\ -\x39\x33\x33\x33\x33\x20\x30\x6c\x2d\x31\x34\x30\x2e\x33\x37\x33\ -\x33\x33\x34\x2d\x31\x34\x30\x2e\x33\x37\x33\x33\x33\x33\x61\x32\ -\x32\x2e\x36\x31\x33\x33\x33\x33\x20\x32\x32\x2e\x36\x31\x33\x33\ -\x33\x33\x20\x30\x20\x30\x20\x31\x2d\x36\x2e\x34\x2d\x31\x34\x2e\ -\x39\x33\x33\x33\x33\x33\x56\x33\x32\x30\x61\x32\x31\x2e\x33\x33\ -\x33\x33\x33\x33\x20\x32\x31\x2e\x33\x33\x33\x33\x33\x33\x20\x30\ -\x20\x30\x20\x31\x20\x32\x31\x2e\x33\x33\x33\x33\x33\x34\x2d\x32\ -\x31\x2e\x33\x33\x33\x33\x33\x33\x68\x33\x32\x2e\x34\x32\x36\x36\ -\x36\x36\x61\x32\x31\x2e\x33\x33\x33\x33\x33\x33\x20\x32\x31\x2e\ -\x33\x33\x33\x33\x33\x33\x20\x30\x20\x30\x20\x31\x20\x32\x31\x2e\ -\x33\x33\x33\x33\x33\x34\x20\x32\x31\x2e\x33\x33\x33\x33\x33\x33\ -\x7a\x20\x6d\x33\x34\x36\x2e\x34\x35\x33\x33\x33\x33\x20\x38\x35\ -\x2e\x33\x33\x33\x33\x33\x33\x76\x2d\x32\x31\x33\x2e\x33\x33\x33\ -\x33\x33\x33\x61\x32\x31\x2e\x33\x33\x33\x33\x33\x33\x20\x32\x31\ -\x2e\x33\x33\x33\x33\x33\x33\x20\x30\x20\x30\x20\x30\x2d\x32\x31\ -\x2e\x33\x33\x33\x33\x33\x33\x2d\x32\x31\x2e\x33\x33\x33\x33\x33\ -\x33\x68\x2d\x31\x32\x2e\x33\x37\x33\x33\x33\x34\x61\x32\x30\x2e\ -\x39\x30\x36\x36\x36\x37\x20\x32\x30\x2e\x39\x30\x36\x36\x36\x37\ -\x20\x30\x20\x30\x20\x30\x2d\x31\x35\x2e\x33\x36\x20\x36\x2e\x34\ -\x6c\x2d\x36\x33\x2e\x35\x37\x33\x33\x33\x33\x20\x36\x33\x2e\x35\ -\x37\x33\x33\x33\x33\x41\x33\x38\x34\x20\x33\x38\x34\x20\x30\x20\ -\x31\x20\x30\x20\x38\x39\x36\x20\x35\x33\x34\x2e\x36\x31\x33\x33\ -\x33\x33\x61\x32\x31\x2e\x33\x33\x33\x33\x33\x33\x20\x32\x31\x2e\ -\x33\x33\x33\x33\x33\x33\x20\x30\x20\x30\x20\x30\x2d\x35\x2e\x35\ -\x34\x36\x36\x36\x37\x2d\x31\x35\x2e\x37\x38\x36\x36\x36\x36\x20\ -\x32\x32\x2e\x31\x38\x36\x36\x36\x37\x20\x32\x32\x2e\x31\x38\x36\ -\x36\x36\x37\x20\x30\x20\x30\x20\x30\x2d\x31\x35\x2e\x33\x36\x2d\ -\x36\x2e\x38\x32\x36\x36\x36\x37\x68\x2d\x34\x32\x2e\x36\x36\x36\ -\x36\x36\x36\x61\x32\x31\x2e\x33\x33\x33\x33\x33\x33\x20\x32\x31\ -\x2e\x33\x33\x33\x33\x33\x33\x20\x30\x20\x30\x20\x30\x2d\x32\x31\ -\x2e\x33\x33\x33\x33\x33\x34\x20\x32\x30\x2e\x30\x35\x33\x33\x33\ -\x33\x41\x32\x39\x38\x2e\x36\x36\x36\x36\x36\x37\x20\x32\x39\x38\ -\x2e\x36\x36\x36\x36\x36\x37\x20\x30\x20\x31\x20\x31\x20\x35\x31\ -\x32\x20\x32\x31\x33\x2e\x33\x33\x33\x33\x33\x33\x61\x32\x39\x35\ -\x2e\x36\x38\x20\x32\x39\x35\x2e\x36\x38\x20\x30\x20\x30\x20\x31\ -\x20\x32\x31\x30\x2e\x33\x34\x36\x36\x36\x37\x20\x38\x38\x2e\x33\ -\x32\x6c\x2d\x37\x35\x2e\x39\x34\x36\x36\x36\x37\x20\x37\x35\x2e\ -\x39\x34\x36\x36\x36\x37\x61\x32\x30\x2e\x39\x30\x36\x36\x36\x37\ -\x20\x32\x30\x2e\x39\x30\x36\x36\x36\x37\x20\x30\x20\x30\x20\x30\ -\x2d\x36\x2e\x34\x20\x31\x35\x2e\x33\x36\x76\x31\x32\x2e\x33\x37\ -\x33\x33\x33\x33\x61\x32\x31\x2e\x33\x33\x33\x33\x33\x33\x20\x32\ -\x31\x2e\x33\x33\x33\x33\x33\x33\x20\x30\x20\x30\x20\x30\x20\x32\ -\x31\x2e\x33\x33\x33\x33\x33\x33\x20\x32\x31\x2e\x33\x33\x33\x33\ -\x33\x34\x68\x32\x31\x33\x2e\x33\x33\x33\x33\x33\x34\x61\x32\x31\ -\x2e\x33\x33\x33\x33\x33\x33\x20\x32\x31\x2e\x33\x33\x33\x33\x33\ -\x33\x20\x30\x20\x30\x20\x30\x20\x32\x31\x2e\x33\x33\x33\x33\x33\ -\x33\x2d\x32\x31\x2e\x33\x33\x33\x33\x33\x34\x7a\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x35\x32\x35\x30\x22\x20\x66\x69\x6c\x6c\x3d\x22\ -\x23\x64\x38\x31\x65\x30\x36\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\ -\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x03\x5f\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x34\x38\x38\x37\x36\x34\x33\x37\x39\x31\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x36\x31\x35\x36\x22\x20\x78\ -\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ -\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\ -\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\x30\x33\x2e\x33\ -\x34\x32\x39\x39\x37\x20\x38\x37\x2e\x30\x31\x33\x38\x39\x36\x61\ -\x34\x37\x2e\x39\x30\x38\x38\x32\x37\x20\x34\x37\x2e\x39\x30\x38\ -\x38\x32\x37\x20\x30\x20\x30\x20\x30\x20\x30\x2d\x37\x30\x2e\x39\ -\x39\x33\x31\x30\x32\x41\x36\x31\x2e\x34\x32\x31\x35\x37\x34\x20\ -\x36\x31\x2e\x34\x32\x31\x35\x37\x34\x20\x30\x20\x30\x20\x30\x20\ -\x37\x32\x33\x2e\x39\x30\x34\x34\x32\x39\x20\x31\x33\x2e\x32\x35\ -\x36\x38\x32\x33\x6c\x2d\x33\x2e\x31\x37\x33\x34\x34\x38\x20\x32\ -\x2e\x37\x36\x33\x39\x37\x31\x4c\x32\x34\x31\x2e\x32\x33\x33\x32\ -\x33\x20\x34\x37\x30\x2e\x39\x34\x39\x39\x31\x35\x6c\x2d\x32\x2e\ -\x34\x30\x35\x36\x37\x38\x20\x31\x2e\x38\x34\x32\x36\x34\x37\x63\ -\x2d\x31\x2e\x36\x33\x37\x39\x30\x39\x20\x31\x2e\x32\x32\x38\x34\ -\x33\x31\x2d\x33\x2e\x31\x37\x33\x34\x34\x38\x20\x32\x2e\x35\x35\ -\x39\x32\x33\x32\x2d\x34\x2e\x36\x30\x36\x36\x31\x38\x20\x33\x2e\ -\x39\x34\x31\x32\x31\x38\x2d\x32\x30\x2e\x30\x31\x33\x31\x39\x36\ -\x20\x31\x38\x2e\x39\x33\x38\x33\x31\x39\x2d\x32\x30\x2e\x39\x38\ -\x35\x37\x30\x34\x20\x34\x38\x2e\x31\x31\x33\x35\x36\x36\x2d\x32\ -\x2e\x38\x36\x36\x33\x34\x20\x36\x38\x2e\x30\x37\x35\x35\x37\x37\ -\x6c\x32\x2e\x38\x31\x35\x31\x35\x35\x20\x32\x2e\x39\x31\x37\x35\ -\x32\x35\x20\x34\x38\x34\x2e\x38\x32\x30\x39\x35\x34\x20\x34\x35\ -\x39\x2e\x39\x34\x35\x32\x31\x36\x63\x32\x32\x2e\x35\x32\x31\x32\ -\x34\x34\x20\x32\x31\x2e\x33\x34\x33\x39\x39\x37\x20\x36\x30\x2e\ -\x30\x39\x30\x37\x37\x33\x20\x32\x31\x2e\x33\x34\x33\x39\x39\x37\ -\x20\x38\x32\x2e\x36\x31\x32\x30\x31\x36\x20\x30\x20\x32\x30\x2e\ -\x30\x31\x33\x31\x39\x36\x2d\x31\x38\x2e\x39\x33\x38\x33\x31\x39\ -\x20\x32\x30\x2e\x39\x38\x35\x37\x30\x34\x2d\x34\x38\x2e\x31\x31\ -\x33\x35\x36\x36\x20\x32\x2e\x38\x36\x36\x33\x34\x2d\x36\x38\x2e\ -\x30\x37\x35\x35\x37\x37\x6c\x2d\x32\x2e\x38\x36\x36\x33\x34\x2d\ -\x32\x2e\x39\x36\x38\x37\x30\x39\x2d\x34\x34\x36\x2e\x38\x39\x33\ -\x31\x33\x32\x2d\x34\x32\x33\x2e\x39\x31\x31\x32\x32\x37\x4c\x38\ -\x30\x33\x2e\x33\x34\x32\x39\x39\x37\x20\x38\x37\x2e\x30\x31\x33\ -\x38\x39\x36\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x33\x30\x33\ -\x31\x33\x33\x22\x20\x70\x2d\x69\x64\x3d\x22\x36\x31\x35\x37\x22\ -\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x09\xf9\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\ -\x72\x61\x70\x68\x69\x63\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\ -\x44\x54\x44\x2f\x73\x76\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\ -\x0a\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x36\x39\x38\x33\x32\x38\ -\x33\x33\x34\x32\x36\x30\x22\x20\x63\x6c\x61\x73\x73\x3d\x22\x69\ -\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ -\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\x22\x20\x76\x65\x72\ -\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x78\x6d\x6c\x6e\x73\ -\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\ -\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x34\x37\x32\x34\x22\x0d\x0a\x20\x20\x20\x20\x20\ -\x77\x69\x64\x74\x68\x3d\x22\x32\x30\x30\x22\x20\x68\x65\x69\x67\ -\x68\x74\x3d\x22\x32\x30\x30\x22\x3e\x0d\x0a\x20\x20\x20\x20\x3c\ -\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x33\x33\x32\x2e\x37\x39\x39\ -\x30\x30\x32\x20\x36\x38\x36\x2e\x30\x38\x31\x30\x31\x34\x6d\x2d\ -\x33\x33\x32\x2e\x37\x39\x39\x30\x30\x32\x20\x30\x61\x33\x33\x32\ -\x2e\x37\x39\x39\x30\x30\x32\x20\x33\x33\x32\x2e\x37\x39\x39\x30\ -\x30\x32\x20\x30\x20\x31\x20\x30\x20\x36\x36\x35\x2e\x35\x39\x38\ -\x30\x30\x33\x20\x30\x20\x33\x33\x32\x2e\x37\x39\x39\x30\x30\x32\ -\x20\x33\x33\x32\x2e\x37\x39\x39\x30\x30\x32\x20\x30\x20\x31\x20\ -\x30\x2d\x36\x36\x35\x2e\x35\x39\x38\x30\x30\x33\x20\x30\x5a\x22\ -\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\ -\x3d\x22\x23\x46\x34\x45\x46\x43\x39\x22\x20\x70\x2d\x69\x64\x3d\ -\x22\x34\x37\x32\x35\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\ -\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\x38\ -\x33\x2e\x31\x39\x37\x33\x35\x20\x31\x30\x32\x34\x68\x2d\x36\x33\ -\x39\x2e\x39\x39\x38\x30\x38\x41\x31\x34\x31\x2e\x30\x35\x35\x35\ -\x37\x37\x20\x31\x34\x31\x2e\x30\x35\x35\x35\x37\x37\x20\x30\x20\ -\x30\x20\x31\x20\x31\x30\x32\x2e\x33\x39\x39\x36\x39\x33\x20\x38\ -\x38\x33\x2e\x32\x30\x30\x34\x32\x32\x76\x2d\x37\x34\x32\x2e\x33\ -\x39\x37\x37\x37\x32\x41\x31\x34\x31\x2e\x30\x35\x35\x35\x37\x37\ -\x20\x31\x34\x31\x2e\x30\x35\x35\x35\x37\x37\x20\x30\x20\x30\x20\ -\x31\x20\x32\x34\x33\x2e\x31\x39\x39\x32\x37\x20\x30\x2e\x30\x30\ -\x33\x30\x37\x32\x68\x35\x31\x36\x2e\x33\x35\x30\x34\x35\x31\x61\ -\x38\x39\x2e\x30\x38\x37\x37\x33\x33\x20\x38\x39\x2e\x30\x38\x37\ -\x37\x33\x33\x20\x30\x20\x30\x20\x31\x20\x36\x33\x2e\x32\x33\x31\ -\x38\x31\x31\x20\x32\x35\x2e\x35\x39\x39\x39\x32\x33\x6c\x31\x38\ -\x39\x2e\x36\x39\x35\x34\x33\x31\x20\x31\x38\x39\x2e\x36\x39\x35\ -\x34\x33\x31\x41\x33\x38\x2e\x33\x39\x39\x38\x38\x35\x20\x33\x38\ -\x2e\x33\x39\x39\x38\x38\x35\x20\x30\x20\x30\x20\x31\x20\x31\x30\ -\x32\x33\x2e\x39\x39\x36\x39\x32\x38\x20\x32\x34\x33\x2e\x32\x30\ -\x32\x33\x34\x32\x76\x36\x33\x39\x2e\x39\x39\x38\x30\x38\x61\x31\ -\x34\x31\x2e\x30\x35\x35\x35\x37\x37\x20\x31\x34\x31\x2e\x30\x35\ -\x35\x35\x37\x37\x20\x30\x20\x30\x20\x31\x2d\x31\x34\x30\x2e\x37\ -\x39\x39\x35\x37\x38\x20\x31\x34\x30\x2e\x37\x39\x39\x35\x37\x38\ -\x7a\x4d\x32\x34\x33\x2e\x31\x39\x39\x32\x37\x20\x37\x36\x2e\x38\ -\x30\x32\x38\x34\x32\x41\x36\x33\x2e\x39\x39\x39\x38\x30\x38\x20\ -\x36\x33\x2e\x39\x39\x39\x38\x30\x38\x20\x30\x20\x30\x20\x30\x20\ -\x31\x37\x39\x2e\x31\x39\x39\x34\x36\x32\x20\x31\x34\x30\x2e\x38\ -\x30\x32\x36\x35\x76\x37\x34\x32\x2e\x33\x39\x37\x37\x37\x32\x41\ -\x36\x33\x2e\x39\x39\x39\x38\x30\x38\x20\x36\x33\x2e\x39\x39\x39\ -\x38\x30\x38\x20\x30\x20\x30\x20\x30\x20\x32\x34\x33\x2e\x31\x39\ -\x39\x32\x37\x20\x39\x34\x37\x2e\x32\x30\x30\x32\x33\x68\x36\x33\ -\x39\x2e\x39\x39\x38\x30\x38\x61\x36\x33\x2e\x39\x39\x39\x38\x30\ -\x38\x20\x36\x33\x2e\x39\x39\x39\x38\x30\x38\x20\x30\x20\x30\x20\ -\x30\x20\x36\x33\x2e\x39\x39\x39\x38\x30\x38\x2d\x36\x33\x2e\x39\ -\x39\x39\x38\x30\x38\x56\x32\x35\x39\x2e\x30\x37\x34\x32\x39\x35\ -\x6c\x2d\x31\x37\x39\x2e\x31\x39\x39\x34\x36\x32\x2d\x31\x37\x39\ -\x2e\x31\x39\x39\x34\x36\x33\x61\x31\x32\x2e\x37\x39\x39\x39\x36\ -\x32\x20\x31\x32\x2e\x37\x39\x39\x39\x36\x32\x20\x30\x20\x30\x20\ -\x30\x2d\x38\x2e\x34\x34\x37\x39\x37\x35\x2d\x33\x2e\x30\x37\x31\ -\x39\x39\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\ -\x66\x69\x6c\x6c\x3d\x22\x23\x34\x33\x34\x32\x36\x30\x22\x20\x70\ -\x2d\x69\x64\x3d\x22\x34\x37\x32\x36\x22\x3e\x3c\x2f\x70\x61\x74\ -\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\ -\x22\x4d\x32\x39\x32\x2e\x30\x39\x35\x31\x32\x34\x20\x35\x31\x32\ -\x2e\x30\x30\x31\x35\x33\x36\x63\x30\x2d\x37\x33\x2e\x37\x32\x37\ -\x37\x37\x39\x20\x34\x34\x2e\x37\x39\x39\x38\x36\x36\x2d\x31\x31\ -\x38\x2e\x30\x31\x35\x36\x34\x36\x20\x31\x30\x32\x2e\x33\x39\x39\ -\x36\x39\x33\x2d\x31\x31\x38\x2e\x30\x31\x35\x36\x34\x36\x61\x38\ -\x37\x2e\x30\x33\x39\x37\x33\x39\x20\x38\x37\x2e\x30\x33\x39\x37\ -\x33\x39\x20\x30\x20\x30\x20\x31\x20\x36\x34\x2e\x32\x35\x35\x38\ -\x30\x37\x20\x32\x38\x2e\x36\x37\x31\x39\x31\x34\x6c\x2d\x31\x39\ -\x2e\x34\x35\x35\x39\x34\x32\x20\x32\x32\x2e\x37\x38\x33\x39\x33\ -\x32\x61\x36\x30\x2e\x31\x35\x39\x38\x32\x20\x36\x30\x2e\x31\x35\ -\x39\x38\x32\x20\x30\x20\x30\x20\x30\x2d\x34\x34\x2e\x32\x38\x37\ -\x38\x36\x37\x2d\x32\x30\x2e\x32\x32\x33\x39\x34\x63\x2d\x33\x38\ -\x2e\x39\x31\x31\x38\x38\x33\x20\x30\x2d\x36\x36\x2e\x30\x34\x37\ -\x38\x30\x32\x20\x33\x32\x2e\x35\x31\x31\x39\x30\x32\x2d\x36\x36\ -\x2e\x30\x34\x37\x38\x30\x32\x20\x38\x35\x2e\x37\x35\x39\x37\x34\ -\x33\x73\x32\x35\x2e\x35\x39\x39\x39\x32\x33\x20\x38\x36\x2e\x35\ -\x32\x37\x37\x34\x20\x36\x35\x2e\x30\x32\x33\x38\x30\x35\x20\x38\ -\x36\x2e\x35\x32\x37\x37\x34\x61\x36\x35\x2e\x37\x39\x31\x38\x30\ -\x33\x20\x36\x35\x2e\x37\x39\x31\x38\x30\x33\x20\x30\x20\x30\x20\ -\x30\x20\x35\x31\x2e\x31\x39\x39\x38\x34\x36\x2d\x32\x34\x2e\x30\ -\x36\x33\x39\x32\x37\x6c\x31\x38\x2e\x39\x34\x33\x39\x34\x34\x20\ -\x32\x32\x2e\x35\x32\x37\x39\x33\x32\x61\x38\x39\x2e\x30\x38\x37\ -\x37\x33\x33\x20\x38\x39\x2e\x30\x38\x37\x37\x33\x33\x20\x30\x20\ -\x30\x20\x31\x2d\x37\x30\x2e\x33\x39\x39\x37\x38\x39\x20\x33\x32\ -\x2e\x35\x31\x31\x39\x30\x33\x63\x2d\x35\x38\x2e\x31\x31\x31\x38\ -\x32\x36\x20\x30\x2e\x37\x36\x37\x39\x39\x38\x2d\x31\x30\x31\x2e\ -\x36\x33\x31\x36\x39\x35\x2d\x34\x31\x2e\x37\x32\x37\x38\x37\x35\ -\x2d\x31\x30\x31\x2e\x36\x33\x31\x36\x39\x35\x2d\x31\x31\x36\x2e\ -\x34\x37\x39\x36\x35\x31\x7a\x4d\x34\x37\x38\x2e\x32\x30\x36\x35\ -\x36\x35\x20\x35\x39\x35\x2e\x39\x36\x39\x32\x38\x34\x6c\x32\x30\ -\x2e\x39\x39\x31\x39\x33\x37\x2d\x32\x35\x2e\x35\x39\x39\x39\x32\ -\x33\x61\x38\x37\x2e\x35\x35\x31\x37\x33\x37\x20\x38\x37\x2e\x35\ -\x35\x31\x37\x33\x37\x20\x30\x20\x30\x20\x30\x20\x36\x30\x2e\x31\ -\x35\x39\x38\x32\x20\x32\x35\x2e\x35\x39\x39\x39\x32\x33\x63\x32\ -\x37\x2e\x33\x39\x31\x39\x31\x38\x20\x30\x20\x34\x32\x2e\x37\x35\ -\x31\x38\x37\x32\x2d\x31\x32\x2e\x37\x39\x39\x39\x36\x32\x20\x34\ -\x32\x2e\x37\x35\x31\x38\x37\x32\x2d\x33\x31\x2e\x39\x39\x39\x39\ -\x30\x34\x73\x2d\x31\x35\x2e\x33\x35\x39\x39\x35\x34\x2d\x32\x37\ -\x2e\x31\x33\x35\x39\x31\x39\x2d\x33\x36\x2e\x33\x35\x31\x38\x39\ -\x31\x2d\x33\x36\x2e\x33\x35\x31\x38\x39\x31\x6c\x2d\x33\x31\x2e\ -\x32\x33\x31\x39\x30\x37\x2d\x31\x33\x2e\x35\x36\x37\x39\x35\x39\ -\x61\x36\x35\x2e\x30\x32\x33\x38\x30\x35\x20\x36\x35\x2e\x30\x32\ -\x33\x38\x30\x35\x20\x30\x20\x30\x20\x31\x2d\x34\x36\x2e\x30\x37\ -\x39\x38\x36\x31\x2d\x35\x39\x2e\x31\x33\x35\x38\x32\x33\x41\x36\ -\x37\x2e\x30\x37\x31\x37\x39\x39\x20\x36\x37\x2e\x30\x37\x31\x37\ -\x39\x39\x20\x30\x20\x30\x20\x31\x20\x35\x36\x33\x2e\x31\x39\x38\ -\x33\x31\x20\x33\x39\x34\x2e\x37\x35\x33\x38\x38\x38\x61\x39\x36\ -\x2e\x37\x36\x37\x37\x31\x20\x39\x36\x2e\x37\x36\x37\x37\x31\x20\ -\x30\x20\x30\x20\x31\x20\x36\x38\x2e\x33\x35\x31\x37\x39\x35\x20\ -\x32\x38\x2e\x36\x37\x31\x39\x31\x34\x6c\x2d\x31\x38\x2e\x36\x38\ -\x37\x39\x34\x34\x20\x32\x32\x2e\x37\x38\x33\x39\x33\x31\x61\x37\ -\x32\x2e\x31\x39\x31\x37\x38\x33\x20\x37\x32\x2e\x31\x39\x31\x37\ -\x38\x33\x20\x30\x20\x30\x20\x30\x2d\x34\x39\x2e\x36\x36\x33\x38\ -\x35\x31\x2d\x32\x30\x2e\x32\x32\x33\x39\x33\x39\x63\x2d\x32\x33\ -\x2e\x30\x33\x39\x39\x33\x31\x20\x30\x2d\x33\x38\x2e\x31\x34\x33\ -\x38\x38\x36\x20\x31\x31\x2e\x30\x30\x37\x39\x36\x37\x2d\x33\x38\ -\x2e\x31\x34\x33\x38\x38\x35\x20\x32\x39\x2e\x31\x38\x33\x39\x31\ -\x32\x73\x31\x38\x2e\x31\x37\x35\x39\x34\x35\x20\x32\x35\x2e\x35\ -\x39\x39\x39\x32\x33\x20\x33\x36\x2e\x36\x30\x37\x38\x39\x20\x33\ -\x34\x2e\x30\x34\x37\x38\x39\x38\x6c\x33\x30\x2e\x39\x37\x35\x39\ -\x30\x37\x20\x31\x33\x2e\x33\x31\x31\x39\x36\x41\x36\x33\x2e\x32\ -\x33\x31\x38\x31\x20\x36\x33\x2e\x32\x33\x31\x38\x31\x20\x30\x20\ -\x30\x20\x31\x20\x36\x33\x38\x2e\x32\x30\x36\x30\x38\x35\x20\x35\ -\x36\x33\x2e\x32\x30\x31\x33\x38\x32\x63\x30\x20\x33\x36\x2e\x33\ -\x35\x31\x38\x39\x31\x2d\x32\x39\x2e\x39\x35\x31\x39\x31\x20\x36\ -\x35\x2e\x37\x39\x31\x38\x30\x33\x2d\x37\x39\x2e\x36\x31\x35\x37\ -\x36\x31\x20\x36\x35\x2e\x37\x39\x31\x38\x30\x33\x61\x31\x31\x32\ -\x2e\x36\x33\x39\x36\x36\x32\x20\x31\x31\x32\x2e\x36\x33\x39\x36\ -\x36\x32\x20\x30\x20\x30\x20\x31\x2d\x38\x30\x2e\x33\x38\x33\x37\ -\x35\x39\x2d\x33\x33\x2e\x30\x32\x33\x39\x30\x31\x7a\x4d\x36\x35\ -\x30\x2e\x37\x35\x30\x30\x34\x38\x20\x33\x39\x39\x2e\x31\x30\x35\ -\x38\x37\x35\x68\x33\x37\x2e\x38\x38\x37\x38\x38\x36\x6c\x33\x33\ -\x2e\x35\x33\x35\x38\x39\x39\x20\x31\x31\x36\x2e\x39\x39\x31\x36\ -\x34\x39\x63\x37\x2e\x36\x37\x39\x39\x37\x37\x20\x32\x35\x2e\x35\ -\x39\x39\x39\x32\x33\x20\x31\x32\x2e\x35\x34\x33\x39\x36\x32\x20\ -\x34\x37\x2e\x38\x37\x31\x38\x35\x36\x20\x32\x30\x2e\x34\x37\x39\ -\x39\x33\x39\x20\x37\x33\x2e\x39\x38\x33\x37\x37\x38\x68\x31\x2e\ -\x35\x33\x35\x39\x39\x35\x63\x37\x2e\x36\x37\x39\x39\x37\x37\x2d\ -\x32\x35\x2e\x35\x39\x39\x39\x32\x33\x20\x31\x33\x2e\x33\x31\x31\ -\x39\x36\x2d\x34\x38\x2e\x31\x32\x37\x38\x35\x36\x20\x32\x30\x2e\ -\x34\x37\x39\x39\x33\x39\x2d\x37\x33\x2e\x39\x38\x33\x37\x37\x38\ -\x6c\x33\x33\x2e\x35\x33\x35\x38\x39\x39\x2d\x31\x31\x36\x2e\x39\ -\x39\x31\x36\x34\x39\x68\x33\x36\x2e\x33\x35\x31\x38\x39\x31\x6c\ -\x2d\x37\x30\x2e\x36\x35\x35\x37\x38\x38\x20\x32\x32\x36\x2e\x30\ -\x34\x37\x33\x32\x32\x68\x2d\x34\x32\x2e\x32\x33\x39\x38\x37\x33\ -\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\ -\x6c\x6c\x3d\x22\x23\x34\x33\x34\x32\x36\x30\x22\x20\x70\x2d\x69\ -\x64\x3d\x22\x34\x37\x32\x37\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\ -\x0d\x0a\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x08\x37\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x32\x35\x36\x32\x37\x33\x37\x39\x31\x30\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x35\x30\x30\x32\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\ -\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\ -\x3d\x22\x33\x32\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x32\ -\x22\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x30\x2e\x38\x35\ -\x33\x33\x33\x33\x20\x31\x32\x39\x2e\x37\x30\x36\x36\x36\x37\x63\ -\x30\x2d\x32\x38\x2e\x31\x36\x20\x32\x32\x2e\x31\x38\x36\x36\x36\ -\x37\x2d\x35\x31\x2e\x32\x20\x34\x39\x2e\x34\x39\x33\x33\x33\x34\ -\x2d\x35\x31\x2e\x32\x68\x33\x33\x36\x2e\x32\x31\x33\x33\x33\x33\ -\x63\x31\x39\x2e\x36\x32\x36\x36\x36\x37\x20\x30\x20\x33\x37\x2e\ -\x35\x34\x36\x36\x36\x37\x20\x31\x31\x2e\x39\x34\x36\x36\x36\x37\ -\x20\x34\x35\x2e\x32\x32\x36\x36\x36\x37\x20\x33\x30\x2e\x37\x32\ -\x6c\x32\x33\x2e\x38\x39\x33\x33\x33\x33\x20\x35\x38\x2e\x38\x38\ -\x68\x34\x33\x38\x2e\x36\x31\x33\x33\x33\x33\x63\x31\x32\x2e\x38\ -\x20\x30\x20\x32\x35\x2e\x36\x20\x35\x2e\x31\x32\x20\x33\x34\x2e\ -\x31\x33\x33\x33\x33\x34\x20\x31\x35\x2e\x33\x36\x20\x39\x2e\x33\ -\x38\x36\x36\x36\x37\x20\x39\x2e\x33\x38\x36\x36\x36\x37\x20\x31\ -\x34\x2e\x35\x30\x36\x36\x36\x37\x20\x32\x32\x2e\x31\x38\x36\x36\ -\x36\x37\x20\x31\x34\x2e\x35\x30\x36\x36\x36\x36\x20\x33\x35\x2e\ -\x38\x34\x76\x36\x37\x34\x2e\x31\x33\x33\x33\x33\x33\x63\x30\x20\ -\x31\x33\x2e\x36\x35\x33\x33\x33\x33\x2d\x35\x2e\x31\x32\x20\x32\ -\x36\x2e\x34\x35\x33\x33\x33\x33\x2d\x31\x34\x2e\x35\x30\x36\x36\ -\x36\x36\x20\x33\x35\x2e\x38\x34\x73\x2d\x32\x31\x2e\x33\x33\x33\ -\x33\x33\x33\x20\x31\x35\x2e\x33\x36\x2d\x33\x34\x2e\x31\x33\x33\ -\x33\x33\x34\x20\x31\x35\x2e\x33\x36\x48\x35\x30\x2e\x33\x34\x36\ -\x36\x36\x37\x63\x2d\x31\x32\x2e\x38\x20\x30\x2d\x32\x35\x2e\x36\ -\x2d\x35\x2e\x31\x32\x2d\x33\x34\x2e\x31\x33\x33\x33\x33\x34\x2d\ -\x31\x35\x2e\x33\x36\x2d\x39\x2e\x33\x38\x36\x36\x36\x37\x2d\x39\ -\x2e\x33\x38\x36\x36\x36\x37\x2d\x31\x34\x2e\x35\x30\x36\x36\x36\ -\x37\x2d\x32\x33\x2e\x30\x34\x2d\x31\x34\x2e\x35\x30\x36\x36\x36\ -\x36\x2d\x33\x35\x2e\x38\x34\x2d\x30\x2e\x38\x35\x33\x33\x33\x33\ -\x20\x30\x2e\x38\x35\x33\x33\x33\x33\x2d\x30\x2e\x38\x35\x33\x33\ -\x33\x33\x2d\x37\x36\x33\x2e\x37\x33\x33\x33\x33\x33\x2d\x30\x2e\ -\x38\x35\x33\x33\x33\x34\x2d\x37\x36\x33\x2e\x37\x33\x33\x33\x33\ -\x33\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x41\x30\x30\ -\x30\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x35\x30\x30\x33\x22\x3e\ -\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\ -\x4d\x39\x35\x2e\x35\x37\x33\x33\x33\x33\x20\x32\x31\x33\x2e\x33\ -\x33\x33\x33\x33\x33\x68\x37\x35\x30\x2e\x39\x33\x33\x33\x33\x34\ -\x63\x33\x34\x2e\x31\x33\x33\x33\x33\x33\x20\x30\x20\x35\x32\x2e\ -\x30\x35\x33\x33\x33\x33\x20\x31\x37\x2e\x39\x32\x20\x35\x32\x2e\ -\x30\x35\x33\x33\x33\x33\x20\x35\x32\x2e\x39\x30\x36\x36\x36\x37\ -\x76\x34\x37\x37\x2e\x38\x36\x36\x36\x36\x37\x63\x30\x20\x33\x35\ -\x2e\x38\x34\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x20\x35\x32\ -\x2e\x39\x30\x36\x36\x36\x37\x2d\x35\x32\x2e\x30\x35\x33\x33\x33\ -\x33\x20\x35\x32\x2e\x39\x30\x36\x36\x36\x36\x68\x2d\x37\x35\x30\ -\x2e\x39\x33\x33\x33\x33\x34\x63\x2d\x33\x34\x2e\x31\x33\x33\x33\ -\x33\x33\x20\x30\x2d\x35\x32\x2e\x30\x35\x33\x33\x33\x33\x2d\x31\ -\x37\x2e\x39\x32\x2d\x35\x32\x2e\x30\x35\x33\x33\x33\x33\x2d\x35\ -\x32\x2e\x39\x30\x36\x36\x36\x36\x76\x2d\x34\x37\x37\x2e\x38\x36\ -\x36\x36\x36\x37\x63\x30\x2d\x33\x35\x2e\x38\x34\x20\x31\x37\x2e\ -\x39\x32\x2d\x35\x32\x2e\x39\x30\x36\x36\x36\x37\x20\x35\x32\x2e\ -\x30\x35\x33\x33\x33\x33\x2d\x35\x32\x2e\x39\x30\x36\x36\x36\x37\ -\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x46\x46\x46\x46\ -\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x35\x30\x30\x34\x22\x3e\x3c\ -\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\ -\x31\x33\x31\x2e\x34\x31\x33\x33\x33\x33\x20\x32\x39\x33\x2e\x35\ -\x34\x36\x36\x36\x37\x68\x37\x35\x30\x2e\x39\x33\x33\x33\x33\x34\ -\x63\x33\x34\x2e\x31\x33\x33\x33\x33\x33\x20\x30\x20\x34\x39\x2e\ -\x34\x39\x33\x33\x33\x33\x20\x31\x37\x2e\x30\x36\x36\x36\x36\x37\ -\x20\x34\x34\x2e\x33\x37\x33\x33\x33\x33\x20\x35\x31\x2e\x32\x6c\ -\x2d\x36\x36\x2e\x35\x36\x20\x34\x35\x39\x2e\x39\x34\x36\x36\x36\ -\x36\x63\x2d\x35\x2e\x31\x32\x20\x33\x34\x2e\x31\x33\x33\x33\x33\ -\x33\x2d\x32\x34\x2e\x37\x34\x36\x36\x36\x37\x20\x35\x31\x2e\x32\ -\x2d\x35\x39\x2e\x37\x33\x33\x33\x33\x33\x20\x35\x31\x2e\x32\x68\ -\x2d\x37\x33\x33\x2e\x38\x36\x36\x36\x36\x37\x63\x2d\x33\x34\x2e\ -\x31\x33\x33\x33\x33\x33\x20\x30\x2d\x34\x39\x2e\x34\x39\x33\x33\ -\x33\x33\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x2d\x34\x34\x2e\ -\x33\x37\x33\x33\x33\x33\x2d\x35\x31\x2e\x32\x6c\x34\x39\x2e\x34\ -\x39\x33\x33\x33\x33\x2d\x34\x35\x39\x2e\x39\x34\x36\x36\x36\x36\ -\x63\x35\x2e\x31\x32\x2d\x33\x34\x2e\x39\x38\x36\x36\x36\x37\x20\ -\x32\x35\x2e\x36\x2d\x35\x31\x2e\x32\x20\x35\x39\x2e\x37\x33\x33\ -\x33\x33\x33\x2d\x35\x31\x2e\x32\x7a\x22\x20\x66\x69\x6c\x6c\x3d\ -\x22\x23\x45\x46\x43\x39\x39\x41\x22\x20\x6f\x70\x61\x63\x69\x74\ -\x79\x3d\x22\x2e\x39\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x35\x30\ -\x30\x35\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\ -\x20\x64\x3d\x22\x4d\x31\x33\x39\x2e\x39\x34\x36\x36\x36\x37\x20\ -\x33\x31\x35\x2e\x37\x33\x33\x33\x33\x33\x68\x37\x35\x30\x2e\x39\ -\x33\x33\x33\x33\x33\x63\x33\x34\x2e\x31\x33\x33\x33\x33\x33\x20\ -\x30\x20\x34\x39\x2e\x34\x39\x33\x33\x33\x33\x20\x31\x37\x2e\x30\ -\x36\x36\x36\x36\x37\x20\x34\x34\x2e\x33\x37\x33\x33\x33\x33\x20\ -\x35\x31\x2e\x32\x6c\x2d\x36\x36\x2e\x35\x36\x20\x34\x35\x39\x2e\ -\x39\x34\x36\x36\x36\x37\x63\x2d\x35\x2e\x31\x32\x20\x33\x34\x2e\ -\x31\x33\x33\x33\x33\x33\x2d\x32\x34\x2e\x37\x34\x36\x36\x36\x37\ -\x20\x35\x31\x2e\x32\x2d\x35\x39\x2e\x37\x33\x33\x33\x33\x33\x20\ -\x35\x31\x2e\x32\x68\x2d\x37\x34\x32\x2e\x34\x63\x2d\x33\x34\x2e\ -\x31\x33\x33\x33\x33\x33\x20\x30\x2d\x34\x39\x2e\x34\x39\x33\x33\ -\x33\x33\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x2d\x34\x34\x2e\ -\x33\x37\x33\x33\x33\x33\x2d\x35\x31\x2e\x32\x4c\x38\x30\x2e\x32\ -\x31\x33\x33\x33\x33\x20\x33\x36\x36\x2e\x39\x33\x33\x33\x33\x33\ -\x63\x35\x2e\x31\x32\x2d\x33\x34\x2e\x39\x38\x36\x36\x36\x37\x20\ -\x32\x35\x2e\x36\x2d\x35\x31\x2e\x32\x20\x35\x39\x2e\x37\x33\x33\ -\x33\x33\x34\x2d\x35\x31\x2e\x32\x7a\x22\x20\x66\x69\x6c\x6c\x3d\ -\x22\x23\x46\x46\x46\x46\x46\x46\x22\x20\x70\x2d\x69\x64\x3d\x22\ -\x32\x35\x30\x30\x36\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\ -\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x33\x31\x2e\x34\x31\x33\x33\ -\x33\x33\x20\x34\x34\x38\x2e\x38\x35\x33\x33\x33\x33\x68\x38\x34\ -\x33\x2e\x39\x34\x36\x36\x36\x37\x63\x33\x32\x2e\x34\x32\x36\x36\ -\x36\x37\x20\x30\x20\x34\x39\x2e\x34\x39\x33\x33\x33\x33\x20\x31\ -\x31\x2e\x30\x39\x33\x33\x33\x33\x20\x34\x39\x2e\x34\x39\x33\x33\ -\x33\x33\x20\x33\x34\x2e\x31\x33\x33\x33\x33\x34\x6c\x2d\x38\x31\ -\x2e\x39\x32\x20\x34\x32\x37\x2e\x35\x32\x63\x30\x20\x32\x32\x2e\ -\x31\x38\x36\x36\x36\x37\x2d\x31\x36\x2e\x32\x31\x33\x33\x33\x33\ -\x20\x33\x34\x2e\x31\x33\x33\x33\x33\x33\x2d\x34\x39\x2e\x34\x39\ -\x33\x33\x33\x33\x20\x33\x34\x2e\x31\x33\x33\x33\x33\x33\x48\x34\ -\x39\x2e\x34\x39\x33\x33\x33\x33\x63\x2d\x33\x32\x2e\x34\x32\x36\ -\x36\x36\x37\x20\x30\x2d\x34\x39\x2e\x34\x39\x33\x33\x33\x33\x2d\ -\x31\x31\x2e\x30\x39\x33\x33\x33\x33\x2d\x34\x39\x2e\x34\x39\x33\ -\x33\x33\x33\x2d\x33\x34\x2e\x31\x33\x33\x33\x33\x33\x6c\x38\x31\ -\x2e\x39\x32\x2d\x34\x32\x37\x2e\x35\x32\x63\x30\x2d\x32\x33\x2e\ -\x30\x34\x20\x31\x36\x2e\x32\x31\x33\x33\x33\x33\x2d\x33\x34\x2e\ -\x31\x33\x33\x33\x33\x33\x20\x34\x39\x2e\x34\x39\x33\x33\x33\x33\ -\x2d\x33\x34\x2e\x31\x33\x33\x33\x33\x34\x7a\x22\x20\x66\x69\x6c\ -\x6c\x3d\x22\x23\x46\x46\x43\x41\x32\x38\x22\x20\x70\x2d\x69\x64\ -\x3d\x22\x32\x35\x30\x30\x37\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\ -\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x07\xb2\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\ -\x72\x61\x70\x68\x69\x63\x73\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\ -\x44\x54\x44\x2f\x73\x76\x67\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\ -\x0a\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x36\x39\x38\x33\x32\x38\ -\x33\x35\x33\x31\x31\x32\x22\x20\x63\x6c\x61\x73\x73\x3d\x22\x69\ -\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\ -\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\x22\x20\x76\x65\x72\ -\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\x78\x6d\x6c\x6e\x73\ -\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\ -\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\x67\x22\x20\x70\x2d\ -\x69\x64\x3d\x22\x35\x37\x36\x37\x22\x0d\x0a\x20\x20\x20\x20\x20\ -\x77\x69\x64\x74\x68\x3d\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\ -\x74\x3d\x22\x31\x36\x22\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\ -\x74\x68\x20\x64\x3d\x22\x4d\x31\x31\x32\x20\x31\x36\x68\x37\x33\ -\x36\x76\x39\x39\x32\x48\x31\x31\x32\x7a\x22\x20\x66\x69\x6c\x6c\ -\x3d\x22\x23\x41\x45\x44\x37\x39\x36\x22\x20\x70\x2d\x69\x64\x3d\ -\x22\x35\x37\x36\x38\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\ -\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x33\x39\ -\x32\x2e\x31\x37\x36\x20\x38\x34\x36\x2e\x30\x38\x63\x38\x2e\x30\ -\x33\x32\x20\x34\x2e\x35\x34\x34\x20\x31\x38\x2e\x32\x30\x38\x20\ -\x32\x2e\x30\x33\x32\x20\x32\x32\x2e\x37\x30\x34\x2d\x35\x2e\x36\ -\x31\x36\x6c\x31\x35\x39\x2e\x33\x34\x34\x2d\x32\x35\x36\x2e\x34\ -\x39\x36\x63\x34\x2e\x34\x39\x36\x2d\x37\x2e\x36\x34\x38\x20\x31\ -\x2e\x36\x34\x38\x2d\x31\x37\x2e\x35\x30\x34\x2d\x36\x2e\x33\x38\ -\x34\x2d\x32\x32\x2e\x30\x34\x38\x73\x2d\x31\x38\x2e\x32\x30\x38\ -\x2d\x32\x2e\x30\x33\x32\x2d\x32\x32\x2e\x37\x30\x34\x20\x35\x2e\ -\x36\x31\x36\x6c\x2d\x31\x35\x39\x2e\x33\x34\x34\x20\x32\x35\x36\ -\x2e\x34\x39\x36\x63\x2d\x34\x2e\x35\x31\x32\x20\x37\x2e\x36\x33\ -\x32\x2d\x31\x2e\x36\x34\x38\x20\x31\x37\x2e\x35\x30\x34\x20\x36\ -\x2e\x33\x38\x34\x20\x32\x32\x2e\x30\x34\x38\x7a\x20\x6d\x32\x30\ -\x34\x2e\x34\x31\x36\x2d\x35\x30\x2e\x36\x37\x32\x61\x31\x35\x2e\ -\x38\x34\x20\x31\x35\x2e\x38\x34\x20\x30\x20\x30\x20\x30\x20\x32\ -\x32\x2e\x34\x36\x34\x20\x30\x6c\x37\x39\x2e\x33\x34\x34\x2d\x37\ -\x39\x2e\x33\x34\x34\x63\x30\x2e\x33\x33\x36\x2d\x30\x2e\x32\x38\ -\x38\x20\x30\x2e\x37\x35\x32\x2d\x30\x2e\x33\x38\x34\x20\x31\x2e\ -\x30\x35\x36\x2d\x30\x2e\x37\x30\x34\x61\x31\x35\x2e\x37\x37\x36\ -\x20\x31\x35\x2e\x37\x37\x36\x20\x30\x20\x30\x20\x30\x20\x34\x2e\ -\x35\x39\x32\x2d\x31\x31\x2e\x35\x32\x20\x31\x35\x2e\x38\x30\x38\ -\x20\x31\x35\x2e\x38\x30\x38\x20\x30\x20\x30\x20\x30\x2d\x34\x2e\ -\x36\x35\x36\x2d\x31\x31\x2e\x32\x36\x34\x63\x2d\x30\x2e\x32\x32\ -\x34\x2d\x30\x2e\x32\x32\x34\x2d\x30\x2e\x35\x31\x32\x2d\x30\x2e\ -\x33\x30\x34\x2d\x30\x2e\x37\x35\x32\x2d\x30\x2e\x34\x39\x36\x6c\ -\x2d\x37\x39\x2e\x35\x35\x32\x2d\x37\x39\x2e\x35\x35\x32\x61\x31\ -\x35\x2e\x38\x37\x32\x20\x31\x35\x2e\x38\x37\x32\x20\x30\x20\x31\ -\x20\x30\x2d\x32\x32\x2e\x34\x36\x34\x20\x32\x32\x2e\x34\x36\x34\ -\x6c\x36\x38\x2e\x39\x34\x34\x20\x36\x38\x2e\x39\x34\x34\x2d\x36\ -\x38\x2e\x39\x39\x32\x20\x36\x38\x2e\x39\x39\x32\x61\x31\x35\x2e\ -\x38\x38\x38\x20\x31\x35\x2e\x38\x38\x38\x20\x30\x20\x30\x20\x30\ -\x20\x30\x2e\x30\x31\x36\x20\x32\x32\x2e\x34\x38\x7a\x4d\x32\x36\ -\x31\x2e\x36\x20\x37\x31\x36\x2e\x30\x36\x34\x6c\x37\x39\x2e\x33\ -\x32\x38\x20\x37\x39\x2e\x33\x34\x34\x61\x31\x35\x2e\x38\x34\x20\ -\x31\x35\x2e\x38\x34\x20\x30\x20\x30\x20\x30\x20\x32\x32\x2e\x34\ -\x36\x34\x20\x30\x20\x31\x35\x2e\x38\x34\x20\x31\x35\x2e\x38\x34\ -\x20\x30\x20\x30\x20\x30\x20\x30\x2d\x32\x32\x2e\x34\x36\x34\x4c\ -\x32\x39\x34\x2e\x34\x20\x37\x30\x33\x2e\x39\x35\x32\x6c\x36\x38\ -\x2e\x39\x34\x34\x2d\x36\x38\x2e\x39\x34\x34\x61\x31\x35\x2e\x38\ -\x37\x32\x20\x31\x35\x2e\x38\x37\x32\x20\x30\x20\x31\x20\x30\x2d\ -\x32\x32\x2e\x34\x36\x34\x2d\x32\x32\x2e\x34\x36\x34\x6c\x2d\x37\ -\x39\x2e\x35\x35\x32\x20\x37\x39\x2e\x35\x35\x32\x63\x2d\x30\x2e\ -\x32\x32\x34\x20\x30\x2e\x32\x30\x38\x2d\x30\x2e\x35\x32\x38\x20\ -\x30\x2e\x32\x38\x38\x2d\x30\x2e\x37\x33\x36\x20\x30\x2e\x34\x39\ -\x36\x61\x31\x35\x2e\x37\x34\x34\x20\x31\x35\x2e\x37\x34\x34\x20\ -\x30\x20\x30\x20\x30\x2d\x34\x2e\x36\x35\x36\x20\x31\x31\x2e\x32\ -\x36\x34\x20\x31\x35\x2e\x38\x30\x38\x20\x31\x35\x2e\x38\x30\x38\ -\x20\x30\x20\x30\x20\x30\x20\x34\x2e\x35\x39\x32\x20\x31\x31\x2e\ -\x35\x32\x63\x30\x2e\x33\x32\x20\x30\x2e\x32\x38\x38\x20\x30\x2e\ -\x37\x33\x36\x20\x30\x2e\x34\x20\x31\x2e\x30\x37\x32\x20\x30\x2e\ -\x36\x38\x38\x7a\x4d\x38\x39\x36\x20\x31\x32\x38\x68\x2d\x33\x32\ -\x56\x33\x32\x61\x33\x32\x20\x33\x32\x20\x30\x20\x30\x20\x30\x2d\ -\x33\x32\x2d\x33\x32\x48\x31\x32\x38\x61\x33\x32\x20\x33\x32\x20\ -\x30\x20\x30\x20\x30\x2d\x33\x32\x20\x33\x32\x76\x39\x36\x30\x61\ -\x33\x32\x20\x33\x32\x20\x30\x20\x30\x20\x30\x20\x33\x32\x20\x33\ -\x32\x68\x37\x30\x34\x61\x33\x32\x20\x33\x32\x20\x30\x20\x30\x20\ -\x30\x20\x33\x32\x2d\x33\x32\x56\x34\x31\x36\x68\x33\x32\x61\x33\ -\x32\x20\x33\x32\x20\x30\x20\x30\x20\x30\x20\x33\x32\x2d\x33\x32\ -\x56\x31\x36\x30\x61\x33\x32\x20\x33\x32\x20\x30\x20\x30\x20\x30\ -\x2d\x33\x32\x2d\x33\x32\x7a\x20\x6d\x2d\x36\x34\x20\x30\x48\x33\ -\x35\x32\x61\x33\x32\x20\x33\x32\x20\x30\x20\x30\x20\x30\x2d\x33\ -\x32\x20\x33\x32\x76\x32\x32\x34\x61\x33\x32\x20\x33\x32\x20\x30\ -\x20\x30\x20\x30\x20\x33\x32\x20\x33\x32\x68\x34\x38\x30\x76\x35\ -\x37\x36\x48\x31\x32\x38\x56\x33\x32\x68\x37\x30\x34\x76\x39\x36\ -\x7a\x22\x0d\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x69\ -\x6c\x6c\x3d\x22\x23\x32\x42\x33\x31\x33\x39\x22\x20\x70\x2d\x69\ -\x64\x3d\x22\x35\x37\x36\x39\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\ -\x0d\x0a\x20\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\ -\x33\x35\x32\x20\x31\x36\x30\x68\x35\x34\x34\x76\x32\x32\x34\x48\ -\x33\x35\x32\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x46\ -\x46\x46\x46\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x37\x37\x30\x22\ -\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x20\x20\x20\x20\x3c\x70\ -\x61\x74\x68\x20\x64\x3d\x22\x4d\x33\x38\x37\x2e\x36\x39\x36\x20\ -\x32\x31\x33\x2e\x38\x32\x34\x68\x33\x35\x2e\x31\x38\x34\x76\x33\ -\x39\x2e\x36\x36\x34\x68\x33\x32\x2e\x39\x34\x34\x76\x2d\x33\x39\ -\x2e\x36\x36\x34\x68\x33\x35\x2e\x31\x38\x34\x56\x33\x32\x38\x68\ -\x2d\x33\x35\x2e\x31\x38\x34\x76\x2d\x34\x35\x2e\x32\x36\x34\x48\ -\x34\x32\x32\x2e\x38\x38\x56\x33\x32\x38\x68\x2d\x33\x35\x2e\x31\ -\x38\x34\x76\x2d\x31\x31\x34\x2e\x31\x37\x36\x7a\x4d\x35\x33\x35\ -\x2e\x38\x35\x36\x20\x32\x34\x33\x2e\x30\x38\x38\x68\x2d\x33\x31\ -\x2e\x39\x38\x34\x76\x2d\x32\x39\x2e\x32\x36\x34\x68\x39\x39\x2e\ -\x31\x33\x36\x76\x32\x39\x2e\x32\x36\x34\x68\x2d\x33\x31\x2e\x39\ -\x38\x34\x56\x33\x32\x38\x68\x2d\x33\x35\x2e\x31\x36\x38\x76\x2d\ -\x38\x34\x2e\x39\x31\x32\x7a\x4d\x36\x31\x35\x2e\x38\x37\x32\x20\ -\x32\x31\x33\x2e\x38\x32\x34\x68\x35\x30\x2e\x30\x34\x38\x6c\x31\ -\x36\x2e\x33\x32\x20\x36\x37\x2e\x31\x36\x38\x68\x30\x2e\x33\x32\ -\x6c\x31\x36\x2e\x33\x32\x2d\x36\x37\x2e\x31\x36\x38\x68\x35\x30\ -\x2e\x30\x36\x34\x56\x33\x32\x38\x48\x37\x31\x35\x2e\x36\x38\x76\ -\x2d\x37\x33\x2e\x32\x34\x38\x68\x2d\x30\x2e\x33\x33\x36\x6c\x2d\ -\x31\x39\x2e\x38\x34\x20\x37\x33\x2e\x32\x34\x38\x48\x36\x36\x39\ -\x2e\x32\x38\x6c\x2d\x31\x39\x2e\x38\x32\x34\x2d\x37\x33\x2e\x32\ -\x34\x38\x68\x2d\x30\x2e\x33\x33\x36\x56\x33\x32\x38\x68\x2d\x33\ -\x33\x2e\x32\x34\x38\x76\x2d\x31\x31\x34\x2e\x31\x37\x36\x7a\x4d\ -\x37\x36\x37\x2e\x30\x35\x36\x20\x32\x31\x33\x2e\x38\x32\x34\x68\ -\x33\x35\x2e\x31\x38\x34\x76\x38\x34\x2e\x39\x31\x32\x68\x35\x30\ -\x2e\x35\x32\x38\x56\x33\x32\x38\x68\x2d\x38\x35\x2e\x37\x31\x32\ -\x76\x2d\x31\x31\x34\x2e\x31\x37\x36\x7a\x22\x0d\x0a\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x66\x69\x6c\x6c\x3d\x22\x23\x32\x42\ -\x33\x31\x33\x39\x22\x20\x70\x2d\x69\x64\x3d\x22\x35\x37\x37\x31\ -\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x3c\x2f\x73\x76\x67\ -\x3e\ -\x00\x00\x03\x4a\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x31\x32\x36\x33\x32\x35\x37\x39\x37\x32\x30\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x34\x32\x36\x30\x22\x20\x77\ -\x69\x64\x74\x68\x3d\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\ -\x3d\x22\x31\x36\x22\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\ -\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\ -\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x38\x39\x39\x2e\x31\ -\x20\x38\x36\x39\x2e\x36\x6c\x2d\x35\x33\x2d\x33\x30\x35\x2e\x36\ -\x48\x38\x36\x34\x63\x31\x34\x2e\x34\x20\x30\x20\x32\x36\x2d\x31\ -\x31\x2e\x36\x20\x32\x36\x2d\x32\x36\x56\x33\x34\x36\x63\x30\x2d\ -\x31\x34\x2e\x34\x2d\x31\x31\x2e\x36\x2d\x32\x36\x2d\x32\x36\x2d\ -\x32\x36\x48\x36\x31\x38\x56\x31\x33\x38\x63\x30\x2d\x31\x34\x2e\ -\x34\x2d\x31\x31\x2e\x36\x2d\x32\x36\x2d\x32\x36\x2d\x32\x36\x48\ -\x34\x33\x32\x63\x2d\x31\x34\x2e\x34\x20\x30\x2d\x32\x36\x20\x31\ -\x31\x2e\x36\x2d\x32\x36\x20\x32\x36\x76\x31\x38\x32\x48\x31\x36\ -\x30\x63\x2d\x31\x34\x2e\x34\x20\x30\x2d\x32\x36\x20\x31\x31\x2e\ -\x36\x2d\x32\x36\x20\x32\x36\x76\x31\x39\x32\x63\x30\x20\x31\x34\ -\x2e\x34\x20\x31\x31\x2e\x36\x20\x32\x36\x20\x32\x36\x20\x32\x36\ -\x68\x31\x37\x2e\x39\x6c\x2d\x35\x33\x20\x33\x30\x35\x2e\x36\x63\ -\x2d\x30\x2e\x33\x20\x31\x2e\x35\x2d\x30\x2e\x34\x20\x33\x2d\x30\ -\x2e\x34\x20\x34\x2e\x34\x20\x30\x20\x31\x34\x2e\x34\x20\x31\x31\ -\x2e\x36\x20\x32\x36\x20\x32\x36\x20\x32\x36\x68\x37\x32\x33\x63\ -\x31\x2e\x35\x20\x30\x20\x33\x2d\x30\x2e\x31\x20\x34\x2e\x34\x2d\ -\x30\x2e\x34\x20\x31\x34\x2e\x32\x2d\x32\x2e\x34\x20\x32\x33\x2e\ -\x37\x2d\x31\x35\x2e\x39\x20\x32\x31\x2e\x32\x2d\x33\x30\x7a\x4d\ -\x32\x30\x34\x20\x33\x39\x30\x68\x32\x37\x32\x56\x31\x38\x32\x68\ -\x37\x32\x76\x32\x30\x38\x68\x32\x37\x32\x76\x31\x30\x34\x48\x32\ -\x30\x34\x56\x33\x39\x30\x7a\x20\x6d\x34\x36\x38\x20\x34\x34\x30\ -\x56\x36\x37\x34\x63\x30\x2d\x34\x2e\x34\x2d\x33\x2e\x36\x2d\x38\ -\x2d\x38\x2d\x38\x68\x2d\x34\x38\x63\x2d\x34\x2e\x34\x20\x30\x2d\ -\x38\x20\x33\x2e\x36\x2d\x38\x20\x38\x76\x31\x35\x36\x48\x34\x31\ -\x36\x56\x36\x37\x34\x63\x30\x2d\x34\x2e\x34\x2d\x33\x2e\x36\x2d\ -\x38\x2d\x38\x2d\x38\x68\x2d\x34\x38\x63\x2d\x34\x2e\x34\x20\x30\ -\x2d\x38\x20\x33\x2e\x36\x2d\x38\x20\x38\x76\x31\x35\x36\x48\x32\ -\x30\x32\x2e\x38\x6c\x34\x35\x2e\x31\x2d\x32\x36\x30\x48\x37\x37\ -\x36\x6c\x34\x35\x2e\x31\x20\x32\x36\x30\x48\x36\x37\x32\x7a\x22\ -\x20\x70\x2d\x69\x64\x3d\x22\x34\x32\x36\x31\x22\x20\x66\x69\x6c\ -\x6c\x3d\x22\x23\x31\x33\x32\x32\x37\x61\x22\x3e\x3c\x2f\x70\x61\ -\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x03\x14\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x34\x38\x30\x36\x38\x37\x39\x30\x30\x38\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x38\x35\x37\x39\x22\x20\x78\ -\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ -\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\ -\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x35\x31\x32\x20\x31\ -\x32\x38\x63\x32\x31\x31\x2e\x32\x20\x30\x20\x33\x38\x34\x20\x31\ -\x37\x32\x2e\x38\x20\x33\x38\x34\x20\x33\x38\x34\x73\x2d\x31\x37\ -\x32\x2e\x38\x20\x33\x38\x34\x2d\x33\x38\x34\x20\x33\x38\x34\x2d\ -\x33\x38\x34\x2d\x31\x37\x32\x2e\x38\x2d\x33\x38\x34\x2d\x33\x38\ -\x34\x20\x31\x37\x32\x2e\x38\x2d\x33\x38\x34\x20\x33\x38\x34\x2d\ -\x33\x38\x34\x6d\x30\x2d\x36\x34\x43\x32\x36\x32\x2e\x34\x20\x36\ -\x34\x20\x36\x34\x20\x32\x36\x32\x2e\x34\x20\x36\x34\x20\x35\x31\ -\x32\x73\x31\x39\x38\x2e\x34\x20\x34\x34\x38\x20\x34\x34\x38\x20\ -\x34\x34\x38\x20\x34\x34\x38\x2d\x31\x39\x38\x2e\x34\x20\x34\x34\ -\x38\x2d\x34\x34\x38\x2d\x31\x39\x38\x2e\x34\x2d\x34\x34\x38\x2d\ -\x34\x34\x38\x2d\x34\x34\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\ -\x23\x31\x32\x39\x36\x64\x62\x22\x20\x70\x2d\x69\x64\x3d\x22\x38\ -\x35\x38\x30\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\ -\x68\x20\x64\x3d\x22\x4d\x34\x34\x38\x20\x37\x30\x34\x63\x2d\x31\ -\x32\x2e\x38\x20\x30\x2d\x32\x35\x2e\x36\x2d\x36\x2e\x34\x2d\x33\ -\x32\x2d\x31\x32\x2e\x38\x4c\x33\x31\x33\x2e\x36\x20\x35\x38\x38\ -\x2e\x38\x63\x2d\x31\x32\x2e\x38\x2d\x31\x32\x2e\x38\x2d\x31\x32\ -\x2e\x38\x2d\x33\x32\x20\x30\x2d\x34\x34\x2e\x38\x73\x33\x32\x2d\ -\x31\x32\x2e\x38\x20\x34\x34\x2e\x38\x20\x30\x4c\x34\x34\x38\x20\ -\x36\x33\x33\x2e\x36\x6c\x32\x37\x35\x2e\x32\x2d\x32\x37\x35\x2e\ -\x32\x63\x31\x32\x2e\x38\x2d\x31\x32\x2e\x38\x20\x33\x32\x2d\x31\ -\x32\x2e\x38\x20\x34\x34\x2e\x38\x20\x30\x20\x31\x32\x2e\x38\x20\ -\x31\x32\x2e\x38\x20\x31\x32\x2e\x38\x20\x33\x32\x20\x30\x20\x34\ -\x34\x2e\x38\x6c\x2d\x32\x38\x38\x20\x32\x38\x38\x63\x2d\x36\x2e\ -\x34\x20\x31\x32\x2e\x38\x2d\x31\x39\x2e\x32\x20\x31\x32\x2e\x38\ -\x2d\x33\x32\x20\x31\x32\x2e\x38\x7a\x22\x20\x66\x69\x6c\x6c\x3d\ -\x22\x23\x31\x32\x39\x36\x64\x62\x22\x20\x70\x2d\x69\x64\x3d\x22\ -\x38\x35\x38\x31\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\ -\x76\x67\x3e\ -\x00\x00\x03\x75\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x32\x35\x35\x34\x37\x33\x36\x32\x37\x33\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x34\x33\x30\x34\x22\x20\x78\ -\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ -\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\ -\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x36\x36\x31\x2e\x39\ -\x34\x34\x38\x38\x39\x20\x37\x33\x2e\x31\x34\x34\x38\x38\x39\x48\ -\x31\x34\x36\x2e\x32\x38\x39\x37\x37\x38\x61\x33\x36\x2e\x36\x37\ -\x39\x31\x31\x31\x20\x33\x36\x2e\x36\x37\x39\x31\x31\x31\x20\x30\ -\x20\x30\x20\x30\x2d\x33\x36\x2e\x35\x37\x39\x35\x35\x36\x20\x33\ -\x36\x2e\x35\x36\x35\x33\x33\x33\x76\x38\x30\x34\x2e\x35\x37\x39\ -\x35\x35\x36\x61\x33\x36\x2e\x36\x37\x39\x31\x31\x31\x20\x33\x36\ -\x2e\x36\x37\x39\x31\x31\x31\x20\x30\x20\x30\x20\x30\x20\x33\x36\ -\x2e\x35\x37\x39\x35\x35\x36\x20\x33\x36\x2e\x35\x36\x35\x33\x33\ -\x33\x68\x37\x33\x31\x2e\x34\x32\x30\x34\x34\x34\x61\x33\x36\x2e\ -\x36\x37\x39\x31\x31\x31\x20\x33\x36\x2e\x36\x37\x39\x31\x31\x31\ -\x20\x30\x20\x30\x20\x30\x20\x33\x36\x2e\x35\x37\x39\x35\x35\x36\ -\x2d\x33\x36\x2e\x35\x36\x35\x33\x33\x33\x76\x2d\x35\x38\x38\x2e\ -\x38\x4c\x36\x36\x31\x2e\x39\x34\x34\x38\x38\x39\x20\x37\x33\x2e\ -\x31\x34\x34\x38\x38\x39\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\ -\x46\x43\x43\x43\x35\x41\x22\x20\x70\x2d\x69\x64\x3d\x22\x34\x33\ -\x30\x35\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\ -\x20\x64\x3d\x22\x4d\x36\x36\x31\x2e\x39\x34\x34\x38\x38\x39\x20\ -\x32\x38\x38\x2e\x39\x31\x30\x32\x32\x32\x61\x33\x36\x2e\x36\x37\ -\x39\x31\x31\x31\x20\x33\x36\x2e\x36\x37\x39\x31\x31\x31\x20\x30\ -\x20\x30\x20\x30\x20\x33\x36\x2e\x35\x36\x35\x33\x33\x33\x20\x33\ -\x36\x2e\x35\x37\x39\x35\x35\x36\x68\x32\x31\x35\x2e\x37\x37\x39\ -\x35\x35\x36\x4c\x36\x36\x31\x2e\x39\x34\x34\x38\x38\x39\x20\x37\ -\x33\x2e\x31\x34\x34\x38\x38\x39\x76\x32\x31\x35\x2e\x37\x36\x35\ -\x33\x33\x33\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x44\ -\x39\x38\x30\x22\x20\x70\x2d\x69\x64\x3d\x22\x34\x33\x30\x36\x22\ -\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\ -\x22\x4d\x33\x34\x37\x2e\x34\x33\x34\x36\x36\x37\x20\x34\x32\x30\ -\x2e\x35\x36\x35\x33\x33\x33\x56\x34\x38\x36\x2e\x34\x68\x31\x31\ -\x38\x2e\x38\x35\x35\x31\x31\x31\x76\x32\x38\x38\x2e\x39\x31\x30\ -\x32\x32\x32\x68\x39\x31\x2e\x34\x32\x30\x34\x34\x34\x56\x34\x38\ -\x36\x2e\x34\x68\x31\x31\x38\x2e\x38\x35\x35\x31\x31\x31\x76\x2d\ -\x36\x35\x2e\x38\x33\x34\x36\x36\x37\x7a\x22\x20\x66\x69\x6c\x6c\ -\x3d\x22\x23\x46\x46\x46\x46\x46\x46\x22\x20\x70\x2d\x69\x64\x3d\ -\x22\x34\x33\x30\x37\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\ -\x73\x76\x67\x3e\ -\x00\x00\x09\x07\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x32\x35\x36\x32\x39\x30\x39\x33\x32\x37\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x37\x30\x32\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\ -\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\ -\x3d\x22\x33\x32\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x32\ -\x22\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x39\x34\x32\x2e\ -\x30\x38\x20\x31\x30\x32\x34\x48\x38\x31\x2e\x39\x32\x41\x38\x31\ -\x2e\x39\x32\x20\x38\x31\x2e\x39\x32\x20\x30\x20\x30\x20\x31\x20\ -\x30\x20\x39\x34\x32\x2e\x30\x38\x56\x38\x31\x2e\x39\x32\x41\x38\ -\x31\x2e\x39\x32\x20\x38\x31\x2e\x39\x32\x20\x30\x20\x30\x20\x31\ -\x20\x38\x31\x2e\x39\x32\x20\x30\x68\x38\x36\x30\x2e\x31\x36\x41\ -\x38\x31\x2e\x39\x32\x20\x38\x31\x2e\x39\x32\x20\x30\x20\x30\x20\ -\x31\x20\x31\x30\x32\x34\x20\x38\x31\x2e\x39\x32\x76\x38\x36\x30\ -\x2e\x31\x36\x41\x38\x31\x2e\x39\x32\x20\x38\x31\x2e\x39\x32\x20\ -\x30\x20\x30\x20\x31\x20\x39\x34\x32\x2e\x30\x38\x20\x31\x30\x32\ -\x34\x7a\x4d\x38\x31\x2e\x39\x32\x20\x36\x38\x2e\x34\x39\x38\x32\ -\x38\x36\x61\x31\x33\x2e\x34\x32\x31\x37\x31\x34\x20\x31\x33\x2e\ -\x34\x32\x31\x37\x31\x34\x20\x30\x20\x30\x20\x30\x2d\x31\x33\x2e\ -\x34\x35\x38\x32\x38\x36\x20\x31\x33\x2e\x34\x32\x31\x37\x31\x34\ -\x76\x38\x36\x30\x2e\x31\x36\x63\x30\x20\x37\x2e\x34\x32\x34\x20\ -\x36\x2e\x30\x33\x34\x32\x38\x36\x20\x31\x33\x2e\x34\x32\x31\x37\ -\x31\x34\x20\x31\x33\x2e\x34\x35\x38\x32\x38\x36\x20\x31\x33\x2e\ -\x34\x32\x31\x37\x31\x34\x68\x38\x36\x30\x2e\x31\x36\x61\x31\x33\ -\x2e\x34\x35\x38\x32\x38\x36\x20\x31\x33\x2e\x34\x35\x38\x32\x38\ -\x36\x20\x30\x20\x30\x20\x30\x20\x31\x33\x2e\x34\x32\x31\x37\x31\ -\x34\x2d\x31\x33\x2e\x34\x32\x31\x37\x31\x34\x56\x38\x31\x2e\x39\ -\x32\x61\x31\x33\x2e\x34\x35\x38\x32\x38\x36\x20\x31\x33\x2e\x34\ -\x35\x38\x32\x38\x36\x20\x30\x20\x30\x20\x30\x2d\x31\x33\x2e\x34\ -\x32\x31\x37\x31\x34\x2d\x31\x33\x2e\x34\x32\x31\x37\x31\x34\x48\ -\x38\x31\x2e\x39\x32\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x43\ -\x35\x30\x39\x33\x35\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x37\x30\ -\x32\x32\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\ -\x20\x64\x3d\x22\x4d\x34\x35\x32\x2e\x33\x38\x38\x35\x37\x31\x20\ -\x36\x30\x37\x2e\x30\x38\x35\x37\x31\x34\x63\x2d\x32\x2e\x31\x39\ -\x34\x32\x38\x36\x2d\x32\x32\x2e\x38\x32\x30\x35\x37\x31\x2d\x31\ -\x2e\x30\x39\x37\x31\x34\x33\x2d\x34\x32\x2e\x32\x34\x20\x33\x2e\ -\x32\x39\x31\x34\x32\x39\x2d\x35\x38\x2e\x32\x35\x38\x32\x38\x35\ -\x20\x34\x2e\x33\x38\x38\x35\x37\x31\x2d\x31\x36\x2e\x30\x31\x38\ -\x32\x38\x36\x20\x31\x30\x2e\x33\x38\x36\x32\x38\x36\x2d\x32\x39\ -\x2e\x38\x34\x32\x32\x38\x36\x20\x31\x38\x2e\x30\x36\x36\x32\x38\ -\x36\x2d\x34\x31\x2e\x34\x37\x32\x20\x37\x2e\x36\x38\x2d\x31\x31\ -\x2e\x36\x32\x39\x37\x31\x34\x20\x31\x36\x2e\x34\x35\x37\x31\x34\ -\x33\x2d\x32\x31\x2e\x37\x32\x33\x34\x32\x39\x20\x32\x36\x2e\x33\ -\x33\x31\x34\x32\x38\x2d\x33\x30\x2e\x32\x38\x31\x31\x34\x33\x20\ -\x39\x2e\x38\x37\x34\x32\x38\x36\x2d\x38\x2e\x35\x35\x37\x37\x31\ -\x34\x20\x31\x39\x2e\x30\x39\x30\x32\x38\x36\x2d\x31\x36\x2e\x38\ -\x32\x32\x38\x35\x37\x20\x32\x37\x2e\x36\x34\x38\x2d\x32\x34\x2e\ -\x36\x38\x35\x37\x31\x35\x61\x31\x33\x37\x2e\x38\x37\x34\x32\x38\ -\x36\x20\x31\x33\x37\x2e\x38\x37\x34\x32\x38\x36\x20\x30\x20\x30\ -\x20\x30\x20\x32\x31\x2e\x33\x39\x34\x32\x38\x36\x2d\x32\x34\x2e\ -\x36\x38\x35\x37\x31\x34\x63\x35\x2e\x37\x30\x35\x31\x34\x33\x2d\ -\x38\x2e\x35\x35\x37\x37\x31\x34\x20\x38\x2e\x35\x35\x37\x37\x31\ -\x34\x2d\x31\x38\x2e\x37\x36\x31\x31\x34\x33\x20\x38\x2e\x35\x35\ -\x37\x37\x31\x34\x2d\x33\x30\x2e\x36\x31\x30\x32\x38\x36\x20\x30\ -\x2d\x31\x35\x2e\x33\x36\x2d\x34\x2e\x32\x37\x38\x38\x35\x37\x2d\ -\x32\x37\x2e\x36\x34\x38\x2d\x31\x32\x2e\x38\x2d\x33\x36\x2e\x38\ -\x36\x34\x2d\x38\x2e\x35\x39\x34\x32\x38\x36\x2d\x39\x2e\x32\x31\ -\x36\x2d\x32\x33\x2e\x38\x34\x34\x35\x37\x31\x2d\x31\x33\x2e\x38\ -\x32\x34\x2d\x34\x35\x2e\x37\x38\x37\x34\x32\x38\x2d\x31\x33\x2e\ -\x38\x32\x34\x2d\x37\x2e\x30\x32\x31\x37\x31\x34\x20\x30\x2d\x31\ -\x34\x2e\x34\x38\x32\x32\x38\x36\x20\x30\x2e\x37\x33\x31\x34\x32\ -\x39\x2d\x32\x32\x2e\x33\x38\x31\x37\x31\x35\x20\x32\x2e\x33\x30\ -\x34\x61\x31\x35\x39\x2e\x31\x39\x35\x34\x32\x39\x20\x31\x35\x39\ -\x2e\x31\x39\x35\x34\x32\x39\x20\x30\x20\x30\x20\x30\x2d\x32\x33\ -\x2e\x36\x39\x38\x32\x38\x35\x20\x36\x2e\x35\x38\x32\x38\x35\x38\ -\x20\x31\x39\x31\x2e\x37\x30\x37\x34\x32\x39\x20\x31\x39\x31\x2e\ -\x37\x30\x37\x34\x32\x39\x20\x30\x20\x30\x20\x30\x2d\x34\x32\x2e\ -\x31\x33\x30\x32\x38\x36\x20\x32\x31\x2e\x33\x39\x34\x32\x38\x35\ -\x6c\x2d\x33\x32\x2e\x39\x31\x34\x32\x38\x36\x2d\x36\x33\x2e\x31\ -\x39\x35\x34\x32\x38\x63\x31\x36\x2e\x36\x37\x36\x35\x37\x31\x2d\ -\x31\x31\x2e\x34\x31\x30\x32\x38\x36\x20\x33\x35\x2e\x38\x37\x36\ -\x35\x37\x31\x2d\x32\x30\x2e\x38\x34\x35\x37\x31\x34\x20\x35\x37\ -\x2e\x36\x2d\x32\x38\x2e\x33\x30\x36\x32\x38\x36\x20\x32\x31\x2e\ -\x37\x32\x33\x34\x32\x39\x2d\x37\x2e\x34\x36\x30\x35\x37\x31\x20\ -\x34\x37\x2e\x39\x34\x35\x31\x34\x33\x2d\x31\x31\x2e\x31\x39\x30\ -\x38\x35\x37\x20\x37\x38\x2e\x36\x36\x35\x31\x34\x33\x2d\x31\x31\ -\x2e\x31\x39\x30\x38\x35\x37\x20\x34\x31\x2e\x32\x35\x32\x35\x37\ -\x31\x20\x30\x20\x37\x33\x2e\x35\x30\x38\x35\x37\x31\x20\x39\x2e\ -\x39\x38\x34\x20\x39\x36\x2e\x37\x36\x38\x20\x32\x39\x2e\x39\x35\ -\x32\x20\x32\x33\x2e\x32\x35\x39\x34\x32\x39\x20\x31\x39\x2e\x39\ -\x36\x38\x20\x33\x34\x2e\x38\x38\x39\x31\x34\x33\x20\x34\x36\x2e\ -\x38\x31\x31\x34\x32\x39\x20\x33\x34\x2e\x38\x38\x39\x31\x34\x33\ -\x20\x38\x30\x2e\x36\x34\x20\x30\x20\x32\x32\x2e\x33\x38\x31\x37\ -\x31\x34\x2d\x32\x2e\x39\x32\x35\x37\x31\x34\x20\x34\x30\x2e\x39\ -\x32\x33\x34\x32\x39\x2d\x38\x2e\x38\x38\x36\x38\x35\x37\x20\x35\ -\x35\x2e\x35\x38\x38\x35\x37\x31\x61\x31\x33\x35\x2e\x34\x39\x37\ -\x31\x34\x33\x20\x31\x33\x35\x2e\x34\x39\x37\x31\x34\x33\x20\x30\ -\x20\x30\x20\x31\x2d\x32\x32\x2e\x30\x35\x32\x35\x37\x32\x20\x33\ -\x37\x2e\x35\x35\x38\x38\x35\x37\x63\x2d\x38\x2e\x37\x37\x37\x31\ -\x34\x33\x20\x31\x30\x2e\x33\x31\x33\x31\x34\x33\x2d\x31\x38\x2e\ -\x34\x33\x32\x20\x31\x39\x2e\x33\x38\x32\x38\x35\x37\x2d\x32\x38\ -\x2e\x39\x36\x34\x35\x37\x31\x20\x32\x37\x2e\x33\x31\x38\x38\x35\ -\x38\x61\x32\x34\x39\x2e\x34\x39\x30\x32\x38\x36\x20\x32\x34\x39\ -\x2e\x34\x39\x30\x32\x38\x36\x20\x30\x20\x30\x20\x30\x2d\x32\x38\ -\x2e\x39\x36\x34\x35\x37\x31\x20\x32\x35\x2e\x33\x34\x34\x63\x2d\ -\x38\x2e\x37\x37\x37\x31\x34\x33\x20\x38\x2e\x39\x39\x36\x35\x37\ -\x31\x2d\x31\x36\x2e\x32\x33\x37\x37\x31\x34\x20\x31\x39\x2e\x33\ -\x38\x32\x38\x35\x37\x2d\x32\x32\x2e\x33\x38\x31\x37\x31\x35\x20\ -\x33\x31\x2e\x32\x36\x38\x35\x37\x31\x2d\x36\x2e\x31\x34\x34\x20\ -\x31\x31\x2e\x38\x34\x39\x31\x34\x33\x2d\x39\x2e\x32\x31\x36\x20\ -\x32\x36\x2e\x39\x38\x39\x37\x31\x34\x2d\x39\x2e\x32\x31\x36\x20\ -\x34\x35\x2e\x34\x32\x31\x37\x31\x34\x48\x34\x35\x32\x2e\x33\x38\ -\x38\x35\x37\x31\x7a\x20\x6d\x2d\x31\x33\x2e\x31\x36\x35\x37\x31\ -\x34\x20\x39\x33\x2e\x34\x37\x36\x35\x37\x32\x63\x30\x2d\x31\x35\ -\x2e\x33\x36\x20\x34\x2e\x37\x39\x30\x38\x35\x37\x2d\x32\x37\x2e\ -\x35\x33\x38\x32\x38\x36\x20\x31\x34\x2e\x34\x34\x35\x37\x31\x34\ -\x2d\x33\x36\x2e\x35\x37\x31\x34\x32\x39\x20\x39\x2e\x36\x35\x34\ -\x38\x35\x37\x2d\x38\x2e\x39\x36\x20\x32\x32\x2e\x33\x38\x31\x37\ -\x31\x34\x2d\x31\x33\x2e\x34\x35\x38\x32\x38\x36\x20\x33\x38\x2e\ -\x31\x38\x30\x35\x37\x32\x2d\x31\x33\x2e\x34\x35\x38\x32\x38\x36\ -\x20\x31\x36\x2e\x36\x37\x36\x35\x37\x31\x20\x30\x20\x32\x39\x2e\ -\x38\x34\x32\x32\x38\x36\x20\x34\x2e\x34\x39\x38\x32\x38\x36\x20\ -\x33\x39\x2e\x34\x39\x37\x31\x34\x33\x20\x31\x33\x2e\x34\x39\x34\ -\x38\x35\x38\x20\x39\x2e\x36\x35\x34\x38\x35\x37\x20\x38\x2e\x39\ -\x39\x36\x35\x37\x31\x20\x31\x34\x2e\x34\x38\x32\x32\x38\x36\x20\ -\x32\x31\x2e\x31\x37\x34\x38\x35\x37\x20\x31\x34\x2e\x34\x38\x32\ -\x32\x38\x35\x20\x33\x36\x2e\x35\x33\x34\x38\x35\x37\x20\x30\x20\ -\x31\x35\x2e\x33\x36\x2d\x34\x2e\x38\x32\x37\x34\x32\x39\x20\x32\ -\x37\x2e\x36\x34\x38\x2d\x31\x34\x2e\x34\x38\x32\x32\x38\x35\x20\ -\x33\x36\x2e\x38\x36\x34\x73\x2d\x32\x32\x2e\x38\x32\x30\x35\x37\ -\x31\x20\x31\x33\x2e\x38\x32\x34\x2d\x33\x39\x2e\x34\x39\x37\x31\ -\x34\x33\x20\x31\x33\x2e\x38\x32\x34\x63\x2d\x31\x35\x2e\x37\x39\ -\x38\x38\x35\x37\x20\x30\x2d\x32\x38\x2e\x35\x32\x35\x37\x31\x34\ -\x2d\x34\x2e\x36\x30\x38\x2d\x33\x38\x2e\x31\x38\x30\x35\x37\x32\ -\x2d\x31\x33\x2e\x38\x32\x34\x73\x2d\x31\x34\x2e\x34\x38\x32\x32\ -\x38\x36\x2d\x32\x31\x2e\x35\x30\x34\x2d\x31\x34\x2e\x34\x38\x32\ -\x32\x38\x35\x2d\x33\x36\x2e\x38\x36\x34\x7a\x22\x20\x66\x69\x6c\ -\x6c\x3d\x22\x23\x35\x35\x38\x34\x46\x46\x22\x20\x70\x2d\x69\x64\ -\x3d\x22\x32\x37\x30\x32\x33\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\ -\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x02\xa4\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x0d\x0a\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\ -\x73\x76\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\ -\x33\x43\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\ -\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\ -\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\ -\x2f\x53\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\ -\x31\x31\x2e\x64\x74\x64\x22\x3e\x0d\x0a\x3c\x73\x76\x67\x20\x74\ -\x3d\x22\x31\x37\x30\x35\x31\x36\x33\x38\x31\x39\x33\x39\x33\x22\ -\x20\x63\x6c\x61\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\ -\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\ -\x31\x30\x32\x34\x22\x20\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\ -\x31\x2e\x31\x22\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\ -\x30\x30\x2f\x73\x76\x67\x22\x0d\x0a\x20\x20\x20\x20\x20\x70\x2d\ -\x69\x64\x3d\x22\x31\x32\x38\x34\x30\x22\x20\x78\x6d\x6c\x6e\x73\ -\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ -\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\x39\x39\x2f\x78\ -\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\x22\x36\x34\x22\ -\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x36\x34\x22\x3e\x0d\x0a\x20\ -\x20\x20\x20\x3c\x70\x61\x74\x68\x20\x66\x69\x6c\x6c\x3d\x22\x23\ -\x65\x31\x65\x31\x65\x31\x22\x20\x64\x3d\x22\x4d\x36\x39\x39\x2e\ -\x37\x20\x32\x38\x34\x2e\x32\x48\x33\x32\x36\x2e\x33\x43\x32\x30\ -\x30\x2e\x32\x20\x32\x38\x34\x2e\x32\x20\x39\x38\x20\x33\x38\x36\ -\x2e\x34\x20\x39\x38\x20\x35\x31\x32\x2e\x34\x63\x30\x20\x31\x32\ -\x36\x2e\x31\x20\x31\x30\x32\x2e\x32\x20\x32\x32\x38\x2e\x33\x20\ -\x32\x32\x38\x2e\x33\x20\x32\x32\x38\x2e\x33\x68\x33\x37\x33\x2e\ -\x35\x63\x31\x32\x36\x2e\x31\x20\x30\x20\x32\x32\x38\x2e\x33\x2d\ -\x31\x30\x32\x2e\x32\x20\x32\x32\x38\x2e\x33\x2d\x32\x32\x38\x2e\ -\x33\x2d\x30\x2e\x31\x2d\x31\x32\x36\x2d\x31\x30\x32\x2e\x33\x2d\ -\x32\x32\x38\x2e\x32\x2d\x32\x32\x38\x2e\x34\x2d\x32\x32\x38\x2e\ -\x32\x7a\x4d\x33\x32\x36\x2e\x33\x20\x37\x31\x39\x2e\x39\x63\x2d\ -\x31\x31\x34\x2e\x36\x20\x30\x2d\x32\x30\x37\x2e\x35\x2d\x39\x32\ -\x2e\x39\x2d\x32\x30\x37\x2e\x35\x2d\x32\x30\x37\x2e\x35\x73\x39\ -\x32\x2e\x39\x2d\x32\x30\x37\x2e\x35\x20\x32\x30\x37\x2e\x35\x2d\ -\x32\x30\x37\x2e\x35\x20\x32\x30\x37\x2e\x35\x20\x39\x32\x2e\x39\ -\x20\x32\x30\x37\x2e\x35\x20\x32\x30\x37\x2e\x35\x63\x2d\x30\x2e\ -\x31\x20\x31\x31\x34\x2e\x36\x2d\x39\x33\x20\x32\x30\x37\x2e\x35\ -\x2d\x32\x30\x37\x2e\x35\x20\x32\x30\x37\x2e\x35\x7a\x22\x20\x70\ -\x2d\x69\x64\x3d\x22\x31\x32\x38\x34\x31\x22\x3e\x0d\x0a\x0d\x0a\ -\x20\x20\x20\x20\x3c\x2f\x70\x61\x74\x68\x3e\x0d\x0a\x3c\x2f\x73\ -\x76\x67\x3e\ -\x00\x00\x02\x1b\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x35\x31\x36\x33\x38\x36\x36\x30\x38\x37\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x37\x39\x32\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x30\x36\x38\x39\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\ -\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\ -\x39\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\ -\x3d\x22\x35\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x32\ -\x22\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x33\x32\x30\x20\ -\x31\x39\x32\x68\x31\x31\x35\x32\x61\x33\x32\x30\x20\x33\x32\x30\ -\x20\x30\x20\x30\x20\x31\x20\x30\x20\x36\x34\x30\x48\x33\x32\x30\ -\x41\x33\x32\x30\x20\x33\x32\x30\x20\x30\x20\x30\x20\x31\x20\x33\ -\x32\x30\x20\x31\x39\x32\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\ -\x43\x43\x43\x43\x43\x43\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x30\ -\x36\x39\x30\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x70\x61\x74\ -\x68\x20\x64\x3d\x22\x4d\x35\x31\x32\x20\x35\x31\x32\x6d\x2d\x35\ -\x31\x32\x20\x30\x61\x35\x31\x32\x20\x35\x31\x32\x20\x30\x20\x31\ -\x20\x30\x20\x31\x30\x32\x34\x20\x30\x20\x35\x31\x32\x20\x35\x31\ -\x32\x20\x30\x20\x31\x20\x30\x2d\x31\x30\x32\x34\x20\x30\x5a\x22\ -\x20\x66\x69\x6c\x6c\x3d\x22\x23\x46\x46\x46\x46\x46\x46\x22\x20\ -\x70\x2d\x69\x64\x3d\x22\x32\x30\x36\x39\x31\x22\x3e\x3c\x2f\x70\ -\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x07\x41\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x32\x35\x36\x32\x31\x33\x31\x35\x37\x38\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x36\x34\x33\x31\x22\x20\x78\ -\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ -\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\ -\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x36\x32\x34\x2e\x35\ -\x20\x35\x33\x34\x2e\x35\x6d\x2d\x33\x32\x35\x2e\x35\x20\x30\x61\ -\x33\x32\x35\x2e\x35\x20\x33\x32\x35\x2e\x35\x20\x30\x20\x31\x20\ -\x30\x20\x36\x35\x31\x20\x30\x20\x33\x32\x35\x2e\x35\x20\x33\x32\ -\x35\x2e\x35\x20\x30\x20\x31\x20\x30\x2d\x36\x35\x31\x20\x30\x5a\ -\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x43\x31\x45\x36\x44\x45\x22\ -\x20\x70\x2d\x69\x64\x3d\x22\x36\x34\x33\x32\x22\x3e\x3c\x2f\x70\ -\x61\x74\x68\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x31\x35\ -\x39\x2e\x35\x33\x34\x20\x36\x38\x34\x2e\x35\x33\x36\x63\x34\x36\ -\x2e\x34\x39\x34\x2d\x34\x34\x2e\x37\x32\x37\x20\x38\x35\x2e\x35\ -\x35\x32\x2d\x36\x32\x2e\x32\x39\x37\x20\x31\x32\x33\x2e\x31\x33\ -\x34\x2d\x34\x36\x2e\x31\x31\x38\x20\x31\x36\x2e\x35\x38\x20\x37\ -\x2e\x31\x33\x37\x20\x33\x34\x2e\x39\x37\x20\x31\x32\x2e\x38\x33\ -\x32\x20\x35\x35\x2e\x31\x37\x37\x20\x31\x37\x2e\x30\x35\x38\x61\ -\x33\x39\x2e\x32\x37\x20\x33\x39\x2e\x32\x37\x20\x30\x20\x30\x20\ -\x31\x20\x33\x30\x2e\x33\x33\x33\x20\x33\x30\x2e\x30\x38\x36\x63\ -\x32\x30\x2e\x39\x36\x39\x20\x39\x36\x2e\x33\x32\x31\x20\x39\x32\ -\x2e\x32\x35\x39\x20\x31\x34\x32\x2e\x32\x36\x20\x32\x32\x33\x2e\ -\x32\x39\x35\x20\x31\x34\x32\x2e\x32\x36\x20\x35\x31\x2e\x35\x36\ -\x20\x30\x20\x39\x34\x2e\x32\x32\x34\x2d\x37\x2e\x34\x30\x37\x20\ -\x31\x32\x37\x2e\x38\x34\x35\x2d\x32\x31\x2e\x38\x37\x36\x20\x33\ -\x32\x2e\x32\x39\x35\x2d\x31\x33\x2e\x38\x39\x37\x20\x36\x34\x2e\ -\x37\x36\x34\x2d\x31\x2e\x35\x35\x32\x20\x31\x30\x32\x2e\x31\x34\ -\x38\x20\x33\x31\x2e\x37\x39\x36\x76\x2d\x32\x32\x30\x2e\x36\x33\ -\x63\x30\x2d\x39\x34\x2e\x32\x33\x39\x2d\x33\x30\x2e\x36\x34\x37\ -\x2d\x31\x35\x32\x2e\x38\x34\x2d\x39\x30\x2e\x39\x33\x2d\x31\x38\ -\x33\x2e\x35\x37\x34\x61\x33\x39\x2e\x32\x37\x33\x20\x33\x39\x2e\ -\x32\x37\x33\x20\x30\x20\x30\x20\x31\x2d\x32\x31\x2e\x34\x32\x2d\ -\x33\x33\x2e\x39\x37\x34\x43\x37\x30\x34\x2e\x38\x36\x32\x20\x32\ -\x33\x35\x2e\x30\x33\x20\x36\x31\x36\x2e\x36\x33\x34\x20\x31\x35\ -\x39\x2e\x35\x34\x35\x20\x34\x33\x34\x2e\x34\x30\x33\x20\x31\x35\ -\x39\x2e\x35\x34\x35\x63\x2d\x31\x38\x36\x2e\x35\x31\x35\x20\x30\ -\x2d\x32\x37\x34\x2e\x38\x37\x20\x37\x39\x2e\x30\x37\x38\x2d\x32\ -\x37\x34\x2e\x38\x37\x20\x32\x35\x32\x2e\x34\x36\x38\x76\x32\x37\ -\x32\x2e\x35\x32\x33\x7a\x20\x6d\x39\x32\x2e\x30\x38\x35\x20\x32\ -\x36\x2e\x30\x32\x38\x63\x32\x2e\x34\x38\x20\x31\x2e\x30\x36\x37\ -\x20\x30\x2e\x32\x30\x37\x20\x31\x2e\x35\x34\x36\x2d\x37\x2e\x39\ -\x33\x20\x36\x2e\x35\x39\x37\x2d\x31\x34\x2e\x32\x36\x37\x20\x38\ -\x2e\x38\x35\x39\x2d\x33\x32\x2e\x38\x39\x33\x20\x32\x35\x2e\x37\ -\x33\x31\x2d\x35\x35\x2e\x30\x34\x33\x20\x35\x30\x2e\x34\x33\x36\ -\x61\x36\x31\x2e\x37\x30\x32\x20\x36\x31\x2e\x37\x30\x32\x20\x30\ -\x20\x30\x20\x31\x2d\x34\x35\x2e\x39\x34\x20\x32\x30\x2e\x35\x31\ -\x34\x43\x31\x30\x38\x2e\x36\x32\x35\x20\x37\x38\x38\x2e\x31\x31\ -\x31\x20\x38\x31\x20\x37\x36\x30\x2e\x34\x38\x31\x20\x38\x31\x20\ -\x37\x32\x36\x2e\x33\x39\x37\x56\x34\x31\x32\x2e\x30\x31\x33\x43\ -\x38\x31\x20\x31\x39\x33\x2e\x31\x38\x20\x32\x30\x36\x2e\x33\x34\ -\x20\x38\x31\x20\x34\x33\x34\x2e\x34\x30\x34\x20\x38\x31\x63\x32\ -\x31\x34\x2e\x36\x35\x32\x20\x30\x20\x33\x33\x38\x2e\x36\x30\x35\ -\x20\x39\x39\x2e\x33\x38\x38\x20\x33\x35\x32\x2e\x31\x36\x20\x32\ -\x39\x34\x2e\x31\x34\x36\x43\x38\x36\x31\x2e\x37\x33\x20\x34\x32\ -\x32\x2e\x37\x33\x36\x20\x39\x30\x30\x20\x35\x30\x34\x2e\x38\x36\ -\x32\x20\x39\x30\x30\x20\x36\x31\x37\x2e\x31\x31\x33\x76\x32\x36\ -\x39\x2e\x33\x38\x34\x43\x39\x30\x30\x20\x39\x31\x38\x2e\x38\x31\ -\x20\x38\x37\x33\x2e\x38\x30\x36\x20\x39\x34\x35\x20\x38\x34\x31\ -\x2e\x35\x20\x39\x34\x35\x61\x35\x38\x2e\x35\x20\x35\x38\x2e\x35\ -\x20\x30\x20\x30\x20\x31\x2d\x34\x33\x2e\x35\x35\x2d\x31\x39\x2e\ -\x34\x34\x31\x63\x2d\x31\x38\x2e\x36\x36\x2d\x32\x30\x2e\x38\x30\ -\x37\x2d\x33\x34\x2e\x32\x35\x39\x2d\x33\x34\x2e\x39\x33\x32\x2d\ -\x34\x35\x2e\x39\x36\x32\x2d\x34\x32\x2e\x31\x39\x36\x2d\x32\x2e\ -\x35\x35\x38\x2d\x31\x2e\x35\x38\x38\x2d\x34\x2e\x36\x35\x35\x2d\ -\x32\x2e\x36\x37\x38\x2d\x36\x2e\x32\x30\x39\x2d\x33\x2e\x33\x34\ -\x34\x2d\x34\x33\x2e\x33\x35\x37\x20\x31\x37\x2e\x37\x36\x2d\x39\ -\x34\x2e\x38\x36\x36\x20\x32\x36\x2e\x33\x35\x2d\x31\x35\x34\x2e\ -\x33\x30\x36\x20\x32\x36\x2e\x33\x35\x2d\x31\x35\x34\x2e\x39\x32\ -\x20\x30\x2d\x32\x35\x37\x2e\x32\x32\x2d\x35\x39\x2e\x37\x39\x34\ -\x2d\x32\x39\x33\x2e\x37\x31\x38\x2d\x31\x37\x39\x2e\x37\x38\x32\ -\x2d\x31\x36\x2e\x32\x31\x2d\x34\x2e\x34\x32\x37\x2d\x33\x31\x2e\ -\x35\x39\x33\x2d\x39\x2e\x37\x36\x33\x2d\x34\x36\x2e\x31\x33\x36\ -\x2d\x31\x36\x2e\x30\x32\x33\x7a\x20\x6d\x37\x30\x2e\x31\x35\x36\ -\x20\x32\x31\x2e\x37\x39\x35\x63\x2d\x32\x31\x2e\x32\x32\x38\x2d\ -\x34\x2e\x34\x33\x38\x2d\x33\x34\x2e\x38\x34\x2d\x32\x35\x2e\x32\ -\x34\x37\x2d\x33\x30\x2e\x34\x30\x31\x2d\x34\x36\x2e\x34\x37\x38\ -\x20\x34\x2e\x34\x33\x37\x2d\x32\x31\x2e\x32\x33\x20\x32\x35\x2e\ -\x32\x34\x33\x2d\x33\x34\x2e\x38\x34\x34\x20\x34\x36\x2e\x34\x37\ -\x31\x2d\x33\x30\x2e\x34\x30\x35\x20\x32\x38\x2e\x36\x34\x20\x35\ -\x2e\x39\x38\x38\x20\x36\x30\x2e\x38\x34\x38\x20\x39\x2e\x30\x30\ -\x35\x20\x39\x36\x2e\x35\x36\x20\x39\x2e\x30\x30\x35\x20\x31\x38\ -\x36\x2e\x35\x31\x34\x20\x30\x20\x32\x37\x34\x2e\x38\x36\x39\x2d\ -\x37\x39\x2e\x30\x37\x38\x20\x32\x37\x34\x2e\x38\x36\x39\x2d\x32\ -\x35\x32\x2e\x34\x36\x38\x20\x30\x2d\x34\x2e\x32\x30\x35\x2d\x30\ -\x2e\x30\x35\x33\x2d\x38\x2e\x33\x35\x35\x2d\x30\x2e\x31\x35\x39\ -\x2d\x31\x32\x2e\x34\x34\x39\x2d\x30\x2e\x35\x36\x2d\x32\x31\x2e\ -\x36\x38\x32\x20\x31\x36\x2e\x35\x36\x2d\x33\x39\x2e\x37\x31\x34\ -\x20\x33\x38\x2e\x32\x34\x2d\x34\x30\x2e\x32\x37\x34\x20\x32\x31\ -\x2e\x36\x37\x39\x2d\x30\x2e\x35\x36\x20\x33\x39\x2e\x37\x30\x38\ -\x20\x31\x36\x2e\x35\x36\x32\x20\x34\x30\x2e\x32\x36\x38\x20\x33\ -\x38\x2e\x32\x34\x34\x20\x30\x2e\x31\x32\x34\x20\x34\x2e\x37\x37\ -\x35\x20\x30\x2e\x31\x38\x35\x20\x39\x2e\x36\x20\x30\x2e\x31\x38\ -\x35\x20\x31\x34\x2e\x34\x37\x39\x20\x30\x20\x32\x31\x38\x2e\x38\ -\x33\x33\x2d\x31\x32\x35\x2e\x33\x34\x20\x33\x33\x31\x2e\x30\x31\ -\x33\x2d\x33\x35\x33\x2e\x34\x30\x34\x20\x33\x33\x31\x2e\x30\x31\ -\x33\x2d\x34\x30\x2e\x38\x38\x33\x20\x30\x2d\x37\x38\x2e\x34\x33\ -\x35\x2d\x33\x2e\x35\x31\x37\x2d\x31\x31\x32\x2e\x36\x33\x2d\x31\ -\x30\x2e\x36\x36\x37\x7a\x22\x20\x66\x69\x6c\x6c\x3d\x22\x23\x30\ -\x41\x30\x42\x30\x43\x22\x20\x70\x2d\x69\x64\x3d\x22\x36\x34\x33\ -\x33\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\ -\x00\x01\x22\x3a\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x03\x45\x00\x00\x01\x31\x08\x06\x00\x00\x00\xb3\xab\x09\x4b\ -\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0e\xc4\x00\x00\x0e\xc4\ -\x01\x95\x2b\x0e\x1b\x00\x00\x20\x00\x49\x44\x41\x54\x78\xda\xec\ -\x7d\x77\x9c\x1c\xc5\xb1\xff\xb7\x7a\x66\xd3\xe5\x20\xe9\x82\x24\ -\x24\x9d\xb2\x04\x42\x28\x10\x44\xe6\x21\x8c\x01\x83\x31\x39\x0b\ -\x1b\x1b\x83\x8d\x23\xf6\xcf\xe1\xe1\x6c\xc0\xe6\x39\x3e\x6c\xc0\ -\xcf\xd8\x60\x6c\x1c\xc0\x36\x26\x63\x9b\x8c\xc9\x02\x84\x44\x90\ -\x84\x50\x38\xc5\xd3\x29\x5c\xbe\xdb\xdd\x99\xfe\xfd\x31\x61\x77\ -\xd2\xce\x6c\xb8\xdb\xdd\xbb\xfe\x7e\x3e\xa0\xdb\xdd\x09\xdd\xd5\ -\xd5\xd5\x5d\x55\x5d\x55\x84\xec\x40\xf8\xcb\x39\x51\x54\xb1\xa3\ -\x21\x45\x17\x33\xa2\x29\x20\xf5\x50\x10\xe6\x70\x8e\x98\x76\x09\ -\xd7\xaf\x24\xed\x13\xe7\xe9\x1f\x41\x60\xc8\x0f\x5c\x7f\xae\xf1\ -\x3c\xfd\x5b\xf3\xf9\x84\x92\x06\x57\x91\xde\x72\xae\x13\xa6\xc4\ -\x5b\x5d\xf6\x74\xe7\x3a\xdd\x69\x94\xd2\x9d\xeb\xd7\x95\xda\x38\ -\x8c\x76\xba\x0b\x7e\x17\x74\x17\x74\x17\x74\x17\x74\x17\x74\x17\ -\x74\x1f\x7e\xba\x1b\xfb\x1c\xdb\xe3\x4c\x30\xd0\x4e\x55\xc5\x2b\ -\x44\x7c\xb5\x2a\xa9\x5b\xd1\x37\xf4\x10\x06\xb1\x0d\xe7\xde\xa3\ -\x04\x57\x72\x82\xe2\xa1\xf3\x97\x40\x92\x3e\x01\x89\x9f\x05\x46\ -\x35\x50\x48\x06\x08\x8c\xd1\x80\xde\x49\xa1\x14\x09\xa5\x48\x08\ -\x11\xa1\x14\x09\xe1\x2d\xe8\x2e\xe8\x2e\xe8\x2e\xe8\x2e\xe8\x2e\ -\xe8\x2e\xe8\x3e\xa2\x4a\x91\xf9\x7c\x00\x60\x9c\x83\x68\x10\xe0\ -\x6f\x81\xf8\xed\x48\xc6\xff\x88\xe5\xf7\x74\xe5\xae\x14\xfd\xfc\ -\x83\x11\x00\xc0\xac\xba\x19\x20\xe9\x5b\xe0\x74\xb6\xae\x8a\x65\ -\x6c\xbc\xbd\x8d\x54\xe0\x51\x32\x89\x68\xd5\xbd\x4c\xa6\x30\x7f\ -\x28\x15\x18\xcc\x6a\xb6\xcb\x60\x0a\x42\x3a\x3d\xc1\x4b\x93\x85\ -\xc9\x31\x19\xcb\x93\xee\xe6\x64\x12\x74\x1f\xd1\xf6\x7b\xd2\x1d\ -\xa5\xd9\xfe\x51\xcf\xef\x82\xee\x82\xee\xa3\x91\xee\x66\xfb\xca\ -\x95\xee\x86\xf1\x98\x04\xdd\x05\xdd\x05\xdd\xf3\xd6\xbd\xc8\x26\ -\x8f\x01\x44\xf9\x46\x90\xfa\x43\xec\xef\xfa\x1d\x4e\x7f\xb0\xdf\ -\xeb\xd6\xcc\x6e\x9b\x59\x0d\x57\x81\xc2\xff\x01\xa4\xb3\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x50\x4e\x18\xa4\x69\x48\ -\x4a\x37\xa3\xa6\xfe\x51\xfc\xfb\xd2\x59\x41\x15\x38\x0d\xcf\x5e\ -\x58\x8f\x3e\xf9\x87\x20\x69\x05\x38\x97\x01\x80\x24\xd5\xaa\x88\ -\xc1\x70\xd7\x71\xa7\x46\x96\xae\xd9\x66\xf7\x66\x5f\x5d\xd3\x7c\ -\x1f\xb7\x1e\x17\xe2\x9e\x2e\xa9\xd2\xd4\x98\x8d\x53\x74\xdc\xd3\ -\xf3\x56\xa2\x2e\x8c\x32\xa5\xbb\x69\x81\x30\x2c\x08\x65\x4a\x77\ -\x93\x83\xc8\x6b\x22\x95\x68\xfb\x0d\xf1\xc1\x4a\xbd\xdd\x64\x6d\ -\x8f\xdd\x72\x65\xf2\x3b\x95\x47\xbb\xbd\x3c\x16\x25\x37\x5f\x05\ -\xdd\x05\xdd\x05\xdd\x05\xdd\x05\xdd\xc7\x16\xdd\xbd\xf6\x33\x3c\ -\xf3\x36\x28\xb0\xbe\xa0\xef\xf7\x54\xd5\xfa\xdc\x08\x36\x42\xc5\ -\x55\x38\xfe\xae\x7f\x5a\x14\x0b\xb8\x79\x8a\x9e\xbd\xb0\x1e\xfd\ -\xf2\xef\x41\xd2\x0a\xa1\x5a\x0a\x08\x08\x08\x08\x08\x08\x08\x08\ -\x08\x08\x8c\x0a\x24\xf8\x54\x70\xfc\x09\xff\x5e\x71\xa6\x97\xfa\ -\x06\x3c\xac\xc7\x10\xc9\xe3\x6f\x86\x4a\x2b\x40\xa4\x79\x88\x98\ -\x6a\xd1\x48\xb9\x43\xf3\xf4\x50\xdd\x3c\x3c\x08\xe4\xf7\x05\xf7\ -\xbb\x41\x87\x99\xaf\x80\xe7\xa7\xe1\x73\x8f\xdb\xc8\xfd\xe7\xa0\ -\x0a\x38\xf7\x22\x83\xc3\x63\x61\x78\x5e\x0a\x14\xe4\xc2\x7d\xe8\ -\xea\xd5\xaf\x62\xd3\x3d\xbb\x9f\x53\xbf\xf3\x80\x74\x37\x7e\x51\ -\x87\x89\xee\x01\xfb\x59\x2c\xba\xfb\xf2\x71\xae\xfc\xe5\xdb\xfe\ -\x61\xa2\x7b\xbe\x1d\xf2\x7a\xad\xd7\x7c\x75\xc8\xb5\x1c\x2d\x89\ -\x23\xd5\xee\x62\xf1\xbb\xa0\xbb\xa0\xbb\xa0\x7b\x01\xe9\x5e\xe0\ -\x7d\x80\xa0\xbb\xa0\x7b\x39\xd2\x9d\x67\xd9\x2b\xee\xf1\x62\x73\ -\xff\xad\x6f\xa8\x24\xd6\x01\x62\xa7\xe1\xc4\x3b\x5e\x31\x2e\xb1\ -\x7a\x8a\xa4\xda\xab\xa1\xd2\x0a\xa1\x46\x0a\x08\x08\x08\x08\x08\ -\x08\x08\x08\x08\x08\x8c\x4e\xf0\xf1\x00\xff\x2d\x1e\x5a\xd1\x6c\ -\xaa\x41\xe6\x6f\x97\x2c\x9d\x03\x0a\xfd\x0e\x44\x15\x20\x30\x30\ -\x4d\xc9\x22\xae\xfd\xe1\xf4\x10\xa9\x1e\x7a\x1b\x05\xd3\xfc\xc8\ -\x43\x9b\xb6\x7d\xef\x1b\xb2\x62\xcb\x92\x93\xf5\x89\x4a\x7b\x3b\ -\x28\x4b\x2d\x9f\x3c\xfe\xf3\x6a\xbf\xf1\x3b\xb7\x9e\xa5\x0c\x9a\ -\xcd\x2f\x70\x7b\x82\x7e\xef\xf3\x3b\xd1\x08\xd1\x3d\x57\x04\xa5\ -\xbb\xd9\xa0\x61\xa2\x7b\xae\xfd\x1c\x69\xba\xe7\xdb\x1d\xbd\xbd\ -\x9e\x0e\x22\x4f\xcf\xaf\x3b\xdd\xf9\x70\xd1\xb5\xd0\x7c\x83\xcc\ -\x74\xe7\x59\xbe\x37\xa8\xdd\x9d\xdc\xc8\x18\xa4\xdd\xc3\x45\xf7\ -\x91\x9e\xaf\x82\xee\x82\xee\x63\x81\xee\xdc\x4a\xa8\xf2\xa7\x3b\ -\x4a\x8a\xee\xe4\xb5\x5e\x94\x3a\xdd\x6d\xcf\x1b\x6b\x74\xb7\x5f\ -\x5e\x90\x0d\x0c\xa5\x35\x8e\x73\x02\xe7\x13\x10\x42\x35\xa6\xad\ -\x7a\x18\x4f\x9b\xe1\xe6\x00\x40\xdf\x21\x4e\x35\x42\x73\x14\x10\ -\x10\x10\x10\x10\x10\x10\x10\x10\x10\x18\xfd\xa0\x15\x38\x7a\xc5\ -\x62\x00\x90\x01\x00\xff\x3e\x6f\x29\xc5\xa5\x8f\x00\x1c\x14\xf2\ -\x3a\x43\x9c\xee\x21\xca\xa0\xf3\x06\xf1\x10\x65\x01\x7b\xdd\x04\ -\xef\x0b\x8b\xac\x21\x07\x6d\xbf\x57\x0c\x52\x89\xd6\x9b\xf1\xef\ -\xa0\xa0\x7b\x59\xd3\x9d\x72\x7a\xad\xe3\x7e\x7b\x31\xb6\xa0\x0f\ -\x22\x2a\x32\xff\xf8\xbd\xd8\xf4\x2c\xda\xb3\x6b\xe6\xd7\x6e\x9e\ -\xef\x75\x5e\xb1\x74\x82\xee\x82\xee\x79\xd1\xdd\x63\xf9\x17\x74\ -\x1f\x5e\xba\xfb\x74\xb0\x54\xe8\x9e\xed\x8b\x4b\x85\xee\xbe\xb1\ -\xc6\xa5\x4e\xf7\x2c\xd7\xe9\xa2\x7b\x8c\xb2\xa5\xbb\xfd\x3e\x2a\ -\x54\xc7\xb8\x87\x3c\xb3\xe9\x39\xa4\xaa\x00\xfb\x32\x38\xce\xd5\ -\xce\xc6\x25\xf1\x09\xa1\x29\x0a\x08\x08\x08\x08\x08\x08\x08\x08\ -\x08\x08\x8c\x2d\xa8\xa7\xe2\x89\xcb\xda\x64\x3c\x7f\x4e\x14\xdd\ -\xf2\x47\x20\xf9\x45\x27\xe4\xe9\x21\xca\x57\xb5\xb6\x9b\x86\x48\ -\xb5\xbd\xbf\xd8\xaa\x71\x66\xc5\x16\x65\xea\x90\xf0\x35\xc9\x09\ -\xba\x97\x37\xdd\x83\x1e\x7a\x0e\xfa\xb8\xa0\x9e\x5d\xb3\xbe\x59\ -\x91\xe9\x9b\x2d\xdd\x6d\xfd\x2c\xc8\x39\xe7\x7c\xf8\x20\xeb\x66\ -\x94\x28\xdd\xb3\xe4\x2f\x41\xf7\xe1\xa2\xbb\xbb\x60\x11\x74\x17\ -\x74\x1f\xc1\x69\x5e\xf8\x06\x50\x96\x74\x2f\x95\x75\xbe\x54\xe5\ -\x63\xa1\xe9\xee\xe7\x21\x2a\xd8\xc6\x50\xcf\xd2\xc7\xad\x9e\x22\ -\xae\xa8\x31\x00\x80\xa4\x9c\xcd\xd0\x2d\x1f\x0b\x12\xb1\x44\x02\ -\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x63\x10\x9c\x9f\x25\x83\ -\xc2\x87\x00\x5c\x4e\xe5\x39\x37\x0e\x53\xaa\xba\x02\x57\x20\x0f\ -\x51\xc1\x2c\xdb\x86\x4a\xc9\x2c\x9a\x9f\xd7\x6b\x4a\xd4\x91\xe1\ -\x49\x1e\x94\x48\xfb\x29\xc7\xeb\x05\xdd\x8b\x43\x77\x78\xf4\x23\ -\x7f\x21\x91\x5d\x03\x83\x8a\x03\x4e\x25\x32\xf0\xb9\x9e\xdd\xa6\ -\xd2\x62\x88\xa0\x06\xc2\x92\xa5\x3b\x04\xdd\x4b\x83\xee\x5c\xd0\ -\x5d\xd0\x3d\x6f\xba\xa3\xd4\xe8\xee\xd9\x70\x5e\x1a\xed\x14\x74\ -\xcf\xae\xa3\x7e\xf3\xca\xeb\x77\xd3\x31\xc5\xad\xaf\x31\x1d\x47\ -\xb4\x94\x01\x98\x4a\x54\xae\x67\x8c\x04\x04\x04\x04\x04\x04\x04\ -\x04\x04\x04\x04\x04\xf2\x51\xea\x18\x64\x02\x1d\x06\x48\x43\x80\ -\x12\xd1\x54\x28\x5f\x15\xcf\xd0\xa8\xb2\x7b\x59\x41\x0b\xbf\x00\ -\xa9\x18\x27\xb2\x69\x80\x25\x65\x07\x70\x16\xd6\x55\xb9\x3b\xf9\ -\xf4\x2f\xec\xd9\xd0\x78\x91\xdb\x9d\x8a\xcd\xe1\x36\x0d\xbb\xbc\ -\xe8\x6e\xea\xfd\xc4\x47\x35\xdd\x47\x8e\xb0\x01\xdb\xef\x33\x8b\ -\x4b\xdf\x1c\xc3\x5d\xc5\x5e\xa9\xb5\x3b\x5b\x07\x97\xa0\xbb\xa0\ -\x7b\xa0\x76\x0b\xba\x0b\xba\xe7\x40\xf7\xf2\xdd\x14\x8b\x66\x8d\ -\xea\x8e\x3a\x3c\x59\xfa\x1f\xe1\x94\x5a\xc1\x40\x98\x23\xd4\x43\ -\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x81\x31\x09\x02\x64\x80\ -\x47\xdc\x7e\xe3\x9e\x26\x96\xe2\xe8\xac\xdc\xe5\x2f\x57\xcd\xaf\ -\x50\xb6\x95\x42\x67\xf1\xb0\xe7\x47\xb7\xe7\xc3\x77\x78\xe8\x4a\ -\x03\x3c\x30\x7d\x4a\x9b\xee\xdc\x9e\x96\xa5\x4c\xe9\xce\xb3\xe5\ -\x77\xdf\x98\x19\x1a\x9e\x86\xfb\x65\x6f\x2b\x35\x1b\x6e\xc0\x2c\ -\x39\x45\xcf\xee\x93\xf7\xf0\x08\xba\x0b\xba\x0b\xba\x0b\xba\x8f\ -\xbd\xcd\x6e\x51\xf6\x1f\x82\xee\x45\x7e\xbf\xfb\xfc\x77\x34\x2b\ -\xa9\x9f\x3c\x93\x09\x4c\x8c\x9a\x80\x80\x80\x80\x80\x80\x80\x80\ -\x80\x80\xc0\x58\x86\x9c\xaa\xf7\xa3\xeb\x53\x9e\x59\x99\x86\x59\ -\xe5\xe3\x01\xb3\xaf\x70\x9f\xfb\x0a\x6d\x10\x1a\x26\x03\x13\xb7\ -\xb7\x9f\x97\x97\x69\x82\x53\x79\xd2\xdd\x71\x96\xb4\xcc\xe8\x9e\ -\x0a\xa5\xcb\x31\xa8\x88\x7b\x7c\x51\xe8\xb4\x36\x3c\xe0\x7c\x2f\ -\xb8\x27\xb6\x48\xf7\xe7\xfa\xfc\x91\xb6\x4c\x96\x0d\xdd\xb9\xa0\ -\xbb\xa0\xbb\xa0\x7b\xd9\xd2\x3d\xcb\xf7\xf9\x5d\x2f\xe4\x7b\x71\ -\xc6\xa9\x54\xe9\x9e\x67\x9a\x60\x6e\x8f\x35\x4f\xdb\xe6\x08\x4f\ -\x91\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\xc0\x98\x86\xcc\x0d\ -\xbd\xc8\xf0\x18\xd9\x63\x5f\x86\x5d\x53\xcd\x32\x26\xc2\xa1\xea\ -\x21\xa0\xaa\x5b\x62\x9a\x39\xec\x74\xa6\xd2\x6e\x77\xb9\xd3\xdd\ -\xd1\xce\x32\xa5\x3b\x1b\x26\xba\xfb\xdd\x46\xb9\x16\xf4\x09\x38\ -\x1c\x85\x1e\x5e\x94\x38\xfb\x15\xb8\xdd\x45\xab\x63\x41\xc3\x4d\ -\x30\x2e\xe8\x2e\xf8\x5d\xd0\xbd\x44\xe8\x3e\xe2\xed\x16\x74\x17\ -\x74\x1f\xe1\x76\x09\x4f\x91\x80\x80\x80\x80\x80\x80\x80\x80\x80\ -\x80\xc0\x98\x86\x9c\xb7\xa6\x96\xab\x21\x8f\x07\x7c\x01\xf7\xb9\ -\x9f\xfb\xc5\x56\x94\xa8\xaa\x6b\x6f\x37\xe7\x65\xda\x6e\x41\xf7\ -\x51\x41\x77\xfb\x7c\xf6\x8b\x19\xf3\xf0\x1c\x8d\xbe\xa4\x3d\x25\ -\xea\x39\x2c\xd7\x02\x2c\x82\xee\x02\x82\xee\x65\x4b\xf7\xa2\x79\ -\xe8\x04\xdd\xc7\x06\x59\x4b\xa0\xa3\xc2\x53\x24\x20\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x30\xa6\x95\x51\x39\xc8\x45\xc3\xa2\x09\ -\x9a\x9f\x29\xbb\x1b\xec\xf7\xab\x46\x76\x19\x7b\xe1\x9f\x52\x25\ -\x3a\x0f\xd8\x4f\x2a\xd1\x76\x93\xa0\x7b\x49\xd0\xdd\xa3\x1f\x41\ -\xdb\x6f\x8f\x09\x53\x7d\x26\xbe\x97\xe7\xc8\x56\xa7\x8a\x07\xf5\ -\x18\x15\xdb\x22\x14\x98\x4f\x4b\xd4\x44\x9d\xaf\x87\x5e\xd0\x5d\ -\xd0\x5d\xd0\x5d\xd0\x3d\xcb\xf6\x93\xa0\x7b\x69\xd3\xbd\x5c\xe7\ -\xa9\xd1\xcf\x12\xd8\x46\x0a\x4f\x91\x80\x80\x80\x80\x80\x80\x80\ -\x80\x80\x80\xc0\x98\x86\xec\xab\x40\x0f\x97\xe6\x68\xc6\x46\xa8\ -\x99\x7f\xf7\x6a\x87\xa4\x5a\xd5\xba\x24\xb3\xde\x68\xdc\x17\xf2\ -\x68\x40\x82\xac\xbf\xc7\x6d\xef\x0b\xd9\xae\x8f\x7b\xb4\x23\x6c\ -\xfb\xdd\x2f\x6b\x5f\x44\x7f\x5f\x82\x7b\xb4\xdf\x78\xae\xde\xbf\ -\x84\xad\x3d\x09\xdb\xf3\x8d\x58\x13\xa3\x1d\x09\x1b\xfd\xc2\x1e\ -\xed\x0f\x23\x33\x5d\xbc\x20\x29\xd6\x76\x13\xb3\xf6\xc7\xe6\x39\ -\x70\xd0\xb1\x58\x74\xf7\xe5\x9b\x32\xa3\x7b\xd2\xc3\x9e\xe1\xe5\ -\x11\xb3\xcf\x03\xe3\x7d\xe4\x71\x78\xd9\xab\x60\x19\x15\xe6\xb0\ -\xb3\x7d\xb8\x46\xdc\x32\x14\xd8\x40\xc8\xf3\xbb\xbd\xe8\xed\x17\ -\x74\x2f\x25\xba\x97\x7e\xbb\x47\x57\x2c\x97\xa0\xbb\xa0\x7b\xe6\ -\xf5\x49\xc4\x2e\x16\x87\xee\xa5\x3b\x1a\xc2\x53\x24\x20\x20\x20\ -\x20\x20\x20\x20\x20\x20\x20\x30\xa6\x21\x7b\x6a\x7a\x85\x52\xe9\ -\xec\x9a\xa3\x99\x45\xcb\xe3\x01\x72\xda\x0d\x8c\x81\xc0\x30\x8e\ -\x55\x61\x82\x5c\x83\x0a\x16\x85\xcc\x24\x30\x62\x60\xfa\x65\xc9\ -\x44\x02\x9c\x08\x44\x92\x79\x1f\xb7\x35\x8e\x43\x33\xa0\x5b\x94\ -\xd7\xa8\xed\xbd\xd1\xb4\x6b\xd3\xdb\x6e\x34\x37\x9a\xb9\x32\x0c\ -\x45\x5d\xbe\x27\xab\xe1\x9e\x48\xfb\x1f\x03\x41\x0d\x27\x01\x0e\ -\xff\xb6\xc7\x6c\x6d\x8f\x66\x1e\x12\xf3\xf7\xf4\xb6\x67\xb8\x8f\ -\xdb\x87\x3c\xea\xdf\x76\x00\x50\x95\xa4\xb5\xed\xb1\xdc\xe9\xee\ -\x30\x2a\x0c\x27\xdd\xd5\xc2\xd2\xdd\xf1\xfb\x88\xd0\x9d\x81\x88\ -\x79\xb6\xdd\xf9\x70\x02\x11\x40\x20\x80\x00\xce\x55\x0c\x26\xe3\ -\xe8\x88\xef\xc7\x0e\xde\x07\x15\x8a\x76\x93\xca\x53\x1e\x22\xee\ -\x31\x6f\x4d\x4f\xac\x97\xc7\x28\x98\x89\x28\x67\x8b\x50\x89\xa4\ -\xe1\xe1\x63\xa5\xdd\x82\xee\x82\xee\x63\x89\x5f\xca\x1d\xc3\x4c\ -\xf7\xa0\x8f\x17\x74\x1f\x95\xd3\x69\x8c\x2a\x45\x25\x82\xb3\x1b\ -\x8e\xc0\xb9\x4d\x87\x62\x49\xcd\x54\xb4\x46\x6b\x21\x4b\x92\xb9\ -\x31\x34\x19\x25\x4d\xb1\x22\x2a\x2f\x76\x31\xda\x5e\x6e\xed\x16\ -\x74\x1f\x1d\x74\xe7\xe0\x50\xb8\x8a\x1d\x89\x1e\xac\xdc\xb7\x09\ -\xf7\x74\xac\xc4\x7d\x1d\x2b\x31\x80\x01\x21\x15\x05\x04\x04\x04\ -\x04\x04\x04\xc6\x1c\x08\xff\xba\x4c\xdf\x25\xea\xb1\x14\x86\xa5\ -\x98\x0a\x64\x02\x70\x64\x8b\xb3\xc5\x10\x19\xef\x63\x04\x84\x80\ -\xb3\xeb\x0f\xc7\x0d\x6d\x1f\xc1\x8c\x9a\xa6\xc0\x1b\x44\xb1\x39\ -\x2f\xce\xc6\x5c\xd0\x7d\x74\xd1\xbd\x7d\x60\x0f\xbe\xb9\xee\x1f\ -\xb8\x73\xe7\xf3\x50\x49\x8f\x61\x22\xbb\x27\x48\xb5\x7d\x76\x48\ -\x14\xcb\x1f\x64\xcb\x8a\xc7\x59\x89\xd9\xbc\xbc\x42\xa6\x4c\x79\ -\x05\x0b\x1d\x8c\xec\x7a\x59\x7b\xd4\x69\x98\xdb\x6f\x6f\x16\x2f\ -\x77\xba\x5b\x63\x14\x05\xdd\x05\xdd\xd3\x9f\xef\x68\xb7\xa0\xbb\ -\xa0\x7b\x31\xe8\x3e\x42\xed\x1f\x33\x74\x47\x8e\xdd\xf0\xcc\x5d\ -\xe0\x95\xad\x57\xdf\x9f\xe8\xed\xe0\x46\xcc\x76\x58\x2a\x9d\x98\ -\xa2\xaa\x50\x14\xbf\x9d\x76\x05\xfe\xb2\xe0\x93\xbe\x0a\x91\x80\ -\x80\x40\xe1\x31\x39\xd6\x88\xdb\x17\x5c\x8e\x7b\x0f\xba\x1a\x8d\ -\xa8\x16\x04\x11\x10\x10\x10\x10\x10\x10\x18\x1b\xe0\xf9\xc4\x14\ -\x65\xfd\x32\x0f\x55\x8e\x11\xaa\x59\x0c\x0f\xcc\xff\x1c\x8e\x19\ -\x3f\xbb\x2c\x8f\x35\x09\x08\x8c\x16\x10\x11\xce\x6c\x5d\x84\x29\ -\xb1\x46\x7c\xe0\x95\x1f\xa3\x13\xdd\xfa\x0f\xb6\x3a\x48\x5e\x9f\ -\x87\x59\x8c\xe4\x22\xe4\x8a\xda\xa0\xe1\xf6\x54\x8c\x5e\x4e\xcc\ -\xaf\xa3\x82\xee\xa3\x9a\xee\x22\xc6\xa2\xc4\xe9\x2e\x06\x48\xf0\ -\x7b\x29\xf0\x31\x65\x29\xcf\xa8\x04\xb2\xcf\x11\x18\x7e\x3c\xe3\ -\x42\x1c\x33\x7e\xb6\x98\x08\x02\x02\x25\x82\x45\x75\x53\x70\xfb\ -\x81\x2b\x04\x21\x04\x04\x04\x04\x04\x04\x04\xc6\x04\x8a\xa0\x14\ -\x91\xf6\x1f\x69\xff\x9d\x51\xb7\x18\x97\x1f\x70\x14\x88\x48\x78\ -\x89\x04\x04\x4a\x05\x04\x9c\xde\x7a\x08\xae\x1a\xff\x5f\x00\xb8\ -\xe6\x09\x22\x6e\xce\xdb\x14\x38\x2c\x56\x18\xfd\xa3\xed\xdb\xc2\ -\x21\xdb\x07\xeb\xe2\x66\xe4\x5e\x38\x4a\x31\xe2\x64\x10\x74\x1f\ -\x23\x03\x2d\x50\x5e\xcb\x42\x30\x71\x9a\xb7\xdc\x15\x10\xe4\x2c\ -\x84\x78\xca\x5e\x9e\x15\xd5\x53\x14\xe6\x51\x7c\x67\xd6\x87\xc1\ -\x98\x28\x97\x24\x20\x50\x8a\xb8\x6e\xd6\x87\x50\xcb\x45\x7c\x91\ -\x80\x80\x80\x80\x80\x80\xc0\xe8\xc6\xc8\x6b\x23\x94\xb2\x3a\x2f\ -\xaf\x3b\x10\x07\xd5\x4d\x12\x1a\xb0\x80\x40\x89\xa2\x25\x56\x83\ -\xf3\x9a\x0e\xd5\x62\x02\x79\xba\x0b\xa8\x48\xb6\xab\x42\xbd\x36\ -\xb0\x01\x29\xc7\x17\x8e\xb0\xc1\x7d\xd8\x47\x43\xd0\xbd\x38\x74\ -\x2f\x54\x7f\x04\xdd\x05\xdd\x4b\x88\x2c\xa5\x43\xf7\x52\x25\x84\ -\xa0\x7b\x71\x26\x7e\x31\x3d\x45\xc4\x70\x5e\xd3\x52\xb1\xeb\x14\ -\x10\x28\x65\x10\xe1\x82\x96\x43\x05\x1d\x04\x04\x04\x04\x04\x04\ -\x04\x46\x35\x64\x77\x55\x0c\xc3\xa7\xee\xe9\xf1\x08\x0c\x12\x16\ -\xd7\x4e\x12\x23\x20\x20\x50\xe2\x38\xa8\x6e\x22\xc2\x4a\x04\x00\ -\x10\x97\x12\x3e\xf3\x1b\x01\xe5\x87\x51\xa0\xc0\xab\x8e\x40\x40\ -\x14\x3a\x2d\x0f\xf7\xe9\x07\xd9\xda\x0d\x8f\xf7\x53\xb1\xdb\x2d\ -\xe8\x3e\x2a\xe8\x4e\x45\xa6\x7b\xd0\xf7\x0a\xba\x67\xf7\xdc\x32\ -\xa5\x3b\x8d\x3a\xba\x43\xd0\xbd\x94\xe8\x9e\xab\x1c\x08\xdc\x00\ -\xff\x71\x2c\x9a\xa7\xa8\x4e\xad\xc4\xa4\x8a\x46\xb1\xe3\x14\x10\ -\x28\x71\x34\x86\xab\x70\x40\xb4\x0e\x71\x36\x20\x88\x21\x20\x20\ -\x20\x20\x20\x20\x30\xfa\xc0\xc9\xcd\x53\x94\xad\x26\x96\xa5\xca\ -\x28\x69\x25\xe2\xc7\xb3\x6a\x44\xe5\xb0\x48\x67\x2f\x20\x50\x06\ -\x68\x0d\xd7\xe2\xbd\xa1\x1d\x8e\xe9\xec\xf9\x39\x6b\x61\x54\xe4\ -\xfb\x03\xf7\xcb\x66\x81\xe3\x79\xbe\xbf\x40\xed\xe6\xb9\x16\x62\ -\x2f\x55\xba\x7b\x11\x58\xd0\x7d\x64\xe9\x4e\xa5\xd9\xee\xb2\xa5\ -\x3b\x17\x74\x17\x74\x1f\x0e\xba\x53\x99\xd1\x3d\xe0\xfe\xa1\xd0\ -\xfa\x47\x80\x07\x16\x35\xed\x1b\x13\xaa\x90\x80\x40\xf9\x80\x8b\ -\xf9\x2a\x20\x20\x20\x20\x20\x20\x30\x3a\x21\x13\xa9\x56\x85\x4e\ -\x3f\x8b\x98\xbb\x82\xc6\x6d\x0a\x99\x6d\x23\xa5\x9f\x0d\x27\x62\ -\xc2\x3d\x24\x20\x50\x26\x88\xb2\x90\x76\x4e\xd9\xe1\x49\xb1\xc7\ -\x7a\x70\xdb\xf7\xee\xcf\xcb\x5f\xce\x14\x16\x4e\x87\x10\xb7\x2a\ -\x82\xc4\x6d\xed\x47\x69\xb5\x3f\xa0\x45\xae\x6c\xe8\xee\xd3\x4f\ -\x41\x77\x41\xf7\xcc\x74\xa7\x51\x41\xf7\x52\x2b\x19\x25\xe8\x2e\ -\xe4\x4c\x79\xd2\xdd\x7d\xfd\x36\x11\x26\x73\xbd\x2f\x62\xf6\x39\ -\xa1\x11\x09\x08\x94\x15\xc4\x94\x15\x10\x10\x10\x10\x10\x10\x18\ -\xa5\x90\xc1\x75\xbd\xc8\xf0\x18\x39\x8e\xde\x05\x54\xdd\x78\xe6\ -\x1f\xc8\xa6\x28\x4a\xaa\x9e\x70\x3c\x47\xcd\x96\xeb\xf7\x91\xae\ -\x5c\x71\x5e\x5e\x55\xb8\xcb\xad\xbd\x82\xee\x63\x9b\xee\x04\xee\ -\x6e\xc8\xe0\x9a\xdc\x30\xcd\x2b\xdc\x43\x91\xb2\xb5\x97\x07\x17\ -\x20\x23\x43\x5f\xf3\x0f\x72\xf6\xdb\x45\x21\xe4\x25\xd2\x6e\x67\ -\x47\xdc\x0f\xc5\x9b\x96\xfe\x7c\xb3\xce\x8d\x18\xdd\x51\x16\x74\ -\xb7\x2f\x93\xe4\xd1\xbe\xf2\xe1\x77\x1f\xba\x97\x88\xcb\xc8\xde\ -\x7e\x6f\xba\x53\x59\xd3\x1d\x25\x4b\x77\x08\xba\x0b\xba\x0f\x1f\ -\xdd\x0b\x16\x8c\xe5\x4e\x38\xfb\xc9\x38\x24\xf5\x7d\x8c\x54\xe4\ -\x98\x22\x94\xe9\x06\x55\x40\x60\x4c\x42\x4c\x57\x01\x01\x01\x01\ -\x01\x01\x81\xd1\x08\x45\x81\x9c\x52\xd5\xbc\x62\x00\xb2\x35\x29\ -\x72\x8f\x6f\xf5\xef\x75\x85\x4c\x0d\x29\x79\xb5\x9d\xca\xfc\xf8\ -\x9d\xdd\xf2\x5f\x2e\x10\x74\x1f\x9b\x74\xd7\x4e\xda\x92\x39\x7f\ -\x1d\xa6\x1e\xee\x55\x90\x20\xdf\xf4\x33\xc5\xeb\xb1\x6b\xeb\xf9\ -\x08\xb5\x3b\xa0\x02\x6a\x58\xb5\x54\x8f\xf6\xeb\x07\x00\xcc\x03\ -\x01\xe6\xaf\xaa\xde\x3f\xdb\xe1\x6a\xef\xe7\x8d\xd4\x70\x15\x99\ -\xee\x79\x0f\x9b\x71\x32\x82\x5c\x67\x41\xd9\xf3\x3b\x2f\x55\xba\ -\xc3\x42\xf7\x51\x27\x67\x78\x79\xf0\x7b\xb9\xd0\x9d\xbc\xf8\xa6\ -\x5c\xe8\xce\xcb\x5d\xce\xf0\xcc\x74\x1f\xa1\x75\xd5\xfc\xc8\xc8\ -\xb1\x06\x8e\x38\x54\x11\xa0\x20\x20\x50\x66\x50\x05\x09\x04\x04\ -\x04\x04\x04\x04\x04\x46\x21\x08\xb2\x61\x4a\x4c\x19\x7e\xb3\xcb\ -\x77\xce\x3d\x83\x08\x3c\x34\x3f\xdd\x32\xc9\x39\x01\x94\xbb\x05\ -\xdc\x1e\x53\x51\x6e\x96\x7f\xc6\x58\x59\xb6\x5b\xd0\x7d\x6c\xd1\ -\x9d\xa7\xbf\x5f\x05\x20\xdb\xeb\xc5\x58\x2d\x3d\xc4\xc8\x26\x2e\ -\xbc\xce\x12\xfb\xc8\x19\x2f\x93\x69\xa1\x2d\x77\x1e\x69\x7d\xcc\ -\x2c\x3e\x64\xc4\xe4\x90\x7b\xbb\xbd\x1c\x63\x1e\x72\x32\xeb\x02\ -\xdf\xe4\xd3\x5c\xfd\x33\xf3\xe0\x13\x67\x43\x6c\x96\x3a\x5b\x01\ -\x0c\xe3\x6e\x66\xeb\x20\xf7\x1d\x27\xf7\xee\x93\xdf\xba\xe0\xe8\ -\x9f\x95\xee\xa6\xc7\xcb\x97\x5f\x6c\x0d\xe2\x1e\xe3\xcc\x87\xa7\ -\xc4\x3c\xf9\xd0\x9f\x7c\xb2\x31\xfa\xcf\xc0\xec\x17\xf7\xac\xda\ -\x1f\x98\xee\x3e\x74\x1e\xf6\x3d\x8b\xc7\x04\xe0\xc8\x2c\x67\xf2\ -\x6d\x27\xa1\xb0\xcf\xc9\x56\xce\x78\x4e\x30\x8f\x2c\x99\xc3\x2e\ -\x27\x03\xd2\x3d\x28\x5b\x67\x4b\xdf\x6c\xfb\xe9\x25\x47\x1d\xdd\ -\xcb\x72\x5d\x1a\x29\x4f\x92\xe7\x7a\x88\x60\xfb\x02\x3e\x4c\xf3\ -\xd0\x8f\xef\x3c\xf9\x3d\x20\xdd\x73\x5c\xff\xb9\x23\xf8\x8a\x32\ -\x92\x93\x27\xf5\xcf\x21\x2a\x72\x4c\x91\x80\x80\x40\x79\x28\x65\ -\x22\xa0\x48\x40\x40\x40\x40\x40\x40\x60\xb4\x82\x00\xd9\x6e\x09\ -\x24\x2f\x95\xdd\x5e\x8e\xc4\x47\x13\xf7\xd4\xa4\xcd\xe7\x70\x77\ -\x05\x5c\x40\x40\xa0\x04\xb5\x22\x2f\x97\x80\x5f\x96\x2d\xeb\xc4\ -\xf7\x3e\x83\x1e\x30\x2b\x1a\x0d\x97\x72\xc6\xdd\xbb\x6b\x84\x42\ -\x12\xb7\x35\xcf\xbd\x7e\x11\xcf\xea\x2d\x99\x04\x29\xb7\x91\xc5\ -\xdd\x42\xc8\x6d\x12\x94\x87\xf4\xfb\x8d\x6c\x3a\xb2\xfe\x59\xf7\ -\x90\x9a\xdf\x9b\xa1\x60\xfa\xfd\x8a\xd1\x1d\x8f\xba\x72\x0e\x71\ -\x6e\xb3\x14\xfb\x1a\x28\xb9\xfb\x72\x61\x77\x3c\xd8\x97\x1f\x2f\ -\x4f\x90\x27\xbf\xf8\xf0\x11\x65\x99\x4d\xd5\xce\xf6\xf6\xc7\xdb\ -\x2c\x9f\x5e\xc6\x04\xfb\xba\x3a\x6c\x26\x06\x8f\x6c\x8f\x9e\x64\ -\x20\x5b\xfb\x6d\xb1\x66\xde\x9e\x3e\x1f\x3a\xf3\x60\x5f\x67\x9b\ -\x2b\x8b\x78\xb0\xf7\x73\xe4\x97\x35\x8c\x28\x60\x83\x7d\xf8\x87\ -\xfb\xb0\x9f\x3d\x3b\x97\xca\xec\xb1\x16\xb6\x7e\x7a\xb6\x8b\x7b\ -\xc8\x85\x02\xf5\x9b\x7b\x74\xc0\xd7\xc3\xc3\x03\xee\x17\x73\xdc\ -\x08\xe6\xb8\x1e\x70\xdb\x3c\xe1\x7e\x72\xb8\x40\xf2\x84\xe7\xca\ -\xf7\xbe\xcb\x84\x95\x6f\xb2\xcd\x4e\xeb\xd7\x1e\xf2\x60\x47\xa7\ -\x9e\xc0\x83\xd1\xdd\x94\x33\x5e\x02\x97\x07\xa3\x37\x0f\x4a\x47\ -\x77\x8f\x93\x39\x4f\x22\x29\x8f\x72\x91\xb3\xcf\x89\xbd\xa6\x80\ -\x40\x99\x68\x45\x82\x04\x02\x02\x02\x02\x02\x02\x02\xa3\x16\x32\ -\xb7\xd5\x29\xca\x7f\x4b\xe4\x73\xa5\x6a\x14\x2a\xe2\x39\x19\x06\ -\x04\x04\x04\xca\x40\x79\xb2\xc5\xaa\xe4\x2b\x59\xfc\x1c\xd4\x59\ -\x5b\xda\xb2\xb4\x00\x3b\x8e\x50\xc3\x6e\x99\xcd\x0e\x76\x83\xbe\ -\x59\x2f\xc1\xb0\xf8\x99\x86\x2b\xc3\x92\xa9\x7f\x21\xb1\x54\x7b\ -\x08\x60\x20\x44\x58\x08\x07\x44\xc7\x63\x6e\x65\x2b\x66\x46\x9a\ -\x30\x25\xda\x88\x96\x70\x0d\xea\xe5\x0a\x48\x9c\x34\xeb\x21\x31\ -\x70\x70\xc4\xd5\x04\xba\x12\xfd\xd8\x15\xef\xc2\xfb\xca\x5e\xac\ -\xee\xdf\x8e\x77\xbb\xb6\x61\x1b\xeb\x42\x52\x4d\x68\xed\xe1\x1c\ -\x5c\x6f\x00\x53\x54\x0f\xba\xb9\x53\x3e\xf5\xad\xe3\xb0\x7b\x76\ -\xe4\x77\x1e\x3a\xcf\x8b\x5f\x72\xae\xde\xe1\xe5\xf1\x08\x6a\x20\ -\xb5\x5b\x24\x3d\xdf\x13\xf4\xcc\x04\xcf\xae\x63\x1e\xe3\xc5\x6d\ -\xb1\x36\xe4\xc7\xef\xdc\xa7\x5e\x17\xcf\x4b\x5a\xe4\x7c\xbd\x1f\ -\xdd\x73\x3d\x8a\xc2\x3d\x3d\x25\xf9\x75\x20\xa8\xd8\x71\x58\xfa\ -\x79\x81\x09\x48\x01\xfb\xed\x45\x6f\x5f\xcf\x68\x7e\xcd\x09\x2a\ -\xef\x3d\xa5\x42\xe6\x90\x92\x00\x2b\x08\x0f\x36\x8e\x3e\x0e\xec\ -\x82\x0d\x5b\xc0\x83\x14\xb9\xd6\x2f\xe4\x59\xce\x07\x1e\x90\x5c\ -\x14\xb0\x0e\x11\x37\x63\x33\x79\x56\x0c\xc3\x73\xf4\x54\xa6\xe4\ -\x9a\x2e\x9f\x87\xf4\x75\x2e\xcc\x21\x17\x7b\xef\x24\x20\x20\x20\ -\x20\x10\x1c\x31\x29\x8c\x83\x2a\x27\xe1\x84\xba\xf9\x38\xb6\x76\ -\x36\x16\xd5\x4c\xc1\x38\xb9\x0a\x60\xd6\x43\x89\xe9\x1b\x71\xca\ -\x10\xc8\xaa\x72\x8e\xed\xf1\xfd\x78\x61\xff\xfb\x78\xaa\x6b\x1d\ -\x1e\xef\x7c\x1b\x6b\x07\xb6\x09\x42\x0b\x08\x08\x08\x08\x8c\x29\ -\xc8\xfe\x1a\x5c\x79\x83\x97\x78\x81\xd8\x62\xb5\xcf\x2f\x7b\x59\ -\xb6\xed\xf2\xcd\xba\x54\x22\xf4\xf4\xfb\xbd\xd0\x74\x19\xee\xfe\ -\x95\x6f\xdd\xa8\xc2\xc4\x56\xf0\x5c\xaf\xcb\x1c\x3a\xe9\xfb\xa0\ -\x5c\x3d\x43\xe6\xfd\xdc\x4e\x07\x9b\xe7\x89\xa5\x05\x11\x30\x82\ -\x24\x49\x38\xa4\x62\x2a\x2e\x19\xbf\x0c\xa7\x8d\x5b\x88\xb6\xaa\ -\x71\x01\xde\x49\x01\xf8\x95\xc0\x88\x30\x29\xd2\x80\x73\x9a\x1a\ -\x70\x4e\xd3\x12\x60\x16\xf0\x46\xcf\x16\xfc\xa5\xe3\x15\xfc\x69\ -\xe7\xcb\xd8\x38\xb4\x1b\xcc\xe8\x81\xa2\xd8\x3a\xe0\x7e\xd8\x9c\ -\x6c\x31\x64\x4e\x53\xa7\x4f\x16\x3f\x64\xfe\x99\x0f\x13\x9f\xe4\ -\xcf\xd6\x3e\xe9\xf8\x10\x38\x28\xd7\x83\x00\x99\xb3\x7f\x39\x09\ -\x44\xee\x17\x98\xe3\x61\xf7\x64\xb9\xd7\x0f\xe1\x05\x22\xa4\xc3\ -\x23\x90\x75\x2c\x8a\x0f\x83\x38\xf8\xc8\x23\x18\x9a\xb8\x07\x5d\ -\x47\x98\x91\xec\xf2\x5c\x75\x67\xa3\x61\x12\xbf\xde\x5f\x78\xd0\ -\xc3\x2b\xb4\x28\x5f\x32\xe5\x2a\xc7\xb9\x0f\xa3\xf9\x7b\xe6\xb8\ -\xeb\x70\x04\x4e\x5a\x38\xdc\xc9\xde\x3c\x92\x3d\x92\x83\x8f\x29\ -\xaf\xe7\x3a\xe7\x07\x15\x94\xbd\x89\x0a\xc4\x0f\x59\x97\x4d\xa5\ -\x60\x0c\x9b\x59\x29\x1a\x7d\xf8\xde\xf7\xae\xc7\xe3\x8f\xff\xdb\ -\x85\xd0\x1c\x23\x77\x80\x8f\xe3\xc0\xf9\x07\xe2\xe6\x9b\xff\xd7\ -\xf2\xed\x33\xcf\x3c\x8b\x6f\x7d\xfb\xdb\x50\x55\x35\x2f\xae\xd3\ -\x33\x9c\xbb\x73\x8e\xd5\x7c\x0c\xc6\x08\xb7\xde\x72\x0b\x66\xcf\ -\x9e\x9d\xf1\xd1\x03\x03\x03\x38\xf7\xfc\x0b\xd0\xd7\xdb\x03\xce\ -\xb5\x85\xb3\xb2\xa2\x12\x0f\x3d\xf8\x80\xe5\xba\x2d\x5b\xda\xb1\ -\xe2\xa3\x1f\x85\xaa\xa4\x0a\xf2\xce\x9e\x3d\x1b\xb7\xde\xf2\xcb\ -\x11\x1f\xeb\xaf\x7c\xe5\x6b\x78\xf1\xa5\x17\xdc\xc7\x95\xac\x7b\ -\x86\xf4\x4d\x63\x28\x14\xc2\xdf\xfe\x7a\x2f\x6a\x6a\x6a\x32\x3e\ -\x7f\xcb\x96\x76\x7c\xf4\x8a\x2b\x90\x4c\xc4\x9d\x84\xcd\x69\xd6\ -\x06\xdf\x4d\x90\x31\xdc\x9c\x03\x44\xb8\xfe\xfb\xdf\xc3\x91\x47\ -\x1e\x29\x4c\x3b\xa3\x18\x15\x91\x18\xce\xa9\x5f\x8a\x2b\x9b\x8f\ -\xc3\xd2\xba\x69\x90\x24\x36\x22\x32\x6b\x61\xf5\x01\x58\x58\x3d\ -\x19\xd7\x4d\x3b\x0d\x8f\xee\x5e\x8d\x1f\x6d\xf9\x27\x5e\xe8\xd9\ -\x20\x06\x44\x40\x40\x40\x40\x60\xd4\x42\xf6\x34\x5c\x64\xad\x91\ -\x65\x7f\x1f\xc7\x08\x64\x9f\x23\x60\xcd\x9a\xd5\x78\xfa\xe9\xa7\ -\x8a\x4e\xec\x78\x3c\xee\xf8\xae\x63\xd7\x2e\x3c\xfd\xd4\x53\xe0\ -\x7c\x64\x0b\x63\xf6\xf6\xf6\xfa\xd0\x8d\x90\x48\x24\xf1\xec\xd3\ -\xcf\xa0\xbb\xa7\xcb\x64\x8c\x9a\xba\x3a\x24\x12\x09\x84\x42\x21\ -\x73\x0c\x7b\x7b\x7b\xf0\xf4\x93\x4f\x02\x00\x54\x55\x53\x8c\x06\ -\xfa\xfb\x8a\x42\xe3\x55\xab\xde\xc0\x33\x4f\x3f\x93\xb5\xad\x26\ -\x1c\x8e\x20\x99\x4c\xf8\x5e\x37\xd0\xd7\x87\xa7\x9f\x7c\x0a\x8a\ -\x92\x28\x2a\x2f\x11\x93\xd0\xd9\xb9\xa7\x7c\x25\x4f\xbe\x13\xbf\ -\x50\xf7\xfb\x3d\x2f\xcf\xf7\x38\x3d\x44\x36\x93\xb6\xdd\xa2\x1f\ -\xd3\x62\x86\x22\x14\xc2\xc5\xf5\xcb\xf0\x95\xc9\xa7\x60\x7a\xd5\ -\x04\x90\x54\x0c\x8f\x20\x21\xc6\x22\x38\xb3\x69\x09\xce\x6c\x5a\ -\x82\x47\x77\xaf\xc2\x77\x36\x3e\x80\x17\x7a\xdf\x37\x1b\x4e\x4a\ -\x5a\xdd\x39\xcb\x02\x62\x88\x11\x5b\xdd\xaa\x54\x10\x95\xa5\xdf\ -\x4e\x32\xab\xd6\x6f\x3c\xc8\x35\x6c\x7c\x99\xe3\xf8\x3a\x9e\x63\ -\x16\x90\xf2\x49\xd3\xc6\x79\x30\x86\xf3\xf2\x18\x65\xdb\x7e\x72\ -\xaf\xdb\xc1\xed\xcd\xe5\x85\xe2\x24\xf7\xe7\xa5\x1c\x36\xf6\xa0\ -\x8c\xa0\xb1\x1e\x64\xb9\x9f\xa5\xd2\x45\xba\xb7\xc0\xc1\xa6\x76\ -\x4f\x26\x8d\xa8\xfc\xb3\x67\x9f\xcb\x3a\x9b\x5a\xd0\xa0\x9c\xac\ -\xe5\x58\xb0\xe8\x27\x43\x9e\x91\xc7\xef\x05\x66\xa3\xfc\xe7\x73\ -\xbe\xc1\x4e\x05\x92\x1b\xbe\xf7\x91\xd7\xfb\x3d\x04\x21\x05\x2c\ -\x1c\xe7\xf9\x7e\xf2\x98\x0f\x05\x12\xb8\x7e\xf4\x1c\xae\xb2\x4f\ -\x39\x3c\x6f\x4c\x78\x8a\x4a\xe6\x80\x91\xdb\x59\x81\xa2\x1d\x9f\ -\x63\xc1\x39\xd9\xe7\xc8\x16\x05\x58\x74\x8b\x2b\x09\x83\xdc\x91\ -\x4d\x2a\x11\xb5\x14\x98\x49\x98\x74\x46\x29\x8e\xab\x9c\x87\x9b\ -\xa6\x9e\x8b\xc5\xf5\x53\x4a\x6a\x98\x4f\x1e\x7f\x30\x4e\x68\x9c\ -\x87\x3f\x6c\x7f\x1e\xff\xfd\xfe\x7d\xd8\x9e\xdc\x2f\x06\x4b\x40\ -\x40\x40\x40\x60\xd4\x40\x2e\xa6\x6e\x4f\x23\xa6\xb0\x94\x86\x5a\ -\xe4\x65\x4b\x19\xc9\xc2\x98\x4c\x92\xb4\x7f\x59\xf0\x8a\xd3\x44\ -\xcc\xf4\x64\x31\xb2\xd9\x84\xb8\x66\x2d\xe2\x5e\x75\x48\x46\x4c\ -\xdf\x4c\x55\x04\x27\x26\x81\xab\xca\xf0\xe9\xb5\xbc\x34\xb8\xc9\ -\x77\x0c\x47\x33\xf2\xf5\x64\x07\x16\x73\x79\xca\x43\x3f\x0f\x91\ -\x51\x3f\x48\x06\x1a\x42\xb5\xb8\x61\xe2\x59\x58\x31\xe9\x48\x84\ -\x43\xa5\x69\xaf\x0a\xb3\x10\x2e\x9f\x74\x2c\x4e\x1e\xb7\x00\x5f\ -\x5c\xfb\x27\xfc\xb9\xf3\x15\xa8\x50\x4d\xc7\x0e\xd9\xb2\xad\x71\ -\x5f\x0f\x5c\x40\x93\xec\x70\x7b\x14\xf3\xf6\x10\x71\xab\x1c\x32\ -\xb2\x29\x19\xf4\xe0\xd9\x08\x18\x38\x8b\x65\xd8\xb3\x39\x3a\x2c\ -\xc5\x5e\x8c\x67\xf3\xb8\x05\x0c\x96\x28\x54\x6c\x8b\x27\x9d\xf4\ -\x2c\xb4\xa4\xf3\x3f\xd9\xf9\xc5\x37\x86\xca\xfa\xbd\x3d\x34\xc2\ -\x5e\xff\xc4\x11\x3a\x41\x5e\x0c\x39\xcc\x67\x57\xb8\xad\x21\x14\ -\x30\xa8\x31\xeb\x02\x68\x7e\xc1\x8f\x94\x59\xce\xf1\xc2\xcc\xc3\ -\x72\x35\xdd\xf1\x61\xf7\x10\xf1\xcc\x72\xd0\x2b\x7b\xab\x67\xbd\ -\x23\x0a\xc6\x07\x94\x2b\x1f\x04\x74\x49\xe6\x69\x0c\xa7\x12\xe0\ -\x9b\xa2\xd6\x29\x1a\xa9\x8e\x97\xcc\xd6\xd1\x85\x61\x8a\xe9\x50\ -\xc9\x1c\x84\x6d\xa4\x06\x26\x1f\x82\xf2\x12\x18\xe1\x14\xd4\x3c\ -\x8e\x21\x52\x59\x71\x94\xf0\x14\x8d\x26\x2c\xad\x98\x89\xff\x1c\ -\xf8\x55\xac\x98\x54\x1e\x31\x62\x2d\xd1\x7a\xfc\x6e\xc1\x27\x70\ -\xdb\xac\xcb\x50\x8d\x98\x18\x40\x01\x01\x01\x01\x81\xb2\xc7\x98\ -\x38\x3e\xe7\xa6\xf5\xff\xf4\xa7\x3f\xc5\x51\x47\x1d\x0d\x80\x07\ -\xc8\xe0\x65\xab\x47\x6e\x04\xec\xeb\x79\x1a\xd2\x75\x68\xe3\x59\ -\x1b\x37\x6c\xc0\x59\xe7\x9c\xeb\x1b\x2b\xc4\xb5\x0c\x06\xbe\xf8\ -\xe8\x47\x3f\x8a\xab\xaf\xfe\x94\xab\x12\x45\x44\xe6\x7b\xff\xdf\ -\x97\xff\x1f\xfe\xf9\xaf\x7f\x5a\xb4\xae\x5f\xfe\xf2\x16\x1c\x76\ -\xd8\xa1\x20\x68\x75\x4d\x38\x80\xaf\x7d\xed\xeb\xd8\xb4\x79\x93\ -\xf6\x7e\x22\x84\xe4\x10\x1e\xb8\xff\x7e\x4c\x99\x72\x80\xf9\xcc\ -\xda\xda\x5a\x3c\xf3\xcc\xd3\x50\x14\xc5\xec\x7f\x6f\x4f\x37\x16\ -\x2f\x5e\x8a\x44\x32\xa9\x7d\x47\x84\xf1\x8d\xe3\xf0\xf2\x4b\x2f\ -\x81\x31\x09\x92\x6e\xf9\x5b\xb7\xf6\x5d\x2c\x38\xf8\x10\x24\x13\ -\x89\x94\xe6\x47\xb6\xac\x54\x1c\x38\xfd\xf4\xd3\x71\xe3\x0d\xd7\ -\xfb\x8e\xc1\x0f\x6f\xfa\x1f\xdc\x71\xc7\x1d\x80\xcd\xa2\x48\x44\ -\xe6\xb3\x00\xe0\xb3\xd7\x5c\x83\xef\x5f\xff\x3d\x48\x4c\x32\xc7\ -\x8b\x2c\x46\x17\x82\xaa\x2a\x38\xe3\x8c\x0f\x63\xeb\xb6\xad\xd9\ -\xeb\x18\xe4\xbc\x78\xfe\xfc\x03\x71\xe7\x9d\x77\x78\x2b\x91\x96\ -\x9b\xcd\x14\x0f\xb0\x64\x7e\x48\x6b\x07\x37\xae\x21\x7d\x6c\x01\ -\x7c\xed\xeb\xff\x8d\x87\x1f\x7e\xc8\x83\x2b\xcb\xd0\xb4\x90\xef\ -\xe3\xb2\x3d\x2b\x3e\xc2\x7a\x6c\xca\x50\x6d\xb3\x40\x1b\xb1\x0e\ -\xb2\xce\x8d\x32\xc3\x25\x0d\x47\xe3\xe7\xb3\xce\x47\x4d\xa4\x02\ -\xe5\x94\x4c\x50\x26\x09\x1f\x9b\x74\x0c\xe6\x54\xb6\xe0\xbc\x55\ -\xbf\xc4\x76\x65\xbf\xc3\xf0\xc9\x5d\x64\x95\xc5\x20\xe3\x08\x21\ -\x29\x90\xb2\x3f\xc2\x1e\x22\xbb\xe7\x6f\x52\xb8\x0e\x2a\x49\xd8\ -\x96\xd8\x6b\x0d\x9e\x55\x29\x63\x3f\x89\x6b\x72\xeb\x1b\xcd\x67\ -\xa0\xa1\xba\x16\xaa\xc4\x11\x02\xf0\xe7\x1d\xcf\xe3\xd9\xfd\x6b\ -\x01\x2e\x7b\xb4\xdb\x1e\x5b\xa4\xea\xed\xd5\xe5\xa0\xec\x11\x7b\ -\xe4\x88\xe9\x19\x5e\x23\x4e\xba\xa7\xe6\x88\x8a\x69\xd8\x41\x03\ -\xd8\x14\xdf\x83\xa8\x4e\xb7\xc1\x84\x1e\x77\xab\x7a\x51\xde\xa3\ -\xee\x88\xf1\xbd\xe1\x3d\x0f\x11\xc6\x4b\xb5\xf8\x70\xfd\x81\xb8\ -\xbd\xe3\x45\xa8\x6a\xd2\x9d\xfe\xbe\x59\xea\x0a\xd5\x7d\xf7\xa3\ -\xe8\x90\xf4\xc9\xa2\x72\x40\x65\x81\xe5\x97\x23\xf4\x88\x73\x57\ -\xb6\x34\xff\x08\xd9\xae\x57\xcd\x34\x97\xf6\x09\x1a\x48\xbe\xf2\ -\xa2\xac\x41\xc3\xb8\x3e\x20\x4b\x79\x41\x05\xe2\x03\xce\x35\x1e\ -\xd0\xf9\x96\xf4\x81\xe5\x8a\xd7\xe6\x35\xa0\x47\xcf\x8d\xdf\x24\ -\x0e\x48\x69\xe3\xcb\xc9\xcd\xb5\x6a\xe3\x03\xbf\x0e\xe7\x1a\x8b\ -\xe4\x3e\x9f\x4b\xc1\xd4\x3b\x26\x94\x22\xb7\x05\x68\xc6\x8c\x19\ -\x58\xb4\x78\xd1\xb0\x4c\x69\xce\x39\x42\xb2\xac\x6d\xd8\x0b\x34\ -\xca\xcd\xcd\x2d\x58\xb4\x68\x91\xeb\x3e\x3a\x25\xe7\x38\x6a\x6a\ -\x6a\x1d\x9b\x90\xb6\xb6\x36\x1c\xb2\x70\xa1\x65\xf1\xd8\xb4\x79\ -\x13\xde\x79\xfb\x6d\xf3\xba\x70\xc4\x3d\xd1\xc0\x82\x05\x07\x59\ -\x18\xb6\xb3\xa3\x03\x6b\xd6\xac\x31\x13\x2a\x00\xc0\xb4\xb6\x19\ -\x58\xa8\x3f\x5f\x92\x65\x10\x80\xae\xfd\x5d\x78\x6b\xcd\x1a\x5f\ -\xa5\x70\xe9\x92\x25\x81\xfa\xbf\x73\xc7\x4e\xbc\xf3\xce\xdb\x99\ -\x37\x4d\x44\x68\x6e\x6d\xc1\xe2\xc5\x8b\x01\xdb\x31\x3f\x63\x13\ -\x96\xd0\x93\x5d\x84\xc3\x61\xd7\xfb\x73\x41\x65\x65\xa5\x36\x36\ -\x28\x7c\x8a\x6c\xa3\xdd\xf5\x75\xf5\x25\xb6\xca\x08\x14\x02\xdf\ -\x68\x3a\x1d\x5f\x9f\x79\x3a\x64\xfd\x58\x6b\x39\xe2\xc8\xfa\x99\ -\x78\x7c\xe9\x97\xf1\x91\xd7\x6f\xc6\x3b\x83\xdb\xc7\xfc\x98\x46\ -\x58\x04\x77\xcf\xfa\x24\x66\xd7\xb5\xe2\xc6\xf6\x47\x70\xcb\xb6\ -\x27\x31\x90\x1c\xca\xea\x19\x2b\x5a\x8f\xc2\x94\xfa\xf1\xa6\xb0\ -\xdf\xd2\xb5\x0b\xcf\xee\x7d\x37\xe7\xb3\x1d\x61\x8a\x22\xce\x07\ -\x4b\x86\x46\x4c\x92\x71\xf3\xcc\x4b\x31\xbb\x61\x22\x9e\xdc\xff\ -\x2e\x6e\xdf\xf1\x2c\x1e\xdd\xf7\x66\xc1\x9e\xff\xe9\xf1\xcb\xf1\ -\xf5\x29\xa7\x60\x42\x45\x2d\x3a\x87\x06\xf0\xf7\x7d\x2b\x4b\x8e\ -\x4f\x5a\x42\x0d\x90\x62\x9a\xb6\x22\xab\x1c\x5d\xc9\x7e\xec\x8b\ -\x17\x3e\x41\xd1\xb4\xf0\x04\x4c\xad\x68\x84\x2a\x13\x24\x70\xf4\ -\x2a\x83\x78\xb9\x7b\xa3\x10\xbe\x25\x80\x0a\x16\x43\x53\xb8\x1e\ -\x89\x10\x07\x27\x15\x50\x55\x6c\x1f\xea\x2c\xf8\x7b\x2a\x59\x14\ -\x47\x54\x4e\x83\x12\xd2\x36\x90\x32\x07\x5e\xec\xdf\x80\x1e\x97\ -\xe4\x5f\x63\x1d\xb2\x8b\xa9\xaa\x30\x7b\xa7\x12\xb7\x78\x32\xc6\ -\x86\xad\x89\x0e\x6b\x68\x06\x92\x04\xdd\x44\x53\x80\x3d\x3b\x23\ -\x4a\x3b\x43\x6e\xfd\xde\x6c\x93\x9a\x8a\xbd\xb1\xbf\xc1\xaf\x2d\ -\x64\xf6\xc9\x12\x70\x04\xc6\x52\xf7\x52\x9a\x7e\xc1\x83\x76\x2c\ -\x10\x4d\x11\xac\xec\xb2\xee\x1a\x22\x0f\x3a\x87\x4c\x65\x28\x9f\ -\x7a\x3f\xf6\x44\x13\x7c\xf8\x32\x71\x3b\xea\x88\x8c\x12\x3b\x45\ -\xbe\x72\x85\x4a\x53\x3e\x99\x8f\x35\x62\x32\xec\x69\x75\x24\xa6\ -\xcb\x1f\x09\x3f\x9c\x74\x0e\xbe\x30\xf3\xe4\x7c\xf4\xf1\xa2\xc3\ -\xe0\xcf\xd9\x95\x2d\xf8\xd7\xd2\x6b\xf1\x81\x57\x7f\x84\xb7\x06\ -\xb7\xa6\x79\x8c\xac\xb2\x90\x3b\x28\xc5\x6d\xc3\xe2\x11\xf4\x95\ -\xed\xb8\x0d\x97\x87\xc8\xf4\x28\xa8\xb6\xc7\x19\xe3\x4b\x38\xaf\ -\x7e\x09\x8e\x6c\x9a\x03\x00\xf8\x9f\x19\xe7\xe1\x8a\x96\xa3\x71\ -\xed\x86\x3f\xe2\xe1\x8e\x37\x9d\x69\xdd\xec\x75\x46\x64\x4d\x39\ -\x56\x65\xfd\x04\x83\x49\x0e\x66\x63\x12\xdb\xfd\x76\x0b\xbf\xee\ -\x79\xb9\xa4\xfe\x28\xfc\x64\xde\x79\x90\xf4\xe7\xae\xec\xde\x80\ -\x13\x57\xfe\x00\x5c\x0a\xf9\x4c\x0c\x9f\xca\x50\x76\x4f\x84\x67\ -\xfd\x20\x77\x8b\x76\xb3\x5c\x8b\xd9\xb5\xad\xa8\x0c\x45\x71\xda\ -\xf8\x85\x38\x75\xdc\x02\x6c\x1c\xd8\x8e\xe9\xcf\x7d\xdd\xf6\x3c\ -\x9e\xf1\xb9\xa9\x65\x4c\xeb\xef\x31\x35\xb3\xf0\xd3\xe9\x17\x62\ -\x61\xe3\x34\xf3\x31\xdf\x9e\x79\x26\x1e\x78\x5e\x53\xb8\x92\x2c\ -\xe1\x23\x57\xa9\x40\x72\xc5\x8b\x61\xb5\xcf\x32\xc9\x78\x7c\xfe\ -\xb5\x98\xd1\xd8\x6c\xf6\xe7\x57\xed\xcf\xe0\xd3\x1b\x7e\x67\xe3\ -\x33\x77\x86\xe5\xa6\x27\xd0\xbe\xd7\xb0\xc5\x8e\x31\xc2\x55\xad\ -\x27\xe2\xda\x99\x1f\x30\xef\xdd\x36\xd8\x89\xc9\xff\xb9\xd6\xf6\ -\x1e\x9e\xb9\x5f\x3e\xc9\xcd\x4a\x4e\x7c\x51\xb0\xf6\x67\xbd\x3e\ -\x14\x2a\xdb\xa9\x3e\x3e\x67\xd5\x2e\xc5\xaf\x0f\xbe\x1c\xa1\x88\ -\xb6\x15\x1f\x52\x06\x31\xf3\xc9\x2f\x60\x2b\xef\xcf\xfc\x20\x5b\ -\xac\x2a\xb9\x8b\x25\xd3\x33\xb4\x30\x3a\x05\x8f\x2d\xf9\x0a\x28\ -\xcd\xf6\xf6\x5f\x2f\x7f\x1f\x4f\x0e\x6d\xb0\x8d\xbf\x47\x6c\x93\ -\xfd\x7b\xf2\x09\xd2\xb5\x1d\x19\xe0\x66\x8c\xe5\x08\x73\x8c\xc3\ -\x73\x15\x40\x37\x18\x0b\x9a\x1f\x65\x22\x56\x29\xec\xfa\xa8\x40\ -\xd7\x78\xbc\x96\xb9\x2e\x58\xdc\x6d\x8e\xe6\xd0\x60\x9e\x67\xb7\ -\x0a\x5b\x34\x2f\xbf\xb8\x20\xca\xf1\xce\x11\x98\xe0\xbc\x24\x67\ -\x91\x40\x8e\xf8\x4a\xd3\xa9\xf8\xfc\x8c\x0f\x8c\xaa\x3e\xb5\x46\ -\xea\xf1\x8f\x45\x9f\xc5\x44\x79\xdc\x98\x1d\xd7\x09\x54\x8b\xef\ -\xb4\x7d\xd8\xf2\xdd\x9c\xca\x56\x9c\xd1\xb8\x10\x50\xd4\xfc\xa6\ -\x5c\x0e\xe1\x92\x95\xe1\x08\xea\x63\xd5\xa8\x09\x55\xa2\x26\x54\ -\x81\x1a\xb9\xb2\x24\xe6\xf2\x51\x95\x33\x51\x11\x8e\x5a\x3a\xbb\ -\x37\x91\xbf\x97\x64\x49\xed\x01\x38\xb8\x61\x8a\xe5\xbb\x83\x6a\ -\x26\xe3\x82\xe6\x23\x4a\x8b\x51\x24\xab\x40\x97\x1d\x4a\x6a\x81\ -\x20\xbb\x8c\x35\x67\x10\x28\x15\x3e\x70\x8b\x33\x1f\x9e\x53\x03\ -\xf6\xb2\x0e\x2a\x09\x3e\x70\x9d\x32\xe5\xb3\x29\x1b\xde\xfd\xa4\ -\xa1\x71\xc7\x13\xf1\x9c\x96\x8c\x70\x38\xe2\x50\x32\x1c\xce\x0d\ -\xb7\x78\x20\x49\x42\x38\x1c\x71\x66\xa7\xb2\x5d\x6c\x3f\xee\xa5\ -\xe8\x85\x52\x15\xc5\x9a\x65\x4d\xb1\x67\x5d\xe3\x1c\x89\x64\x02\ -\x43\x71\x6b\xbf\x14\x97\x62\xb1\xe9\x0a\x8a\x79\xdc\x2c\x91\xb0\ -\xb4\x6b\x68\x68\x08\xe1\x48\x58\x7f\xaf\x16\xf7\x12\x0d\x85\x91\ -\xd0\xcf\x82\x2b\x8a\x56\x5c\x72\x68\x68\x08\xa1\x70\xd8\xe3\xf8\ -\x1c\xf9\xf6\x2b\x99\x4c\x5a\x2e\x55\x94\x24\xc2\xe1\xb0\xef\x58\ -\xca\x21\xd9\xfd\xd8\x9c\xde\xbe\x94\xe1\xd2\x59\xc8\x21\x91\x8c\ -\x63\x28\x3e\x64\xa1\x83\xeb\x31\x3b\x37\x0e\xb3\x19\x7c\x55\x55\ -\x85\x92\xcc\xa5\x96\x11\x41\x92\x24\x48\x65\x7c\x9c\x2a\xab\x49\ -\x99\xad\xe5\x3f\x5f\x43\x13\x0d\xb3\xae\x67\xf2\x97\x2d\x7d\x97\ -\x61\x75\x90\x80\x8b\x6a\x97\xe1\x7b\xf3\x3f\x32\xaa\x54\x4d\xc3\ -\xf2\x3e\x3d\x36\x1e\xf7\x1e\x7c\x15\xfe\x6b\xe5\x0f\xd1\xcf\x07\ -\xbd\x43\x5f\x1c\xb1\x74\x01\xeb\xc4\xf0\x61\x1e\x3f\x3f\xe3\x0d\ -\xe7\xee\xcd\x0e\x69\x1b\x8c\xef\x1f\xf0\x61\x1c\x50\x3d\xde\x42\ -\x97\xae\x64\x0f\x6e\xdc\xf8\x28\xc0\x42\xe6\x0d\x12\x31\x90\x4c\ -\xba\x24\x52\xa1\x24\xb9\x85\x6f\x5c\x93\x44\xa5\xbd\x3a\x84\x30\ -\x24\x49\x82\xc2\x14\x70\x4a\x42\xd1\xd3\xc5\xf1\x44\x8a\xcf\x00\ -\x40\x92\x59\x1a\x59\x49\x63\x47\x62\x69\x65\xa0\xec\xc1\x45\x7e\ -\x05\x6f\x82\x4d\x68\xaf\xe1\x45\x48\xfb\xe5\xb4\xc6\x83\x1c\x17\ -\xdd\xd7\xf9\x86\x7f\x3d\x27\x64\xe6\x9b\xdb\x76\x3d\x8f\x2b\x5a\ -\x8e\xc3\xdc\xda\xc9\x96\xcb\xbe\x39\xf3\x43\xf8\x6b\xc7\x4b\x48\ -\xda\x63\x9b\xec\x1a\xa7\x7d\xa3\xc8\xb3\x9e\xf8\x99\xdb\xad\xc7\ -\x8e\x70\x02\x28\x2c\x21\xa4\x2b\x43\xda\x3a\x45\xde\xf4\xb7\xaf\ -\xa3\xc6\x73\x8c\x8d\xae\x4a\x80\xc4\x20\x93\x8c\x83\x23\x93\xc0\ -\x79\x12\xaf\x0d\xb5\x6b\xd7\xb1\x54\x96\x3f\x73\x2f\xae\x13\xdf\ -\xdc\x2d\x48\x46\xff\xf5\x7f\x93\xe4\x31\x1f\xc9\xe3\xdf\x1c\xe5\ -\x7b\xb6\xf3\x79\x98\x62\x05\x87\x65\x53\x99\xe9\x3a\xdd\x73\x0b\ -\xc6\x11\x0a\xcb\xa6\x7c\x09\xb1\xb0\xf5\x98\x0d\xf9\xf0\x81\x3e\ -\xbf\x11\xd6\x9f\x97\x04\xc0\x24\x34\x4b\xf5\x38\xac\xa2\x15\x0f\ -\x74\xaf\xd6\xf6\x3f\x21\x6b\xb6\x47\x70\xae\xbb\x44\x8c\x7d\x96\ -\x64\x9b\xa8\x2a\x1c\x1b\x5a\xd7\x01\xc8\x36\xad\xab\x9f\x07\x78\ -\x64\xe5\x7a\x7e\x4a\x51\x79\x2f\xd9\x6e\xab\xb8\xe3\xab\x13\x4f\ -\x3c\x09\x6f\xbf\xf3\x76\xe0\x27\xea\x62\x0c\xd5\x35\x35\x58\xfb\ -\xee\x3b\x39\x4d\x90\x93\x3f\x78\x32\xde\x7d\xe7\x1d\xa2\x80\xfb\ -\xe3\x00\x00\x20\x00\x49\x44\x41\x54\x33\xa0\x3e\x3d\x69\x80\x91\ -\x24\x80\x88\xa1\xae\xae\xce\x71\xef\x75\xd7\x7d\x13\x77\xdc\x79\ -\x87\x76\x1f\x01\x8c\x18\xf6\xee\xd9\xe3\x50\xf6\x2e\xba\xf8\x62\ -\x44\x23\x51\xb3\xdf\x8c\x11\xb6\xb6\xb7\xfb\xce\xdd\xbe\xbe\x7e\ -\x2c\x5a\xbc\x04\xbd\xbd\x3d\xe6\x02\x5f\x51\x51\x89\x75\xef\xbe\ -\x6b\xc6\x69\x32\x22\x6c\xde\xbc\x09\x33\x67\xcd\x41\x32\x99\x30\ -\xe7\xd4\xdc\x39\x73\xf1\xce\x3b\x6f\xe9\xdb\x09\x4a\x1d\x7f\xa3\ -\xf4\x21\x60\xa8\xa9\xae\x76\x0c\xcf\x2f\x7e\x79\x0b\x6e\xbc\xf1\ -\x86\x54\x22\x0b\x0e\x5c\xf5\xc9\x4f\xe2\x9d\x77\xde\xb6\x24\x95\ -\x48\x91\x8a\x83\x88\x81\x31\x86\x09\x13\xc6\xbb\xd0\xf8\x14\xac\ -\x5e\xfd\x66\x6a\xc1\x26\xc2\xf6\xf4\x24\x0b\x00\xe2\x89\x04\x16\ -\x2e\x5c\x64\xa1\x7d\x6d\x6d\x2d\xde\x5c\xf5\x46\x40\xc5\xc8\x8a\ -\x47\x1f\x7d\x0c\x57\x7c\xfc\xe3\x80\xaa\x06\x70\xc3\x91\x99\x92\ -\x16\x44\xf8\xda\x57\xbf\x8a\x4f\x7f\xfa\x53\xc2\x64\x33\x0a\xb1\ -\x30\x32\x15\xb7\x1c\x78\xc9\xa8\xee\xe3\xe1\x75\xd3\xf1\xd3\x59\ -\x17\xe2\x13\xef\xfe\x76\x4c\x8d\xed\xc9\x55\xf3\xf1\xb1\x69\xc7\ -\x39\xe4\xef\xf7\xdf\x7f\x10\x1b\x07\xac\x72\xf9\xc5\x05\x5f\xc3\ -\x84\x8a\x5a\x24\xf5\x4d\xc9\xf2\xd7\x6e\xc2\xfb\xf1\x3d\x19\x8c\ -\x76\xd6\xcf\xdf\x9b\xfc\x11\x7c\x74\xea\x32\xf4\x29\x5a\xac\xd2\ -\x3d\x1d\x2f\xe2\xcb\xed\x7f\x75\xdc\x57\x4d\x91\x92\xb3\x6d\x56\ -\x21\x8a\x13\xc6\xcd\xb5\x2c\x06\x2a\x57\x70\x5f\xe7\xaa\xbc\x9f\ -\xdd\xa7\x0c\xe2\xba\xcd\xf7\xe1\xde\x05\xd7\x58\xbe\x6f\xab\x18\ -\x8f\xcb\x5b\x8f\xc1\x2f\xb6\xff\xb3\xb4\x8c\x42\x05\x1a\x9d\x43\ -\xaa\xda\xf0\xe1\xc6\x45\x38\xab\xe1\x10\xcc\xa9\x69\xc1\xba\xde\ -\xed\x58\xf0\xfa\x77\x90\x64\x4a\x90\xdd\x90\x40\xd1\x76\xa6\x2e\ -\x9e\xa2\x1c\xd9\xa0\x49\xaa\xc7\xf2\xfa\xf9\x38\xbb\x7e\x11\x4e\ -\x68\x98\x83\x48\x48\xc6\x09\xaf\xde\x84\xe7\x07\xdf\x03\xb9\x79\ -\x07\x45\x98\xb0\x2b\x4d\xe4\xc0\x9a\xda\x30\x25\x10\x1f\x19\xc5\ -\x90\x07\x12\x0c\x9d\x9d\xbb\xb1\x73\x47\xf6\x81\xc2\x7d\x7d\x7d\ -\x66\xe2\x01\xc6\xb2\xb3\xf0\x57\x56\x54\x60\xda\xb4\xa9\xd9\xd3\ -\x8b\x31\x74\xed\xdf\x8f\x1d\xdb\xb7\xf9\x8e\x8f\x45\x51\xa2\x80\ -\x74\x22\x2d\x4b\xdb\xae\x9d\x3b\xd1\xdd\xbd\xdf\xdc\xd8\x57\x57\ -\xd7\xa0\xb9\xa5\x05\xb2\x2c\x9b\x0a\x46\x6f\x4f\x0f\xb6\x6f\xd3\ -\xda\x61\xd0\x61\xf2\xe4\xc9\x98\x3a\x75\x9a\xc7\xd1\x3d\x6f\x30\ -\xc6\xd0\xd7\xd3\x8b\x1d\x3b\x76\x58\xbe\x0f\x85\x43\x98\x3a\x2d\ -\xfb\xe7\x01\x40\x67\xc7\xee\xd4\xf3\xb8\xb7\xc5\x71\xc7\x76\xeb\ -\xd8\x0f\x0e\x0c\x78\xa4\x2d\xf7\x36\x6f\x19\x7f\x0d\x0d\x0c\x62\ -\xd7\x8e\xed\x3e\x69\xcf\xdd\x74\x75\x42\x5f\x7f\x7f\x69\x4a\x8b\ -\x12\xb5\x6f\x14\xb4\x5b\x94\xdf\x0a\xe5\x39\xde\x04\x54\xb2\x0a\ -\xdc\x31\xe7\x72\x54\x85\xa3\xa3\x77\x63\xa2\xcf\xcf\x8f\x4d\x3e\ -\x06\x8f\x76\xae\xc1\xdf\xf6\xbc\x6c\x25\x2c\x87\xcf\xc2\x62\x98\ -\x39\xb8\xe7\xa6\xa1\x28\x9b\x16\x47\xd6\x28\xfd\x1f\xdd\x62\x3f\ -\x9e\x55\xe1\xe7\xb3\x2e\x72\xdc\xff\x6a\xcf\x7a\xfc\x6f\xfb\x13\ -\x69\x02\x4e\xfb\x67\x72\xd5\x38\x34\x55\xd6\x43\xd1\xd3\x4c\x45\ -\x49\xce\x7c\xa4\xdb\x76\x16\xbf\x4a\x8e\xa1\x31\x56\x8b\x46\x9d\ -\xde\xe3\xf6\xd5\x83\xc7\x91\x66\x80\xd1\x9e\x5b\x27\x45\xad\xc6\ -\x1f\x25\xa1\x9d\x9e\x32\x8e\x6f\x25\x6d\x9e\x22\xc9\x88\xd5\xd1\ -\x3f\x2b\xcc\x32\xae\xfe\x62\xc0\xe6\x71\x72\x38\xe4\x55\x2c\xab\ -\x9a\x8e\x89\xd5\xd6\x23\x96\x1b\x06\x76\xe2\x9d\x9e\xed\x69\xec\ -\xa0\x5a\xe7\x9f\xac\x58\xf9\x25\x69\xdb\xe4\x49\x8a\xd9\xce\xbf\ -\xee\x59\x89\xff\xec\x5b\x87\x65\x75\x33\x53\xb1\xae\x44\xf8\x52\ -\xdb\x07\x71\xd7\xf6\xe7\xd0\x4d\x7d\x69\x1e\x19\xd5\x36\xef\xd5\ -\x80\x1b\x15\x3f\x8f\x89\x87\x45\xdd\xb4\x26\x72\xf7\x93\x24\xaa\ -\x3d\x06\xc2\xf6\x59\x66\x20\xc6\x50\x27\x57\xe1\x88\x8a\x36\x9c\ -\x54\x77\x20\x3e\x50\x3f\x1f\x73\xea\x5a\x2d\x6f\x9f\x55\x33\x11\ -\xc7\xd6\xcc\xc5\xe3\xf1\x35\x08\x71\xc9\x21\xd2\x22\x72\x05\x00\ -\x60\x62\xa8\x11\x2a\xa9\xe0\x8c\xc3\x30\xcb\x82\x78\xaa\xce\x96\ -\x94\xaa\x23\xc5\x14\x15\xef\x0d\x68\x6b\xa4\x71\x90\xc3\x77\x7d\ -\xe0\x79\xca\xe3\x42\x2f\x47\x9e\xe3\xc8\x83\x6d\x4c\xf3\x5d\x06\ -\x6d\x31\x62\xf6\xed\x8c\x16\xb7\xad\x22\xe5\xc3\x93\xac\x7c\x43\ -\xd0\x8e\x44\x86\x24\x44\x29\x82\xd9\xa1\x66\x9c\x50\x3b\x07\xa7\ -\xd5\x1f\x8c\xc3\xeb\xda\x50\x61\x18\xbf\xf5\xcb\x3f\xd1\x7a\x3c\ -\x9e\xdb\xb6\xc1\xd5\x2e\xcb\x18\x03\x64\x19\x93\x69\x3c\xc2\x72\ -\xd8\x31\xff\x29\xcd\x8a\x4d\x46\x76\x3c\x55\xc1\xfe\x44\x2f\x76\ -\xc7\xbb\xf4\x76\x49\x81\xe8\xe6\x1d\x72\x30\x4c\xd9\x1e\x03\x0f\ -\x87\x73\x40\xc7\x88\xa7\x28\x77\xad\xbd\x38\x3b\xb5\xc0\x3b\xb0\ -\x61\xdd\x1f\x7a\x6d\xf0\x28\xa0\x8c\xc8\x99\x9a\x54\x1a\x14\xe6\ -\x9e\xe9\x5f\x87\x77\x78\xa8\xc4\xea\x59\x15\x95\xc7\x47\x8d\x70\ -\x61\xf8\xca\xc4\x0f\x62\x41\xc3\x01\x79\x3f\xaa\x7d\x68\x0f\xf6\ -\x0c\xf5\xa0\x39\x5c\x83\xe6\x68\x43\x41\x9b\xb9\x71\x60\x37\x7a\ -\x13\xfd\x68\x8d\xd4\xa3\x31\x52\x93\xf3\x73\x18\x31\xfc\x6c\xce\ -\x05\x78\xea\xc5\x77\xb1\x57\xe9\x1e\xf5\xc3\xfb\xe3\x69\xe7\x62\ -\x7a\x6d\xb3\xd5\x58\xa6\x0c\xe0\x33\xef\xfc\x11\x83\x6a\xc2\x7d\ -\xfe\xa4\xed\x8a\x73\x49\x89\xad\x95\x23\xb0\x50\xdd\x71\x4d\x85\ -\x14\x76\xbe\x3b\xc4\x53\xa9\xa9\x8b\xa0\x34\x9f\x33\x7e\xa9\xe3\ -\xeb\xfb\x76\xbf\x0a\x95\x94\xd4\x26\x30\x4f\x5c\xb7\xe9\x7e\x3c\ -\x76\xf0\xe7\x10\xa2\xd4\x16\x67\x4a\x45\x23\x3e\x75\xc0\x89\xb8\ -\x61\xfb\xfd\xe6\xa9\xa1\x52\x32\x32\xf9\x2d\x17\x4b\x62\x6d\x38\ -\x73\xdc\x22\x2c\xab\x9f\x89\x83\x6b\x0e\x40\x5d\xb8\x52\x3f\xed\ -\x47\x2e\xf3\x8f\x70\x55\xeb\x51\x78\x7c\xd3\x1a\x97\x84\x4f\x7a\ -\x90\x7f\xdd\x22\xfc\xdf\xfc\x15\xda\x5e\x58\xf6\xb0\x82\x53\xfa\ -\x46\x1d\x58\xf0\xcc\x57\xb0\x9e\xef\x16\xf2\xbc\x48\xfb\xba\x1a\ -\xaa\xc2\x15\xe3\x8e\xc6\xe1\xf5\x33\x70\x68\x5d\x1b\x26\xc6\xea\ -\x21\x31\xc9\x33\x51\xd4\x19\xcd\x0b\x30\x69\x47\xbd\x2b\x83\x49\ -\xb2\x84\x10\x0b\xe3\xb1\xb9\xd7\x60\x66\x43\x6b\x9a\xf8\xb0\xaa\ -\xeb\x5c\x9f\xb7\x04\x0e\xce\x39\xfe\xb2\xed\x05\x5c\xbc\xee\x57\ -\xa3\x96\xfc\x72\x40\xfd\x6d\xd8\xf6\x4e\xa3\x61\xab\x45\x34\x72\ -\x9d\x4d\x1f\x1f\xcb\xa6\x3d\x4f\x0b\x0b\xb9\x29\x85\x46\x0d\xa0\ -\xb4\x89\x2a\x31\xe6\x98\xc0\x86\x35\xc9\x4c\xd3\x4d\xe4\x16\x3f\ -\x98\x1b\x41\xf5\x3a\x4a\x96\x63\x73\x23\xa4\x40\x12\xbc\x0b\xc5\ -\xfb\x2e\x70\x79\x28\xac\xa5\x39\x27\x0a\xed\x29\x2a\x85\xda\xd5\ -\x59\x74\x9b\x72\xbc\x4f\x9f\x08\x73\xc3\x13\xf1\xb9\xb6\x93\xf2\ -\xe0\x61\x8e\xfd\x89\x3e\x7c\x66\xc3\x9f\x71\x6f\xe7\x6b\x18\x54\ -\x12\xa8\x62\x61\x5c\x36\xee\x08\x5c\x3f\xf3\x4c\x54\xeb\x96\xdf\ -\x5c\xb1\x69\xb0\x03\x9f\x58\x7f\x37\x9e\xda\xb7\x16\x89\xa1\x41\ -\x34\xc4\x6a\x70\x65\xd3\xd1\xb8\xae\xed\x43\x88\x49\x91\x9c\x9e\ -\x39\xa9\xa2\x11\x5f\x9f\x7a\x1a\xbe\xf8\xde\xdd\x69\x59\xd2\x98\ -\x75\x3e\xda\x0c\xed\x3c\x5f\xb6\x2c\x50\xac\x81\xd9\x2c\x47\xf6\ -\x34\xb2\x7e\x94\x18\x56\x34\x1c\x8e\x8b\xa6\x1c\x6d\xb9\x5f\x55\ -\x15\xfc\xa8\xfd\x11\xbc\xd8\xb5\x49\xbb\x47\xdf\x54\x86\x43\x61\ -\xcb\xf3\x8d\x7a\x6a\x50\x55\xff\x76\xa7\xb5\x5d\x91\xb8\x75\x16\ -\xd9\xeb\x3c\xe9\x4a\x4f\x83\x5c\x6d\x11\xa7\x61\x16\xc1\xac\x68\ -\x1b\x62\x92\xb6\xf4\xd7\xb0\x08\x2a\x28\x04\x59\x22\x2d\x4b\xa9\ -\x99\xcd\x8c\x00\x89\x23\xa4\x02\xcf\x76\xbd\x8b\xdd\x83\x7d\x81\ -\xe8\x6a\xf7\xac\xd9\xc9\x5d\x47\x55\x38\x6d\xc2\xc1\xa9\xdb\xf4\ -\x18\xd2\xbf\xee\x79\x0d\x4c\x0a\xe3\xe4\xda\x83\x20\x87\x42\xe0\ -\x2c\xb5\xee\x50\x80\x71\x35\xd6\x2f\xae\x1f\x13\x92\xa4\x30\x3a\ -\x86\xba\x31\x31\x66\x35\x1a\x7c\x7a\xea\x72\xbc\x17\xdf\x87\x01\ -\x1a\x02\x71\x63\xa9\xf1\xce\xac\xc7\xd3\xb2\xb9\x69\x71\xc2\xda\ -\x38\x3d\xd4\xf9\x2a\x00\x20\x99\xf4\xca\xde\x66\x4f\x07\x46\xae\ -\xfc\xee\xb8\x83\x3c\x38\x91\x38\x2e\x69\x3d\x12\x9f\x69\x3b\x29\ -\xc0\x52\xc7\x31\xa0\x0c\x01\xa4\x82\x38\x41\x61\xd6\xd0\x2b\x02\ -\x10\x8f\x72\x30\x06\x44\xc2\x01\x13\x3c\xe8\x31\x27\xc4\x24\x24\ -\x07\x79\x5a\xec\x15\xb7\x29\xf5\xbc\xac\xc4\xbb\xef\xb2\x94\xaf\ -\x47\x2a\x97\xfd\x07\xb9\xbc\x5f\xf7\xd4\xcc\x89\xb6\xe2\xa6\x79\ -\x17\xc2\x91\x8b\xc1\xe5\x84\x83\xc2\x55\xec\x1c\xdc\x8f\xe6\x70\ -\x25\xd4\xa4\x6a\xbb\x46\xdb\x4f\x71\x99\x20\x4b\x21\xf3\xe4\x4f\ -\x90\x6e\xc9\x2c\x92\x8a\x39\x63\xc1\xea\x7b\x15\xcf\xf3\x9f\x99\ -\x11\xc9\x2e\xcf\x21\x3c\x45\x45\x47\x3c\x1e\x47\x6f\x6f\x2f\xcc\ -\x00\x19\x02\x22\x91\x28\x2a\x2b\x2b\x87\x75\x9f\x5a\x51\x59\xa5\ -\xa5\x69\xe5\x1a\x63\x44\x63\x31\xc8\x21\xd9\xf1\xf0\xf4\xba\x47\ -\x04\x42\x5d\x5d\xbd\x55\x69\xd1\xff\xac\xac\xaa\xb2\x7c\x51\x53\ -\x5b\xe7\xfa\xde\x7d\x7b\xf7\xa6\x29\x73\x84\x48\x24\x62\xed\x2b\ -\x11\xc2\xe1\x08\x6a\x6a\x6a\xf4\x79\xa6\x3d\x2f\x16\xab\xc8\x7b\ -\x5a\xe4\x74\x27\xe5\xfa\x86\xdc\x06\xa7\x74\xd7\x10\xe1\x29\xca\ -\x07\xdf\x98\xfa\x21\x54\x86\x22\x39\xdf\x9f\x54\x93\xb8\xf4\xed\ -\x5f\xe1\x81\xce\x37\x00\xce\x40\xa1\x30\x7a\xd5\x38\x6e\xde\xf5\ -\x6f\xec\x48\x76\xe1\xde\x83\xae\xce\xf9\xd9\x3d\xc9\x7e\x9c\xb9\ -\xea\x17\x78\xa3\x67\xb3\xb9\xbb\xde\x1b\xef\xc6\x0d\xdb\x1f\xc2\ -\x00\x4f\xe0\xfa\xe9\x1f\xc9\x59\x31\xba\x72\xf2\xb1\xf8\xc5\xd6\ -\xc7\xf1\xfe\xd0\xae\x51\x39\xae\x73\xc3\x2d\xf8\xd1\xec\x0b\x1d\ -\xdf\xbf\xd8\xb5\x1e\xff\xb3\xc5\x19\xbf\x12\x4f\x0c\x21\xec\xc9\ -\x07\x3c\x4f\x49\xe1\xfc\xae\xce\xa6\x2c\x2f\xad\x9d\x8a\x35\x87\ -\x7e\x43\x53\x08\x40\xae\xc7\x91\xb5\x82\xde\xa9\x59\x7f\xf1\xca\ -\x9f\xe3\xee\xc1\xd7\x0b\x42\xaf\x0f\xd4\xce\xc7\x84\x0a\xeb\xda\ -\xb0\xae\x7f\x1b\x56\x76\x6f\x41\x05\xc5\xf0\x97\x79\x57\x6a\x47\ -\x80\x18\xcf\x49\xe6\x18\x6d\x27\x0f\xd9\xdd\x1a\xad\xc5\x9f\x17\ -\x5c\x91\x97\xa0\x55\xd4\x04\x26\x3e\xf9\x19\xec\x95\xf3\x38\xe6\ -\x4c\x3e\xc6\x40\x3b\x02\x38\xd0\x06\x94\x21\xbc\xdc\xbd\x19\x7f\ -\xd9\xbd\x12\x0f\xec\x79\x1d\x5b\xe3\x7b\xc1\x25\x5e\x30\x23\xa1\ -\xa6\x7c\x8b\x75\xa0\xe8\xcb\xaa\x4f\xd2\xb8\x0d\x03\x1d\xf8\xc7\ -\xee\x37\xf1\xd7\xdd\xaf\x62\x65\xef\xfb\x18\x62\x09\x1c\x1a\x69\ -\xf3\xe4\x81\xac\x92\x11\xd2\xe8\x1f\x0f\xb9\x60\x9b\xb2\x51\x40\ -\xac\xdc\xad\xb8\x14\x8c\x00\x2e\xc4\x7d\xe8\xa1\x87\x70\xf9\xc7\ -\xae\xd0\x19\x54\x53\x17\x2e\xbd\xe4\x12\xfc\xfc\xe7\x3f\xf3\xd5\ -\xac\xf3\xd9\x40\x3f\xf4\xd0\x83\x58\x70\xd0\x02\x73\xdf\x4f\x44\ -\x96\x64\x0e\x04\x42\x6d\x4d\x0d\xd6\xac\x5e\x65\xf1\x7a\x30\xc6\ -\x2c\x99\xd1\x08\x84\x39\x73\xe6\x60\xf3\xa6\x8d\x16\x7a\x18\xc5\ -\x6b\xd3\xdb\xfa\xc0\xfd\x0f\xe2\xd2\x15\x97\x99\xd6\x33\x0e\xe0\ -\x82\xf3\xcf\xc7\x2d\xbf\xfc\xa5\xa5\xce\xd1\xd5\x57\x7f\x12\x97\ -\x5f\x7e\x99\xa9\x24\x12\x08\xb1\x8a\x58\x1e\xc7\xf1\x68\x8c\xf0\ -\x61\x39\x75\x32\xc7\xfa\x33\x41\xe7\x58\xc1\x48\x18\xd0\xe4\xc9\ -\xbd\x7f\x98\x1f\x99\x82\xf3\x26\x1f\x9a\x57\x2b\x5e\xed\x7e\x1f\ -\x0f\x76\xae\x32\xab\xde\xf3\x01\xbd\x18\x68\x88\xe1\xaf\x1d\xaf\ -\xe0\x99\xdd\xef\xe2\x98\x71\x73\x72\xf0\x68\x71\xfc\x63\xf7\x1b\ -\x78\xa3\x7b\xb3\xbe\xe3\x4b\x1b\x97\x24\x70\xcb\xae\x27\x71\x4d\ -\xcb\xf1\x68\xab\x6e\xce\xcd\xf8\x22\x47\xf1\xd9\xc9\x27\xe1\xb3\ -\xef\xdd\x95\x99\xae\xdc\x98\xff\xaa\x85\x9c\x3c\x5b\x8b\x33\xcf\ -\x6e\xd8\x7c\xc7\xdd\x5e\x8f\xc8\xa8\xbb\xc4\x08\x35\xa1\x18\x7e\ -\x3f\xe7\x63\xa8\x8f\x56\x59\xde\xdf\x31\xb4\x0f\x9f\x5c\xff\x7b\ -\xf4\xc5\x07\x9d\x9b\x50\xaf\x64\x5d\x46\x21\x3a\xca\x4d\xda\xdb\ -\x8f\xfa\x1a\xe9\x77\x1b\x42\x95\x0e\xd9\x12\x82\xe4\xdd\x0e\xce\ -\x1d\xf2\x47\x65\x2c\xeb\xac\x74\xf6\xfa\x5c\x46\x76\xbe\x15\xcd\ -\x47\x59\x9e\x4f\x8c\xe1\xee\x5d\x2f\x42\x51\x55\xa8\x32\x01\x12\ -\x69\xf1\x0b\x79\xca\xc0\x4c\x32\x94\x02\x1b\xbb\xdc\x21\x4b\x61\ -\x70\x26\x41\x4b\x2e\xea\xe1\x5a\xe0\xdc\x9d\x5e\x52\x7a\x76\x40\ -\xb2\x88\x41\x4a\xff\x5d\x31\x33\x19\xa5\x6d\x31\x9c\xd9\x61\xb7\ -\xc7\xf7\xe1\xb9\xee\x0d\xf8\xd7\x9e\x77\xf0\xcf\xbd\x6b\xd0\xde\ -\xd7\x61\x6b\xac\xd6\x16\xcb\xe1\x0b\xcd\xca\x82\xcd\xc9\x4e\x3c\ -\xd5\xf9\x96\x26\x46\x8c\x63\x86\xc6\x6b\x25\x86\x7a\x56\x81\x39\ -\xb5\x13\xdd\x99\xb5\xd8\xd9\xdf\x0a\xb5\x4e\x14\xba\xdd\xf6\xba\ -\x52\x5e\x1e\x14\x96\x61\x9d\x62\x69\x59\x08\x4d\x4f\xb5\x76\x43\ -\x52\xb6\xf2\x37\x57\x39\xfa\xd5\x21\xbc\xde\xd7\x8e\xc7\xf7\xad\ -\xc5\x63\x7b\x56\xe3\xb5\x9e\x4d\x18\x52\x6c\xc5\xa2\x65\xa7\x27\ -\x5a\x55\x54\xa8\xc9\x24\x9e\xeb\x79\x17\x1d\x6a\x57\xda\x7e\x93\ -\xd2\x3c\xd9\x0c\xf3\x2a\x26\xa2\x3a\x12\xb3\xca\x32\xce\x33\x2b\ -\xd7\xf6\xb2\x46\xc5\x56\x10\xb2\xd8\x17\x08\x4f\x51\x91\x91\x8c\ -\x27\xd0\xb5\x7f\x7f\x5a\x60\x29\x61\x70\xc0\xbf\xf2\x78\xbe\x2c\ -\x56\x53\x5d\x83\xfa\xfa\x3a\x5f\xa6\xb5\x67\xbd\xf3\x3a\x16\x56\ -\x5f\x5f\xef\xdf\xd7\x44\x1c\xdd\xfb\xf7\xeb\x3c\xaa\xf5\x77\x60\ -\x60\xc0\x71\x5d\x34\x1a\x45\x34\x1a\x1d\xc3\x5c\xc1\x45\x9b\x46\ -\x91\xe9\xe9\xca\x96\xe3\xf2\x7e\xca\xf3\x5d\xef\x81\x33\xd5\x19\ -\xd8\xaa\xe3\x85\xae\x8d\x38\x7a\xdc\x9c\x5c\x22\x53\xf0\xd2\xfe\ -\xf7\x3d\x7f\x1d\xe2\x09\xac\xea\x69\xcf\x59\x29\x22\x22\x5c\xd4\ -\x7a\x38\xbe\xb5\xe9\x3e\xec\x4b\xf6\x8c\x9a\x51\x65\x4c\xc2\x4f\ -\xa6\x9e\x8f\x43\x1a\xad\x16\xd8\xa4\x92\xc4\x37\xdb\xff\x81\xb7\ -\xba\xda\x3d\xef\x8d\x27\x86\x72\x14\xe8\x94\xf5\x7c\x6c\x0e\xd7\ -\xe4\x3f\xf3\x0b\x14\x7f\x34\x27\xdc\x82\x63\xc7\xcd\xb1\xf4\x23\ -\xce\xe3\xf8\xc3\xce\x57\x52\xe6\xea\x72\xb1\x07\xf1\x3c\x1b\xca\ -\xb2\x9e\xa6\x0e\xbc\xd3\xbd\x1d\x87\xbd\xf9\x7d\xf4\xaa\xfd\x5a\ -\x7e\x08\x25\x98\xec\x36\x14\xd6\xe7\xfa\xde\xc7\xf1\xab\xff\x47\ -\x4f\xc3\x9d\xe6\x99\x23\x2d\x8d\xf7\x92\xd0\x74\xbc\x72\xf8\x75\ -\x62\x2d\x18\x4e\x39\xe2\x9e\x01\xc1\x73\x2c\xed\x9e\xba\x7e\x75\ -\x08\x27\xac\xfc\x31\x5e\x19\x5c\xaf\xed\xcd\x14\x68\x49\x19\x98\ -\x3f\x7f\xaa\x7a\xb6\x8c\x8f\x6f\xfc\xbd\x16\xfa\x40\xaa\x95\xd1\ -\x18\x01\x9c\xe1\xbe\xb6\xcf\xe0\x8c\xc9\x0b\xc7\xc6\xf8\xbb\x66\ -\x9f\x1b\xd3\xde\x51\x5e\xa4\x27\x71\xcb\xdf\x14\xd0\xe9\x94\x8f\ -\x31\x4d\x4b\xf5\x4d\x23\x4a\x5b\x62\xcc\x51\xb7\x88\x46\x60\x7e\ -\x09\x8f\x7f\x09\x4f\xb5\x42\x8f\x0d\x8d\xf8\x54\x77\x7f\xa0\xde\ -\x8e\x1a\x54\xe1\x9c\x96\xc5\x79\xcf\xb5\x30\x97\xb5\x8d\xa3\xdd\ -\x28\xa1\x5b\x96\xeb\xa5\x58\xce\xcf\x8e\x91\xec\x4d\x10\x95\x50\ -\x2f\x55\x04\x2e\x23\xe4\x86\xc6\x48\x35\x4e\x6f\x3c\x04\x77\x76\ -\x3c\xed\x59\x8f\xc8\x9e\xbf\xd1\x34\xd2\xa8\x3c\xb7\x3d\x28\xcf\ -\x53\x56\xa8\xee\xf5\x88\xb8\x5e\x17\xe4\x33\xe3\x8f\xc3\x05\x13\ -\x0f\xb7\x58\x6c\x01\xe0\x9e\xce\x97\xf1\xdb\xed\xcf\x39\xb3\x9b\ -\xd9\x5c\x5e\xe4\xf6\x62\x06\x90\x1e\xeb\x43\x8e\x3d\xb4\xa4\xc5\ -\x75\x48\xcc\x95\x7e\xb6\xb0\x68\xf0\xa4\x8a\x46\xb9\x06\x8d\x91\ -\x4a\x27\x61\x78\x90\xe9\x97\xda\x24\x5b\x59\xce\xcf\x63\xea\x95\ -\x9c\x86\xe3\xa3\x4d\x47\x23\x66\xab\xe7\xf7\xc4\xbe\xb7\xf0\x7e\ -\xbf\x16\xb8\x4f\x2a\x03\x41\x4d\x8b\xe4\x09\x3e\xe8\xd6\x3a\x7f\ -\xc3\x27\xf0\x93\xaa\x56\x7b\x8e\x25\xf5\x80\x24\x66\xf3\x78\xdb\ -\x2d\xe8\x4c\xd2\xb2\x85\x19\x01\x4c\xba\x87\x88\x71\x59\xfb\x3b\ -\x8d\x2d\x18\xc9\x40\x28\xa4\xb1\x8c\xf1\x5c\x52\xb5\xbf\x99\xbe\ -\x56\xf2\x94\xb1\x61\x00\x43\xe8\x8d\xeb\xb1\x5e\x46\x96\x40\x23\ -\xae\xd7\x12\xeb\xc1\x1d\x23\xcb\x07\xe3\x69\x1c\x40\xa9\x87\x1b\ -\x31\x56\x32\x21\x11\x51\x8a\x28\xc8\x47\x66\xd9\x49\xd5\x05\x2b\ -\xf0\x51\x05\x93\x1f\xf5\x71\x91\xb5\xf9\x0d\xd2\xc7\x56\x3f\x6d\ -\xc3\xe0\x8c\xe9\xe2\x52\x04\x90\xc2\x9a\x82\x63\x24\x5f\x24\x25\ -\xd5\xee\xb4\xe1\x8c\x90\x84\x9d\x6a\x37\x78\x32\xbd\xbe\x14\xa5\ -\x79\x1a\xbd\xe7\xad\x0a\x40\x1d\xd4\x0d\x34\x92\xac\x5f\xac\x5a\ -\xfb\x12\x62\x50\x6c\x19\x19\x79\xba\x7c\x94\x02\x8a\x85\xa0\x31\ -\x45\x05\x67\x27\x9e\xf5\xf3\x84\xa7\x68\xb8\x36\xe2\xb9\x5e\x99\ -\x6d\xb1\xb8\x9c\xdb\x47\xc5\x91\x46\x45\x50\xc2\x79\x41\xb3\xf4\ -\x09\x2b\x99\x40\x70\x1c\x5b\x33\x07\x13\x62\xb5\x79\x3f\xe7\x94\ -\x09\x0b\xf1\x95\x0d\x7f\x47\x1f\x9c\x9e\xd5\x1a\x1e\xc3\xc9\xe3\ -\x0f\xcc\xf9\xd9\x1f\x9a\xb0\x08\x37\xb5\x3f\xe2\xfa\xdb\x01\xd4\ -\x80\xc5\x75\xd3\xf2\x6e\xff\xb9\x2d\x87\xe2\xce\x8e\x67\x46\xc5\ -\x98\x2e\xaf\x99\x87\x1b\xe6\x9e\x8b\xa8\x6c\xdd\xe0\xbf\xd5\xb7\ -\x15\x5f\xd8\xf4\x17\x24\x13\x89\x8c\x82\xcd\xb3\x08\x75\x9a\x13\ -\x90\xb9\x55\x9b\x97\xd3\x7f\xf7\x89\x63\x24\xa0\x49\xae\x41\x75\ -\x2c\x75\xb4\xaf\x3f\x39\x88\x8f\xbe\xf3\x5b\x74\x26\x7b\x40\x90\ -\x40\xaa\x96\x7e\x99\x31\x8e\xaf\x4e\x38\x0d\xc7\xb6\xcc\x35\xaf\ -\xfd\xe5\x86\x7f\xe3\xef\xdd\xaf\x21\x44\x61\xac\xec\xdf\x98\x37\ -\xcd\x1a\x58\x15\x2e\x6e\x39\xc2\xf1\xfd\xaf\xb6\x3e\xab\x19\xca\ -\x88\xa1\x2f\xd1\x8b\x4f\xad\xbf\x0b\x32\x0b\x81\x19\x91\xe4\x64\ -\xdd\x54\x81\xdb\x54\x68\x4a\xed\xfd\x98\x5e\xaf\x0e\x00\x92\xd0\ -\xd3\x4a\x73\xcb\xdd\xa9\x47\x70\xeb\xb7\x6e\xb5\x32\x79\xda\xd1\ -\x72\xd2\x9f\x2f\x71\x6d\x73\xdb\x25\xc5\x11\x45\x18\x83\xc8\x5c\ -\xa0\xfb\xdf\xf3\xbe\x8c\x96\x8a\x3a\x28\x52\x4a\x99\x01\x80\x10\ -\x08\xd3\x2b\x27\x58\xae\x3d\xaf\x69\x09\x0e\xaf\xd3\x3c\x8f\x8c\ -\x31\x10\x27\x48\x9c\xe3\xf7\x3b\x9e\xc1\x0d\x9d\x8f\xba\x2c\x9d\ -\xc3\x18\xb7\xaa\xf2\xa2\xad\xd7\xa3\x0d\x5f\x6a\x3a\x05\x97\x4e\ -\x3d\xca\xa2\xac\x32\x9d\x17\xc6\x49\x95\xd6\xe3\xa4\x60\x78\x6c\ -\xe1\xb5\x88\xeb\xe9\x11\x19\x69\x85\x1a\xbb\x93\x3d\x38\x7e\xd5\ -\x0f\x20\x3b\x82\xcb\x82\xf1\x00\x65\xb4\x00\x65\x7b\xe3\xe8\xde\ -\x03\x15\x3e\xfb\x1c\x2f\xe3\xc9\x93\xc7\x58\x33\xc6\x0a\xf6\xde\ -\xbe\xbe\x5e\x6c\xdd\xba\x35\x75\xba\xd3\x92\x53\x9f\x83\x73\x40\ -\xe5\x2a\x54\xce\x31\x7e\x42\x93\xc7\x03\xc9\x14\xe8\x7b\xf7\xee\ -\x45\x22\x11\xcf\x52\x91\xd0\xfe\xdd\xa9\xd7\xf7\x51\xd4\xa4\x45\ -\xa8\x1b\x8a\x86\xf1\x79\xe2\xc4\x49\xbe\xcf\x8c\x44\x22\x98\xd0\ -\xd4\x6c\xde\xcf\x18\x43\x7d\x7d\x83\xa3\xe5\x7d\x3d\xbd\xe8\xea\ -\xda\x6f\x0b\xf8\xa5\xb4\xc5\xcd\xa8\xea\x6a\x90\x25\x2d\x9f\xbe\ -\x5e\x28\xd6\x4c\xc2\xc4\x55\x44\xa2\x31\x93\x4e\x06\x29\x3b\x3a\ -\x76\x95\x2c\x2f\x95\xbb\x9a\x9f\xcd\xe3\x8a\x96\xa4\x28\xf0\x8b\ -\x73\x8c\x7d\xd2\x5d\xa0\x27\x37\xcc\x2f\x88\xa7\x72\x5a\x6c\x02\ -\x7e\x30\xf3\x1c\x7c\x76\xdd\x1f\xa1\x48\x8a\x9e\x06\x08\x08\x53\ -\x08\x37\x4f\xbe\x00\x07\x54\x8d\xcb\x99\x0e\x47\x37\xcc\xc2\xb5\ -\x07\x9c\x8a\x1f\xb5\xff\x13\x3c\xac\x5b\x87\x25\x8e\x4a\x16\xc3\ -\x2f\xa7\x5f\x84\xaa\x70\x2c\xef\x3e\x2c\xab\x6d\x43\x9d\x54\x85\ -\xfd\xc9\x5e\x0b\x21\xc9\x61\xba\x25\xd7\x75\x7b\xc4\xf8\xc3\x23\ -\x11\x19\xd7\x3d\x34\xf3\xa2\x13\x71\xd7\xfc\x4f\x20\x66\x4b\x96\ -\xb0\x2f\xd1\x8b\x2b\x36\xfc\x0e\xbb\x7b\xf6\x6b\x9d\x31\x62\x43\ -\xb8\x61\x09\x56\x2c\xb2\xd9\xc1\x48\xac\x12\xc4\xa2\x00\x18\x64\ -\x25\xe2\xa8\x77\x27\x51\x05\x48\xae\x00\x64\x02\x71\x09\x11\x5b\ -\x51\x56\x47\xa5\x34\x22\x4c\x0d\x8f\xb3\xc8\xe9\x5d\xf1\x2e\xfc\ -\x65\xe7\x0b\x7a\xb3\xac\xef\x3f\xa7\xf6\x70\x1c\x93\x26\x38\x5f\ -\xec\xdb\x80\xc7\x7b\xd7\x00\x89\x90\xc7\x3c\x70\xcf\xb6\xc6\x4d\ -\xcf\x98\x55\xd1\xbb\xa8\xf1\x70\x34\xd9\x12\x2c\x6c\x1d\xea\xc4\ -\x63\x7b\xde\xd2\x8f\xe9\x68\x37\xdc\xb1\xed\x79\xeb\xf3\x65\x5b\ -\xac\x8e\x17\x23\x9a\x8e\x39\xf2\x68\x9f\x07\xec\x3a\x8d\xdd\x70\ -\x9f\x20\xeb\xf7\xbe\x59\xc9\x8c\xeb\x25\x84\xe3\x11\xcc\xad\x69\ -\x45\x4b\x55\xbd\x83\x8f\xdd\x7a\x51\x17\xae\x40\x5d\xb8\xc2\xc6\ -\xf8\x1c\xad\x7b\x1b\x00\x46\x60\x60\x8e\x0c\x62\xa6\x27\x40\x71\ -\xd1\x12\x01\x8d\x5f\x6c\x2f\xa6\xf4\xec\x66\x06\x1f\x18\x74\x08\ -\xa7\x9e\x4d\x2c\xc8\x91\x15\x0a\x28\x17\xb9\x3b\xdd\x82\xc6\x26\ -\x51\x8e\xfb\x4b\xcf\x90\x97\xa0\x75\x89\x78\xc0\x65\xd1\x23\xa5\ -\x79\x58\x42\x73\xb4\x0e\xf3\x6b\x26\xba\x5e\xe6\xb8\x8b\x08\xf3\ -\xaa\x9b\x1d\xcd\xd9\x33\xd8\x0d\x96\x0c\x81\x71\x2b\x0f\x10\x91\ -\x96\x5e\xde\x3e\xee\xaa\xdd\xd0\xe2\xd1\x0f\x26\x5b\xfb\x69\x5c\ -\x16\x4e\xc9\x11\x89\x1c\x65\xd2\x32\xd4\x31\x75\xa7\xab\xf3\xa4\ -\x84\xea\xfa\xa0\x82\xcb\x7b\xca\x7e\x87\x31\x76\x3d\x45\x6e\x59\ -\x77\x4a\xa4\x69\x77\xdf\xfd\x47\xfc\xf1\x4f\x7f\xc9\xbc\x99\x24\ -\x86\x1f\xfe\xf0\x07\xd8\xb1\x7d\x9b\x25\x49\x81\xfd\x3a\x45\x51\ -\xb1\xfc\xc4\x93\xf0\xd4\xd3\x4f\x66\xdd\xdb\xee\x9e\x6e\xcc\x9d\ -\x7f\x20\x7a\x7a\xba\x6d\xd6\xba\x94\xd2\xc5\x09\x68\x6b\x9b\x8e\ -\xf7\xd6\xad\xf5\x7d\xde\x07\x3f\x78\xb2\xde\xde\x4c\x52\x8d\xe3\ -\xe7\x37\xdf\x8c\xeb\xae\xbb\x2e\xf5\xce\x20\x03\x63\xaf\x84\xa7\ -\x7f\x66\x8c\xe1\xd9\x67\x9e\xc6\xa1\x87\x1d\x66\x2e\x06\xc9\x44\ -\x02\x73\xe7\xcd\xc3\xfb\xef\xbf\x5f\x7c\xe5\xa0\xe4\xdf\x3b\x36\ -\xac\x43\xc3\x85\x63\xc6\xcd\x2e\xd8\xf9\xcd\xab\x27\x9f\x80\x69\ -\xd1\x09\xb8\x6d\xc7\xb3\x68\x8f\xef\xc3\x8c\xc8\x04\x7c\xba\xe5\ -\x58\x1c\x3d\x6e\x66\xde\xcf\xbe\x71\xd6\xd9\x58\x58\x3d\x05\x77\ -\xee\x7a\x01\xbb\x92\xdd\x58\x10\x9d\x84\x6b\x27\x9e\x88\x05\xf5\ -\x93\x0b\xd2\xf6\xda\x50\x05\x16\x46\x5a\xf0\x54\x72\x7d\xd9\x8e\ -\xe5\xe4\xd0\x38\xfc\x6d\xfe\x55\xae\x9e\xbf\x2f\x6c\xba\x07\x2f\ -\x75\xae\xb7\x84\x8a\x7c\x7c\xfc\x91\x78\xa5\x6f\x2b\x5e\xef\x4b\ -\xc5\x17\x85\x8d\xe3\x63\x36\x96\x78\x60\xe1\xa7\x31\x84\x84\xb9\ -\x97\x9f\x54\x65\x35\x16\x7d\x76\xfa\x09\x38\x7f\xca\x52\xd3\x3b\ -\x30\x25\x52\xef\x2b\x23\xe6\xc4\x5a\x2c\x9f\x77\xc5\xbd\xeb\x45\ -\x55\xb8\x65\x17\x54\x0a\xc3\xb7\x55\x52\x05\x3e\x73\xc0\x89\xb0\ -\x47\xfb\xbf\xda\xb5\x09\xfd\xca\xd0\xa8\x9d\xfb\xaa\x7e\xd4\x32\ -\xaf\x63\xee\x20\x4f\x09\xcc\xb3\x78\x4a\xd6\x08\x41\xa0\x50\x2b\ -\x67\xa8\x70\xb5\x58\x48\x65\xb9\x8d\xad\x5b\xed\xc3\x20\x0c\xc4\ -\xc6\xd8\x60\xb9\x66\x9f\xe3\x59\x5a\x5a\xfc\x34\xed\xe1\xb9\x2d\ -\xab\x17\xd0\xb0\x6f\xf2\x38\x54\xbd\xce\x44\x5e\x1e\xa3\xf4\x27\ -\xaa\x8a\x8f\x81\x46\x05\x23\x6b\x26\x38\x57\x9e\xce\xb1\x39\x9a\ -\x02\xc1\xc1\x55\x15\xaa\x92\xcc\x4c\xc1\x00\xc7\xd3\xd2\x2b\x8b\ -\xfb\x8d\x17\x03\xa0\x2a\x4a\x41\xc6\x49\xd5\xef\x37\x8f\x9b\x10\ -\x10\x0a\x87\xf3\x7a\x2c\x65\xf8\xcc\x39\xcf\x9b\xa1\x39\x1f\x6e\ -\x7e\x2d\xa1\x05\xa3\x1c\xa4\x64\x36\x2d\xa5\xd4\x59\xee\x26\x6a\ -\xc4\xd4\x58\x43\x41\x64\x9b\x31\x6f\x4e\x99\x70\x10\x4e\x99\x70\ -\x50\xc1\x7b\x29\x11\xc3\x45\xad\x87\xe1\xa2\xd6\xc3\x72\x62\x58\ -\x0e\x60\x88\xc7\xb1\x37\xd9\x87\xad\x83\xfb\xb0\x65\x68\x2f\xf6\ -\x28\xbd\xd8\x37\xa8\x1b\x54\x92\x0a\x7a\x69\x00\xf6\xac\x6e\x9e\ -\x8e\x07\xd3\xf3\x60\x78\x94\xec\x31\x34\x3e\xe9\xa3\x0a\xa4\x88\ -\x72\x7d\x57\x20\x41\xc6\x1d\x73\x2f\xc3\xac\xda\x56\x58\xe3\x6d\ -\x38\x7e\xd4\xfe\x18\xee\xdc\xf2\x2c\x00\x82\xaa\x77\x64\x4e\xac\ -\x15\x37\xcd\xb8\x10\xe1\x88\x84\x5b\xb7\x3e\x8d\x1b\x37\x3f\x8a\ -\x5d\xc9\xfd\x88\x2b\x49\x84\xe5\x98\x43\x3e\xcc\xf0\xf1\xf4\x4d\ -\x88\x55\x61\x02\xaa\x32\xec\x5d\xf4\x0c\x71\x2c\x95\xb0\xe7\xa0\ -\xaa\xc9\x16\x79\xbb\x79\xa0\x33\x95\x34\x21\x6e\x25\x7c\xb5\x4d\ -\x29\x8a\xab\x09\x3d\xa6\x81\x07\x62\x7f\x72\xd4\x25\x4a\x59\x9a\ -\x2f\x69\x3c\x1c\x33\x6a\x5b\x1c\xc3\xdb\x9b\x18\x48\xbb\x83\xb9\ -\x0b\x3f\xa3\x9d\x76\x8f\x86\xdd\xc5\x68\x14\x1f\x4d\x72\xeb\xe7\ -\x84\xfe\xd9\xb0\x7c\xc7\xed\xf2\xd9\xd6\xbf\xb8\xcd\xf3\x21\xd9\ -\x14\x44\x35\x98\x87\x81\x54\x06\x05\x43\x50\x48\x49\xf3\xd6\xe9\ -\xb5\x94\x00\xc4\xb5\xd4\x75\x08\xcb\x21\xf7\xc5\x37\x8d\x9e\xc9\ -\x78\x12\x50\x38\x14\xdb\x20\x34\x87\x1b\x70\xed\xa4\x8f\x00\x4c\ -\x4d\x95\x01\xd3\x67\x06\xa9\x0a\x9e\xee\x7a\x0b\x2f\x0d\x6e\xd4\ -\xeb\x0d\xa6\x9a\xc9\x40\xa0\xb0\x8c\x26\xd4\xe2\xd2\x26\xed\x58\ -\x57\x52\x6f\x06\x31\x6d\x24\x24\x95\xa1\x2d\x34\x3e\x7b\xf1\xe8\ -\x39\x2d\x3d\xb2\x17\xe6\x5a\x5f\x91\x17\x48\xae\x5b\x93\xbb\xb9\ -\x3c\xdf\x47\xfe\x73\x9f\x06\xa9\xc6\xdc\x48\xc5\xd4\xf0\xec\x5a\ -\x08\xce\x39\x54\x95\x43\x1d\xe4\x50\xa3\xd6\xf8\x1e\x46\x12\xae\ -\x69\x59\x8e\x5d\xd4\x6d\x86\xa1\xa5\xdf\xbb\x73\x60\x17\xee\xdc\ -\xf3\x9c\x93\xfe\x9c\x23\x1c\x0e\x03\x32\xc7\x79\x35\xcb\x30\xb5\ -\x62\xbc\xae\xc8\x6b\x35\xa8\x88\x38\x24\x30\x84\x95\x10\x0e\xaa\ -\x9e\xe4\xf4\xe0\x30\x29\x4b\x39\x1a\x6c\x5b\x54\xf8\x50\x5f\x11\ -\x53\x14\x9c\xd0\xdc\x7b\xe3\x51\x94\x7d\x57\x0e\xdc\xc0\x02\xb4\ -\x97\x0f\x0f\xf5\xfc\x8c\x10\x25\xb6\xad\xa5\xc2\x8e\x55\x8e\x96\ -\x99\xf2\xd6\x1e\xc4\x61\xf2\x6c\xe9\x35\x25\xd4\x88\xaa\x48\x6c\ -\xd4\xf6\xb0\x3b\xd9\x8f\x37\x7a\xdb\xf1\x44\xf7\x5a\xbc\xdc\xbd\ -\x11\x6b\x06\xb7\x62\x57\x7c\x1f\xe2\x3c\x81\xb4\x5d\xa0\xc6\xbc\ -\x2a\x37\xd3\x89\x97\x23\x14\x70\xdc\xbb\x7b\x25\x8e\x68\x9c\x89\ -\x28\x4b\x29\x10\xff\xdc\xfb\x26\xfe\x7b\xc3\xdf\x1d\xd7\x7f\xa1\ -\xe5\x44\x54\x45\x63\x20\x22\x7c\x72\xd2\xb1\xb8\xa8\xf9\x50\x2c\ -\x7f\xfd\x26\xac\xea\xdb\x0e\xf0\x61\x8a\xe8\x54\xb9\xa9\x5b\x30\ -\x48\x38\xb0\x7a\xa2\x65\x73\xb0\xa6\x77\xab\xe7\xad\x35\x72\xd4\ -\xb2\x0c\xf5\xaa\xf1\x82\x34\xa9\x92\xc5\xf0\xc5\x29\x27\xbb\xfe\ -\x96\xe4\xea\xa8\x97\x02\x8f\xed\x7d\x03\x13\x7a\xea\x10\x92\xb4\ -\x73\x69\x61\xfd\xb8\x52\x84\x49\x38\xb4\xc6\x9a\xb9\x70\xf7\x60\ -\x17\xde\xec\xdb\xa6\x0f\x25\x07\x53\x55\x84\x48\xc6\xfa\xf8\x6e\ -\x57\xf9\x3f\x31\x56\x87\x9b\x66\x9e\x61\xdb\x03\xa6\x2e\xfc\xee\ -\x5a\xe0\xa5\xc1\xcd\xae\x92\x9c\x24\x09\xf3\xa4\x49\xf8\xde\x9c\ -\x33\x53\xd3\x54\x64\x24\x1a\x96\x39\xb9\xb2\xff\x3d\x3c\xb0\xab\ -\x01\x0c\x12\xc2\x3a\x1f\x30\x62\x90\x25\xc2\x14\xb9\x11\xd3\xaa\ -\xad\xb1\x65\xff\xd9\xb3\x0e\x3d\xc9\x01\x7d\x83\xae\x4d\xe8\x2e\ -\x3e\x00\x45\xe6\xa6\xd1\x25\x1d\x5f\x9c\x7e\x82\x63\xef\xca\xf5\ -\xc0\xb9\x35\xfb\x37\xe1\xce\x3d\xcf\xc3\xab\xda\x2b\xc9\x12\x3e\ -\x3b\xf9\x04\x1c\x3e\x6e\x26\x28\x55\xcd\x78\xec\xee\x05\x5c\xb3\ -\xcf\x8d\x36\x8b\x74\x16\xe3\x17\xe8\x0c\xad\x97\x82\x92\xa3\x4b\ -\x26\x1f\x39\x14\xb4\xb9\x3c\x00\x5d\xdc\x3c\x5d\x41\x13\x14\x10\ -\x00\x45\xf7\xec\xf8\x79\xae\x02\xc9\x11\x55\x1d\x36\x1e\x48\x24\ -\x12\x23\xc7\x78\x39\x28\xbb\xe4\xa1\x9c\x8b\xc3\x6b\x65\x22\x68\ -\xd2\x2c\xd0\x2d\xa1\x3a\x47\xec\x5d\x59\xaf\x17\x9c\xa3\x5f\x1d\ -\xc0\x13\xfb\xd7\xe2\x4f\xbb\x5f\xc5\xe3\xdd\x6f\x63\x57\x62\x7f\ -\x2a\xa6\x4f\x65\x88\x20\x82\x26\x56\x8f\x71\x14\x43\xa3\x5c\x85\ -\xba\x50\x25\x6a\x43\x51\xa8\xe0\xe8\x4a\x0e\xa0\xbb\xa2\x1f\x1d\ -\x89\x5e\xec\x49\xf6\xa1\x3b\xd9\x8f\x21\xc4\x01\xae\xea\x8e\x23\ -\x6e\xba\xb6\x29\xa1\x67\x85\x32\x2c\xe6\x0e\x53\xa5\xcf\x89\x06\ -\x87\x85\x30\x18\xfd\x9d\x47\xe7\x0d\x8b\x3d\xc7\x2d\x3b\x9e\x41\ -\xa7\x32\x80\xdb\xe7\x5e\x8a\x2a\xb9\x02\xab\x7b\x37\xe3\xa2\xb7\ -\x7f\x83\xa1\x64\x3c\x55\x52\x81\x01\x87\xc4\xa6\xe0\x82\xd6\xc3\ -\xf4\x0c\x9f\x40\x54\x8a\xa0\x5f\x19\xc4\x8e\x81\xfd\x00\x27\xc4\ -\x93\x03\x50\x90\x80\xca\x95\xdc\x0c\x36\x2e\x46\x77\x52\x93\x7a\ -\x5a\x31\xed\xab\x5a\x54\x60\x56\x55\xb3\xa5\x5f\xab\xfa\xb6\xa6\ -\xd5\x07\xb3\xf2\x6b\x83\xad\xc8\x6b\x9f\x12\x0f\x24\x74\x1c\xe4\ -\xe7\x56\xcf\xcd\x8a\x71\xcb\x30\xad\xba\xc9\x7b\x88\xcc\x52\x14\ -\xee\x85\x5b\x08\x84\xc5\xb1\x29\x66\xf1\x6e\x92\xac\x1e\x25\x4a\ -\x2f\xe3\xc3\x53\x49\xb7\x48\xe7\x23\x6e\x10\x25\x4b\x8f\x44\x2a\ -\x79\x5b\x12\x6f\xf4\x6f\x41\x97\xbe\x49\x35\xdb\xe9\x70\x71\x5a\ -\xff\xe5\x7a\x0c\xee\xc7\xd7\xdd\x65\xfd\x5d\x8f\x35\x93\x99\x8c\ -\xd5\x07\x7f\x0f\xb3\xeb\x52\x1e\xb4\x7b\x77\xaf\xc2\xa7\x36\xde\ -\xae\x6b\xe1\xb6\xfd\x84\x1c\xb0\x0b\x69\xb1\x48\x09\xae\xfd\xeb\ -\xb6\x9c\x72\xc6\x90\x80\x96\x86\x59\xcb\x64\x2b\x0d\x93\xd0\x28\ -\x93\x8d\xb5\xef\x5e\x87\xb2\xed\xa0\x69\x4e\xb9\x7b\xd7\x4b\xb8\ -\xbb\xe3\x25\x73\x1c\xd3\x9f\xb7\xa2\xe6\x58\xfc\x66\xe1\xe5\xe6\ -\xfa\xa0\xa8\x0a\xce\x7f\xeb\x16\x6c\xe5\x9d\xba\xe5\x20\x2d\xbd\ -\x5b\x08\x50\x98\x9a\x85\x8c\x20\xcd\xf0\xc0\x09\x9c\x73\x6b\x79\ -\x29\x23\xfb\x30\x23\xf4\xb3\x01\x80\x78\xe0\xbc\x8d\x9a\x9d\x4b\ -\x81\xad\x43\x36\x3a\x71\xf7\x65\x31\x20\x95\x47\x28\xdf\x98\x2b\ -\x46\xbf\xa7\x28\x0b\xa2\x4d\x9f\x3e\x43\xdf\xdc\xdb\xea\x41\x90\ -\x21\x9e\xd3\x1e\x99\xb6\xd9\xa9\xab\xad\x1b\xf6\xc1\x1a\x3f\x61\ -\x02\x9a\x9b\x5b\xf4\x75\x97\x20\x49\x12\xe2\x43\x83\x58\xb9\xf2\ -\xd5\x34\xe5\x85\xd0\xd6\xd6\x86\x86\x86\x86\x00\x13\xde\xc9\xa6\ -\x6f\xbf\xf5\x36\x86\xe2\x43\xa6\x70\xed\xeb\xed\xc3\xec\x39\xb3\ -\x31\x34\x34\x64\xf6\x5f\x51\x92\x58\xb3\x66\x8d\xe5\xbe\xc1\xc1\ -\x41\xbc\xfe\xfa\x6b\xda\x24\xd3\x67\x56\x45\x45\x25\xe6\xce\x9d\ -\xeb\xdb\xaf\xce\xce\x3d\xd8\xbc\x69\xa3\x99\x62\x9c\x73\xad\x76\ -\xd1\x41\x0b\x16\xd8\x82\x87\xb9\xcf\x5a\xa0\xdd\xfc\xfe\xc6\xf7\ -\xd1\xd3\xd3\x63\xd9\xc8\xad\x5b\xb7\x16\xa1\x90\x6c\x3e\x45\x51\ -\x54\xc4\xe3\xf1\x61\x65\xbb\xda\xda\x5a\xad\x38\x2e\x0c\x97\xb9\ -\x1e\x87\x45\x4e\xd1\x63\x58\x75\x34\xa5\x54\x42\x73\x73\x73\x79\ -\x4f\x24\x01\x80\x34\xeb\xfb\x68\xc1\x8e\xc1\x3d\xf8\xbf\x9d\xcf\ -\xe0\xb7\xbb\x9f\xc7\xa6\x84\xbe\x60\x73\x09\xe3\x78\x03\x0e\x8b\ -\x4e\xc3\x91\x35\x33\xb0\xb8\x7a\x32\x66\x56\x8e\xc7\xf8\x68\x35\ -\x62\x2c\xa4\x67\x50\x23\x8b\xa2\xa8\x95\xd2\x50\xd0\xa7\xc6\xd1\ -\x31\xd4\x8d\xb5\x7d\x1d\x78\xb5\x6f\x0b\x9e\xd9\xb7\x1e\xaf\xf7\ -\x6d\x46\x57\xb2\xbb\xa4\xe9\x70\xcf\x9e\x95\xd8\xbb\xaa\x0f\xd7\ -\xcf\x3a\x15\x17\xad\xbe\x03\x7b\x06\xbb\x6d\x86\x2a\x19\x5f\x3f\ -\xe0\x54\x54\x86\xad\x1e\xc2\x5b\xb7\x3e\x85\x8e\x78\x8f\x9e\xfa\ -\x16\x38\xe5\xcd\x9f\x83\x31\x49\x37\x82\x30\x70\x70\x9b\x11\x2a\ -\x5d\xe9\x23\x73\x83\x4f\x69\xc7\xd2\x08\x40\x44\xdf\x3c\xef\x4c\ -\x76\xa5\x25\x25\x00\x16\xc4\x26\x5a\xbc\x94\x49\x9e\xc0\xdb\xbd\ -\xdb\x5c\xfb\x14\x95\x22\x8e\x22\xaf\xdd\x7c\x20\xef\xec\xd6\xf5\ -\xac\x0a\x5f\x99\x7a\x8a\xa7\x41\x20\x88\x44\x89\x50\x0c\xf7\x2d\ -\xf8\x0c\x5a\xab\x1a\x9c\x05\x2f\x5d\xce\xe4\x70\x5b\xbc\x6b\x10\ -\x91\xe6\xde\x3c\x23\xb1\x0f\xc7\xf9\xaf\xfd\x2f\xee\xe9\x7a\xad\ -\xe0\x06\x06\xa7\x95\xd3\x67\x8d\xcb\x4a\x06\x1b\x99\x86\x3c\x7e\ -\x52\x54\x0c\x84\x07\x73\x11\x6b\x02\x05\x44\x92\x94\xec\x66\x45\ -\x2e\xde\x55\x35\xed\xd1\xe9\x73\x45\x55\xc1\x95\x5c\xd6\xf5\x51\ -\xbc\x17\xa0\x42\xd6\x29\xa2\x11\xbd\x2d\xcb\x17\xf8\xbf\x85\x88\ -\x70\xcf\x3d\x7f\x76\xe1\x41\x5b\x5d\x1d\xc3\x02\x15\x38\x2b\x49\ -\x61\xf8\xeb\xe3\x57\x5c\x81\xef\x7c\xe7\x3b\x69\x0b\x0c\xc7\x35\ -\xd7\x7c\x06\xd7\x2e\x59\xaa\xb7\x4b\xb3\x28\xfc\xfe\xae\xbb\x70\ -\xe1\x85\x17\x64\x4d\xa6\xa1\x78\x1c\xa7\x9c\x76\x3a\xda\xb7\x6c\ -\xd4\x2d\x72\x12\x62\xd1\x18\xb6\x6d\x6d\x47\x4d\x4d\x8d\xf9\xde\ -\x3d\xbb\x77\xa3\xb9\xa5\x15\x4a\x5a\xcc\x53\x7b\x7b\x3b\x0e\x3d\ -\xec\x70\x4b\xc7\x97\x2e\x59\x82\x17\x5f\x7c\xc1\xd7\x42\xfe\xf7\ -\xbf\xff\x1d\x9f\xbc\xea\x2a\x33\x6e\x89\x24\x09\x9f\xff\xdc\xe7\ -\xf0\xc6\xeb\xaf\xe9\x4a\x82\x46\x6f\x2f\xef\x11\xb3\x8d\xc7\x29\ -\x1f\x3c\x15\x8f\x3e\xf6\x88\x45\xe3\xb8\xec\xb2\x15\xe6\xb8\x79\ -\x8d\x6b\xbe\xea\x82\xbd\x9f\x27\x9e\x78\x02\x56\xad\x7a\xc3\x56\ -\x3f\x03\x19\xb2\xef\x8c\xad\xe5\xc6\x88\x11\xe1\x54\xe6\x02\x96\ -\x7b\x2c\x40\x8c\x40\xb2\x5c\xb6\x1e\xa2\x84\x1e\xf3\xd0\xa5\xf4\ -\xe1\xc7\xdb\x1f\xc3\xad\x1d\xcf\x60\x9f\xd2\x07\x40\x42\xbd\x52\ -\x8b\x0f\x55\x2f\xc0\xb9\x13\x16\x63\x59\xfd\x74\xd4\xc7\xaa\x02\ -\x0b\x63\xad\x1c\x0f\x43\x1d\x0b\xa1\x4e\xae\xc4\xac\xca\x16\x7c\ -\x08\x07\x03\xd3\x80\x8e\x78\x37\x9e\xd8\xbb\x16\xf7\x76\xac\xc4\ -\x63\xfb\x56\xa3\x37\xd9\x6f\x7a\x88\x48\x51\x6d\x1b\x62\xaf\xac\ -\x80\xe4\x3e\xdf\x28\xe0\xa9\x76\xfb\x6d\x86\x0e\xa2\x7b\xc2\x39\ -\xe7\x78\x7c\xdf\x5b\x38\xec\xc5\xd5\xd6\x0b\x75\xcf\xc8\x89\x55\ -\x73\xf0\xa1\xe6\x45\x96\x47\xee\x49\x74\xe1\xe7\x5b\xfe\xa5\xbd\ -\x3b\xa9\x3d\xe7\xf5\x9e\x2d\x3a\x9f\xa8\xee\x9b\x58\xc9\x43\x01\ -\x30\xfe\x55\x6d\xf5\x8a\x54\xeb\x05\xc7\xd5\xcc\xb1\xc6\x13\x0d\ -\xee\x41\xfb\xd0\x3e\xd7\x2e\x57\xf0\x30\x6a\x43\x56\x25\xae\x4b\ -\x19\x74\xa7\xaf\x69\x00\xf6\xb3\xe9\x12\xbe\xd0\x72\x12\x26\x55\ -\x8f\xcb\x72\x89\xb4\x3e\x4f\x95\x19\xb8\x44\x29\x0f\x11\xf9\x3d\ -\x20\x65\xac\x24\x7f\x76\xf4\xbf\x80\x73\x24\x89\x60\xe6\xd4\x06\ -\xf7\xf8\xd7\xc6\x30\x66\x9d\x2d\xfb\xb8\xe9\x5f\x84\x18\x1c\x1e\ -\x2c\x45\x05\x86\x3c\x18\x11\xd6\x7a\x43\x1c\xc0\xfa\xee\x1d\xb8\ -\x68\xed\xaf\x4c\x63\x1a\x54\x0e\x95\xab\x60\xaa\x76\x62\x63\x63\ -\x7c\xb7\x51\x90\xd0\x96\xe3\x82\x03\xc9\x24\x56\x26\x37\x62\xf1\ -\x4b\xdf\xd5\xef\x27\x8d\x66\xfa\x85\x72\x88\x61\x81\x3c\x09\xb7\ -\xcd\xbf\x2c\xb7\xed\xb0\xbd\x6e\x53\xc9\xcb\x71\x9b\x86\x6c\x97\ -\x1b\x41\x3d\xd4\x0e\x31\x64\xe3\x03\x43\x8e\x85\xbc\xe7\x0f\x4b\ -\x26\x80\x84\x8d\xdf\xd3\x3e\x52\x9a\x76\xa3\xaa\x2a\x2e\x5b\xfd\ -\x1b\xbc\x9b\xd4\x0c\x1e\xa4\x1a\x31\x98\xda\x73\xe3\xa4\x00\x12\ -\x81\xbb\xc4\xd6\x2b\x8a\x02\x24\x54\x7c\x7c\xed\x5d\xa8\x91\x34\ -\xa3\x88\x24\x31\x10\x91\x19\x9a\x21\x33\x86\x1f\x4f\x3c\x0f\x87\ -\x8d\x9f\x9e\x9a\x12\x41\x18\xc1\x77\x6e\x31\xd7\xfe\xf3\xac\xb3\ -\xbc\xfa\x31\xa6\xc8\x3e\x17\x5c\xf3\xa0\x92\x68\x45\xf0\x4d\xa4\ -\xbd\xd8\x21\xb1\xac\x78\x26\x50\xfb\x6c\xc9\x1d\x54\xc3\x1b\xc6\ -\x52\x45\x23\x55\x1e\xb4\xaf\xb9\xe5\xcf\xe7\x8a\x52\x76\xdc\x35\ -\x22\xfb\x5e\x61\xa2\x2b\x3f\x93\x53\x99\xe3\x0f\x9d\xff\xc1\x75\ -\x5b\xef\xc7\xd6\xc4\x3e\x80\x33\xb4\xa1\x15\xd7\x4c\x38\x1e\x17\ -\xb5\x1e\x8a\x71\xb1\x1a\x5b\xb9\x80\xfc\x31\x21\x5c\x83\xf3\x9b\ -\x97\xe2\xbc\xa6\x25\x68\x1f\xdc\x8b\xdf\x6c\x7b\x16\xb7\xed\x7c\ -\x0e\x3b\xe3\x7b\xcb\x82\x5e\x15\x88\xe2\x86\xb6\xb3\x10\x92\x64\ -\xcb\x2a\x7f\x4b\xfb\xe3\xd8\x35\xd4\x33\xa2\x6d\x59\xde\x38\xcf\ -\xf2\x79\x5d\x7f\x07\xe2\x6e\x35\x75\x88\xa3\x8e\xc5\x50\x19\x4b\ -\x1d\x9f\xeb\x49\xf4\xa2\x47\x1d\xca\x8b\x87\xdb\x42\x4d\xf8\xec\ -\xb4\xe5\x85\x11\x9c\x45\x34\x9c\x0c\xef\x2c\xb6\x6f\x08\x79\x56\ -\xbb\x87\x2e\xb5\x1f\xaf\xf6\xaf\xd7\xf5\x25\xc9\xba\xf9\x36\xe8\ -\x2b\x39\x4f\x59\xa4\x5f\xf2\x46\xff\x66\xad\x40\x6c\xfa\xbb\xf5\ -\x42\xc2\x83\xb1\x64\x61\x37\x31\x02\x2e\xac\xed\xc2\x61\x19\x5d\ -\x9c\xf6\x42\xbc\x2a\x9e\x1b\x78\x0f\x9b\x87\xb6\x69\x96\x14\x4e\ -\xa9\x4d\x1a\x4f\x77\x7b\xb8\x14\x6f\xd5\xaf\xdb\x38\xb8\x1b\xa0\ -\xdd\x36\xc5\x5b\x3b\x5a\x07\x46\xd8\x11\xef\x1a\x53\x63\x32\x66\ -\x53\x72\x33\xd2\xce\x59\xfa\x59\x72\xc9\x23\x56\xc8\xf7\xbe\x6c\ -\x76\xca\x01\x04\x0d\x63\x64\x89\xd7\xe1\x7a\x66\x38\xbb\x42\xc3\ -\x18\x39\x1e\xe9\xd6\x16\x72\x29\x1a\x4b\x36\xe5\x24\xfd\xbc\x36\ -\xf7\xc9\xf7\xee\xf0\xa8\x05\xec\xba\xaa\xaa\x50\xd3\x95\x31\xd2\ -\x32\x61\xd9\x63\xb4\xfc\x62\xb6\xfc\xe8\x9d\x9b\x67\x88\x07\xec\ -\x07\x79\x56\x6c\x26\xbb\xe5\x30\xcb\x55\xd6\x54\x4c\xcb\x56\x53\ -\xe4\x05\x37\x10\x14\xdd\x42\x11\x70\x1b\x95\xe0\xe5\xa7\xe0\x83\ -\x73\x6c\xee\xdf\x85\x2b\x37\xfe\x1e\x8f\x77\xbd\x87\x24\x4b\x60\ -\x12\x9f\x80\xaf\x36\x9f\x8c\xcb\x26\x1d\x81\xca\x70\x74\x04\x58\ -\x87\x30\x39\xda\x80\x6f\x4e\x3f\x03\xd7\x1c\x70\x02\x6e\xdd\xfa\ -\x0c\x7e\xdc\xfe\x6f\xec\x55\x7a\xcd\xe3\x23\xa4\xcf\x67\x5e\x68\ -\x8f\x91\x07\xdb\x9a\xf2\xcf\x90\x23\x76\x93\x26\x27\x7c\xba\xf9\ -\x58\x1c\xd2\x68\x2d\x74\xbb\x3d\xbe\x17\x3f\xdb\xf2\x6f\xf3\xb3\ -\xc4\xb4\x40\x6b\x45\x52\xd3\x4e\x05\xa7\xbd\x4c\x4a\x6f\x27\x79\ -\xcb\x54\x29\x15\x3b\xc2\xb9\x9a\x7a\x06\x03\x5a\xa5\x06\x2c\xaa\ -\x9f\x6a\x91\x89\x11\x48\xa9\xc0\x1b\x20\x55\xcf\x07\x40\x4b\xd4\ -\x9a\x62\xbc\x57\x19\x44\x9f\x3a\xe4\x9e\xc6\xd7\xcb\x53\x67\xfc\ -\xae\x2b\x84\x37\xb5\x9d\x8d\x98\x1c\xc9\x43\xed\xe0\xe6\xba\xb6\ -\x2b\xb9\x07\xd1\xb8\x9c\x26\x5f\xbd\xef\x49\xc9\x61\x96\x95\xdc\ -\xe4\x1e\xdf\x30\x62\x18\xb2\xd4\xf8\xe3\xb9\xc9\x41\x87\xc7\x4f\ -\xb5\x1e\x67\x32\x9c\x46\xf6\xba\x43\x69\x3d\xb0\xaf\x80\x0c\x00\ -\xe2\xb6\x18\x27\xcb\x99\x40\xae\xf1\x09\xb9\xd0\xc9\x34\x3e\xea\ -\xf4\xe4\x3c\xed\xa1\xfa\x7d\x9c\x3b\x63\x85\xc9\x87\x70\x9c\xdb\ -\xe6\x47\x96\x90\xb8\xb5\xff\x12\xb2\xfb\x0c\xaf\xef\x7d\xe6\x7b\ -\xca\x95\x97\xb9\x7f\xe4\xc7\xc7\x7e\x45\x6f\xad\x59\x12\x3d\x8f\ -\x44\x1a\xc7\xea\x0c\x65\x57\x49\x2b\xbb\xc2\x6d\x63\xa9\x42\x8f\ -\x41\xe3\x69\xfd\xd5\x15\x9c\x24\x19\x02\xc0\xc9\x03\x04\xdb\xf5\ -\x76\x39\xc9\x81\x88\xac\xed\x83\x02\x67\x9f\x73\xcf\xce\x18\xb8\ -\x9c\x55\x09\x6c\x74\xc6\x80\x52\x44\x5e\x6b\x7f\xd9\xed\xbb\xec\ -\xcb\x24\xe7\x14\xc8\xf8\xe6\x66\x81\x0a\x72\x1d\xe5\xc1\xb8\x59\ -\x79\x4f\x1c\x82\xa7\xdc\xcc\x51\xc3\xdf\x5e\x2e\x2c\x74\x65\x87\ -\x5e\x3e\x58\x76\x6d\x7e\xa4\xf3\x75\x5c\xbe\xf1\x2e\xec\x49\x68\ -\x81\xe5\xd7\x54\x9f\x88\x6f\x4e\x3f\x0d\x0d\xd1\x2a\x50\x11\x56\ -\xac\x86\x50\x35\xbe\x36\xed\x54\x5c\x95\x70\x81\x4a\x00\x00\x20\ -\x00\x49\x44\x41\x54\xda\x7a\x04\xbe\xb2\xee\xef\xb8\x7b\xf7\xf3\ -\x25\x49\xb7\x19\xe1\xf1\xf8\xea\x8c\x0f\x39\xbe\xff\xee\xc6\x7f\ -\xa0\x33\xde\x63\xd9\xd2\x3e\x38\xe7\x6a\xd4\x45\xab\xb5\x79\x2d\ -\x4b\xae\xe6\x2a\x22\x8f\xf9\xaf\xef\x75\x75\x63\x3e\x88\xab\x78\ -\x64\xf7\xeb\xf8\xc6\xe6\x7f\x18\xd6\x3e\x7c\xb0\xf6\x20\xc4\x22\ -\x56\xe5\x75\x4e\x45\x33\x2a\x10\x41\x3f\x06\x1d\xef\x9b\x1a\xb6\ -\x1e\x71\xdb\x9b\xe8\x45\xff\x50\xee\xbc\x7b\x5a\xdd\xc1\x38\xbd\ -\x65\x51\xc1\x68\x7b\xc4\xab\x3f\x06\x8b\x28\x46\x66\x06\x17\xb1\ -\xcb\x2d\xca\x1e\x91\xbe\x09\xe3\x19\x76\xf0\xe4\xb2\xb0\xda\x15\ -\x3c\xae\x3d\x28\xae\x2a\xc3\xb2\x5b\x23\xca\x7d\x1d\xa1\x7c\xde\ -\x13\x74\x71\x1e\x6b\x35\x6a\x4a\x64\x77\x9a\xf1\x94\x0d\x51\x4e\ -\x43\x49\xb2\x9b\x61\x9c\xe5\xc2\xa4\xa3\x1e\x72\xd6\x1a\xaf\xdf\ -\xbe\xb0\x4c\x68\xf8\xd2\xcb\x2f\x21\x91\x4c\xa6\x8d\x7d\xb6\xd9\ -\x45\x52\xaa\xaf\xa5\xc0\x9a\xbe\x7a\x6d\x6b\x6f\xcf\x39\xd5\x76\ -\xeb\xc4\x89\x98\x37\x6f\xbe\xbe\xc6\x69\xcf\x96\x88\xe1\xd1\x47\ -\x1e\xd6\x5c\x9e\x7a\x42\x83\x58\x2c\x86\xe5\xcb\x4f\x02\x00\x84\ -\xf4\x7a\x07\xbb\x77\xed\xc2\xc3\x0f\x3f\xac\xb5\x83\x34\x2b\xd0\ -\x94\x29\x53\x1c\xd7\xad\x7e\xf3\x4d\x6c\xdd\xb6\x4d\xbf\x8e\x41\ -\x51\x14\x2c\x5e\xb2\x04\x73\xe7\xcf\xd3\xdf\x47\x08\x87\x22\x78\ -\xfa\xa9\xa7\x20\x87\x52\x45\x0c\xfa\x7b\xfb\x70\xe2\x89\xcb\x2d\ -\xc3\xdd\xdf\xd7\x87\x67\x9f\x7b\xd6\x97\x3d\x76\xed\xda\x85\x95\ -\xaf\xbe\x6a\xf9\xbe\x73\x77\x27\x96\x2f\x4f\x1d\xb3\x90\x25\x19\ -\xd1\x50\x18\x0f\x3d\xf4\xa0\x85\xce\x73\xe6\xce\x45\x5b\x5b\x9b\ -\x65\x97\xb0\x6a\xd5\x2a\x6c\xdb\xbe\x3d\xb5\x57\xe0\x40\x53\x53\ -\x13\x96\x2f\x3f\xc9\x1c\x4f\x46\x84\xe7\x5f\x78\x01\xdd\xdd\x56\ -\x17\xf0\x91\x47\x1e\x85\x8a\x8a\x8a\xd4\xb8\x73\x8e\x27\x9e\x7c\ -\x12\xc9\x64\x22\xeb\x65\x6a\xdf\xfe\xfd\x78\xe8\xa1\x87\xf4\xcd\ -\x0a\xa5\x27\x00\xca\xbc\xea\xda\x78\xc9\xad\xa8\x2d\xd7\x2d\xe3\ -\xdb\xb7\x6f\xcb\x4e\x78\x96\xfc\x6a\x30\x5a\xb5\xbc\xd4\xcc\xd8\ -\xa5\xec\x07\x57\x8d\x23\xa8\x54\xd2\xcd\x55\xb9\x8a\x9f\x6c\x79\ -\x04\x5f\xdb\xae\x6d\xae\x9b\x51\x87\xdb\xdb\x2e\xc3\xf2\xe6\xf9\ -\x25\xb1\x36\x4e\x8e\x36\xe2\x0f\x0b\xae\xc0\x19\x3b\x0e\xc6\x95\ -\xef\xdc\x85\xfd\xd4\xa7\xff\xa2\x58\x27\x9b\x9f\xc7\x28\xe0\x82\ -\xe5\x70\x74\x72\xf7\x18\x12\x16\xd2\x94\x9a\x9f\x4d\x3f\x1f\x35\ -\xe1\x94\x3c\xe1\x9c\xe3\xed\xee\x76\xdc\xba\xe5\x69\x6d\x77\x69\ -\x8c\x7f\x48\xc2\xd2\xc6\xe9\x68\xac\xa8\xc9\xdc\x3c\x0a\xd6\x5c\ -\xce\x81\x0d\xbd\xdb\xd2\x96\x23\x19\x67\x35\x2d\x71\xf4\xa7\x25\ -\x5a\x8f\xb9\xb1\x56\xac\xec\xdd\xe0\x78\xcf\xac\x88\x35\x3b\xdc\ -\xf6\xa1\x2e\x7f\xee\xb6\x59\x69\xb8\x6e\x39\xae\x97\xaa\xf0\x93\ -\x59\xe7\x43\xb6\x65\x21\xf5\xcc\xc2\xe8\x23\x07\x12\x8a\x9e\xf5\ -\xad\xdf\xb6\x63\x21\xeb\xf0\x3b\x06\x8e\x15\x48\xbe\x28\x76\x8f\ -\x63\xb6\x75\xb0\x6c\x7c\xc9\x32\x04\x45\x11\x52\x85\x05\x0d\xfd\ -\x8f\xa5\xde\xc7\x1d\x9e\x43\x06\x84\x24\x2b\x1d\x78\x5a\xec\x9d\ -\xa4\x1d\x9f\x93\x6c\x47\xed\x89\x24\x90\x24\x21\x49\x6a\x4a\x71\ -\xe4\x69\xe9\xf3\xf5\x63\x77\x8c\xc8\x3f\x9b\x2c\xd9\xde\x6b\x8b\ -\xbd\x09\xf1\x30\xaa\x59\x25\x54\xc9\x48\xdc\x47\xee\xca\x29\x77\ -\xd9\x99\xa6\x7f\x67\x6f\x86\xdf\xe7\xf4\xef\xdd\x0a\xbb\x1b\xf1\ -\x8d\xfa\x38\xaa\x49\x55\xab\x55\x44\x2c\xa5\x7c\x73\xe3\x3a\x2d\ -\xce\x46\xe3\xd5\x24\xf6\x25\xba\x53\x19\xfd\x38\xcf\x6e\xff\x6c\ -\x0b\x56\x74\xa4\xd2\x06\x07\x8f\x84\x80\x01\x19\x96\x8d\x8d\x9c\ -\x56\xcf\x8b\x5c\x78\x48\x62\x9a\xf7\x57\xe2\x56\xeb\x39\xd3\xbe\ -\x73\x9e\xb4\x21\x30\x48\x5a\x91\x5e\x4e\xb6\x63\x97\xfa\x03\x24\ -\xed\x5d\x21\xb7\x50\x0d\xee\xe5\x02\x72\xcf\x3e\x37\xec\xcb\x6d\ -\xae\xd6\x03\x17\x39\x5b\x54\x4f\xd1\x88\xad\xb3\x2e\x66\xf6\x6f\ -\x7e\xeb\xdb\x96\x6c\x69\xb9\xe8\x81\xd9\x76\x8a\x02\x8e\xe9\x29\ -\x1f\xfc\x20\x6e\xbd\xed\x36\x33\x58\x94\x83\xe3\xbb\xdf\xfa\x36\ -\x4e\x3d\xed\x43\x16\x25\xee\xa6\xff\xb9\x09\x37\xfd\xe8\xa6\xb4\ -\xe6\x73\x5c\x70\xfe\x85\xf8\xcc\xe7\xbf\x90\x5a\xb4\x19\xc3\xfd\ -\xf7\x3f\x80\x93\x3f\x70\x92\x39\x99\x38\x57\x71\xc8\xc2\xc5\x58\ -\xf3\xd6\x6a\xf3\xba\x70\x38\x82\xd5\x6f\xae\x42\xdb\xf4\xe9\x66\ -\xcd\x82\x9e\xae\x2e\x4c\x99\xda\xa6\x29\x14\xfa\x4b\x6a\x6a\x6a\ -\xd1\xb1\x6b\x27\xe4\xb4\x20\xf2\x77\xdf\x79\x07\xf3\xe6\xcf\xf7\ -\x25\xcd\xf3\xff\x79\x01\xe7\x9c\x7b\x8e\x5e\xec\x51\xeb\xf9\x25\ -\x97\x5c\x82\x47\x1e\x79\x58\xdf\x34\x6a\xfd\xbd\xf1\x86\x1b\x71\ -\xfa\x19\x1f\xd6\xe5\x92\x36\x40\x37\x5c\x7f\x3d\xbe\xfc\xe5\x2f\ -\x59\x04\xc2\x8f\x7e\xfc\x13\xdc\xfd\x87\x3f\x58\x84\xcc\xdf\xfe\ -\x76\x2f\x4e\x3b\xed\x34\x4d\x90\xe9\xf4\x3d\x74\xc9\x52\xac\x7c\ -\x6d\xa5\xa5\x2d\xb7\xdf\x7e\x3b\x66\xcc\x9c\x61\x0a\xc5\xc1\x81\ -\x01\xb4\xb4\xb4\xa2\xab\xbb\x2b\xeb\x59\xb8\x76\xed\x5a\x9c\x7e\ -\xfa\x19\x85\xe3\x21\x9b\xf0\xd6\x5c\xe4\xa3\xbf\xa6\xc7\x68\xb3\ -\x01\x6e\x1a\xda\x8b\xbe\xe4\x20\x2a\xcb\x20\x0b\xdd\x37\x37\xfe\ -\x0d\xdf\xdf\xf1\x08\x42\x4c\xc2\xe1\xa1\x59\xf8\xe3\xdc\x2b\xd0\ -\x52\x59\x5b\x72\xed\x3c\xa7\x65\x09\x0e\xae\x99\x84\xb3\x5f\xbb\ -\x0d\x6b\x86\xda\x4b\xa2\x4d\x97\x35\x1c\x81\x93\x5b\x16\x3a\xbe\ -\x6f\x1f\xdc\x3b\xec\x06\x01\xfb\x9a\x32\x51\x6a\xc0\x71\xe3\x9d\ -\x59\x3f\x19\x31\x1c\x5f\x37\xdb\x45\x29\x22\xcc\xac\xb0\x2a\x45\ -\xef\x0f\xee\xc9\xb9\x3d\x37\x4c\xfd\x08\xda\x6c\x75\x57\x00\xe0\ -\x8e\x9d\x2f\x60\x45\xf3\x11\xc5\x59\xff\x4b\x52\x3c\x64\x3e\xe5\ -\x51\x21\x57\xe2\xc2\x86\xc5\x98\x56\xd1\x80\xaf\x6f\xfe\xbb\x65\ -\xff\x69\x20\x26\x45\x31\x2f\x36\x13\x24\xe9\x75\xc0\xc0\xb5\xe3\ -\x58\x94\x7a\x96\xac\x84\x30\x39\xd4\x68\xb9\x2f\x2c\x85\x30\x4b\ -\xaf\x91\x44\xdc\x38\xc2\x65\x4d\x71\x1e\x22\x8e\x85\xa1\xb6\xbc\ -\xbb\xf9\xf1\xe6\xe3\xf0\xf3\x03\x2f\x44\x90\x10\x68\xee\xa5\xbf\ -\x20\xf8\xbd\xc8\xca\xf4\x61\x55\xd8\x5d\x95\x76\x07\x54\x2c\x7f\ -\xf1\x46\x3c\xd1\xf7\x5e\x81\xd8\x80\x32\xf2\xc5\xe1\xd5\xb3\x71\ -\x65\xeb\x32\x7c\xbf\xfd\x01\xbc\x37\xb4\x3b\x2d\x8c\x21\xa5\xda\ -\x1c\x18\x99\x86\xea\x88\xe6\x79\xa6\xf4\x7d\x42\x1a\x1f\x1c\x14\ -\x9a\xea\x20\xc2\xb4\xe8\x64\xcc\xd5\xab\x23\x4b\x26\x0f\x18\x46\ -\x3c\xed\x9a\x88\x12\xc5\x84\x50\x8d\x2f\xef\x8e\x26\x04\x57\x8a\ -\x02\x6b\x64\x85\xd4\x30\x0a\xa3\x4a\xba\xc6\x05\x71\xee\x3c\x8f\ -\x3e\x12\x9a\x6b\xc0\x89\xc2\xd2\x2c\x09\x04\x82\xaa\xa6\xbc\x06\ -\x5a\xf3\x09\x12\x49\x29\x0b\x00\xd7\xd2\xb5\xaa\x8a\xa2\x6d\xa0\ -\x29\x95\x9d\x44\x62\xb6\x18\x1d\x92\x52\xd7\xa5\x09\x06\xc6\x24\ -\xdb\x75\x0c\x9c\xab\xda\x7b\x79\xba\x31\xcb\xf6\xbc\x20\x85\x90\ -\xa0\x47\xde\x18\xb1\x00\xc6\xe4\xe3\x5a\xdc\x16\x4b\xb3\xb0\x72\ -\xcb\x75\x69\x66\x33\xb2\xe6\x3c\xd2\xe8\xa2\x38\xe8\xcf\x28\x65\ -\x4d\x21\x3d\x0d\xb0\xdb\x02\x94\x6b\x6d\x29\xd7\x61\x1f\x0e\xa5\ -\x85\xfb\x4c\xb8\x52\x74\xb6\x64\x7b\x78\xd8\xaf\xe2\x34\xf7\xb3\ -\x50\x66\xb9\x7b\xf4\x7b\x5e\xae\xbb\x52\xee\x5c\x30\x3a\xe2\xfb\ -\xb0\x79\x60\x37\xe6\xd7\x1c\x50\xb2\x0b\x80\xca\x55\x7c\x63\xc3\ -\x5f\xf1\xfd\x8e\x47\x00\x02\x3e\x1c\x5b\x82\xdf\xcc\xbf\x0c\x95\ -\xe1\x48\x49\xb6\x97\x40\x98\x5d\xd9\x82\x67\x0e\xff\x12\xce\x5a\ -\x79\x2b\x9e\xec\x79\x4b\xff\xc1\x66\xa9\xf6\xe2\xab\x2c\x4f\x34\ -\x98\x6b\x84\xbd\xbe\x8f\xac\xc9\x8e\xb6\xd0\x78\xfc\x68\xee\x05\ -\xae\xb2\x24\xc9\x95\xb4\x14\xba\x7a\x8c\x8b\xc2\xc1\x8c\xf3\xfa\ -\x96\xa2\x21\x3e\x42\x20\xc3\x49\x06\x45\x51\x4d\x4b\xf9\xa5\xe3\ -\x8e\x40\x34\x14\x76\x15\x78\x27\x8f\x5b\x80\x1f\x6d\x7d\x4c\xef\ -\x86\x1e\x33\x03\x19\x33\xab\xac\x4a\xcc\xfa\xbe\x1d\x2e\x74\x33\ -\xb2\x5a\xa9\xb6\xb7\x9b\xd5\x62\x71\x7a\xed\x22\x7c\x62\xea\x71\ -\x0e\xfa\x3d\xba\xff\x2d\xdc\xd1\xf1\x02\x2e\x9c\xb0\x14\x11\x29\ -\x94\xdb\xfc\x22\x73\x4f\xea\xfe\xbd\xfe\x87\xac\xc7\x34\x25\x95\ -\x44\x56\xb2\x55\x92\xf5\x58\x2f\xe3\xa4\x00\xc1\x7d\xdc\xfd\x62\ -\x89\x1d\x9e\x7e\x6e\xdf\x53\xeb\xfc\x43\x96\x61\xd7\xe2\x89\x42\ -\x68\x8a\x4d\xc0\x15\x8d\x47\xe2\xca\x96\x63\x30\xa9\xb2\x0e\xed\ -\x7d\xbb\xf0\xf5\xcd\xf7\xe9\x31\x1c\x56\x1e\x9b\x5b\xdd\x82\x35\ -\x87\x7e\xd5\xba\xb9\xe6\xdc\x26\x8e\x9c\xed\x1d\x17\xa9\xc2\x5b\ -\x4b\xff\xdb\xd2\x3e\x0a\xb8\xe1\xa5\xf4\x9d\x76\x26\xb9\xaf\x1f\ -\x0b\x25\x22\x30\xc6\x4a\x76\x1f\x6d\x8f\x2b\xf7\x55\x8a\x38\x03\ -\x31\xd9\xa9\xa1\xfa\xae\x63\x3c\x90\x72\xcc\x01\x44\xa8\x0a\xa7\ -\x4d\x98\x89\x6b\x5b\x96\xe3\x98\xf1\x33\x00\x00\x7f\xdb\xfd\x2a\ -\xde\x4b\x74\x82\x74\xf5\xc5\x64\x4f\x62\x78\x70\xf1\x95\x2e\xdb\ -\x70\xb2\x8e\x2f\x39\xbd\x92\xff\xb7\xe0\x7c\xe7\xef\x01\xf8\x87\ -\x40\x29\x8f\x26\x15\xc8\x33\x54\xe0\x6c\xcd\x39\xbf\x88\x48\xd4\ -\x29\x2a\xb6\x75\xc8\x1c\x27\x1e\x40\x28\x39\xcc\x21\x3c\x50\x7f\ -\x19\x0b\xe6\xa3\x72\x99\x37\xc1\xfa\x40\xf9\xb1\xa2\xf3\xc8\x33\ -\xf3\xb7\xa8\x78\xf5\x21\x70\x6a\x84\xa0\x5b\xb0\x2c\xc6\x51\x40\ -\xc0\x86\x67\xbb\xde\xc3\xfc\x9a\xc9\x28\x55\xbb\xf8\xff\x6e\x7e\ -\x0c\xd7\xef\x78\x14\x90\x80\xf3\x63\x87\xe3\xd7\xf3\x2f\x43\x45\ -\x28\x52\xf2\x74\xad\x0f\x55\xe2\xaf\x8b\x3f\x89\x73\x5e\xbb\x0d\ -\x8f\x77\xaf\x29\x5a\x3b\x7e\x3b\xfb\x72\xd4\x45\x2a\x3d\x14\x4e\ -\xa7\x7c\x52\xd4\x04\xbe\xb3\xe5\x1f\xa8\x90\xaa\x74\x09\x13\x2c\ -\x21\x00\x79\x6c\xb4\x98\x0a\xbc\xde\xa7\x95\x51\x88\xf2\x28\x3e\ -\x31\xf9\x68\xcf\xa7\x2d\xa9\x9d\x82\x46\xa9\x16\x7b\x94\x94\x37\ -\xbc\x52\x8d\x60\x66\x55\xb3\x45\xa6\xae\xed\xdf\x91\x35\x1d\x0e\ -\x08\x35\xe1\x97\x73\x2f\x76\x7c\xdf\xa3\x0c\xe0\x4b\xef\xfd\x15\ -\x95\x6a\x48\x84\xa8\x58\x06\xd4\x49\x8d\x33\x1b\x0f\xc6\x85\x13\ -\x96\xa2\x2e\x14\x33\x97\xb6\xfa\x68\x35\xc2\x72\x04\x71\x24\xc0\ -\xa9\xf8\x14\xa4\x2c\x47\x51\x91\x46\xe1\xd0\x15\xb0\xd0\xad\x7d\ -\x6f\x26\x41\xc2\x93\x0b\x3f\x8f\x49\x15\xf5\x69\xf5\x0d\x81\x89\ -\xd1\x71\x40\x2f\x0b\x9c\x75\x78\xcc\xec\xa9\x87\xa1\x6f\x32\x91\ -\xea\x6a\x40\xcb\xbb\xdf\x5e\x69\x05\x19\xa5\x59\x1c\x46\x26\x14\ -\x89\x18\x4b\x55\x06\x1d\x79\x29\x92\xda\x60\xbb\x69\xdd\x4c\xf3\ -\x04\xa5\xd7\x6b\x21\x3f\xc5\x48\x7f\x6e\x7a\x1e\x1e\xd5\xb1\x61\ -\x37\xce\x96\x6a\xef\x4d\xd7\xff\x79\x7a\x95\xeb\xb4\xc0\x5d\xb2\ -\x69\xfd\xdc\x25\x6a\x85\x19\xb7\xa4\x9d\xad\xe6\x01\xf2\x74\x73\ -\xa3\x6d\x76\xc3\x82\xeb\x31\x02\x7b\xcf\x74\xe5\x84\x5b\xdb\xc3\ -\x3c\x14\xb4\xf4\x67\x6a\x21\x53\x29\xda\xb3\xb4\x2c\x3a\x64\x7f\ -\xa7\x2d\x53\x10\x11\x21\x64\xb3\x98\x9b\x6d\xa3\x11\x14\x0e\x1e\ -\xef\x1a\x89\x38\x15\xf2\xe2\x49\xbb\xa0\x60\x19\x18\x35\xc8\x0b\ -\x78\xf6\xc2\xab\xa0\xd7\xfb\x35\x37\x5b\x4b\x96\x3e\xbf\x1e\xde\ -\xf7\x26\xae\x9c\x7c\x5c\x51\x92\x14\x64\x6c\x26\xe7\x78\x7c\xcf\ -\x9b\xf8\xf2\xe6\xbf\x21\x04\x86\xe3\xa3\xf3\x70\xfb\x81\x97\xa1\ -\x22\x5c\xfa\x0a\x51\xba\x62\x74\xcf\xa2\x2b\x71\xf2\x2b\x3f\xc5\ -\xcb\x03\xeb\xed\x82\xd0\x2e\x68\xb2\x62\x1c\xc7\x52\x61\xac\x67\ -\xc6\x9c\x63\x0c\x37\x4e\x3a\x0b\x47\x35\xcd\xc9\x8a\xbf\x39\x29\ -\xf8\xe9\x96\x27\xbc\xcf\x68\x18\xd7\xc7\xd3\xeb\xd9\x64\x40\x42\ -\xbf\x21\xcc\x70\x69\xfd\x11\x98\x52\x63\xf5\xfa\x0c\x24\xb5\xe3\ -\x31\x31\x39\x8c\xda\x70\x35\x8e\xab\x9f\x8d\x7b\x77\xbf\x60\xc6\ -\xa2\xcc\x08\x4d\x40\x4d\x34\xa5\xd4\x25\x79\x12\xeb\xfb\x3b\x7c\ -\xe9\x64\x7a\x88\x74\xba\xfe\x62\xe6\xf9\x68\xad\xa8\x4f\x8b\xa7\ -\xd4\xee\xff\xee\xa6\x07\xb1\xae\x67\x17\x16\xc6\x5a\xb3\x9c\x03\ -\x7a\x4c\x0a\xc2\x78\x64\xde\x67\xd0\x52\xd9\xa0\x95\x66\x22\xbb\ -\x40\xd4\xe5\xba\xfe\x74\x95\xeb\x49\x11\x88\x01\xe0\x9e\x7b\x1b\ -\xbb\x48\xb5\xe4\x6c\xd0\x97\x02\xe2\x00\xe3\x0a\xae\x59\x77\x17\ -\xfe\xdd\xb5\xce\x9d\x31\x1c\x69\xb9\xec\x4f\xe4\x56\xbe\x31\x4f\ -\x80\x30\xbd\xb8\x71\x0a\xe9\x59\x00\x0d\xd9\x1e\xe3\x21\x34\xa0\ -\x02\x3b\x79\x17\x24\x95\x3b\x2c\xfb\x5e\xc7\xaf\x02\x97\x79\xc9\ -\xc2\xc0\xa7\x72\x8e\x64\x32\xa9\xc7\x3a\xf9\xc8\x4d\x35\xfd\xf9\ -\x79\x56\x01\x2e\x29\x8d\x08\x90\x13\xdc\x39\xe0\x5e\x06\x65\xae\ -\xda\xd8\x43\x8f\x11\x8f\x6a\x1e\x53\x7b\xe8\x1b\x23\xc2\xe4\xca\ -\x86\xb4\xab\xb5\xeb\x5b\xe5\x7a\x40\x25\x30\x3d\xde\xc9\xc9\x86\ -\x94\xd3\xf8\x66\xcb\x3f\x04\x68\x05\x5f\x13\x7a\x03\xc2\xb9\x16\ -\x28\xe5\x23\xac\x70\x51\xa0\xd7\x03\xc5\x8c\x29\x1a\xc1\x39\xb2\ -\xec\xc8\x23\x21\xc9\x72\x6a\x23\xed\xa8\x3e\x45\x81\x37\xa2\x8e\ -\xdf\x03\xcc\x79\xe3\xa8\xd7\xec\xd9\xb3\x9c\x16\xb6\x29\x53\x70\ -\xd1\xc5\x17\x9b\x02\x92\x08\x58\xb6\xec\xc8\x9c\x05\xda\xb1\xc7\ -\x1d\x87\x8a\xaa\x4a\x73\x32\x31\x22\xbc\xb5\x7a\x0d\xda\xdb\xdb\ -\x75\x61\x2b\xe9\x34\x59\x86\xc5\x4b\x97\x98\xcd\x0e\xc9\x12\xfe\ -\xf5\xd8\x63\x90\xc3\xa9\xa3\x17\xf1\x78\x02\x09\x4b\x3a\x52\xad\ -\xc8\xeb\x9d\x77\xde\x69\x2a\x5a\x44\x84\x1d\xdb\x83\x59\x16\x27\ -\x4f\x9e\x8c\x8b\x2e\xba\x44\x5f\x1f\xb4\x37\x1f\x75\xf4\xd1\x8e\ -\x49\x39\x7f\xfe\x7c\x5c\x74\xf1\x25\xba\x0e\xa5\x5d\x37\x34\x38\ -\x88\x3b\xee\xf8\x2d\xb8\xb9\x68\x31\xbc\xb7\x21\xd8\xb9\xde\x0f\ -\x9e\x72\x0a\xe6\xcd\x9f\x9f\xca\x52\x2a\x49\xa8\xad\xad\xb3\x0a\ -\x23\x49\xc2\xb9\xe7\x9d\x87\xa1\xc1\x41\x93\xb6\x95\x95\x4e\x0b\ -\x70\x4d\x6d\x2d\x2e\xbc\xe8\x22\x93\x39\xc8\xb6\x4e\x52\xc6\x9d\ -\x36\x07\xf2\xa8\xed\xc2\xf5\x0a\x6c\x04\x2d\xf0\xf3\x80\xc9\x07\ -\x8c\xda\x39\x3b\x5a\xf0\x54\xcf\x7a\xec\x1c\xec\x42\x4b\xac\xbe\ -\xa4\xda\xb5\x6b\x68\x1f\x3e\xfa\xee\xef\x00\x00\xd3\xa4\x26\xdc\ -\x35\xff\x63\x88\x85\x22\x65\x47\xdf\xfa\x50\x25\xfe\x78\xf0\x27\ -\x70\xd4\x4b\x37\x60\x07\x1f\xb9\x7a\x46\x1f\xae\x39\x04\x9f\x6f\ -\xfb\x40\xc9\xd0\xa1\x56\xad\xc6\x57\xa7\x9d\x6a\xf9\xee\xfd\xa1\ -\x4e\xfc\x70\xc7\x33\xf8\xc9\xa4\xd3\xcc\xef\xce\x99\xb0\x04\xf7\ -\x76\xbe\x64\x7e\x5e\x5a\x35\xd5\x7a\xe4\x33\xd1\x85\xf6\xf8\xbe\ -\xac\xdf\xdf\x1e\xdf\x0b\x0e\x6e\x51\x7c\x9e\xd8\xff\x36\x7e\xb6\ -\xe5\xa9\xbc\xfa\xc5\x64\x09\xb3\x6b\x5a\x31\xa9\xba\xd1\x29\x83\ -\x2c\x89\xe8\x78\xce\x9b\x7d\xd7\x0d\x59\x9a\x72\x57\x27\x57\x16\ -\x76\xac\x22\xd5\x38\xb7\xee\x50\x4c\x0c\x28\x13\xea\xa4\x30\x76\ -\xc6\x81\x6e\xb5\x0b\xbb\xe3\x5d\x30\x92\x04\xb8\x29\x87\xe9\x9b\ -\x69\x23\x4a\xb7\x21\xec\x2c\xae\xbc\x2f\xd1\x07\x25\xad\x64\x00\ -\x77\xd9\xb1\xf0\xb4\x35\x8e\x1c\xa6\xd1\x6c\x09\x3b\x5a\x16\x8f\ -\xc2\xed\xda\x0f\xab\x98\x81\x0b\x9b\x8e\x08\xc6\x33\x72\x08\x50\ -\x38\x86\xd4\x01\xec\x4e\xec\xd7\xf6\x8b\xe9\x8e\x07\x72\x96\x53\ -\x4e\x73\x3f\x20\x4c\x32\xaa\x6d\x05\x9a\x7b\x93\x83\x18\x54\xe3\ -\xe6\x55\x4e\x23\x38\xd7\x93\x7b\x70\xd3\x28\x0d\x10\xf6\x29\xfd\ -\xa3\x78\xc5\x26\xc8\x0e\x95\xdf\xa7\x2e\x8a\xa7\x41\x24\xe8\x61\ -\x7d\x66\xdf\x27\x66\x9b\xcd\x25\x7b\x7c\xea\xea\xab\xf0\xa9\xab\ -\xaf\x2a\xc9\x21\x58\xba\x74\x09\x7e\x77\xe7\x1d\x9e\x0a\x0f\xe7\ -\xc1\xce\x6a\x1a\x5e\x93\x4f\x7f\xfa\x6a\xc7\x46\xfa\xc4\xff\x5a\ -\x8e\x27\x9f\x7e\x52\x57\x8a\xb4\x01\x78\xf5\xe5\x57\x70\xf0\xc2\ -\x83\x53\x89\x06\x06\x07\x31\x7b\xce\x5c\xb4\x6f\xd9\x9c\xf1\x3d\ -\x7d\x7d\xbd\xf8\xd8\x15\x57\xe4\xb2\xa3\xc7\xe2\xc5\x8b\xf0\xbb\ -\x3b\x7f\xeb\x7b\xdd\x69\xa7\x9d\x8a\xd3\x4e\xb3\x2e\xf0\x5f\xfc\ -\xe2\xb5\xf8\xc6\xb7\xbf\x9d\x53\xec\xce\x77\xbe\xfd\x2d\xab\x62\ -\xa1\xd3\x37\xfd\x3c\x71\x28\x14\xc2\x6d\xb7\xde\xe2\xfb\xac\x96\ -\x96\x16\xdc\x79\xc7\x6f\x8a\x27\x92\xbd\xce\x08\x0f\xf3\xfb\xfc\ -\x2d\xee\x3e\x95\xbf\x6d\x67\xff\x29\xa0\xd7\xb6\x50\x9e\x64\xc7\ -\xa6\xc9\xeb\x89\xbc\x40\x8b\xa0\xde\xbf\x1e\x65\x00\x7f\xee\x78\ -\x05\x9f\x3d\x60\x79\x91\xc6\xcd\x0a\x55\xb7\x5c\x5e\xfb\xde\x5f\ -\xb0\x63\x70\x3f\x24\x8a\xe0\xd7\x73\x2f\xc5\xb8\x8a\xea\xdc\x37\ -\x2f\x45\xdc\xf3\x70\xce\x31\xad\x62\x1c\x7e\x35\xef\x52\x9c\xb9\ -\xfa\x67\x48\x9a\xf5\x3d\x58\xc0\x61\xb4\x57\xb2\xf7\xa9\x33\xc2\ -\x08\x07\x45\xa6\xe0\x57\x07\xae\x40\xc8\x25\x33\x97\x41\x77\xce\ -\xb9\x99\xb0\xc6\x72\xbf\xee\x55\x0f\xc5\x35\xe3\x53\x42\xd6\x63\ -\x58\xb8\x6a\xa5\xa1\xf1\x68\xd5\x3d\xab\x17\xb8\x35\x49\xd0\x92\ -\xea\x49\x98\x58\x55\x67\x19\xf7\x5b\x76\x3c\x8d\x07\xf6\xbc\x8e\ -\x1f\xb6\x7c\x00\x51\x3d\x96\x67\xf9\xb8\x79\x68\x94\x6b\xb1\x47\ -\xcf\xde\xb7\xac\x76\x86\x65\xf0\xd6\xf7\xed\xc4\x80\x92\x48\x8b\ -\xa5\xf1\x20\xa3\xad\xde\xd3\x67\x37\xdd\x8b\x7d\xc9\x41\x7c\x6e\ -\xea\x71\xa8\x90\x2a\xb1\x2f\xd9\x83\x8f\xbf\x7d\x17\x12\x46\x0a\ -\x70\xf2\x88\xb5\x21\x96\x79\x7c\x24\x3d\xc5\xb6\x5b\x1d\x38\x2a\ -\xf0\x5e\xd5\x83\x87\x93\xaa\xff\x3c\xb7\x37\x84\xa7\x67\x05\x63\ -\x04\x62\x0c\xb3\xc3\x93\xf0\xf1\xa6\xa3\x71\x41\xf3\x52\x34\xc7\ -\x6a\x33\x36\xa3\x37\x39\x80\xfb\x3b\xdf\xc4\x6d\xed\x4f\x60\x6d\ -\x42\x2b\xac\xf9\xdf\x9b\xef\xc7\xf7\xb7\x3d\x96\x92\x23\x94\xa1\ -\xf3\x46\xd6\x5a\x09\xf8\xe1\x84\xf3\x70\x65\xdb\xb1\xe6\x7d\xbb\ -\x06\xba\x30\xff\xe5\x6f\x61\x50\x1a\x32\x37\xd6\x1c\x6a\xc6\xe9\ -\x62\x0c\x77\x7f\x72\x40\xe7\x4d\x7b\x3d\x22\xf7\x79\xf4\xe8\xbe\ -\x95\xb8\xe4\xed\xfd\x66\x91\x52\xa7\xfc\xf3\xf2\xe3\x0d\xa7\x3a\ -\x43\x30\x5d\x59\xb6\xfd\xa7\xbd\x0e\x16\x07\xb7\xed\x89\x09\xaf\ -\xc5\xdb\xd3\xe6\x07\xcf\xb8\x5e\x18\x59\x19\xc1\x34\x5e\xae\x63\ -\xd5\x38\xa3\xfe\x10\x7c\xa2\xf9\x18\x1c\xd1\xd8\x96\xb1\xb5\x0a\ -\x57\xf1\x5a\xcf\x16\xdc\xb6\xed\x69\xdc\xdb\xa1\x25\x8a\x5a\x35\ -\xb0\x05\xd3\x5e\xfc\x9a\x39\x6d\x88\xd2\xbc\xa1\xdc\x99\x95\x8e\ -\x18\x81\x18\xc7\x11\xa1\x99\x78\x6c\xd1\xe7\x53\xa7\x4b\x38\xc7\ -\x45\x6f\xfe\x1a\x8f\xf7\xbf\x95\x92\x27\xb6\x75\x92\xbb\xf0\xb9\ -\xa2\xea\x19\x9b\xc3\x5e\x41\x7e\xee\xf2\x8a\xc8\x63\x9f\x40\x81\ -\xa6\x60\x0e\x2a\x2a\x77\xd7\x4f\x8c\x7d\xb5\x5d\x85\x0c\xa5\xde\ -\x5c\x34\x4f\x51\x49\x9c\x8d\x2c\x33\x0d\x36\x57\xa8\x1e\x8a\x84\ -\xfd\xf8\x59\x90\x63\x70\x45\xb5\xd1\x04\xdd\x48\x07\x28\xca\x2b\ -\x90\x03\x98\xa0\x69\xf6\x93\x8f\xe3\xd7\x3b\x9f\x35\x95\xa2\x52\ -\xc0\x93\xfb\xdf\xc6\x9f\x77\xbe\x02\x00\xb8\xa6\xf9\x78\x2c\x1b\ -\x3f\x33\xeb\x67\xec\x4b\xf6\xe1\xbe\xbd\x6f\xe2\xfd\xbe\x0e\x2c\ -\xa9\x9c\x8c\x93\x1a\xe6\x07\x2c\xd6\xe9\x44\xb7\x32\x80\x7f\xec\ -\x7d\x13\xeb\xfa\x76\x60\x71\x6c\x32\x4e\x6c\x9c\x87\x4a\x29\xbb\ -\x8c\x7d\xa7\x34\x2d\xc0\x8a\x5d\x47\xe3\xd7\xbb\x9f\x1a\x56\xda\ -\x35\x4b\x0d\xf8\xf3\x81\x57\x62\x5c\xc4\x6a\x7d\xef\x49\xc6\xa1\ -\x28\x0a\x6a\x2d\xc5\x6d\x33\xcf\x97\x19\xe1\x26\xcd\x48\xc5\xe0\ -\xd8\xe0\xfa\x99\x18\x0d\xe5\x20\xa1\x24\xb0\x2e\xbe\x13\x4f\x74\ -\xad\xc7\x35\x6f\xdf\x8d\x9f\xcc\x39\x1f\x51\x29\x82\xcd\x03\xbb\ -\xf0\xeb\x6d\xcf\xa2\x3b\x39\x80\x37\x7a\xda\x71\x74\xe3\x6c\x00\ -\x40\x5d\xa8\x0a\x67\x8e\x5b\x84\x5f\xef\xd1\x4a\x28\x1c\x51\x3f\ -\xdd\xb2\x11\x7d\xa9\xeb\xfd\x9c\x69\xf3\xad\xad\x0f\x62\x7f\xa2\ -\x0b\xdf\x9a\x79\x06\xae\x7d\xe7\x8f\xd8\xd8\xbf\xcb\x2c\x32\xeb\ -\x6a\x04\x09\x52\xb4\xbc\x04\xea\x1f\xb3\x44\xee\xeb\x62\xb5\x54\ -\x89\x13\xeb\x0e\xc4\xc7\x9b\x8f\xc1\xf1\x0d\xb3\x11\x09\x65\xde\ -\x72\xad\xef\xdf\x89\x3b\x3a\x5e\xc4\x5d\x3b\x5f\xc4\xd6\xc1\xdd\ -\x8e\x63\x3e\x03\xc9\x01\x0f\x25\x08\xd6\x60\x7f\x2d\xdf\x34\x00\ -\x42\x2f\x86\x1c\x6b\xe8\x7e\xde\x05\x25\x99\xd4\x8a\x83\x72\xee\ -\xac\x01\x95\xfe\x60\x8b\x01\x3b\xbb\x7d\xdb\xc6\xa1\xdd\xd8\xb8\ -\xbb\xd3\xc7\xbc\xe5\x95\x02\xd8\xee\x09\xcb\x74\x34\x27\x70\x95\ -\xd5\x94\x96\x67\xa6\x75\x37\x62\x08\x32\xdc\x97\x5e\xf4\x38\x07\ -\x76\x38\xb8\x72\x1a\x2e\x1b\x77\x24\xce\x6b\x5a\x8a\x96\x8a\x9a\ -\x8c\xcd\xdb\x97\xe8\xc5\x43\xfb\xde\xc4\x6d\xdb\x9e\xc3\x0b\xfb\ -\xdf\x83\xc2\x13\x96\x62\xcb\x83\xc9\x04\x38\x25\xb4\xb6\xaa\xb6\ -\xbe\xd8\x15\x0e\x99\x01\x0a\xd0\x25\xf7\x3b\xa8\xdc\xcd\x7b\xd1\ -\xa7\xf4\x00\xaa\x9e\x38\xc2\x4c\xa2\xe2\xcd\x07\x61\x16\xc2\x68\ -\x87\x0c\x6b\x72\x1c\x2f\x3d\x31\x93\x76\x93\xd9\xc2\x66\xff\x5e\ -\xe1\xba\x21\xcc\x9a\x4f\x9d\x67\x19\xef\x63\xdf\xe8\x17\x32\x93\ -\xd8\x88\xec\x95\xf4\xf6\x7b\xb5\xdb\x41\x0f\x72\x17\x25\x7e\x74\ -\x33\x8e\xb8\x99\x59\x45\xf4\x0a\xd5\x21\x3d\x3b\x0c\x2f\xa0\xa1\ -\xcd\xfe\xe2\x6c\xc6\xd4\xeb\x5a\x9e\x6e\x91\x0a\xf0\x3c\xf2\x7b\ -\x9e\xcd\xd3\xe2\x4b\xbf\x12\xa9\x9a\x6a\xe7\xf7\xa0\xed\x2f\x98\ -\x4a\xce\x99\xc6\x24\x6a\x40\x1d\x9d\x6c\xe3\x67\x5b\xf4\xb8\x63\ -\x0d\xcc\x1c\xf3\x51\xf8\x42\xc8\x41\xe5\x9b\x9f\x8d\xca\x23\xfb\ -\x8e\xf1\x73\x52\xc5\x5b\xdd\x5b\xf0\xc7\x6d\x2f\xe2\xfc\xd6\xc3\ -\x8a\x2e\x67\x54\x55\xc5\xb7\xdf\xbb\x1f\x49\x52\xd1\x2a\x8f\xc3\ -\xd7\xda\x4e\xb1\x18\xf1\x7d\xf9\x89\x73\x6c\x1e\xd8\x8d\x53\xde\ -\xfc\x19\xde\x19\xd8\x69\x7e\x7d\x62\xf5\x1c\xfc\x79\xc1\x55\xa8\ -\x77\x39\xaa\x93\x09\xbb\x86\xf6\xe3\xd4\x37\x7e\x86\xd7\xfb\xf4\ -\xf4\xda\x8c\xe3\xd0\xd8\x54\xdc\xb7\xe0\x1a\x8c\x8f\xd4\x04\x96\ -\xef\x04\xc2\x37\x67\x7c\x18\x7f\xef\x7c\x0d\x7b\x78\x77\x00\x0e\ -\xb2\x5b\x36\x7d\x7c\x92\x4c\xdb\xe0\xfe\x71\xf6\xc7\x30\xbb\xa6\ -\xd9\x41\xaf\x2f\x6f\x79\x08\x17\xd6\x1d\x88\xa3\xc2\x33\x52\xdf\ -\xab\x2e\xaf\xd7\x83\x08\x0e\x8c\x4e\xc4\xcb\x47\x7c\xc3\x33\x2e\ -\xd0\x30\x58\x29\xfa\x46\xc5\xa8\x35\x63\x4f\xde\xb0\xb9\xaf\x03\ -\x73\x9e\xfb\x2a\x12\x4c\xc1\x6d\xdb\x9e\xc6\xae\xa1\x7d\xb8\xe3\ -\xc0\x15\xb8\x71\xfd\x83\xe8\x1d\xe8\x85\x4a\x0a\xfe\xb9\x77\x8d\ -\xa9\x14\x81\x80\x15\xad\xcb\xf0\x9b\xde\xe7\x31\x17\x4d\x98\x59\ -\xd7\x62\xe9\xc7\x33\x5d\xeb\x61\x9e\x51\x76\x23\x87\xc9\xdf\x56\ -\x46\x4f\xc4\xb5\x23\x35\x37\x6d\x7b\x0c\xf7\xef\x7b\x03\xeb\xfa\ -\x3a\xf4\x30\x5e\x55\xa7\x72\x42\x3b\xa2\x93\x9e\xfe\x58\x21\x17\ -\x79\x62\x5d\x91\xe2\x18\xc2\x75\x5b\xef\x41\x3d\xab\xd6\xe9\x22\ -\xb9\x4e\x33\x73\x1b\x92\x5e\x17\x8c\x53\x2e\x33\x1e\xe9\x21\xad\ -\xa4\x12\x56\x26\xb6\x64\xe0\x27\xfb\x81\x23\xa6\xb3\x8b\x84\xeb\ -\x26\x7e\x08\x57\x4c\x3a\x06\x13\xab\x1b\x7c\xd7\x17\xce\x39\xfe\ -\xd9\xb1\x06\x1f\x79\xfb\x16\x0c\x20\x0e\x52\x54\x6b\xec\x2e\xec\ -\x59\x10\x7d\x24\x23\xe3\xda\x5e\x4b\x62\x8e\x8c\x81\xf1\x64\x02\ -\x48\x70\x48\x90\xd2\xf8\xc9\x2a\x97\x49\xb5\x2a\x03\x29\x31\xad\ -\x66\xe6\x07\xfb\x38\xaa\xb6\x1a\x38\x9e\xa3\xc0\x7d\xbe\xe3\x19\ -\xe9\x9e\xf3\x8a\xa1\x02\xd6\x4c\x90\x41\x17\x02\xbf\x7d\x97\x76\ -\xfd\x31\x95\xb3\x70\xfd\xb4\xb3\xb1\xac\x69\x66\xa0\x7d\x06\xe7\ -\x2a\x4e\x7f\xe5\x67\x78\xae\x7f\x5d\x8a\x7e\x69\x72\xca\x79\xcc\ -\x91\xfb\xb4\x4f\xd1\xe5\xa7\xa2\x67\x5c\x4e\xfb\x39\xc1\x81\xa4\ -\x6c\x2c\x14\x96\xfb\x1c\x75\xc8\xcc\xf9\x18\xcf\x3c\xee\x76\x7d\ -\x80\xc8\x7d\xf6\x91\xfb\xf2\x99\xb5\xfe\xe1\x3b\x5e\x36\x7e\xb5\ -\xc9\x2d\x73\x3a\x29\xaa\x49\xaf\xa2\x79\x8a\xb8\x24\xea\xae\xe4\ -\x36\xd0\x3c\xd0\x9e\xd4\x3a\xe1\xd4\x60\x62\xa3\x80\x1b\x6c\x26\ -\x0d\x83\x92\x1a\x30\x59\xc6\x68\x3a\xc1\x5c\x7a\xfc\x27\x90\x0b\ -\xbe\xb5\xf5\x41\x9c\xde\xb4\xb0\xe8\x35\x8b\x9e\xdd\xbf\x16\x2f\ -\x74\xbf\x0f\x90\x84\x2f\x4e\x3c\x09\x75\xd1\x8a\x6c\x6d\x1d\xf8\ -\xd2\xfa\x3f\x5b\x14\x22\x00\xf8\xf7\xd0\xbb\xf8\xde\xc6\x47\xf0\ -\xa3\xd9\xe7\x64\xf5\xbc\x6f\x6c\xf8\x3b\x5e\xeb\xde\x0c\x4a\x93\ -\x17\x2f\x0f\x6c\xc2\x37\x37\x3e\x80\x5f\xce\xb9\x28\xab\x67\x4d\ -\xac\xa8\xc7\xc7\x5a\x8f\xc1\x0f\xb7\x3d\x5c\x78\xc2\x31\x86\xef\ -\xb7\x9d\x89\x63\x9a\x9c\x35\x80\xfe\xb4\xf3\x25\xfc\xae\xe3\x45\ -\x5c\x5c\x3b\x3f\xf0\x74\xe1\x85\x5c\x79\x89\x99\x8b\xff\x7d\xdd\ -\xab\x71\xc8\x6b\xd7\xa3\xbd\x2f\x15\x17\xf4\x40\xd7\x6a\x7c\x17\ -\x67\x99\x9f\x97\x35\xcc\xc2\xac\xd8\x24\x2c\x8f\xcd\xb6\x3c\xa6\ -\x57\x19\xc0\xeb\xdd\x5b\xf4\x8d\x43\xee\x6b\xc1\xda\xfe\x5d\xce\ -\xe3\xa9\x2e\xca\x1f\x49\xc1\xde\xf1\xbb\x1d\x2f\x43\x91\x93\x2e\ -\x06\x94\x34\xae\x34\xac\xfc\x0a\x74\x03\xaf\x5f\xb5\x1b\xbb\xdd\ -\xdc\xed\x1c\x8f\x6e\xb8\x55\x29\x6b\xd9\x27\x49\x12\x2e\x99\xb4\ -\x2c\xa3\x42\x64\xc7\xc6\xc1\x3d\x18\x40\x7c\x18\x78\xd7\xce\x2e\ -\x42\x8e\x8f\x14\x8e\x6b\x98\x83\x65\x13\x82\x7b\xe2\x55\x70\x6c\ -\x49\xec\x1e\x91\xe5\xbb\xdc\x1c\x09\x23\x02\x06\xc8\xe9\xf5\x5c\ -\xac\x9a\x5e\x96\x4a\x8e\x97\x5b\xd5\x1e\x3b\xa4\x4f\x48\x15\x5e\ -\x67\x4c\x83\xae\x51\xf6\x2a\xcd\x85\x9d\xe8\x8a\xee\x51\xb9\xf5\ -\xd6\xdb\xd0\xdd\xdd\x65\x6a\xf2\xe1\x48\x14\x57\x5f\x7d\x15\x2a\ -\x62\xb1\x8c\xf7\x77\x76\x76\xe2\xd7\xb7\xdf\x0e\x55\x51\x4c\x42\ -\x4c\x9a\x3c\x09\x97\x5c\x7c\xb1\xa5\xfd\x41\xdb\xbd\xec\xc8\x23\ -\x71\xed\xb5\x5f\xd2\xea\x16\xe9\x41\x75\x5d\xfb\xf6\xe1\xfa\xeb\ -\xaf\x37\x9f\x93\xca\x48\x63\x38\x56\x38\x24\x59\xc2\x96\x2d\xce\ -\x22\x87\xbf\xbe\xfd\x76\x34\x37\x37\x9b\x19\xea\x00\xe0\xec\x73\ -\xce\x86\x2c\xcb\x40\x5a\x9d\x24\x3b\x06\xfa\xfb\xf1\xbf\xbf\xb8\ -\xd9\x57\x39\xd9\xb6\x75\x1b\x7e\xf0\x83\x1f\x58\xb2\xd4\xcd\x98\ -\x31\x13\xe7\x9c\x7d\x56\xc6\x7e\x73\xce\xf1\xc2\x0b\x2f\xe2\xe9\ -\xa7\x9f\xb2\x7c\x1f\x8e\x44\xf0\xc5\x2f\x5e\x6b\xd6\x70\xe2\x9c\ -\xe3\xe1\x87\x1f\xc6\x5b\x6f\x59\xd3\xf1\xde\x73\xef\xbd\x58\xbd\ -\x66\x4d\xaa\x5f\xa6\xf7\x3f\xfd\xac\x3f\xb3\x08\x08\xce\x39\x64\ -\x39\x84\x6b\xae\xf9\x34\x62\x3e\xe3\xea\xd6\xde\xad\x5b\xb7\xe1\ -\xae\xbb\x7e\xe7\xa5\xbf\xa6\xb5\x81\xac\x96\x21\x22\x1c\x7e\xf8\ -\xe1\x38\xe1\xf8\xe3\x2d\xdf\x3f\xfe\xf8\x93\x78\xf9\x95\x97\xb4\ -\xda\x53\x69\x31\x3c\x16\x92\x13\xe1\xdc\x73\xce\xc1\x8c\x19\x33\ -\x86\xd7\x78\x61\x1a\x58\x74\x37\x11\x79\x98\x8e\x55\x4a\xed\xcf\ -\x5c\x1f\xe4\x53\xf9\xba\x44\x14\x2f\xf2\xb0\x13\x38\xc5\x22\x65\ -\xbe\xd3\xf6\x71\xfd\xd0\x4e\xdc\xb4\xf9\x31\x7c\x7b\xc6\x87\x47\ -\x56\xc6\xdb\xe4\xcc\xcd\x5b\x1f\x47\x12\x49\x4c\xe0\xe3\x71\xc5\ -\xa4\x23\xb3\x96\x9b\x03\xca\x00\x1e\xdf\xf7\x2e\x60\x9c\x2d\x57\ -\x8c\x71\x95\xf0\xe0\xde\x55\xf8\x31\xce\xcd\x6a\x18\x1f\xda\xbd\ -\x5a\xdb\x0a\x24\xad\x7c\xf0\xd0\x9e\x37\xa0\xf2\x0b\x21\xff\x7f\ -\xf6\xae\x3b\x3e\x8e\xea\xf8\x7f\xdf\xee\x55\xb5\x53\xb1\x25\x59\ -\x6e\x72\x91\x6c\x5c\x31\x18\x63\x53\x42\x35\x10\x42\x20\xf4\x1a\ -\x4a\xa8\xc1\xa1\x84\x12\x5a\x28\xc9\x8f\x00\x81\xd0\x8c\xe9\x01\ -\x42\xc7\x94\x38\x54\xd3\x8d\x01\x37\xb0\x8d\x7b\xb7\xba\xad\xde\ -\xa5\xeb\xbb\xef\xf7\xc7\x96\xbb\x6d\x77\x7b\xa7\x3b\xe9\x64\xdf\ -\x80\x3e\x96\xee\x76\x5f\x99\x37\x6f\xde\x94\x37\x33\x2c\x1b\x13\ -\x9f\xbc\x6e\xf4\x71\x78\xb6\x7e\x09\xba\xd1\x23\x8e\xcf\x22\x8b\ -\x1b\xfa\x54\x17\x39\x25\xb6\x6c\x58\x64\x2c\x78\xad\xf1\x27\x9c\ -\x5d\x34\x13\xc5\x8e\x3c\xb9\x81\xd5\xdd\xbb\x71\xd5\xce\xb7\xe0\ -\x61\x02\xf0\x73\xa1\xfd\xc1\x30\x8c\x72\x2f\x48\xed\xb0\x21\x0f\ -\xaf\x85\x61\xa2\x5e\x49\xb5\xa8\xd2\xff\xb2\x2a\x3c\xb0\x84\x15\ -\xee\x98\x49\x76\x2f\x1f\x45\xa5\xaf\x39\x34\x43\x1b\xc1\x86\xee\ -\x6a\xac\xee\xd8\x8d\x43\x72\xc7\xcb\xe3\xb8\xa4\xe0\x48\xcc\xc8\ -\x2c\x51\xe0\x75\x7d\x4f\x35\xea\x7d\x5d\x42\x0c\x0c\x55\xc5\x04\ -\x46\xd9\x28\x6a\xc7\x85\xda\x10\xe7\xe3\x39\x21\xf8\x3f\x3c\x33\ -\x68\xb8\xae\xa1\xf1\x40\x89\xcb\x17\x94\xe8\x2c\xa2\x39\x4f\xa9\ -\xc4\x28\x9e\x89\xa4\xe0\x51\xe3\x36\x0d\x3c\x62\x46\x08\x90\x2d\ -\xce\xe2\x9a\x07\x58\x1e\x0d\xfe\x0e\x8c\x23\x45\xaa\x1e\x29\xaa\ -\xbd\xad\x78\xa5\xe1\x67\x5c\x3d\x74\x0e\x4a\x32\x43\x09\x7f\x28\ -\x43\x01\x3e\x20\x3e\xa7\xee\x97\xc2\xc6\x5a\xc1\x5b\x18\xd5\xed\ -\x0f\xaa\xc3\xaf\xa8\x5c\x47\x86\x50\x2b\xec\xb0\x2b\xf0\xce\xb2\ -\x2c\xac\xe2\xf5\xcf\x20\x0d\x8b\x69\x53\x66\xae\x00\x95\x32\xdc\ -\x52\x5e\xf6\x38\xf3\x3c\x8d\x8c\x2f\x35\x7f\xa7\x34\x25\xf8\xba\ -\x21\x7f\x57\x95\x9f\xa2\xa6\x93\x54\x1a\x6d\x00\xa2\x68\xa7\x96\ -\x6b\xd7\x64\xc4\x05\x28\xbc\x5c\x00\x8b\xda\xd6\xa1\xa7\xc7\x8f\ -\x2b\x4a\x43\x7c\x98\xa1\x04\x84\x72\x80\x94\x04\x43\xda\xff\x34\ -\xc4\x0f\x88\x95\xd1\x0e\x8f\x81\x6c\xcc\xa0\x12\xde\x09\x15\x6a\ -\x2a\x01\x70\xd0\x2c\x85\x8c\x08\x00\x0e\x4b\x06\x58\xbb\x13\x84\ -\x0f\xbb\x3e\x49\xa9\x76\x4e\x04\x20\x3c\x05\xa1\x3c\xfc\x3c\xa7\ -\x98\x27\x51\x7b\xaa\x64\x8f\x8f\x5a\xe2\x21\xba\xea\x40\x68\x9b\ -\x25\x87\x5e\x34\x7a\x89\x94\x3c\x94\x12\x59\x09\x0d\x97\x5f\xc0\ -\x0e\x74\x9d\xa2\x41\x60\xb0\x78\xe4\x91\x7f\xa1\xa6\xa6\x4a\x5e\ -\xef\x8c\x8c\x4c\x5c\x72\xc9\xc5\x51\x95\xa2\xa6\xc6\x46\xdc\x75\ -\xd7\x5f\x41\x79\x4e\x26\x9b\x39\x73\xe6\xc8\x4a\x51\xac\x70\xc2\ -\xdc\xe3\x71\xc2\xdc\xe3\x15\xf4\x7a\xdd\xb5\xf3\xf0\xcc\x73\xcf\ -\x46\xf6\xa0\x18\x9c\x09\xf3\xe7\xcf\x57\xac\x81\xcd\x6a\xc7\xc6\ -\x8d\x1b\x51\x56\x16\x59\xc8\x6e\x69\x6e\xc6\xd3\x4f\x3f\x1d\x22\ -\x26\x03\xa8\xa9\xad\xc1\x9d\x77\xde\x19\xae\x11\xe0\xe4\x93\x4f\ -\x96\x95\xa2\x48\xb0\x74\xe9\x52\xdc\x75\xd7\x5f\xe5\x0d\x4e\x00\ -\xdc\xff\x8f\x07\x70\xfb\xed\xb7\x29\x48\xa6\xb1\xb1\x51\xa3\x14\ -\xbd\xfe\xfa\xeb\xc6\xf8\xd0\xfb\x5c\xdc\x8c\x36\xab\x0d\x57\x5c\ -\x71\x79\xcc\x4a\x11\x00\x54\x55\x56\xe1\xaf\x77\xdf\x0d\xf0\xd4\ -\xf4\x25\x0d\x29\xe1\xc5\xad\xb7\xdc\xaa\x50\x8a\x00\xe0\x93\x4f\ -\x3e\xc1\xfc\xf9\x4f\xe8\x1c\xee\x21\x65\x8a\x61\x18\x4c\x9d\x3c\ -\x25\xe9\x4a\x91\xca\x8c\x85\x74\xb1\x91\x78\xad\x2c\x14\xff\xac\ -\xff\x12\xbf\x1b\x7a\x20\x66\xb8\x4a\x07\x64\x08\x8d\xbe\x76\x7c\ -\xd9\xb2\x09\xe0\x09\xce\x2d\x3c\x04\xd9\xf6\xd8\x69\x9d\x46\xa3\ -\x8f\x78\xcf\x01\x9a\x98\xf3\x61\xb8\x33\x1f\xa7\xe6\xcf\xc0\x9b\ -\x6d\x3f\x24\x1c\x7f\xab\xdd\x55\x98\xbb\x6e\x01\x3e\x9c\x72\x25\ -\xc6\x66\x16\x63\x8f\xaf\x05\xa7\xaf\x7b\x1e\x3d\xc1\x1e\x10\x9b\ -\x1d\x3c\x21\x31\x20\x4b\x7a\x20\x01\x87\xa0\x09\x96\xf3\x7a\xf3\ -\x4a\xcc\xcc\x1d\x27\x7b\x70\xfe\x5c\x72\x94\x32\xb8\x9e\x52\x7c\ -\xda\xb2\x3e\x79\x47\xfd\x7e\x18\xe3\x59\xe7\x57\x66\x43\x5c\xd5\ -\x51\x89\xf9\xb5\xdf\xe1\x83\x8e\xb5\xe0\x18\x0e\xe7\xe7\x1f\x84\ -\x12\x95\x81\xcd\x08\x86\xb2\xf9\xd8\x38\xf3\x5e\x10\x31\x95\x33\ -\x88\x8e\xa8\x19\x16\x13\x13\x0a\x33\xa1\xc8\x62\x94\xb1\x7e\xc3\ -\x1c\xb9\xa8\x9d\xfd\x20\x78\xf9\xb4\xa2\x3a\x79\xae\x94\x42\xec\ -\x87\x0d\x3f\xe1\x9a\x1d\x6f\xa4\xf9\x78\x8c\x50\xeb\x69\x53\x5c\ -\x47\x6d\xf1\x77\xe3\xc5\x3d\xcb\xf0\x7c\xfd\x52\x54\x93\x16\x5c\ -\x9c\x73\x38\xae\x80\x32\xdb\x30\xe5\x8c\xe9\xe0\xd5\x71\x57\xe0\ -\xa4\xe2\x69\xe0\x59\x61\x91\x39\x9e\x13\x93\x6e\x28\x8d\x5f\x84\ -\x86\xab\x23\x14\x56\x75\x6d\x25\x02\xbc\x39\xf5\x0a\xf8\x68\x40\ -\x4f\x1c\x0a\x53\xca\x25\xa5\x5f\x50\x86\x7e\xf5\xf3\xff\x61\xbb\ -\xbb\x65\x1f\x5e\x31\x02\x8b\xe6\x8e\x68\xb4\x03\x89\x1a\xf0\xe1\ -\xa8\x57\x2e\x25\x8b\xb2\x64\xb1\x4f\x6d\x26\xc9\xb2\x2c\xfc\x7e\ -\x7f\xe8\x1e\x66\x98\x8a\x6b\x66\xe4\x54\xd4\xbe\xc3\xb3\xc7\xf5\ -\x25\xfe\x83\x68\xb2\xf7\xf0\xca\x78\x9b\x78\x0f\xcc\xb0\x82\xdd\ -\x2c\xcb\x24\xe1\xf0\xa2\xca\x70\x0b\x13\xb1\x28\x0c\xc3\x28\x2c\ -\x8d\x14\x82\x41\x95\x84\xa7\x9d\x8c\x14\x63\x14\xcb\xe7\x34\x54\ -\x93\x29\xfe\x2b\x23\x34\xe6\xac\x78\x46\xcf\x53\x91\x76\x68\xa4\ -\xac\x36\x12\x5d\xf5\xe3\x16\x8a\x9a\xe5\xc5\x20\x89\x54\xf4\xab\ -\xda\x09\xab\x8c\x96\xa4\x79\xaa\xb2\x49\xa9\x2c\xc8\xd4\x20\x96\ -\x88\x40\xf5\x3d\xa5\xf0\xf9\x3d\xb8\x78\xdb\x7f\xb0\xfc\xa0\x5b\ -\x91\x6d\xcd\xec\xf7\xb9\x7d\xd3\xb2\x19\xbd\x41\x0a\x02\x0b\xce\ -\x1e\x76\x70\x5c\x6d\x64\xb0\x0e\x1c\xe9\x9a\x80\x8f\xba\x7f\x51\ -\xce\x9b\xa1\x38\x39\x6f\x4a\xcc\x34\x79\x5c\xfe\x24\xbc\xde\xbc\ -\x3c\x14\xab\x60\x17\x08\xe9\x37\xae\x69\x72\x1c\x4d\x6c\x47\x1a\ -\xc1\xf9\xc5\x87\xe2\xcd\xd6\x1f\xf5\x8d\x0a\x9a\xca\xeb\x54\x57\ -\x08\xd0\x98\x8c\xfd\x82\xf0\xb0\x89\x54\xe3\x98\x8d\x8f\xe3\xe5\ -\x89\x17\xe2\xaf\xdb\x3f\x42\x9d\x5f\x10\x10\x68\x30\x10\x66\x35\ -\x8d\x00\x41\xfd\x58\x40\x4a\x79\x5c\xb7\xf1\x6d\xec\xe2\x85\xf2\ -\x06\xea\x63\x59\x2a\xd9\x70\xe1\x90\xc3\x70\xfe\x88\xd9\x5a\xcb\ -\x36\xa1\xaa\x0f\x44\xf0\x0b\x9f\xbf\xd7\xb2\x16\xf7\x8e\x3e\x15\ -\x05\x62\x9c\x96\x9d\x65\x11\x4a\x71\x07\x04\x68\x10\x1f\x37\xaf\ -\x0b\x9d\x07\xac\x3a\xdb\x1b\x8d\x22\x07\x44\x7e\x4e\x8f\x19\x08\ -\xc6\x69\xa9\xa0\x0d\xa3\xbf\x8f\x44\xd7\x0b\xb5\xf2\x2a\xe1\x5f\ -\xd5\x30\x09\xbb\xea\x46\x34\x2e\x7a\x93\x9a\x39\xb4\x6d\x42\x8c\ -\x0d\xe3\x55\xae\x62\x8d\x67\x80\x2a\xe4\x1b\x04\x29\x6a\xbd\xcd\ -\xf0\xf1\x5e\x7c\xd4\xb4\x01\x4f\xd6\x7e\x87\x65\xdd\xbb\x64\x4f\ -\x10\xcb\x5a\x41\x78\xa5\x69\x51\x88\x43\x53\x59\xca\x45\xbc\x30\ -\x16\x16\x05\x19\x39\xb0\x58\x13\x63\xc7\x1e\x62\x36\xf6\x4f\x1c\ -\x4e\xae\x35\x5b\xb8\x3d\x23\x09\xdf\xaa\xfd\x44\xcc\xa2\x35\xd5\ -\xf9\x7b\xb4\x73\x29\x9a\xfc\xab\xa2\x8f\x86\x40\x27\x82\xd4\x87\ -\x9d\x3d\xad\x98\x5f\xfb\x1d\xde\x68\x5c\x85\x5e\xda\x1b\xea\xd7\ -\xc9\xa9\x25\x09\xf1\x9a\x8f\xaa\x61\x71\xdd\x73\xec\x59\xc8\xcb\ -\xc8\x94\x95\x1e\x19\xff\x71\xc8\x6d\xb9\x56\x27\x00\x73\x86\x31\ -\x29\xf6\xcc\x0a\xab\x32\xe1\x86\x3a\x76\xd8\xc0\x2e\x64\x74\xca\ -\xf3\x24\xa4\xb8\x29\xf1\x1e\x83\xc5\x27\x16\xbd\xc4\x80\xbd\x87\ -\x7b\x3a\x07\x2e\xa6\x88\x0e\xa2\xb2\xb8\x71\xa4\x0d\x24\x84\xf4\ -\x03\x77\x20\x09\x6c\xc9\x5c\x5b\x3c\x1f\x7f\x2c\x98\xa9\x7d\x4b\ -\xa3\x7c\x47\x92\xb9\xcc\xfd\xcf\xc1\x75\x99\x19\x49\xc1\xbd\x41\ -\xf7\xe5\x32\xd6\xfd\x07\x9b\xbc\x75\xb8\x72\xdb\x5b\x78\x67\xea\ -\x95\xfd\xbe\x7e\x5f\xb7\x6e\x06\x65\xdc\x28\x62\x86\xe3\xe0\xbc\ -\x91\x71\x1d\xa4\x84\x30\x78\x74\xc2\x79\xd8\xb6\xae\x11\x3b\x82\ -\x7b\xe5\xcf\x8f\xc9\x9a\x8c\x7b\xc7\xfd\x36\xe6\xf6\x1e\x2c\x3f\ -\x1b\xeb\x7b\xf7\x62\x43\x6f\x28\xeb\xd9\x21\xf6\x71\xb8\x6f\xfc\ -\x69\xf1\x19\x68\x08\x70\x58\xfe\x58\xb8\x48\x26\x3a\x69\x6f\x52\ -\x50\x59\xe3\x6f\xc5\xf1\xeb\x9e\xd0\xb9\x41\x44\xfb\xb0\x3c\x14\ -\x4b\x7a\x36\x63\x8b\xbf\x4e\xb8\x83\x45\xa1\xcd\x26\x46\x80\x32\ -\x47\x09\xce\xc7\x6c\x35\x57\x8e\xca\x18\x1b\x7c\x1d\x58\xd4\xbc\ -\x16\x57\x8c\x38\x5a\xf7\xfb\xf5\x3d\xd5\xd8\xda\x53\x9f\x5c\x06\ -\x1b\x27\x7a\x8e\x75\x1d\x00\xa7\xc3\xa9\x30\xbe\x00\x44\xc1\x26\ -\x19\x46\x69\x74\xe5\x62\xcc\xd7\x4d\x14\xa7\x00\x09\xe9\x68\x34\ -\x88\x65\x5d\xdb\xd1\xec\x8b\x91\x96\x28\x8f\x17\x9b\x97\xe3\xf9\ -\xc6\x15\xd8\xe5\x69\x84\x9e\xa8\x45\xe3\xa0\xed\x94\x11\x82\xd2\ -\x60\x0a\x76\xf9\x5b\x30\x77\xfd\x63\x58\xd6\x59\x89\x20\x0d\x6a\ -\xee\x97\x13\x43\x35\xcd\x88\xff\xa6\x42\x2c\xfe\xbe\x4d\x0b\x16\ -\xaa\x4a\x37\x12\x4d\x30\x34\x17\xe6\x0e\xc3\x3b\xc2\x8a\xf4\x17\ -\x03\x28\x67\x19\x29\x65\xea\x83\x98\xb0\x8c\xe2\x76\x07\xc3\x30\ -\xe6\xa4\x7b\xb1\x2c\xb6\x54\xe4\x14\x20\x60\x19\x36\x71\xe3\xa5\ -\xa1\xab\x54\x71\x9d\x4a\x54\xa9\xa5\x30\x61\xb1\x3a\x51\x95\x22\ -\x86\x28\x52\x44\x9a\x17\xa2\x49\x98\x46\x4f\x63\x7a\x57\x4f\x40\ -\x8a\x89\x7c\x0c\xb2\xa2\x84\xe6\xcf\x28\x02\x50\x63\xca\x9c\xc7\ -\xf3\x20\x0c\x6b\x98\xd0\x22\x12\x9d\xb1\x7a\x09\x29\x06\xa3\xfe\ -\x21\x67\xb1\x8c\x7c\x27\x58\x5b\x6f\x64\x80\x26\x6b\xb2\xac\x9a\ -\xd6\x14\xc5\x44\xa7\x5f\xe8\x64\xdd\x93\xb2\xdb\x10\x60\x61\xf3\ -\x72\x94\x6e\x77\xe1\x1f\x65\x67\x80\x65\xfa\xc7\x2e\xc5\x53\x0e\ -\x3f\x75\x57\x02\x0c\xc1\x41\x59\xa3\x91\x61\xb5\xc5\xdd\xd6\xf8\ -\xcc\x22\xac\x9a\x75\x17\x3e\x6c\xf9\x05\x95\xbe\x76\x4c\xb3\x8d\ -\xc0\xc9\x85\x93\xe1\xb0\xc4\xde\xe6\x70\x47\x2e\x7e\x3c\xe4\x36\ -\x7c\xd8\xfc\x0b\x76\x7a\x9b\x31\xd9\x56\x82\x53\x0a\xa7\xc2\x69\ -\x89\x7f\x7c\x79\xb6\x6c\x4c\xc9\x2a\xc1\xb2\xee\xed\x88\x7a\xdf\ -\x93\xaa\x0d\x11\x6a\x57\x85\x8a\x20\x02\x9c\x8a\x7e\x42\x9e\x40\ -\xdd\x2b\x48\x92\x11\x49\xe6\xfd\x11\x62\x32\xb8\x20\xe0\x0f\x77\ -\xb9\x86\xd5\x53\xb1\x48\xc7\xb4\xaa\xde\x96\x18\x3b\x10\x4a\xb6\ -\xa4\xba\xcb\xcf\x87\x2c\xc9\xcf\xd7\x7f\x8f\xdf\x0f\x3b\x0c\x00\ -\x60\x67\x6d\x0a\x3e\xf7\x46\xe3\x72\xf1\x4a\xb4\x2a\x4b\x24\xed\ -\xeb\x86\xa2\x86\x06\x2d\x33\x27\x97\x0d\x76\xbc\x34\xf1\x72\x8c\ -\xce\x1d\xa2\x7b\x44\x10\xc3\xec\xb5\x44\x97\xed\x9b\xed\x3c\x54\ -\x56\x8a\xc7\x79\x6b\x9e\xc0\x7b\xde\x75\x50\x6a\x65\xd1\xb3\x34\ -\xee\xe8\xaa\x0f\x93\x7f\xfc\x0a\x39\x0b\xd4\x64\xad\x36\xf1\x99\ -\x20\x38\x74\xf2\xdd\xb0\x05\x6c\xa0\x94\x41\x8e\xcd\xa9\x91\x0f\ -\xba\x03\x5e\x21\x8e\x24\xd2\xb2\xa8\x32\x5a\x4b\xce\x30\x0a\x02\ -\x1e\x04\x36\x96\x85\xd3\x62\xd5\x20\x22\xc8\x07\xc5\xeb\xd3\x92\ -\x67\x4c\x55\x8f\x86\x18\xf1\xf7\xf8\xd8\x32\x19\x28\xfe\x6e\x70\ -\x2e\xc5\x6b\x13\xf4\xfa\x3d\x58\xda\xb6\x23\x44\x07\x94\x8b\x3a\ -\x50\xdd\x02\xf0\x01\x21\xb6\xae\x0b\xbd\xe8\x09\xf4\x0a\x74\xc8\ -\xb3\xc8\xb4\x5a\x15\xf2\x84\x27\xe8\x47\x80\x06\x15\x6d\x10\x1a\ -\x39\x47\x89\x72\x9b\x0a\x32\x6b\xb6\xcd\xa1\x7a\x4c\x58\xef\xde\ -\x60\x00\x2c\x2c\xe0\xc5\x7a\x70\x9a\x73\xd0\x20\x3c\x41\x33\x39\ -\x4a\x55\x6c\xd7\xec\xbe\xd2\x5f\x26\x1a\x23\x41\x50\x45\x69\x5b\ -\xe5\xb0\x07\x36\xa6\x66\x80\x79\x72\x00\x00\x20\x00\x49\x44\x41\ -\x54\x68\x00\xe1\x99\x67\x9e\xc5\x8e\x1d\xdb\xe5\x85\x25\x0c\x8b\ -\x9b\x6f\xba\x09\xa3\x46\x8e\x0c\x31\x64\x9b\x0d\x77\xdc\x7e\x3b\ -\xba\xbb\xbb\x65\xe4\xd9\xec\x36\x64\x66\x46\xbf\xfa\x52\x54\x54\ -\x84\x7f\x3e\xf4\x50\x28\x80\x8e\x30\x18\x3e\xbc\x24\xee\xf1\x7e\ -\xf1\xc5\x97\xf8\xfc\xf3\xc5\xa1\x94\xd2\x0c\x83\xfc\x82\x02\xfc\ -\xf3\x9f\x0f\x8b\xd7\xca\xc4\x11\x92\xc8\x59\x77\xf4\x6a\x59\x11\ -\x51\xb0\x7f\xf6\x99\x67\xe0\xf5\xfb\x04\x52\x21\x44\xc3\x49\x09\ -\x43\x40\x79\x8a\x87\x1e\x7c\x10\x0c\xc3\x2a\xaa\x28\xab\x37\x46\ -\x65\x45\x25\x16\x3c\xb3\x40\xf1\xf1\xa6\x4d\x9b\x70\xe3\x8d\x37\ -\xca\x57\xbf\x88\xce\x7d\x0a\xc2\x10\xac\x5e\xbd\x26\x02\x61\x93\ -\x98\xed\x15\xd7\x5e\x3b\x0f\xa3\x4b\x4b\xe5\xe4\x11\x44\x54\x58\ -\xc3\x83\xfa\x2c\x16\x0b\x9c\x4e\x65\x26\x2e\xb7\xdb\x8d\xbb\xef\ -\xbe\x07\x41\x2e\x18\x26\xf4\x68\xdd\xec\x2c\xc3\xe2\x41\x31\xe1\ -\x05\xcb\xb2\x21\xdc\x51\x3d\x61\x4b\x39\x95\x43\x0f\x9d\x65\x5a\ -\x61\xd7\x32\xcf\xb4\xf5\x6e\xb0\xc2\xc3\x4d\x5f\x01\x00\x1e\x9a\ -\x70\x4e\xbf\xf4\xd7\x19\xf4\xa0\xd6\xdf\x0a\x80\xc1\xa4\xcc\xe2\ -\x3e\xb7\x97\x6b\xcd\xc4\x25\xc5\x47\x24\x44\x82\xc9\xb6\x38\x70\ -\xd1\xb0\x39\x7d\x2a\xd1\xa0\x86\x49\x19\x92\x52\xd4\x8f\xf6\xd3\ -\x28\x85\x1c\xa3\x02\x17\xe7\x9c\x19\x65\x57\x4e\x8b\x15\xde\xa0\ -\x36\x8b\xd9\xda\xde\x6a\x7c\xd7\xb2\x0d\x47\x0f\x99\xa8\xf8\xbc\ -\x3b\xe8\xc6\xbb\x4d\x3f\x23\x65\x2d\xc0\x03\x68\x1d\x4f\x1e\x8f\ -\xa5\x86\x76\x3b\x3d\x68\x0d\x76\x62\xc2\x8a\xfb\x10\xb4\x01\x25\ -\x6c\x31\x3e\x2e\xbf\x1c\xe3\x72\x0b\xe5\xef\x83\x94\xc7\xb9\xeb\ -\xdf\xc4\x2a\x5e\x94\x69\x02\x1e\x80\xe3\xc2\xf6\x14\xd1\xd4\x32\ -\x22\x14\x80\x45\x10\x01\x29\x6b\x81\x13\x99\x78\x7f\xfc\x65\x38\ -\x6c\xc8\x38\x4d\xff\x8b\x5a\xd6\x45\xc8\xa2\x93\x86\xf8\xc9\x20\ -\xb6\x3d\x7f\xd9\xf6\xff\xc0\x51\xe5\x00\x43\x33\xf0\xf0\xb0\xd3\ -\xf1\x87\x52\xa5\xfc\xf0\x4e\xed\x7a\xdc\xb6\xf7\x43\x04\xd9\x5e\ -\x50\x2e\x28\xd0\x80\x64\x1c\x21\x06\xfd\x13\xc1\x68\x43\x59\x16\ -\xb0\x58\x71\x41\xe6\xc1\x78\x66\xf2\x05\x9a\x47\xbf\x6e\xdf\x84\ -\x1a\x5f\xc7\xbe\xbe\x20\x7a\x4a\x51\xff\xd4\x09\x19\x68\x6b\xf8\ -\xa2\x45\x8b\xf0\xed\xb7\xdf\xc8\x87\x2f\xc3\xb2\xb8\xf0\xfc\xf3\ -\x31\x52\x54\x8a\x24\xfa\xb9\xf2\xca\x2b\x14\x9a\xb8\x59\x28\x18\ -\x52\x80\x5b\x6e\xb9\xd9\x50\xc5\x8d\xf5\xd0\x5f\xb1\x62\x05\xe6\ -\xcf\x9f\x1f\xa6\x14\x11\xfc\xeb\x5f\x8f\xe2\xcf\x37\xde\x98\x10\ -\x7c\x78\xbd\x5e\x4c\x98\x70\x00\x6a\x6b\xab\x23\x0b\x30\x39\x2e\ -\xb4\xb4\x34\xc1\x6a\x89\x5c\xc4\x6b\xf9\x8f\xcb\xf0\xf4\xb3\x4f\ -\x2b\xe6\x59\x55\x55\x15\x4a\xf0\x10\x33\xef\x88\x8f\x60\x08\xc3\ -\xe0\xc2\x0b\x2f\xc0\x9c\x39\x73\x22\x5a\x8e\x88\x8e\xb2\xe3\xf5\ -\x78\xe4\xf1\x72\x5c\xd0\xb0\x8f\x99\x87\x1c\x82\x9f\x56\xad\x32\ -\x37\x9e\xfd\x25\xe0\x38\x46\x93\x5f\xbf\xb3\x03\x03\x47\x15\x89\ -\x3a\x4e\x1a\x63\xbb\x2a\x93\x76\x90\x93\x3f\xfd\xe7\x9e\xc5\xe0\ -\x28\x8f\x07\xca\xcf\x84\x95\x58\xa2\x4b\x46\x7d\x80\x0e\xbf\x1b\ -\xee\x80\x17\x60\x18\x8c\x71\x16\x24\xc6\x22\x4b\x92\xb4\x26\x09\ -\x80\x51\xb6\x7c\xe3\x9a\x90\x7a\xc2\x88\xce\xdd\x72\xdd\xf5\x33\ -\x24\x0c\x3e\x26\x81\x5a\xbf\x39\x0a\x39\xcd\x9a\x9c\x75\x4a\xf2\ -\x34\x86\x2b\x5e\xe1\xda\x23\x00\x96\x05\x08\x90\x67\xc9\xc1\x2b\ -\xa3\x2f\x82\xd3\x61\xc3\xe5\x5b\xdf\x40\x9d\xaf\x55\xb6\x4c\x4b\ -\x31\x8c\x9f\x34\xad\xc7\x09\x85\x53\x15\x63\x5c\xde\xbe\x53\xc8\ -\x3a\xc7\x02\x10\xb3\x00\x12\x55\xfd\x20\x9a\x6c\x3e\x61\xb0\x2e\ -\xbc\x55\x9f\x2e\xd4\xf8\xe3\x44\x04\xb1\x60\x75\xbf\xef\xcb\xb6\ -\xf2\x13\x26\x02\x02\xcc\x5a\xc6\xf5\xde\xd3\xe6\x98\x33\x8a\x4d\ -\x41\x90\x47\x6b\xb0\x1d\xe0\x2c\xc8\xb4\xdb\x60\xb3\x33\x8a\x00\ -\x7e\x2b\xc3\xe2\x99\x29\xbf\xc3\x6f\x7e\x99\x8f\xad\x81\x3d\x80\ -\x8f\x57\x2a\x94\x54\x95\x65\x4b\x02\x31\x86\x2f\xcb\xe2\xc4\x82\ -\xb1\x17\x68\x14\x22\x4a\x29\x1e\xaa\xf9\x04\xef\x36\xfd\x24\x64\ -\x4e\xa4\xfa\x75\x8a\xa8\xa6\xe0\x14\xed\x13\x7f\xa7\x89\xe2\x25\ -\xea\x10\x2d\x4d\x47\xca\x2c\x8b\xd1\x62\x60\xcc\xf7\x6f\x6e\xe3\ -\x98\x26\x4b\x11\xef\xbe\xa0\x0f\xbe\xa0\x0f\xb0\x78\xe0\x66\xb5\ -\xf5\xd8\x2e\x1c\x7d\x20\x56\x7b\x76\xe2\x99\xc6\x25\x22\xdd\xa8\ -\x8c\x23\xbc\x6a\x9f\x89\x6c\x86\x58\x2c\x40\x10\x38\xc5\x39\x1d\ -\x0f\x8c\x3f\x4d\x73\xde\x55\x78\x1a\x71\xc9\x96\x57\xc0\x11\x83\ -\x02\xaf\x84\xf6\x09\x61\xea\xd8\x34\x6a\x16\x61\x49\xb8\x70\xb2\ -\xdf\xaa\xfe\x7a\x07\x56\x4a\x0b\xac\x34\x31\xee\xdc\xc8\x5d\xf0\ -\x71\xe3\x4e\x9f\xd0\x13\x19\xf3\x14\x3f\x4b\x89\x7f\x14\x03\xe3\ -\xb1\x49\xfb\x7f\xf6\x1f\x78\xb4\xf9\x1b\x5c\xbe\xf9\x55\x74\x04\ -\x7a\x93\xda\x4f\x47\xd0\x2d\x8a\x8d\x04\xf9\x31\x16\x58\x1d\x8c\ -\x30\xd4\xd2\xff\x89\x2c\x68\x0c\x1a\x36\x89\x47\xe1\xd6\x79\x8f\ -\x21\x0c\x48\x86\x15\x79\x96\x1c\xbc\x51\x7a\x05\x4e\x1d\x7e\x08\ -\xe6\x0e\x99\x8e\x0f\xa7\xcf\xc3\x08\x7b\x81\xe6\xfd\x73\x8b\x0f\ -\xd1\x34\x78\x60\xce\x28\x14\x5a\x5c\x29\x6e\x5d\x19\xc8\xa3\x37\ -\x49\x63\x20\xf1\x71\xfe\xbd\xbe\x56\x9c\xbf\xed\x25\xb4\x07\x7b\ -\x14\x9f\x8f\x71\x0e\xc1\xe7\x07\x5e\x8f\x03\xac\xc3\x63\x1a\x46\ -\x36\x71\xe2\xd5\xb1\x97\xe1\xf4\x92\x99\x9a\xef\x3e\x68\x5a\x85\ -\xfb\x2a\x3e\x4e\x33\xea\xfe\x15\x4e\xa3\x03\xc7\xe1\xce\xea\x0f\ -\xf1\x65\xcb\x46\xcd\x57\x8f\x4f\x3c\x1b\x57\x17\xfc\x2a\xe6\x6e\ -\x2f\x74\xcd\xc1\x6b\x93\xae\x80\xcb\xa6\xe4\x9d\xed\xfe\x6e\x9c\ -\xb3\xf1\x39\x34\xfa\x3b\xf7\x0b\xf4\x47\xbd\x3e\xb7\xaf\x85\x57\ -\xf3\xa2\xe0\x4f\x54\xd9\xe0\xa8\x54\x13\x46\x75\x59\x39\x71\x8a\ -\x52\x7c\x1e\x22\xd9\x33\x04\x6d\xbc\x0f\x4b\x48\xc2\xc6\x67\x76\ -\x54\xea\xfa\x45\xda\xac\x78\x42\x4b\x3c\xcf\x83\x24\x82\x7e\x48\ -\x58\x21\x81\xb8\xe6\xaa\x5c\x47\x19\x9f\xa6\xda\x8a\x5d\xe9\x4a\ -\xc8\x7a\xec\x0f\xde\xa4\xd4\x2a\x5f\x11\x61\x9c\xaa\x7a\x2d\x7d\ -\x37\x21\x0a\xff\x04\x42\x1e\xa3\xd7\x9b\x97\x61\xb3\x67\x0f\xde\ -\x38\xe0\x72\x1c\x90\x3d\x22\x29\xd3\xf0\x70\x7e\x21\x1c\x8a\xa1\ -\xfb\x45\xd1\x3e\xbb\x14\xab\x45\x63\x5b\x16\xf3\x04\x4b\x0d\xfe\ -\x55\x33\x4c\x46\xf7\x31\xa2\x1f\x39\x00\x75\x56\x27\xb5\xc7\x51\ -\x53\x78\xd3\xc2\x20\x1f\x85\x58\x58\x7e\x31\x8e\x2c\x28\x97\xbf\ -\x9f\x91\x53\x8a\xff\x4d\xb9\x06\xb3\xd6\xdc\x2f\xf2\x63\x8a\x0b\ -\xf2\x67\xe1\xf0\x21\x13\x34\xb3\x29\x76\xe4\xe3\x2f\xa3\x4e\xc2\ -\x2d\xbb\x16\xca\xdf\x50\xa2\xbc\x73\x4f\x40\xf5\x86\x63\x26\xbd\ -\x64\x8c\x07\x90\xb6\x12\x7d\x38\xae\xa4\xc7\x66\xfe\x70\x2f\x9a\ -\xd9\x2e\x00\xac\x78\x66\xf3\x8a\x24\xd2\xbc\x51\x2c\x93\x7c\x28\ -\x09\xf1\xad\x12\xab\x95\xb2\xfb\x3d\x3f\xfa\x12\x9c\x50\x32\x55\ -\x87\x05\x53\xb3\x13\x30\x98\x37\xd5\xae\x27\xd5\x49\xce\xa7\xf1\ -\x70\xa8\x3c\x0e\x62\x6c\xc9\xb2\xee\x9d\xb8\x64\xeb\x7f\xf0\xf6\ -\xa4\x2b\xc4\x82\xd0\xc2\x73\x23\x9d\x05\x58\x7c\xe0\xf5\x38\x6d\ -\xed\x02\xac\xf7\xd4\x84\xe8\x49\x9d\x20\xc9\x4a\x44\xe3\x81\x0b\ -\xef\x94\x5d\x85\x63\x8b\x27\x69\xce\xf1\xa5\x1d\x5b\xf0\x87\xad\ -\xaf\xc3\xcf\x07\x43\x72\x91\xda\xf3\xa2\xca\x7a\x18\x3b\x7d\x0c\ -\xf4\x79\x93\x60\x09\x97\x44\xeb\x90\xc6\xb6\x3b\x88\x8a\x2f\x48\ -\xeb\xc8\xf2\xe8\xf5\xf7\xe0\xf2\x9d\xff\xc1\xbb\xec\xd5\x38\x2c\ -\x5f\xd8\xd7\x36\x46\xb8\xc1\x33\x7f\xca\xf9\xc8\xda\xe6\xc0\x82\ -\xbd\x5f\x03\x00\x7c\xbc\x4f\xec\x9e\x57\xc9\x18\x04\x0e\x9b\x1d\ -\x57\xe5\x1f\x85\x87\x27\x9e\x0d\xbb\x18\xa3\x24\x2d\x77\x0f\xe7\ -\xc1\x45\x5b\xff\x8d\x75\x3d\x75\xe2\x60\xb8\x04\xf1\xd3\xd4\xca\ -\x3a\x1b\x93\x52\xb4\xcf\xda\x80\x08\x19\x54\x2a\x20\xd5\xbd\x42\ -\x40\x52\x7a\xe5\x08\x43\xb4\x71\x85\x71\x2f\x57\xfc\x89\x16\x18\ -\x36\x0e\x21\x30\x06\xe5\x35\xe1\xeb\x40\xd2\xbe\xa2\xfd\x0d\xd6\ -\x7a\xaa\x70\xca\xa6\x05\x58\x79\xe0\x1d\x18\xea\x4c\x92\xd5\x5e\ -\xa4\x2b\x8e\xf2\xfb\x3c\x3e\x07\xa2\xe2\x83\x56\x2c\x36\x1e\x84\ -\x83\xd8\x84\xa0\x66\xc5\xfb\xb1\x6b\x70\xf9\x96\x4c\x7c\x5a\xfe\ -\x47\xcc\xc8\x51\x7a\x07\x02\x5c\x10\x9f\xb5\xfe\x22\xff\x9d\xc1\ -\xd8\x70\xdb\x98\x93\x0d\x5b\xbc\x7a\xc4\xd1\x78\xab\xe1\x27\xac\ -\xed\xaa\x48\xa9\x75\x34\xca\xe8\x57\x11\xa8\x47\x47\xd0\x1d\xba\ -\x66\x28\x5d\xeb\xe1\x18\xe1\x77\x02\xe3\x24\x03\x7a\xe8\x24\x42\ -\x21\xdd\x26\x9d\x8c\x85\x24\x19\x72\x41\x02\xe8\xf3\xe3\x8e\xf5\ -\xb8\x7c\xf3\x6b\x78\x69\xf2\xc5\xc8\xb4\x84\x12\x2f\x8c\x72\x16\ -\xe0\xab\x43\x6e\xc2\xa5\x1b\x5e\xc2\x67\x1d\x1b\x0c\xdf\x9f\xe2\ -\x18\x81\xb7\x27\x5d\x83\xc9\xb9\x5a\xcf\xd2\x9a\xee\xdd\x38\x6f\ -\xf3\xbf\xd1\xcd\x79\xd2\xcc\x79\x00\xa8\xde\x2c\xec\xf5\x77\xe0\ -\x9c\x6d\xcf\xe3\x9b\xe9\x37\x63\x42\xa6\x72\x1d\x1f\x98\x78\x3a\ -\x46\x38\x5d\xb8\x7d\xf7\x07\xc6\x7c\xc8\x66\xc7\xc3\x25\x67\xe1\ -\xaa\xd2\xa3\x35\xdf\xf5\x04\xdd\x38\x77\xcb\x73\x58\xdc\xb6\x11\ -\xfb\xd3\xfd\x15\x8b\xa1\x2c\x18\x2b\x0e\x52\xd4\xf2\x4b\x41\xf1\ -\xe4\x93\x4f\x61\xf9\xf2\x1f\x43\x25\x55\x18\x06\x1b\x36\x28\x99\ -\x05\xe5\x79\xdc\x79\xd7\x5d\xc8\xcd\xcd\x0d\x1d\x68\x44\x69\x39\ -\x01\x00\xbb\xc3\x89\x67\x16\x2c\x40\x76\x76\x76\xc4\x7e\xeb\xea\ -\xea\x70\xeb\x5f\x6e\x05\xcf\xf3\xe2\xbb\x04\x13\x26\x4c\xc0\xdf\ -\xff\xf6\x37\xc5\x73\x2b\x57\xae\xc2\xe3\x4f\x3c\x26\xd4\xa6\x81\ -\x94\xf8\x40\x79\x54\x12\xc2\x60\xcb\x96\xad\x11\x85\x67\x29\x8f\ -\xfc\xfc\x27\x9f\xc2\xb2\x65\xcb\x40\x18\x2a\x5e\x39\x66\xf0\xd7\ -\xbb\xee\xc4\xb4\x69\xd3\x92\xa6\x9c\xd4\xef\xad\xc7\x8d\x37\xdd\ -\x28\xd3\x0f\x21\x04\x39\xd9\x39\x78\xe5\x95\x57\x42\x49\x20\x08\ -\xc1\x9a\xd5\x6b\xf0\xf8\x13\x8f\x29\xde\x3d\xec\xb0\xc3\x71\xd5\ -\xd5\x57\x0b\xb1\x7e\x0c\xa3\x65\x0d\x62\x77\x07\x1d\x74\x90\x29\ -\xc5\xe5\xc6\x1b\x6e\xc4\x41\x07\x1f\x24\xa6\x55\x15\xea\x2e\x95\ -\x8d\x2f\x8b\x4a\xb6\x01\xbf\x1f\x57\x5f\x73\x0d\xdc\xee\x5e\xd9\ -\x82\x67\xb7\xd9\xf1\xc2\x0b\x2f\xc0\x6a\xb5\x82\x10\x06\x04\x14\ -\x0d\xf5\x0d\xf8\xcb\xed\xb7\x81\xe7\xb9\x98\x74\x18\x4a\x29\xbe\ -\xfd\xf6\x3b\xbc\xf0\xc2\x73\x21\x7a\x22\x04\xbf\x3b\xed\x34\x5c\ -\x70\xc1\x05\x8a\xed\x73\xd1\x45\x17\x62\xe6\x21\x33\x15\x5e\xb9\ -\x67\x9f\x7d\x16\xcb\x96\xfd\x38\x28\x18\x75\x2c\x0c\x83\x0e\x1c\ -\x63\x88\x8f\x8f\xc5\x2a\xb7\x1a\xc5\x16\x85\xa4\x57\x71\x03\x33\ -\xa8\x08\x34\xe0\xbb\x96\xed\x38\x6b\xc4\xac\x84\xeb\xc5\xf9\xd6\ -\x2c\xb0\x94\x05\xc7\x50\x74\x71\x6e\xc3\xfc\x1f\xfb\x0a\x74\xf2\ -\x1e\x65\x5a\x6b\x0d\x19\xc7\x6b\xa9\xa4\x11\x08\x46\x07\x99\xbc\ -\x3e\xa2\x8b\x98\x6c\xcd\xf9\x12\xa0\x3c\xc2\xd2\x38\xea\xf6\xa7\ -\xf6\xd4\x67\x58\xec\x98\x91\x37\x42\x51\xbf\xad\xd3\xd7\x83\x3f\ -\x57\x2f\xc4\xab\x75\xcb\x64\xe5\xf0\x8a\xc2\x23\x30\xd9\x35\xca\ -\x90\x59\x39\x59\x3b\x1e\x2e\x3b\x1b\x27\xaf\x7b\x5c\x20\x4b\x3e\ -\xa0\x4b\xd0\x84\xc4\xeb\x31\x4a\x0c\xeb\x91\xed\xdb\x01\x4e\x88\ -\x71\x51\x6b\xc1\x54\xc4\x9d\xd9\x18\x07\xe9\x7b\x56\x88\xf1\xe1\ -\xf5\x2a\x10\xd3\x44\x30\x18\x6d\x1d\x17\x5d\x63\x1a\x35\xc9\x4f\ -\x3c\x42\xac\xc8\x42\xba\x06\xd8\x04\xbc\x38\xf9\x22\x64\x5b\x33\ -\xe4\x36\x87\xda\x73\xf0\xc1\x41\xf3\x70\xef\xae\x45\x78\xac\xee\ -\x2b\x04\x33\x19\xc0\xcd\x03\x0c\x2f\xc4\xd9\xe6\xce\xc1\xfc\xf2\ -\x0b\x90\x97\x91\xa5\x39\xa7\x7e\xea\xda\x85\xdf\x6d\x7a\x46\xb8\ -\x2e\xc5\x47\xa9\x85\x68\x20\x30\x0e\xb8\x79\xd9\x74\xb6\x41\xfd\ -\x34\x66\xb4\xaf\xb1\x2b\xd4\x24\x26\x62\x65\xf4\x44\x99\x7a\x1e\ -\x3c\xc5\xde\x40\x3b\x7e\xb3\x61\x01\x3e\x99\x3a\x0f\x13\xb3\x84\ -\x9b\x06\x36\xd1\x53\x7e\x43\xe9\x5c\x4c\xca\x1a\x86\x2b\xb6\xbc\ -\x8a\x5a\xae\x15\xb0\x8b\x59\x3d\x83\x01\x8c\xb5\x14\xe1\x95\x71\ -\x97\xe1\xc8\xc2\x89\xb2\x87\x59\x92\x73\x7b\x82\x1e\x9c\xb7\xe5\ -\x39\x2c\x6e\xd9\x24\x4c\x9e\xe3\x0c\x86\x63\x94\xa5\x92\x44\x39\ -\x56\x69\xca\xea\x0f\x03\xea\x29\xea\xaf\xf9\xaf\x5c\xb1\x02\xef\ -\xbf\xf7\xbe\x62\xd1\xf5\xe0\xab\x2f\xbf\x8a\x3a\xe0\x8c\x8c\x4c\ -\x3c\xf6\xe8\xa3\x51\x95\xa2\xae\x8e\x4e\xbc\xbb\xf0\x3d\xf9\xba\ -\x1e\x00\xcc\x99\x33\x47\xa3\x14\xd5\xd5\xd6\xe2\xbd\x77\xdf\x8f\ -\x29\x9d\x73\x24\x58\xb6\x6c\x19\xde\x7f\xff\x5d\x79\xf3\x30\x0c\ -\x83\x3f\xfc\xe1\x32\x53\x4a\x51\xbc\xb1\x31\x1d\x1d\x1d\x78\xff\ -\xbd\x0f\x14\x73\x3d\x64\xe6\x21\x78\xfe\x85\xe7\x15\x2d\x66\x66\ -\x64\x68\x94\xa2\xb1\x63\xc7\xe2\xf7\xbf\xbf\x28\x72\xcf\xc4\x3c\ -\xb5\x1c\x75\xf4\x51\x38\xed\xb4\xd3\x62\x26\x32\x9e\xe3\xb0\xe8\ -\xbf\x8b\xd0\xd9\xd5\x29\x33\x7b\x57\x6e\x1e\xfe\xfd\xd2\x8b\x02\ -\x93\x11\x53\x18\x6f\xdf\xba\x0d\xb7\xdd\x71\x5b\xcc\x87\x26\x05\ -\xb0\x73\xe7\x0e\xbc\xfb\xee\x7b\xa2\xa2\x2b\x0c\x6c\xdc\xd8\xb1\ -\x9a\xd7\x67\xce\x3c\x18\x33\x67\x1e\xac\x78\x77\xf1\xe2\xcf\x07\ -\x58\x29\x4a\x43\x7f\x40\x79\x46\x61\x52\x18\xa3\xcb\x9a\x09\x1b\ -\xb1\xc1\x43\xfc\xd8\x1b\xe8\xd8\xe7\xf1\x58\xed\x6b\x1d\x18\x77\ -\x91\x49\xbe\x30\xca\x91\xaf\xf8\x3b\x48\x39\xf4\xd2\x40\xd4\x26\ -\x6d\x24\xf2\x91\xdd\xe9\xeb\xc1\x45\x3b\x5f\xc2\x67\x4d\xeb\xe5\ -\xcf\x86\xd9\x73\xf1\x97\x31\x27\x2b\x14\xaa\xd6\x40\x0f\xd6\x7b\ -\xea\x70\x5c\x4e\x28\x13\xdd\xd1\xf9\x13\x71\xf9\xb0\x5f\xe1\xa5\ -\xfa\xef\x53\xea\xac\x8f\x98\x45\x99\xf4\xc3\x38\x53\xdc\x70\xb0\ -\xb0\x73\x0d\xbc\x1b\x03\x78\x7d\xea\x65\x8a\xa2\xd0\x0e\xd6\x86\ -\x07\xcb\xcf\xc6\x51\x79\x13\xf0\xc7\x9d\x6f\xa3\x26\xa3\x05\xc5\ -\xc8\xc3\x93\xc3\xcf\xc5\x99\x23\x0e\xd1\xbd\x46\xbb\xb8\x75\x3d\ -\x2e\xdc\xfa\x52\xd2\x63\x1c\xd3\x90\xd8\xbd\x52\xe1\x6b\xc2\xb1\ -\xeb\x9e\xc4\xa2\xc9\x57\xe1\xd0\x3c\xa5\x11\x78\xee\x90\x29\x58\ -\x35\xfb\x4e\x5c\xbf\xf5\x6d\xbc\xdf\x2b\x78\x8f\xaf\xcc\x3b\x06\ -\x0f\x8d\x3f\x0b\x79\x0e\x6d\xec\x65\x8b\xbf\x0b\x97\x6e\x7b\x09\ -\x9f\xb5\xee\x5f\x1e\xa2\x08\x4a\x51\x9c\x16\xb4\x38\x70\x47\xfb\ -\x89\xc4\x08\x4d\x50\xb0\x24\x35\xaf\x3a\x50\xb3\x29\x37\x79\x3e\ -\x86\x6b\x13\xc6\x28\x27\x61\xed\xa9\x0d\x39\xa6\x8b\xcd\x92\xd8\ -\x17\x4e\x30\xc6\x0a\x7d\x32\x84\x09\xc5\x6c\x31\x52\x8a\xf0\xc8\ -\xb5\x7f\x18\x86\x11\x6b\x13\x92\x84\x70\x0f\x46\xf4\x0e\xc5\xbc\ -\xb4\x54\xaa\x24\xad\xb2\xcc\x42\x1d\x5b\x46\x95\x09\x24\x88\x39\ -\xd9\x8b\xc8\xe6\x14\xa5\xa5\x55\x63\x20\x51\x8d\x5d\xf2\x00\x0e\ -\x7c\xb1\xe3\xc4\xf6\xdf\x67\x79\xb5\xaf\x96\x25\x23\x36\x97\xec\ -\x8c\x6a\x86\xeb\xc8\xa3\xd4\x56\x84\xf2\xec\xe2\xa4\x1c\x43\xf9\ -\xb6\x0c\x14\xd8\xb3\x51\xc7\xb5\x61\x5b\x6f\x7d\x9f\xeb\x89\xa4\ -\x3a\xec\x70\x37\xea\x2f\x26\x89\xb6\x0e\x49\x16\x61\xc4\xc7\x27\ -\x65\x96\x28\x70\xdf\x13\xf4\xa2\x97\xf7\x41\xf6\x10\xa9\x4b\xae\ -\x8b\x7f\xe6\xb2\x99\xba\x7c\x9f\x52\x8a\x3d\x9e\x36\x9c\xbd\xfd\ -\x79\xac\x6c\xdd\x29\xd7\x33\x22\x16\x06\xf7\x8e\xf8\x2d\x4a\x32\ -\x95\x75\x7e\x16\xb6\xac\xc4\xa3\xf5\xdf\x61\xcd\xe4\xbf\x20\xcf\ -\x9e\x03\x56\xbc\x86\x76\xdf\xb8\x53\xb1\xb8\x75\x23\xaa\x7c\x8d\ -\xc2\xfb\x9a\x3a\x83\x46\x31\x55\x03\xa5\x41\x10\xa3\x03\x4d\xcd\ -\x58\x0d\xf6\xa1\xba\xd0\x0e\x8d\xa2\x6d\x99\x2d\x80\x43\xa2\xa2\ -\x47\xb7\x25\x5e\x3d\x6e\x1a\x99\x8d\x78\x84\x58\x91\x0f\xf9\xf5\ -\xf8\xf5\xba\x05\x78\x7f\xea\x55\x28\xb2\xe7\x2a\x4a\x81\x9c\x5c\ -\x78\x20\xd6\xe4\x8e\xc3\xc2\xfa\x35\x38\x7b\xe8\x0c\x14\x66\xb8\ -\x42\x1e\x11\x91\x4e\x78\xca\xe3\xd9\x86\x25\xb8\x75\xd7\xfb\x42\ -\x3a\x77\xd9\x43\xc4\x1b\xcc\x96\x46\x66\xa8\xa9\xc6\xdf\xfb\x2b\ -\xa6\xc8\x58\xc0\x88\x6d\x9f\x50\x56\xf1\x18\x31\xb8\x59\x41\xc4\ -\xf5\xa1\x01\xa0\x21\xd0\x82\x13\x36\x2e\xc0\xab\x65\x17\xe1\x37\ -\x45\x33\x04\x23\x0a\x6b\x15\x0d\x23\xf9\x78\xef\xc0\x79\x78\xbf\ -\x61\x35\x86\xb2\x39\x38\x6a\x68\xb9\xa2\x1d\x4e\xf4\x04\x6d\xf1\ -\xec\xc5\x85\xdb\xfe\x8d\x8d\x1d\xb5\x50\xd4\x59\xd3\x6c\x2f\x93\ -\x2e\x58\x4d\x6c\x5c\x94\x7a\x50\x29\xa0\x44\xec\x1f\xd9\xe7\x48\ -\xff\x37\xa5\x27\x98\x13\xa3\x3c\xff\x09\x5c\x58\xdd\x2b\xd3\x66\ -\xeb\x0b\xd0\x78\x10\x40\x4d\xe3\x49\x17\x27\x7d\x59\x0b\x83\x79\ -\xd1\x04\x2d\x2c\x31\xf5\x28\xe9\x27\xd2\xa4\x48\xc3\xbe\xcc\xa3\ -\x28\x8e\xcc\x2a\x83\x53\x55\x34\x2f\x51\x60\x63\xac\x38\x30\x73\ -\x34\x40\x29\x36\x78\x6a\xf7\x69\x54\x7a\x79\x2f\x36\xf6\xd6\xa5\ -\xf4\x18\x8f\xcc\x2b\x57\x6c\xfe\xbd\x81\x76\xf4\xf2\xfe\xa8\xef\ -\x65\x5b\xac\xba\x46\xb4\x4d\x3d\xb5\x38\x66\xe3\xa3\x58\xd9\xba\ -\x53\xf1\xf9\x51\x39\xe5\xb8\x78\xc4\x11\x8a\xcf\x9a\xfd\xed\x78\ -\xb4\xfe\x3b\x54\x77\x34\xe0\xa1\xaa\xcf\x15\x06\x97\xa1\x36\x17\ -\x9e\x2a\x3f\x7f\x10\xac\x72\x72\xf8\x61\xff\xa9\x74\x24\xe1\x9d\ -\x2f\xeb\xd9\x85\xc3\x7e\x79\x14\x2b\xda\x76\x68\xbe\x1b\x62\xcb\ -\xc6\xbc\xd1\x47\x0b\x0a\x91\x0a\xda\xfc\xdd\xb8\x74\xc7\x2b\xb8\ -\x7e\xe7\x3b\xba\xf5\xad\xd2\x90\x3c\x60\x74\x0d\xb8\xf1\x13\x42\ -\x77\xd0\x8d\x4b\x76\xbe\x81\x87\x2b\x16\xeb\x7e\x7f\x56\xf1\x4c\ -\x8d\x42\x24\xc1\x07\x2d\x6b\x70\xf4\xc6\x47\xb1\xb1\xb3\x76\xff\ -\x5e\x13\xbd\xc3\x19\x24\x0e\x86\x43\x07\xb9\xdc\x26\x66\x37\x23\ -\x0c\xa3\xf8\xd1\xa3\x57\x0a\x1e\x3c\xcf\x83\xa7\xc2\x8f\xae\x15\ -\x9f\x84\x62\x5a\xa4\x1f\x0b\x43\x40\x29\x0f\x4a\xc3\xde\x35\x5c\ -\x19\x06\x88\x34\x0e\x83\xf1\xab\xfb\x15\x3c\x27\xda\x65\xe2\x55\ -\xe3\xe0\x39\xce\x9c\xc7\x4a\xf7\xaa\x74\x18\xde\xc2\xfa\x95\xb6\ -\xb7\x94\x97\x86\xa7\x14\x0c\xcb\x82\x61\x59\x43\x1c\x53\x4a\x41\ -\x29\x15\xf0\xab\xc2\x31\xd5\xa9\x96\xac\x5e\x2f\x86\x00\x94\xe7\ -\x34\xef\xa9\xdf\xa7\x94\x0a\xdf\xf3\xc2\x0f\xcf\xf1\x00\x51\xb5\ -\xc5\xb0\xb0\xda\x6c\xb0\xda\x6c\xa1\xf7\x08\x23\x78\xc1\xc2\xe6\ -\xcb\xb2\xac\x8e\x61\x88\x86\x70\x1b\x36\x96\xf0\xf7\x18\x86\x11\ -\x8a\xbd\x46\x61\x9a\x0c\x21\xfb\x9e\x4e\xd4\x57\x7e\x41\x30\x48\ -\x3d\xfb\x54\xf9\x23\xf1\x5b\xc2\xe0\x98\xbc\x03\x8c\xdf\xa2\x14\ -\x3b\xdc\xf5\xf8\xc3\x8e\xd7\x30\x6d\xed\xdf\x70\xf4\xba\x87\x71\ -\xe7\xf6\xf7\xf1\x65\xf3\x06\xb4\xfa\x3a\x11\xe4\x83\x21\x6f\x67\ -\xd8\x3b\xe1\x08\xfb\x55\xd6\x18\x80\x32\xd8\xee\xa9\x47\x65\x6f\ -\x23\xf6\xd5\xab\x11\x5b\x7b\xf7\xa0\xd6\xd3\xa1\x3f\x3f\x43\xba\ -\x8b\x91\xa0\xcc\x3c\x4e\x74\x3a\x66\x84\x00\xf7\x49\x05\xa3\x14\ -\x8f\xae\xed\xaa\x06\xaf\x28\x52\xaa\x1a\x28\x15\x5c\xd2\xff\xed\ -\xdc\x88\x1e\xce\x2d\x9f\x23\x94\x52\xac\xec\xda\x85\xb9\xeb\x9f\ -\xc4\xae\xae\x06\x20\xc8\x03\x41\xe1\x5c\xc9\x71\x64\xe1\x5f\x63\ -\xcf\x91\xad\xc5\x02\x4d\xf0\x78\x6c\xcf\x17\xa8\x69\xae\x03\x09\ -\x04\xb1\xa0\xfe\x7b\x6c\xee\x51\x2a\x90\xbf\x29\x9c\x81\x79\x25\ -\x27\x00\x94\x80\x8a\xff\x69\xa7\x26\x95\x0b\x27\xd2\xa1\x28\x0e\ -\x57\x35\x6e\x96\x08\x3f\x24\x49\xfb\x58\xb3\x9e\x6a\xbc\x19\xfc\ -\xa8\xc1\x4a\xe4\x8c\x6c\x7d\x12\x52\xe5\x3e\xa8\xea\x47\x3a\x78\ -\xc5\x1f\x09\x25\xd1\xf8\xa0\x06\xaf\x62\x7d\x23\x42\x45\x6b\xbd\ -\xf0\xc3\x20\x08\x06\x41\x54\x06\x1a\x70\xc2\xd6\x67\xf1\x61\xdd\ -\xba\xc8\xce\x50\x11\xef\x9b\xbb\xf7\xe0\xc8\x0d\xf3\xf1\x46\xf3\ -\x2a\x50\x0e\x20\xe2\x0f\x78\x4e\xf8\x11\xc7\x2f\x2d\x13\x23\x09\ -\x8d\x54\xba\x22\x91\x24\x46\x4c\xf6\x11\xf6\xa4\x5e\x7f\xe9\xc7\ -\x2a\xfc\xb0\xba\x86\x5d\x12\x22\x14\x9e\x02\x3c\x95\xf7\x3b\x81\ -\xf0\x23\xb5\x4b\x09\x11\x32\x45\xb2\x54\xf8\xe1\x79\x74\x53\x37\ -\xee\x69\xf8\x0c\x97\xaf\x7f\xc3\xd4\x10\x3d\x41\x3f\xae\xdd\xf1\ -\x2e\x2e\xd8\xf9\x0a\x3a\xbc\x1e\x30\x8c\x35\xd4\x3f\x15\x7e\x08\ -\x28\x08\x28\x18\xf1\x47\x56\x13\x44\x3a\x50\xff\x97\x30\x3e\x3b\ -\x00\x74\x62\x41\x1a\x64\x78\xf2\x89\xf9\x28\x9f\x50\x0e\x96\x08\ -\x8a\x44\x30\x18\xc4\xa5\x97\x5e\x86\xc6\xa6\x86\x10\x01\x79\x3c\ -\x38\xe3\x8c\x33\x65\x41\x98\x52\x20\x3b\x27\x07\x9f\x7c\xf4\x91\ -\xa2\xad\xd1\xa3\x47\xe3\xb3\x4f\x3f\x95\x95\x04\x50\x8a\xba\x9a\ -\x6a\xcc\x9d\x3b\x17\x41\x4e\x20\x32\x10\x06\xad\x2d\xad\x1a\xea\ -\xf9\xf5\xaf\x7f\x8d\xeb\xaf\xbf\x21\x74\x15\x8c\x52\xbc\xf9\xc6\ -\x9b\x78\xf5\xf5\x57\xa3\xce\xe1\xee\xbb\xff\x8a\xab\xaf\xba\x52\ -\x11\x38\x77\xf0\xc1\x07\x6b\x9e\xbb\xf2\xca\x6b\xb0\x7b\xf7\x0e\ -\xf9\xa6\x00\x21\x0c\x9a\x9b\x9b\x62\xb6\xd1\x11\x42\x30\x6a\xf4\ -\x28\x7c\xf6\xe9\xa7\x60\xc2\x52\x84\xe7\xb8\x72\x34\xd4\x7b\xf8\ -\xe1\x87\xe3\xf3\xcf\x16\x0b\x4a\x1a\x11\x8e\xd4\x92\x12\x6d\xe6\ -\x9b\xb7\xdf\x7e\x07\x2f\xbe\xf8\x82\x70\x1c\x8b\xc9\x22\xae\xbe\ -\xfa\x2a\x9c\x77\xee\xb9\x8a\xe7\x6e\xb9\xf9\x26\x5c\x78\xc1\x79\ -\x72\x32\x07\x80\xe2\xdd\x85\xef\xe0\x5f\x8f\x3d\x26\xde\x82\xa0\ -\x20\x0c\x8b\xa7\x9f\x7e\x0a\x93\x0e\x50\xa6\x1c\xbd\xe8\xf7\xbf\ -\xc7\x9e\x3d\x7b\x42\x67\xa2\xd5\x86\xff\xbc\xfa\x32\x32\x9c\x42\ -\xb0\x2a\x43\x18\x58\xad\xda\x02\xb5\xa3\x46\x8d\xc4\xa7\x9f\x08\ -\x73\x95\x0e\xb6\x9c\x1c\xad\xf5\x6d\xd9\xb2\x65\xb8\xe7\x9e\x7b\ -\x84\xeb\x6f\xa2\x32\x34\x65\xca\x54\x2c\xfe\x6c\x31\x18\x86\xc8\ -\x57\x67\x4a\xc7\x94\xa6\x37\x5e\x1a\x60\x87\x1d\x47\xe6\xeb\x27\ -\x04\xe9\x0a\xf6\xe2\xb1\x9a\xaf\xf0\x68\xdd\x57\xe8\xe1\x3d\x72\ -\x0a\xe2\xa5\x1d\x9b\xf1\x60\x03\x81\x1d\x36\x8c\x75\x0c\xc1\x44\ -\x67\x11\xca\x1c\xc3\x50\xea\x18\x82\x62\x87\x0b\x79\x8c\x13\x16\ -\x30\x60\x09\x03\x0a\x20\xd3\x6a\x97\xdb\xfc\xa4\x75\x23\xae\xcb\ -\x2c\xda\xf7\x14\x23\x4a\xb1\xa8\x69\xed\x40\x58\xd5\x74\x15\x07\ -\xed\x87\x0c\x2e\x2f\x3e\x52\xf3\xf1\xb7\x6d\x5b\x4c\xdd\x29\xfd\ -\xb2\x73\x13\xce\xda\xf4\x02\xde\x9a\x74\x19\xf2\xad\x39\xf8\xbc\ -\x6d\x3d\xce\xdf\xf4\x0a\x3a\xfd\xdd\xca\x6e\x2c\x0c\x6e\x1b\x7e\ -\x12\x0e\xcc\x55\xf2\x97\x0d\x3d\x55\x78\xbe\x2e\x14\x33\xe4\xe6\ -\xdc\xb8\x69\xd7\x7b\xf8\x72\xc6\x4d\x8a\xe7\xee\x1f\x7f\x3a\x96\ -\xb5\x6f\xc7\x3a\x77\x4d\x2a\x58\x2c\xa3\xda\xe6\x12\x67\x1b\xed\ -\x9f\xac\xb4\x04\xac\xae\xfc\xdc\x17\x18\x6a\xcd\xc5\x5c\xd7\x64\ -\x9c\x33\x74\x26\x7e\x95\x5f\x6e\x6a\x6b\x17\x3a\x5d\x98\x37\xfc\ -\x28\xbc\xd9\xfc\x33\x7e\xe9\xac\x82\x8f\xeb\x49\x33\xe3\x7e\x04\ -\x27\x6b\x4f\x28\xa5\x39\xed\x76\xcc\xce\x18\x87\x33\x87\xcc\xc0\ -\x6f\x86\x4e\x37\xf7\x8e\xc5\x86\x33\x8a\x0e\x82\x87\x09\xe0\xab\ -\xd6\x2d\x68\xf2\xb5\xef\xd7\x6b\xa2\x55\x8a\xd4\x75\x39\x62\x5d\ -\xad\x38\x2b\xd9\x0f\xf4\xd1\x4c\x08\x83\x43\x67\x1f\x8a\x43\x67\ -\x09\xc5\xed\xfc\x7e\xc1\x8d\xec\x74\x2a\xaf\xb3\xf0\x1c\x87\x1f\ -\x7f\x50\x06\xbc\xbb\x5c\xb9\xe0\xc5\xbb\x97\x92\x87\x24\x33\x33\ -\x13\x27\x9c\x30\x57\x31\xcf\xef\x97\x2c\xc1\x92\xef\x96\x0a\x7f\ -\xf3\xc6\x89\x15\x86\x0f\x1f\x8e\x13\x4f\x3c\x41\x29\x64\xff\xb8\ -\xcc\xd4\xb1\x31\x7d\xfa\x34\x53\xcf\xad\x5a\xb1\x12\x9b\xb7\x6c\ -\x4c\x48\xba\xf8\xac\xac\x2c\xcc\x0d\x9b\xab\xde\x7a\x12\x00\x45\ -\x45\x85\x9a\xe7\xf4\xa0\xa6\xa6\x06\x4b\x97\x2e\x95\x95\x3a\x00\ -\x38\xe9\xa4\x13\x15\xad\x12\x42\x30\x75\xea\x14\x4c\x9d\x3a\x45\ -\xf1\xee\xbf\x1e\x7d\x0c\x4b\x45\x1c\x0b\x32\x08\x8b\xce\x0e\x6d\ -\xd1\xb1\x55\x2b\x56\x62\x77\xe5\x6e\xb9\x4d\xab\xd5\x8a\x85\x0b\ -\xdf\x41\x7e\x5e\x5e\xc4\xb1\xa9\xd7\xd5\x88\x9e\x9b\x1a\x9b\xb0\ -\xe4\xbb\xef\x14\x77\x68\x47\x8f\x2e\x95\xdf\x95\xeb\x26\x21\xf2\ -\x0d\x76\x5e\xae\xab\x94\x7a\x82\x49\x1f\x37\x5c\x7c\x84\x97\x2c\ -\x86\x61\x68\x24\x36\x59\x92\x9c\xc6\x36\x6f\x75\x68\x4b\x99\xbd\ -\x08\xa3\x32\x95\xc5\x36\x03\x7c\x10\x1f\x34\xaf\xc6\x5d\x15\x8b\ -\x50\xe1\x16\x0d\x16\x9c\xea\xae\x36\x4b\xe1\x83\x0f\x5b\xf9\x3a\ -\x6c\x75\xd7\x85\x7c\xff\x9c\x6a\x7c\x9c\x32\x56\xe5\x3f\x4d\x2b\ -\x30\x6f\xe4\x31\x60\xc9\xbe\x65\x17\xf3\xf0\x3e\xbc\x53\xff\x13\ -\x52\xa1\x0e\x06\x13\x1e\xa7\x29\x1a\xa9\x46\x5b\x0a\xf0\x87\x51\ -\xca\xc2\x8a\xed\x81\x6e\x7c\xd1\xba\x19\x42\x79\x79\xaa\xbf\x4f\ -\x24\x42\x09\x72\xf8\xb2\x75\x3d\x4e\xda\xf4\x14\xce\x2c\x98\x8a\ -\xff\xdb\xfd\x25\xdc\x9c\x57\xb0\xea\x03\x80\x45\x78\xfe\xa8\x9c\ -\x72\x5c\x37\xf2\x38\xf9\x3c\xf2\x73\xc2\x79\x76\x5f\xf5\x47\x70\ -\x07\xfc\x0a\xef\xcf\x57\x6d\x9b\xf0\xca\x9e\xef\x71\x69\x49\x48\ -\x59\x73\x59\x33\xf0\xc2\x94\xcb\x70\xec\xea\x87\xd1\xc3\x79\x74\ -\xea\xe7\x18\x90\xbf\xfa\x17\x8e\x26\x67\x19\x18\x46\x4c\xb1\x2d\ -\xc5\xb0\xf0\xd0\xdd\x58\x11\x94\x67\x05\x7e\xd9\xb0\x35\xeb\x93\ -\x4e\xa4\xde\x9f\x62\xbb\xac\x45\x94\x1f\x78\xd8\x6c\x0e\x38\x28\ -\x8b\xa1\xf6\x1c\xc5\xf2\x52\x84\xdd\xd2\x51\xf1\x47\x8a\x30\x3a\ -\x22\x0c\x18\x86\x20\x83\xb5\xa3\xcc\x51\x8c\xa3\x5d\x13\xf1\xeb\ -\xbc\xa9\x38\x24\xa7\x14\xb9\xce\xd8\x8a\x16\x17\xda\xb2\x31\x6f\ -\xf8\x91\x98\x37\xfc\x48\x6c\x76\x37\xe0\xdb\xf6\xed\xf8\xb2\x6d\ -\x0b\x7e\xe9\xaa\x42\xb3\xbf\x13\x01\x3e\x00\x4a\x39\x48\x29\x59\ -\x79\xd1\x18\x4c\x82\xc1\xe4\xf0\xe3\xfe\xe6\xef\xb1\x8e\xcb\xe4\ -\x73\xa1\x18\x20\xf1\x03\x31\x53\x22\x63\x11\xe9\x80\xf2\x00\x4b\ -\x30\xce\x3e\x54\xf5\x3a\x85\x9f\x70\x1a\xbe\x21\xd1\x03\xe5\xc5\ -\x20\x71\x46\xb8\x15\x64\x21\x16\x14\x59\x72\x71\x78\xce\x78\x9c\ -\xe4\x9a\x82\x63\xf2\x26\x60\x54\x66\x41\xcc\x65\x48\x4e\xcc\x9f\ -\x80\x13\xf3\x27\xa0\x2d\xd8\x8b\x1f\x3b\x2b\xf0\x49\xcb\x46\x2c\ -\xeb\xdc\x89\x4a\x4f\x13\x7c\x9c\x0f\x3c\xcf\x81\x80\x82\xb5\xd8\ -\x11\x0c\x78\x42\x64\xce\xa8\xe7\x6d\x70\x30\xaa\x43\xf7\x0c\x62\ -\xe5\x52\x81\x9e\xd2\x9e\x22\xc5\x21\x16\xfa\xdd\x66\xb3\xc9\x8a\ -\x51\x42\x17\xc7\xec\x61\x6a\x24\x50\x85\x5f\x8f\xd9\x47\xd7\xa1\ -\x4f\xb7\x6c\xa9\xb9\x77\xf5\xae\x3c\x26\x92\x0f\x53\x4a\x93\xd7\ -\xf8\x80\x40\x3a\xa6\x29\x99\x70\x94\xab\x1c\x56\x36\xc4\x8e\x7f\ -\xee\xaa\xc4\xed\xbb\x3f\xc0\xb7\x9d\x5b\x80\x24\x94\x15\xfa\xa5\ -\xb7\x06\xdf\xb6\x6d\xc5\xdc\x21\x53\xf7\x29\x3c\x7e\xd8\xb2\x06\ -\x3b\xdd\x4d\x29\xb1\xe1\x58\x9d\x6b\xcf\xff\x1a\x7b\x36\xb2\xed\ -\x19\x0a\xe1\x7c\x51\xf3\x6a\x34\xf9\x62\xb3\xd0\xaf\x6e\xaf\xc0\ -\xea\xf6\xdd\x00\xaf\xed\x63\x88\x35\x07\x0b\xc6\x5f\x88\x4c\xab\ -\xd2\xa0\xf7\x5e\xcb\x4f\x58\xdc\xb4\x49\xb7\xbd\x3b\xab\x3e\xc4\ -\xdc\xfc\xc9\x18\x1e\x96\x15\x6f\x66\xce\x18\xdc\x3f\xf6\x4c\xfc\ -\x79\xe7\xdb\x48\x0a\x11\xf6\x55\x9e\xb5\x00\x08\x24\x78\xcd\x92\ -\x4c\x37\x36\x9b\x03\x43\xd8\x1c\xfc\x65\xd8\x09\xc8\x55\x65\xfe\ -\x0a\x46\x29\xea\xe7\xb2\x67\xa3\xdc\x51\x84\x59\xae\xb1\x38\x3c\ -\x67\x3c\x66\xe6\x8c\xc1\x48\x47\xbe\x50\xa8\x98\x44\x4e\x99\x52\ -\xe9\x6d\xc6\xa6\xee\x3a\x1c\x9d\x5b\xae\xc8\x50\x17\x0e\x93\x33\ -\x8a\x31\x29\xa3\x08\xf3\x4a\x8e\x44\x6b\xb0\x17\xdb\xdd\x8d\x58\ -\xde\xb9\x1b\xab\xba\xab\xb0\xa5\x67\x0f\xea\x7c\x6d\xe8\x09\xba\ -\xd3\xcc\x3a\x01\x90\x6d\xcd\xc6\xf1\x59\x93\x70\xd1\x88\x39\x0a\ -\xef\xa4\x9f\x0f\xc2\x1d\x21\x0b\xa5\xc3\xe6\xc0\x30\x6b\x2e\x0e\ -\xca\x1a\x8d\xc3\xb3\xc6\xe3\xc8\xdc\x32\x94\x67\x16\x23\xdb\xea\ -\x04\x08\x89\x68\x6c\xef\xe1\xbc\x58\xde\xb1\x0b\xe3\x1d\x43\x30\ -\x36\xb3\x58\xf7\x99\x7c\x4b\x26\x4e\x2d\x98\x8a\xdf\x16\x4c\x81\ -\x87\xf3\xa3\xc2\xdb\x8a\xb5\xdd\x35\x58\xd1\x5d\x81\xf5\xdd\x35\ -\xd8\xe1\x6e\x44\x17\x80\xa0\x7f\xdf\xad\x5f\xa5\x55\x8a\x8c\x2c\ -\xa3\xd1\x0c\x6f\xfd\x97\xb4\x2e\x69\x42\x1f\xc3\x30\xb2\x30\x4b\ -\x29\x0f\x8b\x85\x35\x65\xa2\x0f\x7f\x44\xed\x31\x92\x3f\xa7\x5c\ -\x54\xa2\x8d\x26\x92\x32\x84\x91\xeb\x28\x10\x03\x26\xc8\x53\x65\ -\x5d\x01\xf5\x38\x38\xb9\x7f\xc9\x03\x21\x5d\x03\xe4\x4c\x8f\x23\ -\x9e\x75\x34\xfd\x1e\xd1\x57\x2a\x08\x21\xe0\x79\x0e\x8c\x14\xbf\ -\x23\x7b\x50\x88\xe6\x39\xfd\x35\x52\xe6\xe1\x97\xef\x73\xab\x2c\ -\x16\x9c\x68\x71\x65\x18\x56\x77\x7c\x54\x95\x0d\x8e\xd1\xc4\x44\ -\x85\xd6\x97\x61\x58\x05\x3d\xb1\x3a\x99\xf1\xa2\x86\x25\xa4\x4c\ -\x21\xd7\x04\x8f\x83\xc6\x99\xa5\x88\xc4\xbd\xbd\x23\xbf\x6f\x58\ -\x80\x9c\x44\xe6\x8b\x7d\x55\x31\xc5\xf5\xf5\x13\x1f\x38\xf8\xd1\ -\xe0\xe9\xc6\xdf\xab\x3e\xc3\x8b\x0d\x4b\x44\x49\x49\x85\x2f\x75\ -\xbd\x23\x89\xdc\x78\x35\x1f\xa6\x06\xe3\x97\xe8\xdd\x82\x7f\x54\ -\x2f\xc6\x71\xf9\x93\x14\xf4\x3e\x98\xc1\xc3\x79\xf1\x50\xe5\x67\ -\x50\x5e\x34\x57\xd3\x59\xff\x29\xf7\x0e\x62\x05\x11\x2d\xb6\x14\ -\x56\xdc\x38\xf4\x58\x9c\x35\x72\xb6\xe2\x99\x5e\xde\x8b\x47\xab\ -\xbf\xd4\xc9\xce\xa4\xa6\x47\x22\x49\xce\xaa\x75\xe6\x14\x7f\x5b\ -\x88\x05\x4f\x8d\x39\x0f\x93\x73\x47\x2a\x66\x5b\xef\xef\xc0\xbd\ -\x95\x1f\x21\x28\xd6\xc5\x92\x32\x68\x4a\x16\xff\xe6\x60\x17\x6e\ -\xab\xf8\x00\xaf\x4d\xba\x5c\xa0\x07\xd1\xe5\x38\x6f\xf4\xb1\x58\ -\xd6\xb9\x1b\xef\x35\xaf\xd2\xa5\x23\x13\x9a\xa1\x38\xbc\x84\x9d\ -\x10\x02\x6e\xad\xb9\x70\x5a\xdc\x20\x0c\x40\xc4\xeb\xa4\x44\x8c\ -\xb1\x00\x48\x28\x09\x8f\x5e\x2c\x2a\x42\xfe\x17\x22\x91\x0a\x2b\ -\x28\x90\x59\x4c\x06\x02\x3c\x07\x1b\x6b\x89\x91\x21\x29\x19\x08\ -\x6b\xb1\xc3\x49\xad\xf8\x66\xca\x9f\xe1\xca\xc8\x02\x27\x3e\x96\ -\x41\xac\x18\x62\xcd\x44\x96\xdd\xa9\x69\xa9\x33\x10\x2a\x46\x9b\ -\xc9\x66\xa2\xd4\x59\x80\x69\x59\xc3\x71\x70\x66\x29\x66\xe6\x94\ -\xa2\x2c\xa3\x10\x25\x19\x79\xa6\xf9\xab\x9f\x06\xf1\x63\xd7\x6e\ -\xbc\x58\xff\x03\x3e\xee\xd8\x80\x5e\x77\x0f\xc6\x65\x14\xe3\xa6\ -\xe1\xc7\xe3\xfc\xa2\x43\x90\x6b\xcb\xd6\x39\x8f\x84\x2b\xf0\x43\ -\xad\xd9\x18\xea\xca\xc6\x11\xae\xf1\x00\x80\xae\xa0\x07\x8d\xfe\ -\x2e\x6c\xf3\x34\x60\x43\xf7\x5e\x6c\xf1\xec\x41\xad\xb7\x05\x2b\ -\xda\xb7\x09\x64\xc9\xa9\xd6\x31\x56\x0b\x3d\x4d\x32\x7f\xef\xf7\ -\x53\x52\x76\xf5\xe0\x6f\x23\x4e\xc3\x39\xc5\xb3\x84\xbf\x6c\x02\ -\x5d\xe5\x32\x0e\xdd\xa4\x17\x6e\xce\x07\x3f\x4f\x61\x65\x04\xc3\ -\x49\xb1\xcd\x85\x09\x59\xc3\x30\x35\xb3\x04\x73\xb2\xc7\x61\x7a\ -\xf6\x08\x8c\xb0\xe7\xc1\x69\xb5\xe9\xca\x09\x84\xd5\xca\x23\xd5\ -\xde\x56\xbc\xd6\xb4\x0a\x2f\x37\xad\x40\xb5\xbf\x11\x99\xbc\x1d\ -\x17\xe6\xcf\xc2\x9f\x46\x1c\x83\xc9\x39\xc3\xc1\x10\x06\xda\xf4\ -\x51\x82\x27\x72\x4a\x66\x09\xa6\x64\x96\xe0\xe2\x62\x81\x6f\xd5\ -\xfa\xda\x51\xed\x6d\xc5\xc6\x9e\x3d\xd8\xd4\x5b\x8f\x0a\x6f\x03\ -\xd6\x75\x55\xa2\xc1\xdd\xa9\xcf\x67\x35\x1e\x4f\xd2\xbf\x0a\x41\ -\x1c\xf5\x56\xd3\x9e\xa2\x70\x7c\xf0\x5c\x0c\xcc\x3a\x1e\xc1\xb5\ -\x0f\x07\xb2\x2a\x20\xcf\x74\x46\xb9\x88\x4d\x0e\x1e\x41\xa8\x4f\ -\x75\x9c\x4c\x5f\xe5\x4c\x9c\x35\x94\x57\xa7\xf6\xde\x07\x84\xce\ -\x34\x24\x0f\x5e\x6e\x5a\x8e\x1f\x7b\x2a\x51\xef\xed\x40\x07\xd7\ -\xdb\x2f\xf7\x25\xbf\xef\xde\x89\x8f\x9a\xd7\xe1\xd4\xa1\x07\x0e\ -\x7e\xde\x4d\x29\xfe\x53\xbf\x14\xeb\xbb\xf6\xa4\x8c\xcd\x20\x83\ -\x84\x62\x12\x0f\x72\x8e\xc0\x03\x07\x9c\xa1\x79\x66\x7e\xed\x57\ -\xd8\xd2\xdb\x90\xb0\x61\x5c\x53\x78\x14\xce\x19\x31\x5b\xf3\xf9\ -\xdd\xd5\xff\x43\x45\x4f\x73\xc4\x74\xb3\x0b\x5b\x7e\xc6\x99\x4d\ -\x07\xe1\xb4\xc2\x19\xf2\x67\x16\x86\xc5\x73\x93\x2e\xc2\x86\x55\ -\x75\xd8\xee\xed\x23\x6e\xe3\xba\x91\xaf\xbf\x0f\xd6\xcf\xbe\x17\ -\x1c\xe5\xe5\x6f\x25\xee\xca\xc9\x25\x21\x58\xe3\x1e\xa8\x52\xf8\ -\x83\x2c\xae\x11\xb8\x6c\x19\x7a\x07\x7c\x7c\x4a\x3a\x09\xc0\x95\ -\x91\x85\x09\xd9\xc3\x4c\x9d\x43\xdb\x7a\xeb\x05\x41\xd8\x9e\x87\ -\x95\x53\x6f\x47\x49\x66\x01\x2c\x56\x56\x53\x48\x3e\x1a\x6c\xe9\ -\xdd\x8b\x45\x2d\xeb\xf0\x76\xd3\x2a\x6c\xed\xad\x13\x0a\x8d\x8b\ -\xc6\x91\xdd\xde\x7a\xcc\xab\x7a\x1d\x7f\xab\xfd\x08\xe7\x15\x1c\ -\x82\x4b\x8a\x0f\xc3\x41\xb9\x63\xa3\xb6\x99\x63\x71\x22\xc7\xe2\ -\x44\x99\xb3\x08\xa7\xe4\x0b\x57\xf4\xbb\x83\x3d\x28\xfb\xe1\x2f\ -\x68\xc3\xbe\xeb\x35\xe8\x33\xb0\x40\x17\x09\x60\x82\xab\x44\x8e\ -\xf3\x8e\xb4\x96\xbb\x3d\x8d\xf0\xf2\x41\x58\x58\x1b\xfe\x59\x7a\ -\x16\xae\x19\xf1\x2b\x38\x6c\x36\x91\x04\xc3\x4b\x9f\x46\xde\x3d\ -\xed\x81\x5e\x2c\x6e\xdf\x8c\xb7\x1a\x57\x62\x49\xfb\x56\xb8\x39\ -\x8f\x40\x03\x76\x16\xbd\x8c\x0f\x2f\xb4\x2c\xc1\x7f\x5a\x7f\xc4\ -\x51\xd9\x13\x70\x79\xf1\x11\xf8\x75\xc1\x54\xe4\xd8\xa2\x5f\xbd\ -\x1c\x69\xcf\xc3\x48\x7b\x1e\x8e\xc8\x19\x07\xa9\xdc\xf1\x9f\xb6\ -\xbe\x82\x67\xdd\xfb\x4e\x0d\x45\x8d\x52\x44\x8c\x2a\xfa\x26\x49\ -\xde\x4f\x95\x98\x22\xca\xf3\x38\xfb\xdc\xf3\x60\xb7\xdb\x43\xd6\ -\x3a\x86\xa0\xaa\xaa\x2a\xea\xbb\xed\xed\xed\x98\x34\x79\x72\xc8\ -\x22\x45\xa4\xbc\x3c\x44\x41\xbc\x5e\xaf\x37\x66\x64\x4a\x0a\xd7\ -\xb5\x7f\xbc\x1a\x67\x9e\xf1\x3b\x31\x73\x99\x20\x04\x0c\x1b\x36\ -\x4c\x23\x84\xdf\x72\xcb\x5f\xb0\x78\xf1\xa7\xc2\x58\x88\xb1\x8d\ -\xee\xff\xfe\xfe\x7f\x28\x2b\x2f\x93\x0f\x49\x9f\xdf\x8f\x53\x7f\ -\x7b\x1a\xea\x1b\xf6\x26\x6d\xb1\x97\x7c\xbb\x04\xd7\xce\xbb\x56\ -\xf1\xd9\x19\x67\x9c\x81\x7f\xdc\x7f\xbf\x42\xb1\xd4\xbb\x0e\xfe\ -\xd8\xe3\x4f\xe0\x3f\xaf\xbe\x26\x67\xd8\x22\x0c\x83\xfb\xef\xbf\ -\x1f\x67\x9c\x71\x86\x82\x7e\xb4\xb3\x35\x57\xe1\xcf\xef\xf7\x63\ -\xce\x9c\xc3\x15\x1e\x25\x97\x2b\x17\x3f\xad\x5a\xa9\x78\xae\xaa\ -\xb2\x0a\xbf\xfd\xdd\x69\x08\x06\x02\x9a\x35\xa2\xe2\xe0\x09\x61\ -\x30\x63\xc6\x0c\xac\x59\xfd\xb3\x58\x87\x49\xf8\x3e\x2f\x3f\x2f\ -\x7e\xfa\xdc\xd7\x0e\x0b\x32\xb8\xfb\x23\xea\x32\x24\x7d\x0c\x61\ -\xe1\x82\x3c\xb6\x76\xed\x09\x63\x88\x06\x16\x79\x42\xf4\x29\x43\ -\xfd\xb9\xf4\x27\xaf\x3f\x3e\x2a\xd2\xef\xcd\x15\x1f\xe0\xc8\xbc\ -\x32\x14\xd8\x72\x06\x35\x39\x55\x78\x1a\x70\xef\xae\x8f\xc3\x16\ -\x86\x8f\x6d\x21\x13\xb2\x21\x95\x6d\xb1\x0c\x23\xd7\x81\xd9\xed\ -\x6b\xc1\x0f\x1d\x5b\x31\x77\xc8\x74\xf9\xd9\xd5\xdd\xbb\xf1\x40\ -\xd5\x67\xe2\xb5\x68\xce\xa0\x29\x95\x67\x48\xf6\x80\xa8\xe8\x90\ -\x61\x70\x54\xc6\x44\xfc\x73\xc2\xd9\x4a\x83\x19\xa5\x78\xb7\x79\ -\x15\xde\xac\x5d\x21\x84\xe0\x10\x55\x8c\x8a\x78\xd0\x73\x22\x3d\ -\xdc\x52\xf9\x3e\x8e\xc8\x19\x8f\x42\x67\xae\xdc\x44\xbe\x2d\x0b\ -\xef\x4c\xbf\x12\xb3\x57\xdd\x0f\x9f\x74\xb5\x87\x18\x6d\x08\x95\ -\x00\xc1\xd1\x08\x5b\x92\xc8\x9e\x11\x23\x5c\x12\x86\xe8\x1a\x00\ -\x0b\x1d\xd9\xba\x02\x04\x35\xb8\x41\x10\x75\xfd\x88\xf1\x28\x84\ -\x63\x94\x35\x3e\x9c\x74\x18\x01\x27\xc6\x38\xad\xeb\xa9\x11\x94\ -\x22\x62\xac\xcc\x03\x40\x83\xbf\x0d\x5f\x75\x6c\x03\x40\xd1\xe0\ -\x6b\x43\x2b\xdc\x18\x65\x2d\x32\x41\x9e\x14\x41\xca\x61\xab\xbb\ -\x11\x1f\xb7\x6e\xc0\x7f\x5b\xd6\x60\x43\x4f\x0d\x02\x41\xa1\x7e\ -\x11\x82\x6a\x0f\xa4\xf0\x6f\x93\xb5\x03\xf3\xf7\x7e\x85\xa7\x9b\ -\x96\x60\x9a\x73\x24\xce\x2d\x98\x89\xdf\x0c\x9d\x8e\x89\x99\xc3\ -\x60\x21\x11\x6e\xc8\x10\x49\xae\x01\x56\x77\x57\xa3\x89\xf3\xa4\ -\x06\x7f\x36\xeb\x88\x4c\xf2\xb9\xa3\xa1\x0e\x86\xc1\x3a\x4f\x6d\ -\x54\x85\x28\xc8\x0b\x1e\xdb\xb7\x1a\x7f\x02\x25\x40\x00\x41\x6c\ -\xf3\x37\xc1\xe9\xb0\x9b\x33\x30\x50\x1e\xcd\x81\x6e\x7c\xdd\xb1\ -\x1d\x1f\xb7\xac\xc3\x57\x1d\x5b\xd0\x1a\xe8\x0c\xed\xbf\xa0\xf8\ -\x52\x98\xdc\xe2\x87\x1f\x5f\xf9\x36\xe2\xab\x96\x8d\x28\xce\xc8\ -\xc3\xaf\x73\xa7\xe2\xac\xc2\x99\x38\xd2\x35\x1e\x59\xd6\x8c\xc8\ -\x7b\x48\x94\x71\x39\x4a\xf1\x7d\x47\x85\x3c\x31\x8d\xf1\x7a\xc0\ -\x05\xfb\xc8\x37\x52\xf4\x94\xcb\xb4\xa7\x48\x21\xf0\x56\xc6\xfd\ -\xee\xf6\x6d\xdb\x92\x2a\xc1\x15\x15\x17\xa1\xa8\xb8\x28\xea\x9b\ -\xb5\xd5\x55\xd8\xb6\x75\x6b\xc4\x67\x18\x96\x45\x59\x79\x19\xa6\ -\x4d\x9b\x26\xe6\x6c\x03\x7c\x5e\x2f\x2c\x16\x8b\x79\x22\x8b\x03\ -\xba\x3a\x3b\xb1\x63\xfb\x0e\xc5\xc6\x09\xcf\x00\x17\x49\xe2\x68\ -\x6a\x6c\x44\x53\x63\xa3\x62\x53\xb6\xb7\xb5\x25\x94\xdf\xee\xd8\ -\xbe\x5d\xf1\xb7\x2b\x37\x17\x7e\x9f\x0f\x36\x7b\x88\x31\xf9\xbc\ -\x5e\x6c\xdb\xb2\x15\x1c\x17\x8c\xd8\xd6\x98\x31\x63\x30\x7d\xfa\ -\x74\x4d\x60\xfd\x60\xd1\x21\xf6\x03\xb5\x2c\x0d\x00\x2a\xbc\x4d\ -\xb8\x61\xfb\xbb\x78\x63\xea\x15\x83\x76\x0e\x3e\xce\x87\x6b\xb7\ -\xbe\x8e\xe6\x40\xcf\x00\xee\x14\x6d\xbf\xe1\xe9\x76\x3b\xa9\x1b\ -\xe7\x6c\x7a\x09\xcf\x96\x9f\x87\xf3\x4a\x0e\x43\x4b\xa0\x1d\x17\ -\x6d\xfa\x37\x7a\xb8\xc4\xc4\xad\x3a\x88\x15\xaf\x4c\xfb\x3d\x9c\ -\xaa\x38\xa2\x6a\x5f\x33\xfe\xbc\xf3\x5d\xd3\xed\x54\xfa\x9a\x70\ -\x77\xe5\xff\xf0\xfc\xa4\x4b\x15\x9f\xe7\xdb\xec\x70\x5a\xac\xf0\ -\x05\xe2\x0b\xe2\xd1\xaf\xdb\x37\x38\x02\x2d\x49\x1f\x2a\x4d\x6f\ -\xec\xae\xc5\xb9\xc3\x66\x45\xa4\xcb\xe6\x40\x17\xae\xd9\xfe\x26\ -\x5a\x03\xa1\x0c\x82\x8b\xda\xd7\x61\x46\x6e\xa9\xe1\x7b\xed\x81\ -\x1e\xac\xe8\xae\xc2\x97\x6d\x9b\xf1\x79\xc7\x26\xec\x76\xd7\x23\ -\x48\x03\xb0\x12\x7b\xcc\x63\xdc\xe0\xa9\xc5\x2f\xb5\x95\xf8\x6b\ -\xed\x22\x94\x39\x8a\x71\xa2\x6b\x12\x4e\x2c\x98\x82\x59\x39\x63\ -\x90\x6f\xcf\x31\xc0\x09\x15\x93\x83\xa4\x21\x22\xf0\xc0\x56\x6f\ -\x03\xbc\x9c\x17\x0e\x36\x72\x0d\xba\xd7\x1b\x97\xe3\xc5\xfa\xe5\ -\x82\xcc\xc0\x10\xfc\xaf\x63\x3d\x9e\xc7\x85\x11\xdf\x59\xd3\x53\ -\x85\x1f\x3b\x76\xe0\x93\xb6\x0d\x58\xd9\x55\x89\x5e\xde\x2d\xda\ -\x81\x63\xa3\xd9\x06\x5f\x3b\x5e\x69\xfe\x1e\xaf\xb4\xfc\x80\xa1\ -\x96\x1c\x1c\x99\x5d\x86\x13\xf3\xa7\xe0\xe8\xdc\x09\x28\xcf\x2a\ -\x31\xe6\x17\x9e\x26\xec\xe8\x6d\xde\xa7\x96\xcc\x92\x70\xd1\x87\ -\x24\xf5\xf1\x7d\x5f\x9e\x93\xea\x0d\x25\x11\xed\x3c\xc7\x81\xf2\ -\xbc\x39\x91\x18\x19\x00\x00\x20\x00\x49\x44\x41\x54\xac\x10\x49\ -\xba\x8e\x99\x3a\x45\x34\x21\x53\x64\x64\xc5\xa8\x2f\x05\xa6\xfb\ -\x72\xa8\xd2\x38\x11\x4b\x4d\xbe\xcd\x24\x48\x19\xa2\x34\x65\xf2\ -\x33\xee\xa7\xa7\x5a\x92\x12\x66\x98\xa6\x5d\xfd\x0a\xf7\x46\xe3\ -\x24\x2a\xba\x09\xbf\x1c\xa4\x68\x48\x32\x4c\xf0\x3c\xde\x6c\x5a\ -\x8e\x83\xab\x46\xe1\xc6\xd1\x73\x07\x8d\xa0\x2a\xf3\x32\xca\xe3\ -\xbe\x8a\x45\xf8\xb2\x7d\x9b\xe0\x45\x31\xb4\x54\x26\xf9\x10\x20\ -\x44\x48\xac\x10\x66\x34\x52\xd4\x17\xe3\x78\x74\xa2\x07\x97\xec\ -\x7a\x15\xd5\x81\x56\x7c\xd7\xba\x0d\x3b\x3c\x8d\x21\x4f\x1e\x35\ -\xc7\xa1\x88\x7e\xa1\x38\x78\x59\x8a\xfb\x2b\x3f\xc5\x82\x49\x17\ -\xc1\xc9\x0a\xf1\x2a\x5e\xde\x8f\x2b\xb7\xbd\x8e\x7a\x4f\x47\xb8\ -\x34\x2b\xbe\xa6\xa2\x2b\x29\xd6\x94\x23\x78\xa1\x61\x29\x4e\x2d\ -\x38\x10\x27\x17\x09\x5e\xad\x46\x7f\x3b\x4e\x5c\xf7\x14\x3a\x38\ -\x9f\x90\xf5\x0d\xd0\x7a\xb6\xa2\xc4\x04\x31\x3a\xd7\xd9\x18\x61\ -\x01\xc5\x3f\x18\xfd\x76\x38\x0a\x02\xa1\x06\x17\x21\x3a\x9b\x50\ -\x13\x83\x6a\xee\x66\x40\x4c\x25\xa9\x78\x13\xfc\x41\x1d\xcb\x27\ -\xc6\x6a\x7d\xd2\xb9\x01\xa3\xf7\xe4\xcb\x09\x1c\x88\x78\x37\xc3\ -\x4f\x39\xb4\x06\x7a\xb1\xd1\xbd\x07\x5f\x76\x6e\x41\x9b\xa7\x0b\ -\xe1\x07\xf2\xa7\xad\x1b\xf1\xb7\xd2\xdf\x82\x10\x21\x2e\xb5\x9b\ -\xf3\x62\x6d\x4f\x1d\xbe\xeb\xd8\x8e\xa5\x9d\xdb\xb1\xba\xbb\x12\ -\x3d\x7c\xaf\xca\x13\x00\x04\xe0\x8b\x32\x5f\xf1\x97\x80\xf0\x1e\ -\x17\x08\x19\xf7\x82\x08\x62\x2b\x57\x87\xad\xbd\x75\x78\xa2\xe1\ -\x2b\x64\x31\x0e\x4c\xcb\x1c\x89\x5f\x65\x97\xe3\xc8\xbc\x72\x1c\ -\x94\x3d\x0a\x85\xf6\x6c\x30\x60\xc1\x51\x1e\xdf\x34\x6f\x4e\x3e\ -\x9f\x1c\xa8\x63\xae\xcf\x31\x4e\x54\xde\x57\x7b\x7b\x9b\xf1\xc4\ -\x9e\x2f\x50\x68\xc9\x91\x15\x6c\x89\xa4\xba\x83\x3e\x54\x7a\x5b\ -\xf0\x6d\xf7\x76\x6c\xee\xad\x03\x0d\x50\x79\x7f\x35\x79\x9a\xb1\ -\xb4\x65\x0b\x8e\x1a\x32\x09\x94\x52\x04\x11\xc4\x4e\x77\x0b\x7e\ -\xe8\xdc\x89\x25\x1d\x5b\xf1\x43\xd7\x0e\xec\xed\x69\x15\xf7\x8f\ -\xd4\x9f\x91\xa7\x9c\xe8\x9f\x3b\xd2\xfe\xe3\x43\xeb\xd8\x8c\x4e\ -\xfc\xd7\xbd\x1a\xff\x6d\x5c\x0d\x8b\xcd\x82\x31\x8e\xa1\x38\x22\ -\x73\x3c\x0e\xcf\x2b\xc7\xa1\x39\x63\x50\x96\x59\x08\x1b\x11\xae\ -\xf4\x7d\xdb\xb2\x0d\x01\x3e\x18\xea\xdf\x30\x36\x57\xea\x9e\xf6\ -\x07\x37\x86\x0e\x83\xd0\x1d\x17\x01\x51\x8e\x87\xec\x2f\x9e\xa2\ -\x41\xb6\x41\xfb\x24\xec\xc7\x40\x6d\x34\xee\x77\x49\x52\x07\x66\ -\xaa\x58\x6d\x5f\x17\xd5\x4c\x02\x0d\x63\x9f\xab\x69\xa5\x28\x71\ -\xa2\xf9\x40\x6b\xf6\x69\x4f\xd1\xbe\x0c\xb7\xd7\x7c\x88\x61\xf6\ -\x1c\x9c\x37\x6c\xf6\xa0\x1a\xf7\xb3\x75\x5f\xe1\xe1\xea\x2f\x06\ -\x9e\xc9\xeb\x78\x13\x58\x83\x08\x9e\x7b\xaa\x3f\x41\x20\x18\x4c\ -\xf8\x10\x5e\x6e\xfd\x09\xd5\xeb\xbb\xf0\xce\xe4\x3f\x20\xcb\x9a\ -\x89\x87\x2a\x3f\xc6\xd7\x2d\xf1\x59\xf3\xaf\xab\x7c\x0b\x73\xf2\ -\xc6\xc0\x0f\x0e\xa7\xfd\xf2\x34\xb6\xf5\xf4\x2d\xee\x89\xf0\x5a\ -\xfe\xc1\x9a\xb8\xe1\xe8\x47\x00\xf7\xd5\x7d\x88\x02\xab\xe0\xb1\ -\xb0\x84\x5d\xb7\x93\x43\xb7\x29\x11\x6c\x89\x34\xa4\x10\x71\x84\ -\x86\x38\x38\x0d\x5d\x1b\x34\x7b\xba\x11\x00\x0c\x4f\x60\x65\xac\ -\xd8\x18\xdc\x1b\xf7\xbc\xd7\xf7\x54\xe1\xaa\x8a\x57\x05\x65\x54\ -\x1e\x1f\x15\x84\x57\x45\x81\x4b\x25\xad\x6c\xe8\xa9\xc3\xbf\xea\ -\x16\xa3\xd1\xd7\x83\x15\xdd\x95\x58\xef\xae\x83\x9b\xf7\x08\xd2\ -\x2b\x0f\x65\xaa\xdc\x24\x41\x0f\xef\xc5\xf2\xae\xed\x58\xde\xbd\ -\x1d\x0f\xed\x25\xb0\x12\x0b\xc6\x38\x87\x60\xb6\x63\x0c\x4a\x33\ -\x86\x62\x93\x7b\x0f\xd2\x60\x0e\xee\xa8\xfc\x40\x0c\x7c\xa3\x61\ -\x96\x68\x91\x6f\x50\x80\x18\x94\x46\x78\x64\xcf\x17\x58\xd1\x5b\ -\x81\x15\x9d\x15\xf8\xc9\x5d\x8d\x46\x7f\x07\x28\x82\x62\x51\x55\ -\xa6\x5f\xf8\x5e\xa5\xb7\x19\x3b\xdd\x7b\xf1\x4a\xcb\xf7\x20\x60\ -\x91\x6f\xc9\xc2\x74\xe7\x70\xcc\xca\x1e\x87\xc5\xed\x9b\x74\x2b\ -\x09\x0c\x5a\x48\x68\xa2\x05\x92\xda\x13\xd5\x30\x64\x8b\x45\xcc\ -\x1c\x16\xc1\xa2\xaf\x13\x27\x40\x29\x45\x20\x10\x88\x4e\x05\x84\ -\xc0\x6a\xb1\x1a\x5e\x9f\x0a\xe5\x69\xd7\xf6\xcc\x80\xc2\xef\xf7\ -\x4a\x1a\x02\x00\xc0\x6e\x53\x15\xf9\x12\x95\x8c\x80\x78\x9d\x41\ -\x6a\x8f\x61\x18\x58\xe5\x67\x85\x0d\x18\x0c\x06\x34\x19\x78\x78\ -\x9e\x83\xdf\x1f\xb2\x2a\xf9\xfc\x5e\xb0\x2c\x1b\xf6\xae\xfe\xb2\ -\x3a\xec\x0e\x65\xfc\x8f\xf8\x6f\x40\x4c\x5f\xae\xbd\x53\x1a\x7a\ -\xd6\xe7\xf3\xc2\x6a\xb3\x29\xc6\x6f\xb5\x58\xb5\xcf\x13\x02\x9b\ -\xdd\x21\x2b\x53\x54\xd7\xe0\x45\x60\xb1\x58\xe3\x2e\xeb\x67\xb5\ -\xda\x14\xd7\xe2\xd4\x45\xd0\x09\x00\x9b\xdd\x0e\x9b\xcd\x6e\xaa\ -\x07\x69\x5e\x10\xb3\xf7\x84\xfe\xd6\x5f\x2f\xa9\x1d\x8b\x98\x4d\ -\x2f\x54\x0c\x58\xb5\xae\xe2\xdf\x1c\xc7\x0d\xf0\x26\x22\xc9\xd9\ -\x93\x24\x75\x78\x42\xe4\x79\x53\xbd\x7f\xfa\x30\x7e\x83\xa0\x06\ -\x8d\x25\x4b\x99\xed\xd0\xfc\xfa\xa8\xb2\xfd\x68\xea\xce\x49\xd9\ -\xcc\x04\xba\xf2\x33\x5e\x5c\xb6\xeb\x35\x10\x00\xe7\x14\xcf\x4a\ -\x48\x22\x97\xa4\x2e\x1f\xe5\xf1\xec\x9e\x6f\xf0\xa7\x1d\x0b\x05\ -\x9e\x21\x79\x3a\x28\x35\xb7\xd0\x09\x36\x5a\x10\x0e\x00\xf5\x23\ -\x48\xfd\x32\x7e\x39\x1a\x44\x58\x61\x0e\x61\x5f\xfb\x02\xfa\xeb\ -\x11\x2b\x3d\xa9\x2d\xff\x22\xff\xfd\xa6\x6b\x0b\x8e\xf9\xe5\x31\ -\x5c\x31\x6c\x36\x1e\xa8\x5a\x1c\x36\x7f\x5e\xb5\xef\x0c\xfa\xe7\ -\x84\xe7\x2a\xdd\x4d\xb8\x78\xc7\x2b\xe8\xf0\x74\xe3\xa7\x9e\xdd\ -\xd0\x78\x18\x63\x24\x73\x42\x29\x02\xf0\x82\xe5\xad\xf2\x29\xc7\ -\x83\x0b\x13\xee\xf5\xc7\x43\xf9\x20\x5e\xac\xfd\x21\x34\x5f\xab\ -\x84\x48\xf1\x03\xab\xaa\x3e\x91\x94\xe6\x4d\xb2\x5c\x07\x0c\xe8\ -\xd8\xaa\x9a\x87\xf4\x9c\x55\xed\xa9\x22\xfa\x7c\xc0\x68\xd8\xea\ -\x60\x43\x9e\x00\x7e\xc8\xf1\xbd\x82\x25\x9f\x44\x30\x1a\xf2\xe2\ -\x32\xf8\x70\xdb\xce\xf7\x43\xba\x92\xec\x71\x34\x49\xd7\xd1\xf8\ -\x2b\x21\xfa\xdb\x24\xa8\xcc\x5e\x1b\xfe\x5c\x00\x41\xec\xf0\x37\ -\x62\x47\x67\x23\xc0\x52\x61\x6c\xdc\xbe\xc9\xdf\xfb\x7e\xdf\x5d\ -\xd5\x6e\x90\x08\xde\x3c\x12\x46\x17\x8a\x6e\x55\x2e\x63\x11\xaf\ -\x9f\x36\xad\xc3\xa7\x4d\xeb\x0c\xc6\x4d\x01\x43\x76\x47\xcc\xf1\ -\x15\x23\x3a\x90\xc8\xc1\x1b\x54\x3c\x47\xc1\xa3\xd5\xdf\x85\x6f\ -\xfd\x9d\x62\xb9\x08\xc3\x42\x45\x06\xfc\x58\x2d\x0f\xd3\xfe\xa1\ -\x9b\x74\x9d\xa2\xe8\xf0\xe2\x0b\x2f\xe2\xf8\xe3\x8f\x13\x52\x5b\ -\x9b\x4e\xbb\x4d\xd0\xd3\xd5\x8d\x59\xb3\x67\xa3\xb3\xb3\x23\xe2\ -\xf3\xa3\x47\x8d\xc6\xd2\xa5\xdf\x81\x61\x45\x7b\xa1\x94\x42\x5b\ -\xec\x8b\xe7\x79\xfd\xbe\x29\xc5\x7b\xef\xbe\x87\xd1\xa3\xc7\x80\ -\x97\x88\x9e\x10\xdc\x78\xc3\x0d\xb8\xf3\x8e\x3b\x14\x8f\xde\x75\ -\xd7\xdd\x78\xf9\x95\x97\x45\x95\x88\x82\x61\x58\xfc\xed\xde\xfb\ -\xf0\xe8\xe3\x8f\x2a\x3c\x15\xe7\x9c\x73\x2e\x96\x2f\x57\x16\x7f\ -\x3d\xee\xf8\x13\x60\xb7\x87\x14\x14\xbb\xdd\x81\x77\xde\x7e\x0b\ -\xa3\x46\x8d\x0a\xa3\x23\x02\x39\xf1\x8d\x58\x23\x89\x61\x18\x59\ -\x80\x97\x60\xf7\xae\xdd\x38\xe2\x57\xbf\x02\xcf\x05\x0d\x36\x1a\ -\x05\x08\xc1\xe1\x73\x0e\xc3\xee\x5d\x3b\x43\xe9\x23\x01\x64\x64\ -\x66\x2a\x70\x40\x00\xfc\xf1\x9a\xab\x71\xc1\xf9\xe7\x69\xf0\x43\ -\xc2\xf0\x48\x29\x45\x6e\x5e\x9e\x49\xfe\xa8\xe5\x90\x4b\x96\x7c\ -\x83\x60\x30\xa8\xed\x43\x71\x33\x83\x98\xda\x5b\x07\x1e\x78\x20\ -\x3e\xfa\xe8\x23\x10\xc2\xc8\x78\xb7\x3b\xec\x9a\xb5\x7d\xf3\xcd\ -\xb7\x71\xf3\xad\x37\x2b\x18\xc5\x75\x7f\xba\x0e\x77\xdc\x71\xbb\ -\xe2\xb9\x7b\xef\xfd\x3b\x5e\x78\xf1\x39\x61\xdc\x54\x50\x74\x3b\ -\x3b\x3a\xd2\xe6\xb6\x34\x24\x15\xbc\x41\x1f\x2e\xde\xf5\x2a\x5a\ -\x7d\xdd\xb8\xb6\x74\x6e\x4a\x8f\xf5\xbe\xaa\xff\xe1\xfe\xca\x4f\ -\x53\xc8\xee\xc6\xe1\xb7\x5b\x16\x20\xcb\x66\x17\xbc\x22\x3c\x81\ -\x1f\xc1\x01\x19\xcb\x26\xef\x5e\xdc\xba\x6b\x51\x9f\xdb\xf9\xb4\ -\x69\x5d\xc2\x2c\xc0\x6b\x3c\x55\x18\xbd\xf2\x76\xb0\x84\x80\xf0\ -\x42\xca\xef\x5e\xce\x9b\xde\x74\x69\x48\x43\x1a\x52\x0a\x2c\xd1\ -\x0c\x0d\x83\x1f\xf4\x67\x52\x58\x38\x14\x23\x46\x8c\x88\xf9\xaa\ -\x5a\x77\x56\x97\xa9\xf4\xca\x56\xab\x15\x23\x47\x8e\xd4\xd4\xb1\ -\x09\xe9\x09\xfa\x59\x72\x28\xa5\xb0\x58\x2c\x68\x0c\x4f\x2a\x00\ -\xc0\xe3\x76\x6b\x66\xd2\xd1\xde\x86\xc6\x86\x7a\xc5\x67\x99\x59\ -\x99\x18\x39\x62\x84\xfc\x37\x4f\x79\xd8\x54\x39\xed\xa5\x77\xc3\ -\x17\xdc\x66\x77\xa0\xa8\xb8\x18\x23\xc2\xde\x8d\x34\x6e\x85\x35\ -\x21\x18\x40\x73\x53\x93\xa8\xec\x71\x5a\x0b\x81\xd8\x87\xcf\xe7\ -\xc7\xf0\xe1\xc3\x75\xe7\x1d\x0e\x39\x39\x39\xc8\xc9\x89\x37\x1b\ -\x96\x9e\x22\xa3\xfd\x2c\x3c\x73\x5f\x5f\x7b\xb0\xdb\xec\x32\xde\ -\x22\xcd\xab\xa7\xbb\x0b\x4d\x0d\xca\x6b\x28\x6e\xb7\x3b\x54\x7b\ -\x49\xa4\xd6\xae\xce\x0e\x34\x36\x34\xc4\x33\xd5\xc1\x03\x2a\xc7\ -\x08\x1d\xa0\xfe\xa3\x77\x4c\x93\xd4\xae\xfa\x35\xaa\xdb\x6b\xf4\ -\x5b\xa7\x51\xea\x72\x45\xb6\xf2\x84\xc0\x2f\x78\x30\xfc\xe0\x31\ -\xaf\xf2\x2d\x6c\xea\xdd\x8b\x7f\x96\x9f\x85\x2c\x8b\x53\x7c\x3c\ -\x35\x3c\x47\xcd\x81\x4e\x5c\xbe\xfd\x3f\xf8\xb8\x71\xbd\xf0\x01\ -\x67\x10\x94\x43\xfa\x9f\x90\xba\xfc\x1e\x74\x49\x45\x0d\x25\x7c\ -\x31\x46\x07\xaa\xda\x92\x1b\xad\xfe\x8f\xb8\x9e\x9a\x10\x33\xd5\ -\x07\x62\x1d\xa2\x40\x54\x72\x51\x9b\x64\x55\xe3\xe1\xa8\x3e\x41\ -\x6b\x5e\x8b\xe6\x89\x13\xbe\xe7\x39\x1e\x8d\xee\x2e\xed\x38\x0c\ -\x63\x38\x54\x78\x93\xfe\xf5\xa9\x9e\xf3\x33\xfa\xdb\x95\x89\x22\ -\xc8\xf8\x99\x28\x9f\xf7\xb1\x20\x63\xbc\xe9\x29\x25\x79\x81\x57\ -\xd5\x21\x8b\x9a\x85\x32\x32\xdf\x8a\xda\x3b\x31\x2b\x00\x2a\x3d\ -\x19\x29\x7b\x36\x99\x8e\x0d\xa2\xe6\x56\xd9\x2c\x5f\x8f\x46\xbf\ -\x1a\x8f\xa3\xda\x80\x6c\x90\xa5\x4e\x13\x13\x43\x22\x1e\xa8\xa1\ -\x5e\x68\x6c\xe7\x11\x51\x35\xc0\x18\x78\x92\xa2\x5e\x5c\x31\x99\ -\x35\x35\xd9\x74\x13\x47\x7b\xfb\xad\xa7\x28\xde\xb8\x1d\xb3\xa1\ -\x31\xa4\x0f\x77\x7e\x49\x84\xcf\x69\x94\xe7\x18\x1d\xe1\x85\x9a\ -\x18\x74\x4e\x76\xb6\x7c\x95\x2b\x9e\xb1\xe6\xe7\xe7\x0b\xe9\x67\ -\xe5\x4b\xdc\xda\xcd\x96\x97\x97\xd7\x0f\xeb\x6a\xf6\xc3\xfe\xa5\ -\x1b\xb3\xeb\x9d\xba\x7a\x4e\x3a\xa6\x68\x7f\x82\x67\xdb\xbe\xc7\ -\xca\x5f\xaa\xf0\xcc\xb8\xf3\x71\x68\xfe\xf8\x94\x19\xd7\x99\x1b\ -\x9e\xc5\x0f\x9d\x5b\x11\xaa\x4c\x93\x86\x34\xa4\x21\x0d\x69\x48\ -\x43\x62\x20\xf1\xd9\xe7\x06\x8b\x52\x14\xa3\x80\x4b\xc3\xe4\xeb\ -\x88\xaf\x89\x9a\x8b\xa4\x9c\x50\x95\xa9\x82\x18\x28\x29\x34\x8a\ -\x10\x4f\x08\x91\xeb\xe0\x84\x14\x1d\xa2\x11\xfe\x59\x86\x28\x14\ -\x21\xa1\xae\x8f\xbe\x70\x6f\xb3\xd9\x71\xf1\xc5\x17\xe3\xec\xb3\ -\xcf\xc6\xf4\xe9\xd3\x30\xb4\xb0\x30\x2e\x5c\x4e\x9c\x38\x11\xbb\ -\x77\xee\x08\x5d\x11\x34\xc0\x89\xc5\x6a\x49\x98\x52\x11\x8e\x57\ -\x59\x59\x14\xaf\xe9\xe9\x2b\xb3\xa1\xac\x27\x24\x96\xf5\xd6\xb4\ -\x41\x4d\x35\x40\x55\x8a\x2c\x35\xd0\xe0\x18\xa2\x1e\x1f\x35\xa5\ -\xc4\x0e\xcc\x8e\xd9\x87\x54\x2d\x03\x43\x78\xac\xca\x37\xed\x37\ -\x3c\x44\xae\x73\x41\xa2\xac\x1a\xd5\x98\x10\x55\x96\x4a\xc9\x98\ -\x12\x90\xb2\xd2\x51\xfc\xe2\xaf\xc4\xd1\x5b\x1e\xc3\x15\x05\x87\ -\xe3\xce\xd2\x5f\x63\x98\xb3\x60\x40\xb3\xd3\x75\x07\xdc\x58\xdb\ -\x59\x23\x20\x8b\x33\xb8\x8b\xce\x98\xb4\xe0\x27\x6c\x3b\x18\x65\ -\xf5\x93\xb2\xaa\xe9\xaf\x1f\xa1\xd4\x80\x9f\xc5\xb8\xed\x88\x81\ -\x29\x9c\x9a\xa4\x34\x0d\x59\x88\x37\x18\xa8\xd2\x33\xa5\xc5\x1f\ -\x6f\x8e\x70\x55\x75\x95\x10\xcd\x72\x6d\x48\x9f\x24\x0a\x42\x8c\ -\x62\x42\x48\x82\xf9\x5d\x9c\xe3\x37\xa0\x3f\xa2\xca\x67\x2a\x25\ -\xa4\xa0\x0c\xd1\xa7\x2f\x6d\x81\x1a\x83\xaf\xa9\xc1\xaa\x13\x23\ -\x06\xa1\xdf\x9e\x91\x47\x82\x2a\xc7\xaf\x61\xab\xf1\xd6\xbb\x4c\ -\x16\x7f\xef\xf7\x73\x29\x0a\x1e\x8d\x62\x79\x88\x41\xac\x29\x43\ -\x74\xd7\x5d\xed\x11\x0a\x65\x53\xa3\x71\x4e\xc4\xe0\x3d\xb5\x07\ -\x89\x1a\xd0\x05\xf8\x18\xf7\x57\x92\x25\x80\x28\x75\x8a\xf4\x86\ -\xb5\x5f\x78\x8a\x12\x9d\xb9\xcb\x95\x9b\x1b\x22\x41\x03\x1e\xe3\ -\xca\xce\x42\x73\x73\xa3\x7c\x28\x10\x95\xc2\x40\x45\x01\x9e\xe8\ -\xec\x8b\x5e\x8f\x5b\xd3\xa7\xdb\xdd\x8b\xe6\xe6\x66\x85\x90\x4d\ -\x18\x06\x79\xf9\x05\x8a\xcd\xe0\xf7\x79\xd1\xdc\xdc\x8c\x70\x15\ -\xc0\x66\xb7\x21\xaf\xa0\x40\xcc\x72\x22\x3c\x39\x6a\x74\x29\x9e\ -\x7a\xf2\x09\x1c\x76\xf8\x61\x09\x11\x14\x72\x5c\xae\x7e\x5f\xd7\ -\x9e\xee\x1e\x78\xbc\x1e\xe5\xfc\x03\xda\x94\xa4\x1d\x9d\xed\x68\ -\x12\x71\x27\xcd\xb5\x70\xe8\x50\xcd\x73\x2d\x2d\x2d\xe0\xc4\xeb\ -\x7f\xa1\xf5\x22\x0a\x0a\x6a\xef\x68\x37\x5d\xf8\xaf\xa5\xa5\x39\ -\x8c\xc7\x08\x09\x3a\xf2\xf2\x87\xa8\x1e\xa7\x68\x69\x69\x91\xd7\ -\x8b\x8a\x6b\x94\x5f\x50\x10\x52\xa4\x89\x30\x57\x9f\xcf\xbb\x7f\ -\x5a\x30\xd2\x30\x60\xe0\x0b\x7a\xf1\xef\xd6\x65\x78\xab\xfd\x27\ -\x5c\x3d\xf4\x48\xcc\x1b\x7e\x2c\x46\x64\x0e\x19\x90\xb1\x64\x5b\ -\x33\x30\xd1\x59\x8c\x35\xee\xdd\xe9\x85\x49\x43\x1a\xd2\x90\x86\ -\x34\x24\x5c\x99\xb6\x24\x4c\xc3\x8e\xf3\xbd\x01\x4b\x52\x12\xa3\ -\x22\x20\x3d\x9d\x9d\x93\x83\xb5\xab\x57\x87\x34\x73\x8d\xe5\x47\ -\x98\xd3\xae\xed\xdb\x30\x61\xe2\xe4\x50\x8c\x4d\xa4\x89\x53\xa5\ -\x45\x21\x10\xd0\x16\xf4\x7b\xea\xa9\x05\x78\xe1\xc5\x7f\x23\xbc\ -\xd2\xf7\x5f\xff\xfa\x57\xec\xda\xb5\x53\xf0\x5e\x89\x9f\xcf\xbb\ -\x76\x1e\xae\xbd\xee\x7a\xb9\x61\x86\x65\xf1\xd2\xbf\xff\x8d\x85\ -\xc7\x1c\xa3\x18\xaf\xc3\xe1\x80\x5d\xcc\xbe\x16\x08\x04\xd0\xd5\ -\xd9\x05\x9f\xcf\x0b\x4a\x29\x78\x83\x0c\x43\xe1\x46\x30\x12\xe6\ -\x91\x22\x61\xd5\xcc\x23\x5e\xef\x23\x4a\x2f\x56\x34\x05\x7f\x58\ -\x71\x31\xac\x56\xab\xfe\xba\x51\xe0\xe6\x5b\x6e\xc5\x3b\xef\xbc\ -\xad\xf8\xba\xbb\xab\x4b\xd9\x0e\xcf\xe3\xcc\x33\xcf\x0e\x25\x87\ -\x10\xbb\x5e\xbb\x76\x0d\xc6\x8d\x0f\x5d\x0b\xf2\x79\x3c\x38\x70\ -\xc6\x41\xe8\xec\xec\x0c\x25\x97\xd0\x71\x2b\x51\x9e\xca\x8a\x93\ -\xde\x3c\xa5\xa9\x7d\xf2\xc9\x27\xb8\xe8\xf7\x17\x29\x62\xc7\xce\ -\x3c\xeb\x2c\xec\xde\xbd\x43\x56\xe2\x28\x28\x9e\x5e\xf0\x0c\xc6\ -\x8d\x2f\x93\x07\x46\x08\xc1\x6d\xb7\xdd\x8e\x5d\xbb\x76\x29\xda\ -\xbe\xfa\xea\x3f\xe2\xdd\x77\xdf\x49\xaa\xb2\xbf\x5f\x41\xcc\x31\ -\x45\x7d\x2c\xc0\x46\xfb\x38\xce\xb8\xe7\xa5\xca\x3e\x47\x0d\x3c\ -\x46\xea\x3a\x16\x12\x0b\x08\x52\xf8\xfc\x1e\xf8\x58\x0f\x1e\xaa\ -\xf9\x14\xcf\x34\x7d\x87\xd3\xf3\x66\xe0\xa2\xa2\x39\x38\x3c\xaf\ -\x0c\x4e\xc6\x96\x38\xef\x8b\x09\xbe\x70\x74\xde\x01\x58\xd3\x5b\ -\x11\x2a\x1e\x43\x23\x7b\xd0\x4c\x7b\x0c\xe2\x5e\x2f\x7d\xfc\x11\ -\xaa\xcc\xfe\x47\x54\xb1\x3c\x34\xea\x79\x14\x99\xee\x8c\xee\x1a\ -\x84\x0c\xb9\x92\x49\x87\xea\xa3\x36\x0a\x3a\x28\x63\x80\x96\x68\ -\xd9\xe7\x88\x61\x81\x92\xc8\x1d\xd3\x68\x9e\x27\xa3\x2c\x56\xca\ -\xec\x8c\xa1\xa3\x88\x98\x6c\x27\x51\x34\x6a\x94\xed\x8b\xea\xa3\ -\x41\xf3\x36\x2f\xe2\x3d\x0a\x63\x32\xca\xae\x48\x63\x64\x20\xc4\ -\x2c\x3d\xd0\xc8\xdb\xc9\x00\x1f\x34\xd5\x62\x8a\xe2\xe5\xa7\x09\ -\x10\xb2\x95\xfc\x37\x36\xfa\x56\xef\x6b\xed\xbe\xa2\x2a\xd9\x2a\ -\xc1\xe7\x8b\x81\xe7\x51\x73\xac\x44\xe1\x07\xc4\x24\x5f\x4b\xb8\ -\xff\x88\xc4\xde\xe2\xfe\x1b\x53\xd4\x87\x77\x73\xf3\x72\x23\xf0\ -\x4c\x01\xf9\xce\x8c\x4c\x74\x77\x75\x82\xe7\x69\x42\x96\xd9\xef\ -\xf7\xc3\xef\xf7\x2b\x16\xdb\xca\x5a\x42\x71\x3a\x54\xb8\x76\xe5\ -\xf7\xfb\x15\x8a\x01\x61\x58\x64\x66\x64\x22\x37\x2f\x4f\xe7\x2a\ -\x18\xd0\xde\xde\x01\xbf\xcf\x8f\x1c\x57\x36\x5c\xae\x1c\xed\xf5\ -\x18\xa2\x4c\x54\x10\xae\xd0\x24\xbe\x78\xaa\x18\x94\xcb\x53\xf4\ -\xf6\xf6\xa2\xa2\xb2\x12\xf9\xf9\x79\x18\x3a\x64\xa8\xee\xd3\x5e\ -\xb7\x07\x3d\xdd\xdd\x62\xf9\x07\x6a\x88\x62\x77\x6f\xaf\x42\x01\ -\x65\x2d\x16\xf0\xbc\xf6\x70\xef\xe9\xee\x46\x4f\x77\x57\x42\xe8\ -\x2b\xe0\xf7\xa3\xab\xab\x4b\x79\x8d\x82\xa7\xc8\x75\xe5\x02\x84\ -\x84\xf0\x48\x85\xc4\x0a\x72\xca\x56\x00\x16\x8b\x05\xb9\x2e\x57\ -\xf8\x09\x0f\xab\xc5\x32\xc0\xdc\x3d\x0d\x69\x00\xba\x02\xbd\x78\ -\xb5\xf5\x47\xbc\xd6\xb6\x0c\xc3\xad\xf9\x38\xd1\x35\x19\x27\xe4\ -\x4f\xc1\xa1\xd9\x63\x30\x3a\x23\xbe\xeb\xb7\xbb\x3d\x4d\x58\xd5\ -\x55\x85\x1f\xba\x77\xa2\xdb\xef\xc1\xb9\x05\x07\xe3\x94\xc2\x03\ -\x75\x9f\x3d\x2e\xff\x00\x3c\x5a\xfb\x39\x30\x40\x99\xdd\xd2\x90\ -\x86\x34\xa4\x21\x0d\xfb\x2e\x58\x12\xaa\x2d\xf4\xb3\x72\xd2\x07\ -\xe9\x1b\xc9\xba\x1a\xaf\x54\x14\x08\xcc\xdf\xb1\x8c\x1d\x73\xe1\ -\x5d\x51\x29\xd6\x45\xa7\x32\x3a\xd1\x8b\xf5\x21\x04\xed\xad\x6d\ -\xb0\xdb\xed\xc8\xcb\xcb\x35\x44\x08\x31\x50\xfa\x12\xa1\x18\x29\ -\x47\x19\x76\x27\x96\x05\x6c\xb9\xb9\xc8\xcb\xcd\xc5\xee\xdd\x15\ -\xb0\xd9\x6c\x70\xb9\x72\xa1\x67\x0a\xa1\x61\xca\x8e\x59\x5a\xe0\ -\x82\x41\xa8\xab\x45\x08\xb1\x57\x34\xde\x45\xd7\x74\x12\x31\xdf\ -\x43\x98\x77\x8d\x52\x5e\x65\x55\x24\x60\xc2\xd2\x84\xf3\x61\xb1\ -\x46\x03\x0b\x83\xd4\x2b\xd5\x67\x57\xb4\x7e\x36\x2a\x1a\xfb\x76\ -\x4d\x2a\x1a\xe3\x9e\xa6\x91\xc7\x48\x9e\xbe\x2a\x78\x2a\x40\x81\ -\x00\x40\x59\x8a\x3a\x7f\x2b\x5e\xf2\x2e\xc5\x4b\x8d\x4b\x61\x63\ -\xac\x18\x66\xcd\xc3\xe4\x8c\x62\x94\x65\x14\xa3\xc4\x9e\x8f\x7c\ -\x36\x13\x2e\x4b\x06\xb2\x58\x1b\x28\x80\x5e\x3e\x80\x8e\xa0\x1b\ -\xed\x81\x1e\xd4\xfb\x3b\xb1\xbd\xb7\x01\x5b\xdc\xf5\xd8\x1b\xec\ -\x40\x80\x8a\xf9\xd2\x78\x1e\x6f\x36\xfe\x80\x13\xeb\xa6\xe1\x9f\ -\x63\xcf\xc0\x34\xd7\x68\x45\x31\xe7\x39\x79\xe3\x90\x01\x07\xdc\ -\xe8\x35\xc0\xeb\xc0\xe4\x33\x94\x63\x2b\x0c\x62\x49\x68\xcc\xd9\ -\xf1\x48\x1f\x77\x29\xd5\x47\x8b\xaa\x7d\x63\x0b\xb4\x2e\xbb\x85\ -\x61\xbd\x1e\xc4\x99\x0d\x8d\x26\x86\x1f\x69\xc9\x80\x26\x87\x0c\ -\x08\x89\x6f\xc7\x19\xc4\x20\xaa\x63\xfe\xb4\xb1\x38\x31\x7a\x82\ -\x92\x2c\x50\x69\x43\x31\xa5\xf3\x8e\xd1\x1f\xef\xbe\x66\xbb\x8b\ -\x95\xbd\x90\x58\xdf\x27\x31\xae\x07\x49\x06\x1b\x31\xfd\x3e\xd5\ -\x6c\x07\x62\x6e\xff\xf4\x57\xdc\x74\xac\x74\x48\xf6\x1b\x4f\x91\ -\xf1\x15\x04\x32\x00\xfd\x26\x0a\x18\x93\x69\x72\x19\xdd\x5a\x71\ -\x14\x1e\xb7\x1b\x79\xf9\x79\x29\xbd\x72\xa3\x4b\x47\x63\xc7\xb6\ -\xad\x21\xa5\x28\xa9\x9a\x2d\x89\xf3\x2d\x73\x25\x64\x8d\xd2\xb3\ -\x83\x12\xf9\x34\x34\x1a\x01\xcf\x0f\x54\xca\xe1\x34\xa4\xc1\x1c\ -\xd4\x07\xda\x51\xdd\xde\x08\xb4\xaf\x17\x09\x54\x75\x65\x4a\x0e\ -\x88\x0c\x53\x20\xa4\xaa\xee\x56\xe5\xde\xf8\xa2\x77\x03\x96\x6e\ -\xd8\x8e\x2b\x0a\x8f\xc0\x7d\x63\x7f\x87\x02\xbb\x90\xa2\xdf\x65\ -\x71\x60\x56\xc6\x48\x7c\xe7\xde\x96\x46\x78\x1a\xd2\x90\x86\x34\ -\xa4\x21\xa1\x90\x38\xa5\x28\x55\x85\x34\x62\x4e\xad\xa7\x94\xa2\ -\xa1\xa1\x1e\x7e\xbf\x5f\xd4\xbe\x85\x77\x46\x8f\x2e\x55\x3d\xc7\ -\x63\x4f\x5d\x1d\x38\x5e\x79\x07\xba\xb4\x54\xf9\x9c\xd5\x66\xc7\ -\x90\xb0\x60\x7e\x96\x65\x64\x41\x9e\x80\x82\xe7\x25\x6f\x01\x89\ -\x10\xc3\x42\x54\x5e\x10\x2a\x3f\x43\x01\x64\x65\x67\x85\x19\xea\ -\x98\x08\xca\xb9\xf6\x46\xa7\xc7\xed\x86\x33\xc3\xa9\x5f\x68\x35\ -\xbc\xcb\x28\x77\x32\xd5\x59\x4f\x64\x21\xde\xa0\x0e\x93\x52\x21\ -\xa5\xf0\x07\x04\x0b\xb1\x4d\x8c\x1d\x52\x7b\xa2\x18\x86\x01\x6b\ -\xb1\x86\xb5\xcb\x8b\x8a\x1e\x41\x76\x76\x0e\x0a\x0b\x8b\xc1\x30\ -\x04\x84\x30\x20\xa0\x68\x6d\x6d\xd5\x26\x24\x30\x45\x27\xfa\xe3\ -\x2c\x2e\x1e\x26\xa2\x57\x4a\x98\xc1\xa8\xc8\x9d\xc2\x95\x9d\x8d\ -\x9a\x9a\x2a\xc5\x3a\xf4\xf4\xf4\x60\xd8\xb0\x12\x85\xe1\xcc\xe5\ -\xca\xd5\xe0\x23\x2b\xdb\x85\xe2\x61\xc3\xc5\x39\x88\x0b\xcb\x07\ -\x51\x53\x53\xad\xb0\x02\xd9\x6c\x36\xa1\xbd\xb0\xbb\xf9\x99\x99\ -\x99\x03\x6e\x58\x88\xdf\x82\xa3\xba\x94\x9c\x44\xcb\x4f\xc4\x76\ -\x4c\x77\xd8\xcf\x68\x8c\x76\x17\x9e\x26\x69\x79\xa9\x41\x7d\x09\ -\x75\xec\x8e\xe4\x00\x17\xc3\xeb\xe4\x42\xa5\x6a\x3e\xa4\xe6\xbf\ -\xbc\xc1\xa4\x7c\xaa\xd8\x4b\x0e\xf0\xc2\x8b\x05\x8d\xdf\xe2\xfd\ -\xb6\x5f\xf0\xb7\x91\xa7\xe2\xb2\x11\x87\xc3\x42\xac\x18\xeb\xc8\ -\xc7\x77\x6e\x15\x22\x48\x9c\xf4\x12\x3d\x6d\x5f\x5c\x78\xa4\x29\ -\x93\x86\x2b\xb6\x0d\x21\x5b\xfc\xa9\x51\xec\x53\x62\xf8\x81\xe9\ -\xfa\x59\x31\xd3\x6f\x7f\x79\x0a\x49\x72\xde\x26\x49\xe9\x2e\x79\ -\x58\x48\xd5\xc2\x96\x34\x41\xef\x27\x9a\x3f\x18\xae\x27\x89\x6d\ -\x38\xfd\x4e\xef\xfd\x23\x1e\xa4\x02\x19\xed\x07\x9e\x22\x62\x0a\ -\xfb\x14\xc0\xc9\x27\x9f\x8a\xf5\x1b\xd6\xc9\x9f\x58\x6d\x76\x6c\ -\xde\xb4\x11\xe3\xc6\x8d\x93\x9f\xeb\xe9\xee\xc1\x81\x33\x66\xa2\ -\xa3\xa3\x4d\x3c\x37\x28\x5c\xae\x5c\xb4\xb7\xb5\x2a\xda\x2b\x2b\ -\x2f\x43\xfd\xde\x3a\x18\xf9\xa3\x68\x14\xa5\x21\x26\x86\x14\x07\ -\x0a\x7c\x5e\x2f\x9c\x19\x19\x03\xb6\x2a\x5e\x8f\x90\x35\x8e\xb5\ -\xb0\xe8\xea\xe8\x84\x3f\xe0\x47\x76\x76\x36\xba\x3a\xbb\xc0\x30\ -\x8c\x5c\x5c\x95\x10\x02\xa7\xc3\xa1\xdb\xc6\x82\x05\x4f\xe0\xa9\ -\xa7\x9e\x50\x7c\xf6\x9b\x93\x7f\x83\xcf\xbf\xf8\x3c\x21\x63\x74\ -\xb9\x5c\xa8\xac\xdc\x0d\x9b\xcd\xa6\x45\x64\x28\x0f\x38\x56\x2c\ -\x5b\x8e\xb1\xe3\xca\x64\x7a\x00\x21\xf8\xf5\x49\xbf\x46\x6d\x4d\ -\x95\xa2\xe8\xa5\xde\x7a\xdd\x78\xe3\x75\xb8\xe1\x86\x79\x72\xdb\ -\x14\x14\x37\xdf\x74\x0b\x4a\xc7\x8c\x93\xe9\x90\x10\x82\xe7\x9e\ -\x7b\x0e\x2f\xbf\xfc\xa2\xac\x48\x13\x92\xca\x96\x88\x34\xa4\x21\ -\x71\xd0\x10\x68\xc7\xd5\xd5\xaf\xe1\xa9\xfa\xaf\x71\x4c\x6e\x39\ -\xbe\xea\x49\x7b\x89\xd2\x90\x86\x34\xa4\x21\x0d\xfd\xa2\x14\xf5\ -\x9f\xe6\xd9\x3f\x22\x9d\xb9\xa0\x22\xc1\xa0\xc9\x83\x4a\x99\xc5\ -\x88\x18\xef\x41\xb5\xda\x13\xe5\x79\xf0\x5c\xc8\xb2\xc9\xf3\xbc\ -\x1c\xb8\xcf\x30\x61\x29\xb8\x23\x28\x2d\x89\x50\x8a\x62\xc1\xb4\ -\xda\x03\x13\x08\x04\x90\xc9\xb2\xf2\xfc\xe4\xc4\x03\xa2\xb0\xed\ -\xf7\xfb\xe1\xf6\x78\x60\x61\x59\xd8\x6c\x56\x78\x3c\x5e\x58\xad\ -\x16\x78\x44\x65\x86\x10\x82\xec\xec\x6c\xf4\xf4\xba\x61\xb7\xdb\ -\xe1\xb0\xdb\xd0\xdd\xd3\x2b\x7b\xc4\x3c\x6e\x0f\xbc\x3e\x3f\xea\ -\xea\x6a\x91\x97\x97\x8f\xd2\xd2\x51\xd8\xb9\x63\x37\xfc\x62\x66\ -\xbd\xac\xac\x4c\xf4\xf6\xf4\xc2\xe1\xb0\x23\xbf\xa0\x00\x5e\xaf\ -\x0f\x9d\x9d\xdd\x18\x3d\x7a\x24\x76\xef\xda\x8d\x82\x21\x05\xb2\ -\x32\x42\x18\x22\x8f\x8f\x17\x2b\xd8\x33\x62\xe2\x01\x86\x21\xf1\ -\x51\x95\xa6\xa0\xbc\x4e\x35\x21\x42\xc0\xb2\x2c\x38\x8e\x83\xd5\ -\x6a\xd3\x6d\x83\x52\x21\x8d\xb6\x4c\x0f\x84\x88\x31\x43\x00\xc3\ -\xb0\x51\xd7\x57\xa0\x93\x50\x21\x4a\x9e\x52\xf0\x7c\x18\x1d\x32\ -\x0c\x28\xa5\x60\x19\x16\x0c\xc3\xc6\xae\x10\x27\x7b\x1f\xc5\x4d\ -\x92\x34\x95\x99\x86\x31\x3f\x8c\x33\xa4\x20\xd9\xf3\x4c\x18\x39\ -\x10\x83\x75\x37\xf2\x78\x44\xeb\x98\x57\xe1\xcd\xd0\xd3\x20\x19\ -\x0f\x54\x59\xc8\xfc\xe2\xdf\x16\x82\x4d\x81\x3a\x6c\xea\xa9\x33\ -\x47\x57\x03\x6d\x38\x25\x34\x31\xc3\x48\xb6\x87\x50\xbd\x8e\x74\ -\x80\xb6\x57\x82\x36\x52\x8a\xd8\xcd\xe3\x18\xf7\x60\x1d\x79\x82\ -\xf9\xf4\x40\xc7\x22\x91\x14\xdd\x9f\xfb\x18\xbd\xf7\xdb\xc8\xa3\ -\xc5\x44\xe9\xf4\x3f\xa0\x9e\xa2\xfe\x5a\x48\x62\x50\x0c\x35\x1a\ -\x02\x03\x7e\x5f\x74\xe1\x93\x0c\x1e\xf2\x33\xfa\xbc\xb9\xb9\x05\ -\xbb\x2b\x2a\x30\x6a\xe4\x70\xec\xae\xaa\x01\x00\x14\x0e\x29\x40\ -\x77\x77\x37\x28\xcf\xa3\xa8\xa8\x10\x0c\x6b\x41\x5b\x7b\x3b\xfc\ -\x7e\x3f\x26\x4f\x9a\x84\x0d\x1b\x37\x21\xd7\x95\x83\xac\xec\x6c\ -\xec\xdc\xb1\x0b\x25\xc3\x8b\xe1\xf1\x78\xd1\xd6\xd6\x0e\x96\x65\ -\x50\x54\x54\x8c\xee\xee\x0e\xe4\xe5\xe5\x23\x3b\x27\x07\x5b\xb6\ -\x6c\x43\x49\x49\x09\x02\x01\x3f\x9a\x9a\x9a\x51\x5e\x56\x86\x1d\ -\x3b\x77\xc2\xe5\x72\xa1\xa8\xb0\x10\xd5\xd5\xd5\xb0\xdb\x6d\x70\ -\x38\x9c\x9a\xc4\x09\x24\x89\x85\x43\x89\x11\xa6\x48\x5f\x71\xde\ -\x07\x0f\x20\x35\x47\xc3\x69\x48\x43\x1a\xd2\x90\x86\x34\xa4\x21\ -\x0d\x69\x48\x8c\x50\x98\x04\xa5\xc8\xbc\x06\xd8\x7f\x62\x1e\x51\ -\x64\xbd\x20\x0c\x23\x7a\x86\xa8\x5c\xcf\x81\x1a\x6a\x6c\xca\xac\ -\x64\x54\x5d\x60\x88\x42\xcc\x16\x16\x5d\xe1\x23\xd0\xc6\xcc\x44\ -\x32\x8c\x50\x71\x8c\x09\x11\x8a\x55\x59\x3f\xc2\xb3\x9a\xb5\xb5\ -\xb6\xa0\xbc\x7c\x1c\x9a\x9a\x9a\x91\xe7\xca\x01\x08\x41\x76\x56\ -\x16\x4a\x86\x95\xa0\xa1\xae\x16\x0d\x7b\xeb\x31\x65\xda\x34\xd8\ -\x6c\x76\xb8\xdd\xbd\x70\x3a\x1c\x18\x35\x72\x24\x72\x72\xb2\x90\ -\x95\x99\x05\x0b\x6b\x41\x20\xe0\xc7\xc4\xf2\x72\xec\xd8\xb5\x0b\ -\x5c\x30\x80\xd1\xa3\x46\xa2\xb2\x8a\x47\x51\xe1\x50\x64\x64\x64\ -\x60\x48\x7e\x1e\x6c\x36\x1b\x58\x96\xc1\xe8\x51\x23\x01\x10\x1c\ -\x30\x71\xa2\x8c\x8f\x31\x63\xc6\x28\x14\x0a\x75\xda\x01\x75\xc5\ -\x75\xed\x7a\x51\xd5\x5c\x75\xb2\xe0\x50\x21\xdd\xb5\xd4\x87\x42\ -\xf7\x22\x62\xfc\x16\x09\x15\x8e\x62\xc3\x3c\x33\x46\x49\x39\xa8\ -\x58\x9b\x49\xba\x26\x27\xd1\x07\x43\x62\x4b\xee\x41\x55\xed\x85\ -\xd6\x8b\x07\x21\x8c\x8e\x47\x6c\xb0\x83\x2a\xf8\x22\x65\x2d\x8b\ -\x06\xc1\x3d\x66\x3d\x5d\xfd\x64\xf9\x34\xdd\x4d\x9f\x0d\x74\x06\ -\x09\x3f\x8c\xea\x05\x11\x73\xd7\x97\x75\xef\x33\x87\x37\xcf\x45\ -\x31\xc9\x92\x28\x95\xd8\xfb\xba\xec\x31\xbf\x1f\x23\x9d\xc4\x1a\ -\x23\x47\x13\xbb\x0d\xa3\xaf\x6f\x6a\xb3\x91\xe8\xd9\xbc\x68\x6a\ -\x8e\x5b\xef\xfc\x4a\xe4\xb0\x49\x92\xe8\xdd\x2c\xde\x63\xe5\xef\ -\xb1\x95\xeb\x4a\x1e\x1e\x48\xb2\xe8\x31\xc9\xf4\xde\xd7\x73\x34\ -\xd9\x74\x6e\xc8\x67\xe2\x44\x5c\x1f\xc7\x4d\x34\xf2\x3f\xd9\x3f\ -\x62\x8a\x86\x0f\x1f\x8e\x29\x93\xa7\x82\x61\x18\x19\xf7\x8d\x0d\ -\xf5\xf8\xf9\xe7\x9f\xe4\x6b\x6e\x0c\xc3\xc2\xe3\x76\x6b\xde\xde\ -\xb2\x65\x0b\xda\xdb\x3b\x64\x71\xd6\xed\x76\x63\xe2\xc4\x09\xe8\ -\xed\x75\xcb\x6b\x99\x93\xe3\xd2\xbc\xe7\xf3\x7a\xb1\x71\xe3\x06\ -\x29\xec\x04\x80\x90\x18\xe1\x80\x89\x07\x28\x9e\xeb\x68\x6f\xc7\ -\xce\x5d\x3b\x43\x69\x9a\x35\x75\x81\x84\x06\x86\x0d\x2b\xc1\x88\ -\x11\x23\xe2\xa4\x77\x1a\x01\x3b\x42\x5f\x99\x99\x59\x28\x2c\x04\ -\x7a\x7b\x84\x79\x65\x67\xe7\x20\x33\x33\x03\xc5\xc5\xc5\x28\x19\ -\x39\x12\x0e\xa7\x13\xce\x0c\x27\x08\x84\x6a\xf6\xc3\x8a\x8b\x64\ -\x82\x2a\x2e\x0a\xd5\x27\x29\x0b\x8b\xbf\x1a\x53\x3a\x5a\xfe\x3d\ -\x14\x97\x63\x4e\x77\x33\x03\xd5\x55\x55\x68\x6e\x6e\x12\x57\x46\ -\xc0\x9d\xcb\x95\x83\xa9\x53\xa6\xca\x05\x66\xa5\xcf\x65\xe2\xe7\ -\x79\xb0\x2c\x0b\xbb\x4e\x9c\xd2\x01\x13\x27\xa1\xd7\x2d\xa4\xfa\ -\x65\x18\x06\x59\x19\x4e\xac\x59\xfd\x33\x08\xc3\x86\x12\x2d\x00\ -\x8a\x14\xc1\x3c\x4f\x51\x53\x53\x83\x69\xd3\xa6\x87\x29\xbc\x14\ -\xa5\x61\x4a\x9e\x04\x2d\xad\xad\xa8\xaa\xac\x08\x29\x47\x52\xaa\ -\x74\xf1\xca\x9d\x90\x8c\x8b\xc2\x62\x61\x31\x7d\xda\x81\xc2\xba\ -\x89\x6d\x16\x14\x14\xa4\xad\x38\x69\x48\x43\x1a\xd2\x90\x86\x34\ -\xa4\x21\x0d\x49\x52\xe2\xcc\x2b\x45\x71\x17\xe6\x50\x01\x43\x14\ -\xc2\x78\x7f\x5c\xcd\xff\xd7\xa3\x8f\xe0\x61\xfe\x9f\x0a\xcd\x70\ -\xee\xdc\x13\xf0\xed\x92\x6f\x43\xd3\xe3\xf5\xeb\x09\x9d\x7a\xea\ -\x69\x8a\xbf\x33\xb3\xb2\x51\x59\xb1\x5b\x16\x52\x8d\xd2\x2c\x57\ -\x56\x54\x60\xce\x61\x47\x28\x8a\x84\xce\x9e\x33\x1b\xcb\x7e\xf8\ -\x41\xf1\xdc\x37\x5f\x7f\x8b\x73\xcf\x3f\x4f\xae\x14\xae\x1e\x87\ -\x24\x80\xdf\x71\xfb\x1d\xf8\xc7\x3f\xee\x8f\x4f\x29\xa2\x5a\x03\ -\x03\x0d\xfb\x90\x61\x19\xb8\xdd\x1e\x10\xc2\x22\x37\x2f\x1f\x7b\ -\xf7\xec\x85\xb7\x77\x0f\x46\x8d\x18\x85\xbd\x9b\x77\xc1\xee\xb4\ -\x63\x68\xd9\x18\xd8\x33\x9c\xb0\x58\x2c\xa0\x30\xf6\x84\x18\x79\ -\xb4\x2c\x2c\x6b\x52\x53\x97\xe2\x9b\xa8\x2e\x25\x85\xe3\xf3\xde\ -\x7b\xff\x8e\x37\xde\x7c\x5d\x61\x91\xfa\xef\xa2\x0f\x70\xea\x6f\ -\x4f\x8d\x3a\x2e\xa2\xaa\xb4\xec\x70\x3a\xb1\x62\xe5\x32\x45\x6c\ -\x55\x5b\x4b\x0b\x8a\x87\x0d\x07\x00\x70\x5c\x50\x7c\x4f\xf4\x08\ -\x89\xeb\x45\x18\x16\x33\x67\xce\xc4\xda\xb5\xab\x95\x64\xae\xa2\ -\x0b\x4a\x29\x3e\xf8\x60\x11\xae\xb9\xfa\x4a\xd5\x38\x18\xcd\x7a\ -\xdf\x7f\xff\xfd\x72\x7b\x52\x3b\x94\xa6\xa8\xa5\xd3\x28\x3d\x55\ -\xac\x1b\x9a\x9a\xb4\x84\x19\xb1\x97\x44\xa1\x47\x3d\x0e\x62\x92\ -\x11\x9a\x1d\x3f\x4d\x91\x85\x8b\x37\xf6\xc6\xf0\x2e\x2e\x35\x37\ -\xcf\x28\x21\x80\x44\x55\x2f\x89\x46\x8d\x19\x34\x4a\x55\x4f\xcc\ -\xbd\x46\x93\xbd\x1f\xd4\xd6\x1e\x03\xbc\xa7\x7a\x50\x00\x49\x55\ -\x7a\xee\x23\x9f\xe8\x2f\xcb\x7e\xbc\xf8\xea\xeb\xfb\xa9\xb2\x3e\ -\x03\xcd\xdf\xa9\x49\x7a\x26\x51\x08\x83\xc6\xb9\x4f\x92\xb5\xff\ -\x8c\x1e\x4c\x15\x79\xc1\xb4\x80\x4f\x93\x4c\xbf\xc4\xf4\x78\x07\ -\xd6\x53\x34\x80\x37\x82\x8c\x94\x20\x33\x60\xb6\x3e\x90\xa6\x0f\ -\x3d\x42\xa5\xe6\xc6\xd1\xa7\xdb\x73\x91\x36\x88\xaa\xe1\xba\x3d\ -\xf5\x18\x31\xbc\x04\x19\x19\x4e\x04\xdd\x3e\xf8\x5a\xdb\x11\xe0\ -\x38\xe4\x0e\x13\xbc\x41\x3e\x8b\xa0\xdc\x64\x25\x31\x1d\x34\xa5\ -\xe6\x6a\xf2\x50\x3d\xdc\xd1\x44\x92\x27\xe9\x3b\x7e\xc3\x81\xe7\ -\x4c\x3d\xc6\x32\x0c\x52\x0d\xd2\x31\x4d\x69\x48\x43\x1a\xd2\x90\ -\x86\x34\xa4\x61\x5f\x06\x0b\x21\xbc\x52\xa1\xa3\x7d\xac\xdc\xae\ -\xb1\x84\x91\x38\x35\xc7\xc4\x82\xd6\xa3\x43\xe2\x52\x8c\x24\x0f\ -\x0b\x13\x45\x70\x95\xda\x0e\x17\xdc\x8d\xbc\x2b\x3c\xcf\x19\x0a\ -\xd6\x52\x3b\xac\xc9\xfe\xf4\xb4\x27\xa3\xf8\x26\xd9\x18\xce\xb0\ -\xb0\xdb\xed\x00\x80\x91\x23\x4a\x90\x91\xe1\x40\xc7\xde\x46\xb4\ -\xed\xae\x44\xe9\xf4\xc9\xe8\xa8\xae\x86\x33\xd7\x05\x8b\xd3\x01\ -\x9e\xe7\xe1\xf5\x78\x13\xbe\x3e\x5a\xbb\x8c\x90\x31\x4f\x4e\x41\ -\x6d\x30\xff\xd0\x1a\x86\x62\xaf\x22\xad\x4d\x34\x8f\x4b\xb8\x67\ -\x86\x10\x22\x7b\x88\x8c\x14\x31\xca\x73\x62\x28\x12\x89\x4b\x79\ -\xd0\xb6\x47\xa3\xce\x61\x60\xec\x16\x34\x2c\xe6\x2a\x6c\xa5\xe2\ -\xbc\x03\x4e\x0c\x63\xc3\x62\x63\x33\x09\x9f\xa7\xba\x5e\x8f\xc1\ -\x7c\x0c\x1d\x2d\x03\xe4\x21\x22\x66\xf9\x6a\x7f\x59\x10\x8d\xea\ -\x1e\x19\x17\xbe\x51\xf1\x2f\x6a\x8e\x00\x4c\x1a\x50\x92\x85\x7f\ -\xd3\xa1\x12\x94\xf6\x07\x19\xc4\x0e\xd4\x24\x82\x52\x3c\x24\x27\ -\x6e\x7a\xa7\xfd\x85\x5f\x83\x71\xd3\x41\x86\x77\x93\x41\x8b\x83\ -\x86\xbf\x27\x9a\x4f\x26\x8b\xcf\x44\xe5\xef\x24\x25\xf9\x4c\xea\ -\xd0\x3b\x55\xe1\x53\x35\x32\x5b\xa8\x1e\x1f\x93\x3a\xd8\xea\xef\ -\xcd\x1d\xdf\x00\x4c\xc7\xbb\xeb\xb4\x6f\x78\xe5\xcc\x24\x32\x68\ -\x9c\x14\xa3\x27\x60\x87\xb7\xc4\xb2\x82\xc3\x30\xc3\xe9\x04\x00\ -\xb8\xdd\x5e\x64\x0f\xc9\x47\x56\x4e\x36\x2a\x96\x2e\x41\xc9\xa1\ -\x07\xc1\xe2\x14\x62\x70\xbc\x1e\x2f\x1c\x0e\x7b\xd2\xd7\x26\x3c\ -\x06\x89\xc4\xc0\xa0\x13\xea\xd1\x20\x89\xa5\x25\xb3\x57\xe0\x48\ -\xaa\x26\x55\x48\x3b\x8b\xd2\x90\x86\x34\xa4\x21\x0d\x69\x48\xc3\ -\x3e\x0a\x16\x50\xa9\xae\x0e\x2f\x29\x4a\x2a\xa9\x39\xc6\x2c\x4b\ -\x51\x35\xc3\xb0\xca\xd9\x14\xc6\x95\xb3\x4d\x0a\x98\x72\x4c\x4a\ -\x02\x2c\xa0\x87\xce\x9a\x8d\xac\x9c\x6c\x39\xe9\x41\x28\x53\x58\ -\x08\x29\x36\x8b\x05\x3f\x7e\xff\x1d\xac\x36\xbb\x88\x2f\x02\x9b\ -\xd5\x86\xe3\x8f\x3f\x5e\xd1\x56\x66\x56\x36\x8e\x3e\xea\x18\x80\ -\x50\x31\x6e\x84\x62\xf4\x88\x12\x7c\xb6\xf8\x33\x45\x8b\xb5\x75\ -\x75\x38\xf6\xd8\x63\xc1\xf3\x42\x6d\x1b\xc9\x33\x22\xa5\x46\x23\ -\x62\x2d\x1c\xf0\x1c\x16\x7f\xf6\x19\x10\x56\xff\x88\x88\x49\x19\ -\x28\xa5\xe0\x44\x8f\x49\x41\x41\x3e\x8e\x3d\xf6\xb8\x10\xaa\x09\ -\xc1\x90\x21\x43\xc0\x89\x75\x74\xc2\x15\x24\x2a\x14\xda\x81\xcd\ -\x6a\x43\x30\x28\x7c\x9f\x91\x21\x28\x46\x3d\x6d\xad\xc8\x18\x39\ -\x0c\xe3\x46\x96\x80\xb1\xd9\x40\x08\x81\xdf\xe7\x87\xc3\x61\x87\ -\x85\x65\xc1\xf3\x7c\xd2\xae\x54\x11\x10\x04\x83\x01\x00\x80\xd5\ -\x62\x55\x64\xe1\xd3\x2a\x18\x34\xaa\xf2\xb1\x62\xc5\x72\xb4\xb7\ -\xb7\xcb\xf4\x42\x08\xc1\x51\x47\x1d\x0d\xa7\xa8\x04\x4a\xef\x7c\ -\xfd\xf5\xd7\x72\xbf\x84\x10\x39\x99\x46\x2c\x4a\x91\xd4\x77\x73\ -\x73\x0b\xd6\xac\xf9\x39\xf4\x3d\x21\xd8\xba\x75\xab\xe9\xf9\xab\ -\xe7\xb0\x79\xf3\x66\xd4\xd6\xd6\xc8\x59\x03\x79\x8e\xc7\xec\xd9\ -\xb3\x31\x64\xc8\x90\x81\x51\x8a\x42\xae\x65\x03\x85\x89\x28\x14\ -\xf9\xe8\x57\xc4\x07\xd6\xb6\x15\x62\x77\xfa\x49\xda\xa9\x61\x76\ -\xc9\xd4\xb0\xc9\xa9\xd9\x35\x89\xce\x98\x93\x3b\x10\x62\x82\x86\ -\x74\xc6\x61\xfc\xba\x6a\xbf\xd3\xd8\xda\xed\x2f\xba\x21\x51\xe6\ -\x95\x6a\xa6\x7f\x0a\x73\xf4\x8e\x41\x4f\xef\xa9\xc9\x67\x34\x7c\ -\x31\xd5\xf1\xae\x12\x10\x8d\xe9\x9d\x0c\x72\xbc\xa7\xda\x3e\x8d\ -\x95\xcf\x20\xc5\xf7\x29\x0c\xf4\x8d\x04\xcf\xc4\xe0\x26\x01\x55\ -\x7f\x1f\x94\xea\x42\x5a\x06\x2e\xa6\x88\xe5\x07\x7a\x93\xa8\xdc\ -\x69\x84\xc1\x13\x4f\x3e\x81\x59\xb3\x0e\x89\xf8\x5e\x77\x57\x17\ -\xc6\x8c\x1b\x8f\x8e\xf6\x76\x48\xea\x9c\xcb\x95\x8b\xf6\xb6\x56\ -\xc5\x73\x23\x47\x8e\xc0\x57\x5f\x7f\xa1\xf8\xec\x87\xef\xbf\xc7\ -\x31\xc7\x1d\x2f\x66\x1a\xe3\x01\x10\x9c\xf6\xbb\xd3\xf0\xe5\x97\ -\x5f\x44\x1d\xef\xdf\xee\xb9\x1b\xa7\x9c\x72\x6a\xe4\x4c\x72\x84\ -\xc1\xeb\xaf\xbd\x86\x67\x9e\x7d\x26\xaa\xa2\x20\x7c\x26\x28\x52\ -\x36\x9b\x45\x43\x86\x59\xf9\x05\xa0\x3c\x0f\x2e\xe8\x43\x30\xe0\ -\xc5\xee\x8a\x4a\xec\xd9\xb3\x17\xd3\xa7\x4f\xc7\xd6\x2d\x5b\x35\ -\xa4\x3b\x74\xe8\x50\x4c\x9a\x34\x29\xa6\x35\xd8\xb2\x75\x0b\x32\ -\x9c\x19\x28\x2d\x2d\x8d\xbc\x15\x8c\x14\x5e\x13\x8a\x30\xa5\x14\ -\xd7\x5f\x7f\x23\xd6\xae\x5d\xab\xb8\xf6\xb8\x65\xf3\x66\x94\x95\ -\x95\xc9\xcf\xf9\x7d\x3e\x9c\x73\xee\x79\xe8\xea\xec\x88\x23\x96\ -\x55\xfb\xc6\xb2\x65\xcb\x70\xe6\x99\x67\x2a\xbf\xa3\xf1\xdf\x1d\ -\x78\xe8\xa1\x87\xf1\xe6\x9b\x6f\x48\x0b\x0d\x86\x61\xf0\xbf\x45\ -\xff\xc5\x29\xa7\x9c\xd2\x8f\x9b\x26\xed\x2a\x4a\x43\x1a\xd2\x90\ -\x86\x34\xa4\x21\x0d\xfb\x20\xf0\x41\x58\x42\x16\x5d\xa3\x8a\xd6\ -\x7d\xad\x8f\xa3\x6f\xd9\xa3\x2c\xdf\xb7\x66\xfb\xea\xa5\xd0\xb1\ -\x34\x5a\x58\xc6\x44\xbb\x04\xe0\xa9\x22\x16\x84\x98\x1c\x1f\xd1\ -\x08\xc6\x34\x94\x8a\x3b\x5a\xaf\xac\x55\x3f\xb1\x40\xa8\x43\x50\ -\xca\x83\x61\x88\xf9\x62\xb5\xe2\x50\x1c\x4e\x07\x02\x7e\xbf\x22\ -\xdd\xf4\xf2\xe5\xcb\x71\xcb\x2d\xb7\xc0\xe7\xf3\x81\xf2\x14\x15\ -\x15\x15\x98\x38\x71\x02\x8e\x3d\xe6\x68\x3c\xf2\xaf\x47\x41\x29\ -\x60\xb3\xdb\x10\x08\x04\x00\x0a\x4c\x99\x32\x05\xab\xd7\xfc\x8c\ -\x8a\x8a\x4a\xbc\xfc\xd2\x2b\xe0\xb8\xa0\x50\x73\x47\x8c\xc1\x92\ -\xbc\x5a\x92\xa7\xa3\xa7\xa7\x17\xef\x2e\x5c\x88\xe3\x8e\x3b\x0e\ -\xef\xbe\xf7\xae\x22\xd9\x17\x61\x22\xc5\xd4\x84\x59\xa8\x74\x12\ -\x5e\x10\xbd\x79\x4b\xeb\x45\x21\x7b\xd4\x34\x75\xa5\x28\x15\x9f\ -\x8b\x5d\x59\xd7\xad\x3b\xc4\xf3\x62\x5b\xb1\xe7\xdd\x57\x78\x9e\ -\x14\x0a\x55\x28\x8e\x42\x18\x66\x7f\x28\x29\x52\xb6\x32\x46\xf8\ -\x5d\xe3\xf8\x65\xf4\x89\x4a\x9c\x03\x23\xeb\x53\x24\x0e\x2c\xf6\ -\x3f\x30\xaa\xac\x98\x5a\xcf\x05\x51\x29\xc2\xa9\xa5\x28\x6a\x29\ -\x87\x18\xce\x34\x82\x19\x22\x11\x03\x88\x09\x3d\x8c\x0a\xaf\x14\ -\x0a\x32\xd2\xda\x13\x52\x4c\x3f\x27\xd1\xb2\xdd\xa5\xe8\xc0\xa3\ -\xd1\x3b\x4d\xf1\xf1\x13\x44\x89\x71\x4c\xf3\x99\xa4\x8e\xbb\x6f\ -\xa7\x64\x2a\xe3\x1d\x29\xba\x4f\xcd\xd2\x43\x6a\xd5\xe7\x32\xe4\ -\xef\x6a\xf9\x80\x26\x9a\xde\xf5\xaf\x78\x84\xb0\x23\x7e\x20\xcb\ -\x9b\x03\x58\xa7\x88\x1f\xe0\x4d\xa2\x17\xc7\x63\x4a\x39\xd1\xd3\ -\x2d\x4c\x09\xd2\x06\xc5\x3c\xcd\xc6\x99\xc4\x80\x2f\x42\x48\xd4\ -\x76\xe5\xb9\x86\x4f\x28\xec\xf7\x9a\xaa\x1a\xac\x5a\xb9\x0a\x19\ -\x19\x19\x28\x2c\x2a\xc4\xb4\x69\xd3\xf0\xc2\xf3\xcf\xa1\xab\xab\ -\x1b\x2f\xbf\xf2\x2a\xba\xba\xbb\x70\xc3\xf5\x37\x80\xb5\xb0\x78\ -\x6a\xfe\x53\xf2\x18\x77\xed\xda\x8d\x67\x9e\x7e\x1a\x9c\x98\x69\ -\x8d\xea\x1e\xab\x04\x0c\x43\x50\x52\x32\x1c\xf7\xdc\x73\xb7\x72\ -\x66\xba\x81\x42\x26\x17\xc2\xe0\x73\x7d\x85\x90\xf6\x07\x91\x25\ -\x2e\xe5\x71\x2a\x1c\x32\x94\x0f\x13\xa6\xd3\x90\x86\x34\xa4\x21\ -\x0d\x69\x48\x43\x1a\xf6\x11\x20\x04\x16\x88\xb1\x44\x24\x9a\xb0\ -\xa9\x11\x90\xa0\x2f\xf4\x9a\xbc\x24\x4b\xa9\xb2\xa8\x66\xcc\xf2\ -\x19\xa5\x31\x2b\x34\xd1\x64\x4a\x39\x9e\x07\x30\x2c\xb7\xa2\xef\ -\x85\x09\x5d\x45\x63\x18\x56\x8d\xa2\x30\x9d\x94\x6a\xbc\x3d\x92\ -\xb2\x43\x0c\xb3\xc6\x51\xf1\x7f\x1a\x71\x2e\x52\xbd\x1b\xa3\x2c\ -\x68\x34\x42\xec\x16\xcb\x5a\xe0\xe3\xbd\x62\x41\xa3\x50\x8c\x16\ -\x61\x08\xe6\xcf\x7f\x12\x97\x5d\x76\x99\xbc\xd2\x94\x02\x13\xcb\ -\x27\x60\xfb\xce\x1d\xb8\xe7\xde\x7b\xc0\x32\x0c\xde\x79\xeb\x1d\ -\x70\x1c\x07\x42\x80\xe9\xd3\xa6\x62\xfe\xfc\x27\x90\x9d\x9d\x8d\ -\x6d\xdb\xb7\x6b\xfa\x95\xb2\xe8\x31\x44\x28\x66\xdb\xdc\xdc\xac\ -\xb5\xd5\x90\x50\xf2\x87\x30\x14\xe8\x2e\xa1\x10\xfb\x25\x3c\x40\ -\x18\x46\x4b\xc7\xe1\x45\x9a\xd4\x98\x27\x24\x2e\xa5\xd3\xbc\xda\ -\x4d\x44\xf2\xa7\x31\x29\x47\x4c\x58\x5c\x19\x11\xbd\x6d\x54\xa7\ -\xb0\x09\x41\xf2\x53\x65\x2b\x3c\x55\x54\xd7\xd4\xa2\xfc\x97\xd1\ -\x1b\x25\xd4\x0e\xa4\x08\x7c\x26\xc1\x96\xa2\x18\x9b\xd3\x3e\xae\ -\xdf\x40\xfc\x78\xef\xa3\xcb\x83\xd2\x88\x46\x00\xa3\xec\x43\xc6\ -\xfc\x3d\xc6\x52\xef\xc6\x0d\x2b\xc7\x47\x60\xee\x79\x35\x96\x55\ -\xbf\xc8\x59\x82\xfa\x8a\x6f\x6a\x60\x3c\x31\xc2\x27\x8d\x52\xd0\ -\xc6\xa8\x9e\x89\x9c\xb5\x90\x98\xa4\x77\x83\xf5\xd5\xba\xb2\x95\ -\xfd\x11\x1a\x23\x39\x11\xdd\xf6\xe5\x98\xbf\x68\x78\x27\x71\xd2\ -\x67\xbc\x16\x6b\x42\x22\xe3\x43\xdd\x7a\x5f\xf1\x6e\xb8\x0e\x51\ -\xf8\x48\xd4\x7a\x5c\x06\xf2\x8f\x8a\x2e\x89\x0a\xef\x4d\xa7\x6e\ -\xae\x00\x00\x20\x00\x49\x44\x41\x54\x21\xf4\x93\xbe\xd1\xbb\xd1\ -\xf8\x69\x8c\xeb\x60\xf4\x1a\x35\xcb\x67\xd2\x78\x1f\x18\xbc\x93\ -\xf8\xf0\x6d\xd8\x5e\x7c\x05\xa7\x8c\xce\xd5\x10\x9f\xe9\x23\xdd\ -\x18\xe9\x25\xc4\xdc\xf3\x72\x06\x35\x4a\x06\xb8\x4e\x51\x0a\x01\ -\xa5\x14\x9f\x7c\xfa\x29\x36\x6c\xda\x24\x2b\x21\x2c\xcb\xe2\xf4\ -\xd3\x4f\x47\x76\x56\x56\xcc\x1a\x56\x47\x47\x07\xfe\xf7\xbf\xff\ -\xc9\x1b\x8c\x10\x82\x1d\xdb\xb7\x9b\x52\xce\xb6\xef\xd8\x81\x95\ -\x2b\x56\x08\x5f\x8b\x4a\xc4\x86\x0d\x1b\x34\xcf\x1d\x7c\xf0\x21\ -\x28\x2f\x2f\x0b\x2d\x2e\x21\x28\x2d\x1d\x13\xf3\xb9\xc3\x30\x44\ -\x51\x14\x35\x5c\xac\xcf\xc9\xc9\x06\x4f\x29\x9e\x78\xfc\x49\xac\ -\xfc\x69\x15\xde\x79\xfb\x2d\x21\x85\x38\x00\xab\xd5\x02\x9e\xe3\ -\xc1\x8a\x8a\x20\x05\xb0\x62\xe5\x4f\xb8\xff\x81\x07\x71\xfc\x71\ -\xc7\xe1\x85\x17\x9e\x07\x21\xe2\x95\x44\x02\xdd\x6c\xed\xc7\x1d\ -\x7b\x1c\x8e\x39\xe6\x58\xa5\xc3\xca\xe4\x09\x7c\xe8\xec\xd9\xf0\ -\x07\x02\xe2\x1c\x04\x3c\xed\xdc\xbe\x0d\xaf\xb6\xb4\x88\x44\x2e\ -\x28\x26\x2d\xad\x2d\x71\x29\xc9\x00\x70\xee\x79\xe7\x81\x61\x58\ -\xa1\x25\x02\xf4\x74\x77\xe3\xc3\x8f\x3e\x8c\xfa\xf2\xc8\x91\x23\ -\x71\xce\x39\xe7\xc9\x7b\x8d\x61\x19\xec\xda\xb9\x13\xab\x7e\x5a\ -\x15\x75\x28\x3f\xaf\x5e\x8d\xd7\xdf\x78\x5d\xdc\xab\xc2\xbc\xaa\ -\x2a\x2b\x07\x76\x7f\xa4\x7c\x95\xc6\x34\xa4\x21\x0d\x69\x48\x43\ -\x1a\xd2\x90\x86\x38\x81\x00\x16\x68\xee\xf8\x45\xd6\x00\xa9\xd9\ -\x4a\xe5\x86\x05\x3e\x54\x96\x9d\xd4\xd1\x8a\x70\xef\xbd\xf7\x86\ -\xea\xe1\x50\xc0\x6a\xb7\xe1\xb0\x39\x87\x21\x6b\x7c\x56\x44\x31\ -\x5d\x6f\x2e\x7b\xf7\xec\xc1\x15\x57\x5c\x09\x5e\xf2\x0c\x51\x6a\ -\x4a\x20\xa7\x94\xe2\xdb\xaf\xbf\xc5\x9f\xae\x9b\xa7\xc0\xa2\xa6\ -\xa6\x12\x21\xf8\xfd\xc5\xbf\xc7\xf5\xd7\xfd\x49\xf5\x31\x89\x41\ -\xf6\x27\xb2\x42\x41\x79\x5e\x35\x0e\x5e\xe1\x25\xf8\x7e\xe9\x77\ -\xf8\xfa\x9b\xaf\xe1\xf7\x79\x41\xc5\x40\x7f\x02\x02\x96\x65\xe5\ -\xfa\x35\x04\x04\x3c\xc7\x89\xfa\x0f\x8f\xdc\xdc\x7c\x3c\xf0\xe0\ -\x03\xe8\xec\xea\x42\x86\xc3\x26\xbc\x23\xa2\x97\x88\x78\x39\x70\ -\xc6\x4c\x65\xd1\x24\x71\x6e\x92\xe2\x25\x78\xde\x68\x58\x3a\xf3\ -\x50\xf6\x95\x3f\xfe\xf1\x6a\xfc\xf1\x8f\x57\x2b\x66\x74\xf2\xc9\ -\x27\xe3\x8b\x2f\xbf\x0c\xcd\x23\xa6\x5a\x54\xca\x35\x72\xb9\x72\ -\xf1\xf6\x5b\x6f\x29\x3e\xdb\xb1\x6d\x1b\x3e\xf9\xf4\x13\x39\x9b\ -\x9f\x56\xd1\x14\xc6\x37\xf3\x90\x83\xf1\xf6\xdb\x6f\x28\xbe\x7b\ -\xe1\xf9\x17\x4c\x28\x45\x14\x6f\xbd\xfd\x16\xde\x7a\xfb\x6d\x45\ -\x7b\xba\xf3\xe8\xcf\x1b\x74\xd4\xe8\x6f\xb3\xd9\xcd\xd4\xd9\xe8\ -\x48\x8c\xef\xc7\xcf\xe4\x4c\xcd\x8b\x44\x9b\x2e\x8d\xcc\xe6\xa2\ -\xf4\x4f\x0d\xcb\x3a\xd1\x88\xf8\x32\xc3\xb7\x14\xfd\x68\xea\xf7\ -\x44\xc1\x73\x5f\x83\x75\x8c\xe8\x80\x9a\x7d\x5e\xdf\x73\x11\x32\ -\xd9\x52\xfd\xe9\xf4\x95\x4c\x62\x4e\xde\x62\x30\x3f\xa2\xc6\x37\ -\x55\x18\x9c\x68\x74\x02\x88\x6f\x1c\x31\x6f\x1b\xf5\xf8\x79\x03\ -\xbc\xab\xe9\xc9\x68\x5c\x24\x4e\xc6\x11\xe7\xfa\x18\xd5\xa3\xa2\ -\xca\x33\x58\x83\x77\xd0\xbe\x8d\x9f\xc6\x39\x9d\x68\xfc\x91\xa8\ -\xd7\x93\xea\xf2\x8b\x3e\xd3\x3b\xed\xeb\xfb\x51\x1a\x50\x67\x01\ -\x4e\x59\xbc\xab\x3d\x8e\x26\xe9\x7d\xc0\xf1\x4e\x23\xb6\x4f\x34\ -\xb1\x46\x71\xf2\xf5\x78\xf9\x10\x54\x68\xd5\x1c\x4b\x06\xf8\x95\ -\x3d\x73\x7d\xf4\x2c\x53\xb3\x68\x56\x3f\xa8\x1a\xb0\x5f\xfc\xde\ -\x86\x01\xf6\x14\x0d\xa0\x5e\x64\xc6\x3d\x1a\xf0\xf9\xfb\x24\x78\ -\xc6\x1b\x6b\x64\x5a\x90\x4f\x90\x62\x69\x13\xd3\x8b\x87\xe5\x20\ -\x97\x17\x68\xef\xde\x3d\x68\x6a\x6e\x46\x67\x47\x87\xa0\x00\x01\ -\xe8\xed\xe9\x96\x71\xd8\xd4\xd4\x04\x9f\xcf\x0b\xbb\xd3\x21\x5c\ -\xf7\x62\x42\x42\x7c\x51\x51\x21\x3a\xbb\xba\xf0\x7f\x7f\xff\x7b\ -\xd8\x6d\x08\x1a\xba\x91\x41\x08\x8e\x3f\x7e\x2e\xde\x7f\xff\x3d\ -\x68\x43\x1d\xe3\x13\xd4\xe2\x47\x49\x2c\x2f\x92\xb8\x86\x97\x72\ -\x86\x80\x34\xa4\x21\x0d\x69\x48\x43\x1a\xd2\x90\x86\x34\x00\x00\ -\x2c\x54\xca\x1e\x45\xf8\x04\x89\x8c\x51\x9e\x94\x52\x71\xb3\x03\ -\x23\x20\xca\x16\x25\x83\x02\x99\xe1\x0a\x89\xd5\x66\xd7\xd5\x5b\ -\xf5\xae\x6d\x86\xc7\x12\x29\x0d\x11\x34\xa2\xb4\x6e\x61\xf5\x55\ -\x00\xde\x84\x62\x64\x94\x69\x4e\x1f\xed\x42\xff\x8c\xf2\x9e\x9a\ -\x0c\x1e\x8f\x47\xa1\x13\x59\xad\x56\x50\x4a\x71\xcb\xad\xb7\xe1\ -\xee\x7b\xee\x83\xbb\xd7\x8d\xb9\x73\x8f\xc7\x53\xf3\xe7\x63\xe3\ -\xe6\xcd\x38\xf7\x9c\x73\xb0\x61\xc3\x46\x1c\x37\x77\x2e\xba\x3b\ -\x3b\x70\xfa\xe9\xa7\x03\x20\x70\xe5\xe4\xa0\xa1\xb1\x11\x4b\x97\ -\x2e\x05\x00\x74\xb4\xb5\xc2\xe7\xf5\xe2\xaa\x6b\xff\x88\x3c\x57\ -\xae\x90\xe1\x4f\x88\x4e\xc2\xab\xaf\xbe\x8e\x96\xe6\x16\x28\xb3\ -\x9a\x09\x75\x9d\xc2\xaf\xe4\x01\x34\x34\x7e\x46\x3f\xb6\x43\x5e\ -\x57\x90\x18\xbd\x43\xe1\xc8\x50\x2b\x3b\x44\x27\x36\xcb\x9c\x82\ -\x6d\x14\xd3\x15\x55\xcf\x52\x19\xd4\x22\x66\x1c\x4c\x49\x50\x07\ -\x17\xd1\x84\xb6\x6a\xa4\x87\x9a\x74\xd8\x68\x9e\x37\x5d\x8b\x59\ -\xdf\x81\x11\x9d\xfb\x69\x2c\x59\x49\x2a\xe9\x1e\xcd\xc4\x69\xba\ -\xee\xdc\x00\x29\xee\x9a\xfd\x21\xd6\xcd\xa3\x51\x62\x68\x52\x85\ -\xdc\x8d\xd0\x6d\xde\x94\x99\x22\x78\x57\x7f\x4c\x53\x8b\x4e\x0c\ -\xf1\x6c\x76\xdc\xa9\x35\x7e\x6d\xfd\x3d\xa4\x36\xbd\x47\x25\xa3\ -\x54\xc7\x3b\x8d\x8c\xf7\x41\x73\x4d\x9c\x1a\xb0\xf5\x81\xd9\xaf\ -\xd4\x20\x6b\x75\xf4\xba\x73\xea\xf3\x98\x9a\x23\x1f\xa2\x3c\x8f\ -\x63\x75\xf1\x85\x8e\x15\xa2\xe1\xd7\x96\x01\x67\x0a\x29\x0c\x01\ -\xbf\x2f\xb4\xe2\x0a\x21\x97\x18\x4b\x5b\x11\x45\xb1\x08\xb8\x20\ -\xb1\xa1\x26\x21\xf1\xf5\x61\x1d\xb9\x3d\x6e\x45\x9b\xe3\xc7\x8f\ -\xc7\xb9\x67\x9f\x8d\x40\x30\x00\x42\x18\x94\x0c\x2b\xc1\x1d\x77\ -\xdd\x89\x65\xdf\x7f\x8f\x5b\x6f\xbe\x19\xb7\xdf\x71\x07\x5a\x5a\ -\x5a\x70\xe2\xf1\xc7\x61\xd2\xa4\x49\xb8\xe9\xe6\x9b\x41\x00\x1c\ -\x71\xe4\x11\x98\x35\x6b\x16\x96\x2c\xf9\x16\x65\xe3\xc7\xc9\x9d\ -\xfc\xbc\x6a\x15\xb2\x32\x33\xe5\xcd\x13\xf0\xfb\xd1\xd2\xd2\x8a\ -\x91\x23\x47\x19\x4b\xa0\xf1\x82\x90\xf9\x22\xca\x23\x24\x32\x52\ -\x23\x21\x38\x55\x3c\x3e\x69\xc7\x53\x1a\xd2\x90\x86\x34\xa4\x21\ -\x0d\x69\x48\x43\x42\xc0\x12\x4d\xd2\x1a\xec\x72\x17\x05\xc5\xc7\ -\x1f\x7f\x8a\x2d\x9b\x37\x01\x10\xe2\x67\x18\x96\x45\x65\x65\x85\ -\xa9\xf7\x5f\x7a\xf9\x65\xe4\xe5\xe6\x89\x99\xe3\x00\x9e\xe3\x70\ -\xf1\x25\x17\x83\xe7\xc5\x6b\x60\x84\x20\x33\x23\x43\xf3\x5e\xc1\ -\x90\x21\x98\x37\x6f\x9e\xac\x1b\x11\x29\x9b\x18\x42\x29\xb3\x09\ -\x21\xc8\x74\xd8\xf0\xc8\x23\x0f\xcb\x77\x71\x59\x86\xc5\xca\x95\ -\x2b\x35\xed\xcd\x3a\x74\x36\xe6\x1c\x76\x98\x50\xd7\x48\x8c\xda\ -\x69\x6b\x6d\xc1\xc3\x0f\x3f\xac\xad\x4a\xae\x97\x79\x8d\x0a\x9a\ -\xd7\xa5\x97\x5e\x82\xa1\x85\x85\x42\xad\x1b\xc5\x3b\x8c\x42\x8d\ -\xcb\xcd\xcf\xc3\xa4\x29\x53\x21\xc5\xf3\x04\x82\x41\x3c\xfb\xdc\ -\xf3\x20\x94\xc2\x62\xb3\xe1\xb1\xc7\x1f\x03\x00\x4c\x98\x30\x11\ -\x3c\xe5\xf1\xce\xc2\x85\xb8\xec\xd2\x4b\xe1\x74\x38\xf0\xd1\x87\ -\x8b\x70\xe6\x19\x67\xa2\xba\xa6\x46\x68\x97\x52\x4c\x99\x32\x15\ -\x39\x39\x39\x60\x19\x02\x80\x07\xcf\x71\xa8\xa9\xad\x81\xc5\x62\ -\xd1\xd0\x1b\xa5\x54\x4e\xe9\x2d\x7b\xe0\x44\x45\x64\xd9\xb2\xe5\ -\x58\xb9\x72\x25\x88\xf8\xb9\x5a\xb9\x39\xe0\x80\x03\x50\x56\x5e\ -\x16\xc2\xb9\x8c\x77\x21\x51\x82\x94\x90\x21\x2f\x3f\x5f\xf1\x1e\ -\x6b\xb1\xe0\xaa\xab\xae\x84\xd7\xeb\x13\xf5\x21\x82\xcc\xcc\x0c\ -\x53\x7a\xc8\x9e\x3d\x7b\xf0\xf0\x23\x8f\xe8\xba\x13\xc3\x0d\x19\ -\xdd\x9d\x5d\xb8\xfe\x86\x1b\x41\x08\x91\x3d\x76\xab\x7f\xfe\x19\ -\x3f\xfc\xf8\x83\xe2\xdd\x23\x7f\x75\x0c\x0e\x3e\x78\x86\xfc\x3e\ -\xc3\x32\x58\xfc\xe9\x62\x6c\xd9\xba\x39\x76\x85\x3b\x61\x10\xa5\ -\x3f\x62\x70\xa7\x99\x98\xb4\x74\x25\x59\x1f\x8c\x2d\xf2\x29\x7a\ -\x43\xa6\xfb\x8f\x12\x0b\xd1\x6f\x8a\x73\xa8\x20\xc4\xe0\xe0\xec\ -\x72\xe5\x76\x91\x4e\xa4\x60\xc4\xc1\x72\x05\x75\xb0\xe3\xdd\x28\ -\x26\x2a\x8d\xf7\xe4\xf0\x55\x4d\xf6\xce\xc1\x8e\xf7\x54\x1f\xf0\ -\x3e\x8a\xf7\x81\x1a\x7f\xb4\x9c\x02\x31\x7a\xe2\x68\x9c\x62\x88\ -\x11\x3f\x8b\xc5\xd0\xbe\xef\x67\x9f\xa3\xc0\x9b\x6f\xbc\x89\xf7\ -\xdf\x7b\x17\x8a\xc4\xc6\x26\x89\xe6\xc1\x07\x1f\x10\xae\x64\x89\ -\x7f\x67\x66\x66\xa2\xaa\xaa\x12\x05\xf9\x05\x11\xdf\x2b\x2c\x2a\ -\xc4\x93\x4f\x3e\x1e\x41\x56\x12\x5a\xfc\xef\xfb\xef\xe3\x9c\xf3\ -\xcf\x17\x95\x14\x41\xe1\xd1\xbb\x6a\x35\x77\xee\xf1\xf8\xfb\xdf\ -\xff\xae\xa0\x89\xeb\xfe\x74\x1d\x9e\x79\xf6\xff\x64\xe5\xcf\x58\ -\xca\x23\x72\x3c\xd0\x49\x27\x9d\x28\x28\x45\x46\x74\x2c\x7e\xb8\ -\x72\xf9\x4a\xdc\x77\xef\xbd\x20\xac\x52\x59\xe2\x82\x82\xb2\x42\ -\x18\x22\x26\x57\x10\x3a\x2c\x2f\x9b\x80\x4b\x2e\xb9\x18\x3c\x47\ -\x71\xed\xbc\xeb\xf0\xcd\xb7\x4b\x30\x7e\xfc\x38\xf9\xbd\xea\xaa\ -\x0a\xb8\x5c\x2e\x30\x62\x7b\x01\xbf\x1f\xbd\x3d\x3d\x18\x5e\x52\ -\x12\x55\x8e\x0c\x87\x2f\x3e\xff\x02\x8f\x3c\xf2\x48\xd8\x5a\x8a\ -\x83\xa6\x14\x84\x61\xb0\x68\xd1\x22\x9c\xfa\xdb\xdf\x46\xc4\x3b\ -\x09\x4b\x61\x1e\x0e\xff\xf8\xc7\xfd\x1a\x25\xcd\x0c\xd4\xd4\xd4\ -\xe0\x8e\xdb\x6f\x57\xae\x83\x3c\xb4\x50\x4a\x81\x4b\x2e\xbd\x0c\ -\x2f\xbf\xf4\x6f\xc5\xbb\x0f\x3c\xf0\xa0\xa0\x14\x85\x29\x53\xa7\ -\x9e\x7a\x0a\x6e\xbe\xe9\xcf\x8a\xe7\xea\xf7\x36\xa8\x94\xa2\xfe\ -\x3e\x79\xd2\x6e\xa9\x34\xa4\x21\x0d\x69\x48\x43\x1a\xd2\xb0\xef\ -\x82\x25\x61\xa2\x4f\x1c\xe5\x45\x28\x90\xfc\x7a\xcd\x44\xc8\xce\ -\xcc\x47\xcb\xe6\x11\x61\x90\xe1\x82\x2e\xe5\x45\x21\x5c\xe5\x09\ -\xd0\x74\x6b\xf2\x7e\x1b\xa5\xa2\x82\x24\xd7\x17\xd1\x1f\x1f\xa3\ -\x6e\x93\x52\xf0\x3c\x8d\x1e\xab\x22\xd6\x96\xe1\x82\xc1\x88\x5a\ -\xb7\xcf\xe7\x53\x60\x87\x8a\x9e\x9a\x9b\x6f\xfc\x33\xce\x3a\xe7\ -\x1c\x10\x00\xd5\x95\x95\x38\xe7\xbc\xf3\x70\xec\x31\xc7\xe0\xfe\ -\x07\xfe\x01\x9b\xcd\x86\xde\x9e\x1e\x9c\x79\xd6\x59\x90\xd2\x5f\ -\xff\xf8\xc3\x0f\x58\xb8\x70\x21\x86\x0d\x1b\x06\x8b\xc5\x22\xd4\ -\x0e\x62\x18\xb4\xb6\xb6\x23\xe0\x0f\x82\x02\xe0\x29\x0f\x0b\xc3\ -\xe2\x94\xdf\x9c\x82\xfb\xfe\x76\x1f\xd4\x17\x13\x09\x81\x2a\xa6\ -\x88\x84\xc5\x0e\x01\x3c\xa8\x4a\x73\x12\x71\xc7\xf3\xf2\x55\xc7\ -\x58\xe9\xc9\x6a\xb5\xc6\x67\x10\x51\x29\xb9\x7a\x0b\x4c\x43\xfa\ -\x4e\x58\xfd\x2b\x12\x46\x4f\xc6\xf4\x13\xba\x7a\xce\xa7\xb6\x9a\ -\x12\xab\x45\xa6\xaf\x1b\x3f\x51\xef\x47\x6b\x2f\xde\x7e\x62\xbe\ -\xda\x4d\x92\xb3\x1e\x7d\xad\x8b\x34\xf0\x36\x2d\xd5\x7c\x52\x7d\ -\xc0\x46\xd9\xb7\xc2\x99\x40\x2a\x23\xda\x88\x9f\x91\xc1\x85\x77\ -\x3a\x38\xf1\x1e\x8a\x79\x49\xf1\x71\x47\xc5\x3b\x49\x6d\xb2\x51\ -\x7b\x2e\x06\x0b\xbd\x44\xe5\x33\x24\xb9\xf8\x32\x1b\x4c\xab\xca\ -\xae\x48\xe5\xac\xc1\x91\xf9\x23\x4d\x7c\xb9\xc8\xbe\x2b\x45\xfb\ -\x1c\x24\x5a\x72\x4c\xc6\x66\xa1\xe6\xd7\x97\x26\x94\x46\x42\x7f\ -\x59\x75\x3c\x24\x14\x14\xb5\x7b\xea\xb0\x6a\xd5\x4f\x60\x18\x82\ -\xa6\xff\x67\xef\xba\xe3\xa3\xa8\xb6\xff\xf7\xce\x6c\x76\xb3\xe9\ -\xa1\x24\x21\x04\x10\x08\x04\x02\x22\x28\x35\x80\xf4\x26\x02\x4f\ -\xb0\x82\x0a\xfa\xd4\x9f\x5d\xb0\x62\x03\x05\xf4\x3d\x04\x51\x50\ -\x29\x8a\x3e\x05\x0b\x08\xa2\xcf\xf6\x0c\x4a\x47\xa5\x17\x69\x2a\ -\x2d\x21\x09\x21\x84\xf4\xbe\xd9\x9d\xfb\xfb\x63\xca\xce\xec\xce\ -\xee\xce\x6e\x36\xd9\x0d\xcc\xd7\x4f\x3e\xb2\xb3\xb3\x33\xf7\x9e\ -\x7b\xee\xbd\xe7\xdc\xd3\x2e\x5c\x00\x40\x51\x58\x54\x88\xbd\x7b\ -\xf7\x82\x10\x06\x16\x8b\x05\x96\x9a\x1a\x69\xb2\xe4\xe7\xe7\x23\ -\x3e\x3e\x1e\xc3\x87\x0f\xc3\x9e\xdd\xbb\x25\x4b\xd2\xf8\xf1\xe3\ -\x90\xd8\x22\x11\xd7\x5c\xd3\x0d\xd7\xf5\xbc\x0e\x0c\x61\xb0\x66\ -\xcd\x1a\x7c\xfd\xcd\x37\x98\x31\x7d\xba\x07\xfa\x52\xaf\x98\x3c\ -\x58\x97\x33\xa2\x51\x99\x62\xd4\x92\x80\xe8\x86\x1a\x1d\x3a\x74\ -\xe8\xd0\xa1\x43\x87\x8e\x7a\xd3\x17\x0c\x2e\x35\x50\x6f\x83\xdd\ -\x7d\x90\x44\x49\x3d\x0a\xb0\x8a\xd6\x0b\x05\x44\xa9\x73\xce\x69\ -\xcf\x4f\x50\x2d\x78\x2e\xb7\xec\x40\x16\xbf\xe2\xf0\x6b\x79\x4c\ -\x8f\xd8\x63\x6f\x4e\xe0\x04\xd7\x37\x42\x88\x54\x3f\x89\x38\x3e\ -\x5f\x23\x18\xd6\x20\x90\x82\xd1\x2c\x9c\x83\x02\x6b\xbe\x58\x83\ -\xb5\x6b\xd7\x4a\x6e\x7d\x1c\x47\x71\xe0\xc0\x41\x1c\x3c\xf4\xb8\ -\x64\xcd\xe0\x38\x0e\x2d\x24\x37\x38\x5e\x75\x33\xb0\x7c\x7d\x21\ -\x1b\xa5\xb0\x5a\x6b\x31\x7f\xfe\x1b\xe0\x38\x0e\xe1\x61\x66\xdc\ -\x7e\xfb\x6d\x08\x0b\x8f\xc0\xea\x55\xab\x90\x96\xd6\x1f\xd3\xa7\ -\x4f\xd7\xac\x6b\x12\xa1\x1e\x12\x55\xcd\x93\xc0\x48\x31\x43\xae\ -\xfb\xc5\xf3\x00\xf5\x90\xff\xdf\xd1\xa2\xe3\x1f\x7d\x9a\xa8\xf3\ -\x89\xac\xf3\x84\x10\x30\x62\xbb\x05\x2d\x98\xb7\xae\xc9\x78\x57\ -\xc8\x8a\xe7\xd8\xd7\x46\x05\xd2\xc0\xbf\x77\xb4\xf8\x68\xf6\x7d\ -\xaf\xab\x93\x3c\xd1\x76\x10\xe2\x73\x61\x12\x17\xf7\x3b\x36\xdb\ -\x31\xdb\x95\xa7\x34\x79\x0d\xce\x00\x9e\x4c\x6b\xc1\xda\x6e\x8d\ -\x74\x17\xff\xc1\x91\x00\xb7\x5f\x2b\x5f\xbb\x8a\x09\x08\x96\x76\ -\x7b\xa0\xbb\xe3\x6d\x5c\x90\xb6\x1b\x2e\xd6\x01\x71\x4f\xe0\x1a\ -\x29\xdd\x5d\xf1\xbf\x4e\xf7\xfa\xa1\xbb\xf8\x7f\xce\xd7\xec\x73\ -\x44\xdb\xd7\x9c\x07\x0b\xa0\xab\xac\x89\xc4\xbb\x7a\xa8\x81\x94\ -\x4b\x02\x6a\x29\x6a\x10\x72\x10\x82\x9b\x6f\x9e\x84\x4e\x9d\x3a\ -\x09\xca\x01\xcb\xc7\x94\xc8\x94\x0e\x69\x52\x10\x99\x89\x8f\xf0\ -\x49\x15\xde\x5c\xb8\x10\xc5\x25\xc5\xd2\xe3\x2c\x35\x35\x98\x3b\ -\xf7\x35\x84\x18\x0c\x82\xc0\x4d\x61\x36\x87\x61\xde\xbc\xb9\x8a\ -\xd7\x5e\xcc\xbb\x88\x05\x0b\x17\x08\xa9\xb5\x79\xe9\xf6\xaa\x36\ -\x57\xe1\x31\xc7\x62\xab\x2a\x4d\xee\xd9\xab\x17\x26\x8c\x9f\xa0\ -\xb8\x76\xfd\xc0\x81\x3e\x93\x60\xea\xb4\x7b\x91\xdc\xbe\x3d\x18\ -\x42\x10\x1f\x1f\xef\xc6\x53\x88\x2a\x84\x76\x42\x08\x6e\xb9\xe5\ -\x16\x0c\x1a\x34\x08\x00\x45\x5e\xee\x05\xbc\x3a\x77\x2e\xba\x77\ -\xef\x8e\xfb\xef\xbf\x0f\x00\x60\xb5\x5a\x31\x6b\xd6\x6c\xe9\x77\ -\x46\x63\x08\xcc\xa1\x66\x49\x49\x21\x20\x08\x0d\x35\x63\xd3\xe6\ -\x4d\xc8\xcc\xc8\xc0\x83\x0f\x3e\x88\x0f\xde\x5f\x09\x53\x68\x28\ -\xba\x5d\x7d\x35\xe6\xbc\xfa\xaa\x57\x75\x89\x86\x0d\x1b\x86\xd0\ -\xd0\x50\x30\x2c\x03\x86\xb0\x4e\x9c\x94\x9a\x9a\xea\xf4\x9b\x25\ -\xef\xbc\x8b\xcc\xcc\x0c\xa9\x4f\x5a\x98\x8f\x82\xc2\x1c\x6a\xc6\ -\x6b\xaf\xcd\xab\x57\xf6\x1c\x3a\x64\x28\x00\xc0\x60\x60\x05\x05\ -\x18\x28\x2a\x2c\xc4\xb3\xcf\x3e\xab\x58\xa4\x93\x93\xdb\x63\xde\ -\xbc\xb9\x10\xb3\x8d\x33\x0c\x41\xe7\xce\x9d\x1b\x91\x16\xa3\x43\ -\x87\x0e\x1d\x3a\x74\xe8\xd0\x11\xbc\x30\xb8\xd4\xf4\x7c\xd5\x70\ -\x82\x44\x76\x92\x37\x63\xd2\xa4\x89\x98\x34\x69\xa2\xc3\xc1\x80\ -\x63\x25\x66\x65\xbf\x6b\x2d\xb5\x00\x80\x95\x2b\x57\x2a\x94\xa2\ -\xda\xda\x5a\x2c\x59\xfc\xb6\x2c\x3d\x0f\x45\x74\x74\x0c\xe6\xcc\ -\x79\x55\x10\x56\xf9\xd3\xfb\x82\x4b\xf9\x78\xeb\xad\xb7\xa4\x9a\ -\x39\x14\x40\x5a\x5a\x3f\x27\xa5\x48\x8d\x5e\x3d\xba\x77\xc7\x8b\ -\x2f\xbe\xa0\x14\xe2\x7d\xa5\x03\xc3\x60\xf2\xe4\xdb\x31\x7c\xf8\ -\x70\xb7\xcf\x33\x85\x86\x82\xb3\x71\x60\x0d\x8c\xf4\x3b\x00\x68\ -\xdb\xb6\x0d\xfa\xf6\xed\x0d\xc2\x30\x38\x97\x91\x01\xc2\x10\x34\ -\x6d\xda\x04\xfd\xfa\xf5\x05\xc0\xd7\x37\x32\x99\x8c\x08\x09\x09\ -\x01\x21\x04\x43\x86\x0c\xc2\x3b\x8b\xdf\xc4\xe2\x25\xef\x22\xc4\ -\x60\x80\xc1\x10\x02\x96\x65\x11\x13\x13\x8d\x8e\x23\x46\x60\xe6\ -\x73\xcf\xe1\xa5\x59\xb3\x31\x6d\xea\xdd\x98\xf5\xca\x2b\x88\x89\ -\x8e\x11\xac\x78\x4a\xd8\x6c\x36\x49\x89\x95\xc7\x14\x0d\x1e\x3c\ -\x08\x83\x07\x0f\x82\x21\xc4\xe0\x70\xe2\xe0\x1a\xab\x3f\x59\x85\ -\x03\x07\xf7\x2b\xc6\xdd\x9d\x12\x2d\x32\x74\x74\x74\x0c\x66\xcd\ -\x7a\x19\x26\x93\xc9\x4f\xa7\x00\xce\xef\x1e\x30\x30\x0d\x03\x06\ -\xa6\x29\x12\x65\x4c\x9f\x3e\x03\x4b\x96\x2c\x56\xdc\xf7\xe1\x87\ -\x1f\x61\xda\x3d\xd3\xec\x86\x0e\x72\x85\x2b\x29\xde\x86\x3c\x90\ -\x06\x6e\x17\x75\x71\x74\xea\xb1\xd2\xbd\xbf\xf2\xea\xc1\xc5\xfb\ -\x82\xc5\xd7\xdf\x53\x3d\x3b\x47\x7a\x70\x8d\xa3\xdd\x4e\x7c\xe0\ -\xa7\xfd\xb5\xa1\xfa\x11\xb4\x74\xd7\xf9\xbd\x51\xd1\x3d\x68\xf6\ -\xa7\x2b\x84\xee\x9e\x62\x7e\xfc\xb5\xae\x11\xc7\x02\x41\x2e\x7e\ -\x4f\x5c\xec\x7b\xd2\x99\x34\xa7\x59\x7e\x6b\x68\x34\x62\xff\x9b\ -\xfa\x85\xd1\x68\xd4\xcc\x2b\x5a\xeb\x46\x51\x2f\x62\x87\xfc\x79\ -\x23\xd1\xd8\x6e\xab\xcd\xea\xf4\xc3\x37\xde\x58\x88\x5e\xbd\xfb\ -\xa0\xe7\x75\xbd\x70\xd3\xa4\x5b\x00\x00\x9b\xb7\x6c\x41\xcf\x5e\ -\x7d\xd0\xab\x57\x1f\x0c\xbc\x7e\x30\x0a\x8b\x8a\x71\xdb\x6d\xb7\ -\x82\x10\x82\xed\x3b\x7e\xc5\xb8\x7f\xdc\x8c\x8d\x3f\x6f\xc2\xc4\ -\x89\x13\x31\x68\xd0\x20\xd4\xda\x6c\xe8\xd9\xb3\x17\x3a\x75\x4e\ -\x85\xd5\x66\xc5\xb0\xa1\x43\xf1\xc1\x87\x1f\xa2\x73\xe7\x54\xfc\ -\xdf\x43\x0f\xba\x57\x54\xfc\x20\x43\x50\x5f\xd2\x53\xba\xc8\x28\ -\x5d\x97\xe6\xd0\x3a\xde\xa3\xdb\x6a\x74\xe8\xd0\xa1\x43\x87\x0e\ -\x1d\x3a\xea\x07\xfe\x77\x9f\x0b\x32\x8b\x91\x6b\x85\xd7\x31\xe5\ -\x00\x51\x55\x8c\x5c\x9e\xc8\xcb\x04\x6d\x42\xe4\xd9\xd1\xa8\xe2\ -\x1e\x2a\x3b\x31\x66\x54\xd2\x40\x13\x77\xda\xb8\xc7\x4e\x30\x9a\ -\xfb\x4a\x3c\x68\x66\x21\x86\x10\x70\x32\x7f\xd4\x9e\xbd\x7b\xe1\ -\xb9\xe7\x66\x2a\x7d\x6d\xa9\x7d\x80\xf9\xba\x4d\x14\x0c\x61\x90\ -\x92\x92\x82\xbb\xef\xbe\x0b\x00\x70\x75\xd7\xae\x78\xe6\x99\x67\ -\x70\x75\x97\x2e\x98\x38\x69\x22\x18\x86\xc1\xba\x2f\xd7\x62\xef\ -\xde\xbd\x00\x80\xe1\xc3\x47\xe0\xee\xbb\xa7\xe2\x93\x55\xab\x50\ -\x55\x55\x8d\x9e\xd7\x5d\xa7\xa0\x31\x15\x9f\xed\x82\x40\x9c\xe8\ -\x3f\xa6\x91\xcf\x34\x7a\xcb\xb9\xd0\x5c\x89\xff\xf8\xd8\x81\x3f\ -\x5c\xf1\x1f\x05\x55\xf5\x0b\x0e\xbc\x65\x88\x06\xf6\x69\xae\x62\ -\x82\x82\x65\x7d\x72\x8a\xd9\x71\x61\x2a\x10\x3d\x3e\x85\x14\xf9\ -\xb0\x59\x01\xe2\x27\xcd\x57\x8d\x36\x56\x6a\x0f\xde\x14\xe7\x30\ -\xa1\xf5\x35\xac\xae\xdb\x45\x35\x7c\x4f\x54\xda\xce\x78\x58\x30\ -\x83\xc1\xf0\xe2\x89\xee\x52\xbd\x34\x1a\x3c\x6d\xd6\xdc\x76\x28\ -\xdb\xae\x36\x8f\x68\x10\xb5\x9d\x93\x37\xcc\x4d\x7c\x34\x0d\x02\ -\x9a\xab\xd1\x5d\x91\x64\x87\x06\x1f\xbf\xbb\x6b\xbb\xb8\xc6\x88\ -\x4c\x41\x10\xfc\x74\xa7\x00\x6c\x8d\x94\xee\x62\xdb\x45\xba\x13\ -\xf0\x16\x1c\x77\xeb\xbb\x37\xf3\xd5\xb1\xd6\x17\x95\xfd\x9b\x73\ -\xb8\xc9\xc9\x43\xc2\xd1\x62\xa8\x6d\xed\xf3\x7b\xa4\x91\xc7\x7a\ -\x89\x0d\xa1\x14\x5d\x8e\x20\xc4\xb5\x99\xc7\x9d\xb0\x2a\x29\x12\ -\xd0\x1c\x6f\xad\x95\x25\xfc\xc3\x34\x0e\x85\x7a\x39\x7b\x74\x61\ -\x87\xe4\x64\xcc\x9d\x3b\x47\x2a\x36\xab\xe4\x33\xea\x52\x58\x6f\ -\x73\x55\x1b\xcc\x79\xf5\x15\xc9\xfd\x0d\x00\xc6\xde\x70\x03\x6e\ -\xb8\xe1\x06\xbb\x72\x46\x80\x97\x5e\x7c\xd1\xb5\xb0\xef\xe7\x6c\ -\xb0\x3e\x25\x24\x20\x62\x8c\x94\xc9\x4f\x2c\xa4\xbd\x13\x1c\xa8\ -\xcf\x7a\xb2\x8e\xc6\x83\x18\x26\x0c\xcd\x0c\x11\x30\x13\x23\x9f\ -\x82\x9e\x10\x80\x12\x87\xb2\xb6\xd4\xe5\x9e\x42\xdc\x4c\x15\xc2\ -\x10\x30\x20\xe0\x58\xde\xfa\x4b\xc5\x44\x2d\x8a\x54\xef\x54\x5e\ -\xe6\xcb\xa3\x3e\x43\xea\xb0\xfe\x10\x0f\x6d\x27\x32\x46\x27\x04\ -\x00\x67\x03\x42\x00\x70\x04\x94\x21\xb2\xba\x62\x54\xd9\x76\x17\ -\x6d\x91\xeb\x59\xee\xea\x4a\xba\x93\x11\xe4\xf7\x6b\x6d\xbf\x44\ -\xf7\x10\x81\xee\x70\xa0\x3b\xd5\x56\x1c\xdd\x55\x5b\xdd\xfd\xce\ -\xd5\xf7\xee\x68\xe0\x9a\xee\xa2\xf2\x6e\x70\xa6\x3b\xb4\xd7\x24\ -\x76\xa4\x21\x5c\xb4\x45\xab\xde\x0c\x4f\xfc\xce\x59\x01\xce\xce\ -\xef\xca\x85\xd3\x79\x2e\x69\x6d\x83\xbb\x3c\x0e\xd4\xc7\x73\x00\ -\x89\x2f\x1c\xe8\x4e\x19\x46\xe2\x77\xea\x66\x1d\x08\x74\xdb\xdd\ -\xad\x33\x8d\x8a\xee\x68\x9c\x74\xe7\x0f\xd5\x6c\x82\xde\xe2\x66\ -\x7d\x87\x17\x69\x16\xc4\xe4\x5e\x0e\x82\x87\xc5\x56\x8b\x02\x4b\ -\x19\xf2\x68\xf1\x65\xbf\x2f\x6b\x57\x8a\x2e\xb3\x94\xc0\x6f\x2c\ -\x58\x88\x23\x47\xfe\x10\x18\x80\x02\x84\xc1\xab\xaf\xcc\x46\xdb\ -\xb6\x6d\x15\xf7\xcd\x7b\x6d\x1e\xca\xcb\xcb\xec\x9b\x32\x91\x33\ -\x12\xcf\x3c\xb5\x96\x6a\xdc\x7d\xf7\x54\xc5\xef\x42\x43\x43\xb1\ -\x74\xe9\x52\xa1\x50\x28\x7f\x67\x59\x49\x31\xa6\x4e\x9d\x26\xf1\ -\x1a\x61\x18\x64\x9d\xcb\x72\x22\xee\xd6\xad\xdb\x31\x6d\xda\x3d\ -\x7c\xc6\x31\x6a\x4f\x69\x7d\xcb\x2d\xb7\x28\x98\x78\xf2\xe4\x3b\ -\xd0\xad\xdb\xd5\x60\x18\x46\x2a\x8a\xba\x62\xd9\x0a\xec\xdb\xbf\ -\x57\xa6\xc0\x70\x58\xb0\x60\x21\x3e\xfd\xf4\x53\x50\x0a\xcc\x9d\ -\x3b\x07\xad\x5b\xb7\x76\x66\x04\xa3\x11\x1c\xe5\x14\x93\x81\x55\ -\x91\xc4\xf9\xe2\xa7\xc4\xa5\xb0\x2f\x7e\xf2\x58\x04\xd5\x8d\x4f\ -\x1f\x23\xcb\x90\x27\xa6\xbe\x10\x2d\x44\x54\x96\xf5\x6f\xe5\x07\ -\x2b\xb1\x63\xc7\x0e\xc5\xf3\x9e\x9c\x31\x03\x3d\x7a\xf4\x50\xb0\ -\xed\xcc\xe7\x67\xa2\xa0\xe0\x92\x6c\x25\x53\x3b\x06\xb2\x2f\x61\ -\xe2\x86\x1f\x66\x36\x6b\xe2\xa5\xab\xae\xba\x0a\x33\x85\xe2\xad\ -\x44\xc5\xba\xc4\xe7\xf0\xe0\x13\x23\x38\xd2\xeb\xfb\xef\x7f\xc4\ -\xba\x75\x5f\x4a\x8b\x11\xc3\x30\xd8\xb3\x6b\xb7\x17\x04\x6b\xa4\ -\xf0\xd6\x62\x43\x7c\xfc\x9d\x27\x32\x36\x10\x59\xc5\xf9\xd0\x3a\ -\xb4\x39\xfe\x2f\x61\x28\x46\x36\xed\x82\x76\x61\xcd\x10\x65\xe4\ -\x79\x8c\x73\xa1\x95\x30\x62\x86\x47\x95\x3a\x55\x5a\x3a\xe8\x4a\ -\x58\xf5\xfe\xb9\xf5\x0b\xd1\x8a\x2e\xd2\xc1\xd3\x89\x61\xb0\xb5\ -\x5f\x2b\xdd\x83\x6f\x43\x6d\xac\xed\x86\xc3\x0e\xe1\xbe\x95\x8d\ -\x9d\xdf\x75\xba\xeb\x74\x6f\x58\xba\x2b\x29\xc3\x10\x06\x95\xd6\ -\x1a\x64\xd4\x14\x62\x4b\xfe\x09\xac\xc8\xde\x8e\x23\x15\xe7\x64\ -\x2f\x14\x3d\x78\xa4\x34\x75\x2e\x9e\xe6\x9e\x9e\x34\x08\x3c\xcd\ -\xae\x58\x4b\xd1\xc6\xf4\x74\x6c\xde\xbc\xc9\x2e\x63\x31\x0c\x1e\ -\x7d\xe4\x11\x27\xa5\x68\xf2\x94\x3b\x9c\x5d\x05\x1c\x06\x2c\x3f\ -\xef\x22\x1e\x7d\x62\x3a\x2f\xb8\x0b\xa3\xda\xa1\x63\x47\x2c\x5f\ -\xb1\x5c\x62\x4e\x00\xd8\xbe\x75\x2b\x9e\x7e\xee\x39\x50\xea\xbe\ -\xe8\xea\xdf\x7f\xff\x85\xbf\xff\xfe\x4b\xc6\x51\x04\xad\xdb\xb4\ -\x56\x28\x45\x00\xd0\xbf\x7f\x1a\xfa\x0f\x48\x53\xcc\x8c\xf4\x9f\ -\xd2\x15\x4a\x11\x00\x6c\xfc\x39\x1d\x8c\x50\x0c\xf5\xe9\xa7\x9f\ -\x04\x45\x6b\x17\x0c\x19\x04\x0b\x80\x8a\xab\x83\xab\xf9\xb1\x63\ -\xc7\x0e\x7c\xf6\xd9\xa7\x32\x5d\x87\xe0\xe6\x49\x93\x14\x4a\x11\ -\x00\x4c\x9c\x74\x93\xd3\xca\x41\x04\x25\x84\xba\xf1\x03\x21\x1a\ -\x55\x93\xb8\xb8\x78\x3c\xf0\xc0\x03\x6a\x47\x2e\x0a\xf7\x43\xb5\ -\xdf\x1e\x3a\x74\x10\xab\x56\xaf\x82\xa7\x23\x9d\xc0\x5b\x8a\x74\ -\x53\x55\x5d\xf1\x7c\xd2\x3f\xf0\x6c\xdb\xd1\x08\x0f\x31\xe9\x14\ -\xd5\xa1\x43\x87\x0e\x1d\x8d\x06\x61\x06\x13\x52\x0d\x2d\xd0\x39\ -\x3c\x01\xf7\xb5\x1a\x88\x8f\xce\xed\xc4\xd3\x7f\xad\x43\x25\xa9\ -\xbe\x7c\x3a\xa9\x5e\xa7\xc8\x85\x0c\x54\x4f\x69\xc5\x03\xa5\x18\ -\x12\xaa\x54\x02\x64\x19\xb9\x1d\xba\x4d\xdc\xfa\xfc\x8b\xc2\x38\ -\x28\xaf\x4d\x73\xd4\x26\x7d\x21\x77\x3d\x53\x18\x63\xdd\xb9\xe3\ -\xb9\x52\x9f\x9d\x92\x7b\x10\x75\xb9\x95\xaa\xfb\x7e\x73\x62\x36\ -\x37\x07\x33\xab\xc4\xf0\x61\x61\xa8\xad\xb5\x4a\x4a\x42\xa0\xb3\ -\x82\x30\x62\xcc\x05\xc4\x38\x23\xb5\x7e\xcb\xb2\xd6\xb9\x50\x34\ -\x89\xd2\xb4\xa7\x88\xf1\x72\xee\xa7\xc6\xca\xb0\x8e\xd6\x31\xb9\ -\xfb\xba\xe3\x33\x3c\x68\x33\x54\x66\x0d\x74\xfb\x5a\xdd\x7f\xae\ -\x7e\x16\x8a\xba\xba\x6a\xba\x8c\x25\xe2\x61\x60\xf8\x25\x76\x45\ -\x87\x7b\x71\x4f\xab\x01\x2e\xc7\x91\xf1\x30\xbe\x0c\xf1\x2d\x27\ -\x8e\xc8\xef\x8c\xcb\xf7\x06\x57\xae\x1d\xc6\x31\xf6\xce\x03\xff\ -\x07\x5b\xfb\xb5\xd2\x3d\x58\x55\x62\xcf\x74\x0f\xee\x75\xe8\xf2\ -\xe5\x77\x9d\xee\x3a\xdd\x03\x41\x77\xa2\x2a\x53\x99\xd8\x10\x3c\ -\xd4\x76\x08\x92\xc3\xe3\x31\xe9\xc0\x32\x94\xd1\x72\xbb\x60\xed\ -\x28\xbb\x02\xa0\xa2\xbc\xc5\x28\xdb\x4d\xfd\xe5\x01\xe2\x4f\xde\ -\xb8\x52\x65\x2b\x35\x33\x1e\xf1\x0b\xcb\xb8\x96\x85\xeb\x22\xd8\ -\xd6\x8b\x4c\x4c\x83\x71\x92\x07\x4e\x3e\xd6\xf6\x4e\xe2\xdf\x71\ -\x0d\xea\xde\x06\x39\xb3\x34\x12\xcc\x6b\x7d\x0b\xee\x69\x35\x40\ -\x27\x84\x0e\x1d\x3a\x74\xe8\xb8\x6c\x30\xbc\x79\x67\x7c\xd2\xed\ -\x9f\x97\x55\x9f\x0c\xae\x44\x2f\x9f\x45\xa0\x20\x53\xac\x5d\xb9\ -\x84\x71\x36\x4e\x51\x1f\x87\x21\xc4\x1e\xbc\x26\x57\x9a\x5c\xba\ -\x33\x11\x65\x97\x55\xd2\xb4\x53\xc7\xf7\x13\xa2\x48\x66\xe0\x59\ -\xe3\xe1\x5d\xba\x08\x21\x60\x65\x96\x13\xc0\xd9\x27\x56\xec\xab\ -\x27\x1f\x52\x8e\xe3\x04\x63\x07\xa3\xb8\x37\x3c\x3c\x0c\x97\x2e\ -\x15\x20\x27\xa7\x4a\x7d\x48\xe5\x96\x10\x31\x28\x57\x68\x1f\xef\ -\x0e\xe8\x4e\x90\x76\x76\x4d\xa3\x4e\x85\x99\xed\x27\x1e\x11\xe1\ -\x61\xaa\x4f\x10\xdb\xaf\x24\xb2\x7b\x97\x37\xa7\xc0\x66\xa7\xfa\ -\x54\xf6\x37\xd5\xd6\x58\x10\x22\xa6\x62\x77\xa1\xf0\x50\xa1\xff\ -\x90\xc5\x98\x31\xb2\x84\x1a\xd4\xcb\x99\x63\xe3\x6c\xda\xd5\x78\ -\x4a\xe5\xe5\xb1\xea\xac\x90\x05\x14\x97\xad\xe1\x4b\x59\x17\xa5\ -\x47\x68\x7b\x4c\x4f\x1e\xa9\x5b\xfa\x74\xe8\xd0\xa1\x43\xc7\xe5\ -\xb5\xdb\x11\x82\x9b\x12\xbb\xe3\xce\x9c\x81\xf8\xb4\x78\x87\xb3\ -\xc4\x46\xd4\x3d\x28\x1a\x5e\xd0\xd0\xfe\xfe\x2b\x22\xa6\xe8\x5f\ -\xff\x7e\x03\xdb\xb7\x6f\x55\x10\x69\xdc\x84\xf1\x78\xf4\x89\xc7\ -\x40\xc0\x07\xf6\xb3\x2c\x8b\x0e\x1d\x3a\x3a\xfd\x76\xea\xb4\x7b\ -\x70\xf1\x62\x9e\xf4\xd9\x64\x0a\xc5\xea\x55\x9f\x20\x2a\x2a\xca\ -\xed\x3b\xb3\xb3\x73\x30\x7e\xfc\x04\x49\x88\x67\x18\x06\xc5\x45\ -\x45\x4e\xf7\xf5\xee\xd3\x17\xcf\xcf\x9c\x09\x0a\x2a\xf0\x0f\x51\ -\x0a\xd6\xc2\x98\xa6\x76\xee\xec\xf4\xdb\x65\xcb\x56\xe0\xbb\xef\ -\xbe\x05\x21\x00\x2b\x64\x09\x3a\xb0\x6f\x9f\xdb\x76\x55\xd7\xf0\ -\xfe\x9f\xa1\xe6\x30\xd4\x54\xd7\xc2\x64\x0a\x95\xbe\x6b\x99\x98\ -\xe8\x52\x49\x23\xae\x94\xcc\xba\x16\x97\xad\x83\x02\x4e\x34\x5e\ -\x7c\xfc\xf1\x27\x70\xf2\xd4\x49\xe9\x4b\x96\x65\xb0\x62\xc5\x72\ -\x24\xb5\x4c\x92\xee\xa9\xad\xb1\xe0\x8e\x29\x77\xa2\xa2\xa2\x5c\ -\xa6\x28\x86\xe3\xab\xf5\xeb\x15\xcf\x6a\x99\xd4\x12\xeb\xd7\xad\ -\x07\x1f\x48\xc8\xdb\x8d\x2e\x5e\xc8\xc5\x8d\xe3\xc6\xc1\x6a\xb5\ -\xba\x97\xf6\x85\xb8\x22\x91\x64\x0c\xc3\xe2\xf4\xa9\x93\x9a\xfa\ -\xba\x70\xe1\x9b\x58\xb3\x76\xad\x2c\x1e\x8d\x60\xf6\xac\x59\x52\ -\x11\x5d\x5d\x8b\x09\x4e\xcc\xb8\x6a\x14\x8c\x8c\x9e\xe4\x53\x87\ -\x0e\x1d\x3a\x74\x5c\x9e\x78\xa6\xc3\x28\xac\xdd\xf5\x3b\x6a\x59\ -\x4b\x23\xd7\xf2\x54\x94\xa2\x86\xb6\x10\x91\x06\xe8\xe4\xe1\x43\ -\x07\x91\x9e\x9e\xae\xd0\x58\x1f\x7f\xfc\x31\x8c\x19\x3d\xda\xe5\ -\x09\x2e\x01\x81\xc5\x62\xc1\xf6\xad\xdb\x70\x2e\x2b\x53\x52\x54\ -\xc2\xc2\x22\x60\xb1\x58\x94\xfa\xb0\xca\x33\x2a\x2a\x2a\xf0\xe3\ -\x0f\xdf\x7b\xec\x60\x42\x42\x3c\x26\x4c\x18\x2f\xb3\x5c\xa8\x57\ -\x00\x96\xea\xd8\xc8\x62\x17\x8e\x1f\x3b\x8a\xf4\xf4\x9f\x94\x23\ -\x47\x5d\x0b\xe4\x00\x50\x54\x58\x04\x4a\x29\x22\x22\xc2\x51\x58\ -\x58\x08\xd0\x08\x5e\x49\x92\x29\x47\x0d\x3d\x7e\xee\xca\x19\x70\ -\x36\x9b\xa2\x0e\x94\xbc\x4e\x11\xd1\x58\x07\xe1\xb7\xdf\x7e\xc3\ -\x81\x83\x07\x14\xe3\x5f\x59\x51\xa9\xb8\xd5\xc6\xd9\xb0\xf9\x97\ -\x4d\x28\x2e\x29\x92\xe8\x15\x13\x13\x03\x8b\xc5\x62\x2f\xe4\x0b\ -\x20\x32\x32\x02\xff\xf8\xc7\x78\x45\x2c\xd3\xce\xed\x3b\xf0\xe3\ -\xc3\x0f\x7b\x77\x22\xe2\xe5\x01\xc6\x91\x23\x7f\x08\xd9\x12\x85\ -\x9f\x33\x2c\x1e\x7a\xe8\xc1\x06\x5c\x2d\x68\xfd\x3e\x96\x34\xf0\ -\xf3\xea\xfb\xe0\x8a\xa5\x88\xa6\x51\x18\xd1\xac\x93\x9e\x4e\x5d\ -\x87\x0e\x1d\x3a\x74\x5c\xb6\xe8\x1a\x95\x88\x8e\x61\x2d\x70\xac\ -\x3a\xd3\x51\x70\x75\x90\x8b\x1c\x36\x68\xce\xb1\x9e\x51\x80\x41\ -\xaf\x90\x98\x22\xe2\x42\xe9\xf1\x97\x38\x58\xb7\x7a\x8b\xb4\x4e\ -\x03\xe8\x2d\x3e\xfa\xcf\x47\x00\x00\x86\x69\x1c\x92\x5a\x61\x61\ -\x21\x62\x62\x62\xb4\x13\x5d\xcd\xca\x45\xb5\x2a\x62\xb4\x61\x05\ -\xe7\xe0\x53\x51\x02\x79\x7c\x71\x79\x81\x02\x1d\x8c\x71\x68\x66\ -\x8e\xd4\x69\xa1\x43\x87\x0e\x1d\x3a\x2e\x5f\x19\x9b\x00\xbd\x22\ -\x5b\x5d\x16\xca\x02\xa3\x2a\xfb\x5c\x4e\xf2\x0f\xb5\x67\x87\xe3\ -\xff\xcd\x17\xe8\x62\xbc\xd1\x4c\xc5\xec\x6f\xa2\x75\x42\x8c\x65\ -\xa1\x54\xaa\xdb\xc3\x51\x9b\x3d\xf3\x9c\xa3\xf4\x2a\xff\x53\x23\ -\xb8\x53\xed\x23\x22\x59\x47\x88\x54\x0d\x49\x64\x3e\xc1\x6a\x42\ -\x04\xc7\x33\x31\x7b\x19\xf5\x24\x29\xf3\x37\xfc\xef\xa7\x9f\x70\ -\xf8\x8f\xc3\x00\x80\x66\xcd\x9a\xe2\xd2\xa5\x02\x54\x54\x54\x80\ -\xe3\x38\xc9\x35\xcb\xed\x9f\xf0\x9f\x5c\x91\xf0\xfb\x7f\x94\xa2\ -\xd6\x62\x41\xde\x85\x3c\x84\x18\x8d\x30\x87\x85\x01\x84\xa0\xbc\ -\xa2\x02\x36\x8e\x43\x88\x31\x44\x18\x0c\x3b\xfb\x12\x86\xe1\xff\ -\x08\x51\xb4\x57\xd2\x93\x54\xb2\xbc\x11\x39\xbb\x53\x28\xbf\x17\ -\xfe\x1d\x12\x12\xe2\x22\xab\x9d\x43\xe1\x43\x87\x71\xd2\xa4\xd5\ -\xd0\x3a\xcd\x5d\x30\x0d\x3a\x51\xeb\x21\xed\x24\xad\x87\xf5\x46\ -\xeb\xf3\xbc\x7d\xaf\xa7\xf1\xa2\x44\x96\x4a\x87\x7f\x76\x1b\x63\ -\x33\x8f\xe9\xf7\xfd\xc4\x0e\x3a\x74\xe8\xd0\xa1\x43\x47\xc0\xb4\ -\x89\x64\x73\x1c\xc0\x59\xf9\x3f\x4f\xfb\x2b\xe5\xf8\xbf\x7a\xdf\ -\x08\xbd\x7c\x20\xbd\x42\x62\x8a\xa8\x6a\x5a\x41\xcf\x45\xad\x8c\ -\x46\xa3\x0b\xf7\x3a\x6d\x55\xc9\xbd\x1a\x37\xe2\xe3\xef\xbc\x44\ -\x69\x69\x29\x66\x4c\x7f\x12\xdf\x7d\xff\x1d\xc2\xc3\xc2\xd0\xac\ -\x59\x53\x54\x54\x54\xe0\x42\x1e\x1f\x37\x65\xb5\x5a\x85\x42\xc8\ -\xd4\x0d\x25\x89\x57\xaf\xf7\x54\x8d\x5c\xde\x7d\x22\x54\xc4\x36\ -\x86\x84\xa0\x49\x93\x58\x84\x84\x84\x00\x00\x2c\x16\x0b\x2a\x2a\ -\x2a\x11\x16\x66\x16\x0a\xe9\xba\x70\x7b\x54\x13\x40\x35\x58\xc5\ -\x08\x88\xef\x04\x0e\x40\xba\x51\x91\x4e\x0d\x7a\x84\xa2\xc3\x2b\ -\x72\x85\x19\x8c\x3a\x1d\x74\xe8\xd0\xa1\x43\xc7\x65\x8f\x30\xd6\ -\x74\x59\xf4\xc3\xff\xd9\xe7\x82\x28\xdf\x38\xc0\x5b\x56\x5e\x7d\ -\xf5\x15\x3c\xf6\xd8\xa3\x42\x16\x37\x5e\x98\x5c\xb2\x64\x09\x9e\ -\x7f\xf1\x65\x7b\x5d\x1e\x86\xc1\xaa\x8f\x3f\x46\x6a\x97\x2e\x6e\ -\x9b\x5f\x51\x5e\x8e\x51\xa3\x46\x0b\x16\x1b\xde\x32\xc1\x07\xd8\ -\x2b\x91\x94\xd4\x0a\x6b\xd6\xae\x95\x9e\x45\x08\xc1\x1f\x87\x0f\ -\xe1\xc1\x87\x1e\x0a\x8c\xbc\x29\x1b\xd0\xad\x5b\xb7\x60\xca\xe4\ -\x29\x78\xff\xfd\x15\x88\x8b\x8b\x43\x44\x44\x04\xc2\xc3\xc3\x83\ -\x8a\x31\xc5\xcc\x78\x14\x14\x3f\xff\xb2\x09\x67\xcf\x9c\xc1\xa4\ -\x9b\x6f\x41\xa8\x39\x14\x14\x14\x0c\x21\x78\xf1\xc5\x17\x70\xff\ -\x03\xf7\x81\x80\x80\x15\x94\x84\xa5\xef\xbd\x8b\xd9\x73\xe6\x48\ -\x63\x4f\x08\x83\xe3\xc7\x4f\xf8\x24\xf3\x17\x17\x17\xa3\x57\xef\ -\x3e\xa0\x54\x48\xaa\x40\xf8\x71\x5d\xbf\xee\x4b\xb0\x06\x83\xf4\ -\x8e\xee\xdd\xbb\x61\xc7\x8e\x1d\xb2\x77\x02\x3b\xb6\xef\xc0\x73\ -\x33\x67\x7a\x9c\x49\x53\xa6\xdc\x89\x87\x1e\x7e\x18\xa0\x54\xca\ -\xf2\x47\x15\x6e\xb6\xca\x8c\x88\xf6\xea\x4a\x04\x9d\x53\x3b\x37\ -\xe8\xd1\x82\x97\x13\xcf\xfd\xef\x88\x9f\xd6\x9b\x60\xeb\xb7\x5c\ -\xcd\x66\xb4\x9b\xa3\x74\x95\x53\x87\x0e\x1d\x3a\x74\x34\x4a\x88\ -\x59\x78\x45\x5b\x03\xe3\x6a\x37\x75\xbf\xe3\x4b\xd9\x75\xfd\xa7\ -\x00\x78\xbd\x8f\x5f\x11\x96\xa2\x94\x94\x8e\x48\x49\xe9\x68\x27\ -\x0d\xa5\xc8\xcd\xbd\x80\x03\x07\x0e\x48\x05\x4f\x09\xcb\xa2\xa2\ -\xb2\x52\xd3\xf3\x0e\xec\xdf\xef\xf1\x9e\x50\xb3\x19\x7d\xfb\xf6\ -\x01\x23\x3b\xd1\xaf\xad\xae\x76\x2d\x77\x35\xb0\x54\xf4\xdd\x77\ -\xdf\xa2\x7b\xf7\x3d\x98\x35\xeb\x65\x8c\x1f\x3f\x0e\x89\x89\x2d\ -\x83\x6e\xdc\xf6\xee\xdb\x87\x15\xcb\xdf\xc7\x17\x9f\x7f\x8e\x99\ -\x33\x9f\x43\xa8\x49\x79\xf2\xde\xa1\x43\x32\x3a\x74\x48\xb6\x93\ -\x91\x52\xcc\x9e\x9d\xaf\x69\x7c\x9c\xc7\x40\x7d\xd2\xec\xdf\xb7\ -\x57\xf1\xb9\xb4\xa4\xc4\x69\x82\x45\x46\x46\xa2\x7f\xff\x34\xa9\ -\x0d\x00\x70\xfe\x7c\xae\xa6\xd7\xb6\x4c\x6a\x89\xb4\x7e\xfd\x9c\ -\x94\x04\xe7\xe6\x51\x27\x65\xbf\xc1\x57\x3d\x1d\x3e\x2e\xc8\x3a\ -\x74\xe8\xd0\xa1\x43\x87\x8e\x60\x57\xee\x9c\xb3\xcf\x51\x87\xfc\ -\xe2\x9a\x85\x4a\xdf\x64\xa7\x06\x37\x2c\x49\xf5\x7d\xc4\x98\x1c\ -\xfb\x65\x7f\x86\x37\x10\xa2\x52\x33\x47\xad\x60\x2c\xc3\x04\x44\ -\xde\xa4\x94\xe2\xc2\x85\x5c\x3c\xf2\xe8\xa3\x78\xfe\x85\x17\x90\ -\x94\x94\x84\xd0\xd0\x50\x18\x0c\x06\xc1\x3d\xcd\xde\x0f\x79\x5c\ -\x44\xa8\xd9\x8c\xb7\x16\x2d\x82\xbc\x60\xce\xc5\x8b\x17\x31\x7b\ -\xd6\x6c\xc5\xf3\x5b\xb7\x69\x8d\x97\x5e\x9e\x05\xab\xc8\x4f\xb6\ -\x5a\xfc\x71\xf8\x30\x96\x2d\x5d\x6a\x17\xea\x89\x60\xf3\x90\x59\ -\x44\x38\xca\xa1\xa6\xc6\x82\xd2\xd2\x52\x9c\x39\x7d\x4a\x7a\x8f\ -\xd9\x6c\x46\x68\x68\xa8\x53\xbd\x26\x47\x45\x81\x68\x75\x65\x23\ -\x0e\x29\x2e\xbc\x12\x60\x89\xdb\x36\xe8\xb2\x33\x9c\x0b\x51\x79\ -\x98\xff\x41\xbd\x4a\xaa\xb6\xd4\xc3\xca\x45\xb5\x38\xe8\xea\xd0\ -\xa1\x43\x87\x0e\x1d\x97\x85\x3e\xe1\x71\x43\x17\xa5\x2e\x4a\x1a\ -\x48\x1e\xd0\x28\x87\xc8\x1b\xa0\x17\xd0\x70\x18\xac\x7a\x91\xa7\ -\xdc\x08\xd3\x4c\x10\x48\xc4\xa5\xa5\xa5\x38\x76\xec\xa8\x67\x0e\ -\x25\x40\x44\x78\x24\x58\x96\x85\x4d\x48\x8d\x1d\x62\x30\xa0\xa6\ -\xaa\x1a\x7b\xf6\xec\xe5\xdd\xcc\x84\x99\x51\x5e\x5e\x06\xc2\x1a\ -\x00\x2b\x9f\x7c\xc2\x60\x30\xa0\xa4\xb8\x04\x7b\xf7\xed\x05\xe5\ -\x7c\x8b\xa6\x63\x35\xc4\xd1\x68\x55\x4a\x7c\xa5\xba\xbf\x2d\x34\ -\x4c\xa3\xd1\x88\xf4\x34\x00\x3a\xbd\x74\xe8\xd0\xa1\x43\x87\x8e\ -\xcb\x77\xc7\x73\x56\x8a\xc8\xe5\xbd\x99\x8b\x42\x2d\x71\x53\xa0\ -\xd4\x13\x4c\xa1\x66\xd4\xd6\xd6\xaa\xff\x56\xf8\x87\x91\x65\x85\ -\x1a\x3b\x9c\xf4\x85\x8d\xb3\xc1\x10\xc2\xbb\x80\x89\xf5\x76\x58\ -\x02\xd8\x6c\x36\x79\x7e\x39\x10\x42\x14\x6e\x77\x5e\xf5\x4f\xc8\ -\xc2\x26\x1f\x4e\x9b\xcd\xe6\x92\x65\x29\xc7\xa9\x13\x41\xb8\x9d\ -\x91\x2c\x33\xfc\x17\x46\xa3\x11\xcd\x9a\xc6\x4a\xe9\xe5\x19\x00\ -\x05\xd1\x91\x60\x0d\x2c\x00\x56\x88\xbf\x01\xc2\xcc\x61\x88\x6b\ -\xde\x14\x56\x2b\x07\xde\x93\x94\x43\x74\x74\x14\x18\xd6\x00\xb0\ -\x00\x84\xf7\x4a\xb1\x43\x0e\xed\x60\x84\x62\xb4\x62\x73\x0c\x0c\ -\x01\xc7\x71\x92\x55\xc5\xe6\x6a\xd4\x1c\x3e\x32\x0c\x2b\x0e\xbc\ -\xc3\x01\x82\x0d\x9c\xcd\x5e\x6c\xd5\x6a\xb5\x82\x65\x0d\x52\xac\ -\x90\x68\x19\xe3\x6c\x36\xa7\x93\x07\x1b\x67\x03\x6c\x50\x24\x9d\ -\x70\x5c\x1a\x38\xce\xa6\xae\x04\xb1\xac\x60\x7e\xe3\x3f\x8b\x89\ -\x24\x74\x34\x72\x88\x53\x8e\x93\xb3\x8a\xae\x18\xe9\xd0\xa1\x43\ -\x87\x8e\x2b\x54\x45\x72\x90\x27\x5d\xee\x88\xbe\xc6\x18\xd7\xc3\ -\x16\xab\x5b\x8a\xdc\xc0\x62\xb1\x38\x51\xdd\x14\x6a\xc6\xb6\xad\ -\x5b\x11\x13\x1b\x63\x77\xfd\x92\x0d\xb8\x98\x54\xe1\x5c\x66\x06\ -\x3a\xa6\x74\x82\xd5\x6a\x93\xdc\xe6\xba\xa4\x76\xc1\xd1\x23\x47\ -\x84\x1a\x41\xbc\xf2\xf3\xeb\x8e\xed\x48\x4e\xee\x68\x2f\x4a\x0a\ -\xe0\xf6\xdb\x6f\xc3\x1b\xf3\xe7\xfb\xd4\xe6\x85\x0b\x16\x62\xec\ -\x8d\x37\x4a\xed\x20\x84\xe0\xae\x3b\xef\xc2\xae\xdd\xbf\x7b\xfd\ -\xac\x50\xb3\x19\x5b\xb7\x6c\x41\x64\x64\x94\xf4\xbc\xb2\xd2\x12\ -\x0c\x1c\x38\x08\x56\xab\x8d\x57\xdc\x08\x90\x10\x9f\x80\x03\x07\ -\xf6\x83\x65\x58\xe9\xbe\xb0\xb0\x30\x34\x89\x89\x91\x09\x86\x14\ -\x37\xdd\xf4\x0f\xf4\xe9\xd3\x9b\x77\x55\x14\xdc\x0b\xd7\xad\x5b\ -\x8f\xd9\xaf\xbe\xa2\x78\xef\xd4\xa9\xd3\xf0\xdc\x73\xcf\x81\x10\ -\x5e\xa9\x61\x19\x06\xcb\x97\x2f\x43\xfb\xe4\x64\x70\x1c\x55\x14\ -\x73\x75\x54\x6e\xf3\x2e\x5c\x70\xea\xc7\x17\x5f\x7c\x81\x6b\xba\ -\x77\x17\x92\xd0\x11\x70\x36\x2b\xa6\x4e\xbd\x07\x39\xe7\x73\xf9\ -\x91\x21\x00\xcb\x18\x90\xfe\x73\x3a\x22\x23\x23\xc1\x08\xcf\x2f\ -\x2b\x29\xc1\xb5\x3d\x7b\x2a\x9e\x75\x26\xe3\x2c\xba\x75\xbd\x1a\ -\xd5\x96\x5a\x49\xd9\x22\x50\x0a\xc2\x84\x10\x54\x55\x55\x39\xf1\ -\xce\xcd\x37\xdf\x8c\x79\xaf\xbd\x26\x4d\x7e\x42\x18\x34\x69\xd2\ -\x44\x9f\x68\x3a\x74\xe8\xd0\xa1\x43\x87\x0e\x1d\x81\x04\xf1\xa7\ -\x52\x44\x1a\xf4\x67\xbe\xeb\xaf\x5e\x9e\xde\x3a\xde\xce\x30\x0c\ -\xda\xb7\x6f\x87\x66\xcd\x9a\xb9\xfd\x5d\x4d\x4d\x15\x32\x33\x32\ -\x15\x16\x83\x56\x49\x49\xe8\xd8\xb1\x83\xe2\xbe\x83\xfb\xf7\x23\ -\x33\x33\x43\x91\x72\xac\xa8\xb0\xd0\x67\x15\x39\x31\xb1\x85\xe2\ -\x1d\x94\x52\x98\x42\xbd\x48\x95\x28\x7b\x2c\x21\x0c\x3a\xa6\xa4\ -\x20\x26\x3a\x46\x32\xb4\xe4\x5f\xbc\x88\xcc\xcc\x4c\xc1\xfa\x24\ -\xd0\x84\x35\x20\xb5\x33\x9f\x09\xcd\x5d\xcc\x8f\x31\xda\x88\xe8\ -\xe8\x68\xc5\xb5\x16\x89\x2d\x04\x77\x3a\x3b\x9a\x36\x6d\x8a\x4e\ -\x9d\x52\x14\x4a\x8f\x8d\xe3\x90\x75\xee\x9c\xf7\xe3\x07\x8a\xa4\ -\xa4\x96\xe8\x28\x4b\xc8\x00\x00\x79\x79\x79\x38\x77\x2e\x53\xfa\ -\x1c\x62\x34\xa2\x5d\xbb\xb6\x68\x12\xdb\x44\x22\x43\xe1\xa5\x4b\ -\x4e\xcf\xb3\xd6\x5a\xf1\xf7\xc9\x93\x3e\xf1\x5e\x64\x54\x14\x3a\ -\x76\xe8\xa0\xaa\xcc\x35\x8a\xd5\xc2\x8f\xb7\x13\xc1\xa9\x98\x36\ -\x50\xec\x62\xc0\xa8\xa6\xe7\x5a\xd0\xa1\x43\x87\x0e\x1d\x3a\x3c\ -\xee\xeb\xd4\x5b\x71\xc3\xa3\x69\xc9\xfb\xec\x73\x8c\x3e\x1a\xea\ -\xe0\xad\x44\xea\x83\xe3\x9b\x40\x4b\x34\x5f\xd6\xf6\x7c\xa2\xf9\ -\x1b\xe2\xa3\x04\xa9\x96\x2c\xc2\xef\x5a\xad\x5a\x59\x21\x17\x75\ -\x85\x7c\x75\x47\x52\x73\x45\x54\x2f\x67\x44\xea\x55\x61\xd7\xe5\ -\xe3\x2b\x09\xfa\x68\xeb\xd0\xa1\x43\x87\x8e\x2b\x4b\xb1\x69\xec\ -\x30\xe8\xe3\xa7\x7e\xd5\x68\x34\xaa\x2a\x14\xa2\xe0\x2c\xd5\x37\ -\x72\x55\x44\xd4\x29\x0b\x1a\x05\xe3\x95\x0b\xf2\x34\x00\x00\x20\ -\x00\x49\x44\x41\x54\x70\x8d\x82\xf2\x27\xe6\x54\xd9\x04\x86\x10\ -\x49\x01\xf0\x56\x01\x23\x0e\x91\x2e\x9c\x2c\x73\x9c\xcf\xe2\x9d\ -\xbb\x84\x11\x14\x60\x49\x3d\x68\x46\xc4\x91\xee\xbe\xeb\xef\x44\ -\x7c\x1e\xa5\xa8\x15\x95\x5d\x10\x27\xba\x39\x8e\xa5\xc1\x68\x04\ -\x2b\xc4\x24\xd9\x5c\xc4\x08\x79\x47\x44\xd2\x08\x2d\x44\xbe\xae\ -\x78\xc4\xc3\x4c\xa3\xde\xbd\x96\xf8\x59\xd7\xd0\xdc\x1d\xce\xc7\ -\x17\x53\x85\xf2\xad\x5b\x8c\x74\xe8\xd0\xa1\x43\x87\x0e\x2f\xc4\ -\x06\xe2\xa7\xe7\x35\x16\xa5\x88\x34\x82\x77\x9b\xc3\xc2\x11\x1e\ -\x11\xc1\xe7\x10\x24\x40\x64\x78\x04\x2a\x2b\xca\x60\x30\xb0\x92\ -\x0a\x42\x18\x06\x91\x91\x91\x4e\xbf\x0d\x0b\x8f\x00\xa5\x36\x80\ -\xf2\xc2\x70\x58\xa8\x09\x65\x65\xa5\x82\x92\xc2\xb7\xa0\xba\xa6\ -\x46\x78\xbe\xbd\x88\xac\x81\x65\x50\x56\x5a\x22\xc4\x28\xf1\xf7\ -\x99\x42\x4d\x30\x99\x42\x3d\xb6\xb7\xba\xba\x0a\x65\xa5\xa5\x3c\ -\x5f\x09\x85\x40\x1d\x93\x42\x00\x7c\xbc\x10\xc3\xb2\x20\x42\x56\ -\x72\x42\x08\x2a\xca\xcb\x7c\xa2\x12\xc7\x71\x28\x2f\x2f\x53\x28\ -\x2e\x0c\xcb\x6a\x2a\x08\x4b\x35\x5f\xd4\xd6\x16\x93\x29\x54\x48\ -\xfa\xc0\x53\x8e\x65\x0d\xa8\xad\xa9\x46\x69\x49\xb1\xf4\x9c\x5a\ -\x8b\x05\xa1\x26\x13\xc2\xc3\x23\x24\x89\xd5\x6c\x32\xa1\xa2\xa2\ -\xcc\x1e\x23\x44\x08\x8a\x8b\x8a\x5c\xf2\x84\x3c\x8d\x38\xe5\x38\ -\x54\x55\x55\xaa\x8c\x7f\xb8\x4c\x27\x62\x11\x16\x16\xe6\x33\xbf\ -\xd6\xd4\xd4\xc0\x52\x53\x63\x2f\x69\x45\x80\xa8\xa8\x68\x7d\x11\ -\xd5\xa1\x43\x87\x0e\x1d\x3a\x74\x04\x18\x97\x87\xa9\xc8\xe0\x59\ -\x55\xf3\x92\x1e\x24\xb8\x49\x48\xbc\x2c\x99\xbb\x63\xc7\x56\x45\ -\xfc\x4c\x79\x59\x19\x06\x0f\x19\x8e\x92\xd2\x12\x80\x02\xb5\x56\ -\x2b\x9a\x34\x69\x82\xb3\x67\x4e\x2b\x7e\x97\xda\xa5\x0b\x4e\x9f\ -\xfa\x5b\x20\x09\xff\xce\xbd\x7b\x76\xa3\x6d\x3b\x65\x6c\xcb\xb0\ -\x61\xc3\x70\xea\xe4\xdf\x92\x8b\x17\x01\xc1\x9a\x2f\x3e\x47\xdb\ -\xf6\xca\xd8\xa3\x27\x67\x4c\xc7\x8b\x2f\xbe\xe8\x91\x7e\x8f\x3e\ -\xfe\x38\x9e\x7a\xe6\x59\x45\x7f\x2f\xe5\x5f\x74\xba\xef\xbb\xef\ -\xbe\xc3\xd5\x5d\xaf\x96\x4e\xb0\x6b\x6a\x6a\xd0\xaf\x6f\x1a\x72\ -\xce\x67\x7b\x4d\xd3\xd3\xa7\x4f\xa1\x7d\x72\x07\x61\xf0\x79\xb1\ -\xbd\x7b\xf7\xee\xf8\x79\x63\xba\x8f\x96\x11\xdf\x39\x63\xc5\xf2\ -\xe5\x18\x35\x66\xb4\x64\xd1\x23\x00\x26\x4e\xba\x19\xc7\x4f\x9c\ -\x50\xdc\xf7\xbf\x1f\x7f\x40\x9b\x36\x6d\xa4\xa4\x0d\x35\x55\x55\ -\xe8\x3f\x60\x10\xca\xca\xcb\xa4\x8c\x19\x94\x3a\x5b\x88\xda\xb6\ -\x6d\x8b\x1d\x3b\x76\x28\xb2\xc6\xed\xdd\xb3\x17\x37\x8e\x1f\x27\ -\x34\x9d\x6f\xfb\x88\x11\x23\xb1\x7a\xf5\x2a\x7b\x42\x08\x10\x98\ -\xcd\x66\xaf\xfb\xc3\x09\xcf\x9b\x3e\xe3\x29\xac\x5f\xff\xa5\x44\ -\x1e\xc2\x30\x58\xf5\xc9\x27\x18\x33\x66\xf4\xe5\xb1\x8e\x92\x20\ -\x3c\x39\xf1\xcb\x7a\xa3\x6f\x95\x3a\x74\xe8\xd0\xa1\xe3\x32\x87\ -\x62\xb3\x13\xe5\x6c\xce\x61\x1f\xd7\xa8\x5f\x78\x51\x57\xa8\x6e\ -\x6d\x76\x7e\xde\x15\x6b\x29\xd2\xfa\xf2\xa6\x4d\x9b\x2a\x3e\x9b\ -\x8c\x46\x14\x16\x15\xa1\xb8\xb8\x48\x21\x04\xab\x21\x2e\x2e\x4e\ -\x31\x76\x61\x61\x61\x28\x2a\x2a\x54\xa4\x9f\xae\xa9\xae\x46\x7c\ -\x7c\xbc\x64\xa1\xa0\x94\x82\x61\x58\x14\x16\x16\x28\x7c\x6f\xf8\ -\x6c\x66\x9e\x39\xa2\xbc\xac\x0c\xe5\x65\x65\x1e\xfb\xd5\x24\xb6\ -\x09\xe2\xe2\xe2\xa4\xec\xd0\xd5\xd5\xd5\x20\x0c\xf1\x99\xe3\x0a\ -\x1c\x92\x12\x94\x95\x96\xf8\x3e\x0c\x75\x60\x8c\xe8\x98\x18\xc4\ -\xc7\xc5\x29\xe8\x59\x51\x5e\x8e\xc2\xc2\x4b\x52\x77\x58\xd6\x80\ -\x98\x98\x18\xa1\xff\xfc\xcb\xaa\x2a\x2b\x51\x54\x58\xc8\x2b\xbb\ -\x1e\x10\x17\x17\x27\x14\xb9\xe5\xdd\x1c\xa3\xa3\xa2\x9c\xee\x31\ -\x99\x4c\xc2\xf8\x13\xbf\x08\xc6\x65\xa5\xa5\x0a\x1a\x13\x86\x51\ -\xb5\x00\xea\xd0\xa1\x43\x87\x0e\x1d\x3a\x74\xe8\xf0\x5e\x31\xd0\ -\xae\x14\x51\x8f\xcf\xf2\x4e\x13\x0c\x42\x62\x68\x92\xc6\x25\x4b\ -\x13\x95\x5d\x22\x52\xbd\x1d\xb7\xb1\x2f\x84\x38\xd7\xe3\x61\x78\ -\xb7\x3c\xa7\x37\xcb\x95\x2d\x4a\xd5\xc9\x59\x07\x69\x9b\x65\x18\ -\xe9\xe7\xae\x2a\x11\xd7\x69\x04\xb5\xb6\x4d\x72\x43\x93\xd1\x53\ -\x65\x1c\x34\x3f\x8e\xcf\x75\x0d\xe5\x99\x85\x32\x6e\xcb\x66\xb3\ -\xda\xe3\x8c\xbc\x84\x81\xb5\xa7\x1d\x57\xf0\x8d\x83\x72\x2c\xd1\ -\xb6\x8e\x0a\x91\xdc\xe2\xe5\xc7\xe1\x87\xdf\xe6\xbd\xd3\xfd\x44\ -\x9b\x62\xab\x32\x8f\xbc\x7a\xbf\xb7\xcb\x0c\xd1\xf8\x3c\xe7\x11\ -\x70\xf1\x43\xa2\x69\x3d\xd1\x63\x8a\x74\xe8\xd0\xa1\x43\xc7\x15\ -\xa6\x5b\x28\xff\x21\x86\x87\x88\xb1\xb6\x8e\xfb\x6a\x43\x59\x86\ -\x3c\xa6\xc5\xbd\x82\xb3\xcf\x39\x25\x1f\xf0\x42\x68\x21\x3e\x66\ -\x29\xd3\x2e\xd8\x7a\x56\x0a\xfc\x21\x63\x51\x37\x7a\x98\x2b\xe5\ -\x44\x2b\x67\x6a\xe6\x71\x4e\x1b\x97\x73\x5e\x24\x8b\x20\x1a\x1b\ -\x43\xfc\x32\xa9\xa8\x26\x1e\xf1\x3b\xbf\x06\x6e\x95\xd3\xa1\x43\ -\x87\x0e\x1d\x3a\x74\xe8\xb8\xcc\x14\x03\xc0\x40\x08\xa7\x10\xed\ -\xfc\x66\xe7\xa1\x2e\x84\x28\xc6\x1e\x63\x21\x3f\xc0\x27\xf5\xd7\ -\x47\x94\x95\x94\xa0\xba\xba\x9a\xb7\xc8\x08\xc2\x2a\xc3\x30\x88\ -\x8e\x89\x95\xee\x33\x18\x42\x60\x34\x19\x3d\x3e\x8f\x65\x59\x44\ -\x47\xdb\x8b\x92\x12\x10\x34\x8d\x8d\x45\xc1\xc5\x3c\xa1\xdb\x0c\ -\x1f\xa7\x22\xd3\x66\x28\xa5\xa0\x14\x28\x2e\x2e\x41\x4c\x6c\x13\ -\xa9\x65\x0c\x61\x10\x16\x6a\xc6\xa5\x8b\x17\x15\xc2\x67\xa5\x4a\ -\xd0\xbe\xb3\x28\x4e\x61\x36\x87\x23\x46\xd6\x07\x00\xa8\xac\xac\ -\x84\xc5\x52\xe3\xb1\x1f\x25\x25\xc5\x28\xc8\xcf\x97\xda\x58\x55\ -\x55\x8d\xf0\xf0\x30\xc4\xc4\xc6\x4a\xfd\x0a\x0f\x8f\xd4\x9c\xce\ -\xda\x11\xb5\xb5\xb5\xb8\x54\x70\x09\x94\xe3\xa4\xb1\x56\xe3\xaf\ -\xca\xca\x4a\xc4\xc4\xc6\x4a\x45\x4f\x59\x86\x45\x08\xc3\xe0\x92\ -\x40\x4f\xf1\x17\xb5\x96\x5a\xc5\x78\x31\x84\xa0\xa2\xa2\xc2\xa9\ -\xaf\x6a\xba\x08\xf1\x37\x77\x39\x3c\x8e\x0d\x09\x41\x4c\x6c\x53\ -\x00\x9c\xc4\xf7\x66\x93\x09\x97\xf2\x2f\x4a\xca\x1c\x21\x04\x66\ -\x73\x98\x6a\x42\x0e\x6d\x8a\x78\x03\xf4\xcb\xcd\x7b\x09\x71\x41\ -\x03\x71\x20\x19\x1f\x8f\x74\x7c\x5d\x70\xfc\x7d\xbf\xbf\x62\x9b\ -\x48\xe3\x50\x23\xad\x36\xab\xb4\x9e\x81\x02\x36\x9b\x0d\x15\x15\ -\x95\xa8\x14\xdc\x74\x59\x86\x41\x68\xa8\x09\x61\x61\x61\xfc\x3d\ -\xa4\x61\xf8\x4d\x87\x0e\x1d\x3a\x74\x34\x2e\x48\x7e\x56\x06\xd6\ -\xc3\x36\x2b\xca\xff\x82\xc5\xc8\x31\x64\x83\xd6\x67\x0b\x65\x9f\ -\xdc\xbc\xc7\x10\x50\x2a\x36\x10\xee\xff\xbf\x87\xf0\xd5\x57\xeb\ -\x25\x65\x82\x21\x0c\xbe\xf9\xfa\x6b\x8c\x1a\x35\x52\x0a\xb4\x17\ -\x05\x57\x4f\x08\x0f\x0f\xc7\xa9\x93\x7f\x49\x82\x22\xa5\x40\xde\ -\x85\x5c\xb4\x6c\xd3\x0e\x9c\xcd\x26\x93\xad\xec\x49\xbb\x45\xa4\ -\xa5\xf5\xc3\xc5\xbc\x0b\x7c\xec\x8e\x70\xe3\x86\xaf\xbe\x42\x8b\ -\xa4\x56\x00\xb5\xa7\x29\x76\x74\xb1\x73\x45\xaf\x05\x0b\xff\x8d\ -\x37\xde\x78\x5d\x48\xff\x4d\xc1\x71\x14\x93\xef\x98\x82\x75\x62\ -\x40\xbe\x1b\x0c\x1e\x3a\x4c\x11\x43\x64\x32\x85\xe2\xd0\x81\xfd\ -\x68\xd7\xbe\xbd\xc2\x3d\x4c\x4d\x29\xd2\x82\x03\x07\x0f\x20\x21\ -\x21\x51\x21\x5d\x2b\xe5\x5f\x3e\x9b\xc1\x5d\x53\xa6\xe0\xe2\xc5\ -\x0b\x0a\xb7\xc3\xf9\xf3\xe7\xa3\x45\x52\x2b\x41\xf9\xe2\x95\xa5\ -\x79\x73\xe7\x22\x3f\x3f\x8f\xbf\x4f\xf0\xb6\xbb\xe7\x9e\x7b\xb1\ -\x7a\xf5\x2a\xbf\xf0\x5a\x5d\x2c\x3b\x7d\xfb\xf6\xc6\xa5\xfc\x3c\ -\x85\xc2\xfa\xdf\xaf\xbf\x41\x62\x52\x6b\x5e\x21\x16\xfa\x3a\x6d\ -\xea\x54\x7c\xb8\xf2\x83\x46\x39\x87\x82\x5e\xca\x0f\xc6\x5d\x22\ -\xc8\x91\x93\x93\x8b\xb3\x67\x33\x90\x95\x7d\x1e\x45\x45\x45\xb0\ -\x5a\x6d\xd2\x9c\x13\x63\xe1\x42\x8c\x06\xc4\xc6\xc4\xa0\x65\xcb\ -\x44\xb4\x6d\xd3\x1a\x57\x5d\xd5\x46\x1f\x5b\x1d\x3a\x74\xe8\xd0\ -\x71\x19\xca\x07\x04\x06\x50\x46\xa9\x3a\x51\xea\xb6\x7f\xd4\xe5\ -\x05\xea\xa0\x82\xb9\x28\x2c\x22\x9d\x3c\x33\x8a\xf7\xd5\x9b\xd3\ -\x3d\xa5\x20\x94\xc2\x66\xb5\x07\xa5\x73\x00\x08\x43\x84\x13\x50\ -\xe2\xf5\x78\xca\x15\x05\x42\x00\x03\x1b\x82\xda\x9a\x6a\x8f\xbf\ -\xb3\x59\xad\x30\x18\x0c\x42\xb3\xec\x25\x7c\x6d\x56\xab\x26\xf3\ -\x8b\x68\x4d\x01\xec\xb1\x4b\xa2\xa6\x4d\x41\xc0\xb0\xda\xeb\xbf\ -\x50\xce\x26\x25\x06\x01\x00\x1b\x5b\x0b\x96\x35\x80\x75\xa1\x04\ -\x49\xed\xf5\xc2\xf7\x93\xb3\x59\x3d\x5a\x02\x38\x4a\x61\x60\x0d\ -\x0a\xfe\x20\x84\xe1\x69\xe2\xa0\xd9\xb3\xac\xc1\xce\x26\xd4\xf5\ -\xc9\xb5\x9c\x4e\x6e\x79\xd9\xe1\x3e\x5f\x66\xb5\xa3\xf2\x28\xa5\ -\xcc\xa6\x80\xd5\x5a\x0b\xb9\x09\x82\xca\x6a\x46\x69\x55\xc2\xb8\ -\x00\xbb\xcd\xd9\xdd\xf6\xa8\x70\x1c\xe4\x6a\x40\x95\x25\xa9\x9d\ -\xb2\x3c\x3a\x1c\xcd\x90\x06\xee\x17\x15\xde\x4f\x28\xf1\xc8\xb7\ -\x6a\xfd\xa3\x2e\x6f\x24\xaa\x1f\xed\xb4\xaa\x6f\x5b\xb8\xa7\x71\ -\xe3\x21\x26\xe5\xb0\xd4\xd6\xe2\xc8\xd1\x63\x38\x7a\xf4\x38\x4a\ -\x4b\xcb\xc0\xb9\x2c\xc3\xc4\x5b\xb7\x2d\x35\xb5\xc8\xcb\xcb\x47\ -\x5e\x5e\x3e\x0e\x1c\x38\x8c\x98\xe8\x48\x74\xe9\xd2\x19\x57\x5f\ -\xdd\x15\x61\x66\x73\xa3\xab\xbb\x45\x5d\xc4\xfe\xf9\x6b\x7c\x02\ -\xef\xe6\xda\x38\x21\x66\x78\xa5\x94\x62\xf7\x9e\xbd\xc8\xce\xce\ -\xc2\xad\xb7\xdc\xa2\x99\xbf\x74\xba\x07\xc7\x7c\xd2\x71\x65\xd2\ -\x9d\x8a\xb2\x3c\xd1\x74\xa7\xdf\xf5\x2a\x97\xfb\xb3\x8b\x50\x60\ -\xea\x10\xeb\x24\x37\x0f\x19\x02\x4e\xc9\x86\xd8\x53\x49\x3d\x2b\ -\xb5\x75\x08\x12\xd3\x2a\x53\x50\xed\xb3\xc5\xf7\x6e\x10\xdf\x59\ -\xd0\x57\x78\xe3\x75\xa5\xe6\x42\xa8\x6d\x30\x34\x32\x00\xa1\xfe\ -\x1b\x6b\x15\x62\x92\x3a\xd0\x8d\x06\xc3\xd1\x8c\x6e\x29\xaa\xeb\ -\x80\x05\x14\x47\x8e\x1e\xc3\x9e\xbd\xfb\x51\x59\x59\xe5\xf3\x33\ -\x4a\x4a\xca\xf0\xfb\xae\x3d\x38\x74\xf8\x08\x7a\xf7\xba\x0e\xd7\ -\xf6\xe8\xde\xe8\x86\xe6\xe0\x81\x83\xf8\xe1\x7f\x3f\xf2\x82\x05\ -\x61\x70\xdb\x2d\xb7\x20\x25\xa5\xa3\xce\xb3\x01\xc6\x86\x6f\xbe\ -\xc1\xda\xb5\x5f\x22\xe3\xec\x19\x18\x42\x42\xd0\xb5\x6b\x17\x74\ -\x49\xed\xa2\x13\x46\x87\x8e\xe0\xd7\xd2\x2e\x9b\x7e\x18\x5c\x1d\ -\x78\x6a\x4f\x37\x47\x5d\x68\x66\x54\xfd\x6e\xc1\x3c\xc1\x3a\x04\ -\xd8\x7b\xab\xf9\x72\x4e\x59\xdc\x18\xed\xb2\x89\x3c\xe6\x87\xd2\ -\x3a\xcb\x30\x04\x04\x84\xb0\xc2\xe3\x6c\xae\xef\x63\x88\xd4\x4f\ -\x7b\x7f\x89\xb6\x97\x53\xf7\x74\x22\xfe\x10\xc6\xa8\x86\x13\x09\ -\xea\x25\xff\x6b\x48\x2e\x26\xb7\xd8\x38\xb3\x0f\x95\x14\x20\x0a\ -\xb9\x41\x93\xba\xe5\x19\xe5\x77\xd4\xe5\x1c\x56\x8c\x07\xd5\x3e\ -\xff\x5d\xbe\x5b\x6e\xf9\xa4\xca\x9e\xca\x2d\x5b\x5a\xf9\xdd\xed\ -\xb8\x7a\xa0\x81\x5f\xf5\x21\xca\x02\x94\x51\x39\x79\x51\x3f\x8a\ -\xa1\x8e\xdf\x3b\x58\xa4\x69\x43\x6b\x0d\x14\xbe\xbd\xd7\xa5\x99\ -\x51\xfc\x82\x53\x5f\x0f\x29\x07\x56\x46\x9b\x40\x9d\xec\xd9\x6c\ -\x36\x14\x17\x97\x60\xf3\x96\x6d\xc8\xc9\x39\x0f\xce\xc1\xe0\x2b\ -\xfa\x82\x33\x20\x60\x58\x56\x8a\xab\xe4\x38\x0e\x56\xab\x15\x1c\ -\xc7\x81\xe3\xec\x7c\x46\x41\x41\x6d\x40\x65\x45\x15\xb6\x6e\xdd\ -\x89\x53\xa7\xcf\x60\xd8\xd0\xc1\x88\x8d\x89\x11\xd8\xde\x3f\x9a\ -\xb3\xd6\xf5\xdd\x17\x9c\x3e\x7d\x1a\x1b\x36\x7c\x2d\x8d\x5e\xff\ -\x7e\xfd\xd0\xb1\x63\x07\xbf\xd2\x5d\x6c\xbf\xaf\xed\x16\xb9\xc5\ -\xd1\x62\x5e\xdf\x10\xdb\x4d\x08\x01\xc3\x30\xbc\x37\x45\x83\x2c\ -\x30\x04\xbf\xee\xd8\x89\xd3\xa7\x4e\x0b\xd3\xcb\x8a\xf7\x96\x2e\ -\xc5\x7b\xef\xbc\xdb\xa0\x74\x0f\x14\xea\x93\xdf\x1b\xb2\xfd\x8d\ -\xbd\xdd\x8d\xcd\xf2\x15\x4c\x74\x27\x94\x01\x6c\x62\xdd\x13\x87\ -\x95\xcc\x31\xa6\xdc\xbd\xa3\x09\xfc\x57\x80\xc8\x21\x14\x85\x32\ -\xea\x7a\x89\x34\xff\x6c\x81\xb3\x14\x51\x96\x6b\x98\x81\x02\x90\ -\x10\x9f\x80\x8e\x1d\x53\x20\x77\xb8\x2a\x2e\x2a\xc2\xd1\xa3\x47\ -\x84\x42\x98\x62\x5c\x11\x91\xe2\x84\x78\x41\x9d\x41\x6a\x6a\x67\ -\x8f\xef\x30\x84\x18\xd0\xa1\x63\x07\xde\x55\x4f\x14\xee\x15\xa3\ -\xce\x3f\xb7\x45\x5c\x1c\x4e\x9c\x38\x2e\x65\x5c\xa3\x00\xce\xe7\ -\xe6\x3a\x3d\x2f\x2a\x2a\x1a\xf1\x09\x09\x76\xc1\x85\x61\x10\x17\ -\x17\xaf\x79\x73\x71\x44\x52\x52\x12\xc2\xc2\xc2\x65\xb7\x10\x64\ -\x9c\x3d\x8b\x1a\x87\x24\x05\xa7\x4f\x9f\x46\x55\x75\x15\x2f\x6c\ -\x03\x2e\xfb\x4f\x7c\x64\xd9\xb0\xf0\x70\xb4\x4c\x6c\x29\x46\x2c\ -\x80\x61\x08\x92\x5a\xb6\x74\x72\x75\x8b\x8d\x6d\x22\x8c\x97\x70\ -\x27\x43\x10\x1f\x17\x0f\xa2\x41\x5e\xcd\xc9\xc9\xc6\xf1\xe3\xc7\ -\xa4\x06\x32\x0c\x83\xaa\xea\x6a\x4d\xb2\x6e\xfb\xe4\x0e\x28\x2f\ -\x2f\x97\x48\xc8\xd9\x6c\x38\x79\xea\xa4\xe2\x1e\x8b\xc5\x82\xe3\ -\xc7\x8f\x83\x65\x19\x41\x19\x26\x8a\xb4\xe2\xa2\x6e\x55\x58\x58\ -\x88\x8e\x1d\x3b\x4a\xc6\x50\x86\x61\x90\xd8\xb2\xa5\xff\x99\xbb\ -\xc1\x56\x3c\xfd\x30\xcc\x2b\x30\xc1\x41\xb0\xec\x9c\x1c\xa4\x6f\ -\xdc\x8c\xca\x8a\x0a\xd5\xef\x13\x12\xe2\xd0\xf6\xaa\xd6\x48\x4c\ -\x6c\x81\x98\x98\x68\x18\x4d\x26\x30\x0c\x01\xc7\x51\x58\x6a\x6a\ -\x50\x5c\x52\x8a\x9c\x9c\x5c\x64\x64\x64\xe2\xc2\x85\x8b\x2a\xf3\ -\x2d\x17\x1b\xbe\xfe\x16\xa3\x47\x0d\x47\xcb\xc4\xc4\x46\x31\x34\ -\x0a\xc5\x2d\x88\x85\xa0\xd9\xb3\x5e\xc1\xfe\x7d\x7b\x15\x0e\x15\ -\xae\xac\xe3\x6e\x4b\x3a\x10\xf7\x13\x98\x2a\x24\x12\x7e\x0d\x0b\ -\x31\xf2\xca\xf1\xaa\x55\x9f\x20\x46\x50\x78\xeb\x77\xba\x10\x3c\ -\xf6\xd8\x63\xd8\xbd\x7b\x0f\xaa\x6b\xf8\x7d\x69\xf7\x9e\xbd\xd8\ -\xbe\x63\x07\xae\x1f\x38\x50\x5f\x4f\x74\xe8\x08\xfa\x85\xf5\xf2\ -\xd8\xb7\x0d\x8e\x1a\x1c\x88\x43\x2c\x90\x63\xcc\x8f\x53\xde\x66\ -\x51\x09\x70\x4f\x11\x69\xe1\x15\x62\x61\x38\x68\x4f\x6e\xa0\xda\ -\x76\x07\xcd\xd8\xdd\x73\xde\x5e\xfc\x16\x16\x71\x6f\x2a\xee\x1b\ -\x3e\x7c\x04\xb6\x6e\xdb\xc6\xc7\xbd\xa8\x8d\xaf\x70\x42\xf6\xd7\ -\x9f\x7f\x22\x39\x39\xd9\xed\x78\xc7\x36\x69\x82\x13\xc7\x8f\x79\ -\x6c\xf3\x8e\xed\xdb\xd0\xed\x9a\xee\x0a\xa5\x49\x2d\xa9\xc2\xad\ -\xb7\xde\x82\x15\x2b\x56\x78\x75\x02\xe0\xc2\x40\x07\xc2\x30\xf8\ -\xe0\x83\x95\x18\x39\x72\x84\xe2\x7a\xf7\x6b\x7a\xe0\xc8\xd1\x3f\ -\xec\xc2\x7e\x4d\x0d\x46\x8e\x1a\x09\xc2\xb0\xd2\xf0\x9b\x43\xc3\ -\x90\x9d\x95\x89\xd8\xd8\x58\xcf\x5a\x91\x86\x4c\xd5\x83\xae\x1f\ -\x84\x1f\x7e\xf8\xde\xe3\x78\x3d\xf8\xe0\x03\x78\xf0\xc1\x07\x7c\ -\x9a\x85\x0f\x3f\xfc\x88\xd0\x6f\xc1\x72\xc7\xd9\x5c\xd2\x4b\xde\ -\x06\x73\x58\x18\xf6\xef\xdf\x6b\xff\x9e\xe3\x50\x58\x58\x88\xf8\ -\x84\x16\xfc\xf9\x81\xc0\x27\x99\x99\x99\xe8\xde\xdd\xd9\x65\x48\ -\x4e\x37\x00\x18\x33\x7a\x0c\x4e\x9c\x38\x26\x5d\xa8\xfb\x49\x8e\ -\x33\xc1\x29\x45\xbd\xc7\x74\x50\xe9\xbc\x85\x13\xaa\x53\x13\xf5\ -\x93\x17\xe5\xf4\x76\x4a\x4a\x47\x1d\xc7\x8c\xb8\x88\xc5\x71\x8a\ -\x51\xd4\x58\xcf\xc8\x77\x09\xd9\xe1\xb4\x4b\xf9\x7e\x4a\xd5\x97\ -\x43\xd9\x4a\xe4\x42\x18\x25\xb0\x81\x04\x2c\xe6\x86\x52\x8a\x33\ -\x67\xcf\x22\x3d\x7d\x13\xaa\xaa\xab\x15\xc9\x64\x8c\x21\x21\x68\ -\xdb\xb6\x0d\xba\x77\xef\x86\x96\x89\x2d\x5c\x1f\x62\x98\xcd\x88\ -\x89\x89\xc1\x55\x6d\x5a\xa3\x4f\x9f\x9e\xb8\x70\x21\x0f\x7f\x1c\ -\x39\x8a\xb3\x67\x32\x60\x11\x62\x94\x28\xc7\xa1\xac\xb4\x0c\x3f\ -\xfc\xb8\x11\x23\x46\x0c\x45\x3b\x21\x11\x43\x5d\xfb\xed\xcd\xfa\ -\xee\x2d\x3f\x13\x42\x64\xb1\xb3\xea\xf3\x88\x02\x38\x7b\xf6\x2c\ -\xe6\xcf\x7f\x03\x94\xa3\xf6\x24\x38\xd4\x39\x46\x8c\x38\xee\x73\ -\xc2\xa1\x12\x08\x51\xd6\x82\x03\xf0\xd6\xa2\x45\x88\x88\x88\xd0\ -\x34\x7e\x85\x05\x05\xc8\xbd\x70\x41\xa0\x07\xbf\xbe\xd8\x28\xa7\ -\x5c\x0a\x44\x85\xc7\x71\x1f\x97\x62\x17\xed\x1f\x29\x1f\xb0\x29\ -\xae\x1e\x8a\xe7\x38\xf6\x8a\x65\x85\x7d\xda\x29\xee\xd2\xb7\xd5\ -\xca\xd3\x2a\x4e\x29\x45\xbb\x76\x6d\x31\x79\xf2\x64\x7c\xf4\xd1\ -\x47\xe0\xac\xfc\xba\xbd\x6c\xc5\x72\xf4\xed\xdb\x17\xc6\x90\x10\ -\xf5\x75\x03\xd4\x9e\xf1\x48\xc6\x37\xe2\x09\x7a\x83\x59\xba\xea\ -\x2a\x8b\xd5\x13\xbf\x37\x74\xfb\x1b\x6b\xbb\x75\xba\xfb\x41\x4e\ -\xe0\x4f\x7f\xd5\xf7\x57\xa7\x98\x5b\xaa\x3c\xce\x71\x9a\xd7\xa4\ -\x0e\x2b\x8a\xfc\x57\x8c\xea\xe3\x88\xa3\x65\x8a\x13\xee\x63\x49\ -\x80\x63\x8a\x02\xcc\x7f\xae\x14\x22\x97\x27\x6e\xfe\x92\x30\x3d\ -\xca\x69\xc4\xaf\x2f\x51\x13\xc8\x39\x4d\x89\x1d\x38\xcd\x75\x94\ -\x02\x31\xd6\x75\xa1\x13\xd1\xf4\xfc\xc0\xb4\x4d\x3b\xeb\x04\xc6\ -\x05\x4d\x87\x16\x5a\x05\x76\x71\xcb\x39\x7f\x1e\x1b\x37\x6e\x72\ -\xb2\x92\xc6\x35\x6f\x86\x81\x03\xd3\xd0\x2a\xa9\x25\x88\x97\x8a\ -\x7a\x42\x42\x3c\x5a\xb4\x48\xc0\xb9\xac\x6c\xfc\xba\xf3\x37\xe4\ -\x5f\x2a\x90\xbe\xab\xac\xa8\xc4\xcf\x3f\x6f\xc6\xd8\xb1\xa3\x90\ -\x14\xcc\x16\x23\x2f\x78\xb8\xac\xac\x0c\xfb\xf7\xed\x13\xd6\x4b\ -\xce\xf3\x76\xe0\x21\x74\x91\x65\x0d\xb0\x6a\x74\x87\x53\xe3\x9e\ -\xd4\x2e\x5d\xa4\x0e\x30\x20\xc2\xf8\x89\xca\x2e\x23\x65\x78\xb1\ -\x59\xad\x38\x72\xf4\x88\xf4\xbb\x96\x89\xad\xd0\xa4\x69\x53\xc5\ -\xc2\x26\xc6\x37\xda\x6a\xf9\xe4\x3f\x22\xbb\xe6\x64\x67\xe3\x52\ -\x41\x41\x9d\xf6\xbf\x4b\x05\x05\xd8\xf4\xcb\x26\x70\xd2\x81\x94\ -\x78\x8a\x46\x5c\xe6\xdd\xe1\xe3\xbb\x88\x60\xa9\x64\x24\x7a\x87\ -\xb0\x21\xf8\xe2\x8b\x35\x30\x1a\x43\x14\xf6\x30\xd5\xe5\x95\x8a\ -\x4a\x1c\x60\x36\x87\x61\xdc\xb8\x1b\xf5\x75\x48\x87\x8e\x86\x92\ -\xa7\x2f\x8b\xb8\x22\x02\x83\xeb\xe0\x72\xc7\x6c\x63\x1e\xb2\x31\ -\x79\x54\xec\x44\x9f\x24\xf1\xc4\xad\x61\x85\x06\x47\x9f\x51\x79\ -\x0a\x68\xd5\xde\xdb\x6c\x08\x31\x9a\x04\xe1\x96\xca\xf2\xab\x6b\ -\x3b\x71\x50\xa5\x26\xe5\x5d\xb2\x3c\x4a\xe2\x94\x2a\xd2\x65\x6b\ -\xda\xeb\x5d\xa7\x91\x02\x43\x9c\xdb\xe7\xca\x77\x56\x61\x59\x21\ -\x5e\x68\x33\x1e\x93\x6c\xf1\xee\x72\xfe\x54\x8e\xdc\x29\x1e\x4e\ -\x16\x22\x87\xdd\x98\x10\xe2\x3e\xcf\x07\xe1\x05\x0e\x9b\xcd\xaa\ -\x91\xfe\x36\x07\x9a\x13\x10\xa1\x66\x55\xdd\x64\x38\x1a\xe4\x4a\ -\x8a\xe8\xa7\xe8\x42\xd8\xd1\x50\x41\x5a\x7d\xbd\xf1\x74\xbd\x7e\ -\xa4\x64\xea\xe2\xfd\xd4\x55\x96\x32\x27\x4b\x17\x51\x7e\x17\x80\ -\xe4\x73\xa5\x65\x65\x48\x4f\xff\x05\x55\xd5\x35\x32\x7e\x64\x90\ -\x9a\x9a\x82\xfe\xfd\xfb\xf9\x94\x35\xce\x20\x3b\x71\x6f\xdb\xa6\ -\x35\x9a\x37\x6b\x8a\x2d\x5b\x77\xe0\xd4\xc9\xd3\x92\xd2\x50\x51\ -\x51\x81\x9f\x7f\xd9\x82\x9b\x27\x4e\x40\x94\x8f\xf5\xb8\x1a\x6c\ -\xeb\x13\xd7\x57\xce\x8d\x32\x43\xe5\x11\xb3\x1e\xd2\x68\x12\xe5\ -\xb8\x13\x47\x5f\x7a\x26\x04\x1c\xf5\x42\x70\x70\x58\x2a\x43\xc3\ -\xc2\xf0\x9f\x8f\x56\x82\x65\x59\x14\x14\x14\xe0\xa5\x97\x67\xa3\ -\x57\xef\x9e\xb8\xfb\xce\x3b\xf9\xf1\x31\xd8\xcf\x37\xab\x2a\xab\ -\x30\x74\xe8\x70\x58\x6a\x6b\x00\x30\xb8\x6b\xea\x5d\xb8\x79\xd2\ -\x44\x47\x2d\x04\x3b\x76\xee\xc4\xe2\x25\x8b\xf1\xd2\xcb\x2f\xa3\ -\x7b\xb7\x6b\x00\x00\x0b\xde\x58\x88\xb5\x6b\xd7\x48\xd9\xe0\xbc\ -\xe5\x5b\x0a\x8a\xdc\x9c\x5c\xcc\x9f\x3f\xdf\xad\xa0\xe4\x68\x39\ -\xa6\x0e\x59\x2b\x45\x72\x1e\x39\x7a\x14\x47\x8e\x1e\x55\x79\x80\ -\x70\xd2\x2c\xee\xeb\x9c\x32\xb6\x39\x26\x36\x16\xa3\x47\x8f\x6a\ -\x34\x96\x22\x1d\x3a\x2e\x0b\x88\x87\x3e\xc6\x10\xf5\x7d\xd4\x59\ -\x93\x52\xc8\x0f\xce\xa7\x1d\x5a\x03\xbd\x35\xea\x25\x0e\xd7\xc5\ -\x83\x16\x6a\xb2\x5b\xaa\x02\x16\x9d\x15\xf0\x80\x36\x0d\x8b\x7d\ -\xad\x10\x73\xe3\x9f\xa6\x6a\x7f\x48\x9d\x04\x69\x42\xfd\xdd\x1c\ -\xff\x91\x9c\x36\xfc\x18\xfa\x4e\x04\xda\x60\xe3\xad\xe9\x14\x86\ -\xa3\xfe\xe5\x13\xef\x27\xac\xbe\xe0\xfb\x53\xa1\xad\x27\x70\x1c\ -\x87\xcd\x9b\xb7\xa1\xa4\xb4\x4c\x71\x3d\x35\x35\x05\x83\x07\x5f\ -\x8f\x30\xb3\xd9\x2f\xef\x09\x0f\x0b\xc3\x90\xc1\x03\x91\x9a\xda\ -\x49\x71\xbd\xa8\xb0\x18\xdb\xb6\xff\x1a\xc4\xda\x90\xf6\x65\x84\ -\x65\x59\x84\x85\x86\x21\xd4\x68\x86\xd9\x64\x86\xd9\x14\x8a\xd0\ -\xd0\x50\x84\x9a\xec\x7f\x26\x53\x28\x4c\x26\x33\x4c\x46\xfe\xdf\ -\xa1\x26\x33\x42\x43\x5d\xd3\x98\xad\x83\x1b\x2d\x21\x0c\x2c\x16\ -\x0b\x9e\x78\xea\x59\xec\xda\xbb\x0f\x4b\x97\xad\xc0\x9b\x6f\xbd\ -\xe5\x5a\x41\xa3\x76\x85\xd8\x11\x3b\x76\xee\xc4\xcc\xe7\x5f\xc0\ -\xe9\xb3\x19\x78\x62\xfa\x0c\xfc\x7d\xf2\xa4\x8b\x95\x8b\xd4\x9d\ -\xc0\xc1\xba\xc1\xeb\xd0\xa1\x43\x87\x03\x0c\x92\xc5\x86\x70\x0a\ -\xcd\xc9\x77\x51\xcf\xe1\x64\xd7\xf1\xe8\x55\x5e\xf7\xa4\x01\x64\ -\x06\x0a\x8a\x63\x47\x8f\x23\xef\xe2\x05\x10\xa1\x40\x2a\xc3\x30\ -\x28\x2a\x2c\xd4\xf4\xfb\x5d\xbb\x7e\x47\x66\x46\x86\xb4\xd9\xb0\ -\x06\x03\xfa\xa7\xa5\x21\x24\xc4\xae\x09\x5b\x2c\x16\xec\xdc\xb9\ -\x53\xa1\xec\xf1\xfb\x10\x51\x64\x8d\x3b\x7d\xea\x34\x06\x0e\x1c\ -\x24\xed\x5b\xa2\xb5\xc2\x51\xd0\x4d\x49\xe9\xe4\x79\x1c\x28\xc5\ -\xdf\x7f\x9f\x44\x76\x76\x96\xf4\x99\x61\x18\xe4\xe7\xe7\x6b\xea\ -\xd7\x75\xbd\x7a\xa1\x59\x5c\x33\xe1\x3d\x7c\x76\xa9\xdd\xbb\x77\ -\xa3\xc6\x43\xbd\x25\xaa\x71\xf8\x23\x22\x23\x71\xed\xb5\xd7\x49\ -\xf4\x60\x19\x06\xad\x92\x92\xb0\x65\xf3\x66\x49\xc8\x27\x84\xa0\ -\x45\x62\x22\x3a\x77\xea\xa4\xc8\x3e\x77\x2e\x33\x13\xa7\x4e\x9d\ -\x52\xe4\xbd\x97\xea\x5a\x09\x6d\x25\x84\x41\xae\x4a\x92\x8a\xce\ -\xa9\xa9\x68\xda\xb4\x19\x18\x22\xf3\x55\x15\xd2\xd6\x11\x6a\x3f\ -\xf1\xfd\xe3\xf0\x21\x64\x64\x66\xf2\x42\x83\xa3\xa0\x42\x39\x50\ -\x00\x15\x15\x95\x3e\xf3\x5d\x41\x41\x01\x36\x6d\xda\x64\x1f\x57\ -\x86\x68\xe0\x7b\x22\x33\xce\x29\x4f\x50\x63\x63\xa2\x31\xf0\xfa\ -\x41\x12\x9d\x58\x86\x45\xb3\xe6\xcd\x82\x67\x25\xe1\x1c\x35\x5f\ -\xa2\xfa\xd9\x5e\xd2\x98\x04\x4e\x3b\x77\xf7\x5a\xa7\x83\x2a\xe1\ -\xe4\x9a\x52\xd5\xe5\xcc\xed\x73\x69\xc3\x1b\x8a\x4e\x9e\x3c\x85\ -\xb3\x19\x99\xd2\xc9\x39\x01\x41\xbb\xf6\x57\x61\xc4\x88\x61\x7e\ -\x6d\x07\x21\x04\x11\xe1\xe1\x18\x3c\x68\x00\xaa\xaa\xaa\x70\xe6\ -\xf4\x59\x69\x7c\xff\xfe\xeb\x24\x4e\xa6\x74\x44\x72\x72\xbb\x80\ -\x8b\xa6\x95\x55\x55\x58\xb4\xe8\x2d\x44\x45\x46\x22\x26\x36\x16\ -\xfd\xfa\xf5\x03\x6b\x34\xda\x2d\x0b\x42\x03\xcf\x66\x64\x60\xc9\ -\x92\x25\x78\xe2\x89\x27\xd0\xa6\x4d\x6b\x10\x10\x74\xed\xda\x05\ -\xe9\x1b\xff\xe7\x95\x18\x2e\x8e\xf7\x67\x9f\x7d\x8e\x95\x2b\x57\ -\xa2\x56\x38\x39\xa5\x9c\x15\x23\x47\x8c\x40\x74\x74\xb4\xe6\xa7\ -\xc9\xe3\x1e\x19\xc1\x74\x65\x34\x1a\x31\xed\xce\x29\x98\x33\x67\ -\x0e\xca\x2b\xab\xb0\xe6\xcb\x75\x28\x2b\x2d\xc1\x4b\x2f\xbe\x84\ -\x50\xb9\xc2\x2b\x25\x80\xa1\x20\x84\x4a\xeb\x21\x05\xc5\x2f\x9b\ -\x36\x63\xd6\xcb\xb3\x50\x5d\x5d\x0d\x86\x00\x83\xaf\xbf\x1e\x29\ -\x1d\x3b\x0a\xef\xe1\xd7\x4b\x8f\xe5\xbc\x28\xc5\x1f\x47\x8e\xe2\ -\x7f\xff\xfb\x1f\xb6\x6e\xdd\x82\xc7\x9f\x78\x1c\x63\x46\x8d\x96\ -\xde\x2b\xae\xd7\x84\xda\xd0\xa4\x69\x53\x44\xc7\xc4\x4a\xfc\xa8\ -\x3c\xcb\x21\x6e\x27\x13\x71\xfa\x97\x4c\xef\x73\xca\xee\x69\xcf\ -\x92\x18\x1d\x13\xdb\xe8\x32\xa1\xe9\xd0\xd1\xd8\x8f\x01\x55\x16\ -\x0a\x07\xb5\x40\x99\x7d\x56\xac\xb3\xa9\x59\x1e\x70\x11\x83\x4c\ -\xbd\x6c\x9b\xe4\xf9\x25\x5e\xae\x11\xfe\x61\x0c\x70\x9d\x22\xda\ -\x40\x2f\x99\x3b\x6f\x1e\xd6\xaf\x5b\xa7\x1c\x0c\x4e\x5b\xf6\xbb\ -\xbb\xef\x9e\xaa\x30\xe9\x85\x85\x85\x23\xe3\xec\x19\x34\x6b\x66\ -\x17\x48\x4b\x8a\x8a\x31\x72\xd4\x68\x50\x8e\xb3\x1b\x09\xa9\xf3\ -\xba\xdf\x2f\x2d\x0d\xdb\xb6\x6e\xb5\x0b\xec\xf0\xfd\xb4\x9f\x02\ -\x58\xf2\xce\x3b\x58\xb6\x6c\xa9\x62\x33\xd6\xda\xaf\x4f\x3e\xfe\ -\x50\xf1\xb9\xaa\xba\x1a\x9d\x52\x3a\x23\x2b\x2b\xd3\xed\x76\xa5\ -\xb5\xb5\x9d\x3a\x75\xc6\xa6\xcd\x9b\xc0\xc8\xfa\xb8\xe1\xab\x0d\ -\x18\x31\x72\xb4\xb0\x71\x51\x81\xbe\x77\xe3\x3f\x1f\x7d\xa4\x98\ -\x44\x9f\x7f\xfe\x05\x5e\x7a\xe9\x25\x99\x5a\x0b\x55\xe9\x52\xad\ -\xaf\xaf\xcd\x9b\x87\xf1\x13\xc6\xdb\x33\xc3\xa9\x6c\xe6\xb5\x16\ -\x0b\x52\xbb\x74\x45\x46\xc6\x59\xc7\x7d\xd5\x6f\x07\x8d\xbf\xfd\ -\xf6\x1b\x46\x8e\x1a\x55\x37\x46\x97\x29\x84\xcb\x97\x2f\xc3\x7b\ -\x4b\xdf\xab\x13\xcf\xe8\xb8\xdc\x16\x37\x15\xbe\xdb\xb5\x47\x61\ -\x55\x8c\x8e\x8e\xc2\xb0\xa1\x83\xeb\xed\x7d\x46\xa3\x11\x83\x07\ -\x0f\x44\x61\x41\x21\x8a\x8b\x4b\xa4\xeb\xbf\xef\xda\x8b\x76\x6d\ -\xdb\x04\xdc\x7d\x29\x2b\x2b\x0b\x5f\x6f\xd8\xc0\xa7\xf0\x27\x04\ -\x51\xd1\xd1\x92\x07\x80\xb8\x67\x7f\xfb\xdd\x77\x38\x78\xf0\x20\ -\xca\xcb\xcb\x51\x51\x51\x81\x65\x4b\x97\x4a\xed\x0e\x0b\x0b\xf3\ -\x7a\xd8\x77\x6c\xdf\x81\x95\x2b\x57\x2a\xae\x77\xeb\xd6\x0d\xb3\ -\x66\xbd\x5c\x87\x9e\xd8\x05\xfc\xe1\xc3\x87\x22\x2c\xcc\x8c\x99\ -\x33\x9f\x47\x59\x55\x25\x7e\xf8\x69\x23\xaa\xaa\xab\xf1\xda\xdc\ -\x79\x30\x0b\x8a\x11\x71\x3e\x6a\x01\x00\xac\x5f\xbf\x01\x0b\xde\ -\x78\x43\x52\xd6\x6e\xbc\xf1\x46\xcc\x7a\xe9\x65\x37\x87\x02\xae\ -\x5b\xf4\x9f\x8f\xfe\x83\x1d\x3b\x77\x00\x94\xe2\xeb\x0d\x5f\x63\ -\xd4\xc8\x51\xc2\xde\x46\x14\xcf\x9b\x3a\xed\x1e\x4c\xbe\xe3\xb6\ -\x06\x51\x90\xa9\x10\x53\x64\xb3\x71\xfa\x1a\xa4\x43\x87\x0e\xaf\ -\x37\x6e\x46\x7d\x59\xa7\x4a\x7f\x78\x38\x7d\xf4\x8b\xd0\xd0\x20\ -\xa2\x1d\xe1\xb7\x13\x8e\xb3\x81\xe3\x6c\xbc\xe2\xc2\x69\x5f\x30\ -\x29\xa5\xd2\x6f\x28\xc7\x81\x93\x14\x1f\x25\x6c\xd6\x5a\xe1\xf9\ -\xc2\x3b\xa8\xec\x4f\xfc\xad\xcd\x06\x96\xe1\xe3\x4c\x3c\xfd\x69\ -\x6a\x9b\xcd\x66\x6f\x93\xbb\x7e\xa9\xb9\x8c\x38\xbe\x13\xce\x2e\ -\x8d\xaa\xc9\x5f\x89\xb6\x84\xdc\x0c\x21\x60\x85\x5a\x17\x7c\xda\ -\x6a\xfe\x3d\x94\xe3\xf8\xec\x4c\x62\x7b\x9d\xb2\x19\xf2\x56\x25\ -\x71\xbc\xa4\xbe\x39\xd0\xd2\x55\x5f\x19\x86\x91\xfe\x5c\xd2\x56\ -\x68\x87\x9c\x6e\xae\xc6\xac\x4e\x2c\xae\xf6\x5c\x6f\xfe\x24\xbe\ -\xb1\x82\x65\x0d\x0a\xde\xf0\x86\x4f\x02\x02\xa2\x4d\xb1\xa4\x81\ -\xfa\x23\xc2\x9f\xc3\x75\xe7\x7e\x50\x17\x7e\x9f\x9e\x56\x44\xfe\ -\x7b\x42\xea\x96\xb0\xc3\x1b\xfc\xf9\xd7\xdf\x28\x28\x28\x92\x6a\ -\x78\x51\x4a\xd1\xbf\x7f\x5f\x44\x44\x84\x6b\x1d\x0e\xef\x87\x99\ -\x10\xc4\x44\x47\xa3\x4f\x9f\x5e\x0a\x05\x28\x3f\xff\x12\x4e\x9f\ -\xc9\x08\x38\x1b\x66\x67\x65\xf1\x16\x17\x86\x80\x21\x40\x62\x8b\ -\x16\xfc\xd0\x30\x0c\xc0\x30\x60\x0d\x06\xec\xfc\xf5\x57\x94\x95\ -\x95\x81\x52\x8a\x7d\xfb\xf6\xe1\xcb\xf5\xeb\x3d\xd6\x41\x73\x1e\ -\x6d\xfe\xbf\x53\x27\x4f\x62\xf6\x2b\xb3\x61\xa9\xad\x85\xa5\xb6\ -\x16\x94\x52\x24\x25\x25\x61\xc1\x1b\xf3\xbd\x53\xb0\xa8\xdd\x93\ -\x80\xb7\x18\x29\xd7\xed\xb4\xb4\x7e\x78\xfb\xed\xb7\x11\x13\x19\ -\x09\x70\x14\x47\x8f\x1d\x47\x7e\x7e\xbe\x43\xd5\x40\x7b\x7c\x0e\ -\x05\x90\x77\xf1\x22\xde\x5f\xf1\x3e\xac\xb5\x56\x10\x00\x37\x8e\ -\xbd\x11\xb3\x5f\x7e\x59\x78\x36\xff\x26\x8b\xc5\xa2\x64\x6f\x97\ -\x3e\xf9\x04\x63\xc7\x8e\xe5\x6f\x20\x0c\x0e\x1f\x3e\x6c\xb7\xee\ -\x83\x57\x40\xa9\xf0\x62\x03\xcb\xc2\xc0\xb2\x60\x35\xfe\x31\x6e\ -\xfe\xdc\xfe\x46\xa8\xab\xc4\x30\x2c\x8c\x46\x23\x8c\x42\x5a\x71\ -\x1d\x3a\x74\x34\xd4\xa6\xef\xb0\x3d\x3a\x6c\x80\x4e\xbb\x26\x1f\ -\x68\x29\xad\x9f\x1e\xe5\x02\xc7\x7d\x9b\x78\xb0\x6a\xfb\xa0\xb8\ -\x5c\xfe\xf6\x65\x5a\xaf\x43\xef\x52\xe9\xd0\xa8\x9b\xd4\x59\x20\ -\xd1\xf6\x5e\xe2\x63\x3f\x89\xcf\x34\x55\xcb\x63\xa1\xe6\xce\xe0\ -\xd4\x07\xea\x8f\xf1\x71\xdf\xdf\xc6\xb8\x59\xea\xc6\x21\x7d\xe9\ -\xf1\x74\x78\x73\xf4\xe8\x71\xc5\xb5\xc4\x84\x16\x48\x49\xe9\xd0\ -\x20\xef\xef\x98\xd2\x01\xcd\xe3\x9a\x2b\x7a\xff\xc7\x91\x63\x01\ -\x1f\x83\xec\xec\xf3\xb2\x20\x7c\x3e\x83\x9e\xe3\x4a\x3c\xf9\x8e\ -\x3b\x64\x74\x04\xde\x7b\x6f\x29\xb2\xb2\xb3\xbd\x7e\x57\x61\x61\ -\x11\x9e\x7b\xee\x39\x94\xc8\x2c\x66\x31\x31\x31\x58\xb8\x70\x01\ -\x9a\x37\x6f\x5e\x27\xee\xa1\x94\x43\x79\x45\x05\x2a\x2a\x2a\x50\ -\x51\x51\x89\xca\xca\x2a\x74\xea\x94\x82\xf9\xf3\xe7\xa3\x5b\xd7\ -\x54\x2c\x79\x7b\x31\x9a\x36\x6b\x86\xaa\xca\x2a\x54\x55\x55\x49\ -\x8a\x1a\x40\x51\x53\x5d\x8d\xca\x8a\x0a\x44\x84\x87\xe3\xf5\xd7\ -\xe7\x21\x32\x2a\x12\x63\xc7\xde\x88\xa7\x9f\x79\x1a\xd5\x35\x35\ -\xa8\xa9\xa9\x41\x65\x65\x15\xaa\x2a\xab\x9c\x36\x2a\x77\x71\xca\ -\xfd\xfb\xf7\x43\xf3\x66\x7c\xbf\xac\x56\x2b\xbe\xf9\xe6\x1b\xb5\ -\x96\x3b\xfd\xf6\xd2\xa5\x4b\xc8\xcf\xcf\x47\xfe\xa5\x4b\xb8\xa4\ -\xf2\x57\xa0\xf6\x57\x20\xfe\x15\xa8\xfe\x15\x16\x16\xa0\xa6\xa6\ -\x46\x5f\x74\x74\xe8\xb8\x12\x36\xbc\x7a\x84\xc1\x55\xbf\x9c\xd2\ -\x86\xd7\x13\x0d\xeb\xdd\xe7\x9e\x08\x12\xba\xac\x96\x81\xcf\xcf\ -\xa1\x62\x56\x31\xe2\x24\xd8\x33\x2c\x4f\x4a\xd5\x34\xdf\x42\x8c\ -\x88\x9a\x52\xa0\xbe\x81\x38\x8b\xf5\x6a\xa7\x96\x5a\x4f\x32\xa9\ -\x78\x2f\x71\xad\x36\x50\x47\xe9\x9b\x52\xe9\x74\x59\xfe\x1e\x8e\ -\x6a\x0b\x1f\x27\xae\xe6\x8c\xdc\x17\x94\xc8\x3c\x49\xfd\x14\xc8\ -\xef\x89\x6e\xb5\xc2\x49\x68\x63\x73\x41\x33\x19\x43\xec\x07\xb7\ -\x24\x20\x49\xcd\xbc\x1b\x00\x4f\x0d\x0c\xda\x0e\x38\xb6\x33\xc0\ -\xb1\x4f\x1a\x51\x51\x51\x89\x9c\x9c\x5c\x45\xc1\xe7\x6e\xd7\x74\ -\x6d\xb8\x8d\x84\x65\xd1\xad\x5b\x57\xe4\x09\x05\x5e\x39\x42\x91\ -\x79\xee\x1c\xca\xca\xca\x11\x19\x19\x11\x30\xba\xe4\xe4\x64\x83\ -\x10\x3e\x86\x31\x3c\x3c\x1c\x71\xcd\x9b\x2b\x32\xbb\x71\x36\x2b\ -\xae\xee\xd6\x0d\x93\x27\x4f\xc1\x67\x9f\x7f\x0e\x02\x8a\x8a\xf2\ -\x72\xbc\xf6\xfa\xeb\x78\xef\xdd\x77\x25\xeb\x97\x27\x36\xad\xa9\ -\xb1\xe0\xa5\x17\x5f\xc4\xd9\x8c\x73\xd2\xdd\x26\xa3\x11\x73\xe7\ -\xcc\x41\x87\xe4\xe4\x3a\xed\x8d\x00\x50\x5e\x5e\x8e\xc1\x83\x87\ -\xd8\x93\x35\x11\x25\x5f\x4e\x99\x32\x59\x58\xd7\x84\x7a\x46\xd6\ -\x5a\x49\xc9\x9b\xff\xc6\x02\xbc\xf1\xe6\x22\xfe\xba\xe0\x56\xf6\ -\xdf\xef\xbe\xc3\x7f\xbf\xfb\x4e\x4a\xfc\x20\xc6\x3c\x8a\xd6\x71\ -\x7b\xb9\x42\xd7\x3d\x0f\x0b\x0b\xc3\xc8\x91\x23\xf1\xe9\x67\xab\ -\x41\x08\x83\x8d\x3f\xff\x8c\x87\x1f\x7e\x18\x94\xa3\xf6\xd8\x01\ -\x22\xcb\xc4\x07\xbe\xd8\xef\xf8\xf1\xe3\x61\x15\xb2\xdb\xf9\x3c\ -\xfd\xa5\xfa\x88\x9c\xd4\xee\x47\x1f\x7b\x0c\xf7\xdf\xf7\x4f\x5d\ -\x38\xd5\xa1\x23\x20\x7b\x3f\x75\xde\xe0\xa9\x7b\xf1\xc0\xe9\x76\ -\xbf\x5b\x0e\xfc\xa0\x14\x5d\x86\x23\x85\x5e\xbd\x7b\xc1\x2a\x28\ -\x2b\x7c\x26\x1e\xd9\x80\x11\x27\xbd\xc7\x2d\xc2\xc2\xc2\x60\x32\ -\x99\x14\xd7\x8c\x26\x13\x26\x4d\x9c\xc4\xaf\xd3\x84\x08\xbc\xa1\ -\x54\x1e\x08\x21\xe8\xd4\xa9\x93\xd3\xf3\xb2\xb3\xb2\xb0\x73\xe7\ -\x4e\x7b\x31\x57\x00\xc9\xc9\xc9\xe8\xd3\xbb\xb7\xe2\xbe\xa3\xc7\ -\x8e\xe1\xe8\x91\x23\x76\x21\x9f\x10\x84\x85\x47\xe0\xe6\x5b\x6e\ -\x55\xb8\xc0\xfd\xf6\xdb\x6f\xc8\xca\x3a\xa7\x50\x0a\xb6\x6c\xd9\ -\x8c\x8b\x17\x2f\x2a\x36\x93\x31\xa3\x47\x2b\x8a\xb2\x1a\x58\x16\ -\x63\x6f\xbc\x91\x4f\x40\x21\x08\x0d\x21\x2c\x8b\xef\xbf\xfb\x96\ -\x77\x35\x11\x94\x98\x8a\x8a\x0a\x4d\x0a\x8c\xda\x1d\x89\x89\x89\ -\xb8\x79\xd2\x2d\x42\x2c\x2e\xdf\x8e\xb8\x66\xcd\xb1\xe6\x8b\xcf\ -\xf9\x38\x08\x21\x40\xf7\xd0\xe1\x43\x4e\xbf\xed\xd2\xf5\x6a\x74\ -\xea\xd4\xc9\xae\x94\x52\x8a\xdd\x7b\xf6\x20\x33\x33\x43\xf5\xdd\ -\xf2\xb9\x90\x9e\xbe\x11\x45\x85\x05\xbc\x81\x96\xaf\xad\x88\xb4\ -\xb4\xfe\xb8\xae\x67\x4f\x3e\x6d\x36\x78\xf7\xca\x75\xeb\xd7\x39\ -\x3d\xeb\xa6\x9b\x26\x82\x35\x18\x54\x02\x84\xdd\xea\xce\xc8\xc9\ -\xce\xc1\xaf\xbf\xed\x54\x7c\xd7\xa6\xcd\x55\xe8\xd9\xab\x17\xaf\ -\x44\xc3\x39\x3d\x39\x5f\x3d\x84\xe2\xe0\xc1\x83\x38\x79\xf2\x6f\ -\xc5\x77\x3b\x77\xfe\xea\x34\xcb\x07\x0d\x1a\x84\x96\x2d\x5b\xea\ -\x8b\x71\x70\x2e\x3b\x0d\x8a\x73\x59\xd9\x92\xa0\x09\x00\x26\x93\ -\x09\xed\xda\x5d\xd5\x70\xdd\x25\x04\xed\xda\x5d\x05\x53\xa8\x09\ -\x35\xb2\x54\xe0\x59\xd9\xd9\x48\xed\xdc\x29\x60\xc3\x90\x99\x69\ -\x8f\x91\x6c\xde\xbc\xb9\xd3\xda\x2d\x2a\x18\xff\xf7\xc0\xfd\xd8\ -\xb6\x6d\x3b\x72\x72\xf8\xc4\x35\x7b\xf7\xee\xc5\xfa\xaf\xbe\xc2\ -\x6d\xb7\xde\xaa\xe9\x3d\x8b\xde\x7c\x13\xbb\xf7\xec\x95\x1d\x62\ -\x18\xf1\xc4\xf4\x27\xd0\xbf\x7f\x5a\xdd\x4e\x0d\x83\x1c\x37\x8e\ -\x1b\x8b\x35\x6b\xbe\x80\x8d\xb3\xa1\xb8\xa8\x18\xdb\x77\xec\x40\ -\x52\x62\x92\x9b\x3e\xd0\xcb\x62\xbe\xe9\xd0\xa1\xe3\xf2\x9c\x84\ -\x06\xbf\xad\xc7\x3e\x9e\xfc\x92\x06\x18\xa6\x27\x67\x4c\x07\x9d\ -\xfe\x84\xdf\x36\x7f\x47\x44\x45\x45\x61\xed\xda\x2f\xbc\xfa\xbd\ -\xa8\x58\xec\xde\xb5\x1b\x77\xde\x79\x97\x42\x85\xfa\xe7\x3f\xff\ -\x89\xde\xbd\x7a\x29\xee\x5f\xbf\x6e\x3d\xe6\xce\x9b\x6b\x3f\xc9\ -\x63\x19\x2c\x5c\xb0\x10\x0b\x16\xbe\x21\x6a\x3f\x00\x80\xdb\x6e\ -\xb9\x4d\xa1\x14\x81\x52\xbc\xfe\xfa\xbf\xec\xb1\x28\xc2\xc9\xe0\ -\x9e\x5d\xbb\x71\x6d\xcf\xeb\x24\xfa\x1b\x8d\x46\x2c\x5f\xf6\x9e\ -\x42\xe1\x29\x2d\x2d\x45\xab\xd6\x6d\x50\x5e\x56\x2a\x2b\x20\x4e\ -\x7d\x1e\x87\x3e\x7d\x7a\x3b\xd1\xe9\x83\xf7\xdf\xc7\x94\xbb\xee\ -\xf6\x18\xbf\x33\xf9\x8e\x3b\x30\x73\xe6\x73\x0a\xfa\x4f\x9d\x7a\ -\x0f\x56\xaf\xce\xf0\xf8\xee\x17\x5f\x7c\x11\x07\x0f\x1d\x94\x29\ -\xc5\xc0\xf1\xe3\xc7\x90\xdc\x21\x59\x52\xce\xaa\xab\xaa\x90\xbe\ -\x31\x1d\xa5\xa5\xa5\xd2\xef\xa2\x63\x62\xb0\x5e\x50\x94\xbc\xb5\ -\x2c\x7d\xbd\xe1\x6b\xfc\xfa\xdb\xaf\x8a\x99\x34\x64\xe8\x10\x7c\ -\xf4\xe1\x87\xee\xa7\x11\xa5\x78\x72\xc6\x53\x58\xec\xa0\x14\x2d\ -\x5b\xb6\x0c\xcb\x96\x2d\xb3\x0b\x72\xac\x01\x5f\x6f\xd8\xd0\x88\ -\x95\xa2\x00\x15\x9e\xf5\x64\xf8\xf1\x97\x05\x8b\x2a\xa7\x4b\x7d\ -\x1b\x26\x73\xcf\xe7\x2a\xf2\xbb\x24\x24\xc4\xc3\x6c\x0e\x6d\x50\ -\x12\x87\x99\xcd\x48\x48\x88\xc7\x99\xb3\x19\x52\x43\xce\xe7\x5e\ -\x08\xa8\x52\x24\x77\x83\x6b\x9d\xd4\x4a\x1a\x1b\x4e\x5c\x47\x85\ -\x41\x8a\x88\x8c\xc0\x33\x4f\x3f\x85\xe9\x33\xa6\x0b\xb7\x30\x58\ -\xba\x6c\x39\xfa\xf6\xe9\x83\x36\xad\x5b\xf3\xf1\x31\x50\xb7\x44\ -\xaf\x59\xb3\x06\xeb\xd6\x7f\x25\x8c\x33\xbf\xbe\xdc\x7a\xdb\xad\ -\x98\x38\xf1\x26\x9f\x2d\xd2\x04\xc0\xb8\xf1\x37\xa2\xfb\xb5\xd7\ -\x38\xf3\x94\xda\x1e\x2a\xcb\x2e\x67\xb5\x58\xf0\xd1\x87\xff\x01\ -\x00\xd8\x28\x87\x81\x03\x06\xa0\x4b\x97\x2e\x52\x5c\xa7\xab\x43\ -\x40\xe1\x4c\x0f\x94\xa3\x30\x08\x2e\xc6\x9e\x52\xb8\xb7\x6f\xdf\ -\x0e\x5d\xba\x74\xc5\xe1\x3f\xf8\x83\xac\xef\xbf\xff\x01\xf7\xdd\ -\xfb\x4f\x7b\x9d\x23\x17\x73\x43\x6c\x46\x6c\x6c\x13\x84\x86\x86\ -\xaa\xc4\xd3\x52\xd5\x8e\x12\x10\xc9\xeb\x83\xe3\x6c\xc8\xbd\x70\ -\x81\xef\xa7\x0d\x7a\xd9\x00\x1d\x3a\xae\xa0\x2d\xbd\xbe\xfa\x10\ -\x50\x4b\x91\x7e\xb8\x03\x40\x45\x19\x20\xea\xd2\xb2\xf2\x23\x47\ -\x5d\x0a\xd5\x1a\xb5\x33\xcd\x23\x24\x56\x1b\xf7\x6e\x6c\x89\x1f\ -\xdb\x01\xf5\x62\xb6\x5a\xfb\xea\xe2\x3e\x42\x18\xe5\x77\xb4\x7e\ -\xf9\x93\xd1\x9a\x40\x43\x63\xbf\xf4\x38\x23\x1d\x22\x0a\x0a\x0a\ -\x15\x52\x6e\x7c\x7c\x5c\x40\xda\x91\x90\x10\x8f\xb3\x67\x33\xa4\ -\xa9\x94\x9f\x7f\x29\x60\x34\xa9\xac\xac\xb2\x97\x5e\xa0\x14\x49\ -\xad\x92\x9c\xe6\xb5\x7c\xa6\x0d\xbc\x7e\x00\x46\x8f\x1a\x8d\x9f\ -\xd2\x7f\x02\x00\x94\x95\x95\xe3\x8d\x85\x6f\x62\xc9\xdb\x8b\xc0\ -\xb2\xea\x5b\xe5\xaf\xbf\xfe\x86\xc5\x8b\x97\x28\xae\x0d\x19\x32\ -\x18\x8f\x3c\xf2\x70\x9d\xdb\x3f\x6a\xd4\x48\xa7\x02\xda\x9e\x33\ -\xc2\x53\x54\x55\x56\x4b\x4a\x11\x08\x83\xeb\x07\x0d\xc2\xa4\x89\ -\x37\x29\x15\x0b\x0d\x6b\x0f\xd1\x50\xbc\x9b\x21\x04\xa3\x47\x8f\ -\x92\x94\xa2\xfd\x07\xf6\x63\x8c\x98\x75\xd3\xd5\x5e\x40\xec\xfe\ -\xbf\x2f\xcd\x7a\x19\x83\xaf\x1f\xa8\x79\xad\x15\x95\x26\xab\xe0\ -\x1e\x38\x61\xc2\x4d\xb8\x90\x97\xa7\x0b\x14\x3a\x74\xe8\xf0\x8b\ -\x52\x62\xf0\xe7\xc3\x82\x59\xb1\xac\xef\x18\x12\x9f\x9f\x4f\x88\ -\x90\xe9\x88\x93\x3e\x13\x95\x58\x1b\x02\xe2\x64\x4d\x31\x30\x8c\ -\xac\x1c\x14\x71\x4b\x53\xc9\x3d\x4f\x38\xc1\x63\x88\xfa\xd6\x28\ -\xaf\x17\xa4\xe8\x92\xbf\x62\x7e\x1c\xe8\xa4\x56\x58\x50\x4d\xf2\ -\xe7\x43\xc3\x18\x05\x5d\x88\x3c\xfd\xab\xcc\x07\x9e\xa8\x30\xa7\ -\xd8\x7f\x1b\x67\xb5\xb7\x43\x7a\x86\x6b\xf6\xb5\x5a\x6b\x61\x34\ -\x9a\x1a\x8c\x5f\xa8\xc6\x99\x21\xf1\x4b\x83\x1f\x61\xf8\x29\xc6\ -\xc6\x4f\x96\x18\xed\xd2\x94\x8b\xcf\x54\x5b\xbb\x68\x90\x0b\x5c\ -\xa5\xe5\x15\x00\xa8\x94\xe0\x24\x36\x36\x3a\x20\xed\x88\x89\x89\ -\x56\xd0\xb1\x5c\x70\xb7\x0d\x44\x0c\xdf\xf9\xf3\x39\xa8\xa9\xb1\ -\x88\x9a\x00\x5a\xb5\x6e\x25\x0d\xb9\x18\xdf\xc9\x71\x9c\x14\x2b\ -\x0a\x00\x33\x66\x4c\xc7\xae\xdd\x7b\x50\x5c\x52\x8a\xa8\xa8\x48\ -\xf4\x4f\xeb\xcf\xbb\xce\xaa\xb0\xdf\x99\x33\xa7\x31\x6b\xd6\xcb\ -\xa8\xb1\x58\xa4\x0e\xa7\xa6\xa6\x62\xf6\xac\x59\x30\x86\x84\xd4\ -\xa9\xed\x65\x65\x65\x76\x45\x57\x85\xdf\xdd\x51\xb3\xaa\xaa\x1a\ -\x56\xc9\x12\x46\x71\x29\x3f\x1f\x67\xce\x9e\x55\xac\xb7\xae\x86\ -\x43\xee\x9e\x4d\x00\x98\x4c\xa1\x48\x48\x88\x77\x39\x7e\x1c\x05\ -\x06\x0f\x19\x82\x77\xdf\x7d\x17\x95\x55\x95\xb0\x5a\x39\xfc\xf8\ -\xbf\x1f\x65\xf4\xb5\x39\x53\x4e\x16\x5c\xca\x32\xac\x22\xd6\x56\ -\xbb\x72\xc4\x38\xad\xed\x44\xd7\x8a\x74\xe8\x08\xa8\x42\xd1\xe0\ -\x52\x7e\x3d\x3c\xde\xa0\x8f\x64\x90\x30\x13\x75\xd2\x03\x1c\xc6\ -\x9e\xba\x54\x18\x3c\x3e\xd0\x17\x25\xae\xa1\x5c\x11\xb4\x5a\x8a\ -\x08\xf1\xf9\xb7\xaa\x59\xef\x54\xe8\x43\x7c\x4d\x2b\xe8\x4e\xb8\ -\xa8\xc7\x59\xde\xb0\x42\x80\xee\x9a\x12\xcc\xb0\x58\x2c\xa0\x42\ -\x54\x1a\x00\x84\x86\x9a\x03\xd2\x0e\x93\xc9\xe8\xc4\x29\x1c\xa5\ -\x60\x1b\x58\x29\xe2\x95\x96\xb3\x8a\xa9\xdc\xba\x55\x6b\x8f\x73\ -\xb3\x79\xf3\x66\x78\xfc\xf1\xc7\xb1\x75\xcb\x56\xcc\x98\xf1\x04\ -\x5a\xb5\x52\x77\x4f\x2d\x2a\xe2\x33\xcd\x15\xc9\x32\xcd\x25\x26\ -\x26\x62\xfe\xfc\x7f\xf9\x25\xb1\xc4\x86\xaf\xff\x8b\xb7\x17\x2f\ -\x06\x43\xec\xb1\x86\xaa\xb5\x11\x1d\x3f\x11\x67\x15\x6e\xc5\x8a\ -\x15\x58\xf1\xfe\xfb\x11\x63\x0b\xfa\x00\x00\x20\x00\x49\x44\x41\ -\x54\x7c\x8a\x6f\xea\x7e\x65\x13\x0f\x65\xc4\xf5\x36\xa5\x53\x67\ -\x7c\xfe\xe9\x2a\xb7\x6d\x6d\xd6\xac\x29\x7a\xf7\xe9\x8b\xed\xdb\ -\xb6\x01\x04\x38\x79\xf2\xb4\x9b\x65\x94\x38\x28\x7f\xa5\x28\x2e\ -\x2e\x56\x1e\xbb\xb8\xe0\x15\x22\xdf\xda\x08\x81\xd5\x6a\x95\xdc\ -\xf4\xa8\xee\x3a\xa7\x43\x47\x60\x71\x99\xcc\x41\xff\x29\x45\x41\ -\x9a\x4d\x8a\x02\xf8\xe1\xfb\x1f\xf0\xd7\x5f\x7f\xaa\xb6\x8f\xb8\ -\x18\x4f\x45\x92\x34\xe1\x02\xa5\xda\x95\x18\xe9\x46\x3e\x7d\x1b\ -\x28\x05\x5a\xb6\x4c\xc2\x6d\xb7\x29\x03\x77\x93\x3b\x76\xc4\x23\ -\x8f\x3c\x26\x25\x1f\x20\x00\xa2\x23\xc3\xb1\x68\xd1\x22\xc5\x4e\ -\xb0\x67\xef\x5e\xb7\x8a\xb9\xf8\xef\x31\x37\xdc\x80\xc4\x96\x2d\ -\xed\xf5\x84\x28\xc5\x86\x0d\x1b\x90\x9d\x93\xad\xfa\x63\xb1\x1b\ -\x56\xab\x15\xab\x3e\x59\x85\x92\x92\x22\x5e\xc8\xaa\xe5\x2d\x2a\ -\xf2\x42\x87\x00\x60\x34\x9a\x70\xff\xfd\xf7\x83\x35\x18\xa4\xc7\ -\x14\x16\x14\x62\xb5\xc3\xc6\x99\x9b\x9b\x8b\xc5\x6f\xbf\x0d\x4e\ -\x46\xb4\x76\xed\xda\x62\xc2\x84\x09\x8a\x8d\xaf\x73\x6a\x67\x3c\ -\xfc\xf0\x23\xfc\x09\xa6\x62\x30\xf8\xf6\x8b\x3e\xe4\xbd\x7a\xf5\ -\xe2\xe9\x28\x23\xf6\xf0\xe1\xc3\x11\x1d\x1d\xad\xa8\xe1\x91\xac\ -\x92\xe9\xe9\x96\x5b\x6f\x41\xbf\xb4\x34\xa9\x0a\x3a\x61\x80\xff\ -\x7e\xf3\x0d\x18\xd6\x20\x25\x5f\xe0\x38\x4e\x38\xf1\x75\x8f\xc2\ -\xc2\x42\xac\x5a\xb5\x5a\xb2\x38\x01\x04\x2d\x5a\xb4\xc0\x1d\xb7\ -\xdf\xee\x51\xd9\x24\x2a\xdf\xef\xd9\xb3\x17\x3b\x77\xee\x90\x14\ -\x5f\x86\x51\x4f\x34\x11\x5c\x33\xca\x8f\xeb\xa7\xaf\xeb\x45\x03\ -\xaf\x33\xa4\xbe\xb2\xe3\xf8\x71\x43\x22\x00\xc0\x89\x07\x01\x81\ -\x69\xa8\xcd\x6a\x73\xc8\xee\xc6\x05\x4c\x60\xcd\xc8\xc8\x94\x0e\ -\x93\x18\xc2\xa0\x55\xab\x56\x0e\x0b\xb9\xfa\xe1\xcb\x4d\xff\x18\ -\x87\x9b\xfe\x31\xce\xe5\x3d\x35\x35\x35\x98\xf5\xf2\xcb\x38\x2b\ -\xab\xc3\x14\x19\x11\x81\xf9\xf3\xff\xc5\xd7\x41\xf2\xc7\x70\x72\ -\x1c\xbf\x2e\x51\x02\x4a\x44\x85\x88\xba\x30\x6c\x12\x21\x23\x25\ -\x01\x38\x80\x80\x03\xe3\x60\x73\xe6\xcb\x07\x51\xb8\xb7\xf4\x12\ -\x69\xec\x38\x4e\xb9\xd6\xba\x5a\x05\x58\x81\xcf\x6e\xba\xe9\x1f\ -\x88\x6b\xde\x1c\x83\x87\x0c\x06\x43\x80\x07\x1e\x78\x40\x3a\xb8\ -\x71\x5c\xf3\x38\x6a\xaf\x4f\xf7\xda\x6b\xaf\xc1\x60\x08\x01\x5c\ -\x28\x7d\x9e\x56\x9f\xca\x8a\x32\xd9\x37\xba\x62\xa4\x43\x47\xe0\ -\x40\x5c\x48\xd0\xfe\x96\x1e\x3c\xbe\x26\x48\x94\xa2\x20\x16\xe2\ -\x56\xaf\xfe\x14\xeb\xd6\x7d\x69\x3f\x07\xa3\x0a\x75\xc7\x3f\x3c\ -\xe0\x66\x9f\x11\xff\xd7\xb7\x6f\x3f\x27\xa5\xe8\x9a\x6b\xba\x61\ -\xf1\xe2\x45\xd2\xe9\x1e\x05\xb0\x7c\xe9\x52\x3c\xfa\xf8\xe3\x8a\ -\xcd\x5b\xab\x60\x71\xef\xbd\xd3\x9c\x36\xa0\x3f\xfe\x38\xe2\xac\ -\x14\x39\x34\xd7\x5a\x6b\xc5\x9c\x39\x73\x91\x95\x95\x29\x05\xb2\ -\x52\x15\x6d\x31\xd4\x6c\xc6\xa2\x45\x6f\xc2\x60\x30\x48\x9b\xdd\ -\x9f\xc7\x4f\x38\x29\x45\x99\x99\x99\x98\xf1\xd4\x93\x10\xed\x19\ -\x14\xc0\x0d\x63\x6e\x90\x94\x22\x11\x69\xfd\xfa\x21\xad\x5f\x3f\ -\x9f\xc8\x7f\xe7\x9d\x93\x71\xe7\x9d\x93\x9d\x84\x1a\x47\x3c\xf3\ -\xcc\xd3\xd2\xbf\xc5\x94\xdc\xa9\xa9\xa9\x92\x4b\x89\x44\x0b\x27\ -\x1a\x3b\xd3\x3c\xef\x42\x1e\x9e\x7e\xe6\x19\xde\x2d\x44\x88\xb5\ -\xea\xdd\xab\x97\xa4\x14\x79\xab\x4e\x6c\xdc\xf8\x33\x66\xcd\x7a\ -\xc9\x43\x3b\x74\xe8\xf0\x4e\x61\xb5\x68\x50\xf0\x1b\x62\x6b\x14\ -\x15\x92\x40\xe0\xf4\xe9\x53\xd2\xbf\xcd\x42\x12\x08\xd5\x43\x2c\ -\x2f\xb6\x81\x9a\x9a\x1a\x2c\x5e\xbc\x18\xbf\xff\xbe\x4b\x71\xfd\ -\x95\x57\x66\xa3\x4b\x6a\xaa\xdf\xda\xde\xbf\x7f\x1a\x9a\x34\x89\ -\x55\xb8\x33\xbb\xa5\xb9\x2c\x41\x81\xa5\xa6\x06\xaf\xbd\xf6\xba\ -\xf4\xdd\xd8\xb1\x63\xd1\xab\x67\x4f\xc1\x35\x5b\xd9\x61\xe2\xb4\ -\x0f\x2a\x95\xa9\x26\x4d\x9a\x68\x6b\x6f\x5a\x5f\xf4\x4f\xeb\x0b\ -\x00\x38\x22\xaf\x4f\xe5\x81\xb6\x7c\x4d\xa5\x2a\xef\xb8\x4a\x70\ -\x9b\x26\xa0\x5e\x44\x5b\xe9\xd0\xa1\x43\x87\x2f\x4a\x91\x78\x14\ -\xea\x58\xc5\xbd\x9e\xe4\xb4\x86\x30\x30\x11\x50\x17\x31\x18\xd4\ -\x3f\x8d\xd7\x70\x0f\x7f\x50\xc7\xa9\x6e\x66\x72\x77\x07\x4a\xc5\ -\xb4\xd1\xd4\xe3\x4b\xd4\x14\x00\xe7\x62\xa8\x04\xee\x2a\x0b\xd9\ -\xb7\x52\x2a\x9c\x4e\x0a\x39\xab\x89\xeb\x77\x2a\xb2\x04\x11\x22\ -\x58\x38\xf8\xfa\x18\x0a\x1f\x72\xca\xf3\x91\xbd\xba\x3a\xd5\xd4\ -\x07\x4d\xa4\xf7\x10\x0b\xe4\xea\xf9\x21\x42\x56\x25\x6d\x15\xeb\ -\xd5\x1c\xd4\x28\x40\x65\xa7\xdf\xc2\x78\x69\x6e\xb7\xe3\xcd\xd4\ -\xf7\x93\x74\xda\x98\x4f\x46\x49\x90\x2d\x18\x2e\x3d\x51\x69\xbd\ -\xae\x7f\xfe\x42\x64\x64\x24\xaa\xaa\xab\xa4\x7e\x94\x95\x95\x07\ -\x44\x1d\xab\xa8\xa8\x50\x5c\x31\x9b\xcd\x81\x49\x08\x42\x29\xfe\ -\x3e\x79\x52\x9a\xc1\x49\x2d\x5b\xc2\x10\x62\x90\x1d\x3c\xc8\xd7\ -\x65\xed\xf3\x36\x3d\x3d\x1d\xeb\xd6\xad\x93\x2c\xe0\x84\x30\x78\ -\xf4\xd1\x47\x30\x74\xe8\x10\xf7\xf3\xdc\xcb\xad\xa4\x43\x87\x64\ -\x74\xe8\x90\xec\xc6\x0d\x41\x39\x11\x88\xec\x40\xa5\xaa\xaa\x1a\ -\xf3\xe7\x2f\x00\x00\x58\x39\x0e\x3d\x7a\xf4\xc0\x84\x09\xe3\xa5\ -\xf5\x9a\x38\xa9\x3f\x2e\xea\xc5\x11\xa5\xea\x24\xbf\xe4\xaa\x55\ -\x47\x8f\x1d\xc3\x07\x1f\xbc\xaf\x98\x58\x6a\xc5\xb2\xc5\xb5\xab\ -\x45\x42\x0b\x44\x46\x45\x81\x80\x77\x73\x76\xb9\x1f\x08\xba\x1b\ -\x21\x44\x4a\xd4\x40\x39\x1b\x4e\x9e\x3c\x25\xec\x3b\xb5\xba\x62\ -\xa4\x43\x87\x0e\xa7\x7d\xc0\x5b\x79\x41\x8f\x29\x6a\x48\x39\x50\ -\x63\x9d\x9b\x7a\x93\x58\xdc\x5c\xd3\x1a\x9f\x42\x88\x8f\x1d\x0b\ -\xba\x2d\x8b\xf8\xed\xb7\x5a\x85\x3e\xe2\x66\xce\x36\x6c\xfb\x1b\ -\xc3\xfb\x74\x78\x83\xd8\xd8\x18\x5c\xcc\xcf\x97\x26\xf6\xa5\x82\ -\xc2\x80\xb4\xe3\xe2\xc5\x7c\xc5\xe7\x26\xb1\x31\x01\x49\x93\x58\ -\x59\x59\x69\xaf\xcd\x06\xa0\x4d\x9b\x36\x0a\x05\xc2\xf3\x02\xe9\ -\x8c\x13\x27\x4e\x60\xc1\x82\x85\x52\x01\x54\x00\x18\x33\x7a\x14\ -\xa6\x4d\x9b\xea\xb7\x76\xef\xd9\xbd\x1b\x96\x1a\x8b\x63\x95\x3b\ -\xaf\xb4\xf2\x6a\x59\x9d\x28\x50\x8a\xbf\xff\xfa\x0b\x5b\xb7\x6d\ -\x53\x2d\x3c\xee\x52\x90\x10\x0f\x9d\x64\xf7\x77\xe9\xd2\xc5\xa5\ -\xe5\xe8\xf7\x5d\xbb\xf0\xc9\xaa\x55\x38\xb0\x7f\x3f\x5f\x73\xce\ -\xcd\xaa\x41\x64\xd9\xe7\x9e\x7d\x6e\x26\x86\x0c\x1a\xe8\xbc\xcc\ -\x50\x17\x5b\x8c\x70\x5d\xac\x3b\x38\x61\xc2\x4d\xc8\xcb\xbb\xa8\ -\xa7\xe2\xd4\xa1\x43\x87\x5f\xe0\xac\x14\x11\xea\x5e\x26\xa2\xd0\ -\xf6\x7d\x10\xad\x51\xc4\xb5\xd9\xc3\x85\x64\x4a\xea\xd6\x07\xea\ -\x89\x48\x1a\x04\x50\x0d\xd2\x32\x21\x44\xc3\x89\x24\x75\x4a\xa9\ -\xcd\xb2\x2c\x18\x86\x38\x38\x4d\x38\xd8\x1d\xa8\x17\x5a\x96\x3c\ -\x55\x1d\x21\x2e\x7e\x4f\xa4\x1a\x49\x4a\x52\x79\xa7\x15\x10\x87\ -\x31\xa3\x1e\xee\x73\x7c\x3e\xa5\x14\x56\x6b\x6d\x1d\xb2\x61\x11\ -\x87\xd3\x56\xa2\x9a\xc8\x41\x73\x3f\x3c\x6a\x9f\xd4\x99\x27\x04\ -\xe1\xc6\x97\xf7\x06\xcf\x09\x8e\x8f\xeb\x04\x69\xe0\xf6\x50\x1f\ -\x9d\x96\x1b\x78\xfd\x8b\x8f\x6f\x8e\xbf\xff\x3e\x29\xb1\x48\x6e\ -\xee\x05\x70\x1c\xd7\x60\x3c\x22\x76\xf7\xfc\xf9\x5c\x65\xbb\xe2\ -\xe2\x02\xb2\x15\x64\x67\xe7\xa0\xa6\xa6\x46\x6a\xd8\x55\x57\xb5\ -\x51\x57\x2d\xb4\x85\xb2\xa0\xa8\xa8\x08\x2f\xbd\xf4\x12\xca\x2b\ -\x2a\xa5\xde\x76\xed\xda\x15\x2f\xbe\xf8\x82\xe6\x54\xfb\x1e\x95\ -\x99\xaa\x6a\x3c\xfd\xcc\x73\x28\x2f\x2f\x73\xa2\xac\xdd\xcb\x80\ -\xa8\xaf\x83\x44\xdd\x97\x9b\x21\x04\xeb\xbf\xfa\x0a\x5f\xae\x5b\ -\xe7\x76\x8f\x93\xb2\xb9\x51\xaa\xdc\xce\x65\x8f\x7d\x73\xc1\x02\ -\x0c\x11\x2d\x62\x94\xc2\x52\x5b\x8b\x6d\xdb\xb7\xe3\xd3\xd5\x9f\ -\xe2\xe8\xd1\xa3\xca\x59\x42\xec\xcf\x8f\x88\x88\x70\x2a\x64\x2e\ -\xbe\x81\x61\x04\x07\x3e\x47\xcb\x3f\xf1\x34\xaf\xec\x36\x2b\x1b\ -\x67\xcf\xa8\xaa\x43\x87\x8e\x60\xda\xe0\x03\x2d\xfc\x7b\xb9\x7f\ -\xd3\x2b\xc6\x52\xe4\x4c\x90\x29\x53\xee\x44\xc7\x94\x14\x69\x69\ -\xf5\x5d\x78\x90\xd2\xe1\x28\xde\x73\xe9\xe2\x45\xbc\xbd\x64\x71\ -\x9d\x04\x0c\x4f\x8a\xd7\x37\xff\xfd\x06\x99\xe7\xce\x49\x27\x7b\ -\x92\xbf\xb8\xac\x29\x06\x43\x08\x06\x0c\x1c\x80\x11\xa3\x46\x28\ -\x82\x5e\x13\x12\x5a\xf8\x4d\x86\x6b\x1e\xd7\x1c\xaf\xbe\x3a\x47\ -\xa9\x0f\xc9\x7c\x54\xc4\xed\xae\x63\x07\xe7\x24\x08\x7b\xf7\xee\ -\xc3\xfa\xaf\xd6\xd9\x37\x63\xd9\x66\x2a\xe4\x89\x00\x08\xc1\x0d\ -\x37\xdc\x80\x41\xd7\x5f\xaf\xf8\xed\x97\x5f\xae\xc3\x81\x83\xfb\ -\x85\xfb\x28\xc0\x30\x98\x36\x75\x2a\x3a\x77\x52\x16\x8b\x7c\xe7\ -\xdd\x77\x91\x9d\x9d\xa5\x60\x83\xc2\x42\xdf\x4e\xd2\xe3\xe2\xe2\ -\xf0\xea\xec\x57\xec\x8a\x11\x21\x48\x6a\x99\xa8\x4d\x2f\xd6\x68\ -\x2a\x1a\x35\x7a\x0c\xd2\xd2\xfa\xf3\x9b\x3c\x91\x13\x42\x26\x3c\ -\x10\x82\x4e\x29\x9d\xa0\x43\xdf\x13\x00\x20\x29\x29\x11\x0c\xc3\ -\x48\xd9\xb8\x4a\x4a\xcb\x90\x77\x31\x1f\x2d\x84\x38\x9a\x86\xc0\ -\xf9\xf3\xb9\x28\x14\x32\x89\x89\x68\x99\x94\x18\x10\xf2\xe7\x38\ -\xc4\x50\x5e\xd5\xb6\x6d\x9d\xc6\xea\xf5\xd7\x5f\x47\x46\x66\xa6\ -\x34\x89\xe3\xe3\xe3\xf1\xef\x7f\xbf\x8e\xb0\xb0\x30\xbf\x33\x0d\ -\x21\x2c\x28\xb5\x05\x19\x3b\x2b\xf7\xc7\x3f\x8e\x1c\xc5\xdc\xb9\ -\x73\x91\x71\xf6\x2c\x9f\x38\x01\xae\x33\xc6\x85\x85\x99\xdd\xee\ -\x63\xfe\x51\xc9\xa9\x6e\xcc\xd6\xa1\x43\x47\x9d\xe1\xa4\x14\xf9\ -\x9c\x65\x29\x48\xb3\xcf\xb9\x6a\xd4\xe4\xc9\x77\x60\xcc\x98\x31\ -\x32\x85\xd2\x53\x92\x52\x57\x4f\x26\xaa\xf7\xfd\x79\xec\x38\x96\ -\xbc\xfb\xae\x4a\x9d\x06\xff\xe1\x97\x5f\x36\xe1\x97\x5f\x36\xb9\ -\xbd\x87\x61\x59\x7c\xf7\xdd\xf7\x18\x33\x7a\x94\x87\x7e\xfa\x4e\ -\xd9\xe6\xcd\x9b\xe3\xc5\x17\x66\x3a\x28\xe8\xda\xde\x73\xf8\xf0\ -\x61\x2c\x5c\xf0\xa6\xc7\xba\x3b\xb1\xb1\xb1\x18\x74\xfd\x20\xc5\ -\xb5\x1f\x7e\xf8\x11\xab\x57\x7f\xa2\xb8\xd6\x3f\x2d\x0d\x9d\x3b\ -\x77\x56\x5c\x5b\xf5\xc9\x2a\xec\x3f\xb0\xdf\xa7\x4d\x98\x3a\xf0\ -\x4e\xd3\x66\x4d\xf1\xe2\x4b\x2f\x68\x3f\xa0\x50\xe5\x15\x37\xac\ -\x49\x08\x86\x0d\x1d\x2a\x25\x87\xa0\x2e\xd2\x22\x36\xfa\x9a\x1c\ -\xba\x00\xe3\x57\x34\x6d\xda\x14\xb1\x31\x31\x28\x28\x2c\x00\x00\ -\xd8\x6c\x36\x1c\x3d\xfe\x67\x83\x29\x45\x94\x52\x1c\x3d\x7a\x4c\ -\x61\x41\x8d\x8d\x89\x41\x62\x8b\x84\x80\xd0\xa3\x77\xaf\xde\x58\ -\xf9\xc1\xfb\xc8\xca\xca\xc6\xf9\xdc\x5c\x74\xed\xda\x55\x9d\xf9\ -\x88\x7b\x5e\xa4\x94\xe2\x8b\x2f\xbe\xc0\xa6\xcd\x5b\xa4\x6b\x26\ -\x93\x09\xaf\xbe\x32\xdb\xab\x4c\x73\xca\x58\x1d\x82\x5a\x8b\x45\ -\x11\x6b\x43\xc0\xc7\x5f\x3d\xfd\x14\x3f\xef\x6b\xad\xb5\x60\x08\ -\x41\x59\x69\x29\xd6\xac\xf9\x12\x37\x4d\xbc\x09\xb1\xb1\xb1\x4e\ -\x87\x77\x94\xb3\xa2\xbc\xbc\x0c\xb9\x17\xf2\xd0\x3c\x2e\x0e\xd1\ -\xd1\xb1\x3c\xf5\x09\x23\x24\xf2\x16\x0f\xa6\x28\xf2\x2f\x5e\xc4\ -\xe6\xcd\xdb\x30\x72\xd4\x48\x44\xc7\xc4\xf0\xab\x88\x64\xa1\xa1\ -\x20\x04\xa8\xad\xb5\xe0\x87\x1f\x7e\xc4\x90\xa1\x43\x10\x19\x19\ -\xcd\xc7\xfa\x08\xde\x6e\x9d\x3b\x2b\x0f\x61\x32\x33\x33\x41\x09\ -\x03\x42\x18\x50\x1b\x07\x96\x0d\x41\x8f\xee\xd7\xa0\x7d\x72\x5b\ -\xac\x5d\xbb\x56\xda\x07\xc2\x23\xc2\x9d\x68\x21\xae\x8f\x6f\x2c\ -\x58\x80\xe5\xcb\x57\x40\x7e\x9e\xe7\x38\x3e\x8a\xdc\x10\x14\x52\ -\xc6\x50\x00\x38\x9f\x7b\x5e\xdb\x40\xea\xd0\xa1\x23\x80\x1b\x7d\ -\x80\x2c\x47\x7a\x4c\x91\x77\xd2\x97\x36\xf7\x33\xdf\x85\x84\x60\ -\x80\x37\xed\x20\xf5\x70\xa7\xbf\x9e\x44\xb4\xfe\x56\xad\x96\x07\ -\xe7\xfb\x58\xa8\x05\x09\x6b\x6b\xaf\xd6\xba\x4a\x2a\xc9\x32\x98\ -\x60\xdc\xdc\xf5\x8c\x78\xc1\x8c\x10\x83\x01\xc9\x1d\xda\xa3\x60\ -\x37\xaf\x14\x11\x4a\x71\xea\xe4\x69\xf4\xb8\xa6\x2b\x9a\x35\x6d\ -\x5a\xef\xef\x2f\x28\x28\xc4\xc9\x53\xa7\x15\x7c\xdd\xb9\x73\x4a\ -\xc0\xe8\x11\x11\x19\x81\xee\xdd\xbb\xe3\x9a\xee\xd7\xa8\xcc\x47\ -\xed\xbc\xfc\xe7\x9f\x7f\x62\xd9\xb2\xe5\x0a\x85\xe8\xc1\x07\xff\ -\x0f\xbd\x7b\xf7\xf2\xba\x4d\xbb\x76\xef\xc1\xc6\x8d\x1b\xd1\xed\ -\xea\xab\xd1\xad\xdb\xd5\x68\xd5\xaa\x95\xd3\xfa\x32\x61\xc2\x58\ -\x80\x42\x2a\xbe\xfa\xc2\xf3\x2f\x20\x37\x2f\x17\xdf\xfe\xf0\x2d\ -\x9e\x9f\x39\x13\x69\x7d\xfb\xda\xad\xe8\xa0\x78\xe6\x99\x99\x38\ -\x74\xf0\x00\x4a\xcb\x4a\x31\xf1\xa6\x89\xf8\xe7\xbd\xf7\x28\x96\ -\x1a\x0a\x3e\xbd\xf6\xa2\xb7\x17\xe3\xfb\x6f\xbf\x43\x59\x59\x29\ -\xae\xce\xbb\x1a\xf7\xfe\x93\xbf\x8f\x91\x79\xe1\x95\x94\x94\x60\ -\xce\xbc\xd7\x70\xf4\xd8\x71\x98\xc3\xc3\xf0\xc6\xfc\xf9\x88\x8a\ -\x8a\x54\x5d\xab\x3a\x75\xea\x84\x36\x6d\xda\xe2\x6c\x06\x9f\xc1\ -\xb3\x67\xcf\x5e\x98\x36\xed\x6e\xf4\xe9\xd3\x0b\xeb\xd6\xad\x97\ -\xad\x65\x0c\xa2\xa3\x62\x5c\xd2\x24\x27\x27\x07\x39\x38\x2f\x35\ -\x98\x91\x65\xc0\x90\xbb\xd5\x51\x95\x23\x2a\x42\xe4\x45\x5f\xf5\ -\xf5\x49\x87\x0e\x5d\x3c\xa8\xbb\x40\xca\xa8\xf5\x8d\xfa\xf8\xb0\ -\x60\x3d\xa8\x71\xe7\xc9\x44\x3c\x06\x9f\x8a\xe9\x3f\xd5\xff\x73\ -\x75\x9f\x42\x4b\xf5\x87\x2a\x41\x1c\xfe\xbc\x12\x98\x58\x7e\xd3\ -\x21\xc4\xcd\xf8\x6a\x4d\x96\x40\x14\xb2\xbd\xf8\x3c\x79\x56\x3a\ -\x2d\x56\x22\x31\xfb\x9b\xcd\x66\xe3\x4f\x33\x25\x57\x31\x15\x45\ -\x82\x10\xfe\x34\x12\x9c\xa2\xfd\x0c\x4b\x54\x6f\xa7\x94\xf3\xcc\ -\xc7\x02\x1d\xdd\xb5\x97\x10\x3e\xa5\x39\xa7\xe1\x79\xe2\xf7\x52\ -\x56\x3b\x0f\x24\xe0\x28\x05\x27\x9c\x98\xf2\x19\x95\x20\x9d\x8a\ -\x2a\x7c\xe3\x1d\xe9\x12\xb0\x72\x1c\xa4\xfe\x26\x67\x50\x2f\xa8\ -\x8d\xa3\xfe\x09\x21\x04\xa9\x9d\x53\x64\xee\x5c\x14\xd5\x55\x95\ -\xd8\xb5\x7b\x9f\xe4\x52\x57\x1f\xb0\xd9\x6c\xb0\xd9\x6c\xf8\xed\ -\xf7\xdf\xa5\xe0\x77\x00\x08\x35\x9a\xd0\xb5\x4b\x6a\xe0\xe9\x02\ -\xa2\x72\x40\x41\x34\x6d\xe8\x55\x55\x55\x98\x37\x77\x2e\x2a\x2b\ -\x2b\xa5\x05\xa3\x7f\xff\xfe\x98\x32\x65\xb2\xe6\x75\x4e\x8e\xac\ -\x73\xe7\xf0\xdf\x6f\xbe\xc1\xdc\xb9\x73\x71\xc7\x94\x29\x58\xff\ -\xd5\x57\x2a\xdc\xc5\xcf\x77\x96\x61\xf0\xf1\x7f\x3e\xc6\xc6\x9f\ -\x7f\xe1\x95\x87\xec\x1c\x1c\x3d\x72\x54\xca\x56\x4a\x08\x01\x43\ -\x18\x24\x24\x24\xa0\xa8\xa4\x04\x36\x1b\x87\x9f\x37\xfd\x82\xd2\ -\xb2\x32\x61\x9d\x17\x13\x56\x13\x30\x84\xc0\x52\x6d\x41\x59\x39\ -\x9f\x91\xf0\xeb\x0d\x5f\x63\xdf\xbe\x7d\x32\xab\x0c\xff\xaf\xfd\ -\x07\x0e\xe2\xd7\x5f\x7f\x07\xc0\xbb\x35\x3f\xf9\xd4\x53\x28\x2e\ -\x2a\x76\x31\xff\x29\x46\x8e\x1a\x89\x5e\xd7\xf5\xc2\x3b\x4b\x96\ -\xe0\xfd\xf7\x97\x22\x2d\xad\x2f\x18\x96\x45\xde\x85\x3c\xc1\x46\ -\x45\x11\x12\x12\xc2\xa7\x16\x77\x78\x82\xb8\x4e\x4a\x5b\x9a\x90\ -\xf5\x94\x10\x16\x84\xb0\x52\xdc\x24\x38\xde\x2a\x44\x28\x40\x28\ -\x51\x8c\x2a\x9f\xa6\x55\xfc\x3f\x45\xfa\xc6\x9f\xf0\xe5\xba\x75\ -\x7a\x21\x57\x1d\x3a\x82\x41\xbb\x90\xe2\x38\x68\x10\xb4\x43\x3b\ -\xae\x88\x3a\x45\x57\xba\xe6\xec\xff\x00\x54\xea\xe7\xf6\x31\x82\ -\x5f\xba\xbb\x7b\xb4\x15\x01\x23\x2e\x14\xb0\x60\xd0\x03\x34\x85\ -\x14\x05\x6d\xb0\xb0\x2e\x68\x04\x3b\x62\x63\x63\xd0\x29\xa5\x23\ -\x0e\x1e\xfa\x43\x72\x47\x3d\x7d\xea\x0c\x8e\xb6\x3a\x81\xee\xdd\ -\xae\xae\xb7\xf7\x1e\xfe\xe3\x08\xce\x66\x64\x2a\xae\x5d\xdd\xad\ -\x0b\x22\x1c\xdc\xa6\x82\x69\xbb\xf6\xc4\xd6\x94\x52\x7c\xf6\xd9\ -\x67\xf8\xf3\xaf\xbf\xa5\x6b\x89\x89\x89\x78\xe1\xf9\x99\x08\x31\ -\xf8\xb6\x6d\x56\x57\x56\x2a\x37\x5f\x37\xcf\xf9\xe1\x87\x1f\xb1\ -\x7c\x85\x3d\xb5\x75\x97\xd4\xce\x98\x7a\xf7\x5d\x4e\xf7\x8d\x1a\ -\x39\x02\x6b\xd7\xae\x05\x47\x6d\x28\x2e\x2a\xc6\xb6\x6d\xdb\x30\ -\x68\xd0\x20\x6c\xd9\xb2\x45\x50\x32\x18\xa4\xa4\xa4\xe0\x81\xfb\ -\xff\x89\x2d\x9b\x37\xa1\xb0\x88\x8f\xa5\x5c\xf4\xf6\x5b\x58\xfd\ -\xf1\x27\x08\x09\x09\x91\x9e\x35\x74\xc8\x60\x3c\xf9\xc4\xe3\x58\ -\xb4\x78\x09\x6a\x6b\x6b\x70\xf0\xe0\x21\xcc\x78\xf2\x49\xbc\xb5\ -\x68\x11\x62\x62\x63\x15\xef\x35\x1a\x8d\x98\x7a\xf7\x9d\xb8\x77\ -\xda\xdd\x60\x59\x56\xb1\xa0\x65\x66\x66\x48\x1f\xa3\xa3\xa3\x11\ -\x19\x19\xe9\x92\xfe\xcf\xbf\xf0\x02\xfa\xcb\xea\xd4\x7d\xf4\xd1\ -\x7f\xf0\xcd\x7f\xbf\x95\xf8\xf9\xed\xb7\xdf\x42\x93\xd8\x58\x17\ -\x07\x6e\xbc\x83\xe0\xee\xdd\xbb\xf1\xee\x3b\xef\xe2\xd4\xa9\x33\ -\x78\x6b\xc9\x62\xb4\x68\x91\x80\xeb\x07\x5e\xaf\x2f\x08\x3a\x74\ -\x34\xe8\xc2\x7a\x19\xc8\x08\xc1\x90\x68\x21\x58\x44\x40\x4a\x29\ -\x5e\x9e\x35\x0b\xe7\x32\x33\x85\xb4\x09\x8e\x69\x45\x1d\x33\xd2\ -\xf1\x5a\x30\xa5\x40\x78\x44\x04\x96\x2d\x5d\x5a\xaf\x1d\xe3\x0b\ -\x9f\xfe\x43\xc8\x1a\xc7\x6f\x06\x5f\x7c\xbe\x06\x9b\xb7\xb8\x8f\ -\x29\xa2\x1c\x87\x7f\xcf\x9f\x8f\x55\xab\x57\x2b\x14\x84\xb9\x73\ -\xe7\xa2\x75\x9b\x36\xf2\x0a\x49\x9a\xea\xde\x54\x54\x94\xe3\xde\ -\x7b\xef\xe3\x33\xc9\x09\x05\x5e\x13\x12\x5a\xe0\xdf\xff\xe2\x8b\ -\x05\x8a\x3e\xef\xa7\x4e\x9d\xc6\xbc\x79\x73\x79\x6b\x88\x03\xf9\ -\xe4\xb5\x73\x9b\xc6\x36\xc1\xd2\xa5\xef\x81\x30\x8c\x43\x91\x47\ -\x65\xfd\x8c\xcc\x8c\x33\xb8\xf7\x9e\x69\x10\xbc\x4a\xc0\x30\x0c\ -\x7e\xfd\xf5\x37\xa7\xf6\x2d\x5e\xb2\x18\xeb\xbe\x5a\x2f\xfd\x92\ -\x61\x0d\xb8\xfd\xf6\xdb\xf0\xd0\xc3\x0f\xf2\xd7\x1c\xb2\xe4\x11\ -\x61\x23\xaf\xad\xb5\xe0\xc9\xa7\x9e\x46\x55\x95\x5d\x70\xa9\x28\ -\xaf\xc0\xdd\x77\xdd\x0d\x86\xb1\xff\x86\x78\xe4\x60\xbe\xdd\xd9\ -\x39\x39\x4e\x12\xd7\x96\xad\x5b\x31\x6d\xda\x34\xc5\xb5\xc4\xc4\ -\x96\x58\xbe\xe2\x7d\xfe\x3c\x43\x48\x55\x9b\x99\x79\x06\xf7\xdc\ -\x33\x8d\xaf\x2a\x2f\x8c\xd7\xfd\xf7\xdf\x8f\x01\x03\x06\x5c\x3e\ -\x33\x35\xd0\x31\x88\xd4\xdb\x7e\xd3\x20\xed\x88\x12\xd7\xf5\xec\ -\x81\x33\x67\x32\x50\x5c\xc2\x9f\xf0\x73\x1c\x87\x5f\x7f\xdd\x85\ -\xf0\xf0\x70\x24\xb7\x6b\xeb\xb7\x98\x42\x91\x2f\xcf\x66\x64\x62\ -\xcf\xde\xfd\xe0\x6c\x76\x3a\xc4\xc4\x44\xe3\xda\x6b\xaf\x09\x5a\ -\x05\x9f\x2a\x4e\x2f\xa9\x6a\x33\xb3\xb3\xb3\xb1\x6a\xd5\x6a\x29\ -\xbd\xb4\x21\x24\x04\x33\x67\x3e\x87\xa6\x4d\x9b\xf8\x36\x7b\x08\ -\x50\x51\x55\x29\xbd\xb5\xd6\x52\x8b\xc8\x88\x48\xe7\xd5\x83\x52\ -\xfc\xf4\x53\x3a\x5e\x7e\x79\xb6\xd4\xd6\xe8\xa8\x28\xbc\x32\x7b\ -\x36\x42\x43\x43\x9d\x9e\xdb\xb9\x73\x67\xc4\xc5\xc5\xa3\xf0\x12\ -\x9f\x0a\x7d\xfd\x86\x0d\x68\xd7\xae\x3d\xe6\xcc\x99\x2b\x1c\x26\ -\x01\x77\x4d\x9d\x86\xc7\x1f\x7d\x14\x53\xee\xbc\x13\xef\xbc\xb3\ -\x04\x00\xf0\xd7\xdf\x27\xf1\xd3\xc6\x74\x8c\x1b\x7b\xa3\xd0\x3e\ -\xbe\x25\x37\xdf\x72\x33\x2c\x56\x2b\xde\x7a\x6b\x11\x00\xe0\x8f\ -\x23\x47\xf0\xd4\x33\x4f\xe3\xad\x45\x6f\x21\x2a\x32\x52\xc1\x3f\ -\x26\xb5\xfa\x43\x94\xe2\xaf\xbf\xfe\x92\xd6\xdf\xd6\xad\x5b\x3b\ -\xf3\x1c\xb1\xbf\x2f\xae\x79\x1c\x5a\x26\xb5\x94\xe8\x70\xff\xfd\ -\xf7\xe1\xe7\x5f\x36\xa1\xbc\xa2\x0c\x45\xc5\xc5\xf8\xe1\xc7\xff\ -\x61\xe6\xb3\xcf\x38\x3d\x83\x52\x8a\xbc\xfc\x8b\x78\xef\xdd\xa5\ -\xf8\x79\x63\x3a\x6a\x6b\xf9\x64\x0f\x96\x6a\x0b\xd6\xad\x5f\xaf\ -\x2b\x45\x3a\x74\x34\xb4\x78\x40\xfd\xb0\xde\x07\x7a\x3b\x25\x57\ -\x70\xf6\x39\xb5\x9d\xf0\xbb\x6f\xbf\xc7\x1f\x7f\x1c\xf2\xfa\xe9\ -\x51\x51\xd1\xce\x4a\x91\x9f\xe5\xb5\x1e\x3d\x7a\xe0\xfe\xfb\xef\ -\x53\x5c\x3b\x74\xf0\xb0\x47\xa5\x08\x00\x7e\xf9\xe5\x17\xc5\x67\ -\x86\x65\xf1\xc4\xf4\xe9\x68\xdd\xa6\x8d\xd7\x6d\xb3\x58\x2c\x58\ -\x2d\x28\x58\x22\x92\x3b\x74\x90\x94\x22\x11\xb9\xe7\xcf\x63\xd5\ -\xea\xd5\xa0\x9c\x7b\x0b\xd0\x94\x3b\xef\xc2\x9b\x0f\x3c\xe0\xf1\ -\xbd\x4f\x3f\xf5\x34\x56\x7d\xf2\xa9\x47\xc5\x6d\xd3\xa6\xcd\xca\ -\x61\x66\x18\xec\xdc\xb1\x03\xfd\x84\xd3\x48\x0a\xaa\x1a\xef\x53\ -\x53\x5d\x8d\x99\xcf\x3f\x8f\xaa\x2a\x65\x5f\x3f\xfb\xec\x33\xbf\ -\x8d\xeb\xa9\x53\xa7\x70\xea\xd4\x29\x05\x0f\x3e\xfd\xf4\xb3\xb8\ -\xff\xbe\x7f\x2a\xee\x9b\xfe\xc4\x0c\x7c\xfc\xf1\x27\xd2\x24\x65\ -\x08\x83\xc1\x83\x87\x04\x58\x29\xd2\xd1\x18\x10\x11\x1e\x8e\xfe\ -\x03\xfa\xe2\x87\x1f\x7e\x92\xf1\x76\x0d\x36\x6d\xe2\x13\x05\x74\ -\x68\xdf\xce\x6f\xef\x3a\x79\xea\x34\x36\x6f\xd9\x86\x2a\xd9\xa4\ -\x31\x18\x0c\x18\x30\xa0\x1f\xc2\xc3\x1b\x81\x95\xc8\xc5\x3e\x00\ -\x00\x1f\x7f\xfc\x89\xac\x10\x2d\x70\xe3\x8d\x37\xa2\x7f\xff\xb4\ -\x3a\xbd\xb9\xaa\xb2\x4a\x71\x25\x32\x32\xc2\xe9\xae\x9f\x7e\x4a\ -\xc7\xab\x73\xe6\x48\x9f\x8d\x06\x03\xe6\xcc\x99\x83\xe4\xe4\x64\ -\xd5\xa7\x1a\x0c\x06\xf4\xed\xd3\x07\x3f\xfe\xf0\x3d\x5a\xb5\x6e\ -\x85\x94\x0e\x1d\x61\xb3\x5a\x9d\x77\x14\x02\x4c\x9a\x38\x11\xeb\ -\xd6\x7e\x09\xb3\x39\x14\x37\xdf\x7a\x33\x86\x0e\x1e\xa2\xfa\xcc\ -\xc9\x77\xdc\x8e\xaa\xaa\x2a\x2c\x5f\xbe\x8c\xdf\x67\x0e\x1d\xc6\ -\x53\x4f\x3f\x85\x37\x17\xbe\x89\xe8\xa8\x28\xb7\xbd\xcc\xce\xce\ -\xc6\xa5\x82\x02\xe9\x73\xa7\x8e\x29\xce\x34\x56\xe4\x51\x50\xae\ -\xe7\x09\x09\xf1\xb8\xf9\xe6\x49\xf8\xf8\x93\x8f\x01\x00\xdf\x7c\ -\xf3\x35\x06\x0e\xe8\x8f\x01\xfd\xfb\x2b\xee\x5b\xb3\x76\x2d\x3e\ -\x58\xb9\x12\x15\xb2\xf4\xe5\x51\x51\xd1\xb8\xef\xbe\x7b\x71\xf3\ -\xa4\x89\xfa\x42\xa0\x43\x87\x0e\x9f\x84\x6f\x83\xe7\x5d\xe3\xf2\ -\xd3\x87\x5c\x75\xb3\x2e\x5d\x17\xb3\xcc\x31\x0c\xeb\xff\x8d\x5b\ -\xda\xbf\x65\x76\x1d\xea\xbb\xaf\x26\x67\xb3\xa9\x7a\xda\xd7\x85\ -\x02\xaa\x2e\x6a\xd4\x73\x27\x09\x9c\x8b\x04\xba\x1a\x46\xea\x07\ -\x17\x2e\x57\xef\xa3\x94\x36\xbc\x87\x18\xa5\xbc\xe5\xcf\x71\x5c\ -\x1d\x68\xc9\x51\x2e\x08\x6a\x12\xf9\x99\x38\x0e\x86\xd7\x06\x37\ -\xbc\x6b\x7e\x31\xf5\x71\xb6\x06\x48\xe8\x27\x04\x29\x1d\x3b\x20\ -\x2f\x2f\x1f\x07\x0e\x1c\x92\x6a\xb8\x54\x56\x54\x62\xe3\xc6\x5f\ -\x50\xd8\xf3\x3a\x5c\xdb\xe3\x1a\xb0\x02\x3f\x79\xcb\x57\x14\x14\ -\xb5\xb5\x56\xec\x3f\x70\x08\x07\x0f\x1c\x42\xb5\xa5\x46\x41\x85\ -\xe8\x98\x68\xb4\x6a\x95\xd4\xb8\xb6\x08\xaa\x1c\xed\xc2\xc2\x42\ -\xa4\xff\x94\x2e\x5d\x8f\x8a\x8e\xc2\x83\xff\xf7\x40\x9d\xdc\x90\ -\x29\x80\xca\xca\x2a\x59\xfd\x1f\x82\xc8\x88\x48\xa7\xfb\x6c\x36\ -\x0e\xe2\xd2\xce\x10\x8a\x19\x4f\x3e\x89\x01\x03\xfa\x4b\x05\x63\ -\x89\x4a\x38\xd4\x43\x0f\xfd\x1f\x1e\x7c\xf0\x01\xc4\xc4\x46\xc3\ -\xc0\x1a\xf0\xe7\x9f\x7f\xd9\x93\xcb\x18\x58\x70\x36\x0e\x9c\xcd\ -\x86\xf0\x70\x33\x56\x7e\xb8\x12\x4d\x9a\xc4\x20\xc4\x18\x22\xec\ -\x5b\x9c\xaa\x8e\x38\x6d\xda\xdd\xc8\xcd\x3d\x8f\x6f\xfe\xfb\x5f\ -\x00\x04\x56\x2b\x07\x56\xc3\xde\xf6\xfb\xef\xbf\xc3\x6a\xb5\x4a\ -\x0c\x71\x4d\xf7\xee\x8a\x59\x44\x08\x51\x78\xd9\x10\x15\xeb\xfb\ -\xbd\xf7\x4c\xc3\xd6\x2d\x5b\x90\x79\xee\x1c\x6a\x6b\xad\x98\xfd\ -\xca\xab\x58\xb6\xec\x3d\x24\xb7\x4f\xc6\xe1\xc3\x7f\x60\xe1\x9b\ -\x0b\xf1\xe7\x89\x3f\xa5\xb1\x63\x18\x16\x43\x87\x0d\xc7\x8c\xe9\ -\x8f\x07\x2c\xdb\xa1\x0e\x1d\x3a\xea\xe3\xd4\xaa\xe1\x9f\x67\xd0\ -\xe9\xec\x1f\x41\xa4\xbe\x1b\xac\xa6\xc2\x70\x75\xc8\xaa\x46\x48\ -\x3d\xd3\xc9\x43\x8c\x90\x08\xad\x89\xd6\x1a\x24\x05\x75\x00\xdc\ -\x7d\x58\x07\x02\xb8\x1a\xd1\xc0\x2b\x45\x7a\xba\xdb\xc6\x84\x7e\ -\xfd\x7a\xa1\xaa\xb2\x12\x47\x8f\x9f\x90\xae\xd5\x54\xd7\xe0\xf7\ -\xdf\x77\x21\x23\x23\x13\xfd\xfa\xf5\x46\x52\xa2\xf7\x35\x84\xb2\ -\xb2\xb2\xf1\xfb\xae\x3d\x28\xb8\x54\x28\x29\x44\x72\x14\x15\x16\ -\xe2\x97\x4d\x5b\x31\x72\xf8\x10\x18\x4d\xa6\x46\x49\xbb\x5d\xbf\ -\xef\x42\xa5\x68\xfd\x22\xc0\xe8\xd1\x63\x10\x1f\x1f\x57\xe7\xe7\ -\x96\xcb\x2c\x4f\x0c\xc3\x20\x3c\xc2\xd9\x52\x34\x76\xec\x18\x44\ -\x44\x44\xe2\x95\xd9\xb3\x31\x62\xe4\x30\xbc\xfd\xd6\xdb\x58\xbc\ -\x78\x89\x54\x13\xcd\xb9\xb8\x29\x9f\x68\x80\x52\x4e\x48\x8f\x4d\ -\xc0\x39\x24\xd6\xf8\xec\xb3\xcf\xb0\x66\xed\x97\xb2\x4c\x73\x82\ -\xef\xb2\x98\xee\x9a\x42\x79\xe4\x44\x29\x08\xc3\x60\xe6\xcc\x99\ -\xc8\xcb\xe3\xdd\xf2\xde\x98\xff\x2f\x84\x87\x7b\xae\xc9\xb4\x31\ -\x7d\x23\xc4\xc7\x87\x9a\x42\xd1\x5d\x50\x8a\xbc\xd9\x3b\x23\x22\ -\xc2\x31\x73\xe6\x4c\x3c\xfe\xf8\xe3\xa8\xb5\x59\x51\x54\x54\x84\ -\xa7\x9f\x79\x16\xd7\x74\xeb\x86\xf4\xf4\x74\xd8\xac\xf6\xfe\xb5\ -\x6d\xd7\x1e\x4f\x3c\xf1\x38\xfa\xa7\xf5\xd5\x8b\xb7\xea\xd0\xa1\ -\xa3\xce\x08\xb8\x52\x54\xef\x2e\x84\x0d\xb6\x4e\xfa\xf6\x22\xaa\ -\x62\x15\xa0\xc2\xa6\x24\x7f\x36\xc3\x32\x4e\x74\xd3\x94\x40\x40\ -\x8a\x9d\x11\x63\x6c\x58\x55\x21\x9b\x8a\x9b\xae\x07\xe1\x5b\x3c\ -\xe5\x93\x27\x46\x60\x88\xbd\x5a\xac\x78\xdd\xc6\x71\x42\xdc\x91\ -\x7b\x7a\x11\xb6\x8e\xc2\x3e\x43\xa4\x8d\x9d\x0a\x1b\xba\x9a\x3a\ -\x25\xa5\x76\xa5\x6e\x2a\x4e\xc9\xfa\x2f\xdd\x47\xd5\x5d\x2f\xc5\ -\xf8\x1f\x48\x35\x33\x5c\xdd\xe7\x9e\x37\x88\xf0\x2e\x2a\x74\x80\ -\xa3\x0e\xf6\x30\x2a\x0a\x51\x44\x08\x9e\x27\xf5\xab\x90\x7b\x9c\ -\xa9\x8d\xe1\xa9\x3e\xbc\x98\x04\xed\x0a\xe6\xdb\xc2\xce\x1a\x30\ -\x72\xe4\x30\x10\x86\xc1\x89\x13\x7f\x4a\x96\x06\xce\xc6\x21\x27\ -\x3b\x07\x5f\x7f\xfd\x2d\x12\x13\x5b\x20\xb5\x73\x27\xb4\x69\xd3\ -\x0a\x66\xb3\xd9\x21\xa6\x0f\xd2\x3c\xae\xae\xae\x46\x46\x66\x26\ -\x4e\x9c\xf8\x0b\x59\x59\x39\x8a\xee\x12\x2a\x66\x4f\xa4\xd2\xbc\ -\x39\x75\xf2\x14\x00\x8a\x11\xc3\x87\xc2\x64\x32\x36\xdc\xa1\x86\ -\x1f\x56\x6d\x02\xe0\xaf\x3f\xff\x54\xcc\xe1\xb4\xb4\x7e\x7e\x79\ -\x57\x71\x71\x91\xc4\x2d\x06\x96\x85\xd9\x6c\x56\x55\x12\x06\x0f\ -\x1e\x88\xcf\xbf\xf8\x14\x61\x61\xe1\xf8\x72\xdd\x06\x41\x79\x51\ -\x68\x30\x4e\x3d\x10\x15\x11\xe9\x8a\x70\x9b\x55\x70\xa5\xab\xb5\ -\xda\xdc\xf7\x5f\xb6\x4e\x89\x49\xb0\x8d\x21\x21\x58\xf4\xe6\x02\ -\x10\x42\xa4\x71\x74\x87\x63\xc7\x8e\xe1\xc0\xa1\x43\xd2\xb4\xb8\ -\xf6\xda\xeb\xd0\xa4\x49\xac\xfb\x79\x4e\xd4\xd7\xb3\xde\xbd\x7b\ -\xe2\xa1\x87\x1e\xc2\xbb\xef\xbd\x07\x00\xc8\xc9\xca\x42\x4e\x56\ -\x96\xd4\xba\xa8\xa8\x18\xdc\x7b\xef\x3d\xb8\x73\xca\x64\xc5\x63\ -\xf4\xcc\x73\x3a\x74\x04\x03\xbc\x9c\x87\xf5\xb5\x3d\x78\x5b\xa7\ -\xe8\x4a\x89\x29\xd2\x3a\x3c\x81\x38\x68\xfa\xed\xb7\xdf\x30\x77\ -\xde\x3c\xc9\x6d\x8a\x30\x0c\x3a\x75\xea\x84\x6f\x36\x7c\x2d\x24\ -\x1f\xe0\x1b\x95\xdc\xa1\x83\xcf\x3c\xf4\xca\xec\x57\xd0\xe3\xda\ -\x1e\x60\x04\xc1\x9f\x52\x8a\xb6\x0e\x15\xde\x4d\x46\x23\x3e\x5c\ -\xb9\x12\xd5\x35\xd5\xb2\x22\x7a\xf2\xfd\x92\x77\x7b\x28\x29\x2d\ -\xc1\x9d\x77\x2a\xb3\x20\x65\x67\x67\x63\xcc\x0d\x63\x05\x45\x81\ -\x4f\xaf\xdd\xac\x69\x33\x6c\xf8\x6a\x3d\x5f\x44\x50\x50\x0e\x88\ -\x9c\xd0\xc2\x26\xde\xaa\x55\x2b\x9f\x07\xe7\x91\x47\x1e\xc5\x88\ -\x11\xc3\x01\x40\x72\xed\x98\x3d\xfb\x15\x1c\x38\xb8\xdf\xeb\x81\ -\x35\x9a\x8c\xf8\xec\xb3\x4f\x61\xb3\xd9\x24\x97\x8e\xb2\xd2\x32\ -\xdc\x21\x6c\xba\x22\x12\x12\x5a\xe0\xbd\xf7\xde\x85\xc1\x10\x22\ -\xea\x64\x38\x71\xfc\x4f\x3c\x3b\xf3\x59\xc5\x7d\x3d\x7b\xf6\xc2\ -\x4b\x2f\xbd\x24\x6d\xf2\x8c\xcc\x22\x44\x60\x57\xd0\x0e\x1c\xd8\ -\x8f\x1b\x6e\x18\x03\x4e\x52\x7e\x18\xfc\x29\x17\xca\x04\xcc\x9f\ -\x3f\x1f\x9f\x7e\xfa\x29\x2f\xd8\x72\x36\x10\x86\xc5\x9c\x57\x5f\ -\x45\x9f\x3e\x7d\x82\x5a\xe9\xd7\x11\x58\x0c\x19\x3c\x10\x51\x51\ -\x91\x38\x70\xe0\x10\xaa\xab\x95\x96\x9d\xf3\xe7\x73\x91\x9d\x7d\ -\x1e\xac\xc1\x80\xa6\x4d\x9b\x20\x26\x3a\x0a\x66\x73\x28\x58\x96\ -\x85\xd5\x66\x43\x75\x55\x35\x8a\x4b\x4a\x50\x50\x50\x08\x9b\xd5\ -\xa6\x2a\x70\x86\x9a\x4c\x48\xee\xd0\x0e\x99\x99\x59\x28\x17\x52\ -\x3e\x03\xc0\xa9\x53\x67\x00\x00\x23\x86\x0d\x81\x29\xb4\x71\x59\ -\x8c\x4a\x4b\xcb\x15\x7b\x6a\x98\x8a\xf2\xe2\xf5\x1e\xc4\x71\xc8\ -\xca\xca\xb2\x2b\xad\x06\x83\xdb\xec\x7c\x89\x89\x89\xa8\xae\xae\ -\xc1\xd8\x1b\xc6\x2a\xd6\x0f\x47\x15\x9c\x8a\xe7\x51\x92\x42\x44\ -\x51\x5c\x54\x84\x9d\x3b\xed\x49\x68\xda\x5e\xd5\x16\x9d\x3a\xa7\ -\x42\x2c\xea\xca\x5b\x9c\xa8\x7b\x21\x02\x40\xab\xa4\x24\x84\x6a\ -\x1c\x3b\x4a\x29\x56\xad\x5a\xa5\x50\x6e\xc6\x8c\x19\xed\x71\x2d\ -\x77\x67\xdd\x99\x3a\xf5\x2e\x5c\xcc\xbf\x84\x2f\xbf\x5c\xab\xb8\ -\x1e\x15\x15\x8d\xf7\xde\x7b\x07\x29\x29\x1d\xf5\x09\xae\x43\x87\ -\x0e\xbf\x2a\x0b\x4e\x4a\x91\x68\x09\xf0\x3a\x91\x44\x70\x1e\x98\ -\x06\xbd\xe0\x97\x9b\x73\x1e\xe9\xe9\xe9\x8a\xcd\x28\xa9\x65\x12\ -\xc6\x4d\x18\xef\xb1\x45\x5a\x5a\xcb\x10\x82\x3e\x7d\xfb\x60\xf4\ -\xa8\x51\x6e\xef\x63\x59\x16\x23\x46\x0e\xf7\xf8\xbc\xfc\x8b\x17\ -\xf9\xe2\xa2\xb2\x83\xc7\xca\xca\x4a\xfc\xbc\x71\xa3\xe2\xbe\xeb\ -\xae\xeb\x85\xf1\xe3\xc7\xfb\xcd\x92\xa1\x16\x20\xdd\xbd\x7b\x77\ -\x4c\x98\x30\x41\x71\xf9\xbd\xf7\x96\xfa\xa4\x16\xb3\x2c\x8b\x1b\ -\x6e\xb8\x41\xf1\x8b\xa2\x4b\x97\x9c\xee\x8b\x88\x08\xc7\xb8\x71\ -\xe3\xa4\x54\xb6\x94\x52\xc4\x44\xc7\x3a\xdd\x17\x1f\x1f\x8f\xf1\ -\xe3\xc7\xb9\xec\xbf\x28\x60\x1e\x3a\x74\x08\x3f\xfd\x94\xee\xb1\ -\x7d\x47\x8f\x1e\xc5\xd1\xa3\x47\xed\xdd\x67\x18\x3c\xf2\xc8\x23\ -\xfa\x22\x56\x57\x86\xa2\x2e\x58\x84\x68\x5d\xd8\x82\xd4\x02\x22\ -\xf0\x9d\xc1\x60\x40\x9f\xde\x3d\xd1\xa2\x45\x3c\x7e\xfd\x75\x37\ -\xf2\xf2\xf2\x41\x29\x07\x9b\x95\x13\x7a\x47\xc1\x59\x2c\xb8\x90\ -\x7b\x01\x17\x72\x2f\xb8\xec\x96\x58\x23\x86\x95\x59\x92\xe3\xe2\ -\x9b\x23\x2d\xad\x0f\x5a\x25\x25\x21\x2b\x27\x07\x3f\x6f\xdc\x84\ -\xb2\xb2\x72\x49\xb8\x3e\x75\xf2\x34\x28\x05\x46\x0c\x1f\x82\x50\ -\xc1\x95\x8e\x04\x8d\x8b\x93\xeb\xa0\xb2\x50\xb3\xd9\x6e\xd1\x31\ -\xb0\xd8\xf9\xdb\x6f\xb8\xf6\xda\x1e\xbc\x75\xdd\x53\xfb\x29\x95\ -\x9e\x2a\xe4\x27\x05\x28\xb0\x7d\xfb\x76\xe4\xe5\x5d\x94\x6e\x0b\ -\x0b\x35\x23\x42\xc5\x7d\x4e\xd1\x8e\x50\x13\x5e\x7b\xed\x55\xaf\ -\xc6\x9b\x52\x8a\xe3\xc7\x4f\x48\x99\x39\x29\x61\x30\x70\xd0\x60\ -\xcc\x78\xe2\x51\xcd\xbf\xf7\x05\x87\x0e\x1d\xc2\xd6\xad\xdb\xa4\ -\xcf\xcd\x9b\x37\xc7\xd0\x61\x43\xd5\xd9\x49\x96\x7d\xce\xfe\x5e\ -\x9e\x6a\xb5\x56\x2b\xfe\x3e\x79\x12\x5b\x36\x6f\x46\x5e\x5e\x1e\ -\x9e\x7f\x7e\x26\xcc\x61\x66\x7c\xba\x7a\x35\x6a\x6b\x6b\xc1\x10\ -\xa0\xac\xb4\x04\x8f\x3e\xf6\x18\x6e\xbb\xed\x56\x4c\x18\x37\x0e\ -\x71\x71\x71\xfa\xa1\x8d\x0e\x1d\x01\x56\x26\xd4\x03\xf5\xd5\x6b\ -\x76\xba\x12\xd1\xe4\x45\xa7\xfd\xb4\x11\xc2\xdb\x27\x1a\xf4\xd1\ -\xf4\x4e\x78\xf6\xf7\xa3\x9c\x36\x21\x2f\x84\x06\xad\x02\x86\x9a\ -\x5b\x4c\x7d\xf7\x8d\x61\xea\x63\x93\x22\x8a\x97\x13\x4d\x85\x7f\ -\x7c\x1f\x56\x57\x02\x02\xd1\x20\x14\x6b\xed\x7f\x5d\xdc\x3d\x48\ -\x63\x9d\x1b\x3a\x1a\x1c\xad\x5b\xb5\x42\xfc\xc4\x78\x9c\x38\xf1\ -\x17\x0e\x1d\xfa\x03\x45\x52\x51\x4e\xef\x11\x15\x1d\x85\xee\xdd\ -\xbb\xa1\x73\xe7\x14\x18\x85\xc3\x81\xd6\x49\x49\x18\x31\x72\x18\ -\x36\xa6\x6f\x52\x58\x8c\xce\x9c\x3e\x83\x9f\xa1\x54\x8c\x82\x45\ -\x1d\x72\xc5\xe5\x1d\x3b\x2a\x2d\x10\x9f\x7d\xf6\x19\x8e\x1f\x3b\ -\x86\x4e\x9d\x3a\x21\x2a\x2a\x0a\x2c\xc3\x08\x05\xab\x95\xb3\x82\ -\xc8\x5c\x78\xc5\xeb\x45\xc5\xc5\xc8\xce\xce\xc6\xde\x3d\xbb\x15\ -\x2e\xc7\xed\xdb\xb7\xab\xb7\x38\x41\xc7\x7d\x81\x65\xeb\x77\xa5\ -\xa8\xa9\xa9\xc1\xe2\xb7\x17\xa3\xb6\xb6\x56\xba\x76\xfb\xed\xb7\ -\xab\xa6\x10\x77\x5c\x47\x28\x28\xaa\x6b\x6a\x70\xec\xf8\x71\x6c\ -\xd9\xb2\x15\x3b\x77\xee\x44\x76\x56\x16\x7f\xd8\xd4\x84\x4f\x7f\ -\xfe\xc8\xc3\x0f\xa2\x4d\x9b\xd6\x58\xbc\x78\x31\x4a\x8a\x8a\x00\ -\x00\xa5\xc5\xc5\xf8\xe0\x83\x0f\xb0\x6a\xd5\x2a\xa4\xa5\xa5\x61\ -\xc4\xb0\xe1\xe8\xd9\xb3\x27\x62\x63\x63\xf4\xc9\xae\x43\x47\x23\ -\x17\x9f\x03\xb9\x39\x38\x29\x45\x94\x34\x78\x1b\x2e\x83\x41\xad\ -\x4b\xd6\x02\x02\x86\x61\xc1\xc9\xaa\xc1\x33\xc4\xb5\x07\xbe\xb8\ -\xb1\x72\x1c\xa7\xe9\x1d\x14\x00\x61\x88\xcf\x21\x14\x8e\x42\xbb\ -\xcd\x66\x73\x4f\x26\x62\xef\x83\x9c\xa4\xc4\x0f\x8c\xc2\xb0\x8c\ -\xd4\x1e\xe2\x52\xd1\x23\x3e\x2b\x8f\x4e\xca\x15\x21\x60\x59\x83\ -\x82\xee\x84\x10\xa7\xea\x8f\x54\x28\x92\x28\x7f\x3d\x21\x04\x1c\ -\xe5\xa4\x13\x76\xc7\x93\x51\xbb\x46\x47\x2e\x8f\xb9\x13\xec\x0b\ -\x35\xf1\x95\xa8\xcc\x65\xb1\xe2\x13\x42\x10\x6a\x32\xa1\x47\xf7\ -\x6e\x48\xed\x9c\x82\xb3\x67\x33\xf1\xe7\x5f\x27\x71\xe1\xc2\x45\ -\x58\x6a\x6a\xc0\x71\x1c\x38\xc8\x32\x1f\xf2\xec\x0f\x42\x08\x18\ -\xc2\xc0\x64\x32\x22\xa1\x45\x0b\xa4\xa4\x24\xa3\x6d\xdb\x36\x30\ -\x19\x9d\x15\x9c\x36\xad\x5a\x61\xf4\xe8\x11\xf8\x29\xfd\x67\x94\ -\x0b\x16\x23\x8e\x52\x9c\x3a\x75\x1a\x00\xc5\xf0\x61\x43\x60\x16\ -\x04\xe5\x80\x5b\x8c\x64\xfe\x67\x84\x28\x2f\x0f\x19\x32\x08\x8b\ -\x97\x2c\x41\x69\x69\x89\x14\xd4\xbf\x6f\xdf\x3e\xec\xdb\xb7\xcf\ -\x39\x06\xc6\x15\x77\x50\x57\x47\x9f\xfc\xe7\xa1\xc3\x86\xa9\xd2\ -\x20\xef\x42\x1e\x6a\x54\x12\x58\x78\x83\xdc\xdc\x5c\x85\x3b\x5d\ -\x49\x71\x11\x32\x33\x33\x85\xc3\x1a\x46\xf3\xda\xe7\x38\x1d\xe2\ -\x12\x12\x9c\x6a\x13\x89\x45\x6e\x0f\x1f\x39\x22\x75\x33\x21\x3e\ -\x01\x93\x26\x4d\x54\x9d\x72\xd6\x5a\x2b\x38\x9b\x5d\x39\xfc\xf8\ -\x93\x4f\xf0\xaf\x7f\xcf\x47\x4e\x76\x8e\x82\x2f\x28\x78\x37\xc6\ -\xb2\xd2\x32\x84\x87\x85\x63\xdc\xd8\x1b\x70\xdd\xb5\xd7\x62\xf1\ -\x92\x25\xd8\xba\x75\x0b\x3f\x2e\x1c\x45\x75\x55\x15\x36\x6f\xda\ -\x84\x2d\x5b\x36\x23\x2c\x2c\x1c\x5d\x52\x53\xd1\xab\x67\x2f\x5c\ -\x7b\x6d\x0f\xa4\xa4\xa4\xa8\xc6\x6d\xe9\xd0\xa1\xa3\x1e\xd6\x53\ -\xa2\xb2\x32\x6a\x4c\xb8\x55\x6f\x7a\x95\x0f\x02\xa8\x6e\x29\x6a\ -\x58\xc9\xc4\xe3\x35\xe2\xc5\xe9\xa1\x56\x2b\x03\xf1\x33\xab\xb1\ -\x2c\x23\xa5\x20\x77\x07\x8e\x72\x60\x08\xeb\x57\xde\xf6\x9e\x56\ -\xbe\xf5\xdd\x3d\x6d\x89\xc7\x71\x65\x48\x80\xf8\x49\x87\x0e\x0f\ -\x30\x99\x4c\x48\xe9\xd4\x11\x29\x29\x1d\x50\x55\x55\x85\xfc\x4b\ -\x85\x28\x2c\x2c\x42\x49\x49\x29\x6a\xaa\x6b\x60\xb5\x59\xc1\xb2\ -\x0c\x42\x43\x43\x11\x1d\x15\x89\x66\xcd\x9a\xa2\x69\xd3\xa6\x30\ -\x9b\x43\x3d\x2a\x33\x49\x2d\x13\x31\x7a\xd4\x08\xa4\xff\xf4\xff\ -\xed\x9d\x7b\xb4\x24\x55\x7d\xef\xbf\xbf\xea\x3e\xe7\xcc\x8b\x79\ -\x8f\x0c\xaf\x61\x1c\x12\x45\xee\x5a\x30\x04\x06\x13\xc5\x01\x09\ -\x03\x38\x84\x70\xd5\x68\xb8\x06\x13\xcd\x43\x42\xa2\xc6\x9b\xb5\ -\xb2\x94\x24\x2b\x80\x0f\x22\x26\x77\xdd\x1b\xe3\x0d\x41\x6f\x62\ -\x12\x1e\x3e\x98\x88\x59\x06\x07\x41\x91\xeb\x55\x60\x8c\x04\x74\ -\x54\x50\x06\x10\x9d\x19\x01\x61\xe6\xcc\x9c\x99\xf3\xee\xfa\xdd\ -\x3f\xba\xaa\xba\x6b\x57\xed\xae\x5d\xdd\xd5\xdd\xd5\x7d\xbe\x1f\ -\x3d\x6b\xe8\xee\x7a\xfc\xf6\xb7\x76\xed\xbd\x7f\xfb\xf1\xdb\x5f\ -\xc6\x44\xd3\x1e\x32\x4f\x3e\xf9\x34\x00\xc4\x1c\xa3\xbe\x3b\x44\ -\x96\xca\x72\xd5\xaa\x95\xb8\xe6\x7d\xef\xc5\xb5\xd7\x5d\x87\xd9\ -\xd9\xd9\xc2\x6f\x7f\xfa\xe9\xa7\xe3\x57\x2f\xfb\x95\xd4\xdf\xde\ -\xf1\xfb\x57\xe3\x99\x67\x7e\x84\xe6\x51\x71\x33\x88\x82\xa6\x44\ -\x62\xd1\xc8\x97\x91\x7a\xa7\x5a\x53\xba\xee\xbc\xf3\xf3\xf8\xd7\ -\xcf\xdd\xd9\x74\xa2\xa4\x16\x1f\x8a\xf8\xa6\xf4\x1a\x39\x29\xf5\ -\xdd\xdd\xfe\xf9\x93\xff\x88\xcd\x9b\xcf\x88\x9d\xb3\x7b\xf7\x77\ -\xf1\x0f\xff\xf8\xc9\x98\xf3\x7d\xf5\xef\x5f\x85\xe5\xc7\x24\xc3\ -\x8d\x1f\x3d\x7a\x14\x77\xec\xd8\x11\xdb\x5a\xe1\xe1\x87\x1f\x4e\ -\x7d\x08\x2f\x3d\x79\x23\xce\x3f\xff\x3c\x2c\x6b\x0a\x5b\x7e\xfc\ -\x71\xeb\xf1\xe1\x1b\x3e\x84\x47\x1e\xfd\x36\x6e\xbd\xf5\x56\x7c\ -\xed\x6b\x5f\x8b\x9d\x33\x39\x79\x14\xbb\x76\x7d\x13\xbb\xbe\xf9\ -\x4d\x88\x78\xf8\xc8\x8d\x37\xe2\x97\x2f\x78\x2d\x5f\x78\x42\x7a\ -\xc1\x90\x4c\x26\x29\xce\x29\x92\x85\xfd\x4c\xbd\x36\x1b\xe8\xbf\ -\x7c\xe1\x05\x78\xf0\x1b\xdf\x80\x78\x8d\x20\x08\xeb\xd6\xad\x4b\ -\x34\xce\x3f\xfe\xf1\xff\x83\xbf\xbf\xf9\x26\x84\xd1\xce\x3c\xcf\ -\xc3\xde\xbd\x7b\xb3\xef\xe8\xfb\xf8\xbd\x77\x5c\x85\x15\x2b\x56\ -\x44\x51\xce\x3c\xaf\x8a\x4f\xdd\x76\x2b\x4e\x7d\xc5\x2b\xac\x8f\ -\x4d\x15\x98\x9a\x9a\xc4\xc5\x97\x6c\xc7\xc4\xc4\xa1\x7a\xb5\x28\ -\x82\xa5\x4b\x96\xe1\xfe\xfb\xef\xc7\xe8\xe8\x68\xcb\x6c\xf0\xc3\ -\x1f\xfc\x00\xe7\x6c\x39\x07\xf3\xb5\xf9\x58\xe6\x08\xa3\xb1\x85\ -\xe9\xba\xfc\xf2\xcb\x71\xfd\x75\xd7\x65\x36\xb6\xfe\xe8\xdd\xef\ -\xc2\xaf\xbf\xf9\xcd\xf5\x11\xa8\xa0\xbd\xf0\xd2\x97\x6e\xec\x38\ -\x1f\x86\x4f\x64\x76\x66\x06\x17\x6e\xdb\x86\x89\x89\x89\xba\x6d\ -\x02\x1c\xb3\x6c\x39\xbe\x7a\xff\x7d\x18\x1b\x1d\x8b\x9e\xef\xd8\ -\xd8\x22\x54\xab\xf1\xd7\x66\xf3\x99\x9b\xb1\x6b\xd7\x43\xc1\xed\ -\xeb\x06\x3c\xf2\x9f\x0f\x63\xcb\xd9\x5b\x50\xf3\xfd\x68\xc3\xd8\ -\xd7\xbf\xfe\xf5\xb8\xee\xda\x6b\x5b\xe7\x09\x01\xde\xf5\xae\x3f\ -\xc2\x95\x57\xfe\x46\x2c\x39\xd7\x5e\x7b\x3d\x76\xee\xbc\x6b\x78\ -\x0a\x21\x6d\x0a\x5f\xd6\xcd\x9e\x1f\x19\xee\x02\xbc\xa3\xe2\x5a\ -\x04\x4b\x96\x2c\xc1\xc9\x1b\x96\xe0\xe4\x0d\x27\x06\xb2\x68\x2c\ -\x1f\xe7\xf7\xd3\x05\x27\x9d\x78\x02\x2e\x79\xdd\x85\xd8\xb9\xf3\ -\xde\x68\x2a\x9d\xfa\x3e\xf6\x3c\xf1\x24\x7c\x5f\x71\xd1\xb6\x0b\ -\xfa\x3c\x62\xd4\xd8\x1b\x4c\x2c\x65\xf7\xc5\x17\x6f\xc3\xea\xd5\ -\xab\x71\xf3\xcd\x37\xe3\xbb\xdf\xfb\x3e\xe6\xe7\xe6\x83\xf5\x41\ -\x0a\x88\x66\x2c\x45\x0b\x1d\x15\x89\xf6\x83\xf3\x3c\xc1\xba\x75\ -\xeb\xb0\x6d\xdb\x36\xfc\xce\xef\xfe\x8e\x75\x04\x23\x1c\x9d\xd3\ -\xa8\xeb\x55\x93\xd9\x36\xd6\x2b\xdb\x48\x87\x34\x3d\xb7\x86\x05\ -\x8d\xe7\x02\x91\xf8\x9e\x4c\xb1\x41\x6f\x69\x0a\x40\xa7\x4d\x11\ -\x3b\x25\xb5\x8e\x53\x00\xe3\xe3\xe3\xb8\xee\xfa\xeb\x31\x35\x35\ -\x1d\x1d\x77\xd6\x2f\x9c\x85\xed\x97\x6e\x4f\x7d\xdd\x1e\x78\xe0\ -\x41\x7c\xea\x33\x9f\x45\xa5\x3a\x12\xcd\x8c\x08\xeb\x81\x6a\xa5\ -\x8a\x4d\x2f\xdd\x84\xf3\xcf\xdf\x8a\xf3\x5f\x7b\x3e\x4e\x3b\xed\ -\x15\xa9\x1d\x40\x9e\x08\xce\xfa\x85\x33\x71\xe6\xe6\x33\xf0\xe4\ -\x53\x4f\x61\xe7\xce\xbb\x71\xdf\x57\xee\xc3\xde\xbd\x7b\xa1\xaa\ -\x18\xec\x21\x82\x94\x00\x00\x20\x00\x49\x44\x41\x54\x1d\x19\xc5\ -\xec\xec\x0c\x36\x6e\x3a\x19\xe7\x9e\xfb\x6a\x36\x54\x09\x29\x5b\ -\xbd\x53\xf2\xea\x97\x23\x45\x7d\x76\xa7\x56\xad\x5e\x8d\x2d\xaf\ -\x3c\x27\xb3\x09\xb2\x7f\xdf\x3e\x3c\xfa\xe8\x23\x6d\xdd\xea\x47\ -\x4f\x3f\xdd\xa8\xd8\x82\x90\xdc\x93\xc6\xee\xea\xb6\xdc\xbb\xfb\ -\x3b\xdf\xc6\xa1\x43\x8d\xf5\x07\xcb\x57\xac\xc2\x96\x2d\x5b\x50\ -\xad\x56\xed\x41\x04\x00\x1c\x3d\x3a\x89\x47\x1e\x79\x34\x08\x23\ -\x6d\x6d\x41\x61\xf3\x19\x9b\x9d\xd2\xb0\x61\xc3\x06\x6c\xd8\xb0\ -\x21\x3e\x87\xdf\xb1\x0d\xec\x2a\xd9\xee\xef\xec\x8e\xa5\x75\xc5\ -\xca\x55\x38\x67\xcb\x39\x75\x07\xb0\xc5\x94\xc6\x65\xcb\x96\xe2\ -\xec\x2d\x5b\x1a\x4d\x18\x55\xfc\xf8\x99\x67\xf0\xc8\xa3\x8f\xc6\ -\xa6\xd1\x9c\x7d\xd6\xd9\x0e\x16\x0b\x4e\x3a\xf1\x44\x6c\x39\xfb\ -\xec\x60\xd1\x42\xbd\x01\xb6\x7a\xd5\x2a\xb6\xec\xc9\xc0\x70\xc2\ -\xf1\xc7\xe3\x75\xaf\xdb\x16\x73\x8c\x00\xe0\xe9\xa7\x7f\x84\x7b\ -\xee\xbd\x2f\xe6\x18\xf5\xb7\xa4\xb6\x97\xbc\x5b\xb6\x9c\x85\xb3\ -\xce\xfa\x7b\xbc\xf0\xc2\x8b\x78\xf6\xd9\x67\x31\x39\x39\xd9\xb4\ -\xd9\xa9\x5a\x9c\xad\x46\x67\x14\x00\x8c\x8c\x8c\x61\xf1\xe2\x45\ -\x58\xbd\x7a\x35\xd6\xac\x5d\x83\xb1\xb1\xb1\x96\x8e\xe0\x25\x17\ -\x5f\x82\x17\x0f\xbc\x08\x81\x17\x38\x31\x69\x9b\xb6\x36\xb6\x03\ -\x68\xa4\x41\xa3\x48\x74\xd2\xa2\xef\x40\x03\xf7\x47\xa5\x69\x9a\ -\x64\x73\xb8\xd1\x30\x7d\xd1\x89\x1e\x44\x14\xbe\x02\x6b\xd7\xae\ -\x89\x5d\xeb\xb1\xc7\x1e\xc7\xd4\xf4\x4c\x74\xff\xa5\x4b\x97\xe1\ -\x9a\xf7\xbd\x17\xd5\x4a\x25\x55\xe5\x57\xbf\xfa\x55\x58\x7f\xec\ -\x7a\x3c\xfb\x5c\x23\xa0\xc7\xc6\x0d\x27\xe3\x82\x0b\x2e\xc0\x45\ -\x17\x6d\xc3\x29\x3f\x77\x0a\x2a\x95\x8a\xb3\xa3\x7c\xca\xa6\x4d\ -\x78\xd7\x3b\xff\x10\x57\x5d\xf5\x0e\x7c\xff\x7b\xdf\xc7\xd7\xbf\ -\xfe\x0d\xec\xda\xb5\x0b\x7b\xf6\xec\xc1\x5b\xaf\xbc\xd2\xda\x71\ -\x47\x08\x21\x39\x9c\xa2\xde\xf9\x72\xfd\x1c\x5c\x2a\xcb\xcc\xa3\ -\x5c\x1d\xde\x05\x3c\x92\x70\x63\xbf\xc4\xd2\x98\x14\xe6\xe7\xe6\ -\x12\x81\x0b\x3c\x4f\x1a\xe1\x61\x55\x53\x2b\x30\x41\xbd\x47\x2f\ -\xd3\x5c\xcb\xf9\x9d\xe8\x95\x7e\x3d\xcd\xee\xb9\xf0\xfd\x64\x90\ -\x06\xd5\xd8\x1e\x47\x6e\xf7\xd3\x60\x3f\x45\x4d\x7c\x1f\x8e\x04\ -\x66\x65\xc0\xb0\x57\xb7\xd9\x72\x3f\x65\xff\xa5\x52\xbb\x44\x59\ -\x51\x5f\x44\x07\xa4\xd0\xf0\xad\xce\x6b\x99\xcb\xb7\xf6\xcb\xa3\ -\x82\xa2\x45\x8a\xe0\xc4\x13\x4e\xc0\xf6\xed\x17\xe3\x8b\x5f\xbc\ -\x07\x13\x13\x87\xa3\xf7\xec\xa9\x27\x9f\xc2\xbd\xe2\x61\xdb\x85\ -\xe7\x17\x12\xee\x3a\x9f\x57\x54\x1f\x89\xdf\x7c\xfa\x19\xf0\x83\ -\xf2\x67\xcd\x9a\xd5\xd6\xf7\xba\x52\xa9\xe0\xd8\x63\x5f\x92\x7b\ -\xf3\xd6\xc6\xda\xc7\x7c\x7a\x5e\x75\xd5\xef\x0d\x48\x3e\x01\x5e\ -\xf5\x4b\xbf\x88\x3b\x3e\xfb\x69\xdc\xbd\xf3\x4b\xf8\xf4\xa7\x3f\ -\x8b\x5f\x7b\xd3\x1b\x71\xca\x29\x9b\xac\xe7\x2c\x59\xb2\x04\x6f\ -\x78\xc3\x1b\xb0\xe3\x8e\x3b\xf0\xda\xf3\xcf\xc3\x45\x17\x5f\x84\ -\x33\xce\x38\xbd\xad\xd7\xbe\x79\xd4\x6a\x6c\x74\x14\x67\x9e\xb9\ -\x19\x67\x9e\xb9\x19\xef\x7c\xe7\x1f\xe0\xc5\x17\x0f\x24\x1c\x38\ -\x42\x48\x7f\xbb\x9f\xca\xd8\xc0\xd6\x14\x3b\xab\x0b\x56\xb6\xb4\ -\xbd\x36\xbd\x12\x37\x63\x0a\xf6\xe2\x5c\x2a\x6b\xed\xb8\xa1\xa7\ -\xbd\xcf\x05\xa9\x4e\x9a\xb4\x7f\x29\x29\x28\x8f\x69\x21\xef\x70\ -\x57\x1a\xb0\x84\x74\x8b\xe3\x8f\x5b\x8f\xed\xdb\x2f\xc2\x17\x77\ -\xde\x83\x89\xc3\x87\xa3\xef\xc3\xa8\x74\x97\x5f\xf6\xba\x9e\xdb\ -\xb4\xf5\xbc\xad\xd8\x7a\xde\x56\x3e\x9c\x02\x58\xb6\x74\x29\xde\ -\xf8\xc6\xd7\xe3\xbf\x5e\xfe\xab\x89\x0d\xc6\xd3\x78\xeb\x95\x6f\ -\xc1\x95\xbf\x71\x05\x46\x46\x46\xba\x36\x75\x32\xcd\xc9\x25\x84\ -\xf4\xd7\x01\x19\x14\x5f\xae\xda\x3d\x65\xb4\xdc\x1a\xa6\xdc\xdc\ -\xf3\x2a\xa8\x04\x9b\x72\x5a\xed\x37\x07\x13\x20\x18\x19\x1d\x2b\ -\x2c\xd7\x84\x3d\x8c\xe1\xb4\x89\x68\xee\xba\x31\x0d\x2d\x0c\x32\ -\x10\x46\x3d\x13\x9b\x99\xaa\xc1\x94\x0f\xcd\xd9\xa0\xd6\xf0\xff\ -\x71\x8d\x44\x82\xeb\x49\x32\x49\x4d\x07\xcf\xd7\xe6\x53\x66\xc4\ -\xa7\x26\x18\x35\xbf\xd6\x98\xc2\x61\x39\x21\xea\x19\x0c\x47\x50\ -\x8c\x69\x2c\x8d\xa0\x59\xbe\x53\x6f\x40\x2d\x3c\x3f\xd0\xb5\xe6\ -\x10\x38\x22\x97\xa3\x92\x1a\x7c\x41\x53\xef\x53\xa9\x54\x1b\xd3\ -\x5d\x3c\x41\xb5\x5a\x89\x6f\x74\x1b\xfc\xeb\x55\x1a\xaf\xab\x57\ -\xa9\x38\x35\x42\xca\xdb\xe5\x61\xec\x5f\x20\x1d\xde\x46\x1c\xbf\ -\xcf\x4d\x9b\xd1\xe7\xe8\xaf\x46\x9d\x2f\x27\x1c\x7f\x1c\x2e\x0d\ -\x46\x8c\x0e\x07\x8e\xd1\xd8\xd8\x28\x5e\x71\xea\xcf\xf7\xc5\x9e\ -\xb2\xeb\xd5\xd7\xb7\xd6\x18\x91\x76\xb1\x47\x44\x50\x1d\x71\x6b\ -\x4a\x8c\x8c\x70\xc6\x3e\x21\x74\x98\x12\x85\x48\x7b\xf5\x6c\x87\ -\x7d\xea\x62\xcc\xc8\x01\x64\x21\xaf\x29\x4a\x46\x10\xfb\xfc\x9d\ -\x9f\xc3\xcc\xec\x2c\x3c\xcf\x83\x34\x45\xf0\x11\xa3\x91\xdb\x58\ -\xda\xaa\x4d\x11\x7a\x8a\x7b\x82\xb7\xdc\x72\x1b\xae\xf9\xd3\xf7\ -\x45\xfb\x61\x79\x9e\x17\x85\xb8\x6d\xe6\xcf\xff\xec\xcf\xf1\x5b\ -\x6f\x7b\x1b\x44\xc2\x10\xd8\x46\x78\xd9\xc0\x81\xf9\x6f\x57\xbc\ -\x05\x0f\xed\x7a\x30\x7f\xa3\x2d\xe5\x98\x03\x07\x0f\x60\xe3\xc6\ -\x4d\x10\xaf\x69\x19\xaf\x1a\xd9\x4a\x04\xb3\xb3\x73\x4e\xd1\xf1\ -\x3e\xbb\x63\x07\xbe\x7c\xdf\x7d\xb1\x63\x9b\xf5\x0c\x23\x2a\x5d\ -\x73\xcd\xfb\xf0\x07\x57\x5f\x1d\x3b\xf7\x3d\xff\xfd\x8f\xb1\x63\ -\xc7\x1d\xc1\xb3\x51\x78\xe2\xe1\x85\x9f\xbd\xe0\xa4\xf1\xd6\xd7\ -\x6c\xc5\x8f\x9e\xf9\x51\xb4\x56\xc8\xf3\x3c\x1c\x6e\x8a\x96\xd5\ -\x8d\xb6\xed\xad\xb7\x7d\x0a\x77\xed\xbc\x3b\x5a\x2b\x24\xe2\xe1\ -\x8a\x2b\xae\xc0\x13\x7b\x9e\x88\xee\x25\xa8\xaf\x33\x33\xf9\xe8\ -\xff\xfa\x9f\xf8\xd0\x07\xdf\x1f\x45\x97\xf2\x55\xb1\xfe\xd8\xf5\ -\x2c\x6c\x4b\xeb\x13\xd2\x2b\x6a\xe6\xb8\xf5\xc7\xd6\x47\x8c\xee\ -\xba\x07\x33\xb3\xb3\xb8\xf0\xc2\xf3\xf1\xf3\x3f\x77\x0a\x85\x21\ -\x84\x10\x52\x1a\xb7\xc0\xdd\x29\xca\xeb\x91\xd9\x1a\x05\x5e\xe8\ -\x52\x14\xbc\x8f\x4d\x01\x2e\xd2\x49\x1b\x4e\x2a\xf0\x7a\xd2\xb6\ -\x86\x47\x26\x0e\x63\xff\xfe\xfd\x0d\xaf\x20\x4d\x5e\x55\xac\x5d\ -\xbb\x06\xa7\x6c\x7a\x69\xcb\x6b\xf9\xbe\x9f\xbe\x89\x9e\xba\x69\ -\x92\x76\xdf\xfd\xfb\xf7\x15\xa6\xd3\xd4\xe4\x24\xf6\x4d\x4e\x3a\ -\x68\x32\x11\xb7\x49\x04\xe3\x07\x0e\xd6\xf7\xe4\x68\xa1\x93\x2d\ -\xad\xcf\xfe\xf4\xa7\x0d\x8d\xad\xe7\xd7\xd7\xf6\xcc\xcd\xcd\x62\ -\x64\xc4\x6d\xd1\x6e\x2b\x47\x70\x6a\x6a\x12\x53\xfb\xe2\x69\xad\ -\x78\x1e\x36\x6e\xdc\x68\xcd\xff\xe1\xf7\x6b\xd6\xae\xc1\x9a\xa6\ -\x79\xf2\x3d\xeb\x51\xce\x5e\x02\xd5\x99\x1b\x59\xd4\x12\x46\xcd\ -\x79\xdd\xbc\xf7\x75\x4d\x56\xb5\x5b\x2e\xf5\x80\xd7\x35\x22\x38\ -\xfe\xb8\xf5\xf8\x95\xcb\x2e\xc1\xe4\xd1\x49\x6c\xda\xb4\x91\xa2\ -\x10\x42\xc8\xf0\xf8\x13\x40\xb5\x92\xde\x60\xd0\x78\x3c\xcc\x64\ -\xf5\xeb\x36\x33\xab\x43\xeb\x9c\xda\x11\xd5\xfe\xab\xd8\x3f\xb4\ -\x9b\x26\x48\x07\xe9\x75\x5d\x7f\xe2\xd8\x52\x75\xdd\xcf\xa8\x6b\ -\xf9\xb1\xb8\x96\x55\x6f\xcf\xeb\xb0\x11\x38\x20\xaf\xc1\x50\x59\ -\x49\xc5\xca\xcd\xfa\x9c\x01\x0b\x08\x21\x84\x90\x5e\x51\x15\x89\ -\xaf\x5d\x11\xd5\x0e\x1b\xc6\xda\xba\x69\xd0\xf3\xa1\x21\x69\xe5\ -\x2d\x74\xa5\xc1\xdc\xae\x13\x92\xe6\x59\xb7\xeb\xd8\x35\xd6\x26\ -\x69\x6c\xcf\xbe\x8a\x57\x4d\x6d\xb4\x6b\xca\x73\x57\x5f\xcd\x8d\ -\xd8\x5b\x67\x08\x69\x3a\x50\xdb\x5c\x83\xa1\xee\x2e\x9a\x34\x85\ -\xc9\x56\x73\x3d\x52\xf4\xd9\xb6\x7a\xca\x65\xae\x7c\x76\xb6\xd5\ -\x54\x4b\xd5\xb0\xc1\xae\x53\xbb\xeb\x82\xe6\xe7\xeb\xfb\x7c\x98\ -\x7b\x26\x75\xcf\x0f\x0d\x62\xfd\x66\xcd\xfd\x75\x7c\xbf\x45\xb5\ -\xbb\x8e\xb7\xe6\xfb\x5d\xb2\xde\x3f\xd7\x72\x2b\x7b\x5f\x5f\x42\ -\x08\x21\x64\xb8\x90\x36\x0e\xf6\xcc\x76\x41\xbb\x7e\x47\xbe\x06\ -\x81\x98\x33\xd9\x46\x25\x6a\x48\x56\x07\x43\xc0\xe2\x5b\x47\x47\ -\x8e\x1e\xc1\xf8\xf8\x38\x20\x45\x9a\xd2\x68\x05\x1f\x39\x7a\xa4\ -\xed\x44\xab\x63\x96\x98\x9e\x9a\xc2\xa1\xf1\xf1\xa4\x7b\x14\x98\ -\xa1\x50\xa8\x2a\x46\x46\xaa\x38\x66\xf9\x8a\xe8\x3c\xcf\xf3\x52\ -\x17\xc6\x1e\x39\x72\x04\xb5\x5a\xad\xbe\xd9\xa8\x0a\x26\x8e\x1c\ -\xc6\xb2\xa5\xcb\x0c\x9f\x45\x63\x51\xa4\x42\xc2\xeb\x4b\x70\xf3\ -\x5a\xad\x86\xa3\xa9\x1a\xa0\xc5\xb9\xf5\x54\xcc\xce\xcc\x60\x66\ -\x66\x3a\x53\xb9\xb1\x45\x8b\xb0\x74\xd9\x31\x30\xd7\x52\x35\x3b\ -\x23\xe2\x79\xa9\xfb\x55\x2c\x59\xba\x14\xc7\x1c\xb3\x3c\xb0\xb8\ -\xee\x38\x4e\x4c\x1c\x4a\x38\x8a\xe3\xe3\x07\x51\x1d\x19\x05\x70\ -\xb4\xf5\xd3\x13\x89\x34\x07\x80\xe9\xe9\x69\x1c\x73\xcc\xf2\x68\ -\x37\x7a\x49\x75\xfe\x24\x75\xaf\x96\xe9\xe9\x69\x4c\x4f\x4f\x27\ -\x13\xde\xec\x48\x28\x70\x4c\xca\xae\xf1\xc3\xf1\xce\x2e\xb4\x0a\ -\x82\x10\x42\x08\x19\x60\x74\x38\xf6\x4d\xac\x42\xc3\xa8\x5e\x7e\ -\xe8\x28\x39\x39\x15\x89\xaf\x9d\xa3\x48\x69\xe0\x20\x7a\xc1\x70\ -\x44\x7b\x3d\xc6\xe6\x3e\x10\x79\x47\x67\xde\xf6\xf6\xdf\xc6\xc8\ -\xc8\x48\x97\x1a\x44\x02\xbf\x56\x83\x9f\xb2\x71\xa9\x8b\x9d\x4e\ -\x53\xaf\x54\x71\xdd\xf5\xd7\xe3\x2f\x6f\xfc\x08\x5a\x2d\xa8\x10\ -\xaf\x82\x9b\x6f\xba\x09\xb7\x6f\xbd\x2d\x76\xc4\xba\x75\xeb\x62\ -\xb6\xcc\xcc\xce\xe2\xdc\x73\xb7\xe2\x27\x7b\x7f\x1c\x3d\x8f\x45\ -\x8b\x16\xe3\x6b\xff\xf7\xab\x58\xbb\x76\x2d\xe6\xe6\xeb\xd1\xe4\ -\x0e\x8d\x8f\xe3\xe5\xa7\x9e\xda\xb4\x89\x21\xb0\x71\xe3\x26\x3c\ -\xf0\xe0\x37\x50\xf1\x2a\x91\x73\xf2\xad\x6f\x7e\x0b\xdb\x2f\xbb\ -\x34\xf3\x45\x79\xd3\x9b\xde\x8c\x8f\xfd\xef\x8f\x35\x59\xad\xf8\ -\xdb\x8f\x7e\x0c\x1f\xf8\xe0\x07\x92\xb9\x46\xe3\xee\xe2\x5f\x7d\ -\xe4\xc3\x78\xff\xfb\xaf\x0b\x82\x62\x48\x52\x81\x60\x5f\xa0\xe6\ -\xb4\x86\x76\x7f\xf5\xab\x5f\x81\xef\xfb\xd1\x79\xb3\x33\x33\x38\ -\xed\xb4\xff\x82\xc3\x13\x0d\x87\x6f\x7c\x7c\x1c\x2f\x3f\xf5\xb4\ -\xcc\x96\x6f\xda\xfc\xd8\xad\x5b\xb7\xe2\x87\x3f\x78\x3c\xda\x73\ -\x48\x52\x9e\xad\xaa\x62\xc9\x92\x25\xb1\xe7\xa0\x00\x3e\xf0\xc1\ -\x1b\x70\xd3\x4d\x7f\x87\xc6\x56\x8b\xcd\xee\x72\xb8\x43\xa3\xe0\ -\x53\xb7\xdd\x8e\x8b\x2e\xda\xd6\xbb\x56\xbe\xb8\x77\x3a\x34\x9e\ -\xa6\xa6\x16\x0b\xce\xe5\x8c\xf9\x73\x97\x9c\x0d\xb5\x78\x33\x92\ -\xb0\x37\xa3\x3c\x0c\xdf\x0b\xaf\x02\xcf\xab\x14\x33\x6a\xdc\x51\ -\x3d\x35\x98\x15\x55\xa7\xe5\x7b\x59\xec\xa7\xee\xd4\x9d\xba\x53\ -\xf7\x05\xa3\xbb\x1f\xd8\xe3\x99\x7e\x81\x39\x13\x29\xfc\xec\xa5\ -\xb7\x0b\xf2\x46\xa5\xd5\x0c\x47\x2d\x31\x61\xcd\x18\x92\x9a\xaf\ -\x45\xf5\x76\xdf\x46\x8a\xa4\x47\x0f\xd3\x76\x97\x70\xe1\x7e\x4f\ -\x33\xb0\xd3\x31\xee\xba\x4c\x4e\x4e\x62\x32\x23\x48\x81\x78\x1e\ -\x96\x2d\x5b\x86\x75\xeb\xd6\x65\x5e\xef\xe0\x81\x03\x38\x78\xe0\ -\x40\xf4\x79\xd1\xe2\x25\x58\xbb\x76\x2d\x56\xae\x5c\x19\xcf\x64\ -\x86\x89\x95\x6a\x05\xeb\xd6\xae\xad\xff\x77\xb0\x9b\xf9\xb2\x65\ -\x4b\x9d\xd2\xb0\x68\xd1\x22\xac\x5d\xb3\x26\x16\x1a\x71\xb1\x65\ -\x43\x47\x73\xaa\xe0\xf2\x15\x2b\xb0\x7c\xc5\x8a\xb6\x9e\xc5\x9a\ -\x35\xf1\xcd\xfd\xa6\xa7\xa6\x52\xe7\x3a\x35\xeb\x91\x87\xf9\xb9\ -\x79\xbc\xe4\xd8\x97\xe4\xdf\x4b\x48\x15\x47\x0e\x1f\xc6\xc1\x03\ -\x2f\xb6\x3e\xce\xf3\x30\x3b\x33\xd3\xe3\x0c\x5c\xe6\x10\xe0\xe5\ -\xc3\xf3\x95\x22\x10\x42\x08\x19\x7a\x64\x18\xda\x07\x7e\x0d\xd5\ -\x46\x33\x53\x0c\x57\xcd\x48\xb0\xd1\xf3\x9b\x76\x44\xeb\x96\x7f\ -\xdc\x33\x53\xcf\xef\xec\x01\x38\x4e\xd6\x17\x94\x64\x6f\x8a\x60\ -\xb4\x20\xb4\x25\x1c\xb1\x48\x8e\x70\x14\x6f\xab\xe7\xb0\x29\xad\ -\xfa\x7e\x72\xbc\x29\x65\x04\x46\x55\xe3\x6b\x65\x82\x63\x42\x67\ -\xa8\xf9\xb8\x60\x62\x5a\x86\x6d\x5e\xec\x1e\x02\x40\xbc\x0a\x92\ -\xfb\x20\x75\x7f\xab\xd2\x22\xef\x50\x5f\xef\x24\x6d\xe5\x93\x32\ -\xe6\x6b\x09\x7b\x74\x12\x8f\xd3\x8b\x3d\x27\x41\x3c\xca\x4c\x63\ -\x97\x1f\xb3\xab\xc6\x36\xca\x56\x40\xcf\x42\x27\xef\x8a\x61\x67\ -\x63\xa4\x4b\x32\x6e\x6f\x84\xe9\x13\x45\xcd\xd3\x12\x14\x3b\x83\ -\x39\x8f\x4f\x06\x7c\x31\x16\x75\xa7\xfd\xd4\x9d\x76\x2f\x28\xfb\ -\xeb\x7b\x9b\x18\xf5\x74\xdc\xaf\x90\x68\xc9\x79\xd0\xfe\xf5\x83\ -\x7a\xd5\xb3\xf8\x0f\xda\x69\x78\x5a\xe3\xba\x46\xb3\x32\xda\xd7\ -\x32\xb4\xbb\xd1\xd2\xe9\x3d\xda\xab\x49\xf7\xa5\xca\xf4\xd2\xa7\ -\x17\xc7\x73\x78\x1e\x76\xdd\x92\x2f\x9e\xb8\xa5\xaa\x1d\xed\x2d\ -\xa7\xf4\x64\x60\x51\x06\x28\xdf\xf5\x38\x5f\xab\x70\xd4\x23\xa7\ -\x60\xd4\x80\x10\x42\xc8\xf0\x33\x2c\x11\x85\x44\x50\x0d\xd7\x12\ -\x89\xb5\x61\x68\x34\x80\x35\xbd\x27\xd5\xda\xb0\x34\x3d\xc6\xc8\ -\x53\x94\x60\x1b\x98\xf6\xc4\x74\xdd\x79\x5b\x01\x2c\x5e\xb2\x14\ -\xab\x56\xd5\xa7\x4b\x49\xe0\x11\x16\xfd\x0c\x5b\xa6\x23\x58\x80\ -\xbf\x62\xe5\xaa\xe8\x2b\x2f\xb2\x23\x7e\x9e\xef\xfb\x18\x5b\xb4\ -\x18\x2b\x57\xd6\xed\xf5\x2a\x9e\x61\xab\xb8\xd9\xae\xe1\x92\x2d\ -\xc5\xa2\xc5\x8b\x32\x75\x16\x11\xac\x5c\xb1\x0a\x53\x53\x53\x91\ -\x6e\x4b\x16\x2f\x49\xd8\x29\x9e\x87\x35\xab\xd7\xc2\x47\x63\xa4\ -\x6f\xf5\xea\x35\x89\xeb\x57\x47\x47\xb1\x32\x48\x6f\x38\xe2\x14\ -\x3b\x24\x78\x7c\x61\xb0\x80\xe6\x11\xb4\xb1\xb1\x31\xac\x5a\xb5\ -\x06\xf5\xe5\x38\x1e\x14\xc0\xd2\x65\xcb\xa0\xaa\x91\x3d\xed\x62\ -\xd3\xdd\xf3\x2a\x58\xb1\x62\x55\x30\x4a\xd5\x7c\x5c\xa4\xba\x9b\ -\xd3\x14\xa4\x6b\xc5\x8a\x15\xf0\x7d\x3f\x31\x82\x96\x85\x5f\xab\ -\x61\x49\x53\x7e\x0d\xa3\xd3\x25\x47\x6a\x05\x8b\x16\x2f\xee\x7a\ -\x4f\x91\x36\xbf\x6f\xbe\x1f\xed\x33\x96\xcc\x40\x9a\xea\xbc\xaa\ -\xcd\x81\x36\xa3\xb4\x25\xc6\x8c\xa4\xd8\x04\x48\x67\x87\x47\x4e\ -\xa1\xcd\xd9\x09\x9f\x43\x2d\x7c\x01\x1c\xca\x85\x5e\xf8\x66\xc6\ -\x9c\xf9\x81\xf1\x29\x1d\xcb\xf7\xb2\xdb\x4f\xdd\xa9\x3b\x75\xa7\ -\xee\xc3\xae\xbb\x02\xf0\xa1\x40\x10\x15\x17\xe1\x7a\xfd\xc4\x40\ -\x8f\xb9\xc6\x27\x3e\x13\xc3\xee\x88\xe4\xab\xc0\x15\x19\x6b\x92\ -\x4c\xbb\xbc\xc6\x88\x96\xc8\x97\x7f\x53\x73\xdd\x3c\xd1\xe8\xd1\ -\x8c\xd6\x84\xf1\x6f\xa5\xfe\x1f\x2f\xab\x6e\xc0\xf7\x5e\x73\x3d\ -\xaa\x5e\xa5\xab\x99\x39\x5a\x47\x35\x37\x8b\xe6\x85\xf1\x66\xf4\ -\x66\x18\xe1\x97\x5b\x45\x53\x6e\xd9\xce\xd2\x46\xbb\x49\x34\x2e\ -\xbe\x88\xc0\x33\x1a\xc9\x69\x4e\x11\x00\xd4\xe6\xe7\x33\x3d\x37\ -\x71\x79\x64\x0a\x54\xaa\xd5\xcc\x97\x46\x55\x31\x3d\x33\x83\x6a\ -\xa5\x12\xa5\x51\x44\x12\x21\x9f\x55\x15\xf3\xf3\x73\x81\x73\xd6\ -\x18\x12\xad\x54\xd2\x8e\x9b\x6f\x6d\x7b\xd3\x79\xe6\xb4\xc2\x5a\ -\xad\x16\x3b\x3e\x74\x2e\x3a\x75\x8a\x6c\x85\x88\xaa\x62\x76\x66\ -\x16\x5e\x45\xd0\x88\xa1\xe7\xa6\x79\x18\x0d\x2e\x4c\x93\x6a\xc3\ -\xce\xbc\x4e\x51\x98\x6e\xdf\xaf\xc5\xf2\x6b\xfd\xba\x71\xdb\x2b\ -\x95\x6a\xcf\x9c\xa2\x4b\x1e\xbc\x11\xf7\x1c\xdc\xdd\xd8\x9c\x2d\ -\xe1\x6d\x9a\xe5\x80\xa4\x95\x7d\x4d\xeb\x2a\xa5\x18\x2f\xa6\x60\ -\xa7\xa8\x61\x9d\xc6\xf2\x8b\x26\x23\x2e\xa4\x96\x87\x91\x57\x58\ -\x15\x5c\xb9\xea\x3c\xdc\x72\xe6\x6f\xb3\xd2\x64\x63\x85\xba\x53\ -\x77\xea\x4e\xdd\x87\xda\x29\xfa\xe8\x9e\x2f\xe1\x3d\x3f\xf8\x17\ -\xc3\x29\x8a\xb7\x0b\xc4\x8b\xd7\xab\x91\x33\xe4\x79\xc5\x19\x82\ -\xec\xb5\xf9\x51\x75\x1e\x06\x46\x5a\x1c\x39\x28\xa8\x02\x6a\xb4\ -\x1d\x5a\xcf\xe1\xd3\xcc\x16\x7a\xc6\x3e\x45\xe2\x66\x74\x51\x84\ -\x77\x1f\x19\x19\x2d\xf5\xcb\x18\xb5\x2d\x83\xcc\xe1\x8d\xf6\xd6\ -\x5e\x91\xf4\xf0\xd0\x69\x54\xab\x23\x99\x85\x88\x88\xb4\x15\xdd\ -\x2f\x4a\xbf\xe7\xf5\x3c\xfd\x63\x8b\xc6\xfa\x9e\x2f\x42\x27\x2a\ -\x6d\x8d\x56\x5f\x0b\x6f\xeb\xfc\xc5\xe0\x7b\xdf\xad\x1c\x30\xd7\ -\xe8\xb4\x08\x1b\x53\x6c\x01\x90\x75\x79\x9b\xaf\x13\xad\x7d\x72\ -\x8c\x92\x69\x74\x02\xa9\xb1\xd4\x88\x10\x42\x08\x19\x26\xa2\x15\ -\xb7\x61\xa7\xa9\x25\xba\xac\x26\x2a\x4a\xc9\xf8\xec\xea\x04\xb9\ -\x56\xcc\xf1\x7a\x3d\x62\x36\xf8\x7d\x14\xe8\x6b\xb8\x08\xe5\x32\ -\x05\x42\xc8\xd0\xc2\x02\x8e\x10\x42\x08\x19\x94\x3a\xbb\xaa\xc6\ -\x3e\x45\x5d\x77\x60\x9a\xe2\x98\xb3\xf3\x94\x90\x21\xf7\x07\xa4\ -\x98\xcb\x98\x48\x4e\xf7\xc3\xba\x4f\x52\xd6\x76\x08\xa2\x6d\xa6\ -\x47\x59\xbe\x11\x42\x08\x59\x18\xd5\xb7\x88\xfd\x0c\x4d\xaf\xa9\ -\xd5\xb8\x93\x64\xcc\x50\x4b\x8c\x23\xb9\x4e\x38\x49\x0f\x7e\x1b\ -\xc5\x48\x68\x3e\x9d\x1b\x8f\x10\x42\x48\xe1\xd0\x25\x22\x84\x10\ -\x42\x06\x89\x6a\x0b\x97\x2e\x9f\x47\x46\x08\x21\x59\x51\xda\x8c\ -\x92\xa5\xdd\xe2\x44\x0b\x3e\xde\xba\xf6\x27\xef\x3e\x09\xb1\x6d\ -\xdf\xe8\x18\x11\x42\x08\x19\x0c\x0a\xaf\x8f\xb3\xa6\x98\x79\x92\ -\xeb\x7a\xbd\x70\x3f\x38\x52\x44\x08\x21\x5d\xc0\x67\x0f\x12\x21\ -\x84\x90\x05\x40\x6d\x48\xea\xbb\x6a\xd2\xb1\x6b\x8e\x27\xdd\x86\ -\xab\x28\xf9\x4f\x21\x84\x2c\x30\x3a\x5d\x73\x54\xd4\xf9\x8e\x07\ -\x3a\xef\xc5\xea\x35\x4e\x9b\xf1\x67\xf9\x9c\x09\x21\x84\x0c\x04\ -\x9d\xcc\x6d\x98\xad\xcd\x27\xae\x10\x46\xc9\x0d\xf7\xf9\x4b\xc4\ -\x9a\xf3\xc3\xfa\x55\xf2\xd5\xb3\x5d\x4c\x10\x47\x8a\x08\x21\xdd\ -\x2d\x2d\x17\xa4\x5e\x8a\x03\x7a\x84\x3a\x10\x42\x08\x19\xf2\xe6\ -\x81\xe2\x85\xf9\x89\xc1\x4f\x88\xa6\x39\x45\xa2\xf9\x47\x89\xc2\ -\x46\x53\x8e\x86\x13\xf7\xed\x20\x64\x00\x4b\x8c\x22\x9d\x2c\xe9\ -\xe1\xf9\x8a\xe4\x8e\xcd\xe2\x7e\x23\xe7\x62\xd1\xaf\xff\x55\x64\ -\x04\x4f\xce\x3c\x8f\x99\x79\x8e\x16\x11\x42\x08\x19\x6e\x1e\x3e\ -\xfa\x4c\x53\x3d\x5b\xff\x0f\xd5\xfa\x5f\xa2\xfe\x2d\xaf\x77\xd7\ -\xdf\x91\x22\xfa\x45\x84\x0c\x12\x7c\x63\xf3\xb0\x77\xf6\x00\x9e\ -\x9c\x7c\x8e\xaa\x11\x42\x08\x19\x5a\x0e\xcd\x1f\xc5\xb7\x0f\xfd\ -\x64\x28\xd2\xe2\xb5\x6a\xfe\x74\xa5\x32\xf7\x24\x88\x38\xc1\xa6\ -\x02\x21\xfd\xc2\xb5\xe3\x26\x7a\x53\xf3\x0e\xed\x76\xfb\x15\x57\ -\xe3\xaf\x6b\xf6\xb4\xd7\xc5\x55\x83\x8f\x1a\x7c\x7c\x62\xff\xff\ -\x6b\xda\x8b\x81\x10\x42\x08\x19\xae\x96\xc4\xed\xfb\x1f\xc2\xc1\ -\xd9\x69\xa0\x22\xf5\x3f\x18\x7f\x89\xfa\x37\xfc\x5e\x4a\x37\x6d\ -\x8c\x6b\x8a\x08\x21\xee\x8e\x0e\xc9\xc5\x27\x7e\xf6\x75\xec\x3e\ -\xbc\x97\x42\x10\x42\x08\x19\x3a\x9e\x9b\x1d\xc7\x0d\x4f\xde\x33\ -\x34\xde\x44\x22\x19\xe1\xdc\xf9\xae\x4f\x01\x14\x46\x9f\x23\xa4\ -\x9f\xfe\x8d\x8b\x8f\xa3\x5a\xff\x9b\xf5\x6b\xc1\x89\x61\xef\x8e\ -\x71\x01\x4f\x01\x4f\xdd\xaf\x1b\xfc\x39\x0f\xe0\xd8\xd6\x04\x15\ -\x35\x22\x65\xbd\x4e\xde\x1b\x04\xc7\xcf\xf9\xc0\x9c\x8f\x49\x4c\ -\xe3\x8a\xc7\x3f\x8e\xfd\x93\x07\xb3\xf7\x6c\x20\x84\x10\x42\xca\ -\x4e\xd0\x30\x98\x98\x9f\xc6\x5b\xbf\x7b\x0b\xf6\xce\xbd\x18\x78\ -\x13\xc1\xa2\x5a\x73\x2a\x87\x63\x35\x5a\xf8\x04\x93\xb0\x01\x63\ -\x6d\x56\x68\x62\x26\x47\x9f\x7d\x3b\x36\x12\x08\x19\x2c\x57\x8a\ -\xe4\xe5\xb1\x99\x7d\xb8\x78\xf7\xdf\xe0\x89\x23\xcf\x52\x0c\x42\ -\x08\x21\x03\xcf\x73\x73\x87\xf1\xc6\xef\x7c\x02\xf7\x1e\xdc\x3d\ -\x54\xe9\x4a\x38\x45\x2a\x9d\xc6\x0a\x0f\x7c\xbd\xc4\x85\x02\x8f\ -\xb1\x56\xff\x3b\x82\x49\xcc\xfb\x3e\x73\x16\x21\x3d\x20\xef\x12\ -\x9c\xe8\x6d\x0e\x06\x86\x8e\xd4\x66\xdc\xee\xa3\xd2\xd8\xeb\x2c\ -\x87\x5d\xae\xc5\x4a\xbf\xa2\xd8\xb4\x5d\x2e\x4e\xd7\x80\xe9\x1a\ -\xbe\x3b\xfd\x0c\x5e\xf9\x9d\x0f\xe1\x86\xa7\xbe\x80\x9f\x4e\x1f\ -\x84\xaa\x1f\xf4\x62\x75\x2a\x8c\xed\x39\x04\x51\x7f\x48\x6f\xf3\ -\x09\x75\xa7\xee\xd4\x9d\x0c\x9d\xee\x41\x34\x39\x28\x0e\xcf\x4f\ -\xe2\x1f\x7e\xfa\x00\xce\xf9\x8f\x8f\xe0\xde\x83\xdf\x06\xe0\x03\ -\x52\xab\xff\x99\xf5\x97\x39\xf4\x13\x54\xa4\xb6\x11\xa1\x8c\x81\ -\x9d\x36\xdc\x91\xd6\x6b\x96\x24\xf8\x5f\x33\xd5\x7e\x3d\xd4\x71\ -\x4c\xe2\xe8\xfc\x34\x16\x8f\x8c\x32\x87\x13\x52\x72\xf6\xce\x8d\ -\x03\xc2\x25\x88\x9d\x70\x70\xfe\x28\xfe\x6c\xdf\x0e\x7c\x78\xff\ -\x5d\x38\x6b\xe9\x06\x9c\xb3\x74\x23\x36\x2c\x7a\x09\x96\x54\x46\ -\xe0\x21\xac\x28\x24\xda\xe8\xae\x2d\xa7\x48\xe2\x35\x8c\xaf\x0a\ -\x0f\x02\xf5\x04\xa2\x02\x11\x6d\x44\x4c\x2d\x1b\x69\xb6\x8b\x40\ -\x85\xb6\xd3\x76\xda\x4e\xdb\x69\x7b\xba\xed\x1e\x54\x50\x8c\xed\ -\x12\x77\x18\x10\xb8\x42\xb3\xbe\x8f\x7d\x33\xe3\xf8\xcf\x89\x9f\ -\x60\xd7\xd1\xa7\xf1\xdc\xec\xa1\xba\x33\x34\x6c\x61\x09\x34\xc5\ -\x29\x32\x77\x9c\xed\xf8\xe1\x99\x17\x0a\x1a\x56\x93\xfe\x2c\xf6\ -\x1c\x7d\x0e\x6b\x17\x2f\x67\x6b\x89\x90\x1e\x96\xa5\x79\x79\x7a\ -\xea\x79\x3c\x3b\x77\x28\xe8\x71\x71\x2b\x21\xa4\xb8\x92\xa4\xb8\ -\x84\x64\x14\x86\xad\xae\x6f\x4d\x8d\x58\xce\x37\x87\x95\xa6\x1b\ -\x67\x4e\x60\x0a\xf7\x4f\x3f\x8e\xfb\x5f\x7c\x1c\xa8\x04\x5f\xd6\ -\x82\xdf\xbd\x9c\x95\x8c\xfa\xb1\x72\x35\xfa\x5c\x09\xee\xef\x9b\ -\xf6\x49\xba\xfd\xbe\x71\x9d\x7e\x67\xd4\xb0\xbb\x30\x72\x10\xbd\ -\xf4\x74\x87\x7a\xf5\xbb\x01\x43\xdd\xa9\x3b\x75\xa7\xee\x65\xd3\ -\xdd\xb5\xde\xb0\x11\x3e\xaf\x8a\x17\xbf\x5f\x34\xc9\xcb\xcf\xa8\ -\x47\x35\xdd\xbe\x48\x67\xed\x6e\xfd\x1e\x3d\x5f\xf7\x53\xbc\x7e\ -\x3e\xdc\x6f\x1c\x7e\x82\xad\x55\x42\x4a\xce\x37\x0f\xed\xa1\x08\ -\x84\x10\x42\x08\x19\x6a\xaa\x36\xc7\xaa\xf8\x1e\xd9\xd0\xb3\xad\ -\xdf\x40\xaa\x55\xdc\xf6\xb3\x5d\x78\xf7\xc9\x17\x01\x00\x46\x2a\ -\xe9\x33\xf9\xba\x66\x0e\x21\x24\x13\x55\x1f\x9f\xdc\xfb\x00\x1a\ -\xfd\x27\x35\xa7\xd7\xdc\xf6\x1e\x0f\x2d\x89\x11\xa3\xb0\x87\x2c\ -\xf8\x21\xea\x18\x93\xb8\x8c\xa6\x9c\xb5\xac\x12\x2f\xec\xf9\x32\ -\x7b\xdc\xc2\xd3\x82\xcf\x35\x3f\xfe\x7b\xe6\xc0\x9d\x67\x49\x8f\ -\xe5\x04\xb3\x47\x32\x6b\x22\x78\x64\x6f\x96\x8e\x86\x6e\x56\xbb\ -\xbd\xd6\xfa\x67\xdf\xc8\xed\xb8\xc8\xee\xac\xe7\xe2\xc5\x9f\x5f\ -\xa6\xfd\x3d\xd2\x3d\xeb\xc5\x2c\xab\xee\xce\xf6\xf7\x58\x77\xcd\ -\x5b\xa2\x51\xf7\x9e\xea\x3e\xa8\xe5\x8c\xb3\xfd\xed\xea\x8e\xf4\ -\x7a\x02\xb6\xf4\x88\xd1\x6e\xcf\xc8\x16\x89\xe2\xd1\xf5\x84\x5e\ -\x57\xcc\xd9\x87\xf7\x75\x0c\xf3\xd1\xa9\xbd\xb8\xfb\x85\xe1\x8a\ -\x5c\x41\xc8\x30\xf1\xd0\xe1\x3d\xf8\xca\x8b\x1c\xd1\x25\x84\x10\ -\x42\xc8\x70\x53\x75\xee\x18\x68\x9b\xf4\x1e\x36\xad\xd5\xbb\x48\ -\xff\xe4\xe9\xcf\x61\xeb\xaa\x97\x63\x85\x65\xa4\x88\x23\x44\x84\ -\xf4\x87\x69\x7f\x06\x7f\xfc\xd8\x0e\xcc\x8b\x9f\xf2\x46\xfa\xf1\ -\x8f\x2a\x2d\x5f\x5c\x6b\x7f\x4d\xd1\x43\xc1\xae\xd7\xeb\x56\x47\ -\x95\x6d\xc4\x28\xfa\x5d\xe2\xff\xb6\x7d\x83\xac\x74\x1a\x73\xb6\ -\xad\xf7\x75\xec\x79\xcd\x34\x4b\xda\x32\x3f\x3b\x7d\x59\x7a\xd9\ -\xe6\xa4\x0b\x0a\x32\x28\xe7\xf3\x92\x72\xea\x8e\x01\xd5\xbd\xdd\ -\x17\xaf\x5b\xba\x4b\xd1\xf6\x53\xf7\xae\xe8\x2e\x6d\x1e\xe0\x95\ -\x44\x77\xe9\x91\xee\x99\xe9\xb1\x7c\x36\xeb\xb7\x8c\x11\x22\xe9\ -\xdb\x48\x51\xfe\xf6\x43\xdf\x43\x47\xfc\x60\x76\x3f\xde\xfd\xc4\ -\x67\xd8\x02\x25\xa4\x64\x0e\xd1\x5f\x3c\xf1\x6f\x78\xe8\xf0\xd3\ -\x14\x83\x10\x42\x08\x21\xc3\x8d\xf4\x32\x24\xb7\xd9\xa3\x1c\xce\ -\x89\x14\x1f\xff\xf2\xdc\xd7\x70\x6c\x65\x29\xfe\xf2\x65\x6f\x44\ -\xc5\xab\xf0\xc1\x10\xd2\x47\x7c\xf5\xf1\xb1\x9f\xdc\x8f\xff\xf1\ -\xe3\xaf\x20\x5a\xf4\xe2\x05\xff\x86\x1d\x41\x51\xcf\x94\x1f\x7f\ -\xaf\xa5\xcd\x72\xa1\xe8\x72\xc6\xb9\x3c\xca\x54\xa3\x33\x43\x5d\ -\xe7\xa0\xab\x63\x0f\x65\xe6\xfd\xe2\x23\x79\xd9\xb7\xef\x52\x94\ -\xc0\xbc\x02\x49\xfa\xfd\x25\x58\x6b\xa0\xb6\xb9\xf6\xfd\x32\xdf\ -\xac\xcf\x22\xfb\x95\xba\x53\x77\xea\x3e\x68\xba\x67\xd9\x3f\xe8\ -\xba\x77\xb2\xcd\x43\xac\xfa\xd3\xf4\xcf\x59\x15\xb0\x6b\xf5\x59\ -\xf4\xcc\x91\xbc\xd7\xd1\x12\x05\x19\xff\xab\xe7\xbf\x84\x5f\xfb\ -\xf6\x4d\x78\x6e\x6a\x9c\xad\x52\x42\xfa\xc4\xc1\xb9\x23\xf8\xdd\ -\xc7\x6e\xc1\x7b\x7f\xf8\x39\x8a\x41\x08\x21\x84\x90\x05\x43\xfe\ -\x91\xa2\xdc\x1e\x73\x86\xab\x36\xd7\x08\xb4\xfe\xf9\x83\xdf\xc2\ -\x83\x0f\xef\xc1\x9f\x9c\x78\x31\x7e\xf3\xb8\x57\x61\xed\xe8\x72\ -\x40\xd2\xe6\x23\x0e\x2e\xdc\xfd\x99\xba\x97\x51\x9b\x89\xda\x14\ -\x3e\xfd\xdc\xb7\x70\xc3\x33\x3b\xf1\xcc\xcc\xf3\x68\xac\x19\xf2\ -\xe3\xef\x7b\x14\x94\xa6\xc3\x9e\xa7\xb2\x21\x6d\x96\x5f\xae\xa7\ -\x65\x95\x9b\xd6\x1e\x4c\x6d\x7d\x5a\xe2\xbf\xfc\x5c\xd7\xcf\x7b\ -\xbf\xee\xcb\x6f\xde\x39\xde\x33\x6a\x7d\x1c\xe2\x6a\x7f\x51\x5d\ -\xbe\xc1\x5c\xf9\x2c\x5d\x07\x4e\x77\x8b\xfe\x03\xa3\x7b\xbe\x7d\ -\x49\x7a\xad\xbb\xd8\xec\xa5\xee\xd4\xbd\x07\xba\xbb\x96\x47\x8d\ -\xb5\x40\xda\xea\xae\x2d\x4e\xcf\x39\xf3\xa1\x44\x4d\x7c\xc1\xbd\ -\xbf\xa5\xb1\xc6\x8f\xab\x75\xae\xda\xaa\xe3\xe7\x91\xe0\xbe\x15\ -\x05\x3c\xc1\x0a\x6f\x09\x2e\x58\xfe\x0a\xbc\x6a\xf9\x26\x6c\x5e\ -\x72\x12\x4e\x58\xbc\x06\x8b\x2b\xa3\xf0\x44\x9a\xf6\x01\xf3\x21\ -\x22\x80\xc4\xdd\x26\x7b\x76\xed\x97\xf2\x1a\xbf\xb7\x2a\x54\x35\ -\xb0\x3d\xee\xf4\x95\xcf\xf6\x44\x0b\xba\x0d\xdb\x4b\x62\x7f\xcc\ -\xf6\x01\xcb\x33\x50\xa8\x9f\x47\x77\xb1\x7e\xaa\xef\x50\x5d\xc3\ -\x4f\xa7\x0f\xe1\x3b\x47\xf6\xe1\xa1\x23\x4f\xe1\x9e\x03\x8f\xe1\ -\xf9\xb9\x83\x8d\x23\xe7\x7d\xb7\x46\xb6\x19\xaa\x38\xfa\xc7\xa8\ -\x14\x82\xe1\x7f\xf5\x4a\x16\x64\x3f\xdd\xfc\x06\x7e\xbc\xd2\xd1\ -\x4e\xed\xce\x3b\x1b\x2e\xb7\x53\xa4\xa9\xf7\x53\x33\x24\x78\x69\ -\x1a\xe7\x92\xde\x38\x37\xe6\x83\xa8\xe3\x66\x8f\x3d\x6f\xac\xd8\ -\x1e\xf0\xc0\xea\x1e\xb7\x60\xf0\x74\x0f\xec\x08\x17\xcc\x97\x4c\ -\x77\xeb\x82\x73\xea\x4e\xdd\x7b\xa0\x7b\xde\x50\xf2\x45\x39\x45\ -\xd6\xf2\x3d\x32\xbb\xdb\xf5\x6a\x7a\xfb\x48\x82\xfa\x5d\x2b\xc1\ -\xf2\x80\xd1\x4a\x07\x4e\x51\xa7\xce\x11\x2c\x95\x45\x98\x49\xc3\ -\xc6\xd3\x68\xf0\xaf\xb1\x9f\x87\xe7\x07\x99\x37\xdc\x86\x23\x6c\ -\x74\xa1\x9c\xf8\x52\x4f\x80\x17\xbe\x74\xc1\xc3\xf0\x25\x9e\x3b\ -\x3c\xf5\xca\x99\x00\xb3\x11\x1c\x64\xe2\x41\xd1\x3d\xcc\xd6\x9e\ -\x1f\x8f\xd2\xe2\x07\x96\x0f\x9a\xee\xd9\x85\x5f\x7a\xa5\x50\x33\ -\x5f\xa4\x48\x0f\xcf\x70\x02\x6c\x4e\x96\xdf\xb2\x90\x89\xf2\x45\ -\xa2\x10\x2c\xb9\x53\x64\xeb\xe0\xf2\xe3\xcf\xa1\xd7\x4e\x91\xfb\ -\x89\x62\xd8\xaf\x31\xfb\x1b\xd9\x5b\x1c\x2f\xdb\xed\x37\x5a\x2c\ -\xce\xa8\xa6\xfa\xda\x89\xa8\x47\xe8\xb3\xdd\x46\xad\x3e\x6c\xba\ -\x37\x96\x32\x0c\x98\xee\x6a\x16\x8f\xd4\x9d\xba\x2f\x40\xdd\x13\ -\xed\x85\x4e\xed\x97\x62\x7e\x8e\x9a\x11\x96\xce\xc6\x76\xab\x57\ -\xab\x7f\x61\x1b\x49\xb3\x38\x45\x23\x15\x94\xb4\x25\x48\x08\x21\ -\x84\x10\x42\x08\x21\xbd\xa1\x6a\xf3\xb8\x9c\x1d\xe6\x76\x1d\x4d\ -\xeb\xce\xef\xc6\x0e\xba\xd3\x66\x3c\xf6\xf0\xe7\x78\x8f\x5c\xff\ -\x3c\xfa\x7c\x02\xf8\xd6\x69\x4e\xb6\xdf\xdb\xb4\x5f\x5b\x47\x5b\ -\xe9\x1c\x1d\x28\xdd\x43\xfc\x64\x06\x8c\xeb\x6e\xdb\x5f\xa6\x34\ -\x74\x49\x77\xb5\xec\x3b\x14\xe9\x90\x77\x84\x68\xc8\x69\x77\xdb\ -\x85\xb6\x67\x37\x48\x9b\xc5\x80\x63\x17\x9e\x16\x73\xbf\x76\xb3\ -\xb3\xda\xa6\x5d\xe6\xd6\x5d\x7a\x9b\x01\x64\xb0\x75\x4f\x76\xe1\ -\x6a\xec\x79\x0c\x9c\xee\xa0\xee\xfd\xd0\x1d\xd4\xbd\xbf\xba\x9b\ -\x6b\x7c\x33\xa7\xa3\x49\xa1\xe6\x15\x9d\x4c\xcd\xfb\x5c\x0b\x94\ -\x9b\x23\x45\x84\x10\x42\x08\x21\x84\x90\x05\x4d\xb5\x6d\x07\x4c\ -\xb3\x7a\x00\x72\x9e\x67\xac\xad\x49\xee\x2c\x9c\x7e\xa3\x44\x5c\ -\xff\xd2\x61\x5b\x00\x6d\x0c\xc9\xd9\x87\xd2\x3a\xf4\xe0\xa5\xcb\ -\xf6\x17\xdd\x65\xd0\x67\xdd\x45\x4b\x9a\x1e\x9b\xfd\x45\x5d\xd7\ -\xb2\x53\xb5\x35\x4a\x4f\xbb\x3d\x83\xe1\xe5\x83\x35\x46\x79\x47\ -\xe4\xb4\xe4\xd9\xcd\xb9\x00\x75\xbc\x4e\x87\xa7\x35\x06\xfe\x34\ -\xae\x7b\x41\xf7\xed\x96\x7c\x8e\xd9\xa8\xb4\xaf\x69\x18\x2d\xaa\ -\x31\xe0\x5a\x4e\xdd\x41\xdd\xa9\x7b\x11\xc5\x93\xc4\xdb\x03\xd4\ -\xbd\x47\xba\xf7\xec\x02\x5d\x56\xdc\x8c\xaf\x23\x45\x3f\x38\xf7\ -\x0a\x99\x23\x45\x84\x10\x42\x08\x21\x84\x90\x05\x4d\xb5\x6d\x8f\ -\x32\xef\x3e\x1c\xce\xc7\x39\x86\x74\x76\x5e\x7a\xd3\xa7\xad\x88\ -\xd3\x83\x87\xa0\xe3\x1d\xa0\x7b\x96\x1c\x69\x79\xdf\xc6\x47\x69\ -\x6d\x7f\xaf\xf7\xb3\x29\x4a\x77\x73\xad\x5b\xbf\x76\x54\x30\xf4\ -\xcb\x6d\x3f\x6c\x7a\x20\xf5\x3e\xc9\x50\xa3\x96\x13\x2d\x8b\x0e\ -\x5d\x07\x72\xb4\xdd\x35\x5b\x45\xf5\x78\x69\x41\xe7\x4b\xb9\x8a\ -\x9d\x6e\x27\xbb\x57\xd9\x5f\xd4\x5a\xe0\x94\xd1\xdc\xa4\x7d\xc6\ -\x9a\xbc\xc1\xd1\x7d\x30\xf2\x31\x75\x2f\xc9\x03\xa0\xee\xfd\xd5\ -\x7d\x50\x90\xc1\xb9\x2f\x47\x8a\x08\x21\x84\x10\x42\x08\x21\x0b\ -\x9a\x6a\xe6\x11\xdd\x9a\xc3\x9f\xb5\x84\x26\xb1\xa9\xa2\xe9\x1a\ -\xfb\xf1\xe3\xbc\xf4\x4d\xff\xca\xe2\x21\x4b\x96\xc0\x92\xf5\x00\ -\xfa\xe3\x79\x27\xf6\x9b\x11\x8b\xce\x92\x61\x77\x8f\x7b\x0a\x44\ -\xda\xd5\xdb\x92\xde\xfe\x64\x9b\x0e\x74\x97\x5c\xe9\x35\x83\xce\ -\x59\x27\xf7\x8a\xb8\x3d\x57\xd7\x35\x87\x25\x5f\xc2\xd5\x71\x3e\ -\x96\xf6\x6e\xd3\xae\x95\x92\xa5\xb7\x74\xe7\xfe\x85\xd7\x07\x6d\ -\x47\x9f\xeb\x4f\xee\x90\x76\xf3\x41\xe9\x74\x07\x75\xa7\xee\xd4\ -\x9d\xba\x77\x59\xa7\x82\xda\x87\x5a\xbc\xfd\x1c\x29\x22\x84\x10\ -\x42\x08\x21\x84\x2c\x60\x24\x6d\xa4\x28\xa3\x87\xb9\x5b\x73\x30\ -\x33\xe2\xc4\x27\x3d\xe5\x20\xba\x89\x67\x3b\xcf\xbc\x40\xd6\xd6\ -\xf5\xae\x5d\xdb\xe9\x51\x33\x92\x5d\xb4\xd2\x5e\xba\xad\x5d\x04\ -\xe6\x4e\xc5\x70\x7b\x10\x1d\x77\x31\x64\xd8\x23\x8e\xf6\x22\x43\ -\xa7\xac\x74\x65\x46\x5d\x73\xcc\x80\x9a\x31\xd2\xa1\xb6\x1e\x6a\ -\xdb\x73\xef\x30\xdf\xbb\xee\x2b\x10\xde\xd6\x93\x9c\xd7\x71\xcb\ -\xaf\x6a\x1e\xdf\xa5\xa0\x85\xce\xf9\x35\xef\xf5\x73\xbe\xb6\xee\ -\xd9\x3f\xe3\x44\x5b\x3e\xe8\xf5\x5c\x75\xe9\xf0\xc1\xf4\x6b\xae\ -\x7a\x9b\xc5\x66\xdf\xed\xce\x6d\x6e\xc9\x74\xc7\x60\xeb\x0e\xea\ -\x3e\xa8\x6d\x4e\xea\xde\xcf\xfc\x8e\x82\xd3\xa1\x7d\x7a\x7e\xdd\ -\x2a\xb1\xb9\x4f\x11\x21\x84\x10\x42\x08\x21\x64\x41\xa3\x40\x55\ -\xc4\x77\x73\xc0\x3a\xed\xf9\x2c\xd8\xd3\xce\x7d\x99\xdc\x3b\xfc\ -\x3a\x1e\x2f\x39\x3d\xd1\xc4\xf9\x19\xd1\xd9\x44\x3a\x4b\x87\x14\ -\xa3\x73\x63\xa7\xf9\x8c\xfd\x65\xc4\x55\xf7\x9c\xe9\xca\x99\x6e\ -\x6b\x87\x90\x64\xe8\x2e\xed\x3e\xf7\x36\x91\x7c\xba\xdb\xed\x46\ -\x97\xf3\xab\xdb\x69\xb9\x97\x60\xb5\x5b\x2e\x68\xce\x02\x41\x9d\ -\x33\x7a\x77\x0a\xa4\x2e\xf7\xa8\x49\xa7\xf6\xf6\x6b\x4d\x57\xb7\ -\x46\x12\xbb\x2d\xb4\x16\x94\xde\xb2\xef\x1f\x52\x52\xdd\x07\x35\ -\xbf\xdb\xd7\xfc\x39\x8e\x48\xf7\x5b\xf7\xbc\x23\xd2\xaa\xd4\xbd\ -\xa7\xba\x17\x6c\x7f\xd7\x46\xc8\x1c\x2f\xac\x45\xdf\x2f\xbb\x9d\ -\xc2\x91\x22\x42\x08\x21\x84\x10\x42\xc8\x02\x46\x50\x8d\x16\xe5\ -\x44\x3b\x9e\xbb\xae\xcd\x68\xcf\x63\xcd\xef\xf8\x85\xfb\xa7\x48\ -\xba\x9f\x69\xd9\xd6\x25\x71\x5f\xc9\xb9\xff\x51\x62\x9f\x17\x69\ -\xed\x62\x6a\xbc\x27\x5e\x72\x0a\x68\x5f\x29\x93\x75\x3f\xb5\xd8\ -\x67\xae\x25\x91\xd6\xe9\x32\x04\x94\xac\x49\xa8\x19\xba\xab\xf1\ -\xdc\xd4\xb4\x03\x70\xb3\x27\xf1\xb8\x34\xa7\xdd\xa6\xf9\x6e\xba\ -\x27\xf5\x17\x4b\xfe\x68\x53\x67\x33\x59\x6d\x46\x1f\xb4\xe9\xde\ -\xe9\x62\x8d\xdc\xdb\x89\x89\x45\x27\x5b\x7e\xd7\xde\x76\xc1\x69\ -\x54\xbe\x89\xe3\x6b\xa9\x4e\xd9\xb0\x34\x38\x3e\x28\xab\xee\x65\ -\x49\x8f\x61\x9f\x16\x3b\xf0\xdd\x3d\x9d\x95\xba\x97\x42\x77\x29\ -\xb9\xee\xda\x5a\xf7\xd2\x95\x33\xae\x23\xf2\xd4\xbd\x14\xba\x47\ -\xed\x65\xe7\x25\xd6\xe6\x73\x93\xee\x3c\xaf\x2e\xd7\xab\x9a\xe5\ -\x70\x18\xed\x13\x35\x5b\x38\x4d\xd1\x15\x38\x52\x44\x08\x21\x84\ -\x10\x42\x08\x59\xb8\xf8\x8a\xaa\x1a\x1e\x9c\x96\x34\xcc\x86\x39\ -\x62\x22\x96\xa8\x61\xd6\x29\xa3\xae\x3e\xa6\xb4\xe9\xc2\x1a\xbf\ -\x67\xa9\x27\x89\x35\x30\xe1\x67\xdf\x4d\x10\xd3\x1e\xc9\xe8\x5a\ -\xb0\xae\x01\x52\x27\xbd\xed\xba\xb7\x3e\x5e\x5d\xed\xc8\xdb\x55\ -\x90\xd3\xee\xc6\xc8\x8a\x58\x54\x72\x5c\x14\x92\xb9\x1f\x93\xb6\ -\x95\x2e\x85\x6b\x3e\x15\x27\xdd\xf3\x2f\xba\xe9\xe4\xe8\x6c\x7b\ -\x92\xf9\x5d\x7b\x5d\x80\xb4\x75\xdf\x28\x88\xa2\x74\x76\x9d\x7e\ -\x21\x68\x37\xbf\xf7\xbf\xc4\x4f\xcf\xef\x39\xcb\x49\xea\xbe\x20\ -\x74\x8f\xd4\x36\x66\x6c\x0c\x4a\x7e\x49\x2c\x1e\x19\x90\x72\x86\ -\xba\x97\x45\x77\x6d\xdd\x0e\x76\xac\xe8\x7b\x97\x6e\x9b\xee\x45\ -\xe5\x1b\xe3\x3a\x89\x91\x2a\x63\x24\x49\xc3\xe3\x6a\x1c\x29\x22\ -\x84\x10\x42\x08\x21\x84\x2c\x60\x3c\x41\x55\x6c\xfb\xfa\x74\x7d\ -\x16\xb1\xb1\xf8\x26\x63\x1f\x1a\x31\x47\xb4\x82\xcf\x5e\xe4\x30\ -\x5b\xd6\x32\x98\xd7\xcf\xda\xe0\x44\x6c\xfb\x1b\x65\xc5\x7f\xcf\ -\xb2\xdb\xb0\xdf\x7a\x96\x57\xcc\x63\x50\xd7\x7d\x19\xd2\xd3\x6f\ -\xb5\xdb\xaa\x7b\xd6\xfe\x41\xfd\xd5\x5d\xad\x6b\x89\x24\xfd\x3a\ -\x65\xd3\x1d\xf1\xdf\x07\x5f\x77\xaf\xd8\xe2\xa6\xdf\xf9\xbd\x64\ -\xe5\x8c\x73\x7e\xef\x96\xee\x89\xe8\x53\x45\xe5\x77\x23\xff\x74\ -\x4b\x77\xc7\x7d\xe7\xa8\x7b\xd9\x75\xb7\xd8\x5d\x94\xee\xb6\x76\ -\x4c\xb7\xca\x77\xea\x4e\xdd\x53\x75\x2f\xb8\x1d\xd3\xa9\xee\x09\ -\xbb\xdc\x74\x6f\x04\xd7\xf5\xd2\xdb\x33\xb6\xfd\x2f\x6d\xe6\x8b\ -\x67\xdc\xc7\xe2\x4f\xd4\x82\xfb\x55\x85\x23\x45\x84\x10\x42\x08\ -\x21\x84\x90\x85\x8c\x34\x62\x2e\x58\xa3\x37\xa4\x9c\x94\xcb\x01\ -\xb5\x3a\xd4\xda\xfa\x7b\xd3\xd1\x96\xd6\x9e\x7e\xe6\x2c\x4a\xb1\ -\xa5\xcb\x9c\x5b\xe8\xb8\x76\xc4\xe2\x51\x27\x92\x23\xc8\xe8\x31\ -\x70\x4b\xbf\xfd\xbe\x96\x74\x9a\xb2\x64\x45\x2f\xd1\xf4\x74\xa0\ -\x5d\xdd\x33\xf5\x5b\x98\xba\x47\x56\x50\x77\xe3\xf7\x01\xd7\x7d\ -\x50\xcb\x99\xae\xe9\xae\xe5\xd0\x5d\x2d\x9f\xb3\x74\x37\x8f\x73\ -\xd5\xdd\x1a\x65\xb3\xec\xba\x9b\x6b\x62\xa9\xbb\x8b\xee\x6a\x44\ -\xfb\xa2\xee\x25\xd5\x3d\xc3\x6e\xe7\x35\x7f\xd4\xdd\x4d\xf7\xc8\ -\x6e\xcd\xa5\xbb\x4a\xd6\x3e\x69\x9a\x33\x39\xb6\xe7\x6f\x46\x45\ -\x6e\xfc\xc2\x91\x22\x42\x08\x21\x84\x10\x42\xc8\x82\xa6\x0a\xe0\ -\x59\xc0\x5f\xdf\xe4\xda\xa5\xbb\x88\x86\x87\xac\x19\x23\x46\xa6\ -\x63\x67\xeb\x90\xb7\x1d\x97\xbd\x03\x75\x7a\x0f\x4b\xde\x8e\x57\ -\xdb\xe1\x62\xeb\x69\x46\xeb\x0e\x02\xfb\x05\x6d\x3f\x6b\x21\x76\ -\x23\x4b\x5f\xb4\xd6\x1d\x59\x72\x9b\xf9\x43\x94\xba\xb7\xa1\x7b\ -\x96\xfd\xd4\xbd\x6c\xba\xc7\x6f\xd0\x6b\xdd\x9d\x3b\xc8\x6c\x23\ -\xee\x46\x8f\x18\xf3\x7b\xb7\x75\x1f\xd4\xfc\x9e\xbe\x0f\x1b\x75\ -\x77\xd3\x1d\x1d\xeb\xae\x83\xa9\xbb\x3f\x20\xba\x27\xea\x25\x29\ -\x45\x3b\x92\xba\x9b\xba\x67\x6c\x68\xaa\x39\x93\x67\xdd\x57\xd2\ -\x7e\xbc\xa7\xea\xff\x07\x74\x30\xc2\xcb\x12\x42\x08\x21\x84\x10\ -\x42\x48\xd1\x54\xe1\xeb\x6e\x15\xbd\xcc\x3e\x93\x4e\xd2\x5d\xc7\ -\xc4\x9c\x6f\x37\x87\x2d\xcb\xc3\x73\xdf\xb8\xd7\x8b\xff\x50\xf0\ -\x06\xca\x79\xed\xcb\x72\xec\x9d\x7b\x02\x3a\xb4\xbb\x70\xfb\xb5\ -\xbd\x1b\x51\x77\xea\x3e\x1c\xba\x7b\xf1\x23\x06\x45\x77\x5b\x34\ -\x4e\xe6\x77\xe6\xf7\x21\xd0\x1d\x6d\xda\x5f\x5e\xdd\x65\x20\xca\ -\x99\x84\xee\x82\x01\x2f\x67\xa8\x7b\x99\x74\x2f\x6e\x78\xc6\xb2\ -\x1f\x91\x59\x2d\x46\x13\xe3\xbc\xa6\x1a\x5f\x6b\xfb\xc0\xa1\x22\ -\x42\x08\x21\x84\x10\x42\xc8\x42\x44\x31\x51\xc5\xdc\xfc\xbf\x63\ -\x6c\xe4\xaf\xe1\x63\x71\xcc\xa5\x13\xdb\xa2\x00\x5b\x7c\xf5\x2c\ -\xa4\x43\x5b\x2d\x1e\x60\x62\x47\xdc\x0c\x4f\xba\xe7\x1a\x5b\xf4\ -\xb3\xed\x78\x5e\x12\xbb\x13\x9e\x7e\xf4\xd9\xa7\xee\x3d\xb5\x7f\ -\x50\xf3\xbb\x0e\x95\xee\x52\x72\xfb\xa9\x3b\xcb\x99\x85\xa4\x7b\ -\xc2\x2e\xea\x4e\xdd\x8b\xd4\x5d\xb2\x5e\x74\xea\xde\x0d\xdd\x0b\ -\x28\x81\x0d\x7d\x0c\x41\xd4\xf2\x7b\x2d\x5c\xc3\x2a\xb7\x79\x98\ -\xc6\x3e\xf8\xf2\x18\x5d\x44\x42\x08\x21\x84\x10\x42\xc8\xc2\x43\ -\xef\xa9\xbb\x47\x5f\x7c\xcb\xd5\xf0\xaa\x1f\x0b\x5c\xa5\xf8\x16\ -\xb0\x45\x85\xb3\xe8\x14\x4b\xb8\x8e\xd0\xd3\x54\xeb\x0e\xc2\x7d\ -\xb2\x2f\x23\x2c\x5f\x23\xfe\x7c\x4e\xbb\x33\x36\x52\x2e\x3c\x3d\ -\x16\xbb\x06\x4f\xf7\x0e\xf3\x0b\x75\xa7\xee\xd4\x9d\xba\x2f\x54\ -\xdd\xb5\x24\xf5\x3e\x75\xcf\xd9\x4e\xa2\xee\xd4\x7d\x21\x96\x33\ -\x66\xc2\x82\x7f\x7d\xdf\x68\x88\x7b\x8d\xdf\x3d\x7d\x0a\x73\x2f\ -\x9c\x56\xff\xe6\xc8\xdc\xed\x40\xed\xc7\xf4\x12\x09\x21\x84\x10\ -\x42\x08\x21\x0b\x02\x15\x1f\x82\xbf\xc1\xf6\x9d\x33\x0d\x3f\xee\ -\x4b\x6f\xb9\x1a\xf0\xfe\x16\x5a\xa9\xc4\x3d\x3c\xb5\x78\x7e\x25\ -\x99\xcc\xed\x19\x86\xa9\xed\xc0\xb2\x3d\x84\x01\xb5\x9f\xba\xd3\ -\x6e\xea\x4e\xdd\x69\x37\x75\xa7\xee\xb4\x9b\xba\xd3\xfe\x32\xda\ -\x6d\x46\x61\x0d\x47\x88\xd4\x18\x21\xf2\x83\xdf\x47\xf0\x18\xe6\ -\x6a\xbf\x88\xed\xb7\x1d\x6e\xc4\xa1\x9b\x39\xfc\xcf\xf0\xf0\x00\ -\x5d\x46\x42\x08\x21\x84\x10\x42\xc8\xd0\x33\x86\x6b\xb0\xfd\xb6\ -\xc3\x4d\xee\x59\xc0\x5d\xbf\xfe\x32\x8c\x8c\xdc\x0d\xdf\xdb\x18\ -\xfd\x96\x98\xd3\x98\x31\xf9\xb0\xdd\x60\x12\x9a\xf3\x7c\x73\x2b\ -\x60\x2f\xf4\x34\x73\x4e\x8e\xb4\xcd\xa9\x74\xdd\x32\xbc\x53\xfb\ -\xa3\x6d\x50\x1c\xed\xce\x6b\x8f\xeb\x73\xc9\xd2\x21\x3a\xce\xb8\ -\xf0\xc0\xe8\xae\x71\x3b\x07\x4e\xf7\x41\xcd\xef\x5d\xd2\xbd\x5d\ -\xbb\xa9\x3b\x75\xa7\xee\xd9\xba\x4b\x7a\xb4\xcb\xb6\xeb\x73\xea\ -\xde\x1b\xdd\x5d\xef\x4f\xdd\x07\x43\x77\xeb\x73\x18\x56\xdd\x33\ -\xec\xcf\xbb\x06\x4a\x8d\x68\xac\xd1\xc8\x51\x18\x6d\x0e\x35\x88\ -\x7f\x03\x2e\xb9\xf5\x2f\x60\x34\xc9\xeb\x5c\xfa\x99\x1f\x42\xe4\ -\x6a\x78\x38\x44\xd7\x91\x10\x42\x08\x21\x84\x10\x32\x74\x54\x6a\ -\x77\x42\xe4\xc6\xd6\x7e\x9f\x42\xf0\xe5\xb7\xbe\x1e\xa2\x7f\x87\ -\x79\xbc\x24\xea\xa2\x73\x1e\x01\xca\x70\x15\xc5\xf0\xe0\x12\xdf\ -\x67\x79\xd2\x66\xf4\x0a\x0d\x1c\x4c\xaf\xbb\xe2\x69\xc6\xfe\x4d\ -\x16\xfb\x60\x89\xaa\x11\xd9\x9d\xe8\x01\xed\x93\xfd\xe6\xef\xb6\ -\xcf\xd4\x9d\xba\x0f\xb3\xee\x16\x06\x47\xf7\x78\x39\x4c\xdd\xa9\ -\x3b\x75\xa7\xee\xd4\x7d\xc8\x75\x17\xc9\x68\x38\x97\x65\x76\xb1\ -\x43\x00\x00\x01\x80\x49\x44\x41\x54\x4c\xf7\x30\x7a\x5e\x94\x5d\ -\xbc\x7c\x7a\xb8\x0e\x45\xa9\xb1\xa1\xa3\x46\xc2\xf9\x18\xf5\x3f\ -\x87\x51\x5c\x85\xd7\xdc\x7e\xb0\xf9\xcc\x74\x4b\x2e\xbc\xe5\x4e\ -\xcc\xe9\x65\xa8\xc8\xf7\xe8\x4a\x12\x42\x08\x21\x84\x10\x42\x06\ -\x9e\xca\xec\x0d\x98\x7f\xe1\xed\xa6\x43\x94\xed\x56\xde\xf5\xb6\ -\xf5\x18\xc5\xb5\x80\xff\x76\x54\xe7\xfd\xc0\xd3\x5a\x1c\xeb\x09\ -\x98\xf3\xd2\x3d\x34\xc7\x5b\x44\x8c\xfa\xf1\xcf\xb3\x5e\x6b\x87\ -\x30\xf4\x00\x6d\xd1\x2b\x46\xe2\x3b\xe7\x46\xd7\x33\xef\xe7\xfa\ -\xbd\xcd\xde\x30\xfd\x59\x73\x1b\x47\x83\x03\xe6\xc2\x91\x31\xdf\ -\xb0\xdb\xe6\x79\x67\xdc\x3f\xb4\xd3\xd5\x6e\xf3\xb1\x8c\x38\x9e\ -\x37\xe8\xba\x87\x76\xd7\x50\x0e\xdd\xb3\xee\x43\xdd\xa9\x3b\x75\ -\x4f\x99\x2b\xdf\x23\xdd\xf3\xda\x5d\x36\xdd\xc3\x72\x7d\xde\xa3\ -\xee\xbd\xd4\x3d\xa1\xe7\x80\xe8\x9e\xd7\x6e\xea\x5e\x12\xdd\x8d\ -\xc5\xe9\xc3\xa6\xfb\xac\x38\x96\x73\xc1\x71\x55\x8d\x7f\x0e\xed\ -\xa9\x01\x10\xdf\xc7\xc8\xfc\xe3\x80\xff\xa7\xd8\xb6\xe3\xdf\x6c\ -\x97\x6c\x9d\xf2\x4b\xff\xe9\x59\x7c\xfd\x9f\xfe\x10\xaa\xe7\xc2\ -\xaf\x7e\x81\xee\x25\x21\x84\x10\x42\x08\x21\x64\x20\x18\x9b\x7b\ -\x12\x23\xb3\xef\xc1\xdc\xc4\x2f\xb5\x72\x88\x9a\xfd\xb6\x6c\x14\ -\x82\x2f\xbc\x75\x23\x96\xe1\x4d\x98\x9a\x7b\x03\x80\x57\x42\x24\ -\xb8\x42\x97\xe7\x31\x0a\x92\x71\xc7\x55\x11\x1f\x3e\x6a\xf2\xef\ -\x24\xf8\xad\xdf\xa1\xd9\xc5\xf0\x9c\x43\xad\x68\x3b\x6d\xa7\xed\ -\xb4\x9d\xb6\xa7\xd8\x3e\xc8\xe5\x3b\x6d\xa7\xed\xb4\x9d\xb6\xf7\ -\xdb\x76\x0d\xea\x80\x01\xb4\x5d\x9a\x46\xe6\x32\x6d\xd7\x16\xdf\ -\x0b\x20\x7a\x18\x55\xb9\x15\xa8\xdd\x8b\xd9\x89\x9d\xd8\xbe\x73\ -\xc6\xc5\xe4\xff\x0f\x5a\x59\x1b\xc9\x18\xa2\x86\x7c\x00\x00\x00\ -\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x02\x99\ -\x3c\ -\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ -\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\ -\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\ -\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\ -\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\ -\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\ -\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\ -\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\ -\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x37\ -\x30\x34\x38\x38\x37\x36\x38\x34\x30\x32\x39\x22\x20\x63\x6c\x61\ -\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\ -\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\ -\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\ -\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\ -\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\ -\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x37\x31\x33\x30\x22\x20\x78\ -\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\ -\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ -\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\ -\x22\x31\x36\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x36\x22\ -\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x32\x34\x30\x2e\x38\ -\x37\x31\x36\x39\x34\x20\x39\x37\x2e\x31\x31\x37\x33\x31\x34\x61\ -\x35\x36\x2e\x33\x39\x38\x34\x34\x20\x35\x36\x2e\x33\x39\x38\x34\ -\x34\x20\x30\x20\x30\x20\x31\x20\x30\x2d\x38\x30\x2e\x34\x36\x31\ -\x37\x37\x35\x20\x35\x38\x2e\x31\x31\x30\x33\x39\x33\x20\x35\x38\ -\x2e\x31\x31\x30\x33\x39\x33\x20\x30\x20\x30\x20\x31\x20\x38\x31\ -\x2e\x34\x36\x39\x37\x34\x36\x20\x30\x6c\x34\x36\x30\x2e\x37\x38\ -\x37\x32\x35\x37\x20\x34\x35\x35\x2e\x31\x30\x37\x34\x31\x34\x61\ -\x35\x36\x2e\x33\x39\x38\x34\x34\x20\x35\x36\x2e\x33\x39\x38\x34\ -\x34\x20\x30\x20\x30\x20\x31\x20\x30\x20\x38\x30\x2e\x34\x34\x35\ -\x37\x37\x35\x4c\x33\x32\x32\x2e\x33\x34\x31\x34\x34\x20\x31\x30\ -\x30\x37\x2e\x33\x33\x32\x31\x34\x31\x61\x35\x38\x2e\x31\x31\x30\ -\x33\x39\x33\x20\x35\x38\x2e\x31\x31\x30\x33\x39\x33\x20\x30\x20\ -\x30\x20\x31\x2d\x38\x31\x2e\x34\x36\x39\x37\x34\x36\x20\x30\x20\ -\x35\x36\x2e\x33\x39\x38\x34\x34\x20\x35\x36\x2e\x33\x39\x38\x34\ -\x34\x20\x30\x20\x30\x20\x31\x20\x30\x2d\x38\x30\x2e\x34\x36\x31\ -\x37\x37\x35\x4c\x36\x36\x30\x2e\x39\x35\x36\x30\x37\x36\x20\x35\ -\x31\x31\x2e\x39\x38\x35\x38\x34\x20\x32\x34\x30\x2e\x38\x37\x31\ -\x36\x39\x34\x20\x39\x37\x2e\x31\x31\x37\x33\x31\x34\x7a\x22\x20\ -\x66\x69\x6c\x6c\x3d\x22\x23\x31\x31\x31\x31\x31\x31\x22\x20\x70\ -\x2d\x69\x64\x3d\x22\x37\x31\x33\x31\x22\x3e\x3c\x2f\x70\x61\x74\ -\x68\x3e\x3c\x2f\x73\x76\x67\x3e\ -\x00\x00\x05\x66\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ -\x00\x00\x05\x2d\x49\x44\x41\x54\x58\x85\xed\x56\x5d\x4c\x93\x57\ -\x18\x7e\xda\x50\x7e\xfa\x8b\xfd\xf1\x6b\x41\x8b\x50\xa2\x04\x71\ -\xa6\x54\xa3\xd0\x32\x2d\x63\x6e\x8a\x37\xfb\x01\x92\xed\x42\x2e\ -\x4c\xd4\x5d\x2c\xf3\x27\x8a\xcb\x9c\x8b\x5e\xb8\x65\xbb\x98\x59\ -\xb2\x61\x7b\x83\x71\x33\x99\x5b\x32\x9c\x54\xf7\x63\xbb\x60\x8a\ -\x08\x53\xb0\xb4\x10\x44\x01\x4b\xda\xaf\x3f\x14\xfa\x95\xd2\x3a\ -\x45\x3d\xbb\xc0\x36\x14\x6a\x2c\x3f\x5e\x2c\xd9\x93\x9c\x8b\xef\ -\x9c\xf7\x7b\xde\xe7\x9c\xf3\xbe\xef\x79\x81\xff\xf1\x5f\xc6\xc4\ -\x64\x88\xe3\xf5\x7b\x94\x8b\xe1\x48\x7b\xde\x82\x6f\xd4\xab\xa4\ -\x69\x5a\x1f\x64\x82\x45\xe2\x65\x62\xbb\x42\xa1\xb0\x52\x32\xf9\ -\xc8\x4c\x9b\xb6\xb6\xb6\x6f\x3b\x3b\x3b\x77\x77\xdb\xba\xea\xd5\ -\xeb\x4b\xcf\x2e\x99\x80\xbe\xfe\xde\x6a\x83\xc1\xd0\xd2\x7e\xbd\ -\x1d\x0c\xc3\x20\x3b\x3b\x1b\x5a\x9d\x16\x8e\x3e\xfb\x5b\x25\xc5\ -\xeb\x9a\x81\xe9\xdd\x1b\x8d\xc6\xdd\x16\xb3\x05\x1a\x8d\x46\x0f\ -\x60\x41\x02\xe6\x80\xf6\xba\x55\x47\x8e\x1e\x26\x2b\x56\xe6\x12\ -\xb0\x10\x1f\xca\xbc\x95\xe4\xc8\xd1\xc3\x84\xf6\xba\x55\x31\xdb\ -\x1e\x87\xad\xe6\xd7\x96\x8b\x3f\xcc\x9c\x9b\x09\x8f\x8f\x56\xdd\ -\x1d\x1c\xd0\x87\xc2\x0c\x37\x65\x01\x2d\x97\x2f\x35\x95\x95\x6f\ -\x4e\x70\x1e\x1b\x9a\x0d\xa5\xc4\x74\xa5\xa5\x29\x15\x1e\xaf\xdf\ -\xa3\x3c\x76\xfc\x13\x52\x5b\x57\x43\x2e\xfc\xfc\xe3\xef\xe1\xc8\ -\x04\x27\x99\x1d\x7b\xe6\x47\x28\xcc\x70\x69\xb7\x5b\x3f\x3a\x3a\ -\x9a\x94\x74\x74\x74\x14\x6e\x97\x4b\xff\x3c\xb2\x99\xf0\x78\x3c\ -\x7a\x53\x8b\x09\xa6\xcb\x26\x58\xcc\x96\x6d\x0f\x1e\x3c\x90\x26\ -\xb3\x4b\x88\x01\x36\x9b\x3d\x95\xc5\xe5\x06\xd2\xd2\xd2\x12\x23\ -\x9b\x05\x80\x00\xe9\xe9\xe9\x10\x08\x85\x23\x02\x9e\x70\xea\x45\ -\x02\x28\x8a\xb2\x56\xef\xac\x46\x61\x7f\x21\x2a\x5f\xab\xfc\x23\ -\x2b\x2b\x2b\xf0\xa2\x7f\x00\x00\xdd\xb6\xae\x5d\x3b\x76\xee\x20\ -\x99\xbc\x0c\x02\x36\xa6\xc7\xb3\x2b\xd8\x51\xbd\x9d\xb4\x77\x5c\ -\x3f\x98\x12\x11\xa6\xe3\xa9\xaf\xbf\xb7\x7a\x5e\x31\xe0\x0f\xf8\ -\x14\xdf\x9f\x3f\x47\xb6\xea\xb7\x90\xe5\x72\x19\x11\x66\xf3\x89\ -\x5c\x41\x11\x7d\xe5\x56\x72\xf6\x5c\x53\x4f\x30\x34\x2e\x4a\x99\ -\x2c\x05\xb0\x66\x4f\x8c\x33\x63\x22\xaf\xd7\xcb\xd8\xed\x76\x0c\ -\x0c\x0c\x80\x61\x18\xc8\x64\x32\xa8\xd5\xea\xef\xd4\x6a\xf5\xc9\ -\xe5\x52\xca\xf3\x52\x04\x84\x23\x13\x9c\xdb\xb7\x6f\x37\x58\xad\ -\xd6\x13\x81\x40\x00\x12\x89\x04\x6a\xb5\x1a\x6b\xd6\xac\xd9\xcc\ -\xe7\xf3\x47\x96\xda\xf1\x1c\x98\xae\xb4\x34\xbd\xb9\xfd\x0d\x42\ -\xc9\x97\x13\x9e\x80\x1b\x3f\xf6\xb6\x76\x6b\xc3\x52\xf0\xdb\x7b\ -\x7b\x6a\x0c\xc6\x46\xa7\xc1\xd8\xe8\x1c\x1c\xbe\xa7\x4b\x58\x1c\ -\xba\x3f\xb8\x69\xef\xbe\x3d\x49\x73\x7f\xff\xc1\x8f\xc8\xbc\x82\ -\x28\x09\x68\xaf\x5b\xd5\xf0\xf1\x11\x92\xbb\x22\x87\xe4\xad\x52\ -\x92\x2f\xbe\xfc\x9c\xf8\x03\x3e\x05\xf0\x2c\x0d\x43\xa1\x50\xd1\ -\x9d\x3b\x77\xe2\xe9\x36\x13\xdd\x5d\xdd\x88\x44\x22\x0a\x00\x83\ -\x0b\x15\x10\x8d\x46\x15\x43\x83\x43\x70\xbb\x69\x00\xc0\xf0\xd0\ -\x30\x1e\x3f\x7e\xcc\x8d\x0b\x60\xb1\x58\x53\x59\x59\x59\x73\x9c\ -\x03\x00\x97\xbb\xa8\xcd\x03\x00\xc4\x62\xb1\x5d\x57\xa1\x8b\xba\ -\x5c\x2e\x6e\x46\x46\x06\x74\x15\xba\x8e\x58\x5d\x48\x03\x80\x9c\ -\x9c\x9c\xbf\xb4\x3a\x2d\x6c\x36\x5b\x5c\x25\x00\xc8\xe5\x14\xaa\ -\x5e\xaf\x42\x8e\x3c\x77\xc1\xbb\x07\x00\x71\xb6\x24\xe4\x0f\xf8\ -\x0a\x37\x6e\xdc\xf8\x1e\x00\xa8\x54\xaa\xf3\xcb\x44\xe2\x50\x82\ -\x91\xbd\xb7\xa7\x66\xef\xbe\x3d\xa4\x54\xa3\x26\x79\xab\x94\x44\ -\xb3\xa1\x94\x1c\x38\xb4\x9f\xdc\x1b\xba\xab\x4b\xca\xba\x44\x48\ -\xa8\x03\x83\xc3\xf7\x74\x03\x03\x03\xbb\x82\xc1\x60\x91\x50\x28\ -\xd4\xe5\xe5\xe5\x81\xa2\xa8\x9c\x97\x99\x82\x73\x0a\x11\x30\xfd\ -\x28\x39\x1c\x8e\x48\xaf\xc3\x81\xf0\xe4\x24\x56\xaf\x5e\x7d\x5e\ -\xa3\xd1\x7c\xba\xd8\xab\x48\x19\xd7\xac\xad\xc7\xde\x79\xf7\x6d\ -\xa2\x2a\x2c\x20\xb9\x2b\x72\x48\x59\xf9\x66\x72\xfa\x9b\xaf\x1f\ -\xcd\xb7\xfd\xba\x7e\xa3\xed\xa0\xc1\xd8\xe8\xb4\xb4\x9a\x4f\xa5\ -\x5c\xc2\x3d\x3e\x5a\x75\xe0\xd0\x7e\x22\x91\x8a\x13\xea\xc1\x96\ -\xad\xaf\x92\xab\x96\x3f\xbf\x4a\xd5\xf9\xe5\xdf\x4c\xc6\x72\x6d\ -\x19\x91\x2b\x28\x52\xaa\x51\x13\x83\xb1\xd1\x99\xec\x19\x67\xcf\ -\x9e\x08\x87\xc3\x4a\xe7\x7d\x27\x26\x23\xe1\x84\x79\xb7\xdb\x0d\ -\x9f\xcf\x97\x10\x90\x13\x93\x21\xce\x38\x33\x26\x9a\x4d\xec\x0f\ -\xf8\x14\x66\xb3\x79\xb7\xad\xc7\x06\xaf\xd7\x87\xae\xae\x6e\x74\ -\x76\xfe\xad\xa4\x69\xb7\x7e\xb6\xbf\x39\x3d\x21\x9f\xcf\x1f\x91\ -\xc9\x64\x48\x4b\xe3\xe0\x21\x6b\x2a\x5e\x1b\xa4\x52\x29\x24\x12\ -\x49\x57\xcc\xee\x46\x67\xfb\x87\x67\xce\x9c\x39\xcd\x30\x0c\x4a\ -\x4a\x4a\xac\xb4\xd7\x5d\x1f\x8b\x11\x0e\x87\x13\x15\x89\x44\xc8\ -\xcc\xc8\xc4\xc3\x47\xff\x20\x23\x3d\x13\x6c\x36\x1b\x02\x81\x30\ -\xb5\x18\x9a\xf9\x2e\x48\x65\x12\xb2\xee\x95\x12\xf2\xd9\x89\xe3\ -\x64\xd8\x39\xb4\x09\x98\x4e\xd9\xda\xba\x1a\x22\x91\x8a\x09\x4f\ -\xc0\x25\x25\xeb\xd6\x12\x83\xb1\xd1\x19\x2b\xaf\xc0\x74\x5f\x51\ -\x5b\x57\x43\xca\xb5\x65\xa4\xb6\xae\x86\x5c\xbc\xf4\xcb\x85\x64\ -\xbe\x92\x76\xc5\x5a\xad\xf6\x03\x00\xb8\x79\xf3\xe6\xae\x68\x34\ -\x0a\x55\x41\xc1\x88\xbe\xb2\xb2\x3e\x3f\xaf\xa0\x23\x1c\x99\xe0\ -\x34\x37\x37\x37\xdc\xba\x75\x0b\x63\x63\xe3\x00\x00\x87\xa3\x17\ -\x57\xaf\x9a\x95\xba\x8a\x8a\x52\x00\x26\x00\x50\xaf\x2f\x3d\xdb\ -\xd7\xdf\x1b\x70\xb9\x5c\xdb\x28\x8a\xea\xc8\xcf\xcf\xff\x29\x65\ -\x01\xd9\xc2\x65\x51\x00\xf5\x1e\x1f\x7d\x92\x10\x02\x1e\x8f\xe7\ -\x11\x09\xb2\xa3\xb1\xf5\xa7\x4f\x9f\x72\x9e\x3c\x79\x12\xb7\xe7\ -\xf1\x93\x97\xeb\xe2\xa2\xb5\xa6\x98\xa0\x25\x45\xec\x78\x67\x5f\ -\xc1\x38\x33\x36\xef\x6e\x29\x69\x21\x4a\x05\x96\x56\xf3\xa9\x6b\ -\xad\xd7\x1a\x82\xc1\x20\xd6\x16\x17\x8f\xbc\x56\x55\xf5\xbe\x2a\ -\xbf\xd0\xba\x50\xbe\x05\xc1\x1f\xf0\x29\x3c\x3e\x7a\x51\xfd\xc2\ -\xbf\xcb\x75\x6c\xdc\xb0\x66\x5f\x43\x00\x00\x00\x00\x49\x45\x4e\ -\x44\xae\x42\x60\x82\ -\x00\x00\x05\x7a\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ -\x00\x00\x05\x41\x49\x44\x41\x54\x58\x85\xcd\x57\x5d\x4c\x93\x57\ -\x18\x7e\x50\x08\xf3\xfb\x68\x81\x82\xb4\x50\x07\x6c\x2d\xa8\x6d\ -\x81\x8d\xb6\x6e\x6c\x68\x32\xa2\x02\x22\xfe\x2c\x81\x9a\xdd\xcc\ -\x8b\xc5\x9f\x25\x2e\xcb\xcc\x12\x9d\x63\x17\x5e\x2d\xd9\x9c\x42\ -\x20\x1a\xbc\x71\x17\xfc\x69\x70\x2a\x73\x11\x14\x56\x90\x64\x1a\ -\x88\xac\x95\x22\xa5\x80\x52\xd3\x9f\xaf\xb4\xa5\x2d\x85\x8f\xa5\ -\x4d\xcf\x2e\xb4\x15\xa4\x20\x30\x48\xf6\x24\xdf\xc5\x77\xce\x7b\ -\xde\xe7\xc9\x79\x7f\xce\x39\x11\x58\x21\x2c\x8c\x59\xec\xf1\xb8\ -\x0d\x00\x10\x1b\x1b\x97\x26\x48\x4a\x36\xae\xc4\x4f\xc4\x72\x17\ -\xb8\x3c\x13\x94\x56\xab\x3d\xd5\xda\xda\x5a\x31\xf8\x64\x10\x00\ -\xb0\x55\xb2\x15\x45\x45\x45\xa7\x65\x32\x59\x55\x1c\x37\x7e\x7a\ -\x25\x42\x96\x8c\x8e\xce\xf6\x73\xe5\xaa\x32\xc2\x17\x24\x11\x44\ -\x80\x20\x02\x84\x2f\x48\x22\xe5\xaa\x32\xd2\xd5\xdd\x59\xb1\xa6\ -\xe4\x66\xab\x49\xfc\xfd\x0f\x67\x88\x70\x53\xca\x0b\xf2\x75\x08\ -\x89\x10\x6e\x4a\x21\x67\x2a\xbe\x23\x66\xab\x49\xb4\x1c\x9f\x91\ -\x0b\x4d\xd8\xec\x4c\x0a\xc3\x30\x3b\xfc\x7e\x3f\xcd\xe7\xf3\x3b\ -\x53\x04\xc2\x61\xa7\xd3\x99\x33\xa4\x1f\x82\xcd\x6e\x7b\x11\x3c\ -\xf2\xca\xde\x64\x32\xc3\x30\x64\x80\xd3\xe9\xcc\x02\x30\xf2\x9f\ -\x04\x68\xfb\x35\x87\x6a\x6b\x6b\x1b\xfa\x1e\xf5\x81\x65\x59\x48\ -\xa4\x12\xdc\x6d\x6f\xbb\x34\x39\x39\x39\x06\x00\xbe\x7f\xfc\x73\ -\xb3\x27\x02\xa0\x69\x6a\xa9\x9c\x8b\x0b\x18\x7d\x36\x92\x57\x5d\ -\x5d\xdd\xd0\xd4\xd8\x04\x93\xc9\x0c\x00\xe8\xe9\xe9\xc1\xd3\xd1\ -\xa7\xc7\x54\x87\x54\x10\x67\x88\x21\x14\xa6\x84\xe6\x00\x00\x04\ -\xe0\xc4\x70\x90\x91\x99\x01\x1e\x8f\xf7\x38\x38\x1c\x0c\x47\x8a\ -\x40\xb8\xe0\x8e\xcc\x13\xd0\xdf\xdf\x7f\xb2\x53\xdd\x39\x87\x60\ -\x7c\xdc\x8e\x07\x0f\x1e\x40\xae\x90\x23\x2f\x2f\x0f\xfa\x41\x3d\ -\xd4\x6a\x35\x1c\x4e\x27\x00\x80\xcb\x8d\x41\x7e\x7e\x3e\x0a\x0a\ -\x0a\xce\x05\xc9\x2c\x8c\x59\x54\x53\x53\x33\x4c\x08\xc1\xe8\xb3\ -\x91\x0f\xdf\x4d\x17\x3d\x7c\xa3\x80\xc9\x29\x4f\x54\x73\x73\x73\ -\x8e\xdb\xed\x9e\x67\x68\x32\x99\xe1\x70\x38\x20\x97\xcb\xc5\x1b\ -\x37\x6e\x2c\x91\xca\xa4\x95\xbd\x3d\xbd\x00\x80\x6d\x1f\x6c\xc3\ -\xfe\xfd\xfb\x0f\x8b\x44\xa2\xfa\xd0\xa6\x10\x02\xab\xc5\x0a\x00\ -\x98\x9a\x9a\x4a\x05\x10\x56\xc0\x3c\x5c\xbf\xd1\xfc\x87\x5c\x91\ -\x1b\xca\xee\x60\xb6\x6f\x7a\x5b\x48\x7e\xfe\xe5\x27\xe2\xf2\x4c\ -\x50\x00\xe0\xf1\xba\xa3\x98\x71\x6b\xaa\xd5\x66\x49\xf5\x78\xdd\ -\x51\xe1\x7c\xe9\x9e\xf4\x1f\xd0\x3d\xe9\x3f\xb0\x24\xe2\x20\x86\ -\x47\x0d\x3b\xbe\xfa\xfa\xc4\x9c\x3a\x4f\x48\xe4\x91\x3d\x25\xc5\ -\x6b\x52\xe7\xf3\x72\x20\x29\x29\xe9\x2f\x95\x4a\x05\x8a\xa2\xa0\ -\xd5\x68\x11\x08\x04\x90\x9e\x9e\x8e\xd2\x7d\xa5\xbf\xca\x64\xb2\ -\xaa\xd5\x16\x10\x2a\xa6\x09\xb7\x33\xce\x68\x34\xee\xb3\xdb\xed\ -\x0a\x8a\xa2\x4e\x70\x38\x1c\xf8\x7c\xbe\xc3\x00\xc0\xe7\xf3\xbb\ -\x39\x1c\x8e\x91\x43\x73\x7d\x6b\x22\xc0\xe9\x72\xc4\xb5\xb7\xb7\ -\xdf\xbc\x76\xf5\xda\x0e\x9b\xcd\x86\x84\x84\x04\x14\x16\xee\xc6\ -\xde\xd2\x52\xf1\x62\x25\xb4\x6a\xb8\xd7\x71\xb7\xaa\x78\x4f\x11\ -\xa1\x39\x54\x28\xee\x72\x45\x2e\x69\x68\xaa\xbf\xbf\x1a\xfe\x3d\ -\x5e\x77\x54\x57\x77\x67\x45\xed\xe5\x4b\x63\x7d\x9a\x47\x9f\xcf\ -\x99\x74\x4f\xba\xa8\x0b\x55\xe7\x5f\xf5\xf7\x97\x1f\xcd\xa1\xc8\ -\xc9\x6f\xbf\x21\xee\x49\xd7\xca\x5a\xdc\x2c\x0c\x0d\xeb\x3f\x29\ -\x57\x95\x11\x71\x86\x88\x1c\x3b\x7e\x74\xce\x79\xb1\x0e\x78\x51\ -\xb3\x6b\x09\xbf\xdf\x4f\x71\xb9\x5c\x10\x42\x40\xd1\x14\x66\x66\ -\x66\x12\xe7\x18\xdc\x6d\x6f\xab\x2c\x2a\x2e\x0c\x85\xe0\x2d\x3a\ -\x9a\xc8\x15\xb9\xa4\xf1\x6a\x43\xc7\x6a\x08\xf0\x78\xdd\x51\xea\ -\xae\x8e\xb3\xe1\x42\x10\x01\x00\x36\x3b\x93\xac\x56\xab\xaf\xb4\ -\xb4\xb4\xec\x7e\x6e\x7c\x1e\x4c\x42\xe3\xde\xd2\xd2\x82\xb5\x4e\ -\xc2\xd9\x65\x18\x6b\x34\x1a\x4b\xec\x76\x7b\x2e\x8f\xc7\x7b\x2c\ -\x14\x0a\xdb\x92\x12\xf9\x96\xb5\x24\x7f\x23\x26\xdc\xce\xd8\xd5\ -\x48\xc2\xc5\x10\xf6\x4e\x68\xb3\x33\xc9\xbd\xbd\xbd\x67\x75\x3a\ -\xdd\x17\xd1\xd1\xd1\xd3\xdb\xb7\x6f\xff\x52\x2c\x16\xd7\x2f\xb7\ -\x11\xb9\x27\x5d\x14\xcb\xb2\x89\x34\x4d\x5b\x16\x5a\x1b\xf6\x42\ -\xd2\xd5\xd5\x75\xb9\xa6\xba\xa6\xc4\x60\x30\x20\x32\x32\x92\xd2\ -\x6a\xb4\x57\x8e\x1c\x3d\x42\x01\xb8\xb8\x54\x72\x66\xdc\x9a\xda\ -\xd4\xd8\x78\x5f\x3f\x34\x94\x9a\x9b\x9b\xfb\xd0\xe9\x72\x14\xf2\ -\xe2\x12\xe6\x1f\xb3\xaf\xc3\x6c\x35\x89\x8e\x1d\x3f\x4a\x12\x12\ -\x79\xa1\x9e\x90\xfe\x4e\x1a\xa9\xaa\xae\x9c\x0a\x9e\x84\x4b\xc1\ -\xf5\x1b\xcd\xbf\xc9\xb2\xa4\x84\xe6\x50\xe4\xa3\x8f\xf3\x48\xdb\ -\xbd\xd6\xca\x70\x76\xeb\x5e\x1f\x60\x59\x36\xd9\xef\xf7\xc3\xe1\ -\x70\x86\xc6\x7c\x3e\x1f\x66\x66\x66\xa8\x40\x20\x10\xf6\xd8\x0d\ -\x07\x96\x65\x93\x3d\x1e\x0f\xa6\xbc\xd3\xf0\x7a\xbd\x60\xd9\xe9\ -\xe4\x70\x76\xf3\x42\x10\x1f\x1f\xff\x58\x2a\x93\x62\xcb\x96\xcd\ -\x18\x79\x3a\x02\x6e\x0c\x17\x99\x99\x99\x90\x4a\xa5\xbf\xce\xde\ -\xc2\xbf\xb5\x7d\x9f\x69\x34\x9a\x53\x00\x90\x93\x93\xf3\xe3\x7b\ -\xd9\xef\xd7\xcf\xf6\xa3\x54\x2a\x4f\x1f\xfc\xf4\x60\x87\x7e\x50\ -\x0f\x85\x52\x81\xac\xac\xec\x73\x4b\x12\xc0\x8b\x4b\x70\x9b\xad\ -\x26\x31\x21\x64\x78\x40\x37\x80\xf5\xeb\xd7\x63\xd7\xee\x5d\xb7\ -\x95\x4a\xe5\xe9\xa0\xcd\xc0\xa0\xae\xe4\xc2\xf9\x0b\x75\x77\xee\ -\xdc\x41\x20\x10\x40\x71\x71\x71\xdd\xe0\xd0\x80\x7d\x4b\xa6\xa4\ -\x2d\x68\x93\x29\xde\xfc\xa7\xd9\x6a\x12\x33\x0c\x93\x2f\x10\x08\ -\xba\x93\xf9\x29\xcb\xeb\x27\x4e\x97\x23\x76\x78\xd4\x90\x1f\xee\ -\x9e\xdf\x72\xfb\x56\x5d\x56\xb6\x2c\x94\x23\x59\xd9\x32\x72\xeb\ -\xf7\x9b\x75\xcb\x22\x78\x89\x05\xdf\x05\x2f\xb7\xbb\x3b\xdc\xdc\ -\x86\x0d\x1b\x2c\x34\x4d\x87\xfe\x63\x62\x62\x40\x51\xd4\x8a\x9a\ -\xd6\x82\x02\x16\x83\x44\x22\xb9\x58\x56\x5e\x76\x92\xc7\xe3\x81\ -\x10\x82\x9d\xbb\x76\x42\x22\x91\x2c\xb9\x44\x67\x63\xd9\x8f\xd3\ -\x20\x2c\x8c\x59\x34\x36\x36\x56\x02\x00\x69\x69\x69\xb7\x97\x1d\ -\xe3\xff\x0b\xfe\x05\xac\x87\x61\x7c\xf4\xfe\x88\xd7\x00\x00\x00\ -\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x06\x1f\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ -\x00\x00\x05\xe6\x49\x44\x41\x54\x58\x85\xcd\x57\x5b\x4c\x14\x67\ -\x14\xfe\x40\x51\x60\x76\xd9\x71\xef\xec\x6e\x03\x0b\x82\x94\x4b\ -\x65\x25\xd9\xa0\x58\xdb\x6d\xbd\xb5\x5a\x9b\xb6\xde\x9a\xd8\x97\ -\x6a\x53\x13\x7b\x49\xdb\x07\x9b\x26\xb5\x69\x9b\x26\x3e\xa8\x4d\ -\x7a\x21\xed\x43\xfb\xa2\x35\x50\xad\x7d\xa8\x35\x05\x51\x54\xa8\ -\xe2\x16\x25\xc2\x2e\xdd\x85\x15\x28\x11\xd8\x85\x99\xd9\x99\xd9\ -\x99\x61\xb7\x5c\xfe\x3e\x28\x57\x17\x14\xec\xed\x7b\xfc\xf3\x9d\ -\xf3\x7d\xff\x9f\x33\xe7\x9c\x01\xfe\x63\x24\xcc\x37\xb0\x37\xd8\ -\x93\xdb\xdd\xdd\xfd\x5c\x34\x3a\x68\x34\x18\x8c\x6e\xab\xd5\x7a\ -\x9a\x4e\x5b\x22\xcf\x35\xcf\xc2\xf9\x88\x37\x7b\x6e\xec\x2a\x2f\ -\x2f\x3f\xfa\x6b\xfd\xaf\x88\xc5\x62\xb0\xd9\x6c\xd8\xf2\xec\x96\ -\xb6\xbe\x50\xef\x33\xe9\x26\x4b\xdb\x7c\x72\xde\x37\x02\x1d\xed\ -\xae\x77\xdf\xdb\x4f\x6c\x0f\x59\x09\x12\x40\x90\x00\x42\xa9\x53\ -\xc9\x63\x8f\xaf\x21\x95\x27\x2a\xae\x0b\x11\x9e\x1a\xe3\x0a\x11\ -\x9e\xe2\x78\x96\x16\x25\x21\x69\xa6\x7c\x33\xbe\x80\x10\xe1\x29\ -\x96\x65\x1d\xa2\x28\xe6\x6a\x34\x9a\x36\xbd\x5e\x7f\x55\x4d\xa5\ -\x0d\x05\x02\x81\x97\xaf\x5c\xbe\x82\xd0\x40\x68\x9c\x2b\x4b\x0a\ -\x5a\x5b\x5b\x71\xed\xda\x35\x87\xd3\xe9\x74\x70\x3c\xeb\xf1\xfb\ -\xfd\xaf\x57\x56\x54\xec\x97\x15\x85\x32\x99\x4c\xde\x16\x6f\xf3\ -\xc1\xa2\x82\x47\x8e\xdd\x97\x01\x8e\x67\xe9\xea\xea\xea\xaa\x73\ -\x35\xe7\x9c\x0c\xc3\x40\xaf\xd7\x63\xd3\xe6\x4d\xa7\x7b\x83\x3d\ -\xef\xd4\xd5\xd5\x15\x84\xc3\x61\x0c\xc5\x86\x27\x02\x12\x00\x65\ -\x50\x01\xc7\x72\xe0\x79\xbe\xae\xa1\xa1\x01\xa7\x7e\x38\x85\x96\ -\x96\x16\x0c\x0e\x0e\x42\xa7\xd3\x15\x38\x9d\xce\xa3\xf5\x97\xeb\ -\x72\x57\xaf\x7a\xf4\xc0\x3d\x0d\xb8\xdd\xee\xcf\xcb\xbf\x2c\x77\ -\xba\x7f\x73\x03\x00\x52\x92\x53\xd0\xdd\xdd\xbd\x79\xdf\x6b\xfb\ -\x36\x6b\xb5\x5a\x58\x2c\x16\x34\x37\xb7\x4c\x94\x30\x01\xd4\x2a\ -\x35\x0c\x46\x03\x3c\x1e\x0f\x8e\x7f\x77\x1c\x97\xea\x2e\x41\x96\ -\x14\x00\xc0\x1f\x7f\x74\xa3\xb7\xb7\x17\x00\xde\xf7\xb5\xb5\xba\ -\xf3\x72\xf3\x4f\x8f\x69\x25\x4e\x17\xef\x67\x42\xd6\xc6\xc6\xc6\ -\x5d\x1e\x8f\x07\xb2\xa4\x40\x96\x14\x30\x0c\x0b\x8f\xc7\x03\x9f\ -\xcf\x07\x8b\xc5\x82\xb2\xd5\x65\xc8\xcc\xcc\x00\xc8\xed\x98\xe4\ -\xd4\xc5\x28\x2e\x2e\x86\xc3\xe1\xc0\xad\x5b\xb7\xe0\xf5\x7a\xc7\ -\xc5\xc7\x4c\x06\x83\x21\xf8\x7c\x3e\x74\x76\x76\xed\x9a\xf5\x05\ -\x46\x47\x47\x17\x29\x8a\x82\xd1\xd1\xd1\xdb\xc1\x77\x44\x62\xb1\ -\x18\x62\xb1\x18\x0c\x06\x83\x6d\xf7\xee\xdd\x94\xc9\x68\xbc\x5e\ -\x53\x73\x8e\x92\x24\x09\x85\x45\x85\xd8\xb4\xe9\xe9\x23\x39\x39\ -\xb9\x5f\xb7\xb4\xb4\xf8\x15\x45\x99\x88\x25\x13\xb9\x45\x51\x84\ -\x28\x8a\xb9\xb3\x1a\xa0\x28\xea\x56\x51\x51\x91\xd7\x6a\xb5\x16\ -\x48\x72\x04\xb1\xd8\x10\x92\x16\x2d\x84\xdd\x6e\x47\x4e\x4e\x8e\ -\xdb\xa8\x37\xf5\xdc\xa1\xaa\xfa\x99\x90\x75\x78\x78\x98\x4a\x49\ -\x49\xe9\x5f\xa2\xd1\xf2\x42\x84\xa7\x0c\x06\x03\x54\x2a\x15\x18\ -\x86\x9d\x72\x81\xe4\xd4\xc5\x50\xab\xd5\xa0\x69\xda\x3b\xab\x01\ -\x35\x95\x36\xd4\x1b\xec\x79\xbe\xbd\xbd\xdd\x7f\xfe\xdc\x79\x30\ -\x0c\x03\x9b\xcd\x86\x75\xeb\xd7\xa1\xa4\xa4\xe4\x9d\xc9\xdc\x49\ -\x66\x00\x00\x1a\x35\x2d\x5f\xac\xab\x3d\x52\x52\x52\xf2\x36\x17\ -\x66\x21\x0a\xd2\x24\xae\x11\xa5\x2b\x4b\x91\x95\x95\x35\xe5\x4b\ -\x88\xdb\x09\x23\xb2\x98\x14\x89\x44\xec\x5e\xaf\x77\x3f\xc7\x71\ -\x0e\x9d\x4e\xe7\xce\xcf\xcf\x3f\x62\x31\x5b\xef\xd9\x64\x38\x9e\ -\xa5\x6b\x6b\x6b\x7f\xaa\xac\xa8\x5c\xdd\xda\xda\x8a\x68\x34\x0a\ -\x8d\x46\x83\x35\x8f\xad\xc1\xf6\xed\xdb\x0f\x14\x16\x16\x1e\x54\ -\x53\x69\x43\x33\x1a\x10\x25\x21\x69\x64\x64\x84\x5a\xa2\xd1\xf2\ -\xf7\x12\x9b\x09\x11\x59\x4c\xea\xe8\xe8\x78\xc9\xef\xf7\xbf\xaa\ -\x28\x8a\x55\xab\xd5\x36\xe5\xe7\xe7\x1f\x59\x9a\x95\x53\x3b\x9d\ -\x3b\x6e\x20\x2c\x70\x74\x57\x57\xd7\x8e\xe6\xe6\xe6\xf7\x09\x21\ -\x70\x38\x1c\x07\x96\x17\x15\x7f\x3b\x5f\x13\x63\x46\x08\x21\x48\ -\x53\x69\x86\xee\x49\xae\xae\xa9\xfa\x66\xeb\xb6\x17\xc8\xd2\x9c\ -\x6c\x92\xbd\x34\x8b\x6c\xdf\xb1\x8d\x5c\xaa\xbf\x78\xf0\x41\x0c\ -\x4c\xc7\xe4\x36\x3d\x05\xfd\x4c\xc8\xfa\xf1\x27\x1f\x11\x93\xd9\ -\x38\xde\xdf\x4d\x66\x23\xf9\xe0\xc3\x03\x64\xb6\x3e\x3e\x17\xb4\ -\xfa\xbc\xcf\x7d\xfe\xe5\x67\xe4\xfb\x93\x95\x57\xfb\x99\x90\x75\ -\xec\x3c\x11\x00\x86\x87\x87\xa9\x70\x38\x0c\x49\x9e\xa8\x5a\x49\ -\x96\x10\x0a\x86\x90\x90\x30\xef\x89\x3d\x05\xc1\x50\xd0\x75\xa1\ -\xf6\x02\x1a\x1b\x1b\x9d\xb2\x2c\xdb\xc7\xce\x17\x02\x80\x4a\xa5\ -\xea\xcc\x5b\xb6\x4c\xce\xce\xca\xa6\x02\x37\xdb\x01\x00\x79\xcb\ -\xf2\xb0\x62\x85\x43\x9e\x5c\xb1\x0f\x82\x87\xf3\x1e\xfe\x62\xcf\ -\x2b\x7b\x8c\x34\x4d\x7b\x75\x3a\xdd\xd5\x29\x06\xd2\x54\x9a\xa1\ -\xde\x60\xcf\x0a\x49\x96\xfd\x0d\x57\x1a\x00\x00\x6b\xd7\x3e\x29\ -\xaf\x5d\xb7\x6e\xe3\xdf\x21\x0e\x00\x77\xf6\x84\x9d\xd3\xcf\xa7\ -\xbc\x6f\x68\x20\x68\x67\x59\xb6\x78\x64\x64\x84\xd2\xeb\xf5\xee\ -\x7f\x7c\xb9\xf8\xdf\x23\x2c\x70\xf4\xe4\x8a\xfd\x27\x30\x63\x89\ -\x37\xdd\xb8\xfe\x6a\x4d\x4d\xcd\x57\xa2\x28\xa2\xac\xac\xec\x58\ -\x69\x69\xe9\xde\xb9\x2e\x9d\xc1\xfe\x3e\x7b\x5f\x5f\xdf\x7a\xad\ -\x4e\xdb\x94\x61\xcb\x74\xdf\x77\x60\xfb\xcd\xb6\x0d\x7b\x5e\xd9\ -\x4d\x4c\x66\x23\xd1\xe9\xb5\xc4\xf5\xc4\xe3\xe4\xcc\x2f\x3f\x57\ -\xcc\x45\x5c\x88\xf0\xd4\xe1\x4f\x0f\x91\x55\x65\x2b\xc9\x9b\x6f\ -\xbd\x41\x6e\x76\x06\x5c\xf1\x78\x77\x2d\x24\x00\xd0\xd7\xd7\xe7\ -\x6a\x6a\x6a\x42\x28\xd4\x0f\x96\xe5\xd0\xd1\xd1\x81\x40\x20\xb0\ -\x83\x17\xc3\xf1\x3b\x59\x1c\x44\xa3\x51\x63\x7b\x5b\x3b\xfc\x7e\ -\x3f\xfc\x3e\x3f\x06\x06\x06\x9c\xf1\x78\x71\x57\x32\xad\x56\xdb\ -\x64\xb7\xdb\xd1\xd5\xd5\x85\x68\x2c\x8a\xf4\xf4\x74\x98\xcd\x66\ -\xf7\x82\x05\x0b\xfe\x9c\x7e\x4b\x86\x61\x9c\x29\x29\x29\x3d\xd3\ -\x27\xa5\xc9\x60\xee\x3c\x79\xea\x44\x3d\x21\x64\x75\x41\x61\x01\ -\x32\x32\x32\x7e\x8c\xa7\x15\xb7\x06\x84\x08\x4f\x55\x55\x55\x9d\ -\x3f\x5b\x7d\xd6\x29\x08\xc2\x78\x4f\xc8\xca\xcc\xae\x1f\xe3\x70\ -\x3c\x4b\x9f\x39\x73\xe6\xea\x85\xda\x0b\xb9\x26\xb3\x09\x5b\xb7\ -\x6e\xdd\xeb\x58\xbe\xe2\xeb\xc9\x79\x44\x49\x48\x92\x24\xc9\x9e\ -\x9c\x9c\xdc\xaf\xa5\x75\x73\x9b\xae\xa2\x24\x24\xdd\xec\x0c\xb8\ -\xbc\xbf\x7b\x76\xc4\xfb\x12\x9a\x3d\x37\x76\x6d\x7c\x6a\x03\x41\ -\x02\x48\xa6\x3d\x83\x1c\xfe\xf4\x10\x09\x0b\x1c\x3d\x27\x11\xcc\ -\xf2\x5f\x70\x67\x84\xde\x35\xbf\xc7\x40\x08\x59\x94\x98\x98\x08\ -\x4a\x95\x0a\x00\xf3\x9e\x19\xf3\xfa\x35\x03\x80\xf4\xf4\xf4\xaa\ -\x9d\x2f\xee\xec\xb4\x58\x2c\x76\xa3\xc9\x08\x97\xcb\xb5\x77\x3e\ -\x4b\xcc\x03\x8d\x3a\x8e\x67\x69\x8e\xe3\x1c\xa9\xa9\xa9\x3d\x6a\ -\xb5\xba\xf3\xef\x1a\x5c\xff\x2a\xfe\x02\x82\x3e\xb3\xa0\x21\xcb\ -\x97\x11\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x06\x05\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ -\x00\x00\x05\xcc\x49\x44\x41\x54\x58\x85\xe5\x97\x4d\x50\x13\x67\ -\x18\xc7\xff\xd9\x81\xb5\x24\x26\x90\x6c\x42\x30\x6c\x0c\x09\x14\ -\x42\x2d\x32\x80\x41\xa8\x35\xd4\x19\xa1\x7e\xcb\xd0\xa1\x87\x5a\ -\x67\xec\xa5\xd5\x91\x1e\xda\x1e\xbc\xb4\xd3\x19\xe8\x17\xad\x3d\ -\xd9\x8b\x8e\x0e\xda\x29\x9d\x56\x9c\x02\x5a\x68\x1d\xad\x45\x85\ -\x80\x32\xc8\x80\xa0\x01\x49\x1a\x63\xbe\x36\x9b\x10\x4c\x36\x9a\ -\x00\x43\x7a\x10\x30\x28\x1f\x05\x5a\x3d\xf4\x3f\xb3\x97\x7d\x9f\ -\x7d\x9e\xdf\xbe\xef\xf3\xfe\xf7\x5d\xe0\x39\x8b\xb7\xd4\x07\xdd\ -\x1e\x86\xb6\xdb\xed\xa5\x56\xeb\xdd\x72\x3e\x5f\x70\x4f\xa3\xd1\ -\x9c\x4c\x55\xa7\x5d\x7c\x26\x00\x23\x7e\x9f\xe0\xdc\xb9\x73\xa6\ -\xc6\x86\x46\xb9\xd9\x6c\x86\x50\x28\x84\xbe\x48\x8f\xb2\xb2\xb2\ -\xf7\x73\xb2\x73\xbf\x5b\x4a\xce\x45\xa9\xfd\x9a\xa1\x72\xdb\xf6\ -\xad\x11\x81\x90\x1f\x01\x0f\x11\xf0\x10\xc9\xd0\xa6\x47\xbe\xac\ -\xfe\x22\xe2\x70\xd9\xb5\x8b\xc9\x15\x33\xdf\x60\x20\xe8\x27\x47\ -\x47\xc3\xe2\xd8\x58\xd2\x27\x5a\x19\x3f\x0a\x00\x7e\xee\x3e\xd9\ -\xdc\xdc\x5c\x6e\x32\x99\x10\x0c\x3e\x98\x8e\xb5\xd9\x6d\x30\x0d\ -\x99\xe0\xf5\x7a\x0b\x00\x18\x1d\x2e\xbb\xd6\x6a\xb5\x96\x8f\x8d\ -\x8d\x89\x25\x12\x49\x17\x4d\xd3\x0d\xf1\xc2\x84\xe0\x3f\x06\x30\ -\x5b\x4c\xfa\xa6\xa6\xa6\xa3\x66\xb3\x59\x4b\xd3\x34\xd3\x7f\xbb\ -\xef\xa3\x35\x99\x2f\xd7\xf2\x78\x3c\x10\x04\x31\xc6\xe3\xf1\x80\ -\xc8\x64\x70\xd4\x42\x4e\x4c\x4c\x90\xdd\x3d\x37\x2a\x8e\x1f\x3f\ -\x7e\xa4\xa3\xbd\x03\x0f\x1f\x3e\x44\x6a\x6a\x2a\x8a\x4b\x8a\x8d\ -\x0c\xeb\xda\x2e\x97\x25\x99\x17\x04\x70\xb8\xec\xda\x13\x27\x4e\ -\x5c\xae\xff\xa5\x1e\x76\xbb\x1d\x32\x99\x4c\xbe\x6b\xf7\xae\x1f\ -\x06\x87\x06\x7c\x42\x81\xa8\xf9\x96\xb1\xbf\x2a\x7f\x7d\xfe\x69\ -\x96\x65\xe1\xf5\x0e\x43\x20\xe0\x43\x9b\xa1\x45\x7e\xbe\x0e\x1c\ -\xc7\x1d\xad\xaf\xaf\xc7\x99\xba\x33\xb0\x58\xee\x02\x00\xae\x77\ -\x5e\x87\xcd\x66\xd3\xae\x58\x41\xd6\xf8\xb9\xfb\xc5\x53\xb3\x39\ -\x27\x80\xd5\x6a\x2d\xbf\xf4\xc7\x25\xdc\xb8\xd1\x0d\x00\x60\x18\ -\x37\x44\x22\x11\x36\x6c\xd8\x70\x10\x40\xb3\x52\xa9\x6c\xdc\xbb\ -\x77\x6f\x2d\x3f\x8e\xbf\x67\x60\x60\x00\x71\x71\x71\x28\x2d\xdd\ -\x8d\x57\x37\x6e\x7c\x73\x68\x68\xe8\x5d\x43\x9b\x61\xf3\x54\x71\ -\x00\x08\x72\x0f\xd0\xdd\xdd\x8d\xeb\xd7\x3b\xf5\xf9\xf9\xeb\x35\ -\x00\x8c\xf3\x02\x8c\x8f\x8f\x0b\xc2\xe1\x30\x62\x48\x02\xe3\xa3\ -\x13\x00\x80\x50\x28\x84\x70\x38\x2c\x06\x00\xa1\x40\x34\x0a\xe0\ -\x6d\x27\xe3\xf8\x2c\x10\x08\x68\x08\x82\x18\x95\x4a\xa5\xed\x09\ -\x22\x71\xf0\xe7\xba\x9f\x2a\xfd\x7e\xff\x53\x39\xb9\x20\x07\x37\ -\xe3\xc6\xc8\xc8\x48\xd6\x82\x00\x1a\x8d\xe6\xe4\xda\xb5\x6b\x0f\ -\xd9\x6c\x36\x78\x87\xbd\x90\x52\x52\xe4\xe5\xe5\x41\xad\x56\xff\ -\x18\x1d\xb7\x4a\xae\x30\x46\x27\x03\x00\xb1\x58\xdc\x25\x93\xc9\ -\xb4\x82\x95\xfc\x19\x4d\x2a\xa5\xa4\x50\xae\x56\x22\x21\x21\xe1\ -\x66\x74\xfc\xac\x00\x8a\xa4\x64\x63\x5b\x7b\x6b\xb5\x22\x59\x71\ -\xa8\xef\x66\x1f\xd2\x33\xd2\x51\x54\x54\x54\xab\xd1\x68\x6a\x66\ -\x8b\x8f\x56\x5a\x5a\xda\x31\x7d\x91\x7e\x0f\xcb\xb2\xb8\x33\x34\ -\x88\x70\x68\x0c\x14\x25\xc1\xba\x75\xeb\xa0\xd3\xe9\x20\x14\x0a\ -\x67\x34\xe1\xbc\x46\xe4\x70\xd9\xb5\x5e\xaf\xb7\x80\xa2\xa8\x0e\ -\xa1\x50\x68\x9e\x9c\xfa\x05\xd5\xdb\xd7\xb3\xef\xc2\x85\x0b\x35\ -\xd7\x3a\xae\x81\xe3\x38\xac\x5e\xbd\x1a\x05\x85\x05\xd0\xe9\x74\ -\xa0\x28\x2a\x55\x20\x10\xd8\xa6\x72\x2d\xd9\x8a\x17\xd2\xf0\x88\ -\x57\xec\x74\x3a\xb7\x79\x3c\x6c\x01\xcb\x7a\x2a\xac\x56\x2b\x7c\ -\x3e\x1f\xf8\x7c\x3e\xd2\xd3\xd3\xbb\x72\x72\x72\x3e\xd4\xa4\xa4\ -\x5e\x99\xb1\x04\x5e\x1f\x2b\x1f\x1e\xf6\xe5\xc5\xc4\xc4\x70\x14\ -\x45\x75\x44\x6f\x97\xc5\x4a\x92\x40\xf9\x00\xd4\x5e\x6d\xbb\x92\ -\x77\xf1\xc2\x45\xb4\xb6\xb6\xc2\xe3\xf1\x80\x24\x49\xa8\xd5\xea\ -\xbc\x1d\x3b\x77\x5c\x76\xb8\xec\x99\xd3\x00\x66\x8b\x49\x7f\xea\ -\xd4\xf7\x97\x0d\x6d\x06\x10\x04\x81\xb2\x37\xca\x8c\x6e\x0f\x53\ -\x9c\x28\x95\xdb\x96\x0a\xe1\x64\x1c\xda\xc3\x87\x0f\x7f\xd0\xd0\ -\xd0\x00\x97\x8b\x99\xbe\x6f\xb5\xde\x03\xc7\x71\x90\xcb\xe5\xb7\ -\xa7\x01\x7a\x7b\x7b\xaa\xea\x4e\xd7\xa1\xbd\xbd\x03\x14\x25\x01\ -\xc7\x71\xda\x8c\x8c\x8c\x52\x00\x4b\xfe\xb8\xb8\x5c\xae\xcd\xed\ -\x86\xf6\xc7\xc5\x79\x98\x76\x4f\x8b\xc5\x02\x43\x9b\x01\x04\xf0\ -\xc8\xdf\xdd\x8c\x5b\xcf\xb2\x2c\x00\xc0\xeb\x1d\x06\xc3\x30\x60\ -\x18\x46\xbf\xd4\xe2\x53\x9a\xf6\x84\xa8\xe2\x00\x10\x0a\x87\xe0\ -\x0f\xf8\x1f\x01\x88\x56\xc6\x8f\xa6\xa5\xbf\x78\x2c\x3b\x3b\x1b\ -\x8a\xe4\x55\x48\x49\x51\x41\xa7\xd3\x81\xa6\xe9\xc6\xe5\x14\x8f\ -\x8d\x8d\xf5\xd1\x34\x8d\x17\xf8\x2b\x1e\x43\x4c\x5e\xfc\x38\x3e\ -\xd4\x6a\xf5\x63\x1f\x58\xf3\xd2\x9a\xea\x7d\xef\xec\xd3\xe4\xe6\ -\xe5\x6e\x8e\x8b\x8b\x43\x61\x61\x61\x95\x4a\xa5\xaa\x5b\x0e\x00\ -\x4d\xd3\x0d\xc5\x25\xc5\xb0\xd9\x6c\x8f\x3c\x21\x3c\x06\x44\x00\ -\x8a\x92\x40\xa7\xd3\x61\xd3\xa6\x4d\x33\xb7\x61\x20\xe8\x27\x83\ -\xc1\x20\x4d\x10\xc4\xe8\x72\x9a\x2f\x5a\xb7\x8c\xfd\xe5\x67\xcf\ -\x9e\x3d\x7d\xfe\xf7\xf3\x60\x59\x16\x24\x49\x22\x37\x37\x17\x5b\ -\xb6\x6e\xe9\xd2\xeb\xf5\xa5\xff\x99\x0f\x44\xcb\xe1\xb2\x6b\x07\ -\x07\x07\x0e\xba\xdd\x6c\x11\x49\xc6\xfa\x54\xaa\x94\x3a\x95\x4a\ -\x55\x3b\xb9\x55\x9f\xaf\x16\xb4\x62\x96\x65\xf5\x12\x89\xb8\x4b\ -\x99\xac\xea\x7a\x56\x50\x00\x80\x3b\xa6\xc1\x6d\x9f\x7c\xfa\x71\ -\xe4\xb5\x4d\x45\x91\xfd\x07\xde\x8b\x74\xf7\xdc\xa8\x58\x6c\x8e\ -\xfe\xdb\x7d\x7b\xbe\xf9\xf6\xeb\x48\xd3\x6f\xbf\x36\x05\x82\x7e\ -\x72\xb6\x98\x39\x8f\x64\x3d\x3d\x3d\x95\x8d\x0d\x8d\xe8\xed\xbd\ -\x09\xa7\xd3\x89\xdc\xdc\x9c\x23\xf7\x03\x23\x35\xb3\x9d\xeb\xe6\ -\x92\xc5\x62\x79\xab\xb9\xa9\x19\xa1\x50\x68\x9b\x4e\xa7\x4b\x04\ -\xf0\x54\x63\xcf\x09\x20\x14\x0a\xcd\x0a\x85\x22\xcf\xe1\x70\x20\ -\x29\x29\x09\x94\x54\xda\x45\x10\xc4\xd8\x93\x71\x0c\xeb\xd2\x90\ -\x24\xe9\x13\xc7\x4b\x9e\x6a\xa8\xcc\xcc\xcc\xea\xfd\x07\xf6\x6b\ -\x94\x4a\x65\xdd\x5c\xbb\x6a\xce\x1e\x70\xb9\x9d\x9a\x96\x96\x96\ -\xa6\xce\xce\x4e\x6d\x56\x56\x96\xaf\xa4\xa4\xe4\x15\x45\x52\xf2\ -\x8c\xc3\x47\xab\xe1\xea\x57\x2d\x2d\x2d\x87\x12\x65\x32\xec\xd8\ -\xb9\x33\xf3\xc9\xf1\x65\x2b\x10\xf4\x93\x4e\xc6\xa1\x1d\xf1\xfb\ -\x04\x4f\x8e\xb9\x3d\x0c\x5d\xf5\x79\x65\x24\x45\xad\x8a\x6c\xd9\ -\xfa\x7a\xe4\xf2\xd5\x3f\x8f\x2c\xa5\xc6\xbc\xff\x05\x93\x87\x86\ -\x59\xdf\x8a\x24\x49\x9f\x3c\x31\x11\x0a\x85\x02\x34\x4d\x43\x24\ -\x8a\x1f\xf8\xd7\x01\xe6\x53\x82\x48\x1c\x34\xfd\x35\x54\x4c\x2b\ -\x95\x15\xf1\xf1\xf1\xc6\x94\x94\x94\xda\xa5\xe6\xfa\x7f\xeb\x6f\ -\xd5\xc9\x6c\xfc\xef\x3f\xe9\x87\x00\x00\x00\x00\x49\x45\x4e\x44\ -\xae\x42\x60\x82\ -\x00\x00\x06\x1f\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ -\x00\x00\x05\xe6\x49\x44\x41\x54\x58\x85\xed\x57\x5d\x4c\xd3\x57\ -\x14\xff\x95\xb0\x62\xe9\xbf\x2d\xfd\x6e\x6d\xab\x45\x51\xa1\xd0\ -\x39\x98\x9a\x15\xa2\x85\x9a\xa8\xd3\x61\xfc\xdc\xe6\xcb\x7c\x50\ -\xdc\xa6\x7b\x98\xcb\x16\x97\x3d\xb8\x65\xd9\x16\xb7\x07\x74\x9b\ -\x26\x04\x7c\x90\x68\x98\x66\xd3\x30\x34\x9b\xa8\x48\x74\xa2\x41\ -\x13\x04\x05\xb1\xb4\x08\x54\xdb\xfe\xfb\x49\x3f\x59\x0b\xa5\x77\ -\x0f\x0a\x52\x04\x8b\x38\xb2\x97\xfd\x1e\xcf\xb9\xe7\xde\xdf\xfd\ -\x9d\x73\x6e\xce\x05\xfe\x63\x30\xa6\x1b\xd8\xef\xf7\x0a\xac\x56\ -\x6b\x69\x30\x18\xcc\xe1\x72\xb9\x9d\x0a\x85\xe2\x74\x06\x97\x1f\ -\x7a\xd1\x7d\x52\xa7\x73\xb8\x3f\xe8\xa3\xae\x5c\xb9\x52\x57\xf7\ -\x7b\x5d\xd1\xa3\x47\x8f\xa0\x56\xab\xb1\x76\xdd\xda\x32\xaf\xcf\ -\xb3\x5e\x90\x21\xf4\xce\x38\x81\xde\xde\xde\xed\x27\x8e\x9f\x28\ -\x6a\x68\x68\x80\xc7\xe3\x85\x50\x28\x40\x2c\x16\x2b\x92\x48\x24\ -\x1f\x03\xd8\xff\xaf\x11\x08\x86\x03\xcc\x78\x3c\xce\xe4\x71\x32\ -\x12\xa4\xa5\x69\x7a\x75\x77\x77\x37\x3c\x9e\xc7\x97\xf5\x78\xbc\ -\x30\x99\x4c\x70\xb9\x5c\x86\x11\x02\x81\x90\x9f\x49\xd3\xf4\x6a\ -\xaf\xd7\xbb\x94\xa2\xa8\x6e\x85\x42\x71\x96\xcf\x13\x3c\xa3\xce\ -\xa4\x04\xee\x76\xdc\x29\xab\xad\xad\x2d\xff\x7b\x60\x80\xba\xd1\ -\x7c\xfd\x7b\x8d\x46\xf3\xcd\x08\x11\x36\x9b\x6d\x96\x48\x24\x60\ -\x53\xe9\x08\x87\x06\xc0\xa6\xd2\xc1\x66\xb3\xc1\xe5\x72\xee\x01\ -\x80\xd3\xed\x98\x73\xf5\xea\xd5\x63\xe7\xce\x9e\x2b\xb1\x58\x2c\ -\x98\x3d\x7b\x36\x4a\x0c\x25\x5e\x1b\x6d\x5d\x3e\x5b\xa6\xb8\x97\ -\x54\x16\x53\x77\x57\xe9\x67\xfb\x3e\x25\x79\xda\x5c\x32\x3f\x6b\ -\x1e\xd9\x59\xb6\x83\x5c\xbd\x76\xe5\xf0\x88\xdf\xee\xb0\x69\x0e\ -\xfd\x74\x90\xe8\x8b\x57\x90\x45\xd9\x0b\x49\x89\xa1\x98\x54\x56\ -\x55\x10\x1b\x6d\xd5\x04\xc3\x01\xe6\xa5\xcb\x17\x6b\xb6\x6c\xdd\ -\x4c\x44\x62\x21\x01\x03\x44\x28\x12\x90\x12\x43\x31\x39\x53\x7b\ -\xba\xd5\x1f\xf4\x51\x49\x09\x34\x34\x5e\xaa\x29\x2c\xd2\x11\x30\ -\x40\xc0\x00\xc9\xd3\xe6\x92\xca\xaa\x0a\xe2\x0b\xf4\x8f\x06\xdb\ -\x68\xab\xe6\xcf\xfa\x3f\xce\x57\x56\x55\x90\x8b\x0d\x17\x7e\xb3\ -\x3b\x6c\x1a\x00\xf0\xfa\x3c\x82\x1f\x7f\x3e\x44\xe6\x67\xcd\x1b\ -\x8d\x07\x03\x44\xa9\x52\x90\xaf\xbe\xfe\x92\xd8\x68\xab\x26\x69\ -\x0a\xd2\xd3\xd3\x2d\x5c\x2e\x17\xe9\xec\x59\x18\x08\x47\x90\x96\ -\x96\x06\x8a\xc3\xa1\x19\x8c\xa7\x5d\xfb\x44\xca\x35\xe3\x63\x63\ -\xb1\x18\x35\x34\x34\x84\xe1\xe1\xe1\xc7\x06\x06\x00\x02\xc4\x62\ -\x31\x44\x22\x11\x44\xa3\x51\x29\x80\xd1\x34\x4c\x48\x20\x33\x33\ -\xf3\xe8\xa6\x4d\x1b\xf7\xb1\xd9\x6c\x84\xc3\x61\x2c\x5f\xb1\x1c\ -\x4b\x96\x2c\xd9\x35\xbe\x18\x27\x02\x8b\xc5\xa2\x17\x2e\x5c\xd8\ -\x94\x99\x99\x59\xe4\x72\xbb\x10\x1d\x8c\x20\x8d\x39\x0b\x6a\xb5\ -\x1a\x39\x39\x39\x83\x3c\x1e\xaf\x2d\xa9\x02\x32\x89\xdc\x6c\xa3\ -\xad\xb9\x79\x5a\xed\x7b\x91\x68\x44\xa6\x9e\xab\xae\x9e\xa7\x9e\ -\xdf\x98\xec\x70\x00\xe0\xb0\xb9\x83\x36\xda\xba\x6b\xdb\xb6\x77\ -\x3b\x58\x2c\x16\x1c\x0e\x07\xc4\x62\x31\x8a\x4b\x8a\xa1\xd3\xe9\ -\xb6\x8c\x7f\x27\xa6\xfd\x12\x26\x83\x8d\xb6\x6a\x1e\x3c\x78\xb0\ -\xd3\xe9\x74\x1a\x52\x53\x53\x17\xab\x54\x2a\xf0\x78\x3c\x43\x46\ -\x46\x46\xdb\x58\x12\x33\x46\x60\x2c\x91\x96\x96\x96\x8e\xf6\xf6\ -\x76\x84\xc3\x61\xa8\x94\x4a\x2c\x5d\xb6\xec\x93\xac\xac\xac\x23\ -\x1c\x36\x77\x70\x46\x0f\x0f\x86\x03\xcc\x53\xbf\x9e\xec\xdb\xbc\ -\x65\x13\x99\xab\x9e\x43\xa4\x32\x09\xc9\xce\x59\x44\x3e\xf8\xf0\ -\x7d\x72\xbb\xad\x65\x6f\xc2\x62\x7f\xd0\x47\xdd\x68\xbe\x7e\xa0\ -\xb2\xaa\x82\x9c\xa9\x3d\xdd\x3a\xbe\x5d\xa6\x03\x53\x77\x57\xe9\ -\xdb\xef\x6c\x25\x6c\x4e\x7a\x42\x4b\xce\x55\xcf\x21\xdf\x1d\xf8\ -\x96\xd0\x4e\x7b\xd6\x68\x11\x5a\x2c\x96\x6d\xd5\xc7\xaa\xf7\x35\ -\x36\x36\x82\xcf\xe7\x2f\xde\xbd\x67\x77\xb3\x3f\xe8\x93\x4f\xa5\ -\xf2\x27\x83\xdd\x6e\x5f\xdd\xd9\xd9\x89\x70\x68\x20\xc1\xee\xf6\ -\xb8\xd1\x7a\xbb\x15\x81\x40\xc0\x94\x32\x62\xf4\xf9\x7c\x8b\x8d\ -\x46\x23\x8c\xc6\x2e\xf4\xf6\xf6\xa2\xaf\xaf\x8f\x8a\x44\x22\xb2\ -\xe9\x1e\x0e\x00\xa9\xa9\xa9\x21\x26\x93\x39\x61\xa5\x71\xb9\x5c\ -\x10\x12\xc7\x28\x01\xa1\x50\xd8\xa4\x2b\xd4\xa1\xb0\x50\x87\x82\ -\x82\x02\x68\xb5\x79\xb7\x58\x2c\x96\xe5\x65\x08\xc8\xe5\xf2\xfa\ -\xfc\xfc\x7c\x88\x45\xa2\x04\xbb\x52\xa1\xc4\xa2\xec\x45\x10\x8b\ -\x25\xc2\xd1\x14\x68\xb2\x73\x7f\xe9\x32\x1b\x43\x7a\xbd\xbe\x8c\ -\xa2\x28\xf3\x82\x05\x0b\x0e\x71\x29\xde\x4b\x55\xa9\x48\x24\x6a\ -\xda\xb0\x71\x03\xa2\x83\x51\xb4\xb5\xb6\x61\x60\x60\x00\x22\x91\ -\x08\x86\x95\x06\xac\x5a\xb5\xea\x23\x41\x86\xd0\x3b\x63\x6d\xe8\ -\x74\x3b\xe6\xb8\x5c\xae\x12\x8f\xc7\x73\xcc\x6e\xb7\xc3\xe9\x74\ -\x22\x1e\x8f\x43\x2a\x95\x5a\xb4\x5a\xed\xfe\xdc\x9c\xbc\x6a\x60\ -\x06\xde\x81\x60\x38\xc0\x34\x9b\xcd\x7b\x2e\x5f\xbe\x5c\xde\x79\ -\xaf\x13\xfd\xfd\xfd\x10\x8b\xc5\x28\x28\xc8\xc7\x1b\x3a\x1d\x54\ -\x2a\x95\x70\xec\x5c\x30\xad\x89\xe8\x79\xe8\xeb\xeb\xdb\x56\x53\ -\x53\x53\x7e\xb6\xee\x2c\xee\xdf\x37\x02\x00\x84\x42\x01\x8c\x46\ -\x23\x98\x69\x69\x90\x48\x24\x02\x00\x53\x1b\xdb\xba\xcc\xc6\xd2\ -\x6b\xd7\xff\x2a\xef\xb5\xf4\x14\x4d\x65\x7d\x20\xe4\x67\x56\x56\ -\x55\x90\x82\xd7\xf3\xc9\x2b\xb3\x52\x13\x7a\x5f\x28\x12\x90\x9d\ -\x65\x3b\x9e\x79\x80\x26\x55\xa0\xcb\x6c\x2c\x3d\x7a\xf4\x68\xdd\ -\xcd\xe6\x9b\x58\xf7\xd6\xba\xbd\x36\xda\x9a\x9b\x6c\x9a\x89\x44\ -\x22\x32\xab\xcd\x86\x87\x0f\x1f\x62\x28\x1a\x4b\xf0\x79\x3c\x5e\ -\xb4\xb7\xb7\xa3\xa7\xa7\x67\x3b\x80\x83\x23\xf6\x94\xf1\x9b\x8c\ -\x20\x1c\x0e\x67\xf5\x3c\xe8\x81\xc9\x64\x42\xb7\xb9\x1b\xa1\x50\ -\x68\x7e\x32\x05\x08\x21\xcc\x78\x3c\xfe\xd4\x30\xae\xc2\x52\x52\ -\x52\x90\x92\xc2\x48\xe8\xac\x49\x15\x90\x4a\xa5\xf5\xa5\xeb\x4b\ -\x43\x4a\x95\x92\x32\x18\x0c\x4d\x62\xb1\xb8\x69\xa2\x75\xfd\x7e\ -\xaf\x60\xa4\xa8\x58\x2c\x96\x45\xa5\x54\x42\x2e\x97\xc3\xe5\x72\ -\x3f\x25\x41\x00\x91\x48\x08\xa5\x52\x09\x99\x4c\x7e\x3e\xd9\x45\ -\x46\xe1\x0b\xf4\x53\x23\x73\xde\x44\xfe\xa6\x1b\xd7\xca\x2b\xab\ -\x2a\x12\xf2\xda\x7e\xef\xee\xf6\xcf\xbf\xd8\x47\xf2\xb4\xb9\x84\ -\xc7\xe7\x10\x36\x27\x9d\x48\x65\x12\xb2\xe6\xcd\xd5\xa4\xfa\xf8\ -\xb1\xa8\xc3\x45\x67\x4d\x49\x01\x00\x78\xf2\xd3\x99\x30\xef\xfe\ -\xa0\x8f\x3a\x75\xf2\xe4\xde\xfa\xfa\x0b\xe0\x0b\x04\xbb\xf1\x24\ -\xaf\x79\x1a\x6d\x75\xeb\x9d\xdb\x94\x54\x2a\x3d\xdc\xd1\xde\x81\ -\x40\x20\x00\x81\x40\x00\x7d\xb1\x9e\xd6\xeb\xf5\x2b\xa5\x62\x99\ -\x79\xca\x04\x9e\x07\x1e\x27\x23\xd4\x74\xe3\xda\x41\x00\x7b\xb3\ -\xb3\xb3\x7f\x18\xeb\x7b\xed\xd5\xfc\x23\x76\x87\xad\xd1\xed\x76\ -\x17\x0d\x0f\x0f\x33\x39\x1c\x8e\x99\xcf\xe7\xdf\x7a\xd1\x5f\xd3\ -\x94\x30\xa5\x31\xfb\x7f\x3c\x07\xff\x00\xcc\x9c\x97\xa4\x0a\x60\ -\xdb\x5a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x06\x3d\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ -\x00\x00\x06\x04\x49\x44\x41\x54\x58\x85\xd5\x96\x5b\x50\x1b\x55\ -\x18\xc7\xff\xc4\x98\x4d\xb2\xb9\x90\x84\x10\x92\x96\x00\xcd\x72\ -\x49\x20\xd3\x56\x2c\x17\xc1\x14\xaa\x95\xb1\x45\xc5\xc1\xd6\xe9\ -\x74\xa6\xf6\xc1\x8e\x97\x3e\x38\xfa\xa0\x33\x4a\x9f\x74\xd4\xf1\ -\x3e\xb5\x54\xc5\x07\x0b\x75\xda\x07\xed\x38\x40\x6f\xe0\x4c\xab\ -\xd8\xa2\x40\x68\x83\x2d\x04\x0a\x21\x04\x09\x49\xba\x90\x6c\xc8\ -\xc2\x90\x48\xbb\x3e\xb4\xa4\x50\x28\x25\xd4\x3a\xe3\x6f\x66\x1f\ -\xf6\x3b\xdf\xf9\x9f\xff\x9e\xfd\xf6\x3b\x0b\xfc\xdf\x09\x86\x18\ -\xc9\xbd\xcc\x8f\x5b\xe9\x44\x3f\x33\xae\xec\xe9\xe9\xa9\x72\x38\ -\x1c\x7b\xe5\x72\x59\x57\x4e\x8e\x79\x1f\xb5\x26\xbd\xe9\x5e\xcc\ -\xc4\xc4\x2f\x2d\x67\x6a\xb6\x3f\xbf\x8d\xcb\x31\x67\x73\x1b\x4b\ -\x2c\xdc\xa7\x9f\x7f\xc2\x39\x5d\x83\xa5\xff\xc9\xe2\xc1\x10\x23\ -\xf9\xb2\x7a\x3f\x97\x92\xaa\xe7\x10\x07\x8e\x94\x8a\xb9\xe7\xb6\ -\x55\x72\xbf\xb7\xb5\x7e\x18\xab\x16\x7f\xa5\x26\x08\x81\x00\x7c\ -\xfe\xad\xe9\x3c\x1e\x0f\x42\xa1\xd0\x37\x37\xc7\xe1\x1c\x28\xf3\ -\x78\x3c\x65\x3c\x1e\x2f\x92\x9a\x9a\x5a\xa7\x4b\x5a\xd5\xb3\x6c\ -\x03\x57\xc7\x7c\x7a\xbb\xbd\xa7\x8a\xa6\xc7\x8a\x8c\x46\xe3\x47\ -\xd9\xc6\x9c\xda\xd9\x31\xb9\x34\x9e\xfd\xa3\xfd\xf7\x77\xb7\x6c\ -\xdd\xb2\xaf\xa3\xbd\x03\x4a\xa5\x12\x8f\x3f\xfe\x18\x34\x1a\x4d\ -\xb4\x06\x2e\x76\x5d\x78\x7d\xff\xfe\xfd\x9f\x75\xd9\xba\x20\x14\ -\x0a\x51\xf8\x48\xe1\x5b\xdd\xf6\xcb\xbb\xe7\xea\x2c\xc9\x89\x53\ -\xc7\xcf\x6c\xdb\xfe\x1c\x57\x50\x98\xcf\xbd\xb3\xef\x6d\xae\xa7\ -\xb7\x7b\xc7\xdc\xf1\x09\x36\x28\xf8\xf3\x72\xd7\x9e\xfa\xc6\x9f\ -\xda\x7f\x3b\xdf\x72\xc0\xe3\x1b\x35\xcd\x8e\x79\xaf\x7a\xa8\x8f\ -\x3f\xfd\x88\x33\x50\x6b\x38\xc4\x81\x43\x1c\xb8\xdc\x87\x1f\xe2\ -\x0e\xd5\x7d\x17\xf6\x33\xe3\xca\xbb\xee\x40\x20\xe8\x57\x1e\x3c\ -\x78\xb0\xb4\xb5\xb5\x15\x6e\xf7\x28\x44\x22\x11\x2c\x16\xcb\x0e\ -\x00\x47\x67\x73\x64\x12\x79\x04\xc0\xb7\x37\xaf\x79\xb0\x2c\x6b\ -\x70\x0c\x38\xe0\xf5\x79\xa3\x31\x9f\xcf\x07\xa7\xd3\x29\x98\x9e\ -\x9e\x4e\x02\xe0\x5f\xd2\x00\x9f\xcf\x67\x29\x8a\x1a\x36\x9b\xcd\ -\x7a\x85\x42\x81\xcc\xcc\x4c\x24\x26\x26\x9e\xbd\xcb\xa6\x45\x11\ -\x8b\xc5\x7f\x25\xeb\x93\xa1\x52\xaa\x30\xc9\x4e\x41\x28\x26\xa0\ -\x54\x2a\xb1\x4a\xa7\x5b\xb8\xd6\x62\x02\x52\x52\x16\x19\xf5\xba\ -\x9f\xe4\xf3\xf9\x3f\x8c\x8f\x8d\x99\x32\x32\x33\xbe\x4d\x4b\x4b\ -\x5b\xf0\xa4\x77\x42\x2a\x95\x0e\x58\x2c\x96\xea\x61\xd7\xf0\x5e\ -\xab\xd5\x0a\x82\x20\x50\x54\x5c\x84\x0d\x79\x79\x6f\xdc\x5e\x88\ -\x4b\x36\xa2\x09\x36\x28\x98\x99\x99\x91\x28\xe3\x55\xfe\xa5\xf2\ -\x16\x83\x99\x08\x48\x9c\x4e\xe7\x1e\x87\xc3\xf1\x22\x41\x10\x81\ -\xd4\xd4\xd4\xda\xe4\xe4\xe4\xa3\xf1\x32\x05\x1b\xab\xd6\xbf\x46\ -\x30\xc4\x48\x6e\x6f\xdd\x2b\x6e\xc5\xb1\x10\x9a\x9c\x10\xb8\x5c\ -\xae\x1d\xbd\xbd\xbd\x6f\x46\x22\x11\xa5\x5e\xaf\x3f\x9a\x91\x91\ -\xf1\x45\x62\x82\x66\x78\x81\x81\x40\xd0\xaf\x9c\x9e\x9e\x4e\x92\ -\x48\x24\x03\x52\x52\x16\xf9\x37\x0c\xb4\x9c\xfb\xf5\xc0\xe1\xba\ -\xc3\x7b\xdb\xda\xda\x70\xfd\xfa\x75\xe8\xf5\x7a\x54\x54\x3c\x83\ -\x8a\x67\x9f\x4d\x99\x57\x84\xa3\x5e\xb7\xa9\xbe\xbe\xfe\xa2\xcb\ -\xe5\x12\x14\x16\x16\x1e\x63\x26\x02\xbb\xef\xf5\x9d\x39\x5d\x83\ -\xa5\x35\x35\x35\x7b\x4f\x9e\x3c\x09\xb7\x7b\xf4\x46\x6c\xc8\x09\ -\x91\x48\x04\xa3\xc9\xe4\x8a\x1a\x08\x4d\x4e\x08\xda\xda\xda\xaa\ -\x1a\x1b\x1a\x05\x36\x9b\x0d\x53\x53\x53\x95\x14\x45\x55\x03\x58\ -\xf6\xe7\xb7\x18\x0c\xc3\xac\xbb\xd2\x77\x05\x4c\x90\x89\xc6\x26\ -\xd9\x29\xf4\xf5\xf5\x61\x64\x64\x04\xbc\xd9\xa0\x94\x94\x45\x54\ -\x2a\x55\x87\x5a\xad\x46\x7a\x7a\x3a\x56\xaf\x5e\x0d\x91\x48\xe4\ -\x5b\x54\x35\x06\x04\x02\x81\x5f\xa1\x50\xdc\xb8\xb9\xf9\xc2\xf9\ -\x02\x1e\x24\x12\x09\x48\x92\x9c\xdf\x07\x28\x8a\xaa\x7e\xf9\x95\ -\x97\x23\x0c\x13\x58\xab\xd7\xa7\x1c\xd5\x6a\x74\x0b\x0e\x8f\x58\ -\x49\x48\x48\x38\x5f\xfc\x68\x31\xfa\xfb\xfb\xd1\xdd\xdd\x0d\x8e\ -\xe3\xa0\x56\xab\xb1\xb1\x64\x23\xb2\xb2\xb2\xe6\x1b\xb8\x59\x74\ -\xd5\xf7\xba\xe8\x5c\x84\x42\xa1\x37\x2f\x2f\x0f\x91\x70\x18\x1d\ -\x1d\x56\x70\x1c\x07\x2a\x9d\x42\x49\x49\xc9\x37\x5a\xad\xf6\xb5\ -\xfb\xf6\x19\x0e\x0e\x39\x4a\xfb\xfb\xfb\x5f\xa7\x69\xba\x88\xcf\ -\xe7\x2b\xb5\xda\x24\xc8\x64\x72\x00\x78\x4f\xa3\xd1\x1c\xd3\x25\ -\xad\xb2\x01\xf7\xa9\x0f\x74\xdb\x2f\xbf\xd0\xd0\xd0\x70\xa8\xb9\ -\xa9\x19\x34\x4d\x43\x2a\x95\xa2\xa0\xb0\x00\x15\x15\xcf\x60\xdd\ -\xba\xf5\x72\xb9\x34\x7e\x62\x36\x77\xc5\x3f\x24\x77\xc2\x7b\xd5\ -\x43\x35\xd4\xd7\x1f\xfa\xf1\x87\x1f\xd1\xd9\x79\x21\x1a\xa7\x69\ -\x1a\x62\xb1\x18\x5a\xad\xae\x1c\xc0\x91\x65\x19\x18\xf5\xba\x4d\ -\x56\xab\xb5\x26\x39\x39\xf9\x18\x45\x51\xd5\x73\x1b\xd3\x78\x80\ -\x4e\x1a\x19\x71\x57\x86\x42\x21\x03\x8f\xc7\x8b\x68\xb5\xda\xa6\ -\xb4\x94\x35\x67\x7d\x3e\x5f\x59\x7b\x7b\x07\x86\x86\x86\xe6\x69\ -\x0d\x0c\x38\xd0\x69\xed\xc4\xa6\x4d\x9b\x5e\x5a\xb6\x01\xbb\xdd\ -\x5e\xf5\xf5\x57\x5f\x17\x15\x3f\x5a\x5c\xb4\x6b\xd7\xae\x33\x00\ -\xba\x00\x60\x60\xb0\xbf\xec\xf0\xe1\xef\x4f\x37\x37\x35\x63\x64\ -\x64\x04\x24\x49\x62\xed\xda\xb5\x6f\x9d\x38\x75\xfc\xac\xcf\xe7\ -\xf3\x07\x02\x01\x4c\x87\xa7\x17\xe8\x85\xc3\x61\x5c\xbb\x76\x8d\ -\x98\x1b\x5b\xd2\x80\x46\xa3\x69\x2a\x29\x2d\xd9\x91\x91\x91\xde\ -\x21\x16\x8b\xff\x9a\xdd\x95\xe3\x8d\x8d\xa7\xeb\x6a\xeb\x70\xe1\ -\xc2\xc5\x68\xee\xf0\xf0\x30\xfc\x7e\x7f\xe9\x53\x4f\x3f\x05\x7d\ -\x8a\x1e\x8a\x78\x05\x26\xd9\xa9\xe8\xb8\x4a\xa5\x84\xc1\x60\x80\ -\x5a\xad\xfe\x79\xd9\x06\x72\x4c\xe6\x5a\xef\x55\xcf\x79\xa1\x50\ -\xe8\x9d\x6d\xc9\x0e\x87\xe3\xd5\xa6\xa6\x66\xf4\x5d\xe9\x9b\x97\ -\xeb\x76\x8f\xa2\xb3\xb3\x13\xeb\x1f\x5a\x8f\xfc\xfc\x7c\xd0\x34\ -\x8d\x73\xbf\x9d\x03\xcb\xb2\x20\x08\x02\x66\xb3\x19\x96\x8d\x16\ -\xe8\x74\xba\x23\x73\xe7\xdd\xb5\x08\x93\x12\xb5\x03\x73\xef\x19\ -\x86\x59\xe7\xf1\x78\xe6\x3d\x1d\xe2\x00\x70\x00\xc3\x30\xf0\xfb\ -\xfd\x28\x2f\x2f\x87\x5a\xad\x86\xd9\x6c\x86\x73\xd0\x09\x55\x82\ -\x0a\x1b\x36\x3c\x4c\xe7\xe5\xe5\x3f\xa1\x51\x27\xd9\x63\x32\x70\ -\x3b\x04\x41\x78\x65\x32\x19\x1e\x24\xf8\xf8\x3b\x3c\x13\x5d\x1c\ -\xb8\xf1\x6b\x4e\x92\x24\x54\x2a\xd5\xfa\x94\x94\x14\xbb\xd1\x68\ -\x34\x4e\x4e\x4e\x9a\x48\x92\xec\x11\x89\x44\x6e\x85\x5c\x49\xdf\ -\xae\x17\xb3\x01\x9d\x4e\xd7\x98\x99\x95\x59\x69\xb3\xd9\xe0\xf5\ -\xde\x3a\x2a\x08\xe1\x83\x30\x18\x0c\xc8\xca\xca\x02\x49\x92\x83\ -\x32\x89\x3c\x0c\xc0\x76\xf3\xba\x23\x0f\xc4\x6a\xe0\xfd\x0f\xde\ -\x77\x90\x24\x99\x39\x3e\x3e\x6e\x62\x59\x16\x33\x33\x7f\x43\x26\ -\x95\x22\x3b\x3b\x07\x5b\xcb\xb7\x62\xf3\xe6\xcd\x3b\x57\x69\x57\ -\x5b\x97\xab\xb7\xa2\x4e\x18\x0c\x31\x92\x4b\x97\x2e\x85\x5a\x5a\ -\x5a\xe0\x1c\x74\x42\x4c\x8a\x91\x9b\x9b\x8b\x82\x82\x82\x9d\x19\ -\x54\xe6\x91\xbb\x2b\xdc\xe2\x1f\xa2\x0a\x59\xa4\x7e\xcb\xf8\xd5\ -\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x06\x4f\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ -\x00\x00\x06\x16\x49\x44\x41\x54\x58\x85\xe5\x56\x5b\x4c\x1b\x67\ -\x1a\x3d\x86\xda\x1e\x7b\x98\xf1\xc4\x0c\xb6\x63\x0c\x2c\xb1\x0d\ -\x94\xcb\x54\x80\x89\x92\x3a\x49\xa1\x4e\xb4\xa1\x0f\x5d\x29\x17\ -\xa9\x97\x54\xaa\x36\xda\xae\xda\x97\xec\x43\xd5\xa7\xf6\xa5\x7d\ -\xea\x45\x15\xdd\x55\xd2\xaa\x95\xa2\x44\x4d\x5a\x15\x54\x09\x50\ -\xb2\xdb\x15\x85\xa4\x17\xb2\x84\x0d\xb4\xb6\x81\x32\x60\xf0\x96\ -\xb5\xcd\x18\xcf\xf8\x36\x36\x0d\x0d\x61\xfa\x90\x42\xc1\x14\x92\ -\x90\xec\x6a\xa5\x3d\xd2\xff\xf4\x7f\xe7\xff\x8e\xbe\xcb\x99\x01\ -\xfe\xdf\xa1\xba\x17\x72\x44\x08\x73\xd9\x6c\xb6\x92\xa6\x69\x9f\ -\xb9\xc8\xc2\x6f\xe5\x8d\x07\xb6\x9a\xdc\xeb\xff\xf6\xa5\x33\x67\ -\xce\xbc\x3e\xf3\xfd\x0c\x1a\x1a\xea\x11\x11\xc2\x0f\x59\x2d\xc5\ -\xbe\xad\xbe\x77\x57\x90\xb3\x69\xed\xfb\x1f\xbc\xa7\x34\xba\x1a\ -\x14\xb3\xc5\xa4\x1c\x3e\x72\x48\xf9\xaa\xff\xcb\x0f\xb7\xf2\xd6\ -\x96\x2b\x00\x00\xd9\x6c\x16\x99\x6c\x06\xf1\x78\x1c\x37\x16\x6f\ -\xd0\xb9\xf7\x89\x54\x9c\x95\x24\xe9\x61\x95\x4a\x85\xc2\xc2\xc2\ -\x4b\x0c\xbd\x4d\xbe\x2b\x01\x89\x54\x9c\xcd\x64\xe4\x4a\x9a\x36\ -\xf8\x0c\x14\xb3\x42\xa6\x48\x7a\xe1\x1b\xef\xf0\x2b\x87\x0e\x1f\ -\x7a\x2d\x30\x19\xc0\x9e\xbd\x7b\x50\x55\x59\xf5\xca\x6a\xee\x6c\ -\x34\xc2\x75\xb4\xb7\x7b\xaf\x5d\x1b\x42\x5e\x5e\x1e\x3c\xfb\x3d\ -\x72\x34\x26\x34\xe5\xce\xca\x86\x02\xe6\xc4\x68\x79\x6f\x6f\xef\ -\xa0\xdf\xef\x67\x5d\x2e\x17\x1f\x4f\x4a\x7b\x8c\x4c\xa1\xb8\x7c\ -\x6f\xb7\xdb\xdf\x3c\x7e\xfc\xb8\x2f\x93\xc9\x54\x15\x15\x15\x7d\ -\x96\xdb\x7f\x9e\x1f\x7f\xb9\xb3\xb3\x0b\x57\xaf\x5e\x85\x5a\xad\ -\x46\x3c\x1e\xa7\x6c\x36\xdb\x09\x00\x2f\xdc\x91\x80\x70\x38\xfc\ -\x74\xfb\x27\xed\xec\xe0\xe0\x20\xa2\x42\xb4\xb2\xbc\xbc\xfc\x28\ -\x80\x77\x97\xef\xe9\x02\xc3\x02\x80\xee\x9f\xcf\x1a\xa4\xe4\x24\ -\x75\xe1\xc2\x85\xa3\x13\x13\x13\x90\xa4\x38\x00\x20\x14\x0a\x21\ -\x16\x8b\x3d\x9a\xce\xa4\xb4\x3f\x73\x01\x00\x79\x1b\x09\x60\x18\ -\xe6\x5a\x6d\x5d\x2d\xaa\xaa\xaa\x60\x77\xd8\x41\x92\x64\x70\xa3\ -\xd8\x5c\x18\x28\x46\xb6\xd9\x8a\x3b\x2a\x2a\x2a\x60\xb1\x98\x51\ -\x5a\x5a\x82\xea\xea\x6a\x98\x4c\xa6\xcf\x56\x27\x07\x6e\xe3\x03\ -\xfe\x51\xdf\x89\x50\x28\x74\xac\xb4\xb4\xf4\x74\xcd\x83\xb5\xef\ -\x6e\x16\x9b\x8b\x39\x31\x5a\x7e\xf9\xf2\x65\xef\xc0\xc0\x00\xa5\ -\xd1\x68\xe0\x76\xbb\x79\xb7\xdb\xbd\xa6\x8d\xb7\x15\x70\xaf\x48\ -\xa6\x13\x94\x28\x8a\x2d\x79\x79\x79\x3f\x16\x16\x16\xf6\xaf\x1e\ -\xe4\xff\x19\xfc\x47\x2b\xb0\x1a\xc9\x74\x82\x4a\x24\x12\xee\xa5\ -\xa5\x25\x0d\x45\x51\x7e\x13\x6b\x0e\x02\xf7\x68\x44\x77\x8a\x88\ -\x10\xe6\x3a\x3b\x3b\xbd\xfd\x5f\xf7\x43\x51\x14\xd4\x71\x75\x18\ -\x1b\x1f\x3d\x5e\x5d\x55\x73\x7a\x4d\x60\x4a\x4e\x52\xfe\x51\xdf\ -\x89\xaf\xfa\xbf\xfc\x30\x22\x84\xb9\xfb\x91\x3c\x25\x27\xa9\x8e\ -\x4f\xdb\xd3\x8f\x34\xef\x53\x0a\x59\xa3\x02\x15\x94\x86\xc6\x7a\ -\xe5\x2f\x27\xff\xac\xcc\x89\xd1\xf2\x35\x6b\x28\x49\x92\xfb\xe2\ -\xc5\x8b\x6d\x67\xcf\x9c\x3d\x36\x3a\x3a\xda\x76\x3f\x04\xcc\xcf\ -\xcf\x97\x4f\x4e\x4e\x52\x3c\xcf\xaf\x78\x02\x3f\xc1\xc3\xfb\xad\ -\x17\x89\x44\x7c\x7a\x4d\x0b\xf4\x7a\x7d\xb0\xac\xac\x0c\x2a\x95\ -\x0a\x2c\xcb\xf6\xdd\x0f\x01\xf9\xf9\xf9\xb2\x5e\xaf\x47\x41\x41\ -\x01\x80\x28\x00\x80\x2a\xa0\x40\x16\x90\xa0\x28\x7a\xed\x0c\x58\ -\x4c\xdb\xf9\x78\x52\x2a\xba\x7e\xfd\xba\x95\xa2\xa8\x2d\x7d\xdf\ -\x73\x61\x62\xcd\xc1\xfe\x7f\x7c\x7d\xba\xb9\xb9\xf9\xf7\x04\x41\ -\x60\x71\x71\x11\x35\x35\x35\xd8\xbd\x7b\x37\x74\x3a\x9d\xf9\xbf\ -\xb2\x05\xc9\x74\x82\xf2\xf9\x7c\xa7\x86\x87\x87\x8f\xdd\xbc\x79\ -\x13\x4e\xa7\x33\xe5\x72\xb9\x3c\x56\x4b\xf1\xd0\x86\x02\x02\xd3\ -\x93\x8f\x4f\x4d\x4d\xbd\x24\x8a\xa2\x9b\x20\x08\x71\xc7\x8e\x1d\ -\xef\xd8\x4a\x6c\xe7\x8b\x8c\xa6\x3b\xb6\xe4\x5c\x44\x63\x42\xed\ -\xd2\xd2\x92\x56\xa7\xd3\x05\x18\x7a\x5b\x0a\xd8\xc0\x07\x7c\x23\ -\xde\x13\x9d\x9d\x9d\x6d\x97\xfa\x2e\x41\x92\x24\xa8\xd5\x6a\xd4\ -\xd7\xd7\xa3\xf5\xb1\x56\x71\xef\xde\xbd\x3b\x97\x77\xf8\x36\xc9\ -\x2a\x83\xc1\xe0\xf3\xa2\x28\xb6\xd0\x34\xed\x73\x38\x1c\xcf\x59\ -\x2d\xc5\x3f\xe4\xc6\xad\xf3\x81\x88\x10\xe6\xce\x9d\x3b\xd7\xd6\ -\xd1\xde\x81\xe9\xe0\x34\xb2\x99\x79\x00\xb7\xbe\x66\xe9\x74\x9a\ -\xdd\x66\xdc\xd6\x06\xe0\x77\x9b\x25\x9f\x8d\x46\xb8\x9e\x9e\x1e\ -\x6f\x77\x57\x37\x42\xa1\x10\x18\x86\xe1\x3c\xfb\x3d\xc7\x26\x02\ -\xfc\xb3\x15\x8e\xca\xb3\x9b\x2a\xef\xfb\xa2\xb7\xeb\xf0\x91\x43\ -\x0a\x54\x58\x77\x1c\x4e\xbb\xf2\xd6\xdb\x6f\x2a\xcb\x1e\x21\x25\ -\x62\xd6\xef\x43\xff\x6a\x89\x08\x61\x2e\x9d\x49\x69\x81\x5b\xbf\ -\x6b\x7f\xfb\xfb\x5f\xff\x79\xb0\xf5\xb7\x2b\x7b\x4f\x52\x7a\xa5\ -\xd1\xd5\xa0\xbc\xff\xc1\x7b\x8a\x30\x37\x5b\xbb\x61\x05\xe4\x6c\ -\x5a\xdb\xd7\xd7\x5b\x37\x3b\x3b\x0b\x2d\xa1\xc6\xc2\xf5\x1b\xb7\ -\x2e\x54\x00\x14\x40\x96\x65\x44\xa3\x51\x48\x92\xd4\xd2\xf7\x45\ -\xef\x6b\x27\x4f\x9e\x7a\x7c\xc4\x3f\x02\xa3\xd1\x88\x86\x86\x7a\ -\x8c\x7e\x37\xf2\x82\x2c\xcb\xfd\x81\x40\xc0\x15\x08\x04\x56\xf6\ -\x3e\x9b\x99\xc7\xcc\xcc\x0c\x46\xc7\xc6\xd0\xdc\xd2\xd2\x08\x60\ -\xe4\x57\x05\x50\x24\xbd\xf0\x79\x5f\x0f\xcf\x30\x4c\xf9\x4a\xf2\ -\x65\xa8\x00\xb5\x5a\x0d\x82\x20\x30\x35\x15\x68\xfb\xe8\xfc\xc7\ -\x18\x18\x18\x80\x14\x97\x00\x00\x57\xae\x5c\x41\x74\x6e\xee\x94\ -\xc7\xe3\x81\x56\xa3\x01\x41\x10\x6b\xc4\x6b\x34\x1a\x68\xb5\x5a\ -\xa8\x54\x6b\xc7\x6e\xdd\x0c\x58\xad\xd6\x0e\xee\x21\xee\xe0\xc8\ -\xc8\x08\x22\x42\x18\x8b\x37\x96\x00\x05\x20\x0b\xf4\x70\x3a\x9d\ -\x28\xb1\xd9\x30\x36\xf6\x1d\x86\x86\x86\x30\x33\xf3\xef\x15\x9e\ -\xcf\xe7\x87\xd1\x68\x44\x45\x45\x05\x4a\x4a\x4b\x51\x5d\x5d\x0d\ -\x51\x14\x21\x67\x64\x10\x5a\x02\x0e\x87\x03\x1c\xc7\xc1\x60\x30\ -\xf4\x6f\x2a\xa0\xa4\xa4\xe4\xfc\x81\x03\x07\x8e\x8a\x31\xf1\xe0\ -\xe0\xe0\x20\x24\x49\x82\x4e\xa7\x83\xd3\xe9\x44\xeb\x63\xad\xb0\ -\x3b\x1c\x18\xe7\x79\xa4\x52\xa9\x5c\x2a\x04\x41\x40\x2a\x99\x44\ -\x53\x53\x13\x9e\x7a\xfa\x49\x30\x0c\x03\x49\x92\x90\x9f\x9f\x8f\ -\xfd\xfb\x3d\xd8\xb5\x6b\xd7\x13\x26\xd6\x1c\xd8\x54\x00\x45\xd2\ -\x0b\xf1\xa4\xf4\x8c\x5e\xaf\x7f\x75\xe7\xce\xa6\xe7\x67\x05\x01\ -\x24\x49\xc2\xe1\xb0\x07\x6b\x6b\xeb\xfe\xa4\x52\xa9\x60\x30\x18\ -\xba\x56\x4a\xbc\x0a\x24\x49\xc2\xc0\x30\x60\x59\x96\xd8\xb7\xef\ -\x11\x43\x59\xd9\x6f\x5e\x4c\xa7\x53\x8d\x34\x6d\x18\x32\x9b\xcd\ -\x9f\x58\x2d\xc5\x43\xeb\x48\x9b\x21\x91\x8a\xb3\x11\x21\xcc\x45\ -\x63\x42\xe5\xf2\x94\xa7\xe4\x24\xd5\x7d\xa1\x6b\xbc\xe5\xd1\x66\ -\x85\xa4\xf4\x2b\x1b\x62\x2b\x29\x56\x9e\xfb\xe3\x1f\x94\x6f\xbc\ -\xc3\x6f\xdc\x4d\x8e\x2d\x59\xb1\x30\x37\x5b\xd9\xdd\xd5\x35\xde\ -\xd3\xf3\x39\xa6\xa7\xa7\xa1\xd5\x6a\xc1\x71\x1c\x8e\x1c\x3d\x32\ -\xd4\xd4\xd4\xe4\x31\x50\xcc\xfa\xfe\xdc\x4f\x01\x00\x10\x4f\x4a\ -\x2c\xcf\xf3\xb1\x48\x24\x02\xbd\x5e\x0f\xbb\xdd\x8e\xed\xdb\xb7\ -\x13\x14\x49\x2f\xdc\x9e\xfd\x0b\x7e\x02\x0c\x57\x94\xa9\x04\x56\ -\x57\xa4\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x06\x6c\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ -\x00\x00\x06\x33\x49\x44\x41\x54\x58\x85\xed\x57\x5d\x50\x1b\xd7\ -\x15\xfe\x84\xc1\x8b\x57\xd2\x4a\xc2\xe8\x17\x24\x81\xc0\x08\x61\ -\xc9\x11\xc1\xe0\xe0\x74\x5c\x08\xd3\x60\xf2\x83\xeb\x71\xd2\x76\ -\xfc\x10\x33\x99\xb4\x71\x5f\xda\x87\x24\x7e\xc2\x33\xe9\xd8\x4f\ -\x75\xdc\xb4\x6f\xd4\x9e\x26\x8c\x3b\x49\x4a\x33\xf6\x64\x1a\x4f\ -\x22\x07\x27\x9d\x26\x19\x7b\x60\x44\x64\x59\x60\x7e\x24\x11\xc0\ -\x92\x90\x56\xab\xbf\x95\x56\x42\x06\x73\xfb\xe0\x84\x82\xf9\x29\ -\x98\xf6\xa1\x33\xfd\x66\xee\xcc\xee\x9e\x3d\xe7\x7c\xf7\xdc\x73\ -\xcf\x3d\x17\xf8\x3f\xfe\x57\x91\xe4\x13\x8c\xcb\xfd\xcd\x99\x6b\ -\xfd\x0e\xd7\x84\x6f\xfc\xf8\xa3\xda\x29\x7c\x54\xc5\x60\x30\xd8\ -\xd5\xd7\xd7\xd7\xed\x9d\xf0\xa2\xa5\xb5\xe5\xbd\xd9\x48\xe8\x8e\ -\x56\xad\xbb\xb5\x55\x3b\x05\x8f\x4a\x80\xe7\xf9\x7a\xef\x84\x17\ -\x6e\xb7\x1b\x81\x40\x00\xb9\x5c\xae\xfc\xe1\x7f\x52\xe9\x24\xc3\ -\x72\x11\x53\x2a\x9d\x64\xd6\xb3\xf3\xc8\x11\x30\x1a\x8d\x7f\x68\ -\x6f\x7f\xba\xab\xc6\x5c\x83\xe6\xe6\xe6\x80\x42\xa1\x18\x58\x2e\ -\x0f\x85\x83\x76\x87\xc3\xe1\xf2\xf9\x7c\xa8\xaa\xaa\x42\x28\x1c\ -\xac\xd7\x69\xca\xb6\x16\xa1\x09\xdf\xf8\xf1\x6b\xfd\x0e\xd7\xe4\ -\x94\xff\xb9\xb5\xe4\x61\x76\xd6\xe2\xff\xd6\x77\x2c\x9e\x8c\x29\ -\x1f\x96\x7d\xfe\xf7\xeb\xff\x78\xe6\xd9\x0e\x62\xac\x30\x90\x67\ -\x9e\xed\x20\x57\x3f\xf9\xd8\x9f\x16\x78\x6a\xd3\xce\x59\x2e\x62\ -\xba\x70\xb1\x87\xbc\xf0\xe2\x31\xd2\xf7\xe1\x5f\x48\x22\x15\x5f\ -\xe5\x64\x3d\xf0\x99\x14\xf5\xe1\xe5\xbf\x92\x7d\x8f\xd9\x08\x44\ -\x20\x8f\x37\xd4\x93\x3f\xbf\x77\x89\xac\xb5\x14\xeb\xe6\x00\x45\ -\x51\x5c\x45\x65\xe5\xc0\xfe\xc6\xfd\xd0\xeb\xf5\xbd\x85\x85\x85\ -\xfc\x66\x09\x30\x12\x59\x7e\xcf\x9e\x3d\xa7\x0f\x1e\x3c\x88\xc3\ -\x87\xdb\xd1\xd2\xda\x02\xab\xd5\x7a\x56\x26\x95\xaf\xb2\x21\xda\ -\xc8\x50\x22\x15\x57\xe6\x72\xb9\x32\x9a\xa6\x27\xe5\x8c\x62\xd3\ -\x04\x00\x20\x2d\xf0\x94\xcf\xe7\xeb\x66\x59\xf6\x39\x95\x4a\x75\ -\xd5\x64\x32\x9d\x5b\x8b\xc0\xba\xca\x5b\x71\xb6\x1d\x2c\x45\x20\ -\x91\x8a\x2b\x03\x81\x40\x57\x30\x18\x3c\x9e\xcd\x66\x4d\x25\x25\ -\x8a\x2f\xf5\x7a\x43\x6f\x55\x65\xf5\xe5\xff\x3a\x81\x24\x9f\x60\ -\x9c\x4e\xe7\xc7\x0e\x87\xe3\xd0\xb0\x67\x18\xb9\x5c\x0e\xa5\xa5\ -\xa5\x68\x6c\x6a\x44\x67\x67\xe7\xc9\xba\xda\xbd\x7f\xfc\x4f\x38\ -\x4b\xa4\xe2\x4a\x42\x08\x4a\xe4\xbb\xa3\x2b\x04\x37\x07\x6e\xbc\ -\xfb\xf3\x5f\xbc\x42\xca\xf5\x65\x04\x22\x10\x88\x40\xc4\x52\x9a\ -\xd4\x5a\xcc\xe4\xfc\xdb\x6f\x91\x50\x38\x68\xdf\x8e\x63\x3e\x93\ -\xa2\x5c\xee\x6f\xce\x5c\xb8\xd8\x43\xce\xbf\xfd\x16\x71\x7c\xf6\ -\xa9\x6b\x36\x12\x7a\x60\x33\xcc\xce\x5a\x2e\x5c\xec\x21\x56\xdb\ -\xde\x25\xe7\xcb\xc7\xe1\x8e\x76\x72\x73\xe0\xc6\xbb\xdb\x21\x30\ -\x32\x3a\xfc\xab\xd7\x4f\xbd\x46\x6a\x2d\x66\x52\x51\x69\x24\x2f\ -\xfe\xe4\x05\xf2\xe9\xb5\x4f\xee\xa4\x05\x9e\x2a\xcc\xe5\x72\x77\ -\xfc\x93\x93\xe0\x38\xee\x5f\x1a\x22\x00\xe4\xc1\x63\x28\x14\x42\ -\x32\x99\x3c\xb0\x1d\x02\xe1\x70\xf8\xd8\x90\x73\x08\x63\x63\xe3\ -\x00\x00\x8a\xa2\x30\x3e\x3e\x6e\x69\x68\x68\x98\x2b\xa0\x28\x0a\ -\x52\xa9\x14\x14\xb5\x76\xe2\xd3\x34\x8d\xad\xd4\x80\xb5\x50\x52\ -\x52\xf2\xa5\x52\xa9\x84\x52\x59\x0a\xb1\x84\x86\x42\xa1\x80\x42\ -\xa1\xc0\xce\x9d\x3b\x65\x85\x62\xb1\x58\x5e\x5b\x5b\x9b\xb4\x58\ -\x2c\x88\x72\x2c\xb2\xd9\xb9\xa5\xd9\xef\xde\x5d\x02\xbb\xdd\x8e\ -\xb2\xb2\xb2\x6d\x2d\x81\x56\xab\x7d\xbf\xf3\x48\x67\x37\xc3\x30\ -\x48\x24\x12\x68\xd8\xdf\x80\xfa\xfa\xfa\x53\x72\x46\xc1\x17\xca\ -\xa4\xf2\x94\xd7\x3f\xd1\xf5\x54\xdb\x53\xbd\x3c\xcf\x63\x7a\x7a\ -\x1a\x73\x73\x73\x90\xcb\xe5\x30\x9b\xcd\x38\xdc\xd1\x0e\xad\x56\ -\x7b\x65\x3b\x04\x34\x2a\xed\x68\x28\x1c\xac\x37\x99\x4c\xbf\x9e\ -\x9f\xbf\x57\xaa\xd3\x95\x7d\xa0\xd1\x68\x2e\x03\xcb\xea\x80\xd7\ -\x3f\x71\xc2\xe9\x74\xf6\x7a\xbd\x5e\xa4\xd3\x69\x30\x0c\x03\xb5\ -\x4a\x05\x83\xd1\x08\x8d\x46\x73\x5a\xa5\x52\x5d\xdd\xf2\x69\xb6\ -\x09\xac\x28\xc5\xa9\x74\x52\x26\x08\x42\x75\x34\x1a\x75\x8e\x8c\ -\x8c\xc0\xed\x76\xc3\xef\xf3\x43\x2e\x97\xa3\x6e\x6f\x1d\x5a\x5b\ -\x5b\xcf\xd6\x3f\xf6\xf8\xe9\xcd\x1a\x0f\x85\x83\xf6\x4c\x26\x53\ -\x27\x91\x48\xee\xac\x47\x7e\x45\x3f\x20\x93\xca\x53\x69\x81\x1f\ -\x9e\x9c\x9c\xc4\x17\x9f\x7f\x81\xeb\xd7\xaf\x23\xca\x45\x51\x4c\ -\x15\x63\x70\x70\x10\xc9\x64\xb2\x7b\xc2\x37\x3e\x5a\x53\x6d\x7e\ -\x7f\x23\xc7\x69\x81\xa7\x3c\x1e\x4f\xcf\xa5\x4b\x97\xba\xa6\xbe\ -\x9d\x82\xc1\x68\xc0\xcd\x81\x1b\xbd\x56\xab\xf5\xa4\x54\xcc\xe4\ -\x37\x64\x1d\x89\x86\xad\xbf\xfb\xfd\x79\x52\x51\x69\x5c\x55\x13\ -\x7e\xd8\x72\x88\x7c\xf4\xb7\x2b\x2c\x9f\x49\x6d\x78\x56\x78\x46\ -\x6e\xbf\xf1\xfa\xa9\xd7\x48\x45\xa5\x91\x88\xa5\x34\xa9\xa8\x34\ -\x92\x93\xbf\x7c\x95\xb8\x3d\xb7\xba\x37\x8c\x00\x00\xdc\xbf\x7f\ -\x9f\x62\x59\x16\x82\x20\xac\xa8\x07\x00\x10\x89\x44\xc0\x46\x58\ -\xa5\x20\x08\x96\x30\x3b\x9b\xe7\x38\xee\x47\xf3\xf3\xf3\x4a\x9a\ -\xde\xe5\xd7\x68\xb4\x57\xbe\x3f\xed\x42\xa1\xd0\xf1\x21\xe7\x10\ -\xa6\xa6\xa6\x01\x00\x42\x66\x1a\x63\x63\x63\x98\x99\x99\x79\x95\ -\xcf\xa4\xce\x31\x12\xd9\x52\x14\xd6\x6c\xc9\x64\x32\x19\x76\xed\ -\xda\xf5\xe0\xe5\x3b\x12\x85\x3b\x0b\x20\x16\x8b\x41\x8b\xc5\x88\ -\xc5\x62\x2e\x97\xcb\x85\xaf\xbf\xfa\x1a\x1c\xc7\xa1\x7a\x4f\x35\ -\xda\xda\xda\x4e\xc6\x93\xb1\xe7\x8b\x8a\x8a\xf8\x81\x81\x01\xbe\ -\xb8\xb8\x18\x62\x09\x0d\x21\x93\x85\x58\x42\x43\x24\x12\xa1\xa8\ -\xa8\x88\x13\x89\x56\x76\x00\xab\x08\x48\xa5\xd2\x61\xbb\xdd\x7e\ -\xd7\x6a\xb5\xea\x73\xb9\x1c\x92\x7c\x12\xf3\xf9\x05\x94\xeb\xf4\ -\x68\x6c\x6c\x84\x5a\xad\x86\xdb\xed\xc6\x3b\x7f\x7a\x07\xb7\x6f\ -\xdf\x46\x2c\x16\x87\xc1\xa0\x47\x8c\x8b\x1d\xa0\x69\x9a\xb5\xd9\ -\x6c\x30\x18\x0c\x68\x3e\xd8\x0c\x96\x65\x11\x8d\x46\xa1\x54\x2a\ -\xf1\xe4\x0f\x9e\x84\xc1\x60\xe8\x79\x38\x07\x56\x13\x10\x33\xf9\ -\x50\x38\x78\xf4\xa5\x13\x2f\x39\x75\x3a\x1d\x02\x81\x00\x0a\x0a\ -\x0a\x60\xa9\xb3\xa0\xad\xad\x0d\xa5\xa5\xa5\xe8\xef\xef\xc7\xe8\ -\xe8\x28\x62\xb1\x38\x00\x60\x66\xe6\x2e\x06\x07\x07\xd1\xd4\xd4\ -\x88\x9a\x9a\x9a\x2a\xad\x56\x1b\x3c\x72\xe4\xc8\x1b\x1a\xb5\xfa\ -\xcc\xcc\xdd\xbb\x30\xe8\xf5\x68\x6c\x6a\x3a\xab\xd7\xeb\x7b\xff\ -\x6d\x0e\x00\x80\x4e\x53\x36\x34\x1b\x09\xed\x37\x9b\xcd\x3f\x0d\ -\x87\xc3\x3f\xdb\xb1\x63\x47\x4a\xa3\xd1\xf4\xa9\xd5\xea\x8f\xa2\ -\xd1\x68\x47\x3e\x9f\xff\xed\xc2\xc2\xc2\x0a\x9d\xc5\xc5\x45\xe4\ -\xef\xdd\x5b\x9a\x44\x5a\xe0\xcf\xa9\x54\xaa\xab\x82\x20\x54\xd1\ -\x34\xed\xdf\xd4\x36\x5c\x0e\xad\x5a\x37\x04\x60\x08\xc0\xa9\xe5\ -\xdf\x43\xe1\x20\xb5\xb7\xae\x0e\x5a\xad\x16\xa9\x74\x0a\xf3\xf9\ -\x05\x88\x25\x34\xca\xcb\xcb\x61\x34\x1a\x03\x14\x45\x71\xdf\x93\ -\x00\x70\xeb\xbb\xb1\x2e\x76\x6c\x24\x5c\x0b\x6f\xfe\xe6\xcd\x38\ -\x4d\xd3\x58\x5c\x5c\x3c\x44\xee\x13\xc8\x64\x0c\xf6\xd9\xf6\xe1\ -\xe8\xd1\x1f\xe3\xc0\x13\x4f\xbc\xbc\xd5\xdb\xd1\x86\x4d\xe9\x46\ -\x98\xf0\x8d\x9f\xf0\x78\x3c\xbd\xd9\x6c\x16\x2a\x95\x0a\x36\x9b\ -\x6d\xeb\x17\x0f\x00\xff\x04\x49\x5f\xac\xeb\x7f\x07\x08\x64\x00\ -\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -" - -qt_resource_name = b"\ -\x00\x05\ -\x00\x6f\xa6\x53\ -\x00\x69\ -\x00\x63\x00\x6f\x00\x6e\x00\x73\ -\x00\x0f\ -\x00\x0e\x27\xe7\ -\x00\x67\ -\x00\x65\x00\x74\x00\x5f\x00\x77\x00\x78\x00\x5f\x00\x69\x00\x6e\x00\x66\x00\x6f\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0b\ -\x00\xa2\x2f\x87\ -\x00\x64\ -\x00\x65\x00\x63\x00\x72\x00\x79\x00\x70\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0b\ -\x00\xb0\xf5\xa7\ -\x00\x6c\ -\x00\x6f\x00\x61\x00\x64\x00\x69\x00\x6e\x00\x67\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0b\ -\x00\xb9\xd7\xa7\ -\x00\x65\ -\x00\x6d\x00\x6f\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0a\ -\x02\xc6\x3c\x87\ -\x00\x6c\ -\x00\x6f\x00\x67\x00\x6f\x00\x39\x00\x39\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x07\ -\x03\x81\x5a\x27\ -\x00\x6d\ -\x00\x61\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x09\ -\x03\x81\xa6\x07\ -\x00\x77\ -\x00\x6f\x00\x6d\x00\x61\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x09\ -\x03\xea\xef\xc7\ -\x63\x09\ -\x94\xae\x00\x5f\x5f\x00\x54\x2f\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0c\ -\x04\x2c\x62\x87\ -\x00\x75\ -\x00\x6e\x00\x73\x00\x65\x00\x6c\x00\x65\x00\x63\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0a\ -\x04\xe0\xfa\xc7\ -\x00\x6d\ -\x00\x79\x00\x69\x00\x6e\x00\x66\x00\x6f\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x08\ -\x05\xe2\x54\xa7\ -\x00\x6c\ -\x00\x6f\x00\x67\x00\x6f\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x08\ -\x05\xe2\x59\x27\ -\x00\x6c\ -\x00\x6f\x00\x67\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x08\ -\x06\x38\x57\x27\ -\x00\x68\ -\x00\x6f\x00\x6d\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x08\ -\x06\x5f\x55\xa7\ -\x00\x74\ -\x00\x6f\x00\x6f\x00\x6c\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x08\ -\x06\x87\x55\x07\ -\x00\x77\ -\x00\x6f\x00\x72\x00\x64\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x08\ -\x06\xe1\x57\xa7\ -\x00\x64\ -\x00\x6f\x00\x77\x00\x6e\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0b\ -\x06\xf5\xf3\xdf\ -\x00\x6c\ -\x00\x6f\x00\x67\x00\x6f\x00\x33\x00\x2e\x00\x30\x00\x2e\x00\x69\x00\x63\x00\x6f\ -\x00\x0c\ -\x07\x0f\x52\xc7\ -\x00\x61\ -\x00\x6e\x00\x61\x00\x6c\x00\x79\x00\x73\x00\x69\x00\x73\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x07\ -\x07\x37\x57\x27\ -\x00\x34\ -\x00\x30\x00\x34\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x12\ -\x07\x61\x60\xe7\ -\x00\x64\ -\x00\x65\x00\x66\x00\x61\x00\x75\x00\x6c\x00\x74\x00\x5f\x00\x61\x00\x76\x00\x61\x00\x74\x00\x61\x00\x72\x00\x2e\x00\x73\x00\x76\ -\x00\x67\ -\x00\x0b\ -\x07\x73\x91\x87\ -\x00\x63\ -\x00\x6f\x00\x6e\x00\x74\x00\x61\x00\x63\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x11\ -\x07\x7b\x14\xc7\ -\x00\x61\ -\x00\x6e\x00\x6e\x00\x75\x00\x61\x00\x6c\x00\x5f\x00\x72\x00\x65\x00\x70\x00\x6f\x00\x72\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ -\ -\x00\x08\ -\x07\x9e\x57\xc7\ -\x00\x62\ -\x00\x61\x00\x63\x00\x6b\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x06\ -\x07\xc3\x5a\xc7\ -\x00\x75\ -\x00\x70\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0a\ -\x07\xc9\x83\xa7\ -\x00\x6f\ -\x00\x75\x00\x74\x00\x70\x00\x75\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x08\ -\x08\x6b\x33\x87\ -\x51\x73\ -\x95\xed\x72\xb6\x60\x01\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0a\ -\x08\x94\x6d\xc7\ -\x00\x73\ -\x00\x65\x00\x61\x00\x72\x00\x63\x00\x68\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x09\ -\x08\x97\xaf\x87\ -\x00\x73\ -\x00\x74\x00\x61\x00\x72\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0a\ -\x08\xab\xd7\x87\ -\x00\x75\ -\x00\x70\x00\x64\x00\x61\x00\x74\x00\x65\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0e\ -\x08\xfa\x38\xa7\ -\x00\x61\ -\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x6c\x00\x65\x00\x66\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x07\ -\x0a\xa9\x5a\x07\ -\x00\x63\ -\x00\x73\x00\x76\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0a\ -\x0a\xc8\xf6\x87\ -\x00\x66\ -\x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x07\ -\x0a\xc9\xa6\x13\ -\x00\x43\ -\x00\x75\x00\x72\x00\x73\x00\x6f\x00\x72\x00\x73\ -\x00\x08\ -\x0b\x3f\x57\x27\ -\x00\x68\ -\x00\x74\x00\x6d\x00\x6c\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x09\ -\x0b\x85\x8e\x87\ -\x00\x63\ -\x00\x6c\x00\x65\x00\x61\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0a\ -\x0b\xa8\x62\x87\ -\x00\x73\ -\x00\x65\x00\x6c\x00\x65\x00\x63\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x07\ -\x0b\xf7\x5a\x27\ -\x00\x74\ -\x00\x78\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x08\ -\x0c\x33\x57\x07\ -\x00\x68\ -\x00\x65\x00\x6c\x00\x70\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x09\ -\x0c\xc8\xe9\x07\ -\x63\x09\ -\x94\xae\x00\x5f\x51\x73\x95\xed\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x06\ -\x0d\x20\x51\x87\ -\x51\x73\ -\x95\xed\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x08\ -\x0e\x87\x57\xe7\ -\x00\x63\ -\x00\x68\x00\x61\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x0a\ -\x0f\x0e\xef\x47\ -\x00\x77\ -\x00\x65\x00\x69\x00\x78\x00\x69\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x0f\ -\x0f\x22\x69\x47\ -\x00\x61\ -\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2d\x00\x72\x00\x69\x00\x67\x00\x68\x00\x74\x00\x2e\x00\x73\x00\x76\x00\x67\ -\x00\x05\ -\x00\x33\x57\x47\ -\x00\x30\ -\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x05\ -\x00\x34\x57\x47\ -\x00\x31\ -\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x05\ -\x00\x35\x57\x47\ -\x00\x32\ -\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x05\ -\x00\x36\x57\x47\ -\x00\x33\ -\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x05\ -\x00\x37\x57\x47\ -\x00\x34\ -\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x05\ -\x00\x38\x57\x47\ -\x00\x35\ -\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x05\ -\x00\x39\x57\x47\ -\x00\x36\ -\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x05\ -\x00\x3a\x57\x47\ -\x00\x37\ -\x00\x2e\x00\x70\x00\x6e\x00\x67\ -" - -qt_resource_struct_v1 = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x2c\x00\x00\x00\x03\ -\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x13\x52\ -\x00\x00\x00\x50\x00\x01\x00\x00\x00\x01\x00\x00\x19\x78\ -\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x20\x83\ -\x00\x00\x00\x88\x00\x00\x00\x00\x00\x01\x00\x00\x23\x99\ -\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x42\xe3\ -\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x4f\xef\ -\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x56\x8f\ -\x00\x00\x00\xce\x00\x00\x00\x00\x00\x01\x00\x00\x5d\x2f\ -\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x5f\x9c\ -\x00\x00\x01\x04\x00\x00\x00\x00\x00\x01\x00\x00\x61\xc0\ -\x00\x00\x01\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x66\x5f\ -\x00\x00\x01\x34\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x77\ -\x00\x00\x01\x4a\x00\x00\x00\x00\x00\x01\x00\x01\x0c\xc4\ -\x00\x00\x01\x60\x00\x00\x00\x00\x00\x01\x00\x01\x17\x64\ -\x00\x00\x01\x76\x00\x00\x00\x00\x00\x01\x00\x01\x1b\xe8\ -\x00\x00\x01\x8c\x00\x00\x00\x00\x00\x01\x00\x01\x22\xb6\ -\x00\x00\x01\xa2\x00\x01\x00\x00\x00\x01\x00\x01\x25\x1e\ -\x00\x00\x01\xbe\x00\x00\x00\x00\x00\x01\x00\x02\x25\x85\ -\x00\x00\x01\xdc\x00\x00\x00\x00\x00\x01\x00\x02\x29\x33\ -\x00\x00\x01\xf0\x00\x00\x00\x00\x00\x01\x00\x02\x31\x01\ -\x00\x00\x02\x1a\x00\x00\x00\x00\x00\x01\x00\x02\xa0\xa5\ -\x00\x00\x02\x36\x00\x01\x00\x00\x00\x01\x00\x02\xaa\x49\ -\x00\x00\x02\x5e\x00\x00\x00\x00\x00\x01\x00\x02\xaf\x40\ -\x00\x00\x02\x74\x00\x00\x00\x00\x00\x01\x00\x02\xb4\xdf\ -\x00\x00\x02\x86\x00\x00\x00\x00\x00\x01\x00\x02\xb7\xa5\ -\x00\x00\x02\xa0\x00\x00\x00\x00\x00\x01\x00\x02\xbb\x9c\ -\x00\x00\x02\xb6\x00\x00\x00\x00\x00\x01\x00\x02\xbf\x43\ -\x00\x00\x02\xd0\x00\x00\x00\x00\x00\x01\x00\x02\xc2\x2b\ -\x00\x00\x02\xe8\x00\x00\x00\x00\x00\x01\x00\x02\xc4\x5b\ -\x00\x00\x03\x02\x00\x00\x00\x00\x00\x01\x00\x02\xc9\x46\ -\x00\x00\x03\x24\x00\x00\x00\x00\x00\x01\x00\x02\xcc\xa9\ -\x00\x00\x03\x38\x00\x00\x00\x00\x00\x01\x00\x02\xd6\xa6\ -\x00\x00\x03\x52\x00\x02\x00\x00\x00\x08\x00\x00\x00\x2f\ -\x00\x00\x03\x66\x00\x00\x00\x00\x00\x01\x00\x02\xde\xe1\ -\x00\x00\x03\x7c\x00\x00\x00\x00\x00\x01\x00\x02\xe6\x97\ -\x00\x00\x03\x94\x00\x00\x00\x00\x00\x01\x00\x02\xe9\xe5\ -\x00\x00\x03\xae\x00\x00\x00\x00\x00\x01\x00\x02\xec\xfd\ -\x00\x00\x03\xc2\x00\x00\x00\x00\x00\x01\x00\x02\xf0\x76\ -\x00\x00\x03\xd8\x00\x00\x00\x00\x00\x01\x00\x02\xf9\x81\ -\x00\x00\x03\xf0\x00\x00\x00\x00\x00\x01\x00\x02\xfc\x29\ -\x00\x00\x04\x02\x00\x00\x00\x00\x00\x01\x00\x02\xfe\x48\ -\x00\x00\x04\x18\x00\x00\x00\x00\x00\x01\x00\x03\x05\x8d\ -\x00\x00\x04\x32\x00\x00\x00\x00\x00\x01\x00\x04\x27\xcb\ -\x00\x00\x04\x56\x00\x00\x00\x00\x00\x01\x00\x04\x2a\x68\ -\x00\x00\x04\x66\x00\x00\x00\x00\x00\x01\x00\x04\x2f\xd2\ -\x00\x00\x04\x76\x00\x00\x00\x00\x00\x01\x00\x04\x35\x50\ -\x00\x00\x04\x86\x00\x00\x00\x00\x00\x01\x00\x04\x3b\x73\ -\x00\x00\x04\x96\x00\x00\x00\x00\x00\x01\x00\x04\x41\x7c\ -\x00\x00\x04\xa6\x00\x00\x00\x00\x00\x01\x00\x04\x47\x9f\ -\x00\x00\x04\xb6\x00\x00\x00\x00\x00\x01\x00\x04\x4d\xe0\ -\x00\x00\x04\xc6\x00\x00\x00\x00\x00\x01\x00\x04\x54\x33\ -" - -qt_resource_struct_v2 = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x2c\x00\x00\x00\x03\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01\x8d\x88\x23\x0f\x6c\ -\x00\x00\x00\x34\x00\x00\x00\x00\x00\x01\x00\x00\x13\x52\ -\x00\x00\x01\x8d\x88\x23\x0f\x6b\ -\x00\x00\x00\x50\x00\x01\x00\x00\x00\x01\x00\x00\x19\x78\ -\x00\x00\x01\x8d\x88\x23\x0f\x6c\ -\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x01\x00\x00\x20\x83\ -\x00\x00\x01\x8d\x88\x23\x0f\x6c\ -\x00\x00\x00\x88\x00\x00\x00\x00\x00\x01\x00\x00\x23\x99\ -\x00\x00\x01\x8d\xcc\x18\xce\x1a\ -\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x42\xe3\ -\x00\x00\x01\x8d\x88\x23\x0f\x71\ -\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x4f\xef\ -\x00\x00\x01\x8d\x88\x23\x0f\x73\ -\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x56\x8f\ -\x00\x00\x01\x8d\x88\x23\x0f\x73\ -\x00\x00\x00\xce\x00\x00\x00\x00\x00\x01\x00\x00\x5d\x2f\ -\x00\x00\x01\x8d\x88\x23\x0f\x74\ -\x00\x00\x00\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x5f\x9c\ -\x00\x00\x01\x8d\x88\x23\x0f\x72\ -\x00\x00\x01\x04\x00\x00\x00\x00\x00\x01\x00\x00\x61\xc0\ -\x00\x00\x01\x8d\x88\x23\x0f\x71\ -\x00\x00\x01\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x66\x5f\ -\x00\x00\x01\x8d\x88\x23\x0f\x6f\ -\x00\x00\x01\x34\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x77\ -\x00\x00\x01\x8d\x88\x23\x0f\x6e\ -\x00\x00\x01\x4a\x00\x00\x00\x00\x00\x01\x00\x01\x0c\xc4\ -\x00\x00\x01\x8d\x88\x23\x0f\x6c\ -\x00\x00\x01\x60\x00\x00\x00\x00\x00\x01\x00\x01\x17\x64\ -\x00\x00\x01\x8d\x88\x23\x0f\x72\ -\x00\x00\x01\x76\x00\x00\x00\x00\x00\x01\x00\x01\x1b\xe8\ -\x00\x00\x01\x8d\x88\x23\x0f\x73\ -\x00\x00\x01\x8c\x00\x00\x00\x00\x00\x01\x00\x01\x22\xb6\ -\x00\x00\x01\x8d\x88\x23\x0f\x6b\ -\x00\x00\x01\xa2\x00\x01\x00\x00\x00\x01\x00\x01\x25\x1e\ -\x00\x00\x01\x8d\x88\x23\x0f\x70\ -\x00\x00\x01\xbe\x00\x00\x00\x00\x00\x01\x00\x02\x25\x85\ -\x00\x00\x01\x8d\x88\x23\x0f\x69\ -\x00\x00\x01\xdc\x00\x00\x00\x00\x00\x01\x00\x02\x29\x33\ -\x00\x00\x01\x8d\x88\x23\x0f\x68\ -\x00\x00\x01\xf0\x00\x00\x00\x00\x00\x01\x00\x02\x31\x01\ -\x00\x00\x01\x8d\x88\x23\x0f\x6b\ -\x00\x00\x02\x1a\x00\x00\x00\x00\x00\x01\x00\x02\xa0\xa5\ -\x00\x00\x01\x8d\x88\x23\x0f\x6a\ -\x00\x00\x02\x36\x00\x01\x00\x00\x00\x01\x00\x02\xaa\x49\ -\x00\x00\x01\x8d\x88\x23\x0f\x69\ -\x00\x00\x02\x5e\x00\x00\x00\x00\x00\x01\x00\x02\xaf\x40\ -\x00\x00\x01\x8d\x88\x23\x0f\x6a\ -\x00\x00\x02\x74\x00\x00\x00\x00\x00\x01\x00\x02\xb4\xdf\ -\x00\x00\x01\x8d\x88\x23\x0f\x72\ -\x00\x00\x02\x86\x00\x00\x00\x00\x00\x01\x00\x02\xb7\xa5\ -\x00\x00\x01\x8d\x88\x23\x0f\x71\ -\x00\x00\x02\xa0\x00\x00\x00\x00\x00\x01\x00\x02\xbb\x9c\ -\x00\x00\x01\x8d\x88\x23\x0f\x73\ -\x00\x00\x02\xb6\x00\x00\x00\x00\x00\x01\x00\x02\xbf\x43\ -\x00\x00\x01\x8d\x88\x23\x0f\x72\ -\x00\x00\x02\xd0\x00\x00\x00\x00\x00\x01\x00\x02\xc2\x2b\ -\x00\x00\x01\x8d\x88\x23\x0f\x72\ -\x00\x00\x02\xe8\x00\x00\x00\x00\x00\x01\x00\x02\xc4\x5b\ -\x00\x00\x01\x8d\x88\x23\x0f\x73\ -\x00\x00\x03\x02\x00\x00\x00\x00\x00\x01\x00\x02\xc9\x46\ -\x00\x00\x01\x8d\x88\x23\x0f\x6a\ -\x00\x00\x03\x24\x00\x00\x00\x00\x00\x01\x00\x02\xcc\xa9\ -\x00\x00\x01\x8d\x88\x23\x0f\x6b\ -\x00\x00\x03\x38\x00\x00\x00\x00\x00\x01\x00\x02\xd6\xa6\ -\x00\x00\x01\x8d\x88\x23\x0f\x6c\ -\x00\x00\x03\x52\x00\x02\x00\x00\x00\x08\x00\x00\x00\x2f\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x03\x66\x00\x00\x00\x00\x00\x01\x00\x02\xde\xe1\ -\x00\x00\x01\x8d\x88\x23\x0f\x6c\ -\x00\x00\x03\x7c\x00\x00\x00\x00\x00\x01\x00\x02\xe6\x97\ -\x00\x00\x01\x8e\xc0\xdb\x74\x28\ -\x00\x00\x03\x94\x00\x00\x00\x00\x00\x01\x00\x02\xe9\xe5\ -\x00\x00\x01\x8d\x88\x23\x0f\x72\ -\x00\x00\x03\xae\x00\x00\x00\x00\x00\x01\x00\x02\xec\xfd\ -\x00\x00\x01\x8d\x88\x23\x0f\x72\ -\x00\x00\x03\xc2\x00\x00\x00\x00\x00\x01\x00\x02\xf0\x76\ -\x00\x00\x01\x8d\x88\x23\x0f\x6c\ -\x00\x00\x03\xd8\x00\x00\x00\x00\x00\x01\x00\x02\xf9\x81\ -\x00\x00\x01\x8d\x88\x23\x0f\x73\ -\x00\x00\x03\xf0\x00\x00\x00\x00\x00\x01\x00\x02\xfc\x29\ -\x00\x00\x01\x8d\x88\x23\x0f\x73\ -\x00\x00\x04\x02\x00\x00\x00\x00\x00\x01\x00\x02\xfe\x48\ -\x00\x00\x01\x8d\x88\x23\x0f\x6a\ -\x00\x00\x04\x18\x00\x00\x00\x00\x00\x01\x00\x03\x05\x8d\ -\x00\x00\x01\x8e\xd1\x1c\xf8\xad\ -\x00\x00\x04\x32\x00\x00\x00\x00\x00\x01\x00\x04\x27\xcb\ -\x00\x00\x01\x8d\x88\x23\x0f\x6a\ -\x00\x00\x04\x56\x00\x00\x00\x00\x00\x01\x00\x04\x2a\x68\ -\x00\x00\x01\x8d\x88\x23\x0f\x68\ -\x00\x00\x04\x66\x00\x00\x00\x00\x00\x01\x00\x04\x2f\xd2\ -\x00\x00\x01\x8d\x88\x23\x0f\x68\ -\x00\x00\x04\x76\x00\x00\x00\x00\x00\x01\x00\x04\x35\x50\ -\x00\x00\x01\x8d\x88\x23\x0f\x69\ -\x00\x00\x04\x86\x00\x00\x00\x00\x00\x01\x00\x04\x3b\x73\ -\x00\x00\x01\x8d\x88\x23\x0f\x69\ -\x00\x00\x04\x96\x00\x00\x00\x00\x00\x01\x00\x04\x41\x7c\ -\x00\x00\x01\x8d\x88\x23\x0f\x69\ -\x00\x00\x04\xa6\x00\x00\x00\x00\x00\x01\x00\x04\x47\x9f\ -\x00\x00\x01\x8d\x88\x23\x0f\x69\ -\x00\x00\x04\xb6\x00\x00\x00\x00\x00\x01\x00\x04\x4d\xe0\ -\x00\x00\x01\x8d\x88\x23\x0f\x69\ -\x00\x00\x04\xc6\x00\x00\x00\x00\x00\x01\x00\x04\x54\x33\ -\x00\x00\x01\x8d\x88\x23\x0f\x69\ -" - -qt_version = [int(v) for v in QtCore.qVersion().split('.')] -if qt_version < [5, 8, 0]: - rcc_version = 1 - qt_resource_struct = qt_resource_struct_v1 -else: - rcc_version = 2 - qt_resource_struct = qt_resource_struct_v2 - -def qInitResources(): - QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) - -def qCleanupResources(): - QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) - -qInitResources() diff --git a/app/ui/Icon.py b/app/ui/Icon.py deleted file mode 100644 index b91bbe2..0000000 --- a/app/ui/Icon.py +++ /dev/null @@ -1,45 +0,0 @@ -from PyQt5.QtGui import QIcon - -from app.resources import resource_rc - -var = resource_rc.qt_resource_name - - -class Icon: - Default_avatar_path = ':/icons/icons/default_avatar.svg' - Default_image_path = ':/icons/icons/404.png' - logo_path = ':/icons/icons/logo99.png' - logo_ico_path = ':/icons/icons/logo3.0.ico' - MainWindow_Icon = QIcon(':/icons/icons/logo.svg') - Default_avatar = QIcon(Default_avatar_path) - Output = QIcon(':/icons/icons/output.svg') - Back = QIcon(':/icons/icons/back.svg') - ToDocx = QIcon(':/icons/icons/word.svg') - ToCSV = QIcon(':/icons/icons/csv.svg') - ToHTML = QIcon(':/icons/icons/html.svg') - ToTXT = QIcon(':/icons/icons/txt.svg') - Chat_Icon = QIcon(':/icons/icons/chat.svg') - Contact_Icon = QIcon(':/icons/icons/contact.svg') - MyInfo_Icon = QIcon(':/icons/icons/myinfo.svg') - Annual_Report_Icon = QIcon(':/icons/icons/annual_report.svg') - Analysis_Icon = QIcon(':/icons/icons/analysis.svg') - Emotion_Icon = QIcon(':/icons/icons/emotion.svg') - Search_Icon = QIcon(':/icons/icons/search.svg') - Tool_Icon = QIcon(':/icons/icons/tool.svg') - Home_Icon = QIcon(':/icons/icons/home.svg') - Help_Icon = QIcon(':/icons/icons/help.svg') - Get_info_Icon = QIcon(':/icons/icons/get_wx_info.svg') - Folder_Icon = QIcon(':/icons/icons/folder.svg') - Start_Icon = QIcon(':/icons/icons/start.svg') - Decrypt_Icon = QIcon(':/icons/icons/decrypt.svg') - Man_Icon_path = ':/icons/icons/man.svg' - Woman_Icon_path = ':/icons/icons/woman.svg' - Man_Icon = QIcon(':/icons/icons/man.svg') - Woman_Icon = QIcon(':/icons/icons/woman.svg') - Arrow_left_Icon = QIcon(':/icons/icons/arrow-left.svg') - Arrow_right_Icon = QIcon(':/icons/icons/arrow-right.svg') - Update_Icon = QIcon(':/icons/icons/update.svg') - Clear_Icon = QIcon(':/icons/icons/clear.svg') - # Man_Icon_pixmap = QPixmap(Man_Icon_path) - # Woman_Icon_pixmap = QPixmap(Woman_Icon_path) - # Logo_Icon = QIcon(':/icons/icons/logo.png') diff --git a/app/ui/QSS/style.qss b/app/ui/QSS/style.qss deleted file mode 100644 index 998eb98..0000000 --- a/app/ui/QSS/style.qss +++ /dev/null @@ -1,105 +0,0 @@ -QWidget{ - background: rgb(238,244,249); -} -/*去掉item虚线边框*/ -QListWidget, QListView, QTreeWidget, QTreeView { - outline: 0px; -} -QMenu::item:selected { - color: black; - background: rgb(230, 235, 240); -} -/*设置左侧选项的最小最大宽度,文字颜色和背景颜色*/ -QListWidget { - min-width: 120px; - max-width: 380px; - color: black; - border:none; -} -QListWidget::item{ - min-width: 80px; - max-width: 380px; - min-height: 60px; - max-height: 60px; -} -QListWidget::item:hover { - background: rgb(230, 235, 240); -} -/*被选中时的背景颜色和左边框颜色*/ -QListWidget::item:selected { - background: rgb(230, 235, 240); - border-left: 2px solid rgb(62, 62, 62); - color: black; - font-weight: bold; -} -/*鼠标悬停颜色*/ -HistoryPanel::item:hover { - background: rgb(52, 52, 52); -} - -QCheckBox::indicator { - background: rgb(255, 255, 255); - Width:20px; - Height:20px; - border-radius: 10px -} -QCheckBox::indicator:unchecked{ - Width:20px; - Height:20px; - image: url(:/icons/icons/unselect.svg); -} -QCheckBox::indicator:checked{ - Width:20px; - Height:20px; - image: url(:/icons/icons/select.svg); -} -QScrollBar:vertical { - border-width: 0px; - border: none; - background:rgba(133, 135, 138, 0); - width:4px; - margin: 0px 0px 0px 0px; -} -QScrollBar::handle:vertical { - background: qlineargradient(x1:0, y1:0, x2:1, y2:0, - stop: 0 rgb(133, 135, 138), stop: 0.5 rgb(133, 135, 138), stop:1 rgb(133, 135, 138)); - min-height: 20px; - max-height: 20px; - margin: 0 0px 0 0px; - border-radius: 2px; -} -QScrollBar::add-line:vertical { - background: qlineargradient(x1:0, y1:0, x2:1, y2:0, - stop: 0 rgba(133, 135, 138, 0), stop: 0.5 rgba(133, 135, 138, 0), stop:1 rgba(133, 135, 138, 0)); - height: 0px; - border: none; - subcontrol-position: bottom; - subcontrol-origin: margin; -} -QScrollBar::sub-line:vertical { - background: qlineargradient(x1:0, y1:0, x2:1, y2:0, - stop: 0 rgba(133, 135, 138, 0), stop: 0.5 rgba(133, 135, 138, 0), stop:1 rgba(133, 135, 138, 0)); - height: 0 px; - border: none; - subcontrol-position: top; - subcontrol-origin: margin; -} -QScrollBar::sub-page:vertical { - background: rgba(133, 135, 138, 0); -} - -QScrollBar::add-page:vertical { - background: rgba(133, 135, 138, 0); -} -QProgressBar{ - height:22px; - text-align:center; - font-size:14px; - color:rgb(49, 218, 27); - border-radius:11px; - background:#EBEEF5; -} -QProgressBar::chunk{ - border-radius:11px; - background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0 #99ffff,stop:1 #9900ff); -} diff --git a/app/ui/__init__.py b/app/ui/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/app/ui/chat/__init__.py b/app/ui/chat/__init__.py deleted file mode 100644 index 00e557b..0000000 --- a/app/ui/chat/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .chat_window import ChatWindow diff --git a/app/ui/chat/ai_chat.py b/app/ui/chat/ai_chat.py deleted file mode 100644 index 1641289..0000000 --- a/app/ui/chat/ai_chat.py +++ /dev/null @@ -1,217 +0,0 @@ -import json -import sys -import time -import traceback -from urllib.parse import urljoin - -import requests -from PyQt5.QtCore import QThread, pyqtSignal, QSize, Qt -from PyQt5.QtGui import QPixmap -from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QHBoxLayout, QApplication, QTextBrowser, QMessageBox - -from app import config -from app.config import SERVER_API_URL -from app.log import logger -from app.ui.Icon import Icon - -try: - from .chatInfoUi import Ui_Form -except: - from chatInfoUi import Ui_Form -from app.components.bubble_message import BubbleMessage -from app.person import Me, ContactDefault - - -class Message(QWidget): - def __init__(self, is_send=False, text='', parent=None): - super().__init__(parent) - self.avatar = QLabel(self) - - self.textBrowser = QTextBrowser(self) - self.textBrowser.setText(text) - - layout = QHBoxLayout(self) - if is_send: - pixmap = Me().avatar.scaled(45, 45) - self.textBrowser.setLayoutDirection(Qt.RightToLeft) - self.textBrowser.setAlignment(Qt.AlignRight | Qt.AlignVCenter) - self.avatar.setPixmap(pixmap) - layout.addWidget(self.textBrowser) - layout.addWidget(self.avatar) - else: - pixmap = QPixmap(Icon.Default_avatar_path).scaled(45, 45) - self.avatar.setPixmap(pixmap) - layout.addWidget(self.avatar) - layout.addWidget(self.textBrowser) - # self.textBrowser.setFixedHeight(int(self.textBrowser.document().size().height())) - self.textBrowser.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) - self.avatar.setFixedSize(QSize(60, 60)) - - def append(self, text: str): - self.textBrowser.insertPlainText(text) - self.textBrowser.setFixedHeight(int(self.textBrowser.document().size().height())) - - -class AIChat(QWidget, Ui_Form): - def __init__(self, contact, parent=None): - super().__init__(parent) - self.now_message: Message = None - self.setupUi(self) - self.last_timestamp = 0 - self.last_str_time = '' - self.last_pos = 0 - self.contact = contact - self.init_ui() - self.show_chats() - self.pushButton.clicked.connect(self.send_msg) - self.toolButton.clicked.connect(self.tool) - self.btn_clear.clicked.connect(self.clear_dialog) - self.btn_clear.setIcon(Icon.Clear_Icon) - - def init_ui(self): - self.textEdit.installEventFilter(self) - - def tool(self): - QMessageBox.information(self, "温馨提示", "暂未接入聊天数据,您可进行基础的AI对话,后续更新敬请期待") - - def chat(self, text): - self.now_message.append(text) - self.scrollArea.verticalScrollBar().setValue(self.scrollArea.verticalScrollBar().maximum()) - - def send_msg(self): - msg = self.textEdit.toPlainText().strip() - self.textEdit.setText('') - if not msg: - return - print(msg) - bubble_message = BubbleMessage( - msg, - Me().avatar, - 1, - True, - ) - self.verticalLayout_message.addWidget(bubble_message) - message1 = Message(False) - self.verticalLayout_message.addWidget(message1) - self.show_chat_thread.msg = msg - self.now_message = message1 - self.show_chat_thread.start() - self.scrollArea.verticalScrollBar().setValue(self.scrollArea.verticalScrollBar().maximum()) - - def clear_dialog(self): - self.show_chat_thread.history = [] - while self.verticalLayout_message.count(): - item = self.verticalLayout_message.takeAt(0) - widget = item.widget() - if widget is not None: - widget.deleteLater() - else: - del item - - def show_chats(self): - # return - self.show_chat_thread = AIChatThread() - self.show_chat_thread.msgSignal.connect(self.chat) - - def update_history_messages(self): - print('开始发送信息') - message1 = Message(False) - msg = '你好!' - self.verticalLayout_message.addWidget(message1) - self.show_chat_thread.msg = msg - self.now_message = message1 - self.show_chat_thread.start() - - def add_message(self, message): - print('message', message) - # self.textBrowser.append(message) - self.textBrowser.insertPlainText(message) - self.textBrowser.setFixedHeight(int(self.textBrowser.document().size().height())) - - def eventFilter(self, obj, event): - if obj == self.textEdit and event.type() == event.KeyPress: - key = event.key() - if key == 16777220: # 回车键的键值 - self.send_msg() - self.textEdit.setText('') - return True - return super().eventFilter(obj, event) - - -class AIChatThread(QThread): - msgSignal = pyqtSignal(str) - showSingal = pyqtSignal(tuple) - finishSingal = pyqtSignal(int) - msg_id = 0 - - # heightSingal = pyqtSignal(int) - def __init__(self): - super().__init__() - self.msg = '' - self.history = [] - - def run(self) -> None: - url = urljoin(SERVER_API_URL, 'chat') - data = { - 'username': Me().wxid, - 'token': Me().token, - 'version': config.version, - 'messages': [ - *self.history, - { - 'role': 'user', - "content": self.msg - } - ] - } - message = ''' - 幼儿园三班一共有35人,上个月34人满勤。\n其中1月15日,小明同学感冒了,他的妈妈给他请了一天的病假。 - ''' - try: - # for s in message: - # self.msgSignal.emit(s) - # time.sleep(0.05) - # return - resp = requests.post(url, json=data, stream=True) - message = { - 'role': 'user', - 'content': self.msg - } - resp_message = { - 'role': 'assistant', - 'content': '' - } - if resp.status_code == 200: - for line in resp.iter_lines(): - if line: - trunk = line.decode('utf-8') - try: - data = json.loads(trunk.strip('data: ')) - answer = data.get('answer') - print(answer) - if isinstance(answer, str): - resp_message['content'] += answer - self.msgSignal.emit(answer) - except: - print(trunk) - resp_message['content'] += trunk - self.msgSignal.emit(trunk) - else: - print(resp.text) - error = resp.json().get('error') - logger.error(f'ai请求错误:{error}') - self.msgSignal.emit(error) - self.history.append(message) - self.history.append(resp_message) - except Exception as e: - error = str(e) - logger.error(f'ai请求错误:{error}{traceback.format_exc()}') - self.msgSignal.emit(error) - - -if __name__ == '__main__': - app = QApplication(sys.argv) - contact = ContactDefault('1') - dialog = AIChat(contact) - dialog.show() - sys.exit(app.exec_()) diff --git a/app/ui/chat/chatInfoUi.py b/app/ui/chat/chatInfoUi.py deleted file mode 100644 index 1c0b5db..0000000 --- a/app/ui/chat/chatInfoUi.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'chatInfoUi.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Form(object): - def setupUi(self, Form): - Form.setObjectName("Form") - Form.resize(817, 748) - self.horizontalLayout_7 = QtWidgets.QHBoxLayout(Form) - self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0) - self.horizontalLayout_7.setSpacing(0) - self.horizontalLayout_7.setObjectName("horizontalLayout_7") - self.frame = QtWidgets.QFrame(Form) - self.frame.setFrameShape(QtWidgets.QFrame.NoFrame) - self.frame.setFrameShadow(QtWidgets.QFrame.Raised) - self.frame.setObjectName("frame") - self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.frame) - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.horizontalLayout_2 = QtWidgets.QHBoxLayout() - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.label_reamrk = QtWidgets.QLabel(self.frame) - self.label_reamrk.setObjectName("label_reamrk") - self.horizontalLayout_2.addWidget(self.label_reamrk) - spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_2.addItem(spacerItem) - self.btn_clear = QtWidgets.QPushButton(self.frame) - self.btn_clear.setObjectName("btn_clear") - self.horizontalLayout_2.addWidget(self.btn_clear) - self.toolButton = QtWidgets.QToolButton(self.frame) - self.toolButton.setObjectName("toolButton") - self.horizontalLayout_2.addWidget(self.toolButton) - self.verticalLayout_2.addLayout(self.horizontalLayout_2) - self.scrollArea = QtWidgets.QScrollArea(self.frame) - self.scrollArea.setFrameShape(QtWidgets.QFrame.NoFrame) - self.scrollArea.setWidgetResizable(True) - self.scrollArea.setObjectName("scrollArea") - self.scrollAreaWidgetContents = QtWidgets.QWidget() - self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 799, 564)) - self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") - self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) - self.verticalLayout_3.setObjectName("verticalLayout_3") - self.verticalLayout_message = QtWidgets.QVBoxLayout() - self.verticalLayout_message.setObjectName("verticalLayout_message") - self.verticalLayout_3.addLayout(self.verticalLayout_message) - self.scrollArea.setWidget(self.scrollAreaWidgetContents) - self.verticalLayout_2.addWidget(self.scrollArea) - self.textEdit = QtWidgets.QTextEdit(self.frame) - self.textEdit.setMaximumSize(QtCore.QSize(16777215, 100)) - self.textEdit.setObjectName("textEdit") - self.verticalLayout_2.addWidget(self.textEdit) - self.pushButton = QtWidgets.QPushButton(self.frame) - self.pushButton.setObjectName("pushButton") - self.verticalLayout_2.addWidget(self.pushButton) - self.horizontalLayout_7.addWidget(self.frame) - - self.retranslateUi(Form) - QtCore.QMetaObject.connectSlotsByName(Form) - - def retranslateUi(self, Form): - _translate = QtCore.QCoreApplication.translate - Form.setWindowTitle(_translate("Form", "Form")) - self.label_reamrk.setText(_translate("Form", "EmoAi")) - self.btn_clear.setText(_translate("Form", "清除对话")) - self.toolButton.setText(_translate("Form", "...")) - self.pushButton.setText(_translate("Form", "发送")) diff --git a/app/ui/chat/chatUi.py b/app/ui/chat/chatUi.py deleted file mode 100644 index 457f7dc..0000000 --- a/app/ui/chat/chatUi.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'chatUi.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Form(object): - def setupUi(self, Form): - Form.setObjectName("Form") - Form.resize(840, 752) - Form.setStyleSheet("background: rgb(240, 240, 240);") - self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form) - self.horizontalLayout_2.setSpacing(6) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.verticalLayout_2 = QtWidgets.QVBoxLayout() - self.verticalLayout_2.setSpacing(6) - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.verticalLayout = QtWidgets.QVBoxLayout() - self.verticalLayout.setObjectName("verticalLayout") - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.label = QtWidgets.QLabel(Form) - self.label.setText("") - self.label.setObjectName("label") - self.horizontalLayout.addWidget(self.label) - self.lineEdit = QtWidgets.QLineEdit(Form) - self.lineEdit.setMinimumSize(QtCore.QSize(200, 30)) - self.lineEdit.setMaximumSize(QtCore.QSize(200, 16777215)) - self.lineEdit.setStyleSheet("") - self.lineEdit.setCursorMoveStyle(QtCore.Qt.VisualMoveStyle) - self.lineEdit.setObjectName("lineEdit") - self.horizontalLayout.addWidget(self.lineEdit) - self.label_2 = QtWidgets.QLabel(Form) - self.label_2.setMinimumSize(QtCore.QSize(30, 0)) - self.label_2.setText("") - self.label_2.setObjectName("label_2") - self.horizontalLayout.addWidget(self.label_2) - self.verticalLayout.addLayout(self.horizontalLayout) - self.verticalLayout_2.addLayout(self.verticalLayout) - self.listWidget = QtWidgets.QListWidget(Form) - self.listWidget.setMinimumSize(QtCore.QSize(250, 0)) - self.listWidget.setMaximumSize(QtCore.QSize(250, 16777215)) - self.listWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.listWidget.setObjectName("listWidget") - self.verticalLayout_2.addWidget(self.listWidget) - self.verticalLayout_2.setStretch(1, 1) - self.horizontalLayout_2.addLayout(self.verticalLayout_2) - self.stackedWidget = QtWidgets.QStackedWidget(Form) - self.stackedWidget.setObjectName("stackedWidget") - self.horizontalLayout_2.addWidget(self.stackedWidget) - self.horizontalLayout_2.setStretch(1, 1) - - self.retranslateUi(Form) - self.stackedWidget.setCurrentIndex(-1) - QtCore.QMetaObject.connectSlotsByName(Form) - - def retranslateUi(self, Form): - _translate = QtCore.QCoreApplication.translate - Form.setWindowTitle(_translate("Form", "Form")) diff --git a/app/ui/chat/chat_info.py b/app/ui/chat/chat_info.py deleted file mode 100644 index 0fa8b42..0000000 --- a/app/ui/chat/chat_info.py +++ /dev/null @@ -1,188 +0,0 @@ -import traceback - -from PyQt5.QtCore import QThread, pyqtSignal -from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QHBoxLayout - -from app.DataBase import msg_db, hard_link_db -from app.components.bubble_message import BubbleMessage, ChatWidget, Notice -from app.person import Me -from app.util import get_abs_path -from app.util.emoji import get_emoji - - -class ChatInfo(QWidget): - def __init__(self, contact, parent=None): - super().__init__(parent) - self.last_timestamp = 0 - self.last_str_time = '' - self.last_pos = 0 - self.contact = contact - self.init_ui() - self.show_chats() - - def init_ui(self): - self.label_reamrk = QLabel(self.contact.remark) - - self.hBoxLayout = QHBoxLayout() - self.hBoxLayout.addWidget(self.label_reamrk) - - self.vBoxLayout = QVBoxLayout() - self.vBoxLayout.setSpacing(0) - self.vBoxLayout.addLayout(self.hBoxLayout) - - self.chat_window = ChatWidget() - self.chat_window.scrollArea.verticalScrollBar().valueChanged.connect(self.verticalScrollBar) - self.vBoxLayout.addWidget(self.chat_window) - self.setLayout(self.vBoxLayout) - - def show_chats(self): - # Me().save_avatar() - # self.contact.save_avatar() - self.show_chat_thread = ShowChatThread(self.contact) - self.show_chat_thread.showSingal.connect(self.add_message) - self.show_chat_thread.finishSingal.connect(self.show_finish) - # self.show_chat_thread.start() - - def show_finish(self, ok): - self.setScrollBarPos() - self.show_chat_thread.quit() - - def verticalScrollBar(self, pos): - """ - 滚动条到0之后自动更新聊天记录 - :param pos: - :return: - """ - # print(pos) - if pos > 0: - return - - # 记录当前滚动条最大值 - self.last_pos = self.chat_window.verticalScrollBar().maximum() - self.update_history_messages() - - def update_history_messages(self): - self.show_chat_thread.start() - - def setScrollBarPos(self): - """ - 将滚动条位置设置为上次看到的地方 - :param pos: - :return: - """ - self.chat_window.update() - self.chat_window.show() - pos = self.chat_window.verticalScrollBar().maximum() - self.last_pos - self.chat_window.set_scroll_bar_value(pos) - - def is_5_min(self, timestamp): - if abs(timestamp - self.last_timestamp) > 300: - self.last_timestamp = timestamp - return True - return False - - def get_avatar_path(self, is_send, message, is_absolute_path=False) -> str: - if self.contact.is_chatroom: - avatar = message[13].smallHeadImgUrl - else: - avatar = Me().smallHeadImgUrl if is_send else self.contact.smallHeadImgUrl - if is_absolute_path: - if self.contact.is_chatroom: - # message[13].save_avatar() - avatar = message[13].avatar - else: - avatar = Me().avatar if is_send else self.contact.avatar - return avatar - - def get_display_name(self, is_send, message) -> str: - if self.contact.is_chatroom: - if is_send: - display_name = Me().name - else: - display_name = message[13].remark - else: - display_name = None - return display_name - - def add_message(self, message): - try: - type_ = message[2] - str_content = message[7] - str_time = message[8] - # print(type_, type(type_)) - is_send = message[4] - avatar = self.get_avatar_path(is_send, message,True) - display_name = self.get_display_name(is_send, message) - timestamp = message[5] - BytesExtra = message[10] - if type_ == 1: - if self.is_5_min(timestamp): - time_message = Notice(self.last_str_time) - self.last_str_time = str_time - self.chat_window.add_message_item(time_message, 0) - bubble_message = BubbleMessage( - str_content, - avatar, - type_, - is_send, - display_name=display_name - ) - self.chat_window.add_message_item(bubble_message, 0) - elif type_ == 3: - # return - if self.is_5_min(timestamp): - time_message = Notice(self.last_str_time) - self.last_str_time = str_time - self.chat_window.add_message_item(time_message, 0) - image_path = hard_link_db.get_image(content=str_content, bytesExtra=BytesExtra, up_dir=Me().wx_dir,thumb=False) - image_path = get_abs_path(image_path) - bubble_message = BubbleMessage( - image_path, - avatar, - type_, - is_send - ) - self.chat_window.add_message_item(bubble_message, 0) - elif type_ == 47: - return - if self.is_5_min(timestamp): - time_message = Notice(self.last_str_time) - self.last_str_time = str_time - self.chat_window.add_message_item(time_message, 0) - image_path = get_emoji(str_content, thumb=True) - bubble_message = BubbleMessage( - image_path, - avatar, - 3, - is_send - ) - self.chat_window.add_message_item(bubble_message, 0) - elif type_ == 10000: - str_content = str_content.lstrip('<revokemsg>').rstrip('</revokemsg>') - message = Notice(str_content) - self.chat_window.add_message_item(message, 0) - except: - print(message) - traceback.print_exc() - - - -class ShowChatThread(QThread): - showSingal = pyqtSignal(tuple) - finishSingal = pyqtSignal(int) - msg_id = 0 - - # heightSingal = pyqtSignal(int) - def __init__(self, contact): - super().__init__() - self.last_message_id = 9999999999 - self.wxid = contact.wxid - - def run(self) -> None: - messages = msg_db.get_message_by_num(self.wxid, self.last_message_id) - if messages: - self.last_message_id = messages[-1][0] - for message in messages: - self.showSingal.emit(message) - self.msg_id += 1 - self.finishSingal.emit(1) diff --git a/app/ui/chat/chat_window.py b/app/ui/chat/chat_window.py deleted file mode 100644 index 8a656da..0000000 --- a/app/ui/chat/chat_window.py +++ /dev/null @@ -1,186 +0,0 @@ -import shutil - -from PyQt5.QtCore import QThread, pyqtSignal -from PyQt5.QtGui import QPixmap -from PyQt5.QtWidgets import QWidget, QMessageBox, QAction, QLineEdit - -from app.DataBase import micro_msg_db, misc_db, msg_db, close_db -from app.components import ContactQListWidgetItem, ScrollBar -from app.person import Contact, Me -from app.ui.Icon import Icon -from app.util import search -from .ai_chat import AIChat -from .chatUi import Ui_Form -from .chat_info import ChatInfo - -# 美化样式表 -Stylesheet = """ - -/*去掉item虚线边框*/ -QListWidget, QListView, QTreeWidget, QTreeView { - outline: 0px; - border:none; -} -/*设置左侧选项的最小最大宽度,文字颜色和背景颜色*/ -QListWidget { - min-width: 250px; - max-width: 250px; - min-height: 80px; - max-height: 1200px; - color: black; - border:none; -} -QListWidget::item{ - height:60px; - width:250px; -} -/*被选中时的背景颜色和左边框颜色*/ -QListWidget::item:selected { - background: rgb(230, 235, 240); - border-left:none; - color: black; - font-weight: bold; -} -""" - - -class ChatWindow(QWidget, Ui_Form): - load_finish_signal = pyqtSignal(bool) - - def __init__(self, parent=None): - super().__init__(parent) - self.show_thread = None - self.setupUi(self) - self.ok_flag = False - self.setStyleSheet(Stylesheet) - self.contacts = [[], []] - self.init_ui() - self.show_chats() - self.visited = set() - self.now_index = 0 - - def init_ui(self): - search_action = QAction(self.lineEdit) - search_action.setIcon(Icon.Search_Icon) - self.lineEdit.addAction(search_action, QLineEdit.LeadingPosition) - self.lineEdit.returnPressed.connect(self.search_contact) - self.listWidget.clear() - self.listWidget.setVerticalScrollBar(ScrollBar()) - self.listWidget.currentRowChanged.connect(self.setCurrentIndex) - self.listWidget.setCurrentRow(0) - self.stackedWidget.setCurrentIndex(0) - pixmap = QPixmap(Icon.Default_avatar_path).scaled(45, 45) - contact_item = ContactQListWidgetItem('AI小助手', '', pixmap) - self.listWidget.addItem(contact_item) - self.listWidget.setItemWidget(contact_item, contact_item.widget) - chat_info_window = AIChat(Me()) - self.stackedWidget.addWidget(chat_info_window) - - def show_chats(self): - # return - if self.ok_flag: - return - msg_db.init_database() - micro_msg_db.init_database() - if not msg_db.open_flag: - QMessageBox.critical(self, "错误", "数据库不存在\n请先解密数据库") - self.show_thread = ShowThread() - self.show_thread.load_finish_signal.connect(self.load_finish_signal) - self.show_thread.start() - return - self.show_thread = ShowContactThread() - self.show_thread.showSingal.connect(self.show_chat) - self.show_thread.load_finish_signal.connect(self.stop_loading) - self.show_thread.start() - self.ok_flag = True - - def search_contact(self): - content = self.lineEdit.text() - if not content: - return - index = self.search_contact_index(content) - self.select_contact_by_index(index) - - def search_contact_index(self, content: str) -> int: - return search.search_by_content(content, self.contacts) - - def select_contact_by_index(self, index): - self.stackedWidget.setCurrentIndex(index) - self.listWidget.setCurrentRow(index) - - def show_chat(self, contact): - # return - self.contacts[0].append(contact.remark) - self.contacts[1].append(contact.nickName) - contact_item = ContactQListWidgetItem(contact.remark, contact.smallHeadImgUrl, contact.smallHeadImgBLOG) - self.listWidget.addItem(contact_item) - self.listWidget.setItemWidget(contact_item, contact_item.widget) - chat_info_window = ChatInfo(contact) - self.stackedWidget.addWidget(chat_info_window) - - def setCurrentIndex(self, row): - # print(row) - item = self.listWidget.item(self.now_index) - item.dis_select() - self.stackedWidget.setCurrentIndex(row) - item = self.listWidget.item(row) - item.select() - self.now_index = row - if row not in self.visited: - chat_info_window = self.stackedWidget.currentWidget() - chat_info_window.update_history_messages() - self.visited.add(row) - - def stop_loading(self, a0): - # self.label.setVisible(False) - self.load_finish_signal.emit(True) - - -class ShowContactThread(QThread): - showSingal = pyqtSignal(Contact) - load_finish_signal = pyqtSignal(bool) - - # heightSingal = pyqtSignal(int) - def __init__(self): - super().__init__() - - def run(self) -> None: - contact_info_lists = micro_msg_db.get_contact() - if not contact_info_lists: - self.load_finish_signal.emit(True) - # QMessageBox.critical(None, "错误", "数据库错误,请重启电脑后重试") - close_db() - try: - shutil.rmtree('./app/Database/Msg') - except: - pass - return - for contact_info_list in contact_info_lists: - # UserName, Alias,Type,Remark,NickName,PYInitial,RemarkPYInitial,ContactHeadImgUrl.smallHeadImgUrl,ContactHeadImgUrl,bigHeadImgUrl - contact_info = { - 'UserName': contact_info_list[0], - 'Alias': contact_info_list[1], - 'Type': contact_info_list[2], - 'Remark': contact_info_list[3], - 'NickName': contact_info_list[4], - 'smallHeadImgUrl': contact_info_list[7] - } - contact = Contact(contact_info) - contact.smallHeadImgBLOG = misc_db.get_avatar_buffer(contact.wxid) - contact.set_avatar(contact.smallHeadImgBLOG) - self.showSingal.emit(contact) - # pprint(contact.__dict__) - self.load_finish_signal.emit(True) - - -class ShowThread(QThread): - showSingal = pyqtSignal(Contact) - load_finish_signal = pyqtSignal(bool) - - # heightSingal = pyqtSignal(int) - def __init__(self): - super().__init__() - - def run(self) -> None: - QThread.sleep(1) - self.load_finish_signal.emit(True) diff --git a/app/ui/contact/__init__.py b/app/ui/contact/__init__.py deleted file mode 100644 index a83ae0a..0000000 --- a/app/ui/contact/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .contact_window import ContactWindow diff --git a/app/ui/contact/contactInfo.py b/app/ui/contact/contactInfo.py deleted file mode 100644 index ead7273..0000000 --- a/app/ui/contact/contactInfo.py +++ /dev/null @@ -1,155 +0,0 @@ -from datetime import datetime - -from PyQt5.QtCore import pyqtSignal, QUrl, QThread -from PyQt5.QtGui import QDesktopServices -from PyQt5.QtWidgets import QWidget, QMenu, QAction, QToolButton, QMessageBox - -from app.ui.Icon import Icon -from .contactInfoUi import Ui_Form -from .userinfo import userinfo -from ..menu.export_time_range import TimeRangeDialog -from ...DataBase import msg_db -from ...person import Contact, Me -from app.ui.contact.export.export_dialog import ExportDialog - - -class ContactInfo(QWidget, Ui_Form): - """ - 显示联系人信息 - """ - exitSignal = pyqtSignal() - urlSignal = pyqtSignal(QUrl) - - # username = '' - def __init__(self, contact, parent=None): - super(ContactInfo, self).__init__(parent) - self.time_range = None - self.setupUi(self) - self.contact: Contact = contact - self.view_userinfo = userinfo.UserinfoController(self.contact) - self.btn_back.clicked.connect(self.back) - self.init_ui() - - def init_ui(self): - self.btn_back.setIcon(Icon.Back) - self.btn_report.setIcon(Icon.Annual_Report_Icon) - self.btn_analysis.setIcon(Icon.Analysis_Icon) - self.btn_emotion.setIcon(Icon.Emotion_Icon) - self.btn_report.clicked.connect(self.annual_report) - self.btn_analysis.clicked.connect(self.analysis) - self.btn_emotion.clicked.connect(self.emotionale_Analysis) - self.stackedWidget.addWidget(self.view_userinfo) - self.stackedWidget.setCurrentWidget(self.view_userinfo) - menu = QMenu(self) - self.toDocxAct = QAction(Icon.ToDocx, '导出Docx', self) - self.toCSVAct = QAction(Icon.ToCSV, '导出CSV', self) - self.toHtmlAct = QAction(Icon.ToHTML, '导出HTML', self) - self.toTxtAct = QAction(Icon.ToTXT, '导出TXT', self) - self.toAiTxtAct = QAction(Icon.ToTXT, '导出AI对话专用TXT', self) - self.toJsonAct = QAction(Icon.ToTXT, '导出json', self) - self.toolButton_output.setPopupMode(QToolButton.MenuButtonPopup) - self.toolButton_output.clicked.connect(self.toolButton_show) - menu.addAction(self.toDocxAct) - menu.addAction(self.toCSVAct) - menu.addAction(self.toHtmlAct) - menu.addAction(self.toTxtAct) - menu.addAction(self.toAiTxtAct) - menu.addAction(self.toJsonAct) - self.toolButton_output.setMenu(menu) - self.toolButton_output.setIcon(Icon.Output) - # self.toolButton_output.addSeparator() - self.toHtmlAct.triggered.connect(self.output) - self.toDocxAct.triggered.connect(self.output) - self.toCSVAct.triggered.connect(self.output) - self.toTxtAct.triggered.connect(self.output) - self.toJsonAct.triggered.connect(self.output) - self.toAiTxtAct.triggered.connect(self.output) - - def set_contact(self, contact: Contact): - self.view_userinfo.set_contact(contact) - self.contact = contact - - def toolButton_show(self): - self.toolButton_output.showMenu() - - def analysis(self): - # QDesktopServices.openUrl(QUrl("https://memotrace.cn/")) - self.report_thread = ReportThread(self.contact) - # self.report_thread.okSignal.connect(lambda x: QDesktopServices.openUrl(QUrl("http://127.0.0.1:21314"))) - self.report_thread.start() - QDesktopServices.openUrl(QUrl(f"http://127.0.0.1:21314/charts/{self.contact.wxid}")) - - def annual_report(self): - date_range = None - chat_calendar = msg_db.get_messages_calendar(self.contact.wxid) - if chat_calendar: - start_time = datetime.strptime(chat_calendar[0], "%Y-%m-%d") - end_time = datetime.strptime(chat_calendar[-1], "%Y-%m-%d") - date_range = (start_time.date(), end_time.date()) - self.time_range_view = TimeRangeDialog(date_range=date_range, parent=self) - self.time_range_view.date_range_signal.connect(self.set_time_range) - self.time_range_view.show() - if 'room' in self.contact.wxid: - QMessageBox.warning( - self, '警告', - '暂不支持群组' - ) - return - - def set_time_range(self, time_range): - self.time_range = time_range - self.contact.save_avatar() - Me().save_avatar() - self.report_thread = ReportThread(self.contact, time_range) - self.report_thread.start() - QDesktopServices.openUrl(QUrl(f"http://127.0.0.1:21314/christmas/{self.contact.wxid}")) - - def emotionale_Analysis(self): - QDesktopServices.openUrl(QUrl("https://memotrace.cn/")) - - def back(self): - """ - 将userinfo界面设置为可见,其他界面设置为不可见 - """ - return - - def output(self): - """ - 导出聊天记录 - :return: - """ - self.stackedWidget.setCurrentWidget(self.view_userinfo) - if self.sender() == self.toDocxAct: - dialog = ExportDialog(self.contact, title='选择导出的消息类型', file_type='docx', parent=self) - result = dialog.exec_() # 使用exec_()获取用户的操作结果 - elif self.sender() == self.toCSVAct: - # self.outputThread = Output(self.contact, type_=Output.CSV) - dialog = ExportDialog(self.contact, title='选择导出的消息类型', file_type='csv', parent=self) - result = dialog.exec_() # 使用exec_()获取用户的操作结果 - elif self.sender() == self.toHtmlAct: - dialog = ExportDialog(self.contact, title='选择导出的消息类型', file_type='html', parent=self) - result = dialog.exec_() # 使用exec_()获取用户的操作结果 - elif self.sender() == self.toTxtAct: - dialog = ExportDialog(self.contact, title='选择导出的消息类型', file_type='txt', parent=self) - result = dialog.exec_() # 使用exec_()获取用户的操作结果 - elif self.sender() == self.toAiTxtAct: - dialog = ExportDialog(self.contact, title='选择导出的消息类型', file_type='ai_txt', parent=self) - result = dialog.exec_() # 使用exec_()获取用户的操作结果 - elif self.sender() == self.toJsonAct: - dialog = ExportDialog(self.contact, title='选择导出的消息类型', file_type='json', parent=self) - result = dialog.exec_() # 使用exec_()获取用户的操作结果 - -class ReportThread(QThread): - okSignal = pyqtSignal(bool) - - def __init__(self, contact, time_range=None): - super().__init__() - self.contact = contact - self.time_range = time_range - - def run(self): - from app.web_ui import web - web.contact = self.contact - web.time_range = self.time_range - web.run(port='21314') - self.okSignal.emit(True) diff --git a/app/ui/contact/contactInfoUi.py b/app/ui/contact/contactInfoUi.py deleted file mode 100644 index 616634b..0000000 --- a/app/ui/contact/contactInfoUi.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'contactInfoUi.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Form(object): - def setupUi(self, Form): - Form.setObjectName("Form") - Form.resize(494, 748) - self.verticalLayout = QtWidgets.QVBoxLayout(Form) - self.verticalLayout.setObjectName("verticalLayout") - self.horizontalLayout_3 = QtWidgets.QHBoxLayout() - self.horizontalLayout_3.setSpacing(0) - self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.btn_analysis = QtWidgets.QPushButton(Form) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.btn_analysis.sizePolicy().hasHeightForWidth()) - self.btn_analysis.setSizePolicy(sizePolicy) - self.btn_analysis.setStyleSheet("") - self.btn_analysis.setFlat(False) - self.btn_analysis.setObjectName("btn_analysis") - self.horizontalLayout_3.addWidget(self.btn_analysis) - self.btn_emotion = QtWidgets.QPushButton(Form) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.btn_emotion.sizePolicy().hasHeightForWidth()) - self.btn_emotion.setSizePolicy(sizePolicy) - self.btn_emotion.setFlat(False) - self.btn_emotion.setObjectName("btn_emotion") - self.horizontalLayout_3.addWidget(self.btn_emotion) - self.btn_report = QtWidgets.QPushButton(Form) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.btn_report.sizePolicy().hasHeightForWidth()) - self.btn_report.setSizePolicy(sizePolicy) - self.btn_report.setFlat(False) - self.btn_report.setObjectName("btn_report") - self.horizontalLayout_3.addWidget(self.btn_report) - self.btn_back = QtWidgets.QPushButton(Form) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.btn_back.sizePolicy().hasHeightForWidth()) - self.btn_back.setSizePolicy(sizePolicy) - self.btn_back.setText("") - self.btn_back.setFlat(False) - self.btn_back.setObjectName("btn_back") - self.horizontalLayout_3.addWidget(self.btn_back) - self.toolButton_output = QtWidgets.QToolButton(Form) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.toolButton_output.sizePolicy().hasHeightForWidth()) - self.toolButton_output.setSizePolicy(sizePolicy) - icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap("../../data/icons/output.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.toolButton_output.setIcon(icon) - self.toolButton_output.setCheckable(False) - self.toolButton_output.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup) - self.toolButton_output.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) - self.toolButton_output.setAutoRaise(True) - self.toolButton_output.setArrowType(QtCore.Qt.NoArrow) - self.toolButton_output.setObjectName("toolButton_output") - self.horizontalLayout_3.addWidget(self.toolButton_output) - self.verticalLayout.addLayout(self.horizontalLayout_3) - self.stackedWidget = QtWidgets.QStackedWidget(Form) - self.stackedWidget.setObjectName("stackedWidget") - self.page_3 = QtWidgets.QWidget() - self.page_3.setObjectName("page_3") - self.stackedWidget.addWidget(self.page_3) - self.page_4 = QtWidgets.QWidget() - self.page_4.setObjectName("page_4") - self.stackedWidget.addWidget(self.page_4) - self.verticalLayout.addWidget(self.stackedWidget) - - self.retranslateUi(Form) - self.stackedWidget.setCurrentIndex(1) - QtCore.QMetaObject.connectSlotsByName(Form) - - def retranslateUi(self, Form): - _translate = QtCore.QCoreApplication.translate - Form.setWindowTitle(_translate("Form", "Form")) - self.btn_analysis.setText(_translate("Form", "统计信息")) - self.btn_emotion.setText(_translate("Form", "情感分析")) - self.btn_report.setText(_translate("Form", "年度报告")) - self.toolButton_output.setText(_translate("Form", "导出聊天记录")) diff --git a/app/ui/contact/contactUi.py b/app/ui/contact/contactUi.py deleted file mode 100644 index 5d87a09..0000000 --- a/app/ui/contact/contactUi.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'contactUi.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Form(object): - def setupUi(self, Form): - Form.setObjectName("Form") - Form.resize(840, 752) - Form.setStyleSheet("background: rgb(240, 240, 240);") - self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.verticalLayout_2 = QtWidgets.QVBoxLayout() - self.verticalLayout_2.setSpacing(6) - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.verticalLayout = QtWidgets.QVBoxLayout() - self.verticalLayout.setObjectName("verticalLayout") - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.label = QtWidgets.QLabel(Form) - self.label.setText("") - self.label.setObjectName("label") - self.horizontalLayout.addWidget(self.label) - self.lineEdit = QtWidgets.QLineEdit(Form) - self.lineEdit.setMinimumSize(QtCore.QSize(200, 30)) - self.lineEdit.setMaximumSize(QtCore.QSize(200, 16777215)) - self.lineEdit.setStyleSheet("") - self.lineEdit.setCursorMoveStyle(QtCore.Qt.VisualMoveStyle) - self.lineEdit.setObjectName("lineEdit") - self.horizontalLayout.addWidget(self.lineEdit) - self.label_2 = QtWidgets.QLabel(Form) - self.label_2.setMinimumSize(QtCore.QSize(30, 0)) - self.label_2.setMaximumSize(QtCore.QSize(30, 16777215)) - self.label_2.setText("") - self.label_2.setObjectName("label_2") - self.horizontalLayout.addWidget(self.label_2) - self.verticalLayout.addLayout(self.horizontalLayout) - self.verticalLayout_2.addLayout(self.verticalLayout) - self.listWidget = QtWidgets.QListWidget(Form) - self.listWidget.setMinimumSize(QtCore.QSize(250, 0)) - self.listWidget.setMaximumSize(QtCore.QSize(250, 16777215)) - self.listWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.listWidget.setObjectName("listWidget") - self.verticalLayout_2.addWidget(self.listWidget) - self.verticalLayout_2.setStretch(1, 1) - self.horizontalLayout_2.addLayout(self.verticalLayout_2) - self.stackedWidget = QtWidgets.QStackedWidget(Form) - self.stackedWidget.setObjectName("stackedWidget") - self.horizontalLayout_2.addWidget(self.stackedWidget) - self.horizontalLayout_2.setStretch(1, 1) - - self.retranslateUi(Form) - self.stackedWidget.setCurrentIndex(-1) - QtCore.QMetaObject.connectSlotsByName(Form) - - def retranslateUi(self, Form): - _translate = QtCore.QCoreApplication.translate - Form.setWindowTitle(_translate("Form", "Form")) diff --git a/app/ui/contact/contact_window.py b/app/ui/contact/contact_window.py deleted file mode 100644 index 499cf7f..0000000 --- a/app/ui/contact/contact_window.py +++ /dev/null @@ -1,196 +0,0 @@ -from typing import List - -from PyQt5.QtCore import QThread, pyqtSignal -from PyQt5.QtWidgets import QWidget, QMessageBox, QAction, QLineEdit, QLabel - -from app.DataBase import micro_msg_db, misc_db, close_db -from app.components import ContactQListWidgetItem, ScrollBar -from app.person import Contact -from app.ui.Icon import Icon -from .contactInfo import ContactInfo -from .contactUi import Ui_Form -from ...DataBase.hard_link import decodeExtraBuf -from ...util import search - -# 美化样式表 -Stylesheet = """ -QPushButton{ - background-color: transparent; -} -QPushButton:hover { - background-color: lightgray; -} -/*去掉item虚线边框*/ -QListWidget, QListView, QTreeWidget, QTreeView { - outline: 0px; - border:none; -} -/*设置左侧选项的最小最大宽度,文字颜色和背景颜色*/ -QListWidget { - min-width: 250px; - max-width: 250px; - min-height: 80px; - max-height: 1200px; - color: black; - border:none; -} -QListWidget::item{ - height:60px; - width:250px; -} -/*被选中时的背景颜色和左边框颜色*/ -QListWidget::item:selected { - background: rgb(230, 235, 240); - border-left:none; - color: black; - font-weight: bold; -} -/*鼠标悬停颜色*/ -HistoryPanel::item:hover { - background: rgb(52, 52, 52); -} -""" - - -class ContactWindow(QWidget, Ui_Form): - load_finish_signal = pyqtSignal(bool) - - def __init__(self, parent=None): - super().__init__(parent) - self.now_index = 0 - self.show_thread = None - self.setupUi(self) - self.ok_flag = False - self.setStyleSheet(Stylesheet) - self.init_ui() - self.contacts = [[], []] - self.contacts_list:List[Contact] = [] - self.show_contacts() - self.contact_info_window = None - - def init_ui(self): - search_action = QAction(self.lineEdit) - search_action.setIcon(Icon.Search_Icon) - self.lineEdit.addAction(search_action, QLineEdit.LeadingPosition) - self.lineEdit.returnPressed.connect(self.search_contact) - self.listWidget.clear() - self.listWidget.setVerticalScrollBar(ScrollBar()) - self.listWidget.currentRowChanged.connect(self.setCurrentIndex) - self.listWidget.setCurrentRow(0) - self.stackedWidget.setCurrentIndex(0) - - def show_contacts(self): - """ - 创建一个子线程来获取联系人并通过信号传递联系人信息 - @return: - """ - # return - if self.ok_flag: - return - micro_msg_db.init_database() - if not micro_msg_db.open_flag: - QMessageBox.critical(self, "错误", "数据库不存在\n请先解密数据库") - self.show_thread = ShowThread() - self.show_thread.showSingal.connect(self.show_contact) - self.show_thread.load_finish_signal.connect(self.load_finish_signal) - self.show_thread.start() - return - - self.show_thread = ShowContactThread() - self.show_thread.showSingal.connect(self.show_contact) - self.show_thread.load_finish_signal.connect(self.load_finish_signal) - self.show_thread.start() - self.ok_flag = True - - def search_contact(self): - """ - 搜索联系人 - @return: - """ - keyword = self.lineEdit.text() - if keyword: - index = search.search_by_content(keyword, self.contacts) - self.listWidget.setCurrentRow(index) - self.stackedWidget.setCurrentIndex(index) - - def show_contact(self, contact: Contact): - """ - 显示联系人 - @param contact:联系人对象 - @return: - """ - # return - self.contacts[0].append(contact.remark) - self.contacts[1].append(contact.nickName) - contact_item = ContactQListWidgetItem(contact.remark, contact.smallHeadImgUrl, contact.smallHeadImgBLOG) - self.listWidget.addItem(contact_item) - self.listWidget.setItemWidget(contact_item, contact_item.widget) - self.contacts_list.append(contact) - if self.contact_info_window is None: - self.contact_info_window = ContactInfo(contact) - self.stackedWidget.addWidget(self.contact_info_window) - - def setCurrentIndex(self, row): - # print(row) - item = self.listWidget.item(self.now_index) - item.dis_select() - self.stackedWidget.setCurrentIndex(row) - item = self.listWidget.item(row) - item.select() - self.now_index = row - # self.stackedWidget.setCurrentIndex(row) - self.contact_info_window.set_contact(self.contacts_list[row]) - - -class ShowContactThread(QThread): - showSingal = pyqtSignal(Contact) - load_finish_signal = pyqtSignal(bool) - - # heightSingal = pyqtSignal(int) - def __init__(self): - super().__init__() - - def run(self) -> None: - contact_info_lists = micro_msg_db.get_contact() - if not contact_info_lists: - self.load_finish_signal.emit(True) - # QMessageBox.critical(None, "错误", "数据库错误,请重启电脑后重试") - close_db() - import shutil - try: - shutil.rmtree('./app/Database/Msg') - except: - pass - return - for contact_info_list in contact_info_lists: - # UserName, Alias,Type,Remark,NickName,PYInitial,RemarkPYInitial,ContactHeadImgUrl.smallHeadImgUrl,ContactHeadImgUrl,bigHeadImgUrl,ExtraBuf - detail = decodeExtraBuf(contact_info_list[9]) - contact_info = { - 'UserName': contact_info_list[0], - 'Alias': contact_info_list[1], - 'Type': contact_info_list[2], - 'Remark': contact_info_list[3], - 'NickName': contact_info_list[4], - 'smallHeadImgUrl': contact_info_list[7], - 'detail': detail, - 'label_name': contact_info_list[10], - } - contact = Contact(contact_info) - contact.smallHeadImgBLOG = misc_db.get_avatar_buffer(contact.wxid) - contact.set_avatar(contact.smallHeadImgBLOG) - self.showSingal.emit(contact) - # pprint(contact.__dict__) - self.load_finish_signal.emit(True) - - -class ShowThread(QThread): - showSingal = pyqtSignal(Contact) - load_finish_signal = pyqtSignal(bool) - - # heightSingal = pyqtSignal(int) - def __init__(self): - super().__init__() - - def run(self) -> None: - QThread.sleep(1) - self.load_finish_signal.emit(True) diff --git a/app/ui/contact/export/__init__.py b/app/ui/contact/export/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/app/ui/contact/export/exportUi.py b/app/ui/contact/export/exportUi.py deleted file mode 100644 index 4177ab3..0000000 --- a/app/ui/contact/export/exportUi.py +++ /dev/null @@ -1,112 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'exportUi.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Dialog(object): - def setupUi(self, Dialog): - Dialog.setObjectName("Dialog") - Dialog.resize(553, 394) - self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) - self.verticalLayout.setObjectName("verticalLayout") - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.label_3 = QtWidgets.QLabel(Dialog) - self.label_3.setObjectName("label_3") - self.horizontalLayout.addWidget(self.label_3) - spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem) - self.btn_select_all = QtWidgets.QPushButton(Dialog) - self.btn_select_all.setObjectName("btn_select_all") - self.horizontalLayout.addWidget(self.btn_select_all) - self.comboBox_time = QtWidgets.QComboBox(Dialog) - self.comboBox_time.setObjectName("comboBox_time") - self.comboBox_time.addItem("") - self.comboBox_time.addItem("") - self.comboBox_time.addItem("") - self.horizontalLayout.addWidget(self.comboBox_time) - self.comboBox_type = QtWidgets.QComboBox(Dialog) - self.comboBox_type.setObjectName("comboBox_type") - self.comboBox_type.addItem("") - self.comboBox_type.addItem("") - self.horizontalLayout.addWidget(self.comboBox_type) - self.verticalLayout.addLayout(self.horizontalLayout) - self.horizontalLayout_2 = QtWidgets.QHBoxLayout() - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.verticalLayout_2 = QtWidgets.QVBoxLayout() - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.label_2 = QtWidgets.QLabel(Dialog) - self.label_2.setObjectName("label_2") - self.verticalLayout_2.addWidget(self.label_2) - self.horizontalLayout_2.addLayout(self.verticalLayout_2) - self.horizontalLayout_2.setStretch(0, 1) - self.verticalLayout.addLayout(self.horizontalLayout_2) - self.textBrowser = QtWidgets.QTextBrowser(Dialog) - self.textBrowser.setObjectName("textBrowser") - self.verticalLayout.addWidget(self.textBrowser) - self.progressBar = QtWidgets.QProgressBar(Dialog) - self.progressBar.setProperty("value", 24) - self.progressBar.setObjectName("progressBar") - self.verticalLayout.addWidget(self.progressBar) - self.horizontalLayout_3 = QtWidgets.QHBoxLayout() - self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.label_time = QtWidgets.QLabel(Dialog) - self.label_time.setText("") - self.label_time.setObjectName("label_time") - self.horizontalLayout_3.addWidget(self.label_time) - self.label_process = QtWidgets.QLabel(Dialog) - self.label_process.setText("") - self.label_process.setObjectName("label_process") - self.horizontalLayout_3.addWidget(self.label_process) - spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_3.addItem(spacerItem1) - self.btn_start = QtWidgets.QPushButton(Dialog) - self.btn_start.setStyleSheet("QPushButton{\n" -" background-color: rgb(233,233,233);\n" -" border-radius: 5px;\n" -" padding: 10px;\n" -"}\n" -"QPushButton:hover { \n" -" background-color: lightgray;\n" -"border:1px solid rgb(31,156,220) ;\n" -"}") - self.btn_start.setObjectName("btn_start") - self.horizontalLayout_3.addWidget(self.btn_start) - self.btn_cancel = QtWidgets.QPushButton(Dialog) - self.btn_cancel.setStyleSheet("QPushButton{\n" -" background-color: rgb(233,233,233);\n" -" border-radius: 5px;\n" -" padding: 10px;\n" -"}\n" -"QPushButton:hover { \n" -" background-color: lightgray;\n" -"border:1px solid rgb(31,156,220) ;\n" -"}") - self.btn_cancel.setObjectName("btn_cancel") - self.horizontalLayout_3.addWidget(self.btn_cancel) - self.verticalLayout.addLayout(self.horizontalLayout_3) - - self.retranslateUi(Dialog) - QtCore.QMetaObject.connectSlotsByName(Dialog) - - def retranslateUi(self, Dialog): - _translate = QtCore.QCoreApplication.translate - Dialog.setWindowTitle(_translate("Dialog", "Dialog")) - self.label_3.setText(_translate("Dialog", "导出过程中请不要退出")) - self.btn_select_all.setText(_translate("Dialog", "全选")) - self.comboBox_time.setItemText(0, _translate("Dialog", "全部时间")) - self.comboBox_time.setItemText(1, _translate("Dialog", "最近三个月")) - self.comboBox_time.setItemText(2, _translate("Dialog", "自定义时间")) - self.comboBox_type.setItemText(0, _translate("Dialog", "全部聊天记录")) - self.comboBox_type.setItemText(1, _translate("Dialog", "不含图片/视频/文件")) - self.label_2.setText(_translate("Dialog", "消息类型")) - self.btn_start.setText(_translate("Dialog", "开始")) - self.btn_cancel.setText(_translate("Dialog", "取消")) diff --git a/app/ui/contact/export/export_dialog.py b/app/ui/contact/export/export_dialog.py deleted file mode 100644 index 91ce09c..0000000 --- a/app/ui/contact/export/export_dialog.py +++ /dev/null @@ -1,229 +0,0 @@ -import os -import sys -import time -from datetime import datetime, timedelta -from PyQt5.QtCore import QTimer, QObject, pyqtSignal -from PyQt5.QtGui import QTextCursor -from PyQt5.QtWidgets import QApplication, QDialog, QCheckBox, QMessageBox - -from app.DataBase import msg_db -from app.components import ScrollBar -from app.config import OUTPUT_DIR -from app.ui.menu.export_time_range import TimeRangeDialog -from .exportUi import Ui_Dialog -from app.util.exporter.output import Output - -types = { - '文本': 1, - '图片': 3, - '语音': 34, - '视频': 43, - '表情包': 47, - '音乐与音频': 4903, - '文件': 4906, - '分享卡片': 4905, - '转账': 492000, - '音视频通话': 50, - '拍一拍等系统消息': 10000, -} -Stylesheet = """ -""" - - -class EmittingStr(QObject): - textWritten = pyqtSignal(str) # 定义一个发送str的信号 - - def write(self, text): - self.textWritten.emit(str(text)) - - -class ExportDialog(QDialog, Ui_Dialog): - def __init__(self, contact=None, title="选择导出的类型", file_type="csv", parent=None): - super(ExportDialog, self).__init__(parent) - self.select_all_flag = False - self.setupUi(self) - self.setStyleSheet(Stylesheet) - # 下面将输出重定向到textBrowser中 - sys.stdout = EmittingStr(textWritten=self.outputWritten) - sys.stderr = EmittingStr(textWritten=self.outputWritten) - scroll_bar = ScrollBar() - self.textBrowser.setVerticalScrollBar(scroll_bar) - self.contact = contact - if file_type == 'html': - self.export_type = Output.HTML - self.export_choices = {"文本": True, "图片": True, "语音": False, "视频": False, "表情包": False, - '音乐与音频': False, '分享卡片': False, '文件': False, - '转账': False, '音视频通话': False, '拍一拍等系统消息': True} # 定义导出的数据类型,默认全部选择 - elif file_type == 'csv': - self.export_type = Output.CSV - self.export_choices = {"文本": True, "图片": True, "视频": True, "表情包": True} # 定义导出的数据类型,默认全部选择 - elif file_type == 'txt': - self.export_type = Output.TXT - self.export_choices = {"文本": True, "图片": True, "语音": True, "视频": True, "表情包": True, - '音乐与音频': True, '分享卡片': True, '文件': True, - '拍一拍等系统消息': True} # 定义导出的数据类型,默认全部选择 - elif file_type == 'ai_txt': - self.export_type = Output.AI_TXT - self.export_choices = {"文本": True} # 定义导出的数据类型,默认全部选择 - elif file_type == 'docx': - self.export_type = Output.DOCX - self.export_choices = {"文本": True, "图片": False, "语音": False, "视频": False, - "表情包": False, '拍一拍等系统消息': True} # 定义导出的数据类型,默认全部选择 - elif file_type == 'json': - self.export_type = Output.JSON - self.export_choices = {} # 定义导出的数据类型,默认全部选择 - else: - self.export_choices = {"文本": True, "图片": True, "视频": True, "表情包": True} # 定义导出的数据类型,默认全部选择 - self.setWindowTitle(title) - self.resize(400, 300) - self.worker = None # 导出线程 - - for export_type, default_state in self.export_choices.items(): - checkbox = QCheckBox(export_type) - checkbox.setChecked(default_state) - self.verticalLayout_2.addWidget(checkbox) - - self.btn_select_all.clicked.connect(self.select_all) - self.btn_start.clicked.connect(self.export_data) - self.btn_cancel.clicked.connect(self.reject) # 使用reject关闭对话框 - self.comboBox_time.activated.connect(self.set_export_date) - self.timer = QTimer(self) - self.time = 0 - self.total_msg_num = 99999 # 总的消息个数 - self.num = 0 # 当前完成的消息个数 - self.timer.timeout.connect(self.update_elapsed_time) - self.time_range = None - - def export_data(self): - self.btn_start.setEnabled(False) - self.btn_cancel.setEnabled(False) - # 在这里获取用户选择的导出数据类型 - selected_types = {types[export_type]: checkbox.isChecked() for export_type, checkbox in - zip(self.export_choices.keys(), self.findChildren(QCheckBox))} - - # 在这里根据用户选择的数据类型执行导出操作 - print("选择的数据类型:", selected_types) - self.worker = Output(self.contact, type_=self.export_type, message_types=selected_types, - time_range=self.time_range) - self.worker.progressSignal.connect(self.update_progress) - self.worker.okSignal.connect(self.export_finished) - self.worker.rangeSignal.connect(self.set_total_msg_num) - self.worker.start() - # 启动定时器,每1000毫秒更新一次任务进度 - self.timer.start(1000) - self.start_time = time.time() - # self.accept() # 使用accept关闭对话框 - - def outputWritten(self, text): - cursor = self.textBrowser.textCursor() - cursor.movePosition(QTextCursor.End) - cursor.insertText(text) - self.textBrowser.setTextCursor(cursor) - self.textBrowser.ensureCursorVisible() - - def set_export_date(self): - date_range = self.comboBox_time.currentText() - if date_range == '全部时间': - pass - elif date_range == '最近三个月': - - # 获取今天的日期和时间 - today = datetime.now() - - # 获取今天的日期 - today_date = today.date() - - # 获取今天的24:00:00的时间戳 - today_midnight = datetime.combine(today_date, datetime.min.time()) + timedelta(days=1) - today_midnight_timestamp = int(today_midnight.timestamp()) - - # 获取三个月前的日期 - three_months_ago = today - timedelta(days=90) - - # 获取三个月前的00:00:00的时间戳 - three_months_ago_date = three_months_ago.date() - three_months_ago_midnight = datetime.combine(three_months_ago_date, datetime.min.time()) - three_months_ago_midnight_timestamp = int(three_months_ago_midnight.timestamp()) - self.time_range = (three_months_ago_midnight_timestamp, today_midnight_timestamp) - - elif date_range == '自定义时间': - date_range = None - chat_calendar = msg_db.get_messages_calendar(self.contact.wxid) - if chat_calendar: - start_time = datetime.strptime(chat_calendar[0], "%Y-%m-%d") - end_time = datetime.strptime(chat_calendar[-1], "%Y-%m-%d") - date_range = (start_time.date(), end_time.date()) - self.time_range_view = TimeRangeDialog(date_range=date_range, parent=self) - self.time_range_view.date_range_signal.connect(self.set_time_range) - self.time_range_view.show() - self.comboBox_time.setCurrentIndex(0) - # QMessageBox.warning(self, - # "别急别急", - # "马上就实现该功能" - # ) - - def set_time_range(self, time_range): - self.time_range = time_range - self.comboBox_time.setCurrentIndex(2) - - def set_total_msg_num(self, num): - self.total_msg_num = num - # b''+num +(1,1) - - def export_finished(self): - self.btn_start.setEnabled(True) - self.btn_cancel.setEnabled(True) - self.time = 0 - end_time = time.time() - print(f'总耗时:{end_time - self.start_time}s') - reply = QMessageBox(self) - reply.setIcon(QMessageBox.Information) - reply.setWindowTitle('OK') - reply.setText( - f"导出聊天记录成功\n在{OUTPUT_DIR}目录下(跟exe文件在一起)\n{os.path.normpath(os.path.join(os.getcwd(), OUTPUT_DIR))}") - reply.addButton("确认", QMessageBox.AcceptRole) - reply.addButton("取消", QMessageBox.RejectRole) - api = reply.exec_() - # 在任务完成时重置sys.stdout - sys.stdout = sys.__stdout__ - self.accept() - - def select_all(self): - self.select_all_flag = not self.select_all_flag - print('全选', self.select_all_flag) - if self.select_all_flag: - for checkbox in self.findChildren(QCheckBox): - checkbox.setChecked(True) - self.btn_select_all.setText('全不选') - else: - for checkbox in self.findChildren(QCheckBox): - checkbox.setChecked(False) - self.btn_select_all.setText('全选') - - def update_elapsed_time(self): - self.time += 1 - self.label_time.setText(f"耗时: {self.time}s") - - def update_progress(self, progress_percentage): - self.num += 1 - progress_percentage = int((self.num) / self.total_msg_num * 100) - self.progressBar.setValue(progress_percentage) - self.label_process.setText(f"导出进度: {progress_percentage}%") - - def close(self): - sys.stdout = sys.__stdout__ - del self.worker - super().close() - - -if __name__ == '__main__': - import sys - - app = QApplication(sys.argv) - dialog = ExportDialog() - result = dialog.exec_() # 使用exec_()获取用户的操作结果 - if result == QDialog.Accepted: - print("用户点击了导出按钮") - else: - print("用户点击了取消按钮") - sys.exit(app.exec_()) diff --git a/app/ui/contact/userinfo/__init__.py b/app/ui/contact/userinfo/__init__.py deleted file mode 100644 index 6d32454..0000000 --- a/app/ui/contact/userinfo/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -""" -@File : __init__.py.py -@Author : Shuaikang Zhou -@Time : 2022/12/24 10:34 -@IDE : Pycharm -@Version : Python3.10 -@comment : ··· -""" diff --git a/app/ui/contact/userinfo/userinfo.py b/app/ui/contact/userinfo/userinfo.py deleted file mode 100644 index 1ce0b3a..0000000 --- a/app/ui/contact/userinfo/userinfo.py +++ /dev/null @@ -1,62 +0,0 @@ -from PyQt5.QtGui import QPixmap -from PyQt5.QtWidgets import * - -from app.person import Contact -from app.util.region_conversion import conversion_region_to_chinese -from .userinfoUi import Ui_Frame -from ...Icon import Icon - - -class UserinfoController(QWidget, Ui_Frame): - def __init__(self, contact, parent=None): - super().__init__(parent) - self.setupUi(self) - self.l_remark.setText(contact.remark) - self.l_avatar.setPixmap(contact.avatar) - self.l_nickname.setText(f'昵称:{contact.nickName}') - self.l_username.setText(f'微信号:{contact.alias}') - self.lineEdit.setText(contact.remark) - # self.l_region.setVisible(False) - self.l_contact_label.setText(contact.label_name) - if contact.detail: - self.l_signature.setText(contact.detail.get('signature')) - self.l_tel.setText(contact.detail.get('telephone')) - region = contact.detail.get('region') - area = conversion_region_to_chinese(region) - self.l_region.setText(f'地区:{area}') - gender_code = contact.detail.get('gender') - gender = '' - pixmap =QPixmap() - if gender_code == 1: - gender = '男' - pixmap = QPixmap(Icon.Man_Icon_path) - elif gender_code == 2: - gender = '女' - pixmap = QPixmap(Icon.Woman_Icon_path) - self.l_gender.setPixmap(pixmap) - # self.l_gender.setText() - def set_contact(self,contact:Contact): - self.l_remark.setText(contact.remark) - self.l_avatar.setPixmap(contact.avatar) - self.l_nickname.setText(f'昵称:{contact.nickName}') - self.l_username.setText(f'微信号:{contact.alias}') - self.lineEdit.setText(contact.remark) - # self.l_region.setVisible(False) - self.l_contact_label.setText(contact.label_name) - if contact.detail: - self.l_signature.setText(contact.detail.get('signature')) - self.l_tel.setText(contact.detail.get('telephone')) - region = contact.detail.get('region') - area = conversion_region_to_chinese(region) - self.l_region.setText(f'地区:{area}') - gender_code = contact.detail.get('gender') - gender = '' - pixmap = QPixmap() - if gender_code == 1: - gender = '男' - pixmap = QPixmap(Icon.Man_Icon_path) - elif gender_code == 2: - gender = '女' - pixmap = QPixmap(Icon.Woman_Icon_path) - self.l_gender.setPixmap(pixmap) - # self.l_gender.setText() \ No newline at end of file diff --git a/app/ui/contact/userinfo/userinfoUi.py b/app/ui/contact/userinfo/userinfoUi.py deleted file mode 100644 index e7c7c15..0000000 --- a/app/ui/contact/userinfo/userinfoUi.py +++ /dev/null @@ -1,168 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'userinfoUi.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Frame(object): - def setupUi(self, Frame): - Frame.setObjectName("Frame") - Frame.resize(624, 720) - Frame.setCursor(QtGui.QCursor(QtCore.Qt.IBeamCursor)) - Frame.setMouseTracking(True) - Frame.setTabletTracking(True) - self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Frame) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - spacerItem = QtWidgets.QSpacerItem(162, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_2.addItem(spacerItem) - self.verticalLayout = QtWidgets.QVBoxLayout() - self.verticalLayout.setObjectName("verticalLayout") - spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout.addItem(spacerItem1) - self.gridLayout_2 = QtWidgets.QGridLayout() - self.gridLayout_2.setVerticalSpacing(2) - self.gridLayout_2.setObjectName("gridLayout_2") - self.l_avatar = QtWidgets.QLabel(Frame) - self.l_avatar.setMinimumSize(QtCore.QSize(80, 80)) - self.l_avatar.setMaximumSize(QtCore.QSize(80, 80)) - self.l_avatar.setText("") - self.l_avatar.setPixmap(QtGui.QPixmap("../../../a_img/be0fa6c0c4707fb5f7b37b660de826d3.jpg")) - self.l_avatar.setScaledContents(True) - self.l_avatar.setAlignment(QtCore.Qt.AlignCenter) - self.l_avatar.setObjectName("l_avatar") - self.gridLayout_2.addWidget(self.l_avatar, 0, 0, 4, 1) - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.l_remark = QtWidgets.QLabel(Frame) - self.l_remark.setMinimumSize(QtCore.QSize(0, 30)) - self.l_remark.setMaximumSize(QtCore.QSize(16777215, 30)) - font = QtGui.QFont() - font.setPointSize(15) - self.l_remark.setFont(font) - self.l_remark.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) - self.l_remark.setObjectName("l_remark") - self.horizontalLayout.addWidget(self.l_remark) - self.l_gender = QtWidgets.QLabel(Frame) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.l_gender.sizePolicy().hasHeightForWidth()) - self.l_gender.setSizePolicy(sizePolicy) - self.l_gender.setText("") - self.l_gender.setObjectName("l_gender") - self.horizontalLayout.addWidget(self.l_gender) - self.gridLayout_2.addLayout(self.horizontalLayout, 0, 1, 1, 1) - self.l_nickname = QtWidgets.QLabel(Frame) - self.l_nickname.setMinimumSize(QtCore.QSize(0, 20)) - self.l_nickname.setMaximumSize(QtCore.QSize(16777215, 16777215)) - self.l_nickname.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) - self.l_nickname.setObjectName("l_nickname") - self.gridLayout_2.addWidget(self.l_nickname, 1, 1, 1, 1) - self.l_username = QtWidgets.QLabel(Frame) - self.l_username.setMinimumSize(QtCore.QSize(0, 20)) - self.l_username.setMaximumSize(QtCore.QSize(16777215, 16777215)) - self.l_username.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) - self.l_username.setObjectName("l_username") - self.gridLayout_2.addWidget(self.l_username, 2, 1, 1, 1) - self.l_region = QtWidgets.QLabel(Frame) - self.l_region.setText("") - self.l_region.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) - self.l_region.setObjectName("l_region") - self.gridLayout_2.addWidget(self.l_region, 3, 1, 1, 1) - self.verticalLayout.addLayout(self.gridLayout_2) - spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout.addItem(spacerItem2) - self.gridLayout = QtWidgets.QGridLayout() - self.gridLayout.setObjectName("gridLayout") - self.label = QtWidgets.QLabel(Frame) - self.label.setMinimumSize(QtCore.QSize(80, 0)) - self.label.setMaximumSize(QtCore.QSize(100, 16777215)) - font = QtGui.QFont() - font.setPointSize(15) - self.label.setFont(font) - self.label.setObjectName("label") - self.gridLayout.addWidget(self.label, 0, 0, 1, 1) - self.lineEdit = QtWidgets.QLineEdit(Frame) - self.lineEdit.setMinimumSize(QtCore.QSize(0, 25)) - self.lineEdit.setMaximumSize(QtCore.QSize(16777215, 25)) - font = QtGui.QFont() - font.setPointSize(15) - self.lineEdit.setFont(font) - self.lineEdit.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)) - self.lineEdit.setAutoFillBackground(False) - self.lineEdit.setStyleSheet("\n" -" background:transparent;border-width:0;border-style:outset\n" -" ") - self.lineEdit.setObjectName("lineEdit") - self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1) - self.label_4 = QtWidgets.QLabel(Frame) - self.label_4.setMinimumSize(QtCore.QSize(80, 0)) - self.label_4.setMaximumSize(QtCore.QSize(100, 16777215)) - font = QtGui.QFont() - font.setPointSize(15) - self.label_4.setFont(font) - self.label_4.setObjectName("label_4") - self.gridLayout.addWidget(self.label_4, 1, 0, 1, 1) - self.l_tel = QtWidgets.QLabel(Frame) - self.l_tel.setText("") - self.l_tel.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) - self.l_tel.setObjectName("l_tel") - self.gridLayout.addWidget(self.l_tel, 1, 1, 1, 1) - self.label_3 = QtWidgets.QLabel(Frame) - self.label_3.setMinimumSize(QtCore.QSize(80, 0)) - self.label_3.setMaximumSize(QtCore.QSize(100, 16777215)) - font = QtGui.QFont() - font.setPointSize(15) - self.label_3.setFont(font) - self.label_3.setObjectName("label_3") - self.gridLayout.addWidget(self.label_3, 2, 0, 1, 1) - self.l_contact_label = QtWidgets.QLabel(Frame) - self.l_contact_label.setText("") - self.l_contact_label.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) - self.l_contact_label.setObjectName("l_contact_label") - self.gridLayout.addWidget(self.l_contact_label, 2, 1, 1, 1) - self.label_2 = QtWidgets.QLabel(Frame) - self.label_2.setMinimumSize(QtCore.QSize(0, 0)) - self.label_2.setMaximumSize(QtCore.QSize(100, 16777215)) - font = QtGui.QFont() - font.setPointSize(15) - self.label_2.setFont(font) - self.label_2.setWordWrap(False) - self.label_2.setObjectName("label_2") - self.gridLayout.addWidget(self.label_2, 3, 0, 1, 1) - self.l_signature = QtWidgets.QLabel(Frame) - self.l_signature.setMinimumSize(QtCore.QSize(300, 0)) - self.l_signature.setMaximumSize(QtCore.QSize(300, 100)) - self.l_signature.setText("") - self.l_signature.setWordWrap(True) - self.l_signature.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse) - self.l_signature.setObjectName("l_signature") - self.gridLayout.addWidget(self.l_signature, 3, 1, 1, 1) - self.verticalLayout.addLayout(self.gridLayout) - spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout.addItem(spacerItem3) - self.horizontalLayout_2.addLayout(self.verticalLayout) - spacerItem4 = QtWidgets.QSpacerItem(162, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_2.addItem(spacerItem4) - - self.retranslateUi(Frame) - QtCore.QMetaObject.connectSlotsByName(Frame) - - def retranslateUi(self, Frame): - _translate = QtCore.QCoreApplication.translate - Frame.setWindowTitle(_translate("Frame", "Frame")) - self.l_remark.setText(_translate("Frame", "曹雨萱")) - self.l_nickname.setText(_translate("Frame", "昵称:997")) - self.l_username.setText(_translate("Frame", "账号:TextLabel")) - self.label.setText(_translate("Frame", "备注名")) - self.lineEdit.setText(_translate("Frame", "曹雨萱")) - self.label_4.setText(_translate("Frame", "电话")) - self.label_3.setText(_translate("Frame", "标签")) - self.label_2.setText(_translate("Frame", "个性签名")) diff --git a/app/ui/home/__init__.py b/app/ui/home/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/app/ui/home/home_window.py b/app/ui/home/home_window.py deleted file mode 100644 index 54f9861..0000000 --- a/app/ui/home/home_window.py +++ /dev/null @@ -1,79 +0,0 @@ -from PyQt5.QtCore import Qt, pyqtSignal, QThread, QUrl -from PyQt5.QtGui import QFont, QDesktopServices -from PyQt5.QtWidgets import QWidget, QMessageBox - -from app.ui.Icon import Icon - -from .home_windowUi import Ui_Dialog -from ...person import Me - -Stylesheet = """ -QPushButton{ - border-radius: 5px; - padding: 8px; - border-right: 2px solid #888888; /* 按钮边框,2px宽,白色 */ - border-bottom: 2px solid #888888; /* 按钮边框,2px宽,白色 */ - border-left: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */ - border-top: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */ -} -QPushButton:hover { - background-color: lightgray; -} -""" - - -class HomeWindow(QWidget, Ui_Dialog): - load_finish_signal = pyqtSignal(bool) - - def __init__(self, parent=None): - super().__init__(parent) - self.setupUi(self) - self.init_ui() - self.setStyleSheet(Stylesheet) - self.load_finish_signal.emit(True) - self.btn_report.clicked.connect(self.report) - self.btn_save.clicked.connect(self.save_info) - - def init_ui(self): - self.label_wxid.setText(Me().wxid) - self.lineEdit_name.setText(Me().name) - self.lineEdit_phone.setText(Me().mobile) - - def save_info(self): - if self.lineEdit_name.text(): - Me().name = self.lineEdit_name.text() - else: - QMessageBox.critical(self, "错误", - "昵称不能为空") - return - if self.lineEdit_phone.text(): - Me().mobile = self.lineEdit_phone.text() - else: - QMessageBox.critical(self, "错误", - "手机号不能为空") - return - Me().save_info() - QMessageBox.information(self, "修改成功", - "个人信息修改成功") - - def report(self): - time_range = ['2023-01-01 00:00:00', '2024-02-10 00:00:00'] - self.report_thread = ReportThread(Me(), time_range) - self.report_thread.start() - QDesktopServices.openUrl(QUrl(f"http://127.0.0.1:21314/")) - - -class ReportThread(QThread): - okSignal = pyqtSignal(bool) - - def __init__(self, contact, time_range=None): - super().__init__() - self.contact = contact - self.time_range = time_range - - def run(self): - from app.web_ui import web - web.contact = self.contact - web.time_range = self.time_range - web.run(port='21314') - self.okSignal.emit(True) diff --git a/app/ui/home/home_windowUi.py b/app/ui/home/home_windowUi.py deleted file mode 100644 index 616f542..0000000 --- a/app/ui/home/home_windowUi.py +++ /dev/null @@ -1,109 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'home_windowUi.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Dialog(object): - def setupUi(self, Dialog): - Dialog.setObjectName("Dialog") - Dialog.resize(590, 547) - font = QtGui.QFont() - font.setFamily("微软雅黑") - Dialog.setFont(font) - self.verticalLayout_2 = QtWidgets.QVBoxLayout(Dialog) - self.verticalLayout_2.setObjectName("verticalLayout_2") - spacerItem = QtWidgets.QSpacerItem(20, 157, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout_2.addItem(spacerItem) - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem1) - self.verticalLayout = QtWidgets.QVBoxLayout() - self.verticalLayout.setObjectName("verticalLayout") - self.btn_report = QtWidgets.QPushButton(Dialog) - font = QtGui.QFont() - font.setFamily("微软雅黑") - font.setPointSize(30) - self.btn_report.setFont(font) - self.btn_report.setObjectName("btn_report") - self.verticalLayout.addWidget(self.btn_report) - self.label = QtWidgets.QLabel(Dialog) - self.label.setAlignment(QtCore.Qt.AlignCenter) - self.label.setObjectName("label") - self.verticalLayout.addWidget(self.label) - self.gridLayout = QtWidgets.QGridLayout() - self.gridLayout.setObjectName("gridLayout") - self.label_4 = QtWidgets.QLabel(Dialog) - self.label_4.setObjectName("label_4") - self.gridLayout.addWidget(self.label_4, 0, 0, 1, 1) - self.lineEdit_phone = QtWidgets.QLineEdit(Dialog) - self.lineEdit_phone.setStyleSheet("background:transparent;\n" -"\n" -" border-radius:5px;\n" -" border-top: 0px solid #b2e281;\n" -" border-bottom: 2px solid black;\n" -" border-right: 0px solid #b2e281;\n" -" border-left: 0px solid #b2e281;\n" -"\n" -"\n" -" border-style:outset\n" -" ") - self.lineEdit_phone.setFrame(False) - self.lineEdit_phone.setObjectName("lineEdit_phone") - self.gridLayout.addWidget(self.lineEdit_phone, 0, 1, 1, 1) - self.lineEdit_name = QtWidgets.QLineEdit(Dialog) - self.lineEdit_name.setStyleSheet("background:transparent;\n" -"\n" -" border-radius:5px;\n" -" border-top: 0px solid #b2e281;\n" -" border-bottom: 2px solid black;\n" -" border-right: 0px solid #b2e281;\n" -" border-left: 0px solid #b2e281;\n" -"\n" -"\n" -" border-style:outset\n" -" ") - self.lineEdit_name.setFrame(False) - self.lineEdit_name.setObjectName("lineEdit_name") - self.gridLayout.addWidget(self.lineEdit_name, 1, 1, 1, 1) - self.label_wxid = QtWidgets.QLabel(Dialog) - self.label_wxid.setText("") - self.label_wxid.setObjectName("label_wxid") - self.gridLayout.addWidget(self.label_wxid, 2, 1, 1, 1) - self.label_5 = QtWidgets.QLabel(Dialog) - self.label_5.setObjectName("label_5") - self.gridLayout.addWidget(self.label_5, 1, 0, 1, 1) - self.label_6 = QtWidgets.QLabel(Dialog) - self.label_6.setObjectName("label_6") - self.gridLayout.addWidget(self.label_6, 2, 0, 1, 1) - self.verticalLayout.addLayout(self.gridLayout) - self.btn_save = QtWidgets.QPushButton(Dialog) - self.btn_save.setObjectName("btn_save") - self.verticalLayout.addWidget(self.btn_save) - self.horizontalLayout.addLayout(self.verticalLayout) - spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem2) - self.verticalLayout_2.addLayout(self.horizontalLayout) - spacerItem3 = QtWidgets.QSpacerItem(20, 157, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout_2.addItem(spacerItem3) - - self.retranslateUi(Dialog) - QtCore.QMetaObject.connectSlotsByName(Dialog) - - def retranslateUi(self, Dialog): - _translate = QtCore.QCoreApplication.translate - Dialog.setWindowTitle(_translate("Dialog", "Dialog")) - self.btn_report.setText(_translate("Dialog", "我的年度聊天报告")) - self.label.setText(_translate("Dialog", "修改个人信息")) - self.label_4.setText(_translate("Dialog", "手机号")) - self.label_5.setText(_translate("Dialog", "微信昵称")) - self.label_6.setText(_translate("Dialog", "wxid")) - self.btn_save.setText(_translate("Dialog", "保存")) diff --git a/app/ui/mainview.py b/app/ui/mainview.py deleted file mode 100644 index f473ad8..0000000 --- a/app/ui/mainview.py +++ /dev/null @@ -1,524 +0,0 @@ -# -*- coding: utf-8 -*- -""" -@File : mainview.py -@Author : Shuaikang Zhou -@Time : 2022/12/13 15:07 -@IDE : Pycharm -@Version : Python3.10 -@comment : 主窗口 -""" -import json -import os.path -import subprocess -import sys -import time -import traceback -from urllib.parse import urljoin - -import requests -from PyQt5.QtCore import pyqtSignal, QThread, QSize, QUrl, Qt -from PyQt5.QtGui import QPixmap, QIcon, QDesktopServices -from PyQt5.QtWidgets import QMainWindow, QLabel, QMessageBox, QPushButton - -from app.DataBase import misc_db, micro_msg_db, close_db -from app.ui.Icon import Icon -from . import mainwindow -# 不能删,删了会出错 -from app.ui.chat import ChatWindow -from app.ui.contact import ContactWindow -from app.ui.tool.tool_window import ToolWindow -from app.ui.home.home_window import HomeWindow -from .menu.export import ExportDialog -from app.util.exporter.output import Output -from ..components.QCursorGif import QCursorGif -from ..config import INFO_FILE_PATH, DB_DIR, SERVER_API_URL, version -from ..log import logger -from ..person import Me - -try: - from app.ui.menu.about_dialog import AboutDialog -except ModuleNotFoundError: - logger.error(f'Python版本错误:Python>=3.10,仅支持3.10、3.11、3.12') - raise ValueError('Python版本错误:Python>=3.10,仅支持3.10、3.11、3.12') -# 美化样式表 -Stylesheet = """ -QMessageBox QPushButton{ - background-color: rgb(250,252,253); - border-radius: 5px; - padding: 8px; - border-right: 2px solid #888888; /* 按钮边框,2px宽,白色 */ - border-bottom: 2px solid #888888; /* 按钮边框,2px宽,白色 */ - border-left: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */ - border-top: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */ -} -QPushButton{ - background-color: rgb(238,244,249); - border-radius: 5px; - padding: 8px; -} -QPushButton:hover { - background-color: lightgray; -} -QWidget{ - background: rgb(238,244,249); -} -/*去掉item虚线边框*/ -QListWidget, QListView, QTreeWidget, QTreeView { - outline: 0px; -} - -QMenu::item:selected { - color: black; - background: rgb(230, 235, 240); -} -/*设置左侧选项的最小最大宽度,文字颜色和背景颜色*/ -QListWidget { - min-width: 120px; - max-width: 380px; - color: black; - border:none; -} -QListWidget::item{ - min-width: 80px; - max-width: 380px; - min-height: 60px; - max-height: 60px; -} -QListWidget::item:hover { - background: rgb(230, 235, 240); -} -/*被选中时的背景颜色和左边框颜色*/ -QListWidget::item:selected { - background: rgb(230, 235, 240); - border-left: 2px solid rgb(62, 62, 62); - color: black; - font-weight: bold; -} -/*鼠标悬停颜色*/ -HistoryPanel::item:hover { - background: rgb(52, 52, 52); -} - -QCheckBox::indicator { - background: rgb(255, 255, 255); - Width:20px; - Height:20px; - border-radius: 10px -} -QCheckBox::indicator:unchecked{ - Width:20px; - Height:20px; - image: url(:/icons/icons/unselect.svg); -} -QCheckBox::indicator:checked{ - Width:20px; - Height:20px; - image: url(:/icons/icons/select.svg); -} -QScrollBar:vertical { - border-width: 0px; - border: none; - background:rgba(133, 135, 138, 0); - width:4px; - margin: 0px 0px 0px 0px; -} -QScrollBar::handle:vertical { - background: qlineargradient(x1:0, y1:0, x2:1, y2:0, - stop: 0 rgb(133, 135, 138), stop: 0.5 rgb(133, 135, 138), stop:1 rgb(133, 135, 138)); - min-height: 20px; - max-height: 20px; - margin: 0 0px 0 0px; - border-radius: 2px; -} -QScrollBar::add-line:vertical { - background: qlineargradient(x1:0, y1:0, x2:1, y2:0, - stop: 0 rgba(133, 135, 138, 0), stop: 0.5 rgba(133, 135, 138, 0), stop:1 rgba(133, 135, 138, 0)); - height: 0px; - border: none; - subcontrol-position: bottom; - subcontrol-origin: margin; -} -QScrollBar::sub-line:vertical { - background: qlineargradient(x1:0, y1:0, x2:1, y2:0, - stop: 0 rgba(133, 135, 138, 0), stop: 0.5 rgba(133, 135, 138, 0), stop:1 rgba(133, 135, 138, 0)); - height: 0 px; - border: none; - subcontrol-position: top; - subcontrol-origin: margin; -} -QScrollBar::sub-page:vertical { - background: rgba(133, 135, 138, 0); -} - -QScrollBar::add-page:vertical { - background: rgba(133, 135, 138, 0); -} -QProgressBar{ - height:22px; - text-align:center; - font-size:14px; - color:black; - border-radius:11px; - background:#EBEEF5; -} -QProgressBar::chunk{ - border-radius:11px; - background:qlineargradient(spread:pad,x1:0,y1:0,x2:1,y2:0,stop:0 #99ffff,stop:1 #9900ff); -} -QComboBox -{ - border-radius:3px; - border:0px ; - padding-top: 2px; - padding-left: 2px; -} -QComboBox:disabled -{ - background-color:rgba(50,50,50,200); - color:rgb(160,160,160); -} -QComboBox:hover -{ - background-color:rgba(230,230,230,200); - border:1px solid rgb(31,156,220) ; -} - /*下拉箭头的边框*/ -QComboBox::drop-down -{ - border:none; -} - - /*下拉箭头样式*/ -QComboBox::down-arrow -{ - right:0px;/*控制箭头左右偏移*/ - width: 16px; - height: 16px; - image: url(:/icons/icons/down.svg); -} - /*下拉箭头点击样式*/ -QComboBox::down-arrow:on -{ - width: 16px; - height: 16px; - image: url(:/icons/icons/up.svg); -} -QLineEdit -{ - background:transparent; - border-radius:10px; - border-top: 0px solid #b2e281; - border-bottom: 1px solid rgb(227,228,222); - border-right: 1px solid rgb(227,228,222); - border-left: 0px solid #b2e281; - border-style:outset; - background-color:rgb(247,248,252); -} -QLineEdit:hover -{ - background-color:rgb(238,241,248); -} -""" - -''' - - -/*点击combox的样式*/ -QComboBox:on -{ - border-radius:3px; - background-color:rgba(35,35,35); - font: 75 9pt "Microsoft YaHei"; - color:rgb(255,255,255); - border:1px solid rgb(31,156,220) ; -} -/*下拉框的样式*/ -QComboBox QAbstractItemView -{ - outline: 0px solid gray; /*取消选中虚线*/ - border: 1px solid rgb(31,156,220); - font: 75 9pt "Microsoft YaHei"; - color: rgb(255,255,255); - background-color: rgb(45,45,45); - selection-background-color: rgb(90,90,90); -} - /*选中每一项高度*/ -QComboBox QAbstractItemView::item - { - height: 25px; - } -/*选中每一项的字体颜色和背景颜色*/ -QComboBox QAbstractItemView::item:selected -{ - color: rgb(31,163,246); - background-color: rgb(90,90,90); -} - -''' - - -class Avatar(QLabel): - def __init__(self, parent=None): - super().__init__(parent) - - def mouseDoubleClickEvent(self, e): # 双击 - super().mouseDoubleClickEvent() - QDesktopServices.openUrl(QUrl("https://blog.lc044.love/post/7")) - - def mousePressEvent(self, e): # 单击 - super().mousePressEvent(e) - QDesktopServices.openUrl(QUrl("https://blog.lc044.love/post/7")) - - -class MainWinController(QMainWindow, mainwindow.Ui_MainWindow, QCursorGif): - exitSignal = pyqtSignal(bool) - okSignal = pyqtSignal(bool) - - # username = '' - def __init__(self, username, parent=None): - super(MainWinController, self).__init__(parent) - self.outputThread0 = None - self.outputThread = None - self.setupUi(self) - # self.myavatar = Avatar(self) - # self.setWindowIcon(Icon.MainWindow_Icon) - pixmap = QPixmap(Icon.logo_ico_path) - icon = QIcon(pixmap) - self.setWindowIcon(icon) - self.setStyleSheet(Stylesheet) - self.listWidget.clear() - self.resize(QSize(800, 600)) - self.info = QLabel(self) - self.info.setText('Tips ') - self.info.setAlignment(Qt.AlignRight) - self.statusbar.addPermanentWidget(self.info) - self.statusbar.showMessage('遇到问题可添加QQ群咨询', 5000) - self.load_flag = False - self.load_data() - self.load_num = 0 - self.label = QLabel(self) - self.label.setGeometry((self.width() - 300) // 2, (self.height() - 100) // 2, 300, 100) - self.label.setPixmap(QPixmap(':/icons/icons/loading.svg')) - self.menu_output.setIcon(Icon.Output) - self.action_output_CSV.setIcon(Icon.ToCSV) - self.action_output_CSV.triggered.connect(self.output) - self.action_output_contacts.setIcon(Icon.Output) - self.action_output_contacts.triggered.connect(self.output) - self.action_batch_export.setIcon(Icon.Output) - self.action_batch_export.triggered.connect(self.output) - self.action_desc.setIcon(Icon.Help_Icon) - self.action_update.setIcon(Icon.Update_Icon) - - def load_data(self, flag=True): - if os.path.exists(INFO_FILE_PATH): - with open(INFO_FILE_PATH, 'r', encoding='utf-8') as f: - dic = json.loads(f.read()) - wxid = dic.get('wxid') - if wxid: - me = Me() - me.wxid = dic.get('wxid') - me.name = dic.get('name') - me.nickName = dic.get('name') - me.remark = dic.get('name') - me.mobile = dic.get('mobile') - me.wx_dir = dic.get('wx_dir') - me.token = dic.get('token') - self.set_my_info(wxid) - self.load_flag = True - else: - pass - - def init_ui(self): - # 设置忙碌光标图片数组 - self.initCursor([':/icons/icons/Cursors/%d.png' % - i for i in range(8)]) - self.setCursorTimeout(100) - self.startBusy() - self.action_update.triggered.connect(self.update) - self.action_help_faq.triggered.connect( - lambda: QDesktopServices.openUrl(QUrl("https://memotrace.cn/doc/posts/error/"))) - self.about_view = AboutDialog(main_window=self, parent=self) - self.update_thread = UpdateThread(check_time=True) - self.update_thread.updateSignal.connect(self.show_update) - self.update_thread.start() - - def setCurrentIndex(self, row): - self.stackedWidget.setCurrentIndex(row) - if row == 2: - self.stackedWidget.currentWidget().show_contacts() - if row == 1: - self.stackedWidget.currentWidget().show_chats() - - def setWindow(self, window): - try: - window.load_finish_signal.connect(self.loading) - except: - pass - self.stackedWidget.addWidget(window) - - def set_my_info(self, wxid): - self.avatar = QPixmap() - img_bytes = misc_db.get_avatar_buffer(wxid) - if not img_bytes: - return - if img_bytes[:4] == b'\x89PNG': - self.avatar.loadFromData(img_bytes, format='PNG') - else: - self.avatar.loadFromData(img_bytes, format='jfif') - self.avatar.scaled(60, 60) - contact_info_list = micro_msg_db.get_contact_by_username(wxid) - if not contact_info_list: - close_db() - import shutil - try: - shutil.rmtree(DB_DIR) - except: - pass - QMessageBox.critical(self, "数据库错误", "数据库错误,请删除app文件夹后重启电脑再运行软件") - return - me = Me() - me.set_avatar(img_bytes) - me.smallHeadImgUrl = contact_info_list[7] - self.myavatar.setScaledContents(True) - self.myavatar.setPixmap(self.avatar) - - def stop_loading(self, a0): - self.label.setVisible(False) - self.stopBusy() - - def loading(self, a0): - self.load_num += 1 - if self.load_num == 1: - self.label.clear() - self.label.hide() - self.okSignal.emit(True) - self.listWidget.setVisible(True) - self.stackedWidget.setVisible(True) - self.stopBusy() - if self.load_flag: - self.listWidget.setCurrentRow(1) - self.stackedWidget.setCurrentIndex(1) - else: - self.listWidget.setCurrentRow(0) - self.stackedWidget.setCurrentIndex(0) - - def output(self): - # self.startBusy() - if self.sender() == self.action_output_CSV: - self.outputThread = Output(None, type_=Output.CSV_ALL) - self.outputThread.startSignal.connect(lambda x: self.startBusy()) - self.outputThread.okSignal.connect( - lambda x: self.message('聊天记录导出成功')) - self.outputThread.start() - elif self.sender() == self.action_output_contacts: - self.outputThread = Output(None, type_=Output.CONTACT_CSV) - self.outputThread.startSignal.connect(lambda x: self.startBusy()) - self.outputThread.okSignal.connect( - lambda x: self.message('联系人导出成功')) - self.outputThread.start() - elif self.sender() == self.action_batch_export: - dialog = ExportDialog(None, title='批量导出聊天记录', parent=self) - result = dialog.exec_() # 使用exec_()获取用户的操作结果 - - def message(self, msg): - self.stopBusy() - QMessageBox.about(self, "提醒", msg) - - def update(self): - self.update_thread = UpdateThread() - self.update_thread.updateSignal.connect(self.show_update) - self.update_thread.start() - - def show_update(self, update_info): - if not update_info.get('update_available'): - QMessageBox.information(self, '更新通知', "当前已是最新版本") - return - detail = f''' - 当前版本:{version},最新版本:{update_info.get('latest_version')}<br> - 更新内容: - {update_info.get('description')} - <br><a href='https://memotrace.cn/'>查看详情</a> - ''' - - # 创建一个 QMessageBox 对象 - error_box = QMessageBox() - - # 设置对话框的标题 - error_box.setWindowTitle("更新通知") - pixmap = QPixmap(Icon.logo_ico_path) - icon = QIcon(pixmap) - error_box.setWindowIcon(icon) - # 设置对话框的文本消息 - error_box.setText(detail) - # 设置对话框的图标,使用 QMessageBox.Critical 作为图标类型 - error_box.setIcon(QMessageBox.Information) - # 添加一个“确定”按钮 - # 添加自定义按钮 - custom_button = error_box.addButton('更新', QMessageBox.ActionRole) - is_update_online = update_info.get('is_update_online') - custom_button.clicked.connect(lambda x: self.update_(update_info.get('download_url'), is_update_online)) - error_box.addButton(QMessageBox.Cancel) - # 显示对话框 - error_box.exec_() - - def update_(self, url, is_update_online): - QDesktopServices.openUrl(QUrl("https://memotrace.cn/")) - - def about(self): - """ - 关于 - """ - self.about_view.show() - - def decrypt_success(self): - QMessageBox.about(self, "解密成功", "请重新启动") - self.close() - - def closeEvent(self, event): - close_db() - - def close(self) -> bool: - close_db() - self.contact_window.close() - - super().close() - self.exitSignal.emit(True) - - -class UpdateThread(QThread): - updateSignal = pyqtSignal(dict) - - def __init__(self, check_time=False): - super().__init__() - self.check_time = check_time - - def run(self): - now_time = time.time() - try: - with open(INFO_FILE_PATH, "r", encoding="utf-8") as f: - data = json.load(f) - update_time = data.get('update_time') - if update_time: - if now_time - update_time < 14400 and self.check_time: - return - except: - os.makedirs(os.path.dirname(INFO_FILE_PATH), exist_ok=True) - data = { - 'update_time': now_time - } - data['update_time'] = now_time - - with open(INFO_FILE_PATH, "w", encoding="utf-8") as f: - json.dump(data, f, ensure_ascii=False, indent=4) - server_url = urljoin(SERVER_API_URL, 'update') - data = {'version': version} - try: - response = requests.post(server_url, json=data) - if response.status_code == 200: - update_info = response.json() - self.updateSignal.emit(update_info) - else: - print("检查更新失败") - except: - update_info = {'update_available': False} - self.updateSignal.emit(update_info) diff --git a/app/ui/mainwindow.py b/app/ui/mainwindow.py deleted file mode 100644 index 9ae38fc..0000000 --- a/app/ui/mainwindow.py +++ /dev/null @@ -1,191 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'mainwindow.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_MainWindow(object): - def setupUi(self, MainWindow): - MainWindow.setObjectName("MainWindow") - MainWindow.resize(605, 565) - font = QtGui.QFont() - font.setFamily("微软雅黑") - font.setPointSize(12) - font.setBold(False) - font.setWeight(50) - MainWindow.setFont(font) - MainWindow.setMouseTracking(True) - MainWindow.setStyleSheet("") - MainWindow.setIconSize(QtCore.QSize(50, 24)) - MainWindow.setDockOptions(QtWidgets.QMainWindow.AllowTabbedDocks|QtWidgets.QMainWindow.AnimatedDocks) - self.centralwidget = QtWidgets.QWidget(MainWindow) - self.centralwidget.setMouseTracking(True) - self.centralwidget.setObjectName("centralwidget") - self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget) - self.horizontalLayout.setContentsMargins(10, 0, 0, 0) - self.horizontalLayout.setSpacing(0) - self.horizontalLayout.setObjectName("horizontalLayout") - self.frame_info = QtWidgets.QFrame(self.centralwidget) - self.frame_info.setMinimumSize(QtCore.QSize(80, 500)) - self.frame_info.setMaximumSize(QtCore.QSize(16777215, 16777215)) - self.frame_info.setStyleSheet("") - self.frame_info.setFrameShape(QtWidgets.QFrame.NoFrame) - self.frame_info.setFrameShadow(QtWidgets.QFrame.Plain) - self.frame_info.setLineWidth(5) - self.frame_info.setObjectName("frame_info") - self.myavatar = QtWidgets.QLabel(self.frame_info) - self.myavatar.setGeometry(QtCore.QRect(10, 40, 60, 60)) - self.myavatar.setObjectName("myavatar") - self.listWidget = QtWidgets.QListWidget(self.frame_info) - self.listWidget.setGeometry(QtCore.QRect(0, 230, 120, 331)) - self.listWidget.setMinimumSize(QtCore.QSize(0, 0)) - self.listWidget.setMaximumSize(QtCore.QSize(16777215, 16777215)) - self.listWidget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.listWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.listWidget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored) - self.listWidget.setObjectName("listWidget") - item = QtWidgets.QListWidgetItem() - self.listWidget.addItem(item) - item = QtWidgets.QListWidgetItem() - self.listWidget.addItem(item) - item = QtWidgets.QListWidgetItem() - self.listWidget.addItem(item) - item = QtWidgets.QListWidgetItem() - self.listWidget.addItem(item) - item = QtWidgets.QListWidgetItem() - self.listWidget.addItem(item) - self.horizontalLayout.addWidget(self.frame_info) - self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget) - font = QtGui.QFont() - font.setFamily("Microsoft YaHei UI") - font.setPointSize(15) - font.setBold(False) - font.setWeight(50) - self.stackedWidget.setFont(font) - self.stackedWidget.setObjectName("stackedWidget") - self.horizontalLayout.addWidget(self.stackedWidget) - MainWindow.setCentralWidget(self.centralwidget) - self.menubar = QtWidgets.QMenuBar(MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 605, 33)) - font = QtGui.QFont() - font.setFamily("微软雅黑") - font.setPointSize(12) - font.setBold(False) - font.setWeight(50) - self.menubar.setFont(font) - self.menubar.setObjectName("menubar") - self.menu_F = QtWidgets.QMenu(self.menubar) - self.menu_F.setObjectName("menu_F") - self.menu_data = QtWidgets.QMenu(self.menubar) - font = QtGui.QFont() - font.setFamily("微软雅黑") - font.setPointSize(12) - font.setBold(False) - font.setWeight(50) - self.menu_data.setFont(font) - self.menu_data.setObjectName("menu_data") - self.menu_output = QtWidgets.QMenu(self.menu_data) - self.menu_output.setObjectName("menu_output") - self.menu_2 = QtWidgets.QMenu(self.menubar) - self.menu_2.setObjectName("menu_2") - self.menu_about = QtWidgets.QMenu(self.menubar) - self.menu_about.setObjectName("menu_about") - MainWindow.setMenuBar(self.menubar) - self.statusbar = QtWidgets.QStatusBar(MainWindow) - font = QtGui.QFont() - font.setFamily("微软雅黑") - font.setPointSize(12) - font.setBold(False) - font.setWeight(50) - self.statusbar.setFont(font) - self.statusbar.setObjectName("statusbar") - MainWindow.setStatusBar(self.statusbar) - self.action_3 = QtWidgets.QAction(MainWindow) - self.action_3.setObjectName("action_3") - self.action_4 = QtWidgets.QAction(MainWindow) - self.action_4.setObjectName("action_4") - self.action_help_decrypt = QtWidgets.QAction(MainWindow) - font = QtGui.QFont() - font.setFamily("Microsoft YaHei UI") - self.action_help_decrypt.setFont(font) - self.action_help_decrypt.setObjectName("action_help_decrypt") - self.action_desc = QtWidgets.QAction(MainWindow) - self.action_desc.setObjectName("action_desc") - self.action_help_chat = QtWidgets.QAction(MainWindow) - self.action_help_chat.setObjectName("action_help_chat") - self.action_help_contact = QtWidgets.QAction(MainWindow) - self.action_help_contact.setObjectName("action_help_contact") - self.action_output_CSV = QtWidgets.QAction(MainWindow) - self.action_output_CSV.setObjectName("action_output_CSV") - self.action_output_contacts = QtWidgets.QAction(MainWindow) - self.action_output_contacts.setObjectName("action_output_contacts") - self.action_batch_export = QtWidgets.QAction(MainWindow) - self.action_batch_export.setObjectName("action_batch_export") - self.action_update = QtWidgets.QAction(MainWindow) - self.action_update.setObjectName("action_update") - self.action_help_faq = QtWidgets.QAction(MainWindow) - self.action_help_faq.setObjectName("action_help_faq") - self.menu_F.addSeparator() - self.menu_F.addSeparator() - self.menu_F.addAction(self.action_3) - self.menu_F.addAction(self.action_4) - self.menu_output.addAction(self.action_output_CSV) - self.menu_data.addAction(self.menu_output.menuAction()) - self.menu_data.addAction(self.action_output_contacts) - self.menu_data.addAction(self.action_batch_export) - self.menu_2.addAction(self.action_help_faq) - self.menu_2.addSeparator() - self.menu_2.addAction(self.action_help_decrypt) - self.menu_2.addAction(self.action_help_chat) - self.menu_2.addAction(self.action_help_contact) - self.menu_about.addAction(self.action_update) - self.menu_about.addSeparator() - self.menu_about.addAction(self.action_desc) - self.menubar.addAction(self.menu_F.menuAction()) - self.menubar.addAction(self.menu_data.menuAction()) - self.menubar.addAction(self.menu_2.menuAction()) - self.menubar.addAction(self.menu_about.menuAction()) - - self.retranslateUi(MainWindow) - QtCore.QMetaObject.connectSlotsByName(MainWindow) - - def retranslateUi(self, MainWindow): - _translate = QtCore.QCoreApplication.translate - MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) - self.myavatar.setText(_translate("MainWindow", "avatar")) - __sortingEnabled = self.listWidget.isSortingEnabled() - self.listWidget.setSortingEnabled(False) - item = self.listWidget.item(0) - item.setText(_translate("MainWindow", "新建项目")) - item = self.listWidget.item(1) - item.setText(_translate("MainWindow", "新建项目")) - item = self.listWidget.item(2) - item.setText(_translate("MainWindow", "新建项目")) - item = self.listWidget.item(3) - item.setText(_translate("MainWindow", "新建项目")) - item = self.listWidget.item(4) - item.setText(_translate("MainWindow", "新建项目")) - self.listWidget.setSortingEnabled(__sortingEnabled) - self.menu_F.setTitle(_translate("MainWindow", "文件(F)")) - self.menu_data.setTitle(_translate("MainWindow", "数据")) - self.menu_output.setTitle(_translate("MainWindow", "导出聊天记录(全部)")) - self.menu_2.setTitle(_translate("MainWindow", "帮助")) - self.menu_about.setTitle(_translate("MainWindow", "关于")) - self.action_3.setText(_translate("MainWindow", "保存")) - self.action_4.setText(_translate("MainWindow", "退出")) - self.action_help_decrypt.setText(_translate("MainWindow", "解密教程")) - self.action_desc.setText(_translate("MainWindow", "关于软件")) - self.action_help_chat.setText(_translate("MainWindow", "聊天相关")) - self.action_help_contact.setText(_translate("MainWindow", "好友相关")) - self.action_output_CSV.setText(_translate("MainWindow", "CSV")) - self.action_output_contacts.setText(_translate("MainWindow", "导出联系人")) - self.action_batch_export.setText(_translate("MainWindow", "批量导出")) - self.action_update.setText(_translate("MainWindow", "检查更新")) - self.action_help_faq.setText(_translate("MainWindow", "常见问题解答")) diff --git a/app/ui/menu/__init__.py b/app/ui/menu/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/app/ui/menu/about_dialog.cp310-win_amd64.pyd b/app/ui/menu/about_dialog.cp310-win_amd64.pyd deleted file mode 100644 index 1adbee7..0000000 Binary files a/app/ui/menu/about_dialog.cp310-win_amd64.pyd and /dev/null differ diff --git a/app/ui/menu/about_dialog.cp311-win_amd64.pyd b/app/ui/menu/about_dialog.cp311-win_amd64.pyd deleted file mode 100644 index b304d5b..0000000 Binary files a/app/ui/menu/about_dialog.cp311-win_amd64.pyd and /dev/null differ diff --git a/app/ui/menu/about_dialog.cp312-win_amd64.pyd b/app/ui/menu/about_dialog.cp312-win_amd64.pyd deleted file mode 100644 index f2117be..0000000 Binary files a/app/ui/menu/about_dialog.cp312-win_amd64.pyd and /dev/null differ diff --git a/app/ui/menu/dialog.py b/app/ui/menu/dialog.py deleted file mode 100644 index c479e15..0000000 --- a/app/ui/menu/dialog.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'dialog.ui' -# -# Created by: PyQt5 UI code generator 5.15.7 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Dialog(object): - def setupUi(self, Dialog): - Dialog.setObjectName("Dialog") - Dialog.resize(553, 394) - self.verticalLayout_2 = QtWidgets.QVBoxLayout(Dialog) - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.verticalLayout = QtWidgets.QVBoxLayout() - self.verticalLayout.setObjectName("verticalLayout") - self.label_version = QtWidgets.QLabel(Dialog) - self.label_version.setLayoutDirection(QtCore.Qt.LeftToRight) - self.label_version.setAlignment(QtCore.Qt.AlignCenter) - self.label_version.setObjectName("label_version") - self.verticalLayout.addWidget(self.label_version) - self.label_logo = QtWidgets.QLabel(Dialog) - self.label_logo.setMinimumSize(QtCore.QSize(100, 100)) - self.label_logo.setObjectName("label_logo") - self.verticalLayout.addWidget(self.label_logo) - spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout.addItem(spacerItem) - self.horizontalLayout.addLayout(self.verticalLayout) - self.textBrowser = QtWidgets.QTextBrowser(Dialog) - self.textBrowser.setFrameShape(QtWidgets.QFrame.NoFrame) - self.textBrowser.setObjectName("textBrowser") - self.horizontalLayout.addWidget(self.textBrowser) - self.verticalLayout_2.addLayout(self.horizontalLayout) - self.label_weixin = QtWidgets.QLabel(Dialog) - self.label_weixin.setAlignment(QtCore.Qt.AlignCenter) - self.label_weixin.setObjectName("label_weixin") - self.verticalLayout_2.addWidget(self.label_weixin) - self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) - self.buttonBox.setOrientation(QtCore.Qt.Horizontal) - self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) - self.buttonBox.setObjectName("buttonBox") - self.verticalLayout_2.addWidget(self.buttonBox) - - self.retranslateUi(Dialog) - self.buttonBox.accepted.connect(Dialog.accept) # type: ignore - self.buttonBox.rejected.connect(Dialog.reject) # type: ignore - QtCore.QMetaObject.connectSlotsByName(Dialog) - - def retranslateUi(self, Dialog): - _translate = QtCore.QCoreApplication.translate - Dialog.setWindowTitle(_translate("Dialog", "Dialog")) - self.label_version.setText(_translate("Dialog", "TextLabel")) - self.label_logo.setText(_translate("Dialog", "logo")) - self.label_weixin.setText(_translate("Dialog", "TextLabel")) diff --git a/app/ui/menu/export.py b/app/ui/menu/export.py deleted file mode 100644 index a28a29d..0000000 --- a/app/ui/menu/export.py +++ /dev/null @@ -1,288 +0,0 @@ -import os -import sys as sys_ -import time -from typing import List -from PyQt5 import QtWidgets -from PyQt5.QtCore import QTimer, QThread, pyqtSignal, QObject -from PyQt5.QtGui import QTextCursor -from PyQt5.QtWidgets import QApplication, QDialog, QCheckBox, QMessageBox - -from app.DataBase import micro_msg_db, misc_db -from app.util.exporter.output import Output -from app.components import ScrollBar -from app.components.export_contact_item import ContactQListWidgetItem -from app.config import OUTPUT_DIR -from app.person import Contact -from app.ui.menu.exportUi import Ui_Dialog -from app.ui.menu.export_time_range import TimeRangeDialog - -types = { - '文本': 1, - '图片': 3, - '语音': 34, - '视频': 43, - '表情包': 47, - '音乐与音频': 4903, - '文件': 4906, - '分享卡片': 4905, - '转账': 492000, - '音视频通话': 50, - '拍一拍等系统消息': 10000, -} -file_format = { - 'Docx': Output.DOCX, - 'TXT': Output.TXT, - 'HTML': Output.HTML, - 'CSV': Output.CSV, - 'JSON': Output.JSON, -} -Stylesheet = """ -""" - - -class EmittingStr(QObject): - textWritten = pyqtSignal(str) # 定义一个发送str的信号 - - def write(self, text): - self.textWritten.emit(str(text)) - - -class ExportDialog(QDialog, Ui_Dialog): - def __init__(self, contact=None, title="选择导出的类型", file_type="html", parent=None): - super(ExportDialog, self).__init__(parent) - self.setupUi(self) - self.contacts: List[Contact] = [] - self.setStyleSheet(Stylesheet) - self.contact = contact - self.btn_select_all.clicked.connect(self.select_all) - self.select_all_flag = False - self.btn_start.clicked.connect(self.export_data) - self.comboBox_time.activated.connect(self.set_export_date) - # 下面将输出重定向到textBrowser中 - sys_.stdout = EmittingStr(textWritten=self.outputWritten) - # sys.stderr = EmittingStr(textWritten=self.outputWritten) - scroll_bar = ScrollBar() - self.textBrowser.setVerticalScrollBar(scroll_bar) - self.export_choices = {"文本": True, "图片": True, "语音": False, "视频": False, "表情包": False, - '音乐与音频': False, '分享卡片': False, '文件': False, - '转账': False, '音视频通话': False,'拍一拍等系统消息': True} # 定义导出的数据类型 - self.setWindowTitle(title) - self.checkBox_word.setEnabled(False) - self.checkBox_word.setText('Docx(暂时不可用)') - self.resize(800, 600) - self.worker = None # 导出线程 - for export_type, default_state in self.export_choices.items(): - checkbox = QCheckBox(export_type) - checkbox.setObjectName('message_type') - checkbox.setChecked(default_state) - self.verticalLayout_2.addWidget(checkbox) - spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout_2.addItem(spacerItem1) - self.timer = QTimer(self) - self.time = 0 - self.total_msg_num = 99999 # 总的消息个数 - self.num = 0 # 当前完成的消息个数 - self.timer.timeout.connect(self.update_elapsed_time) - self.show_thread = ShowContactThread() - self.show_thread.showSingal.connect(self.show_contact) - # self.show_thread.load_finish_signal.connect(self.stop_loading) - self.show_thread.start() - self.listWidget.setVerticalScrollBar(ScrollBar()) - # self.listWidget.currentRowChanged.connect(self.setCurrentIndex) - self.listWidget.itemClicked.connect(self.setCurrentIndex) - self.visited = set() - self.now_index = 0 - self.time_range = None - - def set_export_date(self): - date_range = self.comboBox_time.currentText() - if date_range == '全部时间': - pass - elif date_range == '最近三个月': - from datetime import datetime, timedelta - - # 获取今天的日期和时间 - today = datetime.now() - - # 获取今天的日期 - today_date = today.date() - - # 获取今天的24:00:00的时间戳 - today_midnight = datetime.combine(today_date, datetime.min.time()) + timedelta(days=1) - today_midnight_timestamp = int(today_midnight.timestamp()) - - # 获取三个月前的日期 - three_months_ago = today - timedelta(days=90) - - # 获取三个月前的00:00:00的时间戳 - three_months_ago_date = three_months_ago.date() - three_months_ago_midnight = datetime.combine(three_months_ago_date, datetime.min.time()) - three_months_ago_midnight_timestamp = int(three_months_ago_midnight.timestamp()) - self.time_range = (three_months_ago_midnight_timestamp, today_midnight_timestamp) - - elif date_range == '自定义时间': - self.time_range_view = TimeRangeDialog(parent=self) - self.time_range_view.date_range_signal.connect(self.set_time_range) - self.time_range_view.show() - self.comboBox_time.setCurrentIndex(0) - # QMessageBox.warning(self, - # "别急别急", - # "马上就实现该功能" - # ) - - def set_time_range(self, time_range): - self.time_range = time_range - self.comboBox_time.setCurrentIndex(2) - - def outputWritten(self, text): - cursor = self.textBrowser.textCursor() - cursor.movePosition(QTextCursor.End) - cursor.insertText(text) - self.textBrowser.setTextCursor(cursor) - self.textBrowser.ensureCursorVisible() - - def export_data(self): - self.btn_start.setEnabled(False) - # 在这里获取用户选择的导出数据类型 - selected_types = {types[export_type]: checkbox.isChecked() for export_type, checkbox in - zip(self.export_choices.keys(), self.findChildren(QCheckBox, 'message_type'))} - - # 在这里根据用户选择的数据类型执行导出操作 - print("选择的数据类型:", selected_types) - - file_types = [] - for checkbox in [self.checkBox_txt, self.checkBox_csv, self.checkBox_html, self.checkBox_word,self.checkBox_json]: - if checkbox.isChecked(): - file_types.append(file_format[checkbox.text()]) - select_contacts = [] - count = self.listWidget.count() - # 遍历listwidget中的内容 - for i in range(count): - item = self.listWidget.item(i) - if item.is_select: - select_contacts.append(self.contacts[i]) - # 在这里根据用户选择的数据类型执行导出操作 - print("选择的文件格式:", file_types) - self.worker = Output(select_contacts, type_=Output.Batch, message_types=selected_types, sub_type=file_types, - time_range=self.time_range) - # self.worker.progressSignal.connect(self.update_progress) - self.worker.okSignal.connect(self.export_finished) - self.worker.rangeSignal.connect(self.set_total_msg_num) - self.worker.nowContact.connect(self.update_progress) - self.worker.start() - # 启动定时器,每1000毫秒更新一次任务进度 - self.timer.start(1000) - self.start_time = time.time() - # self.accept() # 使用accept关闭对话框 - # 绑定点击槽函数 点击显示对应item中的name - - def set_total_msg_num(self, num): - self.total_msg_num = num - # b''+num +(1,1) - - def setCurrentIndex(self, item): - # print(row) - # row = self.listWidget.it - # item = self.listWidget.item(row) - item.select() - item.dis_select() - # self.now_index = row - - def select_all(self): - self.select_all_flag = not self.select_all_flag - print('全选', self.select_all_flag) - if self.select_all_flag: - count = self.listWidget.count() - # 遍历listwidget中的内容 - for i in range(count): - item = self.listWidget.item(i) - item.force_select() - self.btn_select_all.setText('全不选') - else: - count = self.listWidget.count() - # 遍历listwidget中的内容 - for i in range(count): - item = self.listWidget.item(i) - item.force_dis_select() - self.btn_select_all.setText('全选') - - def export_finished(self): - self.btn_start.setEnabled(True) - self.time = 0 - end_time = time.time() - print(f'总耗时:{end_time - self.start_time}s') - reply = QMessageBox(self) - reply.setIcon(QMessageBox.Information) - reply.setWindowTitle('OK') - reply.setText(f"导出聊天记录成功\n在{OUTPUT_DIR}目录下(跟exe文件在一起)\n{os.path.normpath(os.path.join(os.getcwd(), OUTPUT_DIR))}") - reply.addButton("确认", QMessageBox.AcceptRole) - reply.addButton("取消", QMessageBox.RejectRole) - api = reply.exec_() - # 在任务完成时重置sys.stdout - sys_.stdout = sys_.__stdout__ - self.accept() - - def close(self): - sys_.stdout = sys_.__stdout__ - del self.worker - super().close() - - def show_contact(self, contact): - # return - # print(contact.remark) - contact_item = ContactQListWidgetItem(contact.remark, contact.smallHeadImgUrl, contact.smallHeadImgBLOG) - self.listWidget.addItem(contact_item) - self.listWidget.setItemWidget(contact_item, contact_item.widget) - self.contacts.append(contact) - - def update_elapsed_time(self): - self.time += 1 - self.label_time.setText(f"耗时: {self.time}s") - - def update_progress(self, remark): - self.num += 1 - progress_percentage = int((self.num) / self.total_msg_num * 100) - self.progressBar.setValue(progress_percentage) - self.label_process.setText(f"导出进度: {progress_percentage}% {remark}") - - -class ShowContactThread(QThread): - showSingal = pyqtSignal(Contact) - load_finish_signal = pyqtSignal(bool) - - # heightSingal = pyqtSignal(int) - def __init__(self): - super().__init__() - - def run(self) -> None: - contact_info_lists = micro_msg_db.get_contact() - for contact_info_list in contact_info_lists: - # UserName, Alias,Type,Remark,NickName,PYInitial,RemarkPYInitial,ContactHeadImgUrl.smallHeadImgUrl,ContactHeadImgUrl,bigHeadImgUrl - contact_info = { - 'UserName': contact_info_list[0], - 'Alias': contact_info_list[1], - 'Type': contact_info_list[2], - 'Remark': contact_info_list[3], - 'NickName': contact_info_list[4], - 'smallHeadImgUrl': contact_info_list[7] - } - contact = Contact(contact_info) - contact.smallHeadImgBLOG = misc_db.get_avatar_buffer(contact.wxid) - contact.set_avatar(contact.smallHeadImgBLOG) - self.showSingal.emit(contact) - # print(contact.wxid) - # pprint(contact.__dict__) - self.load_finish_signal.emit(True) - - -if __name__ == '__main__': - import sys - - app = QApplication(sys.argv) - dialog = ExportDialog() - result = dialog.exec_() # 使用exec_()获取用户的操作结果 - if result == QDialog.Accepted: - print("用户点击了导出按钮") - else: - print("用户点击了取消按钮") - sys.exit(app.exec_()) diff --git a/app/ui/menu/exportUi.py b/app/ui/menu/exportUi.py deleted file mode 100644 index 9d05f5c..0000000 --- a/app/ui/menu/exportUi.py +++ /dev/null @@ -1,166 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'exportUi.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Dialog(object): - def setupUi(self, Dialog): - Dialog.setObjectName("Dialog") - Dialog.resize(791, 599) - self.verticalLayout_3 = QtWidgets.QVBoxLayout(Dialog) - self.verticalLayout_3.setObjectName("verticalLayout_3") - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.label_3 = QtWidgets.QLabel(Dialog) - self.label_3.setObjectName("label_3") - self.horizontalLayout.addWidget(self.label_3) - spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem) - self.btn_select_all = QtWidgets.QPushButton(Dialog) - self.btn_select_all.setObjectName("btn_select_all") - self.horizontalLayout.addWidget(self.btn_select_all) - self.comboBox_time = QtWidgets.QComboBox(Dialog) - self.comboBox_time.setObjectName("comboBox_time") - self.comboBox_time.addItem("") - self.comboBox_time.addItem("") - self.comboBox_time.addItem("") - self.horizontalLayout.addWidget(self.comboBox_time) - self.comboBox_type = QtWidgets.QComboBox(Dialog) - self.comboBox_type.setObjectName("comboBox_type") - self.comboBox_type.addItem("") - self.comboBox_type.addItem("") - self.horizontalLayout.addWidget(self.comboBox_type) - self.verticalLayout_3.addLayout(self.horizontalLayout) - self.horizontalLayout_2 = QtWidgets.QHBoxLayout() - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.verticalLayout = QtWidgets.QVBoxLayout() - self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize) - self.verticalLayout.setObjectName("verticalLayout") - self.label = QtWidgets.QLabel(Dialog) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) - self.label.setSizePolicy(sizePolicy) - self.label.setObjectName("label") - self.verticalLayout.addWidget(self.label) - self.checkBox_word = QtWidgets.QCheckBox(Dialog) - self.checkBox_word.setObjectName("checkBox_word") - self.verticalLayout.addWidget(self.checkBox_word) - self.checkBox_html = QtWidgets.QCheckBox(Dialog) - self.checkBox_html.setObjectName("checkBox_html") - self.verticalLayout.addWidget(self.checkBox_html) - self.checkBox_csv = QtWidgets.QCheckBox(Dialog) - self.checkBox_csv.setObjectName("checkBox_csv") - self.verticalLayout.addWidget(self.checkBox_csv) - self.checkBox_txt = QtWidgets.QCheckBox(Dialog) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.checkBox_txt.sizePolicy().hasHeightForWidth()) - self.checkBox_txt.setSizePolicy(sizePolicy) - self.checkBox_txt.setChecked(True) - self.checkBox_txt.setObjectName("checkBox_txt") - self.verticalLayout.addWidget(self.checkBox_txt) - self.checkBox_json = QtWidgets.QCheckBox(Dialog) - self.checkBox_json.setObjectName("checkBox_json") - self.verticalLayout.addWidget(self.checkBox_json) - self.label_2 = QtWidgets.QLabel(Dialog) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth()) - self.label_2.setSizePolicy(sizePolicy) - self.label_2.setObjectName("label_2") - self.verticalLayout.addWidget(self.label_2) - self.verticalLayout_2 = QtWidgets.QVBoxLayout() - self.verticalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize) - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.verticalLayout.addLayout(self.verticalLayout_2) - spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout.addItem(spacerItem1) - self.horizontalLayout_2.addLayout(self.verticalLayout) - self.listWidget = QtWidgets.QListWidget(Dialog) - self.listWidget.setMinimumSize(QtCore.QSize(0, 0)) - self.listWidget.setObjectName("listWidget") - self.horizontalLayout_2.addWidget(self.listWidget) - self.horizontalLayout_2.setStretch(0, 1) - self.horizontalLayout_2.setStretch(1, 1) - self.verticalLayout_3.addLayout(self.horizontalLayout_2) - self.textBrowser = QtWidgets.QTextBrowser(Dialog) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.textBrowser.sizePolicy().hasHeightForWidth()) - self.textBrowser.setSizePolicy(sizePolicy) - self.textBrowser.setMaximumSize(QtCore.QSize(16777215, 80)) - self.textBrowser.setFrameShape(QtWidgets.QFrame.StyledPanel) - self.textBrowser.setTabStopWidth(0) - self.textBrowser.setOpenExternalLinks(False) - self.textBrowser.setObjectName("textBrowser") - self.verticalLayout_3.addWidget(self.textBrowser) - self.progressBar = QtWidgets.QProgressBar(Dialog) - self.progressBar.setProperty("value", 0) - self.progressBar.setObjectName("progressBar") - self.verticalLayout_3.addWidget(self.progressBar) - self.horizontalLayout_4 = QtWidgets.QHBoxLayout() - self.horizontalLayout_4.setObjectName("horizontalLayout_4") - self.verticalLayout_3.addLayout(self.horizontalLayout_4) - self.horizontalLayout_3 = QtWidgets.QHBoxLayout() - self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.label_time = QtWidgets.QLabel(Dialog) - self.label_time.setText("") - self.label_time.setObjectName("label_time") - self.horizontalLayout_3.addWidget(self.label_time) - self.label_process = QtWidgets.QLabel(Dialog) - self.label_process.setText("") - self.label_process.setObjectName("label_process") - self.horizontalLayout_3.addWidget(self.label_process) - spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_3.addItem(spacerItem2) - self.btn_start = QtWidgets.QPushButton(Dialog) - self.btn_start.setStyleSheet("QPushButton{\n" -" background-color: rgb(233,233,233);\n" -" border-radius: 5px;\n" -" padding: 10px;\n" -"}\n" -"QPushButton:hover { \n" -" background-color: lightgray;\n" -"border:1px solid rgb(31,156,220) ;\n" -"}") - self.btn_start.setAutoDefault(False) - self.btn_start.setDefault(False) - self.btn_start.setFlat(False) - self.btn_start.setObjectName("btn_start") - self.horizontalLayout_3.addWidget(self.btn_start) - self.verticalLayout_3.addLayout(self.horizontalLayout_3) - - self.retranslateUi(Dialog) - QtCore.QMetaObject.connectSlotsByName(Dialog) - - def retranslateUi(self, Dialog): - _translate = QtCore.QCoreApplication.translate - Dialog.setWindowTitle(_translate("Dialog", "Dialog")) - self.label_3.setText(_translate("Dialog", "导出过程中请不要退出,为减少卡顿请尽量不要超过十个")) - self.btn_select_all.setText(_translate("Dialog", "全选")) - self.comboBox_time.setItemText(0, _translate("Dialog", "全部时间")) - self.comboBox_time.setItemText(1, _translate("Dialog", "最近三个月")) - self.comboBox_time.setItemText(2, _translate("Dialog", "自定义时间")) - self.comboBox_type.setItemText(0, _translate("Dialog", "全部聊天记录")) - self.comboBox_type.setItemText(1, _translate("Dialog", "不含图片/视频/文件")) - self.label.setText(_translate("Dialog", "导出格式")) - self.checkBox_word.setText(_translate("Dialog", "Docx")) - self.checkBox_html.setText(_translate("Dialog", "HTML")) - self.checkBox_csv.setText(_translate("Dialog", "CSV")) - self.checkBox_txt.setText(_translate("Dialog", "TXT")) - self.checkBox_json.setText(_translate("Dialog", "JSON")) - self.label_2.setText(_translate("Dialog", "消息类型")) - self.btn_start.setText(_translate("Dialog", "开始")) diff --git a/app/ui/menu/export_time_range.py b/app/ui/menu/export_time_range.py deleted file mode 100644 index 47b3254..0000000 --- a/app/ui/menu/export_time_range.py +++ /dev/null @@ -1,109 +0,0 @@ -from datetime import datetime -from PyQt5 import QtWidgets -from PyQt5.QtCore import QTimer, QThread, pyqtSignal, Qt, QPoint -from PyQt5.QtGui import QMouseEvent -from PyQt5.QtWidgets import QApplication, QDialog, QCheckBox, QMessageBox, QCalendarWidget, QWidget, QVBoxLayout, QLabel - -from app.components.calendar_dialog import CalendarDialog -try: - from .time_range import Ui_Dialog -except: - from time_range import Ui_Dialog -Stylesheet = ''' -QToolButton{ - color:#000000; -} -QCalendarWidget QAbstractItemView:disabled { - -} -QCalendarWidget QAbstractItemView:enabled{ -} -''' - - -class TimeRangeDialog(QDialog, Ui_Dialog): - date_range_signal = pyqtSignal(tuple) - - def __init__(self, date_range=None, parent=None): - """ - - @param date_range: tuple[Union[QDate, datetime.date],Union[QDate, datetime.date]] 限定的可选择范围 - @param parent: - """ - super().__init__(parent) - self.calendar = None - self.setupUi(self) - self.setWindowTitle('选择日期范围') - # self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint) - self.setStyleSheet(Stylesheet) - self.toolButton_start_time.clicked.connect(self.select_date_start) - self.toolButton_end_time.clicked.connect(self.select_date_end) - self.calendar = CalendarDialog(date_range=date_range, parent=self) - self.calendar.selected_date_signal.connect(self.set_date) - self.btn_ok.clicked.connect(self.ok) - self.btn_ok.setEnabled(False) - self.btn_ok_num = 0 - self.btn_cancel.clicked.connect(lambda x: self.close()) - self.start_time_flag = True - self.start_timestamp = 0 - self.end_timestamp = 0 - - def set_date(self, timestamp): - if self.start_time_flag: - self.start_timestamp = timestamp - date_object = datetime.fromtimestamp(timestamp) - str_start = date_object.strftime("%Y-%m-%d") - self.toolButton_start_time.setText(str_start) - self.btn_ok_num += 1 - else: - date_object = datetime.fromtimestamp(timestamp) - str_start = date_object.strftime("%Y-%m-%d") - self.end_timestamp = timestamp + 86399 - self.toolButton_end_time.setText(str_start) - self.btn_ok_num += 1 - if self.btn_ok_num == 2: - self.btn_ok.setEnabled(True) - - def ok(self): - date_range = (self.start_timestamp, self.end_timestamp) - self.date_range_signal.emit(date_range) - self.close() - - def select_date_start(self): - self.start_time_flag = True - self.calendar.set_start_date() - self.calendar.show() - - def select_date_end(self): - self.start_time_flag = False - self.calendar.set_end_date() - self.calendar.show() - - def mouseMoveEvent(self, e: QMouseEvent): # 重写移动事件 - if self._tracking: - self._endPos = e.pos() - self._startPos - self.move(self.pos() + self._endPos) - - def mousePressEvent(self, e: QMouseEvent): - if e.button() == Qt.LeftButton: - self._startPos = QPoint(e.x(), e.y()) - self._tracking = True - - def mouseReleaseEvent(self, e: QMouseEvent): - if e.button() == Qt.LeftButton: - self._tracking = False - self._startPos = None - self._endPos = None - -if __name__ == '__main__': - import sys - from datetime import datetime - - app = QApplication(sys.argv) - # 设置日期范围 - start_date = datetime(2023, 12, 11) - end_date = datetime(2024, 1, 9) - date_range = (start_date.date(), end_date.date()) - ex = TimeRangeDialog(date_range=date_range) - ex.show() - sys.exit(app.exec_()) diff --git a/app/ui/menu/time_range.py b/app/ui/menu/time_range.py deleted file mode 100644 index 97e1813..0000000 --- a/app/ui/menu/time_range.py +++ /dev/null @@ -1,73 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'time_range.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Dialog(object): - def setupUi(self, Dialog): - Dialog.setObjectName("Dialog") - Dialog.resize(280, 200) - Dialog.setMinimumSize(QtCore.QSize(280, 200)) - Dialog.setMaximumSize(QtCore.QSize(280, 200)) - self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) - self.verticalLayout.setObjectName("verticalLayout") - self.label = QtWidgets.QLabel(Dialog) - self.label.setLayoutDirection(QtCore.Qt.LeftToRight) - self.label.setAlignment(QtCore.Qt.AlignCenter) - self.label.setObjectName("label") - self.verticalLayout.addWidget(self.label) - self.horizontalLayout_2 = QtWidgets.QHBoxLayout() - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.label_2 = QtWidgets.QLabel(Dialog) - self.label_2.setObjectName("label_2") - self.horizontalLayout_2.addWidget(self.label_2) - self.toolButton_start_time = QtWidgets.QToolButton(Dialog) - self.toolButton_start_time.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) - self.toolButton_start_time.setArrowType(QtCore.Qt.DownArrow) - self.toolButton_start_time.setObjectName("toolButton_start_time") - self.horizontalLayout_2.addWidget(self.toolButton_start_time) - self.verticalLayout.addLayout(self.horizontalLayout_2) - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.label_3 = QtWidgets.QLabel(Dialog) - self.label_3.setObjectName("label_3") - self.horizontalLayout.addWidget(self.label_3) - self.toolButton_end_time = QtWidgets.QToolButton(Dialog) - self.toolButton_end_time.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon) - self.toolButton_end_time.setArrowType(QtCore.Qt.DownArrow) - self.toolButton_end_time.setObjectName("toolButton_end_time") - self.horizontalLayout.addWidget(self.toolButton_end_time) - self.verticalLayout.addLayout(self.horizontalLayout) - spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout.addItem(spacerItem) - self.horizontalLayout_3 = QtWidgets.QHBoxLayout() - self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.btn_ok = QtWidgets.QPushButton(Dialog) - self.btn_ok.setObjectName("btn_ok") - self.horizontalLayout_3.addWidget(self.btn_ok) - self.btn_cancel = QtWidgets.QPushButton(Dialog) - self.btn_cancel.setObjectName("btn_cancel") - self.horizontalLayout_3.addWidget(self.btn_cancel) - self.verticalLayout.addLayout(self.horizontalLayout_3) - - self.retranslateUi(Dialog) - QtCore.QMetaObject.connectSlotsByName(Dialog) - - def retranslateUi(self, Dialog): - _translate = QtCore.QCoreApplication.translate - Dialog.setWindowTitle(_translate("Dialog", "Dialog")) - self.label.setText(_translate("Dialog", "自定义时间")) - self.label_2.setText(_translate("Dialog", "开始日期")) - self.toolButton_start_time.setText(_translate("Dialog", "请选择时间")) - self.label_3.setText(_translate("Dialog", "结束日期")) - self.toolButton_end_time.setText(_translate("Dialog", "请选择时间")) - self.btn_ok.setText(_translate("Dialog", "确定")) - self.btn_cancel.setText(_translate("Dialog", "取消")) diff --git a/app/ui/tool/get_bias_addr/getBiasAddrUi.py b/app/ui/tool/get_bias_addr/getBiasAddrUi.py deleted file mode 100644 index c753bc9..0000000 --- a/app/ui/tool/get_bias_addr/getBiasAddrUi.py +++ /dev/null @@ -1,206 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'getBiasAddrUi.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Form(object): - def setupUi(self, Form): - Form.setObjectName("Form") - Form.resize(650, 580) - self.verticalLayout = QtWidgets.QVBoxLayout(Form) - self.verticalLayout.setObjectName("verticalLayout") - self.scrollArea = QtWidgets.QScrollArea(Form) - self.scrollArea.setFrameShape(QtWidgets.QFrame.NoFrame) - self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded) - self.scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.scrollArea.setWidgetResizable(True) - self.scrollArea.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) - self.scrollArea.setObjectName("scrollArea") - self.scrollAreaWidgetContents = QtWidgets.QWidget() - self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 632, 562)) - self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") - self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) - self.verticalLayout_3.setObjectName("verticalLayout_3") - self.label_4 = QtWidgets.QLabel(self.scrollAreaWidgetContents) - self.label_4.setMaximumSize(QtCore.QSize(16777215, 20)) - self.label_4.setAlignment(QtCore.Qt.AlignCenter) - self.label_4.setObjectName("label_4") - self.verticalLayout_3.addWidget(self.label_4) - self.widget = QtWidgets.QWidget(self.scrollAreaWidgetContents) - self.widget.setStyleSheet("QWidget{\n" -" background-color:rgb(251,251,251);\n" -" border-radius: 10px;\n" -"}\n" -"\n" -"QPushButton{\n" -" background-color: rgb(250,252,253);\n" -" border-radius: 5px;\n" -" padding: 8px;\n" -" border-right: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-bottom: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-left: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -" border-top: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -"}\n" -"QPushButton:hover { \n" -" background-color: lightgray;\n" -"}") - self.widget.setObjectName("widget") - self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget) - self.horizontalLayout.setObjectName("horizontalLayout") - self.label = QtWidgets.QLabel(self.widget) - self.label.setMinimumSize(QtCore.QSize(80, 0)) - self.label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) - self.label.setObjectName("label") - self.horizontalLayout.addWidget(self.label) - self.lineEdit_tel = QtWidgets.QLineEdit(self.widget) - self.lineEdit_tel.setObjectName("lineEdit_tel") - self.horizontalLayout.addWidget(self.lineEdit_tel) - self.verticalLayout_3.addWidget(self.widget) - self.widget_3 = QtWidgets.QWidget(self.scrollAreaWidgetContents) - self.widget_3.setStyleSheet("QWidget{\n" -" background-color:rgb(251,251,251);\n" -" border-radius: 10px;\n" -"}\n" -"\n" -"QPushButton{\n" -" background-color: rgb(250,252,253);\n" -" border-radius: 5px;\n" -" padding: 8px;\n" -" border-right: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-bottom: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-left: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -" border-top: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -"}\n" -"QPushButton:hover { \n" -" background-color: lightgray;\n" -"}") - self.widget_3.setObjectName("widget_3") - self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.widget_3) - self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.label_2 = QtWidgets.QLabel(self.widget_3) - self.label_2.setMinimumSize(QtCore.QSize(80, 0)) - self.label_2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) - self.label_2.setObjectName("label_2") - self.horizontalLayout_3.addWidget(self.label_2) - self.lineEdit_wx_alias = QtWidgets.QLineEdit(self.widget_3) - self.lineEdit_wx_alias.setObjectName("lineEdit_wx_alias") - self.horizontalLayout_3.addWidget(self.lineEdit_wx_alias) - self.verticalLayout_3.addWidget(self.widget_3) - self.widget_4 = QtWidgets.QWidget(self.scrollAreaWidgetContents) - self.widget_4.setStyleSheet("QWidget{\n" -" background-color:rgb(251,251,251);\n" -" border-radius: 10px;\n" -"}\n" -"\n" -"QPushButton{\n" -" background-color: rgb(250,252,253);\n" -" border-radius: 5px;\n" -" padding: 8px;\n" -" border-right: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-bottom: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-left: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -" border-top: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -"}\n" -"QPushButton:hover { \n" -" background-color: lightgray;\n" -"}") - self.widget_4.setObjectName("widget_4") - self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.widget_4) - self.horizontalLayout_4.setObjectName("horizontalLayout_4") - self.label_3 = QtWidgets.QLabel(self.widget_4) - self.label_3.setMinimumSize(QtCore.QSize(80, 0)) - self.label_3.setLayoutDirection(QtCore.Qt.LeftToRight) - self.label_3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) - self.label_3.setObjectName("label_3") - self.horizontalLayout_4.addWidget(self.label_3) - self.lineEdit_wx_name = QtWidgets.QLineEdit(self.widget_4) - self.lineEdit_wx_name.setObjectName("lineEdit_wx_name") - self.horizontalLayout_4.addWidget(self.lineEdit_wx_name) - self.verticalLayout_3.addWidget(self.widget_4) - self.btn_get_bias_addr = QtWidgets.QPushButton(self.scrollAreaWidgetContents) - self.btn_get_bias_addr.setObjectName("btn_get_bias_addr") - self.verticalLayout_3.addWidget(self.btn_get_bias_addr) - self.widget_2 = QtWidgets.QWidget(self.scrollAreaWidgetContents) - self.widget_2.setStyleSheet("QWidget{\n" -" background-color:rgb(251,251,251);\n" -" border-radius: 10px;\n" -"}\n" -"\n" -"QPushButton{\n" -" background-color: rgb(250,252,253);\n" -" border-radius: 5px;\n" -" padding: 8px;\n" -" border-right: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-bottom: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-left: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -" border-top: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -"}\n" -"QPushButton:hover { \n" -" background-color: lightgray;\n" -"}") - self.widget_2.setObjectName("widget_2") - self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget_2) - self.horizontalLayout_2.setContentsMargins(9, -1, -1, -1) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.commandLinkButton = QtWidgets.QCommandLinkButton(self.widget_2) - self.commandLinkButton.setEnabled(True) - self.commandLinkButton.setTabletTracking(False) - self.commandLinkButton.setFocusPolicy(QtCore.Qt.StrongFocus) - self.commandLinkButton.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu) - self.commandLinkButton.setToolTipDuration(-1) - self.commandLinkButton.setLayoutDirection(QtCore.Qt.LeftToRight) - self.commandLinkButton.setAutoFillBackground(False) - self.commandLinkButton.setCheckable(False) - self.commandLinkButton.setChecked(False) - self.commandLinkButton.setAutoRepeat(False) - self.commandLinkButton.setAutoExclusive(False) - self.commandLinkButton.setAutoDefault(False) - self.commandLinkButton.setDefault(False) - self.commandLinkButton.setObjectName("commandLinkButton") - self.horizontalLayout_2.addWidget(self.commandLinkButton) - spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_2.addItem(spacerItem) - self.label_error_log = QtWidgets.QLabel(self.widget_2) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.label_error_log.sizePolicy().hasHeightForWidth()) - self.label_error_log.setSizePolicy(sizePolicy) - self.label_error_log.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) - self.label_error_log.setObjectName("label_error_log") - self.horizontalLayout_2.addWidget(self.label_error_log) - self.checkBox_send_error_log = QtWidgets.QCheckBox(self.widget_2) - self.checkBox_send_error_log.setText("") - self.checkBox_send_error_log.setIconSize(QtCore.QSize(64, 64)) - self.checkBox_send_error_log.setChecked(True) - self.checkBox_send_error_log.setObjectName("checkBox_send_error_log") - self.horizontalLayout_2.addWidget(self.checkBox_send_error_log) - self.verticalLayout_3.addWidget(self.widget_2) - self.scrollArea.setWidget(self.scrollAreaWidgetContents) - self.verticalLayout.addWidget(self.scrollArea) - - self.retranslateUi(Form) - QtCore.QMetaObject.connectSlotsByName(Form) - - def retranslateUi(self, Form): - _translate = QtCore.QCoreApplication.translate - Form.setWindowTitle(_translate("Form", "Form")) - self.label_4.setText(_translate("Form", "为避免输入错误,下面信息请从微信里复制")) - self.label.setText(_translate("Form", "手机号:")) - self.lineEdit_tel.setPlaceholderText(_translate("Form", "填入微信绑定的手机号")) - self.label_2.setText(_translate("Form", "微信号:")) - self.lineEdit_wx_alias.setPlaceholderText(_translate("Form", "填入您的微信号")) - self.label_3.setText(_translate("Form", "微信昵称:")) - self.lineEdit_wx_name.setPlaceholderText(_translate("Form", "填入您的微信昵称")) - self.btn_get_bias_addr.setText(_translate("Form", "获取信息")) - self.commandLinkButton.setText(_translate("Form", "收集版本信息")) - self.commandLinkButton.setDescription(_translate("Form", "需要收集微信版本信息以支持更多用户")) - self.label_error_log.setText(_translate("Form", "开")) diff --git a/app/ui/tool/get_bias_addr/get_bias_addr.py b/app/ui/tool/get_bias_addr/get_bias_addr.py deleted file mode 100644 index 6d24763..0000000 --- a/app/ui/tool/get_bias_addr/get_bias_addr.py +++ /dev/null @@ -1,146 +0,0 @@ -import json -import os.path -from urllib.parse import urljoin - -import requests -from PyQt5.QtCore import pyqtSignal, QThread -from PyQt5.QtWidgets import QWidget, QMessageBox - -from app.components.QCursorGif import QCursorGif -from app.config import SERVER_API_URL -from app.decrypt.get_bias_addr import BiasAddr -from .getBiasAddrUi import Ui_Form - -Stylesheet = """ -QPushButton{ - background-color: rgb(250,252,253); - border-radius: 5px; - padding: 8px; - border-right: 2px solid #888888; /* 按钮边框,2px宽,白色 */ - border-bottom: 2px solid #888888; /* 按钮边框,2px宽,白色 */ - border-left: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */ - border-top: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */ -} -QPushButton:hover { - background-color: lightgray; -} -/*去掉item虚线边框*/ -QListWidget, QListView, QTreeWidget, QTreeView { - outline: 0px; - border:none; -} -/*设置左侧选项的最小最大宽度,文字颜色和背景颜色*/ -QListWidget { - min-width: 400px; - max-width: 400px; - min-height: 80px; - max-height: 80px; - color: black; - border:none; -} -QListWidget::item{ - min-width: 80px; - max-width: 400px; - min-height: 80px; - max-height: 80px; -} -/*被选中时的背景颜色和左边框颜色*/ -QListWidget::item:selected { - border-left:none; - color: black; - font-weight: bold; -} -QCheckBox::indicator { - background: rgb(251, 251, 251); - Width:60px; - Height:60px; - border-radius: 10px; -} -QCheckBox::indicator:unchecked{ - Width:60px; - Height:60px; - image: url(:/icons/icons/按钮_关闭.svg); -} -QCheckBox::indicator:checked{ - Width:60px; - Height:60px; - image: url(:/icons/icons/按钮_开启.svg); -} - -""" - - -class GetBiasAddrControl(QWidget, Ui_Form, QCursorGif): - biasAddrSignal = pyqtSignal(dict) - - def __init__(self, parent=None): - super(GetBiasAddrControl, self).__init__(parent) - self.thread = None - self.setStyleSheet(Stylesheet) - self.setupUi(self) - self.init_ui() - - def init_ui(self): - self.initCursor([':/icons/icons/Cursors/%d.png' % - i for i in range(8)], self) - self.setCursorTimeout(100) - self.btn_get_bias_addr.clicked.connect(self.get_bias_addr) - self.commandLinkButton.clicked.connect(self.show_info) - self.checkBox_send_error_log.clicked.connect(self.set_error_log) - - def set_error_log(self): - if self.checkBox_send_error_log.isChecked(): - self.label_error_log.setText('开') - else: - self.label_error_log.setText('关') - - def show_info(self): - QMessageBox.information(self, "收集版本信息", - "为了适配更多版本,需要收集微信的版本信息,该操作不会上传包括手机号、微信号、昵称等在内的任何信息\n示例数据:\n\"3.9.9.27\": [68065304, 0, 68065112, 0, 68066576]" - ) - - def upload(self, version_data): - url = urljoin(SERVER_API_URL, 'wxBiasAddr') - try: - requests.post(url, json={'bias_dict': version_data}) - print('版本信息上传成功') - except: - pass - - def get_bias_addr(self): - account = self.lineEdit_wx_alias.text() - mobile = self.lineEdit_tel.text() - name = self.lineEdit_wx_name.text() - if not all([account, mobile, name]): - QMessageBox.critical(self, "错误", - "请把所有信息填写完整") - return - key = None - db_path = "test" - self.startBusy() - self.thread = MyThread(account, mobile, name, key, db_path) - self.thread.signal.connect(self.set_bias_addr) - self.thread.start() - - def set_bias_addr(self, data): - if self.checkBox_send_error_log.isChecked(): - self.upload(data) - self.stopBusy() - self.biasAddrSignal.emit(data) - - -class MyThread(QThread): - signal = pyqtSignal(dict) - - def __init__(self, account, mobile, name, key, db_path): - super(MyThread, self).__init__() - self.account = account - self.mobile = mobile - self.name = name - self.key = key - self.db_path = db_path - - def run(self): - bias_addr = BiasAddr(self.account, self.mobile, self.name, self.key, self.db_path) - data = bias_addr.run(logging_path=True) - self.signal.emit(data) diff --git a/app/ui/tool/pc_decrypt/__init__.py b/app/ui/tool/pc_decrypt/__init__.py deleted file mode 100644 index ae1c618..0000000 --- a/app/ui/tool/pc_decrypt/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .pc_decrypt import DecryptControl - -__all__ = ['DecryptControl'] diff --git a/app/ui/tool/pc_decrypt/decryptUi.py b/app/ui/tool/pc_decrypt/decryptUi.py deleted file mode 100644 index b9edd2d..0000000 --- a/app/ui/tool/pc_decrypt/decryptUi.py +++ /dev/null @@ -1,206 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'decryptUi.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Dialog(object): - def setupUi(self, Dialog): - Dialog.setObjectName("Dialog") - Dialog.resize(611, 519) - font = QtGui.QFont() - font.setFamily("微软雅黑") - font.setPointSize(12) - Dialog.setFont(font) - Dialog.setLayoutDirection(QtCore.Qt.LeftToRight) - Dialog.setStyleSheet("QPushButton {\n" -" background: rgb(238,244,249);\n" -"}\n" -"QPushButton:hover{\n" -" background: rgb(230, 235, 240);\n" -"}") - self.verticalLayout_2 = QtWidgets.QVBoxLayout(Dialog) - self.verticalLayout_2.setObjectName("verticalLayout_2") - spacerItem = QtWidgets.QSpacerItem(20, 79, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout_2.addItem(spacerItem) - self.horizontalLayout_3 = QtWidgets.QHBoxLayout() - self.horizontalLayout_3.setObjectName("horizontalLayout_3") - spacerItem1 = QtWidgets.QSpacerItem(78, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_3.addItem(spacerItem1) - self.verticalLayout = QtWidgets.QVBoxLayout() - self.verticalLayout.setObjectName("verticalLayout") - self.horizontalLayout_4 = QtWidgets.QHBoxLayout() - self.horizontalLayout_4.setObjectName("horizontalLayout_4") - spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_4.addItem(spacerItem2) - self.btn_help = QtWidgets.QPushButton(Dialog) - self.btn_help.setMinimumSize(QtCore.QSize(0, 40)) - self.btn_help.setMaximumSize(QtCore.QSize(200, 16777215)) - self.btn_help.setStyleSheet("") - self.btn_help.setObjectName("btn_help") - self.horizontalLayout_4.addWidget(self.btn_help) - spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_4.addItem(spacerItem3) - self.verticalLayout.addLayout(self.horizontalLayout_4) - self.label_3 = QtWidgets.QLabel(Dialog) - font = QtGui.QFont() - font.setFamily("一纸情书") - font.setPointSize(20) - self.label_3.setFont(font) - self.label_3.setAlignment(QtCore.Qt.AlignCenter) - self.label_3.setObjectName("label_3") - self.verticalLayout.addWidget(self.label_3) - self.label_9 = QtWidgets.QLabel(Dialog) - self.label_9.setAlignment(QtCore.Qt.AlignCenter) - self.label_9.setObjectName("label_9") - self.verticalLayout.addWidget(self.label_9) - self.gridLayout = QtWidgets.QGridLayout() - self.gridLayout.setObjectName("gridLayout") - self.label = QtWidgets.QLabel(Dialog) - self.label.setObjectName("label") - self.gridLayout.addWidget(self.label, 0, 0, 1, 1) - self.label_pid = QtWidgets.QLabel(Dialog) - self.label_pid.setText("") - self.label_pid.setObjectName("label_pid") - self.gridLayout.addWidget(self.label_pid, 0, 1, 1, 1) - self.label_7 = QtWidgets.QLabel(Dialog) - self.label_7.setObjectName("label_7") - self.gridLayout.addWidget(self.label_7, 1, 0, 1, 1) - self.label_version = QtWidgets.QLabel(Dialog) - self.label_version.setText("") - self.label_version.setObjectName("label_version") - self.gridLayout.addWidget(self.label_version, 1, 1, 1, 1) - self.btn_getinfo = QtWidgets.QPushButton(Dialog) - self.btn_getinfo.setMinimumSize(QtCore.QSize(0, 40)) - self.btn_getinfo.setObjectName("btn_getinfo") - self.gridLayout.addWidget(self.btn_getinfo, 1, 2, 2, 1) - self.checkBox = QtWidgets.QCheckBox(Dialog) - self.checkBox.setText("") - self.checkBox.setCheckable(False) - self.checkBox.setObjectName("checkBox") - self.gridLayout.addWidget(self.checkBox, 1, 3, 2, 1) - self.label_2 = QtWidgets.QLabel(Dialog) - self.label_2.setObjectName("label_2") - self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1) - self.lineEdit_phone = QtWidgets.QLineEdit(Dialog) - self.lineEdit_phone.setStyleSheet("background:transparent;\n" -"\n" -" border-radius:5px;\n" -" border-top: 0px solid #b2e281;\n" -" border-bottom: 2px solid black;\n" -" border-right: 0px solid #b2e281;\n" -" border-left: 0px solid #b2e281;\n" -"\n" -"\n" -" border-style:outset\n" -" ") - self.lineEdit_phone.setFrame(False) - self.lineEdit_phone.setObjectName("lineEdit_phone") - self.gridLayout.addWidget(self.lineEdit_phone, 2, 1, 1, 1) - self.label_5 = QtWidgets.QLabel(Dialog) - self.label_5.setObjectName("label_5") - self.gridLayout.addWidget(self.label_5, 3, 0, 1, 1) - self.lineEdit_name = QtWidgets.QLineEdit(Dialog) - self.lineEdit_name.setStyleSheet("background:transparent;\n" -"\n" -" border-radius:5px;\n" -" border-top: 0px solid #b2e281;\n" -" border-bottom: 2px solid black;\n" -" border-right: 0px solid #b2e281;\n" -" border-left: 0px solid #b2e281;\n" -"\n" -"\n" -" border-style:outset\n" -" ") - self.lineEdit_name.setFrame(False) - self.lineEdit_name.setObjectName("lineEdit_name") - self.gridLayout.addWidget(self.lineEdit_name, 3, 1, 1, 1) - self.label_4 = QtWidgets.QLabel(Dialog) - self.label_4.setObjectName("label_4") - self.gridLayout.addWidget(self.label_4, 4, 0, 1, 1) - self.label_wxid = QtWidgets.QLabel(Dialog) - self.label_wxid.setText("") - self.label_wxid.setObjectName("label_wxid") - self.gridLayout.addWidget(self.label_wxid, 4, 1, 1, 1) - self.btn_db_dir = QtWidgets.QPushButton(Dialog) - self.btn_db_dir.setMinimumSize(QtCore.QSize(0, 40)) - self.btn_db_dir.setObjectName("btn_db_dir") - self.gridLayout.addWidget(self.btn_db_dir, 4, 2, 3, 1) - self.label_6 = QtWidgets.QLabel(Dialog) - self.label_6.setObjectName("label_6") - self.gridLayout.addWidget(self.label_6, 5, 0, 1, 1) - self.label_key = QtWidgets.QLabel(Dialog) - self.label_key.setMaximumSize(QtCore.QSize(400, 16777215)) - self.label_key.setText("") - self.label_key.setObjectName("label_key") - self.gridLayout.addWidget(self.label_key, 5, 1, 1, 1) - self.checkBox_2 = QtWidgets.QCheckBox(Dialog) - self.checkBox_2.setText("") - self.checkBox_2.setCheckable(False) - self.checkBox_2.setObjectName("checkBox_2") - self.gridLayout.addWidget(self.checkBox_2, 5, 3, 1, 1) - self.label_8 = QtWidgets.QLabel(Dialog) - self.label_8.setObjectName("label_8") - self.gridLayout.addWidget(self.label_8, 6, 0, 1, 1) - self.label_db_dir = QtWidgets.QLabel(Dialog) - self.label_db_dir.setMaximumSize(QtCore.QSize(400, 300)) - self.label_db_dir.setText("") - self.label_db_dir.setObjectName("label_db_dir") - self.gridLayout.addWidget(self.label_db_dir, 6, 1, 1, 1) - self.verticalLayout.addLayout(self.gridLayout) - self.horizontalLayout_2 = QtWidgets.QHBoxLayout() - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_2.addItem(spacerItem4) - self.btn_start = QtWidgets.QPushButton(Dialog) - self.btn_start.setMinimumSize(QtCore.QSize(80, 40)) - self.btn_start.setMaximumSize(QtCore.QSize(200, 16777215)) - self.btn_start.setObjectName("btn_start") - self.horizontalLayout_2.addWidget(self.btn_start) - spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_2.addItem(spacerItem5) - self.verticalLayout.addLayout(self.horizontalLayout_2) - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.label_ready = QtWidgets.QLabel(Dialog) - self.label_ready.setObjectName("label_ready") - self.horizontalLayout.addWidget(self.label_ready) - self.progressBar = QtWidgets.QProgressBar(Dialog) - self.progressBar.setProperty("value", 0) - self.progressBar.setObjectName("progressBar") - self.horizontalLayout.addWidget(self.progressBar) - self.verticalLayout.addLayout(self.horizontalLayout) - self.horizontalLayout_3.addLayout(self.verticalLayout) - spacerItem6 = QtWidgets.QSpacerItem(128, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_3.addItem(spacerItem6) - self.verticalLayout_2.addLayout(self.horizontalLayout_3) - spacerItem7 = QtWidgets.QSpacerItem(20, 79, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) - self.verticalLayout_2.addItem(spacerItem7) - - self.retranslateUi(Dialog) - QtCore.QMetaObject.connectSlotsByName(Dialog) - - def retranslateUi(self, Dialog): - _translate = QtCore.QCoreApplication.translate - Dialog.setWindowTitle(_translate("Dialog", "Dialog")) - self.btn_help.setText(_translate("Dialog", "使用说明")) - self.label_3.setText(_translate("Dialog", "解密数据库")) - self.label_9.setText(_translate("Dialog", "以下内容为自动获取,如获取失败请手动填写")) - self.label.setText(_translate("Dialog", "PID")) - self.label_7.setText(_translate("Dialog", "版本")) - self.btn_getinfo.setText(_translate("Dialog", "获取信息")) - self.label_2.setText(_translate("Dialog", "手机号")) - self.label_5.setText(_translate("Dialog", "微信昵称")) - self.label_4.setText(_translate("Dialog", "wxid")) - self.btn_db_dir.setText(_translate("Dialog", "设置微信路径")) - self.label_6.setText(_translate("Dialog", "密钥")) - self.label_8.setText(_translate("Dialog", "微信路径")) - self.btn_start.setText(_translate("Dialog", "开始启动")) - self.label_ready.setText(_translate("Dialog", "未就绪")) diff --git a/app/ui/tool/pc_decrypt/pc_decrypt.py b/app/ui/tool/pc_decrypt/pc_decrypt.py deleted file mode 100644 index 33533cf..0000000 --- a/app/ui/tool/pc_decrypt/pc_decrypt.py +++ /dev/null @@ -1,340 +0,0 @@ -import json -import os.path -import sys -import traceback -from urllib.parse import urljoin - -import requests -from PyQt5.QtCore import pyqtSignal, QThread, QUrl -from PyQt5.QtGui import QDesktopServices -from PyQt5.QtWidgets import QWidget, QMessageBox, QFileDialog - -from app.DataBase import msg_db, misc_db, close_db -from app.DataBase.merge import merge_databases, merge_MediaMSG_databases -from app.components.QCursorGif import QCursorGif -from app.config import INFO_FILE_PATH, DB_DIR, SERVER_API_URL -from app.decrypt import get_wx_info, decrypt -from app.log import logger -from app.util import path -from . import decryptUi -from ...Icon import Icon -from ...menu.about_dialog import Decrypt - - -class DecryptControl(QWidget, decryptUi.Ui_Dialog, QCursorGif): - DecryptSignal = pyqtSignal(bool) - get_wxidSignal = pyqtSignal(str) - versionErrorSignal = pyqtSignal(str) - - def __init__(self, parent=None): - super(DecryptControl, self).__init__(parent) - self.max_val = 0 - self.setupUi(self) - # 设置忙碌光标图片数组 - self.initCursor([':/icons/icons/Cursors/%d.png' % - i for i in range(8)], self) - self.setCursorTimeout(100) - self.version_list = None - self.btn_start.clicked.connect(self.decrypt) - self.btn_getinfo.clicked.connect(self.get_info) - self.btn_db_dir.clicked.connect(self.select_db_dir) - # self.lineEdit.returnPressed.connect(self.set_wxid) - # self.lineEdit.textChanged.connect(self.set_wxid_) - self.lineEdit_name.returnPressed.connect(self.set_wxid) - self.lineEdit_name.textChanged.connect(self.set_wxid_) - self.lineEdit_phone.returnPressed.connect(self.set_wxid) - self.lineEdit_phone.textChanged.connect(self.set_wxid_) - self.btn_help.clicked.connect(self.show_help) - self.btn_getinfo.setIcon(Icon.Get_info_Icon) - self.btn_db_dir.setIcon(Icon.Folder_Icon) - self.btn_start.setIcon(Icon.Start_Icon) - self.btn_help.setIcon(Icon.Help_Icon) - self.info = {} - self.lineEdit_name.setFocus() - self.ready = False - self.wx_dir = None - - def show_help(self): - # 定义网页链接 - url = QUrl("https://blog.lc044.love/post/4") - # 使用QDesktopServices打开网页 - QDesktopServices.openUrl(url) - - # @log - def get_info(self): - self.startBusy() - self.get_info_thread = MyThread(self.version_list) - self.get_info_thread.signal.connect(self.set_info) - self.get_info_thread.start() - - def set_info(self, result): - # print(result) - if result[0] == -1: - QMessageBox.critical(self, "错误", "请登录微信") - elif result[0] == -2: - self.versionErrorSignal.emit(result[1]) - QMessageBox.critical(self, "错误", - "微信版本不匹配\n请手动填写信息") - - elif result[0] == -3: - QMessageBox.critical(self, "错误", "WeChat WeChatWin.dll Not Found") - elif result[0] == -10086: - QMessageBox.critical(self, "错误", "未知错误,请收集错误信息") - else: - self.ready = True - self.info = result[0] - self.label_key.setText(self.info['key']) - self.label_wxid.setText(self.info['wxid']) - self.lineEdit_name.setText(self.info['name']) - self.lineEdit_phone.setText(self.info['mobile']) - self.label_pid.setText(str(self.info['pid'])) - self.label_version.setText(self.info['version']) - self.lineEdit_name.setFocus() - self.checkBox.setCheckable(True) - self.checkBox.setChecked(True) - self.get_wxidSignal.emit(self.info['wxid']) - directory = os.path.join(path.wx_path(), self.info['wxid']) - if os.path.exists(directory): - self.label_db_dir.setText(directory) - self.wx_dir = directory - self.checkBox_2.setCheckable(True) - self.checkBox_2.setChecked(True) - self.ready = True - if self.ready: - self.label_ready.setText('已就绪') - if self.wx_dir and os.path.exists(os.path.join(self.wx_dir)): - self.label_ready.setText('已就绪') - self.stopBusy() - - def set_wxid_(self): - if self.sender() == self.lineEdit_name: - self.info['name'] = self.lineEdit_name.text() - elif self.sender() == self.lineEdit_phone: - self.info['mobel'] = self.lineEdit_phone.text() - - def set_wxid(self): - if self.sender() == self.lineEdit_name: - self.info['name'] = self.lineEdit_name.text() - QMessageBox.information(self, "ok", f"昵称修改成功{self.info['name']}") - elif self.sender() == self.lineEdit_phone: - self.info['mobile'] = self.lineEdit_phone.text() - QMessageBox.information(self, "ok", f"手机号修改成功{self.info['mobile']}") - - def select_db_dir(self): - directory = QFileDialog.getExistingDirectory( - self, "选取微信文件保存目录——能看到Msg文件夹", - path.wx_path() - ) # 起始路径 - db_dir = os.path.join(directory, 'Msg') - if not os.path.exists(db_dir): - QMessageBox.critical(self, "错误", "文件夹选择错误\n一般以wxid_xxx结尾") - return - - self.label_db_dir.setText(directory) - self.wx_dir = directory - self.checkBox_2.setCheckable(True) - self.checkBox_2.setChecked(True) - if self.ready: - self.label_ready.setText('已就绪') - - def decrypt(self): - if not self.ready: - QMessageBox.critical(self, "错误", "请先获取信息") - return - if not self.wx_dir: - QMessageBox.critical(self, "错误", "请先选择微信安装路径") - return - if self.label_wxid.text() == 'None': - QMessageBox.critical(self, "错误", "请填入wxid") - return - db_dir = os.path.join(self.wx_dir, 'Msg') - if self.ready: - if not os.path.exists(db_dir): - QMessageBox.critical(self, "错误", "文件夹选择错误\n一般以wxid_xxx结尾") - return - if self.info.get('key') == 'None': - QMessageBox.critical(self, "错误", - "密钥错误\n请查看教程解决相关问题") - close_db() - self.thread2 = DecryptThread(db_dir, self.info['key']) - self.thread2.maxNumSignal.connect(self.setProgressBarMaxNum) - self.thread2.signal.connect(self.progressBar_view) - self.thread2.okSignal.connect(self.btnExitClicked) - self.thread2.errorSignal.connect( - lambda x: QMessageBox.critical(self, "错误", - "错误\n请检查微信版本是否为最新和微信路径是否正确\n或者关闭微信多开") - ) - self.thread2.start() - - def btnEnterClicked(self): - # print("enter clicked") - # 中间可以添加处理逻辑 - # QMessageBox.about(self, "解密成功", "数据库文件存储在app/DataBase/Msg文件夹下") - self.progressBar_view(self.max_val) - self.DecryptSignal.emit(True) - # self.close() - - def setProgressBarMaxNum(self, max_val): - self.max_val = max_val - self.progressBar.setRange(0, max_val) - - def progressBar_view(self, value): - """ - 进度条显示 - :param value: 进度0-100 - :return: None - """ - self.progressBar.setProperty('value', value) - # self.btnExitClicked() - # data.init_database() - - def btnExitClicked(self): - # print("Exit clicked") - dic = { - 'wxid': self.info['wxid'], - 'wx_dir': self.wx_dir, - 'name': self.info['name'], - 'mobile': self.info['mobile'], - 'token': Decrypt.decrypt(self.info['wxid']) - } - try: - with open(INFO_FILE_PATH, "w", encoding="utf-8") as f: - json.dump(dic, f, ensure_ascii=False, indent=4) - except: - with open('./info.json', 'w', encoding='utf-8') as f: - f.write(json.dumps(dic)) - self.progressBar_view(self.max_val) - self.DecryptSignal.emit(True) - self.close() - - -class DecryptThread(QThread): - signal = pyqtSignal(str) - maxNumSignal = pyqtSignal(int) - okSignal = pyqtSignal(str) - errorSignal = pyqtSignal(bool) - - def __init__(self, db_path, key): - super(DecryptThread, self).__init__() - self.db_path = db_path - self.key = key - self.textBrowser = None - - def __del__(self): - pass - - def run(self): - close_db() - output_dir = DB_DIR - os.makedirs(output_dir, exist_ok=True) - tasks = [] - if os.path.exists(self.db_path): - for root, dirs, files in os.walk(self.db_path): - for file in files: - if '.db' == file[-3:]: - if 'xInfo.db' == file: - continue - inpath = os.path.join(root, file) - # print(inpath) - output_path = os.path.join(output_dir, file) - tasks.append([self.key, inpath, output_path]) - else: - try: - name, suffix = file.split('.') - if suffix.startswith('db_SQLITE'): - inpath = os.path.join(root, file) - # print(inpath) - output_path = os.path.join(output_dir, name + '.db') - tasks.append([self.key, inpath, output_path]) - except: - continue - self.maxNumSignal.emit(len(tasks)) - for i, task in enumerate(tasks): - if decrypt.decrypt(*task) == -1: - self.errorSignal.emit(True) - self.signal.emit(str(i)) - # print(self.db_path) - # 目标数据库文件 - target_database = os.path.join(DB_DIR, 'MSG.db') - # 源数据库文件列表 - source_databases = [os.path.join(DB_DIR, f"MSG{i}.db") for i in range(1, 50)] - import shutil - if os.path.exists(target_database): - os.remove(target_database) - shutil.copy2(os.path.join(DB_DIR, 'MSG0.db'), target_database) # 使用一个数据库文件作为模板 - # 合并数据库 - merge_databases(source_databases, target_database) - - # 音频数据库文件 - target_database = os.path.join(DB_DIR, 'MediaMSG.db') - # 源数据库文件列表 - if os.path.exists(target_database): - os.remove(target_database) - source_databases = [os.path.join(DB_DIR, f"MediaMSG{i}.db") for i in range(1, 50)] - shutil.copy2(os.path.join(DB_DIR, 'MediaMSG0.db'), target_database) # 使用一个数据库文件作为模板 - - # 合并数据库 - merge_MediaMSG_databases(source_databases, target_database) - self.okSignal.emit('ok') - # self.signal.emit('100') - - -class MyThread(QThread): - signal = pyqtSignal(list) - - def __init__(self, version_list=None): - super(MyThread, self).__init__() - self.version_list = version_list - - def __del__(self): - pass - - def get_bias_add(self, version): - url = urljoin(SERVER_API_URL, 'wxBiasAddr') - data = { - 'version': version - } - try: - response = requests.get(url, json=data) - print(response) - print(response.text) - if response.status_code == 200: - update_info = response.json() - return update_info - else: - return {} - except: - return {} - - def run(self): - if self.version_list: - VERSION_LIST = self.version_list - else: - file_path = './app/resources/data/version_list.json' - if not os.path.exists(file_path): - resource_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__))) - file_path = os.path.join(resource_dir, 'app', 'resources', 'data', 'version_list.json') - with open(file_path, "r", encoding="utf-8") as f: - VERSION_LIST = json.loads(f.read()) - try: - result = get_wx_info.get_info(VERSION_LIST) - if result == -1: - result = [result] - elif result == -2: - result = [result] - elif result == -3: - result = [result] - elif isinstance(result, str): - version = result - # version = '3.9.9.43' - version_bias = self.get_bias_add(version) - if version_bias.get(version): - logger.info(f"从云端获取内存基址:{version_bias}") - result = get_wx_info.get_info(version_bias) - else: - logger.info(f"从云端获取内存基址失败:{version}") - result = [-2, version] - except: - logger.error(traceback.format_exc()) - result = [-10086] - self.signal.emit(result) diff --git a/app/ui/tool/setting/setting.py b/app/ui/tool/setting/setting.py deleted file mode 100644 index 26a7e59..0000000 --- a/app/ui/tool/setting/setting.py +++ /dev/null @@ -1,208 +0,0 @@ -import json -import os.path -import time - -import requests -from PyQt5.QtCore import pyqtSignal, QThread -from PyQt5.QtWidgets import QWidget, QMessageBox -from app.config import SEND_LOG_FLAG -from app.person import Me -from .settingUi import Ui_Form - -Stylesheet = """ -QPushButton{ - background-color: rgb(250,252,253); - border-radius: 5px; - padding: 8px; - border-right: 2px solid #888888; /* 按钮边框,2px宽,白色 */ - border-bottom: 2px solid #888888; /* 按钮边框,2px宽,白色 */ - border-left: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */ - border-top: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */ -} -QPushButton:hover { - background-color: lightgray; -} -/*去掉item虚线边框*/ -QListWidget, QListView, QTreeWidget, QTreeView { - outline: 0px; - border:none; -} -/*设置左侧选项的最小最大宽度,文字颜色和背景颜色*/ -QListWidget { - min-width: 400px; - max-width: 400px; - min-height: 80px; - max-height: 80px; - color: black; - border:none; -} -QListWidget::item{ - min-width: 80px; - max-width: 400px; - min-height: 80px; - max-height: 80px; -} -/*被选中时的背景颜色和左边框颜色*/ -QListWidget::item:selected { - border-left:none; - color: black; - font-weight: bold; -} -QCheckBox::indicator { - background: rgb(251, 251, 251); - Width:60px; - Height:60px; - border-radius: 10px; -} -QCheckBox::indicator:unchecked{ - Width:60px; - Height:60px; - image: url(:/icons/icons/按钮_关闭.svg); -} -QCheckBox::indicator:checked{ - Width:60px; - Height:60px; - image: url(:/icons/icons/按钮_开启.svg); -} - -""" - - -def set_SEND_LOG_FLAG(flag): - # noinspection PyGlobalUndefined - global SEND_LOG_FLAG - SEND_LOG_FLAG = flag - - -class SettingControl(QWidget, Ui_Form): - - def __init__(self, parent=None): - super(SettingControl, self).__init__(parent) - self.setStyleSheet(Stylesheet) - self.setupUi(self) - - self.btn_addstopword.clicked.connect(self.add_stopwords) - self.btn_addnewword_2.clicked.connect(self.add_new_words) - self.commandLinkButton_send_error_log.clicked.connect(self.show_info) - self.btn_send_error_log.clicked.connect(self.send_error_log) - self.init_ui() - self.read_data() - - def init_ui(self): - self.checkBox.setText('是') - self.checkBox_send_error_log.clicked.connect(self.set_error_log) - - def show_info(self): - QMessageBox.information(self, "收集错误信息", - "为了更好的解决用户问题,需要收集软件崩溃导致的错误信息,该操作不会上传包括手机号、微信号、昵称等在内的任何信息\n" - ) - - def set_error_log(self): - if self.checkBox_send_error_log.isChecked(): - self.label_error_log.setText('开') - set_SEND_LOG_FLAG(True) - else: - self.label_error_log.setText('关') - set_SEND_LOG_FLAG(False) - print('SEND_LOG_FLAG:', SEND_LOG_FLAG) - - def read_data(self): - os.makedirs('./app/data', exist_ok=True) - stopwords = ['裂开', '苦涩', '叹气', '凋谢', '让我看看', '酷', '奋斗', '疑问', '擦汗', '抠鼻', '鄙视', '勾引', - '奸笑', '嘿哈', '捂脸', '机智', '加油', '吃瓜', '尴尬', '炸弹', '旺柴'] - new_words = ['YYDS', '666', '显眼包', '遥遥领先'] - if os.path.exists('./app/data/stopwords.txt'): - with open('./app/data/stopwords.txt', 'r', encoding='utf-8') as f: - stopwords = set(f.read().splitlines()) - self.plainTextEdit.setPlainText(' '.join(stopwords)) - else: - self.plainTextEdit.setPlainText(' '.join(stopwords)) - stopwords = '\n'.join(stopwords) - with open('./app/data/stopwords.txt', 'w', encoding='utf-8') as f: - f.write(stopwords) - if os.path.exists('./app/data/new_words.txt'): - with open('./app/data/new_words.txt', 'r', encoding='utf-8') as f: - new_words = set(f.read().splitlines()) - self.plainTextEdit_newword.setPlainText(' '.join(new_words)) - else: - self.plainTextEdit_newword.setPlainText(' '.join(new_words)) - stopwords = '\n'.join(new_words) - with open('./app/data/new_words.txt', 'w', encoding='utf-8') as f: - f.write(stopwords) - - def add_stopwords(self): - text = self.plainTextEdit.toPlainText() - stopwords = '\n'.join(text.split()) - with open('./app/data/stopwords.txt', 'w', encoding='utf-8') as f: - f.write(stopwords) - QMessageBox.about(self, "添加成功", "停用词添加成功") - - def add_new_words(self): - text = self.plainTextEdit_newword.toPlainText() - new_words = '\n'.join(text.split()) - with open('./app/data/new_words.txt', 'w', encoding='utf-8') as f: - f.write(new_words) - QMessageBox.about(self, "添加成功", "自定义词添加成功") - - def send_error_log(self): - self.send_thread = MyThread() - self.send_thread.signal.connect(self.show_resp) - self.send_thread.start() - - def show_resp(self, message): - if message.get('code') == 200: - QMessageBox.about(self, "发送结果", f"日志发送成功\n{message.get('message')}") - else: - QMessageBox.about(self, "发送结果", f"{message.get('code')}:{message.get('errmsg')}") - - -class MyThread(QThread): - signal = pyqtSignal(dict) - - def __init__(self, message=''): - super(MyThread, self).__init__() - if message: - self.message = message - else: - filename = time.strftime("%Y-%m-%d", time.localtime(time.time())) - file_path = f'{filename}-log.log' - if os.path.exists(file_path): - with open(file_path, 'r', encoding='gbk') as f: - self.message = f.read() - elif os.path.exists(f'./app/log/logs/{filename}-log.log'): - with open(f'./app/log/logs/{filename}-log.log', 'r', encoding='gbk') as f: - self.message = f.read() - - def __del__(self): - pass - - def send_error_msg(self, message): - url = "http://api.lc044.love/error" - if not message: - return { - 'code': 201, - 'errmsg': '日志为空' - } - data = { - 'username': Me().wxid, - 'error': message - } - try: - response = requests.post(url, json=data) - if response.status_code == 200: - resp_info = response.json() - return resp_info - else: - return { - 'code': 503, - 'errmsg': '服务器错误' - } - except: - return { - 'code': 404, - 'errmsg': '客户端错误' - } - - def run(self): - resp_info = self.send_error_msg(self.message) - self.signal.emit(resp_info) diff --git a/app/ui/tool/setting/settingUi.py b/app/ui/tool/setting/settingUi.py deleted file mode 100644 index 93661b5..0000000 --- a/app/ui/tool/setting/settingUi.py +++ /dev/null @@ -1,204 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'settingUi.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Form(object): - def setupUi(self, Form): - Form.setObjectName("Form") - Form.resize(638, 696) - self.verticalLayout_6 = QtWidgets.QVBoxLayout(Form) - self.verticalLayout_6.setObjectName("verticalLayout_6") - self.scrollArea = QtWidgets.QScrollArea(Form) - self.scrollArea.setFrameShape(QtWidgets.QFrame.NoFrame) - self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn) - self.scrollArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.scrollArea.setWidgetResizable(True) - self.scrollArea.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) - self.scrollArea.setObjectName("scrollArea") - self.scrollAreaWidgetContents = QtWidgets.QWidget() - self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, -20, 595, 728)) - self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") - self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) - self.verticalLayout_3.setObjectName("verticalLayout_3") - self.widget = QtWidgets.QWidget(self.scrollAreaWidgetContents) - self.widget.setStyleSheet("QWidget{\n" -" background-color:rgb(251,251,251);\n" -" border-radius: 10px;\n" -"}\n" -"\n" -"QPushButton{\n" -" background-color: rgb(250,252,253);\n" -" border-radius: 5px;\n" -" padding: 8px;\n" -" border-right: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-bottom: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-left: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -" border-top: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -"}\n" -"QPushButton:hover { \n" -" background-color: lightgray;\n" -"}") - self.widget.setObjectName("widget") - self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.widget) - self.verticalLayout_4.setObjectName("verticalLayout_4") - self.verticalLayout = QtWidgets.QVBoxLayout() - self.verticalLayout.setObjectName("verticalLayout") - self.label = QtWidgets.QLabel(self.widget) - self.label.setObjectName("label") - self.verticalLayout.addWidget(self.label) - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.plainTextEdit = QtWidgets.QPlainTextEdit(self.widget) - self.plainTextEdit.setFrameShape(QtWidgets.QFrame.Box) - self.plainTextEdit.setFrameShadow(QtWidgets.QFrame.Sunken) - self.plainTextEdit.setObjectName("plainTextEdit") - self.horizontalLayout.addWidget(self.plainTextEdit) - self.btn_addstopword = QtWidgets.QPushButton(self.widget) - self.btn_addstopword.setObjectName("btn_addstopword") - self.horizontalLayout.addWidget(self.btn_addstopword) - self.verticalLayout.addLayout(self.horizontalLayout) - self.verticalLayout_4.addLayout(self.verticalLayout) - self.verticalLayout_3.addWidget(self.widget) - self.widget_3 = QtWidgets.QWidget(self.scrollAreaWidgetContents) - self.widget_3.setStyleSheet("QWidget{\n" -" background-color:rgb(251,251,251);\n" -" border-radius: 10px;\n" -"}\n" -"\n" -"QPushButton{\n" -" background-color: rgb(250,252,253);\n" -" border-radius: 5px;\n" -" padding: 8px;\n" -" border-right: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-bottom: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-left: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -" border-top: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -"}\n" -"QPushButton:hover { \n" -" background-color: lightgray;\n" -"}") - self.widget_3.setObjectName("widget_3") - self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.widget_3) - self.verticalLayout_5.setObjectName("verticalLayout_5") - self.verticalLayout_2 = QtWidgets.QVBoxLayout() - self.verticalLayout_2.setObjectName("verticalLayout_2") - self.label_2 = QtWidgets.QLabel(self.widget_3) - self.label_2.setObjectName("label_2") - self.verticalLayout_2.addWidget(self.label_2) - self.horizontalLayout_3 = QtWidgets.QHBoxLayout() - self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.plainTextEdit_newword = QtWidgets.QPlainTextEdit(self.widget_3) - self.plainTextEdit_newword.setFrameShape(QtWidgets.QFrame.Box) - self.plainTextEdit_newword.setFrameShadow(QtWidgets.QFrame.Sunken) - self.plainTextEdit_newword.setPlainText("") - self.plainTextEdit_newword.setObjectName("plainTextEdit_newword") - self.horizontalLayout_3.addWidget(self.plainTextEdit_newword) - self.btn_addnewword_2 = QtWidgets.QPushButton(self.widget_3) - self.btn_addnewword_2.setObjectName("btn_addnewword_2") - self.horizontalLayout_3.addWidget(self.btn_addnewword_2) - self.verticalLayout_2.addLayout(self.horizontalLayout_3) - self.verticalLayout_5.addLayout(self.verticalLayout_2) - self.verticalLayout_3.addWidget(self.widget_3) - self.widget_2 = QtWidgets.QWidget(self.scrollAreaWidgetContents) - self.widget_2.setStyleSheet("QWidget{\n" -" background-color:rgb(251,251,251);\n" -" border-radius: 10px;\n" -"}\n" -"\n" -"QPushButton{\n" -" background-color: rgb(250,252,253);\n" -" border-radius: 5px;\n" -" padding: 8px;\n" -" border-right: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-bottom: 2px solid #888888; /* 按钮边框,2px宽,白色 */\n" -" border-left: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -" border-top: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */\n" -"}\n" -"QPushButton:hover { \n" -" background-color: lightgray;\n" -"}") - self.widget_2.setObjectName("widget_2") - self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget_2) - self.horizontalLayout_2.setContentsMargins(9, -1, -1, -1) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.commandLinkButton_send_error_log = QtWidgets.QCommandLinkButton(self.widget_2) - self.commandLinkButton_send_error_log.setEnabled(True) - self.commandLinkButton_send_error_log.setTabletTracking(False) - self.commandLinkButton_send_error_log.setFocusPolicy(QtCore.Qt.StrongFocus) - self.commandLinkButton_send_error_log.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu) - self.commandLinkButton_send_error_log.setToolTipDuration(-1) - self.commandLinkButton_send_error_log.setLayoutDirection(QtCore.Qt.LeftToRight) - self.commandLinkButton_send_error_log.setAutoFillBackground(False) - self.commandLinkButton_send_error_log.setCheckable(False) - self.commandLinkButton_send_error_log.setChecked(False) - self.commandLinkButton_send_error_log.setAutoRepeat(False) - self.commandLinkButton_send_error_log.setAutoExclusive(False) - self.commandLinkButton_send_error_log.setAutoDefault(False) - self.commandLinkButton_send_error_log.setDefault(False) - self.commandLinkButton_send_error_log.setObjectName("commandLinkButton_send_error_log") - self.horizontalLayout_2.addWidget(self.commandLinkButton_send_error_log) - self.btn_send_error_log = QtWidgets.QPushButton(self.widget_2) - self.btn_send_error_log.setObjectName("btn_send_error_log") - self.horizontalLayout_2.addWidget(self.btn_send_error_log) - spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_2.addItem(spacerItem) - self.label_error_log = QtWidgets.QLabel(self.widget_2) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.label_error_log.sizePolicy().hasHeightForWidth()) - self.label_error_log.setSizePolicy(sizePolicy) - self.label_error_log.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) - self.label_error_log.setObjectName("label_error_log") - self.horizontalLayout_2.addWidget(self.label_error_log) - self.checkBox_send_error_log = QtWidgets.QCheckBox(self.widget_2) - self.checkBox_send_error_log.setText("") - self.checkBox_send_error_log.setIconSize(QtCore.QSize(64, 64)) - self.checkBox_send_error_log.setChecked(True) - self.checkBox_send_error_log.setObjectName("checkBox_send_error_log") - self.horizontalLayout_2.addWidget(self.checkBox_send_error_log) - self.verticalLayout_3.addWidget(self.widget_2) - self.checkBox_2 = QtWidgets.QCheckBox(self.scrollAreaWidgetContents) - self.checkBox_2.setObjectName("checkBox_2") - self.verticalLayout_3.addWidget(self.checkBox_2) - self.checkBox = QtWidgets.QCheckBox(self.scrollAreaWidgetContents) - self.checkBox.setObjectName("checkBox") - self.verticalLayout_3.addWidget(self.checkBox) - self.commandLinkButton_2 = QtWidgets.QCommandLinkButton(self.scrollAreaWidgetContents) - self.commandLinkButton_2.setCheckable(True) - self.commandLinkButton_2.setObjectName("commandLinkButton_2") - self.verticalLayout_3.addWidget(self.commandLinkButton_2) - self.radioButton = QtWidgets.QRadioButton(self.scrollAreaWidgetContents) - self.radioButton.setObjectName("radioButton") - self.verticalLayout_3.addWidget(self.radioButton) - self.scrollArea.setWidget(self.scrollAreaWidgetContents) - self.verticalLayout_6.addWidget(self.scrollArea) - - self.retranslateUi(Form) - QtCore.QMetaObject.connectSlotsByName(Form) - - def retranslateUi(self, Form): - _translate = QtCore.QCoreApplication.translate - Form.setWindowTitle(_translate("Form", "Form")) - self.label.setText(_translate("Form", "文本框里输入年度报告词云停用词,每个词之间用空格隔开")) - self.plainTextEdit.setPlainText(_translate("Form", "哈哈哈 发呆")) - self.btn_addstopword.setText(_translate("Form", "添加停用词")) - self.label_2.setText(_translate("Form", "文本框里输入年度报告词云自定义词,每个词之间用空格隔开")) - self.btn_addnewword_2.setText(_translate("Form", "添加自定义词")) - self.commandLinkButton_send_error_log.setText(_translate("Form", "收集错误日志")) - self.commandLinkButton_send_error_log.setDescription(_translate("Form", "收集错误信息以帮助改进")) - self.btn_send_error_log.setText(_translate("Form", "手动发送")) - self.label_error_log.setText(_translate("Form", "开")) - self.checkBox_2.setText(_translate("Form", "CheckBox")) - self.checkBox.setText(_translate("Form", "CheckBox")) - self.commandLinkButton_2.setText(_translate("Form", "CommandLinkButton")) - self.radioButton.setText(_translate("Form", "RadioButton")) diff --git a/app/ui/tool/toolUI.py b/app/ui/tool/toolUI.py deleted file mode 100644 index bc61f71..0000000 --- a/app/ui/tool/toolUI.py +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'toolUI.ui' -# -# Created by: PyQt5 UI code generator 5.15.7 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Dialog(object): - def setupUi(self, Dialog): - Dialog.setObjectName("Dialog") - Dialog.resize(590, 547) - font = QtGui.QFont() - font.setFamily("微软雅黑") - Dialog.setFont(font) - self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) - self.verticalLayout.setObjectName("verticalLayout") - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint) - self.horizontalLayout.setSpacing(0) - self.horizontalLayout.setObjectName("horizontalLayout") - self.label = QtWidgets.QLabel(Dialog) - self.label.setMaximumSize(QtCore.QSize(80, 80)) - self.label.setText("") - self.label.setObjectName("label") - self.horizontalLayout.addWidget(self.label) - self.listWidget = QtWidgets.QListWidget(Dialog) - self.listWidget.setMinimumSize(QtCore.QSize(100, 80)) - self.listWidget.setMaximumSize(QtCore.QSize(500, 80)) - self.listWidget.setFrameShape(QtWidgets.QFrame.NoFrame) - self.listWidget.setFrameShadow(QtWidgets.QFrame.Plain) - self.listWidget.setLineWidth(0) - self.listWidget.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.listWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.listWidget.setFlow(QtWidgets.QListView.LeftToRight) - self.listWidget.setObjectName("listWidget") - item = QtWidgets.QListWidgetItem() - self.listWidget.addItem(item) - item = QtWidgets.QListWidgetItem() - self.listWidget.addItem(item) - item = QtWidgets.QListWidgetItem() - self.listWidget.addItem(item) - item = QtWidgets.QListWidgetItem() - self.listWidget.addItem(item) - item = QtWidgets.QListWidgetItem() - self.listWidget.addItem(item) - self.horizontalLayout.addWidget(self.listWidget) - self.label_2 = QtWidgets.QLabel(Dialog) - self.label_2.setMaximumSize(QtCore.QSize(80, 80)) - self.label_2.setText("") - self.label_2.setObjectName("label_2") - self.horizontalLayout.addWidget(self.label_2) - self.verticalLayout.addLayout(self.horizontalLayout) - self.stackedWidget = QtWidgets.QStackedWidget(Dialog) - self.stackedWidget.setFrameShape(QtWidgets.QFrame.NoFrame) - self.stackedWidget.setFrameShadow(QtWidgets.QFrame.Raised) - self.stackedWidget.setObjectName("stackedWidget") - self.verticalLayout.addWidget(self.stackedWidget) - self.verticalLayout.setStretch(1, 1) - - self.retranslateUi(Dialog) - self.stackedWidget.setCurrentIndex(-1) - QtCore.QMetaObject.connectSlotsByName(Dialog) - - def retranslateUi(self, Dialog): - _translate = QtCore.QCoreApplication.translate - Dialog.setWindowTitle(_translate("Dialog", "Dialog")) - __sortingEnabled = self.listWidget.isSortingEnabled() - self.listWidget.setSortingEnabled(False) - item = self.listWidget.item(0) - item.setText(_translate("Dialog", "新建项目")) - item = self.listWidget.item(1) - item.setText(_translate("Dialog", "新建项目")) - item = self.listWidget.item(2) - item.setText(_translate("Dialog", "新建项目")) - item = self.listWidget.item(3) - item.setText(_translate("Dialog", "新建项目")) - item = self.listWidget.item(4) - item.setText(_translate("Dialog", "新建项目")) - self.listWidget.setSortingEnabled(__sortingEnabled) diff --git a/app/ui/tool/tool_window.py b/app/ui/tool/tool_window.py deleted file mode 100644 index 672975f..0000000 --- a/app/ui/tool/tool_window.py +++ /dev/null @@ -1,111 +0,0 @@ -from PyQt5.QtCore import Qt, pyqtSignal -from PyQt5.QtGui import QFont -from PyQt5.QtWidgets import QWidget, QListWidgetItem, QLabel - -from app.ui.Icon import Icon -from .pc_decrypt import DecryptControl -from .setting.setting import SettingControl -from .get_bias_addr.get_bias_addr import GetBiasAddrControl -from .toolUI import Ui_Dialog - -# 美化样式表 -Stylesheet = """ -QPushButton{ - background-color: rgb(250,252,253); - border-radius: 5px; - padding: 8px; - border-right: 2px solid #888888; /* 按钮边框,2px宽,白色 */ - border-bottom: 2px solid #888888; /* 按钮边框,2px宽,白色 */ - border-left: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */ - border-top: 1px solid #ffffff; /* 按钮边框,2px宽,白色 */ -} -QPushButton:hover { - background-color: lightgray; -} -/*去掉item虚线边框*/ -QListWidget, QListView, QTreeWidget, QTreeView { - outline: 0px; - border:none; -} -/*设置左侧选项的最小最大宽度,文字颜色和背景颜色*/ -QListWidget { - min-width: 400px; - max-width: 400px; - min-height: 80px; - max-height: 80px; - color: black; - border:none; -} -QListWidget::item{ - min-width: 80px; - max-width: 400px; - min-height: 80px; - max-height: 80px; -} -/*被选中时的背景颜色和左边框颜色*/ -QListWidget::item:selected { - border-left:none; - color: black; - font-weight: bold; -} - -""" - - -class ToolWindow(QWidget, Ui_Dialog): - get_info_signal = pyqtSignal(str) - decrypt_success_signal = pyqtSignal(bool) - load_finish_signal = pyqtSignal(bool) - - def __init__(self, parent=None): - super().__init__(parent) - self.setupUi(self) - self.setStyleSheet(Stylesheet) - self.init_ui() - self.load_finish_signal.emit(True) - - def init_ui(self): - self.listWidget.clear() - self.listWidget.currentRowChanged.connect(self.setCurrentIndex) - chat_item = QListWidgetItem(Icon.Decrypt_Icon, '解密', self.listWidget) - contact_item = QListWidgetItem(Icon.Contact_Icon, '设置', self.listWidget) - myinfo_item = QListWidgetItem(Icon.Home_Icon, '解密2', self.listWidget) - tool_item = QListWidgetItem(Icon.Home_Icon, '别点', self.listWidget) - - self.decrypt_window = DecryptControl() - self.decrypt_window.get_wxidSignal.connect(self.get_info_signal) - self.decrypt_window.DecryptSignal.connect(self.decrypt_success_signal) - self.decrypt_window.versionErrorSignal.connect(self.show_decrypt2) - self.stackedWidget.addWidget(self.decrypt_window) - - setting_window = SettingControl() - self.stackedWidget.addWidget(setting_window) - - self.get_bias_addr_window = GetBiasAddrControl() - self.get_bias_addr_window.biasAddrSignal.connect(self.decrypt) - self.stackedWidget.addWidget(self.get_bias_addr_window) - - label = QLabel('都说了不让你点', self) - label.setFont(QFont("微软雅黑", 50)) - label.setAlignment(Qt.AlignCenter) - # 设置label的背景颜色(这里随机) - # 这里加了一个margin边距(方便区分QStackedWidget和QLabel的颜色) - # label.setStyleSheet('background: rgb(%d, %d, %d);margin: 50px;' % ( - # randint(0, 255), randint(0, 255), randint(0, 255))) - - self.stackedWidget.addWidget(label) - self.listWidget.setCurrentRow(0) - self.stackedWidget.setCurrentIndex(0) - - def decrypt(self, version_list): - self.listWidget.setCurrentRow(0) - self.stackedWidget.setCurrentIndex(0) - self.decrypt_window.version_list = version_list - self.decrypt_window.get_info() - - def show_decrypt2(self, version): - self.listWidget.setCurrentRow(2) - self.stackedWidget.setCurrentIndex(2) - - def setCurrentIndex(self, row): - self.stackedWidget.setCurrentIndex(row) diff --git a/app/ui/update/update.py b/app/ui/update/update.py deleted file mode 100644 index 8644dca..0000000 --- a/app/ui/update/update.py +++ /dev/null @@ -1,11 +0,0 @@ -from app.ui.update.updateUi import Ui_Dialog -import shutil -from PyQt5.QtCore import QThread, pyqtSignal -from PyQt5.QtGui import QPixmap -from PyQt5.QtWidgets import QWidget, QMessageBox, QAction, QLineEdit - - -class UpdateControl(QWidget, Ui_Dialog): - def __init__(self, parent=None): - super().__init__(parent) - self.setupUi(self) \ No newline at end of file diff --git a/app/ui/update/updateUi.py b/app/ui/update/updateUi.py deleted file mode 100644 index df4464f..0000000 --- a/app/ui/update/updateUi.py +++ /dev/null @@ -1,52 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'updateUi.ui' -# -# Created by: PyQt5 UI code generator 5.15.10 -# -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt5 import QtCore, QtGui, QtWidgets - - -class Ui_Dialog(object): - def setupUi(self, Dialog): - Dialog.setObjectName("Dialog") - Dialog.resize(590, 547) - font = QtGui.QFont() - font.setFamily("微软雅黑") - Dialog.setFont(font) - self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) - self.verticalLayout.setObjectName("verticalLayout") - self.btn_report = QtWidgets.QPushButton(Dialog) - font = QtGui.QFont() - font.setFamily("微软雅黑") - font.setPointSize(30) - self.btn_report.setFont(font) - self.btn_report.setObjectName("btn_report") - self.verticalLayout.addWidget(self.btn_report) - self.progressBar = QtWidgets.QProgressBar(Dialog) - self.progressBar.setProperty("value", 0) - self.progressBar.setObjectName("progressBar") - self.verticalLayout.addWidget(self.progressBar) - self.horizontalLayout = QtWidgets.QHBoxLayout() - self.horizontalLayout.setObjectName("horizontalLayout") - self.btn_start_update = QtWidgets.QPushButton(Dialog) - self.btn_start_update.setObjectName("btn_start_update") - self.horizontalLayout.addWidget(self.btn_start_update) - self.btn_cancle = QtWidgets.QPushButton(Dialog) - self.btn_cancle.setObjectName("btn_cancle") - self.horizontalLayout.addWidget(self.btn_cancle) - self.verticalLayout.addLayout(self.horizontalLayout) - - self.retranslateUi(Dialog) - QtCore.QMetaObject.connectSlotsByName(Dialog) - - def retranslateUi(self, Dialog): - _translate = QtCore.QCoreApplication.translate - Dialog.setWindowTitle(_translate("Dialog", "Dialog")) - self.btn_report.setText(_translate("Dialog", "更新程序")) - self.btn_start_update.setText(_translate("Dialog", "开始更新")) - self.btn_cancle.setText(_translate("Dialog", "取消更新")) diff --git a/app/util/__init__.py b/app/util/__init__.py deleted file mode 100644 index ed49344..0000000 --- a/app/util/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .path import get_abs_path diff --git a/app/util/compress_content.py b/app/util/compress_content.py deleted file mode 100644 index f21af90..0000000 --- a/app/util/compress_content.py +++ /dev/null @@ -1,333 +0,0 @@ -import html -import xml.etree.ElementTree as ET - -import lz4.block - -import requests -import re -from urllib.parse import urlparse -from bs4 import BeautifulSoup - -from app.util.protocbuf.msg_pb2 import MessageBytesExtra -from ..util.file import get_file - - -def decompress_CompressContent(data): - """ - 解压缩Msg:CompressContent内容 - :param data: - :return: - """ - if data is None or not isinstance(data, bytes): - return "" - try: - dst = lz4.block.decompress(data, uncompressed_size=len(data) << 10) - decoded_string = dst.decode().replace("\x00", "") # Remove any null characters - except: - print( - "Decompression failed: potentially corrupt input or insufficient buffer size." - ) - return "" - return decoded_string - - -def escape_js_and_html(input_str): - if not input_str: - return "" - # 转义HTML特殊字符 - html_escaped = html.escape(input_str, quote=False) - - # 手动处理JavaScript转义字符 - js_escaped = ( - html_escaped.replace("\\", "\\\\") - .replace("'", r"\'") - .replace('"', r"\"") - .replace("\n", r"\n") - .replace("\r", r"\r") - .replace("\t", r"\t") - ) - - return js_escaped - - -def parser_reply(data: bytes): - xml_content = decompress_CompressContent(data) - if not xml_content: - return { - "type": 57, - "title": "发生错误", - "refer": { - "type": "1", - "content": "引用错误", - "displayname": "用户名", - }, - "is_error": True, - } - try: - root = ET.XML(xml_content) - appmsg = root.find("appmsg") - msg_type = int(appmsg.find("type").text) - title = appmsg.find("title").text - refermsg_content = appmsg.find("refermsg").find("content").text - refermsg_type = int(appmsg.find("refermsg").find("type").text) - refermsg_displayname = appmsg.find("refermsg").find("displayname").text - return { - "type": msg_type, - "title": title, - "refer": None - if refermsg_type != 1 - else { - "type": refermsg_type, - "content": refermsg_content.lstrip("\n"), - "displayname": refermsg_displayname, - }, - "is_error": False, - } - except: - return { - "type": 57, - "title": "发生错误", - "refer": { - "type": "1", - "content": "引用错误", - "displayname": "用户名", - }, - "is_error": True, - } - - -def music_share(data: bytes): - xml_content = decompress_CompressContent(data) - if not xml_content: - return {"type": 3, "title": "发生错误", "is_error": True} - try: - root = ET.XML(xml_content) - appmsg = root.find("appmsg") - msg_type = int(appmsg.find("type").text) - title = appmsg.find("title").text - if len(title) >= 39: - title = title[:38] + "..." - artist = appmsg.find("des").text - link_url = appmsg.find("url").text # 链接地址 - audio_url = get_audio_url(appmsg.find("dataurl").text) # 播放地址 - website_name = get_website_name(link_url) - return { - "type": msg_type, - "title": escape_js_and_html(title), - "artist": escape_js_and_html(artist), - "link_url": link_url, - "audio_url": audio_url, - "website_name": escape_js_and_html(website_name), - "is_error": False, - } - except Exception as e: - print(f"Music Share Error: {e}") - return {"type": 3, "title": "发生错误", "is_error": True} - - -def share_card(bytesExtra, compress_content_): - title, des, url, show_display_name, thumbnail, app_logo = "", "", "", "", "", "" - try: - xml = decompress_CompressContent(compress_content_) - root = ET.XML(xml) - appmsg = root.find("appmsg") - title = appmsg.find("title").text - try: - des = appmsg.find("des").text - except: - des = "" - url = appmsg.find("url").text - appinfo = root.find("appinfo") - show_display_name = appmsg.find("sourcedisplayname") - sourceusername = appmsg.find("sourceusername") - if show_display_name is not None: - show_display_name = show_display_name.text - else: - if appinfo is not None: - show_display_name = appinfo.find("appname").text - msg_bytes = MessageBytesExtra() - msg_bytes.ParseFromString(bytesExtra) - app_logo = "" - thumbnail = "" - for tmp in msg_bytes.message2: - if tmp.field1 == 3: - thumbnail = tmp.field2 - thumbnail = "\\".join(thumbnail.split("\\")[1:]) - if tmp.field2 == 4: - app_logo = tmp.field2 - app_logo = "\\".join(app_logo.split("\\")[1:]) - if sourceusername is not None: - from app.DataBase import micro_msg_db # 放上面会导致循环依赖 - - contact = micro_msg_db.get_contact_by_username(sourceusername.text) - if contact: - app_logo = contact[7] - finally: - return { - "title": escape_js_and_html(title), - "description": escape_js_and_html(des), - "url": escape_js_and_html(url), - "app_name": escape_js_and_html(show_display_name), - "thumbnail": thumbnail, - "app_logo": app_logo, - } - - -def transfer_decompress(compress_content_): - """ - return dict - feedesc: 钱数,str类型,包含一个前缀币种符号(除人民币¥之外未测试); - pay_memo: 转账备注; - receiver_username: 接受转账人的 wxid; (因为电脑上只有私聊页面会显示收款所以这个字段没有也罢,不要轻易使用,因为可能为空) - paysubtype: int 类型,1 为发出转账,3 为接受转账,4 为退还转账; - """ - feedesc, pay_memo, receiver_username, paysubtype = "", "", "", "" - try: - xml = decompress_CompressContent(compress_content_) - root = ET.XML(xml) - appmsg = root.find("appmsg") - wcpayinfo = appmsg.find("wcpayinfo") - paysubtype = int(wcpayinfo.find("paysubtype").text) - feedesc = wcpayinfo.find("feedesc").text - pay_memo = wcpayinfo.find("pay_memo").text - receiver_username = wcpayinfo.find("receiver_username").text - finally: - return { - "feedesc": feedesc, - "pay_memo": escape_js_and_html(pay_memo), - "receiver_username": receiver_username, - "paysubtype": paysubtype, - } - - -def call_decompress(is_send, bytes_extra, display_content, str_content): # 音视频通话 - """ - return dict - call_type: int 类型,0 为视频,1为语音; (返回为 2 是未知错误) - display_content: str 类型,页面显示的话; - """ - call_type = 2 - call_length = 0 - msg_bytes = MessageBytesExtra() - msg_bytes.ParseFromString(bytes_extra) - # message2 字段 1: 发送人wxid; 字段 3: "1"是语音,"0"是视频; 字段 4: 通话时长 - for i in msg_bytes.message2: - if i.field1 == 3: - call_type = int(i.field2) - elif i.field1 == 4: - call_length = int(i.field2) - - try: - if display_content == "": - if str_content == "11": - h, m, s = ( - call_length // 3600, - (call_length % 3600) // 60, - call_length % 60, - ) - display_content = f"通话时长 {f'{h:02d}:' if h else ''}{m:02d}:{s:02d}" - else: - display_content = { - "5": ("" if is_send else "对方") + "已取消", - "8": ("对方" if is_send else "") + "已拒绝", - "7": "已在其他设备接听", - "12": "已在其他设备拒绝", - }[str_content] - except KeyError: - display_content = "未知类型,您可以把这条消息对应的微信界面消息反馈给我们" - - return { - "call_type": call_type, - "display_content": display_content, - } - - -def get_website_name(url): - parsed_url = urlparse(url) - domain = f"{parsed_url.scheme}://{parsed_url.netloc}" - website_name = "" - try: - response = requests.get(domain, allow_redirects=False) - if response.status_code == 200: - soup = BeautifulSoup(response.content, "html.parser") - website_name = soup.title.string.strip() - elif response.status_code == 302: - domain = response.headers["Location"] - response = requests.get(domain, allow_redirects=False) - soup = BeautifulSoup(response.content, "html.parser") - website_name = soup.title.string.strip() - else: - response = requests.get(url, allow_redirects=False) - if response.status_code == 200: - soup = BeautifulSoup(response.content, "html.parser") - website_name = soup.title.string.strip() - index = website_name.find("-") - if index != -1: # 如果找到了 "-" - website_name = website_name[index + 1 :].strip() - except Exception as e: - print(f"Get Website Info Error: {e}") - return website_name - - -def get_audio_url(url): - path = "" - try: - response = requests.get(url, allow_redirects=False) - # 检查响应状态码 - if response.status_code == 302: - path = response.headers["Location"] - elif response.status_code == 200: - print("音乐文件已失效,url:" + url) - else: - print("音乐文件地址获取失败,url:" + url + ",状态码" + str(response.status_code)) - except Exception as e: - print(f"Get Audio Url Error: {e}") - return path - - -def file(bytes_extra, compress_content, output_path): - xml_content = decompress_CompressContent(compress_content) - if not xml_content: - return {"type": 6, "title": "发生错误", "is_error": True} - try: - root = ET.XML(xml_content) - appmsg = root.find("appmsg") - msg_type = int(appmsg.find("type").text) - file_name = appmsg.find("title").text - pattern = r'[\\/:*?"<>|\r\n]+' - file_name = re.sub(pattern, "_", file_name) - appattach = appmsg.find("appattach") - file_len = int(appattach.find("totallen").text) - app_name = "" - file_len = format_bytes(file_len) - file_ext = appattach.find("fileext").text - if root.find("appinfo") is not None: - app_info = root.find("appinfo") - app_name = app_info.find("appname").text - if app_name is None: - app_name = "" - file_path = get_file(bytes_extra, file_name, output_path) - return { - "type": msg_type, - "file_name": escape_js_and_html(file_name), - "file_len": file_len, - "file_ext": file_ext, - "file_path": file_path, - "app_name": escape_js_and_html(app_name), - "is_error": False, - } - except Exception as e: - print(f"File Get Info Error: {e}") - return {"type": 6, "title": "发生错误", "is_error": True} - - -def format_bytes(size): - units = ["B", "KB", "MB", "GB"] - - def convert_bytes(size, unit_index): - if size < 1024 or unit_index >= len(units) - 1: - return size, unit_index - return convert_bytes(size / 1024, unit_index + 1) - - final_size, final_unit_index = convert_bytes(size, 0) - return f"{final_size:.2f} {units[final_unit_index]}" diff --git a/app/util/emoji.py b/app/util/emoji.py deleted file mode 100644 index 5939b3a..0000000 --- a/app/util/emoji.py +++ /dev/null @@ -1,318 +0,0 @@ -# -*- coding: utf-8 -*- -""" -emoji.py - -!!!声明: -由于表情包并不属于个人,并且其可能具有版权风险,你只有浏览权没有拥有权 -另外访问腾讯API可能会给腾讯服务器造成压力 -所以禁止任何人以任何方式修改或间接修改该文件,违者后果自负 -""" - -import os -import re -import traceback -import xml.etree.ElementTree as ET -import sqlite3 -import threading -from PyQt5.QtGui import QPixmap -import requests - -from app.log import log, logger - -lock = threading.Lock() -db_path = "./app/Database/Msg/Emotion.db" -root_path = "./data/emoji/" -if not os.path.exists("./data"): - os.mkdir("./data") -if not os.path.exists(root_path): - os.mkdir(root_path) - - -@log -def get_image_format(header): - # 定义图片格式的 magic numbers - image_formats = { - b"\xFF\xD8\xFF": "jpeg", - b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A": "png", - b"\x47\x49\x46": "gif", - b"\x42\x4D": "bmp", - # 添加其他图片格式的 magic numbers - } - # 判断文件的图片格式 - for magic_number, image_format in image_formats.items(): - if header.startswith(magic_number): - return image_format - # 如果无法识别格式,返回 None - return None - - -@log -def parser_xml(xml_string): - assert type(xml_string) == str - # Parse the XML string - try: - root = ET.fromstring(xml_string) - except: - res = re.search('<msg>.*</msg>', xml_string) - if res: - xml_string = res.group() - root = ET.fromstring(xml_string.replace("&", "&")) - emoji = root.find("./emoji") - # Accessing attributes of the 'emoji' element - fromusername = emoji.get("fromusername") - tousername = emoji.get("tousername") - md5 = emoji.get("md5") - cdnurl = emoji.get("cdnurl") - encrypturl = emoji.get("encrypturl") - thumburl = emoji.get("thumburl") - externurl = emoji.get("externurl") - androidmd5 = emoji.get("androidmd5") - width = emoji.get("width") - height = emoji.get("height") - return { - "width": width, - "height": height, - "cdnurl": cdnurl, - "thumburl": thumburl if thumburl else cdnurl, - "md5": (md5 if md5 else androidmd5).lower(), - } - - -def singleton(cls): - _instance = {} - - def inner(): - if cls not in _instance: - _instance[cls] = cls() - return _instance[cls] - - return inner - - -# 一定要保证只有一个实例对象 -@singleton -class Emotion: - def __init__(self): - self.DB = None - self.cursor: sqlite3.Cursor = None - self.open_flag = False - self.init_database() - - def init_database(self): - if not self.open_flag: - if os.path.exists(db_path): - self.DB = sqlite3.connect(db_path, check_same_thread=False) - # '''创建游标''' - self.cursor = self.DB.cursor() - self.open_flag = True - if lock.locked(): - lock.release() - - def get_emoji_url(self, md5: str, thumb: bool) -> str | bytes: - """供下载用,返回可能是url可能是bytes""" - if thumb: - sql = """ - select - case - when thumburl is NULL or thumburl = '' then cdnurl - else thumburl - end as selected_url - from CustomEmotion - where md5 = ? - """ - else: - sql = """ - select CDNUrl - from CustomEmotion - where md5 = ? - """ - try: - lock.acquire(True) - self.cursor.execute(sql, [md5]) - return self.cursor.fetchone()[0] - except: - md5 = md5.upper() - sql = f""" - select {"Thumb" if thumb else "Data"} - from EmotionItem - where md5 = ? - """ - self.cursor.execute(sql, [md5]) - res = self.cursor.fetchone() - return res[0] if res else "" - finally: - lock.release() - - def get_emoji_URL(self, md5: str, thumb: bool): - """只管url,另外的不管""" - if thumb: - sql = """ - select - case - when thumburl is NULL or thumburl = '' then cdnurl - else thumburl - end as selected_url - from CustomEmotion - where md5 = ? - """ - else: - sql = """ - select CDNUrl - from CustomEmotion - where md5 = ? - """ - try: - lock.acquire(True) - self.cursor.execute(sql, [md5]) - return self.cursor.fetchone()[0] - except: - return "" - finally: - lock.release() - - def close(self): - if self.open_flag: - try: - lock.acquire(True) - self.open_flag = False - self.DB.close() - finally: - lock.release() - - def __del__(self): - self.close() - - -@log -def download(url, output_dir, name, thumb=False): - resp = requests.get(url) - byte = resp.content - image_format = get_image_format(byte[:8]) - if image_format: - if thumb: - output_path = os.path.join(output_dir, "th_" + name + "." + image_format) - else: - output_path = os.path.join(output_dir, name + "." + image_format) - else: - output_path = os.path.join(output_dir, name) - with open(output_path, "wb") as f: - f.write(resp.content) - return output_path - - -def get_most_emoji(messages): - dic = {} - for msg in messages: - str_content = msg[7] - emoji_info = parser_xml(str_content) - if emoji_info is None: - continue - md5 = emoji_info["md5"] - if not md5: - continue - try: - dic[md5][0] += 1 - except: - dic[md5] = [1, emoji_info] - md5_nums = [(num[0], key, num[1]) for key, num in dic.items()] - md5_nums.sort(key=lambda x: x[0], reverse=True) - if not md5_nums: - return "", 0 - md5 = md5_nums[0][1] - num = md5_nums[0][0] - emoji_info = md5_nums[0][2] - url = emoji_info["cdnurl"] - if not url or url == "": - url = Emotion().get_emoji_url(md5, False) - return url, num - - -def get_emoji(xml_string, thumb=True, output_path=root_path) -> str: - """供下载用""" - try: - emoji_info = parser_xml(xml_string) - md5 = emoji_info["md5"] - image_format = [".png", ".gif", ".jpeg"] - for f in image_format: - prefix = "th_" if thumb else "" - file_path = os.path.join(output_path, prefix + md5 + f) - if os.path.exists(file_path): - return file_path - url = emoji_info["thumburl"] if thumb else emoji_info["cdnurl"] - if not url or url == "": - url = Emotion().get_emoji_url(md5, thumb) - if type(url) == str and url != "": - print("下载表情包ing:", url) - emoji_path = download(url, output_path, md5, thumb) - return emoji_path - elif type(url) == bytes: - image_format = get_image_format(url[:8]) - if image_format: - if thumb: - output_path = os.path.join( - output_path, "th_" + md5 + "." + image_format - ) - else: - output_path = os.path.join(output_path, md5 + "." + image_format) - else: - output_path = os.path.join(output_path, md5) - with open(output_path, "wb") as f: - f.write(url) - print("表情包数据库加载", output_path) - return output_path - else: - print("!!!未知表情包数据,信息:", xml_string, emoji_info, url) - output_path = os.path.join(output_path, "404.png") - if not os.path.exists(output_path): - QPixmap(":/icons/icons/404.png").save(output_path) - return output_path - except: - logger.error(traceback.format_exc()) - output_path = os.path.join(output_path, "404.png") - if not os.path.exists(output_path): - QPixmap(":/icons/icons/404.png").save(output_path) - return output_path - - -def get_emoji_path(xml_string, thumb=True, output_path=root_path) -> str: - try: - emoji_info = parser_xml(xml_string) - md5 = emoji_info["md5"] - image_format = [".png", ".gif", ".jpeg"] - for f in image_format: - prefix = "th_" if thumb else "" - file_path = os.path.join(output_path, prefix + md5 + f) - return file_path - except: - logger.error(traceback.format_exc()) - output_path = os.path.join(output_path, "404.png") - return output_path - - -def get_emoji_url(xml_string, thumb=True) -> str: - """不管下载,只返回url""" - try: - emoji_info = parser_xml(xml_string) - md5 = emoji_info["md5"] - url = emoji_info["thumburl" if thumb else "cdnurl"] - if not url or url == "": - url = Emotion().get_emoji_URL(md5=md5, thumb=thumb) - return url - except: - logger.error(traceback.format_exc()) - output_path = os.path.join("./emoji/404.png") - return output_path - - -if __name__ == "__main__": - # xml_string = '<msg><emoji fromusername = "wxid_0o18ef858vnu22" tousername = "wxid_27hqbq7vx5hf22" type="2" idbuffer="media:0_0" md5="71ce49ed3ce9e57e43e07f802983bf45" len = "352588" productid="com.tencent.xin.emoticon.person.stiker_1678703862259eb01f2ef4a313" androidmd5="71ce49ed3ce9e57e43e07f802983bf45" androidlen="352588" s60v3md5 = "71ce49ed3ce9e57e43e07f802983bf45" s60v3len="352588" s60v5md5 = "71ce49ed3ce9e57e43e07f802983bf45" s60v5len="352588" cdnurl = "http://wxapp.tc.qq.com/262/20304/stodownload?m=71ce49ed3ce9e57e43e07f802983bf45&filekey=30350201010421301f020201060402535a041071ce49ed3ce9e57e43e07f802983bf45020305614c040d00000004627466730000000132&hy=SZ&storeid=263ffa00b000720d03274c5820000010600004f50535a1ca0c950b64287022&bizid=1023" designerid = "" thumburl = "http://mmbiz.qpic.cn/mmemoticon/ajNVdqHZLLDSKTMRgM8agiadpFhKz9IJ3cD5Ra2sTROibOaShdt3D4z6PfE92WkjQY/0" encrypturl = "http://wxapp.tc.qq.com/262/20304/stodownload?m=cbaae1d847aac6389652b65562bacaa2&filekey=30350201010421301f020201060402535a0410cbaae1d847aac6389652b65562bacaa20203056150040d00000004627466730000000132&hy=SZ&storeid=263ffa00b0008d8223274c5820000010600004f50535a17b82910b64764739&bizid=1023" aeskey= "7051ab2a34442dec63434832463f45ce" externurl = "http://wxapp.tc.qq.com/262/20304/stodownload?m=960f68693454dfa64b9966ca5d70dbd3&filekey=30340201010420301e020201060402535a0410960f68693454dfa64b9966ca5d70dbd3020221a0040d00000004627466730000000132&hy=SZ&storeid=26423dbe3000793a8720e40de0000010600004f50535a1d40c950b71be0a50&bizid=1023" externmd5 = "41895664fc5a77878e2155fc96209a19" width= "240" height= "240" tpurl= "" tpauthkey= "" attachedtext= "" attachedtextcolor= "" lensid= "" emojiattr= "" linkid= "" desc= "ChEKB2RlZmF1bHQSBuWNlee6rw==" ></emoji> </msg>' - # res1 = parser_xml(xml_string) - # print(res1, res1['md5']) - # download(res1['cdnurl'], "./data/emoji/", res1['md5']) - # download(res1['thumburl'], "./data/emoji/", res1['md5'], True) - # print(Emotion().get_emoji_url("144714f65c98844128ac3a1042445d9a", True)) - # print(Emotion().get_emoji_url("144714f65c98844128ac3a1042445d9a", False)) - print(parser_xml("")) - # print(get_emoji(xml_string, True)) - # print(get_emoji(xml_string, False)) -# http://vweixinf.tc.qq.com/110/20403/stodownload?m=3a4d439aba02dce4834b2c54e9f15597&filekey=3043020101042f302d02016e0402534804203361346434333961626130326463653438333462326335346539663135353937020213f0040d00000004627466730000000131&hy=SH&storeid=323032313037323030373236313130303039653236646365316535316534383236386234306230303030303036653033303034666233&ef=3&bizid=1022 diff --git a/app/util/exporter/__init__.py b/app/util/exporter/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/app/util/exporter/exporter.py b/app/util/exporter/exporter.py deleted file mode 100644 index d74d33e..0000000 --- a/app/util/exporter/exporter.py +++ /dev/null @@ -1,176 +0,0 @@ -import csv -import html -import os -import shutil -import sys - -import filecmp - -from PyQt5.QtCore import pyqtSignal, QThread - -from app.config import OUTPUT_DIR -from app.person import Me, Contact - -os.makedirs(os.path.join(OUTPUT_DIR, '聊天记录'), exist_ok=True) - - -def set_global_font(doc, font_name): - # 创建一个新样式 - style = doc.styles['Normal'] - - # 设置字体名称 - style.font.name = font_name - # 遍历文档中的所有段落,将样式应用到每个段落 - for paragraph in doc.paragraphs: - for run in paragraph.runs: - run.font.name = font_name - - -def makedirs(path): - os.makedirs(path, exist_ok=True) - os.makedirs(os.path.join(path, 'image'), exist_ok=True) - os.makedirs(os.path.join(path, 'emoji'), exist_ok=True) - os.makedirs(os.path.join(path, 'video'), exist_ok=True) - os.makedirs(os.path.join(path, 'voice'), exist_ok=True) - os.makedirs(os.path.join(path, 'file'), exist_ok=True) - os.makedirs(os.path.join(path, 'avatar'), exist_ok=True) - os.makedirs(os.path.join(path, 'music'), exist_ok=True) - os.makedirs(os.path.join(path, 'icon'), exist_ok=True) - resource_dir = os.path.join('app', 'resources', 'data', 'icons') - if not os.path.exists(resource_dir): - # 获取打包后的资源目录 - resource_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__))) - # 构建 FFmpeg 可执行文件的路径 - resource_dir = os.path.join(resource_dir, 'app', 'resources', 'data', 'icons') - target_folder = os.path.join(path, 'icon') - # 拷贝一些必备的图标 - for root, dirs, files in os.walk(resource_dir): - relative_path = os.path.relpath(root, resource_dir) - target_path = os.path.join(target_folder, relative_path) - - # 遍历文件夹中的文件 - for file in files: - source_file_path = os.path.join(root, file) - target_file_path = os.path.join(target_path, file) - if not os.path.exists(target_file_path): - shutil.copy(source_file_path, target_file_path) - else: - # 比较文件内容 - if not filecmp.cmp(source_file_path, target_file_path, shallow=False): - # 文件内容不一致,进行覆盖拷贝 - shutil.copy(source_file_path, target_file_path) - - -def escape_js_and_html(input_str): - if not input_str: - return '' - # 转义HTML特殊字符 - html_escaped = html.escape(input_str, quote=False) - - # 手动处理JavaScript转义字符 - js_escaped = ( - html_escaped - .replace("\\", "\\\\") - .replace("'", r"\'") - .replace('"', r'\"') - .replace("\n", r'\n') - .replace("\r", r'\r') - .replace("\t", r'\t') - ) - - return js_escaped - - -class ExporterBase(QThread): - progressSignal = pyqtSignal(int) - rangeSignal = pyqtSignal(int) - okSignal = pyqtSignal(int) - i = 1 - CSV = 0 - DOCX = 1 - HTML = 2 - CSV_ALL = 3 - CONTACT_CSV = 4 - TXT = 5 - - def __init__(self, contact, type_=DOCX, message_types={}, time_range=None, messages=None,index=0, parent=None): - super().__init__(parent) - self.message_types = message_types # 导出的消息类型 - self.contact: Contact = contact # 联系人 - self.output_type = type_ # 导出文件类型 - self.total_num = 1 # 总的消息数量 - self.num = 0 # 当前处理的消息数量 - self.index = index # - self.last_timestamp = 0 - self.time_range = time_range - self.messages = messages - self.origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - makedirs(self.origin_path) - - def run(self): - self.export() - - def export(self): - raise NotImplementedError("export method must be implemented in subclasses") - - def cancel(self): - self.requestInterruption() - - def is_5_min(self, timestamp) -> bool: - if abs(timestamp - self.last_timestamp) > 300: - self.last_timestamp = timestamp - return True - return False - - def get_avatar_path(self, is_send, message, is_absolute_path=False) -> str: - if is_absolute_path: - if self.contact.is_chatroom: - avatar = message[13].avatar_path - else: - avatar = Me().avatar_path if is_send else self.contact.avatar_path - else: - if self.contact.is_chatroom: - avatar = message[13].smallHeadImgUrl - else: - avatar = Me().smallHeadImgUrl if is_send else self.contact.smallHeadImgUrl - return avatar - - def get_display_name(self, is_send, message) -> str: - if self.contact.is_chatroom: - if is_send: - display_name = Me().name - else: - display_name = message[13].remark - else: - display_name = Me().name if is_send else self.contact.remark - return escape_js_and_html(display_name) - - def text(self, doc, message): - return - - def image(self, doc, message): - return - - def audio(self, doc, message): - return - - def emoji(self, doc, message): - return - - def file(self, doc, message): - return - - def refermsg(self, doc, message): - return - - def system_msg(self, doc, message): - return - - def video(self, doc, message): - return - - def music_share(self, doc, message): - return - - def share_card(self, doc, message): - return diff --git a/app/util/exporter/exporter_ai_txt.py b/app/util/exporter/exporter_ai_txt.py deleted file mode 100644 index 2106c38..0000000 --- a/app/util/exporter/exporter_ai_txt.py +++ /dev/null @@ -1,96 +0,0 @@ -import os -import re - -from app.DataBase import msg_db -from app.util.compress_content import parser_reply, share_card -from app.util.exporter.exporter import ExporterBase - - -def remove_privacy_info(text): - # 正则表达式模式 - patterns = { - 'phone': r'\b(\+?86[-\s]?)?1[3-9]\d{9}\b', # 手机号 - 'email': r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', # 邮箱 - 'id_card': r'\b\d{15}|\d{18}|\d{17}X\b', # 身份证号 - 'password': r'\b(?:password|pwd|pass|psw)[\s=:]*\S+\b', # 密码 - 'account': r'\b(?:account|username|user|acct)[\s=:]*\S+\b' # 账号 - } - - for key, pattern in patterns.items(): - text = re.sub(pattern, f'[{key} xxx]', text) - - return text - - -class AiTxtExporter(ExporterBase): - last_is_send = -1 - - def title(self, message): - str_time = message[8] - is_send = message[4] - display_name = '' - if is_send != self.last_is_send: - display_name = '\n' + self.get_display_name(is_send, message) + ':' - self.last_is_send = is_send - return display_name - - def text(self, doc, message): - str_content = remove_privacy_info(message[7]) - doc.write( - f'''{self.title(message)}{str_content} ''' - ) - - def image(self, doc, message): - doc.write( - f'''{self.title(message)}[图片]''' - ) - - def audio(self, doc, message): - doc.write( - f'''{self.title(message)}[语音]''' - ) - - def emoji(self, doc, message): - doc.write( - f'''{self.title(message)}[表情包]''' - ) - - def file(self, doc, message): - doc.write( - f'''{self.title(message)}[文件]''' - ) - - def system_msg(self, doc, message): - str_content = message[7] - str_time = message[8] - str_content = str_content.replace('<![CDATA[', "").replace( - ' <a href="weixin://revoke_edit_click">重新编辑</a>]]>', "") - doc.write( - f'''{str_time} {str_content}''' - ) - - def video(self, doc, message): - is_send = message[4] - doc.write( - f'''{self.title(message)}[视频]''' - ) - - def export(self): - # 实现导出为txt的逻辑 - print(f"【开始导出 TXT {self.contact.remark}】") - origin_path = self.origin_path - os.makedirs(origin_path, exist_ok=True) - filename = os.path.join(origin_path, self.contact.remark + '_chat.txt') - messages = msg_db.get_messages_group_by_day(self.contact.wxid, time_range=self.time_range) - total_steps = len(messages) - with open(filename, mode='w', newline='', encoding='utf-8') as f: - for date, messages in messages.items(): - f.write(f"\n\n{'*' * 20}{date}{'*' * 20}\n") - for index, message in enumerate(messages): - type_ = message[2] - sub_type = message[3] - self.progressSignal.emit(int((index + 1) / total_steps * 100)) - if type_ == 1 and self.message_types.get(type_): - self.text(f, message) - print(f"【完成导出 TXT {self.contact.remark}】") - self.okSignal.emit(1) diff --git a/app/util/exporter/exporter_csv.py b/app/util/exporter/exporter_csv.py deleted file mode 100644 index 0a1ca60..0000000 --- a/app/util/exporter/exporter_csv.py +++ /dev/null @@ -1,40 +0,0 @@ -import csv -import os - -from app.DataBase import msg_db -from app.person import Me -from app.util.exporter.exporter import ExporterBase -from app.config import OUTPUT_DIR - - -class CSVExporter(ExporterBase): - def to_csv(self): - print(f"【开始导出 CSV {self.contact.remark}】") - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - os.makedirs(origin_path, exist_ok=True) - filename = os.path.join(origin_path,f"{self.contact.remark}_utf8.csv") - columns = ['localId', 'TalkerId', 'Type', 'SubType', - 'IsSender', 'CreateTime', 'Status', 'StrContent', - 'StrTime', 'Remark', 'NickName', 'Sender'] - messages = msg_db.get_messages(self.contact.wxid, time_range=self.time_range) - # 写入CSV文件 - with open(filename, mode='w', newline='', encoding='utf-8-sig') as file: - writer = csv.writer(file) - writer.writerow(columns) - # 写入数据 - # writer.writerows(messages) - for msg in messages: - if self.contact.is_chatroom: - other_data = [msg[13].remark, msg[13].nickName, msg[13].wxid] - else: - is_send = msg[4] - Remark = Me().remark if is_send else self.contact.remark - nickname = Me().nickName if is_send else self.contact.nickName - wxid = Me().wxid if is_send else self.contact.wxid - other_data = [Remark,nickname,wxid] - writer.writerow([*msg[:9], *other_data]) - print(f"【完成导出 CSV {self.contact.remark}】") - self.okSignal.emit(1) - - def run(self): - self.to_csv() diff --git a/app/util/exporter/exporter_docx.py b/app/util/exporter/exporter_docx.py deleted file mode 100644 index 8947c34..0000000 --- a/app/util/exporter/exporter_docx.py +++ /dev/null @@ -1,380 +0,0 @@ -import os -import shutil -import time -from re import findall - -import docx -from docx import shared -from docx.enum.table import WD_ALIGN_VERTICAL -from docx.enum.text import WD_COLOR_INDEX, WD_PARAGRAPH_ALIGNMENT -from docx.oxml.ns import qn -from docxcompose.composer import Composer - -from app.DataBase import msg_db, hard_link_db -from app.util.exporter.exporter import ExporterBase, escape_js_and_html -from app.config import OUTPUT_DIR -from app.log import logger -from app.person import Me -from app.util.compress_content import parser_reply, share_card, music_share -from app.util.image import get_image_abs_path -from app.util.music import get_music_path - -# 要删除的编码字符 -encoded_chars = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f' - -# 创建一个字典,将要删除的字符映射为 None -char_mapping = {char: None for char in encoded_chars} - - -def filter_control_characters(input_string): - """ - 过滤掉不可打印字符 - @param input_string: - @return: - """ - - # 过滤掉非可打印字符 - filtered_string = input_string.translate(char_mapping) - - return filtered_string - - -class DocxExporter(ExporterBase): - def text(self, doc, message): - type_ = message[2] - str_content = message[7] - str_time = message[8] - is_send = message[4] - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - - display_name = self.get_display_name(is_send, message) - avatar = self.get_avatar_path(is_send, message, True) - content_cell = self.create_table(doc, is_send, avatar) - try: - content_cell.paragraphs[0].add_run(str_content) - except ValueError: - try: - str_content = filter_control_characters(str_content) - content_cell.paragraphs[0].add_run(str_content) - except ValueError: - logger.error(f'非法字符:{str_content}') - content_cell.paragraphs[0].add_run('非法字符') - content_cell.paragraphs[0].font_size = shared.Inches(0.5) - # doc.add_picture(avatar) - if is_send: - p = content_cell.paragraphs[0] - p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT - doc.add_paragraph() - - def image(self, doc, message): - str_content = message[7] - is_send = message[4] - BytesExtra = message[10] - avatar = self.get_avatar_path(is_send, message, True) - content = self.create_table(doc, is_send, avatar) - run = content.paragraphs[0].add_run() - str_content = escape_js_and_html(str_content) - image_path = hard_link_db.get_image(str_content, BytesExtra, thumb=True) - base_path = os.path.join(OUTPUT_DIR, '聊天记录', self.contact.remark, 'image') - if not os.path.exists(os.path.join(Me().wx_dir, image_path)): - image_thumb_path = hard_link_db.get_image(str_content, BytesExtra, thumb=False) - if not os.path.exists(os.path.join(Me().wx_dir, image_thumb_path)): - return - image_path = image_thumb_path - image_path = get_image_abs_path(image_path, base_path=base_path) - try: - run.add_picture(image_path, height=shared.Inches(2)) - doc.add_paragraph() - except Exception: - print("Error!image") - - def audio(self, doc, message): - str_content = message[7] - str_time = message[8] - is_send = message[4] - msgSvrId = message[9] - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - avatar = self.get_avatar_path(is_send, message, True) - content_cell = self.create_table(doc, is_send, avatar) - content_cell.paragraphs[0].add_run('【语音】') - content_cell.paragraphs[0].font_size = shared.Inches(0.5) - if is_send: - p = content_cell.paragraphs[0] - p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT - doc.add_paragraph() - - def emoji(self, doc, message): - str_content = message[7] - str_time = message[8] - is_send = message[4] - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - avatar = self.get_avatar_path(is_send, message, True) - content_cell = self.create_table(doc, is_send, avatar) - content_cell.paragraphs[0].add_run('【表情包】') - content_cell.paragraphs[0].font_size = shared.Inches(0.5) - if is_send: - p = content_cell.paragraphs[0] - p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT - doc.add_paragraph() - - def file(self, doc, message): - bytesExtra = message[10] - str_time = message[8] - is_send = message[4] - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - avatar = self.get_avatar_path(is_send, message, True) - content_cell = self.create_table(doc, is_send, avatar) - content_cell.paragraphs[0].add_run('【文件】') - content_cell.paragraphs[0].font_size = shared.Inches(0.5) - if is_send: - p = content_cell.paragraphs[0] - p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT - doc.add_paragraph() - - def refermsg(self, doc, message): - """ - 处理回复消息 - @param doc: - @param message: - @return: - """ - str_time = message[8] - is_send = message[4] - content = parser_reply(message[11]) - refer_msg = content.get('refer') - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - avatar = self.get_avatar_path(is_send, message, True) - content_cell = self.create_table(doc, is_send, avatar) - content_cell.paragraphs[0].add_run(content.get('title')) - content_cell.paragraphs[0].font_size = shared.Inches(0.5) - reply_p = content_cell.add_paragraph() - reply_content = f"{refer_msg.get('displayname')}:{refer_msg.get('content')}" if refer_msg else '未知引用' - run = content_cell.paragraphs[1].add_run(reply_content) - '''设置被回复内容格式''' - run.font.color.rgb = shared.RGBColor(121, 121, 121) - run.font_size = shared.Inches(0.3) - run.font.highlight_color = WD_COLOR_INDEX.GRAY_25 - - if is_send: - p = content_cell.paragraphs[0] - p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT - reply_p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT - doc.add_paragraph() - - def system_msg(self, doc, message): - str_content = message[7] - is_send = message[4] - str_time = message[8] - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - - str_content = str_content.replace('<![CDATA[', "").replace( - ' <a href="weixin://revoke_edit_click">重新编辑</a>]]>', "") - res = findall('(</{0,1}(img|revo|_wc_cus|a).*?>)', str_content) - for xmlstr, b in res: - str_content = str_content.replace(xmlstr, "") - doc.add_paragraph(str_content).alignment = WD_PARAGRAPH_ALIGNMENT.CENTER - - def video(self, doc, message): - type_ = message[2] - str_content = message[7] - str_time = message[8] - is_send = message[4] - BytesExtra = message[10] - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - avatar = self.get_avatar_path(is_send, message, True) - content_cell = self.create_table(doc, is_send, avatar) - content_cell.paragraphs[0].add_run('【视频】') - content_cell.paragraphs[0].font_size = shared.Inches(0.5) - if is_send: - p = content_cell.paragraphs[0] - p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT - doc.add_paragraph() - - def create_table(self, doc, is_send, avatar_path): - ''' - #! 创建一个1*2表格 - #! isSend = 1 (0,0)存聊天内容,(0,1)存头像 - #! isSend = 0 (0,0)存头像,(0,1)存聊天内容 - #! 返回聊天内容的坐标 - ''' - table = doc.add_table(rows=1, cols=2, style='Normal Table') - table.cell(0, 1).height = shared.Inches(0.5) - table.cell(0, 0).height = shared.Inches(0.5) - if is_send: - '''表格右对齐''' - table.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT - avatar = table.cell(0, 1).paragraphs[0].add_run() - '''插入头像,设置头像宽度''' - avatar.add_picture(avatar_path, width=shared.Inches(0.5)) - '''设置单元格宽度跟头像一致''' - table.cell(0, 1).width = shared.Inches(0.5) - content_cell = table.cell(0, 0) - '''聊天内容右对齐''' - content_cell.paragraphs[0].paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT - else: - avatar = table.cell(0, 0).paragraphs[0].add_run() - avatar.add_picture(avatar_path, width=shared.Inches(0.5)) - '''设置单元格宽度''' - table.cell(0, 0).width = shared.Inches(0.5) - content_cell = table.cell(0, 1) - '''聊天内容垂直居中对齐''' - content_cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER - return content_cell - - def music_share(self, doc, message): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - is_send = message[4] - timestamp = message[5] - content = music_share(message[11]) - music_path = '' - if content.get('audio_url') != '': - music_path = get_music_path(content.get('audio_url'), content.get('title'), - output_path=origin_path + '/music') - if music_path != '': - music_path = f'./music/{os.path.basename(music_path)}' - music_path = music_path.replace('\\', '/') - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - - def share_card(self, doc, message): - origin_path = f"{os.getcwd()}/data/聊天记录/{self.contact.remark}" - is_send = message[4] - timestamp = message[5] - bytesExtra = message[10] - compress_content_ = message[11] - card_data = share_card(bytesExtra, compress_content_) - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - thumbnail = '' - if card_data.get('thumbnail'): - thumbnail = os.path.join(Me().wx_dir, card_data.get('thumbnail')) - if os.path.exists(thumbnail): - shutil.copy(thumbnail, os.path.join(origin_path, 'image', os.path.basename(thumbnail))) - thumbnail = './image/' + os.path.basename(thumbnail) - else: - thumbnail = '' - app_logo = '' - if card_data.get('app_logo'): - app_logo = os.path.join(Me().wx_dir, card_data.get('app_logo')) - if os.path.exists(app_logo): - shutil.copy(app_logo, os.path.join(origin_path, 'image', os.path.basename(app_logo))) - app_logo = './image/' + os.path.basename(app_logo) - else: - app_logo = '' - - def merge_docx(self, conRemark, n): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录') - all_file_path = [] - for i in range(n): - file_name = f"{conRemark}{i}.docx" - all_file_path.append(origin_path + '/' + file_name) - filename = f"{conRemark}.docx" - # print(all_file_path) - doc = docx.Document() - doc.save(origin_path + '/' + filename) - master = docx.Document(origin_path + '/' + filename) - middle_new_docx = Composer(master) - num = 0 - for word in all_file_path: - word_document = docx.Document(word) - word_document.add_page_break() - if num != 0: - middle_new_docx.append(word_document) - num = num + 1 - os.remove(word) - middle_new_docx.save(origin_path + '/' + filename) - - def export(self): - print(f"【开始导出 DOCX {self.contact.remark}】") - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - messages = msg_db.get_messages(self.contact.wxid, time_range=self.time_range) - Me().save_avatar(os.path.join(origin_path, 'avatar', f'{Me().wxid}.png')) - if self.contact.is_chatroom: - for message in messages: - if message[4]: # is_send - continue - try: - chatroom_avatar_path =os.path.join(origin_path, 'avatar', f'{message[13].wxid}.png') - message[13].save_avatar(chatroom_avatar_path) - except: - print(message) - pass - else: - self.contact.save_avatar(os.path.join(origin_path, 'avatar', f'{self.contact.wxid}.png')) - self.rangeSignal.emit(len(messages)) - - def newdoc(): - nonlocal n, doc - doc = docx.Document() - doc.styles["Normal"].font.name = "Cambria" - doc.styles["Normal"]._element.rPr.rFonts.set(qn("w:eastAsia"), "宋体") - n += 1 - - doc = None - n = 0 - index = 0 - newdoc() - for index, message in enumerate(messages): - if index % 200 == 0 and index: - filename = os.path.join(origin_path, f"{self.contact.remark}_{n}.docx") - doc.save(filename) - self.okSignal.emit(n) - newdoc() - - type_ = message[2] - sub_type = message[3] - timestamp = message[5] - self.progressSignal.emit(1) - if self.is_5_min(timestamp): - str_time = message[8] - doc.add_paragraph(str_time).alignment = WD_PARAGRAPH_ALIGNMENT.CENTER - if type_ == 1 and self.message_types.get(type_): - self.text(doc, message) - elif type_ == 3 and self.message_types.get(type_): - self.image(doc, message) - elif type_ == 34 and self.message_types.get(type_): - self.audio(doc, message) - elif type_ == 43 and self.message_types.get(type_): - self.video(doc, message) - elif type_ == 47 and self.message_types.get(type_): - self.emoji(doc, message) - elif type_ == 10000 and self.message_types.get(type_): - self.system_msg(doc, message) - elif type_ == 49 and sub_type == 57 and self.message_types.get(1): - self.refermsg(doc, message) - elif type_ == 49 and sub_type == 6 and self.message_types.get(4906): - self.file(doc, message) - if index % 25 == 0: - print(f"【导出 DOCX {self.contact.remark}】{index}/{len(messages)}") - if index % 25: - print(f"【导出 DOCX {self.contact.remark}】{index + 1}/{len(messages)}") - filename = os.path.join(origin_path, f"{self.contact.remark}_{n}.docx") - try: - # document.save(filename) - doc.save(filename) - except PermissionError: - filename = filename[:-5] + f'{time.time()}' + '.docx' - # document.save(filename) - doc.save(filename) - self.okSignal.emit(n) - print(f"【完成导出 DOCX {self.contact.remark}】") - self.okSignal.emit(10086) diff --git a/app/util/exporter/exporter_html.py b/app/util/exporter/exporter_html.py deleted file mode 100644 index 46eec18..0000000 --- a/app/util/exporter/exporter_html.py +++ /dev/null @@ -1,523 +0,0 @@ -import os -import shutil -import sys -import traceback -from re import findall - -from PyQt5.QtCore import pyqtSignal, QThread - -from app.DataBase import msg_db, hard_link_db, media_msg_db -from app.util.exporter.exporter import ExporterBase, escape_js_and_html -from app.config import OUTPUT_DIR -from app.log import logger -from app.person import Me -from app.util import path -from app.util.compress_content import parser_reply, share_card, music_share, file, transfer_decompress, call_decompress -from app.util.emoji import get_emoji_url -from app.util.image import get_image_path, get_image -from app.util.music import get_music_path - -icon_files = { - './icon/word.png': ['doc', 'docx'], - './icon/excel.png': ['xls', 'xlsx'], - './icon/csv.png': ['csv'], - './icon/txt.png': ['txt'], - './icon/zip.png': ['zip', '7z', 'rar'], - './icon/ppt.png': ['ppt', 'pptx'], - './icon/pdf.png': ['pdf'], -} - - -class HtmlExporter(ExporterBase): - def text(self, doc, message): - type_ = message[2] - str_content = message[7] - str_time = message[8] - is_send = message[4] - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - - display_name = self.get_display_name(is_send, message) - avatar = self.get_avatar_path(is_send, message) - str_content = escape_js_and_html(str_content) - doc.write( - f'''{{ type:{1}, text: '{str_content}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}'}},''' - ) - - def image(self, doc, message): - base_path = os.path.join(OUTPUT_DIR, '聊天记录', self.contact.remark, 'image') - type_ = message[2] - str_content = message[7] - str_time = message[8] - is_send = message[4] - BytesExtra = message[10] - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - str_content = escape_js_and_html(str_content) - image_path = hard_link_db.get_image(str_content, BytesExtra, up_dir=Me().wx_dir, thumb=False) - image_path = get_image_path(image_path, base_path=base_path) - doc.write( - f'''{{ type:{type_}, text: '{image_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}'}},''' - ) - - def audio(self, doc, message): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - str_content = message[7] - str_time = message[8] - is_send = message[4] - msgSvrId = message[9] - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - try: - audio_path = media_msg_db.get_audio_path(msgSvrId, output_path=origin_path + "/voice") - audio_path = "./voice/" + os.path.basename(audio_path) - except: - logger.error(traceback.format_exc()) - return - voice_to_text = media_msg_db.get_audio_text(str_content) - if voice_to_text and voice_to_text != "": - voice_to_text = escape_js_and_html(voice_to_text) - doc.write( - f'''{{ type:34, text:'{audio_path}',is_send:{is_send},avatar_path:'{avatar}',voice_to_text:'{voice_to_text}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}'}},''' - ) - - def emoji(self, doc, message): - str_content = message[7] - str_time = message[8] - is_send = message[4] - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - emoji_path = get_emoji_url(str_content, thumb=True) - doc.write( - f'''{{ type:{3}, text: '{emoji_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}'}},''' - ) - - def file(self, doc, message): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - bytesExtra = message[10] - compress_content = message[11] - str_time = message[8] - is_send = message[4] - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - file_info = file(bytesExtra, compress_content, output_path=origin_path + '/file') - if file_info.get('is_error') == False: - icon_path = None - for icon, extensions in icon_files.items(): - if file_info.get('file_ext') in extensions: - icon_path = icon - break - # 如果没有与文件后缀匹配的图标,则使用默认图标 - if icon_path is None: - default_icon = './icon/file.png' - icon_path = default_icon - file_path = file_info.get('file_path') - if file_path != "": - file_path = './file/' + file_info.get('file_name') - doc.write( - f'''{{ type:49, text: '{file_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}',icon_path: '{icon_path}',sub_type:6,file_name: '{file_info.get('file_name')}',file_size: '{file_info.get('file_len')}',app_name: '{file_info.get('app_name')}'}},''' - ) - - def refermsg(self, doc, message): - """ - 处理回复消息 - @param doc: - @param message: - @return: - """ - str_time = message[8] - is_send = message[4] - content = parser_reply(message[11]) - refer_msg = content.get('refer') - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - contentText = escape_js_and_html(content.get('title')) - if refer_msg: - referText = f"{escape_js_and_html(refer_msg.get('displayname'))}:{escape_js_and_html(refer_msg.get('content'))}" - doc.write( - f'''{{ type:49, text: '{contentText}',is_send:{is_send},sub_type:{content.get('type')},refer_text: '{referText}',avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}'}},''' - ) - else: - doc.write( - f'''{{ type:49, text: '{contentText}',is_send:{is_send},sub_type:{content.get('type')},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}'}},''' - ) - - def system_msg(self, doc, message): - str_content = message[7] - is_send = message[4] - str_time = message[8] - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - - str_content = str_content.replace('<![CDATA[', "").replace( - ' <a href="weixin://revoke_edit_click">重新编辑</a>]]>', "") - res = findall('(</{0,1}(img|revo|_wc_cus|a).*?>)', str_content) - for xmlstr, b in res: - str_content = str_content.replace(xmlstr, "") - str_content = escape_js_and_html(str_content) - doc.write( - f'''{{ type:0, text: '{str_content}',is_send:{is_send},avatar_path:'',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:''}},''' - ) - - def video(self, doc, message): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - type_ = message[2] - str_content = message[7] - str_time = message[8] - is_send = message[4] - BytesExtra = message[10] - timestamp = message[5] - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - video_path = hard_link_db.get_video(str_content, BytesExtra, thumb=False) - image_path = hard_link_db.get_video(str_content, BytesExtra, thumb=True) - if video_path is None and image_path is not None: - image_path = path.get_relative_path(image_path, base_path=f'/data/聊天记录/{self.contact.remark}/image') - try: - # todo 网络图片问题 - print(origin_path + image_path[1:]) - os.utime(origin_path + image_path[1:], (timestamp, timestamp)) - doc.write( - f'''{{ type:3, text: '{image_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}'}},''' - ) - except: - doc.write( - f'''{{ type:1, text: '视频丢失',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}'}},''' - ) - return - if video_path is None and image_path is None: - return - video_path = f'{Me().wx_dir}/{video_path}' - video_path = video_path.replace('\\', '/') - if os.path.exists(video_path): - new_path = origin_path + '/video/' + os.path.basename(video_path) - if not os.path.exists(new_path): - shutil.copy(video_path, os.path.join(origin_path, 'video')) - os.utime(new_path, (timestamp, timestamp)) - video_path = f'./video/{os.path.basename(video_path)}' - doc.write( - f'''{{ type:{type_}, text: '{video_path}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}'}},''' - ) - - def music_share(self, doc, message): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - is_send = message[4] - timestamp = message[5] - content = music_share(message[11]) - music_path = '' - if content.get('is_error') == False: - if content.get('audio_url') != '': - music_path = get_music_path(content.get('audio_url'), content.get('title'), - output_path=origin_path + '/music') - if music_path != '': - music_path = f'./music/{os.path.basename(music_path)}' - music_path = music_path.replace('\\', '/') - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - music_path = escape_js_and_html(music_path) - doc.write( - f'''{{ type:49, text:'{music_path}',is_send:{is_send},avatar_path:'{avatar}',link_url:'{content.get('link_url')}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}',sub_type:3,title:'{content.get('title')}',artist:'{content.get('artist')}', website_name:'{content.get('website_name')}'}},''' - ) - - def share_card(self, doc, message): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - is_send = message[4] - timestamp = message[5] - bytesExtra = message[10] - compress_content_ = message[11] - card_data = share_card(bytesExtra, compress_content_) - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - thumbnail = '' - if card_data.get('thumbnail'): - thumbnail = os.path.join(Me().wx_dir, card_data.get('thumbnail')) - if os.path.exists(thumbnail): - shutil.copy(thumbnail, os.path.join(origin_path, 'image', os.path.basename(thumbnail))) - thumbnail = './image/' + os.path.basename(thumbnail) - else: - thumbnail = '' - app_logo = '' - if card_data.get('app_logo'): - app_logo = os.path.join(Me().wx_dir, card_data.get('app_logo')) - if os.path.exists(app_logo): - shutil.copy(app_logo, os.path.join(origin_path, 'image', os.path.basename(app_logo))) - app_logo = './image/' + os.path.basename(app_logo) - else: - app_logo = card_data.get('app_logo') - doc.write( - f'''{{ type:49,sub_type:5, text:'',is_send:{is_send},avatar_path:'{avatar}',url:'{card_data.get('url')}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}',title:'{card_data.get('title')}',description:'{card_data.get('description')}',thumbnail:'{thumbnail}',app_logo:'{app_logo}',app_name:'{card_data.get('app_name')}'}},\n''' - ) - - def transfer(self, doc, message): - is_send = message[4] - timestamp = message[5] - compress_content_ = message[11] - # open("test.bin", "wb").write(compress_content_) - transfer_detail = transfer_decompress(compress_content_) - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - try: - text_info_map = { - 1: transfer_detail["pay_memo"] or "发起转账", - 3: "已收款", - 4: "已退还", - 5: "非实时转账收款", - 7: "发起非实时转账", - 8: "未知", - 9: "未知", - } - doc.write( - f"""{{ type:49,sub_type:2000,text:'{text_info_map[transfer_detail["paysubtype"]]}',is_send:{is_send},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}',paysubtype:{transfer_detail["paysubtype"]},pay_memo:'{transfer_detail["pay_memo"]}',feedesc:'{transfer_detail["feedesc"]}',}},\n""") - except Exception as e: - logger.error(f'转账解析错误:{transfer_detail}\n{traceback.format_exc()}') - def call(self, doc, message): - is_send = message[4] - timestamp = message[5] - str_content = message[7] - bytes_extra = message[10] - display_content = message[12] - call_detail = call_decompress( - is_send, bytes_extra, display_content, str_content - ) - is_chatroom = 1 if self.contact.is_chatroom else 0 - avatar = self.get_avatar_path(is_send, message) - display_name = self.get_display_name(is_send, message) - doc.write( - f"""{{ type:50, text:'{call_detail["display_content"]}',call_type:{call_detail["call_type"]},avatar_path:'{avatar}',timestamp:{timestamp},is_chatroom:{is_chatroom},displayname:'{display_name}',}},\n""") - - def export(self): - print(f"【开始导出 HTML {self.contact.remark}】") - messages = msg_db.get_messages(self.contact.wxid, time_range=self.time_range) - filename = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark, - f'{self.contact.remark}.html') - file_path = './app/resources/data/template.html' - if not os.path.exists(file_path): - resource_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__))) - file_path = os.path.join(resource_dir, 'app', 'resources', 'data', 'template.html') - - with open(file_path, "r", encoding="utf-8") as f: - content = f.read() - html_head, html_end = content.split('/*注意看这是分割线*/') - f = open(filename, 'w', encoding='utf-8') - html_head = html_head.replace("<title>出错了</title>", f"<title>{self.contact.remark}</title>") - html_head = html_head.replace("<p id=\"title\">出错了</p>", f"<p id=\"title\">{self.contact.remark}</p>") - f.write(html_head) - self.rangeSignal.emit(len(messages)) - for index, message in enumerate(messages): - type_ = message[2] - sub_type = message[3] - timestamp = message[5] - if (type_ == 3 and self.message_types.get(3)) or (type_ == 34 and self.message_types.get(34)) or ( - type_ == 47 and self.message_types.get(47)): - pass - else: - self.progressSignal.emit(1) - - if type_ == 1 and self.message_types.get(type_): - self.text(f, message) - elif type_ == 3 and self.message_types.get(type_): - self.image(f, message) - elif type_ == 34 and self.message_types.get(type_): - self.audio(f, message) - elif type_ == 43 and self.message_types.get(type_): - self.video(f, message) - elif type_ == 47 and self.message_types.get(type_): - self.emoji(f, message) - elif type_ == 10000 and self.message_types.get(type_): - self.system_msg(f, message) - elif type_ == 49 and sub_type == 57 and self.message_types.get(1): - self.refermsg(f, message) - elif type_ == 49 and sub_type == 6 and self.message_types.get(4906): - self.file(f, message) - elif type_ == 49 and sub_type == 3 and self.message_types.get(4903): - self.music_share(f, message) - elif type_ == 49 and sub_type == 5 and self.message_types.get(4905): - self.share_card(f, message) - elif type_ == 49 and sub_type == 2000 and self.message_types.get(492000): - self.transfer(f, message) - elif type_ == 50 and self.message_types.get(50): - self.call(f, message) - if index % 2000 == 0: - print(f"【导出 HTML {self.contact.remark}】{index}/{len(messages)}") - f.write(html_end) - f.close() - print(f"【完成导出 HTML {self.contact.remark}】{len(messages)}") - self.count_finish_num(1) - - def count_finish_num(self, num): - """ - 记录子线程完成个数 - @param num: - @return: - """ - self.num += 1 - print("子线程完成", self.num, "/", self.total_num) - if self.num == self.total_num: - # 所有子线程都完成之后就发送完成信号 - self.okSignal.emit(1) - - -class OutputMedia(QThread): - """ - 导出语音消息 - """ - - okSingal = pyqtSignal(int) - progressSignal = pyqtSignal(int) - - def __init__(self, contact): - super().__init__() - self.contact = contact - - def run(self): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - messages = msg_db.get_messages_by_type(self.contact.wxid, 34) - for message in messages: - is_send = message[4] - msgSvrId = message[9] - try: - audio_path = media_msg_db.get_audio( - msgSvrId, output_path=origin_path + "/voice" - ) - except: - logger.error(traceback.format_exc()) - finally: - self.progressSignal.emit(1) - self.okSingal.emit(34) - - -class OutputEmoji(QThread): - """ - 导出表情包 - """ - - okSingal = pyqtSignal(int) - progressSignal = pyqtSignal(int) - - def __init__(self, contact): - super().__init__() - self.contact = contact - - def run(self): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - messages = msg_db.get_messages_by_type(self.contact.wxid, 47) - for message in messages: - str_content = message[7] - try: - pass - # emoji_path = get_emoji(str_content, thumb=True, output_path=origin_path + '/emoji') - except: - logger.error(traceback.format_exc()) - finally: - self.progressSignal.emit(1) - self.okSingal.emit(47) - - -class OutputImage(QThread): - """ - 导出图片 - """ - - okSingal = pyqtSignal(int) - progressSignal = pyqtSignal(int) - - def __init__(self, contact): - super().__init__() - self.contact = contact - self.child_thread_num = 2 - self.child_threads = [0] * (self.child_thread_num + 1) - self.num = 0 - - def count1(self, num): - self.num += 1 - print("图片导出完成一个") - if self.num == self.child_thread_num: - self.okSingal.emit(47) - print("图片导出完成") - - def run(self): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - messages = msg_db.get_messages_by_type(self.contact.wxid, 3) - base_path = os.path.join(OUTPUT_DIR, '聊天记录', self.contact.remark, 'image') - for message in messages: - str_content = message[7] - BytesExtra = message[10] - timestamp = message[5] - try: - image_path = hard_link_db.get_image( - str_content, BytesExtra, thumb=False - ) - if not os.path.exists(os.path.join(Me().wx_dir, image_path)): - image_thumb_path = hard_link_db.get_image( - str_content, BytesExtra, thumb=True - ) - if not os.path.exists(os.path.join(Me().wx_dir, image_thumb_path)): - continue - image_path = image_thumb_path - image_path = get_image( - image_path, base_path=base_path - ) - try: - os.utime(origin_path + image_path[1:], (timestamp, timestamp)) - except: - pass - except: - logger.error(traceback.format_exc()) - finally: - self.progressSignal.emit(1) - self.okSingal.emit(47) - - -class OutputImageChild(QThread): - okSingal = pyqtSignal(int) - progressSignal = pyqtSignal(int) - - def __init__(self, contact, messages): - super().__init__() - self.contact = contact - self.messages = messages - - def run(self): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - for message in self.messages: - str_content = message[7] - BytesExtra = message[10] - timestamp = message[5] - try: - image_path = hard_link_db.get_image( - str_content, BytesExtra, thumb=False - ) - if not os.path.exists(os.path.join(Me().wx_dir, image_path)): - image_thumb_path = hard_link_db.get_image( - str_content, BytesExtra, thumb=True - ) - if not os.path.exists(os.path.join(Me().wx_dir, image_thumb_path)): - continue - image_path = image_thumb_path - image_path = get_image( - image_path, base_path=f"/data/聊天记录/{self.contact.remark}/image" - ) - try: - os.utime(origin_path + image_path[1:], (timestamp, timestamp)) - except: - pass - except: - logger.error(traceback.format_exc()) - finally: - self.progressSignal.emit(1) - self.okSingal.emit(47) - print("图片子线程完成") diff --git a/app/util/exporter/exporter_json.py b/app/util/exporter/exporter_json.py deleted file mode 100644 index 0de2510..0000000 --- a/app/util/exporter/exporter_json.py +++ /dev/null @@ -1,193 +0,0 @@ -import json -import random -import os - -from app.DataBase import msg_db -from app.person import Me -from .exporter import ExporterBase - - -def merge_content(conversions_list) -> list: - """ - 合并一组对话中连续发送的句子 - @param conversions_list: - @return: - """ - merged_data = [] - current_role = None - current_content = "" - str_time = '' - for item in conversions_list: - if 'str_time' in item: - str_time = item['str_time'] - else: - str_time = '' - if current_role is None: - current_role = item["role"] - current_content = item["content"] - elif current_role == item["role"]: - current_content += "\n" + item["content"] - else: - # merged_data.append({"role": current_role, "content": current_content, 'str_time': str_time}) - merged_data.append({"role": current_role, "content": current_content}) - current_role = item["role"] - current_content = item["content"] - str_time = item.get('str_time') - - # 处理最后一组 - if current_role is not None: - # merged_data.append({"role": current_role, "content": current_content,'str_time': str_time}) - merged_data.append({"role": current_role, "content": current_content}) - return merged_data - - -def system_prompt(): - system = { - "role": "system", - # "content": f"你是{Me().name},一个聪明、热情、善良的男大学生,后面的对话来自{self.contact.remark}(!!!注意:对方的身份十分重要,你务必记住对方的身份,因为跟不同的人对话要用不同的态度、语气),你要认真地回答他" - "content": f"你是{Me().name},一个聪明、热情、善良的人,后面的对话来自你的朋友,你要认真地回答他" - } - return system - - -def message_to_conversion(group): - conversions = [system_prompt()] - while len(group) and group[-1][4] == 0: - group.pop() - for message in group: - is_send = message[4] - if len(conversions) == 1 and is_send: - continue - if is_send: - json_msg = { - "role": "assistant", - "content": message[7] - } - else: - json_msg = { - "role": "user", - "content": message[7] - } - json_msg['str_time'] = message[8] - conversions.append(json_msg) - if len(conversions) == 1: - return [] - return merge_content(conversions) - - -class JsonExporter(ExporterBase): - def split_by_time(self, length=300): - messages = msg_db.get_messages_by_type(self.contact.wxid, type_=1, time_range=self.time_range) - start_time = 0 - res = [] - i = 0 - while i < len(messages): - message = messages[i] - timestamp = message[5] - is_send = message[4] - group = [ - system_prompt() - ] - while i < len(messages) and timestamp - start_time < length: - if is_send: - json_msg = { - "role": "assistant", - "content": message[7] - } - else: - json_msg = { - "role": "user", - "content": message[7] - } - group.append(json_msg) - i += 1 - if i >= len(messages): - break - message = messages[i] - timestamp = message[5] - is_send = message[4] - while is_send: - json_msg = { - "role": "assistant", - "content": message[7] - } - group.append(json_msg) - i += 1 - if i >= len(messages): - break - message = messages[i] - timestamp = message[5] - is_send = message[4] - start_time = timestamp - res.append( - { - "conversations": group - } - ) - res_ = [] - for item in res: - conversations = item['conversations'] - res_.append({ - 'conversations': merge_content(conversations) - }) - return res_ - - def split_by_intervals(self, max_diff_seconds=300): - messages = msg_db.get_messages_by_type(self.contact.wxid, type_=1, time_range=self.time_range) - res = [] - i = 0 - current_group = [] - while i < len(messages): - message = messages[i] - timestamp = message[5] - is_send = message[4] - while is_send and i + 1 < len(messages): - i += 1 - message = messages[i] - is_send = message[4] - current_group = [messages[i]] - i += 1 - while i < len(messages) and messages[i][5] - current_group[-1][5] <= max_diff_seconds: - current_group.append(messages[i]) - i += 1 - while i < len(messages) and messages[i][4]: - current_group.append(messages[i]) - i += 1 - res.append(current_group) - res_ = [] - for group in res: - conversations = message_to_conversion(group) - if conversations: - res_.append({ - 'conversations': conversations - }) - return res_ - - def to_json(self): - print(f"【开始导出 json {self.contact.remark}】") - origin_path = self.origin_path - os.makedirs(origin_path, exist_ok=True) - filename = os.path.join(origin_path, f"{self.contact.remark}") - - # res = self.split_by_time() - res = self.split_by_intervals(60) - # 打乱列表顺序 - random.shuffle(res) - - # 计算切分比例 - split_ratio = 0.2 # 20% for the second list - - # 计算切分点 - split_point = int(len(res) * split_ratio) - - # 分割列表 - train_data = res[split_point:] - dev_data = res[:split_point] - with open(f'{filename}_train.json', "w", encoding="utf-8") as f: - json.dump(train_data, f, ensure_ascii=False, indent=4) - with open(f'{filename}_dev.json', "w", encoding="utf-8") as f: - json.dump(dev_data, f, ensure_ascii=False, indent=4) - self.okSignal.emit(1) - - def run(self): - self.to_json() diff --git a/app/util/exporter/exporter_txt.py b/app/util/exporter/exporter_txt.py deleted file mode 100644 index 9e37105..0000000 --- a/app/util/exporter/exporter_txt.py +++ /dev/null @@ -1,146 +0,0 @@ -import os - -from app.DataBase import msg_db -from app.util.exporter.exporter import ExporterBase -from app.config import OUTPUT_DIR -from app.util.compress_content import parser_reply, share_card - - -class TxtExporter(ExporterBase): - def text(self, doc, message): - str_content = message[7] - str_time = message[8] - is_send = message[4] - display_name = self.get_display_name(is_send, message) - name = display_name - doc.write( - f'''{str_time} {name}\n{str_content}\n\n''' - ) - - def image(self, doc, message): - str_time = message[8] - is_send = message[4] - display_name = self.get_display_name(is_send, message) - doc.write( - f'''{str_time} {display_name}\n[图片]\n\n''' - ) - - def audio(self, doc, message): - str_time = message[8] - is_send = message[4] - display_name = self.get_display_name(is_send, message) - doc.write( - f'''{str_time} {display_name}\n[语音]\n\n''' - ) - def emoji(self, doc, message): - str_time = message[8] - is_send = message[4] - display_name = self.get_display_name(is_send, message) - doc.write( - f'''{str_time} {display_name}\n[表情包]\n\n''' - ) - - def file(self, doc, message): - str_time = message[8] - is_send = message[4] - display_name = self.get_display_name(is_send, message) - doc.write( - f'''{str_time} {display_name}\n[文件]\n\n''' - ) - - def refermsg(self, doc, message): - """ - 处理回复消息 - @param doc: - @param message: - @return: - """ - str_time = message[8] - is_send = message[4] - content = parser_reply(message[11]) - refer_msg = content.get('refer') - display_name = self.get_display_name(is_send, message) - if refer_msg: - doc.write( - f'''{str_time} {display_name}\n{content.get('title')}\n引用:{refer_msg.get('displayname')}:{refer_msg.get('content')}\n\n''' - ) - else: - doc.write( - f'''{str_time} {display_name}\n{content.get('title')}\n引用:未知\n\n''' - ) - - def system_msg(self, doc, message): - str_content = message[7] - str_time = message[8] - str_content = str_content.replace('<![CDATA[', "").replace( - ' <a href="weixin://revoke_edit_click">重新编辑</a>]]>', "") - doc.write( - f'''{str_time} {str_content}\n\n''' - ) - - def video(self, doc, message): - str_time = message[8] - is_send = message[4] - display_name = self.get_display_name(is_send, message) - doc.write( - f'''{str_time} {display_name}\n[视频]\n\n''' - ) - def music_share(self, doc, message): - is_send = message[4] - str_time = message[8] - display_name = self.get_display_name(is_send, message) - doc.write( - f'''{str_time} {display_name}\n[音乐分享]\n\n''' - ) - - def share_card(self, doc, message): - is_send = message[4] - bytesExtra = message[10] - compress_content_ = message[11] - str_time = message[8] - card_data = share_card(bytesExtra, compress_content_) - display_name = self.get_display_name(is_send, message) - doc.write( - f'''{str_time} {display_name} - [链接]:title:{card_data.get('title')} - description:{card_data.get('description')} - url:{card_data.get('url')} - name:{card_data.get('app_name')} - \n\n''' - ) - - def export(self): - # 实现导出为txt的逻辑 - print(f"【开始导出 TXT {self.contact.remark}】") - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - os.makedirs(origin_path, exist_ok=True) - filename = os.path.join(origin_path, self.contact.remark+'.txt') - messages = msg_db.get_messages(self.contact.wxid, time_range=self.time_range) - total_steps = len(messages) - with open(filename, mode='w', newline='', encoding='utf-8') as f: - for index, message in enumerate(messages): - type_ = message[2] - sub_type = message[3] - self.progressSignal.emit(int((index + 1) / total_steps * 100)) - if type_ == 1 and self.message_types.get(type_): - self.text(f, message) - elif type_ == 3 and self.message_types.get(type_): - self.image(f, message) - elif type_ == 34 and self.message_types.get(type_): - self.audio(f, message) - elif type_ == 43 and self.message_types.get(type_): - self.video(f, message) - elif type_ == 47 and self.message_types.get(type_): - self.emoji(f, message) - elif type_ == 10000 and self.message_types.get(type_): - self.system_msg(f, message) - elif type_ == 49 and sub_type == 57 and self.message_types.get(1): - self.refermsg(f, message) - elif type_ == 49 and sub_type == 6 and self.message_types.get(4906): - self.file(f, message) - elif type_ == 49 and sub_type == 3 and self.message_types.get(4903): - self.music_share(f, message) - elif type_ == 49 and sub_type == 5 and self.message_types.get(4905): - self.share_card(f, message) - print(f"【完成导出 TXT {self.contact.remark}】") - self.okSignal.emit(1) \ No newline at end of file diff --git a/app/util/exporter/output.py b/app/util/exporter/output.py deleted file mode 100644 index 963df8d..0000000 --- a/app/util/exporter/output.py +++ /dev/null @@ -1,466 +0,0 @@ -import csv -import os -import time -import traceback -from typing import List - -import docx -from PyQt5.QtCore import pyqtSignal, QThread -from PyQt5.QtWidgets import QFileDialog -from docx.oxml.ns import qn -from docxcompose.composer import Composer - -from app.util.exporter.exporter_ai_txt import AiTxtExporter -from app.util.exporter.exporter_csv import CSVExporter -from app.util.exporter.exporter_docx import DocxExporter -from app.util.exporter.exporter_html import HtmlExporter -from app.util.exporter.exporter_json import JsonExporter -from app.util.exporter.exporter_txt import TxtExporter -from app.DataBase.hard_link import decodeExtraBuf -from app.config import OUTPUT_DIR -from app.DataBase.package_msg import PackageMsg -from app.DataBase import media_msg_db, hard_link_db, micro_msg_db, msg_db -from app.log import logger -from app.person import Me -from app.util.image import get_image - -os.makedirs(os.path.join(OUTPUT_DIR, '聊天记录'), exist_ok=True) - - -class Output(QThread): - """ - 发送信息线程 - """ - startSignal = pyqtSignal(int) - progressSignal = pyqtSignal(int) - rangeSignal = pyqtSignal(int) - okSignal = pyqtSignal(int) - batchOkSignal = pyqtSignal(int) - nowContact = pyqtSignal(str) - i = 1 - CSV = 0 - DOCX = 1 - HTML = 2 - CSV_ALL = 3 - CONTACT_CSV = 4 - TXT = 5 - JSON = 6 - AI_TXT = 7 - Batch = 10086 - - def __init__(self, contact, type_=DOCX, message_types={}, sub_type=[], time_range=None, parent=None): - super().__init__(parent) - self.children = [] - self.last_timestamp = 0 - self.sub_type = sub_type - self.time_range = time_range - self.message_types = message_types - self.sec = 2 # 默认1000秒 - self.contact = contact - self.msg_id = 0 - self.output_type: int | List[int] = type_ - self.total_num = 1 - self.num = 0 - - def progress(self, value): - self.progressSignal.emit(value) - - def output_image(self): - """ - 导出全部图片 - @return: - """ - return - - def output_emoji(self): - """ - 导出全部表情包 - @return: - """ - return - - def to_csv_all(self): - """ - 导出全部聊天记录到CSV - @return: - """ - - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录') - os.makedirs(origin_path, exist_ok=True) - filename = QFileDialog.getSaveFileName(None, "save file", os.path.join(os.getcwd(), 'messages.csv'), - "csv files (*.csv);;all files(*.*)") - if not filename[0]: - return - self.startSignal.emit(1) - filename = filename[0] - # columns = ["用户名", "消息内容", "发送时间", "发送状态", "消息类型", "isSend", "msgId"] - columns = ['localId', 'TalkerId', 'Type', 'SubType', - 'IsSender', 'CreateTime', 'Status', 'StrContent', - 'StrTime', 'Remark', 'NickName', 'Sender'] - - packagemsg = PackageMsg() - messages = packagemsg.get_package_message_all() - # 写入CSV文件 - with open(filename, mode='w', newline='', encoding='utf-8-sig') as file: - writer = csv.writer(file) - writer.writerow(columns) - # 写入数据 - writer.writerows(messages) - self.okSignal.emit(1) - - def contact_to_csv(self): - """ - 导出联系人到CSV - @return: - """ - filename = QFileDialog.getSaveFileName(None, "save file", os.path.join(os.getcwd(), 'contacts.csv'), - "csv files (*.csv);;all files(*.*)") - if not filename[0]: - return - self.startSignal.emit(1) - filename = filename[0] - # columns = ["用户名", "消息内容", "发送时间", "发送状态", "消息类型", "isSend", "msgId"] - columns = ['UserName', 'Alias', 'Type', 'Remark', 'NickName', 'PYInitial', 'RemarkPYInitial', 'smallHeadImgUrl', - 'bigHeadImgUrl', 'label', 'gender', 'telephone', 'signature', 'country/region', 'province', 'city'] - contacts = micro_msg_db.get_contact() - # 写入CSV文件 - with open(filename, mode='w', newline='', encoding='utf-8-sig') as file: - writer = csv.writer(file) - writer.writerow(columns) - # 写入数据 - # writer.writerows(contacts) - for contact in contacts: - detail = decodeExtraBuf(contact[9]) - gender_code = detail.get('gender') - if gender_code == 0: - gender = '未知' - elif gender_code == 1: - gender = '男' - else: - gender = '女' - writer.writerow([*contact[:9], contact[10], gender, detail.get('telephone'), detail.get('signature'), - *detail.get('region')]) - - self.okSignal.emit(1) - - def batch_export(self): - print('开始批量导出') - print(self.sub_type, self.message_types) - print(len(self.contact)) - print([contact.remark for contact in self.contact]) - self.batch_num_total = len(self.contact) * len(self.sub_type) - self.batch_num = 0 - self.rangeSignal.emit(self.batch_num_total) - for contact in self.contact: - # print('联系人', contact.remark) - for type_ in self.sub_type: - # print('导出类型', type_) - if type_ == self.DOCX: - self.to_docx(contact, self.message_types, True) - elif type_ == self.TXT: - # print('批量导出txt') - self.to_txt(contact, self.message_types, True) - elif type_ == self.AI_TXT: - # print('批量导出txt') - self.to_ai_txt(contact, self.message_types, True) - elif type_ == self.CSV: - self.to_csv(contact, self.message_types, True) - elif type_ == self.HTML: - self.to_html(contact, self.message_types, True) - elif type_ == self.JSON: - self.to_json(contact,self.message_types,True) - - def batch_finish_one(self, num): - self.nowContact.emit(self.contact[self.batch_num // len(self.sub_type)].remark) - self.batch_num += 1 - if self.batch_num == self.batch_num_total: - self.okSignal.emit(1) - - def merge_docx(self, n): - conRemark = self.contact.remark - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', conRemark) - filename = f"{origin_path}/{conRemark}_{n}.docx" - if n == 10086: - # self.document.append(self.document) - file = os.path.join(origin_path, f'{conRemark}.docx') - try: - self.document.save(file) - except PermissionError: - file = file[:-5] + f'{time.time()}' + '.docx' - self.document.save(file) - self.okSignal.emit(1) - return - doc = docx.Document(filename) - self.document.append(doc) - os.remove(filename) - if n % 50 == 0: - # self.document.append(self.document) - file = os.path.join(origin_path, f'{conRemark}-{n // 50}.docx') - try: - self.document.save(file) - except PermissionError: - file = file[:-5] + f'{time.time()}' + '.docx' - self.document.save(file) - doc = docx.Document() - doc.styles["Normal"].font.name = "Cambria" - doc.styles["Normal"]._element.rPr.rFonts.set(qn("w:eastAsia"), "宋体") - self.document = Composer(doc) - - def to_docx(self, contact, message_types, is_batch=False): - doc = docx.Document() - doc.styles["Normal"].font.name = "Cambria" - doc.styles["Normal"]._element.rPr.rFonts.set(qn("w:eastAsia"), "宋体") - self.document = Composer(doc) - Child = DocxExporter(contact, type_=self.DOCX, message_types=message_types, time_range=self.time_range) - self.children.append(Child) - Child.progressSignal.connect(self.progress) - if not is_batch: - Child.rangeSignal.connect(self.rangeSignal) - Child.okSignal.connect(self.merge_docx if not is_batch else self.batch_finish_one) - Child.start() - - def to_json(self, contact, message_types, is_batch=False): - Child = JsonExporter(contact, type_=self.JSON, message_types=message_types, time_range=self.time_range) - self.children.append(Child) - Child.progressSignal.connect(self.progress) - if not is_batch: - Child.rangeSignal.connect(self.rangeSignal) - Child.okSignal.connect(self.okSignal if not is_batch else self.batch_finish_one) - Child.start() - - def to_txt(self, contact, message_types, is_batch=False): - Child = TxtExporter(contact, type_=self.TXT, message_types=message_types, time_range=self.time_range) - self.children.append(Child) - Child.progressSignal.connect(self.progress) - if not is_batch: - Child.rangeSignal.connect(self.rangeSignal) - Child.okSignal.connect(self.okSignal if not is_batch else self.batch_finish_one) - Child.start() - - def to_ai_txt(self, contact, message_types, is_batch=False): - Child = AiTxtExporter(contact, type_=self.TXT, message_types=message_types, time_range=self.time_range) - self.children.append(Child) - Child.progressSignal.connect(self.progress) - if not is_batch: - Child.rangeSignal.connect(self.rangeSignal) - Child.okSignal.connect(self.okSignal if not is_batch else self.batch_finish_one) - Child.start() - - def to_html(self, contact, message_types, is_batch=False): - Child = HtmlExporter(contact, type_=self.output_type, message_types=message_types, time_range=self.time_range) - self.children.append(Child) - Child.progressSignal.connect(self.progress) - if not is_batch: - Child.rangeSignal.connect(self.rangeSignal) - Child.okSignal.connect(self.count_finish_num) - Child.start() - self.total_num = 1 - if message_types.get(34): - # 语音消息单独的线程 - self.total_num += 1 - output_media = OutputMedia(contact, time_range=self.time_range) - self.children.append(output_media) - output_media.okSingal.connect(self.count_finish_num) - output_media.progressSignal.connect(self.progressSignal) - output_media.start() - if message_types.get(47): - # emoji消息单独的线程 - self.total_num += 1 - output_emoji = OutputEmoji(contact, time_range=self.time_range) - self.children.append(output_emoji) - output_emoji.okSingal.connect(self.count_finish_num) - output_emoji.progressSignal.connect(self.progressSignal) - output_emoji.start() - if message_types.get(3): - # 图片消息单独的线程 - self.total_num += 1 - output_image = OutputImage(contact, time_range=self.time_range) - self.children.append(output_image) - output_image.okSingal.connect(self.count_finish_num) - output_image.progressSignal.connect(self.progressSignal) - output_image.start() - - def to_csv(self, contact, message_types, is_batch=False): - Child = CSVExporter(contact, type_=self.CSV, message_types=message_types, time_range=self.time_range) - self.children.append(Child) - Child.progressSignal.connect(self.progress) - if not is_batch: - Child.rangeSignal.connect(self.rangeSignal) - Child.okSignal.connect(self.okSignal if not is_batch else self.batch_finish_one) - Child.start() - - def run(self): - if self.output_type == self.DOCX: - self.to_docx(self.contact, self.message_types) - elif self.output_type == self.CSV_ALL: - self.to_csv_all() - elif self.output_type == self.CONTACT_CSV: - self.contact_to_csv() - elif self.output_type == self.TXT: - self.to_txt(self.contact, self.message_types) - elif self.output_type == self.AI_TXT: - self.to_ai_txt(self.contact, self.message_types) - elif self.output_type == self.CSV: - self.to_csv(self.contact, self.message_types) - elif self.output_type == self.HTML: - self.to_html(self.contact, self.message_types) - elif self.output_type == self.JSON: - self.to_json(self.contact, self.message_types) - elif self.output_type == self.Batch: - self.batch_export() - - def count_finish_num(self, num): - """ - 记录子线程完成个数 - @param num: - @return: - """ - self.num += 1 - if self.num == self.total_num: - # 所有子线程都完成之后就发送完成信号 - if self.output_type == self.Batch: - self.batch_finish_one(1) - else: - self.okSignal.emit(1) - self.num = 0 - - def cancel(self): - self.requestInterruption() - - -class OutputMedia(QThread): - """ - 导出语音消息 - """ - okSingal = pyqtSignal(int) - progressSignal = pyqtSignal(int) - - def __init__(self, contact, time_range=None): - super().__init__() - self.contact = contact - self.time_range = time_range - - def run(self): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - messages = msg_db.get_messages_by_type(self.contact.wxid, 34, time_range=self.time_range) - for message in messages: - is_send = message[4] - msgSvrId = message[9] - try: - audio_path = media_msg_db.get_audio(msgSvrId, output_path=origin_path + "/voice") - except: - logger.error(traceback.format_exc()) - finally: - self.progressSignal.emit(1) - self.okSingal.emit(34) - - -class OutputEmoji(QThread): - """ - 导出表情包 - """ - okSingal = pyqtSignal(int) - progressSignal = pyqtSignal(int) - - def __init__(self, contact, time_range=None): - super().__init__() - self.contact = contact - self.time_range = time_range - - def run(self): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - messages = msg_db.get_messages_by_type(self.contact.wxid, 47, time_range=self.time_range) - for message in messages: - str_content = message[7] - try: - pass - # emoji_path = get_emoji(str_content, thumb=True, output_path=origin_path + '/emoji') - except: - logger.error(traceback.format_exc()) - finally: - self.progressSignal.emit(1) - self.okSingal.emit(47) - - -class OutputImage(QThread): - """ - 导出图片 - """ - okSingal = pyqtSignal(int) - progressSignal = pyqtSignal(int) - - def __init__(self, contact, time_range): - super().__init__() - self.contact = contact - self.child_thread_num = 2 - self.time_range = time_range - self.child_threads = [0] * (self.child_thread_num + 1) - self.num = 0 - - def count1(self, num): - self.num += 1 - print('图片导出完成一个') - if self.num == self.child_thread_num: - self.okSingal.emit(47) - print('图片导出完成') - - def run(self): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - messages = msg_db.get_messages_by_type(self.contact.wxid, 3, time_range=self.time_range) - base_path = os.path.join(OUTPUT_DIR, '聊天记录', self.contact.remark, 'image') - for message in messages: - str_content = message[7] - BytesExtra = message[10] - timestamp = message[5] - try: - image_path = hard_link_db.get_image(str_content, BytesExtra, up_dir=Me().wx_dir, thumb=False) - image_path = get_image(image_path, base_path=base_path) - try: - os.utime(origin_path + image_path[1:], (timestamp, timestamp)) - except: - pass - except: - logger.error(traceback.format_exc()) - finally: - self.progressSignal.emit(1) - self.okSingal.emit(47) - - -class OutputImageChild(QThread): - okSingal = pyqtSignal(int) - progressSignal = pyqtSignal(int) - - def __init__(self, contact, messages, time_range): - super().__init__() - self.contact = contact - self.messages = messages - self.time_range = time_range - - def run(self): - origin_path = os.path.join(os.getcwd(), OUTPUT_DIR, '聊天记录', self.contact.remark) - for message in self.messages: - str_content = message[7] - BytesExtra = message[10] - timestamp = message[5] - try: - image_path = hard_link_db.get_image(str_content, BytesExtra, thumb=False) - if not os.path.exists(os.path.join(Me().wx_dir, image_path)): - image_thumb_path = hard_link_db.get_image(str_content, BytesExtra, thumb=True) - if not os.path.exists(os.path.join(Me().wx_dir, image_thumb_path)): - continue - image_path = image_thumb_path - image_path = get_image(image_path, base_path=f'/data/聊天记录/{self.contact.remark}/image') - try: - os.utime(origin_path + image_path[1:], (timestamp, timestamp)) - except: - pass - except: - logger.error(traceback.format_exc()) - finally: - self.progressSignal.emit(1) - self.okSingal.emit(47) - print('图片子线程完成') - - -if __name__ == "__main__": - pass diff --git a/app/util/file.py b/app/util/file.py deleted file mode 100644 index 8c8562f..0000000 --- a/app/util/file.py +++ /dev/null @@ -1,59 +0,0 @@ -import os -import traceback -import shutil - -import requests - -from app.log import log, logger -from app.util.protocbuf.msg_pb2 import MessageBytesExtra -from ..person import Me - -root_path = './data/files/' -if not os.path.exists('./data'): - os.mkdir('./data') -if not os.path.exists(root_path): - os.mkdir(root_path) - - -class File: - def __init__(self): - self.open_flag = False - - -def get_file(bytes_extra, file_name, output_path=root_path) -> str: - try: - msg_bytes = MessageBytesExtra() - msg_bytes.ParseFromString(bytes_extra) - file_path = '' - real_path = '' - if len(msg_bytes.message2) > 0: - for filed in msg_bytes.message2: - if filed.field1 == 4: - file_original_path = filed.field2 - file_path = os.path.join(output_path, file_name) - if os.path.exists(file_path): - # print('文件' + file_path + '已存在') - return file_path - if os.path.isabs(file_original_path): # 绝对路径可能迁移过文件目录,也可能存在其他位置 - if os.path.exists(file_original_path): - real_path = file_original_path - else: # 如果没找到再判断一次是否是迁移了目录 - if file_original_path.find(r"FileStorage") != -1: - real_path = Me().wx_dir + file_original_path[ - file_original_path.find("FileStorage") - 1:] - else: - if file_original_path.find(Me().wxid) != -1: - real_path = Me().wx_dir + file_original_path.replace(Me().wxid, '') - else: - real_path = Me().wx_dir + file_original_path - if real_path != "": - if os.path.exists(real_path): - print('开始获取文件' + real_path) - shutil.copy2(real_path, file_path) - else: - print('文件' + file_original_path + '已丢失') - file_path = '' - return file_path - except: - logger.error(traceback.format_exc()) - return "" diff --git a/app/util/image.py b/app/util/image.py deleted file mode 100644 index e8915cf..0000000 --- a/app/util/image.py +++ /dev/null @@ -1,135 +0,0 @@ -import os -import traceback - -from app.log import logger -from app.person import Me - -# 图片字节头信息, -# [0][1]为jpg头信息, -# [2][3]为png头信息, -# [4][5]为gif头信息 -pic_head = [0xff, 0xd8, 0x89, 0x50, 0x47, 0x49] -# 解密码 -decode_code = 0 - - -def get_code(dat_read) -> tuple[int, int]: - """ - 自动判断文件类型,并获取dat文件解密码 - :param file_path: dat文件路径 - :return: 如果文件为jpg/png/gif格式,则返回解密码,否则返回-1 - """ - try: - if not dat_read: - return -1, -1 - head_index = 0 - while head_index < len(pic_head): - # 使用第一个头信息字节来计算加密码 - # 第二个字节来验证解密码是否正确 - code = dat_read[0] ^ pic_head[head_index] - idf_code = dat_read[1] ^ code - head_index = head_index + 1 - if idf_code == pic_head[head_index]: - return head_index, code - head_index = head_index + 1 - print("not jpg, png, gif") - return -1, -1 - except: - logger.error(f'image解析发生了错误:\n\n{traceback.format_exc()}') - return -1, -1 - - -def decode_dat(file_path, out_path) -> str: - """ - 解密文件,并生成图片 - :param file_path: dat文件路径 - :return: 无 - """ - if not os.path.exists(file_path): - return None - with open(file_path, 'rb') as file_in: - data = file_in.read() - - file_type, decode_code = get_code(data[:2]) - if decode_code == -1: - return '' - - filename = os.path.basename(file_path) - if file_type == 1: - pic_name = os.path.basename(file_path)[:-4] + ".jpg" - elif file_type == 3: - pic_name = filename[:-4] + ".png" - elif file_type == 5: - pic_name = filename[:-4] + ".gif" - else: - pic_name = filename[:-4] + ".jpg" - file_outpath = os.path.join(out_path, pic_name) - if os.path.exists(file_outpath): - return file_outpath - - # 对数据进行异或加密/解密 - with open(file_outpath, 'wb') as file_out: - file_out.write(bytes([byte ^ decode_code for byte in data])) - print(file_path, '->', file_outpath) - return file_outpath - - -def decode_dat_path(file_path, out_path) -> str: - """ - 解密文件,并生成图片 - :param file_path: dat文件路径 - :return: 无 - """ - if not os.path.exists(file_path): - return '' - with open(file_path, 'rb') as file_in: - data = file_in.read(2) - file_type, decode_code = get_code(data) - if decode_code == -1: - return '' - filename = os.path.basename(file_path) - if file_type == 1: - pic_name = os.path.basename(file_path)[:-4] + ".jpg" - elif file_type == 3: - pic_name = filename[:-4] + ".png" - elif file_type == 5: - pic_name = filename[:-4] + ".gif" - else: - pic_name = filename[:-4] + ".jpg" - file_outpath = os.path.join(out_path, pic_name) - return file_outpath - - -def get_image(path, base_path) -> str: - if path: - base_path = os.path.join(os.getcwd(),base_path) - output_path = decode_dat(os.path.join(Me().wx_dir, path), base_path) - relative_path = './image/' + os.path.basename( - output_path) if output_path else 'https://www.bing.com/images/search?view=detailV2&ccid=Zww6woP3&id=CCC91337C740656E800E51247E928ACD3052FECF&thid=OIP.Zww6woP3Em49TdSG_lnggAHaEK&mediaurl=https%3a%2f%2fmeekcitizen.files.wordpress.com%2f2018%2f09%2f404.jpg%3fw%3d656&exph=360&expw=640&q=404&simid=608040792714530493&FORM=IRPRST&ck=151E7337A86F1B9C5C5DB08B15B90809&selectedIndex=21&itb=0' - return relative_path - else: - return ':/icons/icons/404.png' - - -def get_image_abs_path(path, base_path) -> str: - if path: - base_path = os.path.join(os.getcwd(),base_path) - output_path = decode_dat(os.path.join(Me().wx_dir, path), base_path) - return output_path - else: - return ':/icons/icons/404.png' - - -def get_image_path(path, base_path) -> str: - if path: - base_path = os.getcwd() + base_path - output_path = decode_dat_path(os.path.join(Me().wx_dir, path), base_path) - relative_path = './image/' + os.path.basename( - output_path) if output_path else 'https://www.bing.com/images/search?view=detailV2&ccid=Zww6woP3&id=CCC91337C740656E800E51247E928ACD3052FECF&thid=OIP.Zww6woP3Em49TdSG_lnggAHaEK&mediaurl=https%3a%2f%2fmeekcitizen.files.wordpress.com%2f2018%2f09%2f404.jpg%3fw%3d656&exph=360&expw=640&q=404&simid=608040792714530493&FORM=IRPRST&ck=151E7337A86F1B9C5C5DB08B15B90809&selectedIndex=21&itb=0' - return relative_path - else: - return ':/icons/icons/404.png' - - -if __name__ == "__main__": - pass diff --git a/app/util/music.py b/app/util/music.py deleted file mode 100644 index 6ad9296..0000000 --- a/app/util/music.py +++ /dev/null @@ -1,55 +0,0 @@ -import os -import traceback -import shutil - -from app.log import log, logger -from app.util.protocbuf.msg_pb2 import MessageBytesExtra -import requests -from urllib.parse import urlparse, parse_qs -import re - -root_path = './data/music/' -if not os.path.exists('./data'): - os.mkdir('./data') -if not os.path.exists(root_path): - os.mkdir(root_path) - - -class File: - def __init__(self): - self.open_flag = False - - -def get_music_path(url, file_title, output_path=root_path) -> str: - try: - parsed_url = urlparse(url) - if '.' in parsed_url.path: - # 获取扩展名 - file_extension = parsed_url.path.split('.')[-1] - - pattern = r'[\\/:*?"<>|\r\n]+' - file_title = re.sub(pattern, "_", file_title) - file_name = file_title + '.' + file_extension - music_path = os.path.join(output_path, file_name) - if os.path.exists(music_path): - # print('文件' + music_path + '已存在') - return music_path - header = { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.40 Safari/537.36 Edg/87.0.664.24' - } - requests.packages.urllib3.disable_warnings() - response = requests.get(url,headers=header,verify=False) - if response.status_code == 200: - with open(music_path, 'wb') as f: - f.write(response.content) - else: - music_path = '' - print("音乐" + file_name + "获取失败:请求地址:" + url) - else: - music_path = '' - print('音乐文件已失效,url:' + url) - return music_path - except Exception as e: - print(f"Get Music Path Error: {e}") - logger.error(traceback.format_exc()) - return "" diff --git a/app/util/path.py b/app/util/path.py deleted file mode 100644 index 54b4da7..0000000 --- a/app/util/path.py +++ /dev/null @@ -1,81 +0,0 @@ -import os -import winreg - -from app.person import Me -from app.util import image - -os.makedirs('./data/image', exist_ok=True) - - -def get_abs_path(path, base_path="/data/image"): - # return os.path.join(os.getcwd(), 'app/data/icons/404.png') - if path: - base_path = os.getcwd() + base_path - output_path = image.decode_dat(os.path.join(Me().wx_dir, path), base_path) - return output_path if output_path else ':/icons/icons/404.png' - else: - return ':/icons/icons/404.png' - - -def get_relative_path(path, base_path, type_='image'): - if path: - base_path = os.getcwd() + base_path - output_path = image.decode_dat(os.path.join(Me().wx_dir, path), base_path) - relative_path = './image/' + os.path.basename( - output_path) if output_path else 'https://www.bing.com/images/search?view=detailV2&ccid=Zww6woP3&id=CCC91337C740656E800E51247E928ACD3052FECF&thid=OIP.Zww6woP3Em49TdSG_lnggAHaEK&mediaurl=https%3a%2f%2fmeekcitizen.files.wordpress.com%2f2018%2f09%2f404.jpg%3fw%3d656&exph=360&expw=640&q=404&simid=608040792714530493&FORM=IRPRST&ck=151E7337A86F1B9C5C5DB08B15B90809&selectedIndex=21&itb=0' - return relative_path - else: - return ':/icons/icons/404.png' - - -def mkdir(path): - if not os.path.exists(path): - os.mkdir(path) - - -def wx_path(): - try: - is_w_dir = False - - try: - key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Tencent\WeChat", 0, winreg.KEY_READ) - value, _ = winreg.QueryValueEx(key, "FileSavePath") - winreg.CloseKey(key) - w_dir = value - is_w_dir = True - except Exception as e: - w_dir = "MyDocument:" - - if not is_w_dir: - try: - user_profile = os.environ.get("USERPROFILE") - path_3ebffe94 = os.path.join(user_profile, "AppData", "Roaming", "Tencent", "WeChat", "All Users", - "config", - "3ebffe94.ini") - with open(path_3ebffe94, "r", encoding="utf-8") as f: - w_dir = f.read() - is_w_dir = True - except Exception as e: - w_dir = "MyDocument:" - - if w_dir == "MyDocument:": - try: - # 打开注册表路径 - key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders") - documents_path = winreg.QueryValueEx(key, "Personal")[0] # 读取文档实际目录路径 - winreg.CloseKey(key) # 关闭注册表 - documents_paths = os.path.split(documents_path) - if "%" in documents_paths[0]: - w_dir = os.environ.get(documents_paths[0].replace("%", "")) - w_dir = os.path.join(w_dir, os.path.join(*documents_paths[1:])) - # print(1, w_dir) - else: - w_dir = documents_path - except Exception as e: - profile = os.environ.get("USERPROFILE") - w_dir = os.path.join(profile, "Documents") - msg_dir = os.path.join(w_dir, "WeChat Files") - return msg_dir - except FileNotFoundError: - return '.' diff --git a/app/util/protocbuf/__init__.py b/app/util/protocbuf/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/app/util/search.py b/app/util/search.py deleted file mode 100644 index 59e8a00..0000000 --- a/app/util/search.py +++ /dev/null @@ -1,14 +0,0 @@ -from typing import List - -from fuzzywuzzy import process - - -def search_by_content(key, choices: List[List]): - result = [] - for i, choice in enumerate(choices): - res = process.extractOne(key, choice) - result.append((res, i)) - result.sort(key=lambda x: x[0][1], reverse=True) - k = result[0][1] - item = result[0][0][0] - return choices[k].index(item) diff --git a/app/web_ui/__init__.py b/app/web_ui/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/app/web_ui/templates/charts.html b/app/web_ui/templates/charts.html deleted file mode 100644 index dc2a2cf..0000000 --- a/app/web_ui/templates/charts.html +++ /dev/null @@ -1,155 +0,0 @@ -<!DOCTYPE html> -<html lang="zh-CN"> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>微信年度聊天报告</title> - <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@latest/dist/echarts.min.js"></script> - <script type="text/javascript" src="https://assets.pyecharts.org/assets/v5/echarts-wordcloud.min.js"></script> - <style> - body{ - display: flex; - flex-direction: column; - margin: 0; - align-items: center; - } - </style> -</head> -<body> -<h1>{{my_nickname}}——{{ta_nickname}}</h1> -<div> - <p class="mt-3">我们第一次聊天在</p> - <p id="first_time" class="first-time">{{first_time}}</p> - <p class="mt-3">距今已有</p> - <div class="mt-3"> - <span id="t_d"></span> - <span id="t_h"></span> - <span id="t_m"></span> - <span id="t_s"></span> - </div> - <div><br></div> -</div> -<div id="echarts-month_count" style="width: 800px; height: 600px;"></div> -<div> - <h2>消息统计</h2> - <div id="echarts-sender" style="width: 800px; height: 600px;"></div> - <div id="echarts-types" style="width: 800px; height: 600px;"></div> - <div id="echarts-weekday" style="width: 800px; height: 600px;"></div> -</div> -<div id="echarts-wordcloud" style="width: 800px; height: 800px;"></div> -<div id="echarts-calendar" style="width: 800px; height: 300px;"></div> - - -<script type="text/javascript"> function getRTime() { - var tt = document.getElementById("first_time").innerText; - var EndTime = new Date(tt); - var NowTime = new Date(); - var t = NowTime.getTime()-EndTime.getTime(); - var d = Math.floor(t / 1000 / 60 / 60 / 24); - var h = Math.floor(t / 1000 / 60 / 60 % 24); - var m = Math.floor(t / 1000 / 60 % 60); - var s = Math.floor(t / 1000 % 60); - document.getElementById("t_d").innerHTML = d + " 天"; - document.getElementById("t_h").innerHTML = h + " 时"; - document.getElementById("t_m").innerHTML = m + " 分"; - document.getElementById("t_s").innerHTML = s + " 秒"; -} -setInterval(getRTime, 1000); - -</script> -<script> - var wxid = '{{wxid}}'; - function month_count(time_range){ - const requestData = { - wxid: wxid, - time_range: time_range - }; - fetch('/month_count',{ - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestData) - }) - .then(response => response.json()) - .then(chartOptions => { - // 在这里使用 ECharts 渲染图表 - var myChart = echarts.init(document.getElementById('echarts-month_count')); - var option = chartOptions.chart_data; - myChart.setOption(JSON.parse(option)); - }); - } - function wordcloud(time_range){ - const requestData = { - wxid: wxid, - time_range: time_range - }; - fetch('/wordcloud',{ - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestData) - }) - .then(response => response.json()) - .then(chartOptions => { - // 在这里使用 ECharts 渲染图表 - var myChart = echarts.init(document.getElementById('echarts-wordcloud')); - var option = chartOptions.chart_data; - myChart.setOption(JSON.parse(option)); - }); - } - function calendar(time_range){ - const requestData = { - wxid: wxid, - time_range: time_range - }; - fetch('/calendar',{ - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestData) - }) - .then(response => response.json()) - .then(chartOptions => { - // 在这里使用 ECharts 渲染图表 - var myChart = echarts.init(document.getElementById('echarts-calendar')); - var option = chartOptions.chart_data; - myChart.setOption(JSON.parse(option)); - }); - } - function message_counter(time_range){ - const requestData = { - wxid: wxid, - time_range: time_range - }; - fetch('/message_counter',{ - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestData) - }) - .then(response => response.json()) - .then(chartOptions => { - // 在这里使用 ECharts 渲染图表 - var myChart = echarts.init(document.getElementById('echarts-sender')); - var option = chartOptions.chart_data_sender; - myChart.setOption(JSON.parse(option)); - var myChart1 = echarts.init(document.getElementById('echarts-types')); - var option = chartOptions.chart_data_types; - myChart1.setOption(JSON.parse(option)); - var myChart2 = echarts.init(document.getElementById('echarts-weekday')); - var option = chartOptions.chart_data_weekday; - myChart2.setOption(JSON.parse(option)); - }); - } - var time_range=['1997-01-01 00:00:00','2035-01-01 00:00:00'] - message_counter(time_range); - month_count(time_range); - calendar(time_range); - wordcloud(time_range); -</script> -</body> -</html> diff --git a/app/web_ui/templates/christmas.html b/app/web_ui/templates/christmas.html deleted file mode 100644 index d03bbe0..0000000 --- a/app/web_ui/templates/christmas.html +++ /dev/null @@ -1,383 +0,0 @@ -<!DOCTYPE html> -<html lang="zh-CN"> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>微信年度聊天报告</title> - <link rel="stylesheet" href="https://memotrace.cn/static/css/style.css"> - <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@latest/dist/echarts.min.js"></script> - <script type="text/javascript" src="https://assets.pyecharts.org/assets/v5/echarts-wordcloud.min.js"></script> - <link rel="stylesheet" href="https://memotrace.cn/static/css/fullpage.min.css" /> - <script type="text/javascript" src="https://code.jquery.com/jquery-3.6.4.min.js"></script> - <script type="text/javascript" src="https://memotrace.cn/static/js/fullpage.min.js"></script> - <script type="text/javascript" src="https://davidshimjs.github.io/qrcodejs/qrcode.min.js"></script> -</head> -<body> - <div id="snow"></div> - <!-- Your content goes here --> -<div id="fullpage"> - <div class="section"> - <div> - <img class="Mountain-Image" src="https://www.freeimg.cn/i/2023/12/20/6582c04711cd2.png" alt="Mountain Image"> - <img class="corner-light light-top-left" src="https://www.freeimg.cn/i/2023/12/20/6582c05d9dcbb.png" alt="Top Left Light"> - <img class="corner-light light-top-right" src="https://www.freeimg.cn/i/2023/12/20/6582c07b257db.png" alt="Bottom Right Light"> - <img src="https://www.freeimg.cn/i/2023/12/20/6582c0514c518.png" alt="Left Bottom Image" class="corner-image left-bottom"> - <img src="https://www.freeimg.cn/i/2023/12/20/6582c04946138.png" alt="Right Top Image" class="corner-image right-bottom"> - - <div class="center-container"> - <div> - <img src="https://www.freeimg.cn/i/2023/12/20/6582c05a78e58.png"> - </div> - <div class="user-container"> - <div class="user"> - <img class="avatar" src="{{my_avatar_path}}"> - <span class="nickname">{{my_nickname}}</span> - </div> - - <img src="https://memotrace.cn/static/img/铃铛.png" alt="Right Top Image" class="spliter-img"> - <div class="user"> - <img class="avatar" src="{{ta_avatar_path}}"> - <span class="nickname">{{ta_nickname}}</span> - </div> - </div> - <div> - <p class="mt-3">我们第一次聊天在</p> - <p id="first_time" class="first-time">{{first_time}}</p> - <p class="mt-3">距今已有</p> - <div class="mt-3"> - <span id="t_d"></span> - <span id="t_h"></span> - <span id="t_m"></span> - <span id="t_s"></span> - </div> - </div> - <!-- <div> - <img src="img/雪人.gif"> - </div> - <div> - <img src="img/雪人1.gif"> - </div> --> - </div> - </div> - </div> - <div class="section"> - <div> - <img class="Mountain-Image" src="https://www.freeimg.cn/i/2023/12/20/6582c04711cd2.png" alt="Mountain Image"> - <img class="corner-light light-top-left" src="https://www.freeimg.cn/i/2023/12/20/6582c05d9dcbb.png" alt="Top Left Light"> - <img class="corner-light light-top-right" src="https://www.freeimg.cn/i/2023/12/20/6582c07b257db.png" alt="Bottom Right Light"> - <img src="https://www.freeimg.cn/i/2023/12/20/6582c07223f22.png" alt="礼袋" class="corner-image left-bottom-gift"> - <img src="https://www.freeimg.cn/i/2023/12/20/6582c055cc6df.png" alt="圣诞老人" class="corner-image right-bottom-oldman"> - </div> - <div class="wordcloud"> - <div id="word_cloud" class="chart-container"></div> - </div> - <div class="keyword-container"> - <div class="tp1">二〇二三</div> - <div class="tp1">你们说的最多的是</div> - <div class="keyword">“{{keyword}}”<span class="keyword-num">{{keyword_max_num}}</span><span class="tp1">次</span></div> - <!-- <img src="static/img/窗雪.png"> --> - </div> - <div class="dialog-container"> - {% for dialog in dialogs %} - <div class="item item-center">{{dialog[0][3]}}</div> - {% if dialog[0][0]==0: %} - <div class="item item-left"> - <img class="bubble-avatar" src="{{ta_avatar_path}}"> - <div class="bubble bubble-left"> - {% for p in dialog[0][2][:-1] %} - {{p}}<span style="color:red">{{keyword}}</span> - {% endfor %} - {{dialog[0][2][-1]}} - </div> - </div> - <div class="item item-right"> - <div class="bubble bubble-right"> - {{dialog[1][2]}} - </div> - <img class="bubble-avatar" src="{{my_avatar_path}}"> - </div> - {% endif %} - {% if dialog[0][0]==1: %} - <div class="item item-right"> - <div class="bubble bubble-right"> - {% for p in dialog[0][2][:-1] %} - {{p}}<span style="color:red">{{keyword}}</span> - {% endfor %} - {{dialog[0][2][-1]}} - </div> - <img class="bubble-avatar" src="{{my_avatar_path}}"> - </div> - <div class="item item-left"> - <img class="bubble-avatar" src="{{ta_avatar_path}}"> - <div class="bubble bubble-left"> - {{dialog[1][2]}} - </div> - </div> - {% endif %} - {% endfor %} - </div> - </div> - <div class="section"> - <div> - <img class="Mountain-Image" src="https://www.freeimg.cn/i/2023/12/20/6582c04711cd2.png" alt="Mountain Image"> - <img class="corner-light light-top-left txt" src="https://www.freeimg.cn/i/2023/12/20/6582c05d9dcbb.png" alt="Top Left Light"> - <img class="corner-light light-top-right txt" src="https://www.freeimg.cn/i/2023/12/20/6582c07b257db.png" alt="Bottom Right Light"> - <img src="https://www.freeimg.cn/i/2023/12/20/6582c04589c47.png" alt="Left Bottom Image" class="corner-image left-bottom"> - <img src="https://www.freeimg.cn/i/2023/12/21/65831360a36d4.gif" alt="Right Top Image" class="corner-image right-bottom" style="max-height: 500px;"> - <img src="https://www.freeimg.cn/i/2023/12/20/6582c054816cf.png" alt="圣诞老人" class="center-top-time"> - <img src="https://memotrace.cn/static/img/平安夜.png" alt="Right Top Image" class="left-time"> - <div class="time-container"> - <div class="text112">{{latest_time}}</div> - <div class="text112">这么晚了你们还在聊天</div> - <div class="text112">那天一定有你们<span style="color: brown;">难忘的回忆</span>吧</div> - <div><br></div> - <div class="text112">你们都是<span style="color: brown;">{{chat_time_label}}</span></div> - <div class="text113">{{chat_time}}</div> - <div class="text112">你们一共发送了<span style="color: brown;">{{chat_time_num}}</span>条消息</div> - </div> - <div class="parent"> - <div class="dialog-container-time"> - <div class="item item-center">{{latest_time}}</div> - {% for dialog in latest_time_dialog %} - {% if dialog[0]==0: %} - <div class="item item-left"> - <img class="bubble-avatar" src="{{ta_avatar_path}}"> - <div class="bubble bubble-left"> - {{dialog[1]}} - </div> - </div> - {% endif %} - {% if dialog[0]==1: %} - <div class="item item-right"> - <div class="bubble bubble-right"> - {{dialog[1]}} - </div> - <img class="bubble-avatar" src="{{my_avatar_path}}"> - </div> - {% endif %} - {% endfor %} - </div> - </div> - </div> - </div> - <div class="section"> - <div> - <img class="Mountain-Image" src="https://www.freeimg.cn/i/2023/12/20/6582c04711cd2.png" alt="Mountain Image"> - <img class="corner-light light-top-left txt" src="https://www.freeimg.cn/i/2023/12/20/6582c05d9dcbb.png" alt="Top Left Light"> - <img class="corner-light light-top-right txt" src="https://www.freeimg.cn/i/2023/12/20/6582c07b257db.png" alt="Bottom Right Light"> - <img src="https://www.freeimg.cn/i/2023/12/20/6582c03ce4548.png" alt="Left Bottom Image" class="corner-image left-bottom"> - <img src="https://www.freeimg.cn/i/2023/12/20/6582c05a9a4bd.png" alt="滑雪的小女孩" class="corner-image right-bottom"> - <img src="https://www.freeimg.cn/i/2023/12/20/6582c04d5151f.png" alt="Right Top Image" class="snow-ball"> - <img src="https://memotrace.cn/static/img/礼盒1.png" alt="Right Top Image" class="ttq"> - <div class="time-container"> - <div class="text112">过去的一年里</div> - <div class="text112">你们一共发送了<span style="color: brown;">{{total_msg_num}}</span>条消息</div> - <div class="text112">总计<span style="color: brown;">{{total_num}}</span>字</div> - <div><br></div> - <div class="text112">你们的聊天似乎没有规律</div> - <div class="text112"> - <span style="color: brown;">{{max_month}}</span> - 一共发送了 - <span style="color: brown;">{{max_month_num}}</span> - 条消息 - </div> - <div class="text112">对你的话说不完</div> - <div><br></div> - <div class="text112"> - <span style="color: brown;">{{min_month}}</span> - 只有 - <span style="color: brown;">{{min_month_num}}</span> - 条消息 - </div> - <div class="text112">有时候你们也想静静</div> - </div> - </div> - </div> - <div class="section"> - <div> - <img class="Mountain-Image" src="https://www.freeimg.cn/i/2023/12/20/6582c04711cd2.png" alt="Mountain Image"> - <img class="corner-light light-top-left txt" src="https://www.freeimg.cn/i/2023/12/20/6582c05d9dcbb.png" alt="Top Left Light"> - <img class="corner-light light-top-right txt" src="https://www.freeimg.cn/i/2023/12/20/6582c07b257db.png" alt="Bottom Right Light"> - <img src="https://www.freeimg.cn/i/2023/12/20/6582c064276db.png" alt="包饺子" class="corner-image left-bottom"> - <img src="https://www.freeimg.cn/i/2023/12/21/658313714609b.png" alt="Right Top Image" class="corner-image right-bottom"> - <div class="calendar-container"> - <div class="text012">{{year}}年</div> - <div class="text012"> - 我们有 - <span style="color: brown;">{{chat_days}}</span> - 天在聊天 - </div> - <div class="text012">有你在的日子里</div> - <div class="text012"> - 都很有 - <span style="color: brown;">意义</span>! - </div> - <div><br></div> - <div class="text012">这一年</div> - <div class="text012"> - 一共发送了 - <span style="color: brown;">{{emoji_total_num}}</span> - 个表情包 - </div> - <div class="text012">Ta最常用的表情包是</div> - <img src="{{emoji_url}}" class="emoji"> - <div class="text012"> - 一共 - <span style="color: brown;">{{emoji_num}}</span>次 - </div> - </div> - <div id="calendar-chart" class="calendar-chart"></div> - </div> - </div> - <div class="section" style="text-align: center;display:flex;justify-content: center;align-items: center;"> - <h1>分享此页面</h1> - <div> - <a id="share" href="https://memotrace.cn/" target="_blank">https://memotrace.cn/</a> - </div> - <button onclick="confirmUpload()">上传并显示二维码</button> - <div id="qrcode"></div> - <a href="https://memotrace.cn/" target="_blank">点击生成我的年度聊天报告</a> - <div style="height:400px"></div> - <div> - <img src="https://memotrace.cn/img/logo3.0.png" alt="Logo"> - <p class="text-larger mb-2">Copyrights © 2022-2024 <a href="https://memotrace.cn/">SiYuan</a> 版权所有. Inc.</p> - <!-- <span class="op-07">请遵守所在国家的相关法律法规</span> --> - </div> - </div> - <!-- Add more sections as needed --> -</div> - <script> - function confirmUpload() { - var userConfirmed = confirm("注意!!!\n本页面将会上传至云端,别人可通过链接查看该网页,该操作不会上传您的其他任何信息,页面将在下个版本更新之后删除,请注意链接生效时间。\n点击“确认”代表您同意上传,否则请点击“取消"); - - if (userConfirmed) { - // User clicked OK, perform the upload and display QR code - uploadAndDisplayQRCode(); - } else { - // User clicked Cancel or closed the dialog - alert("Upload canceled."); - } - } - - function uploadAndDisplayQRCode() { - // Simulate a GET request to the server endpoint - fetch('http://127.0.0.1:21314/upload') - .then(response => response.json()) - .then(data => { - if (data.success) { - displayQRCode(data.url); - } else { - if(data.code==201){ - displayQRCode(data.url); - alert(data.errmsg); - } - else{ - alert(data.errmsg); - } - } - }) - .catch(error => { - console.error('Error:', error); - alert('Error: Unable to fetch data from the server.\n'+error); - }); - } - - function displayQRCode(url) { - var qrcode = new QRCode(document.getElementById("qrcode"), { - text: url, - width: 128, - height: 128 - }); - var aObj = document.getElementById("share"); - aObj.href = url; - //根据id获取超链接,设置文字内容 - aObj.innerText = url; - } - </script> -<script> - // JavaScript 代码用于生成聊天内容和雪花动画 - document.addEventListener('DOMContentLoaded', function () { - const snowContainer = document.getElementById('snow'); - // 生成雪花动画 - for (let i = 0; i < 50; i++) { - const snowflake = document.createElement('div'); - snowflake.className = 'snowflake'; - var ran = Math.random(); - var ran0 = 1-ran; - snowflake.style.left = `${Math.random() * 150}vw`; - snowflake.style.animationDuration = `${ran0 * 20 + 7}s`; - snowflake.style.setProperty('--animation-order', i); - - // 设置雪花的随机大小 - const size = ran * 20 + 10; // 随机大小在 10 到 30 之间 - snowflake.style.width = `${size}px`; - snowflake.style.height = `${size}px`; - - snowContainer.appendChild(snowflake); - } - }); - function createSnowflake(top, left) { - const snowflake = document.createElement('div'); - snowflake.className = 'snowflake0'; - snowflake.style.top = `${top}vh`; - snowflake.style.left = `${left}vw`; - // 设置雪花的随机大小 - const size = Math.random() * 20 + 10; // 随机大小在 10 到 30 之间 - snowflake.style.width = `${size}px`; - snowflake.style.height = `${size}px`; - document.body.appendChild(snowflake); - } -</script> -<script> - var chart = echarts.init(document.getElementById('word_cloud'), 'white', {renderer: 'canvas'}); - var result = {{wordcloud_chart_data|safe}}; - // 获取屏幕宽度 - const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; - - // 根据屏幕宽度设置字体范围 - let fontSizeRange; - if (screenWidth < 768) { // 手机屏幕 - fontSizeRange = [5, 40]; - } else { // 电脑屏幕 - fontSizeRange = [10, 100]; - } - result.series[0].sizeRange = fontSizeRange; - chart.setOption(result); -</script> -<script> - $(document).ready(function() { - $('#fullpage').fullpage(); - }); - </script> - <script type="text/javascript"> function getRTime() { - var tt = document.getElementById("first_time").innerText; - var EndTime = new Date(tt); - var NowTime = new Date(); - var t = NowTime.getTime()-EndTime.getTime(); - var d = Math.floor(t / 1000 / 60 / 60 / 24); - var h = Math.floor(t / 1000 / 60 / 60 % 24); - var m = Math.floor(t / 1000 / 60 % 60); - var s = Math.floor(t / 1000 % 60); - document.getElementById("t_d").innerHTML = d + " 天"; - document.getElementById("t_h").innerHTML = h + " 时"; - document.getElementById("t_m").innerHTML = m + " 分"; - document.getElementById("t_s").innerHTML = s + " 秒"; -} -setInterval(getRTime, 1000); - -</script> -<script> - var chart_51ebd4312946429e9c32b2b55b96a479 = echarts.init( - document.getElementById('calendar-chart'), 'white', {renderer: 'canvas'}); - var result = {{calendar_chart_data|safe}}; - // 根据屏幕宽度设置字体范围 - let cellSize; - if (screenWidth < 768) { // 手机屏幕 - result.calendar.cellSize = 10; - } else { // 电脑屏幕 - result.calendar.cellSize = 15; - } - chart_51ebd4312946429e9c32b2b55b96a479.setOption(result); -</script> -</body> -</html> diff --git a/app/web_ui/templates/home.html b/app/web_ui/templates/home.html deleted file mode 100644 index 4a43eb1..0000000 --- a/app/web_ui/templates/home.html +++ /dev/null @@ -1,177 +0,0 @@ -<!DOCTYPE html> -<!-- saved from url=(0211)https://lmq.music.163.com/c/year2018/EPoNy/?uid=2D7195A5E2F508DB0C6B44DAA020E46B&full_screen=true&keep_status_bar=true&top_bar_bg_color=f9f9f9&status_bar_type=dark&userid=123603375&from=timeline&isappinstalled=0 --> -<html lang="zh-CN" class=" z-ios"> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> - <meta name="format-detection" content="telephone=no"> - <meta name="applicable-device" content="mobile"> - <meta name="viewport" - content="width=device-width, initial-scale=1, user-scalable=0, maximum-scale=1, minimum-scale=1"> - <meta http-equiv="X-UA-Compatible" content="ie=edge"> - <title>年度聊天报告</title> - <meta name="yixin-share-desc" content="点击查看,我的年度聊天报告"> - <!-- TODO 改成真实分享文案 --> - <meta name="yixin-share-image" content="https://p1.music.126.net/uLDm27B4bC_kKSD8le3WwA==/109951163754269117.jpg"> - <link rel="shortcut icon" href="https://s1.music.126.net/style/favicon.ico"> - <script src="http://share.lc044.love:8080/static/my_resource/raven.min.js"></script> - <script type="text/javascript" src=""></script> - - <link href="http://share.lc044.love:8080/static/my_resource/vendors.a07adb27.css" rel="stylesheet"> - <link href="http://share.lc044.love:8080/static/my_resource/main.ff465555.css" rel="stylesheet"> - <style type="text/css"> - #__vconsole{ - color:#000; - font-size:13px; - font-family:Helvetica Neue,Helvetica,Arial,sans-serif} - #__vconsole . - vc-max-height{ - max-height:19.23076923em - }#__vconsole - .vc-max-height-line{ - max-height:3.38461538em - }#__vconsole - .vc-min-height{ - min-height:3.07692308em - }#__vconsole dd,#__vconsole dl,#__vconsole pre{margin:0}#__vconsole - .vc-switch{display:block;position:fixed;right:.76923077em;bottom:.76923077em;color:#fff;background-color:#04be02;line-height:1;font-size:1.07692308em;padding:.61538462em 1.23076923em;z-index:10000;border-radius:.30769231em;box-shadow:0 0 .61538462em rgba(0,0,0,.4)}#__vconsole .vc-mask{top:0;background:transparent;z-index:10001;transition:background .3s;-webkit-tap-highlight-color:transparent;overflow-y:scroll}#__vconsole .vc-mask,#__vconsole .vc-panel{display:none;position:fixed;left:0;right:0;bottom:0}#__vconsole .vc-panel{min-height:85%;z-index:10002;background-color:#efeff4;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;-webkit-transform:translateY(100%);transform:translateY(100%)}#__vconsole .vc-tabbar{border-bottom:1px solid #d9d9d9;overflow-x:auto;height:3em;width:auto;white-space:nowrap}#__vconsole .vc-tabbar .vc-tab{display:inline-block;line-height:3em;padding:0 1.15384615em;border-right:1px solid #d9d9d9;text-decoration:none;color:#000;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}#__vconsole .vc-tabbar .vc-tab:active{background-color:rgba(0,0,0,.15)}#__vconsole .vc-tabbar .vc-tab.vc-actived{background-color:#fff}#__vconsole .vc-content{background-color:#fff;overflow-x:hidden;overflow-y:auto;position:absolute;top:3.07692308em;left:0;right:0;bottom:3.07692308em;-webkit-overflow-scrolling:touch}#__vconsole .vc-content.vc-has-topbar{top:5.46153846em}#__vconsole .vc-topbar{background-color:#fbf9fe;display:flex;display:-webkit-box;flex-direction:row;flex-wrap:wrap;-webkit-box-direction:row;-webkit-flex-wrap:wrap;width:100%}#__vconsole .vc-topbar .vc-toptab{display:none;flex:1;-webkit-box-flex:1;line-height:2.30769231em;padding:0 1.15384615em;border-bottom:1px solid #d9d9d9;text-decoration:none;text-align:center;color:#000;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}#__vconsole .vc-topbar .vc-toptab.vc-toggle{display:block}#__vconsole .vc-topbar .vc-toptab:active{background-color:rgba(0,0,0,.15)}#__vconsole .vc-topbar .vc-toptab.vc-actived{border-bottom:1px solid #3e82f7}#__vconsole .vc-logbox{display:none;position:relative;min-height:100%}#__vconsole .vc-logbox i{font-style:normal}#__vconsole .vc-logbox .vc-log{padding-bottom:3em;-webkit-tap-highlight-color:transparent}#__vconsole .vc-logbox .vc-log:empty:before{content:"Empty";color:#999;position:absolute;top:45%;left:0;right:0;bottom:0;font-size:1.15384615em;text-align:center}#__vconsole .vc-logbox .vc-item{margin:0;padding:.46153846em .61538462em;overflow:hidden;line-height:1.3;border-bottom:1px solid #eee;word-break:break-word}#__vconsole .vc-logbox .vc-item-info{color:#6a5acd}#__vconsole .vc-logbox .vc-item-debug{color:#daa520}#__vconsole .vc-logbox .vc-item-warn{color:orange;border-color:#ffb930;background-color:#fffacd}#__vconsole .vc-logbox .vc-item-error{color:#dc143c;border-color:#f4a0ab;background-color:#ffe4e1}#__vconsole .vc-logbox .vc-log.vc-log-partly .vc-item{display:none}#__vconsole .vc-logbox .vc-log.vc-log-partly-error .vc-item-error,#__vconsole .vc-logbox .vc-log.vc-log-partly-info .vc-item-info,#__vconsole .vc-logbox .vc-log.vc-log-partly-log .vc-item-log,#__vconsole .vc-logbox .vc-log.vc-log-partly-warn .vc-item-warn{display:block}#__vconsole .vc-logbox .vc-item .vc-item-content{margin-right:4.61538462em;display:block}#__vconsole .vc-logbox .vc-item .vc-item-meta{color:#888;float:right;width:4.61538462em;text-align:right}#__vconsole .vc-logbox .vc-item.vc-item-nometa .vc-item-content{margin-right:0}#__vconsole .vc-logbox .vc-item.vc-item-nometa .vc-item-meta{display:none}#__vconsole .vc-logbox .vc-item .vc-item-code{display:block;white-space:pre-wrap;overflow:auto;position:relative}#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-input,#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-output{padding-left:.92307692em}#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-input:before,#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-output:before{content:"\203A";position:absolute;top:-.23076923em;left:0;font-size:1.23076923em;color:#6a5acd}#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-output:before{content:"\2039"}#__vconsole .vc-logbox .vc-item .vc-fold{display:block;overflow:auto;-webkit-overflow-scrolling:touch}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer{display:block;font-style:italic;padding-left:.76923077em;position:relative}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer:active{background-color:#e6e6e6}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer:before{content:"";position:absolute;top:.30769231em;left:.15384615em;width:0;height:0;border:.30769231em solid transparent;border-left-color:#000}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer.vc-toggle:before{top:.46153846em;left:0;border-top-color:#000;border-left-color:transparent}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-inner{display:none;margin-left:.76923077em}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-inner.vc-toggle{display:block}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-inner .vc-code-key{margin-left:.76923077em}#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer .vc-code-key{margin-left:0}#__vconsole .vc-logbox .vc-code-key{color:#905}#__vconsole .vc-logbox .vc-code-private-key{color:#d391b5}#__vconsole .vc-logbox .vc-code-function{color:#905;font-style:italic}#__vconsole .vc-logbox .vc-code-boolean,#__vconsole .vc-logbox .vc-code-number{color:#0086b3}#__vconsole .vc-logbox .vc-code-string{color:#183691}#__vconsole .vc-logbox .vc-code-null,#__vconsole .vc-logbox .vc-code-undefined{color:#666}#__vconsole .vc-logbox .vc-cmd{position:absolute;height:3.07692308em;left:0;right:0;bottom:0;border-top:1px solid #d9d9d9;display:block!important}#__vconsole .vc-logbox .vc-cmd .vc-cmd-input-wrap{display:block;height:2.15384615em;margin-right:3.07692308em;padding:.46153846em .61538462em}#__vconsole .vc-logbox .vc-cmd .vc-cmd-input{width:100%;border:none;resize:none;outline:none;padding:0;font-size:.92307692em}#__vconsole .vc-logbox .vc-cmd .vc-cmd-input::-webkit-input-placeholder{line-height:2.15384615em}#__vconsole .vc-logbox .vc-cmd .vc-cmd-btn{position:absolute;top:0;right:0;bottom:0;width:3.07692308em;border:none;background-color:#efeff4;outline:none;-webkit-touch-callout:none;font-size:1em}#__vconsole .vc-logbox .vc-cmd .vc-cmd-btn:active{background-color:rgba(0,0,0,.15)}#__vconsole .vc-logbox .vc-group .vc-group-preview{-webkit-touch-callout:none}#__vconsole .vc-logbox .vc-group .vc-group-preview:active{background-color:#e6e6e6}#__vconsole .vc-logbox .vc-group .vc-group-detail{display:none;padding:0 - 0 .76923077em 1.53846154em;border-bottom:1px solid #eee}#__vconsole .vc-logbox .vc-group.vc-actived .vc-group-detail{display:block;background-color:#fbf9fe}#__vconsole .vc-logbox .vc-group.vc-actived .vc-table-row{background-color:#fff}#__vconsole .vc-logbox .vc-group.vc-actived .vc-group-preview{background-color:#fbf9fe}#__vconsole .vc-logbox .vc-table .vc-table-row{display:flex;display:-webkit-flex;flex-direction:row;flex-wrap:wrap;-webkit-box-direction:row;-webkit-flex-wrap:wrap;overflow:hidden;border-bottom:1px solid #eee}#__vconsole .vc-logbox .vc-table .vc-table-row.vc-left-border{border-left:1px solid #eee}#__vconsole .vc-logbox .vc-table .vc-table-col{flex:1;-webkit-box-flex:1;padding:.23076923em .30769231em;border-left:1px solid #eee;overflow:auto;white-space:pre-wrap;word-break:break-word;-webkit-overflow-scrolling:touch}#__vconsole .vc-logbox .vc-table .vc-table-col:first-child{border:none}#__vconsole .vc-logbox .vc-table .vc-small .vc-table-col{padding:0 .30769231em;font-size:.92307692em}#__vconsole .vc-logbox .vc-table .vc-table-col-2{flex:2;-webkit-box-flex:2}#__vconsole .vc-logbox .vc-table .vc-table-col-3{flex:3;-webkit-box-flex:3}#__vconsole .vc-logbox .vc-table .vc-table-col-4{flex:4;-webkit-box-flex:4}#__vconsole .vc-logbox .vc-table .vc-table-col-5{flex:5;-webkit-box-flex:5}#__vconsole .vc-logbox .vc-table .vc-table-col-6{flex:6;-webkit-box-flex:6}#__vconsole .vc-logbox .vc-table .vc-table-row-error{border-color:#f4a0ab;background-color:#ffe4e1}#__vconsole .vc-logbox .vc-table .vc-table-row-error .vc-table-col{color:#dc143c;border-color:#f4a0ab}#__vconsole .vc-logbox .vc-table .vc-table-col-title{font-weight:700}#__vconsole .vc-logbox.vc-actived{display:block}#__vconsole .vc-toolbar{border-top:1px solid #d9d9d9;line-height:3em;position:absolute;left:0;right:0;bottom:0;display:flex;display:-webkit-box;flex-direction:row;-webkit-box-direction:row}#__vconsole .vc-toolbar .vc-tool{display:none;text-decoration:none;color:#000;width:50%;flex:1;-webkit-box-flex:1;text-align:center;position:relative;-webkit-touch-callout:none}#__vconsole .vc-toolbar .vc-tool.vc-global-tool,#__vconsole .vc-toolbar .vc-tool.vc-toggle{display:block}#__vconsole .vc-toolbar .vc-tool:active{background-color:rgba(0,0,0,.15)}#__vconsole .vc-toolbar .vc-tool:after{content:" ";position:absolute;top:.53846154em;bottom:.53846154em;right:0;border-left:1px solid #d9d9d9}#__vconsole .vc-toolbar .vc-tool-last:after{border:none}#__vconsole.vc-toggle .vc-switch{display:none}#__vconsole.vc-toggle .vc-mask{background:rgba(0,0,0,.6);display:block}#__vconsole.vc-toggle .vc-panel{-webkit-transform:translate(0);transform:translate(0)} - - </style> - <style type="text/css"> - .vcelm-node{color:#183691}.vcelm-k{color:#0086b3}.vcelm-v{color:#905}.vcelm-l{padding-left:8px;position:relative;word-wrap:break-word;line-height:1}.vcelm-l.vc-toggle>.vcelm-node{display:block}.vcelm-l .vcelm-node:active{background-color:rgba(0,0,0,.15)}.vcelm-l.vcelm-noc .vcelm-node:active{background-color:transparent}.vcelm-t{white-space:pre-wrap;word-wrap:break-word}.vcelm-l .vcelm-l{display:none}.vcelm-l.vc-toggle>.vcelm-l{margin-left:4px;display:block}.vcelm-l:before{content:"";display:block;position:absolute;top:6px;left:3px;width:0;height:0;border:3px solid transparent;border-left-color:#000}.vcelm-l.vc-toggle:before{display:block;top:6px;left:0;border-top-color:#000;border-left-color:transparent}.vcelm-l.vcelm-noc:before{display:none} -/* 倒计时开始 */ -.gn_box { -padding: 0px 0px; -margin-bottom:0px; -text-align: center; -background-color: #83caa3; -} -#t_d{ -color: #a8ca2e; -font-size: 18px; -} -#t_h{ -color: #a8ca2e; -font-size: 18px; -} -#t_m{ -color: #a8ca2e; -font-size: 18px; -} -#t_s{ -color: #a8ca2e; -font-size: 18px; -} -#text{ -color: #a8ca2e; -font-size: 18px; -} - - </style> -</head> -<body> -<div style="margin:0 auto; width:0; height:0; overflow:hidden;"> - <!-- TODO 分享图片 --> - <img id="out-share-pic" src="http://share.lc044.love:8080/static/my_resource/FtW_Z9lkb47ObTsGSSBlPg==_19135900369963408" width="580"></div> -<div id="j-root" class="g-bd"> - <div class="m-app"> - <div class="m-module m-module-report z-modshow"> - <div class="m-reportcontent f-page"> - <div class="m-page m-page-cover f-page z-enter"> - <div id="comp" - style="transform: translate3d(0px, 0px, 0px) rotate(0.0001deg); transform-style: preserve-3d; backface-visibility: hidden;"> - <div data-depth="0" class="id8_bggpngc" - style="transform: translate3d(0px, 0px, 0px); transform-style: preserve-3d; backface-visibility: hidden; position: relative; display: block; left: 0px; top: 0px;"> - <div id="id8_bggpng"></div> - </div> - <div data-depth="0.4" class="id7_stars2pngc" - style="transform: translate3d(0px, 0px, 0px); transform-style: preserve-3d; backface-visibility: hidden; position: absolute; display: block; left: 0px; top: 0px;"> - <div id="id7_stars2png"></div> - </div> - <div data-depth="0.7" class="id6_stars1pngc" - style="transform: translate3d(0px, 0px, 0px); transform-style: preserve-3d; backface-visibility: hidden; position: absolute; display: block; left: 0px; top: 0px;"> - <div id="id6_stars1png"></div> - </div> - <div data-depth="0.2" class="id4_middlePlanetpngc" - style="transform: translate3d(0px, 0px, 0px); transform-style: preserve-3d; backface-visibility: hidden; position: absolute; display: block; left: 0px; top: 0px;"> - <div id="id4_middlePlanetpng"></div> - </div> - - <div id="no2" - style="transform: translate3d(0px, 0px, 0px); transform-style: preserve-3d; backface-visibility: hidden; position: absolute; display: block; left: 0px; top: 0px;"> - <div id="liuxing2"></div> - <div id="id5_manwithbigplanetpng"></div> - - <div class="tt" - style="background:url(http://share.lc044.love:8080/static/my_resource/hello.png) no-repeat !important"></div> - <div style="height:400px;-webkit-writing-mode: vertical-rl;writing-mode: vertical-rl;font-family: STFangsong;color:white;position: absolute;top:5.6%;right: 13%"> - <p style="letter-spacing:.2em;font-size:39px;">未眠人</p> - <p style="letter-spacing:.3em;font-size:24px;">{{sub_title}}</p> - </div> - <div style="margin-top:8%;" align="center"> - <table> - <tr> - <td> - <div style="width:100px; height:100px; border-radius:100%; overflow:hidden;"> - <img src="{{avatar_path}}" alt="avatar"> - </div> - </td> - <td> - <div> - <p style="letter-spacing:.3em;font-family: STFangsong;color:white;font-size:48px;"> - {{nickname}}</p> - </div> - </td> - </tr> - </table> - <div style="margin-top:50px;"> - <p style="letter-spacing:.3em;font-family: STFangsong;color:white;font-size:28px;"> - 我们第一次聊天发生在</p> - <p id="first_time" - style="letter-spacing:.3em;font-family: STFangsong;color:white;font-size:28px;"> - {{first_time}}</p> - <div id="CountMsg" class="HotDate"> - <span id="text">距今已有</span> - <span id="t_d">626 天</span> - <span id="t_h">6 时</span> - <span id="t_m">26 分</span> - <span id="t_s">26 秒</span> - </div> - </div> - </div> - <div id="id2_gxpng"></div> - <div id="id1_lightNotepng"></div> - <div class="enter">进入</div> - </div> - </div> - </div> - </div> - </div> - </div> -</div> -<!--<audio id="j-bgm" src="//m8.music.126.net/20281226102943/a9c7bb0373e763749d06243b598ae1b0/ymusic/annual2018/v1/bgm.mp3"--> -<!-- autoplay="" preload="" loop="" muted=""></audio>--> -<script type="text/javascript" src="http://share.lc044.love:8080/static/my_resource/vendors.9fee400a.js"></script> -<script type="text/javascript" src="http://share.lc044.love:8080/static/my_resource/main.17f67bd0.js"></script> -<script type="text/javascript"> function getRTime() { - var tt = document.getElementById("first_time").innerText; - var EndTime = new Date(tt); - var NowTime = new Date(); - var t = NowTime.getTime()-EndTime.getTime(); - var d = Math.floor(t / 1000 / 60 / 60 / 24); - var h = Math.floor(t / 1000 / 60 / 60 % 24); - var m = Math.floor(t / 1000 / 60 % 60); - var s = Math.floor(t / 1000 % 60); - document.getElementById("t_d").innerHTML = d + " 天"; - document.getElementById("t_h").innerHTML = h + " 时"; - document.getElementById("t_m").innerHTML = m + " 分"; - document.getElementById("t_s").innerHTML = s + " 秒"; -} -setInterval(getRTime, 1000); - -</script> -<div> - <div></div> -</div> -</body> -</html> \ No newline at end of file diff --git a/app/web_ui/templates/index.html b/app/web_ui/templates/index.html deleted file mode 100644 index cb2aec8..0000000 --- a/app/web_ui/templates/index.html +++ /dev/null @@ -1,441 +0,0 @@ -<!DOCTYPE html> -<html lang="zh-CN"> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>微信年度聊天报告</title> - <link rel="stylesheet" href="css/style.css"> - <link rel="stylesheet" href="https://memotrace.cn/static/css/fullpage.min.css" /> - <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@latest/dist/echarts.min.js"></script> - <script type="text/javascript" src="https://assets.pyecharts.org/assets/v5/echarts-wordcloud.min.js"></script> - <script type="text/javascript" src="https://assets.pyecharts.org/assets/v5/maps/china.js"></script> - <script type="text/javascript" src="https://code.jquery.com/jquery-3.6.4.min.js"></script> - <script type="text/javascript" src="https://memotrace.cn/static/js/fullpage.min.js"></script> - <script type="text/javascript" src="https://davidshimjs.github.io/qrcodejs/qrcode.min.js"></script> - <style> - body { - /* background-color: rgb(57,56,206); */ - background: linear-gradient(to right, #9ebdd8,#84aeea), - url("critters.png"); - /* background-image: url('../img/背景.png'); */ - margin: 0; - display: flex; - color: #fcf5f5; - flex-direction: column; - align-items: center; -} -.section{ - height: 100vh; - margin: 0px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; -} -.slide{ - margin: 0px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; -} -#snow { - position: fixed; - top: 0; - left: 0; - pointer-events: none; - z-index: 1000; -} -@keyframes snowfall { - from { - transform: translateY(-100vh); - } - to { - transform: translateY(100vh); - } -} -.snowflake { - position: absolute; - background-image: url('../img/snow2.png'); - background-size: contain; /* ä¿æŒé›ªèŠ±å›¾ç‰‡çš„原始比例 */ - animation: snowfall linear infinite; - animation-duration: 15s; /* ä¿®æ”¹ä¸ºä½ å¸Œæœ›çš„åŠ¨ç”»æŒç»æ—¶é—´ */ - animation-delay: calc(-15s * var(--animation-order)); -} -.snowflake0 { - position: absolute; - background-color: #fff; - border-radius: 50%; - content: ''; - z-index: -1; - } -.Mountain-Image{ - position: absolute; - bottom: 0; - left: 0; - width: 100%; - max-height: 20%; -} -/* home */ - -ul,li{ -list-style:none; -} -ul{ -overflow:hidden; -padding:3em; -} -ul li a{ -text-decoration:none; -color:#000 ; -background:#ffc ; -display:block; -height:10em; -width:10em; -padding:1em; -} -ul li{ -margin:1em; -float:left; -} - -ul li h2 -{ - margin: 0; - font-size: 140%; - font-weight: bold; - padding-bottom: 10px; -} -ul li p -{ - margin: 0; - font-family: “Reenie Beanie” ,arial,sans-serif,微软雅黑; - font-size: 110%; -} - -ul li a - { - text-decoration: none; - color: #000 ; - background: #ffc ; - display: block; - height: 10em; - width: 10em; - padding: 1em; /* Firefox */ - -moz-box-shadow: 5px 5px 7px rgba(33,33,33,1) ; /* Safari+Chrome */ - -webkit-box-shadow: 5px 5px 7px rgba(33,33,33,.7) ; /* Opera */ - box-shadow: 5px 5px 7px rgba(33,33,33,.7) ; - } - ul li a{ --webkit-transform:rotate(-6deg); --o-transform:rotate(-6deg); --moz-transform:rotate(-6deg); -} - -ul li:nth-child(even) a{ --o-transform:rotate(4deg); --webkit-transform:rotate(4deg); --moz-transform:rotate(4deg); -position:relative; -top:5px; -} -ul li:nth-child(3n) a{ --o-transform:rotate(-3deg); --webkit-transform:rotate(-3deg); --moz-transform:rotate(-3deg); -position:relative; -top:-5px; -} -ul li:nth-child(5n) a{ --o-transform:rotate(5deg); --webkit-transform:rotate(5deg); --moz-transform:rotate(5deg); -position:relative; -top:-10px; -} - -ul li a:hover,ul li a:focus{ --moz-box-shadow:10px 10px 7px rgba(0,0,0,.7) ; --webkit-box-shadow: 10px 10px 7px rgba(0,0,0,.7) ; -box-shadow:10px 10px 7px rgba(0,0,0,.7) ; --webkit-transform: scale(1.25); --moz-transform: scale(1.25); --o-transform: scale(1.25); -position:relative; -z-index:5; -} - -ul li:nth-child(even) a{ --o-transform:rotate(4deg); --webkit-transform:rotate(4deg); --moz-transform:rotate(4deg); -position:relative; -top:5px; -background:#cfc ; -} -ul li:nth-child(3n) a{ --o-transform:rotate(-3deg); --webkit-transform:rotate(-3deg); --moz-transform:rotate(-3deg); -position:relative; -top:-5px; -background:#ccf ; -} -a{ - padding: 0px; -} -.contact-container{ - padding-bottom: 5px; - display: flex; - justify-content: space-between; - align-items: center; -} -.avatar{ - height: 45px; - width: 45px; - border-radius: 50%; -} -.nickname{ - font: 1.1em sans-serif; - font-weight: bold; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - text-overflow: ellipsis; /* 显示省略号 */ - max-width: 200px; /* 设置最大宽度,可以根据需要调整 */ - overflow: hidden; -} - - -/* CSS代码 */ -.number { - font: 1.1em sans-serif; - color: #af27ca; - margin: 5px; - } - - - #cover { - text-align: center; - animation: fadeIn 3s ease-out; -} - -.cover { - text-align: center; - animation: fadeIn 3s ease-out; -} -h1 { - color: #003366; - font-size: 3em; - margin-bottom: 10px; -} - -p { - color: #0066cc; - font-size: 1.2em; -} - -#enterButton { - cursor: pointer; - padding: 10px 20px; - background-color: #003366; - color: #fff; - border: none; - font-size: 1em; - margin-top: 20px; - transition: background-color 0.3s; -} - -#enterButton:hover { - background-color: #001a33; -} - -@keyframes fadeIn { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -.chart{ - width: 800px; - height: 500px; -} -.chart-container{ - display: flex; -} -#word_cloud{ - width: 700px; - height: 600px; -} -@media screen and (max-width:480px){ - .chart{ - width: 300px; - height: 400px; - } - .chart-container{ - display:flex; - flex-direction: column; - } - #word_cloud{ - width: 400px; - height: 400px; - } -} - -#keywords { - font-size: 2.5em; - color: #003366; - animation: slideIn 1.5s ease-out; - transform: skew(-15deg); -} - -@keyframes slideIn { - from { - opacity: 0; - transform: translateX(-50px) skew(-15deg); - } - to { - opacity: 1; - transform: translateX(0) skew(-15deg); - } -} - - </style> -</head> -<body> - <div id="snow"></div> - <!-- Your content goes here --> - <div id="fullpage"> - <div class="section"> - <div id="cover"> - <h1>年度聊天报告</h1> - <p>可掌控的才真正属于你</p> - <button id="enterButton" onclick="navigateToNextPage()">进入报告</button> - </div> - </div> - <div class="section cover"> - <h1>2023年</h1> - <p>你一共给<span class="number">{{contact_num}}</span>个联系人<br>发送了<span class="number">{{send_msg_num}}</span>条消息<br>收到了<span class="number">{{receive_msg_num}}</span>条消息<br>总计<span class="number">{{total_text_num}}</span>字</p> - <p>男<span class="number">{{man_contact_num}}</span>人 女<span class="number">{{woman_contact_num}}</span>人 </p> - <div class="slide" data-anchor="slide1"> - <div id="contact_region_map" class="chart" ></div> - </div> - <div class="slide" data-anchor="slide1"> - <div id="types-chart" class="chart"></div> - </div> - <div class="slide" data-anchor="slide1"> - <div id="sender-chart" class="chart" ></div> - </div> - - - </div> - <div class="section cover"> - <h1>年度关键词</h1> - <div id="keywords">“{{keyword}}”<span class="number">{{keyword_max_num}}</span>次</div> - <div id="word_cloud"></div> - </div> - <div class="section cover"> - <h1>年度聊天好友</h1> - <h2>聊天榜单</h2> - <ul> - {% for contact,msg_num,text_length in contact_topN:%} - <li> - <a href="/charts/{{contact.wxid}}" target="_blank"> - <div class="contact-container"> - <p class="nickname">{{contact.remark}}</p> - <img class="avatar" src="{{contact.smallHeadImgUrl}}"> - </div> - <div style="color: blueviolet;"><span class="number">{{msg_num}}</span>条消息<br><span class="number">{{text_length}}</span>字</div> - </a> - </li> - {% endfor %} - </ul> - </div> - <div class="section" style="text-align: center;display:flex;justify-content: center;align-items: center;"> - <h1>敬请期待</h1> - <div> - <img src="https://memotrace.cn/img/logo3.0.png" alt="Logo"> - <p class="text-larger mb-2">Copyrights © 2022-2024 <a href="https://memotrace.cn/">SiYuan</a> 版权所有. Inc.</p> - <!-- <span class="op-07">请遵守所在国家的相关法律法规</span> --> - </div> - </div> - </div> -<script> - // JavaScript 代码用于生成聊天内容和雪花动画 - document.addEventListener('DOMContentLoaded', function () { - const snowContainer = document.getElementById('snow'); - // 生成雪花动画 - for (let i = 0; i < 50; i++) { - const snowflake = document.createElement('div'); - snowflake.className = 'snowflake'; - var ran = Math.random(); - var ran0 = 1-ran; - snowflake.style.left = `${Math.random() * 150}vw`; - snowflake.style.animationDuration = `${ran0 * 20 + 7}s`; - snowflake.style.setProperty('--animation-order', i); - - // 设置雪花的随机大小 - const size = ran * 20 + 10; // 随机大小在 10 到 30 之间 - snowflake.style.width = `${size}px`; - snowflake.style.height = `${size}px`; - - snowContainer.appendChild(snowflake); - } - }); - function createSnowflake(top, left) { - const snowflake = document.createElement('div'); - snowflake.className = 'snowflake0'; - snowflake.style.top = `${top}vh`; - snowflake.style.left = `${left}vw`; - // 设置雪花的随机大小 - const size = Math.random() * 20 + 10; // 随机大小在 10 到 30 之间 - snowflake.style.width = `${size}px`; - snowflake.style.height = `${size}px`; - document.body.appendChild(snowflake); - } -</script> -<script> - $(document).ready(function() { - $('#fullpage').fullpage(); - }); - // 获取按钮元素 - var scrollToNextButton = document.getElementById('scrollToNext'); - function navigateToNextPage(){ - fullpage_api.moveSectionDown(); - } - </script> -<script> - var chart_51ebd4312946429e9c32b2b55b96a479 = echarts.init( - document.getElementById('types-chart'), 'white', {renderer: 'canvas'}); - var result = {{chart_data_types|safe}}; - chart_51ebd4312946429e9c32b2b55b96a479.setOption(result); - - var chart_51ebd4312946429e9c32b2b55b96a479 = echarts.init( - document.getElementById('contact_region_map'), 'white', {renderer: 'canvas'}); - var result = {{contact_region_map|safe}}; - chart_51ebd4312946429e9c32b2b55b96a479.setOption(result); - - var chart_51ebd4312946429e9c32b2b55b96a4 = echarts.init( - document.getElementById('sender-chart'), 'white', {renderer: 'canvas'}); - var result = {{chart_data_sender|safe}}; - chart_51ebd4312946429e9c32b2b55b96a4.setOption(result); - - var chart_51ebd4312946429e9c32b2b55b96 = echarts.init( - document.getElementById('word_cloud'), 'white', {renderer: 'canvas'}); - var result = {{chart_data_wordcloud|safe}}; - // 获取屏幕宽度 - const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; - // 根据屏幕宽度设置字体范围 - let fontSizeRange; - if (screenWidth < 768) { // 手机屏幕 - fontSizeRange = [5, 40]; - } else { // 电脑屏幕 - fontSizeRange = [10, 100]; - } - result.series[0].sizeRange = fontSizeRange; - chart_51ebd4312946429e9c32b2b55b96.setOption(result); -</script> -</body> -</html> diff --git a/app/web_ui/templates/wordcloud.html b/app/web_ui/templates/wordcloud.html deleted file mode 100644 index 294de46..0000000 --- a/app/web_ui/templates/wordcloud.html +++ /dev/null @@ -1,99 +0,0 @@ -<!DOCTYPE html> -<!-- saved from url=(0167)http://m2.link/c/year2018/j3POd/?uid=53899B14C24F351212F4DC92673113FC&full_screen=true&keep_status_bar=true&top_bar_bg_color=f9f9f9&status_bar_type=dark&userid=2227269 --> -<html lang="zh-CN" class=" z-ios"> - -<head> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> - <meta name="format-detection" content="telephone=no"> - <meta name="applicable-device" content="mobile"> - <meta name="viewport" - content="width=device-width, initial-scale=1, user-scalable=0, maximum-scale=1, minimum-scale=1"> - <meta http-equiv="X-UA-Compatible" content="ie=edge"> - <title>年度聊天报告</title> - <meta name="yixin-share-desc" content="点击查看,我的年度聊天报告"> - <meta name="yixin-share-image" content="https://p1.music.126.net/uLDm27B4bC_kKSD8le3WwA==/109951163754269117.jpg"> - <link rel="shortcut icon" href="http://s1.music.126.net/style/favicon.ico"> - <script src="http://share.lc044.love:8080/static/my_resource/raven.min.js"></script> - <script type="text/javascript" src="http://share.lc044.love:8080/static/my_resource/tool.min.js"></script> - <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script> - <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script> - <script type="text/javascript" src="https://assets.pyecharts.org/assets/v5/echarts.min.js"></script> - <script type="text/javascript" src="https://assets.pyecharts.org/assets/v5/echarts-wordcloud.min.js"></script> - <link href="http://share.lc044.love:8080/static/my_resource/vendors.a07adb27.css" rel="stylesheet"> - <link href="http://share.lc044.love:8080/static/my_resource/main.ff465555.css" rel="stylesheet"> -</head> - -<body> -<div id="j-root" class="g-bd"> - <div class="m-app"> - <div class="m-module m-module-report z-modshow"> - <div class="m-reportcontent f-page"> - <div class="m-page m-page-01 f-page z-enter"> - <div class="bg f-page"></div> - <div class="tt f-animOpac" style="font-size:30px !important"> - <h1>二零二三</h1> - <h1>{{ who }}说的最多的是</h1></div> - <div class="ckeywords j-anim01 z-anim"> - <div class="hands"> - <div class="hand2"></div> - <div class="hand1"></div> - <div class="hand3"></div> - </div> - <div class="words words-2"> - {% for t in keyword %} - <span class="word word-1" style="font-size:80px !important"> - <i class="u-word">{{t}}</i></span> - {% endfor %} - </div> - <div class="nums f-animOpac"> - {% for n in max_num[::-1] %} - <span class="n">{{n}}</span> - {% endfor %} - <i class="unit"></i> - </div> - </div> - <div class="hand4"></div> - <ul class="lyrics"> - {% for dialog in dialogs %} - <li class="itm f-animLineUp"> - <div style="transform: translateX(13.7643px);"> - <div class="line1 f-thide" style="font-size:20px !important"> - {% for p in dialog[0][2][:-1] %} - {{p}} - <em class="s-fcRed">{{keyword}}</em> - {% endfor %} - {{dialog[0][2][-1]}} - </div> - <br> - <div class="line2 f-thide">- {{dialog[1][2]}}<br>{{dialog[0][3]}}</div> - </div> - </li> - {% endfor %} - - <!-- <li class="itm f-animLineUp"> - <div style="transform: translateX(26.2581px);"> - <div class="line1 f-thide" style="font-size:20px !important">我还是 - <em class="s-fcRed">喜欢</em>大城市 - </div> - <br> - <div class="line2 f-thide">- 很繁华</div> - </div> - </li> --> - </ul> - </div> - <div id="word_cloud" class="chart-container" style="width:780px; height:720px;margin: auto;top:22%"></div> - </div> - <div class="m-btmbar"></div> - </div> - </div> -</div> -<script> - var chart = echarts.init(document.getElementById('word_cloud'), 'white', {renderer: 'canvas'}); - var result = {{chart_data|safe}}; - console.log(result); - chart.setOption(result); -</script> - -</body> - -</html> diff --git a/app/web_ui/web.py b/app/web_ui/web.py deleted file mode 100644 index ec98616..0000000 --- a/app/web_ui/web.py +++ /dev/null @@ -1,297 +0,0 @@ -import os -import sys -import time -from urllib.parse import urljoin - -import requests -from flask import Flask, render_template, send_file, jsonify, make_response, request -from pyecharts.charts import Bar - -from app.DataBase import msg_db, micro_msg_db -from app.DataBase.hard_link import decodeExtraBuf -from app.analysis import analysis -from app.config import SERVER_API_URL -from app.person import Contact, Me, ContactDefault -from app.util.emoji import get_most_emoji -from app.util.region_conversion import conversion_region_to_chinese - -app = Flask(__name__) - -run_flag = False -wxid = '' -contact: Contact = None -start_time = '2023-1-01 00:00:00' -end_time = '2023-12-31 23:59:59' -time_range = (start_time, end_time) -html: str = '' - -api_url = urljoin(SERVER_API_URL,'upload') - - - -def get_contact(wxid) -> ContactDefault | Contact: - contact_info_list = micro_msg_db.get_contact_by_username(wxid) - if not contact_info_list: - return ContactDefault('') - detail = decodeExtraBuf(contact_info_list[9]) - # detail = {} - contact_info = { - 'UserName': contact_info_list[0], - 'Alias': contact_info_list[1], - 'Type': contact_info_list[2], - 'Remark': contact_info_list[3], - 'NickName': contact_info_list[4], - 'smallHeadImgUrl': contact_info_list[7], - 'label_name': contact_info_list[10], - 'detail': detail, - } - contact =Contact(contact_info) - print(detail) - # region = contact.detail.get('region') - # area = conversion_region_to_chinese(region) - # print(area) - return contact - - -@app.route("/") -def index(): - contact_topN_num = msg_db.get_chatted_top_contacts(time_range=time_range, top_n=9999999, contain_chatroom=True) - total_msg_num = sum(list(map(lambda x: x[1], contact_topN_num))) - contact_topN = [] - for wxid, num in contact_topN_num: - contact = get_contact(wxid) - text_length = 0 - contact_topN.append([contact, num, text_length]) - contacts_data = analysis.contacts_analysis(contact_topN) - contact_topN = [] - send_msg_num = msg_db.get_send_messages_number_sum(time_range) - contact_topN_num = msg_db.get_chatted_top_contacts(time_range=time_range, top_n=9999999, contain_chatroom=False) - - for wxid, num in contact_topN_num[:6]: - contact = get_contact(wxid) - text_length = msg_db.get_message_length(wxid, time_range) - contact_topN.append([contact, num, text_length]) - - my_message_counter_data = analysis.my_message_counter(time_range=time_range) - data = { - 'avatar': Me().smallHeadImgUrl, - 'contact_topN': contact_topN, - 'contact_num': len(contact_topN_num), - 'send_msg_num': send_msg_num, - 'receive_msg_num': total_msg_num - send_msg_num, - } - return render_template('index.html', **data,**contacts_data, **my_message_counter_data) - - -@app.route("/christmas/<wxid>") -def christmas(wxid): - contact = get_contact(wxid) - # 渲染模板,并传递图表的 HTML 到模板中 - try: - first_message, first_time = msg_db.get_first_time_of_message(contact.wxid) - except TypeError: - first_time = '2023-01-01 00:00:00' - data = { - 'ta_avatar_path': contact.smallHeadImgUrl, - 'my_avatar_path': Me().smallHeadImgUrl, - 'ta_nickname': contact.remark, - 'my_nickname': Me().name, - 'first_time': first_time, - } - wordcloud_cloud_data = analysis.wordcloud_christmas(contact.wxid,time_range=time_range) - msg_data = msg_db.get_messages_by_hour(contact.wxid, time_range=time_range) - msg_data.sort(key=lambda x: x[1], reverse=True) - desc = { - '夜猫子': {'22:00', '23:00', '00:00', '01:00', '02:00', '03:00', '04:00', '05:00'}, - '正常作息': {'06:00', "07:00", "08:00", "09:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", - "17:00", "18:00", "19:00", "20:00", "21:00"}, - } - time_, num = msg_data[0] if msg_data else ('', 0) - chat_time = f"凌晨{time_}" if time_ in {'00:00', '01:00', '02:00', '03:00', '04:00', '05:00'} else time_ - label = '夜猫子' - for key, item in desc.items(): - if time_ in item: - label = key - latest_dialog = msg_db.get_latest_time_of_message(contact.wxid, time_range=time_range) - latest_time = latest_dialog[0][2] if latest_dialog else '' - time_data = { - 'latest_time': latest_time, - 'latest_time_dialog': latest_dialog, - 'chat_time_label': label, - 'chat_time': chat_time, - 'chat_time_num': num, - } - month_data = msg_db.get_messages_by_month(contact.wxid, time_range=time_range) - - if month_data: - month_data.sort(key=lambda x: x[1]) - max_month, max_num = month_data[-1] - min_month, min_num = month_data[0] - min_month = min_month[-2:].lstrip('0') + '月' - max_month = max_month[-2:].lstrip('0') + '月' - else: - max_month, max_num = '月份', 0 - min_month, min_num = '月份', 0 - - month_data = { - 'year': '2023', - 'total_msg_num': msg_db.get_messages_number(contact.wxid, time_range=time_range), - 'max_month': max_month, - 'min_month': min_month, - 'max_month_num': max_num, - 'min_month_num': min_num, - } - - calendar_data = analysis.calendar_chart(contact.wxid, time_range) - emoji_msgs = msg_db.get_messages_by_type(contact.wxid, 47, time_range=time_range) - url, num = get_most_emoji(emoji_msgs) - emoji_data = { - 'emoji_total_num': len(emoji_msgs), - 'emoji_url': url, - 'emoji_num': num, - } - global html - html = render_template("christmas.html", **data, **wordcloud_cloud_data, **time_data, **month_data, **calendar_data, - **emoji_data) - return html - - -@app.route('/upload') -def upload(): - global html - data = { - 'html_content': html, - 'wxid': contact.wxid, - 'username': Me().wxid, - 'token':Me().token, - 'type': 'contact' - } - response = requests.post(api_url, data=data) - print(response) - print(response.json()) - response = make_response(response.json()) - response.headers.add('Access-Control-Allow-Origin', '*') # Replace '*' with specific origins if needed - response.headers.add('Content-Type', 'application/json') - return response - - -def set_text(text): - html = ''' - <!DOCTYPE html> - <html lang="en"> - <head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>Centered Text</title> - <style> - body { - display: flex; - align-items: center; - justify-content: center; - height: 100vh; - margin: 0; - } - - .centered-text { - font-size: 2em; - text-align: center; - } - </style> - </head> - <body> - <div class="centered-text"> - <!-- 这里是要显示的四个大字 --> - %s - <img src="https://res.wx.qq.com/t/wx_fed/we-emoji/res/v1.2.8/assets/newemoji/Yellowdog.png" id="旺柴" class="emoji_img"> - </div> - </body> - </html> - ''' % (text) - return html - - -@app.route('/test') -def test(): - return set_text('以下内容仅对VIP开放') - - -def run(port=21314): - global run_flag - if not run_flag: - try: - app.run(debug=True, host='0.0.0.0', port=port, use_reloader=False) - run_flag = True - except: - pass - else: - pass - - -def resource_path(relative_path): - """ Get absolute path to resource, works for dev and for PyInstaller """ - base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) - return os.path.join(base_path, relative_path) - - -@app.route('/data/avatar/<filename>') -def get_image(filename): - try: - # 返回动态生成的图片 - return send_file(os.path.join("../../data/avatar/", filename), mimetype='image/png') - except: - return send_file(os.path.join(f"{os.getcwd()}/data/avatar/", filename), mimetype='image/png') - - -@app.route('/month_count', methods=['POST']) -def get_chart_options(): - wxid = request.json.get('wxid') - time_range = request.json.get('time_range', []) - data = analysis.month_count(wxid, time_range=time_range) - return jsonify(data) - - -@app.route('/wordcloud', methods=['POST']) -def get_wordcloud(): - wxid = request.json.get('wxid') - time_range = request.json.get('time_range', []) - - world_cloud_data = analysis.wordcloud_(wxid, time_range=time_range) - return jsonify(world_cloud_data) - - -@app.route('/charts/<wxid>') -def charts(wxid): - # 渲染模板,并传递图表的 HTML 到模板中 - contact = get_contact(wxid) - try: - first_message, first_time = msg_db.get_first_time_of_message(wxid) - except TypeError: - first_time = '2023-01-01 00:00:00' - data = { - 'wxid': wxid, - 'my_nickname': Me().name, - 'ta_nickname': contact.remark, - 'first_time': first_time - } - return render_template('charts.html', **data) - - -@app.route('/calendar', methods=['POST']) -def get_calendar(): - wxid = request.json.get('wxid') - time_range = request.json.get('time_range', []) - world_cloud_data = analysis.calendar_chart(wxid, time_range=time_range) - return jsonify(world_cloud_data) - - -@app.route('/message_counter', methods=['POST']) -def get_counter(): - wxid = request.json.get('wxid') - time_range = request.json.get('time_range', []) - contact = get_contact(wxid) - data = analysis.sender(wxid, time_range=time_range, my_name=Me().name, ta_name=contact.remark) - return jsonify(data) - - -if __name__ == "__main__": - app.run(debug=True, host='0.0.0.0') diff --git a/doc/开发者手册.md b/doc/开发者手册.md index aa21e0f..d913b7e 100644 --- a/doc/开发者手册.md +++ b/doc/开发者手册.md @@ -1,84 +1,4 @@ # 开发者手册 ## 源码运行 -运行前请确保您的电脑上已经安装了Git、版本不低于3.10的Python、部分第三方库需要用到MSVC,需要提前安装Windows构建工具 - -### 1. 安装 - -```shell -# Python>=3.10 仅支持3.10、3.11、3.12,请勿使用其他Python版本 -git clone https://github.com/LC044/WeChatMsg -# 网络不好推荐用Gitee -# git clone https://gitee.com/lc044/WeChatMsg.git -cd WeChatMsg -pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple -``` - -### 2. 使用 - -1. 登录微信 - -手机端使用聊天记录迁移功能将聊天数据迁移到电脑上(可选) - -操作步骤: -- 安卓: 手机微信->我->设置->聊天->聊天记录迁移与备份->迁移-> 迁移到电脑微信(迁移完成后重启微信)[否则](https://github.com/LC044/WeChatMsg/issues/27) -- iOS: 手机微信->我->设置->通用->聊天记录迁移与备份->迁移-> 迁移到电脑微信(迁移完成后重启微信)[否则](https://github.com/LC044/WeChatMsg/issues/27) - -2. 运行程序 - -```shell -python main.py -``` - -3. 点击获取信息 - - - -4. 设置微信安装路径(如果自动设置好了就**不用管**了) - -可以到微信->设置->文件管理查看 - - - -点击**设置微信路径**按钮,选择该文件夹路径下的带有wxid_xxx的路径(没有wxid的话先选择其中一个文件夹不对的话换其他文件夹) - - - -5. 获取到key和微信路径之后点击开始启动 -6. 数据库文件保存在./app/DataBase/Msg路径下 - -### 3. 查看 - -随便下载一个SQLite数据库查看软件就能打开数据库,例如[DB Browser for SQLite](https://sqlitebrowser.org/dl/) - -* [数据库功能介绍](./数据库介绍.md) - -## 仓库目录功能介绍 - -```text -├─app -│ ├─analysis # 聊天数据分析、画图的实现 -│ ├─components # PyQt写的一些自定义UI组件 -│ ├─data # 存储程序用到的必要数据文件 -│ ├─DataBase # 有关数据库的操作和聊天记录导出 -│ ├─decrypt # 数据库解密 -│ ├─log # 日志存储 -│ ├─resources # 必要的资源文件 -│ ├─ui # ui界面实现 -│ │ ├─chat # 聊天界面 -│ │ ├─contact # 联系人界面 -│ │ │ ├─export # 联系人聊天记录导出 -│ │ │ └─userinfo # 联系人详细信息 -│ │ ├─menu # 菜单栏功能的实现 -│ │ ├─QSS # 样式表 -│ │ └─tool # 工具界面 -│ │ ├─get_bias_addr # 获取微信基址 -│ │ ├─pc_decrypt # 数据库解密 -│ │ └─setting # 设置 -│ ├─util # 用到的一些通用工具(聊天数据解析、音视频处理) -│ │ └─protocbuf -│ └─web_ui # 年度报告等网页的实现(flask) -│ └─templates # HTML模板 -├─doc # 文档 -└─resource # pyecharts资源文件,供打包使用 -``` \ No newline at end of file +[点击查看详细设计文档](https://blog.lc044.love/post/13) diff --git a/example/1-decrypt.py b/example/1-decrypt.py new file mode 100644 index 0000000..58cc5c4 --- /dev/null +++ b/example/1-decrypt.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/3/11 18:17 +@Author : SiYuan +@Email : 863909694@qq.com +@File : WeChatMsg-1-decrypt.py +@Description : +""" + +import json +import os +from multiprocessing import freeze_support + +from wxManager import Me +from wxManager.decrypt import get_info_v4, get_info_v3 +from wxManager.decrypt.decrypt_dat import get_decode_code_v4 +from wxManager.decrypt.decrypt_v4 import decrypt_db_files + +if __name__ == '__main__': + freeze_support() # 使用多进程必须 + + # r_4 = get_info_v4() # 微信4.0 + r_4 = [] + for wx_info in r_4: + print(wx_info) + me = Me() + me.wx_dir = wx_info.wx_dir + me.wxid = wx_info.wxid + me.name = wx_info.nick_name + me.xor_key = get_decode_code_v4(wx_info.wx_dir) + info_data = me.to_json() + output_dir = wx_info.wxid + key = wx_info.key + wx_dir = wx_info.wx_dir + decrypt_db_files(key, src_dir=wx_dir, dest_dir=output_dir) + with open(os.path.join(output_dir, 'db_storage', 'info.json'), 'w', encoding='utf-8') as f: + json.dump(info_data, f, ensure_ascii=False, indent=4) + + version_list_path = '../wxManager/decrypt/version_list.json' + with open(version_list_path, "r", encoding="utf-8") as f: + version_list = json.loads(f.read()) + r_3 = get_info_v3(version_list) # 微信3.x + for wx_info in r_3: + print(wx_info) + me = Me() + me.wx_dir = wx_info.wx_dir + me.wxid = wx_info.wxid + me.name = wx_info.nick_name + info_data = me.to_json() + output_dir = wx_info.wxid + key = wx_info.key + wx_dir = wx_info.wx_dir + # decrypt_db_files(key, src_dir=wx_dir, dest_dir=output_dir) + with open(os.path.join(output_dir, 'info.json'), 'w', encoding='utf-8') as f: + json.dump(info_data, f, ensure_ascii=False, indent=4) \ No newline at end of file diff --git a/example/README.md b/example/README.md new file mode 100644 index 0000000..4ba978d --- /dev/null +++ b/example/README.md @@ -0,0 +1,197 @@ +## wxManager使用教程 + +### 1、解析数据 + +```python +import json +import os +import time +from multiprocessing import freeze_support + +import pymem + +from wxManager import Me +from wxManager.decrypt import get_wx_info +from wxManager.decrypt.decrypt_dat import get_decode_code_v4 +from wxManager.decrypt.wxinfo import dump_wechat_info_v4_ +from wxManager.decrypt.decrypt import decrypt_db_files + + +def dump_v4(): + freeze_support() + st = time.time() + pm = pymem.Pymem("Weixin.exe") + pid = pm.process_id + w = dump_wechat_info_v4_(pid) + if w: + print(w) + et = time.time() + print(et - st) + me = Me() + me.wx_dir = w.wx_dir + me.wxid = w.wxid + me.name = w.nick_name + me.xor_key = get_decode_code_v4(w.wx_dir) + info_data = me.to_json() + output_dir = w.wxid + key = w.key + wx_dir = w.wx_dir + decrypt_db_files(key, src_dir=wx_dir, dest_dir=output_dir) + with open(os.path.join(output_dir, 'db_storage', 'info.json'), 'w', encoding='utf-8') as f: + json.dump(info_data, f, ensure_ascii=False, indent=4) + else: + print('数据解析失败') + + +def dump_v3(): + version__list_path = '../../wxManager/decrypt/version_list.json' + with open(version__list_path, "r", encoding="utf-8") as f: + version__list = json.loads(f.read()) + wx_info_v3 = get_wx_info.get_info_v3(version__list) + + for wx_info in wx_info_v3: + errcode = wx_info.get('errcode') + if errcode == 405: + print(wx_info.get('errmsg')) + elif errcode == 200: + print(wx_info) + + +if __name__ == '__main__': + dump_v4() + # dump_v3() +``` + +### 2、导出聊天记录 + +#### 查看联系人 + +```python +from wxManager import DatabaseConnection + +db_dir = '' # 数据库路径 +conn = DatabaseConnection(db_dir, db_version=4) +database = conn.get_interface() + +contacts = database.get_contacts() +for contact in contacts: + contact.smallHeadImgBLOG = database.get_avatar_buffer(contact.wxid) # 头像 + if contact.is_chatroom: + print('*' * 80) + print(contact) + chatroom_members = database.get_chatroom_members(contact.wxid) + print('群成员个数:', len(chatroom_members)) + for wxid, chatroom_member in chatroom_members.items(): + chatroom_member.smallHeadImgBLOG = database.get_avatar_buffer(wxid) + print(chatroom_member) +``` + +#### 导出TXT + +```python +from exporter.config import FileType +from exporter.exporter_txt import TxtExporter +from wxManager import DatabaseConnection + + +db_dir = '' # 数据库路径 +wxid = '' # 要导出联系人的wxid +output_dir = './data/' # 输出文件夹 + +conn = DatabaseConnection(db_dir, db_version=4) +database = conn.get_interface() + +contact = database.get_contact_by_username(wxid) + +exporter = TxtExporter( + database, + contact, + output_dir=output_dir, + type_=FileType.TXT, + message_types=None, + time_range=None, + group_members=None +) + + +# 设置自定义进度回调函数 +def update_progress(progress): + print(progress) + + +exporter.set_update_callback(update_progress) +exporter.start() +``` + +#### 导出Excel + +```python +from multiprocessing import freeze_support + +from exporter.config import FileType +from exporter.exporter_xlsx import ExcelExporter +from wxManager import DatabaseConnection + +if __name__ == '__main__': + freeze_support() + db_dir = '' # 解析后的数据库文件夹 + wxid = 'xxx' + output_dir = './data/' + conn = DatabaseConnection(db_dir, db_version=4) + database = conn.get_interface() + contact = database.get_contact_by_username(wxid) + exporter = ExcelExporter( + database, + contact, + output_dir=output_dir, + type_=FileType.XLSX, + message_types=None, + time_range=None, + group_members=None + ) + def update_progress(progress): + print(progress) + # exporter.set_update_callback(update_progress) + exporter.start() +``` + +#### 导出HTML + +```python +import time +from multiprocessing import freeze_support + +from exporter.config import FileType +from exporter.exporter_html import HtmlExporterBase +from wxManager import DatabaseConnection + +if __name__ == '__main__': + freeze_support() + st = time.time() + + db_dir = '' # 解析后的数据库文件夹 + wxid = '' # 要导出好友的wxid + output_dir = './data/' # 输出文件夹 + + conn = DatabaseConnection(db_dir, db_version=4) + database = conn.get_interface() + contact = database.get_contact_by_username(wxid) + + exporter = HtmlExporterBase( + database, + contact, + output_dir=output_dir, + type_=FileType.TXT, + message_types=None, + time_range=None, + group_members=None + ) + + + def update_progress(progress): + print(progress) + exporter.set_update_callback(update_progress) + exporter.start() + et = time.time() + print(f'耗时:{et - st:.2f}s') +``` \ No newline at end of file diff --git a/exporter/__init__.py b/exporter/__init__.py new file mode 100644 index 0000000..813def4 --- /dev/null +++ b/exporter/__init__.py @@ -0,0 +1,7 @@ +# from exporter.exporter_txt import TxtExporter +# from exporter.exporter_ai_txt import AiTxtExporter +# from exporter.exporter_csv import CSVExporter +# from exporter.exporter_html import HtmlExporter +# from exporter.exporter_docx import DocxExporter +# from exporter.exporter_markdown import MarkdownExporter +# from exporter.exporter_xlsx import ExcelExporter diff --git a/exporter/config.py b/exporter/config.py new file mode 100644 index 0000000..6d2c464 --- /dev/null +++ b/exporter/config.py @@ -0,0 +1,33 @@ +from enum import Enum + + +class FileType(Enum): + CSV = 0 + DOCX = 1 + HTML = 2 + CSV_ALL = 3 + CONTACT_CSV = 4 + TXT = 5 + JSON = 6 + PDF = 7 + PYQ_HTML = 8 + PYQ_PDF = 9 + PYQ_JSON = 10 + GROUP_MEMBERS = 11 + XLSX = 12 + IMAGE_ALL = 13 + AUDIO_ALL = 14 + FILE_ALL = 15 + VIDEO_ALL = 16 + AI_TXT = 17 + Batch = 10086 + Batch_By_Member = 10010 + AUDIO_TO_TEXT = 18 + PUBLIC_TO_PDF = 19 + PUBLIC_TO_TXT = 20 + PUBLIC_TO_DOCX = 21 + PUBLIC_TO_MD = 22 + MARKDOWN = 23 + + + diff --git a/exporter/exporter.py b/exporter/exporter.py new file mode 100644 index 0000000..883464e --- /dev/null +++ b/exporter/exporter.py @@ -0,0 +1,649 @@ +import csv +import html +import io +import os +import re +import shutil +import subprocess +import sys +import time +import traceback +from concurrent.futures import ThreadPoolExecutor, as_completed +from typing import List, Tuple + +import pysilk + +from wxManager import MessageType, DataBaseInterface +from wxManager.model import Contact, Me, Message + +from wxManager.log import logger +from exporter.config import FileType + + +def makedirs(path): + if not os.path.exists(path): + os.makedirs(path, exist_ok=True) + os.makedirs(os.path.join(path, 'image'), exist_ok=True) + os.makedirs(os.path.join(path, 'emoji'), exist_ok=True) + os.makedirs(os.path.join(path, 'video'), exist_ok=True) + os.makedirs(os.path.join(path, 'voice'), exist_ok=True) + os.makedirs(os.path.join(path, 'file'), exist_ok=True) + os.makedirs(os.path.join(path, 'avatar'), exist_ok=True) + os.makedirs(os.path.join(path, 'music'), exist_ok=True) + os.makedirs(os.path.join(path, 'icon'), exist_ok=True) + + +def escape_js_and_html(input_str): + if not input_str: + return '' + # 转义HTML特殊字符 + html_escaped = html.escape(input_str, quote=False) + + # 手动处理JavaScript转义字符 + js_escaped = ( + html_escaped + .replace('\\r\\n', '<br>') + .replace('\\n', '<br>') + .replace('\\t', ' ') + .replace("\\", "\\\\") + .replace("'", r"\'") + .replace('"', r'\"') + .replace("\n", r'\n') + .replace("\r", r'\r') + .replace("\t", r'\t') + ) + + return js_escaped + + +class ExporterBaseBase: + exporter_id = 0 + + def __init__(self): + ExporterBaseBase.exporter_id += 1 + self.id = ExporterBaseBase.exporter_id + self._is_running = True + self._is_paused = False + + def cancel(self): + print('cancel') + + def pause(self): + self._is_paused = True + + def resume(self): + self._is_paused = False + + def stop(self): + self._is_running = False + self.resume() # 确保在停止时唤醒线程 + + +class ExporterBase(ExporterBaseBase): + i = 1 + + def __init__( + self, + database: DataBaseInterface, + contact: Contact, + output_dir, + type_=FileType.TXT, # 导出文件类型 + message_types: set[MessageType] = None, # 导出的消息类型 + time_range=None, # 导出的日期范围 + group_members: set[str] = None, # 群聊中只导出这些人的聊天记录 + progress_callback=None, # 进度回调函数,func(progress:float) + finish_callback=None # 导出完成回调函数 + ): + """ + @param database: + @param contact: 要导出的联系人 + @param output_dir: 输出文件夹 + @param type_: 导出文件类型 + @param message_types: 导出的消息类型 + @param time_range: 导出的日期范围 + @param group_members: 群聊中筛选的群成员 + @param progress_callback: 导出进度回调函数 + """ + super().__init__() + if progress_callback: + self.update_progress_callback = progress_callback + else: + self.update_progress_callback = self.print_progress + if finish_callback: + self.finish_callback = finish_callback + else: + self.finish_callback = self.finish + self.database = database + self.avatar_urls_dict = {} # 联系人头像地址的字典 + self.avatar_urls = [] # 联系人的头像地址(写入HTML) + self.avatar_paths_dict = {} # 联系人本地头像地址的字典 + self.avatar_paths = [] # 联系人的本地头像地址(写入HTML) + self.message_types = message_types # 导出的消息类型 + self.contact: Contact = contact # 联系人 + self.output_type = type_ # 导出文件类型 + self.total_num = 1 # 总的消息数量 + self.num = 0 # 当前处理的消息数量 + self.last_timestamp = 0 + self.time_range = time_range + self.group_contacts = {} # 群聊里的所有联系人 + self.group_members = group_members # 要导出的群聊成员(用于群消息筛选) + self.group_members_set = group_members + self.origin_path = os.path.join(output_dir, '聊天记录', f'{self.contact.remark}({self.contact.wxid})') + makedirs(self.origin_path) + + def print_progress(self, progress): + logger.info(f'导出进度:{progress * 100:.2f}%') + # print() + + def finish(self, success): + if success: + logger.info(f'导出完成\n{"-" * 20}') + else: + logger.info(f'导出失败\n{"-" * 20}') + + def set_update_callback(self, callback): + self.update_progress_callback = callback + + def _is_select_by_type(self, message): + # 筛选特定的消息类型 + if not self.message_types: + return True + else: + return message.type in self.message_types + + def _is_select_by_contact(self, message): + # 筛选群聊里的指定群成员 + if self.contact.is_chatroom() and self.group_members_set: + wxid = message.sender_id + if wxid in self.group_members_set: + return True + else: + return False + else: + return True + + def is_selected(self, message): + # 判断该消息是否应该导出 + return self._is_select_by_type(message) and self._is_select_by_contact(message) + + def run(self): + self.export() + + def export(self): + return True + + def start(self): + self.run() + + def is_5_min(self, timestamp) -> bool: + if abs(timestamp - self.last_timestamp) > 300: + self.last_timestamp = timestamp + return True + return False + + def save_avatars(self): + if self.contact.is_chatroom(): + self.group_contacts = self.database.get_chatroom_members(self.contact.wxid) + self.group_contacts[Me().wxid] = Me() + else: + self.group_contacts = { + Me().wxid: Me(), + self.contact.wxid: self.contact + } + for wxid, contact in self.group_contacts.items(): + self.save_avatar(contact) + + def save_avatar(self, contact): + avatar_buffer = self.database.get_avatar_buffer(contact.wxid) + avatar_path = os.path.join(self.origin_path, 'avatar', f'{contact.wxid}.png') + contact.avatar_path = avatar_path + if not avatar_buffer: + current_dir = os.path.dirname(os.path.abspath(__file__)) + # 构建要读取的文件路径 + file_path = os.path.join(current_dir, 'resources', 'default_avatar.png') + with open(file_path, 'rb') as f: + avatar_buffer = f.read() + try: + with open(avatar_path, 'wb') as f: + f.write(avatar_buffer) + except: + logger.error(traceback.format_exc()) + finally: + return avatar_path + + def get_avatar_path(self, message: Message, is_absolute_path=False) -> str | int: + """ + 获取消息发送者的头像 + @param message: 消息元组 + @param is_absolute_path: 是否是绝对路径 + @return: True 返回本地的绝对路径,False 返回联系人的索引下标 + """ + is_send = message.is_sender + if is_absolute_path: + # 返回头像的本地绝对路径 + if message.sender_id in self.group_contacts: + avatar = self.group_contacts[message.sender_id].avatar_path + else: + # 针对那些退群的人,就保存为默认头像 + contact = self.database.get_contact_by_username(message.sender_id) + avatar = self.save_avatar(contact) + self.group_contacts[contact.wxid] = contact + else: + if self.contact.is_chatroom(): + avatar = self.avatar_urls_dict[message.sender_id] + else: + avatar = 0 if is_send else 1 + return avatar + + def get_avatar_urls(self): + index = 0 + if self.contact.is_chatroom(): + messages = msg_db.get_messages(self.contact.wxid, time_range=self.time_range) + for message in messages: + contact = message[13] + if contact.wxid not in self.avatar_urls_dict: + avatar_path = os.path.join(self.origin_path, 'avatar', f'{contact.wxid}.png') + contact.save_avatar(avatar_path) + self.avatar_urls.append(contact.small_head_img_url) + self.avatar_paths.append(f'./avatar/{contact.wxid}.png') + self.avatar_urls_dict[contact.wxid] = index + index += 1 + else: + self.avatar_urls = [Me().small_head_img_url, self.contact.small_head_img_url] + avatar_path = os.path.join(self.origin_path, 'avatar', f'{Me().wxid}.png') + QMe().save_avatar(avatar_path) + avatar_path1 = os.path.join(self.origin_path, 'avatar', f'{self.contact.wxid}.png') + # self.contact.save_avatar(avatar_path1) + self.avatar_paths = [f'./avatar/{Me().wxid}.png', f'./avatar/{self.contact.wxid}.png'] + return self.avatar_urls, self.avatar_paths + + def get_avatar_paths(self): + """ + 获取全部头像 + @return: + """ + index = 0 + if self.contact.is_chatroom(): + messages = msg_db.get_messages(self.contact.wxid, time_range=self.time_range) + for message in messages: + contact = message[13] + if contact.wxid not in self.avatar_paths_dict: + self.avatar_paths.append(contact.small_head_img_url) + self.avatar_paths_dict[contact.wxid] = index + index += 1 + else: + self.avatar_paths = [Me().small_head_img_url, self.contact.small_head_img_url] + return self.avatar_paths + + +class ImageExporter(ExporterBaseBase): + def __init__(self, parent=None): + super().__init__(parent) + + def run(self): + self.startSignal.emit(1) + messages = database.get_messages_all() + num = len(messages) + os.makedirs(os.path.join(config.OUTPUT_DIR, 'image'), exist_ok=True) + for index, message in enumerate(messages): + type_ = message[2] + timestamp = message[5] + # 把时间戳转换为格式化时间 + time_struct = time.localtime(timestamp) # 首先把时间戳转换为结构化时间 + str_time = time.strftime("%Y%m%d_%H%M%S_", time_struct) # 把结构化时间转换为格式化时间 + MsgSvrID = str(message[9]) + if type_ == 3: + base_path = os.path.join(config.OUTPUT_DIR, 'image') + str_content = message[7] + BytesExtra = message[10] + str_content = escape_js_and_html(str_content) + image_path = hard_link_db.get_image(str_content, BytesExtra, up_dir=Me().wx_dir, thumb=False) + image_path = get_image(image_path, base_path=base_path, dst_name=str_time + MsgSvrID[:6]) + globalSignals.status_bar_message.emit((f'导出进度:{index + 1}/{num}——{image_path}', 1)) + self.okSignal.emit(self.id) + + +class VideoExporter(ExporterBaseBase): + def run(self): + self.startSignal.emit(1) + messages = database.get_messages_all() + num = len(messages) + os.makedirs(os.path.join(config.OUTPUT_DIR, 'video'), exist_ok=True) + for index, message in enumerate(messages): + type_ = message[2] + timestamp = message[5] + # 把时间戳转换为格式化时间 + time_struct = time.localtime(timestamp) # 首先把时间戳转换为结构化时间 + str_time = time.strftime("%Y%m%d_%H%M%S_", time_struct) # 把结构化时间转换为格式化时间 + MsgSvrID = str(message[9]) + if type_ == 43: + str_content = message[7] + BytesExtra = message[10] + video_path = hard_link_db.get_video(str_content, BytesExtra, thumb=False) + image_path = hard_link_db.get_video(str_content, BytesExtra, thumb=True) + if video_path: + video_path = f'{Me().wx_dir}/{video_path}' + if os.path.exists(video_path): + new_path = os.path.join(config.OUTPUT_DIR, 'video', str_time + MsgSvrID[:6] + '.mp4') + if not os.path.exists(new_path): + shutil.copy(video_path, new_path) + globalSignals.status_bar_message.emit((f'导出进度:{index + 1}/{num}——{image_path}', 1)) + self.okSignal.emit(self.id) + + +class FileExporter(ExporterBaseBase): + def run(self): + self.startSignal.emit(1) + messages = database.get_messages_all() + num = len(messages) + origin_path = os.path.join(config.OUTPUT_DIR, 'files') + os.makedirs(os.path.join(config.OUTPUT_DIR, 'files'), exist_ok=True) + for index, message in enumerate(messages): + type_ = message[2] + sub_type = message[3] + timestamp = message[5] + # 把时间戳转换为格式化时间 + time_struct = time.localtime(timestamp) # 首先把时间戳转换为结构化时间 + str_time = time.strftime("%Y%m%d%H%M%S", time_struct) # 把结构化时间转换为格式化时间 + if type_ == 49 and sub_type == 6: + bytesExtra = message[10] + compress_content = message[13] + file_info = file(bytesExtra, compress_content, output_path=origin_path) + if not file_info.get('is_error'): + file_path = file_info.get('file_path') + globalSignals.status_bar_message.emit((f'导出进度:{index + 1}/{num}——{file_path}', 1)) + self.okSignal.emit(self.id) + + +class AudioExporter(ExporterBaseBase): + def run(self): + self.startSignal.emit(1) + messages = msg_db.get_messages_all() + num = len(messages) + for index, message in enumerate(messages): + type_ = message[2] + timestamp = message[5] + # 把时间戳转换为格式化时间 + time_struct = time.localtime(timestamp) # 首先把时间戳转换为结构化时间 + str_time = time.strftime("%Y%m%d%H%M%S", time_struct) # 把结构化时间转换为格式化时间 + MsgSvrID = str(message[9]) + if type_ == 43: + str_content = message[7] + BytesExtra = message[10] + video_path = hard_link_db.get_video(str_content, BytesExtra, thumb=False) + image_path = hard_link_db.get_video(str_content, BytesExtra, thumb=True) + if video_path: + video_path = f'{Me().wx_dir}/{video_path}' + if os.path.exists(video_path): + new_path = os.path.join(config.OUTPUT_DIR, 'video', str_time + '.mp4') + if not os.path.exists(new_path): + shutil.copy(video_path, new_path) + globalSignals.status_bar_message.emit((f'导出进度:{index + 1}/{num}——{image_path}', 1)) + self.okSignal.emit(self.id) + + +class ContactExporter(ExporterBaseBase): + def __init__(self, database, output_path): + super().__init__() + self.okSignal = None + self.database = database + self.output_path = output_path + + def start(self): + self.run() + + def run(self): + + # columns = ["用户名", "消息内容", "发送时间", "发送状态", "消息类型", "isSend", "msgId"] + columns = ['UserName', 'Alias', 'Type', 'Remark', 'NickName', 'smallHeadImgUrl', + 'bigHeadImgUrl', 'label', 'gender', 'signature', 'country/region', 'province', 'city'] + + contacts = self.database.get_contacts() + try: + # 写入CSV文件 + with open(self.output_path, mode='w', newline='', encoding='utf-8-sig') as file: + writer = csv.writer(file) + writer.writerow(columns) + # 写入数据 + for contact in contacts: + writer.writerow( + [contact.wxid, contact.alias, contact.flag, contact.remark, contact.nickname, + contact.small_head_img_url, contact.big_head_img_url, contact.label_name(), contact.gender, + contact.signature, *contact.region + ] + ) + except PermissionError: + print('另一个程序正在使用此文件,无法访问。') + + +class GroupContactExporter(ExporterBaseBase): + def __init__(self, database, output_dir, contact): + super().__init__() + self.contact = contact + self.database = database + if self.contact: + if not isinstance(self.contact, list): + self.origin_path = os.path.join(output_dir, '聊天记录', + f'{self.contact.remark}({self.contact.wxid})') + os.makedirs(self.origin_path, exist_ok=True) + + def start(self): + self.run() + + def run(self): + filename = os.path.join(self.origin_path, 'contacts.csv') + filename = get_new_filename(filename) + # columns = ["用户名", "消息内容", "发送时间", "发送状态", "消息类型", "isSend", "msgId"] + columns = ['UserName', '微信号', '类型', '群昵称', '昵称', '头像地址', + '头像原图', '标签', '性别', '个性签名', '国家(地区)', '省份', '城市'] + contacts = self.database.get_chatroom_members(self.contact.wxid) + try: + # 写入CSV文件 + with open(filename, mode='w', newline='', encoding='utf-8-sig') as file: + writer = csv.writer(file) + writer.writerow(columns) + # 写入数据 + # writer.writerows(contacts) + for wxid, contact in contacts.items(): + writer.writerow( + [ + contact.wxid, contact.alias, contact.flag, contact.remark, contact.nickname, + contact.small_head_img_url, contact.big_head_img_url, contact.label_name(), + contact.gender, contact.signature, *contact.region + ] + ) + except PermissionError: + print('另一个程序正在使用此文件,无法访问。') + + +class CsvAllExporter(ExporterBaseBase): + def run(self): + filename = QFileDialog.getSaveFileName(None, "save file", os.path.join(os.getcwd(), 'messages.csv'), + "csv files (*.csv);;all files(*.*)") + if not filename[0]: + return + self.startSignal.emit(1) + filename = filename[0] + # columns = ["用户名", "消息内容", "发送时间", "发送状态", "消息类型", "isSend", "msgId"] + columns = ['localId', 'TalkerId', 'Type', 'SubType', + 'IsSender', 'CreateTime', 'Status', 'StrContent', + 'StrTime', 'Remark', 'NickName', 'Sender'] + + packagemsg = PackageMsg() + messages = packagemsg.get_package_message_all() + try: + # 写入CSV文件 + with open(filename, mode='w', newline='', encoding='utf-8-sig') as file: + writer = csv.writer(file) + writer.writerow(columns) + # 写入数据 + writer.writerows(messages) + except PermissionError: + globalSignals.information.emit('另一个程序正在使用此文件,无法访问。') + self.okSignal.emit(self.id) + + +def copy_file(source_file, destination_file): + if os.path.isfile(source_file) and not os.path.exists(destination_file): + try: + # logger.info(f'开始复制:{destination_file}') + shutil.copy(source_file, destination_file) + except: + pass + # logger.error(traceback.format_exc()) + finally: + print(f'复制:{destination_file}') + # logger.info(f'复制:{destination_file}') + + +def copy_files(file_tasks: List[Tuple[str, str, str]]): + """ + + :param file_tasks: List[ + (原始文件路径, + 输出文件夹, + 输出文件名 + )] + :return: + """ + if len(file_tasks) < 1: + return + futures = [] + with ThreadPoolExecutor(max_workers=10) as executor: + for source_file, output_dir, dst_name in file_tasks: + if dst_name: + ext = os.path.basename(source_file).split('.')[-1] + destination_file = os.path.join(output_dir, f'{dst_name}.{ext}') + else: + destination_file = os.path.join(output_dir, os.path.basename(source_file)) + if os.path.exists(destination_file): + continue + if not os.path.exists(os.path.dirname(destination_file)): + os.makedirs(os.path.dirname(destination_file), exist_ok=True) + futures.append(executor.submit(copy_file, source_file, destination_file)) + + # 等待所有任务完成 + for future in futures: + future.result() + + +def get_ffmpeg_path(): + # 获取打包后的资源目录 + resource_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__))) + + # 构建 FFmpeg 可执行文件的路径 + ffmpeg_path = os.path.join(resource_dir, 'ffmpeg.exe') + if not os.path.exists(ffmpeg_path): + ffmpeg_path = os.path.join(resource_dir, 'resources', 'ffmpeg.exe') + return ffmpeg_path + + +def decode_audio_to_mp3(media_buffer, output_dir, filename): + silk_path = f"{output_dir}/{filename}.silk" + pcm_path = f"{output_dir}/{filename}.pcm" + mp3_path = f"{output_dir}/{filename}.mp3" + if os.path.exists(mp3_path): + return mp3_path + if not os.path.exists(output_dir): + os.makedirs(output_dir, exist_ok=True) + buf = media_buffer + if not buf: + return '' + with open(silk_path, "wb") as f: + f.write(buf) + # open(silk_path, "wb").write() + try: + pcm_buf = pysilk.decode(buf, to_wav=False, sample_rate=44100) + with open(pcm_path, 'wb') as f: + f.write(pcm_buf) + # pysilk.decode_file(open("brainpower.pcm", "rb"), to_wav=False) + # 调用系统上的 ffmpeg 可执行文件 + # 获取 FFmpeg 可执行文件的路径 + ffmpeg_path = get_ffmpeg_path() + # print(ffmpeg_path) + # # 调用 FFmpeg + if os.path.exists(ffmpeg_path): + cmd = f'''"{ffmpeg_path}" -loglevel quiet -y -f s16le -i "{pcm_path}" -ar 44100 -ac 1 "{mp3_path}"''' + # system(cmd) + # 使用subprocess.run()执行命令 + subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + else: + # 源码运行的时候下面的有效 + # 这里不知道怎么捕捉异常 + cmd = f'''"{os.path.join(os.getcwd(), 'app', 'resources', 'data', 'ffmpeg.exe')}" -loglevel quiet -y -f s16le -i "{pcm_path}" -ar 44100 -ac 1 "{mp3_path}"''' + # system(cmd) + # 使用subprocess.run()执行命令 + subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # if os.path.exists(silk_path): + # os.remove(silk_path) + # if os.path.exists(pcm_path): + # os.remove(pcm_path) + except Exception as e: + print(f"Error: {e}") + logger.error(f'语音错误\n{traceback.format_exc()}') + cmd = f'''"{os.path.join(os.getcwd(), 'app', 'resources', 'data', 'ffmpeg.exe')}" -loglevel quiet -y -f s16le -i "{pcm_path}" -ar 44100 -ac 1 "{mp3_path}"''' + # system(cmd) + # 使用subprocess.run()执行命令 + subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + finally: + return mp3_path + + +def decode_audios(file_tasks: List[Tuple[str, str, str]]): + """ + + :param database: + :param file_tasks: List[ + (原始文件路径, + 输出文件夹, + 输出文件名 + )] + :return: + """ + if len(file_tasks) < 1: + return + with ThreadPoolExecutor(max_workers=10) as executor: + futures = [] + for media_buffer, output_dir, dst_name in file_tasks: + futures.append(executor.submit(decode_audio_to_mp3, media_buffer, output_dir, dst_name)) + + # 等待所有任务完成 + for future in futures: + future.result() + + +def remove_privacy_info(text): + # 正则表达式模式 + patterns = { + 'phone': r'\b(\+?86[-\s]?)?1[3-9]\d{9}\b', # 手机号 + 'email': r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', # 邮箱 + 'id_card': r'\b\d{15}|\d{18}|\d{17}X\b', # 身份证号 + 'password': r'\b(?:password|pwd|pass|psw)[\s=:]*\S+\b', # 密码 + 'account': r'\b(?:account|username|user|acct)[\s=:]*\S+\b' # 账号 + } + + for key, pattern in patterns.items(): + text = re.sub(pattern, f'[{key} xxx]', text) + + return text + + +def get_new_filename(filename): + """ + 检查给定的文件是否存在,如果存在就加个括号标个号,返回新的文件名 + @param filename: + @return: + """ + if not os.path.exists(filename): + return filename + else: + for i in range(1, 10086): + basename = os.path.basename(filename) + tmp = basename.split('.') + name = '.'.join(tmp[:-1]) + ext = tmp[-1] + dir_name = os.path.dirname(filename) + new_filename = os.path.join(dir_name, f'{name}({i}).{ext}') + if not os.path.exists(new_filename): + return new_filename + return filename diff --git a/exporter/exporter_ai_txt.py b/exporter/exporter_ai_txt.py new file mode 100644 index 0000000..7f12490 --- /dev/null +++ b/exporter/exporter_ai_txt.py @@ -0,0 +1,51 @@ +import os +import re +from collections import defaultdict + +from wxManager import Message +from exporter.exporter import ExporterBase, get_new_filename, remove_privacy_info + + +class AiTxtExporter(ExporterBase): + last_sender = 'wxid_00112233' + + def title(self, message: Message): + sender = message.sender_id + display_name = '' + if sender != self.last_sender: + display_name = f'\n{message.display_name}:' + self.last_sender = sender + return display_name + + def export(self): + # 实现导出为txt的逻辑 + print(f"【开始导出 TXT {self.contact.remark}】") + origin_path = self.origin_path + os.makedirs(origin_path, exist_ok=True) + filename = os.path.join(origin_path, self.contact.remark + '_chat.txt') + filename = get_new_filename(filename) + messages = self.database.get_messages(self.contact.wxid, time_range=self.time_range) + total_steps = len(messages) + # 创建一个默认字典,用于按日期分组 + grouped_messages = defaultdict(list) + # 遍历消息,将其按日期分组 + for index, message in enumerate(messages): + if index and index % 1000 == 0: + self.update_progress_callback(index / total_steps) + if not self.is_selected(message): + continue + date_key = message.str_time[:10] # 以日期作为键 + # 将消息添加到对应日期的列表中 + grouped_messages[date_key].append(f'{self.title(message)}{remove_privacy_info(message.to_text())}') + + with open(filename, mode='w', newline='', encoding='utf-8') as f: + # 如果需要,可以将结果转换为普通字典 + grouped_messages = dict(grouped_messages) + # 按日期排序并遍历结果 + for date in sorted(grouped_messages.keys()): + msgs = grouped_messages[date] + f.write(f"\n\n{'*' * 20}{date}{'*' * 20}\n") + f.write('\n'.join(msgs)) + self.update_progress_callback(1) + print(f"【完成导出 TXT {self.contact.remark}】") + self.finish_callback(self.exporter_id) diff --git a/exporter/exporter_csv.py b/exporter/exporter_csv.py new file mode 100644 index 0000000..5605cff --- /dev/null +++ b/exporter/exporter_csv.py @@ -0,0 +1,49 @@ +import csv +import os + +from wxManager import Message +from wxManager.model import Me +from exporter.exporter import ExporterBase, get_new_filename + + +class CSVExporter(ExporterBase): + def message_to_list(self, message: Message): + remark = message.display_name + nickname = message.display_name + if self.contact.is_chatroom(): + contact = self.group_contacts.get(message.sender_id) + if contact: + remark = contact.remark + nickname = contact.nickname + else: + contact = Me() if message.is_sender else self.contact + remark = contact.remark + nickname = contact.nickname + res = [str(message.server_id), message.type_name(), message.display_name, message.str_time, message.to_text(), + remark, nickname, 'more'] + return res + + def export(self): + print(f"【开始导出 CSV {self.contact.remark}】") + os.makedirs(self.origin_path, exist_ok=True) + filename = os.path.join(self.origin_path,f"{self.contact.remark}.csv") + filename = get_new_filename(filename) + columns = ['消息ID', '类型', '发送人', '时间', '内容', '备注', '昵称', '更多信息'] + messages = self.database.get_messages(self.contact.wxid, time_range=self.time_range) + total_steps = len(messages) + # 写入CSV文件 + with open(filename, mode='w', newline='', encoding='utf-8-sig') as file: + writer = csv.writer(file) + writer.writerow(columns) + # 写入数据 + csv_res = [] + for index, message in enumerate(messages): + if index and index % 1000 == 0: + self.update_progress_callback(index / total_steps) + if not self.is_selected(message): + continue + csv_res.append(self.message_to_list(message)) + writer.writerows(csv_res) + self.update_progress_callback(1) + self.finish_callback(self.exporter_id) + print(f"【完成导出 CSV {self.contact.remark}】") diff --git a/exporter/exporter_docx.py b/exporter/exporter_docx.py new file mode 100644 index 0000000..8a7d3ab --- /dev/null +++ b/exporter/exporter_docx.py @@ -0,0 +1,337 @@ +import os +import time +import traceback +from re import findall + +import docx +from docx import shared +from docx.enum.dml import MSO_THEME_COLOR_INDEX +from docx.enum.table import WD_ALIGN_VERTICAL +from docx.enum.text import WD_COLOR_INDEX, WD_PARAGRAPH_ALIGNMENT +from docx.opc.constants import RELATIONSHIP_TYPE +from docx.oxml import OxmlElement +from docx.oxml.ns import qn +from docx.shared import Pt, Inches + +from wxManager import Me, MessageType +from exporter.exporter import ExporterBase, get_new_filename +from wxManager.decrypt.decrypt_dat import decode_dat +from wxManager.log import logger +from wxManager.model import QuoteMessage, LinkMessage + +# 要删除的编码字符 +encoded_chars = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f' + +# 创建一个字典,将要删除的字符映射为 None +char_mapping = {char: None for char in encoded_chars} + + +def filter_control_characters(input_string): + """ + 过滤掉不可打印字符 + @param input_string: + @return: + """ + + # 过滤掉非可打印字符 + filtered_string = input_string.translate(char_mapping) + + return filtered_string + + +class DocxExporter(ExporterBase): + def __init__( + self, + database, + contact, + output_dir, + type_, # 导出文件类型 + message_types: set[MessageType] = None, # 导出的消息类型 + time_range=None, # 导出的日期范围 + group_members: set[str] = None, # 群聊中只导出这些人的聊天记录 + progress_callback=None, # 进度回调函数,func(progress:float) + finish_callback=None, # 导出完成回调函数 + msg_num_per_docx=500 # 每个docx文档的消息数量 + ): + super().__init__(database, contact, output_dir, type_, message_types, time_range, group_members, + progress_callback, finish_callback) # 调用父类的构造函数 + self.msg_num_per_docx = msg_num_per_docx + + def add_text_in(self, paragraph, content): + try: + paragraph.add_run(content) + except ValueError: + try: + str_content = filter_control_characters(content) + paragraph.add_run(str_content) + except ValueError: + logger.error(f'非法字符:{content}') + paragraph.add_run('非法字符') + + def add_text_message(self, doc, avatar_path, is_send, content, display_name=''): + content_cell = self.create_table(doc, is_send, avatar_path) + if display_name: + self.add_text_in(content_cell.paragraphs[0], display_name + '\n') + self.add_text_in(content_cell.paragraphs[0], content) + if is_send: + p = content_cell.paragraphs[0] + doc.add_paragraph() + + def text(self, doc, message): + avatar = self.get_avatar_path(message, True) + self.add_text_message(doc, avatar, message.is_sender, message.content, + message.display_name if self.contact.is_chatroom() else '') + + def image(self, doc, message): + is_send = message.is_sender + avatar = self.get_avatar_path(message, True) + content = self.create_table(doc, is_send, avatar) + if self.contact.is_chatroom(): + content.paragraphs[0].add_run(message.display_name + '\n') + message.set_file_name() + image_dir = os.path.join(self.origin_path, 'image') + image_path = decode_dat( + Me().xor_key, + os.path.join(Me().wx_dir, message.path), + os.path.join(image_dir, message.str_time[:7]), + message.file_name + ) + if image_path and os.path.exists(image_path): + try: + run = content.paragraphs[0].add_run() + run.add_picture(image_path, height=shared.Inches(2)) + doc.add_paragraph() + except Exception: + try: + # 有些jpg图片的元数据丢失,垂直dpi丢失导致除0异常,需要手动指定图片长宽 + run = content.paragraphs[0].add_run() + run.add_picture(image_path, height=shared.Inches(2), width=shared.Inches(2)) + doc.add_paragraph() + except: + print("Error!image") + logger.error(image_path) + logger.error(traceback.format_exc()) + else: + content.paragraphs[0].add_run('【图片丢失】') + + def refermsg(self, doc, message: QuoteMessage): + """ + 处理回复消息 + @param doc: + @param message: + @return: + """ + is_send = message.is_sender + if message.quote_message.type == MessageType.Quote: + refer_msg = f'{message.quote_message.display_name}:{message.quote_message.content}' + else: + refer_msg = f'{message.quote_message.display_name}:{message.quote_message.to_text()}' + avatar = self.get_avatar_path(message, True) + content_cell = self.create_table(doc, is_send, avatar) + self.add_text_in(content_cell.paragraphs[0], message.content) + content_cell.paragraphs[0].font_size = shared.Inches(0.5) + reply_p = content_cell.add_paragraph() + self.add_text_in(reply_p, refer_msg) + run = reply_p.runs[0] + '''设置被回复内容格式''' + run.font.color.rgb = shared.RGBColor(121, 121, 121) + run.font_size = shared.Inches(0.3) + run.font.highlight_color = WD_COLOR_INDEX.GRAY_25 + + if is_send: + p = content_cell.paragraphs[0] + p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT + reply_p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT + doc.add_paragraph() + + def set_table_different_width(self, table, widths): + """表格分别设置列宽,单位为Cm""" + for x, width in enumerate(widths): + for cell in table.columns[x].cells: + cell.width = Inches(width) + + def link(self, doc, message: LinkMessage): + """ + 处理回复消息 + @param doc: + @param message: + @return: + """ + is_send = message.is_sender + + avatar = self.get_avatar_path(message, True) + content_cell = self.create_table(doc, is_send, avatar) + # 创建一个包含两行两列的表格 + # 第一行用于放置标题、内容以及缩略图 + # 第二行合并两列,用于显示应用名 + table = content_cell.add_table(rows=3, cols=2) + self.set_table_different_width(table, [10086, 0.5]) + # 第一行左侧单元格:添加标题和内容 + cell_header = table.cell(0, 0) + cell_header.merge(table.cell(0, 1)) + # 添加标题 + p_title = cell_header.paragraphs[0] + self.add_text_in(p_title, message.title) + run = p_title.runs[0] + run.font.size = Pt(12) # 设置字体大小 + if message.href: + r_id = p_title.part.relate_to(message.href, RELATIONSHIP_TYPE.HYPERLINK, is_external=True) # 关联超链接 + + hyperlink = OxmlElement('w:hyperlink') + hyperlink.set(qn('r:id'), r_id) + run.font.color.theme_color = MSO_THEME_COLOR_INDEX.HYPERLINK + run.font.underline = True + hyperlink.append(run._r) + + p_title._element.append(hyperlink) + + # 添加内容 + cell_content = table.cell(1, 0) + self.add_text_in(cell_content.paragraphs[0], message.description) + + # 第一行右侧单元格:添加缩略图 + cell_right = table.cell(1, 1) + cell_right.width = shared.Inches(0.5) + p_img = cell_right.paragraphs[0] + p_img.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 图片居中显示 + # 插入图片,调整图片宽度(需确保thumbnail.jpg图片存在) + # p_img.add_run().add_picture( + # r"E:\Project\Python\MemoTrace\dist\MemoTrace-2.1.0\data\聊天记录\涵涵(wxid_9snu8vlykdpt22)\涵涵_14\word\media\image1.png", + # width=Inches(0.5)) + + # 第二行:合并两个单元格显示应用名 + cell_app = table.cell(2, 0) + cell_app.merge(table.cell(2, 1)) + self.add_text_in(cell_app.paragraphs[0], message.app_name) + cell_app.paragraphs[0].paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 应用名居中 + self.delete_paragraph(content_cell.paragraphs[0]) + doc.add_paragraph() + + def add_system_text(self, doc, text): + if not text: + return + p = doc.add_paragraph(text) + p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER + run = p.runs[0] + run.font.color.rgb = shared.RGBColor(121, 121, 121) + run.font.size = Pt(9) + # run.font.highlight_color = WD_COLOR_INDEX.GRAY_25 + + def system_msg(self, doc, message): + str_content = message.content + str_content = str_content.replace('<![CDATA[', "").replace( + ' <a href="weixin://revoke_edit_click">重新编辑</a>]]>', "") + res = findall('(</{0,1}(img|revo|_wc_cus|a).*?>)', str_content) + for xmlstr, b in res: + str_content = str_content.replace(xmlstr, "") + self.add_system_text(doc, str_content) + + def delete_paragraph(self, paragraph): + """删除某一段落""" + p = paragraph._element + tc = p.getparent() + tc.remove(p) + p._p = None + p._element = None + + def create_table(self, doc, is_send, avatar_path): + """ + #! 创建一个1*2表格 + #! isSend = 1 (0,0)存聊天内容,(0,1)存头像 + #! isSend = 0 (0,0)存头像,(0,1)存聊天内容 + #! 返回聊天内容的坐标 + """ + table = doc.add_table(rows=1, cols=2, style='Normal Table') + table.cell(0, 1).height = shared.Inches(0.5) + table.cell(0, 0).height = shared.Inches(0.5) + if is_send: + '''表格右对齐''' + table.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT + avatar = table.cell(0, 1).paragraphs[0].add_run() + '''插入头像,设置头像宽度''' + try: + avatar.add_picture(avatar_path, width=shared.Inches(0.5)) + except: + logger.error('头像插入失败') + '''设置单元格宽度跟头像一致''' + table.cell(0, 1).width = shared.Inches(0.5) + content_cell = table.cell(0, 0) + '''聊天内容右对齐''' + content_cell.paragraphs[0].paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT + else: + avatar = table.cell(0, 0).paragraphs[0].add_run() + try: + avatar.add_picture(avatar_path, width=shared.Inches(0.5)) + except: + logger.error('头像插入失败') + '''设置单元格宽度''' + table.cell(0, 0).width = shared.Inches(0.5) + content_cell = table.cell(0, 1) + '''聊天内容垂直居中对齐''' + content_cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER + return content_cell + + def export(self): + print(f"【开始导出 DOCX {self.contact.remark}】") + origin_path = self.origin_path + messages = self.database.get_messages(self.contact.wxid, time_range=self.time_range) + total_steps = len(messages) + self.save_avatars() + + def newdoc(): + nonlocal docx_num, doc + doc = docx.Document() + doc.styles["Normal"].font.name = "Cambria" + doc.styles["Normal"]._element.rPr.rFonts.set(qn("w:eastAsia"), "宋体") + core_properties = doc.core_properties + core_properties.author = 'MemoTrace' # 作者 + core_properties.comments = 'generated by MemoTrace' # 注释 + docx_num += 1 + + doc = None + docx_num = 0 + newdoc() + selected_msg_cnt = 0 + for index, message in enumerate(messages): + if index and index % 1000 == 0: + self.update_progress_callback(index / total_steps) + if not self.is_selected(message): + continue + + if not self._is_running: + break + selected_msg_cnt += 1 + type_ = message.type + timestamp = message.timestamp + if self.is_5_min(timestamp): + str_time = message.str_time + self.add_system_text(doc, str_time) + if type_ == MessageType.System: + self.system_msg(doc, message) + elif type_ == MessageType.Quote: + self.refermsg(doc, message) + elif type_ == MessageType.Image: + self.image(doc, message) + elif type_ in {MessageType.LinkMessage, MessageType.Applet, MessageType.Music}: + self.link(doc, message) + else: + try: + avatar = self.get_avatar_path(message, True) + self.add_text_message(doc, avatar, message.is_sender, message.to_text(), + message.display_name if self.contact.is_chatroom() else '') + except: + pass + if selected_msg_cnt % self.msg_num_per_docx == 0 or index == total_steps - 1: + filename = os.path.join(origin_path, f"{self.contact.remark}_{docx_num}.docx") + filename = get_new_filename(filename) + try: + doc.save(filename) + except PermissionError: + filename = os.path.join(origin_path, f"{self.contact.remark}_{docx_num}_{str(time.time())}.docx") + doc.save(filename) + except: + pass + newdoc() + self.update_progress_callback(1) + print(f"【完成导出 DOCX {self.contact.remark}】") + self.finish_callback(self.exporter_id) diff --git a/exporter/exporter_html.py b/exporter/exporter_html.py new file mode 100644 index 0000000..a142609 --- /dev/null +++ b/exporter/exporter_html.py @@ -0,0 +1,299 @@ +import copy +import html +import json +import math +import os +import shutil +import time +from wxManager.decrypt.decrypt_dat import batch_decode_image_multiprocessing +from wxManager.log import logger +from wxManager.model import MessageType, Me +from exporter.exporter import ExporterBase, copy_files, decode_audios, get_new_filename + +icon_files = { + 'DOCX': ['doc', 'docx'], + 'XLS': ['xls', 'xlsx'], + 'CSV': ['csv'], + 'TXT': ['txt'], + 'ZIP': ['zip', '7z', 'rar'], + 'PPT': ['ppt', 'pptx'], + 'PDF': ['pdf'], +} + + +class HtmlExporter(ExporterBase): + + def export(self): + print(f"【开始导出 HTML {self.contact.remark}】") + f_name = '.html' + filename = os.path.join(self.origin_path, f'{self.contact.remark}{f_name}') + filename = get_new_filename(filename) + # 获取当前脚本的目录 + current_dir = os.path.dirname(os.path.abspath(__file__)) + # 构建要读取的文件路径 + file_path = os.path.join(current_dir, 'resources', 'template.html') + shutil.copytree(os.path.join(current_dir, 'resources', 'emoji'), os.path.join(self.origin_path, 'emoji'),dirs_exist_ok=True) + with open(file_path, "r", encoding="utf-8") as f: + content = f.read() + html_head, html_end = content.split('/*注意看这是分割线*/') + f = open(filename, 'w', encoding='utf-8') + html_head = html_head.replace("<title>出错了</title>", f"<title>{self.contact.remark}</title>") + html_head = html_head.replace("<p id=\"title\">出错了</p>", f"<p id=\"title\">{self.contact.remark}</p>") + # avatar_urls, avatar_paths = self.get_avatar_urls() + avatar_urls = [] + avatar_paths = [] + html_head = html_head.replace("{{avatarPaths}}", json.dumps(avatar_paths)) + html_head = html_head.replace("{{avatarUrls}}", json.dumps(avatar_urls)).replace('{{wxid}}', + f'"{self.contact.wxid}"') + f.write(html_head) + messages = self.database.get_messages(self.contact.wxid, time_range=self.time_range) + + # QMe().save_avatar(self.origin_path + '/avatar/' + Me().wxid + '.png') + # self.contact.save_avatar(self.origin_path + '/avatar/' + self.contact.wxid + '.png') + date_id_map = {} + timelineData = {} + PageTimeline = {} + server_id_Page = {} + server_id_Idx = {} + + AllIndex = [] + ImageIndex = [] + FileIndex = [] + LinkIndex = [] + MusicIndex = [] + TransferIndex = [] + MiniProgramIndex = [] + VideoNumberIndex = [] + dateDataMap = {} + i = 0 + itemsPerPage = 100 + num = 1 + html_json = [] + image_tasks = [] + video_tasks = [] + file_tasks = [] + audio_tasks = [] + image_dir = os.path.join(self.origin_path, 'image') + video_dir = os.path.join(self.origin_path, 'video') + audio_dir = os.path.join(self.origin_path, 'voice') + file_dir = os.path.join(self.origin_path, 'file') + total_steps = len(messages) + select_msg_cnt = 0 # 要导出的消息数量 + msg_index = 0 + + def parser_merged(merged_message): + for msg in merged_message.messages: + type_ = msg.type + if type_ == MessageType.Image: + msg.set_file_name() + image_tasks.append( + ( + os.path.join(Me().wx_dir, msg.path), + os.path.join(image_dir, msg.str_time[:7]), + msg.file_name + ) + ) + image_tasks.append( + ( + os.path.join(Me().wx_dir, msg.thumb_path), + os.path.join(image_dir, msg.str_time[:7]), + msg.file_name + '_t' + ) + ) + msg.path = f"./image/{msg.str_time[:7]}/{msg.file_name}" + msg.thumb_path = f"./image/{msg.str_time[:7]}/{msg.file_name + '_t'}" + elif type_ == MessageType.File: + origin_file_path = os.path.join(Me().wx_dir, msg.path) + file_tasks.append( + ( + origin_file_path, + os.path.join(file_dir, msg.str_time[:7]), + '' + ) + ) + msg.path = f'./file/{msg.str_time[:7]}/{os.path.basename(origin_file_path)}' + elif type_ == MessageType.Video: + msg.set_file_name() + video_tasks.append( + ( + os.path.join(Me().wx_dir, msg.path), + os.path.join(video_dir, msg.str_time[:7]), + msg.file_name + ) + ) + ext = os.path.basename(msg.path).split('.')[-1] + msg.path = f'./video/{msg.str_time[:7]}/{msg.file_name}.{ext}' + elif type_ == MessageType.MergedMessages: + parser_merged(msg) + + for index, message in enumerate(messages): + if not self._is_running: + break + if index and index % 1000 == 0: + self.update_progress_callback(index / total_steps) + type_ = message.type + if not self.is_selected(message): + msg_index -= 1 + continue + server_id = message.server_id + if type_ == MessageType.Image: + ImageIndex.append(msg_index) + message.set_file_name() + image_tasks.append( + ( + os.path.join(Me().wx_dir, message.path), + os.path.join(image_dir, message.str_time[:7]), + message.file_name + ) + ) + image_tasks.append( + ( + os.path.join(Me().wx_dir, message.thumb_path), + os.path.join(image_dir, message.str_time[:7]), + message.file_name + '_t' + ) + ) + message.path = f"./image/{message.str_time[:7]}/{message.file_name}" + message.thumb_path = f"./image/{message.str_time[:7]}/{message.file_name + '_t'}" + elif type_ == MessageType.File: + FileIndex.append(msg_index) + origin_file_path = os.path.join(Me().wx_dir, message.path) + file_tasks.append( + ( + origin_file_path, + os.path.join(file_dir, message.str_time[:7]), + '' + ) + ) + if os.path.isfile(origin_file_path): + message.path = f'./file/{message.str_time[:7]}/{os.path.basename(origin_file_path)}' + elif type_ == MessageType.Video: + ImageIndex.append(msg_index) + message.set_file_name() + video_tasks.append( + ( + os.path.join(Me().wx_dir, message.path), + os.path.join(video_dir, message.str_time[:7]), + message.file_name + ) + ) + ext = os.path.basename(message.path).split('.')[-1] + message.path = f'./video/{message.str_time[:7]}/{message.file_name}.{ext}' + elif type_ == MessageType.Audio: + message.set_file_name() + audio_tasks.append( + ( + self.database.get_media_buffer(message.server_id, self.contact.is_public()), + os.path.join(audio_dir, message.str_time[:7]), + message.file_name + ) + ) + message.path = f'./voice/{message.str_time[:7]}/{message.file_name + ".mp3"}' + elif type_ == MessageType.LinkMessage or type_ == MessageType.LinkMessage2 or type_ == MessageType.LinkMessage4 or type_ == MessageType.LinkMessage5 or type_ == MessageType.LinkMessage6: + LinkIndex.append(msg_index) + elif type_ == MessageType.Music: + MusicIndex.append(msg_index) + elif type_ == MessageType.Transfer: + TransferIndex.append(msg_index) + elif type_ == MessageType.Applet or type_ == MessageType.Applet2: + MiniProgramIndex.append(msg_index) + elif type_ == MessageType.WeChatVideo: + VideoNumberIndex.append(msg_index) + elif type_ == MessageType.MergedMessages: + parser_merged(message) + + msg_index += 1 + is_select = True + html_json.append(message.to_json()) + if is_select: + select_msg_cnt += 1 + # 把时间戳转换为格式化时间 + str_time = message.str_time + # 2024-01-01 + year = str_time[:4] + month = int(str_time[5:7]) + curpage = math.ceil(select_msg_cnt / itemsPerPage) + if str_time[:10] not in date_id_map: + date_id_map[str_time[:10]] = str(server_id) + if str_time[:10] not in dateDataMap: + dateDataMap[str_time[:10]] = [curpage, str(server_id)] + + if year not in timelineData: + timelineData[year] = {} + if month not in timelineData[year]: + timelineData[year][month] = [] + timelineData[year][month].append(curpage) + timelineData[year][month].append(str(server_id)) + + if curpage not in PageTimeline: + PageTimeline[curpage] = {} + PageTimeline[curpage]['year'] = year + PageTimeline[curpage]['month'] = month + + server_id_Page[str(server_id)] = curpage + server_id_Idx[str(server_id)] = select_msg_cnt - 1 + + # print(image_tasks) + # print(file_tasks) + # print(video_tasks) + # print(audio_tasks) + logger.info('解析图片') + # 使用多进程,导出所有图片 + batch_decode_image_multiprocessing(Me().xor_key, image_tasks) + print('开始复制文件') + logger.info(f'开始复制{len(video_tasks + file_tasks)}') + # 使用多线程,复制文件、视频到导出文件夹 + copy_files(video_tasks + file_tasks) + print('开始导出语音') + logger.info('开始导出语音') + decode_audios(audio_tasks) + + AllIndex = list(range(len(html_json))) + + replace_map = { + "{{timelineData}}": timelineData, + "{{PageTimeline}}": PageTimeline, + "{{server_id_Page}}": server_id_Page, + "{{server_id_Idx}}": server_id_Idx, + "{{dateDataMap}}": dateDataMap, + "{{AllIndex}}": AllIndex, + "{{ImageIndex}}": ImageIndex, + "{{FileIndex}}": FileIndex, + "{{LinkIndex}}": LinkIndex, + "{{MusicIndex}}": MusicIndex, + "{{TransferIndex}}": TransferIndex, + "{{MiniProgramIndex}}": MiniProgramIndex, + "{{VideoNumberIndex}}": VideoNumberIndex + } + + def dict_to_js(dic: dict): + for key, value in dic.items(): + if isinstance(value, str): + if value.startswith('http'): + dic[key] = value + else: + dic[key] = html.escape(value) + elif isinstance(value, dict): + dic[key] = dict_to_js(value) + return dic + + print('开始字符串转义') + logger.info('开始字符串转义') + # 字符串转义,防止JS出现语法错误 + html_data = [] + for item in copy.deepcopy(html_json): + html_data.append(dict_to_js(item)) + + f.write(json.dumps(html_data, ensure_ascii=False, indent=4)) + for key, value in replace_map.items(): + html_end = html_end.replace(key, json.dumps(value)) + + f.write(html_end) + f.close() + + with open(filename + '.json', 'w', encoding='utf-8') as f: + json.dump(html_json, f, ensure_ascii=False, indent=4) + + self.update_progress_callback(1) + print(f"【完成导出 HTML {self.contact.remark}】{len(messages)}") + self.finish_callback(self.exporter_id) diff --git a/exporter/exporter_json.py b/exporter/exporter_json.py new file mode 100644 index 0000000..999f41b --- /dev/null +++ b/exporter/exporter_json.py @@ -0,0 +1,305 @@ +import json +import random +import os + +from wxManager import Me, MessageType +from exporter.exporter import ExporterBase, remove_privacy_info, get_new_filename + + +class JsonStrategy: + SPLIT_BY_TIME = 0 # 距离第一条消息的时间范围 + SPLIT_BY_INTERVALS = 1 # 相邻消息的时间间隔 + SLIDING_WINDOW = 2 # 滑动窗口法分割 + + +class AssistantUser: + SELF = 0 # 自己是ai助手 + CONTACT = 1 # 好友是ai助手 + + +class JsonConfig: + prompt: str = '' + shuffle: bool = True # 是否随机打乱数据 + train_ratio: int = 80 # 训练集占比(百分比) + model: str = 'Alpaca' # 可选:GLM4,ChatGLM3 + model_keys = { + 'GLM4': 'messages', + 'ChatGLM3': 'conversations' + } + strategy: int = JsonStrategy.SPLIT_BY_INTERVALS # json导出策略 + intervals: int = 120 # 相邻两条消息的最大间隔时间 + span: int = 300 # 第一条消息跟最后一条消息的间隔时间 + window_size: int = 10 # 窗口大小 + step: int = 3 # 步长 + assistant = AssistantUser.SELF + + def get_model_keys(self): + return self.model_keys.get(self.model, 'messages') + + +def modify(output, history): + return output + + +def merge_content(conversions_list) -> list: + """ + 合并一组对话中连续发送的句子 + @param conversions_list: + @return: + """ + merged_data = [] + current_role = None + current_content = "" + str_time = '' + for item in conversions_list: + if 'str_time' in item: + str_time = item['str_time'] + else: + str_time = '' + if current_role is None: + current_role = item["role"] + current_content = item["content"] + elif current_role == item["role"]: + current_content += "," + item["content"] + else: + # merged_data.append({"role": current_role, "content": current_content, 'str_time': str_time}) + if len(current_content) < 3 and current_role == 'assistant': + current_content = modify(current_content, merged_data) + merged_data.append({"role": current_role, "content": current_content}) + current_role = item["role"] + current_content = item["content"] + str_time = item.get('str_time') + + # 处理最后一组 + if current_role is not None: + # merged_data.append({"role": current_role, "content": current_content,'str_time': str_time}) + merged_data.append({"role": current_role, "content": current_content}) + return merged_data + + +def is_first_msg(conversions): + if not conversions: + return True + else: + return len(conversions) == 1 and conversions[0]['role'] == 'system' + + +def conversion_to_history(conversations): + res = [] + has_system_prompt = conversations[0].get('role') == 'system' + s_index, e_index = (1, len(conversations) - 3) if has_system_prompt else (0, len(conversations) - 2) + for i in range(s_index, e_index, 2): + res.append( + [ + conversations[i].get('content'), conversations[i + 1].get('content') + ] + ) + return res + + +class JsonExporter(ExporterBase): + def __init__( + self, + database, + contact, + output_dir, + type_, # 导出文件类型 + message_types: set[MessageType] = None, # 导出的消息类型 + time_range=None, # 导出的日期范围 + group_members: set[str] = None, # 群聊中只导出这些人的聊天记录 + progress_callback=None, # 进度回调函数,func(progress:float) + finish_callback=None, # 导出完成回调函数 + json_config: JsonConfig = None + ): + super().__init__(database, contact, output_dir, type_, message_types, time_range, group_members, + progress_callback, finish_callback) # 调用父类的构造函数 + if json_config: + self.json_config: JsonConfig = json_config + else: + self.json_config = JsonConfig() + + def is_user(self, is_send): + """ + 判断一条消息是否是user角色发送的 + @param is_send: + @return: + """ + return is_send ^ (self.json_config.assistant == AssistantUser.SELF) + + def system_prompt(self): + system = { + "role": "system", + "content": self.json_config.prompt.replace( + '{{name}}', Me().name + ).replace( + '{{remark}}', self.contact.remark + ) + } + return system + + def message_to_conversion(self, group): + conversions = [self.system_prompt()] if self.json_config.prompt else [] + # 确保最后一条消息是assistant发出的 + while len(group) and self.is_user(group[-1].is_sender): + group.pop() + for message in group: + is_send = message.is_sender + text = remove_privacy_info(message.content) + # 确保第一条消息必须是user发出的 + if is_first_msg(conversions) and not self.is_user(is_send): + continue + if self.is_user(is_send): + json_msg = { + "role": "user", + "content": text + } + else: + json_msg = { + "role": "assistant", + "content": text + } + json_msg['str_time'] = message.str_time + conversions.append(json_msg) + if len(conversions) == 1: + return [] + return merge_content(conversions) + + def split_by_time(self, length=300): + """ + 通过第一条消息和最后一条消息的时间间隔分割数据集 + @param length: + @return: + """ + messages = self.database.get_messages_by_type(self.contact.wxid, type_=MessageType.Text, + time_range=self.time_range) + start_time = 0 + res = [] + i = 0 + while i < len(messages): + message = messages[i] + timestamp = message.timestamp + is_send = message.is_sender + group = [] + while i < len(messages) and timestamp - start_time < length: + group.append(message) + i += 1 + if i >= len(messages): + break + message = messages[i] + timestamp = message.timestamp + is_send = message.is_sender + while not self.is_user(is_send): + group.append(message) + i += 1 + if i >= len(messages): + break + message = messages[i] + timestamp = message.timestamp + is_send = message.is_sender + start_time = timestamp + if len(group) > 4: + res.append(group) + return res + + def split_by_intervals(self, max_diff_seconds=300): + """ + 通过相邻两条消息的时间间隔分割数据集 + @param max_diff_seconds: + @return: + """ + messages = self.database.get_messages_by_type(self.contact.wxid, type_=MessageType.Text, + time_range=self.time_range) + res = [] + i = 0 + current_group = [] + while i < len(messages): + message = messages[i] + timestamp = message.timestamp + is_send = message.is_sender + while not self.is_user(is_send) and i + 1 < len(messages): + i += 1 + message = messages[i] + is_send = message.is_sender + current_group = [messages[i]] + i += 1 + while i < len(messages) and messages[i].timestamp - current_group[-1].timestamp <= max_diff_seconds: + current_group.append(messages[i]) + i += 1 + while i < len(messages) and not self.is_user(messages[i].is_sender): + current_group.append(messages[i]) + i += 1 + if len(current_group) > 4: + res.append(current_group) + return res + + def split_by_window(self, window_size=10, step=3): + """ + 滑动窗口切分数据集 + @param window_size: + @param step: + @return: + """ + messages = self.database.get_messages_by_type(self.contact.wxid, type_=MessageType.Text, + time_range=self.time_range) + res = [] + i = 0 + while i < len(messages): + message = messages[i] + timestamp = message.timestamp + is_send = message.is_sender + current_group = [] + j = i + while not self.is_user(is_send) and j + 1 < len(messages) and j - i < window_size: + j += 1 + message = messages[j] + is_send = message.is_sender + current_group = [messages[j]] + j += 1 + while j < len(messages) and j - i < window_size: + current_group.append(messages[j]) + j += 1 + res.append(current_group) + i += step + return res + + def export(self): + print(f"【开始导出 json {self.contact.remark}】") + origin_path = self.origin_path + filename = os.path.join(origin_path, f"{self.contact.remark}.json") + filename = get_new_filename(filename) + messages_groups = [] + match self.json_config.strategy: + case JsonStrategy.SPLIT_BY_INTERVALS: + messages_groups = self.split_by_intervals(self.json_config.intervals) + case JsonStrategy.SPLIT_BY_TIME: + messages_groups = self.split_by_time(self.json_config.span) + case JsonStrategy.SLIDING_WINDOW: + messages_groups = self.split_by_window(self.json_config.window_size, self.json_config.step) + dataset = [] + self.update_progress_callback(0.5) + for group in messages_groups: + conversations = self.message_to_conversion(group) + if conversations: + if self.json_config.model == 'Alpaca': + has_system_prompt = conversations[0].get('role') == 'system' + dataset.append( + { + 'system': conversations[0].get('content') if has_system_prompt else '', + 'instruction': conversations[-2].get('content'), + 'input': '', + 'output': conversations[-1].get('content'), + 'history': conversion_to_history(conversations), + } + ) + else: + dataset.append({ + self.json_config.get_model_keys(): conversations + }) + if self.json_config.shuffle: + # 打乱列表顺序 + random.shuffle(dataset) + with open(filename, "w", encoding="utf-8") as f: + json.dump(dataset, f, ensure_ascii=False, indent=4) + print(f"【完成导出 json {self.contact.remark}】") + self.update_progress_callback(1) + self.finish_callback(self.exporter_id) diff --git a/exporter/exporter_markdown.py b/exporter/exporter_markdown.py new file mode 100644 index 0000000..a62f72e --- /dev/null +++ b/exporter/exporter_markdown.py @@ -0,0 +1,210 @@ +import os +import re + +from exporter.exporter import ExporterBase +from wxManager import MessageType, Message +from wxManager.model import QuoteMessage, LinkMessage + + +def parser_date(str_date): + # 2024-01-01 12:00:00 + return str_date[0:4], str_date[0:7], str_date[0:10] + + +def escape_markdown(text): + """ + 转义Markdown特殊字符。 + """ + if not text: + return '' + # 定义需要转义的特殊字符 + special_chars = r"([\\`*_{}[\]()#+\-.!|])" + # 使用正则表达式添加转义符 + escaped_text = re.sub(special_chars, r"\\\1", text) + return escaped_text + + +class MarkdownExporter(ExporterBase): + def title(self, message): + str_time = message.str_time + return f'**{str_time[11:]} {escape_markdown(message.display_name)}**:' + + def text(self, doc, message): + str_content = message.content + doc.write( + f'''{self.title(message)} {escape_markdown(str_content)}\n\n''' + ) + + def image(self, doc, message): + doc.write( + f'''{self.title(message)} \n\n''' + ) + + def audio(self, doc, message): + voice_to_text = self.database.get_audio_text(message.server_id) + doc.write( + f'''{self.title(message)} [语音] {voice_to_text}\n\n''' + ) + + def emoji(self, doc, message): + doc.write( + f'''{self.title(message)} [表情包][{message.description}]\n\n''' + ) + + def file(self, doc, message): + doc.write( + f'''{self.title(message)} [文件]\n\n''' + ) + + def refermsg(self, doc, message: QuoteMessage): + doc.write( + f'''{self.title(message)} {message.content} \n> {escape_markdown(message.quote_message.to_text())}\n\n''' + ) + + def system_msg(self, doc, message): + str_content = message.content + str_time = message.str_time + str_content = str_content.replace('<![CDATA[', "").replace( + ' <a href="weixin://revoke_edit_click">重新编辑</a>]]>', "") + doc.write( + f'''> {str_time} {str_content}\n\n''' + ) + + def video(self, doc, message): + doc.write( + f'''{self.title(message)}\n[视频]\n\n''' + ) + + def music_share(self, doc, message: LinkMessage): + doc.write( + f'''{self.title(message)} {message.description} [{message.description}]({message.href}) {message.app_name}\n\n''' + ) + + def share_card(self, doc, message: LinkMessage): + doc.write( + f'''{self.title(message)} [{escape_markdown(message.title)}]({message.href})\n\n''' + ) + + def transfer(self, doc, message): + doc.write( + f'''{self.title(message)} {message.to_text()}\n\n''' + ) + + def call(self, doc, message): + doc.write( + f'''{self.title(message)} {message.to_text()}\n\n''' + ) + + def personal_business_card(self, doc, message): + doc.write( + f'''{self.title(message)}{message.to_text()}\n\n''' + ) + + + def position(self, doc, message): + doc.write( + f'''{self.title(message)} {message.to_text()}\n\n''' + ) + + def relay(self, doc, message): + doc.write( + f'''{self.title(message)} {message.to_text()}\n\n''' + ) + + def applets(self, doc, message): + doc.write( + f'''{self.title(message)}【小程序】: {message.app_name}:[{message.title}]({message.href})\n\n''' + ) + + def media(self, doc, message): + doc.write( + f'''{self.title(message)} {message.to_text()}\n\n''' + ) + + def announcement(self, doc, message): + doc.write( + f'''{self.title(message)}{message.to_text()}\n\n''' + ) + + def add_year(self, doc, year): + doc.write(f'## {year}\n\n') + + def add_month(self, doc, month): + doc.write(f'### {month}\n\n') + + def add_day(self, doc, day): + doc.write(f'#### {day}\n\n') + + def export(self): + # 实现导出为txt的逻辑 + print(f"【开始导出 Markdown {self.contact.remark}】") + origin_path = self.origin_path + os.makedirs(origin_path, exist_ok=True) + filename = os.path.join(origin_path, self.contact.remark + '.md') + messages = self.database.get_messages(self.contact.wxid, time_range=self.time_range) + total_steps = len(messages) + num = 1 + years = set() + months = set() + days = set() + with open(filename, mode='w', newline='', encoding='utf-8') as f: + for index, message in enumerate(messages): + if not self._is_running: + break + if index and index % 1000 == 0: + self.update_progress_callback(index / total_steps) + if not self.is_selected(message): + continue + type_ = message.type + year, month, day = parser_date(message.str_time) + if year not in years: + self.add_year(f, year) + years.add(year) + if month not in months: + self.add_month(f, month) + months.add(month) + if day not in days: + self.add_day(f, day) + days.add(day) + + if self.contact.is_chatroom() and self.group_members_set: + contact = message[13] + if contact.wxid not in self.group_members_set: + continue + if type_ == MessageType.Text: + self.text(f, message) + elif type_ == MessageType.Image: + self.image(f, message) + elif type_ == MessageType.Audio: + self.audio(f, message) + elif type_ == MessageType.Video: + self.video(f, message) + elif type_ == MessageType.Emoji: + self.emoji(f, message) + elif type_ == MessageType.System: + self.system_msg(f, message) + elif type_ == MessageType.Quote: + self.refermsg(f, message) + elif type_ == MessageType.File: + self.file(f, message) + elif type_ == MessageType.LinkMessage: + self.share_card(f, message) + elif type_ == MessageType.Transfer: + self.transfer(f, message) + elif type_ == MessageType.MergedMessages: + self.relay(f, message) + elif type_ == MessageType.Applet: + self.applets(f, message) + elif type_ == MessageType.WeChatVideo: + self.media(f, message) + # elif type_ == MessageType.: + # self.announcement(f, message) + elif type_ == MessageType.Voip: + self.call(f, message) + elif type_ == MessageType.BusinessCard: + self.personal_business_card(f, message) + elif type_ == MessageType.Position: + self.position(f, message) + self.update_progress_callback(1) + print(f"【完成导出 Markdown {self.contact.remark}】") + self.finish_callback(self.exporter_id) diff --git a/exporter/exporter_txt.py b/exporter/exporter_txt.py new file mode 100644 index 0000000..a47d506 --- /dev/null +++ b/exporter/exporter_txt.py @@ -0,0 +1,37 @@ +import os +import traceback + +from wxManager import MessageType +from wxManager.model import Message +from exporter.exporter import ExporterBase, get_new_filename + + +class TxtExporter(ExporterBase): + def title(self, message: Message): + str_time = message.str_time + if message.type == MessageType.System: + return f'{str_time}' + display_name = message.display_name + return f'{str_time} {display_name}' + + def export(self): + # 实现导出为txt的逻辑 + print(f"【开始导出 TXT {self.contact.remark}】") + origin_path = self.origin_path + os.makedirs(origin_path, exist_ok=True) + filename = os.path.join(origin_path, self.contact.remark + '.txt') + filename = get_new_filename(filename) + messages = self.database.get_messages(self.contact.wxid, time_range=self.time_range) + total_steps = len(messages) + txt_res = [] + for index, message in enumerate(messages): + if index and index % 1000 == 0: + self.update_progress_callback(index / total_steps) + if not self.is_selected(message): + continue + txt_res.append(f'{self.title(message)}\n{message.to_text()}') + with open(filename, mode='w', newline='', encoding='utf-8') as f: + f.write('\n\n'.join(txt_res)) + self.update_progress_callback(1) + print(f"【完成导出 TXT {self.contact.remark}】") + self.finish_callback(self.exporter_id) diff --git a/exporter/exporter_xlsx.py b/exporter/exporter_xlsx.py new file mode 100644 index 0000000..59ad159 --- /dev/null +++ b/exporter/exporter_xlsx.py @@ -0,0 +1,526 @@ +import os +import time +import traceback + +from wxManager import Me, MessageType +from wxManager.decrypt.decrypt_dat import batch_decode_image_multiprocessing +from wxManager.log import logger +from wxManager.model import Message +from exporter.exporter import ExporterBase, copy_files, decode_audios, get_new_filename + +from PIL import JpegImagePlugin +from PIL import ImageFile + +from PIL import Image as PILImage + +from wxManager.parser.link_parser import wx_sport, wx_collection_data, wx_pay_data + +JpegImagePlugin._getmp = lambda x: None +ImageFile.LOAD_TRUNCATED_IMAGES = True + + +def add_hyperlink(doc, row, column, hyperlink): + from openpyxl.styles import Font + import openpyxl + from openpyxl.drawing.image import Image + from openpyxl.utils import get_column_letter + Image.MAX_IMAGE_PIXELS = None + cell = doc.cell(row=row, column=column) + cell.hyperlink = hyperlink + # 添加样式来改变超链接文本的颜色和下划线 + font = Font(color="0000FF", underline="single") # 蓝色和单下划线 + cell.font = font + + +def find_image_with_known_extensions(img_path): + # 常见的图片后缀名 + extensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp'] + directory = os.path.dirname(img_path) + filename = os.path.basename(img_path) + + for ext in extensions: + # 构造完整路径 + full_path = os.path.join(directory, f"{filename}{ext}") + # 检查文件是否存在 + if os.path.isfile(full_path): + return full_path + + return None + + +class ExcelExporter(ExporterBase): + row = 2 + + def add_member_info(self, sheet): + if self.contact.is_chatroom(): + columns = ['wxid', '微信号', '类型', '群昵称', '昵称', '头像地址', + '头像原图', '标签', '性别', '个性签名', '国家(地区)', '省份', '城市'] + self.group_contacts = self.database.get_chatroom_members(self.contact.wxid) + # 写入CSV文件 + sheet.append(columns) + for wxid, contact in self.group_contacts.items(): + sheet.append( + [ + contact.wxid, contact.alias, contact.flag, contact.remark, contact.nickname, + contact.small_head_img_url, contact.big_head_img_url, contact.label_name(), + contact.gender, contact.signature, *contact.region + ] + ) + else: + if self.contact.is_public(): + pass + else: + columns = ( + 'wxid', '微信号', '类型', '群昵称', '昵称', '头像地址', '头像原图', '标签', '性别', '电话', + '个性签名', '国家(地区)', '省份', '城市') + # 写入CSV文件 + sheet.append(columns) + contact = self.contact + sheet.append( + [ + contact.wxid, contact.alias, contact.flag, contact.remark, contact.nickname, + contact.small_head_img_url, contact.big_head_img_url, contact.label_name(), + contact.gender, contact.signature, *contact.region + ] + ) + + def message_to_list(self, message: Message): + remark = message.display_name + nickname = message.display_name + if self.contact.is_chatroom(): + contact = self.group_contacts.get(message.sender_id) + if contact: + remark = contact.remark + nickname = contact.nickname + else: + contact = Me() if message.is_sender else self.contact + remark = contact.remark + nickname = contact.nickname + res = [str(message.server_id), message.type_name(), message.display_name, message.str_time, message.to_text(), + remark, nickname, 'more'] + return res + + def to_excel(self): + from openpyxl.styles import Font + import openpyxl + from openpyxl.drawing.image import Image + from openpyxl.utils import get_column_letter + Image.MAX_IMAGE_PIXELS = None + print(f"【开始导出 XLSX {self.contact.remark}】") + os.makedirs(self.origin_path, exist_ok=True) + filename = os.path.join(self.origin_path, f"{self.contact.remark}.xlsx") + filename = get_new_filename(filename) + columns = ['消息ID', '类型', '发送人', '时间', '内容', '备注', '昵称', '更多信息'] + messages = self.database.get_messages(self.contact.wxid, time_range=self.time_range) + new_workbook = openpyxl.Workbook() + new_sheet = new_workbook.create_sheet("聊天记录", 0) + member_sheet = new_workbook.create_sheet("成员信息", 1) + self.add_member_info(member_sheet) + new_sheet.append(columns) + num = 1 + total_num = len(messages) + image_tasks = [] + video_tasks = [] + file_tasks = [] + audio_tasks = [] + image_dir = os.path.join(self.origin_path, 'image') + video_dir = os.path.join(self.origin_path, 'video') + audio_dir = os.path.join(self.origin_path, 'voice') + file_dir = os.path.join(self.origin_path, 'file') + image_index = {} + + def parser_merged(merged_message): + for msg in merged_message.messages: + type_ = msg.type + if type_ == MessageType.Image: + msg.set_file_name() + image_tasks.append( + ( + os.path.join(Me().wx_dir, msg.path), + os.path.join(image_dir, msg.str_time[:7]), + msg.file_name + ) + ) + image_tasks.append( + ( + os.path.join(Me().wx_dir, msg.thumb_path), + os.path.join(image_dir, msg.str_time[:7]), + msg.file_name + '_t' + ) + ) + msg.path = f"./image/{msg.str_time[:7]}/{msg.file_name}" + msg.thumb_path = f"./image/{msg.str_time[:7]}/{msg.file_name + '_t'}" + elif type_ == MessageType.File: + origin_file_path = os.path.join(Me().wx_dir, msg.path) + file_tasks.append( + ( + origin_file_path, + os.path.join(file_dir, msg.str_time[:7]), + '' + ) + ) + msg.path = f'./file/{msg.str_time[:7]}/{os.path.basename(origin_file_path)}' + elif type_ == MessageType.Video: + msg.set_file_name() + video_tasks.append( + ( + os.path.join(Me().wx_dir, msg.path), + os.path.join(video_dir, msg.str_time[:7]), + msg.file_name + ) + ) + ext = os.path.basename(msg.path).split('.')[-1] + msg.path = f'./video/{msg.str_time[:7]}/{msg.file_name}.{ext}' + elif type_ == MessageType.MergedMessages: + parser_merged(msg) + + for index, message in enumerate(messages): + if not self._is_running: + break + if index % 1000 == 0: + self.update_progress_callback(index / total_num) + if not self.is_selected(message): + continue + try: + new_sheet.append(self.message_to_list(message)) + self.row += 1 + except: + logger.error(traceback.format_exc()) + continue + type_ = message.type + timestamp = message.timestamp + msgSvrId = message.server_id + if type_ == MessageType.Image: + message.set_file_name() + image_index[message.server_id] = self.row + image_tasks.append( + ( + os.path.join(Me().wx_dir, message.path), + os.path.join(image_dir, message.str_time[:7]), + message.file_name + ) + ) + image_tasks.append( + ( + os.path.join(Me().wx_dir, message.thumb_path), + os.path.join(image_dir, message.str_time[:7]), + message.file_name + '_t' + ) + ) + message.path = f"./image/{message.str_time[:7]}/{message.file_name}" + message.thumb_path = f"./image/{message.str_time[:7]}/{message.file_name + '_t'}" + elif type_ == MessageType.File: + origin_file_path = os.path.join(Me().wx_dir, message.path) + file_tasks.append( + ( + origin_file_path, + os.path.join(file_dir, message.str_time[:7]), + '' + ) + ) + if os.path.isfile(origin_file_path): + message.path = f'./file/{message.str_time[:7]}/{os.path.basename(origin_file_path)}' + add_hyperlink(new_sheet, self.row, 5, message.path) + elif type_ == MessageType.Video: + message.set_file_name() + video_tasks.append( + ( + os.path.join(Me().wx_dir, message.path), + os.path.join(video_dir, message.str_time[:7]), + message.file_name + ) + ) + ext = os.path.basename(message.path).split('.')[-1] + message.path = f'./video/{message.str_time[:7]}/{message.file_name}.{ext}' + add_hyperlink(new_sheet, self.row, 5, message.path) + elif type_ == MessageType.Audio: + message.set_file_name() + audio_tasks.append( + ( + self.database.get_media_buffer(message.server_id), + os.path.join(audio_dir, message.str_time[:7]), + message.file_name + ) + ) + message.path = f'./voice/{message.str_time[:7]}/{message.file_name + ".mp3"}' + add_hyperlink(new_sheet, self.row, 5, message.path) + elif type_ == MessageType.MergedMessages: + parser_merged(message) + # 使用多进程,导出所有图片 + batch_decode_image_multiprocessing(Me().xor_key, image_tasks) + + # 使用多线程,复制文件、视频到导出文件夹 + copy_files(video_tasks + file_tasks) + + decode_audios(audio_tasks) + if MessageType.Image in self.message_types: + for index, message in enumerate(messages): + if message.type == MessageType.Image: + row = image_index[message.server_id] + img_path = find_image_with_known_extensions(os.path.join(self.origin_path, message.path)) + if not img_path: + img_path = find_image_with_known_extensions(os.path.join(self.origin_path, message.thumb_path)) + if not img_path: + continue + try: + # 打开图片以获取其尺寸 + with PILImage.open(img_path) as img: + width, height = img.size + max_height = 500 + # 计算缩放比例 + scale = min(1.0, max_height / height) + + # 缩放后的图片尺寸 + scaled_width = int(width * scale) + scaled_height = int(height * scale) + + # 插入图片 + img = Image(img_path) + img.width = scaled_width + img.height = scaled_height + + # 计算单元格的坐标 + cell = f"{get_column_letter(5)}{row}" + + # 将图片添加到工作表 + new_sheet.add_image(img, cell) + + # 设置行高 + new_sheet.row_dimensions[row].height = scaled_height * 0.75 # 0.75 是像素到 Excel 单位的转换因子 + except: + logger.error(traceback.format_exc()) + pass + # 获取列的字母表示(A、B、C...) + col_letter = get_column_letter(1) + # 设置整列的单元格格式为文本 + for cell in new_sheet[col_letter]: + cell.number_format = "@" # "@" 表示文本格式 + try: + new_workbook.save(filename) + except PermissionError: + filename = '.'.join(filename.split('.')[:-1]) + str(int(time.time())) + '.xlsx' + new_workbook.save(filename) + self.update_progress_callback(1) + self.finish_callback(self.exporter_id) + print(f"【完成导出 XLSX {self.contact.remark}】") + + def public_to_excel(self): + from openpyxl.styles import Font + import openpyxl + from openpyxl.drawing.image import Image + from openpyxl.utils import get_column_letter + Image.MAX_IMAGE_PIXELS = None + + print(f"【开始导出 XLSX {self.contact.remark}】") + os.makedirs(self.origin_path, exist_ok=True) + filename = os.path.join(self.origin_path, f"{self.contact.remark}.xlsx") + filename = get_new_filename(filename) + columns = ['日期', '时间', '标题', '描述', '链接', '更多信息'] + messages = self.database.get_messages(self.contact.wxid, time_range=self.time_range) + new_workbook = openpyxl.Workbook() + new_sheet = new_workbook.create_sheet("聊天记录", 0) + new_sheet.append(columns) + total_num = len(messages) + for index, message in enumerate(messages): + if not self._is_running: + break + if index % 1000 == 0: + self.update_progress_callback(index / total_num) + if not message.type in {MessageType.LinkMessage}: + continue + try: + new_sheet.append([*message.str_time.split(' '), message.title, message.description, message.href]) + except: + logger.error(traceback.format_exc()) + continue + # 获取列的字母表示(A、B、C...) + col_letter = get_column_letter(1) + # 设置整列的单元格格式为文本 + for cell in new_sheet[col_letter]: + cell.number_format = "@" # "@" 表示文本格式 + try: + new_workbook.save(filename) + except PermissionError: + filename = '.'.join(filename.split('.')[:-1]) + str(int(time.time())) + '.xlsx' + new_workbook.save(filename) + self.update_progress_callback(1) + self.finish_callback(self.exporter_id) + print(f"【完成导出 XLSX {self.contact.remark}】") + + def wx_pay(self): + from openpyxl.styles import Font + import openpyxl + from openpyxl.drawing.image import Image + from openpyxl.utils import get_column_letter + Image.MAX_IMAGE_PIXELS = None + print(f"【开始导出 XLSX {self.contact.remark}】") + os.makedirs(self.origin_path, exist_ok=True) + filename = os.path.join(self.origin_path, f"{self.contact.remark}.xlsx") + filename = get_new_filename(filename) + columns = ['类型', '收款单位', '日期', '时间', '金额', '付款方式', '收单机构', '更多信息'] + messages = self.database.get_messages(self.contact.wxid, time_range=self.time_range) + new_workbook = openpyxl.Workbook() + new_sheet = new_workbook.create_sheet("聊天记录", 0) + new_sheet.append(columns) + total_num = len(messages) + for index, message in enumerate(messages): + if not self._is_running: + break + if index % 1000 == 0: + self.update_progress_callback(index / total_num) + if not message.type in {MessageType.LinkMessage}: + continue + try: + card_data = wx_pay_data(message.xml_content) + date, str_time = message.str_time.split(' ') + if card_data.get('title') in {'记账日报', '「先享后付」服务使用通知', '转入零钱通,五一享收益', + '转入零钱通,端午享收益', '智能手表支付服务已启用', '优惠券领取提醒', + '清明假期收益规则', '「先享后付」服务完成通知', '礼包领取提醒', + '五一假期收益规则提醒', '端午节假期收益规则', '中秋节假期收益规则', + '元旦假期收益规则', '春节假期收益规则', '五一假期收益规则', + '中秋及国庆假期收益规则', '春节赚收益攻略', '「先享后付」服务取消通知', + '揭开骗局,远离诈骗'}: + continue + new_sheet.append( + [ + card_data.get('title'), card_data.get('display_name'), date, str_time, + card_data.get('money'), card_data.get('payment_type'), card_data.get('acquiring_institution'), + card_data.get('more') + ] + ) + except: + logger.error(traceback.format_exc()) + continue + # 获取列的字母表示(A、B、C...) + col_letter = get_column_letter(1) + # 设置整列的单元格格式为文本 + for cell in new_sheet[col_letter]: + cell.number_format = "@" # "@" 表示文本格式 + try: + new_workbook.save(filename) + except PermissionError: + filename = '.'.join(filename.split('.')[:-1]) + str(int(time.time())) + '.xlsx' + new_workbook.save(filename) + self.update_progress_callback(1) + self.finish_callback(self.exporter_id) + print(f"【完成导出 XLSX {self.contact.remark}】") + + def wx_collect(self): + from openpyxl.styles import Font + import openpyxl + from openpyxl.drawing.image import Image + from openpyxl.utils import get_column_letter + Image.MAX_IMAGE_PIXELS = None + + print(f"【开始导出 XLSX {self.contact.remark}】") + os.makedirs(self.origin_path, exist_ok=True) + filename = os.path.join(self.origin_path, f"{self.contact.remark}.xlsx") + filename = get_new_filename(filename) + columns = ['类型', '日期', '时间', '金额', '详细信息', '汇总', '备注', '更多信息'] + messages = self.database.get_messages(self.contact.wxid, time_range=self.time_range) + new_workbook = openpyxl.Workbook() + new_sheet = new_workbook.create_sheet("聊天记录", 0) + new_sheet.append(columns) + total_num = len(messages) + for index, message in enumerate(messages): + if not self._is_running: + break + if index % 1000 == 0: + self.update_progress_callback(index / total_num) + if not message.type in {MessageType.LinkMessage}: + continue + try: + card_data = wx_collection_data(message.xml_content) + date, str_time = message.str_time.split(' ') + new_sheet.append( + [ + card_data.get('title'), date, str_time, card_data.get('money'), card_data.get('display_name'), + card_data.get('summary'), card_data.get('more') + ] + ) + except: + logger.error(traceback.format_exc()) + continue + # 获取列的字母表示(A、B、C...) + col_letter = get_column_letter(1) + # 设置整列的单元格格式为文本 + for cell in new_sheet[col_letter]: + cell.number_format = "@" # "@" 表示文本格式 + try: + new_workbook.save(filename) + except PermissionError: + filename = '.'.join(filename.split('.')[:-1]) + str(int(time.time())) + '.xlsx' + new_workbook.save(filename) + self.update_progress_callback(1) + self.finish_callback(self.exporter_id) + print(f"【完成导出 XLSX {self.contact.remark}】") + + def wx_sport(self): + from openpyxl.styles import Font + import openpyxl + from openpyxl.drawing.image import Image + from openpyxl.utils import get_column_letter + Image.MAX_IMAGE_PIXELS = None + + + print(f"【开始导出 XLSX {self.contact.remark}】") + os.makedirs(self.origin_path, exist_ok=True) + filename = os.path.join(self.origin_path, f"{self.contact.remark}.xlsx") + filename = get_new_filename(filename) + columns = ['日期', '排名', '步数', '当日冠军', '当日冠军步数', '更多信息'] + messages = self.database.get_messages(self.contact.wxid, time_range=self.time_range) + new_workbook = openpyxl.Workbook() + new_sheet = new_workbook.create_sheet("聊天记录", 0) + new_sheet.append(columns) + total_num = len(messages) + for index, message in enumerate(messages): + if not self._is_running: + break + if index and index % 1000 == 0: + self.update_progress_callback(index / total_num) + if not message.type in {MessageType.LinkMessage}: + continue + try: + card_data = wx_sport(message.xml_content) + champion_name = '' + if not card_data.get('rank_list'): + champion = {} + else: + champion = card_data.get('rank_list')[0] + contact = self.database.get_contact_by_username(champion.get('username')) + champion_name = contact.remark + new_sheet.append( + [ + message.str_time.split(' ')[0], card_data.get('rank'), card_data.get('score'), + champion_name, champion.get('score') + ] + ) + except: + logger.error(traceback.format_exc()) + continue + # 获取列的字母表示(A、B、C...) + col_letter = get_column_letter(1) + # 设置整列的单元格格式为文本 + for cell in new_sheet[col_letter]: + cell.number_format = "@" # "@" 表示文本格式 + try: + new_workbook.save(filename) + except PermissionError: + filename = '.'.join(filename.split('.')[:-1]) + str(int(time.time())) + '.xlsx' + new_workbook.save(filename) + self.update_progress_callback(1) + self.finish_callback(self.exporter_id) + print(f"【完成导出 XLSX {self.contact.remark}】") + + def run(self): + if self.contact.is_public(): + if self.contact.wxid == 'gh_3dfda90e39d6': + self.wx_pay() + elif self.contact.wxid == 'gh_f0a92aa7146c': + self.wx_collect() + elif self.contact.wxid == 'gh_43f2581f6fd6': + self.wx_sport() + else: + self.public_to_excel() + else: + self.to_excel() diff --git a/app/resources/data/ffmpeg.exe b/exporter/ffmpeg.exe similarity index 100% rename from app/resources/data/ffmpeg.exe rename to exporter/ffmpeg.exe diff --git a/exporter/resources/default_avatar.png b/exporter/resources/default_avatar.png new file mode 100644 index 0000000..d69c77d Binary files /dev/null and b/exporter/resources/default_avatar.png differ diff --git a/exporter/resources/emoji/666.png b/exporter/resources/emoji/666.png new file mode 100644 index 0000000..ff6aa92 Binary files /dev/null and b/exporter/resources/emoji/666.png differ diff --git a/exporter/resources/emoji/Emm.png b/exporter/resources/emoji/Emm.png new file mode 100644 index 0000000..94f777d Binary files /dev/null and b/exporter/resources/emoji/Emm.png differ diff --git a/exporter/resources/emoji/OK.png b/exporter/resources/emoji/OK.png new file mode 100644 index 0000000..2a6e18e Binary files /dev/null and b/exporter/resources/emoji/OK.png differ diff --git a/exporter/resources/emoji/Whimper.png b/exporter/resources/emoji/Whimper.png new file mode 100644 index 0000000..742ac56 Binary files /dev/null and b/exporter/resources/emoji/Whimper.png differ diff --git a/exporter/resources/emoji/亲亲.png b/exporter/resources/emoji/亲亲.png new file mode 100644 index 0000000..2896ca1 Binary files /dev/null and b/exporter/resources/emoji/亲亲.png differ diff --git a/exporter/resources/emoji/便便.png b/exporter/resources/emoji/便便.png new file mode 100644 index 0000000..07126f8 Binary files /dev/null and b/exporter/resources/emoji/便便.png differ diff --git a/exporter/resources/emoji/偷笑.png b/exporter/resources/emoji/偷笑.png new file mode 100644 index 0000000..6c26f9b Binary files /dev/null and b/exporter/resources/emoji/偷笑.png differ diff --git a/exporter/resources/emoji/傲慢.png b/exporter/resources/emoji/傲慢.png new file mode 100644 index 0000000..9d56e08 Binary files /dev/null and b/exporter/resources/emoji/傲慢.png differ diff --git a/exporter/resources/emoji/再见.png b/exporter/resources/emoji/再见.png new file mode 100644 index 0000000..5f45eb5 Binary files /dev/null and b/exporter/resources/emoji/再见.png differ diff --git a/exporter/resources/emoji/凋谢.png b/exporter/resources/emoji/凋谢.png new file mode 100644 index 0000000..6b618a3 Binary files /dev/null and b/exporter/resources/emoji/凋谢.png differ diff --git a/exporter/resources/emoji/加油.png b/exporter/resources/emoji/加油.png new file mode 100644 index 0000000..4141148 Binary files /dev/null and b/exporter/resources/emoji/加油.png differ diff --git a/exporter/resources/emoji/加油加油.png b/exporter/resources/emoji/加油加油.png new file mode 100644 index 0000000..4a2976e Binary files /dev/null and b/exporter/resources/emoji/加油加油.png differ diff --git a/exporter/resources/emoji/勾引.png b/exporter/resources/emoji/勾引.png new file mode 100644 index 0000000..3e5137f Binary files /dev/null and b/exporter/resources/emoji/勾引.png differ diff --git a/exporter/resources/emoji/发呆.png b/exporter/resources/emoji/发呆.png new file mode 100644 index 0000000..7d52967 Binary files /dev/null and b/exporter/resources/emoji/发呆.png differ diff --git a/exporter/resources/emoji/发怒.png b/exporter/resources/emoji/发怒.png new file mode 100644 index 0000000..c7a208e Binary files /dev/null and b/exporter/resources/emoji/发怒.png differ diff --git a/exporter/resources/emoji/发抖.png b/exporter/resources/emoji/发抖.png new file mode 100644 index 0000000..41596e8 Binary files /dev/null and b/exporter/resources/emoji/发抖.png differ diff --git a/exporter/resources/emoji/可怜.png b/exporter/resources/emoji/可怜.png new file mode 100644 index 0000000..742ac56 Binary files /dev/null and b/exporter/resources/emoji/可怜.png differ diff --git a/exporter/resources/emoji/右哼哼.png b/exporter/resources/emoji/右哼哼.png new file mode 100644 index 0000000..49fa38c Binary files /dev/null and b/exporter/resources/emoji/右哼哼.png differ diff --git a/exporter/resources/emoji/叹气.png b/exporter/resources/emoji/叹气.png new file mode 100644 index 0000000..63c6a02 Binary files /dev/null and b/exporter/resources/emoji/叹气.png differ diff --git a/exporter/resources/emoji/吃瓜.png b/exporter/resources/emoji/吃瓜.png new file mode 100644 index 0000000..bd99b78 Binary files /dev/null and b/exporter/resources/emoji/吃瓜.png differ diff --git a/exporter/resources/emoji/合十.png b/exporter/resources/emoji/合十.png new file mode 100644 index 0000000..f92a569 Binary files /dev/null and b/exporter/resources/emoji/合十.png differ diff --git a/exporter/resources/emoji/吐.png b/exporter/resources/emoji/吐.png new file mode 100644 index 0000000..7a33ba0 Binary files /dev/null and b/exporter/resources/emoji/吐.png differ diff --git a/exporter/resources/emoji/吐舌.png b/exporter/resources/emoji/吐舌.png new file mode 100644 index 0000000..fb551ff Binary files /dev/null and b/exporter/resources/emoji/吐舌.png differ diff --git a/exporter/resources/emoji/呲牙.png b/exporter/resources/emoji/呲牙.png new file mode 100644 index 0000000..d615596 Binary files /dev/null and b/exporter/resources/emoji/呲牙.png differ diff --git a/exporter/resources/emoji/咒骂.png b/exporter/resources/emoji/咒骂.png new file mode 100644 index 0000000..549de88 Binary files /dev/null and b/exporter/resources/emoji/咒骂.png differ diff --git a/exporter/resources/emoji/咖啡.png b/exporter/resources/emoji/咖啡.png new file mode 100644 index 0000000..27f3ee8 Binary files /dev/null and b/exporter/resources/emoji/咖啡.png differ diff --git a/exporter/resources/emoji/哇.png b/exporter/resources/emoji/哇.png new file mode 100644 index 0000000..8b35491 Binary files /dev/null and b/exporter/resources/emoji/哇.png differ diff --git a/exporter/resources/emoji/啤酒.png b/exporter/resources/emoji/啤酒.png new file mode 100644 index 0000000..3d28da1 Binary files /dev/null and b/exporter/resources/emoji/啤酒.png differ diff --git a/exporter/resources/emoji/嘘.png b/exporter/resources/emoji/嘘.png new file mode 100644 index 0000000..18793fe Binary files /dev/null and b/exporter/resources/emoji/嘘.png differ diff --git a/exporter/resources/emoji/嘴唇.png b/exporter/resources/emoji/嘴唇.png new file mode 100644 index 0000000..77c8dff Binary files /dev/null and b/exporter/resources/emoji/嘴唇.png differ diff --git a/exporter/resources/emoji/嘿哈.png b/exporter/resources/emoji/嘿哈.png new file mode 100644 index 0000000..912dbe1 Binary files /dev/null and b/exporter/resources/emoji/嘿哈.png differ diff --git a/exporter/resources/emoji/囧.png b/exporter/resources/emoji/囧.png new file mode 100644 index 0000000..465da48 Binary files /dev/null and b/exporter/resources/emoji/囧.png differ diff --git a/exporter/resources/emoji/困.png b/exporter/resources/emoji/困.png new file mode 100644 index 0000000..6525e88 Binary files /dev/null and b/exporter/resources/emoji/困.png differ diff --git a/exporter/resources/emoji/坏笑.png b/exporter/resources/emoji/坏笑.png new file mode 100644 index 0000000..bb0d5bf Binary files /dev/null and b/exporter/resources/emoji/坏笑.png differ diff --git a/exporter/resources/emoji/大哭.png b/exporter/resources/emoji/大哭.png new file mode 100644 index 0000000..c0a63c1 Binary files /dev/null and b/exporter/resources/emoji/大哭.png differ diff --git a/exporter/resources/emoji/天啊.png b/exporter/resources/emoji/天啊.png new file mode 100644 index 0000000..95aefcd Binary files /dev/null and b/exporter/resources/emoji/天啊.png differ diff --git a/exporter/resources/emoji/太阳.png b/exporter/resources/emoji/太阳.png new file mode 100644 index 0000000..3f9226f Binary files /dev/null and b/exporter/resources/emoji/太阳.png differ diff --git a/exporter/resources/emoji/失望.png b/exporter/resources/emoji/失望.png new file mode 100644 index 0000000..28f031e Binary files /dev/null and b/exporter/resources/emoji/失望.png differ diff --git a/exporter/resources/emoji/奸笑.png b/exporter/resources/emoji/奸笑.png new file mode 100644 index 0000000..914890b Binary files /dev/null and b/exporter/resources/emoji/奸笑.png differ diff --git a/exporter/resources/emoji/好的.png b/exporter/resources/emoji/好的.png new file mode 100644 index 0000000..989ac10 Binary files /dev/null and b/exporter/resources/emoji/好的.png differ diff --git a/exporter/resources/emoji/委屈.png b/exporter/resources/emoji/委屈.png new file mode 100644 index 0000000..f04d409 Binary files /dev/null and b/exporter/resources/emoji/委屈.png differ diff --git a/exporter/resources/emoji/害羞.png b/exporter/resources/emoji/害羞.png new file mode 100644 index 0000000..88c8717 Binary files /dev/null and b/exporter/resources/emoji/害羞.png differ diff --git a/exporter/resources/emoji/尴尬.png b/exporter/resources/emoji/尴尬.png new file mode 100644 index 0000000..a01e450 Binary files /dev/null and b/exporter/resources/emoji/尴尬.png differ diff --git a/exporter/resources/emoji/庆祝.png b/exporter/resources/emoji/庆祝.png new file mode 100644 index 0000000..cfdf014 Binary files /dev/null and b/exporter/resources/emoji/庆祝.png differ diff --git a/exporter/resources/emoji/弱.png b/exporter/resources/emoji/弱.png new file mode 100644 index 0000000..306505c Binary files /dev/null and b/exporter/resources/emoji/弱.png differ diff --git a/exporter/resources/emoji/强.png b/exporter/resources/emoji/强.png new file mode 100644 index 0000000..3e88fa8 Binary files /dev/null and b/exporter/resources/emoji/强.png differ diff --git a/exporter/resources/emoji/得意.png b/exporter/resources/emoji/得意.png new file mode 100644 index 0000000..5de282b Binary files /dev/null and b/exporter/resources/emoji/得意.png differ diff --git a/exporter/resources/emoji/微笑.png b/exporter/resources/emoji/微笑.png new file mode 100644 index 0000000..ab81877 Binary files /dev/null and b/exporter/resources/emoji/微笑.png differ diff --git a/exporter/resources/emoji/心碎.png b/exporter/resources/emoji/心碎.png new file mode 100644 index 0000000..629224a Binary files /dev/null and b/exporter/resources/emoji/心碎.png differ diff --git a/exporter/resources/emoji/快哭了.png b/exporter/resources/emoji/快哭了.png new file mode 100644 index 0000000..ce59b72 Binary files /dev/null and b/exporter/resources/emoji/快哭了.png differ diff --git a/exporter/resources/emoji/恐惧.png b/exporter/resources/emoji/恐惧.png new file mode 100644 index 0000000..976b705 Binary files /dev/null and b/exporter/resources/emoji/恐惧.png differ diff --git a/exporter/resources/emoji/悠闲.png b/exporter/resources/emoji/悠闲.png new file mode 100644 index 0000000..1dd32cf Binary files /dev/null and b/exporter/resources/emoji/悠闲.png differ diff --git a/exporter/resources/emoji/惊恐.png b/exporter/resources/emoji/惊恐.png new file mode 100644 index 0000000..59ffdc0 Binary files /dev/null and b/exporter/resources/emoji/惊恐.png differ diff --git a/exporter/resources/emoji/惊讶.png b/exporter/resources/emoji/惊讶.png new file mode 100644 index 0000000..adc6d1d Binary files /dev/null and b/exporter/resources/emoji/惊讶.png differ diff --git a/exporter/resources/emoji/愉快.png b/exporter/resources/emoji/愉快.png new file mode 100644 index 0000000..f65c5e8 Binary files /dev/null and b/exporter/resources/emoji/愉快.png differ diff --git a/exporter/resources/emoji/憨笑.png b/exporter/resources/emoji/憨笑.png new file mode 100644 index 0000000..1881de3 Binary files /dev/null and b/exporter/resources/emoji/憨笑.png differ diff --git a/exporter/resources/emoji/打脸.png b/exporter/resources/emoji/打脸.png new file mode 100644 index 0000000..e2cf5e5 Binary files /dev/null and b/exporter/resources/emoji/打脸.png differ diff --git a/exporter/resources/emoji/抓狂.png b/exporter/resources/emoji/抓狂.png new file mode 100644 index 0000000..71d8df8 Binary files /dev/null and b/exporter/resources/emoji/抓狂.png differ diff --git a/exporter/resources/emoji/抠鼻.png b/exporter/resources/emoji/抠鼻.png new file mode 100644 index 0000000..4f3ab6d Binary files /dev/null and b/exporter/resources/emoji/抠鼻.png differ diff --git a/exporter/resources/emoji/抱拳.png b/exporter/resources/emoji/抱拳.png new file mode 100644 index 0000000..eb943e6 Binary files /dev/null and b/exporter/resources/emoji/抱拳.png differ diff --git a/exporter/resources/emoji/拥抱.png b/exporter/resources/emoji/拥抱.png new file mode 100644 index 0000000..9cd2f50 Binary files /dev/null and b/exporter/resources/emoji/拥抱.png differ diff --git a/exporter/resources/emoji/拳头.png b/exporter/resources/emoji/拳头.png new file mode 100644 index 0000000..4d40db2 Binary files /dev/null and b/exporter/resources/emoji/拳头.png differ diff --git a/exporter/resources/emoji/捂脸.png b/exporter/resources/emoji/捂脸.png new file mode 100644 index 0000000..c20cab8 Binary files /dev/null and b/exporter/resources/emoji/捂脸.png differ diff --git a/exporter/resources/emoji/握手.png b/exporter/resources/emoji/握手.png new file mode 100644 index 0000000..b625691 Binary files /dev/null and b/exporter/resources/emoji/握手.png differ diff --git a/exporter/resources/emoji/撇嘴.png b/exporter/resources/emoji/撇嘴.png new file mode 100644 index 0000000..623e454 Binary files /dev/null and b/exporter/resources/emoji/撇嘴.png differ diff --git a/exporter/resources/emoji/擦汗.png b/exporter/resources/emoji/擦汗.png new file mode 100644 index 0000000..2b12443 Binary files /dev/null and b/exporter/resources/emoji/擦汗.png differ diff --git a/exporter/resources/emoji/敲打.png b/exporter/resources/emoji/敲打.png new file mode 100644 index 0000000..9d2fdaa Binary files /dev/null and b/exporter/resources/emoji/敲打.png differ diff --git a/exporter/resources/emoji/无语.png b/exporter/resources/emoji/无语.png new file mode 100644 index 0000000..9bf0b26 Binary files /dev/null and b/exporter/resources/emoji/无语.png differ diff --git a/exporter/resources/emoji/旺柴.png b/exporter/resources/emoji/旺柴.png new file mode 100644 index 0000000..796419e Binary files /dev/null and b/exporter/resources/emoji/旺柴.png differ diff --git a/exporter/resources/emoji/晕.png b/exporter/resources/emoji/晕.png new file mode 100644 index 0000000..423ebfc Binary files /dev/null and b/exporter/resources/emoji/晕.png differ diff --git a/exporter/resources/emoji/月亮.png b/exporter/resources/emoji/月亮.png new file mode 100644 index 0000000..d1197e7 Binary files /dev/null and b/exporter/resources/emoji/月亮.png differ diff --git a/exporter/resources/emoji/机智.png b/exporter/resources/emoji/机智.png new file mode 100644 index 0000000..e802d4d Binary files /dev/null and b/exporter/resources/emoji/机智.png differ diff --git a/exporter/resources/emoji/汗.png b/exporter/resources/emoji/汗.png new file mode 100644 index 0000000..aa8e7e3 Binary files /dev/null and b/exporter/resources/emoji/汗.png differ diff --git a/exporter/resources/emoji/流泪.png b/exporter/resources/emoji/流泪.png new file mode 100644 index 0000000..236c98f Binary files /dev/null and b/exporter/resources/emoji/流泪.png differ diff --git a/exporter/resources/emoji/炸弹.png b/exporter/resources/emoji/炸弹.png new file mode 100644 index 0000000..cda16f8 Binary files /dev/null and b/exporter/resources/emoji/炸弹.png differ diff --git a/exporter/resources/emoji/烟花.png b/exporter/resources/emoji/烟花.png new file mode 100644 index 0000000..330aca8 Binary files /dev/null and b/exporter/resources/emoji/烟花.png differ diff --git a/exporter/resources/emoji/爆竹.png b/exporter/resources/emoji/爆竹.png new file mode 100644 index 0000000..f1a6a0b Binary files /dev/null and b/exporter/resources/emoji/爆竹.png differ diff --git a/exporter/resources/emoji/爱心.png b/exporter/resources/emoji/爱心.png new file mode 100644 index 0000000..6a9403d Binary files /dev/null and b/exporter/resources/emoji/爱心.png differ diff --git a/exporter/resources/emoji/猪头.png b/exporter/resources/emoji/猪头.png new file mode 100644 index 0000000..f44055c Binary files /dev/null and b/exporter/resources/emoji/猪头.png differ diff --git a/exporter/resources/emoji/玫瑰.png b/exporter/resources/emoji/玫瑰.png new file mode 100644 index 0000000..21638e2 Binary files /dev/null and b/exporter/resources/emoji/玫瑰.png differ diff --git a/exporter/resources/emoji/生病.png b/exporter/resources/emoji/生病.png new file mode 100644 index 0000000..6bca2f0 Binary files /dev/null and b/exporter/resources/emoji/生病.png differ diff --git a/exporter/resources/emoji/疑问.png b/exporter/resources/emoji/疑问.png new file mode 100644 index 0000000..aea4507 Binary files /dev/null and b/exporter/resources/emoji/疑问.png differ diff --git a/exporter/resources/emoji/發.png b/exporter/resources/emoji/發.png new file mode 100644 index 0000000..56c8806 Binary files /dev/null and b/exporter/resources/emoji/發.png differ diff --git a/exporter/resources/emoji/白眼.png b/exporter/resources/emoji/白眼.png new file mode 100644 index 0000000..f2cc5d8 Binary files /dev/null and b/exporter/resources/emoji/白眼.png differ diff --git a/exporter/resources/emoji/皱眉.png b/exporter/resources/emoji/皱眉.png new file mode 100644 index 0000000..e4e0ee1 Binary files /dev/null and b/exporter/resources/emoji/皱眉.png differ diff --git a/exporter/resources/emoji/睡.png b/exporter/resources/emoji/睡.png new file mode 100644 index 0000000..2506f2e Binary files /dev/null and b/exporter/resources/emoji/睡.png differ diff --git a/exporter/resources/emoji/破涕为笑.png b/exporter/resources/emoji/破涕为笑.png new file mode 100644 index 0000000..69b9a49 Binary files /dev/null and b/exporter/resources/emoji/破涕为笑.png differ diff --git a/exporter/resources/emoji/礼物.png b/exporter/resources/emoji/礼物.png new file mode 100644 index 0000000..2eb828c Binary files /dev/null and b/exporter/resources/emoji/礼物.png differ diff --git a/exporter/resources/emoji/社会社会.png b/exporter/resources/emoji/社会社会.png new file mode 100644 index 0000000..0770fa5 Binary files /dev/null and b/exporter/resources/emoji/社会社会.png differ diff --git a/exporter/resources/emoji/福.png b/exporter/resources/emoji/福.png new file mode 100644 index 0000000..9c9158b Binary files /dev/null and b/exporter/resources/emoji/福.png differ diff --git a/exporter/resources/emoji/笑脸.png b/exporter/resources/emoji/笑脸.png new file mode 100644 index 0000000..0c2200d Binary files /dev/null and b/exporter/resources/emoji/笑脸.png differ diff --git a/exporter/resources/emoji/红包.png b/exporter/resources/emoji/红包.png new file mode 100644 index 0000000..862fb6b Binary files /dev/null and b/exporter/resources/emoji/红包.png differ diff --git a/exporter/resources/emoji/翻白眼.png b/exporter/resources/emoji/翻白眼.png new file mode 100644 index 0000000..81ad985 Binary files /dev/null and b/exporter/resources/emoji/翻白眼.png differ diff --git a/exporter/resources/emoji/耶.png b/exporter/resources/emoji/耶.png new file mode 100644 index 0000000..ccb1b82 Binary files /dev/null and b/exporter/resources/emoji/耶.png differ diff --git a/exporter/resources/emoji/胜利.png b/exporter/resources/emoji/胜利.png new file mode 100644 index 0000000..8662127 Binary files /dev/null and b/exporter/resources/emoji/胜利.png differ diff --git a/exporter/resources/emoji/脸红.png b/exporter/resources/emoji/脸红.png new file mode 100644 index 0000000..164ae21 Binary files /dev/null and b/exporter/resources/emoji/脸红.png differ diff --git a/exporter/resources/emoji/色.png b/exporter/resources/emoji/色.png new file mode 100644 index 0000000..5e89b41 Binary files /dev/null and b/exporter/resources/emoji/色.png differ diff --git a/exporter/resources/emoji/苦涩.png b/exporter/resources/emoji/苦涩.png new file mode 100644 index 0000000..7b2314d Binary files /dev/null and b/exporter/resources/emoji/苦涩.png differ diff --git a/exporter/resources/emoji/菜刀.png b/exporter/resources/emoji/菜刀.png new file mode 100644 index 0000000..37714d9 Binary files /dev/null and b/exporter/resources/emoji/菜刀.png differ diff --git a/exporter/resources/emoji/蛋糕.png b/exporter/resources/emoji/蛋糕.png new file mode 100644 index 0000000..4ecd31b Binary files /dev/null and b/exporter/resources/emoji/蛋糕.png differ diff --git a/exporter/resources/emoji/衰.png b/exporter/resources/emoji/衰.png new file mode 100644 index 0000000..49ff6a8 Binary files /dev/null and b/exporter/resources/emoji/衰.png differ diff --git a/exporter/resources/emoji/裂开.png b/exporter/resources/emoji/裂开.png new file mode 100644 index 0000000..16d0001 Binary files /dev/null and b/exporter/resources/emoji/裂开.png differ diff --git a/exporter/resources/emoji/让我看看.png b/exporter/resources/emoji/让我看看.png new file mode 100644 index 0000000..0ccee49 Binary files /dev/null and b/exporter/resources/emoji/让我看看.png differ diff --git a/exporter/resources/emoji/调皮.png b/exporter/resources/emoji/调皮.png new file mode 100644 index 0000000..72e3f1c Binary files /dev/null and b/exporter/resources/emoji/调皮.png differ diff --git a/exporter/resources/emoji/跳跳.png b/exporter/resources/emoji/跳跳.png new file mode 100644 index 0000000..e211b8c Binary files /dev/null and b/exporter/resources/emoji/跳跳.png differ diff --git a/exporter/resources/emoji/转圈.png b/exporter/resources/emoji/转圈.png new file mode 100644 index 0000000..f81e84f Binary files /dev/null and b/exporter/resources/emoji/转圈.png differ diff --git a/exporter/resources/emoji/鄙视.png b/exporter/resources/emoji/鄙视.png new file mode 100644 index 0000000..bf22463 Binary files /dev/null and b/exporter/resources/emoji/鄙视.png differ diff --git a/exporter/resources/emoji/闭嘴.png b/exporter/resources/emoji/闭嘴.png new file mode 100644 index 0000000..b568ecc Binary files /dev/null and b/exporter/resources/emoji/闭嘴.png differ diff --git a/exporter/resources/emoji/阴脸.png b/exporter/resources/emoji/阴脸.png new file mode 100644 index 0000000..f49563a Binary files /dev/null and b/exporter/resources/emoji/阴脸.png differ diff --git a/exporter/resources/emoji/阴险.png b/exporter/resources/emoji/阴险.png new file mode 100644 index 0000000..1995dbf Binary files /dev/null and b/exporter/resources/emoji/阴险.png differ diff --git a/exporter/resources/emoji/难过.png b/exporter/resources/emoji/难过.png new file mode 100644 index 0000000..927c134 Binary files /dev/null and b/exporter/resources/emoji/难过.png differ diff --git a/exporter/resources/emoji/難受.png b/exporter/resources/emoji/難受.png new file mode 100644 index 0000000..7b2314d Binary files /dev/null and b/exporter/resources/emoji/難受.png differ diff --git a/exporter/resources/emoji/骷髅.png b/exporter/resources/emoji/骷髅.png new file mode 100644 index 0000000..7542615 Binary files /dev/null and b/exporter/resources/emoji/骷髅.png differ diff --git a/exporter/resources/emoji/鼓掌.png b/exporter/resources/emoji/鼓掌.png new file mode 100644 index 0000000..4039892 Binary files /dev/null and b/exporter/resources/emoji/鼓掌.png differ diff --git a/exporter/resources/ffmpeg.exe b/exporter/resources/ffmpeg.exe new file mode 100644 index 0000000..e576a7c Binary files /dev/null and b/exporter/resources/ffmpeg.exe differ diff --git a/exporter/resources/template.html b/exporter/resources/template.html new file mode 100644 index 0000000..4964241 --- /dev/null +++ b/exporter/resources/template.html @@ -0,0 +1,5440 @@ +<!DOCTYPE html> +<html lang="zh-CN"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="referrer" content="no-referrer" /> + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css"> + <style> + .flatpickr-calendar { + background: transparent; + opacity: 0; + display: none; + text-align: center; + visibility: hidden; + padding: 0; + -webkit-animation: none; + animation: none; + direction: ltr; + border: 0; + font-size: 14px; + line-height: 24px; + border-radius: 5px; + position: absolute; + width: 307.875px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -ms-touch-action: manipulation; + touch-action: manipulation; + background: #fff; + -webkit-box-shadow: 1px 0 0 #e6e6e6, -1px 0 0 #e6e6e6, 0 1px 0 #e6e6e6, 0 -1px 0 #e6e6e6, 0 3px 13px rgba(0, 0, 0, 0.08); + box-shadow: 1px 0 0 #e6e6e6, -1px 0 0 #e6e6e6, 0 1px 0 #e6e6e6, 0 -1px 0 #e6e6e6, 0 3px 13px rgba(0, 0, 0, 0.08) + } + + .flatpickr-calendar.open, + .flatpickr-calendar.inline { + opacity: 1; + max-height: 640px; + visibility: visible + } + + .flatpickr-calendar.open { + display: inline-block; + z-index: 99999 + } + + .flatpickr-calendar.animate.open { + -webkit-animation: fpFadeInDown 300ms cubic-bezier(.23, 1, .32, 1); + animation: fpFadeInDown 300ms cubic-bezier(.23, 1, .32, 1) + } + + .flatpickr-calendar.inline { + display: block; + position: relative; + top: 2px + } + + .flatpickr-calendar.static { + position: absolute; + top: calc(100% + 2px) + } + + .flatpickr-calendar.static.open { + z-index: 999; + display: block + } + + .flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7) { + -webkit-box-shadow: none !important; + box-shadow: none !important + } + + .flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1) { + -webkit-box-shadow: -2px 0 0 #e6e6e6, 5px 0 0 #e6e6e6; + box-shadow: -2px 0 0 #e6e6e6, 5px 0 0 #e6e6e6 + } + + .flatpickr-calendar .hasWeeks .dayContainer, + .flatpickr-calendar .hasTime .dayContainer { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 + } + + .flatpickr-calendar .hasWeeks .dayContainer { + border-left: 0 + } + + .flatpickr-calendar.hasTime .flatpickr-time { + height: 40px; + border-top: 1px solid #e6e6e6 + } + + .flatpickr-calendar.noCalendar.hasTime .flatpickr-time { + height: auto + } + + .flatpickr-calendar:before, + .flatpickr-calendar:after { + position: absolute; + display: block; + pointer-events: none; + border: solid transparent; + content: ''; + height: 0; + width: 0; + left: 22px + } + + .flatpickr-calendar.rightMost:before, + .flatpickr-calendar.arrowRight:before, + .flatpickr-calendar.rightMost:after, + .flatpickr-calendar.arrowRight:after { + left: auto; + right: 22px + } + + .flatpickr-calendar.arrowCenter:before, + .flatpickr-calendar.arrowCenter:after { + left: 50%; + right: 50% + } + + .flatpickr-calendar:before { + border-width: 5px; + margin: 0 -5px + } + + .flatpickr-calendar:after { + border-width: 4px; + margin: 0 -4px + } + + .flatpickr-calendar.arrowTop:before, + .flatpickr-calendar.arrowTop:after { + bottom: 100% + } + + .flatpickr-calendar.arrowTop:before { + border-bottom-color: #e6e6e6 + } + + .flatpickr-calendar.arrowTop:after { + border-bottom-color: #fff + } + + .flatpickr-calendar.arrowBottom:before, + .flatpickr-calendar.arrowBottom:after { + top: 100% + } + + .flatpickr-calendar.arrowBottom:before { + border-top-color: #e6e6e6 + } + + .flatpickr-calendar.arrowBottom:after { + border-top-color: #fff + } + + .flatpickr-calendar:focus { + outline: 0 + } + + .flatpickr-wrapper { + position: relative; + display: inline-block + } + + .flatpickr-months { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex + } + + .flatpickr-months .flatpickr-month { + background: transparent; + color: rgba(0, 0, 0, 0.9); + fill: rgba(0, 0, 0, 0.9); + height: 34px; + line-height: 1; + text-align: center; + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + overflow: hidden; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1 + } + + .flatpickr-months .flatpickr-prev-month, + .flatpickr-months .flatpickr-next-month { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-decoration: none; + cursor: pointer; + position: absolute; + top: 0; + height: 34px; + padding: 10px; + z-index: 3; + color: rgba(0, 0, 0, 0.9); + fill: rgba(0, 0, 0, 0.9) + } + + .flatpickr-months .flatpickr-prev-month.flatpickr-disabled, + .flatpickr-months .flatpickr-next-month.flatpickr-disabled { + display: none + } + + .flatpickr-months .flatpickr-prev-month i, + .flatpickr-months .flatpickr-next-month i { + position: relative + } + + .flatpickr-months .flatpickr-prev-month.flatpickr-prev-month, + .flatpickr-months .flatpickr-next-month.flatpickr-prev-month { + /* + /*rtl:begin:ignore*/ + left: 0 + /* + /*rtl:end:ignore*/ + } + + /* + /*rtl:begin:ignore*/ + /* + /*rtl:end:ignore*/ + .flatpickr-months .flatpickr-prev-month.flatpickr-next-month, + .flatpickr-months .flatpickr-next-month.flatpickr-next-month { + /* + /*rtl:begin:ignore*/ + right: 0 + /* + /*rtl:end:ignore*/ + } + + /* + /*rtl:begin:ignore*/ + /* + /*rtl:end:ignore*/ + .flatpickr-months .flatpickr-prev-month:hover, + .flatpickr-months .flatpickr-next-month:hover { + color: #959ea9 + } + + .flatpickr-months .flatpickr-prev-month:hover svg, + .flatpickr-months .flatpickr-next-month:hover svg { + fill: #f64747 + } + + .flatpickr-months .flatpickr-prev-month svg, + .flatpickr-months .flatpickr-next-month svg { + width: 14px; + height: 14px + } + + .flatpickr-months .flatpickr-prev-month svg path, + .flatpickr-months .flatpickr-next-month svg path { + -webkit-transition: fill .1s; + transition: fill .1s; + fill: inherit + } + + .numInputWrapper { + position: relative; + height: auto + } + + .numInputWrapper input, + .numInputWrapper span { + display: inline-block + } + + .numInputWrapper input { + width: 100% + } + + .numInputWrapper input::-ms-clear { + display: none + } + + .numInputWrapper input::-webkit-outer-spin-button, + .numInputWrapper input::-webkit-inner-spin-button { + margin: 0; + -webkit-appearance: none + } + + .numInputWrapper span { + position: absolute; + right: 0; + width: 14px; + padding: 0 4px 0 2px; + height: 50%; + line-height: 50%; + opacity: 0; + cursor: pointer; + border: 1px solid rgba(57, 57, 57, 0.15); + -webkit-box-sizing: border-box; + box-sizing: border-box + } + + .numInputWrapper span:hover { + background: rgba(0, 0, 0, 0.1) + } + + .numInputWrapper span:active { + background: rgba(0, 0, 0, 0.2) + } + + .numInputWrapper span:after { + display: block; + content: ""; + position: absolute + } + + .numInputWrapper span.arrowUp { + top: 0; + border-bottom: 0 + } + + .numInputWrapper span.arrowUp:after { + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-bottom: 4px solid rgba(57, 57, 57, 0.6); + top: 26% + } + + .numInputWrapper span.arrowDown { + top: 50% + } + + .numInputWrapper span.arrowDown:after { + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid rgba(57, 57, 57, 0.6); + top: 40% + } + + .numInputWrapper span svg { + width: inherit; + height: auto + } + + .numInputWrapper span svg path { + fill: rgba(0, 0, 0, 0.5) + } + + .numInputWrapper:hover { + background: rgba(0, 0, 0, 0.05) + } + + .numInputWrapper:hover span { + opacity: 1 + } + + .flatpickr-current-month { + font-size: 135%; + line-height: inherit; + font-weight: 300; + color: inherit; + position: absolute; + width: 75%; + left: 12.5%; + padding: 7.48px 0 0 0; + line-height: 1; + height: 34px; + display: inline-block; + text-align: center; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + + .flatpickr-current-month span.cur-month { + font-family: inherit; + font-weight: 700; + color: inherit; + display: inline-block; + margin-left: .5ch; + padding: 0 + } + + .flatpickr-current-month span.cur-month:hover { + background: rgba(0, 0, 0, 0.05) + } + + .flatpickr-current-month .numInputWrapper { + width: 6ch; + width: 7ch\0; + display: inline-block + } + + .flatpickr-current-month .numInputWrapper span.arrowUp:after { + border-bottom-color: rgba(0, 0, 0, 0.9) + } + + .flatpickr-current-month .numInputWrapper span.arrowDown:after { + border-top-color: rgba(0, 0, 0, 0.9) + } + + .flatpickr-current-month input.cur-year { + background: transparent; + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: inherit; + cursor: text; + padding: 0 0 0 .5ch; + margin: 0; + display: inline-block; + font-size: inherit; + font-family: inherit; + font-weight: 300; + line-height: inherit; + height: auto; + border: 0; + border-radius: 0; + vertical-align: initial; + -webkit-appearance: textfield; + -moz-appearance: textfield; + appearance: textfield + } + + .flatpickr-current-month input.cur-year:focus { + outline: 0 + } + + .flatpickr-current-month input.cur-year[disabled], + .flatpickr-current-month input.cur-year[disabled]:hover { + font-size: 100%; + color: rgba(0, 0, 0, 0.5); + background: transparent; + pointer-events: none + } + + .flatpickr-current-month .flatpickr-monthDropdown-months { + appearance: menulist; + background: transparent; + border: none; + border-radius: 0; + box-sizing: border-box; + color: inherit; + cursor: pointer; + font-size: inherit; + font-family: inherit; + font-weight: 300; + height: auto; + line-height: inherit; + margin: -1px 0 0 0; + outline: none; + padding: 0 0 0 .5ch; + position: relative; + vertical-align: initial; + -webkit-box-sizing: border-box; + -webkit-appearance: menulist; + -moz-appearance: menulist; + width: auto + } + + .flatpickr-current-month .flatpickr-monthDropdown-months:focus, + .flatpickr-current-month .flatpickr-monthDropdown-months:active { + outline: none + } + + .flatpickr-current-month .flatpickr-monthDropdown-months:hover { + background: rgba(0, 0, 0, 0.05) + } + + .flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month { + background-color: transparent; + outline: none; + padding: 0 + } + + .flatpickr-weekdays { + background: transparent; + text-align: center; + overflow: hidden; + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + height: 28px + } + + .flatpickr-weekdays .flatpickr-weekdaycontainer { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1 + } + + span.flatpickr-weekday { + cursor: default; + font-size: 90%; + background: transparent; + color: rgba(0, 0, 0, 0.54); + line-height: 1; + margin: 0; + text-align: center; + display: block; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + font-weight: bolder + } + + .dayContainer, + .flatpickr-weeks { + padding: 1px 0 0 0 + } + + .flatpickr-days { + position: relative; + overflow: hidden; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: start; + -webkit-align-items: flex-start; + -ms-flex-align: start; + align-items: flex-start; + width: 307.875px + } + + .flatpickr-days:focus { + outline: 0 + } + + .dayContainer { + padding: 0; + outline: 0; + text-align: left; + width: 307.875px; + min-width: 307.875px; + max-width: 307.875px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: inline-block; + display: -ms-flexbox; + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-wrap: wrap; + -ms-flex-pack: justify; + -webkit-justify-content: space-around; + justify-content: space-around; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + opacity: 1 + } + + .dayContainer+.dayContainer { + -webkit-box-shadow: -1px 0 0 #e6e6e6; + box-shadow: -1px 0 0 #e6e6e6 + } + + .flatpickr-day { + background: none; + border: 1px solid transparent; + border-radius: 150px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + color: #393939; + cursor: pointer; + font-weight: 400; + width: 14.2857143%; + -webkit-flex-basis: 14.2857143%; + -ms-flex-preferred-size: 14.2857143%; + flex-basis: 14.2857143%; + max-width: 39px; + height: 39px; + line-height: 39px; + margin: 0; + display: inline-block; + position: relative; + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; + text-align: center + } + + .flatpickr-day.inRange, + .flatpickr-day.prevMonthDay.inRange, + .flatpickr-day.nextMonthDay.inRange, + .flatpickr-day.today.inRange, + .flatpickr-day.prevMonthDay.today.inRange, + .flatpickr-day.nextMonthDay.today.inRange, + .flatpickr-day:hover, + .flatpickr-day.prevMonthDay:hover, + .flatpickr-day.nextMonthDay:hover, + .flatpickr-day:focus, + .flatpickr-day.prevMonthDay:focus, + .flatpickr-day.nextMonthDay:focus { + cursor: pointer; + outline: 0; + background: #e6e6e6; + border-color: #e6e6e6 + } + + .flatpickr-day.today { + border-color: #959ea9 + } + + .flatpickr-day.today:hover, + .flatpickr-day.today:focus { + border-color: #959ea9; + background: #959ea9; + color: #fff + } + + .flatpickr-day.selected, + .flatpickr-day.startRange, + .flatpickr-day.endRange, + .flatpickr-day.selected.inRange, + .flatpickr-day.startRange.inRange, + .flatpickr-day.endRange.inRange, + .flatpickr-day.selected:focus, + .flatpickr-day.startRange:focus, + .flatpickr-day.endRange:focus, + .flatpickr-day.selected:hover, + .flatpickr-day.startRange:hover, + .flatpickr-day.endRange:hover, + .flatpickr-day.selected.prevMonthDay, + .flatpickr-day.startRange.prevMonthDay, + .flatpickr-day.endRange.prevMonthDay, + .flatpickr-day.selected.nextMonthDay, + .flatpickr-day.startRange.nextMonthDay, + .flatpickr-day.endRange.nextMonthDay { + background: #569ff7; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + border-color: #569ff7 + } + + .flatpickr-day.selected.startRange, + .flatpickr-day.startRange.startRange, + .flatpickr-day.endRange.startRange { + border-radius: 50px 0 0 50px + } + + .flatpickr-day.selected.endRange, + .flatpickr-day.startRange.endRange, + .flatpickr-day.endRange.endRange { + border-radius: 0 50px 50px 0 + } + + .flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)), + .flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)), + .flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)) { + -webkit-box-shadow: -10px 0 0 #569ff7; + box-shadow: -10px 0 0 #569ff7 + } + + .flatpickr-day.selected.startRange.endRange, + .flatpickr-day.startRange.startRange.endRange, + .flatpickr-day.endRange.startRange.endRange { + border-radius: 50px + } + + .flatpickr-day.inRange { + border-radius: 0; + -webkit-box-shadow: -5px 0 0 #e6e6e6, 5px 0 0 #e6e6e6; + box-shadow: -5px 0 0 #e6e6e6, 5px 0 0 #e6e6e6 + } + + .flatpickr-day.flatpickr-disabled, + .flatpickr-day.flatpickr-disabled:hover, + .flatpickr-day.prevMonthDay, + .flatpickr-day.nextMonthDay, + .flatpickr-day.notAllowed, + .flatpickr-day.notAllowed.prevMonthDay, + .flatpickr-day.notAllowed.nextMonthDay { + color: rgba(57, 57, 57, 0.3); + background: transparent; + border-color: transparent; + cursor: default + } + + .flatpickr-day.flatpickr-disabled, + .flatpickr-day.flatpickr-disabled:hover { + cursor: not-allowed; + color: rgba(57, 57, 57, 0.1) + } + + .flatpickr-day.week.selected { + border-radius: 0; + -webkit-box-shadow: -5px 0 0 #569ff7, 5px 0 0 #569ff7; + box-shadow: -5px 0 0 #569ff7, 5px 0 0 #569ff7 + } + + .flatpickr-day.hidden { + visibility: hidden + } + + .rangeMode .flatpickr-day { + margin-top: 1px + } + + .flatpickr-weekwrapper { + float: left + } + + .flatpickr-weekwrapper .flatpickr-weeks { + padding: 0 12px; + -webkit-box-shadow: 1px 0 0 #e6e6e6; + box-shadow: 1px 0 0 #e6e6e6 + } + + .flatpickr-weekwrapper .flatpickr-weekday { + float: none; + width: 100%; + line-height: 28px + } + + .flatpickr-weekwrapper span.flatpickr-day, + .flatpickr-weekwrapper span.flatpickr-day:hover { + display: block; + width: 100%; + max-width: none; + color: rgba(57, 57, 57, 0.3); + background: transparent; + cursor: default; + border: none + } + + .flatpickr-innerContainer { + display: block; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden + } + + .flatpickr-rContainer { + display: inline-block; + padding: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box + } + + .flatpickr-time { + text-align: center; + outline: 0; + display: block; + height: 0; + line-height: 40px; + max-height: 40px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex + } + + .flatpickr-time:after { + content: ""; + display: table; + clear: both + } + + .flatpickr-time .numInputWrapper { + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + width: 40%; + height: 40px; + float: left + } + + .flatpickr-time .numInputWrapper span.arrowUp:after { + border-bottom-color: #393939 + } + + .flatpickr-time .numInputWrapper span.arrowDown:after { + border-top-color: #393939 + } + + .flatpickr-time.hasSeconds .numInputWrapper { + width: 26% + } + + .flatpickr-time.time24hr .numInputWrapper { + width: 49% + } + + .flatpickr-time input { + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; + border: 0; + border-radius: 0; + text-align: center; + margin: 0; + padding: 0; + height: inherit; + line-height: inherit; + color: #393939; + font-size: 14px; + position: relative; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: textfield; + -moz-appearance: textfield; + appearance: textfield + } + + .flatpickr-time input.flatpickr-hour { + font-weight: bold + } + + .flatpickr-time input.flatpickr-minute, + .flatpickr-time input.flatpickr-second { + font-weight: 400 + } + + .flatpickr-time input:focus { + outline: 0; + border: 0 + } + + .flatpickr-time .flatpickr-time-separator, + .flatpickr-time .flatpickr-am-pm { + height: inherit; + float: left; + line-height: inherit; + color: #393939; + font-weight: bold; + width: 2%; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-align-self: center; + -ms-flex-item-align: center; + align-self: center + } + + .flatpickr-time .flatpickr-am-pm { + outline: 0; + width: 18%; + cursor: pointer; + text-align: center; + font-weight: 400 + } + + .flatpickr-time input:hover, + .flatpickr-time .flatpickr-am-pm:hover, + .flatpickr-time input:focus, + .flatpickr-time .flatpickr-am-pm:focus { + background: #eee + } + + .flatpickr-input[readonly] { + cursor: pointer + } + + @-webkit-keyframes fpFadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0) + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + } + + @keyframes fpFadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0) + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } + } + </style> + <style> + * { + padding: 0; + margin: 0; + } + + body { + margin: 0; + display: flex; + flex-direction: row; + height: 100vh; + align-items: center; + justify-content: center; + background-color: #f5f5f5 + } + + ::-webkit-scrollbar { + width: 10px + } + + ::-webkit-scrollbar-track { + border-radius: 8px + } + + ::-webkit-scrollbar-thumb { + border-radius: 10px; + background: 0 0 + } + + .page { + display: flex; + flex-direction: row; + width: 100%; + height: 100%; + max-width: 1200px; + box-shadow: 1px 1px 3px #ebebeb; + border-radius: 5px + } + + .page .side-bar { + width: 50px; + border-top-left-radius: 5px; + border-bottom-left-radius: 5px + } + + .page .mid-bar { + width: 300px; + position: relative; + --left: 60%; + --color: #0d5dff + } + + .page .main-body { + flex: 1; + display: flex; + width: 100%; + flex-direction: column; + background-color: #f5f5f5; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px + } + + .page .main-body .title-bar { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + padding-top: 3px + } + + .page .main-body .title-bar p { + margin: 5px 25px; + font-size: 18px; + max-width: 180px; + align-self: flex-start + } + + .page .main-body .container { + flex: 1; + border-top: solid 3px #f0f0f0; + border-bottom: solid 3px #f0f0f0 + } + + .page .main-body .nav-bar, + .page .main-body .nav-bar .turner-bar { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center + } + + .page .main-body .nav-bar { + height: 50px + } + + .page .main-body .nav-bar .turner-bar { + color: #2e2e2e; + font-size: 16px; + user-select: none + } + + .page .main-body .nav-bar .turner-bar .button { + display: inline-block; + background-color: #d6d6d6; + margin-left: 20px; + margin-right: 20px; + padding: 10px 15px; + border-radius: 5px; + font-size: 14px; + cursor: pointer; + transition: all .2s + } + + .page .main-body .nav-bar .turner-bar .button:hover { + background-color: #ebebeb + } + + .page .main-body .nav-bar .turner-bar p { + display: inline-block; + margin-left: 5px; + margin-right: 5px + } + + .page .main-body .nav-bar .turner-bar input { + border: 0; + resize: none; + outline: 0; + background: 0 0; + border-bottom: solid 1px #1f1f1f; + text-align: center; + font-size: 18px; + font-weight: 600; + height: 24px; + width: 50px + } + + .page .mid-bar .timeline-area, + .timeline { + position: relative; + height: 100%; + display: flex; + overflow-y: auto; + flex-direction: column + } + + .page .mid-bar .timeline-area { + flex: 1; + padding-right: 5px + } + + .timeline-wrapper { + flex: 1; + overflow-y: auto; + padding: 30% 0 + } + + .timeline { + width: 100%; + overflow: hidden + } + + .timeline-item-year { + height: 40px; + position: relative; + display: flex + } + + .timeline-item-month { + height: 25px; + display: flex + } + + .timeline::before { + content: ""; + position: absolute; + left: var(--left); + width: 1px; + height: 600px; + top: 20px; + bottom: 0; + background-image: linear-gradient(to bottom, rgba(144, 156, 173, .6) 60%, rgba(255, 255, 255, 0) 0%); + background-position: left; + background-size: 1px 5px; + background-repeat: repeat-y + } + + .timeline-dot-month, + .timeline-dot-year { + left: var(--left); + position: relative; + border-radius: 50%; + box-shadow: 0 0 0 1px #d8d8d8; + text-align: center; + top: 50%; + transform: translateY(-50%); + line-height: 40px + } + + .timeline-dot-month { + background: #fff; + width: 7px; + height: 7px; + margin-left: -3px + } + + .timeline-dot-year { + width: 10px; + height: 10px; + background: #000; + margin-left: -4.5px + } + + .timeline-item-month.current .timeline-dot-month { + width: 7px; + height: 7px; + background-color: var(--color); + box-shadow: 0 0 4px var(--color); + border: 1px solid #fff; + margin-left: -3px + } + + .timeline-item-month .timeline-right, + .timeline-item-year .timeline-right { + position: relative; + margin: 0 0 0 calc(var(--left) + 15px); + height: 40px; + line-height: 40px + } + + .timeline-item-month .timeline-right { + height: 25px; + line-height: 25px + } + + .timeline-right:hover { + color: red + } + + .no-msg-month { + color: #9e9898 + } + + .hidden-month { + display: none + } + + .container { + display: flex; + overflow: hidden; + justify-content: center + } + + .container .content { + width: calc(100% - 40px); + padding: 20px; + overflow-y: scroll; + flex: 1 + } + + .container .content:hover::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, .1) + } + + .container .content:hover::-webkit-scrollbar-thumb:hover { + background: rgba(0, 0, 0, .3) + } + + @media screen and (max-width:768px) { + .container .content { + width: calc(100% - 40px); + padding: 10px; + overflow-y: scroll; + flex: 1 + } + } + + .bubble, + .chat-refer { + max-width: 400px; + position: relative; + word-wrap: break-word; + word-break: normal + } + + .bubble { + white-space: pre-wrap; + padding: 10px 11px; + border-radius: 5px; + color: #1f1f1f; + font-size: 14px + } + + .chat-refer { + margin-top: 5px; + padding: 8px 10px; + border-radius: 3px; + color: #797979; + font-size: 12px; + background-color: #e8e8e8; + display: -webkit-box; + overflow: hidden; + text-overflow: ellipsis; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; /* 这里添加 */ + line-clamp: 2; /* 这里添加 */ + white-space: normal; /* 这里添加 */ + } + + .chat-refer-right { + margin-right: 15px + } + + .chat-refer-left { + margin-left: 15px + } + + .item-left .bubble { + margin-left: 15px; + background-color: #fff + } + + .item-left .bubble:before, + .item-right .bubble:before { + content: ""; + position: absolute; + width: 0; + height: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent + } + + .item-left .bubble:before { + left: -18px; + border-left: 10px solid transparent; + border-right: 10px solid #fff + } + + .item-right .bubble { + margin-right: 15px; + background-color: #9eea6a + } + + .item-right .bubble:before { + border-left: 10px solid #9eea6a; + border-right: 10px solid transparent; + right: -18px + } + + @media screen and (max-width: 768px) { + .bubble { + max-width: 280px; + } + + .item-right .bubble { + margin-right: 8px; + } + + .item-left .bubble { + margin-left: 8px; + } + + .item-left .bubble:before { + content: ""; + position: absolute; + width: 0; + height: 0; + border-left: 8px solid transparent; + border-top: 8px solid transparent; + border-right: 8px solid #fff; + border-bottom: 8px solid transparent; + left: -13px; + } + + .item-right .bubble:before { + content: ""; + position: absolute; + width: 0; + height: 0; + border-left: 8px solid #9eea6a; + border-top: 8px solid transparent; + border-right: 8px solid transparent; + border-bottom: 8px solid transparent; + right: -13px; + } + } + + .item { + margin-top: 15px; + display: flex; + width: 100%; + } + + .item-refer { + margin-top: 4px; + } + + .item.item-right { + justify-content: flex-end; + } + + .item.item-center { + justify-content: center; + } + + .item.item-center span { + font-size: 12px; + padding: 2px 4px; + color: #fff; + background-color: #dadada; + border-radius: 3px; + -moz-user-select: none; + /*火狐*/ + -webkit-user-select: none; + /*webkit浏览器*/ + -ms-user-select: none; + /*IE10*/ + -khtml-user-select: none; + /*早期浏览器*/ + user-select: none; + } + + .content-wrapper { + display: flex; + flex-direction: column; + max-width: 50%; + } + + .content-wrapper-left { + align-items: baseline; + } + + .content-wrapper-right { + align-items: flex-end; + } + + .displayname { + margin-left: 13px; + margin-left: 13px; + font-size: 13px; + margin-bottom: 5px; + color: darkgray; + } + .avatar img { + width: 42px; + height: 42px; + border-radius: 3px; + user-select: none; + } + + .chat-video video { + margin-right: 18px; + margin-left: 18px; + max-width: 350px; + } + + .chat-audio { + max-width: 400px; + } + + audio { + margin-left: 9px; + margin-right: 9px; + } + .chat-image img, + .chat-file img { + margin-right: 18px; + margin-left: 18px; + max-width: 250px; + max-height: 250px; + } + .emoji-image img { + margin-right: 18px; + margin-left: 18px; + max-width: 150px; + max-height: 150px; + } + + @media screen and (max-width: 768px) { + + .chat-image img, + .chat-file img { + margin-right: 8px; + margin-left: 8px; + max-width: 250px; + /*max-height: auto;*/ + } + .displayname { + margin-left: 13px; + margin-left: 13px; + font-size: 10px; + margin-bottom: 5px; + color: darkgray; + } + } + + .chat-file { + max-width: 80%; + width: 300px; + margin-right: 20px; + display: flex; + flex-direction: column; + padding: 10px; + background-color: #fff; + border-radius: 4px; + cursor: pointer; + /* height: 100px; */ + margin-left: 10px; + } + + .chat-file img { + width: 50px; + } + + @media screen and (max-width: 768px) { + .chat-file { + margin-left: 8px; + margin-right: 8px; + } + .chat-file img { + width: 40px; + } + .chat-image img, + .chat-file img { + margin-right: 8px; + margin-left: 8px; + } + } + + .chat-music-audio { + margin: 0 10px; + } + + .chat-music-audio .player-box, + .chat-file .file-box { + display: flex; + align-items: center; + cursor: pointer; + /* height: 80px; */ + } + + .player-box { + background-color: #939AA1; + border-radius: 5px; + width: 300px; + } + + .player-box .cover-image { + width: 80px; + height: 80px; + border-radius: 5px 0 0 5px; + vertical-align: middle + } + + .player-box .player-info { + width: 160px; + margin: 0 14px; + overflow: hidden; + vertical-align: middle + } + + .player-box .player-info .title { + font-size: 16px; + color: #fff; + margin-bottom: 5px; + } + + .player-box .player-info .artist { + font-size: 14px; + color: #cecece; + } + + .player-box .player-button { + width: 16px; + height: 16px; + vertical-align: middle + } + + .player-original { + display: flex; + align-items: center; + height: 20px; + } + + .player-original p { + color: #b6b6b6; + font-size: 12px; + vertical-align: middle + } + + .player-original-img { + width: 12px; + height: 12px; + margin: 0 5px; + } + + .chat-file .app-info { + border-top: 1px solid #ede3e3; + } + + .chat-file .app-info p { + margin-top: 3px; + color: #888; + } + + .chat-music-audio .player-controls, + .chat-file .file-img { + display: flex; + align-items: center; + } + + .file-title{ + font-size: 14px; + display: -webkit-box; + overflow: hidden; + text-overflow: ellipsis; + -webkit-box-orient: vertical; + } + + .description>p { + font-size: 12px; + color: #BDBDBD; + display: -webkit-box; + overflow: hidden; + text-overflow: ellipsis; + -webkit-box-orient: vertical; + } + + .card-title{ + font-size: 14px; + } + + .file-title, + .card-content>h2 { + -webkit-line-clamp: 2; + font: 14px sans-serif; + } + + @media screen and (max-width: 768px) { + .file-title { + font-size: 13px; + } + } + + .description>p { + -webkit-line-clamp: 3; + margin-top: 2px; + } + + + .chat-music-audio .flex1, + .chat-file .flex1 { + flex: 1; + justify-content: start; + } + + .chat-music-audio .flex2, + .chat-file .flex2 { + flex: 2; + justify-content: end; + } + + .chat-file .file-info { + width: 200px; + /* height: 80px; */ + margin-left: 4px; + /* margin-top: 15px; */ + white-space: normal; + flex-basis: 200px; + word-break: break-word; + } + + .chat-file .file-name, + .chat-music-audio .song-title { + font-weight: 700; + overflow-wrap: break-word + } + + .chat-file .file-size { + margin-top: 5px; + color: #888 + } + + .app-info { + font-size: 13px; + margin-left: 3px; + margin-right: 3px + } + + .file-size, + textarea { + font-size: 12px + } + + .chat-music-audio .play-button { + width: 50px; + height: 50px; + background-color: transparent; + border-radius: 50%; + border: 0; + outline: 0; + cursor: pointer + } + + .chat-music-audio .play-button.playing { + background: url(data:image/png;base64,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) no-repeat center; + background-size: 18px 18px; + } + + .chat-music-audio .play-button.paused { + background: url(data:image/png;base64,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) no-repeat center; + background-size: 18px 18px; + } + + .input-area { + border-top: .5px solid #e0e0e0; + height: 150px; + display: flex; + flex-flow: column; + background-color: #fff + } + + textarea { + flex: 1; + padding: 5px; + border: 0; + cursor: pointer; + overflow-y: auto; + overflow-x: hidden; + outline: 0; + resize: none + } + + .button-area { + display: flex; + height: 40px; + margin-right: 10px; + line-height: 40px; + padding: 5px; + justify-content: flex-end + } + + .button-area button, + button { + border: 0; + border-radius: 4px; + cursor: pointer + } + + .button-area button { + width: 80px; + outline: 0; + float: right + } + + #paginationInfo, + .button-row, + .jump-row { + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 10px + } + + button, + input { + font-size: 14px + } + + button { + background-color: #3498db; + color: #fff; + margin: 0 14px; + transition: background-color .3s; + padding: 10px 25px + } + + button:hover { + background-color: #2980b9 + } + + input { + padding: 8px; + width: 120px; + box-sizing: border-box; + margin-right: 0; + margin-left: 15px + } + + #paginationInfo { + color: #555; + font-size: 14px + } + + .card { + background-color: #fff; + border-radius: 10px; + overflow: hidden; + box-shadow: 0 4px 8px rgba(0, 0, 0, .1); + max-width: 80%; + width: 280px; + display: flex; + flex-direction: column; + text-align: left; + margin: 0 15px 10px 20px + } + + @media screen and (max-width:768px) { + .card { + margin: 0 8px + } + } + + .card a { + text-decoration: none; + color: inherit + } + + .card-content { + padding: 10px; + flex: 1 + } + + .thumbnail { + width: 50px; + height: 50px; + object-fit: cover + } + + .description, + .link-info { + display: flex; + justify-content: space-between + } + + .link-info { + align-items: center; + justify-content: center; + padding: 2px; + background-color: #f0f0f0 + } + + .app-logo { + width: 20px; + height: 20px; + margin-right: 10px; + border-radius: 50% + } + + .app-name { + font-size: 12px; + font-weight: bold; + } + + .transfer-box { + width: 200px; + height: 80px; + margin-left: 18px; + margin-right: 18px; + border-radius: 3px; + padding-left: 11px; + padding-right: 11px; + position: relative + } + + .transfer-box[paysubtype="1"], + .transfer-box[paysubtype="1"]::before { + background: #f79c46 + } + + .transfer-box[paysubtype="1"] i { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAIAAAC2BqGFAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkU0QUVDQ0YxRUZGRTExRUFCNjUwQTEzMEE4ODE1MDNGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkU0QUVDQ0YyRUZGRTExRUFCNjUwQTEzMEE4ODE1MDNGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RTRBRUNDRUZFRkZFMTFFQUI2NTBBMTMwQTg4MTUwM0YiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RTRBRUNDRjBFRkZFMTFFQUI2NTBBMTMwQTg4MTUwM0YiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz56YfhrAAAaqUlEQVR42uxdWXNc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) + } + + .transfer-box:not([paysubtype="1"]), + .transfer-box:not([paysubtype="1"])::before { + background: #f8e2c6 + } + + .transfer-box[paysubtype="3"] i { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAIAAAC2BqGFAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkU0QUVDQ0Y1RUZGRTExRUFCNjUwQTEzMEE4ODE1MDNGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkU0QUVDQ0Y2RUZGRTExRUFCNjUwQTEzMEE4ODE1MDNGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RTRBRUNDRjNFRkZFMTFFQUI2NTBBMTMwQTg4MTUwM0YiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RTRBRUNDRjRFRkZFMTFFQUI2NTBBMTMwQTg4MTUwM0YiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6wJRTaAAAWHUlEQVR42uxdiXbi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) + } + + .transfer-box[paysubtype="4"] i { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA4CAYAAABHRFAgAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAULSURBVGhD3ZvZUxtHEId7FnZXHAapApg4wQG/5K6kkqqk8pBUkv88KVdu5/CDyzmqArZsY0MAIyO0K6RJd09L1sne2l2+KkA7oKV/TO9MH4NqPfhOQ4o4ag5UbQdg8RUAZcloCHQX4PwI9PG/4HcvZDAdUhHpuCugrr0KUFnFO87hCN7SOwV9+Fdog92Nd/DTCr5S+PaOeX/jKfitY/MDCUgkksVtvIuv8BYXLZyJE/BOds03E+BWt/EPVgWwK3ilQB/cTyQ2tkh380NjxPkxeId/ymj6uGtvAizUADo+eI9/ldFoRBbp1m4BLK3hO+dA138AX8d2hNA46PLqjc+NGzePwDv6R74Tjkgi3RsfAVg2wIunqbhlVNiNl6+zWO/RLzIaTOjlz73xMf70PHR3v8lFIEG/16v/iFNjGXtCEijSwQ/39U/4tVf/CdrztBjkC9lBkF1OCHsCRSoSiM+E9/iOjBQDtufCB7X5gYxM51KR7BJd9P+Yq1rWePu/8wQEue5UkWaRmSvcDI7C9qGdlwmdKJK3CVxFu7vfykixYTtxUXTXMWqawJhIu3Vq9kHcJoqwyISB7NTPH+DsXJORYcZEWttf8Eaf1zYRF7/xxGwtFImNMCSSYlEK1SiSKSN67zbb71QwDBxgSCQH2xiLziJUywIfFyCyX62/JSOGvkieRcwmuvWfzUBJMcmCBofCP6EvkvNBTJfaFRJbcvwzUEsbcjHorpTwYj54FdC4M4C9IFcikkoWZVxRp+GfPWM9rAthkVyToew+A+z2ubyaNVp09dyVik4eBgEp465ugXXra7maMRTUkC7EiMRNlIpOaeFceLgpY3aw8pqMzB59cI91EeYzklYZ0K1tg9r5Ev10Ea+UGcwBX77a7SZYo9FBElwKJpZxKyoQavUmWGqhKpfxcRbXTPWAA4pioSpVUNprUHgA3sPvZTgapjT5ck/KFHQ9b/8PuQjG3foM/fYFPpPzrgxFh28yK4EEP+cRwTTMAlwJS0OcPbfjobs29jXVMuO6q4MxoqrexHXalpFx4t47KexpZwdgaUxNkkAhFBV6NVe1i5ei6dYJiny+J5fJ8PEv5j3EZJsaPwXCbx6C1ZZl31HpbNzek9+4C0XPQp4z61C/UzARDw6o9bf5ZRpQm41qtTyzOaE23mNdhBF5fpTZRp7XogOU/JMuhEVSCzvPODMblOgSkRyc645pjV0BaFsjPb2ko5+FcD5JLewrgFpaHwoc+iJNXaQcFfNAqJIuzyPRF+lzUKBMj77EGPsVOuYjM4C8dFeEV8KFGvfoSwvaP7qiD4lkOr45hFBCOFZF+0cZE8kN1xKutA4Vx3Hzn9QwHp9JookP7UCZvQyo1S1cWBpyNcxEkXxOhmZTDkQUHbaTZvHZPRkZJvAcD7Wpi9xS77XRL7NxsrsOQv34CY3NIuBefx/tmw+chECRev8uUB0o6ITFrGF77EVzeCmAQJE+JsG9GxXlGe3ZEUYgEeyuArtElxajT81ynQP0e/uLTIR1IvopSTpGQrEh9U/2bpsWdsbY6E3WzlcsjraJaavoNGKdd6VjMHxKRM67Ugs+qw51LuddB6E+ijmEgLfwzziT4QZoQrjMSekSn8vB5Pe/v7kgFZdEIns4y5vGKKqmc3dXR67v8GPA3iBn0CkfxHRpMJuISyoiB7my/01wGdQfpPYZdZd4pukoG5Ur/SYXfvVpPePjbQD/A1/vC7XhnXAdAAAAAElFTkSuQmCC) + } + + .transfer-box::before { + content: ""; + width: 8px; + height: 8px; + position: absolute; + transform: rotate(45deg); + top: 18px + } + + .transfer-box[issend="0"]::before { + left: -3px + } + + .transfer-box[issend="1"]::before { + left: 218px + } + + .trans-content { + display: flex; + height: 60px; + align-items: center; + position: relative + } + + .trans-content>i { + display: block; + width: 36px; + height: 36px; + background-repeat: no-repeat; + background-size: cover + } + + .transfer-texts { + margin-left: 7px; + display: flex; + align-items: flex-start; + flex-direction: column + } + + .trans-bottom>span, + .transfer-texts>font, + .transfer-texts>span { + color: #fff; + font-weight: 500 + } + + .transfer-texts>span { + font-size: 15px + } + + .transfer-texts>font { + font-size: 12px; + padding-left: 2px + } + + .transfer { + height: 60px + } + + .trans-bottom { + height: 16px; + margin-top: 1px; + display: flex; + align-items: center + } + + .trans-bottom>span { + font-size: 10px + } + + .call i { + display: inline-block; + background-repeat: no-repeat; + background-size: cover; + vertical-align: middle; + margin-right: 4px; + margin-top: -2px + } + + .call[calltype='1'] i { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAQAAABecRxxAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuZjM1NGVmYywgMjAyMy8xMS8wOS0xMjo0MDoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjQgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNC0wMi0wM1QwMDozNTo1MCswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjQtMDItMDNUMDA6NDA6NDgrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjQtMDItMDNUMDA6NDA6NDgrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIxIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmU4MmI2NjdiLTViYjgtMWI0Mi1hZjE1LWYwN2I2MDZmYzc1YyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDplODJiNjY3Yi01YmI4LTFiNDItYWYxNS1mMDdiNjA2ZmM3NWMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplODJiNjY3Yi01YmI4LTFiNDItYWYxNS1mMDdiNjA2ZmM3NWMiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmU4MmI2NjdiLTViYjgtMWI0Mi1hZjE1LWYwN2I2MDZmYzc1YyIgc3RFdnQ6d2hlbj0iMjAyNC0wMi0wM1QwMDozNTo1MCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjQgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pr6wAaUAACteSURBVHic7d15lFxXYefxb+1dXdX7vqhbm7VaXmTJxgsGbDBmMbYhQMI4k0nm5ISQhYTJZJIwM1kgmZnkECYZAsOWCSQhgYAhYAzY2MS7sSxbsmRrV0tqdav3tbq79po/1LblRbeX92q9v4/O8bH0qt67XV3v9967qyeHiNjKW+wCiEjxKABELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCymABCxmAJAxGIKABGLKQBELKYAELGYAkDEYgoAEYspAEQspgAQsZgCQMRiCgARiykARCzmd/Jmj1ulEKe8eIAsudds8RAixDRtNDODj1qSjJPEC6SIAa34GaKRS5hljk1EGKKWOuaZI80UaVLESOIHZkiTohEvE1TRyBwL1JJgGvCQw4+fJC9eWLJkC/cR2Oi1v+6VchQAUjR+0lTRSpIEUarIUEWQYeI00UWGMBuIEMNLHdWkGKWDDoapZgtZ9hNjM22cwkcXHmZIUkUNM8zTSZBxamkhRpYgw8wRJk2CRoKcw0sDWaaYJ0iQSWaoYp4h4sSYJUqA0yQIkCXHJEN0EKSPANMKg1LkcZIhugPIEx8ZQgSI0cQaZuijgW34yNJLlGnaaWGEZraQJEs7QbL48RMjRYQ6svhoIkgcP2F8pIlTRRULBIgCM6RoArKvegTMkcX3mn9/9asulCIFZFggRZIEAbxMkcFLjhwLxKjBzwQ55hljjhlmSOIjzQgxIEWaEWbIkiRBgoz7H2Ylc34HoAAoBUG6SdFACwn8bCLKLFvoYIwO2pjjHDX0Ahk6iRCjjiALBKkpdsFXLM08abxkmGQByJBmjBn8JEkyxbOcIESMGdKcJF3s4pY6BUA5CZMmRysBqllPDUMk6KGFCTaznjjtrCGBhy6CxOkudnGLop9+qphjlgzHSTFFhhRjzJDBwxhJhkku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) + } + + .call[calltype='0'] i { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuZjM1NGVmYywgMjAyMy8xMS8wOS0xMjo0MDoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjQgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNC0wMi0wM1QwMDo1OTo0OCswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjQtMDItMDNUMDE6MDE6MDErMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjQtMDItMDNUMDE6MDE6MDErMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmViMGNiNGVkLTQ0ZGMtOTQ0OC1iZDdkLTUxNzJmMTQzOTc5ZSIgeG1wTU06RG9jdW1lbnRJRD0i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JiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJvR/AL9O+A1wSWwmAAAAAElFTkSuQmCC) + } + + @media screen and (max-width:768px) { + + #paginationInfo, + .button-row, + .jump-row { + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 0 + } + + .chat-video video { + margin-right: 8px; + margin-left: 8px; + max-width: 280px + } + + button { + padding: 5px 10px; + background-color: #3498db; + color: #fff; + border: 0; + border-radius: 4px; + cursor: pointer; + margin: 0 5px; + transition: background-color .3s + } + + button:hover { + background-color: #2980b9 + } + + input { + padding: 8px; + width: 120px; + box-sizing: border-box; + margin-right: 0; + margin-left: 5px + } + } + + .call i, + .system-msg>.emoji_img { + width: 18px; + height: 18px + } + + .emoji_img { + width: 22px; + height: 22px; + vertical-align: middle; + margin-top: -4.4px + } + + .modal { + display: none; + position: fixed; + z-index: 9999; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, .8) + } + + .modal-image { + display: block; + max-width: 90%; + max-height: 90%; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) + } + + @media screen and (max-width:768px) { + body { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center + } + + ::-webkit-scrollbar { + display: none + } + + .page { + width: 100%; + height: 100%; + box-shadow: none + } + + .page .mid-bar, + .page .side-bar { + display: none + } + + .page .main-body { + height: 95% + } + + .page .main-body .nav-bar .turner-bar { + transform: none; + font-size: 12px + } + + .page .main-body .nav-bar .turner-bar .button { + margin: 10px 5px + } + + .page .main-body .nav-bar .turner-bar input { + font-size: 14px + } + } + + .OpenIM-card, + .personal-card { + position: relative; + width: 220px; + height: 115px; + border-radius: 5px; + background-color: #fff + } + + .personal-card .contner { + display: flex; + margin: 12px 16px 5px; + width: 100%; + height: 68px + } + + .OpenIM-card .contner img, + .personal-card .contner img { + line-height: 100px; + width: 50px; + height: 50px; + margin: 2px 0 0; + border-radius: 5%; + overflow: hidden + } + + .personal-card .contner .text { + width: 60%; + margin-left: 10px; + overflow: hidden + } + + .personal-card .contner .text .nickname { + font-size: 14px; + line-height: 20px; + color: #000 + } + + .personal-card .contner .text .nickname img { + width: 14px; + height: 14px; + margin: 0 + } + + .personal-card .contner .text .other { + font-size: 12px; + line-height: 16px; + color: #9e9898 + } + + .personal-card .bottom { + width: 100%; + height: 30px; + font-size: 12px; + color: #9e9898; + background-color: #fafafa; + border-top: #eee 1px solid + } + + .personal-card .bottom .text { + font-size: 12px; + line-height: 28px; + margin-left: 16px + } + + .personal-card:hover { + background-color: #333 + } + + .item-left .personal-card { + margin-left: 15px; + background-color: #fff + } + + .item-left .personal-card:before, + .item-right .personal-card:before { + content: ""; + position: absolute; + width: 0; + height: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent + } + + .item-left .personal-card:before { + left: -18px; + border-left: 10px solid transparent; + border-right: 10px solid #fff + } + + .item-right .personal-card { + margin-right: 15px; + background-color: #fff + } + + .item-right .personal-card:before { + border-left: 10px solid #fff; + border-right: 10px solid transparent; + right: -18px; + top: 11px + } + + .OpenIM-card .contner { + display: flex; + margin: 12px 16px 5px; + width: 100%; + height: 68px + } + + .OpenIM-card .contner .text { + width: 60%; + margin-left: 10px; + overflow: hidden + } + + .OpenIM-card .contner .text .nickname { + font-size: 14px; + line-height: 20px; + color: #000 + } + + .OpenIM-card .contner .text .desc { + font-size: 14px; + line-height: 20px; + color: #9e9898 + } + + .OpenIM-card .contner .text .desc img { + width: 14px; + height: 14px; + margin: 0px 0px 0px 0px; + } + + .OpenIM-card .contner .text .nickname img { + width: 14px; + height: 14px; + margin: 0px 0px 0px 0px; + } + + .OpenIM-card .contner .text .other { + font-size: 12px; + line-height: 16px; + color: #9e9898; + } + + .OpenIM-card .bottom { + width: 100%; + height: 30px; + /* margin-top: 6px; */ + font-size: 12px; + color: #9e9898; + background-color: #fafafa; + border-top: #eeeeee 1px solid; + border-radius: 0 0 5px 5px; + } + + .OpenIM-card .bottom .text { + font-size: 12px; + line-height: 28px; + margin-left: 16px; + } + + .OpenIM-card:hover { + background-color: #333; + } + + .item-left .OpenIM-card { + margin-left: 15px; + background-color: #fff; + } + + .item-left .OpenIM-card { + margin-left: 15px; + background-color: #fff; + } + + .item-left .OpenIM-card:before { + content: ""; + position: absolute; + width: 0; + height: 0; + border-left: 10px solid transparent; + border-top: 10px solid transparent; + border-right: 10px solid #fff; + border-bottom: 10px solid transparent; + left: -18px; + } + + .item-right .OpenIM-card { + margin-right: 15px; + background-color: #fff; + } + + .item-right .OpenIM-card:before { + content: ""; + position: absolute; + width: 0; + height: 0; + border-left: 10px solid #fff; + border-top: 10px solid transparent; + border-right: 10px solid transparent; + border-bottom: 10px solid transparent; + right: -18px; + top: 11px; + } + + /* 位置 */ + .location { + position: relative; + width: 220px; + height: 180px; + border-radius: 5px; + background-color: #fff; + + } + + .location .poiname { + width: 90%; + padding: 0 16px 0 10px; + margin: 5px 0 5px 0; + font-size: 14px; + line-height: 20px; + } + + .location .label { + width: 100%; + padding: 0 16px 0 10px; + font-size: 12px; + color: #9e9898; + ; + } + + .location .map { + width: 100%; + height: 120px; + overflow: hidden; + } + + .custom-content-marker { + position: relative; + width: 25px; + height: 34px; + } + + .custom-content-marker img { + width: 100%; + height: 100%; + } + + .item-left .location { + margin-left: 15px; + background-color: #fff; + } + + .item-left .location:before { + content: ""; + position: absolute; + width: 0; + height: 0; + border-left: 10px solid transparent; + border-top: 10px solid transparent; + border-right: 10px solid #fff; + border-bottom: 10px solid transparent; + left: -18px; + top: 11px; + } + + .item-right .location { + margin-right: 15px; + background-color: #fff; + } + + .item-right .location:before { + content: ""; + position: absolute; + width: 0; + height: 0; + border-left: 10px solid #fff; + border-top: 10px solid transparent; + border-right: 10px solid transparent; + border-bottom: 10px solid transparent; + right: -18px; + top: 11px; + } + + /* 合并消息 */ + .merge-message { + position: relative; + width: 220px; + height: 110px; + border-radius: 5px; + background-color: #fff; + } + + .merge-message .title { + width: 100%; + margin: 10px 16px; + font-size: 14px; + line-height: 20px; + color: #000; + } + + .merge-message .msg { + height: 16px; + margin: 4px 16px; + font-size: 12px; + line-height: 16px; + color: #9e9898; + overflow: hidden; + } + + .merge-message .bottom { + width: 100%; + height: 28px; + margin-top: 6px; + font-size: 12px; + color: #9e9898; + background-color: #fafafa; + border-top: #eeeeee 1px solid; + } + + .merge-message .bottom .text { + font-size: 12px; + line-height: 28px; + margin-left: 16px; + } + + .merge-message:hover { + background-color: #333; + } + + .item-left .merge-message { + margin-left: 15px; + background-color: #fff; + } + + .item-left .merge-message:before { + content: ""; + position: absolute; + width: 0; + height: 0; + border-left: 10px solid transparent; + border-top: 10px solid transparent; + border-right: 10px solid #fff; + border-bottom: 10px solid transparent; + left: -18px; + top: 11px; + } + + .item-right .merge-message { + margin-right: 15px; + background-color: #fff; + } + + .item-right .merge-message:before { + content: ""; + position: absolute; + width: 0; + height: 0; + border-left: 10px solid #fff; + border-top: 10px solid transparent; + border-right: 10px solid transparent; + border-bottom: 10px solid transparent; + right: -18px; + top: 11px; + } + + .search-modal, + .merge-msg-modal { + display: none; + position: fixed; + z-index: 1; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgb(0, 0, 0); + background-color: rgba(0, 0, 0, 0.4); + } + + .search-modal-content, + .merge-msg-modal-content { + background-color: #fefefe; + margin: 5% auto; + /* 15% 从顶部和居中 */ + padding: 20px; + border: 1px solid #888; + width: 60%; + height: 80%; + } + + /* 关闭按钮 */ + .merge-msg-modal-content .title .close { + color: #aaa; + float: right; + font-size: 28px; + font-weight: bold; + margin-top: -20px; + margin-right: -10px; + } + + .merge-msg-modal-content .title .close:hover, + .merge-msg-modal-content .title .close:focus { + color: black; + text-decoration: none; + cursor: pointer; + } + + .merge-msg-modal-content .title { + height: 40px; + font-size: 14px; + color: #9e9898; + border-bottom: #eeeeee 1px solid; + } + + .modal-container { + /* display: flex; */ + /* position: fixed; */ + height: 90%; + overflow: hidden; + overflow-y: auto; + } + + .modal-container .OnePersonmsg { + display: flex; + overflow: hidden; + overflow-y: auto + } + + .search-modal-content .modal-container .OnePersonmsg:hover { + background-color: #f0f0f0; + } + + .search-modal-content .modal-container .OnePersonmsg { + cursor: pointer; + } + + .tooltip { + position: absolute; + background-color: black; + color: white; + padding: 5px; + border-radius: 3px; + font-size: 12px; + white-space: nowrap; + /* 防止提示文本换行 */ + display: none; + /* 默认隐藏 */ + z-index: 2; + } + + .search-modal-content .modal-container .OnePersonmsg:hover .tooltip { + visibility: visible; + } + + .OnePersonmsg .left { + width: 12%; + text-align: right + } + + .OnePersonmsg .right { + width: 88% + } + + .OnePersonmsg .left .avatar { + margin-left: 30px; + margin-top: 10px + } + + .OnePersonmsg .left .avatar img { + width: 36px; + height: 36px; + user-select: none + } + + .OnePersonmsg .right .msg-block { + width: 80%; + margin-left: 10px; + margin-top: 10px; + padding-bottom: 20px; + border-bottom: #eee 1px solid + } + + .msg-block .msg-container-top { + font-size: 14px; + color: #9e9898; + display: flex; + justify-content: space-between; + align-items: center + } + + .msg-block .msg-container { + font-size: 14px; + line-height: 20px; + color: #000 + } + + .msg-block .msg-container img, + .msg-block .msg-container video { + max-width: 280px + } + + .msg-block .inner-msgMerge-card { + background-color: #f4f4f4; + padding-top: 10px; + height: 60px + } + + .inner-msgMerge-card .desc, + .inner-msgMerge-card .title { + height: 20px; + margin: 0 0 0 10px; + font-size: 14px; + line-height: 18px; + color: #000; + overflow: hidden + } + + .inner-msgMerge-card .desc { + height: 16px; + font-size: 12px; + line-height: 16px; + color: #9e9898 + } + + .modal-search-box { + width: 90%; + padding: 10px; + margin: 10px auto; + font-size: 16px; + border: 1px solid #ccc; + border-radius: 4px; + } + + .close-btn { + color: #aaa; + float: right; + font-size: 28px; + font-weight: bold; + cursor: pointer; + } + + .close-btn:hover, + .close-btn:focus { + color: black; + text-decoration: none; + } + + .mini-program, + .video-number { + position: relative; + width: 220px; + border-radius: 5px; + background-color: #fff + } + + .mini-program a { + text-decoration: none + } + + .mini-program .top { + display: flex; + margin: 0; + width: 100%; + height: 40px + } + + .mini-program .top img { + margin: 15px 0 0 15px; + overflow: hidden + } + + .mini-program .top .text { + width: 60%; + margin: 15px 0 0 10px; + font-size: 12px; + line-height: 20px; + overflow: hidden; + color: #9e9898 + } + + .mini-program .title { + font-size: 14px; + line-height: 20px; + color: #000; + margin: 0 0 0 15px + } + + .mini-program .cover, + .mini-program img { + width: 190px; + height: 170px; + margin: 10px auto; + color: #9e9898 + } + + .mini-program img { + margin: 0 auto + } + + .mini-program .bottom { + width: 100%; + height: 30px; + font-size: 12px; + color: #9e9898; + background-color: #fafafa; + border-top: #eee 1px solid; + border-radius: 0 0 5px 5px + } + + .mini-program .bottom .text { + font-size: 12px; + line-height: 28px; + margin-left: 16px + } + + .mini-program:hover { + background-color: #333 + } + + .item-left .mini-program { + margin-left: 15px; + background-color: #fff + } + + .item-left .mini-program:before { + content: ""; + position: absolute; + width: 0; + height: 0; + border-left: 10px solid transparent; + border-top: 10px solid transparent; + border-right: 10px solid #fff; + border-bottom: 10px solid transparent; + left: -18px + } + + .item-right .mini-program { + margin-right: 15px; + background-color: #fff + } + + .item-right .mini-program:before { + border-left: 10px solid #fff; + border-right: 10px solid transparent; + right: -18px; + top: 11px + } + + .video-number { + width: 210px; + height: 340px; + background-color: #a56819; + display: flex; + flex-direction: column + } + + .video-number .title { + width: 90%; + height: 60px; + font-size: 14px; + line-height: 20px; + overflow: hidden; + color: #333; + margin: 5px auto + } + + .video-number .container { + width: 210px; + height: 280px; + overflow: hidden + } + + .video-number .container .bottom { + position: absolute; + top: 240px; + width: 100%; + height: 100px; + font-size: 12px; + line-height: 16px; + margin: auto 0 -100px; + background: linear-gradient(to bottom, transparent, #000); + border-radius: 0 0 5px 5px + } + + .video-number .container .bottom .author { + position: absolute; + width: 100%; + height: 30px; + margin: 0 0 0 15px; + bottom: 10px; + overflow: hidden + } + + .video-number .container .bottom .author img { + width: 20px; + height: 20px; + border-radius: 50%; + display: inline-block + } + + .video-number .container .bottom .author .authIcon, + .video-number .container .bottom .author .logo { + width: 20px; + height: 20px; + border-radius: 50%; + display: inline-block; + vertical-align: middle + } + + .mini-program .top img, + .video-number .container .bottom .author .authIcon img, + .video-number .container .bottom .author .logo img { + width: 20px; + height: 20px; + border-radius: 50% + } + + .video-number .container .bottom .author .name { + height: 30px; + font-size: 14px; + line-height: 30px; + color: #fff; + margin: 0 4px; + display: inline-block; + vertical-align: middle + } + + .item-left .video-number { + margin-left: 15px; + background-color: #fff + } + + .item-left .video-number:before, + .item-right .mini-program:before, + .item-right .video-number:before { + content: ""; + position: absolute; + width: 0; + height: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent + } + + .item-left .video-number:before { + left: -18px; + border-left: 10px solid transparent; + border-right: 10px solid #fff + } + + .item-right .video-number { + margin-right: 15px; + background-color: #fff + } + + .item-right .video-number:before { + border-left: 10px solid #fff; + border-right: 10px solid transparent; + right: -18px; + top: 11px + } + + .bubble-audio-left, + .bubble-audio-right { + position: relative; + min-width: 40px; + max-width: 250px; + border-radius: 5px; + line-height: 40px + } + + .bubble-audio-left { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAGzklEQVR4nO2dd4xURRzHPyJYAEHB3oKeApaIxhqxIBGVGGIhihVFgxqwK0hiSRRRmkQhIhZsaDBiI2ANEhU0YjdREeWQqBFsOQsowgFmkt8m53q3+525e+/d253PP4S975vMm9++N/MrM0skEolEIpFIJBKJRCKRSCQSiUQqgE2SvIWamprWOELnAycBg4H1IQ3U1ta2fK+Mtom13Dq5HJhsX8R2wNmhRkmKNpU9/v/hRmBKg7fCGcD0pN8SvlSDQdyAjwNub+RvFwB3ZNCnJql0g7j7mwqMLKEZBVycYp9KUskGcfPj48BlgtYZrXcKfSpLJRvkZuBcUbsZ8DSwXcJ9KkslG2Q88JaHfmfgsawn+Uo2yGrgZGCRxzX9gWEJ9qkslT6prwIGAEs9rhkL7JFgn0pSDcven+1J+V3UdzR/JROqxTH8yrzyjaLeGfDUhPvUKNXkqb8MTPDQT7TwSqrk2SCHAQ/ZklXlJuATUVuThcOYV4P0AebZgM0ENhWvWwcMsX8VnAE3T+42/o96I0F06dIliWbd+3020MH+vw/QFXhJvH4l0Bk4UtB2Ar4FPmr4YV1dnX+vRfL2hAwCngO2LPp8OHChRzu3AT+K2uvTHKc8GcS9np4sMWfcCxwotvWHR5S3O9BP1DabvBjkWuDBMq/Y9haPKn56muJ+4DtRe0lYt/3Jg0Hcq+guMca0N3Cr2O4/lj1UcN7+tuG3oJMHgzwLvOuhvxrYT9ROs/BKOZw/crp/1/3Jg0H+tKKExaLeDd6donaVzUsKZ4Z134+8zCEuDjXQjKMwwBxHhUdE3TEW50qUPK2yFtvyVmWEqHsP+EbQuSfv+PDua+TND5nh4QC64OAugm6j+TYKfcK7rpHH0Ilz1DYIurZWVaLwiqg7KrzbGq3BIDsBkzyChIvN31AYJOoW2jK4HL08/JwgsjZIN2ABcI05airjRN0BwO6Cbg3wgaBzT92+Hv30JkuD9DRjFAqAnQM4RLzWhdDfF7UnijrFII79RV0QWRnkIOBNYNeiz10CaRuxjVmiTonqOj4VdXuJuiCyMIgboPnA9o38rat52gqvi7qDRd0SUddN1AWRtkHcOv41YOsSmqFiVb57bf0m6HqKeZ/lggZxKR1MmgY5BZjbILHUFG7VdYTQnlv6fiHonEO3m6BbKWhIOsiYlkHOA57xSIceLeq+FnXKIDoD/yXo1DkuiDQMMsyKnn02B3UXdT+Juq1EnRIrU9sKImmDjLJMnm+9rFr0rAYb1aCg2l5iVEtdlvqFUKtREiNpg4y1CK1aMVjgV1HXkq8ihAVH4qTxhEy1IJ/P5krVJ2jMl2kM1SDtBY2SYQwmrVfWDNtkuVbULxR1qtf8i6BxY6EUkiVXlJXyHPK8FbmtLqNz9VLvCO21EXPn9cD3gm5HcTwU4waT9qTuyj9PKONhT7dBLEevMh5/gSVie2pI5AdRF0QWqyz37e/bhA9RZ7kRBTWd+qGo6yHqlHRvMFktez8Gjm3kVTLCY4U1UNS9Lep6iTo1OhBEln7IlxYiKRwc4jZcThevdYmnw0XtPFF3iKj7TNQFkbVjuNyMcrdnueYNou5zYJmg20IM068XA5rBtIbDZ1ZYClfFhdPPEsVPibreZpRyuCTW39536EEeQyeTxX6vt9egQn9Rp85HweTNIIM9tgbMFqvbXZzrNLHNN0RdMHkySA+P7cobbVOOwqHAnoJunUfaOJi8GKSzVRd2EvVzPIoWLhJ1Czz2ugeTB4O0t7CLWg9Vb4eVKXT0OKBGrXJpFnkwiNsGcJyHfoqHr3CpmLyqt30qiZMHgzxqB5ApOZVaO5ZJweX3rxK1c+2IjsTJyxwywQ4iK5VTcaH9c4RocoGhYjUKtr8xFfK0ynrAjnhtKs060vZ6KHSyQwEUlnpUxzebvPkhMy2ouKbo8/uAezzauQXYQdROFLc/tAh59NTnWKKrkEp1K7ArPK53e9mvFLUrrIQpNfJadTLf8iEPW1xLzde3sz2F6ik/Y5KOXRWT55OtF3ke3+cY7XHaw7I0J/MC1XReVv8y5/cWc51HUUaLUS0G6W4LArVgzlXov5BwnxqlGgziylJftHiYwqosTyatdIN0sFWZz66nUQ3SyqlTyQbpYE+Gmnt3vGqVlplRyQYZaZUtKissAeZbh9yiVLJBRnscLLPW9rSr+00So5INUm/f+GmCdrgloDKn0if1DbZiGl9CM9aOm20V5PFU0hDm2RPTt+jaJ+x3qbyIp5K2DGMsqFiYtGfZ6RGZTuLFVNuvtE2xzTv9mvOzeZFIJBKJRCKRSCQSiUQikUgkEomUAPgXdAQSuA1fMO8AAAAASUVORK5CYII=) no-repeat center left 10px; + background-size: 20px; + padding-left: 30px; + background-color: #fff + } + + .bubble-audio-right { + background: url(data:image/png;base64,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) no-repeat center right 10px; + background-color: #9eea6a; + background-size: 20px; + padding-right: 30px; + direction: rtl + } + + @keyframes spin { + 0% { + transform: rotate(0deg) + } + + to { + transform: rotate(360deg) + } + } + + .item-left .bubble-audio-left { + margin-left: 15px; + background-color: #fff + } + + .item-left .bubble-audio-left:before, + .item-right .bubble-audio-right:before { + content: ""; + position: absolute; + width: 0; + height: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + top: 11px + } + + .item-left .bubble-audio-left:before { + left: -18px; + border-left: 10px solid transparent; + border-right: 10px solid #fff + } + + .item-right .bubble-audio-right { + margin-right: 15px; + background-color: #9eea6a + } + + .item-right .bubble-audio-right:before { + border-left: 10px solid #9eea6a; + border-right: 10px solid transparent; + right: -18px + } + + .custom-menu-item { + background-color: #fff; + padding: 8px 12px; + cursor: pointer + } + + .custom-menu-item:hover { + background-color: #ddd + } + + .topnavbar-nav { + display: flex; + flex-wrap: wrap; + align-items: center + } + + .topnavbar-nav .menu-button { + max-width: 100px; + height: 30px; + font-size: 14px; + line-height: 30px; + text-align: center; + background-color: #fff; + padding: 0 10px; + border-radius: 5px; + margin: 5px 10px; + cursor: pointer; + overflow: hidden; + z-index: 999 + } + + .topnavbar-nav.show { + display: flex + } + + .menu-toggle { + display: none; + font-size: 1.5em; + cursor: pointer; + align-self: flex-start + } + + @media screen and (max-width:768px) { + .merge-msg-modal-content { + background-color: #fefefe; + margin: 5% auto; + padding: 20px; + border: 1px solid #888; + width: 90%; + height: 80% + } + + .OnePersonmsg .left .avatar { + margin-left: 0; + margin-top: 10px + } + + .topnavbar-nav { + display: none; + flex-direction: column; + margin-left: auto; + margin-right: -120px + } + + .topnavbar-nav, + .topnavbar-nav .show { + align-items: flex-start + } + + .menu-toggle { + display: block; + margin-left: auto; + margin-right: 20px + } + } + + .loader { + border: 16px solid #f3f3f3; + border-top: 16px solid #dd512e; + border-radius: 50%; + width: 60px; + height: 60px; + animation: spin 2s linear infinite; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) + } + </style> + <title>出错了</title> +</head> + +<body> + <!-- 加载动画容器 --> + <div class="loader" id="loader"></div> + <div class="page" id="content" style="display: none;"> + <!-- <div class="side-bar"></div> --> + <div class="mid-bar"> + <div class="timeline-area"> + <div class="timeline-wrapper"> + <div class="timeline" id="timeline"> + + </div> + </div> + </div> + </div> + <div class="main-body"> + <div class="title-bar" id="title-bar"> + <p id="title">出错了</p> + <div class="topnavbar-nav" id="topnavbar-nav"> + </div> + <span class="menu-toggle" id="menu-toggle"> + <i class="fas fa-bars"></i> + </span> + </div> + <div class="container"> + <div class="content" id="chat-container" onscroll="checkScroll()"> + <div class="item item-center"> + <span>8:16</span> + </div> + <div class="item item-center"> + <span>错误提示</span> + </div> + <div class="item item-left"> + <div class="avatar"> + <img + src="https://blog.lc044.love/static/img/a774ab7a32635db7b4254c8ff7caaa89.Camera_XHS_16984826124131040g2sg30qo1ggopgqe05oce.webp"> + </div> + <div class="bubble bubble-left"> + 很抱歉,由于程序出现未知错误,您的聊天记录未能成功展示。<br />您可以关注下方微信公众号,<b>回复:联系方式</b>,获取QQ交流群群号,并在群内寻求帮助。 + </div> + </div> + <div class="item item-left"> + <div class="avatar"> + <img + src="https://blog.lc044.love/static/img/a774ab7a32635db7b4254c8ff7caaa89.Camera_XHS_16984826124131040g2sg30qo1ggopgqe05oce.webp"> + </div> + <div class="bubble bubble-left">您可自行排查问题所在,例如只选择文本或图片,反馈时请说明哪种消息类型出现了问题!!! + </div> + </div> + <div class="item item-left"> + <div class="avatar"> + <img src="https://blog.lc044.love/static/img/a774ab7a32635db7b4254c8ff7caaa89.Camera_XHS_16984826124131040g2sg30qo1ggopgqe05oce.webp" + loading="lazy"> + </div> + <div class="content-wrapper content-wrapper-left"> + <div class="chat-image"> + <img src="https://blog.lc044.love/static/img/3fd32f1732a2c8f53a7eb923472b8f19.clipboard-2023-12-18.webp" + onclick="showModal(this)" loading="lazy"> + </div> + </div> + </div> + <div class="item item-right"> + <div class="bubble bubble-right">好的</div> + <div class="avatar"> + <img src="https://cdn.luogu.com.cn/upload/image_hosting/rbnmv4bu.png"> + </div> + </div> + </div> + </div> + <div class="nav-bar"> + <div class="turner-bar"> + <div class="button pre-page" onclick="prevPage()">上一页</div> + <div class="navigator-line">转到第 + <input class="navgator" value="1" id="gotoPage" onchange="gotoPage()"></input>页,共<p + id="maxPage">0</p>页 + </div> + <div class="button next-page" onclick="nextPage()">下一页</div> + </div> + </div> + </div> + </div> + <div id="search-modal" class="search-modal"> + <div class="search-modal-content" id="search-modal-content"> + <span class="close-btn" onclick="closeSearchModal()">×</span> + <input type="text" id="searchBox" class="modal-search-box" placeholder="Type your search..."> + </div> + + </div> + <div id="modal" class="modal" onclick="hideModal()"> + <img id="modal-image" class="modal-image"> + </div> + <script> + const FileIcons = { + 'DOCX': 'data:image/png;base64,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', + 'XLS': 'data:image/png;base64,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', + 'CSV': 'data:image/png;base64,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', + 'TXT': 'data:image/png;base64,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', + 'ZIP': 'data:image/png;base64,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', + 'PPT': 'data:image/png;base64,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', + 'PDF': 'data:image/png;base64,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', + 'Default': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB6klEQVR4nO2bT2oCMRSHX/LG5x8UQZispVfwBD1LD2ErbW1Lj9GzdKuiiIgLF17AjRsRHXEmXZSWumkxnfGped8+4ZcvLzNJIACCIAgeozLqN+j3+9elUinIqP89ENGuVqtZo9GYHdo2i4DU7XYf6vX6fbFYBKWycrzPcrl8BYBHALCHtEtbAHU6nXYYhi2tdcpd/06SJAo+K5pNAPV6vbYxpoWIEATB0Wb/P6QlgAaDwVMYhneFQgGSJAFETKnrbElDAA2Hw2djzG0+nwcigiiKQCnlRQXQaDTaGzwRwXa7TSXcMfiPABqPxy/GmObX4HO5HCDiWcz8F64CaDKZvNRqtWYcx7BeryGKIkBE0FpfvAA1nU5vqtVqc7fbQRAE34O21oK1Fogo9aBZ4SSgUqlclcvlvQ/dOc36T5yWgNb6bH5zf3Hc7doJ4r0A5yVwamve9ezhfQWIAO4A3IgA7gDciADuANw4H4dPbR/givcVIAK4A3AjArgDcOO9gIs5DrvifQWIAO4A3IgA7gDceC/gYk6DcivsiAjgDsCNCOAOwI0I4A7AjfcC5D6AOwA3IoA7ADcigDsANyLAoY1VSh30KuMYaK0tHPhaBMBtH2Dn8/nbYrF4j+P4JDYDiGg3m80MHAQIgiB4zQe8XGReoxLRtQAAAABJRU5ErkJggg==' + } + </script> + <script> + /** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.7.0 + * Copyright (C) 2016 Oliver Nightingale + * MIT Licensed + * @license + */ + !function () { var t = function (e) { var n = new t.Index; return n.pipeline.add(t.trimmer, t.stopWordFilter, t.stemmer), e && e.call(n, n), n }; t.version = "0.7.0", t.utils = {}, t.utils.warn = function (t) { return function (e) { t.console && console.warn && console.warn(e) } }(this), t.utils.asString = function (t) { return void 0 === t || null === t ? "" : t.toString() }, t.EventEmitter = function () { this.events = {} }, t.EventEmitter.prototype.addListener = function () { var t = Array.prototype.slice.call(arguments), e = t.pop(), n = t; if ("function" != typeof e) throw new TypeError("last argument must be a function"); n.forEach(function (t) { this.hasHandler(t) || (this.events[t] = []), this.events[t].push(e) }, this) }, t.EventEmitter.prototype.removeListener = function (t, e) { if (this.hasHandler(t)) { var n = this.events[t].indexOf(e); this.events[t].splice(n, 1), this.events[t].length || delete this.events[t] } }, t.EventEmitter.prototype.emit = function (t) { if (this.hasHandler(t)) { var e = Array.prototype.slice.call(arguments, 1); this.events[t].forEach(function (t) { t.apply(void 0, e) }) } }, t.EventEmitter.prototype.hasHandler = function (t) { return t in this.events }, t.tokenizer = function (e) { return arguments.length && null != e && void 0 != e ? Array.isArray(e) ? e.map(function (e) { return t.utils.asString(e).toLowerCase() }) : e.toString().trim().toLowerCase().split(t.tokenizer.seperator) : [] }, t.tokenizer.seperator = /[\s\-]+/, t.tokenizer.load = function (t) { var e = this.registeredFunctions[t]; if (!e) throw new Error("Cannot load un-registered function: " + t); return e }, t.tokenizer.label = "default", t.tokenizer.registeredFunctions = { "default": t.tokenizer }, t.tokenizer.registerFunction = function (e, n) { n in this.registeredFunctions && t.utils.warn("Overwriting existing tokenizer: " + n), e.label = n, this.registeredFunctions[n] = e }, t.Pipeline = function () { this._stack = [] }, t.Pipeline.registeredFunctions = {}, t.Pipeline.registerFunction = function (e, n) { n in this.registeredFunctions && t.utils.warn("Overwriting existing registered function: " + n), e.label = n, t.Pipeline.registeredFunctions[e.label] = e }, t.Pipeline.warnIfFunctionNotRegistered = function (e) { var n = e.label && e.label in this.registeredFunctions; n || t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n", e) }, t.Pipeline.load = function (e) { var n = new t.Pipeline; return e.forEach(function (e) { var i = t.Pipeline.registeredFunctions[e]; if (!i) throw new Error("Cannot load un-registered function: " + e); n.add(i) }), n }, t.Pipeline.prototype.add = function () { var e = Array.prototype.slice.call(arguments); e.forEach(function (e) { t.Pipeline.warnIfFunctionNotRegistered(e), this._stack.push(e) }, this) }, t.Pipeline.prototype.after = function (e, n) { t.Pipeline.warnIfFunctionNotRegistered(n); var i = this._stack.indexOf(e); if (-1 == i) throw new Error("Cannot find existingFn"); i += 1, this._stack.splice(i, 0, n) }, t.Pipeline.prototype.before = function (e, n) { t.Pipeline.warnIfFunctionNotRegistered(n); var i = this._stack.indexOf(e); if (-1 == i) throw new Error("Cannot find existingFn"); this._stack.splice(i, 0, n) }, t.Pipeline.prototype.remove = function (t) { var e = this._stack.indexOf(t); -1 != e && this._stack.splice(e, 1) }, t.Pipeline.prototype.run = function (t) { for (var e = [], n = t.length, i = this._stack.length, r = 0; n > r; r++) { for (var o = t[r], s = 0; i > s && (o = this._stack[s](o, r, t), void 0 !== o && "" !== o); s++); void 0 !== o && "" !== o && e.push(o) } return e }, t.Pipeline.prototype.reset = function () { this._stack = [] }, t.Pipeline.prototype.toJSON = function () { return this._stack.map(function (e) { return t.Pipeline.warnIfFunctionNotRegistered(e), e.label }) }, t.Vector = function () { this._magnitude = null, this.list = void 0, this.length = 0 }, t.Vector.Node = function (t, e, n) { this.idx = t, this.val = e, this.next = n }, t.Vector.prototype.insert = function (e, n) { this._magnitude = void 0; var i = this.list; if (!i) return this.list = new t.Vector.Node(e, n, i), this.length++; if (e < i.idx) return this.list = new t.Vector.Node(e, n, i), this.length++; for (var r = i, o = i.next; void 0 != o;) { if (e < o.idx) return r.next = new t.Vector.Node(e, n, o), this.length++; r = o, o = o.next } return r.next = new t.Vector.Node(e, n, o), this.length++ }, t.Vector.prototype.magnitude = function () { if (this._magnitude) return this._magnitude; for (var t, e = this.list, n = 0; e;)t = e.val, n += t * t, e = e.next; return this._magnitude = Math.sqrt(n) }, t.Vector.prototype.dot = function (t) { for (var e = this.list, n = t.list, i = 0; e && n;)e.idx < n.idx ? e = e.next : e.idx > n.idx ? n = n.next : (i += e.val * n.val, e = e.next, n = n.next); return i }, t.Vector.prototype.similarity = function (t) { return this.dot(t) / (this.magnitude() * t.magnitude()) }, t.SortedSet = function () { this.length = 0, this.elements = [] }, t.SortedSet.load = function (t) { var e = new this; return e.elements = t, e.length = t.length, e }, t.SortedSet.prototype.add = function () { var t, e; for (t = 0; t < arguments.length; t++)e = arguments[t], ~this.indexOf(e) || this.elements.splice(this.locationFor(e), 0, e); this.length = this.elements.length }, t.SortedSet.prototype.toArray = function () { return this.elements.slice() }, t.SortedSet.prototype.map = function (t, e) { return this.elements.map(t, e) }, t.SortedSet.prototype.forEach = function (t, e) { return this.elements.forEach(t, e) }, t.SortedSet.prototype.indexOf = function (t) { for (var e = 0, n = this.elements.length, i = n - e, r = e + Math.floor(i / 2), o = this.elements[r]; i > 1;) { if (o === t) return r; t > o && (e = r), o > t && (n = r), i = n - e, r = e + Math.floor(i / 2), o = this.elements[r] } return o === t ? r : -1 }, t.SortedSet.prototype.locationFor = function (t) { for (var e = 0, n = this.elements.length, i = n - e, r = e + Math.floor(i / 2), o = this.elements[r]; i > 1;)t > o && (e = r), o > t && (n = r), i = n - e, r = e + Math.floor(i / 2), o = this.elements[r]; return o > t ? r : t > o ? r + 1 : void 0 }, t.SortedSet.prototype.intersect = function (e) { for (var n = new t.SortedSet, i = 0, r = 0, o = this.length, s = e.length, a = this.elements, h = e.elements; ;) { if (i > o - 1 || r > s - 1) break; a[i] !== h[r] ? a[i] < h[r] ? i++ : a[i] > h[r] && r++ : (n.add(a[i]), i++, r++) } return n }, t.SortedSet.prototype.clone = function () { var e = new t.SortedSet; return e.elements = this.toArray(), e.length = e.elements.length, e }, t.SortedSet.prototype.union = function (t) { var e, n, i; this.length >= t.length ? (e = this, n = t) : (e = t, n = this), i = e.clone(); for (var r = 0, o = n.toArray(); r < o.length; r++)i.add(o[r]); return i }, t.SortedSet.prototype.toJSON = function () { return this.toArray() }, t.Index = function () { this._fields = [], this._ref = "id", this.pipeline = new t.Pipeline, this.documentStore = new t.Store, this.tokenStore = new t.TokenStore, this.corpusTokens = new t.SortedSet, this.eventEmitter = new t.EventEmitter, this.tokenizerFn = t.tokenizer, this._idfCache = {}, this.on("add", "remove", "update", function () { this._idfCache = {} }.bind(this)) }, t.Index.prototype.on = function () { var t = Array.prototype.slice.call(arguments); return this.eventEmitter.addListener.apply(this.eventEmitter, t) }, t.Index.prototype.off = function (t, e) { return this.eventEmitter.removeListener(t, e) }, t.Index.load = function (e) { e.version !== t.version && t.utils.warn("version mismatch: current " + t.version + " importing " + e.version); var n = new this; return n._fields = e.fields, n._ref = e.ref, n.tokenizer = t.tokenizer.load(e.tokenizer), n.documentStore = t.Store.load(e.documentStore), n.tokenStore = t.TokenStore.load(e.tokenStore), n.corpusTokens = t.SortedSet.load(e.corpusTokens), n.pipeline = t.Pipeline.load(e.pipeline), n }, t.Index.prototype.field = function (t, e) { var e = e || {}, n = { name: t, boost: e.boost || 1 }; return this._fields.push(n), this }, t.Index.prototype.ref = function (t) { return this._ref = t, this }, t.Index.prototype.tokenizer = function (e) { var n = e.label && e.label in t.tokenizer.registeredFunctions; return n || t.utils.warn("Function is not a registered tokenizer. This may cause problems when serialising the index"), this.tokenizerFn = e, this }, t.Index.prototype.add = function (e, n) { var i = {}, r = new t.SortedSet, o = e[this._ref], n = void 0 === n ? !0 : n; this._fields.forEach(function (t) { var n = this.pipeline.run(this.tokenizerFn(e[t.name])); i[t.name] = n; for (var o = 0; o < n.length; o++) { var s = n[o]; r.add(s), this.corpusTokens.add(s) } }, this), this.documentStore.set(o, r); for (var s = 0; s < r.length; s++) { for (var a = r.elements[s], h = 0, u = 0; u < this._fields.length; u++) { var l = this._fields[u], c = i[l.name], f = c.length; if (f) { for (var d = 0, p = 0; f > p; p++)c[p] === a && d++; h += d / f * l.boost } } this.tokenStore.add(a, { ref: o, tf: h }) } n && this.eventEmitter.emit("add", e, this) }, t.Index.prototype.remove = function (t, e) { var n = t[this._ref], e = void 0 === e ? !0 : e; if (this.documentStore.has(n)) { var i = this.documentStore.get(n); this.documentStore.remove(n), i.forEach(function (t) { this.tokenStore.remove(t, n) }, this), e && this.eventEmitter.emit("remove", t, this) } }, t.Index.prototype.update = function (t, e) { var e = void 0 === e ? !0 : e; this.remove(t, !1), this.add(t, !1), e && this.eventEmitter.emit("update", t, this) }, t.Index.prototype.idf = function (t) { var e = "@" + t; if (Object.prototype.hasOwnProperty.call(this._idfCache, e)) return this._idfCache[e]; var n = this.tokenStore.count(t), i = 1; return n > 0 && (i = 1 + Math.log(this.documentStore.length / n)), this._idfCache[e] = i }, t.Index.prototype.search = function (e) { var n = this.pipeline.run(this.tokenizerFn(e)), i = new t.Vector, r = [], o = this._fields.reduce(function (t, e) { return t + e.boost }, 0), s = n.some(function (t) { return this.tokenStore.has(t) }, this); if (!s) return []; n.forEach(function (e, n, s) { var a = 1 / s.length * this._fields.length * o, h = this, u = this.tokenStore.expand(e).reduce(function (n, r) { var o = h.corpusTokens.indexOf(r), s = h.idf(r), u = 1, l = new t.SortedSet; if (r !== e) { var c = Math.max(3, r.length - e.length); u = 1 / Math.log(c) } o > -1 && i.insert(o, a * s * u); for (var f = h.tokenStore.get(r), d = Object.keys(f), p = d.length, v = 0; p > v; v++)l.add(f[d[v]].ref); return n.union(l) }, new t.SortedSet); r.push(u) }, this); var a = r.reduce(function (t, e) { return t.intersect(e) }); return a.map(function (t) { return { ref: t, score: i.similarity(this.documentVector(t)) } }, this).sort(function (t, e) { return e.score - t.score }) }, t.Index.prototype.documentVector = function (e) { for (var n = this.documentStore.get(e), i = n.length, r = new t.Vector, o = 0; i > o; o++) { var s = n.elements[o], a = this.tokenStore.get(s)[e].tf, h = this.idf(s); r.insert(this.corpusTokens.indexOf(s), a * h) } return r }, t.Index.prototype.toJSON = function () { return { version: t.version, fields: this._fields, ref: this._ref, tokenizer: this.tokenizerFn.label, documentStore: this.documentStore.toJSON(), tokenStore: this.tokenStore.toJSON(), corpusTokens: this.corpusTokens.toJSON(), pipeline: this.pipeline.toJSON() } }, t.Index.prototype.use = function (t) { var e = Array.prototype.slice.call(arguments, 1); e.unshift(this), t.apply(this, e) }, t.Store = function () { this.store = {}, this.length = 0 }, t.Store.load = function (e) { var n = new this; return n.length = e.length, n.store = Object.keys(e.store).reduce(function (n, i) { return n[i] = t.SortedSet.load(e.store[i]), n }, {}), n }, t.Store.prototype.set = function (t, e) { this.has(t) || this.length++, this.store[t] = e }, t.Store.prototype.get = function (t) { return this.store[t] }, t.Store.prototype.has = function (t) { return t in this.store }, t.Store.prototype.remove = function (t) { this.has(t) && (delete this.store[t], this.length--) }, t.Store.prototype.toJSON = function () { return { store: this.store, length: this.length } }, t.stemmer = function () { var t = { ational: "ate", tional: "tion", enci: "ence", anci: "ance", izer: "ize", bli: "ble", alli: "al", entli: "ent", eli: "e", ousli: "ous", ization: "ize", ation: "ate", ator: "ate", alism: "al", iveness: "ive", fulness: "ful", ousness: "ous", aliti: "al", iviti: "ive", biliti: "ble", logi: "log" }, e = { icate: "ic", ative: "", alize: "al", iciti: "ic", ical: "ic", ful: "", ness: "" }, n = "[^aeiou]", i = "[aeiouy]", r = n + "[^aeiouy]*", o = i + "[aeiou]*", s = "^(" + r + ")?" + o + r, a = "^(" + r + ")?" + o + r + "(" + o + ")?$", h = "^(" + r + ")?" + o + r + o + r, u = "^(" + r + ")?" + i, l = new RegExp(s), c = new RegExp(h), f = new RegExp(a), d = new RegExp(u), p = /^(.+?)(ss|i)es$/, v = /^(.+?)([^s])s$/, g = /^(.+?)eed$/, m = /^(.+?)(ed|ing)$/, y = /.$/, S = /(at|bl|iz)$/, w = new RegExp("([^aeiouylsz])\\1$"), k = new RegExp("^" + r + i + "[^aeiouwxy]$"), x = /^(.+?[^aeiou])y$/, b = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/, E = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/, F = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/, _ = /^(.+?)(s|t)(ion)$/, z = /^(.+?)e$/, O = /ll$/, P = new RegExp("^" + r + i + "[^aeiouwxy]$"), T = function (n) { var i, r, o, s, a, h, u; if (n.length < 3) return n; if (o = n.substr(0, 1), "y" == o && (n = o.toUpperCase() + n.substr(1)), s = p, a = v, s.test(n) ? n = n.replace(s, "$1$2") : a.test(n) && (n = n.replace(a, "$1$2")), s = g, a = m, s.test(n)) { var T = s.exec(n); s = l, s.test(T[1]) && (s = y, n = n.replace(s, "")) } else if (a.test(n)) { var T = a.exec(n); i = T[1], a = d, a.test(i) && (n = i, a = S, h = w, u = k, a.test(n) ? n += "e" : h.test(n) ? (s = y, n = n.replace(s, "")) : u.test(n) && (n += "e")) } if (s = x, s.test(n)) { var T = s.exec(n); i = T[1], n = i + "i" } if (s = b, s.test(n)) { var T = s.exec(n); i = T[1], r = T[2], s = l, s.test(i) && (n = i + t[r]) } if (s = E, s.test(n)) { var T = s.exec(n); i = T[1], r = T[2], s = l, s.test(i) && (n = i + e[r]) } if (s = F, a = _, s.test(n)) { var T = s.exec(n); i = T[1], s = c, s.test(i) && (n = i) } else if (a.test(n)) { var T = a.exec(n); i = T[1] + T[2], a = c, a.test(i) && (n = i) } if (s = z, s.test(n)) { var T = s.exec(n); i = T[1], s = c, a = f, h = P, (s.test(i) || a.test(i) && !h.test(i)) && (n = i) } return s = O, a = c, s.test(n) && a.test(n) && (s = y, n = n.replace(s, "")), "y" == o && (n = o.toLowerCase() + n.substr(1)), n }; return T }(), t.Pipeline.registerFunction(t.stemmer, "stemmer"), t.generateStopWordFilter = function (t) { var e = t.reduce(function (t, e) { return t[e] = e, t }, {}); return function (t) { return t && e[t] !== t ? t : void 0 } }, t.stopWordFilter = t.generateStopWordFilter(["a", "able", "about", "across", "after", "all", "almost", "also", "am", "among", "an", "and", "any", "are", "as", "at", "be", "because", "been", "but", "by", "can", "cannot", "could", "dear", "did", "do", "does", "either", "else", "ever", "every", "for", "from", "get", "got", "had", "has", "have", "he", "her", "hers", "him", "his", "how", "however", "i", "if", "in", "into", "is", "it", "its", "just", "least", "let", "like", "likely", "may", "me", "might", "most", "must", "my", "neither", "no", "nor", "not", "of", "off", "often", "on", "only", "or", "other", "our", "own", "rather", "said", "say", "says", "she", "should", "since", "so", "some", "than", "that", "the", "their", "them", "then", "there", "these", "they", "this", "tis", "to", "too", "twas", "us", "wants", "was", "we", "were", "what", "when", "where", "which", "while", "who", "whom", "why", "will", "with", "would", "yet", "you", "your"]), t.Pipeline.registerFunction(t.stopWordFilter, "stopWordFilter"), t.trimmer = function (t) { return t.replace(/^\W+/, "").replace(/\W+$/, "") }, t.Pipeline.registerFunction(t.trimmer, "trimmer"), t.TokenStore = function () { this.root = { docs: {} }, this.length = 0 }, t.TokenStore.load = function (t) { var e = new this; return e.root = t.root, e.length = t.length, e }, t.TokenStore.prototype.add = function (t, e, n) { var n = n || this.root, i = t.charAt(0), r = t.slice(1); return i in n || (n[i] = { docs: {} }), 0 === r.length ? (n[i].docs[e.ref] = e, void (this.length += 1)) : this.add(r, e, n[i]) }, t.TokenStore.prototype.has = function (t) { if (!t) return !1; for (var e = this.root, n = 0; n < t.length; n++) { if (!e[t.charAt(n)]) return !1; e = e[t.charAt(n)] } return !0 }, t.TokenStore.prototype.getNode = function (t) { if (!t) return {}; for (var e = this.root, n = 0; n < t.length; n++) { if (!e[t.charAt(n)]) return {}; e = e[t.charAt(n)] } return e }, t.TokenStore.prototype.get = function (t, e) { return this.getNode(t, e).docs || {} }, t.TokenStore.prototype.count = function (t, e) { return Object.keys(this.get(t, e)).length }, t.TokenStore.prototype.remove = function (t, e) { if (t) { for (var n = this.root, i = 0; i < t.length; i++) { if (!(t.charAt(i) in n)) return; n = n[t.charAt(i)] } delete n.docs[e] } }, t.TokenStore.prototype.expand = function (t, e) { var n = this.getNode(t), i = n.docs || {}, e = e || []; return Object.keys(i).length && e.push(t), Object.keys(n).forEach(function (n) { "docs" !== n && e.concat(this.expand(t + n, e)) }, this), e }, t.TokenStore.prototype.toJSON = function () { return { root: this.root, length: this.length } }, function (t, e) { "function" == typeof define && define.amd ? define(e) : "object" == typeof exports ? module.exports = e() : t.lunr = e() }(this, function () { return t }) }(); + </script> + <script> + /*! + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + + /** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ + ; (function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } + }(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function (lunr) { + /* provides utilities for the included stemmers */ + lunr.stemmerSupport = { + Among: function (s, substring_i, result, method) { + this.toCharArray = function (s) { + var sLength = s.length, charArr = new Array(sLength); + for (var i = 0; i < sLength; i++) + charArr[i] = s.charCodeAt(i); + return charArr; + }; + + if ((!s && s != "") || (!substring_i && (substring_i != 0)) || !result) + throw ("Bad Among initialisation: s:" + s + ", substring_i: " + + substring_i + ", result: " + result); + this.s_size = s.length; + this.s = this.toCharArray(s); + this.substring_i = substring_i; + this.result = result; + this.method = method; + }, + SnowballProgram: function () { + var current; + return { + bra: 0, + ket: 0, + limit: 0, + cursor: 0, + limit_backward: 0, + setCurrent: function (word) { + current = word; + this.cursor = 0; + this.limit = word.length; + this.limit_backward = 0; + this.bra = this.cursor; + this.ket = this.limit; + }, + getCurrent: function () { + var result = current; + current = null; + return result; + }, + in_grouping: function (s, min, max) { + if (this.cursor < this.limit) { + var ch = current.charCodeAt(this.cursor); + if (ch <= max && ch >= min) { + ch -= min; + if (s[ch >> 3] & (0X1 << (ch & 0X7))) { + this.cursor++; + return true; + } + } + } + return false; + }, + in_grouping_b: function (s, min, max) { + if (this.cursor > this.limit_backward) { + var ch = current.charCodeAt(this.cursor - 1); + if (ch <= max && ch >= min) { + ch -= min; + if (s[ch >> 3] & (0X1 << (ch & 0X7))) { + this.cursor--; + return true; + } + } + } + return false; + }, + out_grouping: function (s, min, max) { + if (this.cursor < this.limit) { + var ch = current.charCodeAt(this.cursor); + if (ch > max || ch < min) { + this.cursor++; + return true; + } + ch -= min; + if (!(s[ch >> 3] & (0X1 << (ch & 0X7)))) { + this.cursor++; + return true; + } + } + return false; + }, + out_grouping_b: function (s, min, max) { + if (this.cursor > this.limit_backward) { + var ch = current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) { + this.cursor--; + return true; + } + ch -= min; + if (!(s[ch >> 3] & (0X1 << (ch & 0X7)))) { + this.cursor--; + return true; + } + } + return false; + }, + eq_s: function (s_size, s) { + if (this.limit - this.cursor < s_size) + return false; + for (var i = 0; i < s_size; i++) + if (current.charCodeAt(this.cursor + i) != s.charCodeAt(i)) + return false; + this.cursor += s_size; + return true; + }, + eq_s_b: function (s_size, s) { + if (this.cursor - this.limit_backward < s_size) + return false; + for (var i = 0; i < s_size; i++) + if (current.charCodeAt(this.cursor - s_size + i) != s + .charCodeAt(i)) + return false; + this.cursor -= s_size; + return true; + }, + find_among: function (v, v_size) { + var i = 0, j = v_size, c = this.cursor, l = this.limit, common_i = 0, common_j = 0, first_key_inspected = false; + while (true) { + var k = i + ((j - i) >> 1), diff = 0, common = common_i < common_j + ? common_i + : common_j, w = v[k]; + for (var i2 = common; i2 < w.s_size; i2++) { + if (c + common == l) { + diff = -1; + break; + } + diff = current.charCodeAt(c + common) - w.s[i2]; + if (diff) + break; + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0 || j == i || first_key_inspected) + break; + first_key_inspected = true; + } + } + while (true) { + var w = v[i]; + if (common_i >= w.s_size) { + this.cursor = c + w.s_size; + if (!w.method) + return w.result; + var res = w.method(); + this.cursor = c + w.s_size; + if (res) + return w.result; + } + i = w.substring_i; + if (i < 0) + return 0; + } + }, + find_among_b: function (v, v_size) { + var i = 0, j = v_size, c = this.cursor, lb = this.limit_backward, common_i = 0, common_j = 0, first_key_inspected = false; + while (true) { + var k = i + ((j - i) >> 1), diff = 0, common = common_i < common_j + ? common_i + : common_j, w = v[k]; + for (var i2 = w.s_size - 1 - common; i2 >= 0; i2--) { + if (c - common == lb) { + diff = -1; + break; + } + diff = current.charCodeAt(c - 1 - common) - w.s[i2]; + if (diff) + break; + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0 || j == i || first_key_inspected) + break; + first_key_inspected = true; + } + } + while (true) { + var w = v[i]; + if (common_i >= w.s_size) { + this.cursor = c - w.s_size; + if (!w.method) + return w.result; + var res = w.method(); + this.cursor = c - w.s_size; + if (res) + return w.result; + } + i = w.substring_i; + if (i < 0) + return 0; + } + }, + replace_s: function (c_bra, c_ket, s) { + var adjustment = s.length - (c_ket - c_bra), left = current + .substring(0, c_bra), right = current.substring(c_ket); + current = left + s + right; + this.limit += adjustment; + if (this.cursor >= c_ket) + this.cursor += adjustment; + else if (this.cursor > c_bra) + this.cursor = c_bra; + return adjustment; + }, + slice_check: function () { + if (this.bra < 0 || this.bra > this.ket || this.ket > this.limit + || this.limit > current.length) + throw ("faulty slice operation"); + }, + slice_from: function (s) { + this.slice_check(); + this.replace_s(this.bra, this.ket, s); + }, + slice_del: function () { + this.slice_from(""); + }, + insert: function (c_bra, c_ket, s) { + var adjustment = this.replace_s(c_bra, c_ket, s); + if (c_bra <= this.bra) + this.bra += adjustment; + if (c_bra <= this.ket) + this.ket += adjustment; + }, + slice_to: function () { + this.slice_check(); + return current.substring(this.bra, this.ket); + }, + eq_v_b: function (s) { + return this.eq_s_b(s.length, s); + } + }; + } + }; + + lunr.trimmerSupport = { + generateTrimmer: function (wordCharacters) { + var startRegex = new RegExp("^[^" + wordCharacters + "]+") + var endRegex = new RegExp("[^" + wordCharacters + "]+$") + + return function (token) { + // for lunr version 2 + if (typeof token.update === "function") { + return token.update(function (s) { + return s + .replace(startRegex, '') + .replace(endRegex, ''); + }) + } else { // for lunr version 1 + return token + .replace(startRegex, '') + .replace(endRegex, ''); + } + }; + } + } + } + })); + +</script> + <script> + /*! + * Lunr languages, `Chinese` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2019, Felix Lian (repairearth) + * http://www.mozilla.org/MPL/ + */ + /*! + * based on + * Snowball zhvaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + + /** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ + ; + (function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + // module.exports = factory(require('@node-rs/jieba')) + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } + }(this, function (Segment) { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + return function (lunr) { + /* throw error if lunr is not yet included */ + if ('undefined' === typeof lunr) { + throw new Error('Lunr is not present. Please include / require Lunr before this script.'); + } + + /* throw error if lunr stemmer support is not yet included */ + if ('undefined' === typeof lunr.stemmerSupport) { + throw new Error('Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.'); + } + + /* + Chinese tokenization is trickier, since it does not + take into account spaces. + Since the tokenization function is represented different + internally for each of the Lunr versions, this had to be done + in order to try to try to pick the best way of doing this based + on the Lunr version + */ + var isLunr2 = lunr.version[0] == "2"; + + /* register specific locale function */ + lunr.zh = function () { + this.pipeline.reset(); + this.pipeline.add( + lunr.zh.trimmer, + lunr.zh.stopWordFilter, + lunr.zh.stemmer + ); + + // change the tokenizer for Chinese one + if (isLunr2) { // for lunr version 2.0.0 + this.tokenizer = lunr.zh.tokenizer; + } else { + if (lunr.tokenizer) { // for lunr version 0.6.0 + lunr.tokenizer = lunr.zh.tokenizer; + } + if (this.tokenizerFn) { // for lunr version 0.7.0 -> 1.0.0 + this.tokenizerFn = lunr.zh.tokenizer; + } + } + }; + + lunr.zh.tokenizer = function (obj) { + if (!arguments.length || obj == null || obj == undefined) return [] + if (Array.isArray(obj)) return obj.map(function (t) { + return isLunr2 ? new lunr.Token(t.toLowerCase()) : t.toLowerCase() + }) + + var tokens = []; + try { + var segmenter = new Intl.Segmenter('zh', { granularity: 'word' }); + var str = obj.toString().trim().toLowerCase(); + var segments = segmenter.segment(str) + for (seg of segments) { + if (seg.isWordLike) { tokens = tokens.concat(seg.segment) } + } + } catch (error) { + console.error(error); + } + + tokens = tokens.filter(function (token) { + return !!token; + }); + + var fromIndex = 0 + + return tokens.map(function (token, index) { + if (isLunr2) { + var start = str.indexOf(token, fromIndex) + + var tokenMetadata = {} + tokenMetadata["position"] = [start, token.length] + tokenMetadata["index"] = index + + fromIndex = start + + return new lunr.Token(token, tokenMetadata); + } else { + return token + } + }); + } + + /* lunr trimmer function */ + lunr.zh.wordCharacters = "\\w\u4e00-\u9fa5"; + lunr.zh.trimmer = lunr.trimmerSupport.generateTrimmer(lunr.zh.wordCharacters); + lunr.Pipeline.registerFunction(lunr.zh.trimmer, 'trimmer-zh'); + + /* lunr stemmer function */ + lunr.zh.stemmer = (function () { + + /* TODO Chinese stemmer */ + return function (word) { + return word; + } + })(); + lunr.Pipeline.registerFunction(lunr.zh.stemmer, 'stemmer-zh'); + + /* lunr stop word filter. see https://www.ranks.nl/stopwords/chinese-stopwords */ + lunr.zh.stopWordFilter = lunr.generateStopWordFilter( + '的 一 不 在 人 有 是 为 以 于 上 他 而 后 之 来 及 了 因 下 可 到 由 这 与 也 此 但 并 个 其 已 无 小 我 们 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 从 到 得 打 凡 儿 尔 该 各 给 跟 和 何 还 即 几 既 看 据 距 靠 啦 了 另 么 每 们 嘛 拿 哪 那 您 凭 且 却 让 仍 啥 如 若 使 谁 虽 随 同 所 她 哇 嗡 往 哪 些 向 沿 哟 用 于 咱 则 怎 曾 至 致 着 诸 自'.split(' ')); + lunr.Pipeline.registerFunction(lunr.zh.stopWordFilter, 'stopWordFilter-zh'); + }; + })) + </script> + + <script> + !function (n) { "use strict"; function t(n, t) { var r = (65535 & n) + (65535 & t); return (n >> 16) + (t >> 16) + (r >> 16) << 16 | 65535 & r } function r(n, t) { return n << t | n >>> 32 - t } function e(n, e, o, u, c, f) { return t(r(t(t(e, n), t(u, f)), c), o) } function o(n, t, r, o, u, c, f) { return e(t & r | ~t & o, n, t, u, c, f) } function u(n, t, r, o, u, c, f) { return e(t & o | r & ~o, n, t, u, c, f) } function c(n, t, r, o, u, c, f) { return e(t ^ r ^ o, n, t, u, c, f) } function f(n, t, r, o, u, c, f) { return e(r ^ (t | ~o), n, t, u, c, f) } function i(n, r) { n[r >> 5] |= 128 << r % 32, n[14 + (r + 64 >>> 9 << 4)] = r; var e, i, a, d, h, l = 1732584193, g = -271733879, v = -1732584194, m = 271733878; for (e = 0; e < n.length; e += 16)i = l, a = g, d = v, h = m, g = f(g = f(g = f(g = f(g = c(g = c(g = c(g = c(g = u(g = u(g = u(g = u(g = o(g = o(g = o(g = o(g, v = o(v, m = o(m, l = o(l, g, v, m, n[e], 7, -680876936), g, v, n[e + 1], 12, -389564586), l, g, n[e + 2], 17, 606105819), m, l, n[e + 3], 22, -1044525330), v = o(v, m = o(m, l = o(l, g, v, m, n[e + 4], 7, -176418897), g, v, n[e + 5], 12, 1200080426), l, g, n[e + 6], 17, -1473231341), m, l, n[e + 7], 22, -45705983), v = o(v, m = o(m, l = o(l, g, v, m, n[e + 8], 7, 1770035416), g, v, n[e + 9], 12, -1958414417), l, g, n[e + 10], 17, -42063), m, l, n[e + 11], 22, -1990404162), v = o(v, m = o(m, l = o(l, g, v, m, n[e + 12], 7, 1804603682), g, v, n[e + 13], 12, -40341101), l, g, n[e + 14], 17, -1502002290), m, l, n[e + 15], 22, 1236535329), v = u(v, m = u(m, l = u(l, g, v, m, n[e + 1], 5, -165796510), g, v, n[e + 6], 9, -1069501632), l, g, n[e + 11], 14, 643717713), m, l, n[e], 20, -373897302), v = u(v, m = u(m, l = u(l, g, v, m, n[e + 5], 5, -701558691), g, v, n[e + 10], 9, 38016083), l, g, n[e + 15], 14, -660478335), m, l, n[e + 4], 20, -405537848), v = u(v, m = u(m, l = u(l, g, v, m, n[e + 9], 5, 568446438), g, v, n[e + 14], 9, -1019803690), l, g, n[e + 3], 14, -187363961), m, l, n[e + 8], 20, 1163531501), v = u(v, m = u(m, l = u(l, g, v, m, n[e + 13], 5, -1444681467), g, v, n[e + 2], 9, -51403784), l, g, n[e + 7], 14, 1735328473), m, l, n[e + 12], 20, -1926607734), v = c(v, m = c(m, l = c(l, g, v, m, n[e + 5], 4, -378558), g, v, n[e + 8], 11, -2022574463), l, g, n[e + 11], 16, 1839030562), m, l, n[e + 14], 23, -35309556), v = c(v, m = c(m, l = c(l, g, v, m, n[e + 1], 4, -1530992060), g, v, n[e + 4], 11, 1272893353), l, g, n[e + 7], 16, -155497632), m, l, n[e + 10], 23, -1094730640), v = c(v, m = c(m, l = c(l, g, v, m, n[e + 13], 4, 681279174), g, v, n[e], 11, -358537222), l, g, n[e + 3], 16, -722521979), m, l, n[e + 6], 23, 76029189), v = c(v, m = c(m, l = c(l, g, v, m, n[e + 9], 4, -640364487), g, v, n[e + 12], 11, -421815835), l, g, n[e + 15], 16, 530742520), m, l, n[e + 2], 23, -995338651), v = f(v, m = f(m, l = f(l, g, v, m, n[e], 6, -198630844), g, v, n[e + 7], 10, 1126891415), l, g, n[e + 14], 15, -1416354905), m, l, n[e + 5], 21, -57434055), v = f(v, m = f(m, l = f(l, g, v, m, n[e + 12], 6, 1700485571), g, v, n[e + 3], 10, -1894986606), l, g, n[e + 10], 15, -1051523), m, l, n[e + 1], 21, -2054922799), v = f(v, m = f(m, l = f(l, g, v, m, n[e + 8], 6, 1873313359), g, v, n[e + 15], 10, -30611744), l, g, n[e + 6], 15, -1560198380), m, l, n[e + 13], 21, 1309151649), v = f(v, m = f(m, l = f(l, g, v, m, n[e + 4], 6, -145523070), g, v, n[e + 11], 10, -1120210379), l, g, n[e + 2], 15, 718787259), m, l, n[e + 9], 21, -343485551), l = t(l, i), g = t(g, a), v = t(v, d), m = t(m, h); return [l, g, v, m] } function a(n) { var t, r = "", e = 32 * n.length; for (t = 0; t < e; t += 8)r += String.fromCharCode(n[t >> 5] >>> t % 32 & 255); return r } function d(n) { var t, r = []; for (r[(n.length >> 2) - 1] = void 0, t = 0; t < r.length; t += 1)r[t] = 0; var e = 8 * n.length; for (t = 0; t < e; t += 8)r[t >> 5] |= (255 & n.charCodeAt(t / 8)) << t % 32; return r } function h(n) { return a(i(d(n), 8 * n.length)) } function l(n, t) { var r, e, o = d(n), u = [], c = []; for (u[15] = c[15] = void 0, o.length > 16 && (o = i(o, 8 * n.length)), r = 0; r < 16; r += 1)u[r] = 909522486 ^ o[r], c[r] = 1549556828 ^ o[r]; return e = i(u.concat(d(t)), 512 + 8 * t.length), a(i(c.concat(e), 640)) } function g(n) { var t, r, e = ""; for (r = 0; r < n.length; r += 1)t = n.charCodeAt(r), e += "0123456789abcdef".charAt(t >>> 4 & 15) + "0123456789abcdef".charAt(15 & t); return e } function v(n) { return unescape(encodeURIComponent(n)) } function m(n) { return h(v(n)) } function p(n) { return g(m(n)) } function s(n, t) { return l(v(n), v(t)) } function C(n, t) { return g(s(n, t)) } function A(n, t, r) { return t ? r ? s(t, n) : C(t, n) : r ? m(n) : p(n) } "function" == typeof define && define.amd ? define(function () { return A }) : "object" == typeof module && module.exports ? module.exports = A : n.md5 = A }(this); + </script> + <script> + /* flatpickr v4.6.13,, @license MIT */ + !function (e, n) { "object" == typeof exports && "undefined" != typeof module ? module.exports = n() : "function" == typeof define && define.amd ? define(n) : (e = "undefined" != typeof globalThis ? globalThis : e || self).flatpickr = n() }(this, (function () { "use strict"; var e = function () { return (e = Object.assign || function (e) { for (var n, t = 1, a = arguments.length; t < a; t++)for (var i in n = arguments[t]) Object.prototype.hasOwnProperty.call(n, i) && (e[i] = n[i]); return e }).apply(this, arguments) }; function n() { for (var e = 0, n = 0, t = arguments.length; n < t; n++)e += arguments[n].length; var a = Array(e), i = 0; for (n = 0; n < t; n++)for (var o = arguments[n], r = 0, l = o.length; r < l; r++, i++)a[i] = o[r]; return a } var t = ["onChange", "onClose", "onDayCreate", "onDestroy", "onKeyDown", "onMonthChange", "onOpen", "onParseConfig", "onReady", "onValueUpdate", "onYearChange", "onPreCalendarPosition"], a = { _disable: [], allowInput: !1, allowInvalidPreload: !1, altFormat: "F j, Y", altInput: !1, altInputClass: "form-control input", animate: "object" == typeof window && -1 === window.navigator.userAgent.indexOf("MSIE"), ariaDateFormat: "F j, Y", autoFillDefaultTime: !0, clickOpens: !0, closeOnSelect: !0, conjunction: ", ", dateFormat: "Y-m-d", defaultHour: 12, defaultMinute: 0, defaultSeconds: 0, disable: [], disableMobile: !1, enableSeconds: !1, enableTime: !1, errorHandler: function (e) { return "undefined" != typeof console && console.warn(e) }, getWeek: function (e) { var n = new Date(e.getTime()); n.setHours(0, 0, 0, 0), n.setDate(n.getDate() + 3 - (n.getDay() + 6) % 7); var t = new Date(n.getFullYear(), 0, 4); return 1 + Math.round(((n.getTime() - t.getTime()) / 864e5 - 3 + (t.getDay() + 6) % 7) / 7) }, hourIncrement: 1, ignoredFocusElements: [], inline: !1, locale: "default", minuteIncrement: 5, mode: "single", monthSelectorType: "dropdown", nextArrow: "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>", noCalendar: !1, now: new Date, onChange: [], onClose: [], onDayCreate: [], onDestroy: [], onKeyDown: [], onMonthChange: [], onOpen: [], onParseConfig: [], onReady: [], onValueUpdate: [], onYearChange: [], onPreCalendarPosition: [], plugins: [], position: "auto", positionElement: void 0, prevArrow: "<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>", shorthandCurrentMonth: !1, showMonths: 1, static: !1, time_24hr: !1, weekNumbers: !1, wrap: !1 }, i = { weekdays: { shorthand: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], longhand: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] }, months: { shorthand: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], longhand: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] }, daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], firstDayOfWeek: 0, ordinal: function (e) { var n = e % 100; if (n > 3 && n < 21) return "th"; switch (n % 10) { case 1: return "st"; case 2: return "nd"; case 3: return "rd"; default: return "th" } }, rangeSeparator: " to ", weekAbbreviation: "Wk", scrollTitle: "Scroll to increment", toggleTitle: "Click to toggle", amPM: ["AM", "PM"], yearAriaLabel: "Year", monthAriaLabel: "Month", hourAriaLabel: "Hour", minuteAriaLabel: "Minute", time_24hr: !1 }, o = function (e, n) { return void 0 === n && (n = 2), ("000" + e).slice(-1 * n) }, r = function (e) { return !0 === e ? 1 : 0 }; function l(e, n) { var t; return function () { var a = this, i = arguments; clearTimeout(t), t = setTimeout((function () { return e.apply(a, i) }), n) } } var c = function (e) { return e instanceof Array ? e : [e] }; function s(e, n, t) { if (!0 === t) return e.classList.add(n); e.classList.remove(n) } function d(e, n, t) { var a = window.document.createElement(e); return n = n || "", t = t || "", a.className = n, void 0 !== t && (a.textContent = t), a } function u(e) { for (; e.firstChild;)e.removeChild(e.firstChild) } function f(e, n) { return n(e) ? e : e.parentNode ? f(e.parentNode, n) : void 0 } function m(e, n) { var t = d("div", "numInputWrapper"), a = d("input", "numInput " + e), i = d("span", "arrowUp"), o = d("span", "arrowDown"); if (-1 === navigator.userAgent.indexOf("MSIE 9.0") ? a.type = "number" : (a.type = "text", a.pattern = "\\d*"), void 0 !== n) for (var r in n) a.setAttribute(r, n[r]); return t.appendChild(a), t.appendChild(i), t.appendChild(o), t } function g(e) { try { return "function" == typeof e.composedPath ? e.composedPath()[0] : e.target } catch (n) { return e.target } } var p = function () { }, h = function (e, n, t) { return t.months[n ? "shorthand" : "longhand"][e] }, v = { D: p, F: function (e, n, t) { e.setMonth(t.months.longhand.indexOf(n)) }, G: function (e, n) { e.setHours((e.getHours() >= 12 ? 12 : 0) + parseFloat(n)) }, H: function (e, n) { e.setHours(parseFloat(n)) }, J: function (e, n) { e.setDate(parseFloat(n)) }, K: function (e, n, t) { e.setHours(e.getHours() % 12 + 12 * r(new RegExp(t.amPM[1], "i").test(n))) }, M: function (e, n, t) { e.setMonth(t.months.shorthand.indexOf(n)) }, S: function (e, n) { e.setSeconds(parseFloat(n)) }, U: function (e, n) { return new Date(1e3 * parseFloat(n)) }, W: function (e, n, t) { var a = parseInt(n), i = new Date(e.getFullYear(), 0, 2 + 7 * (a - 1), 0, 0, 0, 0); return i.setDate(i.getDate() - i.getDay() + t.firstDayOfWeek), i }, Y: function (e, n) { e.setFullYear(parseFloat(n)) }, Z: function (e, n) { return new Date(n) }, d: function (e, n) { e.setDate(parseFloat(n)) }, h: function (e, n) { e.setHours((e.getHours() >= 12 ? 12 : 0) + parseFloat(n)) }, i: function (e, n) { e.setMinutes(parseFloat(n)) }, j: function (e, n) { e.setDate(parseFloat(n)) }, l: p, m: function (e, n) { e.setMonth(parseFloat(n) - 1) }, n: function (e, n) { e.setMonth(parseFloat(n) - 1) }, s: function (e, n) { e.setSeconds(parseFloat(n)) }, u: function (e, n) { return new Date(parseFloat(n)) }, w: p, y: function (e, n) { e.setFullYear(2e3 + parseFloat(n)) } }, D = { D: "", F: "", G: "(\\d\\d|\\d)", H: "(\\d\\d|\\d)", J: "(\\d\\d|\\d)\\w+", K: "", M: "", S: "(\\d\\d|\\d)", U: "(.+)", W: "(\\d\\d|\\d)", Y: "(\\d{4})", Z: "(.+)", d: "(\\d\\d|\\d)", h: "(\\d\\d|\\d)", i: "(\\d\\d|\\d)", j: "(\\d\\d|\\d)", l: "", m: "(\\d\\d|\\d)", n: "(\\d\\d|\\d)", s: "(\\d\\d|\\d)", u: "(.+)", w: "(\\d\\d|\\d)", y: "(\\d{2})" }, w = { Z: function (e) { return e.toISOString() }, D: function (e, n, t) { return n.weekdays.shorthand[w.w(e, n, t)] }, F: function (e, n, t) { return h(w.n(e, n, t) - 1, !1, n) }, G: function (e, n, t) { return o(w.h(e, n, t)) }, H: function (e) { return o(e.getHours()) }, J: function (e, n) { return void 0 !== n.ordinal ? e.getDate() + n.ordinal(e.getDate()) : e.getDate() }, K: function (e, n) { return n.amPM[r(e.getHours() > 11)] }, M: function (e, n) { return h(e.getMonth(), !0, n) }, S: function (e) { return o(e.getSeconds()) }, U: function (e) { return e.getTime() / 1e3 }, W: function (e, n, t) { return t.getWeek(e) }, Y: function (e) { return o(e.getFullYear(), 4) }, d: function (e) { return o(e.getDate()) }, h: function (e) { return e.getHours() % 12 ? e.getHours() % 12 : 12 }, i: function (e) { return o(e.getMinutes()) }, j: function (e) { return e.getDate() }, l: function (e, n) { return n.weekdays.longhand[e.getDay()] }, m: function (e) { return o(e.getMonth() + 1) }, n: function (e) { return e.getMonth() + 1 }, s: function (e) { return e.getSeconds() }, u: function (e) { return e.getTime() }, w: function (e) { return e.getDay() }, y: function (e) { return String(e.getFullYear()).substring(2) } }, b = function (e) { var n = e.config, t = void 0 === n ? a : n, o = e.l10n, r = void 0 === o ? i : o, l = e.isMobile, c = void 0 !== l && l; return function (e, n, a) { var i = a || r; return void 0 === t.formatDate || c ? n.split("").map((function (n, a, o) { return w[n] && "\\" !== o[a - 1] ? w[n](e, i, t) : "\\" !== n ? n : "" })).join("") : t.formatDate(e, n, i) } }, C = function (e) { var n = e.config, t = void 0 === n ? a : n, o = e.l10n, r = void 0 === o ? i : o; return function (e, n, i, o) { if (0 === e || e) { var l, c = o || r, s = e; if (e instanceof Date) l = new Date(e.getTime()); else if ("string" != typeof e && void 0 !== e.toFixed) l = new Date(e); else if ("string" == typeof e) { var d = n || (t || a).dateFormat, u = String(e).trim(); if ("today" === u) l = new Date, i = !0; else if (t && t.parseDate) l = t.parseDate(e, d); else if (/Z$/.test(u) || /GMT$/.test(u)) l = new Date(e); else { for (var f = void 0, m = [], g = 0, p = 0, h = ""; g < d.length; g++) { var w = d[g], b = "\\" === w, C = "\\" === d[g - 1] || b; if (D[w] && !C) { h += D[w]; var M = new RegExp(h).exec(e); M && (f = !0) && m["Y" !== w ? "push" : "unshift"]({ fn: v[w], val: M[++p] }) } else b || (h += ".") } l = t && t.noCalendar ? new Date((new Date).setHours(0, 0, 0, 0)) : new Date((new Date).getFullYear(), 0, 1, 0, 0, 0, 0), m.forEach((function (e) { var n = e.fn, t = e.val; return l = n(l, t, c) || l })), l = f ? l : void 0 } } if (l instanceof Date && !isNaN(l.getTime())) return !0 === i && l.setHours(0, 0, 0, 0), l; t.errorHandler(new Error("Invalid date provided: " + s)) } } }; function M(e, n, t) { return void 0 === t && (t = !0), !1 !== t ? new Date(e.getTime()).setHours(0, 0, 0, 0) - new Date(n.getTime()).setHours(0, 0, 0, 0) : e.getTime() - n.getTime() } var y = function (e, n, t) { return 3600 * e + 60 * n + t }, x = 864e5; function E(e) { var n = e.defaultHour, t = e.defaultMinute, a = e.defaultSeconds; if (void 0 !== e.minDate) { var i = e.minDate.getHours(), o = e.minDate.getMinutes(), r = e.minDate.getSeconds(); n < i && (n = i), n === i && t < o && (t = o), n === i && t === o && a < r && (a = e.minDate.getSeconds()) } if (void 0 !== e.maxDate) { var l = e.maxDate.getHours(), c = e.maxDate.getMinutes(); (n = Math.min(n, l)) === l && (t = Math.min(c, t)), n === l && t === c && (a = e.maxDate.getSeconds()) } return { hours: n, minutes: t, seconds: a } } "function" != typeof Object.assign && (Object.assign = function (e) { for (var n = [], t = 1; t < arguments.length; t++)n[t - 1] = arguments[t]; if (!e) throw TypeError("Cannot convert undefined or null to object"); for (var a = function (n) { n && Object.keys(n).forEach((function (t) { return e[t] = n[t] })) }, i = 0, o = n; i < o.length; i++) { var r = o[i]; a(r) } return e }); function k(p, v) { var w = { config: e(e({}, a), I.defaultConfig), l10n: i }; function k() { var e; return (null === (e = w.calendarContainer) || void 0 === e ? void 0 : e.getRootNode()).activeElement || document.activeElement } function T(e) { return e.bind(w) } function S() { var e = w.config; !1 === e.weekNumbers && 1 === e.showMonths || !0 !== e.noCalendar && window.requestAnimationFrame((function () { if (void 0 !== w.calendarContainer && (w.calendarContainer.style.visibility = "hidden", w.calendarContainer.style.display = "block"), void 0 !== w.daysContainer) { var n = (w.days.offsetWidth + 1) * e.showMonths; w.daysContainer.style.width = n + "px", w.calendarContainer.style.width = n + (void 0 !== w.weekWrapper ? w.weekWrapper.offsetWidth : 0) + "px", w.calendarContainer.style.removeProperty("visibility"), w.calendarContainer.style.removeProperty("display") } })) } function _(e) { if (0 === w.selectedDates.length) { var n = void 0 === w.config.minDate || M(new Date, w.config.minDate) >= 0 ? new Date : new Date(w.config.minDate.getTime()), t = E(w.config); n.setHours(t.hours, t.minutes, t.seconds, n.getMilliseconds()), w.selectedDates = [n], w.latestSelectedDateObj = n } void 0 !== e && "blur" !== e.type && function (e) { e.preventDefault(); var n = "keydown" === e.type, t = g(e), a = t; void 0 !== w.amPM && t === w.amPM && (w.amPM.textContent = w.l10n.amPM[r(w.amPM.textContent === w.l10n.amPM[0])]); var i = parseFloat(a.getAttribute("min")), l = parseFloat(a.getAttribute("max")), c = parseFloat(a.getAttribute("step")), s = parseInt(a.value, 10), d = e.delta || (n ? 38 === e.which ? 1 : -1 : 0), u = s + c * d; if (void 0 !== a.value && 2 === a.value.length) { var f = a === w.hourElement, m = a === w.minuteElement; u < i ? (u = l + u + r(!f) + (r(f) && r(!w.amPM)), m && L(void 0, -1, w.hourElement)) : u > l && (u = a === w.hourElement ? u - l - r(!w.amPM) : i, m && L(void 0, 1, w.hourElement)), w.amPM && f && (1 === c ? u + s === 23 : Math.abs(u - s) > c) && (w.amPM.textContent = w.l10n.amPM[r(w.amPM.textContent === w.l10n.amPM[0])]), a.value = o(u) } }(e); var a = w._input.value; O(), ye(), w._input.value !== a && w._debouncedChange() } function O() { if (void 0 !== w.hourElement && void 0 !== w.minuteElement) { var e, n, t = (parseInt(w.hourElement.value.slice(-2), 10) || 0) % 24, a = (parseInt(w.minuteElement.value, 10) || 0) % 60, i = void 0 !== w.secondElement ? (parseInt(w.secondElement.value, 10) || 0) % 60 : 0; void 0 !== w.amPM && (e = t, n = w.amPM.textContent, t = e % 12 + 12 * r(n === w.l10n.amPM[1])); var o = void 0 !== w.config.minTime || w.config.minDate && w.minDateHasTime && w.latestSelectedDateObj && 0 === M(w.latestSelectedDateObj, w.config.minDate, !0), l = void 0 !== w.config.maxTime || w.config.maxDate && w.maxDateHasTime && w.latestSelectedDateObj && 0 === M(w.latestSelectedDateObj, w.config.maxDate, !0); if (void 0 !== w.config.maxTime && void 0 !== w.config.minTime && w.config.minTime > w.config.maxTime) { var c = y(w.config.minTime.getHours(), w.config.minTime.getMinutes(), w.config.minTime.getSeconds()), s = y(w.config.maxTime.getHours(), w.config.maxTime.getMinutes(), w.config.maxTime.getSeconds()), d = y(t, a, i); if (d > s && d < c) { var u = function (e) { var n = Math.floor(e / 3600), t = (e - 3600 * n) / 60; return [n, t, e - 3600 * n - 60 * t] }(c); t = u[0], a = u[1], i = u[2] } } else { if (l) { var f = void 0 !== w.config.maxTime ? w.config.maxTime : w.config.maxDate; (t = Math.min(t, f.getHours())) === f.getHours() && (a = Math.min(a, f.getMinutes())), a === f.getMinutes() && (i = Math.min(i, f.getSeconds())) } if (o) { var m = void 0 !== w.config.minTime ? w.config.minTime : w.config.minDate; (t = Math.max(t, m.getHours())) === m.getHours() && a < m.getMinutes() && (a = m.getMinutes()), a === m.getMinutes() && (i = Math.max(i, m.getSeconds())) } } A(t, a, i) } } function F(e) { var n = e || w.latestSelectedDateObj; n && n instanceof Date && A(n.getHours(), n.getMinutes(), n.getSeconds()) } function A(e, n, t) { void 0 !== w.latestSelectedDateObj && w.latestSelectedDateObj.setHours(e % 24, n, t || 0, 0), w.hourElement && w.minuteElement && !w.isMobile && (w.hourElement.value = o(w.config.time_24hr ? e : (12 + e) % 12 + 12 * r(e % 12 == 0)), w.minuteElement.value = o(n), void 0 !== w.amPM && (w.amPM.textContent = w.l10n.amPM[r(e >= 12)]), void 0 !== w.secondElement && (w.secondElement.value = o(t))) } function N(e) { var n = g(e), t = parseInt(n.value) + (e.delta || 0); (t / 1e3 > 1 || "Enter" === e.key && !/[^\d]/.test(t.toString())) && ee(t) } function P(e, n, t, a) { return n instanceof Array ? n.forEach((function (n) { return P(e, n, t, a) })) : e instanceof Array ? e.forEach((function (e) { return P(e, n, t, a) })) : (e.addEventListener(n, t, a), void w._handlers.push({ remove: function () { return e.removeEventListener(n, t, a) } })) } function Y() { De("onChange") } function j(e, n) { var t = void 0 !== e ? w.parseDate(e) : w.latestSelectedDateObj || (w.config.minDate && w.config.minDate > w.now ? w.config.minDate : w.config.maxDate && w.config.maxDate < w.now ? w.config.maxDate : w.now), a = w.currentYear, i = w.currentMonth; try { void 0 !== t && (w.currentYear = t.getFullYear(), w.currentMonth = t.getMonth()) } catch (e) { e.message = "Invalid date supplied: " + t, w.config.errorHandler(e) } n && w.currentYear !== a && (De("onYearChange"), q()), !n || w.currentYear === a && w.currentMonth === i || De("onMonthChange"), w.redraw() } function H(e) { var n = g(e); ~n.className.indexOf("arrow") && L(e, n.classList.contains("arrowUp") ? 1 : -1) } function L(e, n, t) { var a = e && g(e), i = t || a && a.parentNode && a.parentNode.firstChild, o = we("increment"); o.delta = n, i && i.dispatchEvent(o) } function R(e, n, t, a) { var i = ne(n, !0), o = d("span", e, n.getDate().toString()); return o.dateObj = n, o.$i = a, o.setAttribute("aria-label", w.formatDate(n, w.config.ariaDateFormat)), -1 === e.indexOf("hidden") && 0 === M(n, w.now) && (w.todayDateElem = o, o.classList.add("today"), o.setAttribute("aria-current", "date")), i ? (o.tabIndex = -1, be(n) && (o.classList.add("selected"), w.selectedDateElem = o, "range" === w.config.mode && (s(o, "startRange", w.selectedDates[0] && 0 === M(n, w.selectedDates[0], !0)), s(o, "endRange", w.selectedDates[1] && 0 === M(n, w.selectedDates[1], !0)), "nextMonthDay" === e && o.classList.add("inRange")))) : o.classList.add("flatpickr-disabled"), "range" === w.config.mode && function (e) { return !("range" !== w.config.mode || w.selectedDates.length < 2) && (M(e, w.selectedDates[0]) >= 0 && M(e, w.selectedDates[1]) <= 0) }(n) && !be(n) && o.classList.add("inRange"), w.weekNumbers && 1 === w.config.showMonths && "prevMonthDay" !== e && a % 7 == 6 && w.weekNumbers.insertAdjacentHTML("beforeend", "<span class='flatpickr-day'>" + w.config.getWeek(n) + "</span>"), De("onDayCreate", o), o } function W(e) { e.focus(), "range" === w.config.mode && oe(e) } function B(e) { for (var n = e > 0 ? 0 : w.config.showMonths - 1, t = e > 0 ? w.config.showMonths : -1, a = n; a != t; a += e)for (var i = w.daysContainer.children[a], o = e > 0 ? 0 : i.children.length - 1, r = e > 0 ? i.children.length : -1, l = o; l != r; l += e) { var c = i.children[l]; if (-1 === c.className.indexOf("hidden") && ne(c.dateObj)) return c } } function J(e, n) { var t = k(), a = te(t || document.body), i = void 0 !== e ? e : a ? t : void 0 !== w.selectedDateElem && te(w.selectedDateElem) ? w.selectedDateElem : void 0 !== w.todayDateElem && te(w.todayDateElem) ? w.todayDateElem : B(n > 0 ? 1 : -1); void 0 === i ? w._input.focus() : a ? function (e, n) { for (var t = -1 === e.className.indexOf("Month") ? e.dateObj.getMonth() : w.currentMonth, a = n > 0 ? w.config.showMonths : -1, i = n > 0 ? 1 : -1, o = t - w.currentMonth; o != a; o += i)for (var r = w.daysContainer.children[o], l = t - w.currentMonth === o ? e.$i + n : n < 0 ? r.children.length - 1 : 0, c = r.children.length, s = l; s >= 0 && s < c && s != (n > 0 ? c : -1); s += i) { var d = r.children[s]; if (-1 === d.className.indexOf("hidden") && ne(d.dateObj) && Math.abs(e.$i - s) >= Math.abs(n)) return W(d) } w.changeMonth(i), J(B(i), 0) }(i, n) : W(i) } function K(e, n) { for (var t = (new Date(e, n, 1).getDay() - w.l10n.firstDayOfWeek + 7) % 7, a = w.utils.getDaysInMonth((n - 1 + 12) % 12, e), i = w.utils.getDaysInMonth(n, e), o = window.document.createDocumentFragment(), r = w.config.showMonths > 1, l = r ? "prevMonthDay hidden" : "prevMonthDay", c = r ? "nextMonthDay hidden" : "nextMonthDay", s = a + 1 - t, u = 0; s <= a; s++, u++)o.appendChild(R("flatpickr-day " + l, new Date(e, n - 1, s), 0, u)); for (s = 1; s <= i; s++, u++)o.appendChild(R("flatpickr-day", new Date(e, n, s), 0, u)); for (var f = i + 1; f <= 42 - t && (1 === w.config.showMonths || u % 7 != 0); f++, u++)o.appendChild(R("flatpickr-day " + c, new Date(e, n + 1, f % i), 0, u)); var m = d("div", "dayContainer"); return m.appendChild(o), m } function U() { if (void 0 !== w.daysContainer) { u(w.daysContainer), w.weekNumbers && u(w.weekNumbers); for (var e = document.createDocumentFragment(), n = 0; n < w.config.showMonths; n++) { var t = new Date(w.currentYear, w.currentMonth, 1); t.setMonth(w.currentMonth + n), e.appendChild(K(t.getFullYear(), t.getMonth())) } w.daysContainer.appendChild(e), w.days = w.daysContainer.firstChild, "range" === w.config.mode && 1 === w.selectedDates.length && oe() } } function q() { if (!(w.config.showMonths > 1 || "dropdown" !== w.config.monthSelectorType)) { var e = function (e) { return !(void 0 !== w.config.minDate && w.currentYear === w.config.minDate.getFullYear() && e < w.config.minDate.getMonth()) && !(void 0 !== w.config.maxDate && w.currentYear === w.config.maxDate.getFullYear() && e > w.config.maxDate.getMonth()) }; w.monthsDropdownContainer.tabIndex = -1, w.monthsDropdownContainer.innerHTML = ""; for (var n = 0; n < 12; n++)if (e(n)) { var t = d("option", "flatpickr-monthDropdown-month"); t.value = new Date(w.currentYear, n).getMonth().toString(), t.textContent = h(n, w.config.shorthandCurrentMonth, w.l10n), t.tabIndex = -1, w.currentMonth === n && (t.selected = !0), w.monthsDropdownContainer.appendChild(t) } } } function $() { var e, n = d("div", "flatpickr-month"), t = window.document.createDocumentFragment(); w.config.showMonths > 1 || "static" === w.config.monthSelectorType ? e = d("span", "cur-month") : (w.monthsDropdownContainer = d("select", "flatpickr-monthDropdown-months"), w.monthsDropdownContainer.setAttribute("aria-label", w.l10n.monthAriaLabel), P(w.monthsDropdownContainer, "change", (function (e) { var n = g(e), t = parseInt(n.value, 10); w.changeMonth(t - w.currentMonth), De("onMonthChange") })), q(), e = w.monthsDropdownContainer); var a = m("cur-year", { tabindex: "-1" }), i = a.getElementsByTagName("input")[0]; i.setAttribute("aria-label", w.l10n.yearAriaLabel), w.config.minDate && i.setAttribute("min", w.config.minDate.getFullYear().toString()), w.config.maxDate && (i.setAttribute("max", w.config.maxDate.getFullYear().toString()), i.disabled = !!w.config.minDate && w.config.minDate.getFullYear() === w.config.maxDate.getFullYear()); var o = d("div", "flatpickr-current-month"); return o.appendChild(e), o.appendChild(a), t.appendChild(o), n.appendChild(t), { container: n, yearElement: i, monthElement: e } } function V() { u(w.monthNav), w.monthNav.appendChild(w.prevMonthNav), w.config.showMonths && (w.yearElements = [], w.monthElements = []); for (var e = w.config.showMonths; e--;) { var n = $(); w.yearElements.push(n.yearElement), w.monthElements.push(n.monthElement), w.monthNav.appendChild(n.container) } w.monthNav.appendChild(w.nextMonthNav) } function z() { w.weekdayContainer ? u(w.weekdayContainer) : w.weekdayContainer = d("div", "flatpickr-weekdays"); for (var e = w.config.showMonths; e--;) { var n = d("div", "flatpickr-weekdaycontainer"); w.weekdayContainer.appendChild(n) } return G(), w.weekdayContainer } function G() { if (w.weekdayContainer) { var e = w.l10n.firstDayOfWeek, t = n(w.l10n.weekdays.shorthand); e > 0 && e < t.length && (t = n(t.splice(e, t.length), t.splice(0, e))); for (var a = w.config.showMonths; a--;)w.weekdayContainer.children[a].innerHTML = "\n <span class='flatpickr-weekday'>\n " + t.join("</span><span class='flatpickr-weekday'>") + "\n </span>\n " } } function Z(e, n) { void 0 === n && (n = !0); var t = n ? e : e - w.currentMonth; t < 0 && !0 === w._hidePrevMonthArrow || t > 0 && !0 === w._hideNextMonthArrow || (w.currentMonth += t, (w.currentMonth < 0 || w.currentMonth > 11) && (w.currentYear += w.currentMonth > 11 ? 1 : -1, w.currentMonth = (w.currentMonth + 12) % 12, De("onYearChange"), q()), U(), De("onMonthChange"), Ce()) } function Q(e) { return w.calendarContainer.contains(e) } function X(e) { if (w.isOpen && !w.config.inline) { var n = g(e), t = Q(n), a = !(n === w.input || n === w.altInput || w.element.contains(n) || e.path && e.path.indexOf && (~e.path.indexOf(w.input) || ~e.path.indexOf(w.altInput))) && !t && !Q(e.relatedTarget), i = !w.config.ignoredFocusElements.some((function (e) { return e.contains(n) })); a && i && (w.config.allowInput && w.setDate(w._input.value, !1, w.config.altInput ? w.config.altFormat : w.config.dateFormat), void 0 !== w.timeContainer && void 0 !== w.minuteElement && void 0 !== w.hourElement && "" !== w.input.value && void 0 !== w.input.value && _(), w.close(), w.config && "range" === w.config.mode && 1 === w.selectedDates.length && w.clear(!1)) } } function ee(e) { if (!(!e || w.config.minDate && e < w.config.minDate.getFullYear() || w.config.maxDate && e > w.config.maxDate.getFullYear())) { var n = e, t = w.currentYear !== n; w.currentYear = n || w.currentYear, w.config.maxDate && w.currentYear === w.config.maxDate.getFullYear() ? w.currentMonth = Math.min(w.config.maxDate.getMonth(), w.currentMonth) : w.config.minDate && w.currentYear === w.config.minDate.getFullYear() && (w.currentMonth = Math.max(w.config.minDate.getMonth(), w.currentMonth)), t && (w.redraw(), De("onYearChange"), q()) } } function ne(e, n) { var t; void 0 === n && (n = !0); var a = w.parseDate(e, void 0, n); if (w.config.minDate && a && M(a, w.config.minDate, void 0 !== n ? n : !w.minDateHasTime) < 0 || w.config.maxDate && a && M(a, w.config.maxDate, void 0 !== n ? n : !w.maxDateHasTime) > 0) return !1; if (!w.config.enable && 0 === w.config.disable.length) return !0; if (void 0 === a) return !1; for (var i = !!w.config.enable, o = null !== (t = w.config.enable) && void 0 !== t ? t : w.config.disable, r = 0, l = void 0; r < o.length; r++) { if ("function" == typeof (l = o[r]) && l(a)) return i; if (l instanceof Date && void 0 !== a && l.getTime() === a.getTime()) return i; if ("string" == typeof l) { var c = w.parseDate(l, void 0, !0); return c && c.getTime() === a.getTime() ? i : !i } if ("object" == typeof l && void 0 !== a && l.from && l.to && a.getTime() >= l.from.getTime() && a.getTime() <= l.to.getTime()) return i } return !i } function te(e) { return void 0 !== w.daysContainer && (-1 === e.className.indexOf("hidden") && -1 === e.className.indexOf("flatpickr-disabled") && w.daysContainer.contains(e)) } function ae(e) { var n = e.target === w._input, t = w._input.value.trimEnd() !== Me(); !n || !t || e.relatedTarget && Q(e.relatedTarget) || w.setDate(w._input.value, !0, e.target === w.altInput ? w.config.altFormat : w.config.dateFormat) } function ie(e) { var n = g(e), t = w.config.wrap ? p.contains(n) : n === w._input, a = w.config.allowInput, i = w.isOpen && (!a || !t), o = w.config.inline && t && !a; if (13 === e.keyCode && t) { if (a) return w.setDate(w._input.value, !0, n === w.altInput ? w.config.altFormat : w.config.dateFormat), w.close(), n.blur(); w.open() } else if (Q(n) || i || o) { var r = !!w.timeContainer && w.timeContainer.contains(n); switch (e.keyCode) { case 13: r ? (e.preventDefault(), _(), fe()) : me(e); break; case 27: e.preventDefault(), fe(); break; case 8: case 46: t && !w.config.allowInput && (e.preventDefault(), w.clear()); break; case 37: case 39: if (r || t) w.hourElement && w.hourElement.focus(); else { e.preventDefault(); var l = k(); if (void 0 !== w.daysContainer && (!1 === a || l && te(l))) { var c = 39 === e.keyCode ? 1 : -1; e.ctrlKey ? (e.stopPropagation(), Z(c), J(B(1), 0)) : J(void 0, c) } } break; case 38: case 40: e.preventDefault(); var s = 40 === e.keyCode ? 1 : -1; w.daysContainer && void 0 !== n.$i || n === w.input || n === w.altInput ? e.ctrlKey ? (e.stopPropagation(), ee(w.currentYear - s), J(B(1), 0)) : r || J(void 0, 7 * s) : n === w.currentYearElement ? ee(w.currentYear - s) : w.config.enableTime && (!r && w.hourElement && w.hourElement.focus(), _(e), w._debouncedChange()); break; case 9: if (r) { var d = [w.hourElement, w.minuteElement, w.secondElement, w.amPM].concat(w.pluginElements).filter((function (e) { return e })), u = d.indexOf(n); if (-1 !== u) { var f = d[u + (e.shiftKey ? -1 : 1)]; e.preventDefault(), (f || w._input).focus() } } else !w.config.noCalendar && w.daysContainer && w.daysContainer.contains(n) && e.shiftKey && (e.preventDefault(), w._input.focus()) } } if (void 0 !== w.amPM && n === w.amPM) switch (e.key) { case w.l10n.amPM[0].charAt(0): case w.l10n.amPM[0].charAt(0).toLowerCase(): w.amPM.textContent = w.l10n.amPM[0], O(), ye(); break; case w.l10n.amPM[1].charAt(0): case w.l10n.amPM[1].charAt(0).toLowerCase(): w.amPM.textContent = w.l10n.amPM[1], O(), ye() }(t || Q(n)) && De("onKeyDown", e) } function oe(e, n) { if (void 0 === n && (n = "flatpickr-day"), 1 === w.selectedDates.length && (!e || e.classList.contains(n) && !e.classList.contains("flatpickr-disabled"))) { for (var t = e ? e.dateObj.getTime() : w.days.firstElementChild.dateObj.getTime(), a = w.parseDate(w.selectedDates[0], void 0, !0).getTime(), i = Math.min(t, w.selectedDates[0].getTime()), o = Math.max(t, w.selectedDates[0].getTime()), r = !1, l = 0, c = 0, s = i; s < o; s += x)ne(new Date(s), !0) || (r = r || s > i && s < o, s < a && (!l || s > l) ? l = s : s > a && (!c || s < c) && (c = s)); Array.from(w.rContainer.querySelectorAll("*:nth-child(-n+" + w.config.showMonths + ") > ." + n)).forEach((function (n) { var i, o, s, d = n.dateObj.getTime(), u = l > 0 && d < l || c > 0 && d > c; if (u) return n.classList.add("notAllowed"), void ["inRange", "startRange", "endRange"].forEach((function (e) { n.classList.remove(e) })); r && !u || (["startRange", "inRange", "endRange", "notAllowed"].forEach((function (e) { n.classList.remove(e) })), void 0 !== e && (e.classList.add(t <= w.selectedDates[0].getTime() ? "startRange" : "endRange"), a < t && d === a ? n.classList.add("startRange") : a > t && d === a && n.classList.add("endRange"), d >= l && (0 === c || d <= c) && (o = a, s = t, (i = d) > Math.min(o, s) && i < Math.max(o, s)) && n.classList.add("inRange"))) })) } } function re() { !w.isOpen || w.config.static || w.config.inline || de() } function le(e) { return function (n) { var t = w.config["_" + e + "Date"] = w.parseDate(n, w.config.dateFormat), a = w.config["_" + ("min" === e ? "max" : "min") + "Date"]; void 0 !== t && (w["min" === e ? "minDateHasTime" : "maxDateHasTime"] = t.getHours() > 0 || t.getMinutes() > 0 || t.getSeconds() > 0), w.selectedDates && (w.selectedDates = w.selectedDates.filter((function (e) { return ne(e) })), w.selectedDates.length || "min" !== e || F(t), ye()), w.daysContainer && (ue(), void 0 !== t ? w.currentYearElement[e] = t.getFullYear().toString() : w.currentYearElement.removeAttribute(e), w.currentYearElement.disabled = !!a && void 0 !== t && a.getFullYear() === t.getFullYear()) } } function ce() { return w.config.wrap ? p.querySelector("[data-input]") : p } function se() { "object" != typeof w.config.locale && void 0 === I.l10ns[w.config.locale] && w.config.errorHandler(new Error("flatpickr: invalid locale " + w.config.locale)), w.l10n = e(e({}, I.l10ns.default), "object" == typeof w.config.locale ? w.config.locale : "default" !== w.config.locale ? I.l10ns[w.config.locale] : void 0), D.D = "(" + w.l10n.weekdays.shorthand.join("|") + ")", D.l = "(" + w.l10n.weekdays.longhand.join("|") + ")", D.M = "(" + w.l10n.months.shorthand.join("|") + ")", D.F = "(" + w.l10n.months.longhand.join("|") + ")", D.K = "(" + w.l10n.amPM[0] + "|" + w.l10n.amPM[1] + "|" + w.l10n.amPM[0].toLowerCase() + "|" + w.l10n.amPM[1].toLowerCase() + ")", void 0 === e(e({}, v), JSON.parse(JSON.stringify(p.dataset || {}))).time_24hr && void 0 === I.defaultConfig.time_24hr && (w.config.time_24hr = w.l10n.time_24hr), w.formatDate = b(w), w.parseDate = C({ config: w.config, l10n: w.l10n }) } function de(e) { if ("function" != typeof w.config.position) { if (void 0 !== w.calendarContainer) { De("onPreCalendarPosition"); var n = e || w._positionElement, t = Array.prototype.reduce.call(w.calendarContainer.children, (function (e, n) { return e + n.offsetHeight }), 0), a = w.calendarContainer.offsetWidth, i = w.config.position.split(" "), o = i[0], r = i.length > 1 ? i[1] : null, l = n.getBoundingClientRect(), c = window.innerHeight - l.bottom, d = "above" === o || "below" !== o && c < t && l.top > t, u = window.pageYOffset + l.top + (d ? -t - 2 : n.offsetHeight + 2); if (s(w.calendarContainer, "arrowTop", !d), s(w.calendarContainer, "arrowBottom", d), !w.config.inline) { var f = window.pageXOffset + l.left, m = !1, g = !1; "center" === r ? (f -= (a - l.width) / 2, m = !0) : "right" === r && (f -= a - l.width, g = !0), s(w.calendarContainer, "arrowLeft", !m && !g), s(w.calendarContainer, "arrowCenter", m), s(w.calendarContainer, "arrowRight", g); var p = window.document.body.offsetWidth - (window.pageXOffset + l.right), h = f + a > window.document.body.offsetWidth, v = p + a > window.document.body.offsetWidth; if (s(w.calendarContainer, "rightMost", h), !w.config.static) if (w.calendarContainer.style.top = u + "px", h) if (v) { var D = function () { for (var e = null, n = 0; n < document.styleSheets.length; n++) { var t = document.styleSheets[n]; if (t.cssRules) { try { t.cssRules } catch (e) { continue } e = t; break } } return null != e ? e : (a = document.createElement("style"), document.head.appendChild(a), a.sheet); var a }(); if (void 0 === D) return; var b = window.document.body.offsetWidth, C = Math.max(0, b / 2 - a / 2), M = D.cssRules.length, y = "{left:" + l.left + "px;right:auto;}"; s(w.calendarContainer, "rightMost", !1), s(w.calendarContainer, "centerMost", !0), D.insertRule(".flatpickr-calendar.centerMost:before,.flatpickr-calendar.centerMost:after" + y, M), w.calendarContainer.style.left = C + "px", w.calendarContainer.style.right = "auto" } else w.calendarContainer.style.left = "auto", w.calendarContainer.style.right = p + "px"; else w.calendarContainer.style.left = f + "px", w.calendarContainer.style.right = "auto" } } } else w.config.position(w, e) } function ue() { w.config.noCalendar || w.isMobile || (q(), Ce(), U()) } function fe() { w._input.focus(), -1 !== window.navigator.userAgent.indexOf("MSIE") || void 0 !== navigator.msMaxTouchPoints ? setTimeout(w.close, 0) : w.close() } function me(e) { e.preventDefault(), e.stopPropagation(); var n = f(g(e), (function (e) { return e.classList && e.classList.contains("flatpickr-day") && !e.classList.contains("flatpickr-disabled") && !e.classList.contains("notAllowed") })); if (void 0 !== n) { var t = n, a = w.latestSelectedDateObj = new Date(t.dateObj.getTime()), i = (a.getMonth() < w.currentMonth || a.getMonth() > w.currentMonth + w.config.showMonths - 1) && "range" !== w.config.mode; if (w.selectedDateElem = t, "single" === w.config.mode) w.selectedDates = [a]; else if ("multiple" === w.config.mode) { var o = be(a); o ? w.selectedDates.splice(parseInt(o), 1) : w.selectedDates.push(a) } else "range" === w.config.mode && (2 === w.selectedDates.length && w.clear(!1, !1), w.latestSelectedDateObj = a, w.selectedDates.push(a), 0 !== M(a, w.selectedDates[0], !0) && w.selectedDates.sort((function (e, n) { return e.getTime() - n.getTime() }))); if (O(), i) { var r = w.currentYear !== a.getFullYear(); w.currentYear = a.getFullYear(), w.currentMonth = a.getMonth(), r && (De("onYearChange"), q()), De("onMonthChange") } if (Ce(), U(), ye(), i || "range" === w.config.mode || 1 !== w.config.showMonths ? void 0 !== w.selectedDateElem && void 0 === w.hourElement && w.selectedDateElem && w.selectedDateElem.focus() : W(t), void 0 !== w.hourElement && void 0 !== w.hourElement && w.hourElement.focus(), w.config.closeOnSelect) { var l = "single" === w.config.mode && !w.config.enableTime, c = "range" === w.config.mode && 2 === w.selectedDates.length && !w.config.enableTime; (l || c) && fe() } Y() } } w.parseDate = C({ config: w.config, l10n: w.l10n }), w._handlers = [], w.pluginElements = [], w.loadedPlugins = [], w._bind = P, w._setHoursFromDate = F, w._positionCalendar = de, w.changeMonth = Z, w.changeYear = ee, w.clear = function (e, n) { void 0 === e && (e = !0); void 0 === n && (n = !0); w.input.value = "", void 0 !== w.altInput && (w.altInput.value = ""); void 0 !== w.mobileInput && (w.mobileInput.value = ""); w.selectedDates = [], w.latestSelectedDateObj = void 0, !0 === n && (w.currentYear = w._initialDate.getFullYear(), w.currentMonth = w._initialDate.getMonth()); if (!0 === w.config.enableTime) { var t = E(w.config), a = t.hours, i = t.minutes, o = t.seconds; A(a, i, o) } w.redraw(), e && De("onChange") }, w.close = function () { w.isOpen = !1, w.isMobile || (void 0 !== w.calendarContainer && w.calendarContainer.classList.remove("open"), void 0 !== w._input && w._input.classList.remove("active")); De("onClose") }, w.onMouseOver = oe, w._createElement = d, w.createDay = R, w.destroy = function () { void 0 !== w.config && De("onDestroy"); for (var e = w._handlers.length; e--;)w._handlers[e].remove(); if (w._handlers = [], w.mobileInput) w.mobileInput.parentNode && w.mobileInput.parentNode.removeChild(w.mobileInput), w.mobileInput = void 0; else if (w.calendarContainer && w.calendarContainer.parentNode) if (w.config.static && w.calendarContainer.parentNode) { var n = w.calendarContainer.parentNode; if (n.lastChild && n.removeChild(n.lastChild), n.parentNode) { for (; n.firstChild;)n.parentNode.insertBefore(n.firstChild, n); n.parentNode.removeChild(n) } } else w.calendarContainer.parentNode.removeChild(w.calendarContainer); w.altInput && (w.input.type = "text", w.altInput.parentNode && w.altInput.parentNode.removeChild(w.altInput), delete w.altInput); w.input && (w.input.type = w.input._type, w.input.classList.remove("flatpickr-input"), w.input.removeAttribute("readonly"));["_showTimeInput", "latestSelectedDateObj", "_hideNextMonthArrow", "_hidePrevMonthArrow", "__hideNextMonthArrow", "__hidePrevMonthArrow", "isMobile", "isOpen", "selectedDateElem", "minDateHasTime", "maxDateHasTime", "days", "daysContainer", "_input", "_positionElement", "innerContainer", "rContainer", "monthNav", "todayDateElem", "calendarContainer", "weekdayContainer", "prevMonthNav", "nextMonthNav", "monthsDropdownContainer", "currentMonthElement", "currentYearElement", "navigationCurrentMonth", "selectedDateElem", "config"].forEach((function (e) { try { delete w[e] } catch (e) { } })) }, w.isEnabled = ne, w.jumpToDate = j, w.updateValue = ye, w.open = function (e, n) { void 0 === n && (n = w._positionElement); if (!0 === w.isMobile) { if (e) { e.preventDefault(); var t = g(e); t && t.blur() } return void 0 !== w.mobileInput && (w.mobileInput.focus(), w.mobileInput.click()), void De("onOpen") } if (w._input.disabled || w.config.inline) return; var a = w.isOpen; w.isOpen = !0, a || (w.calendarContainer.classList.add("open"), w._input.classList.add("active"), De("onOpen"), de(n)); !0 === w.config.enableTime && !0 === w.config.noCalendar && (!1 !== w.config.allowInput || void 0 !== e && w.timeContainer.contains(e.relatedTarget) || setTimeout((function () { return w.hourElement.select() }), 50)) }, w.redraw = ue, w.set = function (e, n) { if (null !== e && "object" == typeof e) for (var a in Object.assign(w.config, e), e) void 0 !== ge[a] && ge[a].forEach((function (e) { return e() })); else w.config[e] = n, void 0 !== ge[e] ? ge[e].forEach((function (e) { return e() })) : t.indexOf(e) > -1 && (w.config[e] = c(n)); w.redraw(), ye(!0) }, w.setDate = function (e, n, t) { void 0 === n && (n = !1); void 0 === t && (t = w.config.dateFormat); if (0 !== e && !e || e instanceof Array && 0 === e.length) return w.clear(n); pe(e, t), w.latestSelectedDateObj = w.selectedDates[w.selectedDates.length - 1], w.redraw(), j(void 0, n), F(), 0 === w.selectedDates.length && w.clear(!1); ye(n), n && De("onChange") }, w.toggle = function (e) { if (!0 === w.isOpen) return w.close(); w.open(e) }; var ge = { locale: [se, G], showMonths: [V, S, z], minDate: [j], maxDate: [j], positionElement: [ve], clickOpens: [function () { !0 === w.config.clickOpens ? (P(w._input, "focus", w.open), P(w._input, "click", w.open)) : (w._input.removeEventListener("focus", w.open), w._input.removeEventListener("click", w.open)) }] }; function pe(e, n) { var t = []; if (e instanceof Array) t = e.map((function (e) { return w.parseDate(e, n) })); else if (e instanceof Date || "number" == typeof e) t = [w.parseDate(e, n)]; else if ("string" == typeof e) switch (w.config.mode) { case "single": case "time": t = [w.parseDate(e, n)]; break; case "multiple": t = e.split(w.config.conjunction).map((function (e) { return w.parseDate(e, n) })); break; case "range": t = e.split(w.l10n.rangeSeparator).map((function (e) { return w.parseDate(e, n) })) } else w.config.errorHandler(new Error("Invalid date supplied: " + JSON.stringify(e))); w.selectedDates = w.config.allowInvalidPreload ? t : t.filter((function (e) { return e instanceof Date && ne(e, !1) })), "range" === w.config.mode && w.selectedDates.sort((function (e, n) { return e.getTime() - n.getTime() })) } function he(e) { return e.slice().map((function (e) { return "string" == typeof e || "number" == typeof e || e instanceof Date ? w.parseDate(e, void 0, !0) : e && "object" == typeof e && e.from && e.to ? { from: w.parseDate(e.from, void 0), to: w.parseDate(e.to, void 0) } : e })).filter((function (e) { return e })) } function ve() { w._positionElement = w.config.positionElement || w._input } function De(e, n) { if (void 0 !== w.config) { var t = w.config[e]; if (void 0 !== t && t.length > 0) for (var a = 0; t[a] && a < t.length; a++)t[a](w.selectedDates, w.input.value, w, n); "onChange" === e && (w.input.dispatchEvent(we("change")), w.input.dispatchEvent(we("input"))) } } function we(e) { var n = document.createEvent("Event"); return n.initEvent(e, !0, !0), n } function be(e) { for (var n = 0; n < w.selectedDates.length; n++) { var t = w.selectedDates[n]; if (t instanceof Date && 0 === M(t, e)) return "" + n } return !1 } function Ce() { w.config.noCalendar || w.isMobile || !w.monthNav || (w.yearElements.forEach((function (e, n) { var t = new Date(w.currentYear, w.currentMonth, 1); t.setMonth(w.currentMonth + n), w.config.showMonths > 1 || "static" === w.config.monthSelectorType ? w.monthElements[n].textContent = h(t.getMonth(), w.config.shorthandCurrentMonth, w.l10n) + " " : w.monthsDropdownContainer.value = t.getMonth().toString(), e.value = t.getFullYear().toString() })), w._hidePrevMonthArrow = void 0 !== w.config.minDate && (w.currentYear === w.config.minDate.getFullYear() ? w.currentMonth <= w.config.minDate.getMonth() : w.currentYear < w.config.minDate.getFullYear()), w._hideNextMonthArrow = void 0 !== w.config.maxDate && (w.currentYear === w.config.maxDate.getFullYear() ? w.currentMonth + 1 > w.config.maxDate.getMonth() : w.currentYear > w.config.maxDate.getFullYear())) } function Me(e) { var n = e || (w.config.altInput ? w.config.altFormat : w.config.dateFormat); return w.selectedDates.map((function (e) { return w.formatDate(e, n) })).filter((function (e, n, t) { return "range" !== w.config.mode || w.config.enableTime || t.indexOf(e) === n })).join("range" !== w.config.mode ? w.config.conjunction : w.l10n.rangeSeparator) } function ye(e) { void 0 === e && (e = !0), void 0 !== w.mobileInput && w.mobileFormatStr && (w.mobileInput.value = void 0 !== w.latestSelectedDateObj ? w.formatDate(w.latestSelectedDateObj, w.mobileFormatStr) : ""), w.input.value = Me(w.config.dateFormat), void 0 !== w.altInput && (w.altInput.value = Me(w.config.altFormat)), !1 !== e && De("onValueUpdate") } function xe(e) { var n = g(e), t = w.prevMonthNav.contains(n), a = w.nextMonthNav.contains(n); t || a ? Z(t ? -1 : 1) : w.yearElements.indexOf(n) >= 0 ? n.select() : n.classList.contains("arrowUp") ? w.changeYear(w.currentYear + 1) : n.classList.contains("arrowDown") && w.changeYear(w.currentYear - 1) } return function () { w.element = w.input = p, w.isOpen = !1, function () { var n = ["wrap", "weekNumbers", "allowInput", "allowInvalidPreload", "clickOpens", "time_24hr", "enableTime", "noCalendar", "altInput", "shorthandCurrentMonth", "inline", "static", "enableSeconds", "disableMobile"], i = e(e({}, JSON.parse(JSON.stringify(p.dataset || {}))), v), o = {}; w.config.parseDate = i.parseDate, w.config.formatDate = i.formatDate, Object.defineProperty(w.config, "enable", { get: function () { return w.config._enable }, set: function (e) { w.config._enable = he(e) } }), Object.defineProperty(w.config, "disable", { get: function () { return w.config._disable }, set: function (e) { w.config._disable = he(e) } }); var r = "time" === i.mode; if (!i.dateFormat && (i.enableTime || r)) { var l = I.defaultConfig.dateFormat || a.dateFormat; o.dateFormat = i.noCalendar || r ? "H:i" + (i.enableSeconds ? ":S" : "") : l + " H:i" + (i.enableSeconds ? ":S" : "") } if (i.altInput && (i.enableTime || r) && !i.altFormat) { var s = I.defaultConfig.altFormat || a.altFormat; o.altFormat = i.noCalendar || r ? "h:i" + (i.enableSeconds ? ":S K" : " K") : s + " h:i" + (i.enableSeconds ? ":S" : "") + " K" } Object.defineProperty(w.config, "minDate", { get: function () { return w.config._minDate }, set: le("min") }), Object.defineProperty(w.config, "maxDate", { get: function () { return w.config._maxDate }, set: le("max") }); var d = function (e) { return function (n) { w.config["min" === e ? "_minTime" : "_maxTime"] = w.parseDate(n, "H:i:S") } }; Object.defineProperty(w.config, "minTime", { get: function () { return w.config._minTime }, set: d("min") }), Object.defineProperty(w.config, "maxTime", { get: function () { return w.config._maxTime }, set: d("max") }), "time" === i.mode && (w.config.noCalendar = !0, w.config.enableTime = !0); Object.assign(w.config, o, i); for (var u = 0; u < n.length; u++)w.config[n[u]] = !0 === w.config[n[u]] || "true" === w.config[n[u]]; t.filter((function (e) { return void 0 !== w.config[e] })).forEach((function (e) { w.config[e] = c(w.config[e] || []).map(T) })), w.isMobile = !w.config.disableMobile && !w.config.inline && "single" === w.config.mode && !w.config.disable.length && !w.config.enable && !w.config.weekNumbers && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); for (u = 0; u < w.config.plugins.length; u++) { var f = w.config.plugins[u](w) || {}; for (var m in f) t.indexOf(m) > -1 ? w.config[m] = c(f[m]).map(T).concat(w.config[m]) : void 0 === i[m] && (w.config[m] = f[m]) } i.altInputClass || (w.config.altInputClass = ce().className + " " + w.config.altInputClass); De("onParseConfig") }(), se(), function () { if (w.input = ce(), !w.input) return void w.config.errorHandler(new Error("Invalid input element specified")); w.input._type = w.input.type, w.input.type = "text", w.input.classList.add("flatpickr-input"), w._input = w.input, w.config.altInput && (w.altInput = d(w.input.nodeName, w.config.altInputClass), w._input = w.altInput, w.altInput.placeholder = w.input.placeholder, w.altInput.disabled = w.input.disabled, w.altInput.required = w.input.required, w.altInput.tabIndex = w.input.tabIndex, w.altInput.type = "text", w.input.setAttribute("type", "hidden"), !w.config.static && w.input.parentNode && w.input.parentNode.insertBefore(w.altInput, w.input.nextSibling)); w.config.allowInput || w._input.setAttribute("readonly", "readonly"); ve() }(), function () { w.selectedDates = [], w.now = w.parseDate(w.config.now) || new Date; var e = w.config.defaultDate || ("INPUT" !== w.input.nodeName && "TEXTAREA" !== w.input.nodeName || !w.input.placeholder || w.input.value !== w.input.placeholder ? w.input.value : null); e && pe(e, w.config.dateFormat); w._initialDate = w.selectedDates.length > 0 ? w.selectedDates[0] : w.config.minDate && w.config.minDate.getTime() > w.now.getTime() ? w.config.minDate : w.config.maxDate && w.config.maxDate.getTime() < w.now.getTime() ? w.config.maxDate : w.now, w.currentYear = w._initialDate.getFullYear(), w.currentMonth = w._initialDate.getMonth(), w.selectedDates.length > 0 && (w.latestSelectedDateObj = w.selectedDates[0]); void 0 !== w.config.minTime && (w.config.minTime = w.parseDate(w.config.minTime, "H:i")); void 0 !== w.config.maxTime && (w.config.maxTime = w.parseDate(w.config.maxTime, "H:i")); w.minDateHasTime = !!w.config.minDate && (w.config.minDate.getHours() > 0 || w.config.minDate.getMinutes() > 0 || w.config.minDate.getSeconds() > 0), w.maxDateHasTime = !!w.config.maxDate && (w.config.maxDate.getHours() > 0 || w.config.maxDate.getMinutes() > 0 || w.config.maxDate.getSeconds() > 0) }(), w.utils = { getDaysInMonth: function (e, n) { return void 0 === e && (e = w.currentMonth), void 0 === n && (n = w.currentYear), 1 === e && (n % 4 == 0 && n % 100 != 0 || n % 400 == 0) ? 29 : w.l10n.daysInMonth[e] } }, w.isMobile || function () { var e = window.document.createDocumentFragment(); if (w.calendarContainer = d("div", "flatpickr-calendar"), w.calendarContainer.tabIndex = -1, !w.config.noCalendar) { if (e.appendChild((w.monthNav = d("div", "flatpickr-months"), w.yearElements = [], w.monthElements = [], w.prevMonthNav = d("span", "flatpickr-prev-month"), w.prevMonthNav.innerHTML = w.config.prevArrow, w.nextMonthNav = d("span", "flatpickr-next-month"), w.nextMonthNav.innerHTML = w.config.nextArrow, V(), Object.defineProperty(w, "_hidePrevMonthArrow", { get: function () { return w.__hidePrevMonthArrow }, set: function (e) { w.__hidePrevMonthArrow !== e && (s(w.prevMonthNav, "flatpickr-disabled", e), w.__hidePrevMonthArrow = e) } }), Object.defineProperty(w, "_hideNextMonthArrow", { get: function () { return w.__hideNextMonthArrow }, set: function (e) { w.__hideNextMonthArrow !== e && (s(w.nextMonthNav, "flatpickr-disabled", e), w.__hideNextMonthArrow = e) } }), w.currentYearElement = w.yearElements[0], Ce(), w.monthNav)), w.innerContainer = d("div", "flatpickr-innerContainer"), w.config.weekNumbers) { var n = function () { w.calendarContainer.classList.add("hasWeeks"); var e = d("div", "flatpickr-weekwrapper"); e.appendChild(d("span", "flatpickr-weekday", w.l10n.weekAbbreviation)); var n = d("div", "flatpickr-weeks"); return e.appendChild(n), { weekWrapper: e, weekNumbers: n } }(), t = n.weekWrapper, a = n.weekNumbers; w.innerContainer.appendChild(t), w.weekNumbers = a, w.weekWrapper = t } w.rContainer = d("div", "flatpickr-rContainer"), w.rContainer.appendChild(z()), w.daysContainer || (w.daysContainer = d("div", "flatpickr-days"), w.daysContainer.tabIndex = -1), U(), w.rContainer.appendChild(w.daysContainer), w.innerContainer.appendChild(w.rContainer), e.appendChild(w.innerContainer) } w.config.enableTime && e.appendChild(function () { w.calendarContainer.classList.add("hasTime"), w.config.noCalendar && w.calendarContainer.classList.add("noCalendar"); var e = E(w.config); w.timeContainer = d("div", "flatpickr-time"), w.timeContainer.tabIndex = -1; var n = d("span", "flatpickr-time-separator", ":"), t = m("flatpickr-hour", { "aria-label": w.l10n.hourAriaLabel }); w.hourElement = t.getElementsByTagName("input")[0]; var a = m("flatpickr-minute", { "aria-label": w.l10n.minuteAriaLabel }); w.minuteElement = a.getElementsByTagName("input")[0], w.hourElement.tabIndex = w.minuteElement.tabIndex = -1, w.hourElement.value = o(w.latestSelectedDateObj ? w.latestSelectedDateObj.getHours() : w.config.time_24hr ? e.hours : function (e) { switch (e % 24) { case 0: case 12: return 12; default: return e % 12 } }(e.hours)), w.minuteElement.value = o(w.latestSelectedDateObj ? w.latestSelectedDateObj.getMinutes() : e.minutes), w.hourElement.setAttribute("step", w.config.hourIncrement.toString()), w.minuteElement.setAttribute("step", w.config.minuteIncrement.toString()), w.hourElement.setAttribute("min", w.config.time_24hr ? "0" : "1"), w.hourElement.setAttribute("max", w.config.time_24hr ? "23" : "12"), w.hourElement.setAttribute("maxlength", "2"), w.minuteElement.setAttribute("min", "0"), w.minuteElement.setAttribute("max", "59"), w.minuteElement.setAttribute("maxlength", "2"), w.timeContainer.appendChild(t), w.timeContainer.appendChild(n), w.timeContainer.appendChild(a), w.config.time_24hr && w.timeContainer.classList.add("time24hr"); if (w.config.enableSeconds) { w.timeContainer.classList.add("hasSeconds"); var i = m("flatpickr-second"); w.secondElement = i.getElementsByTagName("input")[0], w.secondElement.value = o(w.latestSelectedDateObj ? w.latestSelectedDateObj.getSeconds() : e.seconds), w.secondElement.setAttribute("step", w.minuteElement.getAttribute("step")), w.secondElement.setAttribute("min", "0"), w.secondElement.setAttribute("max", "59"), w.secondElement.setAttribute("maxlength", "2"), w.timeContainer.appendChild(d("span", "flatpickr-time-separator", ":")), w.timeContainer.appendChild(i) } w.config.time_24hr || (w.amPM = d("span", "flatpickr-am-pm", w.l10n.amPM[r((w.latestSelectedDateObj ? w.hourElement.value : w.config.defaultHour) > 11)]), w.amPM.title = w.l10n.toggleTitle, w.amPM.tabIndex = -1, w.timeContainer.appendChild(w.amPM)); return w.timeContainer }()); s(w.calendarContainer, "rangeMode", "range" === w.config.mode), s(w.calendarContainer, "animate", !0 === w.config.animate), s(w.calendarContainer, "multiMonth", w.config.showMonths > 1), w.calendarContainer.appendChild(e); var i = void 0 !== w.config.appendTo && void 0 !== w.config.appendTo.nodeType; if ((w.config.inline || w.config.static) && (w.calendarContainer.classList.add(w.config.inline ? "inline" : "static"), w.config.inline && (!i && w.element.parentNode ? w.element.parentNode.insertBefore(w.calendarContainer, w._input.nextSibling) : void 0 !== w.config.appendTo && w.config.appendTo.appendChild(w.calendarContainer)), w.config.static)) { var l = d("div", "flatpickr-wrapper"); w.element.parentNode && w.element.parentNode.insertBefore(l, w.element), l.appendChild(w.element), w.altInput && l.appendChild(w.altInput), l.appendChild(w.calendarContainer) } w.config.static || w.config.inline || (void 0 !== w.config.appendTo ? w.config.appendTo : window.document.body).appendChild(w.calendarContainer) }(), function () { w.config.wrap && ["open", "close", "toggle", "clear"].forEach((function (e) { Array.prototype.forEach.call(w.element.querySelectorAll("[data-" + e + "]"), (function (n) { return P(n, "click", w[e]) })) })); if (w.isMobile) return void function () { var e = w.config.enableTime ? w.config.noCalendar ? "time" : "datetime-local" : "date"; w.mobileInput = d("input", w.input.className + " flatpickr-mobile"), w.mobileInput.tabIndex = 1, w.mobileInput.type = e, w.mobileInput.disabled = w.input.disabled, w.mobileInput.required = w.input.required, w.mobileInput.placeholder = w.input.placeholder, w.mobileFormatStr = "datetime-local" === e ? "Y-m-d\\TH:i:S" : "date" === e ? "Y-m-d" : "H:i:S", w.selectedDates.length > 0 && (w.mobileInput.defaultValue = w.mobileInput.value = w.formatDate(w.selectedDates[0], w.mobileFormatStr)); w.config.minDate && (w.mobileInput.min = w.formatDate(w.config.minDate, "Y-m-d")); w.config.maxDate && (w.mobileInput.max = w.formatDate(w.config.maxDate, "Y-m-d")); w.input.getAttribute("step") && (w.mobileInput.step = String(w.input.getAttribute("step"))); w.input.type = "hidden", void 0 !== w.altInput && (w.altInput.type = "hidden"); try { w.input.parentNode && w.input.parentNode.insertBefore(w.mobileInput, w.input.nextSibling) } catch (e) { } P(w.mobileInput, "change", (function (e) { w.setDate(g(e).value, !1, w.mobileFormatStr), De("onChange"), De("onClose") })) }(); var e = l(re, 50); w._debouncedChange = l(Y, 300), w.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent) && P(w.daysContainer, "mouseover", (function (e) { "range" === w.config.mode && oe(g(e)) })); P(w._input, "keydown", ie), void 0 !== w.calendarContainer && P(w.calendarContainer, "keydown", ie); w.config.inline || w.config.static || P(window, "resize", e); void 0 !== window.ontouchstart ? P(window.document, "touchstart", X) : P(window.document, "mousedown", X); P(window.document, "focus", X, { capture: !0 }), !0 === w.config.clickOpens && (P(w._input, "focus", w.open), P(w._input, "click", w.open)); void 0 !== w.daysContainer && (P(w.monthNav, "click", xe), P(w.monthNav, ["keyup", "increment"], N), P(w.daysContainer, "click", me)); if (void 0 !== w.timeContainer && void 0 !== w.minuteElement && void 0 !== w.hourElement) { var n = function (e) { return g(e).select() }; P(w.timeContainer, ["increment"], _), P(w.timeContainer, "blur", _, { capture: !0 }), P(w.timeContainer, "click", H), P([w.hourElement, w.minuteElement], ["focus", "click"], n), void 0 !== w.secondElement && P(w.secondElement, "focus", (function () { return w.secondElement && w.secondElement.select() })), void 0 !== w.amPM && P(w.amPM, "click", (function (e) { _(e) })) } w.config.allowInput && P(w._input, "blur", ae) }(), (w.selectedDates.length || w.config.noCalendar) && (w.config.enableTime && F(w.config.noCalendar ? w.latestSelectedDateObj : void 0), ye(!1)), S(); var n = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); !w.isMobile && n && de(), De("onReady") }(), w } function T(e, n) { for (var t = Array.prototype.slice.call(e).filter((function (e) { return e instanceof HTMLElement })), a = [], i = 0; i < t.length; i++) { var o = t[i]; try { if (null !== o.getAttribute("data-fp-omit")) continue; void 0 !== o._flatpickr && (o._flatpickr.destroy(), o._flatpickr = void 0), o._flatpickr = k(o, n || {}), a.push(o._flatpickr) } catch (e) { console.error(e) } } return 1 === a.length ? a[0] : a } "undefined" != typeof HTMLElement && "undefined" != typeof HTMLCollection && "undefined" != typeof NodeList && (HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (e) { return T(this, e) }, HTMLElement.prototype.flatpickr = function (e) { return T([this], e) }); var I = function (e, n) { return "string" == typeof e ? T(window.document.querySelectorAll(e), n) : e instanceof Node ? T([e], n) : T(e, n) }; return I.defaultConfig = {}, I.l10ns = { en: e({}, i), default: e({}, i) }, I.localize = function (n) { I.l10ns.default = e(e({}, I.l10ns.default), n) }, I.setDefaults = function (n) { I.defaultConfig = e(e({}, I.defaultConfig), n) }, I.parseDate = C({}), I.formatDate = b({}), I.compareDates = M, "undefined" != typeof jQuery && void 0 !== jQuery.fn && (jQuery.fn.flatpickr = function (e) { return T(this, e) }), Date.prototype.fp_incr = function (e) { return new Date(this.getFullYear(), this.getMonth(), this.getDate() + ("string" == typeof e ? parseInt(e, 10) : e)) }, "undefined" != typeof window && (window.flatpickr = I), I })); + </script> + <script> + const loader = document.getElementById("loader"); + const content = document.getElementById("content"); + const gender = ['未知', '男', '女']; + const wxid={{wxid}}; + const isChatroom = wxid.endsWith("@chatroom"); + const avatarPaths = {{avatarPaths}}; + const avatarUrls = {{avatarUrls}}; + const chatMessages = /*注意看这是分割线*/; + var timelineData = {{timelineData}}; + var PageTimeline = {{PageTimeline}}; + var server_id_Page = {{server_id_Page}}; + var server_id_Idx = {{server_id_Idx}}; + const dateDataMap = {{dateDataMap}}; + const AllIndex = {{AllIndex}}; + const ImageIndex = {{ImageIndex}}; + const FileIndex = {{FileIndex}}; + const LinkIndex = {{LinkIndex}}; + const MusicIndex = {{MusicIndex}}; + const TransferIndex = {{TransferIndex}}; + const MiniProgramIndex = {{MiniProgramIndex}}; + const VideoNumberIndex = {{VideoNumberIndex}}; + </script> + <script type="text/javascript"> + window._AMapSecurityConfig = { + serviceHost: "https://api.memotrace.cn/_AMapService", + + }; + </script> + <script type="text/javascript" + src="https://webapi.amap.com/maps?v=2.0&key=b999f45a5b06a184518f744681048368"></script> + <script> + // const markerContent = `<div class="custom-content-marker"> + // <img src="./icon/location.png">` + var MapID = {}; + </script> + <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.10.0/jquery.min.js"></script> + <script> + class MessageType { + static Unknown = -1; + static Text = "1"; + static Image = "3"; + static Audio = "34"; + static BusinessCard = "42"; + static Video = "43"; + static Emoji = "47"; + static Position = "48"; + static Voip = "50"; + static OpenIMBCard = "66"; + static System = "10000"; + static File = "25769803825"; // Use BigInt for large numbers + static LinkMessage = 21474836529n; + static LinkMessage2 = 292057776177n; + static LinkMessage3 = 12884901937n; + static LinkMessage4 = 4294967345n; + static LinkMessage5 = 326417514545n; + static LinkMessage6 = 17179869233n; + static RedEnvelope = 8594229559345n; + static Transfer = 8589934592049n; + static Quote = 244813135921n; + static MergedMessages = 81604378673n; + static Applet = "141733920817"; + static Applet2 = 154618822705n; + // static Applet3 = 17179869233n; // Uncomment if needed + static WeChatVideo = "219043332145"; + static Music = "12884901937"; + static FavNote = 103079215153n; + static Pat = 266287972401n; + } + + const menuToggle = document.getElementById("menu-toggle"); + const navbarNav = document.getElementById("topnavbar-nav"); + + menuToggle.addEventListener("click", () => { + navbarNav.classList.toggle("show"); + }); + </script> + <script> + function renderPage(page) { + if (ChatMsgIndex.length !== 0) { + const currentYear = PageTimeline[page]['year']; + const currentMonth = PageTimeline[page]['month']; + const monthName = currentMonth < 10 ? '0' + currentMonth : currentMonth; + // console.log(monthName+'月'); + toggleMonthsDisplay(currentYear); + const yearIdElement = document.getElementById(currentYear + 'year'); + const monthElements = yearIdElement.querySelectorAll('.timeline-item-month'); + let targetMonthElement = null; + monthElements.forEach(monthElement => { + const monthText = monthElement.querySelector('.timeline-right').textContent; // 获取月份文本内容 + if (monthText.includes(String(monthName) + '月')) { // 检查是否包含指定的月份 + targetMonthElement = monthElement; // 如果包含,则将该月份元素赋值给targetMonthElement + } + }); + // console.log(targetMonthElement); + toggleCurrentMonthDisplay(targetMonthElement); + } + + const totalPages = Math.ceil(ChatMsgIndex.length / itemsPerPage); + // document.getElementById('curPage').innerHTML = currentPage; + document.getElementById('gotoPage').value = currentPage; + document.getElementById('maxPage').innerHTML = totalPages; + const container = document.getElementById('chat-container'); + const OnePageMessage = document.createElement('div'); + + // 计算当前页应该显示的元素范围 + const startIndex = (page - 1) * itemsPerPage; + const endIndex = startIndex + itemsPerPage; + + var newMapID = {}; + + function checkImageExists(url, callback) { + var img = new Image(); + img.onload = function () { + callback(true); // 图片存在 + }; + img.onerror = function () { + callback(false); // 图片不存在 + }; + img.src = url; + } + + // 工具类函数 + function replaceEmoji(text) { + if (!text) { + return ''; + } + + // 定义替换规则 + var emoji_set = new Set(['右哼哼', '礼物', '傲慢', '打脸', '流泪', '失望', '猪头', '福', '抱拳', '憨笑', '拳头', '抓狂', + '闭嘴', '白眼', '嘘', '害羞', '无语', '捂脸', '弱', '骷髅', '耶', '吐舌', '爱心', '吃瓜', '發', '囧', + '再见', '睡', '恐惧', '撇嘴', '尴尬', '烟花', '咖啡', '裂开', '勾引', '亲亲', '阴险', '偷笑', '得意', + '凋谢', '爆竹', '玫瑰', '翻白眼', 'Emm', '旺柴', '便便', '蛋糕', '天啊', '让我看看', '嘿哈', '难过', + '发呆', '難受', '庆祝', '好的', '发抖', '心碎', '抠鼻', '机智', '炸弹', '擦汗', '疑问', '脸红', + '呲牙', '委屈', '汗', '苦涩', '破涕为笑', '胜利', '菜刀', '惊恐', '太阳', 'OK', '悠闲', '合十', + '快哭了', '鼓掌', '拥抱', '加油加油', '转圈', 'Whimper', '坏笑', '笑脸', '生病', '吐', '调皮', + '叹气', '敲打', '可怜', '发怒', '阴脸', '晕', '衰', '跳跳', '困', '社会社会', '色', '红包', '鄙视', + '愉快', '加油', '皱眉', '啤酒', '咒骂', '哇', '惊讶', '握手', '大哭', '666', '奸笑', '月亮', '强', + '微笑', '嘴唇']); + + var emoji_mapping = { + "愉快": "愉快", + "白眼": "白眼", + "傲慢": "傲慢", + "困": "困", + "惊恐": "惊恐", + "憨笑": "憨笑", + "悠闲": "悠闲", + "咒骂": "咒骂", + "疑问": "疑问", + "嘘": "嘘", + "晕": "晕", + "衰": "衰", + "骷髅": "骷髅", + "敲打": "敲打", + "Bye": "再见", + "擦汗": "擦汗", + "抠鼻": "抠鼻", + "鼓掌": "鼓掌", + "坏笑": "坏笑", + "右哼哼": "右哼哼", + "鄙视": "鄙视", + "委屈": "委屈", + "快哭了": "快哭了", + "阴险": "阴险", + "亲亲": "亲亲", + "可怜": "可怜", + "Happy": "笑脸", + "Sick": "生病", + "Flushed": "脸红", + "Lol": "破涕为笑", + "Terror": "恐惧", + "LetDown": "失望", + "Duh": "无语", + "Hey": "嘿哈", + "Facepalm": "捂脸", + "Smirk": "奸笑", + "Smart": "机智", + "Concerned": "皱眉", + "Yeah!": "耶", + "Onlooker": "吃瓜", + "GoForIt": "加油", + "Sweats": "汗", + "OMG": "天啊", + "Emm": "Emm", + "Respect": "社会社会", + "Doge": "旺柴", + "NoProb": "好的", + "MyBad": "打脸", + "Wow": "哇", + "Boring": "翻白眼", + "666": "666", + "LetMeSee": "让我看看", + "Sigh": "叹气", + "Hurt": "苦涩", + "Broken": "裂开", + "嘴唇": "嘴唇", + "爱心": "爱心", + "心碎": "心碎", + "拥抱": "拥抱", + "强": "强", + "弱": "弱", + "握手": "握手", + "胜利": "胜利", + "Salute": "抱拳", + "勾引": "勾引", + "拳头": "拳头", + "OK": "OK", + "Worship": "合十", + "啤酒": "啤酒", + "咖啡": "咖啡", + "蛋糕": "蛋糕", + "玫瑰": "玫瑰", + "凋谢": "凋谢", + "菜刀": "菜刀", + "炸弹": "炸弹", + "便便": "便便", + "月亮": "月亮", + "太阳": "太阳", + "Party": "庆祝", + "gift": "礼物", + "Packet": "红包", + "Rich": "發", + "Blessing": "福", + "Fireworks": "烟花", + "Firecracker": "爆竹", + "猪头": "猪头", + "跳跳": "跳跳", + "发抖": "发抖", + "转圈": "转圈", + "微笑": "微笑", + "撇嘴": "撇嘴", + "色": "色", + "发呆": "发呆", + "得意": "得意", + "流泪": "流泪", + "害羞": "害羞", + "闭嘴": "闭嘴", + "睡": "睡", + "大哭": "大哭", + "尴尬": "尴尬", + "发怒": "发怒", + "调皮": "调皮", + "呲牙": "呲牙", + "惊讶": "惊讶", + "难过": "难过", + "Blush": "脸红", + "抓狂": "抓狂", + "吐": "吐", + "偷笑": "偷笑" + } + + // 使用正则表达式匹配形如 [xxx] 的字符串 + return text.replace(/\[([^\]]+)\]/g, function(match, p1) { + // 获取匹配的内容 + var emojiName = p1.trim(); + if (emojiName in emoji_mapping) { + emojiName = emoji_mapping[emojiName]; + } + if (emoji_set.has(emojiName)){ + // 如果在 emojiMap 中找到了对应的图片路径,则替换 + return `<img src="./emoji/${emojiName}.png" id="${emojiName}" class="emoji_img">`; + } + // 如果没有找到对应的图片路径,则返回原始内容 + return match; + }); + } + + function timestampToTime(timestamp) { + let date = new Date(timestamp * 1000); + let year = date.getFullYear() + '-'; + let month = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; + let day = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' '; + let hour = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'; + let minute = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':'; + let second = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds(); + return year + month + day + hour + minute + second; + } + + // 生成各类标签的函数 + function add5MinTimeTag(message) { + if (message.timestamp - lastTimeStamp > 300) { + const newTimeMessage = document.createElement('div'); + newTimeMessage.className = "item item-center"; + newTimeMessage.innerHTML = `<span>${timestampToTime(message.timestamp)}</span>`; + // chatContainer.appendChild(newTimeMessage); + OnePageMessage.appendChild(newTimeMessage); + lastTimeStamp = message.timestamp; + // console.log("增加时间元素", timestampToTime(message.timestamp)); + } + } + + function messageBubble(message, side) { + const messageBubbleTag = document.createElement('div'); + messageBubbleTag.className = `bubble bubble-${side}`; + messageBubbleTag.innerHTML = replaceEmoji(message.text); + return messageBubbleTag; + } + + function displayNameBox(message) { + const displayName = document.createElement('div'); + displayName.className = "displayname"; + displayName.innerHTML = message.display_name; + return displayName; + } + // function checkImageExists(url, callback) { + // var img = new Image(); + // img.onload = function () { + // callback(true); // 图片存在 + // }; + // img.onerror = function () { + // callback(false); // 图片不存在 + // }; + // img.src = url; + // } + + function avatarBox(message) { + const avatarTag = document.createElement('div'); + avatarTag.className = "avatar"; + // var avatar_path = ''; + // // 使用示例 + // var imageUrl = avatarPaths[message.avatar_path]; + var imageUrl = message.avatar_src; + // checkImageExists(imageUrl, function (exists) { + // if (exists) { + // console.log('图片存在'); + // } else { + // imageUrl = avatarUrls[message.avatar_path] + // } + // avatarTag.innerHTML = `<img src="${imageUrl}" loading="lazy" />` + // }); + avatarTag.innerHTML = `<img src="${imageUrl}" loading="lazy" />` + return avatarTag; + } + + + // function messageImgBox(message) { + // const messageImgTag = document.createElement('div'); + // if(message.type == 47) { + // messageImgTag.className = `emoji-image`; + // }else{ + // messageImgTag.className = `chat-image`; + // } + // messageImgTag.innerHTML = `<img src="${message.path}" onclick="showModal(this)" loading="lazy"/>`; + // return messageImgTag; + // } + function messageImgBox(message) { + const messageImgTag = document.createElement('div'); + + if (message.type == 47) { + messageImgTag.className = 'emoji-image'; + messageImgTag.innerHTML = `<img src="${message.path}" onclick="showModal(this)" loading="lazy"/>`; + return messageImgTag; + } else { + messageImgTag.className = 'chat-image'; + } + + const basePath = message.path; // 图片的原始路径(没有后缀名) + console.log('basePath:', basePath); + const extensions = ['.jpg','.png', '.jpeg', '.gif', '.bmp']; // 常见的图片后缀 + let imgLoaded = false; + + // 尝试不同的后缀名 + extensions.forEach(extension => { + const img = new Image(); + img.src = basePath + extension; + + img.onload = function() { + messageImgTag.innerHTML = `<img src="${img.src}" onclick="showModal(this)" loading="lazy"/>`; + imgLoaded = true; + }; + + img.onerror = function() { + // 图片加载失败,继续尝试下一个后缀 + if (!imgLoaded) { + // 这里可以选择在所有后缀都尝试完后进行处理 + } + }; + }); + + return messageImgTag; + } + + + function messageVideoBox(message) { + const messageVideoTag = document.createElement('div'); + messageVideoTag.className = `chat-video`; + messageVideoTag.innerHTML = `<video src="${message.path}" controls />`; + return messageVideoTag; + } + + + function messageElementReferText(message, side) { + const messageElementRefer = document.createElement('div'); + messageElementRefer.className = `chat-refer chat-refer-${side}`; + messageElementRefer.innerHTML = replaceEmoji(message.quote_text); + messageElementRefer.addEventListener('contextmenu', function () { + // 阻止默认的右键菜单 + event.preventDefault(); + // 创建右键菜单 + var contextMenu = document.createElement('div'); + contextMenu.className = 'custom-menu'; + contextMenu.style.position = 'absolute'; + contextMenu.style.left = event.pageX + 'px'; + contextMenu.style.top = event.pageY + 'px'; + + // 添加菜单项 + var menuItem = document.createElement('div'); + menuItem.className = 'custom-menu-item'; + menuItem.textContent = '定位到原文位置'; + menuItem.addEventListener('click', function () { + contextMenu.remove(); + referId = message.quote_server_id; + lastPage = currentPage; + currentPage = server_id_Page[String(referId)]; + + if (lastPage != currentPage) { + reachedBottom = false; + reachedTop = false; + renderPage(currentPage); + } + var targetSection = document.getElementById(referId); + targetSection.scrollIntoView({ behavior: 'smooth' }); + }); + contextMenu.appendChild(menuItem); + + // 将右键菜单添加到页面上 + document.body.appendChild(contextMenu); + + // 点击页面其他地方时隐藏菜单 + document.addEventListener('click', function (event) { + if (!contextMenu.contains(event.target)) { + contextMenu.remove(); + } + }); + + + }); + return messageElementRefer; + } + + function messageVoiceToTextBubble(message, side) { + const messageVoiceToTextTag = document.createElement('div'); + messageVoiceToTextTag.className = `bubble bubble-${side}`; + messageVoiceToTextTag.innerHTML = message.voice_to_text; + return messageVoiceToTextTag; + } + + function messageAudioBox(message) { + const messageAudioTag = document.createElement('div'); + if (message.is_send) { + messageAudioTag.className = `bubble-audio-right`; + var messageAudioTagID = message.server_id + "_audio_box"; + messageAudioTag.id = messageAudioTagID; + var audioID = message.server_id + "_audio"; + AudioTag = document.createElement('audio'); + AudioTag.id = audioID; + AudioTag.innerHTML = `<source src="${message.path}" type="audio/mpeg">`; + // 根据语音时长设置气泡宽度 + var duration = Math.ceil(message.duration / 1000); + var bubblewidth = 40 + duration * 5; + if (bubblewidth < 250) { + messageAudioTag.style.width = `${bubblewidth}px`; + } else { + messageAudioTag.style.width = `250px`; + } + messageAudioTag.innerHTML = `''${duration}`; + messageAudioTag.appendChild(AudioTag); + + $(function () { + messageAudioTag.addEventListener('click', function () { + event.stopPropagation();//防止冒泡 + var AudioTag = messageAudioTag.querySelector('audio'); + AudioTag.addEventListener('error', function () { + // 文件加载错误时执行的操作 + alert('音频文件加载错误,文件不存在或无法访问。'); + }); + if (AudioTag !== null) { + if (AudioTag.paused) { + AudioTag.play(); + if (AudioTag.networkState === HTMLMediaElement.NETWORK_NO_SOURCE) { + alert('音频文件加载错误,文件不存在或无法访问!'); + return; + } + messageAudioTag.style.background = 'url(data:image/gif;base64,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) no-repeat center right 10px'; + messageAudioTag.style.backgroundSize = '20px'; + messageAudioTag.style.backgroundColor = '#9eea6a'; + var checkAudioInterval = setInterval(function () { + if (AudioTag.paused) { + messageAudioTag.style.background = 'url(data:image/png;base64,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) no-repeat center right 10px'; + messageAudioTag.style.backgroundSize = '20px'; + messageAudioTag.style.backgroundColor = '#9eea6a'; + clearInterval(checkAudioInterval); + } + }, 100); + } + else { + messageAudioTag.style.background = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAGx0lEQVR4nO2deaiVRRjGf1ctLbXslrYokVwrkxZDVMrECo2ihXZbKG2TstSorNDqnxZSKiupLCtLMSUthVYtbZGihWwTrdAM2sgMs9Tsqt0YeIXD5XruM+d+M993LvP7Rzz3OXPmnOd8M/O97ztzSCQSiUQikUgkEolEIpFIJBKJRCugJuRbqKurq/SpbYGZwGLg+Wx71XLWrFkTrO028d6GjDPjBeASYAYwpoB9DEbRDHFX7NPAhSX/fxSYmHO/olE0Q+4DRjbx+D3ApNBDbBEokiFXAreX+futwOMFHWYzoyhvbhDwhKC71ib7dhH6lAttQ75obW2tIusKLAG6iM0ebf++W3nPWsaGDRuCtZ33FVJjy9qDPJ7zPjA5YJ9yJW9DRgOneeg/Bs4ANgfsU67kaUhP4H4P/WrgTODvgH3KnTwNmQp0ErUb7cr4PXCfcicvQ84CThe1DcDFwLeB+1QI8jBkN+AhD/0DwBsB+1Mo8jDkahd3FLVfeIZNdrfQy4AK+5Y7sQ3p4PEBbweuALaJendPNQe4CngbOLEF/cyN2IZcBnQXtY/ZFaLyCHCuaTsDr3vMU4UhpiHutW4RteuAuzzaHgFc3+ixPYCXgeEe7eROTEOGAYeJWhf1/UvU9rWgY1O4OWW2DWNVQUxDRom6n4FporY9MBfYs4zGzS3TgRvFNnMlliH72V22wsPAv6J2AnC4oHMxsyk2tBWaWIacY/cfzbHJ4+roDdzm0YePbE4pNLEMUSfWOWaKwiQbshRWAadWQxwshiEuXnWCqJ0h6gZY+EXBmXCexcMKTwxDhorf5LU2rCioy2esamVVZV2PTwxD1DtmN743CLruNicpLLGUb9UQwxB1uFok6i4Xc+r/AWNFkwtDaEPc3fIxgs4tc5eJbaoLhHnASlHrbiAfBA4U9cEIbUgf8dv8GbBV0B0sGoytwlSeBG6yL8UhHs/LnNCGHCnqPhV1p4i65cDnonZkSXFenZnSW3xu5oQ2pJeo+1rUDRJ1L4q6WkuAldIDeA84VmwjU0Ib0lPUfSPq+om6t0TdOGDfJh7vBiwFjhfbyYzQhqj1VmsFTVtxKNko5lFce9eU+XsX2w4xVGgrM0Ib0lXU/SZouovxsJW25G2O44RVVUfgVeBsob1MCG3IPoJmC7BD0Knmfifq1PsjF2WYb9nO4IQ2RKm7UgN+nUWdWrulhO130tZKXkd7PKciilD9rkZ3VUNUg9Urbic1lucvt2WixRTBELWqRKWqQiWNKcI+i3Lp11KyvpL+EHU7cUbfUCZ/nwmhrxClSl01RB2Kuok69d4HW3SMCG0GEQxRdrbUiv1YL77moaLuA1FXD1wAzBL1LSK0IcqKx/XhAEH3k1UzNkcf8X19KNz/bLHijAVCe5kQ2pBfRJ0SYd0uZv66iBHh7VYHvCv+tFqyxUJbmRHakB9E3RGibrmoGybqpuxiWHWVkyfbVRSV0IasFnVHiTr1Azpf1LmV1vhGj7mhcYhH+D5TQhvylajrL+rUKG5/j0TWMyXnqbhDTAZ7rsAyJbQhK8U4VT/bqtAcLiq8QnxtnyK6UTZ8DfYYZoMQ2pB/gC8FXXuPYN9cUTfcI/NXbyncX0V9MGKETtT1vqssVJgpXnVtbGNpVRHDkKWizm22UQ6X+RFYKLY51MqGqoYYhrwjBhBduneg2ObdHkHEqZ6h9lyJYchGj5qrpo5mago3L70iaveyqsi9RX2uxAq/zxN1l3ocJjBRDKVg4ZQFHoHM3IhlyHzxw+tkRzAprPCctE8qOamusMQyZL3HEDPOY9/HnXYz1xwNdkf+XGXdj0fMjOF0UdfD4yrZbIdl1pfR7LD2GhfEFZKYhizyiG1NsMlY4ZMy+0W2WbXIU9m8hfDEPFGuwarclc2fHW3YUkPfzpT9G8XEtlpi6SW/XjdPazpRbpZHeGKs7UFXGVOSSNpkpzio81ZhiG2Ii23dK2rb2Z5DpVoRmysuAp61fIgaISgUeZQBucn9e1Hb187sVam3UxvUvYqFIw9D3Id2s4d+vOe5jFVNXoVyCz32FNbY/nX1nJSqJs/Kxes8it9cHOq1Cso/q448DVnrWSfby1ZNHQP2KXfyru11lYBveugH2pXSak3J25AGK9H0SZ0OsYP5WyVFqH5fZ/nvcvGoUmZbgqpVUpRfR1jWxBF9TTHNUrJqHqTqKNJvcbiyznJHj0+2HUzK/sGqpWg/jjJhF1Xmd1idVVVvxlEo2g+jNNhZvR0sUttgCauqK+eplCL+Us0OO+t9m5WOFj7Ll0gkEolEIpFIJBKJRCKRSCQSiUQJwP+9HRZTetAJJgAAAABJRU5ErkJggg==) no-repeat center right 10px'; + messageAudioTag.style.backgroundSize = '20px'; + messageAudioTag.style.backgroundColor = '#9eea6a'; + AudioTag.pause(); + } + } + }); + + }); + + } else { + messageAudioTag.className = `bubble-audio-left`; + var messageAudioTagID = message.server_id + "_audio_box"; + messageAudioTag.id = messageAudioTagID; + var audioID = message.server_id + "_audio"; + AudioTag = document.createElement('audio'); + AudioTag.id = audioID; + AudioTag.innerHTML = `<source src="${message.path}" type="audio/mpeg">`; + var duration = Math.ceil(message.duration / 1000); + var bubblewidth = 40 + duration * 5; + if (bubblewidth < 250) { + messageAudioTag.style.width = `${bubblewidth}px`; + } else { + messageAudioTag.style.width = `250px`; + } + messageAudioTag.innerHTML = `${duration}''`; + messageAudioTag.appendChild(AudioTag); + + $(function () { + //播放器控制 + messageAudioTag.addEventListener('click', function () { + event.stopPropagation();//防止冒泡 + var AudioTag = messageAudioTag.querySelector('audio'); + if (AudioTag !== null) { + if (AudioTag.paused) { + AudioTag.play(); + if (AudioTag.networkState === HTMLMediaElement.NETWORK_NO_SOURCE) { + alert('音频文件加载错误,文件不存在或无法访问!'); + return; + } + messageAudioTag.style.background = 'url(data:image/gif;base64,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) no-repeat center left 10px'; + messageAudioTag.style.backgroundSize = '20px'; + messageAudioTag.style.backgroundColor = '#fff'; + var checkAudioInterval = setInterval(function () { + if (AudioTag.paused) { + messageAudioTag.style.background = 'url(data:image/png;base64,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) no-repeat center left 10px'; + messageAudioTag.style.backgroundSize = '20px'; + messageAudioTag.style.backgroundColor = '#fff'; + clearInterval(checkAudioInterval); + } + }, 100); + } + else { + messageAudioTag.style.background = 'url(data:image/png;base64,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) no-repeat center left 10px'; + messageAudioTag.style.backgroundSize = '20px'; + messageAudioTag.style.backgroundColor = '#fff'; + AudioTag.pause(); + } + } + }); + }); + } + + return messageAudioTag; + } + + function messageCard(message) { + const messageTag = document.createElement('div'); + messageTag.className = `card`; + messageTag.innerHTML = `<a href="${message.url}" target="_blank"> + <div class="card-content"> + <div title="${message.title}" class="card-title">${message.title}</div> + ${message.description ? ` + <div class="description"> + <p title="${message.description}">${message.description}</p> + <img loading="lazy" class="thumbnail" src="${message.cover_url}" alt="Thumbnail" onerror="this.style.display='none';"> + </div>` : ''} + </div> + <div class="link-info"> + ${message.app_logo ? `<img loading="lazy" class="app-logo" src="${message.app_logo}" alt="App Logo" onerror="this.style.display='none';">` : ''} + ${message.app_name ? `<span class="app-name">${message.app_name}</span>` : `<span class="app-name">app-name</span>`} + </div> + </a>`; + + return messageTag; + } + + function getFileSize(byteSize, format = 'MB') { + // 定义转换因子 + const units = { + 'B': 1, + 'KB': 1024, + 'MB': 1024 ** 2, + 'GB': 1024 ** 3, + }; + + // 检查格式是否支持 + if (units.hasOwnProperty(format)) { + const sizeInFormat = byteSize / units[format]; + return `${sizeInFormat.toFixed(2)} ${format}`; + } else { + throw new Error(`Unsupported format: ${format}`); + } + } + function getFileExtension(file_type) { + icon_files = { + 'doc': 'DOCX', + 'docx': 'DOCX', + 'xls': 'XLSX', + 'xlsx': 'XLSX', + 'csv': 'CSV', + 'txt': 'TXT', + 'zip': 'ZIP', + '7z': 'ZIP', + 'rar': 'ZIP', + 'ppt':'PPT', + 'pptx':'PPT', + 'pdf': 'PDF' + } + return icon_files.hasOwnProperty(file_type) ? icon_files[file_type] : 'Default'; + // 如果没有匹配到后缀名,返回 'Default' + return 'Default'; + } + function messageFileBox(message) { + const messageFileTag = document.createElement('div'); + messageFileTag.className = `chat-file`; + messageFileTag.onclick = function (event) { + if (message.path !== '') { + window.open(message.path, '_blank'); + } else { + alert("文件可能丢失、过期或不存放在该主机上") + } + } + + + messageFileTag.innerHTML = `<div class="file-box"> + <div class="file-info flex1"> + <div class="file-title" title="${message.file_name}">${message.file_name}</div> + <div class="file-size">${getFileSize(message.file_size)}</div> + </div> + <div class="file-img flex2"> + <img src="${FileIcons[getFileExtension(message.file_type)]}"/> + </div> + </div>` + + (message.app_name ? `<div class="app-info"><p>${message.app_name}</p></div>` : ""); + return messageFileTag; + } + function messageVideoAudioCall(message, side) { + const message_call_box = document.createElement('div'); + message_call_box.className = `bubble bubble-${side} call`; + message_call_box.setAttribute("calltype", message.invite_type) + message_call_box.innerHTML = `<i></i><span>${message.display_content}<span>`; + return message_call_box; + } + function messageMusicAudioBox(message) { + const messageMusicAudioTag = document.createElement('div'); + messageMusicAudioTag.className = `chat-music-audio`; + messageMusicAudioTag.dataset.link = message.url; + messageMusicAudioTag.onclick = function (event) { + if (!event.target.classList.contains('play-button')) { + window.open(message.url, '_blank'); + } + } + if (message.title.length >= 12) { + message.title = message.title.slice(0, 12) + '...' + } + if (message.description.length >= 10) { + message.description = message.description.slice(0, 10) + '...' + } + messageMusicAudioTag.innerHTML = `<div class="player-box"> + <div> + <img src="${message.cover_url}" alt="Cover Image" class="cover-image"> + </div> + <div class="player-info"> + <div class="title">${message.title}</div> + <div class="artist">${message.description}</div> + </div> + <div class="player-controls"> + </div> + </div> + <div class="player-original"> + <svg class="player-original-img" t="1727442389694" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4302" width="64" height="64"><path d="M35.84 529.92c0 263.68 215.04 478.72 478.72 478.72 263.68 0 478.72-215.04 478.72-478.72C993.28 266.24 780.8 51.2 514.56 51.2 250.88 51.2 35.84 266.24 35.84 529.92z" fill="#F8C913" p-id="4303"></path><path d="M660.48 10.24c-17.92 20.48-56.32 38.4-107.52 51.2-87.04 20.48-104.96 25.6-130.56 40.96-15.36 7.68-33.28 20.48-43.52 30.72-20.48 17.92-35.84 51.2-30.72 61.44 2.56 5.12 51.2 74.24 110.08 158.72 58.88 81.92 115.2 163.84 128 181.76 12.8 17.92 20.48 33.28 20.48 33.28 0 2.56-10.24 0-20.48-2.56-40.96-12.8-112.64 0-163.84 25.6-38.4 20.48-81.92 64-99.84 99.84-20.48 40.96-23.04 97.28-7.68 135.68 15.36 40.96 48.64 74.24 92.16 97.28 33.28 17.92 40.96 17.92 84.48 20.48 35.84 2.56 56.32 0 76.8-5.12 94.72-28.16 163.84-102.4 168.96-189.44 2.56-48.64-2.56-64-66.56-176.64-99.84-174.08-189.44-332.8-189.44-335.36 0 0 17.92-2.56 40.96-5.12 66.56-2.56 120.32-35.84 148.48-89.6 12.8-23.04 12.8-30.72 12.8-79.36 0-30.72-2.56-58.88-5.12-61.44-2.56-7.68-5.12-5.12-17.92 7.68z" fill="#02B053" p-id="4304"></path></svg> + <p>${message.app_name}</p> + </div> + ` + if (message.text != '') { + var audio = document.createElement('audio'); + audio.src = message.text; + messageMusicAudioTag.querySelector('.player-controls').append(audio) + } + ; + var playButton = document.createElement('button'); + playButton.className = 'play-button paused'; + playButton.onclick = function (event) { + event.stopPropagation(); // 阻止点击播放按钮时触发父级的点击事件 + toggleAudio(event.target); + }; + if (message.is_send) { + messageMusicAudioTag.querySelector('.player-controls').append(playButton) + } else { + messageMusicAudioTag.querySelector('.player-controls').prepend(playButton) + } + return messageMusicAudioTag; + } + function messageTransfer(message) { + const transfer_box = document.createElement("div"); + transfer_box.className = "transfer-box"; + transfer_box.setAttribute("issend", message.is_send); + transfer_box.setAttribute("paysubtype", message.pay_subtype); + transfer_box.innerHTML = `<div class="transfer"> + <div class="trans-content"><i></i> + <div class="transfer-texts"><span>${message.fee_desc}</span><font>${message.text}</font></div> + </div> + <div class="trans-bottom"><span>聊天转账</span></div> + </div>`; + return transfer_box; + } + function personalCard(message) { + const personal_card = document.createElement("div"); + personal_card.className = "personal-card"; + const contner = document.createElement("div"); + contner.className = "contner"; + contner.innerHTML = `<img src="${message.small_head_url}" alt="headimg">` + const contner_text = document.createElement("div"); + contner_text.className = "text"; + if (message.sex == '男') { + contner_text.innerHTML = `<div class="nickname"> + ${message.nickname}<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1704295160809" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4268" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M922.344176 152.209186v-0.050575c0-0.765851-0.0867-1.517251-0.130051-2.283101-0.036125-0.67915-0.04335-1.365526-0.108375-2.037452-0.0867-0.794751-0.2312-1.553376-0.36125-2.333676-0.07225-0.455175-0.122825-0.917576-0.209525-1.379976l-0.04335-0.296226-0.050575-0.281775c-0.15895-0.794751-0.397375-1.553376-0.599676-2.333677-0.15895-0.6069-0.289-1.228251-0.469625-1.820701-0.2601-0.816426-0.585225-1.618401-0.888676-2.420377l-0.27455-0.758625-0.166175-0.455176-0.13005-0.325125c-0.354025-0.830876-0.758626-1.625626-1.163226-2.427602-0.223975-0.455175-0.41905-0.917576-0.6647-1.358301-0.4335-0.801976-0.924801-1.553376-1.401651-2.319226-0.1445-0.223975-0.267325-0.4624-0.411826-0.671926-0.0867-0.13005-0.151725-0.267325-0.238425-0.397375l-0.1156-0.1734c-0.50575-0.751401-1.062076-1.445001-1.611176-2.153052-0.30345-0.39015-0.578-0.801976-0.888676-1.184901-0.556325-0.6647-1.163226-1.293276-1.755676-1.929076-0.354025-0.382925-0.67915-0.780301-1.040401-1.141551l-0.065025-0.065025-0.01445-0.021675-0.07225-0.0578c-0.527425-0.527425-1.098201-1.004276-1.668976-1.510026-0.426275-0.3757-0.823651-0.780301-1.271601-1.148776-0.599675-0.4913-1.249926-0.932026-1.878501-1.401651-0.484075-0.36125-0.953701-0.744176-1.452226-1.083751a5.086404 5.086404 0 0 1-0.332351-0.2023l-0.53465-0.310675a26.70362 26.70362 0 0 0-1.141551-0.693601c-0.5202-0.3179-1.025951-0.657475-1.567826-0.9537-0.67915-0.368475-1.394426-0.671925-2.095252-1.004276-0.56355-0.267325-1.112651-0.570775-1.690651-0.809201-0.151725-0.07225-0.325125-0.122825-0.4913-0.180625-0.18785-0.079475-0.39015-0.137275-0.578001-0.223975l-1.018725-0.368475c-0.628575-0.223975-1.242701-0.484075-1.892952-0.693601-0.643025-0.18785-1.307726-0.325125-1.965201-0.4913-0.729726-0.195075-1.445001-0.41905-2.189177-0.563551-0.151725-0.036125-0.310675-0.036125-0.4624-0.065025l-0.426275-0.07225c-0.527425-0.10115-1.069301-0.166175-1.618402-0.238425-0.599675-0.093925-1.184901-0.21675-1.784576-0.281775a42.772031 42.772031 0 0 0-4.428928-0.223975h-0.151725l-343.079377 1.235476a43.350032 43.350032 0 0 0 0.151726 86.700063h0.151725l238.417949-0.867-156.76094 157.895265c-53.710689-42.179581-121.170564-67.467099-194.150342-67.467099l-4.219403 0.021675c-174.093728 2.290327-313.85423 145.786157-311.563903 319.858209 2.261427 171.817851 143.849855 311.592803 315.631581 311.592803l4.219403-0.0289c84.330262-1.105426 163.18397-34.983476 222.031638-95.39897 58.854893-60.415494 90.644916-140.136203 89.532265-224.452014-0.881451-67.82835-23.553517-130.613646-61.159669-181.831708l157.61349-158.747816V495.418613a43.350032 43.350032 0 0 0 86.700064 0V152.346462v-0.050575-0.086701zM577.198448 751.978551c-39.990404 41.06693-93.585494 64.085797-150.901461 64.844422l-2.890002 0.01445c-116.73441 0-212.957031-95.001595-214.495957-211.77213C207.357652 486.748607 302.352021 389.23271 420.668708 387.672109l2.890002-0.007225c116.741636 0 212.971481 94.99437 214.488732 211.779355 0.758626 57.301517-20.851365 111.474607-60.848994 152.534312z" fill="#1296db" p-id="4269"></path></svg></div>` + } else if (message.sex == '女') { + contner_text.innerHTML = `<div class="nickname"> + ${message.nickname}<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1704295202245" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5558" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M870.69952 153.30048c-66.10688-66.10944-154.00448-102.51776-247.49696-102.51904-93.49248 0-181.3888 36.40832-247.49696 102.51648-66.11072 66.10944-102.51648 154.00576-102.51648 247.49952-0.00128 76.19968 24.19072 148.6784 68.93056 208.67584l-60.2048 60.20352L138.18496 525.94688c-19.99488-19.99488-52.41216-19.99488-72.40704 0-19.99488 19.9936-19.99488 52.41216 0 72.40704l143.72992 143.72992-55.75552 55.75552c-19.9936 19.9936-19.9936 52.41216 0 72.40576 19.99616 19.99616 52.41344 19.99488 72.40832 0l55.75424-55.75424 143.7312 143.72992c19.9936 19.99488 52.41088 19.99488 72.40576 0 19.99616-19.99488 19.99616-52.41216 0-72.40704L354.32192 742.08512l60.2048-60.20352c59.99872 44.73856 132.47616 68.93184 208.67584 68.93184 93.49248 0 181.38752-36.40832 247.49696-102.51776s102.51776-154.00576 102.51776-247.49824C973.21728 307.30496 936.80768 219.40736 870.69952 153.30048zM798.29248 575.88736c-46.76736 46.76736-108.94976 72.5248-175.08992 72.5248s-128.32128-25.75744-175.08992-72.5248c-46.76864-46.76736-72.5248-108.94976-72.5248-175.08992 0.00128-66.14272 25.75616-128.32384 72.5248-175.0912 46.76736-46.76864 108.94976-72.5248 175.08992-72.5248 66.14016 0.00128 128.32256 25.75744 175.08992 72.52608 46.76736 46.76736 72.5248 108.94848 72.5248 175.08864C870.81728 466.9376 845.0624 529.11872 798.29248 575.88736z" fill="#d81e06" p-id="5559"></path></svg></div>` + } else { + contner_text.innerHTML = `<div class="nickname"> + ${message.nickname}</div>` + } + contner_text.innerHTML += `<div class="other">微信号: ${message.alias}</div> + <div class="other">地区: ${message.province}${message.city}</div>` + contner.appendChild(contner_text); + personal_card.appendChild(contner); + const card_bottom = document.createElement("div"); + card_bottom.className = "bottom"; + if (message.username.includes("gh_")) { + card_bottom.innerHTML = `<div class="text">公众号名片</div>` + } else { + card_bottom.innerHTML = `<div class="text">个人名片</div>` + } + personal_card.appendChild(card_bottom); + return personal_card; + } + function openIMCard(message) { + const OpenIM_card = document.createElement("div"); + OpenIM_card.className = "OpenIM-card"; + const contner = document.createElement("div"); + contner.className = "contner"; + contner.innerHTML = `<img src="${message.smallheadimgurl}" alt="headimg">` + const contner_text = document.createElement("div"); + contner_text.className = "text"; + if (message.sex == '男') { + contner_text.innerHTML = `<div class="nickname"> + ${message.nickname}<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1704295160809" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4268" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M922.344176 152.209186v-0.050575c0-0.765851-0.0867-1.517251-0.130051-2.283101-0.036125-0.67915-0.04335-1.365526-0.108375-2.037452-0.0867-0.794751-0.2312-1.553376-0.36125-2.333676-0.07225-0.455175-0.122825-0.917576-0.209525-1.379976l-0.04335-0.296226-0.050575-0.281775c-0.15895-0.794751-0.397375-1.553376-0.599676-2.333677-0.15895-0.6069-0.289-1.228251-0.469625-1.820701-0.2601-0.816426-0.585225-1.618401-0.888676-2.420377l-0.27455-0.758625-0.166175-0.455176-0.13005-0.325125c-0.354025-0.830876-0.758626-1.625626-1.163226-2.427602-0.223975-0.455175-0.41905-0.917576-0.6647-1.358301-0.4335-0.801976-0.924801-1.553376-1.401651-2.319226-0.1445-0.223975-0.267325-0.4624-0.411826-0.671926-0.0867-0.13005-0.151725-0.267325-0.238425-0.397375l-0.1156-0.1734c-0.50575-0.751401-1.062076-1.445001-1.611176-2.153052-0.30345-0.39015-0.578-0.801976-0.888676-1.184901-0.556325-0.6647-1.163226-1.293276-1.755676-1.929076-0.354025-0.382925-0.67915-0.780301-1.040401-1.141551l-0.065025-0.065025-0.01445-0.021675-0.07225-0.0578c-0.527425-0.527425-1.098201-1.004276-1.668976-1.510026-0.426275-0.3757-0.823651-0.780301-1.271601-1.148776-0.599675-0.4913-1.249926-0.932026-1.878501-1.401651-0.484075-0.36125-0.953701-0.744176-1.452226-1.083751a5.086404 5.086404 0 0 1-0.332351-0.2023l-0.53465-0.310675a26.70362 26.70362 0 0 0-1.141551-0.693601c-0.5202-0.3179-1.025951-0.657475-1.567826-0.9537-0.67915-0.368475-1.394426-0.671925-2.095252-1.004276-0.56355-0.267325-1.112651-0.570775-1.690651-0.809201-0.151725-0.07225-0.325125-0.122825-0.4913-0.180625-0.18785-0.079475-0.39015-0.137275-0.578001-0.223975l-1.018725-0.368475c-0.628575-0.223975-1.242701-0.484075-1.892952-0.693601-0.643025-0.18785-1.307726-0.325125-1.965201-0.4913-0.729726-0.195075-1.445001-0.41905-2.189177-0.563551-0.151725-0.036125-0.310675-0.036125-0.4624-0.065025l-0.426275-0.07225c-0.527425-0.10115-1.069301-0.166175-1.618402-0.238425-0.599675-0.093925-1.184901-0.21675-1.784576-0.281775a42.772031 42.772031 0 0 0-4.428928-0.223975h-0.151725l-343.079377 1.235476a43.350032 43.350032 0 0 0 0.151726 86.700063h0.151725l238.417949-0.867-156.76094 157.895265c-53.710689-42.179581-121.170564-67.467099-194.150342-67.467099l-4.219403 0.021675c-174.093728 2.290327-313.85423 145.786157-311.563903 319.858209 2.261427 171.817851 143.849855 311.592803 315.631581 311.592803l4.219403-0.0289c84.330262-1.105426 163.18397-34.983476 222.031638-95.39897 58.854893-60.415494 90.644916-140.136203 89.532265-224.452014-0.881451-67.82835-23.553517-130.613646-61.159669-181.831708l157.61349-158.747816V495.418613a43.350032 43.350032 0 0 0 86.700064 0V152.346462v-0.050575-0.086701zM577.198448 751.978551c-39.990404 41.06693-93.585494 64.085797-150.901461 64.844422l-2.890002 0.01445c-116.73441 0-212.957031-95.001595-214.495957-211.77213C207.357652 486.748607 302.352021 389.23271 420.668708 387.672109l2.890002-0.007225c116.741636 0 212.971481 94.99437 214.488732 211.779355 0.758626 57.301517-20.851365 111.474607-60.848994 152.534312z" fill="#1296db" p-id="4269"></path></svg></div>` + } else if (message.sex == '女') { + contner_text.innerHTML = `<div class="nickname"> + ${message.nickname}<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1704295202245" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5558" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><path d="M870.69952 153.30048c-66.10688-66.10944-154.00448-102.51776-247.49696-102.51904-93.49248 0-181.3888 36.40832-247.49696 102.51648-66.11072 66.10944-102.51648 154.00576-102.51648 247.49952-0.00128 76.19968 24.19072 148.6784 68.93056 208.67584l-60.2048 60.20352L138.18496 525.94688c-19.99488-19.99488-52.41216-19.99488-72.40704 0-19.99488 19.9936-19.99488 52.41216 0 72.40704l143.72992 143.72992-55.75552 55.75552c-19.9936 19.9936-19.9936 52.41216 0 72.40576 19.99616 19.99616 52.41344 19.99488 72.40832 0l55.75424-55.75424 143.7312 143.72992c19.9936 19.99488 52.41088 19.99488 72.40576 0 19.99616-19.99488 19.99616-52.41216 0-72.40704L354.32192 742.08512l60.2048-60.20352c59.99872 44.73856 132.47616 68.93184 208.67584 68.93184 93.49248 0 181.38752-36.40832 247.49696-102.51776s102.51776-154.00576 102.51776-247.49824C973.21728 307.30496 936.80768 219.40736 870.69952 153.30048zM798.29248 575.88736c-46.76736 46.76736-108.94976 72.5248-175.08992 72.5248s-128.32128-25.75744-175.08992-72.5248c-46.76864-46.76736-72.5248-108.94976-72.5248-175.08992 0.00128-66.14272 25.75616-128.32384 72.5248-175.0912 46.76736-46.76864 108.94976-72.5248 175.08992-72.5248 66.14016 0.00128 128.32256 25.75744 175.08992 72.52608 46.76736 46.76736 72.5248 108.94848 72.5248 175.08864C870.81728 466.9376 845.0624 529.11872 798.29248 575.88736z" fill="#d81e06" p-id="5559"></path></svg></div>` + } else { + contner_text.innerHTML = `<div class="nickname"> + ${message.nickname}</div>` + } + contner_text.innerHTML += `<div class="desc"><img src="${message.open_im_desc_icon}">${message.open_im_desc}</div>` + contner.appendChild(contner_text); + OpenIM_card.appendChild(contner); + const card_bottom = document.createElement("div"); + card_bottom.className = "bottom"; + card_bottom.innerHTML = `<div class="text">企业微信名片</div>` + OpenIM_card.appendChild(card_bottom); + return OpenIM_card; + } + + function messageLocation(message, newMapID) { + const Location = document.createElement("div"); + Location.className = "location"; + Location.innerHTML = `<div class="poiname">${message.poiname}</div> + <div class="label">${message.label}</div> + ` + const map_box = document.createElement("div"); + map_box.className = "map"; + map_box.id = "map" + message.timestamp; + Location.appendChild(map_box); + + newMapID["map" + message.timestamp] = [message.x, message.y, message.label, message.scale] + + return Location; + } + + function loadMap(MapID) { + // 点标记显示内容,HTML要素字符串 + var markerContent = '' + + '<div class="custom-content-marker">' + + ' <img src="https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-red.png">' + + '</div>'; + // 遍历MapID + for (var key in MapID) { + var map = new AMap.Map(key, { + resizeEnable: true, + center: [MapID[key][1], MapID[key][0]], + zoom: MapID[key][3] + }); + const position = new AMap.LngLat(MapID[key][1], MapID[key][0]); //Marker 经纬度 + + const marker = new AMap.Marker({ + position: position, + // content: 'label', //将 html 传给 content + // icon: "https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-red.png", + content: markerContent, + title: MapID[key][2], + offset: new AMap.Pixel(-13, -30), //以 icon 的 [center bottom] 为原点 + }); + map.add(marker); + } + + } + + function messageMergeCard(message, zindex=1, index=0) { + const messageMergeCardTag = document.createElement('div'); + messageMergeCardTag.className = `merge-message`; + console.log("mergeMessage", message); + if (message.description && message.description !== null) { + const splitResults = message.description.split("\n"); + const firstTwoItems = splitResults.slice(0, 2); + + messageMergeCardTag.innerHTML = `<div class="title">${message.title}</div> + <div class="msg">${firstTwoItems[0]}</div> + <div class="msg">${firstTwoItems[1]}</div>`; + } else { + messageMergeCardTag.innerHTML = `<div class="title">${message.title}</div> + <div class="msg"></div> + <div class="msg"></div>`; + } + const bottomTag = document.createElement('div'); + bottomTag.className = `bottom`; + bottomTag.innerHTML = `<div class="text">聊天记录</div>`; + messageMergeCardTag.appendChild(bottomTag); + + messageMergeCardTag.addEventListener('click', function () { + modalID = `${message.server_id}-${zindex}-${index}Modal`; + var modal = document.getElementById(modalID); + modal.style.display = "block"; + + var span = modal.querySelector('.close'); + + span.onclick = function () { + modal.style.display = "none"; + } + }); + return messageMergeCardTag; + } + + function innermessageMergeCard(message, zindex=1, index=0, parent_server_id=0) { + const innerMsgMerge_card = document.createElement("div") + innerMsgMerge_card.className = "inner-msgMerge-card" + if (message.description && message.description !== null) { + const splitResults = message.description.split("\n"); + const firstTwoItems = splitResults.slice(0, 2); + innerMsgMerge_card.innerHTML = `<div class="title">${message.title}</div> + <div class="desc">${firstTwoItems[0]}</div> + <div class="desc">${firstTwoItems[1]}</div>` + } else { + innerMsgMerge_card.innerHTML = `<div class="title">${message.title}</div> + <div class="desc"></div> + <div class="desc"></div>` + } + + innerMsgMerge_card.addEventListener('click', function () { + modalID = `${parent_server_id}-${zindex}-${index}Modal`; + var modal = document.getElementById(modalID); + modal.style.display = "block"; + + var span = modal.querySelector('.close'); + + span.onclick = function () { + modal.style.display = "none"; + } + }); + return innerMsgMerge_card + } + + function messageMergeModaltitle(message) { + const messageMergeModaltitle = document.createElement('div'); + messageMergeModaltitle.className = `title`; + if (message.title) { + messageMergeModaltitle.innerHTML = `<span class="close">×</span> + <div class="title">${message.title}</div>`; + } else { + messageMergeModaltitle.innerHTML = `<span class="close">×</span> + <div class="title">${message.description}</div>`; + } + return messageMergeModaltitle; + } + + function messageMergeModal(message, messageContent, zindex, index=0, parent_server_id=0) { + var message_MergeModal = document.createElement('div'); + message_MergeModal.className = `merge-msg-modal`; + message_MergeModal.style.zIndex = zindex; + if (parent_server_id == 0) { + parent_server_id = message.server_id; + } + message_MergeModal.id = `${parent_server_id}-${zindex}-${index}Modal`; + // if (message.server_id) { + // message_MergeModal.id = `${message.server_id}-${zindex}-${index}Modal`; + // } else { + // message_MergeModal.id = `${message.dataid}Modal`; + // } + + var ModalContent = document.createElement('div'); + ModalContent.className = `merge-msg-modal-content`; + ModalContent.appendChild(messageMergeModaltitle(message)); + + var ModalContainer = document.createElement('div'); + ModalContainer.className = `modal-container`; + + if (message.messages.length == 0) { + var OnePersonMsg = document.createElement('div'); + OnePersonMsg.className = `OnePersonmsg`; + OnePersonMsg.innerHTML = `<div class="left"> + <div class="avatar"><img src="" loading="lazy"></div> + </div> + `; + + var OnePersonMsgRight = document.createElement('div'); + OnePersonMsgRight.className = `right`; + OnePersonMsg.appendChild(OnePersonMsgRight); + ModalContainer.appendChild(OnePersonMsg); + ModalContent.appendChild(ModalContainer); + message_MergeModal.appendChild(ModalContent); + return message_MergeModal; + } + + var OnePersonMsg = document.createElement('div'); + OnePersonMsg.className = `OnePersonmsg`; + OnePersonMsg.innerHTML = `<div class="left"> + <div class="avatar"><img src="${message.messages[0].avatar_src}" loading="lazy"></div> + </div> + `; + + var OnePersonMsgRight = document.createElement('div'); + OnePersonMsgRight.className = `right`; + + + var lastsrcname = message.messages[0].display_name; + // 遍历message.recorditem + for (let i = 0; i < message.messages.length; i++) { + var record = message.messages[i]; + var currentsrcname = record.display_name; + if (currentsrcname != lastsrcname) { + OnePersonMsg.appendChild(OnePersonMsgRight); + ModalContainer.appendChild(OnePersonMsg); + lastsrcname = currentsrcname; + var OnePersonMsg = document.createElement('div'); + OnePersonMsg.className = `OnePersonmsg`; + OnePersonMsg.innerHTML = `<div class="left"> + <div class="avatar"><img src="${record.avatar_src}" loading="lazy"></div> + </div> + `; + var OnePersonMsgRight = document.createElement('div'); + OnePersonMsgRight.className = `right`; + } + const recordItem = document.createElement('div'); + recordItem.className = `msg-block`; + // console.log("type:",record.type); + if (record.type == MessageType.Text || record.type == MessageType.Audio) { + // console.log(record.datadesc) + // 文本消息 + recordItem.innerHTML = `<div class="msg-container-top"><span>${record.display_name}</span> + <span style="font-size: 12px;">${timestampToTime(record.timestamp)}</span></div> + <div class="msg-container">${record.text}</div>`; + } else if (record.type == MessageType.MergedMessages) { + // 嵌套合并消息 + recordItem.innerHTML = `<div class="msg-container-top"><span>${record.display_name}</span> + <span style="font-size: 12px;">${timestampToTime(record.timestamp)}</span></div>`; + recordItem.appendChild(innermessageMergeCard(record, zindex + 1, i, parent_server_id)); + // messageContent.appendChild(messageMergeModal(record, messageContent)); + messageContent.insertBefore(messageMergeModal(record, messageContent, zindex + 1, i, parent_server_id), messageContent.firstChild); + } else if (record.type == MessageType.Video) { + // 视频消息 + recordItem.innerHTML = `<div class="msg-container-top"><span>${record.display_name}</span> + <span style="font-size: 12px;">${timestampToTime(record.timestamp)}</span></div> + <div class="msg-container"><video src="${record.path}" controls=""></video></div>`; + } else if (record.type == MessageType.Image || record.type == MessageType.Emoji) { + // 文件消息 + recordItem.innerHTML = `<div class="msg-container-top"><span>${record.display_name}</span> + <span style="font-size: 12px;">${timestampToTime(record.timestamp)}</span></div>`; + recordItem.appendChild(messageImgBox(record)); + + } else if (record.type == MessageType.File) { + // 文件消息 + record.icon_path = getFileIcon(record.datafmt) + recordItem.innerHTML = `<div class="msg-container-top"><span>${record.display_name}</span> + <span style="font-size: 12px;">${timestampToTime(record.timestamp)}</span></div>`; + recordItem.appendChild(messageFileBox(record)); + } else if (record.type == MessageType.Position) { + // 文件消息 + recordItem.innerHTML = `<div class="msg-container-top"><span>${record.display_name}</span> + <span style="font-size: 12px;">${timestampToTime(record.timestamp)}</span></div>`; + recordItem.appendChild(messageLocation(record, newMapID)); + } else if (record.type == MessageType.LinkMessage) { + // 文件消息 + recordItem.innerHTML = `<div class="msg-container-top"><span>${record.display_name}</span> + <span style="font-size: 12px;">${timestampToTime(record.timestamp)}</span></div>`; + recordItem.appendChild(messageCard(record)); + } + OnePersonMsgRight.appendChild(recordItem); + } + + OnePersonMsg.appendChild(OnePersonMsgRight); + ModalContainer.appendChild(OnePersonMsg); + ModalContent.appendChild(ModalContainer); + message_MergeModal.appendChild(ModalContent); + + function getFileIcon(datafmt) { + icon_files = { + 'DOCX': ['doc', 'docx'], + 'XLS': ['xls', 'xlsx'], + 'CSV': ['csv'], + 'TXT': ['txt'], + 'ZIP': ['zip', '7z', 'rar'], + 'PPT': ['ppt', 'pptx'], + 'PDF': ['pdf'], + } + + for (var key in icon_files) { + if (icon_files[key].includes(datafmt)) { + return key + } + } + return 'Default' + } + + return message_MergeModal; + + } + + function messageMiniProgram(message) { + const message_MiniProgram = document.createElement('div'); + message_MiniProgram.className = `mini-program`; + + message_MiniProgram.innerHTML = `<a href="${message.url}" target="_blank"> + <div class="top"> + <img src='${message.app_logo}' alt='logo'> + <div class='text'>${message.app_name}</div> + </div> + <div class="title">${message.title}</div> + <div class="cover"><img src='${message.cover_url}' onerror="this.style.display='none';"></div> + <div class="bottom"><div class="text">小程序</div></div> + </a>`; + return message_MiniProgram; + } + + function messageVideoNumber(message) { + const message_VideoNumber = document.createElement('div'); + message_VideoNumber.className = `video-number`; + const message_VideoNumber_title = document.createElement('div'); + message_VideoNumber_title.className = `title`; + const message_VideoNumber_container = document.createElement('div'); + message_VideoNumber_container.className = `container`; + message_VideoNumber_container.style.backgroundImage = `url(${message.cover_url})`; + message_VideoNumber_container.style.backgroundSize = "cover"; + message_VideoNumber_container.style.backgroundRepeat = "no-repeat"; + message_VideoNumber_title.innerHTML = replaceEmoji(message.title); + message_VideoNumber_container.innerHTML = ` + <div class="bottom"> + <div class="author"> + <div class="logo"><img src='${message.publisher_avatar}' onerror="this.style.display='none';"></div> + <div class="name">${message.publisher_nickname}</div> + <div class="authIcon"><img src='${message.authIconUrl}' onerror="this.style.display='none';"></div> + </div> + </div>`; + + message_VideoNumber.appendChild(message_VideoNumber_title); + message_VideoNumber.appendChild(message_VideoNumber_container); + + return message_VideoNumber; + } + + // 从数据列表中取出对应范围的元素并添加到容器中 + for (let i = startIndex; i < endIndex && i < ChatMsgIndex.length; i++) { + const message = chatMessages[ChatMsgIndex[i]]; + console.log(message.type); + console.log(message); + add5MinTimeTag(message); + const messageElement = document.createElement('div'); // 下面那俩的合体 + const avatarTag = avatarBox(message); // 头像 + const messageContent = document.createElement('div'); // 除了avatar之外的所有 + messageElement.setAttribute('id', message.server_id); + const side = message.is_send ? "right" : "left"; + if (isChatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + if (message.type == MessageType.Text && is_valid_data(message.server_id, message.token)) { + // displayname 和 bubble + messageContent.className = `content-wrapper content-wrapper-${side}`; + messageContent.appendChild(messageBubble(message, side)); + + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == MessageType.System) { + messageElement.className = "item item-center"; + messageElement.innerHTML = `<span class="system-msg">${replaceEmoji(message.text.replace('\\"', '"'))}</span>`; + } else if ((message.type == MessageType.Image || message.type == MessageType.Emoji)&& is_valid_data(message.server_id, message.token)) { + // displayname 和 img + messageContent.className = `content-wrapper content-wrapper-${side}`; + + messageContent.appendChild(messageImgBox(message)); + + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == MessageType.Video && is_valid_data(message.server_id, message.token)) { + // displayname 和 video + messageContent.className = `content-wrapper content-wrapper-${side}`; + + messageContent.appendChild(messageVideoBox(message)); + + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == MessageType.File) { + console.log('file'); + // displayname 和 file + messageContent.className = `content-wrapper content-wrapper-${side}`; + messageContent.appendChild(messageFileBox(message)); + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == MessageType.Transfer) { + console.log('Transfer'); + // displayname 和 file + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageTransfer(message)); + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == MessageType.LinkMessage) { + console.log('LinkMessage'); + // displayname 和 file + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageCard(message)); + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == MessageType.Music) { + console.log('LinkMessage'); + // displayname 和 file + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageMusicAudioBox(message)); + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == MessageType.Applet) { + console.log('LinkMessage'); + // displayname 和 file + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageMiniProgram(message)); + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == MessageType.MergedMessages) { + console.log('MergedMessages'); + // displayname 和 file + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageMergeCard(message)); + // messageContent.appendChild(messageMergeModal(message, messageContent)); + messageContent.insertBefore(messageMergeModal(message, messageContent, 1), messageContent.firstChild); + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == MessageType.Quote) { + console.log('Quote'); + // displayname 和 file + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageBubble(message, side)); + if (message.quote_text) { + messageContent.appendChild(messageElementReferText(message, side)); + } + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == MessageType.WeChatVideo) { + console.log('WeChatVideo'); + // displayname 和 file + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageVideoNumber(message)); + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == 49 && is_valid_data(message.server_id, message.token)) { + if (message.sub_type == 57) { + // displayname 和 bubble 和 refer + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageBubble(message, side)); + if (message.refer_text) { + messageContent.appendChild(messageElementReferText(message, side)); + } + + } else if (message.sub_type == 3 || message.sub_type == 76) { + // music share + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageMusicAudioBox(message)); + } else if (message.sub_type == 5) { + // displayname 和 card + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageCard(message)); + } else if (message.sub_type == 2000) { + // displayname 和 messageTransfer + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageTransfer(message)); + } else if (message.sub_type == 19) { + // displayname 和 messageMergeCard + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageMergeCard(message)); + // messageContent.appendChild(messageMergeModal(message, messageContent)); + messageContent.insertBefore(messageMergeModal(message, messageContent, 1), messageContent.firstChild); + + } else if (message.sub_type == 33 || message.sub_type == 36) { + // 小程序 + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageMiniProgram(message)); + } else if (message.sub_type == 51) { + // 视频号 + messageContent.className = `content-wrapper content-wrapper-${side}`; + if (message.is_chatroom && !message.is_send) { + messageContent.appendChild(displayNameBox(message)); + } + messageContent.appendChild(messageVideoNumber(message)); + } + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == 34 && is_valid_data(message.server_id, message.token)) { + // displayname 和 转的文字 和 audio + messageContent.className = `content-wrapper content-wrapper-${side}`; + + messageContent.appendChild(messageAudioBox(message)); + if (message.voice_to_text) { + messageContent.appendChild(messageVoiceToTextBubble(message, side)); + } + + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == MessageType.Voip && is_valid_data(message.server_id, message.token)) { + // displayname 和 转的文字 和 audio + messageContent.className = `content-wrapper content-wrapper-${side}`; + + messageContent.appendChild(messageVideoAudioCall(message, side)); + + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == MessageType.BusinessCard) { + // 个人名片 + messageContent.className = `content-wrapper content-wrapper-${side}`; + + messageContent.appendChild(MessageType.is_open_im?openIMCard(message):personalCard(message)); + + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } else if (message.type == 48 && is_valid_data(message.server_id, message.token)) { + // 定位 + messageContent.className = `content-wrapper content-wrapper-${side}`; + + messageContent.appendChild(messageLocation(message, newMapID)); + + // 整合 + messageElement.className = `item item-${side}`; + messageElement.appendChild(message.is_send ? messageContent : avatarTag); + messageElement.appendChild(message.is_send ? avatarTag : messageContent); + } + OnePageMessage.appendChild(messageElement); + + } + + if (!reachedBottom && !reachedTop) { + container.innerHTML = ''; // 清空容器 + lastScrollTop = 10; + lastTimeStamp = 0; + + chatContainer.appendChild(OnePageMessage); + document.querySelector("#chat-container").scrollTop = lastScrollTop; + + MapID = newMapID; + } else if (reachedBottom) { + + reachedBottom = false; + + chatContainer.appendChild(OnePageMessage); + document.querySelector("#chat-container").scrollTop = lastScrollTop; + + Object.assign(MapID, newMapID); + } + else if (reachedTop) { + lastTimeStamp = 0; + reachedTop = false; + var existingElement = chatContainer.firstChild; // 获取原有内容的第一个元素 + chatContainer.insertBefore(OnePageMessage, existingElement); + + var targetSection = document.getElementById(String(endIndex)); + targetSection.scrollIntoView({ behavior: 'smooth' }); + Object.assign(MapID, newMapID); + } + // chatContainer.appendChild(OnePageMessage); + // document.querySelector("#chat-container").scrollTop = lastScrollTop; + // console.log("渲染完成"+lastScrollTop); + updatePaginationInfo(); + refreshMediaListener(); + loadMap(MapID); + } + </script> + <script> + const chatContainer = document.getElementById('chat-container'); + + function checkEnter(event) { + if (event.keyCode === 13) { + gotoPage(); + } + } + + var showID = 'All'; + // 在title-bar下添加menu-button + const menuItems = [['全部', 'All'], ['图片和视频', 'Image'], ['文件', 'File'], ['链接', 'Link'], ['音乐和音频', 'Music'], ['交易', 'Transfer'], ['小程序', 'MiniProgram'], ['视频号', 'VideoNumber'], ['日期', 'Date'], ['搜索', 'Search']]; + for (let i = 0; i < menuItems.length; i++) { + const menuItem = document.createElement('div'); + menuItem.classList.add('menu-button'); + menuItem.innerHTML = menuItems[i][0]; + menuItems[i][0] === '全部' ? menuItem.style.backgroundColor = '#aed18d' : menuItem.style.backgroundColor = '#fff'; + if (menuItems[i][0] === '日期') { + menuItem.id = 'datepicker'; + } + menuItem.addEventListener('click', function () { + navbarNav.classList.toggle("show"); + // 清除所有menuItem背景颜色 + for (let j = 0; j < menuItems.length; j++) { + document.getElementsByClassName('menu-button')[j].style.backgroundColor = '#fff'; + } + menuItem.style.backgroundColor = '#aed18d'; + showID = menuItems[i][1]; + if (showID === 'All') { + ChatMsgIndex = AllIndex; + resetTimeline() + + } + else if (showID === 'Image') { + ChatMsgIndex = ImageIndex; + resetTimeline() + } + else if (showID === 'File') { + ChatMsgIndex = FileIndex; + resetTimeline() + } + else if (showID === 'Link') { + ChatMsgIndex = LinkIndex; + resetTimeline() + } + else if (showID === 'Music') { + ChatMsgIndex = MusicIndex; + resetTimeline() + } + else if (showID === 'Transfer') { + ChatMsgIndex = TransferIndex; + resetTimeline() + } + else if (showID === 'MiniProgram') { + ChatMsgIndex = MiniProgramIndex; + resetTimeline() + } + else if (showID === 'VideoNumber') { + ChatMsgIndex = VideoNumberIndex; + resetTimeline() + } + else if (showID === 'Search') { + openSearchModal(); + } + + reachedBottom = false; + reachedTop = false; + if (showID !== 'Date' && showID !== 'Search') { + renderPage(1); + } + + }); + const titleTag = document.getElementById('topnavbar-nav'); + titleTag.appendChild(menuItem); + } + + const itemsPerPage = 100; // 每页显示的元素个数 + let currentPage = 1; // 当前页 + var reachedBottom = false; // 到达底部的标记 + var reachedTop = false; // 到达顶部的标记 + var lastScrollTop = 10; + var lastTimeStamp = 0; + + // search init + + var idx = lunr(function () { + this.use(lunr.zh); + this.ref('server_id') + this.field('text') + + chatMessages.forEach(function (doc) { + this.add(doc); + }, this); + }); + var missingDates = []; + var today = new Date(); + var startDate = today; + var endDate = today; + if (chatMessages.length !== 0) { + var startDate = new Date(chatMessages[0].timestamp * 1000); + var endDate = new Date(chatMessages[chatMessages.length - 1].timestamp * 1000); + + for (let d = new Date(startDate); d <= endDate; d.setDate(d.getDate() + 1)) { + var dateStr = d.toISOString().split('T')[0]; + if (!dateDataMap[dateStr]) { + missingDates.push(dateStr); + } + } + } + var input = document.querySelector("#datepicker"); + var fp = flatpickr(input, { + disable: missingDates, + minDate: startDate.toISOString().split('T')[0], + maxDate: endDate.toISOString().split('T')[0], + dateFormat: "Y-m-d", + onChange: function (selectedDates, dateStr, instance) { + ChatMsgIndex = AllIndex; + resetTimeline(); + var selectedDate = selectedDates[0]; + referId = dateDataMap[dateStr][1]; + lastPage = currentPage; + currentPage = dateDataMap[dateStr][0]; + + if (lastPage != currentPage) { + reachedBottom = false; + reachedTop = false; + renderPage(currentPage); + } + + var targetSection = document.getElementById(referId); + targetSection.scrollIntoView({ block: 'start' }); + } + }); + + ChatMsgIndex = AllIndex; + var years = Object.keys(timelineData); + function resetTimeline() { + timelineData = {}; + PageTimeline = {}; + MsgSvrID_Page = {}; + for (let i = 0; i < ChatMsgIndex.length; i++) { + const message = chatMessages[ChatMsgIndex[i]]; + const date = new Date(message.timestamp * 1000); + const month = date.getMonth() + 1; + const year = date.getFullYear(); + const curpage = Math.ceil((i + 1) / itemsPerPage); + + MsgSvrID_Page[message.server_id] = curpage; + + if (!timelineData[year]) { + timelineData[year] = {}; + } + if (!timelineData[year][month]) { + timelineData[year][month] = []; + timelineData[year][month].push(curpage); + timelineData[year][month].push(message.MsgSvrID); + } + + if (!PageTimeline[curpage]) { + PageTimeline[curpage] = {}; + PageTimeline[curpage]['year'] = year; + PageTimeline[curpage]['month'] = month; + } + } + years = Object.keys(timelineData); + if (ChatMsgIndex.length !== 0) + initialTimeline() + currentPage = 1 + } + + function initialTimeline() { + var initialYear = years[0]; + var currentYear = initialYear; + var initialMonths = Object.keys(timelineData[initialYear]); + var initialMonth = initialMonths[0]; + const timeline = document.getElementById('timeline'); + timeline.innerHTML = ''; + for (let year of years) { + const currentMonths = Object.keys(timelineData[year]); + const yearIdElement = document.createElement('div'); + yearIdElement.setAttribute('id', String(year) + 'year'); + const yearElement = document.createElement('div'); + yearElement.classList.add('timeline-item-year'); + yearElement.innerHTML = ` + <div class="timeline-dot-year"></div> + <div class="timeline-right">${year}</div> + `; + + // 点击年份,显示该年份的月份 + yearElement.addEventListener('click', function () { + currentYear = year; + toggleMonthsDisplay(String(year)); + }); + + yearIdElement.appendChild(yearElement); + + for (let month = 1; month <= 12; month++) { + const monthName = month < 10 ? '0' + month : month; + const monthElement = document.createElement('div'); + monthElement.classList.add('timeline-item-month'); + + if (currentMonths.includes(String(month))) { + // 有消息的月份,添加点击事件 + monthElement.addEventListener('click', function () { + // toggleCurrentMonthDisplay(monthElement); + var parentElement = monthElement.parentElement; + var parentId = parentElement.id; + var parentyear = parentId.match(/\d+/)[0]; + + var lastpage = currentPage + currentPage = timelineData[parentyear][month][0]; + currentId = timelineData[parentyear][month][1]; + + if (lastpage !== currentPage) + renderPage(currentPage); + + var targetSection = document.getElementById(currentId); + // 别删 + console.log(targetSection); + targetSection.scrollIntoView({ block: 'start' }); + + toggleCurrentMonthDisplay(monthElement); + toggleMonthsDisplay(parentyear); + + }); + } + else { + // 没有消息的月份,字体颜色变灰 + monthElement.classList.add('no-msg-month'); + } + if (year === initialYear) { + if (String(month) === initialMonth) { + monthElement.classList.add('current'); + } + } + else { + monthElement.classList.add('hidden-month'); + } + + monthElement.innerHTML = ` + <div class="timeline-dot-month"></div> + <div class="timeline-right">${monthName}月</div> + `; + yearIdElement.appendChild(monthElement); + } + timeline.appendChild(yearIdElement); + } + + } + + function toggleMonthsDisplay(year) { + // 遍历所有月份,给没有hidden-month类的元素添加hidden-month类 + const AllmonthElements = document.querySelectorAll('.timeline-item-month'); + AllmonthElements.forEach(monthElement => { + // 如果该月份元素没有 hidden-month 类,则添加该类 + if (!monthElement.classList.contains('hidden-month')) { + monthElement.classList.add('hidden-month'); + } + }); + + const yearIdElement = document.getElementById(year + 'year'); + const monthElements = yearIdElement.querySelectorAll('.timeline-item-month'); + // const months = yearElement.children; + monthElements.forEach(monthElement => { + // 删除 .hidden-month 类属性 + monthElement.classList.remove('hidden-month'); + }); + } + + function toggleCurrentMonthDisplay(monthElement) { + lastmonthElement = document.querySelectorAll('.current'); + lastmonthElement[0].classList.remove('current'); + monthElement.classList.add('current'); + } + + + if (chatMessages.length !== 0) + initialTimeline() + loader.style.display = "none"; + content.style.display = "flex"; // 显示内容 + function prevPage() { + if (currentPage > 1) { + currentPage--; + reachedBottom = false; + renderPage(currentPage); + } + } + + function nextPage() { + const totalPages = Math.ceil(ChatMsgIndex.length / itemsPerPage); + if (currentPage < totalPages) { + reachedTop = false; + currentPage++; + renderPage(currentPage); + } + } + + function updatePaginationInfo() { + const totalPages = Math.ceil(ChatMsgIndex.length / itemsPerPage); + const paginationInfo = document.getElementById('gotoPage'); + paginationInfo.value = `${currentPage}`; + } + + function gotoPage() { + const totalPages = Math.ceil(chatMessages.length / itemsPerPage); + const inputElement = document.getElementById('gotoPage'); + const targetPage = parseInt(inputElement.value); + + if (targetPage >= 1 && targetPage <= totalPages) { + currentPage = targetPage; + renderPage(currentPage); + } else { + alert('请输入有效的页码'); + } + } + + + function checkScroll() { + var chatContainer = document.getElementById("chat-container"); + + // 检查滚动条是否滑到底部 + if (chatContainer.scrollHeight - chatContainer.scrollTop - 10 <= chatContainer.clientHeight) { + // 如果滚动条在底部 + if (!reachedBottom) { + // 设置标记并返回 + reachedBottom = true; + lastScrollTop = chatContainer.scrollTop; + } + if (reachedBottom) { + nextPage(); + } + + } + + if (chatContainer.scrollTop < 5) { + reachedTop = true; + prevPage(); + } + + } + + // 初始化页面 + renderPage(currentPage); + + function refreshMediaListener() { + const audioTags = document.querySelectorAll('audio'); + const videoTags = document.querySelectorAll('video'); + + audioTags.forEach(audio => { + audio.addEventListener('play', function () { + pauseOtherMedia(audio); + }); + }); + videoTags.forEach(video => { + video.addEventListener('play', function () { + pauseOtherMedia(video); + }); + }); + + function pauseOtherMedia(currentMedia) { + const audioTags = document.querySelectorAll('audio'); + const videoTags = document.querySelectorAll('video'); + audioTags.forEach(media => { + if (media !== currentMedia && !media.paused) { + media.pause(); + } + }); + videoTags.forEach(media => { + if (media !== currentMedia && !media.paused) { + media.pause(); + } + }); + } + } + + refreshMediaListener(); + + function showModal(image) { + var modal = document.getElementById("modal"); + var modalImage = document.getElementById("modal-image"); + modal.style.display = "block"; + modalImage.src = image.src; + // console.log(image.src); + } + + function is_valid_data(content, key) { + return true; + key_ = md5('sNZaKe6&YhpCVvB@3R:7:^5b!mZk|f"SEx3YITEQX4|$7gC-IMHGbGjUAO6Q' + content + 'v@:L7IyXYsY7u!yc~N+lA59AjBH$sMe:kj"];1VhGbN<aDMLCza0qdv`wa)~w_;').toString(); + return key_ === key; + } + + function hideModal() { + var modal = document.getElementById("modal"); + modal.style.display = "none"; + } + + function toggleAudio(buttonElm) { + var audioPlayer = buttonElm.parentNode; + var audio = audioPlayer.querySelector('audio'); + if (audio == null) { + alert("该音频已失效或无法直接播放,有需要请点击音频链接查看") + } else { + if (audio.paused) { + audio.play(); + buttonElm.classList.remove('paused'); + buttonElm.classList.add('playing'); + } else { + audio.pause(); + buttonElm.classList.remove('playing'); + buttonElm.classList.add('paused'); + } + } + + } + + function openSearchModal() { + document.getElementById("search-modal").style.display = "block"; + } + + function closeSearchModal() { + document.getElementById("search-modal").style.display = "none"; + } + + function checkImageExists(url, callback) { + var img = new Image(); + img.onload = function () { + callback(true); // 图片存在 + }; + img.onerror = function () { + callback(false); // 图片不存在 + }; + img.src = url; + } + + function avatarBox(message) { + const avatarTag = document.createElement('div'); + avatarTag.className = "avatar"; + var avatar_path = ''; + // 使用示例 + // var imageUrl = avatarPaths[message.avatar_path]; + // checkImageExists(imageUrl, function (exists) { + // if (exists) { + // console.log('图片存在'); + // } else { + // imageUrl = avatarUrls[message.avatar_path] + // } + // avatarTag.innerHTML = `<img src="${imageUrl}" loading="lazy" />` + // }); + + var imageUrl = message.avatar_src; + avatarTag.innerHTML = `<img src="${imageUrl}" loading="lazy" />` + + return avatarTag; + } + + function renderResults(ID) { + var message = chatMessages[ID["idx"]]; + // console.log(message.text) + // avatarurl = avatarUrl(message); + const date = new Date(message.timestamp * 1000); + var dateStr = date.toISOString().split('T')[0]; + var displayname = '' + if (message.display_name) { + displayname = message.display_name; + } + if (message.type == MessageType.Text || message.type == MessageType.Text2 || message.type == MessageType.Quote) { + var OnePersonMsg = document.createElement('div'); + OnePersonMsg.className = `OnePersonmsg`; + OnePersonMsg.innerHTML = `<div class="left">`; + const avatarTag = avatarBox(message); + OnePersonMsg.appendChild(avatarTag); + + var OnePersonMsgRight = document.createElement('div'); + OnePersonMsgRight.className = `right`; + const recordItem = document.createElement('div'); + recordItem.className = `msg-block`; + recordItem.innerHTML = `<div class="msg-container-top"><span>${displayname}</span> + <span style="font-size: 12px;">${dateStr}</span></div> + <div class="msg-container">${message.text}</div>`; + OnePersonMsgRight.appendChild(recordItem); + OnePersonMsg.appendChild(OnePersonMsgRight); + const tooltip = document.createElement('div'); + tooltip.className = `tooltip`; + tooltip.innerHTML = `双击跳转到该消息`; + OnePersonMsg.appendChild(tooltip); + OnePersonMsg.addEventListener('dblclick', function () { + console.log('双击了消息') + // 阻止默认的右键菜单 + event.preventDefault(); + closeSearchModal(); + referId = ID["server_id"]; + lastPage = currentPage; + ChatMsgIndex = AllIndex; + resetTimeline(); + currentPage = server_id_Page[String(referId)]; + reachedBottom = false; + reachedTop = false; + renderPage(currentPage); + + var targetSection = document.getElementById(referId); + targetSection.scrollIntoView({ block: 'start' }); + }); + return OnePersonMsg + } + else { + return null; + } + } + + function getSearchResults() { + document.getElementById('searchBox').addEventListener('input', function () { + const query = document.getElementById('searchBox').value; + console.log(query); + const results = idx.search(query); + if (results.length > 0) { + + } + const SearchMContent = document.getElementById('search-modal-content'); + var oldmodalContainer = SearchMContent.querySelector('.modal-container'); + if (oldmodalContainer) { + oldmodalContainer.remove(); + } + // 获取modal-container + const modalContainer = document.createElement('div'); + modalContainer.className = `modal-container`; + modalContainer.id = 'modal-container'; + const IDresults = []; + results.forEach(result => { + IDresults.push({ "idx": server_id_Idx[result.ref], "server_id": result.ref }); + }); + IDresults.sort((a, b) => a["idx"] - b["idx"]); + IDresults.forEach(ID => { + // console.log(chatMessages[ID].text); + var OnePersonMsg = renderResults(ID) + if (OnePersonMsg) { + modalContainer.appendChild(OnePersonMsg); + } + }); + SearchMContent.appendChild(modalContainer); + + <!-- 添加提示信息 --> + + document.getElementById('modal-container').querySelectorAll('.OnePersonmsg').forEach(element => { + console.log('添加提示信息'); + const tooltip = element.querySelector('.tooltip'); + // console.log(tooltip); + + // 显示提示文本 + element.addEventListener('mouseover', () => { + tooltip.style.display = 'block'; + }); + + // 隐藏提示文本 + element.addEventListener('mouseout', () => { + tooltip.style.display = 'none'; + }); + + // 更新提示文本位置 + element.addEventListener('mousemove', (event) => { + const xOffset = 10; + const yOffset = 20; + tooltip.style.left = (event.pageX + xOffset) + 'px'; + tooltip.style.top = (event.pageY + yOffset) + 'px'; + }); + + }); + }); + } + getSearchResults(); + </script> +</body> + +</html> \ No newline at end of file diff --git a/main.py b/main.py deleted file mode 100644 index 0e55f17..0000000 --- a/main.py +++ /dev/null @@ -1,120 +0,0 @@ -import ctypes -import sys -import time -import traceback -from PyQt5.QtGui import QFont, QPixmap, QIcon -from PyQt5.QtWidgets import * -from PyQt5.QtCore import Qt - -from app.log.exception_handling import ExceptionHanding, send_error_msg -from app.ui.Icon import Icon -from app.DataBase import close_db -from app.log import logger -from app.ui import mainview -from app.ui.tool.pc_decrypt import pc_decrypt -from app.config import version, SEND_LOG_FLAG - -widget = None - - -def excepthook(exc_type, exc_value, traceback_): - # 将异常信息转为字符串 - - # 在这里处理全局异常 - - error_message = ExceptionHanding(exc_type, exc_value, traceback_) - txt = '您可添加QQ群发送log文件以便解决该问题' - msg = f"Exception Type: {exc_type.__name__}\nException Value: {exc_value}\ndetails: {error_message}\n\n{txt}" - if SEND_LOG_FLAG: - send_error_msg(msg) - logger.error(f'程序发生了错误:\n\n{msg}') - # 创建一个 QMessageBox 对象 - error_box = QMessageBox() - - # 设置对话框的标题 - error_box.setWindowTitle("未知错误") - pixmap = QPixmap(Icon.logo_ico_path) - icon = QIcon(pixmap) - error_box.setWindowIcon(icon) - # 设置对话框的文本消息 - error_box.setText(msg) - # 设置对话框的图标,使用 QMessageBox.Critical 作为图标类型 - error_box.setIcon(QMessageBox.Critical) - # 添加一个“确定”按钮 - error_box.addButton(QMessageBox.Ok) - - # 显示对话框 - error_box.exec_() - - # 调用原始的 excepthook,以便程序正常退出 - sys.__excepthook__(exc_type, exc_value, traceback_) - - -# 设置 excepthook -sys.excepthook = excepthook - - -ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID("WeChatReport") -QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) -QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True) - - -class ViewController(QWidget): - def __init__(self): - super().__init__() - self.viewMainWindow = None - self.viewDecrypt = None - - def loadPCDecryptView(self): - """ - 登录界面 - :return: - """ - self.viewDecrypt = pc_decrypt.DecryptControl() - self.viewDecrypt.DecryptSignal.connect(self.show_success) - self.viewDecrypt.show() - - def loadMainWinView(self, username=None): - """ - 聊天界面 - :param username: 账号 - :return: - """ - username = '' - start = time.time() - self.viewMainWindow = mainview.MainWinController(username=username) - self.viewMainWindow.exitSignal.connect(self.close) - try: - self.viewMainWindow.setWindowTitle(f"留痕-{version}") - self.viewMainWindow.show() - end = time.time() - self.viewMainWindow.init_ui() - print('ok', '本次加载用了', end - start, 's') - - except Exception as e: - print(f"Exception: {e}") - logger.error(traceback.format_exc()) - - def show_success(self): - QMessageBox.about(self, "解密成功", "数据库文件存储在\napp/DataBase/Msg\n文件夹下") - - def close(self) -> bool: - close_db() - super().close() - - -if __name__ == '__main__': - app = QApplication(sys.argv) - font = QFont('微软雅黑', 12) # 使用 Times New Roman 字体,字体大小为 14 - app.setFont(font) - view = ViewController() - widget = view.viewMainWindow - try: - # view.loadPCDecryptView() - view.loadMainWinView() - # view.show() - # view.show_success() - sys.exit(app.exec_()) - except Exception as e: - print(f"Exception: {e}") - logger.error(traceback.format_exc()) diff --git a/readme.md b/readme.md index 1affca7..ce6198e 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -## [留下你对2024年度聊天报告的期待](https://github.com/LC044/WeChatMsg/issues/532) +## 现已支持微信4.0,[点击查看详细设计文档](https://blog.lc044.love/post/13) <h1 align="center">我的数据我做主</h1> <div align="center"> @@ -50,7 +50,7 @@ [](https://github.com/LC044/WeChatMsg) [](https://gitee.com/lc044/WeChatMsg) [](https://memotrace.cn/) -- 🔒️🔑🔓️Windows本地微信数据库 +- 🔒️🔑🔓️Windows本地微信数据库(支持微信4.0) - 还原微信聊天界面 - 🗨文本✅ - 🏝图片✅ @@ -88,11 +88,11 @@ [https://github.com/LC044/AnnualReport](https://github.com/LC044/AnnualReport) -## 2.2更新预告 +## 3.0 全面来袭 ### 全面适配微信4.0 - + * 全新框架、重构底层逻辑 * 更低的内存占用 @@ -109,33 +109,6 @@ - 如果跟其他模块兼容的话,将采用MIT许可证 - 已有功能代码全开源 -## 🥤效果 - -<details> - -<img alt="聊天界面" src="./doc/images/chat.png"/> - - - - - - - - - - - - - - - - - - - - - -</details> # ⌛使用 @@ -230,7 +203,6 @@ 后续更新将会在公众号同步发布 <div> <img src="https://blog.lc044.love/static/img/b8df8c594a4cabaa0a62025767a3cfd9.weixin.webp"> - <img src="./doc/images/qq3.jpg" height="200"> </div> ## AI交流 @@ -243,6 +215,6 @@ # License -WeChatMsg is licensed under [GPLv3](./LICENSE). +WeChatMsg is licensed under [MIT](./LICENSE). Copyright © 2022-2024 by SiYuan. diff --git a/requirements.txt b/requirements.txt index 2a8ccd7..b0567a6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,20 +1,22 @@ -PyQt5 -psutil -pycryptodomex -pywin32 -pymem -silk-python -pyaudio -fuzzywuzzy -python-Levenshtein -requests -flask==3.0.0 -pyecharts==2.0.1 -jieba==0.42.1 +pywin32==308 +psutil~=6.1.1 +yara-python +pymem==1.14.0 +zstandard~=0.23.0 +pillow==11.0.0 google==3.0.0 protobuf==4.25.1 soupsieve==2.5 -lz4==4.3.2 -pilk==0.2.4 -python-docx==1.1.0 -docxcompose==1.4.0 \ No newline at end of file +lz4~=4.3.3 +requests~=2.32.3 +xmltodict~=0.14.2 +Crypto~=1.4.1 +pycryptodome +cryptography +openpyxl==3.1.5 +aiofiles~=24.1.0 +dateparser~=1.2.1 +beautifulsoup4~=4.12.3 +lxml~=5.3.1 +typing_extensions~=4.12.2 +pysilk-mod==1.6.4 \ No newline at end of file diff --git a/wxManager/__init__.py b/wxManager/__init__.py new file mode 100644 index 0000000..8d7fac5 --- /dev/null +++ b/wxManager/__init__.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +""" +@File : __init__.py.py +@Author : Shuaikang Zhou +@Time : 2023/1/5 0:10 +@IDE : Pycharm +@Version : Python3.10 +@comment : ··· +""" +from .model import Me, MessageType, Message, Person, Contact, TextMessage, ImageMessage +from .db_main import DataBaseInterface +from .manager_v4 import DataBaseV4 +from .manager_v3 import DataBaseV3 + +__version__ = '3.0.0' + + +class DatabaseConnection: + def __init__(self, db_dir, db_version=4): + self.db_dir = db_dir + self.db_version = db_version + self.database_interface = self._initialize_database() + + def _initialize_database(self) -> DataBaseInterface: + if self.db_version == 4: + database0 = DataBaseV4() + else: + database0 = DataBaseV3() + if database0.init_database(self.db_dir): + return database0 + else: + return None + + def get_interface(self) -> DataBaseInterface: + return self._initialize_database() + + +""" +使用示例: +conn = DatabaseConnection(USER_DB_DIR, 4) +database: DataBaseInterface = conn.get_interface() +""" diff --git a/wxManager/db_main.py b/wxManager/db_main.py new file mode 100644 index 0000000..21bad35 --- /dev/null +++ b/wxManager/db_main.py @@ -0,0 +1,254 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/11 1:22 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-db_main.py +@Description : +""" + +from abc import ABC, abstractmethod + +import os +from datetime import date +from typing import List, Any, Tuple + +from wxManager import MessageType +from wxManager.model.contact import Contact + + +class DataBaseInterface(ABC): + def __init__(self): + self.chatroom_members_map = {} + self.contacts_map = {} + + def init_database(self, db_dir=''): + raise ValueError("子类必须实现该方法") + + def close(self): + raise ValueError("子类必须实现该方法") + + def get_session(self): + """ + 获取聊天会话窗口,在聊天界面显示 + @return: + """ + raise ValueError("子类必须实现该方法") + + def get_messages( + self, + username_: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ): + raise ValueError("子类必须实现该方法") + + def get_messages_by_num(self, username, start_sort_seq, msg_num=20): + """ + 获取小于start_sort_seq的msg_num个消息 + @param username: + @param start_sort_seq: + @param msg_num: + @return: messages, 最后一条消息的start_sort_seq + """ + raise ValueError("子类必须实现该方法") + + def get_message_by_server_id(self, username, server_id): + """ + 获取小于start_sort_seq的msg_num个消息 + @param username: + @param server_id: + @return: messages, 最后一条消息的start_sort_seq + """ + raise ValueError("子类必须实现该方法") + + def get_messages_group_by_day( + self, + username_: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + + ) -> dict: + raise ValueError("子类必须实现该方法") + + def get_messages_all(self, time_range=None): + raise ValueError("子类必须实现该方法") + + def get_message_by_num(self, username_, local_id): + raise ValueError("子类必须实现该方法") + + def get_messages_by_type( + self, + username_, + type_: MessageType, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ): + raise ValueError("子类必须实现该方法") + + def get_messages_by_keyword(self, username_, keyword, num=5, max_len=10, time_range=None, year_='all'): + raise ValueError("子类必须实现该方法") + + def get_messages_calendar(self, username_): + raise ValueError("子类必须实现该方法") + + def get_messages_by_days( + self, + username_, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ): + raise ValueError("子类必须实现该方法") + + def get_messages_by_month( + self, + username_, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ): + raise ValueError("子类必须实现该方法") + + def get_messages_by_hour(self, username_, time_range=None, year_='all'): + raise ValueError("子类必须实现该方法") + + def get_first_time_of_message(self, username_=''): + raise ValueError("子类必须实现该方法") + + def get_latest_time_of_message(self, username_='', time_range=None, year_='all'): + raise ValueError("子类必须实现该方法") + + def get_messages_number( + self, + username_, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ) -> int: + raise ValueError("子类必须实现该方法") + + def get_chatted_top_contacts( + self, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + contain_chatroom=False, + top_n=10 + ) -> list: + raise ValueError("子类必须实现该方法") + + def get_send_messages_number_sum( + self, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ) -> int: + raise ValueError("子类必须实现该方法") + + def get_send_messages_number_by_hour( + self, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ) -> list: + raise ValueError("子类必须实现该方法") + + def get_message_length( + self, + username_='', + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ) -> int: + raise ValueError("子类必须实现该方法") + + def get_emoji_url(self, md5: str, thumb: bool) -> str | bytes: + raise ValueError("子类必须实现该方法") + + def get_emoji_URL(self, md5: str, thumb: bool): + raise ValueError("子类必须实现该方法") + + def get_emoji_path(self, md5: str, output_path, thumb: bool = False, ) -> str: + """ + + @param md5: + @param output_path: + @param thumb: + @return: + """ + raise ValueError("子类必须实现该方法") + + # 图片、视频、文件 + def get_file(self, md5: bytes | str) -> str: + raise ValueError("子类必须实现该方法") + + def get_image(self, content, bytesExtra, up_dir="", md5=None, thumb=False, talker_username='') -> str: + raise ValueError("子类必须实现该方法") + + def get_video(self, content, bytesExtra, md5=None, thumb=False): + raise ValueError("子类必须实现该方法") + + # 图片、视频、文件结束 + + # 语音 + def get_audio(self, reserved0, output_path, open_im=False, filename=''): + raise ValueError("子类必须实现该方法") + + def get_media_buffer(self, server_id, is_open_im=False) -> bytes: + pass + + def get_audio_path(self, reserved0, output_path, filename=''): + raise ValueError("子类必须实现该方法") + + def get_audio_text(self, msgSvrId): + raise ValueError("子类必须实现该方法") + + def add_audio_txt(self, msgSvrId, text): + raise ValueError("子类必须实现该方法") + + def update_audio_to_text(self): + raise ValueError("子类必须实现该方法") + + # 语音结束 + + def get_avatar_buffer(self, username) -> bytes: + raise ValueError("子类必须实现该方法") + + def get_contacts(self) -> List[Contact]: + raise ValueError("子类必须实现该方法") + + def set_remark(self, username: str, remark) -> bool: + raise ValueError("子类必须实现该方法") + + def set_avatar_buffer(self, username, avatar_path): + raise ValueError("子类必须实现该方法") + + def get_contact_by_username(self, wxid: str) -> Contact: + raise ValueError("子类必须实现该方法") + + def get_chatroom_members(self, chatroom_name) -> dict[Any, Contact] | Any: + """ + 获取群成员(不包括企业微信联系人) + @param chatroom_name: + @return: + """ + raise ValueError("子类必须实现该方法") + + # 联系人结束 + def merge(self, db_paths): + """ + 增量将db_path中的数据合入到数据库中,若存在冲突则以db_path中的数据为准 + @param db_paths: + @return: + """ + raise ValueError("子类必须实现该方法") + + def get_favorite_items(self, time_range): + raise ValueError("子类必须实现该方法") + + +class Context: + def __init__(self, interface_impl): + """ + 初始化上下文,动态加载接口实现中的所有方法和属性。 + :param interface_impl: 实现接口的具体实例 + """ + if not isinstance(interface_impl, DataBaseInterface): + raise TypeError("interface_impl 必须是 DataBaseInterface 的子类实例") + + # 动态绑定实现类的方法和属性 + for name in dir(interface_impl): + # 仅绑定非私有且非特殊方法 + if not name.startswith("_"): + attr = getattr(interface_impl, name) + setattr(self, name, attr) + + +if __name__ == '__main__': + pass diff --git a/wxManager/db_v3/__init__.py b/wxManager/db_v3/__init__.py new file mode 100644 index 0000000..0f184cc --- /dev/null +++ b/wxManager/db_v3/__init__.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/4 0:06 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-__init__.py.py +@Description : +""" + +if __name__ == '__main__': + pass diff --git a/wxManager/db_v3/emotion.py b/wxManager/db_v3/emotion.py new file mode 100644 index 0000000..6d6e05f --- /dev/null +++ b/wxManager/db_v3/emotion.py @@ -0,0 +1,135 @@ +import os.path +import sqlite3 +import threading +import traceback + +from wxManager.merge import increase_data +from wxManager.model import DataBaseBase + +lock = threading.Lock() +# db_path = "./app/Database/Msg/Emotion.db" +db_path = '.' + + +def singleton(cls): + _instance = {} + + def inner(): + if cls not in _instance: + _instance[cls] = cls() + return _instance[cls] + + return inner + + +# 一定要保证只有一个实例对象 + +class Emotion(DataBaseBase): + + def get_emoji_url(self, md5: str, thumb: bool) -> str | bytes: + """供下载用,返回可能是url可能是bytes""" + if thumb: + sql = """ + select + case + when thumburl is NULL or thumburl = '' then cdnurl + else thumburl + end as selected_url + from CustomEmotion + where md5 = ? + """ + else: + sql = """ + select CDNUrl + from CustomEmotion + where md5 = ? + """ + cursor = self.DB.cursor() + try: + cursor.execute(sql, [md5]) + return cursor.fetchone()[0] + except: + md5 = md5.upper() + sql = f""" + select {"Thumb" if thumb else "Data"} + from EmotionItem + where md5 = ? + """ + cursor.execute(sql, [md5]) + res = cursor.fetchone() + return res[0] if res else "" + finally: + lock.release() + + def get_emoji_URL(self, md5: str, thumb: bool): + """只管url,另外的不管""" + if thumb: + sql = """ + select + case + when thumburl is NULL or thumburl = '' then cdnurl + else thumburl + end as selected_url + from CustomEmotion + where md5 = ? + """ + else: + sql = """ + select CDNUrl + from CustomEmotion + where md5 = ? + """ + cursor = self.DB.cursor() + try: + cursor.execute(sql, [md5]) + return cursor.fetchone()[0] + except: + return "" + + def get_emoji_desc(self, md5: str): + sql = ''' + select Des + from EmotionDes1 + where MD5=? or MD5=? + ''' + cursor = self.DB.cursor() + try: + cursor.execute(sql, [md5, md5.upper()]) + result = cursor.fetchone() + if result: + return result[0][6:].decode('utf-8') + return "" + except: + return "" + + def get_emoji_data(self, md5: str, thumb=False): + sql = f''' + select {'Thumb' if thumb else 'Data'} + from EmotionItem + where MD5=? or MD5=? + ''' + cursor = self.DB.cursor() + try: + cursor.execute(sql, [md5, md5.upper()]) + result = cursor.fetchone() + if result: + return result[0] + return b"" + except: + return b"" + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + cursor = self.DB.cursor() + # 获取列名 + increase_data(db_path, cursor, self.DB, 'CustomEmotion', 'MD5', 0) + increase_data(db_path, cursor, self.DB, 'EmotionDes1', 'MD5', 1, True) + increase_data(db_path, cursor, self.DB, 'EmotionItem', 'MD5', 1, True) + increase_data(db_path, cursor, self.DB, 'EmotionPackageItem', 'ProductId', 0, False) + increase_data(db_path, cursor, self.DB, 'EmotionOrderInfo', 'MD5', 0, False) + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() diff --git a/wxManager/db_v3/favorite.py b/wxManager/db_v3/favorite.py new file mode 100644 index 0000000..b93c179 --- /dev/null +++ b/wxManager/db_v3/favorite.py @@ -0,0 +1,37 @@ +import os.path +import sqlite3 +import threading +from datetime import date +from typing import Tuple + +from wxManager.db_v3.msg import convert_to_timestamp + +lock = threading.Lock() +DB = None +cursor = None +db_path = '.' + + +class Favorite: + + def get_items(self, time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + if time_range: + start_time, end_time = convert_to_timestamp(time_range) + sql = f''' + select FavLocalID, Type, FromUser, RealChatName, SearchKey, UpdateTime, XmlBuf + from FavItems + where StrTalker=? + {'AND UpdateTime>' + str(start_time) + ' AND UpdateTime<' + str(end_time) if time_range else ''} + order by UpdateTime + ''' + res = [] + try: + lock.acquire(True) + self.cursor.execute(sql) + res = self.cursor.fechall() + self.DB.commit() + except: + res = [] + finally: + lock.release() + return res if res else [] diff --git a/wxManager/db_v3/hard_link_file.py b/wxManager/db_v3/hard_link_file.py new file mode 100644 index 0000000..6e471dd --- /dev/null +++ b/wxManager/db_v3/hard_link_file.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/2/4 1:38 +@Author : SiYuan +@Email : 863909694@qq.com +@File : wxManager-hard_link_file.py +@Description : +""" + +import binascii +import hashlib +import os +import sqlite3 +import traceback +import xml.etree.ElementTree as ET + +from wxManager.merge import increase_data +from wxManager.model.db_model import DataBaseBase +from wxManager.log import logger + +file_root_path = "FileStorage\\File\\" + + +def get_md5_from_xml(content, type_="img"): + try: + content = content.strip('null:').strip() + # 解析XML + root = ET.fromstring(content) + if type_ == "img": + # 提取md5的值 + md5_value = root.find(".//img").get("md5") + elif type_ == "video": + md5_value = root.find(".//videomsg").get("md5") + else: + md5_value = None + # print(md5_value) + return md5_value + except ET.ParseError: + logger.error(traceback.format_exc()) + logger.error(content) + return None + + +class HardLinkFile(DataBaseBase): + def get_file_by_md5(self, md5: bytes | str): + if not md5: + return None + if not self.open_flag: + return None + if isinstance(md5, str): + md5 = binascii.unhexlify(md5) + sql = """ + select Md5Hash,MD5,FileName,HardLinkFileID2.Dir as DirName2 + from HardLinkFileAttribute + join HardLinkFileID as HardLinkFileID2 on HardLinkFileAttribute.DirID2 = HardLinkFileID2.DirID + where MD5 = ?; + """ + cursor = self.DB.cursor() + try: + cursor.execute(sql, [md5]) + except sqlite3.OperationalError: + return None + result = cursor.fetchone() + return result + + def get_file(self, md5: bytes | str) -> str: + file_path = '' + file_info = self.get_file_by_md5(md5) + if file_info: + file_path = os.path.join(file_root_path, file_info[3], file_info[2]) + return file_path + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_data(db_path, self.cursor, self.DB, 'HardLinkFileAttribute', 'Md5Hash', 0) + increase_data(db_path, self.cursor, self.DB, 'HardLinkFileID', 'DirId', 0) + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() + + +if __name__ == '__main__': + pass diff --git a/wxManager/db_v3/hard_link_image.py b/wxManager/db_v3/hard_link_image.py new file mode 100644 index 0000000..550283c --- /dev/null +++ b/wxManager/db_v3/hard_link_image.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/2/4 1:26 +@Author : SiYuan +@Email : 863909694@qq.com +@File : wxManager-hard_link_image.py +@Description : +""" +import binascii +import hashlib +import os +import traceback +import xml.etree.ElementTree as ET + +from wxManager.merge import increase_data +from wxManager.model.db_model import DataBaseBase +from wxManager.log import logger +from wxManager.model.message import Message +from wxManager.parser.util.protocbuf.msg_pb2 import MessageBytesExtra + +image_root_path = "FileStorage\\MsgAttach\\" + + +def get_md5_from_xml(content, type_="img"): + try: + if not content: + return None + content = content.strip('null:').strip() + # 解析XML + root = ET.fromstring(content) + if type_ == "img": + # 提取md5的值 + md5_value = root.find(".//img").get("md5") + elif type_ == "video": + md5_value = root.find(".//videomsg").get("md5") + else: + md5_value = None + # print(md5_value) + return md5_value + except: + logger.error(traceback.format_exc()) + logger.error(content) + return None + + +class HardLinkImage(DataBaseBase): + def get_image_path(self): + pass + + def get_image_by_md5(self, md5: bytes | str): + if not md5: + return None + if not self.open_flag: + return None + if isinstance(md5, str): + md5 = binascii.unhexlify(md5) + sql = """ + select Md5Hash,MD5,FileName,HardLinkImageID.Dir as DirName1,HardLinkImageID2.Dir as DirName2 + from HardLinkImageAttribute + join HardLinkImageID on HardLinkImageAttribute.DirID1 = HardLinkImageID.DirID + join HardLinkImageID as HardLinkImageID2 on HardLinkImageAttribute.DirID2 = HardLinkImageID2.DirID + where MD5 = ?; + """ + cursor = self.DB.cursor() + try: + cursor.execute(sql, [md5]) + except AttributeError: + self.init_database() + cursor.execute(sql, [md5]) + result = cursor.fetchone() + return result + + def get_image_original(self, content, bytesExtra) -> str: + msg_bytes = MessageBytesExtra() + msg_bytes.ParseFromString(bytesExtra) + result = '' + for tmp in msg_bytes.message2: + if tmp.field1 != 4: + continue + pathh = tmp.field2 # wxid\FileStorage\... + pathh = "\\".join(pathh.split("\\")[1:]) + return pathh + md5 = get_md5_from_xml(content) + if not md5: + pass + else: + result = self.get_image_by_md5(binascii.unhexlify(md5)) + if result: + dir1 = result[3] + dir2 = result[4] + data_image = result[2] + dir0 = "Image" + dat_image = os.path.join(image_root_path, dir1, dir0, dir2, data_image) + result = dat_image + return result + + def get_image_thumb(self, content, bytesExtra) -> str: + msg_bytes = MessageBytesExtra() + msg_bytes.ParseFromString(bytesExtra) + result = '' + for tmp in msg_bytes.message2: + if tmp.field1 != 3: + continue + pathh = tmp.field2 # wxid\FileStorage\... + pathh = "\\".join(pathh.split("\\")[1:]) + return pathh + md5 = get_md5_from_xml(content) + if not md5: + pass + else: + result = self.get_image_by_md5(md5) + if result: + dir1 = result[3] + dir2 = result[4] + data_image = result[2] + dir0 = "Thumb" + dat_image = os.path.join(image_root_path, dir1, dir0, dir2, data_image) + result = dat_image + return result + + def get_image(self, content, bytesExtra, up_dir="", md5=None, thumb=False) -> str: + result = '.' + if md5: + imginfo = self.get_image_by_md5(md5) + if imginfo: + dir1 = imginfo[3] + dir2 = imginfo[4] + data_image = imginfo[2] + dir0 = "Thumb" + dat_image = os.path.join(image_root_path, dir1, dir0, dir2, data_image) + result = dat_image + else: + if thumb: + result = self.get_image_thumb(content, bytesExtra) + else: + result = self.get_image_original(content, bytesExtra) + if not result: + result = self.get_image_thumb(content, bytesExtra) + return result + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_data(db_path, self.cursor, self.DB, 'HardLinkImageAttribute', 'Md5Hash', 0) + increase_data(db_path, self.cursor, self.DB, 'HardLinkImageID', 'DirId', 0) + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() + + +if __name__ == '__main__': + pass diff --git a/wxManager/db_v3/hard_link_video.py b/wxManager/db_v3/hard_link_video.py new file mode 100644 index 0000000..fcc6e60 --- /dev/null +++ b/wxManager/db_v3/hard_link_video.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/2/4 1:41 +@Author : SiYuan +@Email : 863909694@qq.com +@File : wxManager-hard_link_video.py +@Description : +""" + +import binascii +import hashlib +import os +import sqlite3 +import traceback +import xml.etree.ElementTree as ET + +from wxManager.merge import increase_data +from wxManager.model.db_model import DataBaseBase +from wxManager.log import logger +from wxManager.parser.util.protocbuf.msg_pb2 import MessageBytesExtra + +video_root_path = "FileStorage\\Video\\" + + +def get_md5_from_xml(content, type_="img"): + try: + content = content.strip('null:').strip() + # 解析XML + root = ET.fromstring(content) + if type_ == "img": + # 提取md5的值 + md5_value = root.find(".//img").get("md5") + elif type_ == "video": + md5_value = root.find(".//videomsg").get("md5") + else: + md5_value = None + # print(md5_value) + return md5_value + except ET.ParseError: + logger.error(traceback.format_exc()) + logger.error(content) + return None + + +class HardLinkVideo(DataBaseBase): + def get_video_by_md5(self, md5: bytes | str): + if not md5: + return None + if not self.open_flag: + return None + if isinstance(md5, str): + md5 = binascii.unhexlify(md5) + sql = """ + select Md5Hash,MD5,FileName,HardLinkVideoID2.Dir as DirName2 + from HardLinkVideoAttribute + join HardLinkVideoID as HardLinkVideoID2 on HardLinkVideoAttribute.DirID2 = HardLinkVideoID2.DirID + where MD5 = ?; + """ + cursor = self.DB.cursor() + try: + cursor.execute(sql, [md5]) + except sqlite3.OperationalError: + return None + result = cursor.fetchone() + return result + + def get_video(self, content, bytesExtra, md5=None, thumb=False): + if md5: + result = self.get_video_by_md5(binascii.unhexlify(md5)) + if result: + dir2 = result[3] + data_image = result[2].split(".")[0] + ".jpg" if thumb else result[2] + # dir0 = 'Thumb' if thumb else 'Image' + dat_image = os.path.join(video_root_path, dir2, data_image) + return dat_image + else: + return '' + else: + if bytesExtra: + msg_bytes = MessageBytesExtra() + msg_bytes.ParseFromString(bytesExtra) + for tmp in msg_bytes.message2: + if tmp.field1 != (3 if thumb else 4): + continue + pathh = tmp.field2 # wxid\FileStorage\... + pathh = "\\".join(pathh.split("\\")[1:]) + return pathh + md5 = get_md5_from_xml(content, type_="video") + if not md5: + return '' + result = self.get_video_by_md5(binascii.unhexlify(md5)) + if result: + dir2 = result[3] + data_image = result[2].split(".")[0] + ".jpg" if thumb else result[2] + # dir0 = 'Thumb' if thumb else 'Image' + dat_image = os.path.join(video_root_path, dir2, data_image) + return dat_image + else: + return '' + else: + return '' + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_data(db_path, self.cursor, self.DB, 'HardLinkVideoAttribute', 'Md5Hash', 0) + increase_data(db_path, self.cursor, self.DB, 'HardLinkVideoID', 'DirId', 0) + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() + + +if __name__ == '__main__': + pass diff --git a/wxManager/db_v3/media_msg.py b/wxManager/db_v3/media_msg.py new file mode 100644 index 0000000..36ba59b --- /dev/null +++ b/wxManager/db_v3/media_msg.py @@ -0,0 +1,281 @@ +import os.path +import shutil +import subprocess +import sys +import traceback +import sqlite3 +import base64 + +import xml.etree.ElementTree as ET + +from wxManager.merge import increase_data +from wxManager.log import logger +from wxManager.model import DataBaseBase + + +def get_ffmpeg_path(): + # 获取打包后的资源目录 + resource_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__))) + + # 构建 FFmpeg 可执行文件的路径 + ffmpeg_path = os.path.join(resource_dir, 'app', 'resources', 'data', 'ffmpeg.exe') + + return ffmpeg_path + + +class MediaMsg(DataBaseBase): + voice_visited = {} + + def get_media_buffer(self, reserved0): + sql = ''' + select Buf + from Media + where Reserved0 = ? + ''' + for db in self.DB: + cursor = db.cursor() + cursor.execute(sql, [reserved0]) + result = cursor.fetchone() + if result: + return result[0] + return None + + def get_audio(self, reserved0, output_path, filename=''): + if not filename: + filename = reserved0 + silk_path = f"{output_path}/{filename}.silk" + pcm_path = f"{output_path}/{filename}.pcm" + mp3_path = f"{output_path}/{filename}.mp3" + if os.path.exists(mp3_path): + return mp3_path + buf = self.get_media_buffer(reserved0) + if not buf: + return '' + with open(silk_path, "wb") as f: + f.write(buf) + # open(silk_path, "wb").write() + try: + decode(silk_path, pcm_path, 44100) + # 调用系统上的 ffmpeg 可执行文件 + # 获取 FFmpeg 可执行文件的路径 + ffmpeg_path = get_ffmpeg_path() + # # 调用 FFmpeg + if os.path.exists(ffmpeg_path): + cmd = f'''"{ffmpeg_path}" -loglevel quiet -y -f s16le -i "{pcm_path}" -ar 44100 -ac 1 "{mp3_path}"''' + # system(cmd) + # 使用subprocess.run()执行命令 + subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + else: + # 源码运行的时候下面的有效 + # 这里不知道怎么捕捉异常 + cmd = f'''"{os.path.join(os.getcwd(), 'app', 'resources', 'data', 'ffmpeg.exe')}" -loglevel quiet -y -f s16le -i "{pcm_path}" -ar 44100 -ac 1 "{mp3_path}"''' + # system(cmd) + # 使用subprocess.run()执行命令 + subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if os.path.exists(silk_path): + os.remove(silk_path) + if os.path.exists(pcm_path): + os.remove(pcm_path) + except Exception as e: + print(f"Error: {e}") + logger.error(f'语音发送错误\n{traceback.format_exc()}') + cmd = f'''"{os.path.join(os.getcwd(), 'app', 'resources', 'data', 'ffmpeg.exe')}" -loglevel quiet -y -f s16le -i "{pcm_path}" -ar 44100 -ac 1 "{mp3_path}"''' + # system(cmd) + # 使用subprocess.run()执行命令 + subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + finally: + return mp3_path + + def get_audio_path(self, reserved0, output_path, filename=''): + if not filename: + filename = reserved0 + mp3_path = f"{output_path}\\{filename}.mp3" + mp3_path = mp3_path.replace("/", "\\") + return mp3_path + + def get_audio_text(self, content): + try: + root = ET.fromstring(content) + transtext = root.find(".//voicetrans").get("transtext") + return transtext + except: + return "" + + def audio_to_text(self, token, reserved0, output_path, open_im=False, filename=''): + buf = self.get_media_buffer(reserved0, open_im) + if not buf: + return '' + if not filename: + filename = reserved0 + silk_path = f"{output_path}/{filename}.silk" + pcm_path = f"{output_path}/{filename}.pcm" + with open(silk_path, "wb") as f: + f.write(buf) + decode(silk_path, pcm_path, 16000) + speech_data = [] + with open(pcm_path, 'rb') as speech_file: + speech_data = speech_file.read() + length = len(speech_data) + if length == 0: + logger.error('file %s length read 0 bytes' % pcm_path) + pass + speech = base64.b64encode(speech_data).decode('utf-8') + params = {'dev_pid': DEV_PID, + 'format': 'pcm', + 'rate': RATE, + 'token': token, + 'cuid': CUID, + 'channel': 1, + 'speech': speech, + 'len': length + } + try: + os.remove(silk_path) + os.remove(pcm_path) + resp = requests.post(ASR_URL, json=params) + if resp.status_code == 200: + result_dict = resp.json() + if result_dict['err_no'] == 0: + return result_dict['result'] + else: + print(result_dict) + return "" + else: + return "" + except: + logger.error(traceback.format_exc()) + return "" + + def merge(self, db_file_name): + def task_(db_path, cursor, db): + """ + 每个线程执行的任务,获取某个数据库实例中的查询结果。 + """ + increase_data(db_path, cursor, db, 'Media', 'Reserved0', 1) + + tasks = [] + for i in range(100): + db_path = db_file_name.replace('0', f'{i}') + if os.path.exists(db_path): + # print('初始化数据库:', db_path) + file_name = os.path.basename(db_path) + if file_name in self.db_file_name: + index = self.db_file_name.index(file_name) + db = self.DB[index] + cursor = db.cursor() + task_(db_path, cursor, db) + tasks.append([db_path, cursor, db]) + else: + shutil.copy(db_path, os.path.join(self.db_dir, 'Multi', file_name)) + # print(tasks) + # 使用线程池 (没有加快合并速度) + # with ThreadPoolExecutor(max_workers=len(tasks)) as executor: + # executor.map(lambda args: task_(*args), tasks) + self.commit() + print(len(tasks)) + + +class Audio2TextDB: + def __init__(self): + self.DB = None + self.cursor: sqlite3.Cursor = None + self.open_flag = False + self.init_database() + + def init_database(self, db_dir=''): + if not self.open_flag: + if os.path.exists(audio2text_db_path): + self.DB = sqlite3.connect(audio2text_db_path, check_same_thread=False) + # '''创建游标''' + self.cursor = self.DB.cursor() + self.open_flag = True + if audio2text_lock.locked(): + audio2text_lock.release() + else: + self.DB = sqlite3.connect(audio2text_db_path, check_same_thread=False) + # '''创建游标''' + self.cursor = self.DB.cursor() + self.open_flag = True + # 创建表 + self.cursor.execute('''CREATE TABLE IF NOT EXISTS Audio2Text ( + ID INTEGER PRIMARY KEY, + msgSvrId INTEGER UNIQUE, + Text TEXT NOT NULL + );''') + # 创建索引 + self.cursor.execute('''CREATE INDEX IF NOT EXISTS idx_msg_id ON Audio2Text (msgSvrId);''') + # 提交更改 + self.DB.commit() + + def get_audio_text(self, reserved0) -> str: + """ + @param reserved0: 语音id或者消息id + @return: + """ + sql = ''' + select text from Audio2Text + where msgSvrId =?; + ''' + try: + audio2text_lock.acquire(True) + self.cursor.execute(sql, [reserved0]) + result = self.cursor.fetchone() + if result: + return result[0] + else: + return "" + except: + return "" + finally: + audio2text_lock.release() + + def add_text(self, msgSvrId, text) -> bool: + try: + audio2text_lock.acquire(True) + sql = '''INSERT INTO Audio2Text (msgSvrId, Text) VALUES (?, ?)''' + self.cursor.execute(sql, [msgSvrId, text]) + self.DB.commit() + return True + except sqlite3.IntegrityError: + return False + except: + return False + finally: + audio2text_lock.release() + + def check_msgSvrId_exists(self, msgSvrId) -> bool: + try: + audio2text_lock.acquire(True) + sql = '''SELECT * FROM Audio2Text WHERE msgSvrId = ?''' + self.cursor.execute(sql, [msgSvrId]) + result = self.cursor.fetchone() + return result is not None + except Exception as e: + logger.error(f"Failed to check msgSvrId in Audio2Text: {e}") + return False + finally: + audio2text_lock.release() + + def close(self): + if self.open_flag: + try: + audio2text_lock.acquire(True) + self.open_flag = False + if self.DB: + self.DB.close() + finally: + audio2text_lock.release() + + def __del__(self): + self.close() + + +if __name__ == '__main__': + db_path = './Msg/MediaMSG.db' + media_msg_db = MediaMsg() + audio2text_db = Audio2TextDB() + reserved = 5434219509914482591 + # path = media_msg_db.get_audio(reserved, r"D:\gou\message\WeChatMsg") + is_msgSvrId_exists = audio2text_db.check_msgSvrId_exists(reserved) + print(is_msgSvrId_exists) + # print(path) diff --git a/wxManager/db_v3/micro_msg.py b/wxManager/db_v3/micro_msg.py new file mode 100644 index 0000000..8b507e8 --- /dev/null +++ b/wxManager/db_v3/micro_msg.py @@ -0,0 +1,204 @@ +import os.path +import shutil +import sqlite3 +import threading +import traceback + +from wxManager.merge import increase_update_data +from wxManager.log import logger +from wxManager.model import DataBaseBase +from wxManager.model.contact import Contact + +lock = threading.Lock() +# db_path = "./app/Database/Msg/MicroMsg.db" +db_path = '.' + + +def singleton(cls): + _instance = {} + + def inner(): + if cls not in _instance: + _instance[cls] = cls() + return _instance[cls] + + return inner + + +def is_database_exist(): + return os.path.exists(db_path) + + +class MicroMsg(DataBaseBase): + + def get_label_by_id(self, label_id) -> str: + sql = ''' + select LabelName from ContactLabel + where LabelId = ? + ''' + try: + cursor = self.DB.cursor() + cursor.execute(sql, [label_id]) + result = cursor.fetchone() + if result: + return result[0] + else: + return '' + except: + return '' + + def get_labels(self, label_id_list) -> str: + if not label_id_list: + return '' + return ','.join(map(self.get_label_by_id, label_id_list.strip(',').split(','))) + + def get_contact(self) -> list: + if not self.open_flag: + return [] + try: + sql = '''SELECT UserName, Alias, Type, Remark, NickName, PYInitial, RemarkPYInitial, ContactHeadImgUrl.smallHeadImgUrl, ContactHeadImgUrl.bigHeadImgUrl,ExTraBuf,LabelIDList + FROM Contact + INNER JOIN ContactHeadImgUrl ON Contact.UserName = ContactHeadImgUrl.usrName + WHERE (Type!=4 AND Type!=0) + ORDER BY + CASE + WHEN RemarkQuanPin = '' THEN QuanPin + ELSE RemarkQuanPin + END ASC + ''' + cursor = self.DB.cursor() + cursor.execute(sql) + result = cursor.fetchall() + except sqlite3.OperationalError: + # lock.acquire(True) + sql = '''SELECT UserName, Alias, Type, Remark, NickName, PYInitial, RemarkPYInitial, + ContactHeadImgUrl.smallHeadImgUrl, ContactHeadImgUrl.bigHeadImgUrl,ExTraBuf,"None" + FROM Contact INNER + JOIN ContactHeadImgUrl ON Contact.UserName = ContactHeadImgUrl.usrName WHERE (Type!=4 AND Type!=0) + AND NickName != '' ORDER BY CASE WHEN RemarkQuanPin = '' THEN QuanPin ELSE RemarkQuanPin END ASC''' + self.cursor.execute(sql) + result = self.cursor.fetchall() + return result + + def get_contact_by_username(self, username) -> list: + if not self.open_flag: + return [] + try: + sql = ''' + SELECT UserName, Alias, Type, Remark, NickName, PYInitial, RemarkPYInitial, ContactHeadImgUrl.smallHeadImgUrl, ContactHeadImgUrl.bigHeadImgUrl,ExTraBuf,LabelIDList + FROM Contact + INNER JOIN ContactHeadImgUrl ON Contact.UserName = ContactHeadImgUrl.usrName + WHERE UserName = ? + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [username]) + result1 = cursor.fetchone() + except sqlite3.OperationalError: + # 解决ContactLabel表不存在的问题 + # lock.acquire(True) + sql = ''' + SELECT UserName, Alias, Type, Remark, NickName, PYInitial, RemarkPYInitial, ContactHeadImgUrl.smallHeadImgUrl, ContactHeadImgUrl.bigHeadImgUrl,ExTraBuf,"" + FROM Contact + INNER JOIN ContactHeadImgUrl ON Contact.UserName = ContactHeadImgUrl.usrName + WHERE UserName = ? + ''' + self.cursor.execute(sql, [username]) + result1 = self.cursor.fetchone() + if result1: + result = [*result1[:-1], self.get_labels(result1[-1])] + return result + else: + return [] + + def set_remark(self, username, remark) -> bool: + try: + update_sql = ''' + UPDATE Contact + SET Remark = ? + WHERE UserName = ? + ''' + cursor = self.DB.cursor() + cursor.execute(update_sql, [remark, username]) + self.commit() # 提交更改 + except: + return False + return True + + def set_head_image(self, username, image_url): + pass + + def get_chatroom_info(self, chatroomname): + """ + 获取群聊信息 + """ + if not self.open_flag: + return None + sql = '''SELECT ChatRoomName, RoomData,UserNameList,DisplayNameList FROM ChatRoom WHERE ChatRoomName = ?''' + cursor = self.DB.cursor() + cursor.execute(sql, [chatroomname]) + result = cursor.fetchone() + return result + + def add_contact(self, contact: Contact): + sql1 = ''' + insert into Contact (UserName,Alias,Remark,NickName,Type) + values(?,?,?,?,10086); + ''' + sql2 = ''' + insert into ContactHeadImgUrl (usrName,smallHeadImgUrl,bigHeadImgUrl) + values(?,?,?); + ''' + try: + cursor = self.DB.cursor() + cursor.execute(sql1, [contact.wxid, contact.alias, contact.remark, contact.nickname]) + cursor.execute(sql2, [contact.wxid, contact.small_head_img_url, contact.big_head_img_url]) + self.commit() + except: + logger.error(traceback.format_exc()) + return True + + def get_session(self): + """ + 获取聊天对话 + @return: + """ + if not self.open_flag: + return None + sql = ''' + SELECT strUsrName, nOrder,nUnreadCount,strNickName ,nIsSend,strContent,nMsgType,nTime,strftime('%Y/%m/%d', nTime, 'unixepoch','localtime') AS strTime + FROM Session + ''' + cursor = self.DB.cursor() + cursor.execute(sql) + result = cursor.fetchall() + if result: + result.reverse() + return result + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_update_data(db_path, self.cursor, self.DB, 'ChatRoom', 'ChatRoomName', 0) + increase_update_data(db_path, self.cursor, self.DB, 'ChatRoomInfo', 'ChatRoomName', 0) + increase_update_data(db_path, self.cursor, self.DB, 'Contact', 'UserName', 0) + increase_update_data(db_path, self.cursor, self.DB, 'ContactHeadImgUrl', 'usrName', 0) + increase_update_data(db_path, self.cursor, self.DB, 'ContactLabel', 'LabelId', 0) + increase_update_data(db_path, self.cursor, self.DB, 'Session', 'strUsrName', 0) + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() + + +if __name__ == '__main__': + db_path = "./Msg/MicroMsg.db" + msg = MicroMsg() + msg.init_database() + contacts = msg.get_contact() + + sessions = msg.get_session() + print(sessions) + for session in sessions: + print(session) diff --git a/wxManager/db_v3/misc.py b/wxManager/db_v3/misc.py new file mode 100644 index 0000000..9bbfa42 --- /dev/null +++ b/wxManager/db_v3/misc.py @@ -0,0 +1,80 @@ +import hashlib +import io +import os.path +import shutil +import sqlite3 +import time +import traceback + +from PIL import Image + +from wxManager.merge import increase_update_data +from wxManager.log import logger +from wxManager.model import DataBaseBase + + +class Misc(DataBaseBase): + + def get_avatar_buffer(self, username): + if not self.open_flag: + return None + sql = ''' + select smallHeadBuf + from ContactHeadImg1 + where usrName=?; + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [username]) + result = cursor.fetchall() + cursor.close() + self.DB.commit() + if result: + return result[0][0] + else: + return b'' + + def set_avatar_buffer(self, username, img_path): + try: + # 打开图片并缩放 + with Image.open(img_path) as img: + img = img.resize((128, 128)) + + # 将图片转换为二进制格式 + img_byte_arr = io.BytesIO() + img.save(img_byte_arr, format='PNG') # 可以根据需要更改格式 + img_binary = img_byte_arr.getvalue() + md5_hash = hashlib.md5() + md5_hash.update(img_binary) + + update_sql = ''' + UPDATE ContactHeadImg1 + SET createTime = ?,smallHeadBuf=? + WHERE usrName = ? + ''' + cursor = self.DB.cursor() + cursor.execute(update_sql, [int(time.time()), img_binary, username, md5_hash.hexdigest()]) + # 检查是否有行被更新 + if cursor.rowcount == 0: + # 如果没有更新,则插入新记录 + insert_sql = ''' + INSERT INTO head_image (username,md5, image_buffer,update_time) + VALUES (?, ?,?,?) + ''' + cursor.execute(insert_sql, [username, md5_hash.hexdigest(), int(time.time()), img_binary]) + cursor.close() + self.commit() # 提交更改 + except: + logger.error(traceback.format_exc()) + return False + return True + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_update_data(db_path, self.DB.cursor(), self.DB, 'ContactHeadImg1', 'usrName', 0) + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() diff --git a/wxManager/db_v3/msg.py b/wxManager/db_v3/msg.py new file mode 100644 index 0000000..577ac41 --- /dev/null +++ b/wxManager/db_v3/msg.py @@ -0,0 +1,301 @@ +import os.path +import shutil +import sqlite3 +import traceback +import concurrent +import hashlib +import threading +from concurrent.futures import ThreadPoolExecutor +from datetime import datetime, date +from typing import Tuple + +from wxManager import MessageType +from wxManager.merge import increase_data, increase_update_data +from wxManager.log import logger +from wxManager.model import DataBaseBase + + +def convert_to_timestamp_(time_input) -> int: + if isinstance(time_input, (int, float)): + # 如果输入是时间戳,直接返回 + return int(time_input) + elif isinstance(time_input, str): + # 如果输入是格式化的时间字符串,将其转换为时间戳 + try: + dt_object = datetime.strptime(time_input, '%Y-%m-%d %H:%M:%S') + return int(dt_object.timestamp()) + except ValueError: + # 如果转换失败,可能是其他格式的字符串,可以根据需要添加更多的处理逻辑 + print("Error: Unsupported date format") + return -1 + elif isinstance(time_input, date): + # 如果输入是datetime.date对象,将其转换为时间戳 + dt_object = datetime.combine(time_input, datetime.min.time()) + return int(dt_object.timestamp()) + else: + print("Error: Unsupported input type") + return -1 + + +def convert_to_timestamp(time_range) -> Tuple[int, int]: + """ + 将时间转换成时间戳 + @param time_range: + @return: + """ + if not time_range: + return 0, 0 + else: + return convert_to_timestamp_(time_range[0]), convert_to_timestamp_(time_range[1]) + + +def get_local_type(type_: MessageType): + type_name_dict = { + MessageType.Text: (1, 0), + MessageType.Image: (3, 0), + MessageType.Audio: (34, 0), + MessageType.Video: (43, 0), + MessageType.Emoji: (47, 0), + MessageType.BusinessCard: (42, 0), + MessageType.OpenIMBCard: (66, 0), + MessageType.Position: (48, 0), + MessageType.FavNote: (49, 40), + MessageType.FavNote: (49, 24), + (49, 53): "接龙", + MessageType.File: (49, 0), + MessageType.Text2: (49, 1), + MessageType.Music: (49, 3), + MessageType.Music: (49, 76), + MessageType.LinkMessage: (49, 5), + MessageType.File: (49, 6), + (49, 8): "用户上传的GIF表情", + MessageType.System: (49, 17), # 发起了位置共享 + MessageType.MergedMessages: (49, 19), + MessageType.Applet: (49, 33), + MessageType.Applet2: (49, 36), + MessageType.WeChatVideo: (49, 51), + (49, 57): MessageType.Quote, + (49, 63): "视频号直播或直播回放等", + (49, 87): "群公告", + (49, 88): "视频号直播或直播回放等", + (49, 2000): MessageType.Transfer, + (49, 2003): "赠送红包封面", + (50, 0): MessageType.Voip, + (10000, 0): MessageType.System, + (10000, 4): MessageType.Pat, + (10000, 8000): MessageType.System + } + return type_name_dict.get(type_, (0, 0)) + + +class Msg(DataBaseBase): + + def _get_messages_by_num(self, cursor, username_, start_sort_seq, msg_num): + sql = ''' + select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent + from MSG + where StrTalker = ? and CreateTime < ? + order by CreateTime desc + limit ? + ''' + cursor.execute(sql, [username_, start_sort_seq, msg_num]) + result = cursor.fetchall() + if result: + return result + else: + return [] + + def get_messages_by_num(self, username, start_sort_seq, msg_num=20): + results = [] + # for db in self.DB: + # cursor = db.cursor() + # yield self._get_messages_by_num(cursor, username, start_sort_seq, msg_num) + lock = threading.Lock() # 锁,用于确保线程安全地写入 results + + def task(db): + """ + 每个线程执行的任务,获取某个数据库实例中的查询结果。 + """ + cursor = db.cursor() + try: + data = self._get_messages_by_num(cursor, username, start_sort_seq, msg_num) + with lock: # 确保对 results 的操作是线程安全的 + results.append(data) + finally: + cursor.close() + + # 使用线程池 + with ThreadPoolExecutor(max_workers=len(self.DB)) as executor: + executor.map(task, self.DB) + self.commit() + return results + + def _get_messages_by_username(self, cursor, username: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + if time_range: + start_time, end_time = convert_to_timestamp(time_range) + sql = f''' + select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent + from MSG + where StrTalker=? + {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} + order by CreateTime + ''' + cursor.execute(sql, [username]) + result = cursor.fetchall() + if result: + return result + else: + return [] + + def get_messages_by_username(self, username: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + with concurrent.futures.ThreadPoolExecutor() as executor: + # 创建一个任务列表 + futures = [ + executor.submit(self._get_messages_by_username, db.cursor(), username, time_range) + for db in self.DB + ] + + # 等待所有任务完成,并获取结果 + results = [] + for future in concurrent.futures.as_completed(futures): + r1 = future.result() + if r1: + # results.append(future.result()) + results.extend(r1) + + return results + + def get_message_by_server_id(self, username, server_id): + """ + 获取小于start_sort_seq的msg_num个消息 + @param username: + @param server_id: + @return: messages, 最后一条消息的start_sort_seq + """ + sql = f''' + select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent + from MSG + where MsgSvrID=? +''' + for db in self.DB: + cursor = db.cursor() + cursor.execute(sql, [server_id]) + result = cursor.fetchone() + if result: + return result + + return None + + def _get_messages_calendar(self, cursor, username): + """ + 获取某个人的聊天日历列表 + @param username_: + @return: + """ + sql = f'''SELECT DISTINCT strftime('%Y-%m-%d',create_time,'unixepoch','localtime') AS date + from MSG + where StrTalker=? + ORDER BY date desc; + ''' + cursor.execute(sql, [username]) + result = cursor.fetchall() + return (data[0] for data in result) + + def get_messages_calendar(self, username): + res = [] + for db in self.DB: + r1 = self._get_messages_calendar(db.cursor(), username) + if r1: + res.extend(r1) + res.sort() + return res + + def _get_messages_by_type(self, cursor, username: str, type_: MessageType, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + if time_range: + start_time, end_time = convert_to_timestamp(time_range) + local_type, sub_type = get_local_type(type_) + sql = f''' + select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent + from MSG + where StrTalker=? and Type=? and SubType = ? + {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} + order by CreateTime + ''' + cursor.execute(sql, [username, local_type, sub_type]) + result = cursor.fetchall() + if result: + return result + else: + return None + + def get_messages_by_type(self, username: str, type_: MessageType, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + with concurrent.futures.ThreadPoolExecutor() as executor: + # 创建一个任务列表 + futures = [ + executor.submit(self._get_messages_by_type, db.cursor(), username, type_, time_range) + for db in self.DB + ] + + # 等待所有任务完成,并获取结果 + results = [] + for future in concurrent.futures.as_completed(futures): + r1 = future.result() + if r1: + # results.append(future.result()) + results.extend(r1) + + return results + + def update_audio_text(self, MsgSvrID_, voicetrans_text): + voicetrans_tag = f'<voicetrans transtext="{voicetrans_text}" istransend="true" tranfailfinish="0" />' + sql_xml = f''' + SELECT StrContent FROM MSG WHERE MsgSvrID = ? + ''' + sql_update = f''' + UPDATE MSG SET StrContent = ? WHERE MsgSvrID = ?''' + try: + lock.acquire(True) + self.cursor.execute(sql_xml, [MsgSvrID_]) + strContent = self.cursor.fetchone()[0] + insert_position = strContent.find('</msg>') + new_strContent = strContent[:insert_position] + voicetrans_tag + strContent[insert_position:] + self.cursor.execute(sql_update, [new_strContent, MsgSvrID_]) + self.DB.commit() + except sqlite3.DatabaseError: + logger.error(f'{traceback.format_exc()}\n数据库损坏请删除msg文件夹重试') + finally: + lock.release() + + def merge(self, db_file_name): + def task_(db_path, cursor, db): + """ + 每个线程执行的任务,获取某个数据库实例中的查询结果。 + """ + increase_data(db_path, cursor, db, 'Name2Id', 'UsrName') + increase_update_data(db_path, cursor, db, 'DBInfo', 'tableIndex') + increase_data(db_path, cursor, db, 'MSG', 'MsgSvrID', exclude_first_column=True) + + tasks = [] + for i in range(100): + db_path = db_file_name.replace('0', f'{i}') + if os.path.exists(db_path): + # print('初始化数据库:', db_path) + file_name = os.path.basename(db_path) + if file_name in self.db_file_name: + index = self.db_file_name.index(file_name) + db = self.DB[index] + cursor = db.cursor() + task_(db_path, cursor, db) + tasks.append([db_path, cursor, db]) + else: + shutil.copy(db_path, os.path.join(self.db_dir, 'Multi', file_name)) + # print(tasks) + # 使用线程池 (没有加快合并速度) + # with ThreadPoolExecutor(max_workers=len(tasks)) as executor: + # executor.map(lambda args: task_(*args), tasks) + self.commit() + print(len(tasks)) diff --git a/wxManager/db_v3/open_im_contact.py b/wxManager/db_v3/open_im_contact.py new file mode 100644 index 0000000..e11f899 --- /dev/null +++ b/wxManager/db_v3/open_im_contact.py @@ -0,0 +1,144 @@ +import os.path +import shutil +import sqlite3 +import threading +import traceback + +from wxManager.merge import increase_update_data +from wxManager.log import logger +from wxManager.model import DataBaseBase + + +class OpenIMContactDB(DataBaseBase): + def get_contacts(self): + result = [] + if not self.open_flag: + return result + try: + sql = '''SELECT UserName,NickName,Type,Remark,BigHeadImgUrl,SmallHeadImgUrl,Source,NickNamePYInit,NickNameQuanPin,RemarkPYInit,RemarkQuanPin,CustomInfoDetail,DescWordingId + FROM OpenIMContact + WHERE Type!=0 AND Type!=4 + ''' + cursor = self.DB.cursor() + cursor.execute(sql) + result = cursor.fetchall() + self.commit() # 提交更改 + except sqlite3.OperationalError: + logger.error(f'数据库错误:\n{traceback.format_exc()}') + res = [] + if result: + for contact in result: + wording = self.get_wordinfo(contact[12]) + if wording: + res.append((*contact, wording[1])) + else: + res.append((*contact, '')) + return res + + def set_remark(self, username, remark): + update_sql = ''' + UPDATE OpenIMContact + SET Remark = ? + WHERE UserName = ? + ''' + cursor = self.DB.cursor() + cursor.execute(update_sql, [remark, username]) + self.commit() # 提交更改 + return True + + def get_contact_by_username(self, username_): + result = [] + if not self.open_flag: + return result + try: + sql = '''SELECT UserName,NickName,Type,Remark,BigHeadImgUrl,SmallHeadImgUrl,Source,NickNamePYInit,NickNameQuanPin,RemarkPYInit,RemarkQuanPin,CustomInfoDetail,DescWordingId + FROM OpenIMContact + WHERE UserName=? + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [username_]) + result = cursor.fetchone() + self.commit() # 提交更改 + except sqlite3.OperationalError: + logger.error(f'数据库错误:\n{traceback.format_exc()}') + if result: + result = list(result) + wording = self.get_wordinfo(result[12]) + if wording: + result.append(wording[1]) + else: + result.append('') + return result + + def get_wordinfo(self, wording_id): + """ + 获取企业微信所在的公司 + @param wording_id: + @return: WordingId, id + Wording, 企业名 + Pinyin, 拼音 + Quanpin, 全拼 + UpdateTime 更新时间 + """ + result = [] + return result + if not self.open_flag: + return result + try: + sql = '''SELECT WordingId,Wording,Pinyin,Quanpin,UpdateTime + FROM OpenIMWordingInfo + WHERE WordingId=? + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [wording_id]) + result = cursor.fetchone() + self.commit() # 提交更改 + except sqlite3.OperationalError: + logger.error(f'数据库错误:\n{traceback.format_exc()}') + return result + + + def increase_source(self, db_path_): + if not (os.path.exists(db_path_) or os.path.isfile(db_path_)): + print(f'{db_path_} 不存在') + return + if not self.sourceDB or not self.sourceCursor: + print(f'企业微信数据异常,尝试修复···') + try: + os.remove(open_im_source_db_path) + except: + pass + try: + shutil.copy(db_path_, open_im_source_db_path) + except: + pass + return + try: + lock.acquire(True) + # 获取列名 + increase_update_data(db_path_, self.sourceCursor, self.sourceDB, 'OpenIMWordingInfo', 'WordingId', 2) + except sqlite3.Error as e: + print(f"数据库操作错误: {e}") + self.sourceDB.rollback() + finally: + lock.release() + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_update_data(db_path, self.cursor, self.DB, 'OpenIMContact', 'UserName', 0) + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() + + +if __name__ == '__main__': + db_path = "./Msg/OpenIMContact.db" + msg = OpenIMContactDB() + msg.init_database() + contacts = msg.get_contacts() + for contact in contacts: + print(contact) diff --git a/wxManager/db_v3/open_im_media.py b/wxManager/db_v3/open_im_media.py new file mode 100644 index 0000000..76a5a4a --- /dev/null +++ b/wxManager/db_v3/open_im_media.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/2/17 21:34 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-open_im_media.py +@Description : +""" + +import os.path +import shutil +import sqlite3 +import traceback + +from wxManager.merge import increase_data +from wxManager.log import logger +from wxManager.model import DataBaseBase + + +class OpenIMMediaDB(DataBaseBase): + def get_media_buffer(self, reserved0): + sql = ''' + select Buf + from OpenIMMedia + where Reserved0 = ? + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [reserved0]) + result = cursor.fetchone() + self.commit() + if result: + return result[0] + else: + return None + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_data(db_path, self.cursor, self.DB, 'OpenIMMedia', 'Reserved0', 1) + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() diff --git a/wxManager/db_v3/open_im_msg.py b/wxManager/db_v3/open_im_msg.py new file mode 100644 index 0000000..9d7a888 --- /dev/null +++ b/wxManager/db_v3/open_im_msg.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/2/17 21:43 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-open_im_msg.py +@Description : +""" + +import os.path +import sqlite3 +import threading +import traceback +import concurrent +import hashlib +import threading +from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor +from datetime import datetime, date +from typing import Tuple + +from wxManager.merge import increase_data, increase_update_data +from wxManager.log import logger +from wxManager.model import DataBaseBase +from wxManager.parser.util.protocbuf.msg_pb2 import MessageBytesExtra + + +def convert_to_timestamp_(time_input) -> int: + if isinstance(time_input, (int, float)): + # 如果输入是时间戳,直接返回 + return int(time_input) + elif isinstance(time_input, str): + # 如果输入是格式化的时间字符串,将其转换为时间戳 + try: + dt_object = datetime.strptime(time_input, '%Y-%m-%d %H:%M:%S') + return int(dt_object.timestamp()) + except ValueError: + # 如果转换失败,可能是其他格式的字符串,可以根据需要添加更多的处理逻辑 + print("Error: Unsupported date format") + return -1 + elif isinstance(time_input, date): + # 如果输入是datetime.date对象,将其转换为时间戳 + dt_object = datetime.combine(time_input, datetime.min.time()) + return int(dt_object.timestamp()) + else: + print("Error: Unsupported input type") + return -1 + + +def convert_to_timestamp(time_range) -> Tuple[int, int]: + """ + 将时间转换成时间戳 + @param time_range: + @return: + """ + if not time_range: + return 0, 0 + else: + return convert_to_timestamp_(time_range[0]), convert_to_timestamp_(time_range[1]) + + +class OpenIMMsgDB(DataBaseBase): + + def _get_messages_by_num(self, cursor, username_, start_sort_seq, msg_num): + """ + + @param cursor: + @param username_: + @param start_sort_seq: + @param msg_num: + @return: + """ + sql = ''' + select localId,TalkerId,Type,statusEx,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,'',Reserved1 + from ChatCRMsg + where StrTalker = ? and CreateTime < ? + order by CreateTime desc + limit ? + ''' + cursor.execute(sql, [username_, start_sort_seq, msg_num]) + result = cursor.fetchall() + if result: + return result + else: + return [] + + def get_messages_by_num(self, username, start_sort_seq, msg_num=20): + results = [self._get_messages_by_num(self.DB.cursor(), username, start_sort_seq, msg_num)] + self.commit() + return results + + def _get_messages_by_username(self, cursor, username: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + if time_range: + start_time, end_time = convert_to_timestamp(time_range) + sql = f''' + select localId,TalkerId,Type,statusEx,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,'',Reserved1 + from ChatCRMsg + where StrTalker=? + {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} + order by CreateTime + ''' + cursor.execute(sql, [username]) + result = cursor.fetchall() + if result: + return result + else: + return [] + + def get_messages_by_username(self, username: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + result = self._get_messages_by_username(self.DB.cursor(), username, time_range) + return [result] + + def get_message_by_server_id(self, username, server_id): + """ + 获取小于start_sort_seq的msg_num个消息 + @param username: + @param server_id: + @return: messages, 最后一条消息的start_sort_seq + """ + sql = f''' + select localId,TalkerId,Type,statusEx,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,'',Reserved1 + from ChatCRMsg + where MsgSvrID=? +''' + for db in self.DB: + cursor = db.cursor() + cursor.execute(sql, [server_id]) + result = cursor.fetchone() + if result: + return result + + return None + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_update_data(db_path, self.cursor, self.DB, 'ChatCRMsg', 'MsgSvrID', 1, exclude_first_column=True) + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() \ No newline at end of file diff --git a/wxManager/db_v3/public_msg.py b/wxManager/db_v3/public_msg.py new file mode 100644 index 0000000..b2fb969 --- /dev/null +++ b/wxManager/db_v3/public_msg.py @@ -0,0 +1,189 @@ +import concurrent +import os.path +import shutil +import sqlite3 +import threading +import traceback +from datetime import date +from typing import Tuple +from concurrent.futures import ThreadPoolExecutor + +from wxManager.merge import increase_data +from wxManager.db_v3.msg import convert_to_timestamp +from wxManager.model import DataBaseBase + + +class PublicMsg(DataBaseBase): + + def get_messages( + self, + username_: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ): + """ + return list + a[0]: localId, + a[1]: talkerId, (和strtalker对应的,不是群聊信息发送人) + a[2]: type, + a[3]: subType, + a[4]: is_sender, + a[5]: timestamp, + a[6]: status, (没啥用) + a[7]: str_content, + a[8]: str_time, (格式化的时间) + a[9]: msgSvrId, + a[10]: BytesExtra, + a[11]: CompressContent, + a[12]: DisplayContent, + a[13]: 联系人的类(如果是群聊就有,不是的话没有这个字段) + """ + if not self.open_flag: + return [] + if time_range: + start_time, end_time = convert_to_timestamp(time_range) + sql = f''' + select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent + from PublicMsg + where StrTalker=? + {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} + order by CreateTime + ''' + try: + lock.acquire(True) + self.cursor.execute(sql, [username_]) + result = self.cursor.fetchall() + finally: + lock.release() + return result + + def get_messages_by_type( + self, + username_: str, + type_, + sub_type=None, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ): + if not self.open_flag: + return [] + if time_range: + start_time, end_time = convert_to_timestamp(time_range) + sql = f''' + select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent + from PublicMsg + where StrTalker=? AND Type=? {'AND SubType=' + str(sub_type) if sub_type else ''} + {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} + order by CreateTime + ''' + try: + lock.acquire(True) + self.cursor.execute(sql, [username_, type_]) + result = self.cursor.fetchall() + finally: + lock.release() + return result + + def get_sport_score_by_name(self, username, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + if not self.open_flag: + return 0 + + def _get_messages_by_num(self, cursor, username_, start_sort_seq, msg_num): + sql = ''' + select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent + from PublicMsg + where StrTalker = ? and CreateTime < ? + order by CreateTime desc + limit ? + ''' + cursor.execute(sql, [username_, start_sort_seq, msg_num]) + result = cursor.fetchall() + if result: + return result + else: + return [] + + def get_messages_by_num(self, username, start_sort_seq, msg_num=20): + cursor = self.DB.cursor() + yield self._get_messages_by_num(cursor, username, start_sort_seq, msg_num) + + def _get_messages_by_username(self, cursor, username: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + if time_range: + start_time, end_time = convert_to_timestamp(time_range) + sql = f''' + select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent + from PublicMsg + where StrTalker=? + {'AND CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} + order by CreateTime + ''' + cursor.execute(sql, [username]) + result = cursor.fetchall() + if result: + return result + else: + return [] + + def get_messages_by_username(self, username: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + return self._get_messages_by_username(self.DB.cursor(),username,time_range) + + def get_message_by_server_id(self, username, server_id): + """ + 获取小于start_sort_seq的msg_num个消息 + @param username: + @param server_id: + @return: messages, 最后一条消息的start_sort_seq + """ + sql = f''' + select localId,TalkerId,Type,SubType,IsSender,CreateTime,Status,StrContent,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,MsgSvrID,BytesExtra,CompressContent,DisplayContent + from PublicMsg + where MsgSvrID=? + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [server_id]) + result = cursor.fetchone() + if result: + return result + return None + + def _get_messages_calendar(self, cursor, username): + """ + 获取某个人的聊天日历列表 + @param username_: + @return: + """ + sql = f'''SELECT DISTINCT strftime('%Y-%m-%d',create_time,'unixepoch','localtime') AS date + from PublicMsg + where StrTalker=? + ORDER BY date desc; + ''' + cursor.execute(sql, [username]) + result = cursor.fetchall() + return (data[0] for data in result) + + def get_messages_calendar(self, username): + res = [] + r1 = self._get_messages_calendar(self.DB.cursor(), username) + if r1: + res.extend(r1) + res.sort() + return res + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_data(db_path, self.cursor, self.DB, 'PublicMsg', 'MsgSvrID', 1, exclude_first_column=True) + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() + + +if __name__ == '__main__': + pdb = PublicMsg() + db_path = "./Msg/PublicMsg.db" + pdb.init_database() + pdb.get_public_msg() diff --git a/wxManager/db_v3/sns.py b/wxManager/db_v3/sns.py new file mode 100644 index 0000000..d7385ab --- /dev/null +++ b/wxManager/db_v3/sns.py @@ -0,0 +1,210 @@ +import os.path +import sqlite3 +import threading +from datetime import date +from typing import Tuple + +from wxManager.db_v3.msg import convert_to_timestamp + +lock = threading.Lock() +DB = None +cursor = None +db_path = '.' + +# db_path = "./app/Database/Msg/Misc.db" + + +# db_path = './Msg/Misc.db' +# 朋友圈类型 +type_ = { + '1': '图文', + '2': '文本', + '3': '应用分享(如:网易云音乐)', + '15': '视频', + '28': '视频号' +} + + +def singleton(cls): + _instance = {} + + def inner(): + if cls not in _instance: + _instance[cls] = cls() + return _instance[cls] + + return inner + + +# @singleton +class Sns: + def __init__(self): + self.DB = None + self.cursor = None + self.open_flag = False + self.init_database() + + def init_database(self, db_dir=''): + global db_path + if not self.open_flag: + if db_dir: + db_path = os.path.join(db_dir, 'Sns.db') + if os.path.exists(db_path): + self.DB = sqlite3.connect(db_path, check_same_thread=False) + # '''创建游标''' + self.cursor = self.DB.cursor() + self.open_flag = True + if lock.locked(): + lock.release() + + def close(self): + if self.open_flag: + try: + lock.acquire(True) + self.open_flag = False + self.DB.close() + finally: + lock.release() + + def get_sns_bg_url(self) -> str: + """ + 获取朋友圈背景URL + @return: + """ + sql = ''' + select StrValue + from SnsConfigV20 + where Key=6; + ''' + try: + lock.acquire(True) + self.cursor.execute(sql) + result = self.cursor.fetchall() + if result: + return result[0][0] + finally: + lock.release() + return '' + + def get_feeds( + self, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ): + """ + + @param time_range: + @return: List[ + a[0]:FeedId, + a[1]:CreateTime,时间戳 + a[2]:StrTime,时间戳, + a[3]:Type,类型, + a[4]:UserName,用户名wxid, + a[5]:Status,状态, + a[6]:StringId,id, + a[7]:Content,xml, + ] + """ + if not self.open_flag: + return None + if time_range: + start_time, end_time = convert_to_timestamp(time_range) + result = [] + sql = f''' + select FeedId,CreateTime,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,Type,UserName,Status,StringId,Content + from FeedsV20 + {'where CreateTime>' + str(start_time) + ' AND CreateTime<' + str(end_time) if time_range else ''} + order by CreateTime + ''' + try: + lock.acquire(True) + self.cursor.execute(sql) + result = self.cursor.fetchall() + finally: + lock.release() + return result + + def get_feeds_by_username( + self, + username, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ): + """ + @param time_range: + @return: List[ + a[0]:FeedId, + a[1]:CreateTime,时间戳 + a[2]:StrTime,时间戳, + a[3]:Type,类型, + a[4]:UserName,用户名wxid, + a[5]:Status,状态, + a[6]:StringId,id, + a[7]:Content,xml, + ] + """ + if not self.open_flag: + return [] + if time_range: + start_time, end_time = convert_to_timestamp(time_range) + result = [] + sql = f''' + select FeedId,CreateTime,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,Type,UserName,Status,StringId,Content + from FeedsV20 + where UserName=? + {' AND CreateTime > ' + str(start_time) + ' AND CreateTime < ' + str(end_time) if time_range else ''} + order by CreateTime + ''' + try: + lock.acquire(True) + self.cursor.execute(sql, [username]) + result = self.cursor.fetchall() + finally: + lock.release() + return result + + def get_comment(self, feed_id): + """ + + @param feed_id: + @return: List[ + a[0]:FeedId, + a[1]:CommentId, + a[2]:CreateTime,时间戳, + a[3]:StrTime, + a[4]:CommentType,用户名wxid, + a[5]:Content, + a[6]:FromUserName + a[7]:ReplyUserName + a[8]:ReplyId + ] + """ + if not self.open_flag: + return [] + + result = [] + sql = f''' + select FeedId,CommentId,CreateTime,strftime('%Y-%m-%d %H:%M:%S',CreateTime,'unixepoch','localtime') as StrTime,CommentType,Content,FromUserName,ReplyUserName,ReplyId + from CommentV20 + where FeedId=? + ''' + try: + lock.acquire(True) + self.cursor.execute(sql, [feed_id]) + result = self.cursor.fetchall() + finally: + lock.release() + return result + + def __del__(self): + self.close() + + +if __name__ == '__main__': + db_path = "./Msg1/Sns.db" + sns_db = Sns() + sns_db.init_database() + print(sns_db.get_sns_bg_url()) + feeds = sns_db.get_feeds_by_username('wxid_27hqbq7vx5hf22') + print(feeds) + for feed in feeds: + comment = sns_db.get_comment(feed[0]) + print(comment) diff --git a/wxManager/db_v4/__init__.py b/wxManager/db_v4/__init__.py new file mode 100644 index 0000000..8e1236e --- /dev/null +++ b/wxManager/db_v4/__init__.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/5 22:46 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-__init__.py.py +@Description : +""" + +from .message import MessageDB +from .contact import ContactDB +from .session import SessionDB +from .head_image import HeadImageDB +from .hardlink import HardLinkDB + +if __name__ == '__main__': + pass diff --git a/wxManager/db_v4/biz_message.py b/wxManager/db_v4/biz_message.py new file mode 100644 index 0000000..c1f7643 --- /dev/null +++ b/wxManager/db_v4/biz_message.py @@ -0,0 +1,311 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/2/28 0:40 +@Author : SiYuan +@Email : 863909694@qq.com +@File : wxManager-biz_message.py +@Description : +""" +import concurrent +import hashlib +import os +import shutil +import threading +from concurrent.futures import ThreadPoolExecutor +from datetime import date, datetime +from typing import Tuple + +from wxManager import MessageType +from wxManager.merge import increase_data, increase_update_data +from wxManager.model.db_model import DataBaseBase + + +def convert_to_timestamp_(time_input) -> int: + if isinstance(time_input, (int, float)): + # 如果输入是时间戳,直接返回 + return int(time_input) + elif isinstance(time_input, str): + # 如果输入是格式化的时间字符串,将其转换为时间戳 + try: + dt_object = datetime.strptime(time_input, '%Y-%m-%d %H:%M:%S') + return int(dt_object.timestamp()) + except ValueError: + # 如果转换失败,可能是其他格式的字符串,可以根据需要添加更多的处理逻辑 + print("Error: Unsupported date format") + return -1 + elif isinstance(time_input, date): + # 如果输入是datetime.date对象,将其转换为时间戳 + dt_object = datetime.combine(time_input, datetime.min.time()) + return int(dt_object.timestamp()) + else: + print("Error: Unsupported input type") + return -1 + + +def convert_to_timestamp(time_range) -> Tuple[int, int]: + """ + 将时间转换成时间戳 + @param time_range: + @return: + """ + if not time_range: + return 0, 0 + else: + return convert_to_timestamp_(time_range[0]), convert_to_timestamp_(time_range[1]) + + +def get_local_type(type_: MessageType): + return type_ + + +class BizMessageDB(DataBaseBase): + columns = ( + "local_id,server_id,local_type,sort_seq,Name2Id.user_name as sender_username,create_time,strftime('%Y-%m-%d %H:%M:%S'," + "create_time,'unixepoch','localtime') as StrTime,status,upload_status,server_seq,origin_source,source," + "message_content,compress_content") + + def get_messages(self): + pass + + def table_exists(self, cursor, table_name): + # 查询 sqlite_master 系统表,判断表是否存在 + cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name=?;", (table_name,)) + result = cursor.fetchone() + # 如果结果不为空,表存在;否则表不存在 + return result + + def _get_messages_by_username(self, cursor, username: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + table_name = f'Msg_{hashlib.md5(username.encode("utf-8")).hexdigest()}' + if not self.table_exists(cursor, table_name): + return None + if time_range: + start_time, end_time = convert_to_timestamp(time_range) + sql = f''' +select {BizMessageDB.columns} +from {table_name} as msg +join Name2Id on msg.real_sender_id = Name2Id.rowid +{'where create_time>' + str(start_time) + ' AND create_time<' + str(end_time) if time_range else ''} +order by sort_seq + ''' + cursor.execute(sql) + result = cursor.fetchall() + if result: + return result + else: + return None + + def get_messages_by_username(self, username: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + with concurrent.futures.ThreadPoolExecutor() as executor: + # 创建一个任务列表 + futures = [ + executor.submit(self._get_messages_by_username, db.cursor(), username, time_range) + for db in self.DB + ] + + # 等待所有任务完成,并获取结果 + results = [] + for future in concurrent.futures.as_completed(futures): + r1 = future.result() + if r1: + # results.append(future.result()) + results.extend(r1) + + return results + results = [] + # for db in self.DB: + # cursor = db.cursor() + # yield self._get_messages_by_num(cursor, username, start_sort_seq, msg_num) + lock = threading.Lock() # 锁,用于确保线程安全地写入 results + + def task(db): + """ + 每个线程执行的任务,获取某个数据库实例中的查询结果。 + """ + cursor = db.cursor() + try: + data = self._get_messages_by_username(cursor, username, time_range) + with lock: # 确保对 results 的操作是线程安全的 + results.append(data) + finally: + cursor.close() + + # 使用线程池 + with ThreadPoolExecutor(max_workers=len(self.DB)) as executor: + executor.map(task, self.DB) + self.commit() + return results + + def _get_messages_by_num(self, cursor, username, start_sort_seq, msg_num): + table_name = f'Msg_{hashlib.md5(username.encode("utf-8")).hexdigest()}' + if not self.table_exists(cursor, table_name): + return [] + sql = f''' + select {BizMessageDB.columns} + from {table_name} as msg + join Name2Id on msg.real_sender_id = Name2Id.rowid + where sort_seq < ? + order by sort_seq desc + limit ? + ''' + cursor.execute(sql, [start_sort_seq, msg_num]) + result = cursor.fetchall() + if result: + return result + else: + return [] + + def get_message_by_server_id(self, username, server_id): + """ + 获取小于start_sort_seq的msg_num个消息 + @param username: + @param server_id: + @return: messages, 最后一条消息的start_sort_seq + """ + table_name = f'Msg_{hashlib.md5(username.encode("utf-8")).hexdigest()}' + sql = f''' +select {BizMessageDB.columns} +from {table_name} as msg +join Name2Id on msg.real_sender_id = Name2Id.rowid +where server_id = ? +''' + for db in self.DB: + cursor = db.cursor() + if not self.table_exists(cursor, table_name): + continue + cursor.execute(sql, [server_id]) + result = cursor.fetchone() + if result: + return result + + def get_messages_by_num(self, username, start_sort_seq, msg_num=20): + results = [] + # for db in self.DB: + # cursor = db.cursor() + # yield self._get_messages_by_num(cursor, username, start_sort_seq, msg_num) + lock = threading.Lock() # 锁,用于确保线程安全地写入 results + + def task(db): + """ + 每个线程执行的任务,获取某个数据库实例中的查询结果。 + """ + cursor = db.cursor() + try: + data = self._get_messages_by_num(cursor, username, start_sort_seq, msg_num) + with lock: # 确保对 results 的操作是线程安全的 + results.append(data) + finally: + cursor.close() + + # 使用线程池 + with ThreadPoolExecutor(max_workers=len(self.DB)) as executor: + executor.map(task, self.DB) + self.commit() + return results + + def _get_messages_calendar(self, cursor, username): + """ + 获取某个人的聊天日历列表 + @param username_: + @return: + """ + table_name = f'Msg_{hashlib.md5(username.encode("utf-8")).hexdigest()}' + if not self.table_exists(cursor, table_name): + return None + sql = f'''SELECT DISTINCT strftime('%Y-%m-%d',create_time,'unixepoch','localtime') AS date + from {table_name} as msg + ORDER BY date desc; + ''' + cursor.execute(sql) + result = cursor.fetchall() + return (data[0] for data in result) + + def get_messages_calendar(self, username): + res = [] + for db in self.DB: + r1 = self._get_messages_calendar(db.cursor(), username) + if r1: + res.extend(r1) + res.sort() + return res + + def _get_messages_by_type(self, cursor, username: str, type_: MessageType, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + table_name = f'Msg_{hashlib.md5(username.encode("utf-8")).hexdigest()}' + if not self.table_exists(cursor, table_name): + return None + if time_range: + start_time, end_time = convert_to_timestamp(time_range) + local_type = get_local_type(type_) + sql = f''' +select {BizMessageDB.columns} +from {table_name} as msg +join Name2Id on msg.real_sender_id = Name2Id.rowid +where local_type=? {'and create_time>' + str(start_time) + ' AND create_time<' + str(end_time) if time_range else ''} +order by sort_seq + ''' + cursor.execute(sql, [local_type]) + result = cursor.fetchall() + if result: + return result + else: + return None + + def get_messages_by_type(self, username: str, type_: MessageType, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + with concurrent.futures.ThreadPoolExecutor() as executor: + # 创建一个任务列表 + futures = [ + executor.submit(self._get_messages_by_type, db.cursor(), username, type_, time_range) + for db in self.DB + ] + + # 等待所有任务完成,并获取结果 + results = [] + for future in concurrent.futures.as_completed(futures): + r1 = future.result() + if r1: + # results.append(future.result()) + results.extend(r1) + + return results + + def merge(self, db_file_name): + def task_(db_path, cursor, db): + """ + 每个线程执行的任务,获取某个数据库实例中的查询结果。 + """ + increase_data(db_path, cursor, db, 'Name2Id', 'user_name') + increase_update_data(db_path, cursor, db, 'TimeStamp', 'timestamp') + cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") + result = cursor.fetchall() + # print(result) + if result: + for row in result: + table_name = row[0] + if table_name.startswith('Msg'): + increase_data(db_path, cursor, db, table_name, 'server_id', exclude_first_column=True) + + tasks = [] + for i in range(100): + db_path = db_file_name.replace('0', f'{i}') + if os.path.exists(db_path): + # print('初始化数据库:', db_path) + file_name = os.path.basename(db_path) + if file_name in self.db_file_name: + index = self.db_file_name.index(file_name) + db = self.DB[index] + cursor = db.cursor() + task_(db_path, cursor, db) + tasks.append([db_path, cursor, db]) + else: + shutil.copy(db_path, os.path.join(self.db_dir, 'message')) + # print(tasks) + # 使用线程池 (没有加快合并速度) + # with ThreadPoolExecutor(max_workers=len(tasks)) as executor: + # executor.map(lambda args: task_(*args), tasks) + self.commit() + print(len(tasks)) diff --git a/wxManager/db_v4/contact.py b/wxManager/db_v4/contact.py new file mode 100644 index 0000000..91d4bce --- /dev/null +++ b/wxManager/db_v4/contact.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/5 22:47 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-contact.py +@Description : +""" +import os +import traceback + +from wxManager.merge import increase_update_data, increase_data +from wxManager.model.db_model import DataBaseBase + + +class ContactDB(DataBaseBase): + def create_index(self): + sql = "CREATE INDEX IF NOT EXISTS contact_username ON contact(username);" + try: + cursor = self.DB.cursor() + cursor.execute(sql) + self.commit() + cursor.close() + return True + except: + return False + + def get_label_by_id(self, label_id) -> str: + sql = ''' + select label_name_ from contact_label + where label_id_ = ? + ''' + try: + cursor = self.DB.cursor() + cursor.execute(sql, [label_id]) + result = cursor.fetchone() + if result: + return result[0] + else: + return '' + except: + return '' + + def get_labels(self, label_id_list) -> str: + if not label_id_list: + return '' + return ','.join(map(self.get_label_by_id, label_id_list.strip(',').split(','))) + + def get_contacts(self): + if not self.open_flag: + return [] + self.create_index() + ''' + @return: + a[0]:username + a[1]:alias + a[2]:local_type + a[3]:flag + a[4]:remark + a[5]:nick_name + a[6]:pin_yin_initial + a[7]:remark_pin_yin_initial + a[8]:small_head_url + a[9]:big_head_url + a[10]:extra_buffer + a[11]:head_img_md5 + a[12]: + a[13]: + a[14]: + ''' + sql = ''' +SELECT username, alias, local_type, flag, remark, nick_name, pin_yin_initial, remark_pin_yin_initial, small_head_url, big_head_url,extra_buffer,head_img_md5,chat_room_notify,is_in_chat_room,description,chat_room_type +FROM contact +WHERE (local_type=1 or local_type=2 or local_type=5) +ORDER BY + CASE + WHEN remark_quan_pin = '' THEN quan_pin + ELSE remark_quan_pin + END ASC + ''' + self.cursor.execute(sql) + results = self.cursor.fetchall() + self.DB.commit() + return results + + def get_contact_by_username(self, username): + sql = ''' +SELECT username, alias, local_type,flag, remark, nick_name, pin_yin_initial, remark_pin_yin_initial, small_head_url, big_head_url,extra_buffer,head_img_md5,chat_room_notify,is_in_chat_room,description,chat_room_type +FROM contact +WHERE username=? + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [username]) + result = cursor.fetchone() + cursor.close() + # self.commit() + if result: + return result + return None + + def get_chatroom_info(self, username): + sql = ''' +select id,ext_buffer,username,owner +from chat_room +where username=? + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [username]) + result = cursor.fetchone() + cursor.close() + if result: + return result + return None + + def set_remark(self, username, remark): + if not remark: + return False + sql = ''' + update contact + set remark=? + where username=? + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [remark, username]) + cursor.close() + self.commit() + return True + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_update_data(db_path, self.cursor, self.DB, 'biz_info', 'username') + increase_update_data(db_path, self.cursor, self.DB, 'chat_room', 'username') + increase_update_data(db_path, self.cursor, self.DB, 'chat_room_info_detail', 'room_id_') + increase_update_data(db_path, self.cursor, self.DB, 'contact', 'username') + increase_update_data(db_path, self.cursor, self.DB, 'contact_label', 'label_id_') + increase_update_data(db_path, self.cursor, self.DB, 'openim_acct_type', 'lang_id') + increase_update_data(db_path, self.cursor, self.DB, 'openim_appid', 'lang_id') + # increase_update_data(db_path, self.cursor, self.DB, 'chat_room_member', 'room_id_') + increase_data(db_path, self.cursor, self.DB, 'name2id', 'username') + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() + + +if __name__ == '__main__': + pass diff --git a/wxManager/db_v4/emotion.py b/wxManager/db_v4/emotion.py new file mode 100644 index 0000000..24a3c86 --- /dev/null +++ b/wxManager/db_v4/emotion.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/12 18:10 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-emotion.py +@Description : +""" +import os +import traceback + +from wxManager.merge import increase_data +from wxManager.model import DataBaseBase + + +class EmotionDB(DataBaseBase): + def get_emoji_url(self, md5, thumb=False): + emoji_info = self._get_emoji_info(md5) + if emoji_info: + return emoji_info[1] if thumb else emoji_info[2] + else: + return '' + + def _get_emoji_info(self, md5): + sql = ''' + select aes_key,thumb_url,cdn_url + from kNonStoreEmoticonTable + where md5=? + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [md5]) + result = cursor.fetchone() + if result: + return result + else: + return None + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_data(db_path, self.cursor, self.DB, 'kNonStoreEmoticonTable', 'md5') + increase_data(db_path, self.cursor, self.DB, 'kStoreEmoticonCaptionsTable', 'md5_') + increase_data(db_path, self.cursor, self.DB, 'kStoreEmoticonFilesTable', 'md5_') + increase_data(db_path, self.cursor, self.DB, 'kStoreEmoticonPackageTable', 'package_id_') + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() + +if __name__ == '__main__': + pass diff --git a/wxManager/db_v4/hardlink.py b/wxManager/db_v4/hardlink.py new file mode 100644 index 0000000..8ed84e2 --- /dev/null +++ b/wxManager/db_v4/hardlink.py @@ -0,0 +1,277 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/8 17:30 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-hardlink.py +@Description : +""" +import hashlib +import os +import traceback +from lxml import etree + +from wxManager import Me +from wxManager.merge import increase_data +from wxManager.model.db_model import DataBaseBase +from wxManager.log import logger +from wxManager.model.message import Message +from wxManager.parser.util.protocbuf import file_info_pb2 +from google.protobuf.json_format import MessageToJson, MessageToDict + +image_root_path = "msg\\attach\\" +video_root_path = "msg\\video\\" +file_root_path = "msg\\file\\" + + +def get_md5_from_xml(content, type_="img"): + if not content: + return None + try: + content = content.strip('null:').strip().replace(' length="0" ', ' ') # 哪个天才在xml里写两个一样的字段 length="0" + # 解析XML + parser = etree.XMLParser(recover=True) + root = etree.fromstring(content, parser=parser) + if type_ == "img": + # 提取md5的值 + md5_value = root.find(".//img").get("md5") + elif type_ == "video": + md5_value = root.find(".//videomsg").get("md5") + else: + md5_value = None + # print(md5_value) + return md5_value + except: + logger.error(traceback.format_exc()) + logger.error(content) + return None + + +class HardLinkDB(DataBaseBase): + def get_image_path(self): + pass + + def create_index(self): + sql = "CREATE INDEX IF NOT EXISTS image_hardlink_info_v3_md5 ON image_hardlink_info_v3(md5);" + try: + cursor = self.DB.cursor() + cursor.execute(sql) + self.commit() + cursor.close() + except: + pass + + sql = "CREATE INDEX IF NOT EXISTS video_hardlink_info_v3_md5 ON video_hardlink_info_v3(md5);" + try: + cursor = self.DB.cursor() + cursor.execute(sql) + self.commit() + cursor.close() + except: + pass + + sql = "CREATE INDEX IF NOT EXISTS file_hardlink_info_v3_md5 ON file_hardlink_info_v3(md5);" + try: + cursor = self.DB.cursor() + cursor.execute(sql) + self.commit() + cursor.close() + except: + pass + + def get_image_by_md5(self, md5: str): + sql = ''' + select file_size,type,file_name,dir2id.username,dir2id2.username,_rowid_,modify_time,extra_buffer + from image_hardlink_info_v3 + join dir2id on dir2id.rowid = dir1 + join dir2id as dir2id2 on dir2id2.rowid=dir2 + where md5=? + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [md5]) + result = cursor.fetchall() + if result: + return result[0] + return None + + def get_video_by_md5(self, md5: str): + sql = ''' + SELECT file_size, type, file_name, dir2id.username, dir2id2.username, _rowid_, modify_time, extra_buffer + FROM video_hardlink_info_v3 + JOIN dir2id ON dir2id.rowid = dir1 + LEFT JOIN dir2id AS dir2id2 ON dir2id2.rowid = dir2 AND dir2 != 0 + WHERE md5 = ? + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [md5]) + result = cursor.fetchall() + if result: + return result[0] + return None + + def get_file_by_md5(self, md5: str): + sql = ''' + select file_size,type,file_name,dir2id.username,dir2id2.username,_rowid_,modify_time,extra_buffer + from file_hardlink_info_v3 + join dir2id on dir2id.rowid = dir1 + LEFT JOIN dir2id AS dir2id2 ON dir2id2.rowid = dir2 AND dir2 != 0 + where md5=? + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [md5]) + result = cursor.fetchall() + if result: + return result[0] + return None + + def get_video(self, md5, thumb=False): + video_info = self.get_video_by_md5(md5) + if video_info: + type_ = video_info[1] + if type_ == 5: + dir1 = video_info[3] + dir2 = video_info[4] + extra_buffer = video_info[7] + # 创建顶级消息对象 + message = file_info_pb2.FileInfoData() + # 解析二进制数据 + message.ParseFromString(extra_buffer) + extra_dic = MessageToDict(message) + dir3 = extra_dic.get('dir3', '') + file_name = video_info[2] + result = os.path.join(video_root_path, dir1, dir2, 'Rec', dir3, 'V', file_name) + else: + dir1 = video_info[3] + data_image = video_info[2].split('.')[0] + '_thumb.jpg' if thumb else video_info[2] + dat_image = os.path.join(video_root_path, dir1, data_image) + result = dat_image + return result + return '' + + def get_image_thumb(self, message: Message, talker_username): + """ + @param message: + @param talker_username: 聊天对象的wxid + @return: + """ + dir1 = hashlib.md5(talker_username.encode('utf-8')).hexdigest() + str_time = message.str_time + dir2 = str_time[:7] # 2024-12 + dir0 = "Img" + local_id = message.local_id + create_time = message.timestamp + data_image = f'{message.file_name}_t.dat' if message.file_name else f'{local_id}_{create_time}_t.dat' + return os.path.join(image_root_path, dir1, dir2, dir0, data_image) + + def get_image_by_time(self, message: Message, talker_username): + """ + @param message: + @param talker_username: 聊天对象的wxid + @return: + """ + dir1 = hashlib.md5(talker_username.encode('utf-8')).hexdigest() + str_time = message.str_time + dir2 = str_time[:7] # 2024-12 + dir0 = "Img" + local_id = message.local_id + create_time = message.timestamp + data_image = f'{message.file_name}_W.dat' if message.file_name else f'{local_id}_{create_time}_W.dat' + path1 = os.path.join(image_root_path, dir1, dir2, dir0, data_image) + if os.path.exists(os.path.join(Me().wx_dir, path1)): + return path1 + else: + data_image = f'{message.file_name}.dat' if message.file_name else f'{local_id}_{create_time}.dat' + path1 = os.path.join(image_root_path, dir1, dir2, dir0, data_image) + return path1 + + def get_image(self, content, message, up_dir="", md5=None, thumb=False, talker_username='') -> str: + """ + @param content: image xml + @param message: + @param up_dir: + @param md5: image的md5 + @param thumb: 是否是缩略图 + @param talker_username: 聊天对象的wxid + @return: + """ + result = '.' + self.create_index() + if thumb: + return self.get_image_thumb(message, talker_username) + else: + result = self.get_image_by_time(message, talker_username) + if os.path.exists(os.path.join(Me().wx_dir, result)): + return result + if not md5: + md5 = get_md5_from_xml(content) + if md5: + imginfo = self.get_image_by_md5(md5) + if imginfo: + type_ = imginfo[1] + if type_ == 4: + dir1 = imginfo[3] + dir2 = imginfo[4] + extra_buffer = imginfo[7] + # 创建顶级消息对象 + message = file_info_pb2.FileInfoData() + # 解析二进制数据 + message.ParseFromString(extra_buffer) + extra_dic = MessageToDict(message) + dir3 = extra_dic.get('dir3', '') + file_name = imginfo[2] + result = os.path.join(image_root_path, dir1, dir2, 'Rec', dir3, 'Img', file_name) + else: + dir1 = imginfo[3] + dir2 = imginfo[4] + data_image = imginfo[2] + dir0 = "Img" + dat_image = os.path.join(image_root_path, dir1, dir2, dir0, data_image) + result = dat_image + else: + result = self.get_image_thumb(message, talker_username) + else: + result = self.get_image_by_time(message, talker_username) + return result + + def get_file(self, md5): + file_info = self.get_file_by_md5(md5) + if file_info: + type_ = file_info[1] + if type_ == 6: + dir1 = file_info[3] + dir2 = file_info[4] + extra_buffer = file_info[7] + # 创建顶级消息对象 + message = file_info_pb2.FileInfoData() + # 解析二进制数据 + message.ParseFromString(extra_buffer) + extra_dic = MessageToDict(message) + dir3 = extra_dic.get('dir3', '') + file_name = file_info[2] + filepath = os.path.join(image_root_path, dir1, dir2, dir3, file_name) + else: + dir1 = file_info[3] + filename = file_info[2] + filepath = os.path.join(file_root_path, dir1, filename) + return filepath + return '' + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_data(db_path, self.cursor, self.DB, 'file_hardlink_info_v3', 'md5') + increase_data(db_path, self.cursor, self.DB, 'image_hardlink_info_v3', 'md5') + increase_data(db_path, self.cursor, self.DB, 'video_hardlink_info_v3', 'md5') + increase_data(db_path, self.cursor, self.DB, 'dir2id', 'username') + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() + + +if __name__ == '__main__': + pass diff --git a/wxManager/db_v4/head_image.py b/wxManager/db_v4/head_image.py new file mode 100644 index 0000000..6760153 --- /dev/null +++ b/wxManager/db_v4/head_image.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/5 23:35 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-head_image.py +@Description : +""" +import hashlib +import io +import os +import time +import traceback + +from PIL import Image + +from wxManager.merge import increase_update_data +from wxManager.model.db_model import DataBaseBase +from wxManager.log import logger + + +class HeadImageDB(DataBaseBase): + def get_avatar_buffer(self, username): + if not self.open_flag: + return b'' + sql = ''' +select image_buffer +from head_image +where username = ? + ''' + cursor = self.DB.cursor() + cursor.execute(sql, [username]) + result = cursor.fetchall() + cursor.close() + self.DB.commit() + if result: + return result[0][0] + else: + return b'' + + def set_avatar_buffer(self, username, img_path): + try: + # 打开图片并缩放 + with Image.open(img_path) as img: + img = img.resize((128, 128)) + + # 将图片转换为二进制格式 + img_byte_arr = io.BytesIO() + img.save(img_byte_arr, format='PNG') # 可以根据需要更改格式 + img_binary = img_byte_arr.getvalue() + md5_hash = hashlib.md5() + md5_hash.update(img_binary) + + update_sql = ''' + UPDATE head_image + SET update_time = ?,image_buffer=?,md5=? + WHERE username = ? + ''' + cursor = self.DB.cursor() + cursor.execute(update_sql, [int(time.time()), img_binary, username, md5_hash.hexdigest()]) + # 检查是否有行被更新 + if cursor.rowcount == 0: + # 如果没有更新,则插入新记录 + insert_sql = ''' + INSERT INTO head_image (username,md5, image_buffer,update_time) + VALUES (?, ?,?,?) + ''' + cursor.execute(insert_sql, [username, md5_hash.hexdigest(), int(time.time()), img_binary]) + cursor.close() + self.commit() # 提交更改 + except: + logger.error(traceback.format_exc()) + return False + return True + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_update_data(db_path, self.cursor, self.DB, 'head_image', 'username') + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() + + +if __name__ == '__main__': + pass diff --git a/wxManager/db_v4/media.py b/wxManager/db_v4/media.py new file mode 100644 index 0000000..bb93ca4 --- /dev/null +++ b/wxManager/db_v4/media.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/12 17:06 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-media.py +@Description : +""" +import os +import subprocess +import sys +import traceback + +from wxManager.merge import increase_update_data, increase_data +from wxManager.model import DataBaseBase +from wxManager.log import logger + + +def get_ffmpeg_path(): + # 获取打包后的资源目录 + resource_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__))) + + # 构建 FFmpeg 可执行文件的路径 + ffmpeg_path = os.path.join(resource_dir, 'app', 'resources', 'data', 'ffmpeg.exe') + + return ffmpeg_path + + +class MediaDB(DataBaseBase): + def get_media_buffer(self, server_id) -> bytes: + sql = ''' + select voice_data + from VoiceInfo + where svr_id = ? + ''' + for db in self.DB: + cursor = db.cursor() + cursor.execute(sql, [server_id]) + result = cursor.fetchone() + if result: + return result[0] + return b'' + + def get_audio_path(self, server_id, output_dir, filename=''): + if filename: + return f'{output_dir}/{filename}.mp3' + else: + return f'{output_dir}/{server_id}.mp3' + + def get_audio(self, server_id, output_dir, filename=''): + if not filename: + filename = server_id + silk_path = f"{output_dir}/{filename}.silk" + pcm_path = f"{output_dir}/{filename}.pcm" + mp3_path = f"{output_dir}/{filename}.mp3" + if os.path.exists(mp3_path): + return mp3_path + buf = self.get_media_buffer(server_id) + if not buf: + return '' + with open(silk_path, "wb") as f: + f.write(buf) + # open(silk_path, "wb").write() + try: + decode(silk_path, pcm_path, 44100) + # 调用系统上的 ffmpeg 可执行文件 + # 获取 FFmpeg 可执行文件的路径 + ffmpeg_path = get_ffmpeg_path() + # # 调用 FFmpeg + if os.path.exists(ffmpeg_path): + cmd = f'''"{ffmpeg_path}" -loglevel quiet -y -f s16le -i "{pcm_path}" -ar 44100 -ac 1 "{mp3_path}"''' + # system(cmd) + # 使用subprocess.run()执行命令 + subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + else: + # 源码运行的时候下面的有效 + # 这里不知道怎么捕捉异常 + cmd = f'''"{os.path.join(os.getcwd(), 'app', 'resources', 'data', 'ffmpeg.exe')}" -loglevel quiet -y -f s16le -i "{pcm_path}" -ar 44100 -ac 1 "{mp3_path}"''' + # system(cmd) + # 使用subprocess.run()执行命令 + subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if os.path.exists(silk_path): + os.remove(silk_path) + if os.path.exists(pcm_path): + os.remove(pcm_path) + except Exception as e: + print(f"Error: {e}") + logger.error(f'语音错误\n{traceback.format_exc()}') + cmd = f'''"{os.path.join(os.getcwd(), 'app', 'resources', 'data', 'ffmpeg.exe')}" -loglevel quiet -y -f s16le -i "{pcm_path}" -ar 44100 -ac 1 "{mp3_path}"''' + # system(cmd) + # 使用subprocess.run()执行命令 + subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + finally: + return mp3_path + + def merge(self, db_path): + # todo 判断数据库对应情况 + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + for db in self.DB: + cursor = db.cursor() + try: + # 获取列名 + increase_data(db_path, cursor, db, 'VoiceInfo', 'svr_id') + increase_data(db_path, cursor, db, 'Name2Id', 'user_name') + increase_update_data(db_path, cursor, db, 'Timestamp', 'timestamp') + except: + print(f"数据库操作错误: {traceback.format_exc()}") + db.rollback() + + +if __name__ == '__main__': + pass diff --git a/wxManager/db_v4/message.py b/wxManager/db_v4/message.py new file mode 100644 index 0000000..62af58f --- /dev/null +++ b/wxManager/db_v4/message.py @@ -0,0 +1,316 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/6 23:07 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-message.py +@Description : +""" +import concurrent +import hashlib +import os +import shutil +import threading +import traceback +from concurrent.futures import ThreadPoolExecutor +from datetime import date, datetime +from typing import Tuple + +from wxManager import MessageType +from wxManager.merge import increase_data, increase_update_data +from wxManager.model.db_model import DataBaseBase + + +def convert_to_timestamp_(time_input) -> int: + if isinstance(time_input, (int, float)): + # 如果输入是时间戳,直接返回 + return int(time_input) + elif isinstance(time_input, str): + # 如果输入是格式化的时间字符串,将其转换为时间戳 + try: + dt_object = datetime.strptime(time_input, '%Y-%m-%d %H:%M:%S') + return int(dt_object.timestamp()) + except ValueError: + # 如果转换失败,可能是其他格式的字符串,可以根据需要添加更多的处理逻辑 + print("Error: Unsupported date format") + return -1 + elif isinstance(time_input, date): + # 如果输入是datetime.date对象,将其转换为时间戳 + dt_object = datetime.combine(time_input, datetime.min.time()) + return int(dt_object.timestamp()) + else: + print("Error: Unsupported input type") + return -1 + + +def convert_to_timestamp(time_range) -> Tuple[int, int]: + """ + 将时间转换成时间戳 + @param time_range: + @return: + """ + if not time_range: + return 0, 0 + else: + return convert_to_timestamp_(time_range[0]), convert_to_timestamp_(time_range[1]) + + +def get_local_type(type_: MessageType): + return type_ + + +class MessageDB(DataBaseBase): + columns = ( + "local_id,server_id,local_type,sort_seq,Name2Id.user_name as sender_username,create_time,strftime('%Y-%m-%d %H:%M:%S'," + "create_time,'unixepoch','localtime') as StrTime,status,upload_status,server_seq,origin_source,source," + "message_content,compress_content,packed_info_data") + + def get_messages(self): + pass + + def table_exists(self, cursor, table_name): + # 查询 sqlite_master 系统表,判断表是否存在 + cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name=?;", (table_name,)) + result = cursor.fetchone() + # 如果结果不为空,表存在;否则表不存在 + return result + + def _get_messages_by_username(self, cursor, username: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + table_name = f'Msg_{hashlib.md5(username.encode("utf-8")).hexdigest()}' + if not self.table_exists(cursor, table_name): + return None + if time_range: + start_time, end_time = convert_to_timestamp(time_range) + sql = f''' +select {MessageDB.columns} +from {table_name} as msg +join Name2Id on msg.real_sender_id = Name2Id.rowid +{'where create_time>' + str(start_time) + ' AND create_time<' + str(end_time) if time_range else ''} +order by sort_seq + ''' + cursor.execute(sql) + result = cursor.fetchall() + if result: + return result + else: + return None + + def get_messages_by_username(self, username: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + with concurrent.futures.ThreadPoolExecutor() as executor: + # 创建一个任务列表 + futures = [ + executor.submit(self._get_messages_by_username, db.cursor(), username, time_range) + for db in self.DB + ] + + # 等待所有任务完成,并获取结果 + results = [] + for future in concurrent.futures.as_completed(futures): + r1 = future.result() + if r1: + # results.append(future.result()) + results.extend(r1) + + return results + results = [] + # for db in self.DB: + # cursor = db.cursor() + # yield self._get_messages_by_num(cursor, username, start_sort_seq, msg_num) + lock = threading.Lock() # 锁,用于确保线程安全地写入 results + + def task(db): + """ + 每个线程执行的任务,获取某个数据库实例中的查询结果。 + """ + cursor = db.cursor() + try: + data = self._get_messages_by_username(cursor, username, time_range) + with lock: # 确保对 results 的操作是线程安全的 + results.append(data) + finally: + cursor.close() + + # 使用线程池 + with ThreadPoolExecutor(max_workers=len(self.DB)) as executor: + executor.map(task, self.DB) + self.commit() + return results + + def _get_messages_by_num(self, cursor, username, start_sort_seq, msg_num): + table_name = f'Msg_{hashlib.md5(username.encode("utf-8")).hexdigest()}' + if not self.table_exists(cursor, table_name): + return [] + sql = f''' + select {MessageDB.columns} + from {table_name} as msg + join Name2Id on msg.real_sender_id = Name2Id.rowid + where sort_seq < ? + order by sort_seq desc + limit ? + ''' + cursor.execute(sql, [start_sort_seq, msg_num]) + result = cursor.fetchall() + if result: + return result + else: + return [] + + def get_message_by_server_id(self, username, server_id): + """ + 获取小于start_sort_seq的msg_num个消息 + @param username: + @param server_id: + @return: messages, 最后一条消息的start_sort_seq + """ + table_name = f'Msg_{hashlib.md5(username.encode("utf-8")).hexdigest()}' + sql = f''' +select {MessageDB.columns} +from {table_name} as msg +join Name2Id on msg.real_sender_id = Name2Id.rowid +where server_id = ? +''' + for db in self.DB: + cursor = db.cursor() + if not self.table_exists(cursor, table_name): + continue + cursor.execute(sql, [server_id]) + result = cursor.fetchone() + if result: + return result + + def get_messages_by_num(self, username, start_sort_seq, msg_num=20): + results = [] + # for db in self.DB: + # cursor = db.cursor() + # yield self._get_messages_by_num(cursor, username, start_sort_seq, msg_num) + lock = threading.Lock() # 锁,用于确保线程安全地写入 results + + def task(db): + """ + 每个线程执行的任务,获取某个数据库实例中的查询结果。 + """ + cursor = db.cursor() + try: + data = self._get_messages_by_num(cursor, username, start_sort_seq, msg_num) + with lock: # 确保对 results 的操作是线程安全的 + results.append(data) + finally: + cursor.close() + + # 使用线程池 + with ThreadPoolExecutor(max_workers=len(self.DB)) as executor: + executor.map(task, self.DB) + self.commit() + return results + + def _get_messages_calendar(self, cursor, username): + """ + 获取某个人的聊天日历列表 + @param username_: + @return: + """ + table_name = f'Msg_{hashlib.md5(username.encode("utf-8")).hexdigest()}' + if not self.table_exists(cursor, table_name): + return None + sql = f'''SELECT DISTINCT strftime('%Y-%m-%d',create_time,'unixepoch','localtime') AS date + from {table_name} as msg + ORDER BY date desc; + ''' + cursor.execute(sql) + result = cursor.fetchall() + return (data[0] for data in result) + + def get_messages_calendar(self, username): + res = [] + for db in self.DB: + r1 = self._get_messages_calendar(db.cursor(), username) + if r1: + res.extend(r1) + res.sort() + return res + + def _get_messages_by_type(self, cursor, username: str, type_: MessageType, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + table_name = f'Msg_{hashlib.md5(username.encode("utf-8")).hexdigest()}' + if not self.table_exists(cursor, table_name): + return None + if time_range: + start_time, end_time = convert_to_timestamp(time_range) + local_type = get_local_type(type_) + sql = f''' +select {MessageDB.columns} +from {table_name} as msg +join Name2Id on msg.real_sender_id = Name2Id.rowid +where local_type=? {'and create_time>' + str(start_time) + ' AND create_time<' + str(end_time) if time_range else ''} +order by sort_seq + ''' + cursor.execute(sql, [local_type]) + result = cursor.fetchall() + if result: + return result + else: + return None + + def get_messages_by_type(self, username: str, type_: MessageType, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, ): + with concurrent.futures.ThreadPoolExecutor() as executor: + # 创建一个任务列表 + futures = [ + executor.submit(self._get_messages_by_type, db.cursor(), username, type_, time_range) + for db in self.DB + ] + + # 等待所有任务完成,并获取结果 + results = [] + for future in concurrent.futures.as_completed(futures): + r1 = future.result() + if r1: + # results.append(future.result()) + results.extend(r1) + + return results + + def merge(self, db_file_name): + def task_(db_path, cursor, db): + """ + 每个线程执行的任务,获取某个数据库实例中的查询结果。 + """ + increase_data(db_path, cursor, db, 'Name2Id', 'user_name') + increase_update_data(db_path, cursor, db, 'TimeStamp', 'timestamp') + cursor.execute("SELECT name FROM sqlite_master WHERE type='table';") + result = cursor.fetchall() + # print(result) + if result: + for row in result: + table_name = row[0] + if table_name.startswith('Msg'): + increase_data(db_path, cursor, db, table_name, 'server_id', exclude_first_column=True) + + tasks = [] + for i in range(100): + db_path = db_file_name.replace('0', f'{i}') + if os.path.exists(db_path): + # print('初始化数据库:', db_path) + file_name = os.path.basename(db_path) + if file_name in self.db_file_name: + index = self.db_file_name.index(file_name) + db = self.DB[index] + cursor = db.cursor() + task_(db_path, cursor, db) + tasks.append([db_path, cursor, db]) + else: + shutil.copy(db_path, os.path.join(self.db_dir, 'Multi', file_name)) + # print(tasks) + # 使用线程池 (没有加快合并速度) + # with ThreadPoolExecutor(max_workers=len(tasks)) as executor: + # executor.map(lambda args: task_(*args), tasks) + self.commit() + print(len(tasks)) + + +if __name__ == '__main__': + pass diff --git a/wxManager/db_v4/session.py b/wxManager/db_v4/session.py new file mode 100644 index 0000000..0c77b96 --- /dev/null +++ b/wxManager/db_v4/session.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/7 0:04 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-session.py +@Description : +""" +import os +import traceback + +from wxManager.merge import increase_update_data +from wxManager.model.db_model import DataBaseBase + + +class SessionDB(DataBaseBase): + def get_session(self): + if not self.open_flag: + return [] + sql = ''' +select username, type, unread_count, unread_first_msg_srv_id,last_timestamp, summary,last_msg_type,last_msg_sub_type,strftime('%Y/%m/%d', last_timestamp, 'unixepoch','localtime') AS strTime,last_sender_display_name,last_msg_sender +from SessionTable +order by sort_timestamp desc + ''' + self.cursor.execute(sql) + result = self.cursor.fetchall() + self.commit() + if result: + return result + else: + return [] + + def merge(self, db_path): + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + try: + # 获取列名 + increase_update_data(db_path, self.cursor, self.DB, 'SessionTable', 'username') + except: + print(f"数据库操作错误: {traceback.format_exc()}") + self.DB.rollback() + + +if __name__ == '__main__': + cd = SessionDB('session/session.db') + cd.init_database(r'E:\Project\Python\MemoTrace\app\DataBase\Msg\wxid_27hqbq7vx5hf22\db_storage') + r = cd.get_session() + print(r) diff --git a/wxManager/decrypt/__init__.py b/wxManager/decrypt/__init__.py new file mode 100644 index 0000000..a6aa8da --- /dev/null +++ b/wxManager/decrypt/__init__.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/1/10 2:34 +@Author : SiYuan +@Email : 863909694@qq.com +@File : wxManager-__init__.py.py +@Description : +""" +from typing import List + +import psutil + +from wxManager.decrypt.wx_info_v3 import dump_wechat_info_v3 +from wxManager.decrypt.wx_info_v4 import dump_wechat_info_v4 +from wxManager.decrypt.common import WeChatInfo + + +def get_info_v4() -> List[WeChatInfo]: + result_v4 = [] + for process in psutil.process_iter(['name', 'exe', 'pid']): + if process.name() == 'Weixin.exe': + wechat_base_address = 0 + for module in process.memory_maps(grouped=False): + if module.path and 'Weixin.dll' in module.path: + wechat_base_address = int(module.addr, 16) + break + if wechat_base_address == 0: + continue + pid = process.pid + wxinfo = dump_wechat_info_v4(pid) + result_v4.append( + wxinfo + ) + return result_v4 + + +def get_info_v3(version_list) -> List[WeChatInfo]: + result = [] + for process in psutil.process_iter(['name', 'exe', 'pid']): + if process.name() == 'WeChat.exe': + pid = process.pid + wxinfo = dump_wechat_info_v3(version_list, pid) + result.append( + wxinfo + ) + return result + + +if __name__ == "__main__": + import json + + file_path = r'E:\Project\Python\MemoTrace\resources\data\version_list.json' + with open(file_path, "r", encoding="utf-8") as f: + version_list = json.loads(f.read()) + + r_4 = get_info_v4() + r_3 = get_info_v3(version_list) + for wx_info in r_4+r_3: + print(wx_info) \ No newline at end of file diff --git a/wxManager/decrypt/common.py b/wxManager/decrypt/common.py new file mode 100644 index 0000000..fb4c970 --- /dev/null +++ b/wxManager/decrypt/common.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/3/7 16:39 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-common.py +@Description : +""" +import psutil +import win32api + +if __name__ == '__main__': + pass + + +def get_version(pid): + p = psutil.Process(pid) + version_info = win32api.GetFileVersionInfo(p.exe(), '\\') + version = f"{win32api.HIWORD(version_info['FileVersionMS'])}.{win32api.LOWORD(version_info['FileVersionMS'])}.{win32api.HIWORD(version_info['FileVersionLS'])}.{win32api.LOWORD(version_info['FileVersionLS'])}" + return version + + +class WeChatInfo: + def __init__(self): + self.pid = 0 + self.version = '0.0.0.0' + self.account_name = '' + self.nick_name = '' + self.phone = '' + self.wx_dir = '' + self.key = '' + self.wxid = '' + self.errcode: int = 404 # 405: 版本不匹配, 404: 重新登录微信, other: 未知错误 + self.errmsg: str = '错误!请登录微信。' + + def __str__(self): + return f''' +pid: {self.pid} +version: {self.version} +account_name: {self.account_name} +nickname: {self.nick_name} +phone: {self.phone} +wxid: {self.wxid} +wx_dir: {self.wx_dir} +key: {self.key} +''' + + def to_json(self): + return { + 'version': self.version, + 'nickname': self.nick_name, + 'wx_dir': self.wx_dir, + 'wxid': self.wxid + } \ No newline at end of file diff --git a/wxManager/decrypt/decrypt_dat.py b/wxManager/decrypt/decrypt_dat.py new file mode 100644 index 0000000..a4e82a9 --- /dev/null +++ b/wxManager/decrypt/decrypt_dat.py @@ -0,0 +1,307 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/9 23:44 +@Author : SiYuan +@Email : 863909694@qq.com +@File : wxManager-decrypt_dat.py +@Description : +""" +import os +import struct +from typing import List, Tuple +from concurrent.futures import ProcessPoolExecutor +from aiofiles import open as aio_open +from aiofiles.os import makedirs + +from Crypto.Cipher import AES + +# 图片字节头信息, +# [0][1]为jpg头信息, +# [2][3]为png头信息, +# [4][5]为gif头信息 +pic_head = (0xff, 0xd8, 0x89, 0x50, 0x47, 0x49) +# 解密码 +decode_code = 0 +decode_code_v4 = -1 + + +def get_code(dat_read): + """ + 自动判断文件类型,并获取dat文件解密码 + :param file_path: dat文件路径 + :return: 如果文件为jpg/png/gif格式,则返回解密码,否则返回-1 + """ + try: + if not dat_read: + return -1, -1 + head_index = 0 + while head_index < len(pic_head): + # 使用第一个头信息字节来计算加密码 + # 第二个字节来验证解密码是否正确 + code = dat_read[0] ^ pic_head[head_index] + idf_code = dat_read[1] ^ code + head_index = head_index + 1 + if idf_code == pic_head[head_index]: + return head_index, code + head_index = head_index + 1 + print("not jpg, png, gif") + return -1, -1 + except: + return -1, -1 + + +def decode_dat(xor_key: int, file_path, out_path, dst_name='') -> str | bytes: + """ + 解密文件,并生成图片 + @param file_path: 输入文件路径 + @param out_path: 输出文件文件夹 + @param dst_name: 输出文件名 + :param xor_key: 异或加密密钥 + """ + if not os.path.exists(file_path) or os.path.isdir(file_path): + return '' + if not os.path.exists(out_path): + os.makedirs(out_path, exist_ok=True) + if not os.path.isdir(out_path): + return '' + # print(file_path,out_path,dst_name) + with open(file_path, 'rb') as file_in: + data = file_in.read(0xf) + if data.startswith(b'\x07\x08V1\x08\x07'): + # 微信4.0 + return decode_dat_v4(xor_key, file_path, out_path, dst_name) + + with open(file_path, 'rb') as file_in: + data = file_in.read(2) + file_type, decode_code = get_code(data) + if decode_code == -1: + return '' + + filename = os.path.basename(file_path)[:-4] if not dst_name else dst_name + if file_type == 1: + pic_name = filename + ".jpg" + elif file_type == 3: + pic_name = filename + ".png" + elif file_type == 5: + pic_name = filename + ".gif" + else: + pic_name = filename + ".jpg" + + file_outpath = os.path.join(out_path, pic_name) + if os.path.exists(file_outpath): + return file_outpath + + # 分块读取和写入 + buffer_size = 1024 # 定义缓冲区大小 + with open(file_outpath, 'wb') as file_out: + file_out.write(bytes([byte ^ decode_code for byte in data])) + while True: + data = file_in.read(buffer_size) + if not data: + break + file_out.write(bytes([byte ^ decode_code for byte in data])) + + # print(os.path.basename(file_outpath)) + return file_outpath + + +def get_decode_code_v4(wx_dir): + cache_dir = os.path.join(wx_dir, 'cache') + if not os.path.isdir(wx_dir) or not os.path.exists(cache_dir): + raise ValueError(f'微信路径输入错误,请检查:{wx_dir}') + ok_flag = False + for root, dirs, files in os.walk(cache_dir): + if ok_flag: + break + for file in files: + if file.endswith(".dat"): + # 构造源文件和目标文件的完整路径 + src_file_path = os.path.join(root, file) + with open(src_file_path, 'rb') as f: + data = f.read() + if not data.startswith(b'\x07\x08V1\x08\x07'): + continue + file_tail = data[-2:] + + jpg_known_tail = b'\xff\xd9' + # 推导出密钥 + xor_key = [c ^ p for c, p in zip(file_tail, jpg_known_tail)] + if len(set(xor_key)) == 1: + print(f'[*] 找到异或密钥: 0x{xor_key[0]:x}') + return xor_key[0] + return -1 + + +def get_image_type(data: bytes) -> str: + """ + 根据文件头字节判断图片类型 + :param data: 文件头数据(通常至少需要前 10 个字节) + :return: 图片类型(扩展名),默认为 'bin' + """ + if data.startswith(b'\xff\xd8\xff'): + return 'jpg' # JPEG 文件 + elif data.startswith(b'\x89PNG\r\n\x1a\n'): + return 'png' # PNG 文件 + elif data.startswith(b'GIF87a') or data.startswith(b'GIF89a'): + return 'gif' # GIF 文件 + elif data.startswith(b'BM'): + return 'bmp' # BMP 文件 + elif data.startswith(b'II*\x00') or data.startswith(b'MM\x00*'): + return 'tiff' # TIFF 文件 + elif data.startswith(b'RIFF') and data[8:12] == b'WEBP': + return 'webp' # WEBP 文件 + elif data.startswith(b'\x00\x00\x01\x00'): + return 'ico' # ICO 文件 + else: + return 'bin' # 未知类型,返回二进制 + + +def decode_dat_v4(xor_key: int, file_path, out_path, dst_name='') -> str | bytes: + """ + 适用于微信4.0图片.dat,解密文件,并生成图片 + :param xor_key: int 异或密钥 + :param file_path: dat文件路径 + :param out_path: 输出文件夹 + :param dst_name: 输出文件名,默认为输入文件名 + :return: + """ + + if not os.path.exists(file_path) or os.path.isdir(file_path): + return '' + + # 读取加密文件的内容 + with open(file_path, 'rb') as f: + header = f.read(0xf) + encrypt_length = struct.unpack_from('<H', header, 6)[0] + encrypt_length0 = encrypt_length // 16 * 16 + 16 + encrypted_data = f.read(encrypt_length0) + res_data = f.read() + + # 如果数据不是16的倍数,填充0 + if len(encrypted_data) % 16 != 0: + padding_length = 16 - (len(encrypted_data) % 16) + encrypted_data += b'\x00' * padding_length + + aes_key = b'cfcd208495d565ef' + + # 初始化AES解密器(ECB模式) + cipher = AES.new(aes_key, AES.MODE_ECB) + + # 解密数据 + decrypted_data = cipher.decrypt(encrypted_data) + + # 获取图片后缀名 + image_type = get_image_type(decrypted_data[:10]) + output_file_name = os.path.basename(file_path)[:-4] if not dst_name else dst_name + output_file = os.path.join(out_path, output_file_name + '.' + image_type) + if os.path.exists(output_file): + return output_file + + # 移除填充(假设使用的是PKCS7或PKCS5填充) + pad_length = decrypted_data[-1] # 获取填充长度 + decrypted_data = decrypted_data[:-pad_length] + + # 将解密后的数据写入输出文件 + with open(output_file, 'wb') as f: + f.write(decrypted_data) + f.write(res_data[0:-0x100000]) + f.write(bytes([byte ^ xor_key for byte in res_data[-0x100000:]])) + + # print(f"解密完成,已保存到: {output_file}") + return output_file + + +async def decode_dat_v4_async(xor_key: int, file_path, out_path, dst_name='') -> str: + """ + 异步版本的微信4.0图片 .dat 文件解密器 + :param xor_key: int 异或密钥 + :param file_path: .dat 文件路径 + :param out_path: 输出文件夹 + :param dst_name: 输出文件名,默认为输入文件名 + :return: 解密后的文件路径 + """ + if not os.path.exists(file_path): + return '' + + # 确保输出目录存在 + await makedirs(out_path, exist_ok=True) + + # 读取加密文件的内容 + async with aio_open(file_path, 'rb') as f: + header = await f.read(0xf) + encrypt_length = struct.unpack_from('<H', header, 6)[0] + encrypt_length0 = encrypt_length // 16 * 16 + 16 + encrypted_data = await f.read(encrypt_length0) + res_data = await f.read() + + aes_key = b'cfcd208495d565ef' + + # 初始化AES解密器(ECB模式) + cipher = AES.new(aes_key, AES.MODE_ECB) + + # 解密数据 + decrypted_data = cipher.decrypt(encrypted_data) + + # 获取图片后缀名 + image_type = get_image_type(decrypted_data[:10]) + output_file_name = os.path.basename(file_path)[:-4] if not dst_name else dst_name + output_file = os.path.join(out_path, output_file_name + '.' + image_type) + + if os.path.exists(output_file): + return output_file + + # 移除填充(假设使用的是PKCS7或PKCS5填充) + pad_length = decrypted_data[-1] # 获取填充长度 + decrypted_data = decrypted_data[:-pad_length] + + # 将解密后的数据写入输出文件 + async with aio_open(output_file, 'wb') as f: + await f.write(decrypted_data) + await f.write(res_data[:-0x100000]) + await f.write(bytes([byte ^ xor_key for byte in res_data[-0x100000:]])) + + print(f"解密完成,已保存到: {output_file}") + return output_file + + +def decode_wrapper(tasks): + """用于包装解码函数的顶层定义""" + # results = [] + # for args in tasks: + # results.append(decode_dat(*args)) + # return results + + return decode_dat(*tasks) + + +def batch_decode_image_multiprocessing(xor_key, file_infos: List[Tuple[str, str, str]]): + """ + + :param xor_key: 异或加密密钥 + :param file_infos: 文件信息列表 + item: [input_path: 输入图片路径 + output_dir: 输出图片文件夹 + dst_name: 输出文件名] + :return: + """ + if len(file_infos) < 1: + return + + def split_list(lst, n): + k, m = divmod(len(lst), n) + return [lst[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n)] + + with ProcessPoolExecutor(max_workers=10) as executor: + tasks = [(xor_key, file_path, out_path, file_name) for file_path, out_path, file_name in file_infos] + # print(len(split_list(tasks, 10)), '总任务数', len(file_infos)) + results = list(executor.map(decode_wrapper, tasks, chunksize=200)) # 使用顶层定义的函数 + return results + + +if __name__ == '__main__': + wx_dir = '' + xor_key = get_decode_code_v4(wx_dir) + dat_file = "2_1730948126.dat" + decode_dat_v4(xor_key, dat_file, '.', dst_name='解密后的图片') diff --git a/wxManager/decrypt/decrypt_v3.py b/wxManager/decrypt/decrypt_v3.py new file mode 100644 index 0000000..0453a86 --- /dev/null +++ b/wxManager/decrypt/decrypt_v3.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*-# +# ------------------------------------------------------------------------------- +# Name: getwxinfo.py +# Description: +# Author: xaoyaoo +# Date: 2023/08/21 +# 微信数据库采用的加密算法是256位的AES-CBC。数据库的默认的页大小是4096字节即4KB,其中每一个页都是被单独加解密的。 +# 加密文件的每一个页都有一个随机的初始化向量,它被保存在每一页的末尾。 +# 加密文件的每一页都存有着消息认证码,算法使用的是HMAC-SHA1(安卓数据库使用的是SHA512)。它也被保存在每一页的末尾。 +# 每一个数据库文件的开头16字节都保存了一段唯一且随机的盐值,作为HMAC的验证和数据的解密。 +# 用来计算HMAC的key与解密的key是不同的,解密用的密钥是主密钥和之前提到的16字节的盐值通过PKCS5_PBKF2_HMAC1密钥扩展算法迭代64000次计算得到的。而计算HMAC的密钥是刚提到的解密密钥和16字节盐值异或0x3a的值通过PKCS5_PBKF2_HMAC1密钥扩展算法迭代2次计算得到的。 +# 为了保证数据部分长度是16字节即AES块大小的整倍数,每一页的末尾将填充一段空字节,使得保留字段的长度为48字节。 +# 综上,加密文件结构为第一页4KB数据前16字节为盐值,紧接着4032字节数据,再加上16字节IV和20字节HMAC以及12字节空字节;而后的页均是4048字节长度的加密数据段和48字节的保留段。 +# ------------------------------------------------------------------------------- +import argparse +import hmac +import hashlib +import os +import traceback +from typing import Union, List +from Crypto.Cipher import AES + +from wxManager.log import logger + +SQLITE_FILE_HEADER = "SQLite format 3\x00" # SQLite文件头 + +KEY_SIZE = 32 +DEFAULT_PAGESIZE = 4096 +DEFAULT_ITER = 64000 + + +# 通过密钥解密数据库 +def decrypt_db_file_v3(key: str, db_path, out_path): + """ + 通过密钥解密数据库 + :param key: 密钥 64位16进制字符串 + :param db_path: 待解密的数据库路径(必须是文件) + :param out_path: 解密后的数据库输出路径(必须是文件) + :return: + """ + if not os.path.exists(db_path) or not os.path.isfile(db_path): + return False, f"[-] db_path:'{db_path}' File not found!" + if not os.path.exists(os.path.dirname(out_path)): + return False, f"[-] out_path:'{out_path}' File not found!" + + if len(key) != 64: + return False, f"[-] key:'{key}' Len Error!" + + password = bytes.fromhex(key.strip()) + try: + with open(db_path, "rb") as file: + blist = file.read() + except: + logger.error(traceback.format_exc()) + logger.info(db_path + '->' + out_path) + return False, 'error' + salt = blist[:16] + byteKey = hashlib.pbkdf2_hmac("sha1", password, salt, DEFAULT_ITER, KEY_SIZE) + first = blist[16:DEFAULT_PAGESIZE] + if len(salt) != 16: + return False, f"[-] db_path:'{db_path}' File Error!" + + mac_salt = bytes([(salt[i] ^ 58) for i in range(16)]) + mac_key = hashlib.pbkdf2_hmac("sha1", byteKey, mac_salt, 2, KEY_SIZE) + hash_mac = hmac.new(mac_key, first[:-32], hashlib.sha1) + hash_mac.update(b'\x01\x00\x00\x00') + + if hash_mac.digest() != first[-32:-12]: + return False, f"[-] Key Error! (db_path:'{db_path}' )" + + newblist = [blist[i:i + DEFAULT_PAGESIZE] for i in range(DEFAULT_PAGESIZE, len(blist), DEFAULT_PAGESIZE)] + + with open(out_path, "wb") as deFile: + deFile.write(SQLITE_FILE_HEADER.encode()) + t = AES.new(byteKey, AES.MODE_CBC, first[-48:-32]) + decrypted = t.decrypt(first[:-48]) + deFile.write(decrypted) + deFile.write(first[-48:]) + + for i in newblist: + t = AES.new(byteKey, AES.MODE_CBC, i[-48:-32]) + decrypted = t.decrypt(i[:-48]) + deFile.write(decrypted) + deFile.write(i[-48:]) + return True, [db_path, out_path, key] + + +def decrypt_db_files(key, src_dir: str, dest_dir: str): + if not os.path.exists(src_dir): + print(f"源文件夹 {src_dir} 不存在") + return + + if not os.path.exists(dest_dir): + os.makedirs(dest_dir) # 如果目标文件夹不存在,创建它 + + for root, dirs, files in os.walk(src_dir): + for file in files: + if file.endswith(".db"): + # 构造源文件和目标文件的完整路径 + src_file_path = os.path.join(root, file) + + # 计算目标路径,保持子文件夹结构 + relative_path = os.path.relpath(root, src_dir) + dest_sub_dir = os.path.join(dest_dir, relative_path) + dest_file_path = os.path.join(dest_sub_dir, file) + + # 确保目标子文件夹存在 + if not os.path.exists(dest_sub_dir): + os.makedirs(dest_sub_dir) + print(dest_file_path) + decrypt_db_file_v3(key, src_file_path, dest_file_path) diff --git a/wxManager/decrypt/decrypt_v4.py b/wxManager/decrypt/decrypt_v4.py new file mode 100644 index 0000000..aa5505f --- /dev/null +++ b/wxManager/decrypt/decrypt_v4.py @@ -0,0 +1,127 @@ +import hmac +import os +import struct +from Crypto.Cipher import AES +from Crypto.Protocol.KDF import PBKDF2 +from Crypto.Hash import SHA512 + +# Constants +IV_SIZE = 16 +HMAC_SHA256_SIZE = 64 +KEY_SIZE = 32 +AES_BLOCK_SIZE = 16 +ROUND_COUNT = 256000 +PAGE_SIZE = 4096 +SALT_SIZE = 16 +SQLITE_HEADER = b"SQLite format 3" + + +def decrypt_db_file_v4(pkey, in_db_path, out_db_path): + if not os.path.exists(in_db_path): + print(f"【!!!】{in_db_path} does not exist.") + return False + + with open(in_db_path, 'rb') as f_in, open(out_db_path, 'wb') as f_out: + # Read salt from the first SALT_SIZE bytes + salt = f_in.read(SALT_SIZE) + if not salt: + print("File is empty or corrupted.") + return False + + mac_salt = bytes(x ^ 0x3a for x in salt) + + # Convert pkey from hex to bytes + passphrase = bytes.fromhex(pkey) + + # Use PBKDF2 to derive key and mac_key + key = PBKDF2(passphrase, salt, dkLen=KEY_SIZE, count=ROUND_COUNT, hmac_hash_module=SHA512) + mac_key = PBKDF2(key, mac_salt, dkLen=KEY_SIZE, count=2, hmac_hash_module=SHA512) + + # Write SQLITE_HEADER to the output file + f_out.write(SQLITE_HEADER) + f_out.write(b'\x00') + + # Reserve space for IV_SIZE + HMAC_SHA256_SIZE, rounded to a multiple of AES_BLOCK_SIZE + reserve = IV_SIZE + HMAC_SHA256_SIZE + reserve = ((reserve + AES_BLOCK_SIZE - 1) // AES_BLOCK_SIZE) * AES_BLOCK_SIZE + + # Process each page + cur_page = 0 + while True: + + # For the first page, include SALT_SIZE adjustment + if cur_page == 0: + # Read one full PAGE_SIZE starting from after the salt + page = f_in.read(PAGE_SIZE - SALT_SIZE) + if not page: + break # No more data + page = salt + page # Include the salt in the first page data + else: + page = f_in.read(PAGE_SIZE) + if not page: + break # End of file + # print(f'第{cur_page + 1}页') + offset = SALT_SIZE if cur_page == 0 else 0 + end = len(page) + + # If the page is all zero bytes, append it directly and exit + if all(x == 0 for x in page): + f_out.write(page) + print("Exiting early due to zeroed page.") + break + + # Perform HMAC check + mac = hmac.new(mac_key, page[offset:end - reserve + IV_SIZE], SHA512) + mac.update(struct.pack('<I', cur_page + 1)) # Add page number + hash_mac = mac.digest() + + # Check if HMAC matches + hash_mac_start_offset = end - reserve + IV_SIZE + if hash_mac != page[hash_mac_start_offset:hash_mac_start_offset + len(hash_mac)]: + print(f'Key error: {key}') + return None + raise ValueError("Hash verification failed") + + # AES-256-CBC decryption + iv = page[end - reserve:end - reserve + IV_SIZE] + cipher = AES.new(key, AES.MODE_CBC, iv) + decrypted_data = cipher.decrypt(page[offset:end - reserve]) + + # Remove padding + pad_len = decrypted_data[-1] + # decrypted_data = decrypted_data[:-pad_len] + + # Write decrypted data and HMAC/IV to output + f_out.write(decrypted_data) + f_out.write(page[end - reserve:end]) + + cur_page += 1 + + print("Decryption completed.") + return True + + +def decrypt_db_files(key, src_dir: str, dest_dir: str): + if not os.path.exists(src_dir): + print(f"源文件夹 {src_dir} 不存在") + return + + if not os.path.exists(dest_dir): + os.makedirs(dest_dir) # 如果目标文件夹不存在,创建它 + + for root, dirs, files in os.walk(src_dir): + for file in files: + if file.endswith(".db"): + # 构造源文件和目标文件的完整路径 + src_file_path = os.path.join(root, file) + + # 计算目标路径,保持子文件夹结构 + relative_path = os.path.relpath(root, src_dir) + dest_sub_dir = os.path.join(dest_dir, relative_path) + dest_file_path = os.path.join(dest_sub_dir, file) + + # 确保目标子文件夹存在 + if not os.path.exists(dest_sub_dir): + os.makedirs(dest_sub_dir) + print(dest_file_path) + decrypt_db_file_v4(key, src_file_path, dest_file_path) diff --git a/app/decrypt/get_bias_addr.py b/wxManager/decrypt/get_bias_addr.py similarity index 98% rename from app/decrypt/get_bias_addr.py rename to wxManager/decrypt/get_bias_addr.py index 58f6b73..a851fdc 100644 --- a/app/decrypt/get_bias_addr.py +++ b/wxManager/decrypt/get_bias_addr.py @@ -232,8 +232,8 @@ class BiasAddr: key_bytes = read_key_bytes(pm.process_handle, j, addr_len) if key_bytes == "None": continue - if verify_key(key_bytes, MicroMsg_path): - return j - module.lpBaseOfDll + # if verify_key(key_bytes, MicroMsg_path): + return j - module.lpBaseOfDll return 0 def run(self, logging_path=False, version_list_path=None): diff --git a/wxManager/decrypt/get_wx_info.py b/wxManager/decrypt/get_wx_info.py new file mode 100644 index 0000000..418b513 --- /dev/null +++ b/wxManager/decrypt/get_wx_info.py @@ -0,0 +1,329 @@ +import os +import sys +import hmac +import hashlib +import ctypes +import winreg +import pymem +import pythoncom +from win32com.client import Dispatch +import psutil +import pymem.process + +from wxManager.decrypt.wx_info_v4 import dump_wechat_info_v4 +from wxManager.decrypt import WeChatInfo +from wxManager.decrypt.common import get_version + +ReadProcessMemory = ctypes.windll.kernel32.ReadProcessMemory +void_p = ctypes.c_void_p + + +# 获取exe文件的位数 +def get_exe_bit(file_path): + """ + 获取 PE 文件的位数: 32 位或 64 位 + :param file_path: PE 文件路径(可执行文件) + :return: 如果遇到错误则返回 64 + """ + try: + with open(file_path, 'rb') as f: + dos_header = f.read(2) + if dos_header != b'MZ': + print('get exe bit error: Invalid PE file') + return 64 + # Seek to the offset of the PE signature + f.seek(60) + pe_offset_bytes = f.read(4) + pe_offset = int.from_bytes(pe_offset_bytes, byteorder='little') + + # Seek to the Machine field in the PE header + f.seek(pe_offset + 4) + machine_bytes = f.read(2) + machine = int.from_bytes(machine_bytes, byteorder='little') + + if machine == 0x14c: + return 32 + elif machine == 0x8664: + return 64 + else: + print('get exe bit error: Unknown architecture: %s' % hex(machine)) + return 64 + except IOError: + print('get exe bit error: File not found or cannot be opened') + return 64 + + +# 读取内存中的字符串(非key部分) +def get_info_without_key(h_process, address, n_size=64): + array = ctypes.create_string_buffer(n_size) + if ReadProcessMemory(h_process, void_p(address), array, n_size, 0) == 0: return "None" + array = bytes(array).split(b"\x00")[0] if b"\x00" in array else bytes(array) + text = array.decode('utf-8', errors='ignore') + return text.strip() if text.strip() != "" else "None" + + +def pattern_scan_all(handle, pattern, *, return_multiple=False, find_num=100): + next_region = 0 + found = [] + user_space_limit = 0x7FFFFFFF0000 if sys.maxsize > 2 ** 32 else 0x7fff0000 + while next_region < user_space_limit: + try: + next_region, page_found = pymem.pattern.scan_pattern_page( + handle, + next_region, + pattern, + return_multiple=return_multiple + ) + except Exception as e: + print(e) + break + if not return_multiple and page_found: + return page_found + if page_found: + found += page_found + if len(found) > find_num: + break + return found + + +def get_info_wxid(h_process): + find_num = 100 + addrs = pattern_scan_all(h_process, br'\\Msg\\FTSContact', return_multiple=True, find_num=find_num) + wxids = [] + for addr in addrs: + array = ctypes.create_string_buffer(80) + if ReadProcessMemory(h_process, void_p(addr - 30), array, 80, 0) == 0: return "None" + array = bytes(array) # .split(b"\\")[0] + array = array.split(b"\\Msg")[0] + array = array.split(b"\\")[-1] + wxids.append(array.decode('utf-8', errors='ignore')) + wxid = max(wxids, key=wxids.count) if wxids else "None" + return wxid + + +def get_wx_dir(wxid): + if not wxid: + return '' + try: + is_w_dir = False + try: + key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Tencent\WeChat", 0, winreg.KEY_READ) + value, _ = winreg.QueryValueEx(key, "FileSavePath") + winreg.CloseKey(key) + w_dir = value + is_w_dir = True + except Exception as e: + w_dir = "MyDocument:" + + if not is_w_dir: + try: + user_profile = os.environ.get("USERPROFILE") + path_3ebffe94 = os.path.join(user_profile, "AppData", "Roaming", "Tencent", "WeChat", "All Users", + "config", + "3ebffe94.ini") + with open(path_3ebffe94, "r", encoding="utf-8") as f: + w_dir = f.read() + is_w_dir = True + except Exception as e: + w_dir = "MyDocument:" + + if w_dir == "MyDocument:": + try: + # 打开注册表路径 + key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders") + documents_path = winreg.QueryValueEx(key, "Personal")[0] # 读取文档实际目录路径 + winreg.CloseKey(key) # 关闭注册表 + documents_paths = os.path.split(documents_path) + if "%" in documents_paths[0]: + w_dir = os.environ.get(documents_paths[0].replace("%", "")) + w_dir = os.path.join(w_dir, os.path.join(*documents_paths[1:])) + # print(1, w_dir) + else: + w_dir = documents_path + except Exception as e: + profile = os.environ.get("USERPROFILE") + w_dir = os.path.join(profile, "Documents") + msg_dir = os.path.join(w_dir, "WeChat Files", wxid) + return msg_dir + except FileNotFoundError: + return '' + + +def get_key(db_path, addr_len): + def read_key_bytes(h_process, address, address_len=8): + array = ctypes.create_string_buffer(address_len) + if ReadProcessMemory(h_process, void_p(address), array, address_len, 0) == 0: return "None" + address = int.from_bytes(array, byteorder='little') # 逆序转换为int地址(key地址) + key = ctypes.create_string_buffer(32) + if ReadProcessMemory(h_process, void_p(address), key, 32, 0) == 0: return "None" + key_bytes = bytes(key) + return key_bytes + + def verify_key(key, wx_db_path): + if not wx_db_path or wx_db_path.lower() == "none": + return True + KEY_SIZE = 32 + DEFAULT_PAGESIZE = 4096 + DEFAULT_ITER = 64000 + with open(wx_db_path, "rb") as file: + blist = file.read(5000) + salt = blist[:16] + byteKey = hashlib.pbkdf2_hmac("sha1", key, salt, DEFAULT_ITER, KEY_SIZE) + first = blist[16:DEFAULT_PAGESIZE] + + mac_salt = bytes([(salt[i] ^ 58) for i in range(16)]) + mac_key = hashlib.pbkdf2_hmac("sha1", byteKey, mac_salt, 2, KEY_SIZE) + hash_mac = hmac.new(mac_key, first[:-32], hashlib.sha1) + hash_mac.update(b'\x01\x00\x00\x00') + + if hash_mac.digest() != first[-32:-12]: + return False + return True + + phone_type1 = "iphone\x00" + phone_type2 = "android\x00" + phone_type3 = "ipad\x00" + + pm = pymem.Pymem("WeChat.exe") + module_name = "WeChatWin.dll" + + MicroMsg_path = os.path.join(db_path, "MSG", "MicroMsg.db") + + type1_addrs = pm.pattern_scan_module(phone_type1.encode(), module_name, return_multiple=True) + type2_addrs = pm.pattern_scan_module(phone_type2.encode(), module_name, return_multiple=True) + type3_addrs = pm.pattern_scan_module(phone_type3.encode(), module_name, return_multiple=True) + type_addrs = type1_addrs if len(type1_addrs) >= 2 else type2_addrs if len(type2_addrs) >= 2 else type3_addrs if len( + type3_addrs) >= 2 else "None" + # print(type_addrs) + if type_addrs == "None": + return "None" + for i in type_addrs[::-1]: + for j in range(i, i - 2000, -addr_len): + key_bytes = read_key_bytes(pm.process_handle, j, addr_len) + if key_bytes == "None": + continue + if db_path != "None" and verify_key(key_bytes, MicroMsg_path): + return key_bytes.hex() + return "None" + + +# 读取微信信息(account,mobile,name,mail,wxid,key) +def read_info(version_list): + result = [] + default_res = { + 'wxid': '', + 'name': '', + 'account': '', + 'key': '', + 'mobile': '', + 'version': '', + 'wx_dir': '', + 'errcode': 404, + 'errmsg': '错误!请登录微信。' + } + error = "" + for process in psutil.process_iter(['name', 'exe', 'pid']): + if process.name() == 'WeChat.exe': + tmp_rd = {} + pythoncom.CoInitialize() + tmp_rd['pid'] = process.pid + try: + tmp_rd['version'] = Dispatch("Scripting.FileSystemObject").GetFileVersion(process.exe()) + except: + try: + tmp_rd['version'] = get_version(process.pid) + except: + tmp_rd['version'] = '3' + wechat_base_address = 0 + for module in process.memory_maps(grouped=False): + if module.path and 'WeChatWin.dll' in module.path: + wechat_base_address = int(module.addr, 16) + break + if wechat_base_address == 0: + error = f"[-] WeChat WeChatWin.dll Not Found" + default_res['errmsg'] = '错误!请登录微信。' + return [default_res] + + Handle = ctypes.windll.kernel32.OpenProcess(0x1F0FFF, False, process.pid) + + bias_list = version_list.get(tmp_rd['version']) + if not isinstance(bias_list, list) or len(bias_list) <= 4: + default_res['version'] = tmp_rd['version'] + default_res['errcode'] = 405 + default_res['errmsg'] = '错误!微信版本不匹配,请手动填写信息。' + return [default_res] + else: + name_base_address = wechat_base_address + bias_list[0] + account__base_address = wechat_base_address + bias_list[1] + mobile_base_address = wechat_base_address + bias_list[2] + mail_base_address = wechat_base_address + bias_list[3] + # key_base_address = wechat_base_address + bias_list[4] + + tmp_rd['account'] = get_info_without_key(Handle, account__base_address, 32) if bias_list[1] != 0 else "None" + tmp_rd['mobile'] = get_info_without_key(Handle, mobile_base_address, 64) if bias_list[2] != 0 else "None" + tmp_rd['name'] = get_info_without_key(Handle, name_base_address, 64) if bias_list[0] != 0 else "None" + tmp_rd['mail'] = get_info_without_key(Handle, mail_base_address, 64) if bias_list[3] != 0 else "None" + + addrLen = get_exe_bit(process.exe()) // 8 + + tmp_rd['wxid'] = get_info_wxid(Handle) + tmp_rd['wx_dir'] = get_wx_dir(tmp_rd['wxid']) if tmp_rd['wxid'] != "None" else "None" + tmp_rd['key'] = "None" + tmp_rd['key'] = get_key(tmp_rd['wx_dir'], addrLen) + if tmp_rd['key'] == 'None': + tmp_rd['errcode'] = 404 + tmp_rd['errmsg'] = '请重启微信后重试。' + else: + tmp_rd['errcode'] = 200 + result.append(tmp_rd) + return result + + +def get_info_v4(): + result_v4 = [] + for process in psutil.process_iter(['name', 'exe', 'pid']): + if process.name() == 'Weixin.exe': + wechat_base_address = 0 + for module in process.memory_maps(grouped=False): + if module.path and 'Weixin.dll' in module.path: + wechat_base_address = int(module.addr, 16) + break + if wechat_base_address == 0: + continue + pid = process.pid + wxinfo = dump_wechat_info_v4(pid) + result_v4.append( + { + 'wxid': wxinfo.wxid, + 'name': wxinfo.nick_name, + 'account': wxinfo.account_name, + 'key': wxinfo.key, + 'mobile': wxinfo.phone, + 'version': wxinfo.version, + 'wx_dir': wxinfo.wx_dir, + 'errcode': 200 + } + ) + return result_v4 + + +def get_info_v3(version_list): + return read_info(version_list) # 读取微信信息 + + +def get_info(version_list): + result_v3 = read_info(version_list) # 读取微信信息 + result_v4 = get_info_v4() + print(result_v3 + result_v4) + return result_v3 + result_v4 + + +if __name__ == "__main__": + import json + + file_path = r'E:\Project\Python\MemoTrace\resources\data\version_list.json' + with open(file_path, "r", encoding="utf-8") as f: + version_list = json.loads(f.read()) + wx_info = get_info_v3(version_list) + print(wx_info) diff --git a/app/resources/data/version_list.json b/wxManager/decrypt/version_list.json similarity index 94% rename from app/resources/data/version_list.json rename to wxManager/decrypt/version_list.json index 0fb952d..d09e60a 100644 --- a/app/resources/data/version_list.json +++ b/wxManager/decrypt/version_list.json @@ -1076,5 +1076,68 @@ 94516520, 0, 94517984 + ], + "3.9.12.31": [ + 94518242, + 94518240, + 94516712, + 0, + 0 + ], + "3.9.12.35": [ + 94516904, + 94518240, + 94516712, + 0, + 94518176 + ], + "3.9.12.37": [ + 94520808, + 94522144, + 94520616, + 0, + 94522080 + ], + "3.9.5.22": [ + 61549552, + 61549552, + 61525640, + 0, + 0 + ], + "3.9.2.20": [ + 50292048, + 50292976, + 50291904, + 0, + 0 + ], + "3.9.12.41": [ + 94499560, + 0, + 94499368, + 0, + 94500832 + ], + "3.9.12.45": [ + 94503784, + 94505120, + 94503592, + 0, + 94505056 + ], + "3.9.12.44": [ + 70639072, + 70640040, + 70638928, + 0, + 0 + ], + "3.9.12.51": [ + 94555176, + 94556512, + 94554984, + 0, + 94556448 ] } \ No newline at end of file diff --git a/wxManager/decrypt/wx_info_v3.py b/wxManager/decrypt/wx_info_v3.py new file mode 100644 index 0000000..6d9ecee --- /dev/null +++ b/wxManager/decrypt/wx_info_v3.py @@ -0,0 +1,263 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/3/7 16:30 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-wx_info_v3.py +@Description : +""" + +# -*- coding: utf-8 -*-# +# ------------------------------------------------------------------------------- +# Name: getwxinfo.py +# Description: +# Author: xaoyaoo +# Date: 2023/08/21 +# ------------------------------------------------------------------------------- + +import os +import sys +import hmac +import hashlib +import ctypes +import winreg +import pymem +import pythoncom +import psutil +import pymem.process + +from wxManager.decrypt.common import WeChatInfo +from wxManager.decrypt.common import get_version + +ReadProcessMemory = ctypes.windll.kernel32.ReadProcessMemory +void_p = ctypes.c_void_p + + +def get_exe_bit(file_path): + try: + with open(file_path, 'rb') as f: + dos_header = f.read(2) + if dos_header != b'MZ': + print('get exe bit error: Invalid PE file') + return 64 + # Seek to the offset of the PE signature + f.seek(60) + pe_offset_bytes = f.read(4) + pe_offset = int.from_bytes(pe_offset_bytes, byteorder='little') + + # Seek to the Machine field in the PE header + f.seek(pe_offset + 4) + machine_bytes = f.read(2) + machine = int.from_bytes(machine_bytes, byteorder='little') + + if machine == 0x14c: + return 32 + elif machine == 0x8664: + return 64 + else: + return 64 + except: + return 64 + + +def get_info_without_key(h_process, address, n_size=64): + array = ctypes.create_string_buffer(n_size) + if ReadProcessMemory(h_process, void_p(address), array, n_size, 0) == 0: return "None" + array = bytes(array).split(b"\x00")[0] if b"\x00" in array else bytes(array) + text = array.decode('utf-8', errors='ignore') + return text.strip() if text.strip() != "" else "None" + + +def pattern_scan_all(handle, pattern, *, return_multiple=False, find_num=100): + next_region = 0 + found = [] + user_space_limit = 0x7FFFFFFF0000 if sys.maxsize > 2 ** 32 else 0x7fff0000 + while next_region < user_space_limit: + try: + next_region, page_found = pymem.pattern.scan_pattern_page( + handle, + next_region, + pattern, + return_multiple=return_multiple + ) + except Exception as e: + print(e) + break + if not return_multiple and page_found: + return page_found + if page_found: + found += page_found + if len(found) > find_num: + break + return found + + +def get_info_wxid(h_process): + find_num = 100 + addrs = pattern_scan_all(h_process, br'\\Msg\\FTSContact', return_multiple=True, find_num=find_num) + wxids = [] + for addr in addrs: + array = ctypes.create_string_buffer(80) + if ReadProcessMemory(h_process, void_p(addr - 30), array, 80, 0) == 0: return "None" + array = bytes(array) # .split(b"\\")[0] + array = array.split(b"\\Msg")[0] + array = array.split(b"\\")[-1] + wxids.append(array.decode('utf-8', errors='ignore')) + wxid = max(wxids, key=wxids.count) if wxids else "None" + return wxid + + +def get_wx_dir(wxid): + if not wxid: + return '' + try: + is_w_dir = False + try: + key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Software\Tencent\WeChat", 0, winreg.KEY_READ) + value, _ = winreg.QueryValueEx(key, "FileSavePath") + winreg.CloseKey(key) + w_dir = value + is_w_dir = True + except Exception as e: + w_dir = "MyDocument:" + + if not is_w_dir: + try: + user_profile = os.environ.get("USERPROFILE") + path_3ebffe94 = os.path.join(user_profile, "AppData", "Roaming", "Tencent", "WeChat", "All Users", + "config", + "3ebffe94.ini") + with open(path_3ebffe94, "r", encoding="utf-8") as f: + w_dir = f.read() + is_w_dir = True + except Exception as e: + w_dir = "MyDocument:" + + if w_dir == "MyDocument:": + try: + # 打开注册表路径 + key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders") + documents_path = winreg.QueryValueEx(key, "Personal")[0] # 读取文档实际目录路径 + winreg.CloseKey(key) # 关闭注册表 + documents_paths = os.path.split(documents_path) + if "%" in documents_paths[0]: + w_dir = os.environ.get(documents_paths[0].replace("%", "")) + w_dir = os.path.join(w_dir, os.path.join(*documents_paths[1:])) + # print(1, w_dir) + else: + w_dir = documents_path + except Exception as e: + profile = os.environ.get("USERPROFILE") + w_dir = os.path.join(profile, "Documents") + msg_dir = os.path.join(w_dir, "WeChat Files", wxid) + return msg_dir + except FileNotFoundError: + return '' + + +def get_key(db_path, addr_len): + def read_key_bytes(h_process, address, address_len=8): + array = ctypes.create_string_buffer(address_len) + if ReadProcessMemory(h_process, void_p(address), array, address_len, 0) == 0: return "" + address = int.from_bytes(array, byteorder='little') # 逆序转换为int地址(key地址) + key = ctypes.create_string_buffer(32) + if ReadProcessMemory(h_process, void_p(address), key, 32, 0) == 0: return "" + key_bytes = bytes(key) + return key_bytes + + def verify_key(key, wx_db_path): + if not wx_db_path: + return True + KEY_SIZE = 32 + DEFAULT_PAGESIZE = 4096 + DEFAULT_ITER = 64000 + with open(wx_db_path, "rb") as file: + blist = file.read(5000) + salt = blist[:16] + byteKey = hashlib.pbkdf2_hmac("sha1", key, salt, DEFAULT_ITER, KEY_SIZE) + first = blist[16:DEFAULT_PAGESIZE] + + mac_salt = bytes([(salt[i] ^ 58) for i in range(16)]) + mac_key = hashlib.pbkdf2_hmac("sha1", byteKey, mac_salt, 2, KEY_SIZE) + hash_mac = hmac.new(mac_key, first[:-32], hashlib.sha1) + hash_mac.update(b'\x01\x00\x00\x00') + + if hash_mac.digest() != first[-32:-12]: + return False + return True + + phone_type1 = "iphone\x00" + phone_type2 = "android\x00" + phone_type3 = "ipad\x00" + + pm = pymem.Pymem("WeChat.exe") + module_name = "WeChatWin.dll" + + MicroMsg_path = os.path.join(db_path, "MSG", "MicroMsg.db") + + type1_addrs = pm.pattern_scan_module(phone_type1.encode(), module_name, return_multiple=True) + type2_addrs = pm.pattern_scan_module(phone_type2.encode(), module_name, return_multiple=True) + type3_addrs = pm.pattern_scan_module(phone_type3.encode(), module_name, return_multiple=True) + type_addrs = type1_addrs if len(type1_addrs) >= 2 else type2_addrs if len(type2_addrs) >= 2 else type3_addrs if len( + type3_addrs) >= 2 else "" + # print(type_addrs) + if type_addrs == "": + return "" + for i in type_addrs[::-1]: + for j in range(i, i - 2000, -addr_len): + key_bytes = read_key_bytes(pm.process_handle, j, addr_len) + if key_bytes == "": + continue + if db_path != "" and verify_key(key_bytes, MicroMsg_path): + return key_bytes.hex() + return "" + + +def dump_wechat_info_v3(version_list, pid) -> WeChatInfo: + wechat_info = WeChatInfo() + wechat_info.pid = pid + wechat_info.version = get_version(pid) + process = psutil.Process(pid) + pythoncom.CoInitialize() + + wechat_base_address = 0 + for module in process.memory_maps(grouped=False): + if module.path and 'WeChatWin.dll' in module.path: + wechat_base_address = int(module.addr, 16) + break + + if wechat_base_address == 0: + wechat_info.errmsg = '错误!请登录微信。' + return wechat_info + + Handle = ctypes.windll.kernel32.OpenProcess(0x1F0FFF, False, process.pid) + + bias_list = version_list.get(wechat_info.version) + if not isinstance(bias_list, list) or len(bias_list) <= 4: + wechat_info.errcode = 405 + wechat_info.errmsg = '错误!微信版本不匹配,请手动填写信息。' + return wechat_info + else: + name_base_address = wechat_base_address + bias_list[0] + account__base_address = wechat_base_address + bias_list[1] + mobile_base_address = wechat_base_address + bias_list[2] + + wechat_info.account_name = get_info_without_key(Handle, account__base_address, 32) if bias_list[1] != 0 else "None" + wechat_info.phone = get_info_without_key(Handle, mobile_base_address, 64) if bias_list[2] != 0 else "None" + wechat_info.nick_name = get_info_without_key(Handle, name_base_address, 64) if bias_list[0] != 0 else "None" + + addrLen = get_exe_bit(process.exe()) // 8 + + wechat_info.wxid = get_info_wxid(Handle) + wechat_info.wx_dir = get_wx_dir(wechat_info.wxid) + wechat_info.key = get_key(wechat_info.wx_dir, addrLen) + if not wechat_info.key: + wechat_info.errcode = 404 + wechat_info.errmsg = '请重启微信后重试。' + else: + wechat_info.errcode = 200 + return wechat_info + diff --git a/wxManager/decrypt/wx_info_v4.py b/wxManager/decrypt/wx_info_v4.py new file mode 100644 index 0000000..54242b3 --- /dev/null +++ b/wxManager/decrypt/wx_info_v4.py @@ -0,0 +1,514 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/1/10 2:36 +@Author : SiYuan +@Email : 863909694@qq.com +@File : wxManager-wx_info_v4.py +@Description : +""" + +import ctypes +import multiprocessing +import os.path + +import hmac +import os +import struct +import time +from ctypes import wintypes +from multiprocessing import freeze_support + +import pymem +from Crypto.Protocol.KDF import PBKDF2 +from Crypto.Hash import SHA512 +import yara + +from wxManager.decrypt.common import WeChatInfo +from wxManager.decrypt.common import get_version + +# 定义必要的常量 +PROCESS_ALL_ACCESS = 0x1F0FFF +PAGE_READWRITE = 0x04 +MEM_COMMIT = 0x1000 +MEM_PRIVATE = 0x20000 + +# Constants +IV_SIZE = 16 +HMAC_SHA256_SIZE = 64 +HMAC_SHA512_SIZE = 64 +KEY_SIZE = 32 +AES_BLOCK_SIZE = 16 +ROUND_COUNT = 256000 +PAGE_SIZE = 4096 +SALT_SIZE = 16 + +finish_flag = False + + +# 定义 MEMORY_BASIC_INFORMATION 结构 +class MEMORY_BASIC_INFORMATION(ctypes.Structure): + _fields_ = [ + ("BaseAddress", ctypes.c_void_p), + ("AllocationBase", ctypes.c_void_p), + ("AllocationProtect", ctypes.c_ulong), + ("RegionSize", ctypes.c_size_t), + ("State", ctypes.c_ulong), + ("Protect", ctypes.c_ulong), + ("Type", ctypes.c_ulong), + ] + + +# Windows API Constants +PROCESS_VM_READ = 0x0010 +PROCESS_QUERY_INFORMATION = 0x0400 + +# Load Windows DLLs +kernel32 = ctypes.windll.kernel32 + + +# 打开目标进程 +def open_process(pid): + return ctypes.windll.kernel32.OpenProcess(PROCESS_ALL_ACCESS, False, pid) + + +# 读取目标进程内存 +def read_process_memory(process_handle, address, size): + buffer = ctypes.create_string_buffer(size) + bytes_read = ctypes.c_size_t(0) + success = ctypes.windll.kernel32.ReadProcessMemory( + process_handle, + ctypes.c_void_p(address), + buffer, + size, + ctypes.byref(bytes_read) + ) + if not success: + return None + return buffer.raw + + +# 获取所有内存区域 +def get_memory_regions(process_handle): + regions = [] + mbi = MEMORY_BASIC_INFORMATION() + address = 0 + while ctypes.windll.kernel32.VirtualQueryEx( + process_handle, + ctypes.c_void_p(address), + ctypes.byref(mbi), + ctypes.sizeof(mbi) + ): + if mbi.State == MEM_COMMIT and mbi.Type == MEM_PRIVATE: + regions.append((mbi.BaseAddress, mbi.RegionSize)) + address += mbi.RegionSize + return regions + + +rules_v4 = r''' +rule GetDataDir { + strings: + $a = /[a-zA-Z]:\\(.{1,100}?\\){0,1}?xwechat_files\\[0-9a-zA-Z_-]{6,24}?\\db_storage\\/ + condition: + $a +} + +rule GetPhoneNumberOffset { + strings: + $a = /[\x01-\x20]\x00{7}(\x0f|\x1f)\x00{7}[0-9]{11}\x00{5}\x0b\x00{7}\x0f\x00{7}/ + condition: + $a +} +rule GetKeyAddrStub +{ + strings: + $a = /.{6}\x00{2}\x00{8}\x20\x00{7}\x2f\x00{7}/ + condition: + all of them +} +''' + + +def read_string(data: bytes, offset, size): + try: + return data[offset:offset + size].decode('utf-8') + except: + # print(data[offset:offset + size]) + # print(traceback.format_exc()) + return '' + + +def read_num(data: bytes, offset, size): + # 构建格式字符串,根据 size 来选择相应的格式 + if size == 1: + fmt = '<B' # 1 字节,unsigned char + elif size == 2: + fmt = '<H' # 2 字节,unsigned short + elif size == 4: + fmt = '<I' # 4 字节,unsigned int + elif size == 8: + fmt = '<Q' # 8 字节,unsigned long long + else: + raise ValueError("Unsupported size") + + # 使用 struct.unpack 从指定 offset 开始读取 size 字节的数据并转换为数字 + result = struct.unpack_from(fmt, data, offset)[0] # 通过 unpack_from 来读取指定偏移的数据 + return result + + +def read_bytes(data: bytes, offset, size): + return data[offset:offset + size] + + +# def read_bytes_from_pid(pid, offset, size): +# with open(f'/proc/{pid}/mem', 'rb') as mem_file: +# mem_file.seek(offset) +# return mem_file.read(size) + + +# 导入 Windows API 函数 +kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) + +OpenProcess = kernel32.OpenProcess +OpenProcess.argtypes = [wintypes.DWORD, wintypes.BOOL, wintypes.DWORD] +OpenProcess.restype = wintypes.HANDLE + +ReadProcessMemory = kernel32.ReadProcessMemory +ReadProcessMemory.argtypes = [wintypes.HANDLE, wintypes.LPCVOID, wintypes.LPVOID, ctypes.c_size_t, + ctypes.POINTER(ctypes.c_size_t)] +ReadProcessMemory.restype = wintypes.BOOL + +CloseHandle = kernel32.CloseHandle +CloseHandle.argtypes = [wintypes.HANDLE] +CloseHandle.restype = wintypes.BOOL + + +def read_bytes_from_pid(pid: int, addr: int, size: int): + # 打开进程 + hprocess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, False, pid) + if not hprocess: + raise Exception(f"Failed to open process with PID {pid}") + buffer = b'' + try: + # 创建缓冲区 + buffer = ctypes.create_string_buffer(size) + + # 读取内存 + bytes_read = ctypes.c_size_t(0) + success = ReadProcessMemory(hprocess, addr, buffer, size, ctypes.byref(bytes_read)) + if not success: + CloseHandle(hprocess) + return b'' + raise Exception(f"Failed to read memory at address {hex(addr)}") + + # 关闭句柄 + CloseHandle(hprocess) + except: + pass + # 返回读取的字节数组 + return bytes(buffer) + + +def read_string_from_pid(pid: int, addr: int, size: int): + bytes0 = read_bytes_from_pid(pid, addr, size) + try: + return bytes0.decode('utf-8') + except: + return '' + + +def is_ok(passphrase, buf): + global finish_flag + if finish_flag: + return False + # 获取文件开头的 salt + salt = buf[:SALT_SIZE] + # salt 异或 0x3a 得到 mac_salt,用于计算 HMAC + mac_salt = bytes(x ^ 0x3a for x in salt) + # 使用 PBKDF2 生成新的密钥 + new_key = PBKDF2(passphrase, salt, dkLen=KEY_SIZE, count=ROUND_COUNT, hmac_hash_module=SHA512) + # 使用新的密钥和 mac_salt 计算 mac_key + mac_key = PBKDF2(new_key, mac_salt, dkLen=KEY_SIZE, count=2, hmac_hash_module=SHA512) + # 计算 hash 校验码的保留空间 + reserve = IV_SIZE + HMAC_SHA512_SIZE + reserve = ((reserve + AES_BLOCK_SIZE - 1) // AES_BLOCK_SIZE) * AES_BLOCK_SIZE + # 校验 HMAC + start = SALT_SIZE + end = PAGE_SIZE + mac = hmac.new(mac_key, buf[start:end - reserve + IV_SIZE], SHA512) + mac.update(struct.pack('<I', 1)) # page number as 1 + hash_mac = mac.digest() + # 校验 HMAC 是否一致 + hash_mac_start_offset = end - reserve + IV_SIZE + hash_mac_end_offset = hash_mac_start_offset + len(hash_mac) + if hash_mac == buf[hash_mac_start_offset:hash_mac_end_offset]: + print(f"[v] found key at 0x{start:x}") + finish_flag = True + return True + return False + + +def check_chunk(chunk, buf): + global finish_flag + if finish_flag: + return False + if is_ok(chunk, buf): + return chunk + return False + + +def verify_key(key: bytes, buffer: bytes, flag, result): + if len(key) != 32: + return False + if flag.value: # 如果其他进程已找到结果,提前退出 + return False + if is_ok(key, buffer): # 替换为实际的目标检测条件 + print("Key found!", key) + with flag.get_lock(): # 保证线程安全 + flag.value = True + return key + else: + return False + + +def get_key_(keys, buf): + pool = multiprocessing.Pool(processes=multiprocessing.cpu_count() // 2) + results = pool.starmap(check_chunk, ((key, buf) for key in keys)) + pool.close() + pool.join() + + for r in results: + if r: + print("Key found!", r) + return bytes.hex(r) + return None + + +def get_key_inner(pid, process_infos): + """ + 扫描可能为key的内存 + :param pid: + :param process_infos: + :return: + """ + process_handle = open_process(pid) + rules_v4_key = r''' + rule GetKeyAddrStub + { + strings: + $a = /.{6}\x00{2}\x00{8}\x20\x00{7}\x2f\x00{7}/ + condition: + all of them + } + ''' + rules = yara.compile(source=rules_v4_key) + pre_addresses = [] + for base_address, region_size in process_infos: + memory = read_process_memory(process_handle, base_address, region_size) + # 定义目标数据(如内存或文件内容) + target_data = memory # 二进制数据 + if not memory: + continue + # 加上这些判断条件时灵时不灵 + # if b'-----BEGIN PUBLIC KEY-----' not in target_data or b'USER_KEYINFO' not in target_data: + # continue + # if b'db_storage' not in memory: + # continue + # with open(f'key-{base_address}.bin', 'wb') as f: + # f.write(target_data) + matches = rules.match(data=target_data) + if matches: + for match in matches: + rule_name = match.rule + if rule_name == 'GetKeyAddrStub': + for string in match.strings: + instance = string.instances[0] + offset, content = instance.offset, instance.matched_data + addr = read_num(target_data, offset, 8) + pre_addresses.append(addr) + keys = [] + key_set = set() + for pre_address in pre_addresses: + if any([base_address <= pre_address <= base_address + region_size - KEY_SIZE for base_address, region_size in + process_infos]): + key = read_bytes_from_pid(pid, pre_address, 32) + if key not in key_set: + keys.append(key) + key_set.add(key) + return keys + + +def get_key(pid, process_handle, buf): + process_infos = get_memory_regions(process_handle) + + def split_list(lst, n): + k, m = divmod(len(lst), n) + return (lst[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n)) + + keys = [] + pool = multiprocessing.Pool(processes=multiprocessing.cpu_count() // 2) + results = pool.starmap(get_key_inner, ((pid, process_info_) for process_info_ in + split_list(process_infos, min(len(process_infos), 40)))) + pool.close() + pool.join() + for r in results: + if r: + keys += r + key = get_key_(keys, buf) + return key + + +def get_wx_dir(process_handle): + rules_v4_dir = r''' + rule GetDataDir { + strings: + $a = /[a-zA-Z]:\\(.{1,100}?\\){0,1}?xwechat_files\\[0-9a-zA-Z_-]{6,24}?\\db_storage\\/ + condition: + $a + } + ''' + rules = yara.compile(source=rules_v4_dir) + process_infos = get_memory_regions(process_handle) + wx_dir_cnt = {} + for base_address, region_size in process_infos: + memory = read_process_memory(process_handle, base_address, region_size) + # 定义目标数据(如内存或文件内容) + target_data = memory # 二进制数据 + if not memory: + continue + if b'db_storage' not in memory: + continue + matches = rules.match(data=target_data) + if matches: + # 输出匹配结果 + for match in matches: + rule_name = match.rule + if rule_name == 'GetDataDir': + for string in match.strings: + content = string.instances[0].matched_data + wx_dir_cnt[content] = wx_dir_cnt.get(content, 0) + 1 + return max(wx_dir_cnt, key=wx_dir_cnt.get).decode('utf-8') if wx_dir_cnt else '' + + +def get_nickname(pid): + process_handle = open_process(pid) + if not process_handle: + print(f"无法打开进程 {pid}") + return {} + process_infos = get_memory_regions(process_handle) + # 加载规则 + r'''$a = /(.{16}[\x00-\x20]\x00{7}(\x0f|\x1f)\x00{7}){2}.{16}[\x01-\x20]\x00{7}(\x0f|\x1f)\x00{7}[0-9]{11}\x00{5}\x0b\x00{7}\x0f\x00{7}.{25}\x00{7}(\x3f|\x2f|\x1f|\x0f)\x00{7}/s''' + rules_v4_phone = r''' + rule GetPhoneNumberOffset { + strings: + $a = /[\x01-\x20]\x00{7}(\x0f|\x1f)\x00{7}[0-9]{11}\x00{5}\x0b\x00{7}\x0f\x00{7}/ + condition: + $a + } + ''' + nick_name = '' + phone = '' + account_name = '' + rules = yara.compile(source=rules_v4_phone) + for base_address, region_size in process_infos: + memory = read_process_memory(process_handle, base_address, region_size) + # 定义目标数据(如内存或文件内容) + target_data = memory # 二进制数据 + if not memory: + continue + # if not (b'db_storage' in target_data or b'USER_KEYINFO' in target_data): + # continue + # if not (b'-----BEGIN PUBLIC KEY-----' in target_data): + # continue + matches = rules.match(data=target_data) + if matches: + # 输出匹配结果 + for match in matches: + rule_name = match.rule + if rule_name == 'GetPhoneNumberOffset': + for string in match.strings: + instance = string.instances[0] + offset, content = instance.offset, instance.matched_data + # print( + # f"匹配字符串: {identifier} 内容: 偏移: {offset} 在地址: {hex(base_address + offset + 0x10)}") + # print(string) + with open('a.bin','wb') as f: + f.write(target_data) + phone_addr = offset + 0x10 + phone = read_string(target_data, phone_addr, 11) + + # 提取前 8 个字节 + data_slice = target_data[offset:offset + 8] + # 使用 struct.unpack() 将字节转换为 u64,'<Q' 表示小端字节序的 8 字节无符号整数 + nick_name_length = struct.unpack('<Q', data_slice)[0] + # print('nick_name_length', nick_name_length) + nick_name = read_string(target_data, phone_addr - 0x20, nick_name_length) + a = target_data[phone_addr - 0x60:phone_addr + 0x50] + account_name_length = read_num(target_data, phone_addr - 0x30, 8) + # print('account_name_length', account_name_length) + account_name = read_string(target_data, phone_addr - 0x40, account_name_length) + # with open('a.bin', 'wb') as f: + # f.write(target_data) + if not account_name: + addr = read_num(target_data, phone_addr - 0x40, 8) + # print(hex(addr)) + account_name = read_string_from_pid(pid, addr, account_name_length) + return { + 'nick_name': nick_name, + 'phone': phone, + 'account_name': account_name + } + + +def worker(pid, queue): + nickname_dic = get_nickname(pid) + queue.put(nickname_dic) + + +def dump_wechat_info_v4(pid) -> WeChatInfo | None: + wechat_info = WeChatInfo() + wechat_info.pid = pid + wechat_info.version = get_version(pid) + process_handle = open_process(pid) + if not process_handle: + print(f"无法打开进程 {pid}") + return wechat_info + queue = multiprocessing.Queue() + process = multiprocessing.Process(target=worker, args=(pid, queue)) + + process.start() + + wechat_info.wx_dir = get_wx_dir(process_handle) + # print(wx_dir_cnt) + if not wechat_info.wx_dir: + return wechat_info + db_file_path = os.path.join(wechat_info.wx_dir, 'biz', 'biz.db') + with open(db_file_path, 'rb') as f: + buf = f.read() + wechat_info.key = get_key(pid, process_handle, buf) + ctypes.windll.kernel32.CloseHandle(process_handle) + wechat_info.wxid = '_'.join(wechat_info.wx_dir.split('\\')[-3].split('_')[0:-1]) + wechat_info.wx_dir = '\\'.join(wechat_info.wx_dir.split('\\')[:-2]) + process.join() # 等待子进程完成 + if not queue.empty(): + nickname_info = queue.get() + wechat_info.nick_name = nickname_info.get('nick_name', '') + wechat_info.phone = nickname_info.get('phone', '') + wechat_info.account_name = nickname_info.get('account_name', '') + if not wechat_info.key: + wechat_info.errcode = 404 + else: + wechat_info.errcode = 200 + return wechat_info + + +if __name__ == '__main__': + freeze_support() + st = time.time() + pm = pymem.Pymem("Weixin.exe") + pid = pm.process_id + w = dump_wechat_info_v4(pid) + print(w) + et = time.time() + print(et - st) diff --git a/wxManager/decrypt/wxinfo.py b/wxManager/decrypt/wxinfo.py new file mode 100644 index 0000000..0eea0e9 --- /dev/null +++ b/wxManager/decrypt/wxinfo.py @@ -0,0 +1,544 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/1/10 2:36 +@Author : SiYuan +@Email : 863909694@qq.com +@File : wxManager-wxinfo.py +@Description : +""" + +import ctypes +import multiprocessing +import os.path + +import hmac +import os +import struct +import sys +import time +import traceback +from ctypes import wintypes +from multiprocessing import freeze_support +from typing import Set, Tuple + +import pymem +import win32api +from Crypto.Protocol.KDF import PBKDF2 +from Crypto.Hash import SHA512 +import psutil +import yara + +# 定义必要的常量 +PROCESS_ALL_ACCESS = 0x1F0FFF +PAGE_READWRITE = 0x04 +MEM_COMMIT = 0x1000 +MEM_PRIVATE = 0x20000 + +# Constants +IV_SIZE = 16 +HMAC_SHA256_SIZE = 64 +HMAC_SHA512_SIZE = 64 +KEY_SIZE = 32 +AES_BLOCK_SIZE = 16 +ROUND_COUNT = 256000 +PAGE_SIZE = 4096 +SALT_SIZE = 16 + +finish_flag = False + + +class WechatInfo: + def __init__(self): + self.pid = 0 + self.version = '0.0.0.0' + self.account_name = '' + self.nick_name = '' + self.phone = '' + self.wx_dir = '' + self.key = '' + self.wxid = '' + + def __str__(self): + return f''' +pid: {self.pid} +version: {self.version} +account_name: {self.account_name} +nickname: {self.nick_name} +phone: {self.phone} +wxid: {self.wxid} +wx_dir: {self.wx_dir} +key: {self.key} +''' + + +# 定义 MEMORY_BASIC_INFORMATION 结构 +class MEMORY_BASIC_INFORMATION(ctypes.Structure): + _fields_ = [ + ("BaseAddress", ctypes.c_void_p), + ("AllocationBase", ctypes.c_void_p), + ("AllocationProtect", ctypes.c_ulong), + ("RegionSize", ctypes.c_size_t), + ("State", ctypes.c_ulong), + ("Protect", ctypes.c_ulong), + ("Type", ctypes.c_ulong), + ] + + +# Windows API Constants +PROCESS_VM_READ = 0x0010 +PROCESS_QUERY_INFORMATION = 0x0400 + +# Load Windows DLLs +kernel32 = ctypes.windll.kernel32 + + +# 打开目标进程 +def open_process(pid): + return ctypes.windll.kernel32.OpenProcess(PROCESS_ALL_ACCESS, False, pid) + + +# 读取目标进程内存 +def read_process_memory(process_handle, address, size): + buffer = ctypes.create_string_buffer(size) + bytes_read = ctypes.c_size_t(0) + success = ctypes.windll.kernel32.ReadProcessMemory( + process_handle, + ctypes.c_void_p(address), + buffer, + size, + ctypes.byref(bytes_read) + ) + if not success: + return None + return buffer.raw + + +# 获取所有内存区域 +def get_memory_regions(process_handle): + regions = [] + mbi = MEMORY_BASIC_INFORMATION() + address = 0 + while ctypes.windll.kernel32.VirtualQueryEx( + process_handle, + ctypes.c_void_p(address), + ctypes.byref(mbi), + ctypes.sizeof(mbi) + ): + if mbi.State == MEM_COMMIT and mbi.Type == MEM_PRIVATE: + regions.append((mbi.BaseAddress, mbi.RegionSize)) + address += mbi.RegionSize + return regions + + +rules_v4 = r''' +rule GetDataDir { + strings: + $a = /[a-zA-Z]:\\(.{1,100}?\\){0,1}?xwechat_files\\[0-9a-zA-Z_-]{6,24}?\\db_storage\\/ + condition: + $a +} + +rule GetPhoneNumberOffset { + strings: + $a = /[\x01-\x20]\x00{7}(\x0f|\x1f)\x00{7}[0-9]{11}\x00{5}\x0b\x00{7}\x0f\x00{7}/ + condition: + $a +} +rule GetKeyAddrStub +{ + strings: + $a = /.{6}\x00{2}\x00{8}\x20\x00{7}\x2f\x00{7}/ + condition: + all of them +} +''' + + +def read_string(data: bytes, offset, size): + try: + return data[offset:offset + size].decode('utf-8') + except: + # print(data[offset:offset + size]) + # print(traceback.format_exc()) + return '' + + +def read_num(data: bytes, offset, size): + # 构建格式字符串,根据 size 来选择相应的格式 + if size == 1: + fmt = '<B' # 1 字节,unsigned char + elif size == 2: + fmt = '<H' # 2 字节,unsigned short + elif size == 4: + fmt = '<I' # 4 字节,unsigned int + elif size == 8: + fmt = '<Q' # 8 字节,unsigned long long + else: + raise ValueError("Unsupported size") + + # 使用 struct.unpack 从指定 offset 开始读取 size 字节的数据并转换为数字 + result = struct.unpack_from(fmt, data, offset)[0] # 通过 unpack_from 来读取指定偏移的数据 + return result + + +def read_bytes(data: bytes, offset, size): + return data[offset:offset + size] + + +# def read_bytes_from_pid(pid, offset, size): +# with open(f'/proc/{pid}/mem', 'rb') as mem_file: +# mem_file.seek(offset) +# return mem_file.read(size) + + +# 导入 Windows API 函数 +kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) + +OpenProcess = kernel32.OpenProcess +OpenProcess.argtypes = [wintypes.DWORD, wintypes.BOOL, wintypes.DWORD] +OpenProcess.restype = wintypes.HANDLE + +ReadProcessMemory = kernel32.ReadProcessMemory +ReadProcessMemory.argtypes = [wintypes.HANDLE, wintypes.LPCVOID, wintypes.LPVOID, ctypes.c_size_t, + ctypes.POINTER(ctypes.c_size_t)] +ReadProcessMemory.restype = wintypes.BOOL + +CloseHandle = kernel32.CloseHandle +CloseHandle.argtypes = [wintypes.HANDLE] +CloseHandle.restype = wintypes.BOOL + + +def read_bytes_from_pid(pid: int, addr: int, size: int): + # 打开进程 + hprocess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, False, pid) + if not hprocess: + raise Exception(f"Failed to open process with PID {pid}") + buffer = b'' + try: + # 创建缓冲区 + buffer = ctypes.create_string_buffer(size) + + # 读取内存 + bytes_read = ctypes.c_size_t(0) + success = ReadProcessMemory(hprocess, addr, buffer, size, ctypes.byref(bytes_read)) + if not success: + CloseHandle(hprocess) + return b'' + raise Exception(f"Failed to read memory at address {hex(addr)}") + + # 关闭句柄 + CloseHandle(hprocess) + except: + pass + # 返回读取的字节数组 + return bytes(buffer) + + +def read_string_from_pid(pid: int, addr: int, size: int): + bytes0 = read_bytes_from_pid(pid, addr, size) + try: + return bytes0.decode('utf-8') + except: + return '' + + +def is_ok(passphrase, buf): + global finish_flag + if finish_flag: + return False + # 获取文件开头的 salt + salt = buf[:SALT_SIZE] + # salt 异或 0x3a 得到 mac_salt,用于计算 HMAC + mac_salt = bytes(x ^ 0x3a for x in salt) + # 使用 PBKDF2 生成新的密钥 + new_key = PBKDF2(passphrase, salt, dkLen=KEY_SIZE, count=ROUND_COUNT, hmac_hash_module=SHA512) + # 使用新的密钥和 mac_salt 计算 mac_key + mac_key = PBKDF2(new_key, mac_salt, dkLen=KEY_SIZE, count=2, hmac_hash_module=SHA512) + # 计算 hash 校验码的保留空间 + reserve = IV_SIZE + HMAC_SHA512_SIZE + reserve = ((reserve + AES_BLOCK_SIZE - 1) // AES_BLOCK_SIZE) * AES_BLOCK_SIZE + # 校验 HMAC + start = SALT_SIZE + end = PAGE_SIZE + mac = hmac.new(mac_key, buf[start:end - reserve + IV_SIZE], SHA512) + mac.update(struct.pack('<I', 1)) # page number as 1 + hash_mac = mac.digest() + # 校验 HMAC 是否一致 + hash_mac_start_offset = end - reserve + IV_SIZE + hash_mac_end_offset = hash_mac_start_offset + len(hash_mac) + if hash_mac == buf[hash_mac_start_offset:hash_mac_end_offset]: + print(f"[v] found key at 0x{start:x}") + finish_flag = True + return True + return False + + +def get_version(pid): + p = psutil.Process(pid) + version_info = win32api.GetFileVersionInfo(p.exe(), '\\') + version = f"{win32api.HIWORD(version_info['FileVersionMS'])}.{win32api.LOWORD(version_info['FileVersionMS'])}.{win32api.HIWORD(version_info['FileVersionLS'])}.{win32api.LOWORD(version_info['FileVersionLS'])}" + return version + + +def check_chunk(chunk, buf): + global finish_flag + if finish_flag: + return False + if is_ok(chunk, buf): + return chunk + return False + + +def verify_key(key: bytes, buffer: bytes, flag, result): + if len(key) != 32: + return False + if flag.value: # 如果其他进程已找到结果,提前退出 + return False + if is_ok(key, buffer): # 替换为实际的目标检测条件 + print("Key found!", key) + with flag.get_lock(): # 保证线程安全 + flag.value = True + return key + else: + return False + + +def get_key_(keys, buf): + pool = multiprocessing.Pool(processes=multiprocessing.cpu_count() // 2) + results = pool.starmap(check_chunk, ((key, buf) for key in keys)) + pool.close() + pool.join() + + for r in results: + if r: + print("Key found!", r) + return bytes.hex(r) + return None + + +def get_key_inner(pid, process_infos): + """ + 扫描可能为key的内存 + :param pid: + :param process_infos: + :return: + """ + process_handle = open_process(pid) + rules_v4_key = r''' + rule GetKeyAddrStub + { + strings: + $a = /.{6}\x00{2}\x00{8}\x20\x00{7}\x2f\x00{7}/ + condition: + all of them + } + ''' + rules = yara.compile(source=rules_v4_key) + pre_addresses = [] + for base_address, region_size in process_infos: + memory = read_process_memory(process_handle, base_address, region_size) + # 定义目标数据(如内存或文件内容) + target_data = memory # 二进制数据 + if not memory: + continue + # 加上这些判断条件时灵时不灵 + # if b'-----BEGIN PUBLIC KEY-----' not in target_data or b'USER_KEYINFO' not in target_data: + # continue + # if b'db_storage' not in memory: + # continue + # with open(f'key-{base_address}.bin', 'wb') as f: + # f.write(target_data) + matches = rules.match(data=target_data) + if matches: + for match in matches: + rule_name = match.rule + if rule_name == 'GetKeyAddrStub': + for string in match.strings: + instance = string.instances[0] + offset, content = instance.offset, instance.matched_data + addr = read_num(target_data, offset, 8) + pre_addresses.append(addr) + keys = [] + key_set = set() + for pre_address in pre_addresses: + if any([base_address <= pre_address <= base_address + region_size - KEY_SIZE for base_address, region_size in + process_infos]): + key = read_bytes_from_pid(pid, pre_address, 32) + if key not in key_set: + keys.append(key) + key_set.add(key) + return keys + + +def get_key(pid, process_handle, buf): + process_infos = get_memory_regions(process_handle) + + def split_list(lst, n): + k, m = divmod(len(lst), n) + return (lst[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n)) + + keys = [] + pool = multiprocessing.Pool(processes=multiprocessing.cpu_count() // 2) + results = pool.starmap(get_key_inner, ((pid, process_info_) for process_info_ in + split_list(process_infos, min(len(process_infos), 40)))) + pool.close() + pool.join() + for r in results: + if r: + keys += r + key = get_key_(keys, buf) + return key + + +def get_wx_dir(process_handle): + rules_v4_dir = r''' + rule GetDataDir { + strings: + $a = /[a-zA-Z]:\\(.{1,100}?\\){0,1}?xwechat_files\\[0-9a-zA-Z_-]{6,24}?\\db_storage\\/ + condition: + $a + } + ''' + rules = yara.compile(source=rules_v4_dir) + process_infos = get_memory_regions(process_handle) + wx_dir_cnt = {} + for base_address, region_size in process_infos: + memory = read_process_memory(process_handle, base_address, region_size) + # 定义目标数据(如内存或文件内容) + target_data = memory # 二进制数据 + if not memory: + continue + if b'db_storage' not in memory: + continue + matches = rules.match(data=target_data) + if matches: + # 输出匹配结果 + for match in matches: + rule_name = match.rule + if rule_name == 'GetDataDir': + for string in match.strings: + content = string.instances[0].matched_data + wx_dir_cnt[content] = wx_dir_cnt.get(content, 0) + 1 + return max(wx_dir_cnt, key=wx_dir_cnt.get).decode('utf-8') + + +def get_nickname(pid): + process_handle = open_process(pid) + if not process_handle: + print(f"无法打开进程 {pid}") + return {} + process_infos = get_memory_regions(process_handle) + # 加载规则 + r'''$a = /(.{16}[\x00-\x20]\x00{7}(\x0f|\x1f)\x00{7}){2}.{16}[\x01-\x20]\x00{7}(\x0f|\x1f)\x00{7}[0-9]{11}\x00{5}\x0b\x00{7}\x0f\x00{7}.{25}\x00{7}(\x3f|\x2f|\x1f|\x0f)\x00{7}/s''' + rules_v4_phone = r''' + rule GetPhoneNumberOffset { + strings: + $a = /[\x01-\x20]\x00{7}(\x0f|\x1f)\x00{7}[0-9]{11}\x00{5}\x0b\x00{7}\x0f\x00{7}/ + condition: + $a + } + ''' + nick_name = '' + phone = '' + account_name = '' + rules = yara.compile(source=rules_v4_phone) + for base_address, region_size in process_infos: + memory = read_process_memory(process_handle, base_address, region_size) + # 定义目标数据(如内存或文件内容) + target_data = memory # 二进制数据 + if not memory: + continue + # if not (b'db_storage' in target_data or b'USER_KEYINFO' in target_data): + # continue + # if not (b'-----BEGIN PUBLIC KEY-----' in target_data): + # continue + matches = rules.match(data=target_data) + if matches: + # 输出匹配结果 + for match in matches: + rule_name = match.rule + if rule_name == 'GetPhoneNumberOffset': + for string in match.strings: + instance = string.instances[0] + offset, content = instance.offset, instance.matched_data + # print( + # f"匹配字符串: {identifier} 内容: 偏移: {offset} 在地址: {hex(base_address + offset + 0x10)}") + # print(string) + with open('a.bin','wb') as f: + f.write(target_data) + phone_addr = offset + 0x10 + phone = read_string(target_data, phone_addr, 11) + + # 提取前 8 个字节 + data_slice = target_data[offset:offset + 8] + # 使用 struct.unpack() 将字节转换为 u64,'<Q' 表示小端字节序的 8 字节无符号整数 + nick_name_length = struct.unpack('<Q', data_slice)[0] + # print('nick_name_length', nick_name_length) + nick_name = read_string(target_data, phone_addr - 0x20, nick_name_length) + a = target_data[phone_addr - 0x60:phone_addr + 0x50] + account_name_length = read_num(target_data, phone_addr - 0x30, 8) + # print('account_name_length', account_name_length) + account_name = read_string(target_data, phone_addr - 0x40, account_name_length) + # with open('a.bin', 'wb') as f: + # f.write(target_data) + if not account_name: + addr = read_num(target_data, phone_addr - 0x40, 8) + # print(hex(addr)) + account_name = read_string_from_pid(pid, addr, account_name_length) + return { + 'nick_name': nick_name, + 'phone': phone, + 'account_name': account_name + } + + +def worker(pid, queue): + nickname_dic = get_nickname(pid) + queue.put(nickname_dic) + + +def dump_wechat_info_v4_(pid) -> WechatInfo | None: + wechat_info = WechatInfo() + wechat_info.pid = pid + wechat_info.version = get_version(pid) + process_handle = open_process(pid) + if not process_handle: + print(f"无法打开进程 {pid}") + return None + queue = multiprocessing.Queue() + process = multiprocessing.Process(target=worker, args=(pid, queue)) + + process.start() + + wechat_info.wx_dir = get_wx_dir(process_handle) + # print(wx_dir_cnt) + if not wechat_info.wx_dir: + return None + db_file_path = os.path.join(wechat_info.wx_dir, 'biz', 'biz.db') + with open(db_file_path, 'rb') as f: + buf = f.read() + wechat_info.key = get_key(pid, process_handle, buf) + ctypes.windll.kernel32.CloseHandle(process_handle) + wechat_info.wxid = '_'.join(wechat_info.wx_dir.split('\\')[-3].split('_')[0:-1]) + wechat_info.wx_dir = '\\'.join(wechat_info.wx_dir.split('\\')[:-2]) + process.join() # 等待子进程完成 + if not queue.empty(): + nickname_info = queue.get() + wechat_info.nick_name = nickname_info.get('nick_name', '') + wechat_info.phone = nickname_info.get('phone', '') + wechat_info.account_name = nickname_info.get('account_name', '') + + return wechat_info + + +if __name__ == '__main__': + freeze_support() + st = time.time() + pm = pymem.Pymem("Weixin.exe") + pid = pm.process_id + w = dump_wechat_info_v4_(pid) + print(w) + et = time.time() + print(et - st) diff --git a/wxManager/log/__init__.py b/wxManager/log/__init__.py new file mode 100644 index 0000000..8488323 --- /dev/null +++ b/wxManager/log/__init__.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/1/7 21:44 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-__init__.py.py +@Description : +""" + +from wxManager.log.logger import log, logger + +__all__ = ["logger", "log"] diff --git a/app/log/logger.py b/wxManager/log/logger.py similarity index 89% rename from app/log/logger.py rename to wxManager/log/logger.py index ab6f1e6..0172a9c 100644 --- a/app/log/logger.py +++ b/wxManager/log/logger.py @@ -3,7 +3,6 @@ import os import time import traceback from functools import wraps - filename = time.strftime("%Y-%m-%d", time.localtime(time.time())) logger = logging.getLogger('test') logger.setLevel(level=logging.DEBUG) @@ -11,9 +10,9 @@ formatter = logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(l try: if not os.path.exists('./app/log/logs'): os.mkdir('./app/log/logs') - file_handler = logging.FileHandler(f'./app/log/logs/{filename}-log.log') + file_handler = logging.FileHandler(f'./app/log/logs/{filename}-log.log', encoding='utf-8') except: - file_handler = logging.FileHandler(f'{filename}-log.log') + file_handler = logging.FileHandler(f'日志文件-{filename}-log.log', encoding='utf-8') file_handler.setLevel(level=logging.INFO) file_handler.setFormatter(formatter) @@ -32,5 +31,4 @@ def log(func): except Exception as e: logger.error( f"\n{func.__qualname__} is error,params:{(args, kwargs)},here are details:\n{traceback.format_exc()}") - return log_ diff --git a/wxManager/manager_v3.py b/wxManager/manager_v3.py new file mode 100644 index 0000000..a077acd --- /dev/null +++ b/wxManager/manager_v3.py @@ -0,0 +1,700 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/11 20:43 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-manager_v4.py +@Description : +""" +import concurrent +import os +import traceback +from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor +from datetime import date +from typing import Tuple, List, Any + +import xmltodict + +from wxManager import MessageType +from wxManager.db_main import DataBaseInterface +from wxManager.db_v3.hard_link_file import HardLinkFile +from wxManager.db_v3.hard_link_image import HardLinkImage +from wxManager.db_v3.hard_link_video import HardLinkVideo + +from wxManager.db_v3.misc import Misc +from wxManager.db_v3.msg import Msg +from wxManager.db_v3.media_msg import MediaMsg +from wxManager.db_v3.emotion import Emotion +from wxManager.db_v3.open_im_contact import OpenIMContactDB +from wxManager.db_v3.open_im_media import OpenIMMediaDB +from wxManager.db_v3.open_im_msg import OpenIMMsgDB +from wxManager.db_v3.public_msg import PublicMsg +from wxManager.db_v3.micro_msg import MicroMsg +from wxManager.db_v3.favorite import Favorite +from wxManager.log import logger +from wxManager.model.contact import Contact, Me, ContactType, Person +from wxManager.parser.file_parser import get_image_type +from wxManager.parser.util.protocbuf.roomdata_pb2 import ChatRoomData +from wxManager.parser.wechat_v3 import FACTORY_REGISTRY, parser_sub_type, Singleton + +type_name_dict = { + (1, 0): MessageType.Text, + (3, 0): MessageType.Image, + (34, 0): MessageType.Audio, + (43, 0): MessageType.Video, + (47, 0): MessageType.Emoji, + + (37, 0): "添加好友", + (42, 0): MessageType.BusinessCard, + (66, 0): MessageType.OpenIMBCard, + (48, 0): MessageType.Position, + (49, 40): MessageType.FavNote, + (49, 24): MessageType.FavNote, + (49, 53): "接龙", + + (49, 0): MessageType.File, + (49, 1): MessageType.Text2, + (49, 3): MessageType.Music, + (49, 76): MessageType.Music, + (49, 5): MessageType.LinkMessage, + (49, 6): MessageType.File, + (49, 8): "用户上传的GIF表情", + (49, 17): MessageType.System, # 发起了位置共享 + (49, 19): MessageType.MergedMessages, + (49, 33): MessageType.Applet, + (49, 36): MessageType.Applet2, + (49, 51): MessageType.WeChatVideo, + (49, 57): MessageType.Quote, + (49, 63): "视频号直播或直播回放等", + (49, 87): "群公告", + (49, 88): "视频号直播或直播回放等", + (49, 2000): MessageType.Transfer, + (49, 2003): "赠送红包封面", + + (50, 0): MessageType.Voip, + (10000, 0): MessageType.System, + (10000, 4): MessageType.Pat, + (10000, 8000): MessageType.System +} + + +def decodeExtraBuf(extra_buf_content: bytes): + if not extra_buf_content: + return { + "region": ('', '', ''), + "signature": '', + "telephone": '', + "gender": 0, + } + trunkName = { + b"\x46\xCF\x10\xC4": "个性签名", + b"\xA4\xD9\x02\x4A": "国家", + b"\xE2\xEA\xA8\xD1": "省份", + b"\x1D\x02\x5B\xBF": "市", + # b"\x81\xAE\x19\xB4": "朋友圈背景url", + # b"\xF9\x17\xBC\xC0": "公司名称", + # b"\x4E\xB9\x6D\x85": "企业微信属性", + # b"\x0E\x71\x9F\x13": "备注图片", + b"\x75\x93\x78\xAD": "手机号", + b"\x74\x75\x2C\x06": "性别", + } + res = {"手机号": ""} + off = 0 + try: + for key in trunkName: + trunk_head = trunkName[key] + try: + off = extra_buf_content.index(key) + 4 + except: + pass + char = extra_buf_content[off: off + 1] + off += 1 + if char == b"\x04": # 四个字节的int,小端序 + intContent = extra_buf_content[off: off + 4] + off += 4 + intContent = int.from_bytes(intContent, "little") + res[trunk_head] = intContent + elif char == b"\x18": # utf-16字符串 + lengthContent = extra_buf_content[off: off + 4] + off += 4 + lengthContent = int.from_bytes(lengthContent, "little") + strContent = extra_buf_content[off: off + lengthContent] + off += lengthContent + res[trunk_head] = strContent.decode("utf-16").rstrip("\x00") + return { + "region": (res["国家"], res["省份"], res["市"]), + "signature": res["个性签名"], + "telephone": res["手机号"], + "gender": res["性别"], + } + except: + logger.error(f'联系人解析错误:\n{traceback.format_exc()}') + return { + "region": ('', '', ''), + "signature": '', + "telephone": '', + "gender": 0, + } + + +def parser_messages(messages, username, db_dir=''): + context = DataBaseV3() + context.init_database(db_dir) + if username.endswith('@chatroom'): + contacts = context.get_chatroom_members(username) + else: + contacts = { + Me().wxid: context.get_contact_by_username(Me().wxid), + username: context.get_contact_by_username(username) + } + # FACTORY_REGISTRY[-1].set_contacts(contacts) + Singleton.set_contacts(contacts) + for message in messages: + type_ = message[2] + sub_type = parser_sub_type(message[7]) if username.endswith('@openim') else message[3] + msg_type = type_name_dict.get((type_, sub_type)) + if msg_type not in FACTORY_REGISTRY: + msg_type = -1 + yield FACTORY_REGISTRY[msg_type].create(message, username, context) + + +def _process_messages_batch(messages_batch, username, db_dir) -> List: + """Helper function to process a batch of messages.""" + processed = [] + for message in parser_messages(messages_batch, username, db_dir): + processed.append(message) + return processed + + +class DataBaseV3(DataBaseInterface): + # todo 把上面这一堆数据库功能整合到这一个class里,对外只暴漏一个接口 + def __init__(self): + super().__init__() + self.db_dir = None + self.chatroom_members_map = {} + self.contacts_map = {} + + self.misc_db = Misc('Misc.db') + self.msg_db = Msg('Multi/MSG0.db', is_series=True) + self.public_msg_db = PublicMsg('PublicMsg.db') + self.micro_msg_db = MicroMsg('MicroMsg.db') + self.hard_link_image_db = HardLinkImage('HardLinkImage.db') + self.hard_link_file_db = HardLinkFile('HardLinkFile.db') + self.hard_link_video_db = HardLinkVideo('HardLinkVideo.db') + self.emotion_db = Emotion('Emotion.db') + self.media_msg_db = MediaMsg('Multi/MediaMSG0.db', is_series=True) + self.open_contact_db = OpenIMContactDB('OpenIMContact.db') + self.open_media_db = OpenIMMediaDB('OpenIMMedia.db') + self.open_msg_db = OpenIMMsgDB('OpenIMMsg.db') + # self.sns_db = Sns() + + # self.audio_to_text = Audio2TextDB() + # self.public_msg_db = PublicMsg() + # self.favorite_db = Favorite() + + def init_database(self, db_dir=''): + # print('初始化数据库', db_dir) + Me().load_from_json(os.path.join(db_dir, 'info.json')) # 加载自己的信息 + flag = True + self.db_dir = db_dir + flag &= self.misc_db.init_database(db_dir) + flag &= self.msg_db.init_database(db_dir) + flag &= self.public_msg_db.init_database(db_dir) + flag &= self.micro_msg_db.init_database(db_dir) + flag &= self.hard_link_image_db.init_database(db_dir) + flag &= self.hard_link_file_db.init_database(db_dir) + flag &= self.hard_link_video_db.init_database(db_dir) + flag &= self.emotion_db.init_database(db_dir) + flag &= self.media_msg_db.init_database(db_dir) + flag &= self.open_contact_db.init_database(db_dir) + flag &= self.open_media_db.init_database(db_dir) + flag &= self.open_msg_db.init_database(db_dir) + return flag + # self.sns_db.init_database(db_dir) + + # self.audio_to_text.init_database(db_dir) + # self.public_msg_db.init_database(db_dir) + # self.favorite_db.init_database(db_dir) + + def close(self): + self.misc_db.close() + self.msg_db.close() + self.public_msg_db.close() + self.micro_msg_db.close() + self.hard_link_image_db.close() + self.hard_link_file_db.close() + self.hard_link_video_db.close() + self.emotion_db.close() + self.media_msg_db.close() + self.open_contact_db.close() + self.open_media_db.close() + self.open_msg_db.close() + # self.sns_db.close() + # self.audio_to_text.close() + # self.public_msg_db.close() + + def get_session(self): + """ + 获取聊天会话窗口,在聊天界面显示 + @return: + """ + return self.micro_msg_db.get_session() + + def get_messages( + self, + username_: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ): + # todo 改成yield进行操作,多进程处理加快速度 + import time + st = time.time() + logger.error(f'开始获取聊天记录:{st}') + # if username_.startswith('gh'): + # messages = self.public_msg_db.get_messages(username_, time_range) + # elif username_.endswith('@openim'): + # messages = self.open_msg_db.get_messages_by_username(username_, time_range) + # else: + # messages = self.msg_db.get_messages_by_username(username_, time_range) + # result = [] + # for messages_ in messages: + # print(len(messages_)) + # for message in parser_messages(messages_, username_, self.db_dir): + # result.append(message) + # result.sort() + # et = time.time() + # logger.error(f'获取聊天记录完成:{et}') + # logger.error(f'获取聊天记录耗时:{et - st:.2f}s/{len(result)}条消息') + # return result + + res = [] + + # for messages in self.message_db.get_messages_by_username(username_, time_range): + # for message in self.parser_messages(messages, username_): + # res.append(message) + + def split_list(lst, n): + k, m = divmod(len(lst), n) + return [lst[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n)] + + # # # Step 1: Retrieve raw message batches + if username_.startswith('gh_'): + messages = self.public_msg_db.get_messages_by_username(username_, time_range) + elif username_.endswith('@openim'): + messages = self.open_msg_db.get_messages_by_username(username_, time_range) + else: + messages = self.msg_db.get_messages_by_username(username_, time_range) + + if len(messages) < 20000: + for message in parser_messages(messages, username_, self.db_dir): + res.append(message) + else: + raw_message_batches = split_list(messages, len(messages) // 10000 + 1) + # + # # Step 2: Use multiprocessing to process the message batches + # res = [] + # for batch in raw_message_batches: + # print(len(batch)) + + with ProcessPoolExecutor(max_workers=min(len(raw_message_batches), 16)) as executor: + # Submit tasks + future_to_batch = { + executor.submit(_process_messages_batch, batch, username_, self.db_dir): batch + for batch in raw_message_batches + } + + # Collect results + for future in future_to_batch.keys(): + res.extend(future.result()) + + et = time.time() + logger.error(f'获取聊天记录完成:{et}') + logger.error(f'获取聊天记录耗时:{et - st:.2f}s/{len(res)}条消息') + res.sort() + return res + + def get_messages_by_num(self, username, start_sort_seq, msg_num=20): + """ + 获取小于start_sort_seq的msg_num个消息 + @param username: + @param start_sort_seq: + @param msg_num: + @return: messages, 最后一条消息的start_sort_seq + """ + if username.startswith('gh'): + messages = self.public_msg_db.get_messages_by_num(username, start_sort_seq, msg_num) + elif username.endswith('@openim'): + messages = self.open_msg_db.get_messages_by_num(username, start_sort_seq, msg_num) + else: + messages = self.msg_db.get_messages_by_num(username, start_sort_seq, msg_num) + result = [] + for messages_ in messages: + for message in parser_messages(messages_, username, self.db_dir): + result.append(message) + result.sort(reverse=True) + res = result[:msg_num] + return res, res[-1].sort_seq if res else 0 + + def get_message_by_server_id(self, username, server_id): + """ + 获取小于start_sort_seq的msg_num个消息 + @param username: + @param server_id: + @return: messages, 最后一条消息的start_sort_seq + """ + message = self.msg_db.get_message_by_server_id(username, server_id) + if message: + messages_iter = parser_messages([message], username, self.db_dir) + return next(messages_iter) + return None + + def get_messages_all(self, time_range=None): + return self.msg_db.get_messages_all(time_range) + + def get_messages_calendar(self, username_): + return self.msg_db.get_messages_calendar(username_) + + def get_messages_by_type( + self, + username_, + type_: MessageType, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ): + def split_list(lst, n): + k, m = divmod(len(lst), n) + return [lst[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n)] + + res = [] + # # # Step 1: Retrieve raw message batches + if username_.startswith('gh_'): + messages = self.public_msg_db.get_messages_by_type(username_, type_, time_range) + elif username_.endswith('@openim'): + messages = self.open_msg_db.get_messages_by_type(username_, type_, time_range) + else: + messages = self.msg_db.get_messages_by_type(username_, type_, time_range) + + if len(messages) < 20000: + for message in parser_messages(messages, username_, self.db_dir): + res.append(message) + else: + raw_message_batches = split_list(messages, len(messages) // 10000 + 1) + with ProcessPoolExecutor(max_workers=min(len(raw_message_batches), 16)) as executor: + # Submit tasks + future_to_batch = { + executor.submit(_process_messages_batch, batch, username_, self.db_dir): batch + for batch in raw_message_batches + } + # Collect results + for future in future_to_batch.keys(): + res.extend(future.result()) + res.sort() + return res + + def get_emoji_url(self, md5: str, thumb: bool = False) -> str | bytes: + return self.emotion_db.get_emoji_URL(md5, thumb) + + def get_emoji_path(self, md5: str, output_path, thumb: bool = False, ) -> str: + """ + + @param md5: + @param output_path: + @param thumb: + @return: + """ + data = self.emotion_db.get_emoji_data(md5, thumb) + prefix = "th_" if thumb else "" + f = '.' + get_image_type(data[:10]) + file_path = os.path.join(output_path, prefix + md5 + f) + if not os.path.exists(file_path): + try: + with open(file_path, 'wb') as f: + f.write(data) + except: + pass + return file_path + + def get_emoji_URL(self, md5: str, thumb: bool = False): + return self.emotion_db.get_emoji_URL(md5, thumb) + + # 图片、视频、文件 + def get_file(self, md5: bytes | str) -> str: + return self.hard_link_file_db.get_file(md5) + + def get_image(self, content, bytesExtra, up_dir="", md5=None, thumb=False, talker_username='') -> str: + return self.hard_link_image_db.get_image(content, bytesExtra, up_dir, md5, thumb) + + def get_video(self, content, bytesExtra, md5=None, thumb=False): + return self.hard_link_video_db.get_video(content, bytesExtra, md5, thumb) + + # 图片、视频、文件结束 + + # 语音 + def get_media_buffer(self, server_id, is_open_im=False) -> bytes: + if is_open_im: + return self.open_media_db.get_media_buffer(server_id) + else: + return self.media_msg_db.get_media_buffer(server_id) + + def get_audio(self, reserved0, output_path, open_im=False, filename=''): + if open_im: + pass + else: + return self.media_msg_db.get_audio(reserved0, output_path, filename) + + def get_audio_path(self, reserved0, output_path, filename=''): + return self.media_msg_db.get_audio_path(reserved0, output_path, filename) + + def get_audio_text(self, msgSvrId): + return '' + return self.media_msg_db.get_audio_text(msgSvrId) + + def update_audio_to_text(self): + messages = self.get_messages_all() + contacts = self.get_contacts() + contacts_set = {contact.wxid for contact in contacts} + for message in messages: + if message[2] == 34: + str_content = message[7] + msgSvrId = message[9] + voice_to_text = self.media_msg_db.get_audio_text(str_content) + if voice_to_text: + self.audio_to_text.add_text(msgSvrId, voice_to_text) + wxid = message[11] + # if wxid not in contacts_set: + # contact = ContactDefault(wxid) + # self.micro_msg_db.add_contact(contact) + # contacts_set.add(wxid) + + # 语音结束 + + # 联系人 + def get_avatar_buffer(self, username) -> bytes: + return self.misc_db.get_avatar_buffer(username) + + def create_contact(self, contact_info_list) -> Person: + detail = decodeExtraBuf(contact_info_list[9]) + wxid = contact_info_list[0] + nickname = contact_info_list[4] + remark = contact_info_list[3] + if not nickname and wxid.endswith('@chatroom'): + nickname = self._get_chatroom_name(contact_info_list[0]) + if not remark: + remark = nickname + gender = '未知' + signature = '' + label_list = contact_info_list[10].split(',') if contact_info_list[10] else [] + region = ('', '', '') + if detail: + gender_code = detail.get('gender', 0) + if gender_code == 1: + gender = '男' + elif gender_code == 2: + gender = '女' + + type_ = contact_info_list[2] + wxid = contact_info_list[0] + + contact = Contact( + wxid=contact_info_list[0], + remark=remark, + alias=contact_info_list[1], + nickname=nickname, + small_head_img_url=contact_info_list[7], + big_head_img_url=contact_info_list[8], + flag=contact_info_list[3], + gender=gender, + signature=signature, + label_list=label_list, + region=region + ) + contact.type = ContactType.Normal + if wxid.startswith('gh_'): + contact.type |= ContactType.Public + elif wxid.endswith('@chatroom'): + contact.type |= ContactType.Chatroom + + def is_nth_bit_set(number, n): + # 左移 1 到第 n 位 + mask = 1 << n + # 使用位与运算判断第 n 位 + return (number & mask) != 0 + + if is_nth_bit_set(type_, 6): + contact.type |= ContactType.Star + if is_nth_bit_set(type_, 11): + contact.type |= ContactType.Sticky + + if type_ == 10086: + contact.type = ContactType.Unknown + contact.is_unknown = True + return contact + + def create_open_im_contact(self, contact_info_list) -> Person: + contact_info = { + 'UserName': contact_info_list[0], + 'Alias': contact_info_list[0], + 'Type': contact_info_list[2], + 'Remark': contact_info_list[3], + 'NickName': contact_info_list[1], + 'smallHeadImgUrl': contact_info_list[5], + 'bigHeadImgUrl': contact_info_list[4], + 'detail': None, + 'label_name': '', + 'wording': contact_info_list[13] + } + wxid = contact_info_list[0] + nickname = contact_info_list[1] + remark = contact_info_list[3] + if not nickname and wxid.endswith('@chatroom'): + nickname = self._get_chatroom_name(contact_info_list[0]) + if not remark: + remark = nickname + contact = Contact( + wxid=contact_info_list[0], + alias=contact_info_list[0], + remark=f'{remark}@{contact_info_list[13]}', + nickname=nickname, + small_head_img_url=contact_info_list[5], + big_head_img_url=contact_info_list[4], + ) + contact.type = ContactType.Normal + contact.type |= ContactType.OpenIM + return contact + + def get_contacts(self) -> List[Person]: + contacts = [] + contact_lists = self.micro_msg_db.get_contact() + for contact_info_list in contact_lists: + contact = self.create_contact(contact_info_list) + contacts.append(contact) + + contact_lists = self.open_contact_db.get_contacts() + for contact_info_list in contact_lists: + contact = self.create_open_im_contact(contact_info_list) + contacts.append(contact) + return contacts + + def set_remark(self, username: str, remark) -> bool: + if username in self.contacts_map: + self.contacts_map[username].remark = remark + if username.endswith('@openim'): + return self.open_contact_db.set_remark(username, remark) + else: + return self.micro_msg_db.set_remark(username, remark) + + def set_avatar_buffer(self, username, avatar_path): + return self.misc_db.set_avatar_buffer(username, avatar_path) + + def get_contact_by_username(self, wxid: str) -> Contact: + if wxid.endswith('@openim'): + contact_info_list = self.open_contact_db.get_contact_by_username(wxid) + if contact_info_list: + contact = self.create_open_im_contact(contact_info_list) + else: + contact = Contact( + wxid=wxid, + nickname=wxid, + remark=wxid + ) + else: + contact_info_list = self.micro_msg_db.get_contact_by_username(wxid) + if contact_info_list: + contact = self.create_contact(contact_info_list) + else: + contact = Contact( + wxid=wxid, + nickname=wxid, + remark=wxid + ) + return contact + + def get_chatroom_members(self, chatroom_name) -> dict[Any, Contact] | Any: + """ + 获取群成员(不包括企业微信联系人) + @param chatroom_name: + @return: + """ + if chatroom_name in self.chatroom_members_map: + return self.chatroom_members_map[chatroom_name] + result = {} + chatroom = self.micro_msg_db.get_chatroom_info(chatroom_name) + if chatroom is None: + return result + # 解析RoomData数据 + parsechatroom = ChatRoomData() + parsechatroom.ParseFromString(chatroom[1]) + # 群成员数据放入字典存储 + for mem in parsechatroom.members: + contact = self.get_contact_by_username(mem.wxID) + if contact: + if mem.displayName: + contact.remark = mem.displayName + result[contact.wxid] = contact + self.chatroom_members_map[chatroom_name] = result + return result + + def _get_chatroom_name(self, wxid): + """ + 获取没有命名的群聊名 + :param wxid: + :return: + """ + chatroom = self.micro_msg_db.get_chatroom_info(wxid) + + if chatroom is None: + return '' + # 解析RoomData数据 + parsechatroom = ChatRoomData() + parsechatroom.ParseFromString(chatroom[1]) + chatroom_name = '' + # 群成员数据放入字典存储 + for mem in parsechatroom.members[:5]: + if mem.wxID == Me().wxid: + continue + if mem.displayName: + chatroom_name += f'{mem.displayName}、' + else: + contact = self.get_contact_by_username(mem.wxID) + chatroom_name += f'{contact.remark}、' + return chatroom_name.rstrip('、') + + # 联系人结束 + def add_audio_txt(self, msgSvrId, text): + return self.audio_to_text.add_text(msgSvrId, text) + + def get_favorite_items(self, time_range): + return self.favorite_db.get_items(time_range) + + def merge(self, db_dir): + merge_tasks = { + self.msg_db: os.path.join(db_dir, 'Multi', 'MSG0.db'), + self.media_msg_db: os.path.join(db_dir, 'Multi', 'MediaMSG0.db'), + self.misc_db: os.path.join(db_dir, 'Misc.db'), + self.micro_msg_db: os.path.join(db_dir, 'MicroMsg.db'), + self.emotion_db: os.path.join(db_dir, 'Emotion.db'), + self.hard_link_file_db: os.path.join(db_dir, 'HardLinkFile.db'), + self.hard_link_image_db: os.path.join(db_dir, 'HardLinkImage.db'), + self.hard_link_video_db: os.path.join(db_dir, 'HardLinkVideo.db'), + self.open_contact_db: os.path.join(db_dir, 'OpenIMContact.db'), + self.open_media_db: os.path.join(db_dir, 'OpenIMMedia.db'), + self.open_msg_db: os.path.join(db_dir, 'OpenIMMsg.db'), + self.public_msg_db: os.path.join(db_dir, 'PublicMsg.db'), + } + + def merge_task(db_instance, db_path): + """执行单个数据库的合并任务""" + db_instance.merge(db_path) + + # 使用 ThreadPoolExecutor 进行多线程合并 + with concurrent.futures.ThreadPoolExecutor() as executor: + futures = {executor.submit(merge_task, db, path): (db, path) for db, path in merge_tasks.items()} + + # 等待所有任务完成 + for future in concurrent.futures.as_completed(futures): + db, path = futures[future] + try: + future.result() # 这里会抛出异常(如果有的话) + print(f"成功合并数据库: {path}") + except Exception as e: + print(f"合并 {path} 失败: {e}") diff --git a/wxManager/manager_v4.py b/wxManager/manager_v4.py new file mode 100644 index 0000000..5acec81 --- /dev/null +++ b/wxManager/manager_v4.py @@ -0,0 +1,478 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/11 20:43 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-manager_v4.py +@Description : +""" +import concurrent +import os +from concurrent.futures import ProcessPoolExecutor, as_completed, ThreadPoolExecutor +from datetime import date, datetime +from multiprocessing import Pool, cpu_count +from typing import Tuple, List, Any + +import zstandard as zstd + +from wxManager import MessageType +from wxManager.db_v4.biz_message import BizMessageDB +from wxManager.db_v4.emotion import EmotionDB +from wxManager.db_v4.media import MediaDB +from wxManager.db_v4 import ContactDB, HeadImageDB, SessionDB, MessageDB, HardLinkDB +from wxManager.db_main import DataBaseInterface, Context +from wxManager.model.contact import Contact, ContactType, Person +from wxManager.model import Me +from wxManager.parser.util.protocbuf.roomdata_pb2 import ChatRoomData +from wxManager.parser.wechat_v4 import FACTORY_REGISTRY, Singleton +from wxManager.log import logger +from wxManager.parser.util.protocbuf import contact_pb2 +from google.protobuf.json_format import MessageToDict + + +def decompress(data): + dctx = zstd.ZstdDecompressor() # 创建解压对象 + x = dctx.decompress(data) + return x.decode('utf-8') + + +def parser_messages(messages, username, db_dir=''): + context = DataBaseV4() + context.init_database(db_dir) + if username.endswith('@chatroom'): + contacts = context.get_chatroom_members(username) + else: + contacts = { + Me().wxid: context.get_contact_by_username(Me().wxid), + username: context.get_contact_by_username(username) + } + # FACTORY_REGISTRY[-1].set_contacts(contacts) # 不知道为什么用对象修改类属性每个实例对象的contacts不一样 + Singleton.set_contacts(contacts) + + for message in messages: + type_ = message[2] + if type_ not in FACTORY_REGISTRY: + type_ = -1 + yield FACTORY_REGISTRY[type_].create(message, username, context) + + +def _process_messages_batch(messages_batch, username, db_dir) -> List: + """Helper function to process a batch of messages.""" + processed = [] + for message in parser_messages(messages_batch, username, db_dir): + processed.append(message) + return processed + + +class DataBaseV4(DataBaseInterface): + def __init__(self): + super().__init__() + self.db_dir = '' + self.chatroom_members_map = {} + self.contacts_map = {} + + # V4 + self.contact_db = ContactDB('contact/contact.db') + self.head_image_db = HeadImageDB('head_image/head_image.db') + self.session_db = SessionDB('session/session.db') + self.message_db = MessageDB('message/message_0.db', is_series=True) + self.biz_message_db = BizMessageDB('message/biz_message_0.db', is_series=True) + self.media_db = MediaDB('message/media_0.db', is_series=True) + self.hardlink_db = HardLinkDB('hardlink/hardlink.db') + self.emotion_db = EmotionDB('emoticon/emoticon.db') + + def init_database(self, db_dir=''): + Me().load_from_json(os.path.join(db_dir, 'info.json')) # 加载自己的信息 + # print('初始化数据库', db_dir) + self.db_dir = db_dir + flag = True + flag &= self.contact_db.init_database(db_dir) + flag &= self.head_image_db.init_database(db_dir) + flag &= self.session_db.init_database(db_dir) + flag &= self.message_db.init_database(db_dir) + flag &= self.biz_message_db.init_database(db_dir) + flag &= self.media_db.init_database(db_dir) + flag &= self.hardlink_db.init_database(db_dir) + flag &= self.emotion_db.init_database(db_dir) + return flag + + def close(self): + pass + + # self.head_image_db.close() + # self.contact_db.close() + + def get_session(self): + """ + 获取聊天会话窗口,在聊天界面显示 + @return: + """ + return self.session_db.get_session() + + def get_messages( + self, + username_: str, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ): + # todo 改成yield进行操作,多进程处理加快速度 + import time + st = time.time() + logger.error(f'开始获取聊天记录:{st}') + res = [] + + # messages = self.message_db.get_messages_by_username(username_, time_range)*20 + # # for messages in self.message_db.get_messages_by_username(username_, time_range): + # for messages_ in messages: + # for message in parser_messages(messages_, username_, self.db_dir): + # res.append(message) + + def split_list(lst, n): + k, m = divmod(len(lst), n) + return [lst[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n)] + + # + # # # Step 1: Retrieve raw message batches + if username_.startswith('gh_'): + messages = self.biz_message_db.get_messages_by_username(username_, time_range) + else: + messages = self.message_db.get_messages_by_username(username_, time_range) + + if len(messages) < 20000: + for message in parser_messages(messages, username_, self.db_dir): + res.append(message) + else: + raw_message_batches = split_list(messages, len(messages) // 10000 + 1) + # + # # Step 2: Use multiprocessing to process the message batches + # res = [] + # for batch in raw_message_batches: + # print(len(batch)) + + with ProcessPoolExecutor(max_workers=min(len(raw_message_batches), 16)) as executor: + # Submit tasks + future_to_batch = { + executor.submit(_process_messages_batch, batch, username_, self.db_dir): batch + for batch in raw_message_batches + } + + # Collect results + for future in future_to_batch.keys(): + res.extend(future.result()) + + et = time.time() + logger.error(f'获取聊天记录完成:{et}') + logger.error(f'获取聊天记录耗时:{et - st:.2f}s/{len(res)}条消息 {username_}') + res.sort() + return res + + def get_messages_by_num(self, username, start_sort_seq, msg_num=20): + """ + 获取小于start_sort_seq的msg_num个消息 + @param username: + @param start_sort_seq: + @param msg_num: + @return: messages, 最后一条消息的start_sort_seq + """ + result = [] + if username.startswith('gh_'): + messages = self.biz_message_db.get_messages_by_num(username, start_sort_seq, msg_num) + else: + messages = self.message_db.get_messages_by_num(username, start_sort_seq, msg_num) + for messages in messages: + for message in parser_messages(messages, username, self.db_dir): + result.append(message) + result.sort(reverse=True) + res = result[:msg_num] + return res, res[-1].sort_seq if res else 0 + + def get_message_by_server_id(self, username, server_id): + """ + 获取小于start_sort_seq的msg_num个消息 + @param username: + @param server_id: + @return: messages, 最后一条消息的start_sort_seq + """ + message = self.message_db.get_message_by_server_id(username, server_id) + if message: + messages_iter = parser_messages([message], username, self.db_dir) + return next(messages_iter) + return None + + def get_messages_by_type( + self, + username_, + type_: MessageType, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + ): + def split_list(lst, n): + k, m = divmod(len(lst), n) + return [lst[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(n)] + + res = [] + # # # Step 1: Retrieve raw message batches + if username_.startswith('gh_'): + messages = self.biz_message_db.get_messages_by_type(username_, time_range) + else: + messages = self.message_db.get_messages_by_type(username_, type_, time_range) + + if len(messages) < 20000: + for message in parser_messages(messages, username_, self.db_dir): + res.append(message) + else: + raw_message_batches = split_list(messages, len(messages) // 10000 + 1) + with ProcessPoolExecutor(max_workers=min(len(raw_message_batches), 16)) as executor: + # Submit tasks + future_to_batch = { + executor.submit(_process_messages_batch, batch, username_, self.db_dir): batch + for batch in raw_message_batches + } + # Collect results + for future in future_to_batch.keys(): + res.extend(future.result()) + res.sort() + return res + + def get_messages_calendar(self, username_: str): + if username_.startswith('gh_'): + return self.biz_message_db.get_messages_calendar(username_) + else: + return self.message_db.get_messages_calendar(username_) + + def get_chatted_top_contacts( + self, + time_range: Tuple[int | float | str | date, int | float | str | date] = None, + contain_chatroom=False, + top_n=10 + ) -> list: + return [] + + def get_emoji_url(self, md5: str, thumb: bool = False) -> str | bytes: + return self.emotion_db.get_emoji_url(md5, thumb) + + # 图片、视频、文件 + def get_file(self, md5: bytes | str) -> str: + return self.hardlink_db.get_file(md5) + + def get_image(self, content, bytesExtra, up_dir="", md5=None, thumb=False, talker_username='') -> str: + return self.hardlink_db.get_image(content, bytesExtra, up_dir, md5, thumb, talker_username) + + def get_video(self, content, bytesExtra, md5=None, thumb=False): + return self.hardlink_db.get_video(md5, thumb) + + # 语音 + def get_audio(self, reserved0, output_path, open_im=False, filename=''): + return self.media_db.get_audio(reserved0, output_path, filename) + + def get_media_buffer(self, server_id, is_open_im=False) -> bytes: + return self.media_db.get_media_buffer(server_id) + + def get_audio_path(self, reserved0, output_path, filename=''): + return self.media_db.get_audio_path(reserved0, output_path, filename) + + def get_audio_text(self, msgSvrId): + return '' + + def update_audio_to_text(self): + # todo + return + + # 语音结束 + + # 联系人 + + def get_avatar_buffer(self, username) -> bytes: + return self.head_image_db.get_avatar_buffer(username) + + def create_contact(self, contact_info_list) -> Person: + wxid, local_type, flag = contact_info_list[0], contact_info_list[2], contact_info_list[3] + nickname = contact_info_list[5] + remark = contact_info_list[4] + if not nickname and wxid.endswith('@chatroom'): + nickname = self._get_chatroom_name(contact_info_list[0]) + if not remark: + remark = nickname + gender = '未知' + signature = '' + label_list = [] + region = ('', '', '') + if not (wxid.endswith('@openim') or wxid.endswith('@chatroom')): + try: + # 创建顶级消息对象 + message = contact_pb2.ContactInfo() + # 解析二进制数据 + message.ParseFromString(contact_info_list[10]) + # 转换为 JSON 格式 + detail = MessageToDict(message) + gender_code = detail.get('gender', 0) + if gender_code == 1: + gender = '男' + elif gender_code == 2: + gender = '女' + label_list = detail.get('labelList', '').strip(',').split(',') + signature = detail.get('signature', '') + region = (detail.get('country', ''), detail.get('province', ''), detail.get('city', '')) + label_list = self.contact_db.get_labels(detail.get('labelList')).split(',') + except: + pass + # logger.error(f'{wxid} {contact_info_list[5]}联系人解析失败\n{contact_info_list[10]}') + contact = Contact( + wxid=contact_info_list[0], + remark=remark, + alias=contact_info_list[1], + nickname=nickname, + small_head_img_url=contact_info_list[8], + big_head_img_url=contact_info_list[9], + flag=contact_info_list[3], + gender=gender, + signature=signature, + label_list=label_list, + region=region + ) + + def is_nth_bit_set(number, n): + # 左移 1 到第 n 位 + mask = 1 << n + # 使用位与运算判断第 n 位 + return (number & mask) != 0 + + if local_type == 1: + contact.type = ContactType.Normal + if wxid.startswith('gh_'): + contact.type |= ContactType.Public + elif wxid.endswith('@chatroom'): + contact.type |= ContactType.Chatroom + elif local_type == 2: + contact.type = ContactType.Chatroom + elif local_type == 3: + contact.type = ContactType.Stranger + elif local_type == 5: + contact.type = ContactType.OpenIM + if is_nth_bit_set(flag, 6): + contact.type |= ContactType.Star + if is_nth_bit_set(flag, 11): + contact.type |= ContactType.Sticky + + if local_type == 10086: + contact.type = ContactType.Unknown + contact.is_unknown = True + return contact + + def get_contacts(self) -> List[Person]: + contacts = [] + contact_lists = self.contact_db.get_contacts() + for contact_info_list in contact_lists: + if contact_info_list: + contact = self.create_contact(contact_info_list) + contacts.append(contact) + return contacts + + def set_remark(self, username: str, remark) -> bool: + if username in self.contacts_map: + self.contacts_map[username].remark = remark + return self.contact_db.set_remark(username, remark) + + def set_avatar_buffer(self, username, avatar_path): + return self.head_image_db.set_avatar_buffer(username, avatar_path) + + def get_contact_by_username(self, wxid: str) -> Person: + contact_info_list = self.contact_db.get_contact_by_username(wxid) + if contact_info_list: + contact = self.create_contact(contact_info_list) + return contact + else: + contact = Contact( + wxid=wxid, + nickname=wxid, + remark=wxid + ) + return contact + + def get_chatroom_members(self, chatroom_name) -> dict[Any, Person] | Any: + """ + 获取群成员 + @param chatroom_name: + @return: + """ + if chatroom_name in self.chatroom_members_map: + return self.chatroom_members_map[chatroom_name] + result = {} + chatroom = self.contact_db.get_chatroom_info(chatroom_name) + + if chatroom is None: + return result + # 解析RoomData数据 + parsechatroom = ChatRoomData() + parsechatroom.ParseFromString(chatroom[1]) + # 群成员数据放入字典存储 + for mem in parsechatroom.members: + contact = self.get_contact_by_username(mem.wxID) + if contact: + if mem.displayName: + contact.remark = mem.displayName + result[contact.wxid] = contact + self.chatroom_members_map[chatroom_name] = result + return result + + def _get_chatroom_name(self, wxid): + chatroom = self.contact_db.get_chatroom_info(wxid) + + if chatroom is None: + return '' + # 解析RoomData数据 + parsechatroom = ChatRoomData() + parsechatroom.ParseFromString(chatroom[1]) + chatroom_name = '' + # 群成员数据放入字典存储 + for mem in parsechatroom.members[:5]: + if mem.wxID == Me().wxid: + continue + if mem.displayName: + chatroom_name += f'{mem.displayName}、' + else: + contact = self.get_contact_by_username(mem.wxID) + chatroom_name += f'{contact.remark}、' + return chatroom_name.rstrip('、') + + # 联系人结束 + + def add_audio_txt(self, msgSvrId, text): + return self.audio_to_text.add_text(msgSvrId, text) + + def get_favorite_items(self, time_range): + return self.favorite_db.get_items(time_range) + + def merge(self, db_dir): + """ + 批量将db_path中的数据合入到数据库中 + @param db_path: + @return: + """ + merge_tasks = { + self.head_image_db: os.path.join(db_dir, 'head_image', 'head_image.db'), + self.hardlink_db: os.path.join(db_dir, 'hardlink', 'hardlink.db'), + self.media_db: os.path.join(db_dir, 'message', 'media_0.db'), + self.contact_db: os.path.join(db_dir, 'contact', 'contact.db'), + self.emotion_db: os.path.join(db_dir, 'emoticon', 'emoticon.db'), + self.message_db: os.path.join(db_dir, 'message', 'message_0.db'), + self.biz_message_db: os.path.join(db_dir, 'message', 'biz_message_0.db'), + self.session_db: os.path.join(db_dir, 'session', 'session.db'), + } + + def merge_task(db_instance, db_path): + """执行单个数据库的合并任务""" + db_instance.merge(db_path) + + # 使用 ThreadPoolExecutor 进行多线程合并 + with concurrent.futures.ThreadPoolExecutor() as executor: + futures = {executor.submit(merge_task, db, path): (db, path) for db, path in merge_tasks.items()} + + # 等待所有任务完成 + for future in concurrent.futures.as_completed(futures): + db, path = futures[future] + try: + future.result() # 这里会抛出异常(如果有的话) + print(f"成功合并数据库: {path}") + except Exception as e: + print(f"合并 {path} 失败: {e}") diff --git a/wxManager/merge.py b/wxManager/merge.py new file mode 100644 index 0000000..a6452cf --- /dev/null +++ b/wxManager/merge.py @@ -0,0 +1,183 @@ +import os +import sqlite3 +import traceback + +from wxManager.log import logger + + +def table_exists(conn, table_name): + """检查表是否存在""" + cursor = conn.cursor() + cursor.execute("SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", (table_name,)) + return cursor.fetchone()[0] > 0 + + +def get_create_statements(conn, table_name, object_type): + """获取指定表的 CREATE TABLE 或 CREATE INDEX 语句""" + cursor = conn.cursor() + cursor.execute(f"SELECT sql FROM sqlite_master WHERE type='{object_type}' AND tbl_name=?", (table_name,)) + return [row[0] for row in cursor.fetchall() if row[0]] # 过滤掉 None 值 + + +def increase_data(db_path, src_cursor, src_conn, table_name, col_name, col_index=-1, exclude_first_column=False): + """ + 将db_path数据库的内容增量写入connect数据库中 + @param db_path: 新的数据库路径 + @param src_cursor: 待写入数据库游标 + @param src_conn: 待写入数据库连接 + @param table_name: 待写入的表名 + @param col_name: 根据该列进行判断是否是新增数据 + @param col_index: 待写入的列号 + @param exclude_first_column: 是否不考虑低一列(针对第一列是自增ID的表) + @return: + """ + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + if not src_cursor or not src_conn: + print(f'{db_path} 数据库连接无效,增量解析失败') + return + tgt_conn = sqlite3.connect(db_path) + tgt_cur = tgt_conn.cursor() + + try: + if not table_exists(tgt_conn, table_name): + # 复制表结构 + create_table_sql = get_create_statements(src_conn, table_name, "table") + if create_table_sql: + tgt_conn.execute(create_table_sql[0]) # 执行 CREATE TABLE 语句 + print(f"表 {table_name} 结构已复制") + + # 复制索引 + create_index_sql_list = get_create_statements(src_conn, table_name, "index") + for create_index_sql in create_index_sql_list: + tgt_conn.execute(create_index_sql) # 执行 CREATE INDEX 语句 + print(f"索引已复制: {create_index_sql}") + # 获取列名 + src_cursor.execute(f"PRAGMA table_info({table_name})") + columns_info = src_cursor.fetchall() + if columns_info and exclude_first_column: + columns_info = columns_info[1:] + column_names = [info[1] for info in columns_info] + num_columns = len(column_names) + + if col_index == -1: + try: + col_index = column_names.index(col_name) + except ValueError: + print(f"错误: 列 {col_name} 在表 {table_name} 中不存在") + return + # 从数据库B中选择主键不在数据库A中的行 + query = f""" + SELECT {', '.join([name for name in column_names])} + FROM {table_name} + """ + tgt_cur.execute(query) + target_rows = tgt_cur.fetchall() + query = f''' + SELECT {col_name} + FROM {table_name} + ''' + src_cursor.execute(query) + source_rows = src_cursor.fetchall() + + source_rows = {r[0] for r in source_rows} + rows_to_insert = [row for row in target_rows if row[col_index] not in source_rows] + + if rows_to_insert: + insert_query = f""" + INSERT INTO {table_name} ({', '.join(column_names)}) + VALUES ({', '.join(['?'] * num_columns)}) + """ + src_cursor.executemany(insert_query, rows_to_insert) + src_conn.commit() + print(f"{len(rows_to_insert)} 行已插入到 {table_name} 表中") + else: + print(f"没有需要插入的数据,{table_name} 表已是最新") + except sqlite3.Error as e: + print(f"{db_path} 数据库操作错误: {e}") + finally: + tgt_cur.close() + tgt_conn.close() + + +def increase_update_data(db_path, src_cur, src_conn, table_name, col_name, col_index=-1, exclude_first_column=False): + """ + 将 db_path 数据库的内容增量写入 src_conn 连接的数据库,如果有冲突则删除旧数据并更新 + :param db_path: 目标数据库文件路径 + :param src_cur: 源数据库游标 + :param src_conn: 源数据库连接 + :param table_name: 需要同步的表名 + :param col_name: 用于匹配的列名 + :param col_index: 指定列的索引(默认为 -1,即自动检测) + :param exclude_first_column: 是否排除第一列 + """ + if not (os.path.exists(db_path) or os.path.isfile(db_path)): + print(f'{db_path} 不存在') + return + + tgt_conn = sqlite3.connect(db_path) + tgt_cur = tgt_conn.cursor() + try: + if not table_exists(tgt_conn, table_name): + # 复制表结构 + create_table_sql = get_create_statements(src_conn, table_name, "table") + if create_table_sql: + tgt_conn.execute(create_table_sql[0]) # 执行 CREATE TABLE 语句 + print(f"表 {table_name} 结构已复制") + + # 复制索引 + create_index_sql_list = get_create_statements(src_conn, table_name, "index") + for create_index_sql in create_index_sql_list: + tgt_conn.execute(create_index_sql) # 执行 CREATE INDEX 语句 + print(f"索引已复制: {create_index_sql}") + + # 获取列名 + src_cur.execute(f"PRAGMA table_info({table_name})") + columns_info = src_cur.fetchall() + if exclude_first_column: + columns_info = columns_info[1:] + + column_names = [info[1] for info in columns_info] + num_columns = len(column_names) + + if col_index == -1: + try: + col_index = column_names.index(col_name) + except ValueError: + print(f"错误: 列 {col_name} 在 {table_name} 表中不存在。") + return + + # 查询目标数据库的数据 + query = f"SELECT {', '.join(column_names)} FROM {table_name}" + tgt_cur.execute(query) + source_rows = set(tgt_cur.fetchall()) # 使用 set() 加速查询 + + # 查询源数据库已有的数据 + src_cur.execute(query) + existing_rows = set(src_cur.fetchall()) + + # 需要删除并重新插入的行 + rows_to_insert = [row for row in source_rows if row not in existing_rows] + + if rows_to_insert: + delete_query = f"DELETE FROM {table_name} WHERE {col_name} = ?" + src_cur.executemany(delete_query, [(row[col_index],) for row in rows_to_insert]) + src_conn.commit() + + insert_query = f"INSERT INTO {table_name} ({', '.join(column_names)}) VALUES ({', '.join(['?'] * num_columns)})" + src_cur.executemany(insert_query, rows_to_insert) + src_conn.commit() + print(f"{len(rows_to_insert)} 行已更新到 {table_name} 表中。") + else: + print(f"没有需要插入的数据,{table_name} 表已是最新。") + except sqlite3.Error as e: + print(f"{db_path} 数据库操作错误: {e}") + finally: + tgt_cur.close() + tgt_conn.close() + + +if __name__ == "__main__": + # 源数据库文件列表 + source_databases = ["Msg0/MSG2.db", "Msg/MSG2.db", "Msg/MSG3.db"] diff --git a/wxManager/model/__init__.py b/wxManager/model/__init__.py new file mode 100644 index 0000000..4f5de09 --- /dev/null +++ b/wxManager/model/__init__.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/10 21:02 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-__init__.py.py +@Description : 定义抽象的数据模型如聊天记录,联系人或基类 +""" + +from .message import Message, MessageType, TextMessage, ImageMessage, FileMessage, VideoMessage, AudioMessage, \ + EmojiMessage, QuoteMessage, MergedMessage, LinkMessage, PositionMessage +from .db_model import DataBaseBase +from .contact import Person, Contact, OpenIMContact, Me + +if __name__ == '__main__': + pass diff --git a/wxManager/model/contact.py b/wxManager/model/contact.py new file mode 100644 index 0000000..5795943 --- /dev/null +++ b/wxManager/model/contact.py @@ -0,0 +1,181 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/10 21:03 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-contact.py +@Description : 定义各种联系人 +""" +from dataclasses import dataclass +import json +import os + +import os.path +import re +from enum import Enum +from typing import Dict, List, Tuple + + +def remove_illegal_characters(text): + # 去除 ASCII 控制字符(除了合法的制表符、换行符和回车符) + illegal_chars = re.compile(r'[\x00-\x08\x0B\x0C\x0E-\x1F]') + return illegal_chars.sub('', text) + + +class Gender: + MAN = 1 + WOMAN = 2 + UNKNOWN = 0 + + +class ContactType: + Sticky = 1 << 0 # 1 置顶 + Star = 1 << 1 # 2 星标 + Chatroom = 1 << 2 # 4 群聊 + Normal = 1 << 3 # 8 普通联系人 + Stranger = 1 << 4 # 16 陌生人 + OpenIM = 1 << 5 # 32 企业微信联系人 + Public = 1 << 6 # 64 公众号 + Unknown = 1 << 8 # 已解散或者退出的群聊 + + +@dataclass +class Person: + wxid: str + remark: str + nickname: str + alias: str = '' + small_head_img_url: str = '' + small_head_img_blog: bytes = b'' + big_head_img_url: str = '' + type: int = ContactType.Normal + flag: int = 0 + gender: str = '未知' + signature: str = '' + label_list: List[str] = None + region: Tuple[str, str, str] = ('', '', '') # 地区 (国家,省份,城市) + + def is_chatroom(self): + return self.wxid.endswith('@chatroom') # 是否是群聊 + + def is_public(self): + return self.wxid.startswith('gh') # 是否是公众号 + + def is_open_im(self): + return self.wxid.endswith('@openim') # 是否是企业微信联系人 + + def label_name(self): + if self.label_list: + return ','.join(self.label_list) + else: + return '' + + def __str__(self): + return f''' +wxid:{self.wxid} +alias:{self.alias} +nickname:{self.nickname} +gender:{self.gender} +region:{self.region} +signature:{self.signature} +''' + + def to_json(self): + return { + 'wxid': self.wxid, + 'alias': self.alias, + 'nickname': self.nickname, + 'remark': self.remark, + 'type': self.type, + 'gender': self.gender, + } + + +@dataclass +class Contact(Person): + is_unknown: bool = False # 是否是联系人表中没有的数据 + # def __init__(self, contact_info: Dict): + # super().__init__() + # self.wxid: str = contact_info.get('UserName') + # self.is_chatroom = self.wxid.__contains__('@chatroom') # 是否是群聊 + # self.is_open_im = self.wxid.endswith('@openim') # 是否是企业微信联系人 + # self.is_public = self.wxid.startswith('gh') + # self.is_unknown = False # 是否是联系人表中没有的数据 + # if self.wxid.endswith('@stranger'): + # self.wxid = self.wxid[-16:] + # self.remark = contact_info.get('Remark') + # # Alias,Type,Remark,NickName,PYInitial,RemarkPYInitial,ContactHeadImgUrl.smallHeadImgUrl,ContactHeadImgUrl,bigHeadImgUrl + # self.alias = contact_info.get('Alias') + # self.nickname = remove_illegal_characters(contact_info.get('NickName')) + # if not self.nickname: + # self.nickname = '未命名' + # self.wording = contact_info.get('wording') # 企业联系人的企业名 + # if not self.remark: + # self.remark = self.nickname + # if self.is_open_im: + # self.remark += f'@{self.wording}' + # self.remark = re.sub(r'[\\/:*?"<>|\s\.]', '_', self.remark) + # self.small_head_img_url = contact_info.get('smallHeadImgUrl') + # self.big_head_img_url = contact_info.get('bigHeadImgUrl') + # self.small_head_img_blog = b'' + # + # self.type = contact_info.get('Type', 0) + # self.flag = contact_info.get('flag', 0) + # + # self.gender = contact_info.get('gender', '') + # self.label_name = contact_info.get('label_name', '') # 联系人的标签分类 + # self.region = contact_info.get('region', ('', '', '')) + # self.signature = contact_info.get('signature', '') + + +class OpenIMContact(Person): + def __init__(self, contact_info: Dict): + super().__init__() + + +def singleton(cls): + _instance = {} + + def inner(): + if cls not in _instance: + _instance[cls] = cls() + return _instance[cls] + + return inner + + +@singleton +@dataclass +class Me: + def __init__(self): + self.wxid = 'wxid_00112233' + self.wx_dir = '' + self.name = '' + self.mobile = '' + self.small_head_img_url = '' + self.nickname = self.name + self.remark = self.nickname + self.xor_key = -1 + + def to_json(self) -> dict: + return { + 'username': self.wxid, + 'nickname': self.name, + 'wx_dir': self.wx_dir, + 'xor_key': self.xor_key + } + + def load_from_json(self, json_file): + if os.path.exists(json_file): + with open(json_file, 'r', encoding='utf-8') as f: + dic = json.load(f) + self.name = dic.get('nickname', '') + self.wxid = dic.get('username', '') + self.wx_dir = dic.get('wx_dir', '') + self.xor_key = dic.get('xor_key', '') + + def save_to_json(self, json_file): + with open(json_file, 'w', encoding='utf-8') as f: + json.dump(self.to_json(), f, ensure_ascii=False, indent=4) diff --git a/wxManager/model/db_model.py b/wxManager/model/db_model.py new file mode 100644 index 0000000..8dacd43 --- /dev/null +++ b/wxManager/model/db_model.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/5 22:47 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-db_model.py +@Description : +""" +import os +import sqlite3 +import traceback + + +class DataBaseBase: + def __init__(self, db_file_name, is_series=False): + self.DB = None + self.cursor = None + self.open_flag = False + self.db_file_name = db_file_name + self.is_series = is_series # 是否是一系列数据库,例如MSG0、MSG1、MSG2······ + self.db_dir = '' + + def init_database(self, db_dir=''): + self.db_dir = db_dir + db_path = os.path.join(db_dir, self.db_file_name) + if not os.path.exists(db_path): + return False + db_file_name = self.db_file_name + self.db_file_name = [] + if self.is_series: + self.DB = [] + self.cursor = [] + for i in range(100): + new_file_name = db_file_name.replace('0', f'{i}') + db_path = os.path.join(db_dir, new_file_name) + if os.path.exists(db_path): + self.db_file_name.append(os.path.basename(new_file_name)) + # print('初始化数据库:', db_path) + DB = sqlite3.connect(db_path, check_same_thread=False) + cursor = DB.cursor() + self.DB.append(DB) + self.cursor.append(cursor) + self.open_flag = True + else: + if os.path.exists(db_path): + self.DB = sqlite3.connect(db_path, check_same_thread=False) + # '''创建游标''' + self.cursor = self.DB.cursor() + self.open_flag = True + # print('初始化数据库完成:', db_path) + self.self_init() + return True + + def self_init(self): + pass + + def commit(self): + if self.is_series: + for db in self.DB: + db.commit() + else: + self.DB.commit() + + def execute(self, sql, args): + self.cursor.execute(sql, args) + + def close(self): + if self.open_flag: + try: + self.open_flag = False + if self.is_series: + for db in self.DB: + db.close() + else: + if self.DB: + self.DB.close() + except: + print(traceback.format_exc()) + finally: + pass + + def merge(self, db_path): + pass + + def __del__(self): + self.close() + + +if __name__ == '__main__': + pass diff --git a/wxManager/model/message.py b/wxManager/model/message.py new file mode 100644 index 0000000..508928a --- /dev/null +++ b/wxManager/model/message.py @@ -0,0 +1,653 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/10 21:03 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-message.py +@Description : +""" +from dataclasses import dataclass +from typing import List +from datetime import datetime + +import xmltodict + + +class MessageType: + Unknown = -1 + Text = 1 + Text2 = 2 + Image = 3 + Audio = 34 + BusinessCard = 42 + Video = 43 + Emoji = 47 + Position = 48 + Voip = 50 + OpenIMBCard = 66 + System = 10000 + File = 25769803825 + LinkMessage = 21474836529 + LinkMessage2 = 292057776177 + Music = 12884901937 + LinkMessage4 = 4294967345 + LinkMessage5 = 326417514545 + LinkMessage6 = 17179869233 + RedEnvelope = 8594229559345 + Transfer = 8589934592049 + Quote = 244813135921 + MergedMessages = 81604378673 + Applet = 141733920817 + Applet2 = 154618822705 + WeChatVideo = 219043332145 + FavNote = 103079215153 + Pat = 266287972401 + + @classmethod + def name(cls, type_): + type_name_map = { + cls.Unknown: '未知类型', + cls.Text: '文本', + cls.Image: '图片', + cls.Video: '视频', + cls.Audio: '语音', + cls.Emoji: '表情包', + cls.Voip: '音视频通话', + cls.File: '文件', + cls.Position: '位置分享', + cls.LinkMessage: '分享链接', + cls.LinkMessage2: '分享链接', + cls.LinkMessage4: '分享链接', + cls.LinkMessage5: '分享链接', + cls.LinkMessage6: '分享链接', + cls.RedEnvelope: '红包', + cls.Transfer: '转账', + cls.Quote: '引用消息', + cls.MergedMessages: '合并转发的聊天记录', + cls.Applet: '小程序', + cls.Applet2: '小程序', + cls.WeChatVideo: '视频号', + cls.Music: '音乐分享', + cls.FavNote: '收藏笔记', + cls.BusinessCard: '个人/公众号名片', + cls.OpenIMBCard: '企业微信名片', + cls.System: '系统消息', + cls.Pat: '拍一拍' + } + return type_name_map.get(type_, '未知类型') + + +@dataclass +class Message: + local_id: int # 消息ID + server_id: int # 消息的唯一ID + sort_seq: int # 排序用的id + timestamp: int # 发送秒级时间戳 + str_time: str # 格式化时间 2024-12-01 12:00:00 + type: MessageType # 消息类型(文本、图片、视频等) + talker_id: str # 聊天对象的wxid,好友的wxid或者群聊的wxid + is_sender: bool # 自己是否是发送者 + sender_id: str # 消息发送者的ID + display_name: str # 消息发送者的对外展示的昵称(备注名,群昵称) + avatar_src: str # 消息发送者头像 + status: int # 消息状态 + xml_content: str # xml数据 + + def is_chatroom(self) -> bool: + return self.talker_id.endswith('@chatroom') + + def to_json(self) -> dict: + try: + xml_dict = xmltodict.parse(self.xml_content) + except: + xml_dict = {} + return { + 'type': str(self.type), + 'is_send': self.is_sender, + 'timestamp': self.timestamp, + 'server_id': str(self.server_id), + 'display_name': self.display_name, + 'avatar_src': self.avatar_src, + 'xml_dict': xml_dict + } + + def type_name(self): + # 获取消息类型的文字描述 + return MessageType.name(self.type) + + def to_text(self): + try: + return f'{self.type}\n{xmltodict.parse(self.xml_content)}' + except: + print(self.xml_content) + return f'{self.type}\n{self.xml_content}' + + def __lt__(self, other): + return self.sort_seq < other.sort_seq + + +@dataclass +class TextMessage(Message): + # 文本消息 + content: str + + def to_text(self): + return self.content + + def to_json(self) -> dict: + data = super().to_json() + data['text'] = self.content + return data + + +@dataclass +class QuoteMessage(TextMessage): + # 引用消息 + quote_message: Message + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + "text": self.content, + 'quote_server_id': f'{self.quote_message.server_id}', + 'quote_type': self.quote_message.type, + } + ) + if self.quote_message.type == MessageType.Quote: + # 防止递归引用 + data['quote_text'] = f'{self.quote_message.display_name}: {self.quote_message.content}' + else: + data['quote_text'] = f'{self.quote_message.display_name}: {self.quote_message.to_text()}' + return data + + def to_text(self): + if self.quote_message.type == MessageType.Quote: + # 防止递归引用 + return f'{self.content}\n引用:{self.quote_message.display_name}: {self.quote_message.content}' + else: + return f'{self.content}\n引用:{self.quote_message.display_name}: {self.quote_message.to_text()}' + + +@dataclass +class FileMessage(Message): + # 文件消息 + path: str + md5: str + file_size: int + file_name: str + file_type: str + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'path': self.path, + 'file_name': self.file_name, + 'file_size': self.file_size, + 'file_type': self.file_type + } + ) + return data + + def get_file_size(self, format_='MB'): + # 定义转换因子 + units = { + 'B': 1, + 'KB': 1024, + 'MB': 1024 ** 2, + 'GB': 1024 ** 3, + } + + # 将文件大小转换为指定格式 + if format_ in units: + size_in_format = self.file_size / units[format_] + return f'{size_in_format:.2f} {format_}' + else: + raise ValueError(f'Unsupported format: {format_}') + + def set_file_name(self, file_name=''): + if file_name: + self.file_name = file_name + return True + # 把时间戳转换为格式化时间 + time_struct = datetime.fromtimestamp(self.timestamp) # 首先把时间戳转换为结构化时间 + str_time = time_struct.strftime("%Y%m%d_%H%M%S") # 把结构化时间转换为格式化时间 + str_time = f'{str_time}_{str(self.server_id)[:6]}' + if self.is_sender: + str_time += '_1' + else: + str_time += '_0' + self.file_name = str_time + return True + + def to_text(self): + return f'【文件】{self.file_name} {self.get_file_size()} {self.path} {self.file_type} {self.md5}' + + +@dataclass +class ImageMessage(FileMessage): + # 图片消息 + thumb_path: str + + def to_json(self) -> dict: + data = super().to_json() + data['path'] = self.path + data['thumb_path'] = self.thumb_path + return data + + def to_text(self): + return f'【图片】' + + +@dataclass +class EmojiMessage(ImageMessage): + # 表情包 + url: str + thumb_url: str + description: str + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'path': self.url, + 'desc': self.description + } + ) + return data + + def to_text(self): + return f'【表情包】 {self.description}' + + +@dataclass +class VideoMessage(FileMessage): + # 视频消息 + thumb_path: str + duration: int + raw_md5: str + + def to_text(self): + return '【视频】' + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'path': self.path, + 'thumb_path': self.thumb_path, + 'duration': self.duration + } + ) + return data + + +@dataclass +class AudioMessage(FileMessage): + # 语音消息 + duration: int + audio_text: str + + def set_file_name(self): + # 把时间戳转换为格式化时间 + time_struct = datetime.fromtimestamp(self.timestamp) # 首先把时间戳转换为结构化时间 + str_time = time_struct.strftime("%Y%m%d_%H%M%S") # 把结构化时间转换为格式化时间 + str_time = f'{str_time}_{str(self.server_id)[:6]}' + if self.is_sender: + str_time += '_1' + else: + str_time += '_0' + self.file_name = str_time + + def get_file_name(self): + return self.file_name + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'path': self.path, + 'voice_to_text': self.audio_text, + 'duration': self.duration, + } + ) + return data + + def to_text(self): + # return f'{self.server_id}\n{self.type}\n{xmltodict.parse(self.xml_content)}' + return f'【语音】{self.audio_text}' + + +@dataclass +class LinkMessage(Message): + # 链接消息 + href: str # 跳转链接 + title: str # 标题 + description: str # 描述/音乐作者 + cover_path: str # 本地封面路径 + cover_url: str # 封面地址 + app_name: str # 应用名 + app_icon: str # 应用logo + app_id: str # app ip + + def to_text(self): + return f'''【分享链接】 +标题:{self.title} +描述:{self.description} +链接: {self.href} +应用:{self.app_name} +''' + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'url': self.href, + 'title': self.title, + 'description': self.description, + 'cover_url': self.cover_url, + 'app_logo': self.app_icon, + 'app_name': self.app_name, + } + ) + return data + + +@dataclass +class WeChatVideoMessage(Message): + # 视频号消息 + url: str # 下载地址 + publisher_nickname: str # 视频发布者昵称 + publisher_avatar: str # 视频发布者头像 + description: str # 视频描述 + media_count: int # 视频个数 + cover_path: str # 封面本地路径 + cover_url: str # 封面网址 + thumb_url: str # 缩略图 + duration: int # 视频时长,单位(秒) + width: int # 视频宽度 + height: int # 视频高度 + + def to_text(self): + return f'''【视频号】 +描述: {self.description} +发布者: {self.publisher_nickname} +''' + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'url': self.url, + 'title': self.description, + 'cover_url': self.cover_url, + 'duration': self.duration, + 'publisher_nickname': self.publisher_nickname, + 'publisher_avatar': self.publisher_avatar + } + ) + return data + + +@dataclass +class MergedMessage(Message): + # 合并转发的聊天记录 + title: str + description: str + messages: List[Message] # 嵌套子消息 + level: int # 嵌套层数 + + def to_text(self): + res = f'【合并转发的聊天记录】\n\n' + for message in self.messages: + res += f"{' ' * self.level * 4}- {message.str_time} {message.display_name}: {message.to_text()}\n" + return res + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'title': self.title, + 'description': self.description, + 'messages': [msg.to_json() for msg in self.messages], + } + ) + return data + + +@dataclass +class VoipMessage(Message): + # 音视频通话 + invite_type: int # -1,1:语音通话,0:视频通话 + display_content: str # 界面显示内容 + duration: int + + def to_text(self): + return f'【音视频通话】\n{self.display_content}' + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'invite_type': self.invite_type, + 'display_content': self.display_content, + 'duration': self.duration + } + ) + return data + + +@dataclass +class PositionMessage(Message): + # 位置分享 + x: float # 经度 + y: float # 维度 + label: str # 详细标签 + poiname: str # 位置点标记名 + scale: float # 缩放率 + + def to_text(self): + return f'''【位置分享】 +坐标: ({self.x},{self.y}) +名称: {self.poiname} +标签: {self.label} +''' + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'x': self.x, # 经度 + 'y': self.y, # 维度 + 'label': self.label, # 详细标签 + 'poiname': self.poiname, # 位置点标记名 + 'scale': self.scale, # 缩放率 + } + ) + return data + + +@dataclass +class BusinessCardMessage(Message): + # 名片消息 + is_open_im: bool # 是否是企业微信 + username: str # 名片的wxid + nickname: str # 名片昵称 + alias: str # 名片微信号 + province: str # 省份 + city: str # 城市 + sign: str # 签名 + sex: int # 性别 0:未知,1:男,2:女 + small_head_url: str # 头像 + big_head_url: str # 头像原图 + open_im_desc: str # 公司名 + open_im_desc_icon: str # 公司logo + + def _sex_name(self): + if self.sex == 0: + return '未知' + elif self.sex == 1: + return '男' + else: + return '女' + + def to_text(self): + if self.is_open_im: + return f'''【名片】 +公司: {self.open_im_desc} +昵称: {self.nickname} +性别: {self._sex_name()} +''' + else: + return f'''【名片】 +微信号:{self.alias} +昵称: {self.nickname} +签名: {self.sign} +性别: {self._sex_name()} +地区: {self.province} {self.city} +''' + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'is_open_im': self.is_open_im, + 'big_head_url': self.big_head_url, # 头像原图 + 'small_head_url': self.small_head_url, # 小头像 + 'username': self.username, # wxid + 'nickname': self.nickname, # 昵称 + 'alias': self.alias, # 微信号 + 'province': self.province, # 省份 + 'city': self.city, # 城市 + 'sex': self._sex_name(), # int :性别 0:未知,1:男,2:女 + 'open_im_desc': self.open_im_desc, # 公司名 + 'open_im_desc_icon': self.open_im_desc_icon, # 公司名前面的图标 + } + ) + return data + + +@dataclass +class TransferMessage(Message): + # 转账 + fee_desc: str # 金额 + pay_memo: str # 备注 + receiver_username: str # 收款人 + pay_subtype: int # 状态 + + def display_content(self): + text_info_map = { + 1: "发起转账", + 3: "已收款", + 4: "已退还", + 5: "非实时转账收款", + 7: "发起非实时转账", + 8: "未知", + 9: "未知", + } + return text_info_map.get(self.pay_subtype, '未知') + + def to_text(self): + return f'''【{self.display_content()}】:{self.fee_desc} +备注: {self.pay_memo} +''' + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'text': self.display_content(), # 显示文本 + 'pay_subtype': self.pay_subtype, # 当前状态 + 'pay_memo': self.pay_memo, # 备注 + 'fee_desc': self.fee_desc # 金额 + } + ) + return data + + +@dataclass +class RedEnvelopeMessage(Message): + # 红包 + icon_url: str # 红包logo + title: str + inner_type: int + + def to_text(self): + return f'''【红包】: {self.title}''' + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'text': self.title, # 显示文本 + 'inner_type': self.inner_type, # 当前状态 + } + ) + return data + + +@dataclass +class FavNoteMessage(Message): + # 收藏笔记 + title: str + description: str + record_item: str + + def to_text(self): + return f'''【笔记】 +{self.description} +{self.record_item} +''' + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'text': self.title, # 显示文本 + 'description': self.description, # 内容 + 'record_item': self.record_item + } + ) + return data + + +@dataclass +class PatMessage(Message): + # 拍一拍 + title: str + from_username: str + chat_username: str + patted_username: str + template: str + + def to_text(self): + return self.title + + def to_json(self) -> dict: + data = super().to_json() + data.update( + { + 'type': MessageType.System, + 'text': self.title, # 显示文本 + } + ) + return data + + +if __name__ == '__main__': + msg = TextMessage( + local_id=1, + server_id=101, + timestamp=1678901234, + type="text", + talker_id="wxid_12345", + is_sender=True, + sender_id="wxid_67890", + display_name="John Doe", + status=3, + content="Hello, world!" + ) + print(msg.status) # 输出:3 diff --git a/wxManager/parser/__init__.py b/wxManager/parser/__init__.py new file mode 100644 index 0000000..2b393d7 --- /dev/null +++ b/wxManager/parser/__init__.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/11 1:26 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-__init__.py.py +@Description : +""" + +if __name__ == '__main__': + pass diff --git a/wxManager/parser/audio_parser.py b/wxManager/parser/audio_parser.py new file mode 100644 index 0000000..2a0a536 --- /dev/null +++ b/wxManager/parser/audio_parser.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/12 16:55 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-audio_parser.py +@Description : +""" +import xmltodict + + +def parser_audio(xml_content): + result = { + 'audio_length': 0, + 'audio_text':'' + } + xml_content = xml_content.strip() + try: + xml_dict = xmltodict.parse(xml_content) + voice_length = xml_dict.get('msg', {}).get('voicemsg', {}).get('@voicelength', 0) + audio_text = xml_dict.get('msg',{}).get('voicetrans',{}).get('@transtext','') + result = { + 'audio_length': voice_length, + 'audio_text':audio_text + } + except: + if xml_content and ':' in xml_content: + voice_length = int(xml_content.split(':')[1]) + result = { + 'audio_length': voice_length + } + finally: + return result + + +if __name__ == '__main__': + pass diff --git a/wxManager/parser/emoji_parser.py b/wxManager/parser/emoji_parser.py new file mode 100644 index 0000000..a9af038 --- /dev/null +++ b/wxManager/parser/emoji_parser.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/12 18:10 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-emoji_parser.py +@Description : +""" +import base64 +import traceback + +import xmltodict +from google.protobuf.json_format import MessageToDict + +from wxManager.log import logger +from wxManager.parser.util.protocbuf import emoji_desc_pb2 + + +def parser_emoji(xml_content): + result = { + 'md5': 0, + 'url': '', + 'width': 0, + 'height': 0, + 'desc': '' + } + xml_content = xml_content.strip() + try: + xml_dict = xmltodict.parse(xml_content) + emoji_dic = xml_dict.get('msg', {}).get('emoji', {}) + if '@androidmd5' in emoji_dic: + md5 = emoji_dic.get('@androidmd5', '') + else: + md5 = emoji_dic.get('@md5', '') + # logger.error(xml_dict) + desc_bs64 = emoji_dic.get('@desc', '') + desc = '' + if desc_bs64: + # 逆天微信,竟然把protobuf数据用base64编码后放入xml里 + desc_bytes_proto = base64.b64decode(desc_bs64) + message = emoji_desc_pb2.EmojiDescData() + # 解析二进制数据 + message.ParseFromString(desc_bytes_proto) + dict_output = MessageToDict(message) + for item in dict_output.get('descItem', []): + desc = item.get('desc', '') + if desc: + break + result = { + 'md5': md5, + 'url': emoji_dic.get('@cdnurl', ''), + 'width': emoji_dic.get('@width', 0), + 'height': emoji_dic.get('@height', 0), + 'desc': desc, + } + except: + logger.error(traceback.format_exc()) + finally: + return result + + +if __name__ == '__main__': + pass diff --git a/wxManager/parser/file_parser.py b/wxManager/parser/file_parser.py new file mode 100644 index 0000000..cecd8da --- /dev/null +++ b/wxManager/parser/file_parser.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/12 22:52 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-file_parser.py +@Description : +""" + +import xmltodict + +from wxManager.log import logger + + +def get_image_type(header): + # 根据文件头判断图片类型 + if header.startswith(b'\xFF\xD8'): + return 'jepg' + elif header.startswith(b'\x89PNG'): + return 'png' + elif header[:6] in (b'GIF87a', b'GIF89a'): + return 'gif' + elif header.startswith(b'BM'): + return 'bmp' + elif header.startswith(b'\x00\x00\x01\x00'): + return 'ico' + elif header.startswith(b'\x49\x49\x2A\x00') or header.startswith(b'\x4D\x4D\x00\x2A'): + return 'tiff' + elif header.startswith(b'RIFF') and header[8:12] == b'WEBP': + return 'webp' + else: + return 'png' + + +def parse_video(xml_content): + result = { + 'md5': 0 + } + xml_content = xml_content.strip() + try: + xml_dict = xmltodict.parse(xml_content) + # logger.error(json.dumps(xml_dict)) + video_dic = xml_dict.get('msg', {}).get('videomsg', {}) + md5 = video_dic.get('@md5', '') # 下载后压缩视频的md5 + rawmd5 = video_dic.get('@rawmd5', '') # 原视频md5 + result = { + 'md5': md5, + 'rawmd5': rawmd5, + 'length': video_dic.get('@playlength', 0), + 'size': video_dic.get('@length', 0) + } + except: + logger.error(f'视频解析失败\n{xml_content}') + finally: + return result + + +if __name__ == '__main__': + pass diff --git a/wxManager/parser/link_parser.py b/wxManager/parser/link_parser.py new file mode 100644 index 0000000..5078126 --- /dev/null +++ b/wxManager/parser/link_parser.py @@ -0,0 +1,1232 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2025/1/10 2:02 +@Author : SiYuan +@Email : 863909694@qq.com +@File : wxManager-link_parser.py +@Description : +""" +import html +import traceback +from datetime import datetime, timedelta +import xml.etree.ElementTree as ET +from typing import List + +import xmltodict + +from wxManager.log import logger +from wxManager.model import * + + +def parser_link(xml_content): + result = { + 'title': '', + 'desc': '', + 'url': '', + 'appname': '', + 'appid': '', + 'cover_url': '', + 'sourcedisplayname': '', + 'sourceusername': '' + } + xml_content = xml_content.strip() + try: + xml_dict = xmltodict.parse(xml_content) + dic = xml_dict.get('msg', {}) + cover_url = dic.get('appmsg', {}).get('thumburl', '') + if not cover_url: + cover_url = dic.get('appmsg', {}).get('songalbumurl', '') + + result = { + 'title': dic.get('appmsg', {}).get('title', ''), + 'desc': dic.get('appmsg', {}).get('des', ''), + 'url': dic.get('appmsg', {}).get('url', ''), + 'cover_url': cover_url, + 'sourcedisplayname': dic.get('appmsg', {}).get('sourcedisplayname', ''), + 'appname': dic.get('appinfo', {}).get('appname', ''), + 'appid': dic.get('appmsg', {}).get('@appid', ''), + 'sourceusername': dic.get('appmsg', {}).get('sourceusername', ''), + } + except: + logger.error(traceback.format_exc()) + finally: + return result + + +def parser_voip(xml_content): + result = { + 'invite_type': 0, + 'duration': 0, + 'display_content': '' + } + if not xml_content: + return result + try: + xml_content = xml_content.strip() + xml_dict = xmltodict.parse(f'<voipdata>{xml_content}</voipdata>') + dic = xml_dict.get('voipdata', {}) + type_ = dic.get('voipmsg', {}).get('@type') + duration = 0 + if type_ == 'VoIPBubbleMsg': + invite_type = -1 + display_content = dic.get('voipmsg', {}).get('VoIPBubbleMsg', {}).get('msg', '') + else: + invite_type = dic.get('voipinvitemsg', {}).get('invite_type', '0') + duration = dic.get('voiplocalinfo', {}).get('duration', '0') + display_content = dic.get('voiplocalinfo', {}).get('diaplay_content', '') + result = { + 'invite_type': int(invite_type), + 'duration': duration, + 'display_content': display_content + } + except: + logger.error(traceback.format_exc()) + finally: + return result + + +def parser_applet(xml_content): + result = { + 'title': '', + 'desc': '', + 'url': '', + 'app_icon': '' + } + xml_content = xml_content.strip() + try: + xml_dict = xmltodict.parse(xml_content) + dic = xml_dict.get('msg', {}) + weappinfo = dic.get('appmsg', {}).get('weappinfo', {}) + cover_url = weappinfo.get('weapppagethumbrawurl', '') + if not cover_url: + cover_url = weappinfo.get('weapppagethumbrawurl', '') + if not cover_url: + page_path = weappinfo.get('pagepath', '') + # 按 '&' 分割字符串 + parts = page_path.split('&') + + # 遍历每个部分,找到以 'cover=' 开头的部分 + for part in parts: + if part.startswith('cover='): + # 提取 cover 后面的连接 + cover_url = part.split('=')[1] + + result = { + 'title': dic.get('appmsg', {}).get('title', ''), + 'desc': dic.get('appmsg', {}).get('des', ''), + 'url': dic.get('appmsg', {}).get('url', ''), + 'appname': dic.get('appmsg', {}).get('sourcedisplayname', ''), + 'appid': weappinfo.get('@appid', ''), + 'app_icon': weappinfo.get('weappiconurl', ''), + 'cover_url': cover_url, + } + except: + logger.error(traceback.format_exc()) + finally: + return result + + +def parser_music(xml_content): + if not xml_content: + return {"type": 3, "title": "发生错误", "is_error": True} + try: + root = ET.XML(xml_content) + appmsg = root.find("appmsg") + msg_type = int(appmsg.find("type").text) + title = appmsg.find("title").text + if len(title) >= 39: + title = title[:38] + "..." + artist = appmsg.find("des").text + link_url = appmsg.find("url").text # 链接地址 + try: + songalbumurl = appmsg.find('songalbumurl').text # 封面地址 + except: + songalbumurl = '' + try: + website_name = root.find('appinfo').find('appname').text + except: + website_name = 'QQ音乐' + return { + "type": msg_type, + "title": title, + "artist": artist, + "url": link_url, + "songalbumurl": songalbumurl, + "appname": website_name, + "is_error": False, + } + except Exception as e: + logger.error(f'音乐分享解析失败\n{traceback.format_exc()}') + print(f"Music Share Error: {e}") + return {"type": 3, "title": "发生错误", "is_error": True} + + +def parser_business(xml_content): + result = { + 'bigheadimgurl': '', # 头像原图 + 'smallheadimgurl': '', # 小头像 + 'username': '', # wxid + 'nickname': '', # 昵称 + 'alias': '', # 微信号 + 'province': '', # 省份 + 'city': '', # 城市 + 'sex': 1, # int :性别 0:未知,1:男,2:女 + 'sign': '', # 签名 + 'openimdesc': '', # 公司名 + 'openimdescicon': '', # 公司名前面的图标 + } + xml_content = xml_content.strip() + try: + data = xmltodict.parse(xml_content.replace('&', '&')) + if data and data.get('msg'): + data = data['msg'] + result['bigheadimgurl'] = data.get('@bigheadimgurl') + result['smallheadimgurl'] = data.get('@smallheadimgurl') + result['username'] = data.get('@username') + result['nickname'] = data.get('@nickname') + result['alias'] = data.get('@alias') + result['province'] = data.get('@province') + result['city'] = data.get('@city') + result['sign'] = data.get('@sign') + result['sex'] = int(data.get('@sex', '')) + result['openimdesc'] = data.get('@openimdesc') + result['openimdescicon'] = data.get('@openimdescicon') + return result + except: + logger.error(f'名片解析错误\n{traceback.format_exc()}\n{xml_content}') + result.update( + { + 'type': 1, + 'text': '【名片解析错误】' + } + ) + finally: + return result + + +def parser_record_item(recorditem, output_dir, wxid, msg_time, level=0): + xml_string = recorditem + if isinstance(xml_string, dict): + recorditem_dic = xml_string + else: + recorditem_dic = xmltodict.parse(xml_string) + + # logger.error(recorditem_dic) + datalist = recorditem_dic.get('recordinfo', {}).get('datalist', {}) + count = datalist.get('@count', 0) + dataitem = datalist.get('dataitem', []) + result = [] + if isinstance(dataitem, dict): + # 转发单条消息 + dataitem = [dataitem] + # logger.info(dataitem) + for item in dataitem: + # logger.info(item) + type_ = item.get('@datatype') + timestamp = item.get('srcMsgCreateTime') + if timestamp: + timestamp = int(timestamp) + else: + timestamp = 0 + str_time = item.get('sourcetime') + if not timestamp: + try: + # 将字符串转换为datetime对象 + dt = datetime.strptime(str_time, "%Y-%m-%d %H:%M:%S") + except: + + if '上午' in str_time: + str_time = str_time.replace('上午 ', '上午') + time_format = '%Y-%m-%d 上午%H:%M' + dt = datetime.strptime(str_time, time_format) + timedelta(hours=12) + elif '下午' in str_time: + str_time = str_time.replace('下午 ', '下午') + time_format = '%Y-%m-%d 下午%H:%M' + # 解析后需要加12小时来转换成24小时制 + dt = datetime.strptime(str_time, time_format) + timedelta(hours=12) + else: + try: + import dateparser + str_time = str_time.replace(' ', ' ') + dt = dateparser.parse(str_time) + if dt is None: + raise ValueError("无法解析时间字符串") + timestamp = dt.timestamp() + except: + logger.error(f'未知的时间格式:{str_time}') + dt = datetime.strptime('1970-01-01 00:00:00', '%Y-%m-%d %H:%M:%S') + try: + # 将datetime对象转换为时间戳 + timestamp = int(dt.timestamp()) + except: + logger.error(f'未知的时间格式:{str_time}') + dt = datetime.strptime('1970-01-01 00:00:00', '%Y-%m-%d %H:%M:%S') + + if type_ == '1': + # 纯文本 + content = item.get('datadesc') + if item.get('refermsgitem'): + refermsg = item.get('refermsgitem', {}).get('referdesc', '') + content = f"{content}\n{refermsg}" + result.append( + TextMessage( + local_id=0, + server_id=0, + sort_seq=0, + timestamp=timestamp, + str_time=str_time, + type=MessageType.Text, + talker_id='', + is_sender=False, + sender_id='', + display_name=item.get('sourcename'), + avatar_src=item.get('sourceheadurl'), + status=0, + xml_content='', + content=content + ) + ) + elif type_ == '2': + """ + 合并转发的聊天记录 + """ + # 图片 & 表情包 + md5 = item.get('fullmd5', '') + msg = ImageMessage( + local_id=0, + server_id=0, + sort_seq=0, + timestamp=timestamp, + str_time=str_time, + type=MessageType.Image, + talker_id='', + is_sender=False, + sender_id='', + display_name=item.get('sourcename'), + avatar_src=item.get('sourceheadurl'), + status=0, + xml_content='', + md5=md5, + path='', + thumb_path='', + file_size=0, + file_name='', + file_type='png' + ) + result.append( + msg + ) + elif type_ == '37': + """ + 合并转发的聊天记录 + """ + #表情包 + md5 = item.get('fullmd5', '') + msg = EmojiMessage( + local_id=0, + server_id=0, + sort_seq=0, + timestamp=timestamp, + str_time=str_time, + type=MessageType.Emoji, + talker_id='', + is_sender=False, + sender_id='', + display_name=item.get('sourcename'), + avatar_src=item.get('sourceheadurl'), + status=0, + xml_content='', + md5=md5, + path='', + thumb_path='', + file_size=0, + file_name='', + file_type='png', + url='', + thumb_url='', + description='' + ) + emoji_item = item.get('emojiitem', {}) + msg.url = emoji_item.get('cdnurlstring', '') + msg.thumb_url = emoji_item.get('cdnurlstring', '') + result.append( + msg + ) + elif type_ == '3': + # 语音 + result.append( + TextMessage( + local_id=0, + server_id=0, + sort_seq=0, + timestamp=timestamp, + str_time=str_time, + type=MessageType.Audio, + talker_id='', + is_sender=False, + sender_id='', + display_name=item.get('sourcename'), + avatar_src=item.get('sourceheadurl'), + status=0, + xml_content='', + content='【转发语音不可播放】' + ) + ) + elif type_ == '4': + # 视频 + md5 = item.get('fullmd5', '') + path = item.get('datasourcepath', '') + result.append( + VideoMessage( + local_id=0, + server_id=0, + sort_seq=0, + timestamp=timestamp, + str_time=str_time, + type=MessageType.Video, + talker_id='', + is_sender=False, + sender_id='', + display_name=item.get('sourcename'), + avatar_src=item.get('sourceheadurl'), + status=0, + xml_content='', + md5=md5, + path=path, + file_size=0, + file_name='', + file_type='mp4', + thumb_path='', + duration=0, + raw_md5=md5 + ) + ) + elif type_ == '5': + # 链接 + web_item = item.get('weburlitem', {}) + result.append( + LinkMessage( + local_id=0, + server_id=0, + sort_seq=0, + timestamp=timestamp, + str_time=str_time, + type=MessageType.LinkMessage, + talker_id='', + is_sender=False, + sender_id='', + display_name=item.get('sourcename'), + avatar_src=item.get('sourceheadurl'), + status=0, + xml_content='', + href=web_item.get('url', ''), + title=web_item.get('title', ''), + description=web_item.get('desc', ''), + cover_path='', + cover_url='', + app_name=web_item.get('appmsgshareitem', {}).get('srcdisplayname'), + app_icon='', + app_id='' + ) + ) + elif type_ == '6': + # 位置分享 + locitem = item.get('locitem', {}) + label = locitem.get('label', '') + poiname = locitem.get('poiname', '') + try: + x = float(locitem.get('lng', '0')) + y = float(locitem.get('lat', '0')) + scale = float(locitem.get('scale', '0')) + except: + x, y, scale = 0, 0, 0 + result.append( + PositionMessage( + local_id=0, + server_id=0, + sort_seq=0, + timestamp=timestamp, + str_time=str_time, + type=MessageType.Position, + talker_id='', + is_sender=False, + sender_id='', + display_name=item.get('sourcename'), + avatar_src=item.get('sourceheadurl'), + status=0, + xml_content='', + x=x, + y=y, + label=label, + poiname=poiname, + scale=scale + ) + ) + + elif type_ == '8': + # 文件 + md5 = item.get('fullmd5', '') + datasize = item.get('datasize') + if datasize: + datasize = int(datasize) + else: + datasize = 0 + result.append( + FileMessage( + local_id=0, + server_id=0, + sort_seq=0, + timestamp=timestamp, + str_time=str_time, + type=MessageType.File, + talker_id='', + is_sender=False, + sender_id='', + display_name=item.get('sourcename'), + avatar_src=item.get('sourceheadurl'), + status=0, + xml_content='', + path='', + md5=md5, + file_type=item.get('datafmt', ''), + file_name=item.get('datatitle', ''), + file_size=datasize + ) + ) + elif type_ == '17': + # 嵌套的消息 + result.append( + MergedMessage( + local_id=0, + server_id=0, + sort_seq=0, + timestamp=timestamp, + str_time=str_time, + type=MessageType.MergedMessages, + talker_id='', + is_sender=False, + sender_id='', + display_name=item.get('sourcename'), + avatar_src=item.get('sourceheadurl'), + status=0, + xml_content='', + title=item.get('datatitle'), + description=item.get('datadesc'), + messages=parser_record_item(item.get('recordxml'), output_dir, wxid, + msg_time, level + 1), + level=level + ) + ) + return result + + +def parser_merged_messages(xml, output_dir, wxid, msg_time, level=0): + try: + try: + data_dic = xmltodict.parse(xml).get('msg', {}) + except: + new_xml1 = html.unescape(xml) + new_xml2 = new_xml1.replace('&', '&') + # xml = xml.replace(' ', ' ').replace('', '').replace('
', '\n').replace('\xa0',' ') # 搞不懂这帮人在干嘛,有些转义,有些不转义 + # html.unescape(xml) + data_dic = xmltodict.parse(new_xml2).get('msg', {}) + app_msg_dic = data_dic.get('appmsg', {}) + desc = app_msg_dic.get('des', '') + title = app_msg_dic.get('title', '') + recorditem = app_msg_dic.get('recorditem', '') + return { + 'title': title, # 标题 + 'desc': desc, # 描述 + 'messages': parser_record_item(recorditem, output_dir, wxid, msg_time, level), # List[dict] 消息内容 + } + except: + logger.error(xml) + logger.error(new_xml1) + logger.error(new_xml2) + logger.error(traceback.format_exc()) + # raise ValueError('合并转发的消息解析失败') + return { + 'title': '解析失败', # 标题 + 'desc': '合并转发的消息解析失败', # 描述 + 'messages': [] + } + + +def parser_wechat_video(xml_content): + result = { + 'appid': '', # 暂时不用 + 'title': '', # 标题 + 'sourcedisplayname': '', # 视频号名称 + 'weappiconurl': '', # 视频号logo + 'authIconUrl': '', # 视频号认证URL,昵称后缀 + 'cover': '', # 封面url + 'duration': 0 + } + xml_content = xml_content.strip() + try: + dic_data = xmltodict.parse(xml_content).get('msg', {}).get('appmsg', {}).get('finderFeed', {}) + sourcedisplayname = dic_data.get('nickname', '') + weappiconurl = dic_data.get('avatar', '') + authIconUrl = dic_data.get('authIconUrl', '') + title = dic_data.get('desc', '') + media_count = dic_data.get('mediaCount', '0') + if media_count > '1': + cover = dic_data.get('mediaList', {}).get('media', [])[0].get('thumbUrl', '') + duration = 0 + else: + cover = dic_data.get('mediaList', {}).get('media', {}).get('coverUrl', '') + duration = dic_data.get('mediaList', {}).get('media', {}).get('videoPlayDuration', 0) + result = { + 'title': title, + 'url': '', + 'sourcedisplayname': sourcedisplayname, + 'weappiconurl': weappiconurl, + 'cover': cover, + 'authIconUrl': authIconUrl, + 'duration': duration + } + except: + logger.error(traceback.format_exc()) + finally: + return result + + +def parser_position(xml_content): + result = { + 'x': '0', # 经度 + 'y': '0', # 维度 + 'label': '', # 详细标签 + 'poiname': '', # 位置点标记名 + 'scale': '0', # 缩放率 + } + try: + data = xmltodict.parse(xml_content) + if data and data.get('msg'): + data = data['msg'] + result['x'] = data['location']['@x'] + result['y'] = data['location']['@y'] + result['label'] = data['location'].get('@label') + result['poiname'] = data['location'].get('@poiname') + result['scale'] = data['location'].get('@scale') + except: + logger.error(f'位置分享解析错误\n{traceback.format_exc()} \n{xml_content}') + result.update( + { + 'type': 1, + 'text': '【位置分享解析错误】' + } + ) + finally: + return result + + +def parser_reply(xml_content): + """ + @param data: + @return: { + "text": '发生错误', 发送内容 + 'svrid': '', 引用消息id + 'refermsg_type': -1, 引用消息类型 + "refer_text": '引用错误', 引用内容 + } + """ + if not xml_content: + return { + # "type": msg_type, + "text": '发生错误', + 'svrid': '', + 'refermsg_type': -1, + "refer_text": '引用错误', + } + xml_content = xml_content.replace("", "").replace('', '') + try: + data = xmltodict.parse(xml_content).get('msg', {}).get('appmsg', {}) + refermsg_type = int(data.get('refermsg', {}).get('type', '1')) + title = data.get('title', '') + displayname = data.get('refermsg', {}).get('displayname', '') + svrid = data.get('refermsg', {}).get('svrid', 0) + return { + "text": title, + 'svrid': svrid, + 'refermsg_type': refermsg_type, + } + # if refermsg_type == 1: + # return { + # # "type": msg_type, + # "text": title, + # 'svrid': data.get('refermsg', {}).get('svrid', 0), + # 'refermsg_type': refermsg_type, + # "refer_text": f"{refermsg_displayname}:{refermsg_content}", + # } + # elif refermsg_type == 3: + # return { + # # "type": msg_type, + # "text": title, + # 'svrid': data.get('refermsg', {}).get('svrid', 0), + # 'refermsg_type': refermsg_type, + # "refer_text": f"{displayname}:【图片消息】", + # } + # elif refermsg_type == 34: + # return { + # # "type": msg_type, + # "text": title, + # 'svrid': data.get('refermsg', {}).get('svrid', 0), + # 'refermsg_type': refermsg_type, + # "refer_text": f"{displayname}:【语音消息】", + # } + # elif refermsg_type == 43: + # return { + # # "type": msg_type, + # "text": title, + # 'svrid': data.get('refermsg', {}).get('svrid', 0), + # 'refermsg_type': refermsg_type, + # "refer_text": f"{displayname}:【视频消息】", + # } + # elif refermsg_type == 47: + # return { + # # "type": msg_type, + # "text": title, + # 'svrid': data.get('refermsg', {}).get('svrid', 0), + # 'refermsg_type': refermsg_type, + # "refer_text": f"{displayname}:【表情包】", + # } + # elif refermsg_type == 49: + # content = data.get('refermsg', {}).get('content', '') + # content = xmltodict.parse(content).get('msg', {}).get('appmsg', {}) + # refermsg_content = content.get('title', '') + # return { + # # "type": msg_type, + # "text": title, + # 'svrid': data.get('refermsg', {}).get('svrid', 0), + # 'refermsg_type': refermsg_type, + # "refer_text": f"{displayname}:{refermsg_content}", + # "url": content.get('url', ''), + # } + # elif refermsg_type == 0: + # return { + # # "type": msg_type, + # "text": title, + # 'svrid': data.get('refermsg', {}).get('svrid', 0), + # 'refermsg_type': refermsg_type, + # "refer_text": data.get('refermsg', {}).get('ref_msg_text', ''), + # } + # elif refermsg_type == 66: + # return { + # # "type": msg_type, + # "text": title, + # 'svrid': data.get('refermsg', {}).get('svrid', 0), + # 'refermsg_type': refermsg_type, + # "refer_text": f"{displayname}:【名片分享】", + # } + # elif refermsg_type == 42: + # return { + # # "type": msg_type, + # "text": title, + # 'svrid': data.get('refermsg', {}).get('svrid', 0), + # 'refermsg_type': refermsg_type, + # "refer_text": f"{displayname}:【名片分享】", + # } + # elif refermsg_type == 48: + # position_dict = xmltodict.parse(data.get('refermsg', {}).get('content', '')).get('msg') + # return { + # # "type": msg_type, + # "text": title, + # 'svrid': data.get('refermsg', {}).get('svrid', 0), + # 'refermsg_type': refermsg_type, + # "refer_text": f"{displayname}:{position_dict['location'].get('@poiname')}", + # } + # else: + # logger.info(f'发现未知的引用消息\n{data}') + # return { + # # "type": msg_type, + # "text": title, + # 'svrid': data.get('refermsg', {}).get('svrid', 0), + # 'refermsg_type': refermsg_type, + # "refer_text": f"{displayname}:【其他消息】", + # } + except: + logger.error(f'{xml_content}\n\n引用消息解析错误\n{traceback.format_exc()}') + return { + # "type": msg_type, + "text": '发生错误', + 'svrid': '', + 'refermsg_type': -1, + "refer_text": '引用错误', + } + + +def parser_transfer(xml_content): + result = { + 'pay_subtype': 0, + 'pay_memo': '', + 'fee_desc': '', + 'receiver_username': '' + } + try: + data = xmltodict.parse(xml_content).get('msg', {}).get('appmsg', {}) + result = { + 'pay_subtype': int(data.get('wcpayinfo', {}).get('paysubtype', '-1')), + 'pay_memo': data.get('wcpayinfo', {}).get('pay_memo', ''), + 'fee_desc': data.get('wcpayinfo', {}).get('feedesc', ''), + 'receiver_username': data.get('wcpayinfo', {}).get('receiver_username', ''), + } + except: + logger.error(f'转账解析错误\n{traceback.format_exc()}') + result.update( + { + 'type': 1, + 'text': '【位置分享解析错误】' + } + ) + finally: + return result + + +def parser_red_envelop(xml_content): + result = { + 'icon_url': '', + 'title': '', + 'inner_type': 0 + } + try: + data = xmltodict.parse(xml_content).get('msg', {}).get('appmsg', {}) + result = { + 'icon_url': data.get('wcpayinfo', {}).get('iconurl', ''), + 'title': data.get('wcpayinfo', {}).get('receivertitle', ''), + 'inner_type': int(data.get('wcpayinfo', {}).get('innertype', '0')), + } + except: + logger.error(f'红包解析错误\n{traceback.format_exc()}') + result.update( + { + 'type': 1, + 'text': '【位置分享解析错误】' + } + ) + finally: + return result + + +def parser_file(xml_content): + result = { + 'file_name': '', + 'file_size': 0, + 'md5': '', + 'file_type': '', + 'app_name': '' + } + try: + data0 = xmltodict.parse(xml_content).get('msg', {}) + data = data0.get('appmsg', {}) + totallen = data.get('appattach', {}).get('totallen') + if isinstance(totallen, list): + totallen = totallen[0] + if not totallen: + totallen = '0' + result = { + 'file_name': data.get('title', ''), + 'file_size': int(totallen), + 'md5': data.get('md5', ''), + 'file_type': data.get('appattach', {}).get('fileext', ''), + 'app_name': data.get('appinfo', {}).get('appname', ''), + } + except: + logger.error(f'文件解析错误\n{traceback.format_exc()}\n{xml_content}') + finally: + return result + + +def parser_favorite_note(xml_content): + result = { + 'title': '', + 'desc': '', + 'recorditem': '', + } + try: + data = xmltodict.parse(xml_content).get('msg', {}).get('appmsg', {}) + recorditem = data.get('recorditem', '') + xml_string = recorditem + if isinstance(xml_string, dict): + recorditem_dic = xml_string + else: + recorditem_dic = xmltodict.parse(xml_string) + result = { + 'title': data.get('title', ''), + 'desc': data.get('des', ''), + 'recorditem': recorditem_dic, + } + except: + logger.error(f'笔记解析错误\n{traceback.format_exc()}') + finally: + return result + + +def parser_pat(xml_content): + result = { + 'title': '', + 'from_username': '', + 'patted_username': '', + 'chat_username': '', + 'template': '' + } + try: + data = xmltodict.parse(xml_content).get('msg', {}).get('appmsg', {}) + patinfo = data.get('patinfo', {}) + result = { + 'title': data.get('title', ''), + 'from_username': patinfo.get('fromusername', ''), + 'patted_username': patinfo.get('pattedusername', ''), + 'chat_username': patinfo.get('chatusername', ''), + 'template': patinfo.get('template', ''), + } + except: + logger.error(f'拍一拍解析错误\n{traceback.format_exc()}\n{xml_content}') + finally: + return result + + +if __name__ == '__main__': + pass + + +def wx_sport(xml): + dic_data = {} + more = '' + try: + dic_data = xmltodict.parse(xml).get('msg', {}).get('appmsg', {}) + hardwareinfo = dic_data.get('hardwareinfo', {}) + rankinfo = hardwareinfo.get('messagenodeinfo', {}).get('rankinfo', {}) + rank = rankinfo.get('rank', {}).get('rankdisplay', '') + score = rankinfo.get('score', {}).get('scoredisplay', '') + rankinfolist = hardwareinfo.get('rankview', {}).get('rankinfolist', {}).get('rankinfo', []) + rank_list = [] + for rank_info in rankinfolist: + username = rank_info.get('username', '') + rank1 = rank_info.get('rank', {}).get('rankdisplay', '') + score1 = rank_info.get('score', {}).get('scoredisplay', '') + rank_list.append( + { + 'rank': rank1, + 'score': score1, + 'username': username + } + ) + return { + 'rank': rank, + 'score': score, + 'rank_list': rank_list, + 'data': f'{dic_data}' + } + except: + logger.error(traceback.format_exc()) + logger.error(dic_data) + return [] + + +def wx_EMS_data(bytesExtra, compress_content_): + dic_data = {} + send_city = '' + send_name = '' + express_id = '' + send_time = '' + send_address = '' + courier = '' + courier_phone = '' + expect_handle = '' + sign_time = '' + sign_result = '' + remark = '' + update_time = '' + + try: + if isinstance(compress_content_, bytes): + xml = decompress_CompressContent(compress_content_) + else: + xml = compress_content_ + dic_data = xmltodict.parse(xml).get('msg', {}).get('appmsg', {}) + + mmreader = dic_data.get('mmreader', {}) + template_header = mmreader.get('template_header', {}) + template_detail = mmreader.get('template_detail', {}) + if not template_header or not template_detail: + return {} + title = template_header.get('title', '') + digest = template_header.get('first_data', '') + display_name = template_header.get('display_name', '') + if not title: + title = dic_data.get('title', '') + if not display_name: + display_name = dic_data.get('title') + line_content = template_detail.get('line_content', {}) + lines = line_content.get('lines', {}).get('line') + + if isinstance(lines, List): + for line in lines: + key = line.get('key').get('word') + value = line.get('value').get('word') + if key.startswith('寄件城市'): + send_city += value + elif key.startswith('寄件人'): + send_name += value + elif key.startswith('快递单号') or key == '运单号': + express_id += value + elif key.startswith('寄件时间'): + send_time += value + elif key.startswith('派送地址'): + send_address += value + elif key.startswith('快递员'): + courier += value + elif key.startswith('快递员电话'): + courier_phone += value + elif key.startswith('预计派送处理'): + expect_handle += value + elif key.startswith('签收时间'): + sign_time += value + elif key.startswith('签收结果'): + sign_result += value + elif key == '备注:': + remark += value + elif key == '更新时间:': + update_time += value + else: + return {} + return { + 'title': title, + 'digest': digest, + 'display_name': display_name, + 'send_city': send_city, + 'send_name': send_name, + 'express_id': express_id, + 'send_time': send_time, + 'send_address': send_address, + 'courier': courier, + 'courier_phone': courier_phone, + 'expect_handle': expect_handle, + 'sign_time': sign_time, + 'sign_result': sign_result, + 'remark': remark, + 'update_time': update_time, + 'data': f'{dic_data}', + } + except: + logger.error(traceback.format_exc()) + logger.error(dic_data) + return {} + + +def wx_pdd_data(bytesExtra, compress_content_): + title = '' + display_name = '' + dic_data = {} + product = '' + order_id = '' + express = '' + express_id = '' + sign_time = '' + product_num = '' + pdd_member = '' + order_status = '' + refund_money = '' + refund_status = '' + audit_explain = '' + problem_type = '' + submit_time = '' + handle_result = '' + phone_number = '' + recharge_money = '' + refund_method = '' + user_name = '' + order_money = '' + + try: + if isinstance(compress_content_, bytes): + xml = decompress_CompressContent(compress_content_) + else: + xml = compress_content_ + dic_data = xmltodict.parse(xml).get('msg', {}).get('appmsg', {}) + + mmreader = dic_data.get('mmreader', {}) + template_header = mmreader.get('template_header', {}) + template_detail = mmreader.get('template_detail', {}) + if not template_header or not template_detail: + return {} + title = template_header.get('title', '') + display_name = template_header.get('display_name', '') + if not title: + title = dic_data.get('title', '') + if not display_name: + display_name = dic_data.get('title') + line_content = template_detail.get('line_content', {}) + lines = line_content.get('lines', {}).get('line') + if isinstance(lines, List): + for line in lines: + key = line.get('key').get('word') + value = line.get('value').get('word') + if key == '商品名称:' or key == '商品信息:' or key == '商品:' or key == '商品详情:' or key.startswith( + '商品名'): + product += value + elif key == '订单编号:' or key == '订单号:': + order_id += value + elif key == '物流服务:' or key == '快递公司:': + express += value + elif key == '快递单号:': + express_id += value + elif key == '签收时间:': + sign_time += value + elif key == '商品数量:': + product_num += value + elif key == '拼单成员:': + pdd_member += value + elif key == '订单状态:': + order_status += value + elif key == '退款金额:': + refund_money += value + elif key == '退款状态:': + refund_status += value + elif key == '审核说明:': + audit_explain += value + elif key == '问题类型:': + problem_type += value + elif key == '提交时间:': + submit_time += value + elif key == '处理结果:': + handle_result += value + elif key == '充值号码:': + phone_number += value + elif key == '充值金额:': + recharge_money += value + elif key == '退款方式:': + refund_method += value + elif key == '用户名:': + user_name += value + elif key == '订单金额:': + order_money += value + except: + logger.error(traceback.format_exc()) + logger.error(dic_data) + finally: + return { + 'title': title, + 'display_name': display_name, + 'product': product, + 'order_id': order_id, + 'express': express, + 'express_id': express_id, + 'sign_time': sign_time, + 'product_num': product_num, + 'pdd_member': pdd_member, + 'order_status': order_status, + 'refund_money': refund_money, + 'refund_status': refund_status, + 'audit_explain': audit_explain, + 'problem_type': problem_type, + 'submit_time': submit_time, + 'handle_result': handle_result, + 'phone_number': phone_number, + 'recharge_money': recharge_money, + 'refund_method': refund_method, + 'user_name': user_name, + 'order_money': order_money, + 'data': f'{dic_data}', + } + + +def wx_collection_data(xml): + dic_data = {} + summary = '' + more = '' + try: + dic_data = xmltodict.parse(xml).get('msg', {}).get('appmsg', {}) + # logger.error(dic_data) + mmreader = dic_data.get('mmreader', {}) + template_header = mmreader.get('template_header', {}) + template_detail = mmreader.get('template_detail', {}) + title = template_header.get('title', '') + display_name = template_header.get('display_name', '') + if not title: + title = dic_data.get('title', '') + if not display_name: + display_name = dic_data.get('title') + template_id = dic_data.get('template_id', '') + line_content = template_detail.get('line_content', {}) + money = line_content.get('topline', {}).get('value', {}).get('word', '').strip('¥') + lines = line_content.get('lines', {}).get('line') + if isinstance(lines, List): + for line in lines: + key = line.get('key').get('word') + value = line.get('value').get('word') + if key == '汇总': + summary += value + elif key == '备注': + more += value + + return { + 'title': title, + 'display_name': display_name, + 'template_id': template_id, + 'money': money, + 'summary': summary, + 'data': f'{dic_data}', + 'more': more + } + + except: + logger.error(traceback.format_exc()) + logger.error(dic_data) + return {} + + +def wx_pay_data(xml): + dic_data = {} + more = '' + try: + dic_data = xmltodict.parse(xml).get('msg', {}).get('appmsg', {}) + # logger.error(dic_data) + mmreader = dic_data.get('mmreader', {}) + template_header = mmreader.get('template_header', {}) + template_detail = mmreader.get('template_detail', {}) + title = template_header.get('title', '') + display_name = template_header.get('display_name', '') + if not title: + title = dic_data.get('title', '') + if not display_name: + display_name = dic_data.get('title') + template_id = dic_data.get('template_id', '') + line_content = template_detail.get('line_content', {}) + money = line_content.get('topline', {}).get('value', {}).get('word', '').strip('¥') + lines = line_content.get('lines', {}).get('line') + payment_type = '' + acquiring_institution = '' + if isinstance(lines, List): + for line in lines: + key = line.get('key').get('word') + value = line.get('value').get('word') + if key == '付款方式' or key == '支付方式' or key == '收款账户' or key == '退款方式': + payment_type = value + elif key == '收单机构' or key == '收款方': + acquiring_institution = value + elif key == '退款方式': + payment_type = value + elif key == '退款原因': + acquiring_institution = value + elif key == '备注' or key == '退款原因': + more += value + else: + payment_type = line_content.get('topline', {}).get('key', {}).get('word', '') + acquiring_institution = '个体商户' + return { + 'title': title, + 'display_name': display_name, + 'template_id': template_id, + 'money': money, + 'payment_type': payment_type, + 'acquiring_institution': acquiring_institution, + 'data': f'{dic_data}', + 'more': more + } + except: + logger.error(traceback.format_exc()) + logger.error(dic_data) + return {} diff --git a/app/ui/tool/__init__.py b/wxManager/parser/util/__init__.py similarity index 100% rename from app/ui/tool/__init__.py rename to wxManager/parser/util/__init__.py diff --git a/app/util/region_conversion.py b/wxManager/parser/util/common.py similarity index 89% rename from app/util/region_conversion.py rename to wxManager/parser/util/common.py index afbad63..2a6d489 100644 --- a/app/util/region_conversion.py +++ b/wxManager/parser/util/common.py @@ -1,47 +1,69 @@ -# 中国省份拼音到中文的映射字典 -province_mapping = { - 'Anhui': '安徽', - 'Beijing': '北京', - 'Chongqing': '重庆', - 'Fujian': '福建', - 'Gansu': '甘肃', - 'Guangdong': '广东', - 'Guangxi': '广西', - 'Guizhou': '贵州', - 'Hainan': '海南', - 'Hebei': '河北', - 'Heilongjiang': '黑龙江', - 'Henan': '河南', - 'Hong Kong': '香港', - 'Hubei': '湖北', - 'Hunan': '湖南', - 'Inner Mongolia': '内蒙古', - 'Jiangsu': '江苏', - 'Jiangxi': '江西', - 'Jilin': '吉林', - 'Liaoning': '辽宁', - 'Macau': '澳门', - 'Ningxia': '宁夏', - 'Qinghai': '青海', - 'Shaanxi': '陕西', - 'Shandong': '山东', - 'Shanghai': '上海', - 'Shanxi': '山西', - 'Sichuan': '四川', - 'Taiwan': '台湾', - 'Tianjin': '天津', - 'Tibet': '西藏', - 'Xinjiang': '新疆', - 'Yunnan': '云南', - 'Zhejiang': '浙江', - 'Taipei': '台北', -} +#!/usr/bin/env python +# -*- coding: utf-8 -*- -country_mapping = { - 'CN': '中国大陆', - 'TW': '中国台湾', - 'GB': "英国", -} +""" +@Time : 2025/1/8 0:58 +@Author : SiYuan +@Email : 863909694@qq.com +@File : wxManager-common.py +@Description : +""" + +import re + + +def remove_privacy_info(text): + # 正则表达式模式 + patterns = { + 'phone': r'\b(\+?86[-\s]?)?1[3-9]\d{9}\b', # 手机号 + 'email': r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', # 邮箱 + 'id_card': r'\b\d{15}|\d{18}|\d{17}X\b', # 身份证号 + 'password': r'\b(?:password|pwd|pass|psw)[\s=:]*\S+\b', # 密码 + 'account': r'\b(?:account|username|user|acct)[\s=:]*\S+\b' # 账号 + } + + for key, pattern in patterns.items(): + text = re.sub(pattern, f'[{key} xxx]', text) + + return text + + +def remove_illegal_characters(text): + # 去除 ASCII 控制字符(除了合法的制表符、换行符和回车符) + illegal_chars = re.compile(r'[\x00-\x08\x0B\x0C\x0E-\x1F]') + return illegal_chars.sub('', text) + + +def conversion_region_to_chinese(region: tuple): + area = '' + if not region: + return area + if region[2]: + if region[2] in city_mapping: + area = city_mapping[region[2]] + else: + area = region[2] + if region[1]: + if region[1] in province_mapping: + area = f'{province_mapping[region[1]]} {area}' + else: + area = f'{region[1]} {area}' + if region[0]: + if region[0] in country_mapping: + area = f'{country_mapping[region[0]]} {area}' + else: + area = f'{region[0]} {area}' + return area + + +def conversion_province_to_chinese(province): + area = '' + if province in province_mapping: + area = f'{province_mapping[province]}' + return area + + +# 中国省份拼音到中文的映射字典 city_mapping = { "Beijing": "北京", "Tianjin": "天津", @@ -303,7 +325,7 @@ city_mapping = { "Hanzhoung": "汉中", "Ankang": "安康", "Shangluo": "商洛", - "Yulin": "榆林", + # "Yulin": "榆林", "Lanzhou": "兰州", "Tianshui": "天水", "Pingliang": "平凉", @@ -326,36 +348,49 @@ city_mapping = { "Pingxiang": "萍乡", "Jingdezhen": "景德镇", "Xinyu": "新余", - "Yichun": "宜春", - "Fuzhou": "抚州", + # "Yichun": "宜春", + # "Fuzhou": "抚州", "Tin Shui": "天水" } - - -def conversion_province_to_chinese(province): - area = '' - if province in province_mapping: - area = f'{province_mapping[province]}' - return area - - -def conversion_region_to_chinese(region: tuple): - area = '' - if not region: - return area - if region[2]: - if region[2] in city_mapping: - area = city_mapping[region[2]] - else: - area = region[2] - if region[1]: - if region[1] in province_mapping: - area = f'{province_mapping[region[1]]} {area}' - else: - area = f'{region[1]} {area}' - if region[0]: - if region[0] in country_mapping: - area = f'{country_mapping[region[0]]} {area}' - else: - area = f'{region[0]} {area}' - return area +country_mapping = { + 'CN': '中国大陆', + 'TW': '中国台湾', + 'GB': "英国", +} +province_mapping = { + 'Anhui': '安徽', + 'Beijing': '北京', + 'Chongqing': '重庆', + 'Fujian': '福建', + 'Gansu': '甘肃', + 'Guangdong': '广东', + 'Guangxi': '广西', + 'Guizhou': '贵州', + 'Hainan': '海南', + 'Hebei': '河北', + 'Heilongjiang': '黑龙江', + 'Henan': '河南', + 'Hong Kong': '香港', + 'Hubei': '湖北', + 'Hunan': '湖南', + 'Inner Mongolia': '内蒙古', + 'Jiangsu': '江苏', + 'Jiangxi': '江西', + 'Jilin': '吉林', + 'Liaoning': '辽宁', + 'Macau': '澳门', + 'Ningxia': '宁夏', + 'Qinghai': '青海', + 'Shaanxi': '陕西', + 'Shandong': '山东', + 'Shanghai': '上海', + 'Shanxi': '山西', + 'Sichuan': '四川', + 'Taiwan': '台湾', + 'Tianjin': '天津', + 'Tibet': '西藏', + 'Xinjiang': '新疆', + 'Yunnan': '云南', + 'Zhejiang': '浙江', + 'Taipei': '台北', +} diff --git a/app/analysis/__init__.py b/wxManager/parser/util/protocbuf/__init__.py similarity index 100% rename from app/analysis/__init__.py rename to wxManager/parser/util/protocbuf/__init__.py diff --git a/wxManager/parser/util/protocbuf/contact.proto b/wxManager/parser/util/protocbuf/contact.proto new file mode 100644 index 0000000..19a4956 --- /dev/null +++ b/wxManager/parser/util/protocbuf/contact.proto @@ -0,0 +1,89 @@ +syntax = "proto3"; + +package example; + +// 顶级消息定义 +message ContactInfo { + // varint 类型字段,根据数值范围选用 uint32 或 uint64 + uint32 gender = 2; // 性别:1 男 2:女 0:未知 + uint32 field3 = 3; + string signature = 4; // 自助者天助!!! + string country = 5; // CN + string province = 6; // Shaanxi + string city = 7; // Xi'an + uint32 field8 = 8; + string field9 = 9; + uint32 field10 = 10; // 4294967295 + uint32 field11 = 11; + uint32 field12 = 12; + + // 修改后的嵌套消息,对应 JSON 中 field 14 的数据结构 + MessageField14 phone_info = 14; + + string field15 = 15; + uint32 field16 = 16; + uint32 field17 = 17; + uint32 field18 = 18; + uint32 field19 = 19; + string field20 = 20; + string field21 = 21; + uint32 field22 = 22; + uint32 field23 = 23; + uint32 field24 = 24; + string field25 = 25; + string field26 = 26; + + // 嵌套消息,朋友圈背景 + MessageField27 moments_info = 27; + + string field28 = 28; + string field29 = 29; + string label_list = 30; + string field31 = 31; + string field32 = 32; + + // 嵌套消息,对应 JSON 中 field 33 的 length_delimited 数据 + MessageField33 field33 = 33; + + string field34 = 34; + string field35 = 35; + MessageField36 field36 = 36; + uint32 field37 = 37; + uint32 field38 = 38; // 4294967295 +} + +// 定义 field14 对应的嵌套消息 +// 修改后的嵌套消息,用于 field 14 +message MessageField14 { + uint32 field1 = 1; // varint 类型字段,存储数字 + repeated MessageField14_Result2 field2 = 2; // 这是一个 length_delimited 类型的字段,包含多个结果 +} + + +message MessageField14_Result2 { + string phone_numer = 1; // string 类型字段,存储电话号码 +} + +// 定义 field27 对应的嵌套消息 + +message MessageField27 { + uint32 field1 = 1; + string background_url = 2; // 图片 URL + uint64 field3 = 3; // 14588734692813845087(大数,用 uint64) + uint32 field4 = 4; // 6785 + uint32 field5 = 5; // 4320 +} + +// 定义 field33 对应的嵌套消息 + +message MessageField33 { + string field1 = 1; +} + +message MessageField36 { + MessageField36_Result results = 1; +} + +message MessageField36_Result { + string field1 = 1; +} \ No newline at end of file diff --git a/wxManager/parser/util/protocbuf/contact_pb2.py b/wxManager/parser/util/protocbuf/contact_pb2.py new file mode 100644 index 0000000..6d38dac --- /dev/null +++ b/wxManager/parser/util/protocbuf/contact_pb2.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: contact.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rcontact.proto\x12\x07\x65xample\"\xd7\x05\n\x0b\x43ontactInfo\x12\x0e\n\x06gender\x18\x02 \x01(\r\x12\x0e\n\x06\x66ield3\x18\x03 \x01(\r\x12\x11\n\tsignature\x18\x04 \x01(\t\x12\x0f\n\x07\x63ountry\x18\x05 \x01(\t\x12\x10\n\x08province\x18\x06 \x01(\t\x12\x0c\n\x04\x63ity\x18\x07 \x01(\t\x12\x0e\n\x06\x66ield8\x18\x08 \x01(\r\x12\x0e\n\x06\x66ield9\x18\t \x01(\t\x12\x0f\n\x07\x66ield10\x18\n \x01(\r\x12\x0f\n\x07\x66ield11\x18\x0b \x01(\r\x12\x0f\n\x07\x66ield12\x18\x0c \x01(\r\x12+\n\nphone_info\x18\x0e \x01(\x0b\x32\x17.example.MessageField14\x12\x0f\n\x07\x66ield15\x18\x0f \x01(\t\x12\x0f\n\x07\x66ield16\x18\x10 \x01(\r\x12\x0f\n\x07\x66ield17\x18\x11 \x01(\r\x12\x0f\n\x07\x66ield18\x18\x12 \x01(\r\x12\x0f\n\x07\x66ield19\x18\x13 \x01(\r\x12\x0f\n\x07\x66ield20\x18\x14 \x01(\t\x12\x0f\n\x07\x66ield21\x18\x15 \x01(\t\x12\x0f\n\x07\x66ield22\x18\x16 \x01(\r\x12\x0f\n\x07\x66ield23\x18\x17 \x01(\r\x12\x0f\n\x07\x66ield24\x18\x18 \x01(\r\x12\x0f\n\x07\x66ield25\x18\x19 \x01(\t\x12\x0f\n\x07\x66ield26\x18\x1a \x01(\t\x12(\n\x07\x66ield27\x18\x1b \x01(\x0b\x32\x17.example.MessageField27\x12\x0f\n\x07\x66ield28\x18\x1c \x01(\t\x12\x0f\n\x07\x66ield29\x18\x1d \x01(\t\x12\x12\n\nlabel_list\x18\x1e \x01(\t\x12\x0f\n\x07\x66ield31\x18\x1f \x01(\t\x12\x0f\n\x07\x66ield32\x18 \x01(\t\x12(\n\x07\x66ield33\x18! \x01(\x0b\x32\x17.example.MessageField33\x12\x0f\n\x07\x66ield34\x18\" \x01(\t\x12\x0f\n\x07\x66ield35\x18# \x01(\t\x12(\n\x07\x66ield36\x18$ \x01(\x0b\x32\x17.example.MessageField36\x12\x0f\n\x07\x66ield37\x18% \x01(\r\x12\x0f\n\x07\x66ield38\x18& \x01(\r\"Q\n\x0eMessageField14\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\r\x12/\n\x06\x66ield2\x18\x02 \x03(\x0b\x32\x1f.example.MessageField14_Result2\"-\n\x16MessageField14_Result2\x12\x13\n\x0bphone_numer\x18\x01 \x01(\t\"h\n\x0eMessageField27\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\r\x12\x16\n\x0e\x62\x61\x63kground_url\x18\x02 \x01(\t\x12\x0e\n\x06\x66ield3\x18\x03 \x01(\x04\x12\x0e\n\x06\x66ield4\x18\x04 \x01(\r\x12\x0e\n\x06\x66ield5\x18\x05 \x01(\r\" \n\x0eMessageField33\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\t\"A\n\x0eMessageField36\x12/\n\x07results\x18\x01 \x01(\x0b\x32\x1e.example.MessageField36_Result\"\'\n\x15MessageField36_Result\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\tb\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'contact_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + _CONTACTINFO._serialized_start=27 + _CONTACTINFO._serialized_end=754 + _MESSAGEFIELD14._serialized_start=756 + _MESSAGEFIELD14._serialized_end=837 + _MESSAGEFIELD14_RESULT2._serialized_start=839 + _MESSAGEFIELD14_RESULT2._serialized_end=884 + _MESSAGEFIELD27._serialized_start=886 + _MESSAGEFIELD27._serialized_end=990 + _MESSAGEFIELD33._serialized_start=992 + _MESSAGEFIELD33._serialized_end=1024 + _MESSAGEFIELD36._serialized_start=1026 + _MESSAGEFIELD36._serialized_end=1091 + _MESSAGEFIELD36_RESULT._serialized_start=1093 + _MESSAGEFIELD36_RESULT._serialized_end=1132 +# @@protoc_insertion_point(module_scope) diff --git a/wxManager/parser/util/protocbuf/emoji_desc.proto b/wxManager/parser/util/protocbuf/emoji_desc.proto new file mode 100644 index 0000000..21e7462 --- /dev/null +++ b/wxManager/parser/util/protocbuf/emoji_desc.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +package example; + +message EmojiDescData { + repeated EmojiDescItem descItem = 1; +} + +message EmojiDescItem { + string language = 1; + string desc = 2; +} \ No newline at end of file diff --git a/wxManager/parser/util/protocbuf/emoji_desc_pb2.py b/wxManager/parser/util/protocbuf/emoji_desc_pb2.py new file mode 100644 index 0000000..b4a1c9c --- /dev/null +++ b/wxManager/parser/util/protocbuf/emoji_desc_pb2.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: emoji_desc.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10\x65moji_desc.proto\x12\x07\x65xample\"9\n\rEmojiDescData\x12(\n\x08\x64\x65scItem\x18\x01 \x03(\x0b\x32\x16.example.EmojiDescItem\"/\n\rEmojiDescItem\x12\x10\n\x08language\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x65sc\x18\x02 \x01(\tb\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'emoji_desc_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + _EMOJIDESCDATA._serialized_start=29 + _EMOJIDESCDATA._serialized_end=86 + _EMOJIDESCITEM._serialized_start=88 + _EMOJIDESCITEM._serialized_end=135 +# @@protoc_insertion_point(module_scope) diff --git a/wxManager/parser/util/protocbuf/file_info.proto b/wxManager/parser/util/protocbuf/file_info.proto new file mode 100644 index 0000000..d783622 --- /dev/null +++ b/wxManager/parser/util/protocbuf/file_info.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; + +package example; + +message FileInfoData { + string dir3 = 1; + uint32 file_size = 2; +} diff --git a/wxManager/parser/util/protocbuf/file_info_pb2.py b/wxManager/parser/util/protocbuf/file_info_pb2.py new file mode 100644 index 0000000..f781f80 --- /dev/null +++ b/wxManager/parser/util/protocbuf/file_info_pb2.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: file_info.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0f\x66ile_info.proto\x12\x07\x65xample\"/\n\x0c\x46ileInfoData\x12\x0c\n\x04\x64ir3\x18\x01 \x01(\t\x12\x11\n\tfile_size\x18\x02 \x01(\rb\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'file_info_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + _FILEINFODATA._serialized_start=28 + _FILEINFODATA._serialized_end=75 +# @@protoc_insertion_point(module_scope) diff --git a/app/util/protocbuf/msg.proto b/wxManager/parser/util/protocbuf/msg.proto similarity index 100% rename from app/util/protocbuf/msg.proto rename to wxManager/parser/util/protocbuf/msg.proto diff --git a/app/util/protocbuf/msg_pb2.py b/wxManager/parser/util/protocbuf/msg_pb2.py similarity index 100% rename from app/util/protocbuf/msg_pb2.py rename to wxManager/parser/util/protocbuf/msg_pb2.py diff --git a/wxManager/parser/util/protocbuf/packed_info_data.proto b/wxManager/parser/util/protocbuf/packed_info_data.proto new file mode 100644 index 0000000..78671dd --- /dev/null +++ b/wxManager/parser/util/protocbuf/packed_info_data.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +package example; + +// 顶级消息定义 +message PackedInfoData { + // varint 类型字段,根据数值范围选用 uint32 或 uint64 + uint32 field1 = 1; + uint32 field2 = 2; + MessageField5 info = 5; +} + +// 定义 field14 对应的嵌套消息 +// 修改后的嵌套消息,用于 field 14 +message MessageField5 { + uint32 field1 = 1; + string audioTxt = 2; // 语音转文字结果 +} diff --git a/wxManager/parser/util/protocbuf/packed_info_data_img.proto b/wxManager/parser/util/protocbuf/packed_info_data_img.proto new file mode 100644 index 0000000..337dd20 --- /dev/null +++ b/wxManager/parser/util/protocbuf/packed_info_data_img.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; +// 2025年3月微信测试版修改了img命名方式才有了这个东西 +message PackedInfoDataImg { + int32 field1 = 1; + int32 field2 = 2; + string filename = 3; +} \ No newline at end of file diff --git a/wxManager/parser/util/protocbuf/packed_info_data_img_pb2.py b/wxManager/parser/util/protocbuf/packed_info_data_img_pb2.py new file mode 100644 index 0000000..dbab5ff --- /dev/null +++ b/wxManager/parser/util/protocbuf/packed_info_data_img_pb2.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: packed_info_data_img.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1apacked_info_data_img.proto\"E\n\x11PackedInfoDataImg\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\x05\x12\x0e\n\x06\x66ield2\x18\x02 \x01(\x05\x12\x10\n\x08\x66ilename\x18\x03 \x01(\tb\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'packed_info_data_img_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + _PACKEDINFODATAIMG._serialized_start=30 + _PACKEDINFODATAIMG._serialized_end=99 +# @@protoc_insertion_point(module_scope) diff --git a/wxManager/parser/util/protocbuf/packed_info_data_merged.proto b/wxManager/parser/util/protocbuf/packed_info_data_merged.proto new file mode 100644 index 0000000..506ec59 --- /dev/null +++ b/wxManager/parser/util/protocbuf/packed_info_data_merged.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; + +message PackedInfoData { + int32 field1 = 1; + int32 field2 = 2; + NestedMessage field7 = 7; + AnotherNestedMessage info = 9; +} + +message NestedMessage { + SubMessage1 field1 = 1; + SubMessage2 field2 = 2; + string field3 = 3; +} + +message SubMessage1 { + int32 field1 = 1; + string field2 = 2; +} + +message SubMessage2 { + string field1 = 1; + string field2 = 2; + string field3 = 3; +} + +message AnotherNestedMessage { + string dir = 1; +} diff --git a/wxManager/parser/util/protocbuf/packed_info_data_merged_pb2.py b/wxManager/parser/util/protocbuf/packed_info_data_merged_pb2.py new file mode 100644 index 0000000..fa43faa --- /dev/null +++ b/wxManager/parser/util/protocbuf/packed_info_data_merged_pb2.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: packed_info_data_merged.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dpacked_info_data_merged.proto\"u\n\x0ePackedInfoData\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\x05\x12\x0e\n\x06\x66ield2\x18\x02 \x01(\x05\x12\x1e\n\x06\x66ield7\x18\x07 \x01(\x0b\x32\x0e.NestedMessage\x12#\n\x04info\x18\t \x01(\x0b\x32\x15.AnotherNestedMessage\"[\n\rNestedMessage\x12\x1c\n\x06\x66ield1\x18\x01 \x01(\x0b\x32\x0c.SubMessage1\x12\x1c\n\x06\x66ield2\x18\x02 \x01(\x0b\x32\x0c.SubMessage2\x12\x0e\n\x06\x66ield3\x18\x03 \x01(\t\"-\n\x0bSubMessage1\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\x05\x12\x0e\n\x06\x66ield2\x18\x02 \x01(\t\"=\n\x0bSubMessage2\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\t\x12\x0e\n\x06\x66ield2\x18\x02 \x01(\t\x12\x0e\n\x06\x66ield3\x18\x03 \x01(\t\"#\n\x14\x41notherNestedMessage\x12\x0b\n\x03\x64ir\x18\x01 \x01(\tb\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'packed_info_data_merged_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + _PACKEDINFODATA._serialized_start=33 + _PACKEDINFODATA._serialized_end=150 + _NESTEDMESSAGE._serialized_start=152 + _NESTEDMESSAGE._serialized_end=243 + _SUBMESSAGE1._serialized_start=245 + _SUBMESSAGE1._serialized_end=290 + _SUBMESSAGE2._serialized_start=292 + _SUBMESSAGE2._serialized_end=353 + _ANOTHERNESTEDMESSAGE._serialized_start=355 + _ANOTHERNESTEDMESSAGE._serialized_end=390 +# @@protoc_insertion_point(module_scope) diff --git a/wxManager/parser/util/protocbuf/packed_info_data_pb2.py b/wxManager/parser/util/protocbuf/packed_info_data_pb2.py new file mode 100644 index 0000000..6874670 --- /dev/null +++ b/wxManager/parser/util/protocbuf/packed_info_data_pb2.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: packed_info_data.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16packed_info_data.proto\x12\x07\x65xample\"V\n\x0ePackedInfoData\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\r\x12\x0e\n\x06\x66ield2\x18\x02 \x01(\r\x12$\n\x04info\x18\x05 \x01(\x0b\x32\x16.example.MessageField5\"1\n\rMessageField5\x12\x0e\n\x06\x66ield1\x18\x01 \x01(\r\x12\x10\n\x08\x61udioTxt\x18\x02 \x01(\tb\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'packed_info_data_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + _PACKEDINFODATA._serialized_start=35 + _PACKEDINFODATA._serialized_end=121 + _MESSAGEFIELD5._serialized_start=123 + _MESSAGEFIELD5._serialized_end=172 +# @@protoc_insertion_point(module_scope) diff --git a/app/util/protocbuf/readme.md b/wxManager/parser/util/protocbuf/readme.md similarity index 100% rename from app/util/protocbuf/readme.md rename to wxManager/parser/util/protocbuf/readme.md diff --git a/app/util/protocbuf/roomdata.proto b/wxManager/parser/util/protocbuf/roomdata.proto similarity index 100% rename from app/util/protocbuf/roomdata.proto rename to wxManager/parser/util/protocbuf/roomdata.proto diff --git a/app/util/protocbuf/roomdata_pb2.py b/wxManager/parser/util/protocbuf/roomdata_pb2.py similarity index 100% rename from app/util/protocbuf/roomdata_pb2.py rename to wxManager/parser/util/protocbuf/roomdata_pb2.py diff --git a/wxManager/parser/wechat_v3.py b/wxManager/parser/wechat_v3.py new file mode 100644 index 0000000..b233ca0 --- /dev/null +++ b/wxManager/parser/wechat_v3.py @@ -0,0 +1,898 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/11 1:26 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-wechat_v4.py +@Description : +""" +import hashlib +import os +from abc import ABC, abstractmethod +import lz4.block +import xmltodict + +from wxManager.model.message import BusinessCardMessage, VoipMessage, MergedMessage, WeChatVideoMessage, \ + PositionMessage, TransferMessage, RedEnvelopeMessage, FavNoteMessage, PatMessage +from wxManager.parser.link_parser import parser_link, parser_applet, parser_business, parser_voip, \ + parser_merged_messages, parser_wechat_video, parser_position, parser_reply, parser_transfer, parser_red_envelop, \ + parser_file, parser_favorite_note, parser_pat, parser_music +from wxManager.parser.util.protocbuf.msg_pb2 import MessageBytesExtra +from wxManager.parser.wechat_v4 import LimitedDict +from .audio_parser import parser_audio +from .emoji_parser import parser_emoji +from .file_parser import parse_video +from wxManager.log import logger +from wxManager.model import Message, TextMessage, ImageMessage, VideoMessage, EmojiMessage, LinkMessage, FileMessage, \ + AudioMessage, QuoteMessage, MessageType +from wxManager.model import Me +from ..db_main import DataBaseInterface + +''' +local_id,server_id,local_type,sort_seq,sender_username, +create_time,StrTime,status,upload_status,server_seq,origin_source, +source,message_content,compress_content" +''' + + +def decompress(data): + """ + 解压缩Msg:CompressContent内容 + :param data: + :return: + """ + if data is None: + return "" + if isinstance(data, str): + return data + if not isinstance(data, bytes): + return "" + try: + dst = lz4.block.decompress(data, uncompressed_size=len(data) << 10) + decoded_string = dst.decode().replace("\x00", "") # Remove any null characters + except: + print( + "Decompression failed: potentially corrupt input or insufficient buffer size." + ) + return "" + return decoded_string + + +# 定义抽象工厂基类 +class MessageFactory(ABC): + @abstractmethod + def create(self, data, username: str, database_manager: DataBaseInterface): + """ + 创建一个Message实例 + @param data: 从数据库获得的元组数据 + @param username: 聊天对象的wxid + @param database_manager: 数据库管理接口 + @return: + """ + pass + + +# 单例基类 +class Singleton: + _instances = {} + contacts = {} + messages = LimitedDict(100) + + def __new__(cls, *args, **kwargs): + if cls not in cls._instances: + cls._instances[cls] = super().__new__(cls, *args, **kwargs) + return cls._instances[cls] + + @classmethod + def set_shared_data(cls, data): + cls._shared_data = data + + @classmethod + def get_shared_data(cls): + return cls._shared_data + + @classmethod + def set_contacts(cls, contacts): + cls.contacts.update(contacts) + + @classmethod + def get_contact(cls, wxid, database_manager: DataBaseInterface): + if wxid in cls.contacts: + return cls.contacts[wxid] + else: + contact = database_manager.get_contact_by_username(wxid) + cls.contacts[wxid] = contact + return contact + + def common_attribute(self, message, username, manager): + """ + + :param message: + :param username: + :param manager: + :return: wxid,is_sender,xml_content + """ + is_sender = message[4] + wxid = '' + if is_sender: + wxid = Me().wxid + else: + if username.endswith('@chatroom'): + msgbytes = MessageBytesExtra() + msgbytes.ParseFromString(message[10]) + for tmp in msgbytes.message2: + if tmp.field1 != 1: + continue + wxid = tmp.field2 + # todo 解析还是有问题,会出现这种带:的东西 + if ':' in wxid: # wxid_ewi8gfgpp0eu22:25319:1 + wxid = wxid.split(':')[0] + else: + wxid = username + if wxid not in self.contacts: + self.contacts[wxid] = manager.get_contact_by_username(wxid) + if username.endswith('@openim'): + xml_content = message[7] + else: + xml_content = decompress(message[11]) + xml_content = xml_content.replace('', '').replace(' ', ' ') if xml_content else '' + return is_sender, wxid, xml_content if xml_content else message[7] + + @classmethod + def get_message_by_server_id(cls, server_id, username, manager): + if server_id and isinstance(server_id, str): + server_id = int(server_id) + if server_id in cls.messages: + return cls.messages.get(server_id) + else: + msg = manager.get_message_by_server_id(username, server_id) # todo 非常耗时 + if msg: + cls.add_message(msg) + else: + msg = TextMessage( + local_id=0, + server_id=0, + sort_seq=0, + timestamp=0, + str_time='', + type=MessageType.Text, + talker_id=username, + is_sender=False, + sender_id=username, + display_name=username, + avatar_src='', + status=0, + xml_content='', + content='无效的消息' + ) + return msg + + @classmethod + def reset_messages(cls): + cls.messages = {} + + @classmethod + def add_message(cls, message: Message): + if message: + cls.messages[message.server_id] = message + + +class UnknownMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, xml_content = self.common_attribute(message, username, manager) + return Message( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.Unknown, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[6], + xml_content=xml_content + ) + + +class TextMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, xml_content = self.common_attribute(message, username, manager) + sub_type = parser_sub_type(message[7]) if username.endswith('@openim') else message[3] + if sub_type == 1: + content = xmltodict.parse(xml_content).get('msg', {}).get('appmsg', {}).get('title', '') + else: + content = message[7] + msg = TextMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.Text, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[6], + xml_content='', + content=content + ) + self.add_message(msg) + return msg + + +class ImageMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, xml_content = self.common_attribute(message, username, manager) + str_content = message[7] + BytesExtra = message[10] + msg = ImageMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.Image, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[6], + xml_content=str_content, + md5='', + path='', + thumb_path='', + file_size=0, + file_name='', + file_type='png' + ) + + path = manager.get_image(content=str_content, bytesExtra=BytesExtra, up_dir='', + thumb=False, talker_username=username) + msg.path = path + msg.thumb_path = manager.get_image(content=str_content, bytesExtra=BytesExtra, up_dir='', + thumb=True, talker_username=username) + self.add_message(msg) + return msg + + +class AudioMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, xml_content = self.common_attribute(message, username, manager) + msg = AudioMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.Audio, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[6], + xml_content=xml_content, + md5='', + path='', + file_size=0, + file_name='', + file_type='mp3', + audio_text='', + duration=0 + ) + msg.set_file_name() + audio_dic = parser_audio(msg.xml_content) + msg.duration = audio_dic.get('audio_length', 0) + msg.audio_text = audio_dic.get('audio_text', '') + self.add_message(msg) + return msg + + +class VideoMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, xml_content = self.common_attribute(message, username, manager) + msg = VideoMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.Video, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[6], + xml_content=xml_content, + md5='', + path='', + file_size=0, + file_name='', + file_type='mp4', + thumb_path='', + duration=0, + raw_md5='' + ) + str_content = message[7] + BytesExtra = message[10] + video_dic = parse_video(xml_content) + msg.duration = video_dic.get('length', 0) + msg.file_size = video_dic.get('size', 0) + msg.md5 = video_dic.get('md5', '') + msg.raw_md5 = video_dic.get('rawmd5', '') + msg.path = manager.get_video(str_content, BytesExtra, md5=msg.md5, thumb=False) + msg.thumb_path = manager.get_video(str_content, BytesExtra, md5=msg.md5, thumb=True) + if not msg.path: + msg.path = manager.get_video(str_content, BytesExtra, thumb=False) + msg.thumb_path = manager.get_video(str_content, BytesExtra, thumb=True) + # logger.error(f'{msg.path} {msg.thumb_path}') + self.add_message(msg) + return msg + + +class EmojiMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, xml_content = self.common_attribute(message, username, manager) + msg = EmojiMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.Emoji, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[6], + xml_content=message[7], + md5='', + path='', + thumb_path='', + file_size=0, + file_name='', + file_type='png', + url='', + thumb_url='', + description='' + ) + emoji_info = parser_emoji(xml_content) + if not emoji_info.get('url'): + msg.url = manager.get_emoji_url(emoji_info.get('md5')) + else: + msg.url = emoji_info.get('url') + msg.md5 = emoji_info.get('md5', '') + msg.description = emoji_info.get('desc') + self.add_message(msg) + return msg + + +def parser_sub_type(xml_content): + """ + 解析sub_type(用于企业微信特殊消息) + @param xml_content: + @return: + """ + sub_type = 0 + try: + data = xmltodict.parse(xml_content) + if data and data.get('msg'): + data = data['msg']['appmsg'] + sub_type = int(data['type']) + except: + sub_type = 0 + return sub_type + + +# 工厂注册表 +class LinkMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + msg = LinkMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.LinkMessage, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + href='', + title='', + description='', + cover_path='', + cover_url='', + app_name='', + app_icon='', + app_id='' + ) + type_ = message[2] + sub_type = parser_sub_type(message[7]) if username.endswith('@openim') else message[3] + if (type_, sub_type) in {(49, 5)}: + info = parser_link(message_content) + msg.title = info.get('title', '') + msg.href = info.get('url', '') + msg.app_name = info.get('appname', '') + msg.app_id = info.get('appid', '') + msg.description = info.get('desc', '') + msg.cover_url = info.get('cover_url') + if not msg.app_name: + msg.app_name = info.get('sourcedisplayname') + if not msg.app_name: + source_username = info.get('sourceusername') + if source_username: + contact = manager.get_contact_by_username(source_username) + msg.app_name = contact.nickname + msg.app_icon = contact.small_head_img_url + elif (type_, sub_type) in {(49, 33), (49, 36)}: + # 小程序 + msg.type = MessageType.Applet + info = parser_applet(message_content) + msg.title = info.get('title', '') + msg.href = info.get('url', '') + msg.app_name = info.get('appname', '') + msg.app_id = info.get('appid', '') + msg.description = info.get('desc', '') + msg.app_icon = info.get('app_icon', '') + msg.cover_url = info.get('cover_url', '') + elif (type_, sub_type) in {(49, 3), (49, 76)}: + # 音乐分享 + info = parser_music(message_content) + msg.type = MessageType.Music + msg.title = info.get('title', '') + msg.href = info.get('url', '') + msg.app_name = info.get('appname', '') + # msg.app_id = info.get('appid', '') + msg.description = info.get('artist', '') + # msg.app_icon = info.get('songalbumurl', '') + msg.cover_url = info.get('songalbumurl', '') + # logger.error(xmltodict.parse(message_content)) + self.add_message(msg) + return msg + + +class BusinessCardMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_business(message_content) + msg = BusinessCardMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.BusinessCard, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + username=info.get('username', ''), + nickname=info.get('nickname', ''), + alias=info.get('alias', ''), + small_head_url=info.get('smallheadimgurl', ''), + big_head_url=info.get('bigheadimgurl', ''), + sex=info.get('sex', 0), + sign=info.get('sign', ''), + province=info.get('province', ''), + city=info.get('city', ''), + is_open_im=message[2] == MessageType.OpenIMBCard, + open_im_desc=info.get('openimdescicon', ''), + open_im_desc_icon=info.get('openimdesc', '') + ) + self.add_message(msg) + return msg + + +class VoipMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_voip(message_content) + msg = VoipMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.Voip, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + invite_type=info.get('invite_type', 0), + display_content=info.get('display_content', ''), + duration=info.get('duration', 0) + ) + self.add_message(msg) + return msg + + +class MergedMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_merged_messages(message_content, '', username, message[5]) + msg = MergedMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.MergedMessages, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + title=info.get('title', ''), + description=info.get('desc', ''), + messages=info.get('messages', []), + level=0 + ) + dir0 = '' + month = msg.str_time[:7] # 2025-03 + + def parser_merged(merged_messages, level): + for index, inner_msg in enumerate(merged_messages): + if inner_msg.type == MessageType.Image: + if dir0: + img_suffix = f'FileStorage/MsgAttach/{hashlib.md5(username.encode("utf-8")).hexdigest()}/Thumb/{month}/{inner_msg.md5}_2.dat' + origin_img_path = os.path.join(Me().wx_dir, + img_suffix) + else: + path = manager.get_image(content='', md5=inner_msg.md5, bytesExtra=b'', up_dir='', + thumb=False, talker_username=username) + inner_msg.path = path + inner_msg.thumb_path = manager.get_image(content='', md5=inner_msg.md5, bytesExtra=b'', + up_dir='', + thumb=True, talker_username=username) + if not os.path.exists(os.path.join(Me().wx_dir, inner_msg.path)) or inner_msg.path == '.': + inner_msg.path = f'FileStorage/MsgAttach/{hashlib.md5(username.encode("utf-8")).hexdigest()}/Thumb/{month}/{inner_msg.md5}_{2}.dat' + print(inner_msg.path) + elif inner_msg.type == MessageType.Video: + if dir0: + inner_msg.path = os.path.join('msg', 'attach', + hashlib.md5(username.encode("utf-8")).hexdigest(), + month, + 'Rec', dir0, 'V', f"{level}{'_' if level else ''}{index}.mp4") + else: + inner_msg.path = manager.get_video('', '', md5=inner_msg.md5, thumb=False) + inner_msg.thumb_path = manager.get_video('', '', md5=inner_msg.md5, thumb=True) + elif inner_msg.type == MessageType.File: + if dir0: + inner_msg.path = os.path.join('msg', 'attach', + hashlib.md5(username.encode("utf-8")).hexdigest(), + month, + 'Rec', dir0, 'F', f"{level}{'_' if level else ''}{index}", + inner_msg.file_name) + else: + inner_msg.path = manager.get_file(inner_msg.md5) + elif inner_msg.type == MessageType.MergedMessages: + parser_merged(inner_msg.messages, f'{index}') + + parser_merged(msg.messages, '') + self.add_message(msg) + return msg + + +class WeChatVideoMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + msg = WeChatVideoMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.WeChatVideo, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + url='', + publisher_nickname='', + publisher_avatar='', + description='', + media_count=1, + cover_url='', + thumb_url='', + cover_path='', + width=0, + height=0, + duration=0 + ) + info = parser_wechat_video(message_content) + msg.publisher_nickname = info.get('sourcedisplayname', '') + msg.publisher_avatar = info.get('weappiconurl', '') + msg.description = info.get('title', '') + msg.cover_url = info.get('cover', '') + self.add_message(msg) + return msg + + +class PositionMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + msg = PositionMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.Position, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + x=0, + y=0, + poiname='', + label='', + scale=0 + ) + info = parser_position(message_content) + msg.x = eval(info.get('x', '')) + msg.y = eval(info.get('y', '')) + msg.poiname = info.get('poiname', '') + msg.label = info.get('label', '') + msg.scale = eval(info.get('scale', '')) + self.add_message(msg) + return msg + + +class QuoteMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_reply(message_content) + # quote_message = manager.get_message_by_server_id(username, info.get('svrid', '')) # todo 非常耗时 + quote_message = self.get_message_by_server_id(info.get('svrid', ''), username, manager) + msg = QuoteMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.Quote, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + content=info.get('text'), + quote_message=quote_message, + ) + self.add_message(msg) + return msg + + +class SystemMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + wxid = '' + sub_type = parser_sub_type(message[7]) if username.endswith('@openim') else message[3] + if sub_type == 17: + xml_content = decompress(message[11]) + content = xmltodict.parse(xml_content).get('msg', {}).get('appmsg', {}).get('title', '') + else: + content = message[7] + msg = TextMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.System, + talker_id=username, + is_sender=message[4], + sender_id=wxid, + display_name='', + avatar_src='', + status=message[7], + xml_content=message[7], + content=content, + ) + self.add_message(msg) + return msg + + +class TransferMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_transfer(message_content) + msg = TransferMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.Transfer, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + pay_subtype=info.get('pay_subtype', 0), + fee_desc=info.get('fee_desc', ''), + receiver_username=info.get('receiver_username', ''), + pay_memo=info.get('pay_memo') + ) + self.add_message(msg) + return msg + + +class RedEnvelopeMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_red_envelop(message_content) + msg = RedEnvelopeMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.RedEnvelope, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + title=info.get('title', ''), + icon_url=info.get('icon_url', ''), + inner_type=info.get('inner_type', 0) + ) + self.add_message(msg) + return msg + + +class FileMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_file(message_content) + md5 = info.get('md5', '') + file_path = manager.get_file(md5) + msg = FileMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.File, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + path=file_path, + md5=md5, + file_type=info.get('file_type', ''), + file_name=info.get('file_name', ''), + file_size=info.get('file_size', 0) + ) + self.add_message(msg) + return msg + + +class FavNoteMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_favorite_note(message_content) + + msg = FavNoteMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.FavNote, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + title=info.get('title', ''), + description=info.get('desc', ''), + record_item=info.get('recorditem', '') + ) + self.add_message(msg) + return msg + + +class PatMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + # info = parser_pat(message_content) + + msg = PatMessage( + local_id=message[0], + server_id=message[9], + sort_seq=message[5], + timestamp=message[5], + str_time=message[8], + type=MessageType.Pat, + talker_id=username, + is_sender=is_sender, + sender_id=wxid, + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + title=message_content, + from_username='', + patted_username='', + chat_username=username, + template='' + ) + self.add_message(msg) + return msg + + +# 工厂注册表 +FACTORY_REGISTRY = { + -1: UnknownMessageFactory(), + MessageType.Text: TextMessageFactory(), + MessageType.Text2: TextMessageFactory(), + MessageType.Image: ImageMessageFactory(), + MessageType.Audio: AudioMessageFactory(), + MessageType.Video: VideoMessageFactory(), + MessageType.Emoji: EmojiMessageFactory(), + MessageType.File: FileMessageFactory(), + MessageType.Position: PositionMessageFactory(), + MessageType.System: SystemMessageFactory(), + MessageType.LinkMessage: LinkMessageFactory(), + MessageType.LinkMessage2: LinkMessageFactory(), + MessageType.LinkMessage4: LinkMessageFactory(), + MessageType.LinkMessage5: LinkMessageFactory(), + MessageType.LinkMessage6: LinkMessageFactory(), + MessageType.Music: LinkMessageFactory(), + MessageType.Applet: LinkMessageFactory(), + MessageType.Applet2: LinkMessageFactory(), + MessageType.Voip: VoipMessageFactory(), + MessageType.BusinessCard: BusinessCardMessageFactory(), + MessageType.OpenIMBCard: BusinessCardMessageFactory(), + MessageType.MergedMessages: MergedMessageFactory(), + MessageType.WeChatVideo: WeChatVideoMessageFactory(), + MessageType.Quote: QuoteMessageFactory(), + MessageType.Transfer: TransferMessageFactory(), + MessageType.RedEnvelope: RedEnvelopeMessageFactory(), + MessageType.FavNote: FavNoteMessageFactory(), + MessageType.Pat: PatMessageFactory(), +} + +if __name__ == '__main__': + pass diff --git a/wxManager/parser/wechat_v4.py b/wxManager/parser/wechat_v4.py new file mode 100644 index 0000000..141bba6 --- /dev/null +++ b/wxManager/parser/wechat_v4.py @@ -0,0 +1,947 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +@Time : 2024/12/11 1:26 +@Author : SiYuan +@Email : 863909694@qq.com +@File : MemoTrace-wechat_v4.py +@Description : +""" +import hashlib +import html +import os.path +from collections import OrderedDict + +from abc import ABC, abstractmethod + +import xmltodict +import zstandard as zstd +from google.protobuf.json_format import MessageToDict + +from wxManager.model.message import VoipMessage, BusinessCardMessage, MergedMessage, WeChatVideoMessage, \ + PositionMessage, TransferMessage, RedEnvelopeMessage, FavNoteMessage, PatMessage +from wxManager.parser.link_parser import parser_link, parser_voip, parser_applet, parser_business, \ + parser_merged_messages, parser_wechat_video, parser_position, parser_reply, parser_transfer, parser_red_envelop, \ + parser_file, parser_favorite_note, parser_pat +from wxManager.parser.util.protocbuf import packed_info_data_pb2, packed_info_data_merged_pb2,packed_info_data_img_pb2 +from .audio_parser import parser_audio +from .emoji_parser import parser_emoji +from .file_parser import parse_video +from wxManager.log import logger +from wxManager.model import * +from wxManager.model import Me +from ..db_main import DataBaseInterface + +''' +local_id,server_id,local_type,sort_seq,sender_username, +create_time,StrTime,status,upload_status,server_seq,origin_source, +source,message_content,compress_content" +''' + + +def decompress(data): + dctx = zstd.ZstdDecompressor() # 创建解压对象 + x = dctx.decompress(data).strip(b'\x00').strip() + return x.decode('utf-8').strip() + + +class LimitedDict: + # 数据缓存,最多存储k条数据,超出自动删除 + def __init__(self, k): + self.k = k + self.messages = OrderedDict() + + def __setitem__(self, key, value): + if key in self.messages: + # 如果键已存在,先删除再插入 + del self.messages[key] + elif len(self.messages) >= self.k: + # 超过限制,删除最早插入的项 + self.messages.popitem(last=False) + self.messages[key] = value + + def __getitem__(self, key): + return self.messages[key] + + def __delitem__(self, key): + del self.messages[key] + + def __contains__(self, key): + return key in self.messages + + def __repr__(self): + return repr(self.messages) + + def get(self, key): + return self.messages.get(key) + + +# 定义抽象工厂基类 +class MessageFactory(ABC): + @abstractmethod + def create(self, data, username: str, database_manager: DataBaseInterface): + """ + 创建一个Message实例 + @param data: 从数据库获得的元组数据 + @param username: 聊天对象的wxid + @param database_manager: 数据库管理接口 + @return: + """ + pass + + +# 单例基类 +class Singleton: + _instances = {} + contacts = {} + messages = LimitedDict(100) + + def __new__(cls, *args, **kwargs): + if cls not in cls._instances: + cls._instances[cls] = super().__new__(cls, *args, **kwargs) + return cls._instances[cls] + + @classmethod + def set_shared_data(cls, data): + cls._shared_data = data + + @classmethod + def get_shared_data(cls): + return cls._shared_data + + @classmethod + def set_contacts(cls, contacts): + cls.contacts.update(contacts) + + @classmethod + def get_contact(cls, wxid, database_manager: DataBaseInterface): + if wxid in cls.contacts: + return cls.contacts[wxid] + else: + contact = database_manager.get_contact_by_username(wxid) + cls.contacts[wxid] = contact + return contact + + @classmethod + def get_message_by_server_id(cls, server_id, username, manager): + if not server_id: + msg = TextMessage( + local_id=0, + server_id=0, + sort_seq=0, + timestamp=0, + str_time='', + type=MessageType.Text, + talker_id=username, + is_sender=False, + sender_id=username, + display_name=username, + avatar_src='', + status=0, + xml_content='', + content='无效的消息' + ) + return msg + if server_id and isinstance(server_id, str): + server_id = int(server_id) + if server_id in cls.messages: + return cls.messages.get(server_id) + else: + msg = manager.get_message_by_server_id(username, server_id) # todo 非常耗时 + if msg: + cls.add_message(msg) + else: + msg = TextMessage( + local_id=0, + server_id=0, + sort_seq=0, + timestamp=0, + str_time='', + type=MessageType.Text, + talker_id=username, + is_sender=False, + sender_id=username, + display_name=username, + avatar_src='', + status=0, + xml_content='', + content='无效的消息' + ) + return msg + + @classmethod + def reset_messages(cls): + cls.messages = {} + + @classmethod + def add_message(cls, message: Message): + if message: + cls.messages[message.server_id] = message + + def common_attribute(self, message, username, manager): + is_sender = message[4] == Me().wxid + wxid = message[4] + if wxid not in self.contacts: + self.contacts[wxid] = manager.get_contact_by_username(wxid) + if isinstance(message[12], bytes): + message_content = decompress(message[12]) + message_content = message_content.replace('', '').replace(' ', ' ') + # logger.error(message_content) + else: + message_content = message[12] + if username.endswith('@chatroom') and isinstance(message_content, str) and not is_sender and message[ + 2] != MessageType.Pat: + # 群聊文字消息格式:<wxid>:<content> + message_content = ':'.join(message_content.split(':')[1:]).strip() + + return is_sender, wxid, message_content + + +class UnknownMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + msg = Message( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=message[2], + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + ) + self.add_message(msg) + return msg + + +class TextMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + msg = TextMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.Text, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content='', + content=message_content + ) + self.add_message(msg) + return msg + + +class ImageMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + filename = '' + try: + # 2025年3月微信测试版修改了img命名方式才有了这个东西 + packed_info_data_proto = packed_info_data_img_pb2.PackedInfoDataImg() + packed_info_data_proto.ParseFromString(message[14]) + # 转换为 JSON 格式 + packed_info_data = MessageToDict(packed_info_data_proto) + filename = packed_info_data.get('filename', '').strip().strip('"').strip() + except: + pass + msg = ImageMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.Image, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + md5='', + path='', + thumb_path='', + file_size=0, + file_name=filename, + file_type='png' + ) + # with open(f'{msg.str_time}{msg.server_id}.bin', 'wb') as f: + # f.write(message[14]) + path = manager.get_image(content=message_content, bytesExtra=msg, up_dir='', + thumb=False, talker_username=username) + msg.path = path + msg.thumb_path = manager.get_image(content=message_content, bytesExtra=msg, up_dir='', + thumb=True, talker_username=username) + self.add_message(msg) + return msg + + +class AudioMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + audio_dic = parser_audio(message_content) + audio_length = audio_dic.get('audio_length', 0) + audio_text = audio_dic.get('audio_text', '') + if not audio_text: + packed_info_data_proto = packed_info_data_pb2.PackedInfoData() + packed_info_data_proto.ParseFromString(message[14]) + # 转换为 JSON 格式 + packed_info_data = MessageToDict(packed_info_data_proto) + audio_text = packed_info_data.get('info', {}).get('audioTxt', '') + msg = AudioMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.Audio, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + md5='', + path='', + file_size=0, + file_name='', + file_type='mp3', + audio_text=audio_text, + duration=audio_length + ) + msg.set_file_name() + self.add_message(msg) + return msg + + +class VideoMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + msg = VideoMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.Video, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + md5='', + path='', + file_size=0, + file_name='', + file_type='mp4', + thumb_path='', + duration=0, + raw_md5='' + ) + video_dic = parse_video(message_content) + msg.duration = video_dic.get('length', 0) + msg.file_size = video_dic.get('size', 0) + msg.md5 = video_dic.get('md5', '') + msg.raw_md5 = video_dic.get('rawmd5', '') + msg.path = manager.hardlink_db.get_video(msg.raw_md5, False) + msg.thumb_path = manager.hardlink_db.get_video(msg.raw_md5, True) + if not msg.path: + msg.path = manager.hardlink_db.get_video(msg.md5, False) + msg.thumb_path = manager.hardlink_db.get_video(msg.md5, True) + # logger.error(f'{msg.path} {msg.thumb_path}') + self.add_message(msg) + return msg + + +class EmojiMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + msg = EmojiMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.Emoji, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + md5='', + path='', + thumb_path='', + file_size=0, + file_name='', + file_type='png', + url='', + thumb_url='', + description='' + ) + emoji_info = parser_emoji(message_content) + # logger.error(emoji_info) + # logger.error(message_content) + if not emoji_info.get('url'): + msg.url = manager.get_emoji_url(emoji_info.get('md5')) + else: + msg.url = emoji_info.get('url') + msg.md5 = emoji_info.get('md5', '') + # msg.url = get_emoji_url(message_content) + # msg.thumb_url = '' + msg.description = emoji_info.get('desc') + # msg.description = get_emoji_desc(message_content) + self.add_message(msg) + return msg + + +class LinkMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + msg = LinkMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.LinkMessage, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + href='', + title='', + description='', + cover_path='', + cover_url='', + app_name='', + app_icon='', + app_id='' + ) + if message[2] in {MessageType.LinkMessage, MessageType.LinkMessage2, MessageType.Music, + MessageType.LinkMessage4, MessageType.LinkMessage5, MessageType.LinkMessage6}: + info = parser_link(message_content) + msg.title = info.get('title', '') + msg.href = info.get('url', '') + msg.app_name = info.get('appname', '') + msg.app_id = info.get('appid', '') + msg.description = info.get('desc', '') + msg.cover_url = info.get('cover_url', '') + if message[2] in {MessageType.Music}: + msg.type = MessageType.Music + if not msg.app_name: + source_username = info.get('sourceusername') + if source_username: + contact = manager.get_contact_by_username(source_username) + msg.app_name = contact.nickname + msg.app_icon = contact.small_head_img_url + + elif message[2] == MessageType.Applet or message[2] == MessageType.Applet2: + info = parser_applet(message_content) + msg.type = MessageType.Applet + msg.title = info.get('title', '') + msg.href = info.get('url', '') + msg.app_name = info.get('appname', '') + msg.app_id = info.get('appid', '') + msg.description = info.get('desc', '') + msg.app_icon = info.get('app_icon', '') + msg.cover_url = info.get('cover_url', '') + self.add_message(msg) + return msg + + +class BusinessCardMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_business(message_content) + msg = BusinessCardMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.BusinessCard, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + username=info.get('username', ''), + nickname=info.get('nickname', ''), + alias=info.get('alias', ''), + small_head_url=info.get('smallheadimgurl', ''), + big_head_url=info.get('bigheadimgurl', ''), + sex=info.get('sex', 0), + sign=info.get('sign', ''), + province=info.get('province', ''), + city=info.get('city', ''), + is_open_im=message[2] == MessageType.OpenIMBCard, + open_im_desc=info.get('openimdescicon', ''), + open_im_desc_icon=info.get('openimdesc', '') + ) + self.add_message(msg) + return msg + + +class VoipMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_voip(message_content) + msg = VoipMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.Voip, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + invite_type=info.get('invite_type', 0), + display_content=info.get('display_content', ''), + duration=info.get('duration', 0) + ) + self.add_message(msg) + return msg + + +class MergedMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + """ + 合并转发的聊天记录 + - 文件路径: + - msg/attach/9e20f478899dc29eb19741386f9343c8/2025-03/Rec/409af365664e0c0d/F/5/xxx.pdf + - 图片路径: + - msg/attach/9e20f478899dc29eb19741386f9343c8/2025-03/Rec/409af365664e0c0d/Img/5 + - 视频路径: + - msg/attach/9e20f478899dc29eb19741386f9343c8/2025-03/Rec/409af365664e0c0d/V/5.mp4 + 9e20f478899dc29eb19741386f9343c8是wxid的md5加密,409af365664e0c0d是packed_info_data_proto字段里的dir3 + 文件夹最后的5代表的该文件是合并转发的聊天记录第5条消息,如果存在嵌套的合并转发的聊天记录,则依次递归的添加上一层的文件名后缀,例如:合并转发的聊天记录有两层 + 0:文件(文件夹名为0) + 1:图片 (文件名为1) + 2:合并转发的聊天记录 + 0:文件(文件夹名为2_0) + 1:图片(文件名为2_1) + 2:视频(文件名为2_2.mp4) + :param message: + :param username: + :param manager: + :return: + """ + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_merged_messages(message_content, '', username, message[5]) + msg = MergedMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.MergedMessages, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + title=info.get('title', ''), + description=info.get('desc', ''), + messages=info.get('messages', []), + level=0 + ) + packed_info_data_proto = packed_info_data_merged_pb2.PackedInfoData() + packed_info_data_proto.ParseFromString(message[14]) + # 转换为 JSON 格式 + packed_info_data = MessageToDict(packed_info_data_proto) + dir0 = packed_info_data.get('info', {}).get('dir', '') + month = msg.str_time[:7] # 2025-03 + rec_dir = os.path.join(Me().wx_dir, 'msg', 'attach', hashlib.md5(username.encode("utf-8")).hexdigest(), month, + 'Rec') + if not dir0 and os.path.exists(rec_dir): + for file in os.listdir(rec_dir): + if file.startswith(f'{msg.local_id}_'): + dir0 = file + + def parser_merged(merged_messages, level): + for index, inner_msg in enumerate(merged_messages): + wxid_md5 = hashlib.md5(username.encode("utf-8")).hexdigest() + if inner_msg.type == MessageType.Image: + if dir0: + inner_msg.path = os.path.join('msg', 'attach', + wxid_md5, + month, + 'Rec', dir0, 'Img', f"{level}{'_' if level else ''}{index}") + inner_msg.thumb_path = os.path.join('msg', 'attach', + wxid_md5, + month, + 'Rec', dir0, 'Img', + f"{level}{'_' if level else ''}{index}_t") + else: + path = manager.get_image(content='', md5=inner_msg.md5, bytesExtra=inner_msg, up_dir='', + thumb=False, talker_username=username) + inner_msg.path = path + inner_msg.thumb_path = manager.get_image(content='', md5=inner_msg.md5, bytesExtra=inner_msg, + up_dir='', + thumb=True, talker_username=username) + elif inner_msg.type == MessageType.Video: + if dir0: + inner_msg.path = os.path.join('msg', 'attach', + wxid_md5, + month, + 'Rec', dir0, 'V', f"{level}{'_' if level else ''}{index}.mp4") + inner_msg.thumb_path = os.path.join('msg', 'attach', + wxid_md5, + month, + 'Rec', dir0, 'Img', + f"{level}{'_' if level else ''}{index}_t") + else: + inner_msg.path = manager.get_video('', '', md5=inner_msg.md5, thumb=False) + inner_msg.thumb_path = manager.get_video('', '', md5=inner_msg.md5, thumb=True) + elif inner_msg.type == MessageType.File: + if dir0: + inner_msg.path = os.path.join('msg', 'attach', + wxid_md5, + month, + 'Rec', dir0, 'F', f"{level}{'_' if level else ''}{index}", inner_msg.file_name) + else: + inner_msg.path = manager.get_file(inner_msg.md5) + elif inner_msg.type == MessageType.MergedMessages: + parser_merged(inner_msg.messages, f'{index}' if not level else f'{level}_{index}') + + parser_merged(msg.messages, '') + self.add_message(msg) + return msg + + +class WeChatVideoMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + msg = WeChatVideoMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.WeChatVideo, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + url='', + publisher_nickname='', + publisher_avatar='', + description='', + media_count=1, + cover_url='', + thumb_url='', + cover_path='', + width=0, + height=0, + duration=0 + ) + info = parser_wechat_video(message_content) + msg.publisher_nickname = info.get('sourcedisplayname', '') + msg.publisher_avatar = info.get('weappiconurl', '') + msg.description = info.get('title', '') + msg.cover_url = info.get('cover', '') + self.add_message(msg) + return msg + + +class PositionMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + msg = PositionMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.Position, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + x=0, + y=0, + poiname='', + label='', + scale=0 + ) + info = parser_position(message_content) + msg.x = eval(info.get('x', '')) + msg.y = eval(info.get('y', '')) + msg.poiname = info.get('poiname', '') + msg.label = info.get('label', '') + msg.scale = eval(info.get('scale', '')) + self.add_message(msg) + return msg + + +class QuoteMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_reply(message_content) + # quote_message = manager.get_message_by_server_id(username, info.get('svrid', '')) # todo 非常耗时 + quote_message = self.get_message_by_server_id(info.get('svrid', ''), username, manager) + msg = QuoteMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.Quote, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + content=info.get('text'), + quote_message=quote_message, + ) + self.add_message(msg) + return msg + + +class SystemMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender = message[4] == Me().wxid + wxid = message[4] + if wxid not in self.contacts: + self.contacts[wxid] = manager.get_contact_by_username(wxid) + if isinstance(message[12], bytes): + message_content = decompress(message[12]) + try: + dic = xmltodict.parse(message_content) + message_content = dic.get('sysmsg', {}).get('revokemsg', {}).get('content', '') + except: + pass + # logger.error(message_content) + else: + message_content = message[12] + + msg = TextMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.System, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + content=message_content, + ) + self.add_message(msg) + return msg + + +class TransferMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_transfer(message_content) + msg = TransferMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.Transfer, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + pay_subtype=info.get('pay_subtype', 0), + fee_desc=info.get('fee_desc', ''), + receiver_username=info.get('receiver_username', ''), + pay_memo=info.get('pay_memo') + ) + self.add_message(msg) + return msg + + +class RedEnvelopeMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_red_envelop(message_content) + msg = RedEnvelopeMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.RedEnvelope, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + title=info.get('title', ''), + icon_url=info.get('icon_url', ''), + inner_type=info.get('inner_type', 0) + ) + self.add_message(msg) + return msg + + +class FileMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_file(message_content) + md5 = info.get('md5', '') + file_path = manager.get_file(md5) + msg = FileMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.File, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + path=file_path, + md5=md5, + file_type=info.get('file_type', ''), + file_name=info.get('file_name', ''), + file_size=info.get('file_size', 0) + ) + self.add_message(msg) + return msg + + +class FavNoteMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_favorite_note(message_content) + + msg = FavNoteMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.Pat, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + title=info.get('title', ''), + description=info.get('desc', ''), + record_item=info.get('recorditem', '') + ) + self.add_message(msg) + return msg + + +class PatMessageFactory(MessageFactory, Singleton): + def create(self, message, username, manager): + is_sender, wxid, message_content = self.common_attribute(message, username, manager) + info = parser_pat(message_content) + + msg = PatMessage( + local_id=message[0], + server_id=message[1], + sort_seq=message[3], + timestamp=message[5], + str_time=message[6], + type=MessageType.Pat, + talker_id=username, + is_sender=is_sender, + sender_id=message[4], + display_name=self.contacts[wxid].remark, + avatar_src=self.contacts[wxid].small_head_img_url, + status=message[7], + xml_content=message_content, + title=info.get('title', ''), + from_username=info.get('from_username', ''), + patted_username=info.get('patted_username', ''), + chat_username=info.get('chat_username', ''), + template=info.get('template', '') + ) + self.add_message(msg) + return msg + + +# 工厂注册表 +FACTORY_REGISTRY = { + -1: UnknownMessageFactory(), + MessageType.Text: TextMessageFactory(), + MessageType.Image: ImageMessageFactory(), + MessageType.Audio: AudioMessageFactory(), + MessageType.Video: VideoMessageFactory(), + MessageType.Emoji: EmojiMessageFactory(), + MessageType.File: FileMessageFactory(), + MessageType.Position: PositionMessageFactory(), + MessageType.System: SystemMessageFactory(), + MessageType.LinkMessage: LinkMessageFactory(), + MessageType.LinkMessage2: LinkMessageFactory(), + MessageType.Music: LinkMessageFactory(), + MessageType.LinkMessage4: LinkMessageFactory(), + MessageType.LinkMessage5: LinkMessageFactory(), + MessageType.LinkMessage6: LinkMessageFactory(), + MessageType.Applet: LinkMessageFactory(), + MessageType.Applet2: LinkMessageFactory(), + MessageType.Voip: VoipMessageFactory(), + MessageType.BusinessCard: BusinessCardMessageFactory(), + MessageType.OpenIMBCard: BusinessCardMessageFactory(), + MessageType.MergedMessages: MergedMessageFactory(), + MessageType.WeChatVideo: WeChatVideoMessageFactory(), + MessageType.Quote: QuoteMessageFactory(), + MessageType.Transfer: TransferMessageFactory(), + MessageType.RedEnvelope: RedEnvelopeMessageFactory(), + MessageType.FavNote: FavNoteMessageFactory(), + MessageType.Pat: PatMessageFactory(), +} + +if __name__ == '__main__': + pass