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>&nbsp;&nbsp;&nbsp;&nbsp;* csv<br>&nbsp;&nbsp;&nbsp;&nbsp;* html<br>&nbsp;&nbsp;&nbsp;&nbsp;* '
-    'txt<br>&nbsp;&nbsp;&nbsp;&nbsp;* 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("&", "&amp;"))
-    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&amp;filekey=30350201010421301f020201060402535a041071ce49ed3ce9e57e43e07f802983bf45020305614c040d00000004627466730000000132&amp;hy=SZ&amp;storeid=263ffa00b000720d03274c5820000010600004f50535a1ca0c950b64287022&amp;bizid=1023" designerid = "" thumburl = "http://mmbiz.qpic.cn/mmemoticon/ajNVdqHZLLDSKTMRgM8agiadpFhKz9IJ3cD5Ra2sTROibOaShdt3D4z6PfE92WkjQY/0" encrypturl = "http://wxapp.tc.qq.com/262/20304/stodownload?m=cbaae1d847aac6389652b65562bacaa2&amp;filekey=30350201010421301f020201060402535a0410cbaae1d847aac6389652b65562bacaa20203056150040d00000004627466730000000132&amp;hy=SZ&amp;storeid=263ffa00b0008d8223274c5820000010600004f50535a17b82910b64764739&amp;bizid=1023" aeskey= "7051ab2a34442dec63434832463f45ce" externurl = "http://wxapp.tc.qq.com/262/20304/stodownload?m=960f68693454dfa64b9966ca5d70dbd3&amp;filekey=30340201010420301e020201060402535a0410960f68693454dfa64b9966ca5d70dbd3020221a0040d00000004627466730000000132&amp;hy=SZ&amp;storeid=26423dbe3000793a8720e40de0000010600004f50535a1d40c950b71be0a50&amp;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. 点击获取信息
-
-![](./images/pc_decrypt_info.png)
-
-4. 设置微信安装路径(如果自动设置好了就**不用管**了)
-
-可以到微信->设置->文件管理查看
-
-![](./images/setting.png)
-
-点击**设置微信路径**按钮,选择该文件夹路径下的带有wxid_xxx的路径(没有wxid的话先选择其中一个文件夹不对的话换其他文件夹)
-
-![](./images/path_select.png)
-
-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', '&emsp;')
+        .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)} ![图片]({message.path})\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,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAB39JREFUeF7tWluoVVUUHeOzLIyowECCSKIkKAWNqMyioKcUFBp9FQQ9QPtRyECDCuonhR4g1FdkFBQ+UigqtQgVtCAqxAhCUKiIorLP0VmxL2n3xj1rz7n3VfZYcDiCa4w159xjjL33UcJr0BPgoLt387AABi4CC8ACGPgEBt6+E8ACGPgEBt6+E8ACGPgEBt6+E8ACGPgEBt6+E8ACGPgEBt6+E8AC6H8Cks4FcDWAS0/4fAfgMIDyfYDkD/1X1t2Jki4CsBDAJQDmNd+HAEx89pL8pbsKpmbuLQEklebvby78NWM0+i2AzwBsJbl9jP2n3BZJdwC4C8C1AC4bo8DPAewF8CbJA2PsD2/pXADNhX8YQPm0XdsAbDpdhNBc+NLvnW0bLv02PXcqhE4FIOlBAK8FhvBf6Ask1yTypVNJeh7A6kTih0i+nsh3ElVnApB0N4B3Oyj8ZZKPd8AbppT0EoDHwkSTCe4h+V4HvN38hxBJlwP4uouCG84nSG7okL+aWtIqAC9WA8cHzCf5zfjbx9uZngA9XPyJzu4j+c54bXa7S9K9AN7u9pR/2NNFkCoASXMB7CyF9jCMcsQyklt7OmvKYySVp/wtPdVQUvVWkkeyzssWQInllVnFjcGzh+SSMfZ1tkXSbgDXd3bAZOKNJMvtJmWlCUBSGUIZRt9rFcmNfR9azpNUxD4TzyJLSO7J6DlTACUGSxz2vUocXkHytz4PljQbwFej19xy2+t7lR/HlmUcmiIASWeOXn9+AlC+Z2LdTnJHnwdLug3A+32eecJZxwGcT7J8h1aWAG4G8EGokhj4WZJPxSjq0JKeAbC2DpW6+xaSH0YZswSwfnRLXBctJoDfRXJpAF8NlfQJgBuqgXmAp0mWuYdWlgA2A1geqiQGPkbywhhFHVrSUQBz6lCpu98iuSLKmCWAg6N34auixQTx5/T1INg8AP4arDcK/2L0G8iCKEmWAP6cwQfAiRksJrk/OpBx8JIWjX6Q2TfO3g73HCc5K8qfJQBFC0nALyW5K4FnWgpJ5d5fngFmdHH0EBAtIExQCpBkAUSvRAu8BXDy0JwAbUTUAjMJ4gTImGI9hxPACRC+hYcJ/AxQ79wshBPACRA2cJjACZDl53oeJ4ATIGzgMIEToN65WQgngBMgbOAwgRMgy8/1PE4AJ0DYwGECJ0C9c7MQTgAnQNjAYQInQJaf63mcAE6AsIHDBE6AeudmIZwAToCwgcMEToAsP9fzOAGcAGEDhwmcAPXOzUI4AZwAYQOHCZwAWX6u53ECOAHCBg4TOAHqnZuFcAI4AcIGDhM4AbL8XM/jBHAChA0cJnAC1Ds3C+EEcAKEDRwmcAJk+bmexwngBAgbOEzgBKh3bhbCCeAECBs4TOAEyPJzPY8TwAkQNnCYwAlQ79wshBPACRA2cJjACZDl53oeJ4ATIGzgMIEToN65WQgngBMgbOAwgRMgy8/1PE4AJ0DYwGECJ0C9c7MQTgAnQNjAYQInQJaf63mcAE6AsIHDBE6AeudmIZwAToCwgcMEToAsP9fzOAGcAGEDhwmcAPXOzUI4AZwAYQOHCZwAWX6u53ECOAHCBg4TOAHqnZuFcAI4AcIGDhM4AbL8XM/jBHAChA0cJnAC1Ds3C+EEcAKEDRwmcAJk+bmexwngBAgbOEzgBKh3bhbiVEqAPwGcmdVYS57FJPe3xFbBJC0CsK8KlL/5OMlZUdqsBDgI4KpoMUH8OSR/C3KMBZc0G8CvY23ubtMXJBdE6bMEsBnA8mgxAfwxkhcG8NVQSUcBzKkG5gHeIrkiSpclgPUA1kWLCeB3kVwawFdDJX0C4IZqYB7gaZJl7qGVJYDrAewOVRIDryX5XIyiDi3pSQDP1qFSdy8huSfKmCWAMwD8COCsaEEt8TeR/LglthVM0o0APmoFjoP+AHAByb+iVCkCKEVI2gLgrmhBLfBHAMwn+XsLbGuIpLMBfA1gbmuS9sCtJJe1h/+LzBTATN0GVpHcmDGMWg5JKwFsqMUl7E+J/1JHmgCaFCjDKEPpa+0huaSvw6Y6R1J59ini72ttJLkq67BsAZQ4LPfiS7IKnIZn2ehdeGtPZ015jKRy2yu3vz7WdwBuJFlueykrVQBNCpRXo/KK1PXq/cn//xrq8Y1gKcldmYNNF0BPIkh5B84cpKSufwtJv/il/04E0IhgMYC9mUNuuB4l+WoHvGFKSY+MXs9eCRNNJriaZCf/9tCZABoR3ApgR+JA1pB8IZEvnUrSagDPJxLfRnJnIt9JVJ0KoBHBQgAPN5+2fWwDsInk9rYEfeIk3dH0e2fg3E1NzwcCHNNCOxfARAWSihAeGP16dh2A8ufpVnni/RTAu6fLhf9vQ40Q7ml6HufNqFzs0vMbJDu98BO19iaAE4cj6bzRraH8m/qlJ3zKBT88Ekn5/pLk99Mp5HT6e0kXA7iyeUWe13wfAjDx2U/y5757mhEB9N2kz/v/CVgAA1eHBWABDHwCA2/fCWABDHwCA2/fCWABDHwCA2/fCWABDHwCA2/fCWABDHwCA2/fCWABDHwCA2//bwIrxK4IpxmfAAAAAElFTkSuQmCC) no-repeat center;
+            background-size: 18px 18px;
+        }
+
+        .chat-music-audio .play-button.paused {
+            background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAB3ZJREFUeF7tnVvIVUUUx//rxYeQoJeCeoneeinsAhUEFRokRERQLwm9241K6UI9VBSWFN0JS8ukNKPoQuIFuxiRdpOyC0UUmRZ9hRpJGcl0Vs6pz0/P+fasmdl79t7/AZ+ctWbNf/3Omj1zzjdbkKE5504CcDKAWQDOAHAmgC0A3gewFcCnALaJyN4Mw9NlgAIS0Hfars65iwHcAOCsaTsD2wEsBvCIiOyv0J9dMiiQDADn3HIA8wwxKgi3i8gTBluaRCoQDYBz7nQAGwef5pmRsbw3WCbmisiuSD80D1AgBQAuYLzpuk4AuFpEVk7Xkf+fRoEoAJxziwAsTBPKQV6eAnAdq0EGZae4NAPgnJszeNhblzHEnQCuZzXIqDAAEwDOuSMBbACg63/uxmqQUWErAFcAWJYxrqmuWQ0yiW0F4CEAV2aKaZxbhU6XBe4UEolvBeBdf7qXKIwgN6wGQXKN72wFYB+AGQnjsLhiNbCoFrsLcM7NBrA+wdgpXGg10O3iqhTO+ugjuAI4584flP+1hYnFamBMiAWAUwB8aBwvpxmrgUHdLgEwnL5WA10Wdhv06J1JFwHQJLIaVES5qwCwGhCA/xTY4Q+PuFM4DBRdrwCTp8xng54DoNNnNUhwEFTqNrDiqvdvt6V+Wej9TqFPS8BUQFgNLL8HcM51oQJMhqHX1aDPFWAyBFoN9PDo+ZB1pAt9CcDBWexdNSAAh36Me1UNCMDoOq7VQJeFPV0o9aPmQADGZ7fz1YAAVPt4d7YaEIBqAGivH/zhUad2CgSgOgDDnp2qBgQgHIBOVQMCYANgaPWkXxZau1MgAHEAtL4aEIB4AFpdDQhAOgCG1UAPj1andZvPGwHIo21rng0IQB4AWlMNCEA+AFrxbEAA8gNQdDUgAPUAMLka6EPib/UOO3o0AlB/JvReRL3kooidAgGoH4CiqgEBaA4AHbnxakAAmgWg8WpAAMoAoLFqQADKAWAYiV6arQ+JtewUCEB5ANRaDQhAmQDUVg0IQNkADKuBHh69kCNUApBD1Tw+9c7ka1I/GxCAPMnK5fV3ALeIyIOpBiAAqZSs189HInJqiiEJQAoVm/GxWUT0jWxRjQBEyde48YSIHB0TBQGIUa8M29Uicqk1FAJgVa4su2tF5AFLSATAolp5Nt/qG1pF5OfQ0AhAqGLl9tfX7embXIIaAQiSq+jOa0RkbmiEBCBUsYL7i0hwPoMNOnhNXMEpDQ7tWBH5McSKAISoVX7f00Qk6GUeBKD8pIZESABC1OpgXy4BHUxq5SnxIbCyVJ3syG1gJ9NafVI8CKquVed68ii4cykNmxC/DArTq1O9XxGRi6wz4jmAVbly7I6xfAs4DJ8AlJNISyTnisibFkMCEKNa87afA5gfm3ydBitA88kMjWDd4OXdF4rIX6GGh+tPAFKoWI+PT/wfhkSV/KmhEoB6khc7ym0ickesE1aAHArm9fmO/1PxLbmGYQXIpWy831tF5M54N+M9EIDcCof73+RfVvVBuGm4BQEI1yynhf7h5105B+BDYJ3qVh/rLb/WB/2cq7r70T1ZAVKoGOfjZhG5O86F3ZoA2LWLtXzDf+o/jnUUY08AYtSz294oIovs5uksCUA6Lat42ug/9VurdK6jDwGoQ+UDYywUkXvrG67aSASgmk4xvTb4T72e5RfXCEDelCwQkcV5h4jzTgDi9Btlvd6f5m3L4z6dVwKQTsuhJ73n9770bvN4JADpdF3r1/rP0rnM74kAxGvsfOLvj3dVvwcCEKf5Gp/8L+LcNGdNAGza7/eJN93MZRsyjxUBCNf1dZ/8L8NNy7MgANVz8rff2gXfxFV9iPp7EoBqmr/mP/VfVevenl4EYHyu9Lf3uq9/uD0pDYuUAIzW61Wf/K/DJG1XbwJwaL7+9Il/tF2ptEVLAA7W7WWf/G9scrbPigAcyNkfPvGPtS+FcRETAOAln3y9ZqV3rc8A7PWJf7x3WZ804b4C8KJP/nd9Tr7OvW8A6GvX9CWMS/qe+OH8+wSAvnlTD3W+Z/L/V6APAOhbuDXx+lZutikKdB2A1T7525n5wyvQVQB2+8QvZeLHK9BFAFb55O9g8qdXwALAHAB6U1VpbZdP/LLSAis5HgsAlwFYWdiknvPJD3pfTmFzaCQcCwAXANCfRZXQfvWJf7qEYNoYgwWA4wGUcG7+rE/+T20UvpSYLQDMALCvwQn84hO/vMEYOjN0MAA6c+ec3m5xTgMqrPDJD35HbgOxtmJIKwALANxT4ww14XqapwCwJVTACsAsAG8DmJkwllGunvHJn6hhrN4NYQLALwM3Ach5p50+3OmnXh/22DIpYAbAQ6BV4OwMsem2TpOv2zy2jArEAnACgJQ/oNSEXyUierDDVoMCUQD4KqDPA3qr9RGR8erNWeeJiB7pstWkQDQAHoKjAOivbC4xxK3f168QkfkGW5pEKpAEgGEMzjk9G7h8sCzMGzwg6oHRuLbTQ7NERPjNXWQireZJAZgEwokehNmDJB/n/2nC9cuazQD0YoVNIrLHGjjt0ijwD6JF65/IMr1vAAAAAElFTkSuQmCC) 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/eHBhY2tldCBlbmQ9InIiPz56YfhrAAAaqUlEQVR42uxdWXNc13HuPvfODgwG2wAgFoIgAZLiIpHWYq22ZW02Zcux/aAslTzEFSeP+QF+y39wJVWupFKuOKlYciw5ji3KlmUtlChLlEiBIEgCJLFjBtusmO2eTvfsILhhBgMMSJ1CocjBYHDvd/t0f92nF0z+5HGop4UOLzbuAm8PNnSBpx35y9GMjgawN5DpQGUjwwGUgUwS0nFMr1ImAZlVSkUoFoRYkKKzEJ6iyAwlw3V1X+a2X4GyNwiszXvAuxubetHVDDY3mHZQDjRMUjZUBiD/Q/F7CTD7NEwwFTDijiYkXhopo3SarAzoJGRS/AxodZlCkxC+RstXGHqdit6LQKMysbELmgewaTd6u8HVjk4fOJvQ0USGHRBzb6Oy7+s/gr/Kf7TmbUTKSlHbAUiEKLECq0EMz1DoKiyPU2SWdOYuBxoNB7rawNeLvn7w9ipvD8sysAgrG9wC00r+ErKeAdMPHr88NJ3G1WUIT+vwJIYnaeUqrEzS6gJZybsNaNYP5OnEpm5sHkT/YWzfD7aGG7+VCPn+M3FKZ5VvJsX/ZRlEnWEVAWQBf2eRR4WsT9AAZSCLNj9C1jamC21OMN2ixwvbIvvnbYw4f6muY5COUnCUAp/D8iUITWNsbmu0CtbUGCIaZDoVa9K2Iex9HPk+PR03AtcCsWmJrHqNQXxBs02LzlN8AVgSkyHiF1NxFkCBm78rkwwbGk6wOcBwIguvvYl3BrrboKFDsRXlf9g8ouhNp3zx81i/YvM0e4Ym36OFizoZwkyC+DJ2ItDIMuXwqa7j6uB3sW2/SNk6gEV+GTsGNDis58/R0iVYuapTseq0CCq7B3z92DKoOo5A+yF+AKTMrIzj9W/l7bIwqkde1bOfQHKFDesOAxodPux+CPc+q9oPinAVtHDZHaYoOEyzn+rAOYpMQipBrEmtFFO36u9WnjErFsPOdBDsTmzsVf4j2PUAth8SY3vd0mnZRsEL1tgbNP0RJVd2BtBi8bofVn2PY/t9ohkZ5fLFzJdt0dwZzVoyHqDVFUiGhQsD1VCBsfZgeu7ygduv/Ieh85hYY5trzZvYKrCyCp7XE+/R9OlNt5PmpkJsEy7R9yR2HceWAdYba34cD9LiJZHipTERYaZZTHtriG+Zec2sil2NBdAYt8LXcP4stuxl6cbWQXC3599kusG3h1m8qPjmAWviPeHgVrreJBqZAqP/EPY+pnofE8ZWtD9MEhJLsHiZgiOiJRhl/u+2+5/OFsZa9AlrttZ94GwRYl60zOzsTJ0S0Q4MUzK0KdKwCRIt3oe7DXk/7n0ed32pTJI0sGccnob5s3riHb00JqqwPhY/bJpZ0sHziuHuexI6jorfZG/M+kEGkxYc+pZq2EUOr54/A7GF6n2caiWa1QU2dKo9z+LgN6Chs8zCpCC+SPNnrYuv09zZLVERVWzHzqPG0Lew4yi4W5nzl34SnaNL/6evnCT+R3VqpFqg2baoI3+udj3MfLlcKxKbO4Z44l3KJOsb5aLBdGDfE4rh7jxW7uwwv9Yzp/W5/2S9tz2qg5kTUwvmyNA6VI4yri5Zo6/R5PvAzu7OQDlnMJM49YEOT7OZMfZ/m1wtBSPpxK4vGXYvjrwiWluntxRodDar3U/i4IvYvKeIco78Wxd/pQNnIRbYRJO9NVizL47LlykVhsiMGjqBbQfyTpbNg20H8fBfsIurr/2REstbBDR6OpBp8uA32fWigrFmQabZj60rbzFHpmpdu+0Dm4UjPEOJkJWKGHueZlnOibaEwtv2S1xFGcByHZuvOdA5lNXgCWwdKm47iM5a0x/S+El2o2HHLxFtmHgXkiFMRVX3I8DMOhfGah1isdLsx7Pt2SDW5kY1BqNsDL4ITPWLHC46p8d/p8d/QysTcBctFhpkEp2MqoGvC6HK7l3G2mAdyfv1ylsb0iEbAFqs3+6ncPBECWVeiWU98gs9/iatLsBdt1h09MirkAyrIy+DqzX/auugghOkLX3p13duG9UGgO7/Kg69iC37Si8lV/TH/6LH3oDEItytK7Gox9/g24SyYBODICaq59FNlmjxSloPGPtfEo6Rs35EmFyxPv5nPf2RxIuJ7lac+dYwEZLbRFTHfgCultwpmmoewEPf5w1NixfuhF+pO9EY0NjDXgm07ivFlOMBa/jnevJDYLJRy3h5fWBt8W3qyVN6+L/YIEFWqoTUsm1kWBp7cF0QeMNAI6+GDrXvBdX9cCngGZ0ltn5XRGPc9SiXsGZrJHf9e4jN5V+1eRgWY98LDBEiVifRjmbsOm7se74oy8yX9fSH1uX/o8jcXawxbqhDKB7UY7/VUx/gat4mMSwshQwRA1U50KKa/YfUwLNUMLhopTT7I2NvSvD+nlx84zR2kmY/wcLJAHs0DJGEiA1bpcbQ24s9X4bOB0rUcnmcrr2t5z+De3hJdMnZZHj80HF//qXOB1R40orMwvLlDQONvCn6npQofhmZo4uv65mP4Ys196m2Nxre3mLsiameEZ23wpM3OwO7qerA7odF9biaiypKX3iN5s5AKvIFzjoVo8BZa/Q1KFopBqrrOLK/viEdLcG5vsfl3C93IqVTDDFNvkvRwD1lAG9lGmMByQlhydOpnAaQs7G+xxi6OwVaKF33Q3KGnTtdJQ3xRc1KY2VyK3OoStfj6zP6v2oMvqg6jtYR0lZah6YYFgZHIBKG1iQHvqwJbkT1zHUoG+DwGgPPMTfMi24qQvPnaOI9ySTaWoQlBampT/U/zdsL3C167CTMn60jsU7HGBbqeRR73IyyXHGD3xh4NjN9GpPh6zyM64Fmh8foekASi0x3TpwpPMM2sMapF3CD5233iJt7/98o/2Fxw9gVLj8tqxMFkklYF183vD3YJge7Alr7ftx1THzmtSfR6yTa2aQOfp/snmJwDubPWXOfbXUgX05wnlD3/zW42ii7E1Gn9HYorttjzeDMfw4NHfnwns1jHPgeBS/QLYBW9kZoPyDiXMyjXRpjG7i1KKPqOIJ7n8/mh7SUcqWtJKYTUI+L9MQfDF8f9GSBVjYGEBnGZESXMbQ1QJOnw+h+tORts3e/MCqJh1u1lL0B+78ip9Ft9xUpan5lUlJOUZ9sb2lcBUeYdeTynsQv737MWp4op8Kq3EOR/OWuY6XfX7xEgeEtSh9mQfD148Hv4tBLquv49SjzslJk1adEi1WUJKzFkkRKQiWDWZZAW0bv3K3YMljMX8ZMHALDtHhxKyyfw4vsxR74jnHweyU7fN3KJClTr0CLjr1MwWEBLbc8HQKmu/VGEt3Uj+2HS+K8MqEXL9JqsMaCbErdVfcj6vDL6uD3yFWWA3c9b01hPQOdWKalcV12aspgMqTXAy037OuTiofimv2EIhO1RpmNNXsixoM/ZJ5/mzezd1rfiSIC1+wnZUDvZycAC8meeWOIjV3Y1FusK0ErZQU+h8hsbYFmdcFKma2C6bkTT6xujWF+RWZ14HPTShbSbhoEUu8uqcIrqQ52Dby9JW4YGJYscasmZWLi4rPzeeQvjWM/kLgVP93bHU9kn32a7WFdSzTDxaAxdAU2rBjS5oE1qkOxNvH2FHGmuU8lF78G9BlNF7YdVMf/1hj8JrQNXV8PcCuympJizTqPNK2uiP9SjLs19aiCmjYhX7u6C5y+gjZMW4FzUIMSX3S3q46jqu8J6HmE2DnaGFmte9XBKxlmnmfqdF57MKTeXQwvU+SsREtVZXu+nocyFA9SZHJzuRTbPdW0G3c/pQ68BHueho2iLDw6Xf9ZkwJaeJLiAalWz3qJAmxWVYhEY/MeLIizhOiCI5DaxBASG167nIrtP6F6n1iTrL5BoKUA9g60eXWbH6q7cZI61OAFcDbnmAUDK2XuCxeyrMO7G5xNRb9Az5+tOAv4BjAbdmwdNB78h5uUGt75BwHwA7M31TYGwBuaRY2sis83GDoGUOWMvGiPJoE3L9FNPUwDqOiALYxKEeDmKGW/2vuMJKu7mknZq4JgzzOSgqVrnEaiM7Q8pkd+AbN/qgxrgW5htGhO0NmEPqFzpri/rpa8rPFHp2I6NIlUdW2MYYP2Q8be53DXg1JtCNVuecoVG29BQMDRoIisuTNQGQiUYQCNVEzARGTxQmcrg2xKFxKbO8dkJWV/dVEODqpT0JLd2/2QYtPXcZSczbCzlr0RW/ZUoaRJQv6ri2j1inAwsDYng2yymZLi9HwUKi7V7lXWYTd1Q/eXjf6vlkoTdthCuINcutso6uiskR7Kb0FTuICJTAOUoyD1cYjOV4GxjR8dDjyj9j0Pnk6qMUOo6xWdEzAhG+xVDgbZlNYhhlmyhKsVZjpn65N348E/M/Y+c+M45w5aVadUUHyxZA8NAdlEj790cJVJSX+MyoBuPWA8+EPwH93xgkwWJKs+61hdkpYuuc/jje5pM6WGWxmUpybJymq7sh9ngOmCnY4ye8+Ll/XIK1BdOjIlQ1g4D5JCLkezKZ3O0Cw8yzRUfHC1fNX66Mfg8OxwoLW0tQhNVJuQlYqSlcFCII1BNqWfnCqE//kxpuKVPsMVmv0TfLHyQMexsCcYXrQzNxcKogo2IANW8guUNmGxEi75OwKykvOkotvG+4UyX6C0GRY1U0ZdkImvucanIL3TCrjrlrmk85mPWZzJsKsvQNmaZQqlU4UulajY76hOqLMpoLCTSZ5s61SV4Xhx30q9gwh12pQmNuKw5IA2pD9cRUBLFLDtIO5+UtncOxposhJ6+Sqd/3k1lX3ZNntGydFkoKWDocigyiltNJyUXq0E6MZd6sBLUlxUbURmmxemIsp0VRn2ZhixlAmkGWTF1Bq1Lj0He6VhCnebdFzY4ShDKkwLozR7RrpFVLPsbgEzBzrDm4qalIyihymdHXKpQ7ZKXTv24w37Dkc5whDri7/SUx9U+1E2DxaAlvPupAAdKp4PSc9ah+/eLAbi3W1d+b0efW1T8jqzjbAd+aCStii5bFIsIL3E8065Hdwt9yLM8YB17md66hREA5vzga4WLOxvphw6tmBmu0wVvEHTga7WSp1OK2tXnTtMkK2kDgzThV/wd+kJsUnN0tHdKi2X8zQmwyCbFJ0rplqh6ZZajMoITWyeJt7Bvid3DtbE929NfUBX39bB85COb2YKXEMng5n/OJ1kkE0IT0rVQl6Fu1VDlyUseMN/kiKzmdFfqui8dLGtLY1W6GjEXQ/lKs4qF+TlKzT1gZ54pwbJ9iidZG0F/sbwhidNisxAOpE/Gzcc4G5Vdg+lYxsOyKajNPdZtn6rxptdalT3Gb49lQOdDEnVCJu+iXcrPui4+eUhMnNzt5YyONIJBplZR5hWF2XGg5nti29rAF8/LIwC1Wt0iQVCNo1Rkbbg247Q1Id69JcUPF+T8RVoQlNfMRdZqvYSiwyyeC8Umsw2783ZQ7u0DaxvRszqD1FVgnIqZJ35V+ujH0ub+9oMCZE27K37ixkclAjRSjERPXwNEkWgHVLmV9cOHu9NV/FU6I5pclwaTb79TzT2plSp1qxyUprWdRwB01FUUxCWChXxXojNQmIlb8CYM7QfBLsTklinbS8RsqlVG1EdkSlhF1fekpbstW5zb2MADxSz1yQ1fXk8DzSEp2A1KJneLMhoorsdG3thNSQd2+txqSzQdybRrB8C56TB18xpWL5a61ZbUq3u7UW3n3Ln3QwpA8vw5oCWfPTwDCRW8oWfLPz+I1ZoAuoTaMwOR7itRGc1MhMhFmTpA7W6Jf3uHV6GrpgnI5CGZ3IVsXm50KGrOeDzd9L5gMx4qNuwsu12xpBFKTpN196xzvybnvjjFqHMwLl82Hl/KbklPCXA5lRy/qXlcQpPSjPw3C/4D4Hbj8Z4XR4hIkkQUt0K5ZVr0vJ+9PVNzKi//WUZpoDmP0QFAWVIIaugS0DLTLTQJKajuTx1OUz0H7aYjdRfA12SZE/PTVVHepWm3tcjr0pYWW+tlDR2SWuR4mE3e3DMmwu1moWMDp2hlQlaKHNGu45jY199GkNtL2VXrVkrV/XZn1qf/Tt71VvflUjg6jpeEoiFiwJpga2XNiCFrlLZvADl61OtQ+hqrzuYJUvCg9epDrJo8l197j/0lTdZb2x9eb7k3rcMMGilKwqco4KChjX9OuKL0pojNp9rcCCpt/5DyBtwKlhnUCPYPFQaqGNBfIGmT+urfwD2qrdpEqc0Om4/VMpXjs0LmPHFMk5akokkhaazx2WFn7UOSstMe0O96WhJpcz1J2d/b/GyHnvDOvtTmv1k2+ad2jzKnx0IVbzI2U8FzDL1tWYDYmxeT58qdd3k7dC2n8o7c9eJRAtR1ZAK68B5uvA/mpVyZGZbBpzmQWweYHEujt2SGOz0+7h2CMAak6JTEQxekOot9sKzrBtb9hq9T2a2vnnVrcidhvA0O1N66kO6/Bu9cGHbr0jtfkoGbhXIpRAehnFty8t17dgSIevCK4bvH/PdBZ3N0HGYSTjVDdaUjmXe+pHQO9556W33XWX8E3QclbFmeVYXYwCpGKS7oerIar0EzZyB4Gi+aw0q9HbLHCmJktSFoyh9nFeXpGA9Gd5qprweZdMp4Hi7izaDoWMA1zfLUetuw4LkijV+kornwfZG7DiCfY9XnvJxty5mmX2PyyizQg8BBo2hy45UtW4DdF5kpk9TcBhypwH8rNytauhbyteLO7JusEYOt0019TAs0qEqF3hJhmjhvEB3o1PAm3SKSizrifdpaSxfM6PsMq6w9wls8OO9XD1YrjQ8ftXzmESHcjXuDNTSmJ5872aHkDcNzdD0h9KKqVgNx/7YgW/L51bQauOuW8ruQf9R6T1SFLvVZSbyNPnhTX/lpkBbSWviPZo6VXrJ4ZO5leUzOO/Z1fmAGjpR3gWRgRK4bh5guWVUN3xNT56CuU/XMPPdX1HF3vb3pjj7j6j+r2HbgdJLc58KUOFrt/itWw1TkGB0YFi7ThpNfflpc4ZddR6jZARZ8d+Tgyukr+feZ3lbl89LEZIWGL517P52J29JUT368m/WTMPoeUTt+wY2dt5ThlEyY1xtau/zqufLZfNSkgwOQ8RA3WYf3N47iM5bY7/R06dLnacbutTA19We58DZipUlsuw8lA1paS13/TR4OotOIMPC4Mjk9tsldt3+LFm8r/CUPvczWLpclGtw+41D31e9j0h+6t2Otdwg7+PeR9Xhl7ODDTHnQsPiJYElPHUnDuodHdrL4IDAOWv0l3r5Sr58DpH4CT/496pbkg3vYh0it+Zo4tvkmwV3W943Ic1Q6JFXpJvxnR2rbmBwJF39A8lhnSoNQXX41Jf+jpm1Hv8d3I2DI2WJxnhWprw5fKUXly7T5V/riffu/GM2AjTL9dW3eR8ZgKUhnXwdB78DDi+xHs92O72rmFxTL+59QQ08DeWdoRYvWZd+TVff3lBIa2MzZ8W/nHiXvXIDCgNReSs1dKuBZ7SjUY2drHJKeb3xZWFyxeG+JZT/lzae77vhKcoyPViwJgUnZCyqjKtEaNxl7H5Ks2JxeGH+M71jx1Xn1DJ72NBxPxMM4cvFWhPStHRZ5sxufIQyVDYXXP7MlbdIWzB4gn3FbD0o8+tW1f8V9LRrh1cFztLOG8CexdiwoccvcYzBb2D7fSWvJJOUyXcsy5UOYDd+9FJFyRtMbpbH2T9kZMHRCLl8aulw3qX8h8DKSPO8dAL0DsJakvCVr1/t/ppx9K+k73OxUJAdiMVRGvlvtvnXTVfZwKcnf/J4tY7/kZfVrofX1AhJB+oz+uLrssukWVb9qxHpFSBjSYZexM7j5Z2hmC/rmY+YL1dpfqoFWsr4G7vUnmfVvhfWdNLVKUkUmT8rOXBzZ+sbazn3kxOpjqPoal1T7RCdYw9bXzkJkdkqNWG1QEOusNnTpjqO4d7nsTyIyq5NKkLhaZg/q6/9kXUcVLrvarVsMo5LzrAZYm+3hNrLklRp5mMa+62ePwOxhepzGczqr1YuIjKvU6cwGcbIdHb0UrOcUvNFs9PY1ggNfoN1X3BYSieXxiixtP0y7GyR8YP+Q5KP0bpPzrBL7TUsieJPnWJ/RGJycp63CdvR3KQrJ0quwMxpis5iLCAJki0DeVeKb8DVBj1tcmNtBymYxToymd2MmS2ewiWZtY1d2NjLFyOzB9kVcK9NLkyu0NI4zH5isdcXvraJxGkTVMc6re3A7odlwGf7fRLosrnW/Di9KoFsNpWBz6U6mqlSMlLzuhI21I5GmZ3p8Sv/Yeg8hr7+6y5Mssui8xQ8L4I8fXrTk1E3H+j85zp82P2Qsfc5qZxhR2ZdmZc0tA58TnOfSVxGyjiS7NHyi9J0oerWoBIJQlMq0fjv2p0swuLmdd6Pkr+8rrKPOSgbj+AFa+wNmv5ItmYtAKkR0IW4l091HZepNjfuO0+5fkMQndfBkaxWuSQ5ztU6llnXztePLYOiHzruk+odqYPC9TlA0lJqYVSPvKoleL9Su4m6NQQ6pxSlt54MYz2IvY9JfYfnRkX9lBEPiBl3JgWpqF5dYF7F6FN8QY7h2Rylo5SKk5VAK5ML5bCokmFKRx27W6oUHE1sgdHdJk0DGjoVWwV7g1RVstcqlUU3MkWsuOY+pcn3KTii2fPKJGpas2VCLZdcejqm0zGViuiVazjxjkgZ2/q2/cVxUdkHYsp/c68QGVYvpOOiuDOr0rOWhU5nUGco17UvHxBX2cMlk5TJ/FK6kAisLlHHNrfsnpuFyPmZLYwKnVi6RKEpSaDNZiPW2iibsCVLboa/wpO0eBEDw+jrA2+vauqFxm7hguUaHLG8nT+u+77OcV7zoxvjxZuArW54WgK5fA0rE5KLz/4UP8KtYjwmbOESUx6ZocgMzpzGxi6LnQUZHbULXO1SbccaxtlUasJX3VaSaXGJkKRp8XdWQblKtOVxKYvajkxqE7ZjSW0SC1doUsPbMujW2yNTYbx96OtFZyvYnKJelUO6HYpmMIRC8HcW3JJBo2zzTwbUEqKiLdEtMhQnq+jTCekpsMLyO0ErV9g7pRpMpNoBQF+vVRZG5CvPC70ySMPbyyIvbfHZoWBJZxZsb5B4LJOznJ5hqZRRkknp1MxMPBnS8aDYt8isKAfeN9uN7HXr/wUYAKd2YDYKPpqfAAAAAElFTkSuQmCC)
+        }
+
+        .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/eHBhY2tldCBlbmQ9InIiPz6wJRTaAAAWHUlEQVR42uxdiXbiWJJ98dACYvGWaWdWZXX1zP9/Rf/HzGR1VVc6vQMSCC0vJu4TSMIGr4Axtg6Vx3bZIF2FbuwRlP/xL7VNB5NLjq/cQLk+aZ8cj7Wr8Goo0kqR/ZcVG8U5GcOc2y8yzhI2E5XKa8TZhDjdqutytgRZ8trstrQTcMMVKIkAKxNxAS7wVfaL4pBvi1/AG9j/WHlGM26AQE9sKE9NNqJ0zEm0Dbi/FtBaOU2IrdfSjZZyPJFZrV3WjhVYC97Dxzz61Kj/FbPRpsMmJXmJsOdjlYxF2FUWK2V2HGimBmlPuS1yW0DZaZLTAjMQPRrcRx8i7w1PyUsOoR+Tsj8GykIsqSA+ZpOQ0M6OAW35wRNYld8mr6vkJc/+MnAL/hUSMJn9Wn7LEHMhqPaPprLMRDNiAXeTdkA1VLB5HXSagu7v4Z2TISdDmkQqGwuzb4ZV1g200Khcv0teh4ID8ve5ELEF4IpOMwW4lCfCqizSl6fyEtFTJjf2F3DLIIb2bYHp9IUHpeGC3/GU+PIpM9B1cUdroDeUvy9nQkHCkxs1ulZJCIbBm5s3CrRW2iF/j3pfldvBs7wYYiYj1zxQk4FJIlFfwPTONdPcd7gl9cdhjp0VdKkRgvLayu+R32O5DUS3P1ZueXBMrU8qDdXgh5r0lTxAa8Oa1mTeybVRc1+3P3PBEneuEySQDHjSpzjkbMQArhBYXsXV6imrWMEnMWaaHbnlyustPhPLJyY65/hG7vrbkGhoPIG4daT8Djf820+uoCnqyMovVJPJjHCFkMaKRUlEvhR1jY+Qezm6gqljZRyquORx8LvD8uSJldnc5/El4F61nnRWDHGjSe1DYUDltoU35q89oSQyiUA8ghbKJ8XF0Nr1kOWZPFNC8tmY5DbHfeUH2uuxcIv2SitFOYF8C3fJC1R0xXm8QridVXKF16XgULUOqrOfXmlKSWiSoYpDEKJ9NteP7yKiFOCyEV5ieLiR8In2uux14HlOKccRywTWZ6OpRlcwTlbEJCsBWovlBKXX+SwKfR7+DBbrZMijCxZnQb7dkgPqV3AcGOGQ4BP5XbHuhUBmF+Sp9glEO3SgJPPk5WrDWQVd+Kr9SbdPwMh3bYnwVE2GeH7V1h0kN16oLAmVAN35cts+8fe10zLRTxVdlET3akCT29a9byw65JaPIMIS/hTFsiIrYr3ijWcuCal1RJ0TODWVCehT9xu5HTP4C7fkVYC21sUhdb+A4+ooi7MrUiwEJ5pngz7uy60UHl8J0angkDpfKtYW87+5R7rBw1Mlv6DyjQItjxgMuM4xrIsSZZhuoRr+FNNtw5GEVTGJWPQUil6JVfekcLKmzqTo+R78L3lG1bPU47OAbjS1mBYdeyo1QVbxjSg9igew/7edLpabJfnECOOJ6d3+pJr7U9EWxMXz6pIQOI+vVR6vHWhehDLlE/l4js7g7Km3fli7O760IdacWgeVkpdL7sDdBMk8EWvn6YwhKH8BY9RQNqMzFZ7DPt2lQ4TGZMypDo7nsYZdYuTZfQqH6CdpP8vLJ3WUofqGf6vB6a6hXBxyUYNTXKCphVLl8jvHgEI11iLRYv1MVUSFcqZu/sBzZDK1q4dIUnQuHKL2/1kFFSDXDPTHF6uUaIba7Yklh2hAXfvdfIdmWGd0cRuQlgvEZd58n7M33DZ1vwosTI1VAQ3fT7ySuiWH2Hz4twHK6U6jXGKdAuvBf0QhVUEoryOwwDF+BIfoh3/B8YSSxPcrA55W+12I9qN3gXIN6+jCjM5rWDcAizgTAtFDSD4ENFIk+9Q+qbyS4t6K75fH7wblEuuJCs94+hxP5VrAQVhYO88H2lJzV4ndXvqjzCrui3LYTRvjcXYI3IX4xuaDCghdQOR37yfr+4BGFD84rAdZVBbx6FIlffWeD7GvowsEG8rD36PWocD1HKBxf9o2il835oY/WW7muz940kdIp25cC1Dtw3uEeinQ1Dyw1FPlSjj6gVzqWwsVrSckYngy4PBHDUgPyqx58DSgkZdqHVYeoFCz3MPRFUPhmg+gEcIWm3p0DViYK8u6dcjaezzQWovV4ndKTYpcSfiT0/GHONeEOudsLLBUEQ/kGzuAbhGqesFPxKRrH6uS2jnDYzK+Is4+8J3HOkNtwmRQ5UJRBHCMUs07wOo7OlCLDp1LmqRjsZqJPxhjIdYMl0IgmpnVAh0JgPQQ0KiT632tql7EPZkM2WZXP2BdTNYFPpUL0xAAqfQ8FgLN5Ir/blM400wwJRGNLz9QfsBjHF1QMjOrBToB0OsAzGVAo7I2OKh72yYdmiT6wPIBszodoTyo1IrilwcH5HiLgYax7bSoVgEj4qzi8EMHPkYrkgBVk0jA6LTq/ouusbOn/HZVv8zGFMUlH8dj6CMNAdfMZACMfptqNnWNOlBQ3K1HT9QkQrzqvfEANcTpsAz7hDwfrOnJqB5rA5hucBdojcq+GtAcD1Q2focok9PUrSNqFZHPJ2CNEtm4Vs3kdcltlu8wi6IWPVIlp8DnHqDg7F1RLbkUHKnuV+gq+X50zoO/VfZYWwBwifPS+VKV3diGqELMZ3es+FF5JKgSf18Od6PJ4kD0fkFetGh+mcq1/3inHKX1Yn6URyG+c9ThBWiZKm/OtKHj3Rxul3q/6uDYokxl7IL1oqaQ+3RiBugqc7mFmvYSaPSmyf2s0iiG4iGb9D0gzOSQf4h8dvCJnfnIfRqqZMxPETgUN8XDyvbQFljruWgLvI/04vTWMeXpmyoEffahle1oQsgh+KxuOc1CrLZa80luRBHSIxSu89RLdGyvxhRotHJU4szJgHc/hCQou8g/7f3GzYM5fhBDAAVKP5Dpf7p1ywBwWM8oAt4pdYgFXQMa/VI7D7Rcb/dE7f8+V95WHPlY9f/i6OczO2rnARRgBd6peafRkD2L8cMhDFfemL1lqq9N3V9U61DdibHBZhieomz3+XE05iTUItdTmna0E8h7OULVxeSG2f3IbCZlV4FuqOae7nxhv7egEkMMhvDMxNcv0U8CHadWhRYFqOj9dwVkRxyhmp9ihMh3NoqEROiBKpt5b6N8wyEKNl7c72bstJCExbabei4A2UGIo5x0AaW5k8ENjAcRA0O1jxFwv3tM+oLyCvuTAaOXF0ATkdC0AO1XpYvCLFm8YxgX4QsVHNGtBr1Sd6URD39w3F/lPAn41VOaBryu75D2eWbciCLE5IZdQ7k19Ufu0oWoojRSN/8Wi3a1fgMLjDOaFngFZAfTLaq2qmzHHEItRLH3m/L2FnvS6VDd/ImqoFXn6sTpq0xkjFfwHGvYUfUc5cmuyLKjg0+qKJ5fhDLFV2Z4ClleQ0bUdv+ZyhLRrmNtyfI8WJkd8Ly1PLNoTBegG63Fsjy+NKL9JoN1RRoAY2kik7JAN6o5W/Afc3rbgtwg9NF/1sHRAtVXCNP4SmwMqhe+rPw0ONc8c0YEUN1wplP7ypN4y8436KIo6EYNnLvwkSaxl8EYw/WOWrDTdCqJpjpBq9msvreKsks+OprY31OkF5oC4mGb/p+cjtYfm+R5IGcD/aqzXf0ZzMYbrWxe0sKP0Lp1qHrfigjOElkempv/U+l4A+3TFsYa0kTO+gWtQXu/ktdF6iG6fHwK7gkfgTK2L6r9RS2ki8Jejq9N/9+2SO51uNEBm1RCTcBlhUKtfS2MKY6v+PuY69pmTOK6Xt1HiNPV1mLDLQzFlXQ5vgAvi7e2KZStczQX43bmJVytcNgRskTiL3ROpm0Dcjub+6IVqOHbRuqXts7ZLFQxX2jvPpRHZxyecxptNmdE80CaUqJpyiXy9YrUITSt355rtrUduKrhkuNgDFf2AqWkPd08oPYnBDyXdY4A5XNEizaNsqI7tpwD01qYmgoZIUWNFX7aAmcBabSAOj7EfHSJATtP7nC2s7IQ8DxGHfeyR1DeNr5BtOhV8p/UKCNIEFyTa1vYW/dhVgY0AiuTqOoznT8PjOHq/SpSaZ96/QTuEzekc0y932xd1TKU7ZSWm+9qE5bcQmFozPvbqbYCxVX4Y0mvy7NMnIzjvrn+rpZdqnDrwe9KDIaG9zistfA77f+Dur8tHSZb2MuC8vX/vmJvL2CsTAwWhaQRoq7iTI4Q6GrNSZZrvvqfxXJtqZbaX+ngv+plf0tlWUj58L9V6+i+ohaRGzFs+n++bgEQN5z6qCnOEofNpPTKxernlQI9m751jZIf1LQFi7B2CmtEjS5MdLEw+j6blfW5Gii1hDEYY+rOX2vseY0a7VzlMoJkJg62D5SVNaSV01x5IAu5htEVFHH789xclVvWiFh+jodpfrfK/pwW5kgJ0E77XlkuUL54Ra+kds5NnhueBqDHZZgJjS6Ov5Zgh5nw6BK2ZZsWlFIU1ojbFkFQ5CK6NhmKaBf5EYyJbN2p11qA8rkKz15dlmcc7JcJHcCbjh0rPlnJ4aJk4AisYzx4HmNYm3xI11kSwCwmBZxox0OKPh3DuwmOFmeh6leVJxg3NPyPzcO9OsoIvEBX1/NWWSyYpii2mzniuDY3sBb+Gs7BYg0jR4yzZQMuiLh5qPyezjPWWj1kBRUom5vv654d/2gDlAiVXw6Xwaw8FZC1VdQjmulozM5Hrdjaov95bOQZ7//xQOCbHHDFI1A2ozOL8vbMdSJC79ussMBkpixEx1aY2kgVBadWr/FETCa6kYd/0svyk5g4FJ2q4ZZ19c4DiELeNFZF7R0nEdVn13g9WifQxXwiFZ6DrYJjfpadQ1mMUbOYqJhsVb8pVgp4Xa5PRrJtcbaaVHyWLJmNQyBG0KfFKwx6LMRa3LbowowLm/c5KGMea7Zdc50KM8l6rUXwiAXYoibJUocYUnlcF2pudkm7az8vIa/wnMcXS/3GhdeSxWb0k0fntmlsuzKcKNJtdqvKL2OBtS7YTMKTEdea3bBJQ29k6ZDF2ghqjyncgYCMRfvx4IfKt7JG0O6dqc5XIE1Gs5BjcUy3dc0O8dPg2zQ2gnWEUU3i1D1YK5yP4ZL0/9rOelfb492cC9rY1VzzQBc/Kh1f8dP8HjX8DZ2jiOfwFMrtnpAmZP+nwRijLS2IAFx1g02upSa+pXVhWKyQWuc3NUWoW5s6SVuKJq5ddLaYQ5Ihmkqi861uYXJaAK065xCQzsSiZsalI67vC3ACJKK0v0GsrcUmbvot+1puP/YyXK1pudJqeAMjC4J6eBJgplVreG2MBNrGo+oiSWth6oVl2+s70ogLTKenwRblUzulcqsr5LXbAVy1IbkCJtckozZGAh22Y2yeK6EXX7wp3uRmt3imIUdnBvMiBxT3BWV8vd0oC0Tc7NSjkoBxPlc5ByJnmOWGzXPFndGudrsCd73tdhNHMoAP5fhs12Bsf9EluQFWQdVGnfDoGisp6yI/9wdiWid2ndXM0gLKmLGuN33qIsLguDcxlkUjkFtyLKLPocB4K1V0ZxybODPiDpQyr13yu1gltXGs38ihp/hUHbG5AHi3ceLOODZM3exj5lUZEnNbqvOFiT5AXcTOZHd4tEo5FejsBFfzANBI8ZkMI5LLPSOovOpR62jTWvENoOygmxxOygwZsVCjs4UlQQsJwZj4Rk3CMmOPmbCdE3JbG3LK3wbKtt9LnvUyOyFwTUJAt8h31Ut0kc3CpVHNI9/Dti445R9kbalZ8A0OAEtJquIELPeqlg/qjq9hDNb+DJUumLr5IdQ24Sd02vlaYwEsvxbQlpsmywwsMTyiKzWu/aV2VPcEjb7v/kAstHsyVyssQEVX94Ri7l2mINQuBFL3Vpw28v/e3ruG2euhoKdeCTTpC1B875qy+wwJ3J/JUOkLjLqabpsj1dyDWSJ24vtcXOEEGK6NrTRVVhDlUaj4ye/1au4/MPbqBkVA9dk1WABXTPJ+V4pRI5bZOcbl1ycjRedWmWUP/fFDSCNvG54SNo9M7xg3fEwu63xm7b4brO0MpuCTDj5XZVacA5bwFBA9lI54DEw55xNstxVrrzbklDq/6NbTysjfNspysXu/1lA2KgkFFrtgIn/EWzxGyaIVcoDttnVeFoj3/2mfI2ensdasHVwm1uzVKqcw5eNUPXr+xBO8auye1g3VUZXCFYj3f5cfoq55V+fyahcdfL1vc2UB8nBjYs3V4wNAT1kcybkZXWpFqlMrvZVnqvsLNZwdXIVqbQxRRRQcz3WWA+WfmCT2lATm0+JEhWuO21hbiFroRkwbs8t9d8tePp5b7jtD+RkJzKcH5KwXQ4rri5RxKsERtpRH7ixI+HanJGjrYe8V66rnZTm0a/auNrGueor16BIF1B2u1nbKCbWO0LsROvw2F7CrIianPe334Ch43fnd8paXN7qAvYihoAYjwyJabMexkSa7LAduZPiDkDQbv60ReogvOy3E5Dpf5+IYMLpCdJPHV8+WnpfE8nM1PhcrUve+cd0lxayBfwBxcNnl2kZHrJwuSOiYOl/m9jeqYshzH24Epi+9QK2+VArSyNx8Rz/PralyXk/vN1nMz/B06xcT2bxf5wv5vVu722yt+xmc7BdP4X8p0LYaBJtYTTqxgwZmQVQi4N48QN2fAD26sHNfsq3jCgxgwiJTVZuEO4vJ3RixWSd9laekXqpvVpIGzFWec4z92RRMsKuylAs5da9LTpPclkmGFIcsinsbKru0R2IyNTuoxxAdc6sYXM5wfI3+DznnFZ3tyvKtZFMMKJ6UpwwqsV25UijPPtDyEy9CRRr2lYzxMG7cLIFRIc+ZaDw/QAeJ277dU24y+NZ2WI6tIV/ZGa4ysW1pJOJBrJojLPj0Owillm0zckli/Mk9aI4wcG6CxRjKhrbXjLhVdCKz2o4W9nvIW7vB7U14bLs9JiFC+HZGzmrrKyj/419rkR07Pl+XM4TvloWINZIM4N3EQ6y6lOu0I8xWZKXMJmaJ64GJlQE3sWYQBfYLz0RgTYYGY4hu1lSzui6gZ9FFB6uce1/va5Yvpi2DUoboD0PLdP4yrDUGNWMjVVu0nFDEXB/rnU9HWeXgh5puRFmXdbTWmhioRySGk1CcGgoOkUS/O2eDNDu+ahyJiYKJ7SbTgjsaxWK0HOcpil9NjlKrqcjnajYdCm168oWGO4cBGPISxev48ilaO2z31vDc1J26iIlS6YvGgzMC+lpv2GDdxUcYbaBygTvDjnjnEjvRirLrubIFO2KomBfe8DFL3MvJgg55t2Ri/+XaCMRiOhRZitB2rJAmCy7ugfy7lNSsmwfWiqCTswRN2huIA25G3aO0Mk3R4J9E7A6xAM0ujUJXnqipW7xZSKIFvcLnMYph6f/ADBj0SNlWHU7HmOlgozEbqyjcaDkdnvp8LC+OdbFHir0WNVpYtyOOu1iBtydLvkQdm2m2Xl55YrDFajTr3jFqjd3uWwD0HH1ndvvfWEjBJVc8mrZxm1rMA7tCg4rH3xKCxYSWjkQpKMWOPAO9COHI7bQzBTBMII1Z7OI0XuVY+TcF9DyrJCnbpWmmmOXqNDFi1PUxqkooW+xfCHvDgq6niBdWIMQ2hyoT4c0nJp9goI7QQjZFdkbnr3/8vwADAFfVUmZlvyzIAAAAAElFTkSuQmCC)
+        }
+
+        .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+qphjlgzHSTFFhhRjzJDBwxhJhkku1jmIAqDEhakmRJh6qmliI3HCbCJIHTtppo95NlNDBl+xC1riMkyQxstpFniBOWZ4gglyzDFNnDRJMnbWMCgASoWHHODHR4Jm6gjTTCNtdFJPG2sJUsV6MlQVu6AVIEuaU8yQYYQzTBFjjBj9xBkgTsymBwcFQHEFCRAkRCv1zJFlA42M8Ea200UPfjxU6UMqgAxzHGGevUxwilniDDPELMlKDwMFQOH5gGoCQA89dLGGetaxlimyXEWo2MUTABJ8k0cZ5BlyQIIMcVKVFwcKgPzzAJ7FjjYeGtlIijvYgpde6mklXOwCilGaLHs4y094gWNMcr6xM1cZDY4KgHzzUYOHTiJsYjNr2MV6pqkh9FIkSOnLkmGBGFOMM805nuMYPyp2odygAMgPH510EGKO3ewgwg66qMaPj4BGT5SxLDmypIkxyl4GOM0RBjlJqtgFWy0FgNt20UYHV9FGJyFSrCOMl5BO+wqTI0GKJIMM8xwnGaGfAcaZL3bBVkYB4I4WmthNJ+u5nFrCtOInUDk/nhhkmCNOgnnO8hxPcZKTzJIodrGWRwHgRJAaNnE1Hm6ihU6iRAkWu1BSRLOMMcMUgzzKtxgudnGWpgBYnXY20MsmethGLx7ail2gPMoQJ8IEE9STZRKIEiDGOCHqGWSaDjYzyWlqCXKGBM3EmSZIFREWiNFEkBmq6VysBZklSS+zDFFHFbOAlxRREiRoJlrsH9gVA+xjmj6e4glGi12Yi1MArEwTnbwBDzvYSTutZftlnaGaKUbwEWKOGFlSi8NxU8RI4yFEjiwBEoyRpo1+ztFBnH5yVONjnhmCRBhmhjbWM80ADYQ4S5xW5pkgQIhq4sSpI8g8VTTjx7c45rCbGBM0EGEeL37SNDDHLBvYCsSpwks19UyTppsUIYIkFitWG8vmc89xmP2cYZrn+GkpBoECYDka6GATWTy8lfVcj48QgWIX6qLSJAkQY54I8wxSxRyn8FDFKDO0EGWQARoY5RBBqhhnFg9Z4sSYZoEk8cU9eRa/Hx5CpMjgz2tHmPN7D9OGhxQhIEwdkyRYQ5wqQsTpoZp5OthEkAhhsgSoIYIfDz6i1ODHg78EZ6no40EOM8BZ9jNT7MK8TAFg4mMt9XRzHZfxJlJ4S+7Kc751epIAUeYZwUeKI8SIcpIBmpjhJBHG2UOayOIXr5Y5MvjLvCuLnzp85AjRTAMhfARopo0AHqqJsIYQPjZTQ46aEmqDOcT32M8ZDpTGeEQFwOvx0kSGjazjbWygm43FLhCQIUsCSDNDjBlmgARDjDLIIWpZwxB7CBJkkDRBxopd4CJrJUCK2+kmQy/dBAgTIEgEPz6q8BAmWLRRlMN8np8wzjCjLpyDDigAXsmHnwbWcSdJbuAK6opWkiQQXHwiTzLOBHFOkWaSM4xzinMslMY1pIxU0cRW6qmmmxAbaaeNNoJ48RLAU/AHh36+w/c5zByTxbobUwC8yEOQejbRxl10sLPgX4YM5+vbk8QJEOdZcmykn/s4yxhnCZBkkqniXi8qRgAvddTQwCbWE6WWdVSzhhC1i4HgKdiXc5AH+RwvkCZe+MFGCgCAEGl6uYV3cSuTNBbsxvD8R5fFwxSnmGeU4wzxEEGGOUOaIAFSpO2cqqKgvPQQZAd1bKeZZtpooo4wfnwF+JKe71q8h3/gYRbIFTLkFQD1NPBedrKNrXgJkCtYoZLsI8wh9pFmgoOcZYIsWTJQ2C+BAJ7FEZvnr/0B6ujhUtZwFbcW5Pg5kowzwNN8loMFOeLiYZ0q3wDwcDUz/Bw3s4maAg7SOcpxHiTISY7gZ4oRMmRJlnWdfCXyEcRPkCg1NPFWNnJD3udZzLLASU5yP19lNs/HAmwOgHezjfdRTRd1eT31c0xzmjg9nORBDnOCcXIM4ydOAjd+A1II9VRRTwtVtLCNrVxNR94eFdMMs5cn+D4H8nSEl9gXAE1s5Eq2cCNdtOb1SMc4QZx9DPEM80SIMcx05c0pYx0fDbSwjhbW0kkrb8/LlC5ZxjnAoxzjn/J5b2hTAFRzBe9kNxF6acrjPDxHeJwThPkpp1lgjDgLeTuWFI+HCDXUcQubqKeDNXS7/q2aY4xvc5wfcsLlPS+yIwACpNnNHbyZnXmacy9GmIM8Tz/HOc0hzhJhLi9HklJzvjNyI2u5jEvpop1GGlzcf5oZ7ucnPMtTLu51UeUHQB3t3Ek917PL9Sm1c8ywwBEG+TeiHOQA51w+gpSTatpooZNermc9ndRR7dq+J9nP3fyUg+5OOVLZARCml/dwBXe6furPM8Mkz3GIKZ5kLF83aFKmNtLNOtrZzvV0u9apbJYD/Cvf56h7U5BVbgC0spEd3MxbXb0dm2WcfSQZ4jQn2ccZddIRgzbexeV0sp0eIq7sMc5DfI3H6Cfpxu4qMwBq2cr7+CD11LqyvxwJRpkmxw94mntI4XXn4xcrRLiFG1hPO2tpduF+YJLH+CpPMuT8TqDSAiBAkHo+wIfY5srzV4Y5phjnCPfxI0bUiCcOdPEBbqKLdhocP5SOsJ+/ZC8TzhoJKykAfAS5niv5GXY73vH5yZ9THOQR9vMCz+uKL655O7/IG2gh6PBu4BTP8L/YT3L153HlBECIHdzEb9PqyjiuUQ7wI/ro4wgx1F9P3OTBg4er+XVud1gzkOMQ9/MZjq9+B47lHPxxTZQP8z0myToqzvk/+/kKH2I7NUWcMEIqn48amrmZw46+rRkWeJRfWO0Dr/PTpfh3AD28hSv4eaKOO/kc4x4e4AVSTDLvZj6JXISPLhp4B79D06r3kWGQx/g8/7byt5b7I0CId/JrrKfJUX1/hoPs51kepp9xNexJwdWyngh38eFV7yHBAT7DP690QZLyDoAdfIA7uNTBHpKkeZzHeJjjjKvzrhRVB5ezjl/gmlW+v497+CYPr+Qt5RwA7+eX2EXzKt+d5kmGeY45HuUok04KIuKi3VzGdXxoVQ2FcfbxRb5BbLlvKM8AaKGX2/ggm1d94Id4hrsZZJRkuaziJhZp4d3s4m1csor3jvAVvsVPl/ficmwF2MZf8tAqD5jlKP/KZ7mKFuc/uUgeeXgvX+PoqloGfsLPLW+aG+etAIUNgCZu4u5VHmyB5/gKP5PnGYBE3PQ+vs3BVXzbJ/jIcia8Ka8A2MhHeWpVBxqkj//He10aGyBSSG/hOxxbxbf+02xc6im7fALAww7+DydXfIgsE+zhN/hZB+2sIsX2Zu5lgMwKv/3f51rzgvXlEgABruB7TK745F9gH3/GtU4/fZEScBMPMb3C3q57eKepPaEcAiBAmNt4fsUn/zxH+AY7aS2F5QdEXODjQ5wivaIz4RS/cvEu7aUfAF528Wn6Vnzzc4rfZQ1deHX6SwXx08l/XtGZkGWcT15sd6UfAB/kJ0yt8LZnkL/l7S7OxyZSSqq5kYdXdEbM8uXX31VpB0CIj3OG1Ap3+jh30UbA7U9dpGR42MgHVnRWzPP3r7ej0g0AL7v4G0ZWtLs43+D3uCaPc/6LlAovb+YbKzg7EnzqtTsp1QCo5k6+zdwKdpXlGP+dbdTk7xMXKTEb+PcruEjGufXVcxCVZgA081EeJ7mCHU3xNf6dq/P/ipSHO/jess+TfdS98s2lGACd/M8Vdvg5yX/ics3eI5baxKcZW+a58nuvvEcuvQBYy+dYWMEuznIfHyrM5yxSovz8KvuWdb7MvnL+jFILgHV8cQVvn+cH/BIbC/Upi5SwN/Hkss6aX72wkry0AqCdz67gzRP8HVsL+QmLlLQOniGx5HnzApe//JZSCoAw/23Zb0xyjE/QUdjPV6TEVfFNYkuePXe+PCC+lALgdo4v820pHuKXaSz0pyucn8TJgw8fXjx4F/97/m8v/v38dg8+Avhg8d9f/vPy6wq2Qrw1Avw5s0v0nP0sbS++3HkAuLXyaYRr2LDM197Ll/jJ8uc9kxXwkAM8BMngIUCG1AXzJEeoIUENPXgZYpoWQkxRTS2TxAgRJssUaTYCJ1nHek7xLFWsI80sUbxk8DNFgBBTLJDFS5LpV18LZNVSfJxT/Nmrm/te4T9yH99x64BuBcB13LLMV/4jn2evu6ukWyzMBjwE2EQVGdqIMMgALbQyhI9dVDHE5WzlKAG6gWnSBKkixzjT1BFljGbWMYaXJgKkyRDAR4YkWbzMMUSOCAnmCOAjR5hR6uminwQ9eBgnS5pqwuzlCYJ0Ms48U8xQTYozQJoYXkZIk2VGYbGEFF9mHR8metFXBN2cG8OtAFjLlmW97q/4v5xwb330ChemhSj1eMiRJUct1TRTRztb8JCmhRogBdRThYcIXtKk8OEnDYTxkKaKAD148ANZcou37VmyePCSwYePpovezPeSw3PBE5+XDF58tC/eP/bgIYcX6OUWcgRIkCNBgipyjOInwzxhjpIiw8OcopoBTuJhZvF+RV4pwZ9yu3FC0S68bq1/4U4A1LB7Wauk/Rmf46wrR6xE53+pb6CTJhoJ0EgjdUSoI0IIyOHHRwA/IaIrfIB7cXDVy/Mpvvh/5ztgXfxZ/rUzMHoveN/5v51/d+h11nZagwfI4mU7OXK8nTg+4iwASXyM0884HoaZ4TTHmNIU78AUx43TgV1CBwPuHMqdAHgHNy75mn6+wGeZcOV4laKHGia4nF7m2cQ6wtTSRpggVfgJ48OLr6wr2s6X3QuL89q8dpB3hjgwS5IJzjHNGYaYYI5jTHPG2nWevspldF106w7Wl1IA+HnjEhWAGZ7mS3ydWReOVs7aaaCDGjpoYYYAu+ling7qSTlcHq18+YgAEaCHK4AkMeZIcoJJDnKGQYaYZIKF4hazwO7hY4YA2MRaHnHnQG4EwHW8wbifGI/yBX5A3IVjlRsvQfxsZzNJrqWZGtqopZFq4rDqdZEqWZBGGoENwK3MMsEYE5zkPh4odtEKKMaQYWt4OVOGL48bAbCdXsPWDI/yFzxExoUjlY8oQTroZSs9+LiS7SRftZjJxWt55UV11NENQJbNPM10kctTSCMvVde+HtfaAZwHgIdO4/w9A3yDBx0fpRx48OGhDT8b2UkH69nAJs1t5Aov13Izdxe7GAV0mhlDb4Aat9oBnAdAMzdQf9GtOZ7kPsfHKA8eWnkTNxJlK9tXtTikXFwtt1kVAAcYNQRAI63Gh4Rlcx4Am4zTd85wv1v1lSXPyw7+Ws/1eVLFlYQtqgo8ypRh6w4udScAnK+z1027YetBDjg+Qrmo4a06/fOonZuLXYQCeoFBw9aAecWg5XMeALXGu4j7edrxEcqFV8/7eVXLe4pdhIIyBUCLW+tjOw+A7YYaAKh7nd5hlWob7y12ESpamLcUuwgFNUH6otvCbrUiOQ2AEFcYpvGeZa81T21+WrSAaZ7V0lbW/SJXJmMYKRF2azi900rABNWGX8kkw9YM92jkxpJY0SDLMCEghp96QnhJkcJLmEHGqGWK4/gJc5o5ekkwSSNrCBJnnjQRPJwlzVr66GMzcY4RooksCbIE6aWLDNM004CXOB7aqWEGPzWLFxNT67VTYd7N31nTo2QPJy46xM7jVr9RpwHQYfzSn7Wo73+IxjxfnTJ4iZGlFg8LZIgyzQH8ZDhIjAZGGaOLEfqIkuYYWTYR4SwjhPCSZJ4sIdLE8BNggjg1pEgSJIqHNBly+PAwT45q5pkjCszip4oMKXL4iNDCAvNE8JElC1ThJ42HEFFSpAjRTC8NzBFkHQEgio8uqvBTjY+wg5gM836+ak0AxA2PABgfvFfAaQBcZSxIzKLuv13scnmP8wwQ5hxDhJnmOODlBYapJcIESaqYZhQfHkZJEGaWOBGSzOMnSwJ4Gp/xNzC6RAmmXucdp5ZR8mqqSeKjEQ9ZQkD3YhTkaKedBL3cRJqosQXptfzssmgoech4djbQ4MbISacBkDJe9Y4z7nD/5aKa3cucEeG1MmSZxkcDsxwkQY4DTBGgjzGqGeIcPhKM48XDyBL7Oj/RyosnSapIp8v8Yjle/oIeeun/gkRJ0cDXyRKihVpy1BJmDV0000HU2K+klis4YMk9wFnj2ROhthQCIGoMgD7GHO6/XNSyeUUPALNMMsMsMU6RYIKT5OhkYjEADlfwjElJJoBZzrzq31vpooU2NvAfDGNLPNzJMebyWsJSMWIc+xBc1gwcS3IaAFcYmyNS1oznrjEOiDovQZB+ThFnjKMMMsgYSYZIMWV82rPDyOLdTQ11/NZFX+XlfXzGkgAwnzseF5rwcR4A3cYeSfPWTPrUzXbD1iTPMcleIjzNE8wwx5wln8vKzXO/MQC207Bk3UVlSBsfdYLudDtzGgB1xjX9Ji25AwhyOZ0X3ZrjKB/hqFWDWVcvw7PMGleJ3spJK+6Y0iQNW2vc6Xbu7DbCw7jhV5Gz4tcE0M11hh6PCzzEHp3+yxbn28b7o9ssWUd6zhgASXda2JwFgJ+thlbdBeN4pkrSZJi+CabYW7CSVIIY/2Lc/m632sBLnN/4eO11p9eJ04oEU3+khDVj4lvpMWyNsb9gJakEKfYZ7x3b3JsQq6RljG1Brcuodl4GZwGQ4jFDIdOWrP5TxS5DDQAMMVywslSGKQ4ZK8But2LYddIYgxPufKucBUDA2NCXsqQOoJMdhs8xxQl3pm6wSIr7jF2Y7rBiYdmQsYndpRo2ZwGQodPwnDLrTktlyVvPZsPWfu61pOeae5L8rbECbL0VDwE540jaqDtVoc5O0SwJQ33tnCVDgduNN6RxrYW0YjkOGwPAx3pj83NlSBnPzjlm3DiIswCoMq5bs9aKqa+9bDWOzT7N0YKVpXLkOGa8b3oXawtVlKLJFeLO0ekdQMSwh8aX1zGvYNu4xvAYlOSwRUOi3fQtYxXyzWwsWEmKxzSdbsid2SecBUDS2BY5b8UjwCZjc8wZnixYSSrL3cYe/1Er7i5Nj0EJdwaMOW0FMAWAHc2AEePw1X6eKFhJKkvfEitJbrUgAkwTf866M9TeaU9AUwDUWtFls97YGWrUmgHR7ttrvALeyaUFK0mxmDpE+9xZ2dtZACwYf0UZC/oBBGg33AEkOWTFY1B+fJVzhq2XVnwtgMd4dnW48/M7vQPIGZsBK/8RYD1XGz7DYxoF4MBDxurTIBsqvJ9JwNi/NGwcMblszj5C87trLeivdSnrDFsP8VTBSlJ54swYb4I3VXgrU9I4AdwcM270hXDaCpAy/ooq//b3RmMATFsydUW+/BV9hq1v5NqClaQ4Lr44KEww4EY/AaePAHHjlB/metxKkDUEYJLjlkyIki/30m/Y2mXsgl3+2o0dnltY48ZBnAVAjpCxHaDb0d5L3yXGGoAzHCxgWSpRwliL5K3wMYEjxvF+w8uaoH1JTgcDDRlr+l1pqChhN7HeEID38HABy1KZnjLOpHSJO1fBEtVsXGrOpcdLp1OCTRoDoNKfgHcYezosuDNcw2o/Nl7nrudthSpIETQZ6wCi7qwO6LQhpd5YE9le0WO2/Kwxrn08Y9FClvmyj8OGrY1cX7CSFF7GWINUEqMBc8wYC2lKsPLXu8QN6Kim/nZsfoknXfNIjPIWMV5epo3dpJbN6R3AvcbliaYqeiqMW41TgZ5msGAlqWTPG+dT2sx7C1aSQus2PmDOG/sJLpvTADB3dW0wZli5u8n4FPaApgJ1xcPsMWxt4U0FK0mhtRrvoM0zBi6b0wBoN65P0uVOd8WSVEWHsZXjWU0F6orTFyws+nrq3RkXX4ICxho0rzt9TJwGwBgJw9bZil0e3MNVxsEYWY5X9ONPIY0YP8nOir0HSBl/7pHSuAMYN3bVuNQ4nKGc+Xir8fp/1oKRkIVyyNgheC3vK1hJCusy41gal5qYnQZAtXFaht0VW0fr5Ubj482Pl7hxleV7lAcMWwNsqdDmVvMtvkud7JwGwILxDqC2QusAPLRxpeFXkOB7agNwzewSYdrMpgKVpLAGDFf5SbfmmnYaADlOG5IqUqGLgwWMS4FBiJj6ALgmR79xlclWbitUUQoqYPgO1bh1aXU+pUKNYR/mOU3K2buM0faMWgBcdZBHDVvr+dmClaSQ0oYza6BU7gBgYomFHCuPhx5uM/ZweEQB4Ko+fmzY6qWrIqcH22qYbG7EreXmnAfACeP0zZXYRpsjzEbDJxfnh1oLwFUpnjc+BDTw8UIVpYBChn4ATW4NhXYeAAvGO4BKnLXNz+XG7k+DHFEjoMuO8APD1hC3015hbQEhYy1SrVvjbJyfoJPGdVyjFRgBHdxu/LIdrtjuT8UzwHeN22v4gwqrdm2h3bB1tlT6AcCgcYWSTuOkBuXIzy5uMC4H/qAFU6EVWpYjxq+8n1/jpoq6B/AYq5lPcNKdwzgPgGHj9a6ZesdHKC3d3GXI5hyDPGDBdOiFN7zEPYCXP6+oqkDTQyYMuzMY2I0AOGZM5nSFTYvp5RrjANQce9QFKC8G+fslXnEVH66gVqdrjDNqRoi4cxjnARA1rI0LayroVwLQzE7jEI0Mj2sisDw5vOQ0mB/jFypmotBG4yNAv1vtTM4DYMxYB7DOOGlGufFyGbcZB2mOs1ctAHkyyp8s+Zo/5r/QS4gAvjKvfq429vafNE6WugLOhxTMc8awtaGiRgNs5zfZYtg+z1NqAsybBX7IvHEtZqjiw9zIMZ7jAAO8UMa/i7CxFsC1B2s3xhQdYOqiVX3+CpoWtItf5dYlaprvcSuZ5XVM8gd8eonfQJSruIJ3MsYox5jkFMc4xSRjxubqUhPgesOlc96tNgB3AiBhzNlKeSZr5zd4nzGVE/yQrxsnSBFnEnyVj7J2iQjw4SNIPevZSYYkMfoY5hCnOUY/MeaND62lIcWC4accd2/RPTcC4ByzhtO8EmYFbGU7H+KOJcIswXOqAMyrHJN8lLuX9a314MMHRGigixRvJc4880xzhsOc4DDn3GpKy4MOY+W5iyV3IwCeZ9SwROY2eoy1BKXLw07i3MJWumjnkiVrM+b4dkHKZbd7+Qd+foUPll5CF1yI0swwwxRzzDLIEF/nObcL6dha44SzHvd6PboRAObR2utZW1YB4KeNGtq5lEu4mhRbaFnW+yb4Qgl+kSpPhk+ylWsc7MFP4wWnV5I30c8c04zQz37G3Rpn58gGYzv/aePC4SviRgDEjHUANdS6cIz8C9DEVqro5XpaaGTdimovUjzA5/NWNrnQCT7OPy0zlpcWfGl1oSyDHGKE55kjwQjTnGK0SN26W4y9a45y2q0DuREAaeOA4DbWu3CMfNpIJxG2sY43ECW6qp4LL/APJfxEWWke4A/5pDtr413AS/dLve+ynGOc/ZzmGGeJM00/cwWb5znEJcbmzhH3WjTcmVrQ1CupruRmbAuSIUOYbtawnhxvZztN1DmYvmyKfzZOXClu+xwh/sC1u4DX8tJFF5eRZYZxYgzyGKcYZogZZomTymsPgy1cb3gEyLg524Q7ATBFtuT7XXmpIkA9zVwJDHMJb+ZqVzoqJ/guXzHeBYn7/jceftc4ZNYNXuqpBy7nZsaZYISzDDDMGOcYZorpJebDWJ1bjbNp97m56rY7ATDKvGF68DC+Ii6S4aGaMD42s55OttDJW1wNqxT38xe6/S+CTzPPHxrnzndTkA462L74tzlOc5IznOAMA8wxy4BrA9+C3GpscdrLcVeOA7gVAOPMGAKggw63pjBcAR8BAoRp5wauZZ430eL6UyNkeIxPcND1/cpyfJ6j/C1tRZh4LsI2tr30tyH6+BTDnGOaDClSpFd9yfNyOd3GS5R5MZ6Vyjn485KN3Gd42V7e6GKBTTx48FJNB2F289v8I/voY4gcKUc/6MX+ZAv4s8nrq+NPSJHJy+935X9G2McX+GXeSBg/fnz48KxoopIWvkTc+J276+UXOy+wO3cAY8aeAOvYySOuHMcsSgNRNrCe95NjC3V48S5++C6to/IqT/MRns3LnmW5pvkkX+S3+FixCwJAM01s5+dJESPOJAcY5WGG2LfMevsQ7+BGY4fzZzjhTlHPc+fEmDZWS9RfcLPkviA9dJGlkRvZQAcb8ROBvA9CyvIQH+OAlgAtuiT9/BF/w228k1uKXJbz96B+qqgBetlKijuIcY4+TjPCGfqYNFwub+MueowPAPdz1M0CuxMAOUxdEz15aa6p5lqS3Mw62mkBqukkhL9ArRGHeYi/5pDx55bCmWWWL/MdOogSYAvb2cjl1BV5lkAvYcLUkuNSkiRIMEw/oxxgnGHGiDHG3EtT6jXw29zKpcbRM6N8i0k3i+jWrbF5GqzLuI3vuXKcKrro5Aqa2cwOUnRRU/Ahx1nu5W4edK83lrgiRmzxd/IojbSylia6iRBlM41cYuxbl18e/PipBtrZTpJ3kSROghRHGWIffezgKlq4ltolvsvHmXZ3kj2Pk0vYBfG6k89w7UVfmOGfL6y6WLFqqmhhN810cg11dCyxKnG+JHmGp0nyFU5q4s8yECRMgBBd1LGbnXRTTy11hEtm/uAscUaZppnOZbw6xcf4+wtnnHB+A+pWAPj4BL9veOkAv853VnyAZnzsoJ7LaKKHrdQQXWJGmPxIs49J+tnHYfYS0MJfZaiGNpqI0kgvPWykhTU0l9V0NSl+xEfov/CfnAeAW48AmSVuiLv4Iw4uqwNDlDAR6qhlBzuAq6mjjeqi9DQ8xwSHmeMEjzDOsE78MjbL7OL3L0Aj7TTQQTONtNNNDx00lngYZOnjy+7POO1e89ghnn+pn9Tr2cYf8nsMXGRrGD8b8bGBK2mgjmYa2FSU2/wsC8zRxzFyPMo5niTm3vwrUgJSr4jyCN2sYw0ddNJKF5eV6JL2c/wLD7nf5uReADzNd40BEOAuFvgb9l/wbx6qaFm82jdxHSE2G2dDz58MSXyMMcIpTjPAMxwEXfEtMMcRjiz+v4creT9N9BAiSAtRGkomDn7Il9yt/z/PrToAgA/yd0t+XHv5XU4zSZYquminhZtYQw0birKCUIYEOYbJ8CwTRHmcfZxjWFd8oZZrWc8uthOligBBoviLFAdpnuYXOfzaDaVTCQiwlU/xjmW8bT8/JE4vu+gil4f++UvJkiXOPHOc4ATwTfo5iocq4hW2jpE45aOaWlpopYPdtHDtYrOzb3HGwUJI81N+k2deb1NpBQC8h2/lqdOtG3JkiOPnKKMc5zDHedzNkdVS4eqIcAnb6KaZbjpopp4qvIt9/fPVsJjhp/w+D7/+xlILgE18hrc52GE+ZTjNs/yYCC+wj1EyuPH5iW08QJB2OulhLWvZTBMR6ggTwpuHtqrH+K/828U2lloA+LiZHznYYX5M8C0O8zRZhhggR4a0Tn1xxIMXH158+AjTymbWsY1edri8DsZ9/A8evfiUI6UWAFDDb/CnDnbpjhQexhhhH9/lBF4GiTMLZHXiSx54CBIgRIAqLuMKtnMVXY4rDMe4hy+yxzSOsPQCAHr4J65zsNPVi3OK49TSxA84xAFmmCmzBaGk/PmoIUotISI00MYbaGXnKiaafZavcS9HzC3/pRgAHnbzoFurly9Lhj0MMcwBTnOYIFUMMKUluqQE+Gmnhm6aaaCWWtaxmw1LvGeOvTzLPTyzdBV1KQYAwHv4lwKMvRpngPtJM8LTjDDLGEnd4kvJChCmlcvZRhNdRAnRRZQmQuTI4QVi9LGH+zjGGcaWs8tSDQD4RT5Fg4NdX8wsCbI8xQmmeIFRniBLRpNySBmpopo6qgnSRQPbqSdDhjgT9DPIkZX09y/dAIBf5ndcXBFgghjDDLKf03h4iqO6xZeKUE81WbIsrGYNolIOALiDX+cGB6sDzzPBCGnCHOY5+jnJEGd04ou8qLQDALbwK7yXnhXtNM0Cw8wxxyMc51nmaeEYw+qkK/JqpR4AAB/gN+mh2/jiHHG8TDHBCKMM8CD7SV906LCIAOURAAA/x0foop6aV40UyJImSYZBnqGaRzjJ3iIsISJSpsolAAB6+AB3soZGgotvXGCAg+whxkmewceQGvFEVqKcAsDz0iopl3IJOeYYZIIMY2RIkUVDc0RWqMgBICLlrdQX9RaRPFIAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFhMASBiMQWAiMUUACIWUwCIWEwBIGIxBYCIxRQAIhZTAIhYTAEgYjEFgIjFFAAiFlMAiFjs/wNLH1MvmlMLTwAAAABJRU5ErkJggg==)
+        }
+
+        .call[calltype='0'] i {
+            background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuZjM1NGVmYywgMjAyMy8xMS8wOS0xMjo0MDoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjQgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNC0wMi0wM1QwMDo1OTo0OCswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjQtMDItMDNUMDE6MDE6MDErMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjQtMDItMDNUMDE6MDE6MDErMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmViMGNiNGVkLTQ0ZGMtOTQ0OC1iZDdkLTUxNzJmMTQzOTc5ZSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDplYjBjYjRlZC00NGRjLTk0NDgtYmQ3ZC01MTcyZjE0Mzk3OWUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplYjBjYjRlZC00NGRjLTk0NDgtYmQ3ZC01MTcyZjE0Mzk3OWUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmViMGNiNGVkLTQ0ZGMtOTQ0OC1iZDdkLTUxNzJmMTQzOTc5ZSIgc3RFdnQ6d2hlbj0iMjAyNC0wMi0wM1QwMDo1OTo0OCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjQgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgboeeUAAB/DSURBVHic7d172Lb5XOj/98PsjLE3ZER2ISES0VpRPxZKtISQKGWTbTr8WCFRUlIpK9n9kGyTbCKxRCtaIZGRTbSyyS6MXXYzo5l51h/fx2+2a+aZmeu+zuu6vq/XcdzH8/DHeX/uuZ/7Ot/3eZ3n97tv//79AQBzucDSAwAA6ycAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJnTIOj7Jvn371vFpDsZh1dWqK1eXrY6prnTg49LVUdWFqiMO/P2wJYYE1mZ/9fUDH8cf+Phy9cnqY9VHq08f+N8fOvAnrMX+/fv39Pj79voT1OIBcNnqRtV3Hvi4bvUd1aFLDgVsleOq91bvq95fHVu9dcmB2H0C4Lz7T9Xtqu+rrl1dfIkhgJ30kerd1d9Vrz3wd1gpAXDuHFXdv7p1ddXqiuv6xMC0/qV6V/VH1WsWnoUdIgAOzoWrB1Y/1Tjxe+8eWLfPVe+onla9auFZ2AEC4OwdUT248Vv/5XLiB5b3lcYVgcdUf73sKGwzAXDWDmvc2PfEA39ecNWfAOB8OqF6XvW46hMLz8IWEgBndvnqEdXP5cQPbL5PVL9U/Wn1tYVnYYsIgNO7efW71XVWdUCANXlW9fjG2gJwjgTAcJHG+/y/XB15vgcCWMbbq0dVb1h6EDafABgr9D25+onVTAOwqC9Uj66euvQgbLa9Pj9v+l4AV6hekJM/sDsuWT2lcUUTFrPJVwCuUf1hdZPVTgOwEfZXT6oeXp2y8CxsoFnfArhu9fwDfwLsqv2NhYMeXJ288CxsmBnfArhS4zd/J39g1+1rPNL8m0sPwnw2LQCObqyn/d1LDwKwJheoHlI9shEEsBab9BbAhaqXVLfd22kANtL+6n7VMw/8ncnNcg/AodVvVA/d82HO2f7Ge3EnpcZhFoe0GSuLfrG6ffWmpQdhebMEwN2qpze2812nk6qPV59tPJv7ieq46qvV19u8t0iA1dvXeO25SGOp8ctUl6qOOfD3dXtbdYfqUwt8bjbIDAHwndXLq6vv+SCneteBj2MbK3O9v7GDF0CNELh+dcPqeo37kr51jZ//WdV983jg1Pb8/Lx///49/zgbF65e2bjsvtcfJzc247h39e0r+w8I7LoLVjdrLNzzztbzerW/+sl1fHFsrj0/Ny8cAD/Ren6QXlLdrnGJD+C8ukbjmf33tfevWx9tLIXOpHY5AI6pPtLe/gC9v7prdfFVf2OAqV29ekL1H+3ta9jvr+sLYvPsagAcWj2xvf3BeVZ1lb35tgB0WHXL9vZqwJcabz8woV0NgGtVJ7Q3PzBfrR7UWFcAYK9drnEj815FwP9Y35fCJtnVAPjmQher/vhM474Cz+8D63RI9YzGo8Wrfl37fPXD6/tS2BS7GABXaTxyt+ofkk9WP7Kn3w2As/d7jSeOVv369opGZDCRXQyApzeebV11Id95b78VAAfl6e3N1c1brvOLYHm7FgCXaqy6t8ofjJOre+39twLgoBze3qxv8pw1fg1sgL0+N697qdu7Vhdb8TGf0rjjH2ATnFjdv3rvio97ozzZxCqt+QrAX7XaIn5bddE1/GcCOLd+qPFU0qpe705sLA/M7rtsdaNdegvgutWnW20AfP96vhcA59ohjZsCV/ma98LqyDV+DazfXRp71LxnlwLgMa32EZknZ7c+YLN9R/WeVve69+Hqe9b6FbAu/0/1F40tofdXJ+5SALym1f0QfL665jq+IwDnw77q4a3ute+U6u5r/QrYa9epXto4r532e/3ve31uXtdv0N9WXXGFx3t29aEVHg9gL+yvXlW9e0XH29fYQt1iZ9vtAo3z4h9Uf1PdsbrkEkOsw/c0Nv9ZheOrlzU24QDYdB+oXt+IgVW4QfUtKzoW63e56pHVsY2nRS621CDrCoDvbnV18+fVP6/oWADr8NrGTdCrcL3q8is6FutzTHXP6s3V49qAXWrXtbTklVd4rL9s3CQBsC3e0lgX4HIrONalq8us4Disx6WrWzQ2qfu+hWc5nXUFwNErOs5nG3fUAmyTE6t/qG7eaq68ugKw+Q6vblvd48CfG2fbAuDY3PwHbKe3VV9qNW+HXrnx+n3SCo7F6t22sTPtj7fBj6tvWwD8U3Xcio4FsE5vrz7XagLgqtVRjaBgc9y0sTfNbVrgrv5za10BcIkVHefjKzoOwLp9qrEV+ipcobEi4JdWdDzOn2tUD2vs2HiFhWc5aOsKgAut4BgnNn6AALbVpxqP8Z1fF60OW8FxOH8uXv1C4+7+rTnxf9O6AmAVvtS4fAawrT7WWA/g/C7kc2R1wfM/DufRkdVPNX7rv0LbdS79/23T0CdUX196CIDz4cuN5XzP78n7qLbr9XtXXKRxmf9XG8vRb+wNfgdjm/4BndiIAIBt9dVWEwAXbrtev7fdxasbVo9uh3ah3aZ/QCflkRdgux3fCIDz6/C2/LfPLXGh6iaNRXz+67KjrN42BQDAtrOJz/a4aXW36t7t6PdNAADAqa7duKv/Ho1lfHeWAACAsVnP/RqX+q+97CjrIQAAmNkR1UOqO7aaNRq2hgAAYFY/V92nuk4Tng+n+4IBmN6PVo9sXOo/cuFZFiMAAJjBYY1n+R/TuMP/8GXHWZ4AAGCXHdLYrOe/NbbotYTyAQIAgF119eou1cMbqydyGgIAgF1zjep2jbv7j1l2lM0lAADYFd9a3b762eq7Fp5l4wkAALbdhau7V3dt3ODHQRAAAGyzu1U/Vd08GySdKwIAgG10q8Z7/N9XXXTZUbaTAABgm3xXpz7Lf6mFZzmjTzfWG7jk0oMcDJdLANh0+6rLV/+9elPjRr9NOfnvrz7VuPHwTgf+vhVcAQBgU+2rjm6cXB/a5pz0v+nz1XOrJ1Sfa+wpsDW/WAsAADbR5aofqX6puuLCs5zRcdXrql+vPnCa/39rTv4lAADYLJetfqB6WJu3Pe+Xqr+unlK9cdFJVkAAALAJjqpu3bjcf+uFZzmj/6heXz2v+pOFZ1kZAQDA0m5Z3atxE92meV31x9ULq5MWnmWlBAAAS7lxdZ/qNtVlFp7ljN5aPad6ZeMGv50jAABYt6s23uO/VXWlZUc5k49VT6xeU3102VH2lgAAYF0uUT2iukN1lYVnOaOvVr9dvaj63wvPshYCAIC9dmR1/+oBjUf6NulxuW9Uz2+c/P+lHXuf/+wIAAD2ylHVj1aPblz236RzzvHVG6pfqf6xcaf/VDbpmwHAbjiq+v7Gif8mC89yRl+t3tFYxOcvF55lUQIAgFU5vLF4z89Vd194ljM6oXpX9dTqBQvPshEEAACrcOPqLtWD2qz3+Kv+vvE+/9Oa6D3+cyIAADg/blDdsbp3m7dZz3urlzVO/J9ZeJaNIwAAOC+uWv10defq25cd5Uz+rbFL34ur9yw7yuYSAACcG5doPNJ3x+p6y45yJidUz2ic+P9u4Vk2ngAA4GBcoLpvY83+67V57/M/r3Gp/x8az/ZzDgQAAOfkltVjGif+I5cd5UxeXz2uOrbxiB8HSQAAcFYu2Djh/1rjmf4LLzrN6Z1cvbuxzsCbqq8tO852EgAAnNZh1dWqX6zu1mZd6j+psUHPb1Z/1ISr962SAACgal/jbv57Vr/QWNRnk3ykU9fs/8rCs+wEAQDANRpr9v+/1dELz3JGH61eVf336kPLjrJbBADAvK5Y3a66X3WthWc5o89Wf1Y9p3rbwrPsJAEAMJ8jqp9oLOTz/cuOciYnVi+pXti4w589IgAA5nLnxkY9P9Rm3eBX48T/guovqlMWnmXnCQCAOdyi+vnGb/wXW3iWM3pT9aQDf/77wrNMQwAA7Lbvqh5V3ay6zMKznNEHq8c3LvXbrGfNBADAbrpCY6Gc21eXXniWM/p09XuNDXuc+BciAAB2x77qso27+h/Y2Lhn36ITnd4XGwv4PLFx4vc+/4IEAMBuOLq6Q/VL1eUXnuWMjqv+R/Ur1b8sPAsHCACA7bOvU5fBvXT1A9VDqxsvNdD/xXHV/6qeUL194Vk4AwEAsH1Oqi5V/ZfGpf7bLTvOmZxQvbF6RvXqhWfh/0IAAGyfk6vHVj/Y2LVvk7yxsYjPc6v9y47C2REAANvniMZz/ZvkXdWzq5c2lvFlwwkAgO2zSXf2/2v15Oo11T8vPAvnggAA4Lz4cvU71Z9UH1h4Fs4DAQDAufGNxs19v199pHFDIltIAABwML5RvbJ6XONS/zcWnYbzTQAAcHa+Vh3b2E/gzbmzf2cIAADOyonVexpr9r9w2VHYCwIAYH225bfnd1Uvqp7SWNSHHSQAANbnAksPcA6OrV5ePav6t2VHYa8JAID1uVJ16NJDnIWPVc+vXpBH+qYhAADW5zJt1lWArzYe6fuTbNYzHQEAsD6b9Mz8cxqX+t/W9tybwAoJAIC5vK76zeodjSsATEoAAMzhXdWvV69vLOPL5AQAwO46qfpo9aTG9rzHLzkMm0UAAOymjzbe439STvycBQEAsFs+XP159RvVpxeehQ0mAAB2w6eqVzd26XvfwrOwBQQAwHb7evWKxnv8b1h2FLaJAADYXq9qPM//6uqUhWdhywgAgO30840Nez639CBsp01akhKAg/eGnPw5HwQAwHa68NIDsN0EAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAwIQEAABMSAAAbKevLT0A200AAGynW1SXXnoItpcAANhOT66eXf1oXss5D/yjAdhet6teVD2vcUUADpoAANhuR1Z3q/6oenr1ncuOw7YQAAC74ZjqvtWrGm8PfMuy47DpBADAbrlK9eDqrdWjqgstOw6bSgAA7KYrVY+t/rG6X0KAMxAAALvrkOpq1VOrt1R3rC666ERsDAEAMIfrVS+tXlL9QHXUksOwPAEAMJdbV/+zcaPgTap9y47DUgQAwPocsvQAp/Ez1eur36putPAsLEAAAKzPZ6tTlh7iNI6qHtp4a+Dx1TWXHYd1EgAA6/PR6j+WHuIsXLF6ZPXi6tHV5ZYdh3UQAADrs0m//Z+V61W/Wr2melh1xKLTsKcEAMD6bMsNd9evfq36m8Yyw+wgAQDAWTms+p7qGdXbqv/S9gQMB0EAAHB2Llx9b/Xn1R9X127EAVtOAABwMA6rfrx6Z/Xb1dXbrMcaOZcEAADnxmHVg6q/bzw54NHBLSUAADgvLlr9SvW66hcaVwTYIgIAYPvsX3qA0/i26kmN+wMeUF1m2XE4WAIAYPucUL2hOnnpQU7j+tVTqhdV96kOXXYczokAANg+F6weW/1Q9aplRzmTmzdC4FXVbReehbMhAAC2zyHV56u/rH62ulPjWf1NcWhj18FnVy/PZkMbSQAAbJ/9nXqJ/XPVn1a3a8TAvy411Fk4urp9Yw2BF1RXW3YcTksAAOyG46o/bCza86vVF9qcmwWPbiwp/PbqdxubDTn/LMw3AGB37K8+Uz2msbHPsxpXCDbFJaqHVO9qbDZ02UWnmZwAANhNH2/cjX+L6qXVZ5cd53QuWz2helN192w/vAgBALDb3t1Ywvdujffiv7ToNKd3jep5jRsFf6y62LLjzEUAAMzhDY3H8u5bvabNWkPgxtXLGjsP/kjOTWvhPzLAXP6kumN1r+qvFp7ljO7ceKLhD6tbLjzLzhMAAPM5oXpu4/33B1bvX3Sa0zu8ukf1/OqZjasD7AEBADCvT1V/0Hj//b81HiXcFJep7l29uHpyddVlx9k9AgCAD1a/Vf3nxt35Jy47zulcqXpwY9XDX6kusug0O0QAAFBjDYF/bqwh8N2NS/CnLDrR6V25emTjqYYHNt4q4HwQAACc1jca9wTcs7GG/2urry060akOaYTA71VvqX64uvCSA20zAQDAWTm5emfjJPtj1d+2OSFwwcZVitc0Hh+8aXXUohNtIQEAwDl5feP+gJ+v/qHNemvgVo0VBf+g8cTAYcuOsz0EAAAH69mNpYV/uTp22VHO5B7V/6ye2NgQiXMgAAA4N75YPb6xmNCvVf972XFO54jGVYpXVL9eXWfZcTabAADgvPhQ9ejqro1HBz+/7Dinc7nqEdWLqsdV37rsOJtJAABwfryzcbL9kcaCPZu0x8C1q1+qXlk9qPEUAQcIAABW4W2N1QRv2lhDYJPcoHFvwJurn1x4lo0hAABYlRMbz+ffv3Gz4JuWHed0jqhuUj2t+uvGfFMTAACs2lerN1a3afzG/cHqpEUnOtVR1c2qVx34uEF16KITLUQAALBXvla9sLFozyOqj7Y5awhcqLpt44rF06prNtk9AgIAgL329eq3GyHwO9WHlx3ndA6rfrb6++pR1TWWHWd9BAAA6/LF6uHVLatnNK4IbIqjqsc2FhP6+cYuhDtNAACwbh+qfq6xhsBzqs8uO87pXK6x2dCLqntVRy86zR4SAAAs5W2Ny+93b5xwN+X+gBpPDPx/jUcaf6odvD9AAACwtNc3QuBO1esWnuWMbtUIgVdWP77sKKslAADYBCdUL69+urpLY4XBTXFo45HGZzT2Gbj5suOshgAAYJN8pnpJ4xG9+1QfW3ac07l49V+rF1fPazw6uLUEAACb6N+qZ1U3rB7ZZm02dHTjvoW/rZ5SXfbA/79J9zCcIwEAwKba33hC4AnVd1W/X/37ohOd3iWrB1Tvqn6mulhbFAECAIBNt7/6ZPXgxjK+L6+OW3Si07tc9ezqpdUxC89y0AQAANvk3dUdGk8M/EX15WXHOZ1vaVwV2AoCAIBt9KbGnfn3r/6yLbr0vikEAADb7IXV7Rvvxb954Vm2igAAYNt9rXp6dbfGfQLvXnac7SAAANgVn2g8KXDnxqZDn1p2nM0mAADYNR+sfqv6weox1VeXHWczCQAAdtU/V79e3bixqc/Jy46zWQQAALvspOp9ja19b9Z4YuDERSfaEAIAgBl8o7F07y0b9wi8vfr6ohMtTAAAMJs/q763emhjGd+Tlh1nGQIAgFk9vfq+6tFt1vbDayEAAJjZCY3Nhm5XPa5677LjrI8AAICxZsAvV3etfrP69LLj7D0BAACnem/1i9Udq2c2diLcSQIAYH129mSyg/62ekh1i+qVi06yR7YpAA458AGwrS7Ual53T8zud+twfPVX1T0bjw/+zbLjrNY2BcDh1RFLDwFwPhzVal53v9akj64t5EuNBYRu03hr4P3tQIBtUwAcUV146SEAzoeLtprX3a8mAJbwlepl1Q2rB1Yfbou/D9sUABevLrX0EADnwxWrfSs4ztezrv2Svl49rbpBY6+Bjy07znmzrgA4fgXHOLw6ZgXHAVjKql7DvtxY2pZlfamx2+DNGosKfXzRac6ldQXAF1d0nCu0mnoGWLdjqous6Fgfb/J17DfMR6v7VT/Z2HXwC4tOc5DWFQDHreg416ouvaJjAazT97a6168PZY/7TfTm6h7VT1d/3IbfKLhtAXC96qorOhbAOt2kcS/TKnykLb75bAKvbkTAnQ/8fSNtWwAcXV13RccCWJfDq+u3utfcT67oOOydE6s/rX6msbzwW5Yd58zWFQAfXuGxblldcoXHA9hr/7m69oqOdVz1mRUdi733ucbbAXdqLCj0L8uOc6p1BcA/tLqbIm5TXX1FxwJYh1tXl13RsY7NFYBt9KnquY0YfFgbcKPgugLgHa3uH+wR1R2qw1Z0PIC9dK3GlctVPcH0zlwB2GafqZ5UfXf11OrflxpkXQHwsVa7UMK9qqut8HgAe2FfY5/5Vd27tL+xW51NhbbbKdW/Vg+ovr9xr8DarwiscyXAt7e6lasuXt2/7VrJEJjPdzSeDV+Vj1QfWOHxWN57GvcH3Kl6bWNxoVrH3jf79+/f848DrlN9ulGuq/g4pVFOAJvokOr3Wt1r3v7GIjMXWuPXwPrdpfEL83v2/Ny8xgCosa3iKn8Y3l5dYs+/HQDn3g83FutZ1evdidW91/oVsJTLVjfatQB4QOMf8Soj4Kl7/70AOFe+tXFpd5Wvde+prrzOL4Jl7VoAXLJxB+QqfyhOqe67998KgINyePVnrfZ1bn/17HV+ESxv1wKgxhaKq/7B+ELjfROApT2z1b/GfabxKCET2cUAuEr1lVb/A/KpxuM2AEt5cuNpp1W/vr2icVMhE9nFAKh6Rqv/AflmJf9EtgwG1uuQxm/+J7X617XPVz+0vi+FTbGrAXCt6oT2JgK+Vj0kj8oA63H59uY9/29+vG59XwqbZFcD4NDqCe3dD8z+6jnZOhjYO4dVt6r+qb17HftC1juZ1q4GQNXlGrsE7mUE/FNjFS67BwKrdM3qie3NJf/Tfjx5XV8Qm2eXA6DGHsmntLc/QPurl1W3ry66ym8OMJ3vaLzF+MH2/nXrw9Wl1vJVsZF2PQAu3Dg57/UP0v5GaLy8uk+2EwYO3iHVD1aPrd7Vel6v9jd+QWJie31u3ncOJ+iV2LfvbG/Kv1YjAq6554Oc6tjGD/K7G8sJv6/68ho/P7DZrlBdr7phdf3G1q3HrPHzP7O6X+MXFya11+fnTQiAGo/uPb26yJ4Pc3onVx9vPD74xeoT1XGN9bu/lt0GYQb7qqMabxFevrpM49L7MdXRC8zz1urHGpunMbFZAuDQ6vHVw/Z8mINz0oEP6wnAHA6pLrj0EI27/n+setPSg7C8WQKgxnP7L65+dG+nAdhI+xv7mjzrwN+Z3F6fnzfpEvfx1T2rNy49CMCanVw9Kid/1miTAqDG+/A/U71j6UEA1uSU6ner38jJnzXatACo+ljjSsA/Lj0IwB7b37gB+heXHoT5bGIAVL23+vHqLUsPArBH9le/Uz2o8RYArNWmBkCNlbbumo0wgN1zcvXoxpNPnvVnEZscADXeDvjJ6vlLDwKwIp+r7t949BkWs+kBUGMv7PtXD28szgOwrd5a3bmx0h8sapPWATgYN62eVN1gVQcEWJNnVY9rXNmEczTTQkAH61uqRzSuChyyygMD7IGPV4+sXpGrmJwLAuCsHVZ9T2M/7hu3GUt4ApzW8dVzq1+rPrXsKGwjAXD2Dq8eUD2wsXHH4Xv1iQAO0leqv68eU/2vhWdhiwmAg3NkYw3te1ZXTwgA6/e5xiqmT6tetfAs7AABcO4c2bg34Ierq1ZXXNcnBqb1gerd1R9Vr114FnaIADjv/lN12+om1bWrSy4xBLCTPtw46b+1enUjAmClBMD5d5nqhtW1GiFw3QN/P2zJoYCt8tnqPdX7qvdXx1Z/t+RA7D4BsFqHVN9eXbkRBscc+Pu3VUdXR1VHNN5KOCqRALtuf/X1xuN5xx/4+HL1yepfD3x8+sD//lDu5meNdiIAAIDNsg1LAQMAKyYAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJiQAAGBCAgAAJvR/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,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;
+            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()">&times;</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,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAYpklEQVR4nO3dDZBdZX3H8eeGbJAEkjXZTSCvGyBBBEw0g20THRNbqISqwRlJqDNCpwWcUREdZbDKYGucVulM8ZWBaUexHZNgZxJ8wQ6OEscSbakxIKhJgKwB0pANm2zIC9m32/9v48Vl2XvOPfc+59zz3PP9zCw5Z5m5e3P2nu99znPOuSm5nOm8b9dS++NtbtgtLU9wXa7stN5uX4B3S9onvfjerrOu/8AFMzbZKnKuZF9NNxKpYfeRcsmtsdV2+wIysaLzDPfNFeeUN3T3XUO08q+pwer49u6Vrly+3UZRKx3QBArWllVz3W/7Tvb/qLe8+EPnnvE7+zZyqmRfmTt7856uwYGBrxMqNFslWLK7r//Eg73DFxKt/CrZV6bs8O8j5bK70xaBphsdLCFa+Vayr0x0bd7TfrR/8OvOldfYKpALY4Ml21946eiyjjPOskXkTCbBUqyO9Q88VHYjZ/yA3BgvWLJ1//EnV50zZZEtIkdSDxaxQp5VC5YQrfxJPVidm3b9klghr6KCJUQrX1INlk2w31kuu4/YIpBLccGSr+48dP+HXjd9jS2iyVIL1sxNT64ZdsObbRHIrVqCJd/a0/ev7zu3/W9sEU2USrBOzVv126FgqcsBOVZrsIRoNV8qwerYtPMz9tC3OyDnkgRLbn7kwO1ffPOsv7dFNIH3YGl0dbR/YI8tttsXkGtJg3Wkf4j7DpvIe7A6Nu6+2ZXK/2yLQO4lDZYQrebxHqzOTTv3MHeFUNQTLFG07vh171+sf+PMB2wVGfEarM77di0tl90vbREIQr3Bkl8fPjn0laePv+muZdMfs1VkwGuwOBxEaBoJlnCzdLZK9uVNx6ZdW50+LRQIRKPBEqKVnZJ9eWPBOmR/cHYQwfARLPnuMy/23vSLF87rvmrhYVtFSnwHq2x/AMHwFSz54b5jey+fc+YCW0RKvAVr5OOOh8sP2SIQDJ/BEm6WThfBQqH5DpZ8a0/fjved2/5GW4RnBAuFlkaw5POP9/7XrZfMeKstwiOChUJLK1hiIy1ulvaMYKHQ0gyWEC2/CBYKLe1g9fUPudsffYFPePCEYKHQ0g6WKFpf3d13/acunvEvtooGECwUWhbBEt0svYFPeGgYwUKhZRUsefbYwPBH//fgyv9YOfuntoo6ECwUWpbBEn3Cw+2P9q4iWvUhWCi0rIMlv+072f+j3vJibpZOrmRfXhAshKgZwRJ9wsPlD+2bzc3SyRAsFFqzgiV8wkNyBAuF1sxgiaL1rvlTZ9giakCwUGjNDpbwCQ+1I1gotDwES7hZujYEC4WWl2AJ0YpHsFBoeQqWfHXnofs/9Lrpa2wR4yBYKLS8BUvW/6rn87e9YeattogxCBYKLY/B0s3SfMLD+AgWCi2PwRKiNT6ChULLa7CET3h4NYKFQstzsISbpV+JYKHQ8h4sIVp/QLBQaCEESxStrzx9/E13LZv+mK0WFsFCoYUSLNn6/LG+v/pZT1eRb5YmWCi0kIIlulm6yJ/wQLBQaKEFS4ocLYKFQgsxWLJ574tPvWfB1PNtsVAIFgot1GBJEW+WJlgotJCDJUWLFsFCoYUeLClStAgWCq0VglWk+w4JFgqtFYIlRYkWwUKhtUqwpAjRIlgotFYKlihaV2/b/84HV839nq22HIKFQmu1YInuO2zVm6UJFgqtFYMlrRotgoVCa9VgSStGi2Ch0Fo5WLJ575GjH9veO69V7jskWCi0Vg+WtNLN0gQLhVaEYEmrRItgodCKEiz5/OMvPHfrJR1B/2UJFgqtSMGS0O87JFgotKIFS0KOFsFCoRUxWPLJ7Qd+/I/LZv2pLQaFYKHQihos3cJz0yP77/7mW+Z+wFaDQbBQaEUNlihaod0sTbBQaEUOloQWLYKFQls+/XR3/5/Nt6Xi+tWhk+4D/73/g9uu6PqareYawUKhTS2X3VNrF9tSsYVy3yHBQqGVTw65p9cuclMnnWZrxRZCtAgWCm342ID77pVdbvnMybaGn/ecGHzX1mcv7bl68Q5bzR2ChUIr26TzLZd0uFuWdNga5NvdR/pv2tF7wf6rFna7nCFYKLbhsls+tc3dv3qhraAirzdLl+zLC4KFUA31nXTd117IPNYYeYwWwULhDR056b62ap5bd940W8Nof7v9wN4Ne48vyUu0CBYKrzw47JZPm+S+c+VCW8NY6x87uP22JZ3LbLHpSvblBcFCyAZfOOEee/+Fbt6UNlvDWHn5hAeCBZjh4wPuGjsk/Mpb59gaxnP1T577zrdXzn23LTYNwQLEzhYOHnqJUVYE3Xd4/c/2NzVaBAv4PV1Eunreme7fCn5vYRRFq5k3SxMsYBTNZX3vPee7FbO48r0aReuGnz//ifveNuefbDVTBAsYRfcWzpng3E/fy/2FUZr1CQ8ECxhj+MV+t3q+HRpetsDWUI2i9fFHD77zwVVzv2ermSBYwDgGe19yn/yTs90tSzptDdVk/QkPBAsYhy4mHbKzhne9Y4Fbd167fQfV6GbpDz7y/B9l8QkPBAuogmjVLqtoESwgQiVaH3zz2W79pbPsO6hm894jRz+2vXded4r3HRIsIEYlWm/tmur+/bL5nD2McNfOQ/u/8Ju+C9OKFsECaqEr4Q+fdNMmTXCfXH6Ou/F10+2bGE+an/BAsIBaWbR0NfzQiUG35OzJ7tY/PttdMfcs+x8YS9H6h2WzFtiiVwQLSEgXl+oztMpl57o6XuNutbmt1fPO4lBxjDQ+4YFgAfWw0dbQ0X43/NKQrdiOZHvSG2ZPcX9ph4oXT38Nt/YY3cJzveebpW0z+0GwUET6Ryx0mDg8MGxrr9Q1/XQ3/6xJ7i2jDxttj7tkxmsKMxo7YtvnC785vG7rn8/fZKsNs83nB8FCkUWFq+hOmzzpo71//fo7bbFhBAvwaCRcNik/bPNcOIVgAXk3NOyGj1u4LGDlobJ9o7gIFhAQXXha1qiroPEiWECobORVtGiV2k5758F1i718BA3BApCuCaVVB9+7aKvzgGABSBfBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEg2ABCAbBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEg2ABCAbBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEg2ABCAbBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEg2ABCAbBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEg2ABCAbBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEg2ABCAbBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEg2ABCAbBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEg2ABCAbBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEg2ABCAbBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEg2ABCAbBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEg2ABCAbBAhAMggUgGAQLQDAIFoBgECzk1fwpE93cyW1uxcwzbO3Vnjk24PYeG3RPHD7p+gaG7Tuta1rbBHdR++kj22TelDb7zqs9fOCEe/b4qW3SsghWuq6YPcVd/NrTbcmPxw+d2jm39ZywtdayvPOMkTitGPlzsn2ndnstXtpht/Uct68Tth72TqswvWP2mbYdbFvY9pg26TT7bu0ePnDcPfDcMfef+44Gvy1egWCl42J7N7x3xTn2whv/3dCH0TvpD+zFqZCFRjvmDYva3bquqYl3yigPPHfUtslRt7H7RVsLg0ZRa207aFtc4vFN7lf2JnfP7kNBbYuqCJZ/2gl/fNl8rztgLULaSTVquGFxu1s950xbS4+ifscTL+R6m+j18vHXz3DXLJxqa+kJYVvEIlj+ffnNs0beJZtFL8yN3UfcPbsO527UpVHEZ5d2pr5zjqVtctP/PO8etsPFvNC2+MRF092Ni19ra9nR4eJNjzxv2yTAQ0WC5Z9GVz6H9PXq6x9yn97RY/HKxzvq6jlT3JcunZX5yHO0u3cdsm1y0JaaSyNMTRk0a1votXGbbYcN9sYWFILlX8/Vi+y/+ZGHd9T1SzvqGkkcsR3rcTsLKJXRkc6SzZ880U21nV1zhUlpTue6bfuatj3q3RayzX6Xsvf44MhZUlH8ZHnCExWSl4DXjGD5FxUsHapVXmhJ6YVZ706qd1RFS2eOsqZRVa2HgArUA/uOjczF6YRCLYe02i46m6bDcMWsFtoea7Y+93IMs6BDQI2qkpwB1fPbuOfISKy1HEevDY1kk2yLDfb4em0EgWD5FxWsNQ89O/Lia1RlJ73CJq31Iq2V5nE2WDSzoB30SzafV8vEuiJ+xxO9FtSjNUWqGm2XW2xeqJbRRpbR0rbYvHJuzVMFemPTBHkjo8Ak2yKYaBEs/7II1mg6y/SJi2aMvKvWQjvCFywOaat1ZJXG89HOqpMfcaMMTca//cG9DUUyTpJYaWSpecdGQjWWRlxftt+FRudRVtl2yCLeDSFY/mUdrAqFa72dgdOoK07aI63P2TzNDTHzNBpVvf/h/0ttJ1Eo1r+xMzbkmtN6+w/32lI6tqycY6Ph6FGODoU/bCOctA7ZtS2+aYejUaOtNN44vCNY/jUrWBW1vqNe+/C+VHYQjW62rJprS9UpUtoWaY5sKm5c1D4Srihp7aw6JNPoN4q2hX4XPkdV1WjUWS3geg5pvB68Ilj+NTtYotHWvStmR85vaQ5HIwufO4reyX9xZVfk6XrtoNoOWcSq4hrbSTWfFkXPyefvJm/hrtBIa+woXKNdHRJm+TzqQrD8y0OwRPHQDhMVLV3yoIlnX6LewaWZO0bcYarms5Z9v9v5onBH3ZrVrG2h14VGfvo9aRSuSyU+tePgSDxzj2D5l5dgiV6ccdHyNZ+lUd0vrlxoS+PTPM27LY7N3DHut/mkqHkcX9tCQYg6FMzDtggSwfIvT8ESxUo7qt5Nx6NDQ40sGn2nj5tcTmueKAlF9aHL5lfdFj5GWXqT0Ogq6rDYVxgLh2D5l7dgSdzEc6MxUQiiRlc6/HnT97tdHsRti0ZjEje60iGYRleoA8HyL4/BEo2yqh0ONTqyiJu7ajQCvm2/sqvqNVqNzus9uebcyNHVsu/vse09aEtIjGD5l9dgxZ21aiQqUTtpnkZXFXFnDeuNStzj6gr2D9t2Rp0Iln95DZZEjbJ0lbUu5ExK133pEopqPv3LHnf37sO2lB+aZ9Ioq9pcVr3PebxLBkbTWUEm2htAsPzLc7Di4nL+5qcST77HHQ7W85hZiLrMod55pqjfvUKlYKEBBMu/qBdts4MlT9nhW7WRRT1XO+uMWLXrjfK8k8bFu/O+3fbf2sUdctc7asMoBMu/vAcrakR0z65DIxcR1kqHVk9edZ4tja/Rs49p8/m7ijs7WO+8GEYhWP753AnSEDUxnPRQKG5UkYe/b5SoOb2kI6Kox9KFoudtedqW0BCC5V/eg6ULSR+6fL4tjS/JoVDcqCKv81cVUc8/6egw6tC43hMaGINg+Zf3YEnUc0wSmaiJa0kSv2aIuog06WgzapsmjR+qIFj+Rb1w8xIsjbA00hpPkucYdRiUdIdvhqhD2iTPX9tS27SaRq5xwygEy78QghUVmiTPMepxkuzwzeIrWFGPI0m2KSIQLP8I1ilJdvhmiRsZ1XpIS7AyQrD8I1inhBAsifp9EaycIVj+Re0AeXnhRoUmyXOMepwQghU1wkpyKQLBygjB8o9gnRJCsKJCk+T5Rz2OJNmmiECw/AshWFH/nH6S50iwTokaqUnSi1BRBcHyL4RgRT3HIl2H5fOq/6htynVYnhAs/6JeuHkIVtxoIElkoq4UlyTxa4ao5580Mvq4mmofCsiV7p4QLP/yHqyoq7uTfrpC3Cce5OHvGyXqkDbpYVzUY+lz88+vcQIfEQiWf3kPVtSHzCX9tIa4z3JPOkrJWtTvSuFWwGsVNVqTpI+HcRAs/6J2gmYHK+7jYOr5PKyoQ6G0/xn4RsSNDpMcGkvc4yV9M8A4CJZ/eQ5W1CSz1DPnFPX5WlLPY2Yh6oRBPXNOcW8Gjf5DHzAEy788ByuNj0CJG1kknQvKguKibVHtH86o92blqMNtafbvP3gEy7+8BitudFXvTipRH7ucx5FF3Laod1QY97iN/hNihUew/MtjsDSi+PHl86uOrpLchjKeuMPCRmKYBo2uqm2Lekeaou2sOb1q8ZZmvQZaAsHyL4/B+tKls9w1C6sHpdGzeXFnCzXKerudJatn1OJb3Nm8Rn9HcY+fp20RHILlX96CFXeYotGV/qHTRnegqOuQJA9nyeIumvXxj75qlBU1+S552BZBIlj+5SlYcTuo+JoUr+VnZf33H00h2bxybtV7KMXX84sbZUkzD5O1La6wkyWyzf6+wfxrPgTLv7wES2fvdChY7UyY6EJGXdDoS9xclq741qSzfm7WtC2iDouT3jsYRUFQvKtdn1aR5ethtNE3v+t3cpuN9poVz0QIln95CNYNi9rd56rcflOhQ8FVP9zr9d1VO2rcpLN2kKyjFRcrbQvFyudz0htG1OUeFVmPtMbbFvqd6Exuo9MCqSNY/jUzWJr8/uzSTttZzrS1aGntKLXsqNpBsoiWAqr5u7jt4euweKyoi1NH+5T9/HtS+PmjxW2Leu5yyBzB8q8ZwdKL8YbF7SM3NkcdAlaktYNWxB0aVqS5o+qzrhTvyqFPNY1cxlALHRpqfi/OA/Y8btvR43XEW6Gfr5FV1LZo9ExxJgiWf1kGSy/EdV1n2dfUmkIlG21U9WEbXaUt7qrvCl1MeYftKL62i0aZH3/9jFcd9oxHIzz9TtI8FNKbiT4kUL+rOBp56o3knl2HvTwn/Wy9kd0ScwJAgvin9AmWf2kFSzvi3MltIy98fa2YeYZ9r83+T+2yfBfVzlLrjioKl2K6sftFW0tOP0dzd7WESrKIVUXSbaFwVbaFnmdSeq2stTexWkfcwVxmQbD8iwpWs2hS+dP2gtxgO0GWku6oop1VUdeO+vCBE+6IBUXLo+lxL7LH1I65vHNy4njr8bKKVYWec9JtIbrQVNthW89xWx50T9hzH/u89ZjzJk8c2Q7aHlGHfmMpjFmMuL0gWP5F3VfXDNo59YLUn81S65xWFnT5guasxu70WVC09OGJedkWQcVKCJZ/cVd8Z0WjKh3+aU4kD3TF/Xo7a9bMmGd5SBxFZ1K/bJPgzdwWaZ94SQXB8k/zBnoXbRaFSi/Euz1N3PqkQ7j1duaulsl4nzS61EhCf+ZFs0Zb2gZ52xY1I1j+6YVYz1xFo/QC3LhHE7VHcheqsXTJgW5fSXskqnsDdQZyg22TvNLr5EY7k5d2uCpvZHkYYdaNYKVDIwldPKkXY1r0AtTktCZkf7Dv6MiEbGgUrnV2Vm/17CleD490bdUPnjuW61CNpdeMRucafcbd0pOEoq3RdghvZLEIVro0V6Foacesl6JU8YxFSWeNnjk+YH+GF6go2lbaThp1aZsl0QrxHk1//9HbIymNthVtXbmu5ZZBsJBX2lmnTZowsvOOp6//1OUOrRjvsbQNNNUw8qdtk/FoW2ibKNwti2ABCAbBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEg2ABCAbBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEg2ABCAbBAhAMggUgGAQLQDAIFoBgECwAwSBYAIJBsAAEI4/BOnvznq7B/oE9tggAL5s4qW3h/qsWdjsPvAVLOjbtKtsfAPCyg2sXe+uMtweSzk27dlixltgiAMhPLFgrnSe+g/UNC9a1tggACsy9PWsXX+c8scfzp/O+XdeVy+7rtggAboKbcNWBtedvsUUvvAara/Oe9qP9A4dsEQDcmZPaXtt91cLDtuiF12BJx307t7hy6d22CKDISuX7D159wRpb8sZ/sLgeC4B4vP6qwnuwpGPjzm5XKi2wRQAFZGF51Cbbl9qiV/a4/s3c9OSaYTe82RYBFJDvyfaKVIIlHZt2bXXOvc2+ABSL12uvRkstWL+/VWeHLU6zLwDF0DdxUttSX7fijJVasITrsoBiSetQsCLVYAlXvwPFUCq5L/ZcvfhmW0xN6sESogW0NguJ11twqrGfkw2iBbQmi0gmsRL7Wdnp2LTzM/Yjb3cAWkT57w6uveAzLiOZBkt+fyX8Flvk7CEQrj43obTG95XscTIPlugm6WP9A3eWnbvWVgEExKJx75RJbTf7vKm5Vvazm0ejrdJw+boy4QJyz2Jxb3lC6RtZj6pGs+fQfLrIdGhg4ObycHmNnRtdYN8CkAfl8u9KE0pbTmtruzOti0GTyEWwRlO8Bk8OrimVykvLznU555baF/NdQPr67GtHybnucrm0Y+LpE7fkIVKj/T8HfK07fXoIWQAAAABJRU5ErkJggg==',
+            'XLS': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAXlUlEQVR4nO3dfZBV9X3H8d/FsU3UFjOahtjobjQZoqZAouDDGsE0bDCtI4tpBhoftqWdQmPUBuwEq5EkJqQVMGgNMNGIaBI6UXftGELBSVArsRHBhI41f6ArGUfaxEYQEOTh5vu5urqu95z7dJ5+9/d+zeCeszPuw9097/s7v3t+Z0uuYCb3/eU4N8JNdOVD42y307mSvS0f7YAUnN/x8T0/Gljfta7ne0/aLgquZP9yN6VveuehEaUrXbk8texcpwMysrDrOvd/r/z/q//yxNIziFbxlexfbixUkw6VSleWXXmq7QKZU7DGHHuK++HAgztve/K7Hf09K16yd6OgcgnW1L7eo3eX9t5km70OyNFgsOTWLXdue3Dr+rFEq7gyD1Z334yp5ZK7g3kpFMHQYAnRKrZMg9V9/4ybyuXyVbYJFMLwYImidfmY3g7bRMFkFqzJ/dPvsDe9DiiQasGSeRsW/Ps3uq650DZRIJkEi1ihqKKCtWv/bve1x28mWgWTerCIFYosKlhCtIon1WBN7pvea59BwQIKKS5Yomgt3rR8+fVnzpllu8hZasGa0je982CptJlXA1FktYIlW3cMuAUbb/7c7Z+46Vu2ixylFiw7FfyJvZnkgAKrJ1hCtIohlWC9dq1Vuc82gUKrN1hCtPKXTrD6pz9bdq7TAQXXSLBky4tPH5jzyFfHs+4wHyX7lyibu5p0sOR+YptA4TUaLHnwV//JYumcJB6s7r7p/eWSu9A2gcJrJlhCtPKRaLBeX9T8W9sEvNBssETRWvTEraPX9KwacMhEosHiuiv4ppVgyZ1P/+D5/qdXf5jF0tlINFh2OrjCTgcvs03AC60GS7RYmjs8ZCPRYE3un7HZufI42wS8kESwhGhlI+FgTS/bG8AbSQVLvvPUqk0zT51xmm0iJYkFa0plKY571jYBbyQZLK07ZLF0upIM1iQL1k9sE/BGksESopUugoWgJR0sIVrpIVgIWhrBEkXrqoevY91hwggWgpZWsITF0skjWAhamsESopUsgoWgpR0sUbRu2XL7BUs+dsMDtosWECwELYtgyWPbN+3/0mOLJrBYujUEC0HLKliixdLc4aE1BAtByzJYQrRaQ7AQtKyDJT8ceHDnbU9+t4N1h40jWAhaHsESFks3h2AhaHkFS4hW4wgWgpZnsETRunxMb4dtog4EC0HLO1iyYOMta64Zf8X5tokaCBaCVoRgad0hi6XrQ7AQtCIES4hWfQgWglaUYImitXjT8uXXnzlnlu2iCoKFoBUpWKJ1hyyWjkawELSiBUuIVjSChaAVMVhCtKojWAhaUYMlz+7cdvDvfjzvdNYdvolgIWhFDpawWPqtCBaCVvRgCdF6E8FC0HwIlihai564dfSanlUDLmAEC0HzJVhy79bV2+/e8oOTQ14sTbAQNJ+CJVosHfIdHggWguZbsCTkaBEsBM3HYMl3nlq1aeapM06zzaAQLATN12Bp3WGIi6UJFoLma7AkxGgRLATN52BJaNEiWAia78ESRevrG2++esHZ1yy03bZGsBC0dgiWhLJYmmAhaO0SLAkhWgQLQWunYImidcuW2y9Y8rEbHrDdtkOwELR2C5Y8tn3T/i89tmhCOy6WJlgIWjsGS7RYuh3v8ECwELR2DZa0Y7QIFoLWzsGS9c9v2LXk8W8f3y7rDgkWgtbuwZJ2WixNsBC0EIIl7RItgoWghRIsUbQuH9PbYZveIlgIWkjBkgUbb1lzzfgrzrdNLxEsBC20YGndoc+LpQkWghZasMTnaBEsBC3EYImitXjT8uXXnzlnlu16g2AhaKEGS7bv+bW79qcLvFosTbAQtJCDJVos7dMdHggWgnbj2de6se8+1bbC5VO0CBaC9tkP9rjLTvmMbYXt2Z3bDn57y3fPW3DONY/YbmERLATtvPec6eadeaVtwYfF0gQLQTv+90e526fcZFuQokeLYCFor+7d6x6Ydrc76vAjbQ+iaC164tbRa3pWDbiCIVgI2sEDB9yXz5jrznnfGbaHQfduXb397i0/OLloi6UJFoJ37rHj3bVdX7AtDKXF0kW7wwPBQvB279zh/mP6PXZaeITtYaiiRYtgIXiax/rihM+7Ke//uO1huO88tWrTzFNnnGabuSNYCF65XHZHHfw913fRSttDNfM2LCjEYmmCBZg9L+90/9r9z27cH33Y9jCcFksX4Q4PBAswerXw6NKR7t5pKxyqK0K0CBbwOo2yrjtnrvtk53m2h2oUra9vvPnqBWdfs9B2M1eyf4kgWPDdoYMHnXvlgLv/M3e7I3nFMFKei6UJFjDE3j273Tl/fIb7+rn/ZHuIkle0CBYwzMs7XnJzz/qcu+iDf257iKJo3bLl9guWfOyGB2w3EwQLGEanhorW4k9+zXUdN97egyhbXnz6wJxHvjo+q8XSBAuo4sD+/e6w/WW37FOL3UkjO+w9iKLF0lnd4YFgARF0Bfzhh0YQrTpkFS2CBcRQtPbu3eP+sesKN+0Df2bvQZT1z2/YteTxbx+f5rpDggXUsP/VfW7Prl2u55QL3Oc/OpNLHmKkvViaYAF10JXwmojveNfx7m9Pu8x1nzDR3otq0owWwQLqpEXSu3buqMTrrI4J7q/HftaNDfhPhMVRtC4f09thm4kiWECD9r3yintlz27bcq7zmA43c9zF7pzjJnCqOMytv1jx48vH/tWf2mZiCBbQBF2rtXvXy+7A/ldtz7kRIw5zZ54w3p17wlnuA+86kZGX0brDpBdLEyygBYMT8ocOHbS9Nylg7xt5nDvuD0a5j44aa+95zYgRIyxo73eh/NELRet7/3PP9G994sZ/s92WESwgAbr8QaeJw8MF5975jnf+wyMX//CbttkyggUkSOHat2/vG6eKIFhA4emVxFctXPssYOXyIXtPuAgW4BHNc2lt4qv79gV5ykiwAE/p1cVDh8IacR3uShes/Yt7ErkFDcECkKrDyu68NT2r1rsEECwAqSJYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANgpWyk0Z2uDHHnOKOOvwIt/ZXD7v/3fNre2++jjr8SHfWqNPcqCPe7bbueM5t2L7R3tu6s0edXvl+d+3fU/mYRfhek/Aee5zGHHOyG3vsKZVt0fepx3HQrv27K4+l3j5jb3/+m6fcMzu3VfaRHIKVou7jJ7q5H51lW2+a/1+LKgdznpZOWmAHXKcbpIPryz9b3PTBpQP3xq5r3/Ix9bH0MfWxfaQw9Zw4xXWfMLHy/TVr644Bt3bbw5WfebsEPE8EKyX6hb9r8s229VY6kGevn5fbL+8loz/tLvnQRbb1Vhte2Ojm/2yRbTVu7kdm24F9rm291Xb7Hi9dd4Vt+UMjp4tHX+S63jve9pL16AuPu/5n1ngb8SIgWCmZduL5btafXGpbb6dnXUUrazqlubHrOtt6O4V02uq/sa3GrbQw6/SyGn1MfWwfXGKhuuRDn7atdClYd//y3spbNIZgpaTa6eBQfVt/5Jb+90rbyoZOa1ZOXlJ5W41GfJc0ORpae+H37b/VXf3oVwt/YOoxGX5Km4X7tq62cN3nTdCLgGClaP6EOe7s955uW9Ut3LTMJuIfsq30aWSlEVaUu56+1931y3tsq3E+ByuvWA3SaHvh5mX29jnbQy0EK0U6GDTBrfmsavTMqgM67V/WqHmrQfr8+jr09TTD12Dp59NorH7x+veyfc9vKqNSzXnpFWDRz1n/GqXH3ecXKLJEsFKmX+ilk75hW9XpGfbqR2+o/NKmQaMqja6i7N6/x8199Cv2dTxne83xNVjXT/hCzcl1PT5rtz1UGQnX8xgpWCf9YUflcdfoWvv10M9f832IR7AyEDcBLzogdFqQNI0gvmUjvKgJcUnitNTHYCkocSEXzTPeZZPjikmz9Hkm23xmtVdRh+u+f4b9F3EIVkbymM+qNYLQAZnExL+PwYp7ZVOS/nlopDX7w5dG/g5oJNezeqZtIQ7ByohGO7ou68jX5zuG07O4Du56TjvqUWtUp88ze/0Xbat1vgWr1ml6mhf3ajXAbPu5KGBDtfKiR0gIVoZ0ehB3GqILLf9+/bxKvFpR64DUs/ksi5UmjZPgW7CiLnSVVi6grZeevOZ+ZNYbo62kRrohIFgZq/WKna6G1itGzdLBUGveKumI+Bas+z51W+VxqibN0dVwGmUl9aQRCoKVg4U2yhpjo60oy7asdPc98yPbalyteas0Tj18C1bc18vEd7ERrBzomXWZnbJFzWeJ5pc0z9SIWlfXp3W6ExeAogUr7nRZ11jNta8XxUWwcqLJ1/lnzLGt6hqdz9KBqPmxqFMdnXpo/WK9H68RPgUrbh6RYBUfwcqRXubuOel826qu3vksRarWFdvNjNjq1S7B0pOEb3eXCA3ByplOTzQ6ilLPnJNecdJ9m6IkfU3RcD4FS4+1HvMouto8jVEokkGwcqYDaGHXl2Lns+IO+lrzVrp53MLNS20rPT4FS+K+3iweLzSPYBVArejoGf/SdVdW3g6lyXstrtYpYTU6BVQwhv9/SYsLgD5/0YKlC3j12EVJe0SK5hGsgoi7mFF00OvgH0qxipq30sWhrS5qrpdvwap1LZws3bLS9TV5aQnSQ7AKQqMkTQbrFDHK0PmsWhP2WV4A6VuwNLrSKKsWTcIv2ryscF9/yAhWgShWcRPCohBJ3CURWS/18C1YUmtEO5TCpcd03a8eTv30GvEIVsHUWrQ8eMBoRFaNTgF1CUOWfAyWHj+dUmu01Qjdv0wT8xq96to2ZItgFVCtW9FE0byV7ss+GLWs+Bgs0Yi21iu0cTTy0sWm+v5+uv2JzB/3EBGsAmr22T+vOPgaLFG09ATR6GNdjUZf+l516qiRLpJHsAoq7orsalpZMN0qn4MleoLQxbfNjGqjaLSltZuKV9G/f58QrAKr5+V30YGRxqLmevkerEF6klC4khhtDaVTx3XbHnJ9z6yphAzNI1gFV+tWvjL0coc8tEuwBmlh+rSTzo+9BVAzFCu92ki4mkewCqzWFfBD5RmGdgvWII209KqtThW1nRTFSlfT65VGNIZgFZQmgzWHpfmVeuggqLZ8JwvtGqyh9PMYe8xrf7orqZGX7saxaPPyXH5mviJYBaRI1brNcTUKgwKRtRCCNZR+PmOOObky56WAtTL60iuLaf5dynZDsAqo1m2O4+QxnxVasIZTsLps3ksjLwWsUUSrfgSrYDRnEnel++D1PTpFiZJ1JEIP1lAafWnSXst+FLB6aTI+y+VUviJYBaIIxa0l1JXs+vNcRx1+ROwV2nqmznI+i2BVp5GXLk1RvOqhJVWDT0iojmAVhJ6ZV05eUnkbRQufB19ZqvUKoiKhWGSBYMXTE5EWW+ttnLyvp/MBwSoIvSKoSdwo1U4ZdBDEPXtnNZ9FsOpT6+cl3KI5HsEqAJ02xF3RrtMEnS4Mp9GYQhf3zJ1FMAhW/WpFS9dncbfTaAQrZxpVKTpRBuetom5loljlPZ9FsOqnJxndPDDq56W7P/CnxqIRrBxpUlZ3ZdAvcZR6Dvi857MIVmPi7hZLsOIRrBwpVieN7HRRGpmD0i1S4q4BauRjNYpgNSZuVK2F0vxtxGgEKydxz7LS6DOtRmkKoEZtUdKKB8FqjH5GOi2M0n3/DPsvqiFYOdCFhXH3ZNe8VTN3DtV8Vtx1XPp4acxnEazGxT1mBCsawcqYoqLTAY2IorRykNe6Ul4fVx8/SXEHnz6XPifeFHdKqBdX9GSF6ghWhhSpG7uutWh1uihJzDVlPZ9FsBoT9yJJo1MBoSFYGdLdLLtPmGhb1SV1pbPCmOV8lk/B0mNz8ehpFvTxtvfaraUHVw9kRaMrjbKqqXaBMN5EsDIS96wqOhWYvX5eYvNLOiB0YETR50lqPsunYFW7cHPttofcws3LbCt9tX4uQ5df4e0IVgbqmbfSley6oj1Jta6gV0gUlFb5Eiw9/vd96jbbejvd4mX+zxZXnjjSos8fNyWgF1t6Vs+0LUQhWCnTL2mtm/HptCStv3iz0EIZd5uTJOazfAlWrdGNRps6Jbvrl/faXrL0e6D7nOlriJLEz6LdEayU6Zc07mZ8Sc1bRdGBomt+opaCSKtRaZdgDdLFm3c9fU/lT3QlQSNszV9GjaxEoyu9OqhoIhrBSlGtSwx0+pHkvFWUWgeqPn8r81m+BEt0nZoCUg+Fa8MLj1fC1czpul70uGT0RTZnNtH24jF3VR+ClRIdFDo4ougZde6jX2nqQGhGmvNZccFKkwKrx+9uO4XT118PjTjn26g37jS5GsVLlxzo82m+65md2yqffyjd510ff8yxJ9vPv7PyRFGPtdsetkn/pbaFWghWCvRLW+tmfHncRiSt+SyFWYHOU6MjlFpLo7JCrBpDsFJQ6xKGvH5JdYqyzOISN5+leRSdqjai2qUCWdPop9ELLjUC0tySHpc85PV74DOClYK4uSudUujUa/jpRFZqrWNs5hVLHfhxc2RZaCZYolFwj/289Jee40KeJE0H3LhpaUMjQryGYKVAp0c6TRpOv6hZzltFiTsdavZ6sFpzZGlr9RR7MFwaKaY54tJpd589IeT1hOU7gpWSaqdJrR5USVJQFdahWv36NHqbbSPLNA/4ahSBZubeouj70NKdrveensioS08A67Y9ZI/tw4SqRQQrRZrLUhR22cjqFy8+VfcrWVkZ+vUpVI3OXUXRaEUfNwtpP6b6PvQn6k8c2elGHXFsJcb6F0WPof4pUvr3c/u5ax/JIFhACxRnRk3ZIVgAvEGwAHiDYAHwBsEC4A2CBcAbBAuANwgWAG8QLADeIFgAvEGwAHiDYAHwBsEC4A2CBcAbBAuANwgWAG8QLADeIFgAvEGwAHiDYAHwBsEC4A2CBcAbBAuANwgWAG8QLADeKGqwOi1Yz9omALzBgvV+C9aAS0BiwZLJ/dPL9gYA3rBu6qrEOpPYB5LuvulPlkturG0CgHNl99C6nlWTXEKSDtYKC9ZltgkArlR2d67tWdXrEpJosCb3Te+1j3iHbQKABavUs7bn+/22mYhEgzW1r/fo3aW9v7VNAHBHlt/xrv6eFS/ZZiISDZbYaWG/nRZeaJsAAmang/fb6eBU20xM4sGawvVYAMxhCV5/NSjxYInNZQ3YR+6wTQABstHVz210Nc42E5VKsLr7Zkwtl8p9tgkgQElPtg9KJVhio6z19tEn2iaAkCR87dVQqQXL5rI6Dzr3pH2GkbYLIARlt+Mw58bZ3NWAS0FqwRIbZfXaZ7jDNgEEIK1TwUGpBku6ufodCEO5tGRdz/evsq3UpB4sIVpAe7NXBRNdghMlk2AJ0QLaU1axksyCJRat+Rat620TQBuwWH3ZYjXfZSTTYIm9ejjJXj3st8880nYB+Oi1VwOn2quB612GMg+WaJH0Hrf3mzbausx2AXjERlV3HuHecVWSi5rrlUuwBmm0dci5XsIFFJ9CNcK5FVmPqobKNViDLFydB13pKhtnTrWvqMPeBaAIyu45y0T/Ya78TQvVgMtZyf4ViuJVdqWpZVceV3au0zk3zjHfBaTP5qXsv0+WnBsouZK9LfcXIVJD/Q4I2D8sxjgWRQAAAABJRU5ErkJggg==',
+            'CSV': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAZXElEQVR4nO3dDZAcZZ3H8WdANG9nhARCOEnWRAhBSQIIlERJcl5yidxdsgavNpYJuRLv4LSUk2D5esnpeXCXcL6VBuq05E3hSmAjpYiJpQEMnrwYEApFBZKgRxBCCOT9be7/2zA6LNPd07P99PQz/f1UbbZnC3anZ6e/8/TTPb0VVzAze98zxR3mprnqwSl2s8u5in2uvs4BHpx+9KRbLzv740srlcoDdhMFV7GPtpvd29N18LDKh121Oq/qXJcDcjJ55Mnus2d9dO+gV73mLKJVfBX7aBsL1fSDlcqHq646z24CuVOwlk/9tPvDzmefOWbIyBMtWs/bl1FQbQnWvN7Fr9tR2f15W1zsgDaqBUu27Xlh0/DXvHYy0Squ3IM1q3fBvGrFfYN5KRRBfbCEaBVbrsGa9Z0Fn69WqxfbIlAI/YMlz+za8ivbPZxoiyiY3II1c1WPjarYBUSxNAqWbNr++x+N/bPXv8MWUSC5BItYoaiigiVbdm29deSQo+baIgrCe7CIFYosLliyhWgVitdgzeztWWw/QcECCikpWPLQc79eOmnEhM/YItrMW7Bm9/Z0HahU1nM0EEXWTLBk44tPXtr12jErbBFt5C1Ytiv4Y/s03QEF1mywZOueFz5w1KDhX7VFtImXYB0616raa4tAoaUJlvx66xPnTDhq3F22iDbwE6xVPU9UnetyQMGlDdbO/bsO/O7FzTOIVntU7CNTNnc1/UDF/dgWgcJLGyzZtX/3/sGvGnRGhTdL5y7zYM3q7VlVrbi5tggUXivBkt379+gKDxMsWhsccpNpsF56U/NWWwSC0GqwZPOOPzx37NBjxlu0nrebyEGmweK8K4RmIMESopWvTINlu4NX2+7g+bYIBGGgwZJndz23eeTgoyYSLf8yDdbMVQvWO1edYotAELIIljz+wsafjB/e9XZbhEcZB6unap+AYGQVLCFa/mUWrNl9b8VxT9giEIwsgyVEy68sgzXdgvVjWwSCkXWw5DfPP3HNiUeOW+yQuYp9ZIJgIUQ+giVc4cEPgoVS8xUsIVrZI1goNZ/BEqKVLYKFUvMdrB37dh78/fanp/Nm6WwQLJSa72AJV3jIDsFCqeURLCFa2SBYKLW8giVbdm/de8dTPz1x/rhzN9pNtKBiH5kgWAhRnsGSp7Y/vW30sFFdvO+wNQQLpZZ3sIQrPLSOYKHU2hEsUbRspDXCFpECwUKptStYcv8fHvrtW0ZNOsEW0SSChVJrZ7CEN0unQ7BQau0OlhCt5hEslFoRgiW3b1z79TldMy6wRcQgWCi1ogRLiFYygoVSK1KwhDdLxyNYKLWiBUt+9Lt173/H8W/7mi2iH4KFUitisHbs21n9waY7Fsx/4zv/x26iDsFCqRUxWEK0GiNYKLWiBku4wsMrESyUWpGDJZu2/37Xfc88OJErPBxSsY9MECyEqOjBEqL1JxX7yATBQohCCJYoWmOG/flxZb/CA8FCqYUSLHnkud9setOIE8faYmkRLJRaSMGSsl/hgWCh1EILlpQ5WgQLpRZisOR/N/98/VtHn36aLZYKwUKphRosKeObpQkWSi3kYEnZokWwUGqhB0vKFC2ChVLrhGBt37fD3fLb777//JN7Ov4KDwQLpdYJwZKyvFmaYKHUOiVYUoZoESyUWicFSxStz93zxWmXve0THXmFB4KFUuu0YMkTL2w6sH7Lw+M78c3SFfvIBMFCiDoxWKI3S3fiFR4q9pEJgoUQdWqwpBOjVbGPTBAshKiTgyV3/d/Pnvuve64cv6r76o64LA3BQql1erBk3VP3bX7bcWeMtsXgESyUWhmCJZ1yhQeChVIrS7Dklsdvu2f++HPPssVgESyUWpmCJdf+8ts/Of/kv3u7LQaJYKHUyhYsufXxH9wwd/zs99hicAgWSq2MwZKbfvO9L7/7xL/+kC0GhWCh1MoaLF3h4aqHr1+65LQLP2M3g0GwUGplDZaEGC2ChVIrc7BE0Vq96c6eUK7wQLBQaqcceZK74pyltlReerP0fz/0zRkhXOGBYKHUBrlXu1vnXmNL5RZKtCr2kQmChRDt37evL1jDjhhqt8othGgRLJRatVp1y8/+lJtyzJvtFh7Z8uvdn7zrstFFfbM0wULpLRj3t+7vT1lgS5AiX+GBYKH0Jgwe674863JbQk1Ro0WwUHq7d+5wt513A/NY/RQxWgQLpbdv7x730dM/4OaMe4fdQr2ivVmaYAHmja9+vfvqnOW2hP6KFC2CBZhdO7a7b8/9ujt26DF2C/0VJVoECzAH9u93f3HsW90np37EbqGRj9992a2XT/3EXFtsG4IFvOTFbc+73vnX2ijraLuF/vS+w3a/WZpgAS/RWe9njDjF/ceMpXYLjbQ7WgQLqKNR1srZyznzPYai9e/3fenSy87+xAq7mSuCBdQ5eOCAG3bgNe6b865yQ48YYl9BI49t2+BWrL/qvVfOuPybdjM3BAvoZ8+uXe6to05zl8/4F7uFKO14szTBAhrY8cI2d8GUhbzHMEHe0SJYQAO6isOL27a6Zed8zM1+wwz7CqL88Mmf7P3P+1eetab7Ww/YTa8q9pEJgoVOQ7Sap2hdcf9XJtzefeMG51HFPjJBsNCJdEKpjhwumtLjPnja++wriJLHm6UJFpBARw63v7jNnTH61L6JeI4eRrv5sds2X//Qtyf6ihbBAppQ2z0c9qqh7qIz3+fmn3CufRWNfOWhazb98LG1k31Ei2ABKehN0rt37XQnHzPR/cPpi9zU4860r6I/ReuDkxaPtcVMESwgJb2FZ/sL22zUddCNPXKMu+DURe7trz+LXcV+fFzhgWABLdAuoq5UqtGWVCqHuTeNOsmde8JfuROOfIObfPSb7KvlprfwfO7eL2V6hQeCBQyAjiLutN3E/fv22q2XG3Pk8W700FHu9OOm2K1DKpWKO+GocaW5HLOi9a1f3tTz1b9cnslfliZYQAa0m7jLRlyNwlV2gwcN/ue73vu9L9jigBEsIEMK1x7bTdy7d4/dghAsoOB07tae3bvc3j173MGDB+wr5UWwgIBonmvvnt32Uc54ESwgUBp5HTx40JbK4whX+ZvV777pu7Y4YAQLgFeHV92M27tvXOsyQLAAeEWwAASDYAEIBsECEAyCBSAYBAtAMAgWgGAQLADBIFgAgkGwAASDYAEIBsECEAyCBSAYBAtAMAgWgGAQLADBIFgAgkGwAASDYAEIBsECEAyCBSAYBAtAMAgWgGAQLADBIFgAgkGwAASDYAEIBsECEAyCBSAYBAtAMAgWgGAQLADBIFgAgkGwAASDYAEIBsECEAyCBSAYBAtAMAgWgGAQLADBIFgAgkGwAASDYAEIBsECEAyCBSAYBAtAMAgWgGAQLADBIFgAgkGwAASDYAEIBsECEAyCBSAYBAtAMAgWgGAQLADBIFgAgkGwAASDYAEIBsECEAyCBSAYBAtAMAgWgGAQLADBIFgAgkGwAASDYAEIBsECEAyCBSAYBAtAMAgWgGAQLADBIFgAgkGwAASDYAEIBsECEAyCBSAYBAtAMAgWgGAQLADBIFgAgkGwAASDYAEIBsECEAyCBSAYBAtAMAgWgGAQLADBIFgAgkGwAASDYAEIBsECEAyCFaBRQ452owaPtCXnJo882f79kweffcT+de7pXc+6p3c+Y0vFNmnERPv3kPp12b5vp3ts2wa3Y78+b7SvAAQrCGcf+xY3fvhYN8k26PqNuhkK2C/s4+7N9xViw9f9V6TSrovipfuv9fnp5vstaDvsq9nS49w9fk7f/dLPu+5XN/c9bkWk58N7J8x3U0ef0Xdf9bhc/+gtXh6XIiFYBaWNZubx57izR7/FDTtiqH1l4DbbiKv3se+7NU/emesTW/df66IYHGujwyxoA1296Y7M4qVYLTvrElt6uWU/u6Jw0dIIe+X0y/oe13r6/f7T2o9n8ngUFcEqGG3YC086L7MNuxE9oRWu3sdv71v2qXvcHFuf+a/YuLKi+5/Futzyzq81vI/6nu+67QJbKo4lp17kZo05x5ZeafWmO92K9SttqTMRrILQiOqSUy/0Gqr+tDGu+PmVXkYQGgUssfXReuVB66JwXffozXYrHd3X62Z+yZYaK9IoS1G9duYX+z43olHWojUfsqXORLDaTE+8S079x765iHbRrtWK9VfaUjY0v7J86qf71i1vms/Rumi+q1m6nwrW0COG2K1Xuvup+9yye66wpfabdfw0t+S0C22psSLdVx8IVhtpw1565iUtj6o0md7fUNv49H3T0oZ+6bp/6xupDIR+dtpYZbkeNRo5rn7yDltqzkVvXtQ3xxZloY1ainDUVXNX44d3uShp1zs0BKtNkl4p+9thh/nX2aunNu4HtzySuPFoV0wTyZq01y5PMwYaLUUqbnelRvddcy13b77XfuZG+0o0RWvyCDuyqPWxdUkjTWT0GGmUFUVHDK979CZbah89FiunX25LjWldtc6djGC1QZpY6UmojUVzKK2GRD9PE9/aKJMMJFpLz/xI7K6tonvdr25ytzz+fbuVnkI4yw5KaCTUzLrocUsTmRU2MlQYGynC3FDcZLukXd8QEaycKR7NxEob98qHrs10eK+ffdEpi2x3a4jditbKE18jOu0KRtFISnMrCnAWtC5JEb7SHr80cdT3jPvdtHvyPepIZo1GV1k9vkVFsHKkXbRG5/r0p4lTTRy3MspJoie8jt7F7V5pt3PJus/aUvOW2Vxc1PfURnSRh/ODtC4LJ8zvG3E10soG3PvOr0cGXbux7TplICmmes7oBaHTEaycaCSgCVNtZHHSjgpatXDCeX0jlEbSBkvrFjf/c6l9L53o6YvmdrS7pM+i0enyn69saTSUNPmuc7KyDm8zNHrVKDZKu0d/eSFYOVGs4o7uSN5HeKJetdM++d81bo670HY1G9Gu4EVrP2ZL/tU26IHEMSm+eb2g1Eu6TxpFajRZBgQrB3GjmZq8Y1VTf980MmllUlyjm6jJ4Hat10AUbfI9adTXypxjqAiWZ3p11Ogqblcw9Cdc3Abue3fQh6iRZ41GjBo55uVaG13FnavXrt3UdiBYnsWNPkRPfG0AIVOQo3Z3QwyWFGXyPelATZ73pQgIlkcaXcXNPYjmHjQHETKdzFib8O4v1GDF7YZpNLNozYf7PvsWd/RVQn18W0WwPEoaXYW+K1gTt0sY6jomvdjkMTeXdB/0QqcXvDIhWB7FneinCW492fJ4lfYtbhSg9ctrNJK1uJGj3hGgc8t8ijv6Ku04YtluBMuTMs091B9pbCTrq0Hkpd2T73GT7Z30gpcGwfIkaXfQ95M9T0m7LrLuqXvdFeuvCmoD0+hY6xU1+a7rb618+Fpbyp7OKdPJolE66QUvDYLlSdyrYyfOPcTtPtXoHCad56VLNIci7oVH8dUpBT7E/VzppBe8NAiWB0kjDp+vzO2StAtcT+HSY6BwaaMvMkVYMY7iY/JdIzvNf0ZRqBSsMiJYHiRtvGnf+hKKuMn3KNpV1Bt3s/pjEj4oWApXIzqlQKcWZClpst1HJENBsDxImoTWbkRRN86B0MhAI8uoOZ8kOvKmeCnmGkUURdLku3bvtZuflbgTccs62V5DsDyIm3/QE677tvfZUmdStDRZHDUiaZY2SMVLI5h2j760TnEhzvJcMz1uGtFFKetkew3B8iDuRMq0l24JkTbwZWd+JPIxaEW7dx3jXoQ0J5fVG6Ljfo5odJXlaC40BMuDsgerRrtSzVzhNC2d16V4adcxL0kjnyzmJRX6uGvil+m5E4VgeRA3B6ENrQxXhqzRxqc/pvqu8XMyD5dGNnmeJqFgKVyNZPF7VeDj5srKPNleQ7A8WD33Bvu3sSznO0KicOnoqd5QHLXRt0qT9TqT3vdEfVJQBnowRXN/OmG0kU6f+2wWwfLA9ytx6HSe2lSL18wx0yIfp1ZotNXKX35ulqIbN/k+kPf26THR946i89Y67dy9VhAsD5jDap42VP3dQZ2/pdFFVAyapdFWq3+mrBlxk+LaRW118j3ucjZS9sn2GoLlAcFqnaI16aWAtTr68hkt3SeNoKPoJFKdipGWzmzXCK4RnjN/QrA8iDvjWxuR5jqQrDb60ogm6gUgis/zlRQshauRVn5u0txYFkcgOwXB8qCsZ7r7pHhpw05ztLHV0U4S3Y+4wKT9/ca9wGk3ULuDOIRgeZD0hPa1IZWF3mu38KTzEsM1kDmlONp10wR51M9Pc/qBQqzvFaWsR5WjECwPtLug3YYoHPEZOG3oGpnosY7ja3cqbvJdc2jNXo00aTSu0ZVGWTiEYHkS91dXfL3yl41GOjp3KS5arcwpNUM/M+5FSZd/aea8sLjrpnEKzCsRLE/06h81LyHNPqERT9HSOws04mpEc0maU/JBwVK4GmkmlDqRtoyXIRoIguVJ0jxWM09oNCfpsfa1WxX3c5sJZdxupe6v7jdejmB5old+nVsTRU/oUP+aTBHFvR3qUk8HOfQ71oR51K5/3OS7/t+458dAzprvZATLo7hXUGHyPTtxJ+v6CpbE/Y71M/WzG9GRzririmp0xovZKxEsjzS/oXmOOBr2a/iPgYkLls/RStLvOOr3GzfZznRBNILlWdyGJGkOgSNa3OOsUY5GO74oWApXI41G0fpv9f9E8X1/Q0awPEt6ckqjJzXS0ZHCqGuQ+Q5A3O6dduu0e1cvbjdSozGNytAYwcpB0jvxJW6C1ie92XjeuNlu6ugz+jbq6x+9ue9zWpNGTOz7XqufvLNvo8uTTmnQ5HcUBUPh8CVpAr3+9AT9t3FXFW3X8yAUBCsHenJqg4o6mlST95M16rB8mhGJ1m351E+9bHST93rEnS2uc910zptvcaOm+hNAox5z0UX6NLryGdfQEaycaPShs7KT5LWxx2049RtYkqhY3PLYbe7Kh6+zJb+SRld57W4n/X4VIo0843ZdmWxPRrByFLVx96c/sqCN3dcrra6xrj8OESXN9ZfiJrt1QMHnpYsbje76q4UiDwqnAtqI3sR89+Z7LViX263GNBL09Vh1CoKVs7hdh3p6v+EVtrE3u2vWDG1MS069sG80ECfNK31csGp8BLiZWKVZjyzETb7r9/lTG7lGzWUqVAoW4hGsNmg2WqJgtToRXqONu9sm1nVJliSaR7nQNpxmRyVJ75msp3DpmuvNfu8oM48/p2+EqPWKknY9sqD7Ezf5rmDrv2kkr6mA0BGsNmnmyGE9vUKvsQ1eR5v0atwMvblWMZk1ZprdSqaNfMm6zzT9/UWnbShaGr01S7uKGv38Yssjttzcz9L315FIRTfqhMt6Pk8WjZPmxahGj7t2XRU0xCNYbaSJb40Uko4e9qcntjZ0jR70UU8btj6Sdvv600aTNlY1GjVowlnxSituXfS4jB/e1bc+zUSqRjHMc1ewnh53PRZp5HVgoBMQrDbTRq5XZX1uFwVDpzIoHgPR7EEFn9oZq5q4yfdGNLrqH2s0RrAKQht7muuVZ0VHr7K8BK/Cq93dpIl4H9q1G9ifRs5Rp4z0l+aILAhWoWjXauGE+TYHMs17uLShaDdEoysftNFqtJVmpNEq3+vSCp2+oHgn0ZHBIt3voiNYBaRwzbIjYVn/ZWTRLtMaOxo1kKOOaWhOR+d9afI/awqVjjrmtS5pKNQ6GBH3++PIYHoEq+D0xNefddcGrwnotCMvTaZrg9bGrff5DXSeqlWKsI5aaldx8siJfevVCq2HzsRfZ0dLiz7vo3VWrPvv6ut+64Ra/V6QDsEKjF6xtSHoryPXaOMfZhtE/a6FThlQnOq/ViRaB63LqMGHjmrWKGbbLbL197vo69KM2voSqYEhWACCQbAABINgAQgGwQIQDIIFIBgEC0AwCBaAYBAsAMEgWACCQbAABINgAQgGwQIQDIIFIBgEC0AwCBaAYBAsAMEgWACCQbAABINgAQgGwQIQDIIFIBgEC0AwCBaAYBAsAMEgWACCUdRgdVmwnrBFAPgjC9YbLFgbXAYyC5bMXNVTtU8A8Edr5t2YWWcy+0Yyq7fngWrFTbZFAHCu6u5Y033jdJeRrIN1tQXrfFsEAFepumtWd9+42GUk02DN7O1ZbN/xG7YIABasSvfq7htW2WImMg3WvN7Fr9tR2b3VFgHADa0OOnJV99XP22ImMg2W2G7hKtstnGuLAErMdge/Y7uD82wxM5kHazbnYwEwh2d4/lVN5sESm8vaYN95rC0CKCEbXT1oo6sptpgpL8Ga1btgXrVS7bVFACWU9WR7jZdgiY2y1tp3n2aLAMok43Ov6nkLls1ldR1w7gH7CcPtJoAyqLpthzs3xeauNjgPvAVLbJS12H7CN2wRQAn42hWs8RosmcXZ70A5VCtfXNN9w8W25I33YAnRAjqbHRXM9C04UXIJlhAtoDPlFSvJLVhi0Vpm0VpqiwA6gMXqXy1Wy1xOcg2W2NHD6Xb0cJX95OF2E0CIDh0NnGdHA9e6HOUeLNGbpHe63V+w0db5dhNAQGxUdc0QN+jiLN/U3Ky2BKtGo62Dzi0mXEDxKVSHOXd13qOqem0NVo2Fq+uAq1xs48x5do/G2pcAFEHVbbRMrDrcVb9godrg2qxiH4WieFVdZV7VVadUnetyzk1xzHcB/tm8lP37QMW5DRVXsc/VVUWIVL3/B+VPYSz5FmyjAAAAAElFTkSuQmCC',
+            'TXT': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAATEElEQVR4nO3dX4xc1X3A8XNmZmespcDyR4CMmjXFCW6QjEmJUaRgm4f4LUAl8lC1oX4ILygIo/ixFKrmrURxGyQe6ihQniyC6pI84UqYyC9eRzJBReKfFENJqdVEtmN18c7Mzu3vN3ja6TJz7+zuvWfOb873I13vGSNWM4b5+t7f3HvXu8hkZxYW2t3lvbLclWV+n3fZgq5lA0rn579yqXbjnz/auOXxo/IQkYsiWBqpTvvyg5nvHZSHu2QDgvBX73WN7S9nvd+99GdEK35TDVZ2Zsu2Tid7InPZAefcgmxAUF6CNbfjNZe1P+765aPb/XWHPpTfRqS8bFOxcrr5tMvcQVkuyAZMxSBYKvv03U/9ys//mGjFy8sWVHvpql2Z6/xElrtkA6ZqOFiKaMXNyxZMe2nLgcz1fijLBdmAqVsbLKXRqs3vmJclIhMsWFdipXtWQDRGBUv1Lh7/oL6w/4uyRESCBItYIVbjgqWIVnwqDxaxQszygqWIVlwqDdaVAfvrsmRmhSgVBUtl5185Ubv+4ftliSnzslVmZal5Rr7skg2I0iTBUr3/evHH9ZsOfEeWmKLKgrVyqvmMfPenZQlEa9JgKaI1fZUESy+1aXeWfy3LBdmAaK0nWIpoTVclwWLvClasN1hZ9yLXHU5R6cFi7wqWrDdYimhNT+nB4jQGWLKRYCmiNR2lB2vlVOuY89mDsgSit9FgKY2WP39kj7/p0El5iADKD9ZSM5MvgAmbCZbS6w65WDocL1tpOqe37OtlvddlCZiw2WApohWOl600l0+3Dvos+6EsARPKCJYiWmF42UrTXmodzlz2hCwBE8oKlupdOvlJ/Zr7tsoSFSk1WJeXWie8y/bKEjChzGApLpauFsFC0soOliJa1SFYSFoVwVJEqxoEC0mrKliK6w7LR7CQtCqDpYhWuQgWklZ1sBTRKg/BQtJCBEv1zj3/ZP2Wxw7LEptAsJC0UMHS6w65WHrzCBaSFipYimhtHsFC0kIGSxGtzSFYSFroYKms/XHXLx/dznWH6+dlKw3BgjXTCJbiYumN8bKVhmDBmmkFSxGt9fOylYZgwZppBktptGrzO+ZliQkQLCRt2sFSXHc4OYKFpMUQLEW0JkOwkLRYgqWIVjGChaTFFCyVnX/lRO36h++XJUbwspWGYMGa2IKluFh6PIKFpMUYLEW0RiNYSFqswVJE6/MIFpIWc7C47vDzCBaSFnOwFNH6/wgWkhZ7sBTR+j8EC0mzECyl0fLnj+zxNx06KQ+TRbCQNCvBUnrdYeoXS3vZSkOwYI2lYKnUo+VlKw3BgjXWgqVSjpaXrTQEC9ZYDJbqXTr5Sf2a+7bKMikEC0mzGiyV4sXSBAtJsxwslVq0CBaSZj1YKqVoESwkbRaCpVK57pBgIWmzEiyVQrQIFpI2S8FSsx4tgoWkzVqwVO/c80/Wb3nssCxnDsFC0mYxWHrd4axeLE2wkLRZDJaa1WgRLCRtVoOlZjFaBAtJm+Vgqaz9cdcvH90+K9cdetlKQ7BgzawHS83SxdJettIQLFiTQrDUrETLy1YaggVrUgmW0mjV5nfMy9IsgoWkpRQsZf26Q4KFpKUWLGU5WgQLSUsxWMpqtAgWkpZqsFR2/pUTtesfvl+WZnjZSkOwYE3KwVLWLpYmWEha6sFSlqJFsJC2q/a65pfTDpayEi2ChaRlXedaX1uRVdqsXHdIsJA0DVbzK+8531qUR2mzEC2ChaRlmXON23/q6jd8Ux4h9mgRLCTPX/+4m7v9WVlBabT8+SN7/E2HTsrDqBAsJC+r7XStPzktKwzodYcxXiztZSsNwYJF2Urmmve87/yWRXmEgRij5WUrDcGCRVnHufris65x6+PyCMNii5aXrTQEC1Zl3UXX+tp7ssJavUsnP6lfc99WWU4dwQJE77IcFu78V1e7do88wlqxXCxNsACRrcqbobXHNe8+Lo8wSgzRIljAFb3/lr2su9nLyjPtaBEs4Ao9693Vd7rWbk5xyDPN6w4JFjCk92nmGotP9TeMN61oESxgSNaTTQ8N7/2lq121U34H40wjWgQLWEPPy3Ju0TXl0NA3rpU1xumde/7J+i2PHZZlEAQLGEEPDWvX7HXNXcflEcbR6w5DXixNsIAR9C4OemhY3/qIm7vjiPwOxgkZLYIFjDEcrcbtP+DwMEeoaBEsIMcgWv4P7nJzX/4xg/gcWfvjrl8+ur3K6w69bKUhWJhF/Wgtyy+1BdfY/teusfW78rsYpeqLpb1spSFYmGU6iHcdGcbfsM81/ugpGcrvkd/FWlVGy8tWGoKFWaenPGSXM/lFwnXLQ67xh48TrhE0WrX5HfOyLBXBAtYp68mme1ursgk/f5ur3/qI7Hk9wIxrSBXXHRIsYIOG97b+V/M6V7t+r6tdfVd/UK93Ma3NpxuxsqNFsIBN6LeqncknZPK1/6CABk1ilhK/+p9PNO/5t3+Q5aYRLKAE/VatJ1wJ8VvqT275+kopl+8QLKBkGq1MPk0czLhSR7AAA3Q4r6dB6KzL9TL5JU0ECzCmH6+ufO1m8ousE1Kfqz/a/PrlI7LcNIIFoFI1X7t/7quXT7gSECwAlSJYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYAMwgWADMIFgAzCBYVakvuNqNf+G8fI1RtvKh6/3uJVmtQ3Oba3zh75y/eo/L2vLv//afXO/cc/IPpssvPODqt/6Vq83f5XrnX3Wr//F9ly3/Sv7J5Go3fNv51qKs4pOtXpDX9XPn2mdd6ghWFeSNPXfnKecbccZqoCdv6u7bu2U1AQlv/zW1trlhqxKt1V8/KqvpqG99qh+rYVn3guu8dYc8uQvyqFhj+8uudt0DsoqXvqbuu/vXHeJZQ7Aq0Nj+U3kDfFNW8et+dEj2kn4kq3y6FzP3xZdl9XmTfo+ylfGc8r5HbHrnf+a6Hzwsq3QRrArM7Xz3c3sisVr97Uuyh/QdWeUbtSczrCN7akH/9m9u+2yPb8xe7Opvvi+Hhn8rq3xFrys27dMt+TVdBKsCjTuOu9o1e2QVv0nf2LUbH3GN2/5RVqNlK2clWvfKN7wgj6rXuHOpP7MaZ9I9rNrNj8tc7llZxU/njp23viSrdBGsClg5zMi6FyUyMsOacJhbFOJQ86yivaLe8luu+8435AlNEM/+bG5J9ogX5UHcJo3wLCNYFfHyt39NwrUZ+mncuED0fv8Ll136haw2blX/55/kTT2gb+6d78lh2LXyYLSuBEs/PayKv3qvm9vxmqxG0wh33/3G+g5P5XXVbpRPCeXrhknw6vI9RtE9o54cem9GT/5bZ5fekFXaCFbE8vYkJj2UK1txMCr8NEuC0p8PjplbqaqDOU7en4v+5aIRxeYRrIjFGCxV/8IPXP3m78pqtP7pEu/slyd5QR6Vp3HHa7LHOf5/iUk/QKgCwQqDYEUs1mCpxp2nZei9U1ajlT3PyvuzUOuaW1WAYIVBsCKW9yaddrA+O61AhtU586zO+99y2YVXZbU5eTFQG5pblSzvORKs8hCsiEUdLFH0aajOs/qnOrTPug3TuZWeb9Xa5saZ1txqGMEKg2BFLPZgqfptR8Z+Oqb68yw9dWKDii6bmebcahjBCoNgRcxCsHQPqLHjeP4869xzbvWj78lqfYpO6pz23GoYwQqDYEXMRLCEnnOmJ5WWOc/S76kzsnFimFsNI1hhEKyIWQmWKtobWtc8S/baLMythhGsMAhWxCwFSxXdpaL3+zfkjbtfVvmszK2GEawwCFbErAXrsz2jJdkzWpQHoxU976KLrGOaWw0jWGEQrIiZC5Yomj2pzjv7R14Xp/+uns0+7tKb2OZWwwhWGAQrYhaDpSaaZ629I6jsnTXkDZ97y5jI5lbDCFYYBCtiVoOl9FPDcXeaUGvnWXU5DKzL4eA4Mc6thhGsMAhWxCwHS/eYim5FM3gNVudWwwhWGAQrYqaDJfLexAN6fpbGyuLcaljeayVY5SFYEbMeLJX3GiYR89xqGMEKg2BFLO/NbiVYquhWNOPEPrcaRrDCIFgRm5VgTXIrmrUszK2GEawwCFbEZiZYouhWNMOszK2GEawwCFbEZilYqujWygMWXxvBCoNgRWzWglV0QulA/x5a7+yXF2njcFARrDAIVsRmKVh62Y3OsSZV9j3hq0awwiBYEZuZYOlJpAW3ixnFyikNimCFQbAiNivBKrpdzDh6zaFevmNh+E6wwiBYEZuFYOW9hklYmWcRrDAIVsTy3uwWgpX3JlaD0xd0D8zn3UNLDgtjn2flvVaCVR6CFTHTwdK5VcGPlR/cF2uSgXzs8yyCFQbBipjlYOmN+HJ/rPya5190ykPs8yyCFQbBipjVYBWdIDruDVx4T3iJVazzLIIVBsGKmMVgFV2Co3OrzltfkhcwIjr9w8iCe2jJYWGM8yyCFQbBipi5YPUvcj4lwVmQB6MN5lbj5L3xB2KcZ+U9b4JVHoIVMWvBasjgPO+e7JM+57zXrWKcZxGsMAhWxPLeuJO++UMpuid77/zPXPeDh2U1mcJ7wkusYppnEawwCFbErASr6J7s2cqHrvP2bnnS64iLsXkWwQqDYEXMQrD0HCo9hSF3biWx2sjhW14EBmKZZ+U9V4JVHoIVseiDJXtBhT9L8KNDrnfuR7LamLw/AxXLPItghUGwIpb3Zo0hWGXPrcYpuid8DPMsghUGwYpYzMEqPDN9I3OrcfqnS+TfE37a8yyCFQbBiliswdK5lQZkHD05VN+gZR6mFZ2QqqY5zyJYYRCsiEUZLJlb9U8ObW1z41QVjqJLfqY5zyJYYRCsiMUYLL0VTN7N+Kr+WYKxzrMIVhgEK2KxBatobhXkZwlGOs8iWGEQrIjFFKy8N6SqYm41TtGJqqqqw9Jx8v58CFZ5CFbEogmWzq0KbsYXOhD12464+o3fltVooedZBCsMghWxWIJVdJ+qqudWI0lEGzuO586zQj4vghUGwYpYNMGSmdG4s9n7c6u3vyqr8PT0Cr1Ietw8S/eyOmdullX1CFYYBCtiecEquq9UmTQKo+6coHOr/smh7bNuWvLmWf2TV/VmgQFoPPXDgFFC7unNOoIVsXFvgv4bUUNR5adxQ8Z9Oth5/1suu/CqrKZr3Dxr9dxzbvWj78kqjHGnXIT8y2XWEazI6RneDXlDDg579PBi9d8PBRsmD6zd2wsdg1wj5ln95/cbOWQOFHWlf8FoPAfPQ/dAu7JnFUPUZwXBMkLfDKEjNYrOanQPb5qHgWM1tznfWpz+3owEtL/F+GdkHMECYAbBAmAGwQJgBsECYAbBAmAGwQJgBsECYAbBAmAGwQJgBsECYAbBAmAGwQJgBsECYAbBAmAGwQJgBsECYAbBAmAGwQJgBsECYAbBAmAGwQJgBsECYAbBAmAGwQJgBsECYEa0wVo51TrmfPagLAGgrzlXu83fffmsK0HJwWo+I9/xaVkCQF9rd7u0zpT2jVR7acuBzPV+IksAcJnzb2zZvbLPlaTkYF21K3OdM7IEAPWi7GEdcCUpNVhqZal5Qb5cKxuA1NXcn7buaR+TVSmqCNYLzrm/lA1A4ppz89f5uy9ckGUpyg/WL5sPuZ77Z1kCSFnm/6V178pDsipN6cFSl0+1znqfLcoSQKLKPP9qoJJg8WkhkLxfybB9l3wtVSXBys4sLKy0P32TvSwgUSUP2wcqCZZiLwtIU9nnXg2rLFiKawuB5FxsztV2lXUpzlqVBksPDdud5bOO87KANFR0KDhQabBU5/SWfb2s97osAcww7/zfN3evHJRlZSoPlmKeBcy8Ui/BGSdIsBTRAmZWkFipYMFSV86Cf8Ex0wJmQ+b+pnVv+xkXSNBgqezMlm3tTu+YLO+SDYBNF2u+9lDZZ7IXCR6sgSs3+zsoy2tlA2DHi825+YNlXtQ8qakFS/X3ttq9A/IsDspDwgXE7UXZq3oh9F7VsKkGa0DP1+p0Lj8kQ3kN112yAYhAlvkPa94dm5vzh6s6GXQ9ogjWMI1Xe3V5n1t1uzLv98lQbxvXJAJBXMycf9O77Ky8995sNfyxGCI17H8AEVYSDnEewGkAAAAASUVORK5CYII=',
+            'ZIP': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAZuElEQVR4nO3dUXLbRrYG4ANq6pb9ZOk6VfYkD2FWEGUFJldgeQWWV2BlBUOsIPIKQq8gygYu6dmA5RVYfkjGrrKvlKfkIWLfHzF9k9FIRHezT+M08H9VMKGaqUo3zumfBChAlRARFYKBRUTFYGARUTEYWERUDAYWERWDgUVExWBgEVExGFhEVAwGFhEVg4FFRMVgYBFRMRhYRFQMBhYRFYOBRUTFYGARUTEYWERUDAYWERWDgUVExWBgEVExGFhEVAwGFhEVg4FFRMVgYBFRMRhYRFQMBhYRFaP3gXX/n+cP5HI1cVLtV7LaxetEqM8u/iaj6U/TvVPsU8/0MrA+/5/zh5eVOxRxB0KDVIl78nb62VyoV3oTWOPF+e5vcvkQU5o5/Cg0eAyt/qmwFe/zxfnBSlbfMajoKoZWv1TYirX+VPUDr0vRJgyt/ig2sL5YnO//LqsFdnexEW2ERp+/nd59gl0qWIWtOPcX7w/xqeo77DKsyBuanaFVuApbUdZh9T12iYKh4RlaBauwFeP+4nziPp4GEkVD089vyejbs+neBX6kgqB2ZeA1q8H7BdsdbKmc3pbRlKFVliICq/k28NePYbWPjQYIjVrjZexEHuM1FYZWYSps5t1ffJg5kX9glwYKjVrj2tMMvTB3DK3BQh/YhutWY1y3eo1dukYl7gX+XYoqN8EXHQ+w05lqHVgCCK2ZS/sGdlrJ6NHb6d6ZkGnoA9vuLd6fYJgPsUvXQAH/fyFrUQiIYFfnqfBtMW+aLgD6wC5+umqHAv7bQtZgMbAaDK3hQR/YhYUyd2mvV/QOCvgfCzk11GHmDAZWg6E1LOgDm9bfDL7G7i42ugEKeO1CTslyYDXwSXyCT+In2L2DLYWL9TWtpZAp6AObFN45ewkFvHEhp2I9sBrr39NbSrrQwn+TN01bgz6wCYtk7ng62AoFrDct5BRQi5kzHlgNhlb/oQ9swiJ57UTGQhtVHgt5W6hFEYHVYGj1G/rAnvX1q3PsUgsUsPZZyNsoKbAauKY1Xl/T+hpbKkfvpnef4ZU6hD6wBw03QcMtsEstUEDvhRyrtMBqrN/0lpIwtDAGPumhYxU2c3jB3R8KGLSQY5QYWA2GVv9U2MyxsEBKgQIGL+RQFuoRO0+GVr9U2MyxsEBKgQJGLeQQFuqx7Twxh7lL+q1zdXJbqie8aTov9IE9aK6Z63iBlAIF3Goh+7BQjxTzxDzmLmlo8UkPuaEP7EFjzVzHC6QUKODWC7mNhXqkmifmMncMrWKhD+xBU81cxwukFChgkoW8iYV6pJwn5jN3DK0ioQ/sQUPNXMcLpBQoYLKFfBML9Ug9T4Vvok//JqMnvGlaF/rAHgsLpBQoYNKFfB0L9dCYp0JoXSC0pgwtPegDeywskFKggMkX8lUW6qE1T4ZWWdAH9lhYIKVAAVUW8l9ZqIfmPBla5UAf2GNhgZQCBVRbyJ9YqIf2PBVumr7YwTWtn6d7J9inRNAH9lhYIKVAAVUXcsNCPXLMUyG0MG4+6SEl9IE9FhZIKVDAWnshW6hHjnk2GFq2oQ/ssbBASoEC1toL2UI9cszzkya0LmV14kS+xI9JMLTSQB/YY2GBlAIFrLUXsoV65JjnXyndND3DHGrsUqQKmzkWFkgp8M69xL/YVGXok81/rBUDyBpYDaXQmmMeT7BLESps5jCwbEGTqIdFW81zjOE6DC1bKmzmtDUv5YUmUQ+LtprnGMNNmtD6TS5xTevmT4ChMB+GVoQKmzltzUt5oUnUw6Kt5jnG0AZjnLuEN003p/O3ZOcRb5r2hz6wB40xcxual/JCk6iHRVvNc4zBB8Y5dwlDC/ikhwDoA3vQFDO3oXkpLzSJeli01TzHGHxhrHPH0OoE+sAeNMTMbWheygtNoh4WbTXPMYYQ9xYfjvHyFFsqDC0P6AN72pqX8kKTqIdFW81zjCFU6pumMcezHRk94k3TN8MxsqeteSkvNIl6WLTVPMcYYqQOLeCTHjZAH9jT1ryUF5pEPSzaap5jDLEYWvmgD+xpa17KC02iHhZtNc8xhm18vjg/uJTVXNLdNM3Qugb6wJ625qW80CTqYdFW8xxj2FZz03TiJz1cVOK+5U3Tf0If2NPWvJQXmkQ9LNpqnmMMKSiEFubOJz18gj6wp615KS80Sa0dFm01zzGGVBhaetAH9rQ1L+WFJqm1w6Kt5jnGkNI6tOaS9KZphhb6wJ625qW80CS1dli01TzHGFJrbprmkx7SqrCZ09a8lBeaRD0s2mqeYwwaGFppVdjMaWteygtNoh4WbTXPMQYtDK10KmzmtDUv5YUmUQ+LtprnGIOmj6F1OcdMHkoiOCaDC60KmzltzUt5oUnUw6Kt5jnGkAPmOXd80kM09IE9KOrMbWheygtNoh4WbTXPMYZcMNe5Y2hFQR/Yg4LO3IbmpbzQJOph0VbzHGPICfOdO4ZWMPSBPSjmzG1oXsoLTaIeFm01zzGG3P6++HC0EvkOu6n0PrTQB/a0NS/lhSZRD4u2mucYQxf4pIcw6AN72pqX8kKTqIdFW81zjKErDC1/6AN72pqX/lSJe4F/l6LPYVP0xx9SncgNqh4HVoOh5Qd9YA8Dyx8KqL6QLdQjxzy7dn9xPnGyOsHuHWwp9C600Af2WFggpUAB1ReyhXpgns8xz0PpufVN00tJF1o4dv25aRp9YI+FBVIKFLDGQp6JIgv1wKJ7gUU3kQFgaN0M/W6PhQVSChSwHkJgNd5N72K6w8DQup7JBrCyQEqAAtZDCSxcj/mmT9dj2uCa1nh9TetrbKkcIfif4bVI6Hd7rCyQEqCAgwmskci3/5rePcbuYHy8afqPT1rJQgs9U+xN0xU2c6wskBKggIMJLJzSLHFKM8XuoDC0/lRhM8fKAikBCjiYwGpUMvrq7XTvTAaGofVRhc0cSwvEOhSwRtPNRJGleuSYr2WoxdwlvGkax3N+S0bflnL/IcZrD4oyc0YWiHUooPoCNlaPi9v4lFXKAtOAesxdwtCCUxzTaQnHFP1uDwoyc3YWiGko4NACK8ucrUNN5m6AoYXa24NizJyhBWIZCqi+eA3W4wLXsr4Z4rWsv0Jd5m5goYV+tweFmDlbC8QsFHCIgQXVybvpfz/CzqAp3DR9ijeDR1bfDNDv9thcIDahgAMNrGH+XtZ1FELL7E3T6Hd7rC4Qi1DAwQZWAwtrUL/9fpPUoZWjr2JgXPZYXiDWoIDqjWW8HmY/DeSWMrRy9FUMjMse4wvEFBRQvbEKqAdDay3VTdM5+ioGxmVPAQvEDBRQvbEKqQdDay1FaOXoqxgYlz2FLBATUED1xiqsHkclP40glW1DK0dfxcC47ClsgXQKBVRvrNLq0dwkLbLzxOpX87k0oXUpqxMn8iV+DJKjr2JgXPaUtkC6hAKqN1ah9bjAsTm+JaNnln8RUlvsTdM4dup9FQPjsqfQBdIJFFC9sQqvxx/BJTJ6PtRPXDGhhWNWa/dVDIzLnsIXSFYooHpj9agep9jmuDj/YmgX50NDK0dfxcC47OnRAlGHAqo3Vl/r0VzrcjLCJzA3iPByIrt4OcLWKkdfxcC47OnrAtGAxbbEv9g0bf4jp9Q/CAYGli8GFlG3EAwMLF8MLKJuIRgYWL4YWETdQjAwsHwxsIi6hWBgYPliYBF1C8HAwPLFwCLqFoKBgeWLgUXULQQDA8sXA4uoWwgGBpYvBhZRtxAMDCxfDCyibiEYGFi+GFhE3UIwMLB8MbCIuoVgYGD5YmDZgiZRb17W3JYcNY+BcdnD5rUFTaLevKy5LTlqHgPjsofNawuaRL15WXNbctQ8BsZlD5vXFjSJevOy5rbkqHkMjMseNq8taBL15mXNbclR8xgYlz1sXlvQJOrNy5rbkqPmMTAue9i8tqBJ1JuXNbclR81jYFz2sHltQZOoNy9rbkuOmsfAuOxh89qCJlFvXtbclhw1j4Fx2cPmtQVNot68rLktOWoeA+Oyh81rC5pEvXlZc1ty1DwGxmUPm9cWNIl687LmtuSoeQyMyx42ry1oEvXmZc1tyVHzGBiXPWxeW9Ak6s3LmtuSo+YxMC572Ly2oEnUm5c1tyVHzWNgXPaweW1Bk6g3L2tuS46ax8C47GHz2oImUW9e1tyWHDWPgXHZw+a1BU2i3rysuS05ah4D47KHzWsLmkS9eVlzW3LUPAbGZQ+b1xY0iXrzsua25Kh5DIzLHjavLWgS9eZlzW3JUfMYGJc9bF5b0CTqzcua25Kj5jEwLnvYvLagSdSblzW3JUfNY2Bc9rB5bUGTqDcva25LjprHwLjsYfPagiZRb17W3JYcNY+BcdnD5iXqFoKBgeWLgUXULQQDA8sXA4uoWwgGBpYvBhZRtxAMDCxfDCyibiEYGFi+GFhE3UIwMLB8MbCIuoVgYGD5YmARdQvBwMDyxcAi6haCgYHli4FF1C0EAwPLFwOLqFsIBgaWLwYWUbcQDAwsXwwsom4hGBhYvhhYRN1CMDCwfDGwiLqFYGBg+WJgEXULwcDA8sXAIuoWgoGB5YuBRdQtBAMDyxcDi6hbCAYGli8GFlG3EAwMLF8MLKJuIRgYWL4YWETdQjAwsHwxsIi6hWBgYPliYBF1C8HAwPLFwCLqFoKBgeWrq8CqxL14O/1sIj11f/H+0En1PXaDVTKavp3uLcWTRg0t1OeLxfn+pcgudq+4HGOEYwGH/x1j3ccu9qsHeCkOgqFmYHnSaHYfaLIXXS8ILePF+e6vsnqN3V1swRhY8e4vzscItAnCax8L7sCJfCnGYZw1A8uTRrP7KHVB+Li3+N8f8H5/gN0oDKx0mk9pv8vqEIvPbHhhbDUDy5NGs/voy4K46vPF+cGlrBBY8RhYOprarOTyCJ++HuBHMxAMNQPLk0az++jjgmhOBX+T1UuHXdkCA0sXThsnTlbH2P0aW+cqBpY/jWb30ccFcW/xoVkET7FthYGVx98XH45WIjMRuYOtMwiGmoHlSaPZffRtQazftRfY3RoDKx/UbYy6nWD3a2ydQDDUDCxPGs3uo28LAp+uXuJlH9vWGFh5rU/lj53IY/yYHYKhZmB50mh2HzgYZyIyF2N2ZPTjT9O9U+x6S30MSw0sjCPBGNyZ7OycyRW3LuXV2XTvArtqMP656yC0sBZqBpYnFGnmEjd7wV69m97dx6u39dfmzaerZEoNLHzKdHhRhUV01oSak9EFXpd/k9GL0DeYTe4t3p/gv/IQu9lgTjUDy5NGs5cKzf9NaPPfX7xf4GvyiSTEwAqH8S4Fn9hvyc6P23wSa04Pf5XVUjJe00Iw1AwsTxrNXqhn+HR1hFdv62+ZvsNuUgysrVxgoZ2IjGocwzOJoPGpeROMF2O9OxNjMC57NJq9NCjMm1sy2g95Z15/u9Q09S62pBhYSTTBdYwgqLEfDHM5xstTbOoqBpY/jWYvTWhANDROBT8JHY9GDXsQWJ+c3pbRNOTNqLE+NTyTDL+jhWCoGVieNJq9JCjKczTLoQRobvHY9vabTRhYaWEuS8xlit0gOK5zTOgxdlVVDCx/KMrMJW72gvyCd99xyLvv+p33NXZ3salgYKWHxVeHhgJO+yc47V9gV1XM2HLAuOzRaPZS7Mjo0c/TvRPsesPxmjvld10GlooLvDl9FfLm1MgxJwRDzcDypNHsZXA/vpt+doAdb/necRlYGkYi3/5revcYu95wrXKJa5UPsKsGwVAzsDxpNHsBok4Ff8O3gg67ooyBpaOKuF6JYzvHpB5jVw3GVWNcMzEG47IHBZm5xM1uXcw7LRZj8/9/ik0dA0tHzJw0ju1VCIaageUpR0EsiWna/L9IyMDSEDMnjWN7FYKhZmB5ylEQQ35BGOwjDM4kABZiE1b72LLAGKcY41I8adQwZnHjODm8mBUzJ41jexWCoWZgecpRECtiTgW7OD4MLB1YgHVoMOS4GTpmXDlgXPZoNLtRr94FPokB3wqO8a3ga+xmxcDSEXpcG5jTS7wE9U0oBEPNwPKk0ewWWXkSg4/QhaVRwx4GVvAbViPHnBAMNQPLk0azW4MDH9wQWk9i8MHASi/0mDa0b8H6JKY/c8C47NFodmOC31nXp4IvsbuLLbvQxaVRwz4FVsy1ywaO6xwTeoxdVQiGmoHlCUWZucTNbkno4m9s+4dQtxU6Zo0a9iWwsOjqmDBYv2m9xq662DFqw7js0Wh2Q57h09URXr3lOg3YhIGVxC+YwxHmMJcIOKZzTOYxdtUhGGoGlicUZuYSN7sFONjBD+Vrbr/RfhKDDwbWdlD75zgRnOEYnkkEfLqa4NPVArtZVAwsfxrNbkHoom9gwR3j5Sm2ToWOXaOGBQbWK1yrmjsZneDYnUmkLt60EAw1A8uTRrN3DQf6ORrgUALkflfdhIG1UXOqd4r/0EUl1elIRqf/JbIM+SR9k3VYLbC7jy0b9GuNfp2JMRiXPRrN3jHTT2LwUWpgNaEvCnZELkJ/hy5U0wNdhFWjYmD502j2LkU+lM/UMSg1sEqFoB3j0/UP2N3Hlh2CoWZgedJo9u6EP5Qv95MYfDCw8kFYTdZhtYutEwiGmoHlSaPZOxJ8KtjAdZeXeNnHZgYDSx+CauzEfYc3uQP82CkEQ83A8qTR7F3AN0TBv81sde4MLD1NUIms/uFEDsUIBEPNwPKk0ey5xSyupnFxKvASu7vYTGFgpXd/8f6xk9GBhU9UVyEYagaWJ41mzwxfc4c/lA8NvOjiSQw+MJ8p5rMUTxo1LD2wmjckkcsHmMnEiTQhtYvNJARDzcDypNHsOcWdCr4/RFh9j12TGFhh7v/z/MHod9ldVat9fIKaYPRjJzKWQlQMLH8azZ7Rq3eBT2JY/77Na+zuYjOp1MBqggMv27tcTeRaTRh9Uo2dyFh6oGJg+dNo9lxiHsrX9ZMYfJQaWPjG1eGFAiEYagaWJ41mzwEHM7jIFp7E4IOBNSwxvZwDxmWPRrNrw4F8gwKPJUBzKmjp9ptNGFjDUjGw/Gk0u7bQBd3AYjrGy1Ns5oXOT6OGDKx8EAw1A8uTRrMre4YL7Ud49YavuCfu442tRWBgDQuCoWZgedJodi04gMEP5Wtgjq+dyFgKwcAaloqB5U+j2bWELuRGSfP7JHSeGnNkYOWDYKgZWJ40ml1HP57E4IOBNSwIhpqB5Umj2RX05kkMPhhYw4JgqBlYnjSaPbWYh/J1+YdQt8XAGhYEQ83A8qTR7GmFnwriW8ExvhV8id1dbMVhYA0LgqFmYHnSaPaEevckBh+Y8xRzXoonjRoysPJBMNQMLE8azZ5KzJMYSrn9ZhMG1rAgGGoGlieNZk8hZsE0t99YfxKDDwbWsCAYagaWJ41mTyDqVLCEJzH4wNynmPtSPGnUkIGVD4KhZmB50mj2beFABRcQF9onuNC+wG7xGFjDEtPvOWBc9mg0+5ZevYt4KF8pT2LwwcAaloqB5U+j2bcR91C+cp7E4IOBNSwIhpqB5Umj2WPhAAUXrk+ngp8wsIYlpu9zwLjs0Wj2GDg4b1C0sQTCInmJl31svcHAGhb0fo3en4kxGJc9Gs0eI3SRNqyMPbXQY6FxHBhY+SAYagaWJ41mj/AMF9qP8OoNp4JjnAq+xm7vMLCGBcFQM7A8aTR7CByUyIfylX37zSYMrGHBGqgZWJ40mj1E6OJslPwkBh+hx0SjhgysfBAMNQPLk0az+xvekxh8MLCGBcFQM7A8aTS7p6iH8iGwJiI3/WVgEw6dyJd4jcbAGhYEQ83A8qTR7D5iHspXAlxbW+La2gPsRmNgDQuCoWZgedJo9nbhp4KlYGBRKARDzcDypNHsLaKexFAKBhaFQjDUDCxPGs2+ScxD+UrCwKJQCIaageVJo9lvErMISsPAolAIhpqB5Umj2W/Q61PBTxhYFArBUDOwPGk0+3UweZNFSY2BRaGsrg2Myx6NZr/Gq3eBD+UrFQOLQiEYagaWJ41mJyJ/CAYGli8GFlG3EAwMLF84hTnEKcz32CWiDuD0+wlOv+dijNHA6t8jholKEnrNMheTgdX8xZlfZXWOXSLqwG0Z7YU+BCAHk4HVwHWsMyfyJXaJKCOEwhtcvxqLQRibTQisuRN5jF0iygih8ByBdSgGYWw28cI7UTesXnBvmA2s9XWsMxG5g42I8vjl3fTuLl5NMhtYDZ4WEuWFQHhu9XSwgfHZdf/js9JfY5eIMqhk9NXb6d6ZGGU6sBr3Fu9PMMyH2CUiRQiD55Y/XTUwRtv4KYsoD+ufrhrmA6uBa1kzx3sLidQgCGp8upqJcRhnGe4tPpzi5WtsRJTWK3wzuI9X84oJrPWp4Sl272AjojSKeupuMYHVQGhNEFoL7BJRAgirKcJqKYUoKrAa/A14ojQs/0b7TYoLrMY6tI6xy9NDonA4DXRHpYVVo8jAanyxON+/lNWJ4xMdiLxhwb/ZkdHBT9O9U/xYHIy/XB/vN7ycYxoPhYhauB9vy86hxedc+So6sD75fHF+sJLVseOnLaL/gEX+ZiSjo5+neyf4sWiYS38017YwpZljcBE1i/sNPlXNSrxWdZMKW++sP3EdOD7pgQYIi/o5PlGd9OET1VWYW781v7slspo4cfuY7C6+XXwgRD2Bb/teOJGLSqpTkdGypN+pioE1TERUBgYWERWDgUVExWBgEVExGFhEVAwGFhEVg4FFRMVgYBFRMRhYRFQMBhYRFYOBRUTFYGARUTEYWERUDAYWERWDgUVExWBgEVExGFhEVAwGFhEVg4FFRMVgYBFRMRhYRFQMBhYRFYOBRUTFYGARUTEYWERUjP8DDr4eLLVhQMIAAAAASUVORK5CYII=',
+            'PPT': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAATzUlEQVR4nO3dC5BV9X3A8f/lsbwWWDAICgiI2qhx3KZ1tDFGAxU11WETGKcxMxWtRseMEY0S21RUYtv4xkSttFgwM5pJQYMNTXwEsSFOtU3N6kxjmqoQxLcV2F0ee/dx8vtdWbNZ957de/d/Hr/7/35mrvs/68zu3nM9X8859/zPLbic2XH6kY1Rd9epUeQaC4Vodumrcw3yrwDvRh75idZxCz5/8fhFF35fFpFz0oLsvXnmx2d3FItXOBc1yR802wEpGXX8Se6gFauivU+s/yLRyr+CPDLz2p8ecZqLuq9wUdQki0DqNFhT7njIdWz7dbHr+S1HjVl00W/k28ipgjxSt7OpsaG1peXOgouWOCBDPcFSHdtf2df186ePJlr5VZBHqrbPn9ske1Vr5Bc3yCKQqd7BUkQr3wrySM32eYfrXtVSGQK50DdYqvjSC22jjmkcL0PkTGrBkljJXhWHgMiX/oKl9v98y8tjTvjMkTJEjqQSLGKFvCoXLEW08ifxYBEr5FlcsBTRypdEg7Vj3twlketeI0MglwYKlmpdt/rRCede3CRDZCyxYH1wMWj7L+QXNMgikEuDCZba+9i6+8edde5FMkSGpCfJeG3+nM0ucqc5IMcGGyxFtLKXSLD0WqtC1P0DGQK5Vkmw1K7br71+0tU3r5AhMpBMsObN2So/eLYDcq7SYHW3tTLvMEMFeXhVmh/Y3bVZhkDuVRosRbSy4z9Y8+dskHNXC2UI5F41wVIarbYH7zp74qXX/UgWkRKvwdJJzW0tu3fKEDCh2mCp4qv/29XxyOpP1l9z24uyiBR4DRbXXcGaoQRLMVk6XQV5eLN9/py1hcidL0PAhKEGSxGt9BTk4Y2cv/qFi1yjDAETfARL7f3pj98v3vnXcydtaN4li0iI32DNmxPJF8AMX8FS+57dvH3sn8ybJUMkxFuwdCpOZ7F9qwwBM3wGSzFZOlnegsX1V7DId7DUnh+va67/3Ll/KEN4RrAQtCSCpVoeWPmziUuuPEWG8IhgIWhJBUsxWdo/goWgJRksRbT8IlgIWtLB6m5rcS2r/o47PHhCsBC0pIOlNFqt6/754oYLr1wtixgCgoWgpREspZOlucPD0BEsBC2tYKnOt9/obr3rG6dN/vu1W2QRVSBYCFqawVJ6h4c9q7/1WaJVHYKFoKUdLNWx7dfFrue3HMVk6coV5OEFwYJFWQRL6R0e9lyx+FAmS1eGYCFoWQVLcYeHyhEsBC3LYCmN1rhTP3eQDDEIBAtByzpYijs8DB7BQtDyECzFZOnBIVgIWl6CpYjWwAgWgpanYKnWdasfnXDuxU0yRD8IFoKWt2Cp3fffdnPDRddcK0P0QbAQtDwGSydLc4eH/hEsBC2PwVJEq38EC0HLa7AUd3j4KIKFoOU5WIrJ0r+PYCFoeQ+WIlq/Q7AQNAvBUhqtjkdWf7L+mttelMVgESwEzUqw1P7/3rJ7/01fnR3yZGmChaBZCpbSydIh3+GBYCFo1oKlQo4WwULQLAZL7du88ZWx8845QoZBIVgImtVgqRAnSxMsBM1ysFRo0SJYCJr1YKmQokWwELRaCFZI8w4JFoJWC8FSoUSLYCFotRIsFUK0CBaCVkvBUhqt96/9y3Om3LN+oyzWHIKFoNVasJTOO6zVydIEC0GrxWCpWo0WwULQajVYqhajRbAQtFoOltq7+YdtxW8vn1kr8w4JFoJW68FStTRZmmAhaCEES9VKtAgWghZKsNTutXe+3nDBVTNkaBbBQtBCCpayPu+QYCFooQVLWY4WwULQQgyW2vWdG5+a9NUb5svQFIKFoIUarNIUnlu/vmrKivsulUUzCBaCFmqwlEbL2mRpgoWghRwsZS1aBAtBG3nciW7qyu/JKFzFl3/pdv3tlV+ZuvaJe2Ux1wgWghaNqnczfxT0hymXWJl3SLAQtK6O7lKwhtVPkKWwWYgWwULQOvd3umn3rnOjjz9RltD+4n91vnf1l06Y8eT/Ncti7hAsBK27s9tNWLLUNVywVJag9jy5odh6x1/9wSGP/WqbyxmChaBFkZx4P+YEN+3u78sSeuR1sjTBQvA69nS4WT/5H85j9ZHHaBEsBK9jb4ebcv2drv7MxbKE3nbefeP2wqYNx+clWgQLwevuitzIY09wh9zzL7KEvnavvuX5hou//kcyzBzBAkT77nY3a+N/uhHTpssS+srLHR4IFiC62rvcuLMWu49943ZZQn/eWXb+v0699bsLZZgZggWIKHKu2MJeVhydd/jeisszjRbBAg7Qi0jHnnKGO/hb/yRL6I9GK8vJ0gQL6EXPZU1f/Ygb3ciV7+VotN6/aek1U25ec5sspopgAb3o3MLCpEPcjAcf57qsGFnd4YFgAX107ut0Y05Z4KbevFqWUI5Gq2Xl9edMuWf9RllMBcEC+lFsKbrJl13NHMMBpH2HB4IF9EMvJu1oLbqpN93l6s9aLN9BOTpZetety05M4w4PBAsog2gNXlrRIlhAjJ5oTVpyiZt8+XL5DsrZu/mHbcVvL5+Z5LxDggUMoCdaY086uXQinncPy2tdf/9bXQ/efXRS0SJYwCBEkStFa9j4iXIy/mtuwuIL5bvoT5J3eCBYwCBFkXNd+ztLj1HHHucmX3K1G/vp0+XfoC+N1uTLb5glQ68IFlAhvbi0c09HqWB1s2a7SV++yo09ZQGHin0kcYcHggVUIYr0AtMO193eJUuiUHCjP3GcG3/2ua7uyGOZ2iN0Co/vydIECxgC/RALvTI+kq99jTxslhtx6Aw39o8/JUs9Cq7uqGOC2RvTaLU+8J0/n7Z6o5eb5hMswIO4cIVu+OiRV875j+0rZThkBAvwSMOlNwPsLh44VATBAvIu6o5K4erScMk4ZAQLMEQvPNU9rlDjRbAAo3TPSx9BGTb8nFlPv7pRRkNGsAAka9jwz878yctPOw8IFoBkESwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmEKzkjDr+JFf/hSVuzKcXyJJfxZd/6aK2Ftf59g6375knXfsLz5WWk1T/hQtc/aIL3IhpM2TJn275uzvk+ajSc3nxuQ+XfZjwF1eU/u5h9RNkKX/0+bc9vMa1fPcuWUIsgpWMsWcsdpOX3SKj9Oz72ROu7ZG1Eq9nZcmvSfJcxslzSkvnWzvc3scfdq2PrBlSiCd+5To3XkJrgQar5QGiFYtg+TfyiGPc1FUbZZSN9uZn3a5/uMnbXoruKU654yEZpa9n76PacB36aHNu96z60uf6xsJGGaEsguXfpGW3yt7IIhllR//j33XvTbKXsl6WhiYPz0cPgd/92nkVR2vaQ1vciKnTZWTDjvmHyz9RFsHy72DZu6qTvaw80EMMPdQYiil3fE/2sk6UUbY0whqtSvYcJ5x/RekclgW6F7n7nm/KCGURLP9mbHpV/pkfu+79Zumwqlp5CZbSaL35pc9UtKel0dJzinnd0+p8+/XSnnCrvEaVPK8gESz/4oL17lXnDemkuJ4fGzZughvVeKIbffICVzf3aPnuwIbye+OCNZSfW5BzS3Vzjyl9HXPy6fKcThpUVPTw8J1LzpZRepJaB6gQwfIvyWD1pSfE9S173eDjVLNn0iPNjVX3hBou+5sBT5TrYa4e7qYlzXWAGATLvzSD1UOj1XDZdTIqr9pDw7Q3Vt3j+tiKVWV/pxpKgKuR9jpAGQTLvyyCpXTvJO7aL7226S3ZyCuV1cZ68D/+m4s75E1zLyurdYA+CJZ/WQVL6QnmuHfF3r9lWekEbyWy2lh1T2uqRKvceS3dy0rruqWs1gH6IFj+ZRmsgTbyPY8/7Hbeco2MBi/LjXWgvca35eR7JZc5VCvLdYBeCJZ/WQZLxZ3PquawMOuNNe7iz2rPy1Uq63WAAwiWf1kHa/i0Ge6QB38qo/7pyeouCddgZb2xxs0H1MnS/7/8EhklK+t1gAMIln9ZB0vFnbCu9G/IemPV680+tuI+GX2U3qXi3au+KKNkZb0OcADB8i8PwfK5gfn8WdXQa83KTb5O6yLSrNcBDiBY/uU9WJW+Uxj3s9J4PvpGwvRHm2XUvzQmDGe9DnAAwfIv78F6b/mlbv8zT8hocOJ+VhrPZ6BzcgQrIATLv7wHq9K/wefPqkbcISHnsAJDsPzLQ7DiblxX6d+Q9cYad5kGwQoMwfIv62DFvaumKj2EynpjPWjFqrKTu6u5ELYaWa8DHECw/Ms6WFNuf6h0q5b+VLNHkuXGOtD5q0rPx1Ury3WAXgiWf1kGK+58j6rmyvAsN9aDbrwv9lOHXl/YmModG7JcB+iFYPmXVbD07X/98Iu4j+Gq9Cp3ldXGOtA8wmr2FquV1TpAHwTLvyyCpbHSQ8G4e8lXe74ni411oFippH53f7JYB+gHwfIv7WDpbZP10Cluz0pVs3el0t5Y9fY4epucOHof9LfOO0VG6Uh7HaAMguVfWsHSUOknSw/mA06H8oksaWysuoc45lOnl0I1UHiVr987WGmsAwwCwfIvLlh7Hl8vezmvy6h6w6dNl43npEFt2Kr4ykvunS//mYyqE7ex+ng++rPLvavZnzTvNNojbh0QrBQRLP/igpU2vSunHgoO5Z20uI01bWndTqavuHVAsFJEsPzLS7B0z0rfRRtKrFTcxpqmat808CFuHRCsFBEs//IQLJ8bd9zGmpZqrh/zKW4dEKwUESz/sgyWXpuk53d8bkBxG2vSNLx6zqqadzd9ilsHBCtFBMu/tIOlb/G3Nz/r9srGncSGE7exJkEPZfV56B5V1qHqEbcOCFaKCJZ/ccHSjXEo55T0JHrHKx98SkynvDun46Q/NabcxvrB3/KSjKpXlL+/Z30UX/4gVD3LeVJuHSiClSKC5V9csCz+x11uY9XDTz2pH4Jy60BZfE3NIlj+EazaU24dKIuvqVkEyz+CVXvKrQNl8TU1i2D5R7BqT7l1oCy+pmYRLP8IVu0ptw6UxdfULILlH8GqPeXWgbL4mppFsPwjWLWn3DpQFl9TswiWfwSr9pRbB8ria2oWwfKPYNWecutAWXxNzSJY/hGs2lNuHSiLr6lZBMs/glV7yq0DZfE1NYtg+Uewak+5daAsvqZmESz/CFbtKbcOlMXX1CyC5R/Bqj3l1oGy+JqaRbD8I1i1p9w6UBZfU7MIln8Eq/aUWwfK4mtqFsHyj2DVnnLrQFl8Tc0iWP4RrNpTbh0oi6+pWQTLP4JVe8qtA2XxNTWLYPk37aEtbsTU6TL6KP1Q07x8sMJgldtYs/pQ0ywctGKVG3Py6TL6KIKVIoLl36Rlt7pxZyyS0e/TD214Y2GjjGwpt7Fm/VmBaapfdIFruOw6GX3U6/Ka5vGDM2oSwfKvUD+htFdSN/doWfqd95Zf6vY/84SMbBk+bYabumqjGybPq4d++o8eDoa0ofYXbv3MRP0cSKSEYCVn7BmL3cgjji5t1Hr4lPTHcSVJIzxe9jL0qx7S6gec6vMKzeiTF7hRjR8cHrc3P2fyf0CmESwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZuQxWG+e+fHZncX2rTIEgA+NqBs155DHfrXNeeAtWOq1eXMi+QIAH5r51FZvnfH2g5QEq1m+HC8PAFD/LsE6zXniNVjb589ZW4jc+TIEABcV3AOHbdq6xHniNVg75s1dErnuNTIEAAnWsM8ftumVDTL0wmuwdjY1NrS17N4pQwBw9RMmTpq0oXmXDL3wGiz12vw5G1zkFsoQQMgK7tGZm7Y2ycgb/8HieiwAyuP1Vz28B0vJu4XbnHOz5AEgTC/Iu4ON8tWrRIK1ff7cpkLU/QMZAgiQ75PtPRIJlpK9rKedc6fKA0BYvF571VtiwdKpOh3F9mb5BRNlEUAAIud2j6wb1ehrKk5f0pPkcF0WEJakDgV7JBosxdXvQCAKhbtmbnp1qYwSk3iwFNECapvvKTjlpBIsRbSA2pRWrFRqwVKvzTv8Bnl61zsANaJw48ynXr3BpSTVYCm9Ej7q7togv5h3DwGjInk3sDBseJPvK9kHIt1In06Sbm3dvZJDRMAePQQcP37iUp+Tmgcrk2D1KO1tRV1LCBeQfxqqQmH42rT3qnrLNFg99CLTzo7iUhdFTbI4Sx4A8uE3rlDYMGJk3cqkLgatRC6C1ZvGq6tYbOouRI2y5zU7cq5R/kjOdwEJk21tt2xrzVHBbRsWFZqH19VtyEOkevstE9hpHbN7fJMAAAAASUVORK5CYII=',
+            'PDF': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAVKUlEQVR4nO3dD3BV1Z3A8fNkEDudDe7ujA0JKemW9c9GK8VxlagrjqLY6hK1ojJaUUFlZQcCQdc6VaBW2zUxutUV6x+07KwKskLr2kipyqpQ3arUNSpdWoMQQV21Sd0WEpLX3y/42jRNTt6fe969553vZ+bJuXEMLzn3fb33vnvvS5mEaa6snNDTmzrRpNMTZLHapMwEGR8oYyByBx155K9rzpo2+6grr3xEFpFwKXnErrm8uro31T0vnU7XyWK1AYqkqrbWTFt+X7r1oYcuIFrJl5JHbG4pHzs5leqdZ9JGQwUUnQZr+upV5oMtW7reXr/+4Ilz526TLyOhUvIouubq6gN7dnc3G5OeaYAYZYKlPvjfrb99e92ThxGt5ErJo6gaK6rqTLp3OcelkAT9g6WIVrKl5FE0TWMqm+U41XwZAokwMFhq5yuvfFwxceKfyRAJU7RgNZZXLmcXEEkzWLDUtg0btlZPnvzXMkSCFCVYxApJNVSw1DailTjOg0WskGS2YKltRCtRnAarqbxyZtqkJVhAMg0XLPXTZcvWHj1nTp0METNnwdKTQXtS3a/wbiCSLJtgqdcefvi+Iy64YJYMESNnwZJdwadlV3CyARIs22ApohU/J8HqO9eqt+cxGQKJlkuw1JMLFtwwtbl5qQwRAzfBKq94S/6oNkDC5RqsPZ2dXHcYo5Q8ItV3faDpfVqGQOLlGixFtOITebCaxlSsSafNNBkCiZdPsJRG64Vbbz3jxCVLnpBFFEmkwdp3UXPXRzIEvJBvsNT7b7zR89J37p54+l23vyqLKIJIg8V5V/BNIcFSXCxdXCl5RKaxvPIBY9IXG8AThQZLEa3iSckjMo1jKvVE0QkyBLwQRbDUzx//zw+f+Me5n69va/uVLMKRaINVXpGWPwBvRBUs9cv1P37781NOGSdDOBJZsPouxTFdb8kQ8EaUwVLbuFjaqciCxflX8FHUwVKvPfTI5iNmnP9FGSJiBAtBcxEs9fw/Nz13/DUNJ8gQESJYCJqrYCkulo4ewULQXAZLEa1oESwEzXWwdnd0mA1LlnCHh4gQLATNdbCURuulu747+/hrr75XFlEAgoWgFSNYSi+W5g4PhSNYCFqxgqU629t7n25omFz38MPPyiLyQLAQtGIGS+kdHjYuXXoS0coPwULQih0s9cGWLV1vr19/MBdL5y4lj0gQLPgojmApvcPDilOnVHCxdG4IFoIWV7AUd3jIHcFC0OIMltJoHXLmGX8pQ2SBYCFocQdLbeMOD1kjWAhaEoKluFg6OwQLQUtKsBTRGh7BQtCSFCz102XL1h49Z06dDDEIgoWgJS1Y6rmbvvXtE6679p9kiAEIFoKWxGDpxdLc4WFwBAtBS2KwFNEaHMFC0JIaLMUdHv4UwULQkhwsxcXSf4xgIWhJD5YiWn9AsBA0H4KlNFovfefuiaffdfurshgsgoWg+RIs1bbhvzrWzLy4OuSLpQkWguZTsJReLB3yHR4IFoLmW7BUyNEiWAiaj8FSW9as/cWhZ9WNl2FQCBaC5muwVIgXSxMsBM3nYKnQokWwEDTfg6VCihbBQtBKIVghXXdIsBC0UgiWCiVaBAtBK5VgqRCiRbAQtFIKltJorZ5x0ZkXPvGDx2Wx5BAsBK3UgqX0usNSvViaYCFopRgsVarRIlgIWqkGS5VitAgWglbKwVJvrln7cUv9/KpSue6QYCFopR4sVUoXSxMsBC2EYKlSiRbBQtBCCZbaeEtj+3FXLxorQ28RLAQtpGAp3687JFgIWmjBUj5Hi2AhaCEGSz31ta8/dfLNN54sQ68QLAQt1GDpJTxP1i+8u275fVfKojcIFoIWarCURsu3i6UJFoIWcrCUb9EiWAha6MFS773Wap6Yc9VVlzy34V9lMdEIFoI2amylmfvfL8oobL5cd0iwELTdvb3mund3ygg+RItgIWhdvWkz47HVZlztJFlC+wsv7F11zjlH17e3b5bFxCFYCN6xi28wx11xuYygXl+9umvd3IZD6ne1tZmEIVgI3mdOmWIuXPGAwR8k9WJpgoXg/f+nPm2u/+XPZYT+khgtgoXgfby3x5z3vQfMoadPlSX099TXr3/71X9bcWRSokWwELxeeYw9+xxzwZ3/IiMM9OxNN738d9ddd5QMY0ewAPHunm5z3c9eNqOrvL5dlDNJucMDwQLEb3p6zaSGBeaUqxfJEgbz6Hkzvn/uyoemyTA2BAv4xP/tf4BZ/D+vmFFlZbKEgfS6w8cvnxNrtAgW8Ak9+F7bsNBMuYatrKFotOK8WJpgAf20/7bLXPP8M+YzNTWyhMFotH545T8sOvvhf2+UxaIiWEA/em3h/gcfahY9y6psE9cdHggWMMBH3XvNsVdcbs745jdkCUPRaP3ommvPvPCJHzwui0VBsIBB6K7hV5fdYSacf54sYSjFvsMDwQIGsTedNh+O+pS5ZNmdnAE/jL6LpefNO6YYd3ggWMAQ9NYzO3d3mUvvvpMtrWEUK1oEC7DIRGvGLTebYy+fLV/BUN5cs/bjlvr5VS6vOyRYwDAy0Trhohnm72+6kRNLLV66+7u7nv3WzYe5ihbBArKgF0jvlAPxfzHus2b6t79pDp7Kca2huLzDA8ECsqTR+qCr23zc3WNqTjzBfPnaa8xnubXyoDRaJ9/4jXEyjBTBAnKkF0q/v6fb9Mo7ieO/eKSZPOcKc9iXTmdXcQAXd3ggWEAe+m9tqf1SKXP45BPMF778JfO542q5tEfoJTxRXyxNsIAC6KU8H3XtNbtlq2ugv5rwBfPpAw80Bx9/nCztI10zFUccLltjo2Wp9O3p7DDPNzaff+mP1z0iiwWTX180CBZCpruJusW1V95RxB8rGzmy/uYP371NhgUjWECEbFtcoSJYQMLppT0dcnzrNz09wW91ESzAI3ri6a/3hhsvggV4Sre89BGS/VIjzvzau+2R3IKGYAFwKm32O2nRrh3PmAgQLABOESwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANggXAGwQLgDcIFgBvECwA3iBYALxBsAB4g2AB8AbBAuANguVQVW2tmTjrMjP+9KmyFJ3dHR3m/dZWs6ej02zftMlsbXnSdG7fLv/GrUkLF5ia86ab0VVVslS4DnnO+rzfe63VdO7YYXbIz6LjJHE1h7nYvnGjaZm/oO93FTqC5Yi+sKfe1iyj4tAXf+sjK83L994nIeuQr0Rn1OjRZvqjq8xBh9fIklsaYw3w1pYW8wv5M07FnkMbjdbKc86VUdgIlgP6wr7oR+tkVHz6gn/m+htM68pVshSNqbffZmqmF//Foj9LJsLF3rrQLavpq6P7HUahaUyl/DNsBMuBuF7g/emu1cqvnFvw1pZuXc1983UZxes1CdempluLFq4kzOFABItgOaFbV7qVFTfdTfz+pZf1xStfSdrS0C2ul++5ty9crs168SeRHauLwp7OTnPHIYfJKGwEy4GFO9vln8mgL/JVsqWVb7SSFKwMPZ7j+iB0kuZQj+ltamrKew5LCcFywLay64FTfcHlS7fcRpWNNmNrJ5nxU08zB9XUyFftdEXPd/fQFix9h3Ll2V+RUe70+yr9OXRLpkr+LBs7Vr6SnUJDPBzbHLJrFh+C5YBtZS80WAPpC3/i7Fl98bLZ+sMWs1Z2D3Ol399FsAZTJuEaP3WqOeryWVnHq2V+fd+B+ajZ5pBgxYdgOWBb2aMOVsbE2bPNSUsXG5t8/u5iBqs/PaWgtmFhVuFyES3bHBKs+BAsB2wrez7RyJa+yG3nDenfq39/LuIKVsYkidZRsgU5qqxMloamP5f+fFGxzSHBig/BcsC2skf9whpIX+C1CxfIaHArppya03GfuIOl9LjdtOX3W7e29JjWiimnRXYg3jaHBCs+BMsB28ruOlh63tRX168b8sW9selWs6mxSUbZSUKwlP5c+jxsbzJoiDXIUbDNIcGKD8FywLayuw6Wsh3PyvVFnZRgqWyilWuQh2KbQ4IVH4LlgG1lL0aw9N222S/+REaDu+PQv8n6FIckBUtptPRnsx3Tuudvjy1419A2hwQrPgTLAdvKXoxgqYtkt3CoLZFcnkPSgqVsz0npiZZrL7lURvmzzSHBig/BcsC2sucSi0JM/49HTdWkSTL6U7k8B1sc4gqWOmnpEtn1nSWjwRW6lWWbQ4IVH4LlgG1lzyUWhbAFK5fzlpIarOF2DfVuFS3z5ssoP7Y5JFjxIVgO2Fb2JARLz3jXM9+zkdRgqeFO4cjlWN1AtjkkWPEhWA7YVvYkBCuX55DkYA335kIuW5ID2eaQYMWHYDlgW9lziUUhrnrzdXOA7DYNJpfnkORgKT2hdKjrKAs5+G6bQ4IVH4LlgG1lzyUW+bJFRuXygrN9ryQEy3Y5kp79fqfsFubDNoe5/P4QLYLlgG1lL0awbHfLzDUySQ/WcLuFepKsniybK9scEqz4ECwHbCu762AN9wJ++vrF5uV77pFRdpIeLDV3yxtDvluY68+bYZtDghUfguWAbWV3Hazhbs+c6/lJPgTL9gZDvpfq2OaQYMWHYDlgW9ldBus0OZZzuBzTGUo+5yb5Hqx8n6NtDl3N32B0d/b1Vav6/gTBcsK2srsIlu4GTrv/PuuWlcp160r5ECzb+Vj5PkfbHBabvnlw7zGT8j6nrJQQLAdsK3uUwdJQ6acx27aqMvTTZp6+/gYZ5cb3YOmWiR54z5VtDuOQ77G4UkOwHLCt7Pr5erlu5QykodIPbdAPb8hGIWHxPVgqn2NOtjmMQ77H4koNwXIgSSv7e62tfVt1+e5OEKxkYAtrH4LlQFJWdg3K2ksuyztWyodg2Q66d+7YYe45+hgZ5SYpc6gK/Z9OKSFYDiRhZc/3mNVAvgcr3+dom0PdPSuWHRs3RXbMsxQQLAdsK7treurCRjnWUehxsgwfgmX7WPl8n6NtDvPZxUQ0CJYDtpXdBd1l0P8TvyRbVVGFKsOHYNl+3/luadq+J8GKD8FywLaya1z2dHbKKD/vy9v0uz/579+X77VdQuXy2EbSg2V7fkp33/J5d802hwQrPgTLAdvKrgdPfTomYQtCEoI13DuE+f6+bXNIsOJDsBywrez5voDikvRgDXftZL5xsc1hvt8ThSNYDthWdoIVHT2B1nZnCt39XnHKqTLKnW0OCVZ8CJYDtpWdYEXHdt8vVcjJlrY5JFjxIVgO2FZ2ghUN/dScWS9sGvI20Cqfi70zbHNIsOJDsBywrewEKxrDbV0V+txsc0iw4kOwHLCt7ASrcHqQXQ+22+TyUWaDsc0hwYoPwXLAtrITrMLoruD0R1f1RWso+V4/2J9tDglWfAiWA7aVnWAVZri7qqoofse2OSRY8SFYDthW9iheTMWUpGBlE6uonpNtDglWfAiWA7aVnWDlJ5tY6SVP3zvl1LzfGezPNocEKz4EywHbyk6wcpPNMauMQg+092ebQ4IVH4LlgG1lJ1jZmzh7Vt89623nWmXke1eGodjmkGDFh2A5YFvZCdbw9Pwqvah5qHtcDaT3AMv148uGY5tDghUfguWAbWUnWIMbO2mSGT/1NFMjx6my2aLKcBErZZtDghUfguWAbWUvpWDpR2jluhumn/aTcVBNjRyjKpOv1cpS7qLeDezPNocEKz4EywHbyl5KwYqLvhvYMr8+sgPsg7HNIcGKD8FywLayE6zC6G5oy7z6SE5dsLHNIcGKD8FywLay+xas4e45VSx6uY2Gqli/O9scEqz4ECwHbB875ePKPm35/X0HxOOgW1Stj6zsexTTRevX9R1jG4yPc1gqCJYD+pb8YPcZ39rypFl7yaUy8kvfyZuyWzjUCzhqujWlx6daV67sO7Afh6Hm0OWBfgyPYDly0tIlfSc+Zujb77qiu/yEG5c0Wvoz6ZbWqLIy+Uo0NE4dcjxKPw1It6Y0UK6PT2VLf95SmsNSQLAc00tK9EVYSvRnGlWW/blSA+m91n160evPW2pz6CuCBcAbBAuANwgWAG8QLADeIFgAvEGwAHiDYAHwBsEC4A2CBcAbBAuANwgWAG8QLADeIFgAvEGwAHiDYAHwBsEC4A2CBcAbBAuANwgWAG8QLADeIFgAvEGwAHiDYAHwBsEC4A2CBcAbiQxWc3l1dY/pekuGAPB7I8z+n6vf1dZmIhBZsFRjeUVa/gCA32vY9U5knYnsG6nGMZWbTTp9pAwBQHYHUxsW7WqfbCISbbDKKx+Qp3ixAYA+qQcbdrXPNBGJNFhN5ZUz0ya9XIYAYMx+I85qeGf7GhlFItJgNVdXH9izu+sjGQKAGXHA/n9e39b2KxlGItJgqaYxFWvSaTNNhgAClkqZtQt3vlMnw8hEHizOxwKgojz/KiPyYKnG8oo2Y8w4eQAIUSr1s4ad7RNkFCk3waqoqjO9PY/JEECIIj7YnuEkWOqW8spnUiZ9ogwBBCTqc6/6cxasfZfqdG+Wpz9aFgEEIdUxwoycENWlOAM5C5bivCwgMI52BTOcBktx9jsQiFTqdjnQPl9GzjgPliJaQKmL9hKcoRQlWIpoAaWqOLFSRQuWuqW8YrH8hTfIEEAJSBuzZNGudxabIpF+FNe+M+HTa+RH5d1DwFupjrRJ1UV9Jvtwih4ste8i6e7bJFoXyyIAr6QeHHHAyPlRXtScrViClfHJ1tZMwgX4IPWgbFU9UOytqv5iDVZG30mmqe75Jp2uk8Vx8gCQDNtMKrVmRHrkba5OBs1FIoLVn8arN9Vdl06bCWljquUJTpAtMI53Ac7pcSmzWV5zbamU2bxfeuSaJESqv98Bze0hHaydu7UAAAAASUVORK5CYII=',
+            '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,R0lGODlhZABkAPf/ACMjIwEBASIiIhAQECMjIyMjIwEBAQEBARsbGyAgIAYGBgoKCiMjIwAAABUVFQICAiEhIRcXFx0dHRISEg0NDQMDAwcHBwICAhkZGRQUFBcXFxISEg4ODggICAwMDAcHByIiIh4eHiEhIRwcHBAQEBsbGwQEBAICAhcXFw0NDQMDAwEBARkZGRYWFg4ODgwMDB8fHxQUFB0dHRISEhQUFBERER4eHhwcHBsbGwYGBgoKCgMDAwcHBxkZGQgICAcHBxoaGgQEBAMDAxgYGBAQECAgIAYGBgoKChUVFQ0NDRQUFA4ODggICAwMDB4eHg8PDwQEBA0NDQ4ODgsLCx8fHxQUFBMTEx4eHgUFBQkJCQgICAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJNAD/ACwAAAAAZABkAAcI/wD/CRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1iz8gxgpYLWgy0AhDDxlSAFAGhhYCn770ECtGgTWCg7AS5cCB20NnhrFy2ELFk79LUrYArWAYP7UrgaNrHdJ1YxOO47oKrkyXArU22MGXLVGpgBLLaaZXJhrAH49hWwQGvdvni/VoBgVy5bDnDVshUYduxugVy9/h5OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/Ovbv37+DDiwQfT146ACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJNAD/ACwAAAAAZABkAAcI/wD/CRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTygzgwIJSiw2GAICQ5SnFDACyClhgNSKFrGAFeOjq0IIAsGg5kF0YIATat0/WJpzwti4FuQaxnK0LFsEDvAWl8s0q4S/ggRYGZ4Wg4DDBCIoB3HUs0MRevkAaUBZYI3Ljzf8kKI6gMICVCk9NRHaasAWAECaUclA8QuHXrDCwJHU9eEDCBwnQJmBtVPRg4gbpvoXQwWiDy8s1H2wQvC7VoqoHI0jYQbGAKUQTD+pukXBAZMlDsyi20vo8gLhBpyiukRCDewC+gcofTB+hfff5/aTeYOwhxFtk8AElHl/kIdRZZJMFlR1f2yE0IF/fERUAdGhBIJ1BAVT31lbFKYZcQcp12JxRB9YVoEEVQCDciUPNNlhtCdkIQG5JYeGZQq7B9pRxfJGWkGmoPfXgYLqBNiFmoAkk2GARUqZAZBA0udmUfBUGmgIcvgVEAKBZcV6Vhz3gVm9R/mMWX2q1+c8TI44lp0AOhAXenQJFNVVVfA4UQAsrBmrooYgmquiijDbq6KOQRirppJRWaumlmGaq6aacdurpPwAAIf8LTkVUU0NBUEUyLjADAQAAACH5BAk0AP8ALAAAAABkAGQABwj/AP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzpsEGESjYVIkTAIAnO082aOHTZ42gJa0ULWqlAdKQFJYudeD0accOAqQujRDA6sYKMLRKneA1YwMMYpcCeVAW45O0RRGwbWsRCwS4AEJUoHsRLVwIWPhanIIXwALBFQOEwGsFcUUOeEd0TRjAgQXHBgOETSvgcsIGQwBAyIKZIGS4GRZmKCrgcOkGi9MmmIsw6lIBHkovwAs0oYWsWjlgDp0WxuSDiuH25lsBuNgBCicU1sn3tFgItA1icS5WrmAgcB0o/ySeVkL2sg+4S+3gGy8EBYgJpw1R9WAEvNQFr07bGKEJ9WrVx9cIcJGGUA14wYdYAAD6JMBxBkkAVwQKBWDFXjZZABcCCZmAl2cIERWCCTbZJlZqCFmn1QgKmQhDYDRJl5ZwIcIFHUIPJLBUAiDGdF9a7CEkYVo9FiTjUhAEGRN4aZF4UAMNiiYgQQ3oqNVoMg0p1pQDeZgWhwh1AJcAU8S0mVYCtJdWCwkNMB1Md4mVQEJZwNXfQUQVthxLcWoVQkLyiXUUQn4VdiOf8wEK16AHFYrXoSv1KRUMdNqZUJ68vXSmVHMipOGaCSGIH0xaasWlQF52VylnZcLEpFhOZv8WJQSn/hOAlVK1JtOPYikZIVxFEnRkUUnONKxUNOJpY0IVSMojTSZqheJBKkrFYkLWvVjTp6oihEWCCokY60wBjAlhQaVKRSFlFwZFYFoGHiRqWjAitp9YdxqUqlhAYBaon7X+Q55Y+fGVHly+FqSAe/Xy9apW4iU0sFbmIVYtkucRpECUPgFxrlfNLZuQUqMKNvFSxiX0QGzPObabcgr9JlaygsEG12wKvXVbbqVdvFS+BznAWqul3TpmsFSGhmVpA+mclmQVtpBw0Szjy7RE/4rl2tUPOXplw1wvZBdeeoXtkNNfZmz2TV5rtdbaC1WAa1pkwa0QVhN+bHdBPgMuQNXeDJH8c8CADzTUUowWvlBPPyn+EE4FOy755JRXbvnlmGeu+eacd+7556BjBAA7) 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,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';
+                                            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,R0lGODlhZABkAPf/ACMjIwEBASIiIhAQECMjIyMjIwEBAQEBARsbGyAgIAYGBgoKCiMjIwAAABUVFQICAiEhIRcXFx0dHRISEg0NDQMDAwcHBwICAhgYGBQUFBcXFxISEg4ODggICAwMDAcHByIiIh4eHiEhIRwcHA8PDxkZGQQEBAICAhcXFw0NDQMDAwEBARgYGBYWFg4ODgwMDB8fHxUVFR0dHRISEhQUFBERER4eHhwcHBoaGgYGBgoKCgMDAwcHBxgYGAgICAcHBxkZGQQEBAMDAxgYGBAQEBsbGyAgIAYGBgoKChUVFQ0NDRQUFA4ODggICAwMDB4eHg8PDxkZGQQEBA0NDQ4ODgsLCx8fHxQUFBMTEx4eHhoaGgUFBQkJCQgICBkZGQQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJNAD/ACwAAAAAZABkAAcI/wD/CRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izbqyAJYBWgyZCAGjxleAWGADSUij7z0KCtGkTPPjaAQJcuBO0crF7N67Xq1UE9L3b4SoFwYPh1rBKInFfslQHOO5boqrkyXArV22MeazhzosBI07MJevexAn+Yq07OO9Xt3chVGB7Fi4HtgLDesYtsEIG1byDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/Ovbv37+DDiwMfzxAAIf8LTkVUU0NBUEUyLjADAQAAACH5BAk0AP8ALAAAAABkAGQABwj/AP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJO2tOAggFKLXCAAwNDg6cQFAgBozWA1ooesWrVS6OqQQ9izAiyQXTjgrNsQTtcepOC2Lha5Bx8gqItWAV6DDyTwDYvhr0EFUgcDUGuYIF3FERoXLKFYgAnJAxUoBlDDagUscRFGUCzhqYkQAFootLD5MtItMMKOTThCMQekFhKcTfAgYdvBqo12SHx2QkLWg0sXjco3QeiCDYi7FVB1aBWwfDsk3DvYdVAK2Pl24kbYQjFjoCQ2aw1+EItiLkF/qy+RsIbiKvHVa6WP0P5g/EGlpx57Brk3GHxCPabYeAeVN9h5QV333naKeScUc3U5h1B0gwnwnFDD1WUcQsjxpZxRuZ0FQQW+KUZgUbCFdRuFg82I1GmpKaSZYls8VUEGHxY0WnKYCbTFZgxKhkNrRSrIV2GYbSFdXX5JFthmUDYWwJKVVdmYk3zdVaR8dYXQW5H/mFVXWmgO9JVbJLRJkIRaOSBnQcxRdWdBHbQQ5J6ABirooIQWauihiCaq6KKMNuroo5BGKumklFZq6aWYcgQAIf8LTkVUU0NBUEUyLjADAQAAACH5BAk0AP8ALAAAAABkAGQABwj/AP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzZkcKERrYVEkCAICcO0/W8Omzhc6gIhtgIUoUC9KQDRwwZcrhqccAEaYyFdDBKscJWqfCqOBV4wMcYZmWOFr24gMEaYmSaJuxQoi4ACBsoYtxCwS8JfhiXIAXQBXBF5fGDREAMUILDhonDDACb1XHBbn8xcD2oAUBcWFIxvxvAWifGRYqTnsZs4fTRCkofJBgcWe+HMIKsKCwZ9wFjgcsHm0wAIy4GBBTKOw0ofC0AsjyfYtXgIKED/6yRvxAAt7kCaWm/8XhWIH2tLwRdogr4IHj5XEjJGxwN+1hxyXYm0i4Wmvq8njVkBAXcY0QVAVYEGdQVmlJMBlsUwmgYEwm3NWCQhbgtR9CcKFX0xbH+SRbQpVth1AGcY0okwW1EZWAewg9F9aFCMEX1gQzdXAeUTg+FpeD6sVFI0yahZXAhAI1sONWtw1kQlzkwVQFhFN1xWFcGxrUwI8wUUDlVAIi1EJc6R30pU8wvOQbXkMa1N9UXCTUolYQuCQjYAkNZV9C9dFpZ2E+BYaQnmHdd5B3YdXp0ppC8hdXnAiF6OdLNqYV5kFjeojQnGLFNOWjCXUYVpYFbdmgTEVqdSRCSkKH5D9Pjv+X45IA9OgZl0GmJd9MLDIFgXQH3TlVmwVVOpWtMoFIVGsHiaoVswWhmJaKM1UIALEFKYDXXldqWlMFGbwqEINhAXlQAGf6JO5TWwQ4YIGYoYWlo2n9J5ixU4F3EH1xGUqXX3hd5yN0MNLV3XcKiRdWlHQFIC90Ah+UXVzQeoXvVM3FyB6wdAnLVAgFFyepVvoKlptWu/WGF3CuUTkXdpxOFUKTfH3qkwOqWUbaQEVyhmG6AKy6s0AdtLAuZXi9PLRDb8q87tIEEYaXv1AnBHBcglatkF146aX1bM6GpfTXBp1V2FpkIwQWXglwnDZBWLFn5dv7KjxVxXQTpJRWGecjnSdTRvnNkG9ACc4QTjQbrvjijDfu+OOQRy755JRXbvnlggEAOw==) 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,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';
+                                            messageAudioTag.style.backgroundSize = '20px';
+                                            messageAudioTag.style.backgroundColor = '#fff';
+                                            clearInterval(checkAudioInterval);
+                                        }
+                                    }, 100);
+                                }
+                                else {
+                                    messageAudioTag.style.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';
+                                    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">&times;</span>
+                    <div class="title">${message.title}</div>`;
+                } else {
+                    messageMergeModaltitle.innerHTML = `<span class="close">&times;</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://img.shields.io/badge/GitHub-black.svg)](https://github.com/LC044/WeChatMsg)
 [![](https://img.shields.io/badge/Gitee-red.svg)](https://gitee.com/lc044/WeChatMsg)
 [![](https://img.shields.io/badge/Download-yellow.svg)](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
 
-![](/doc/images/数据库架构设计图.png)
+![](https://blog.lc044.love/static/img/792544ecbbffc60703a1421b92bf9b6d.image.webp)
 
   * 全新框架、重构底层逻辑
   * 更低的内存占用
@@ -109,33 +109,6 @@
   - 如果跟其他模块兼容的话,将采用MIT许可证
   - 已有功能代码全开源
 
-## 🥤效果
-
-<details>
-
-<img alt="聊天界面" src="./doc/images/chat.png"/>
-
-![](./doc/images/微信图片_20240130214341.jpg)
-
-![](./doc/images/why.gif)
-
-![](./doc/images/病假.gif)
-
-![image-20230520235351749](./doc/images/20231227211149.png)
-
-![image-20230520235351749](./doc/images/20231227211215.png)
-
-![image-20230520235351749](./doc/images/20231227211228.png)
-
-![image-20230520235400772](./doc/images/20231227211240.png)
-
-![image-20230520235409112](./doc/images/20231227211250.png)
-
-![image-20230520235422128](./doc/images/image-20230520235338305.png)
-
-![image-20230520235431091](./doc/images/image-20230520235351749.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('&', '&amp;'))
+        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('&#x20;', ' ')
+                        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('&', '&amp;')
+            # xml = xml.replace('&#x20;', ' ').replace('&#15;', '').replace('&#x0A;', '\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("&#01;", "").replace('&#20;', '')
+    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('&#x01;', '').replace('&#x20;', ' ') 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('&#x01;', '').replace('&#x20;', ' ')
+            # 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