diff options
author | SVN-Git Migration <python-modules-team@lists.alioth.debian.org> | 2015-10-08 09:27:57 -0700 |
---|---|---|
committer | SVN-Git Migration <python-modules-team@lists.alioth.debian.org> | 2015-10-08 09:27:57 -0700 |
commit | 928ccf929c26a5344c224303b5108e99c2eb597a (patch) | |
tree | 6d371148311fe4467b0c9a208e9c36d24380c75e |
Imported Upstream version 1.9.8
180 files changed, 41153 insertions, 0 deletions
@@ -0,0 +1,28 @@ +Maintainers: + + Christian Reis <kiko@async.com.br> + Johan Dahlin <jdahlin@async.com.br> + +Contributors (Kiwi1): + + Andreas Kostyrka <andreas@mtg.co.at> + Christian Reis <kiko@async.com.br> + Guilherme Salgado <salgado@async.com.br> + Jon Nelson <jnelson@securepipe.com> + Karl Putland <karl@putland.linux-site.net> + Marcelo Corbani <marcelo@async.com.br> + Ricardo Froelich <ricardo@async.com.br> + +Contributors (Kiwi2): + + Ali Afshar <aafshar@gmail.com> + Gustavo Sverzut Barbieri <barbieri@gmail.com> + Gustavo Carneiro <gjc@inescporto.pt> + Daniel Saran R. da Cunha <daniel@async.com.br> + Ronaldo Maia <romaia@async.com.br> + Evandro Vale Miquelito <evandro@async.com.br> + Patrick K O'Brien <pobrien@orbtech.com> + Gustavo Rahal <gustavo@async.com.br> + Henrique Romano <henrique@async.com.br> + Lorenzo Gil Sanchez <lgs@sicem.biz> + Sidnei da Silva <sidnei@awkly.org> @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey 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 library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..e134d95 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,2696 @@ +=== 1.9.8 === +2006-04-25 Johan Dahlin <jdahlin@async.com.br> + + * NEWS: Update + +2006-04-25 Ronaldo Maia <romaia@async.com.br> + + reviewed by: jdahlin + + * kiwi/ui/objectlist.py (Column.as_string): Use a slightly + different logic to convert to a string, fixes boolean radio + columns + +2006-04-25 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/environ.py: Add support for .gz and .bz2 compressed + glade files, supported by recent gazpacho versions. + Also check in the current directory when everything else + fails. Based on patch by Sidnei da Silva, fixes #2409 + +2006-04-24 Ronaldo Maia <romaia@async.com.br> + + reviewed by: jdahlin + + * kiwi/ui/objectlist.py: fixing when data is None in as_string + * tests/test_ObjectList.py: a test case when data is None + +2006-04-24 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/test/main.py: + * kiwi/ui/test/player.py: + Run the script in a separate thread and the application + in the main thread. Makes it easier to integrate the testsuite + in applications that can't be run in threads. + +2006-04-19 Ronaldo Maia <romaia@async.com.br> + + reviewed by: jdahlin + + * examples/framework/sizegroup/shell.glade: + * examples/framework/sizegroup/slave_view.glade: + * examples/framework/sizegroup/slave_view2.glade: + * examples/framework/sizegroup/slaves.py: + Sizegroup merging example + * kiwi/ui/views.py: + When attaching a slave, merge the sizegroups with the same name + +2006-04-19 Johan Dahlin <johan@gnome.org> + + * kiwi/ui/objectlist.py (_ContextMenu._on_menuitem__activate): + Call row_changed for all rows after changing the visibility a + column. This will make the treeview remeasure nicely. + +2006-04-18 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/radiobutton.py (ProxyRadioButton.__init__): Set + the group after calling the parents constructor, otherwise we'll + get :toggled emitted before the object is initialized properly. + +2006-04-12 Patrick K O'Brien <pobrien@orbtech.com> + + reviewed by: Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/objectlist.py (ObjectList.__init__): + Add row-activated signal and make the old double-click signal + only be emitted when a double-click on the list. Fixes #2526 + +2006-04-11 Ronaldo Maia <romaia@async.com.br> + + reviewed by: jdahlin + + * kiwi/ui/objectlist.py: always use a converter to set the + contents of a column in a ObjectList. Fixes #2523 + +2006-04-10 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/combomixin.py (ComboMixin.prefill) + (ComboMixin.append_item): Check for basestring instead of str + so Unicode can be used, thanks to Alceste Scalas + +2006-04-07 Patrick K O'Brien <pobrien@orbtech.com> + + reviewed by: Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/objectlist.py: only respond to the toggled event + when a boolean column is set to editable. Fixes #2525 + +2006-04-06 Ronaldo Maia <romaia@async.com.br> + + reviewed by: jdahlin + + * kiwi/ui/entry.py: + * kiwi/ui/icon.py: + * kiwi/ui/proxywidget.py: + * kiwi/ui/widgets/combo.py: + * kiwi/ui/widgets/spinbutton.py: + Refactor tooltips to fix bug #1954 + +2006-04-06 Ronaldo Maia <romaia@async.com.br> + + reviewed by: jdahlin + + * examples/validation/personalinformation.py: + * kiwi/ui/entry.py: + * kiwi/ui/widgets/entry.py: + * tests/test_Entry.py: + Changed mask characters and some clean-ups. Fixes #2519 + +2006-04-04 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/entry.py: Clean up the handling of the exact_completion + property. + + * kiwi/python.py: Get rid of GObject stuff in base classes, move + it to kiwi utils + * kiwi/utils.py: inline class initiable meta here + +2006-03-30 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/dateentry.py (DateEntry.__init__): + Only set the mask if it's not empty + + * kiwi/ui/widgets/entry.py (ProxyEntry.set_mask_for_data_type): + Instead of skipping, try to do an educated guess of the mask. + +2006-03-30 Ronaldo Maia <romaia@async.com.br> + + reviewed by: jdahlin + + * kiwi/ui/proxywidget.py: update the validation error tooltip + every time the value changes (for tooltips that containg the + invalid value) + * po/kiwi.pot: + * po/pt_BR.po: new translations + * po/sv.po: + +2005-03-29 Ali Afshar <aafshar@gmail.com> + + reviewed by: Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/colorbutton.py: + * kiwi/ui/widgets/fontbutton.py: + Add proxy widgets for gtk.ColorButton and gtk.FontButton. + Fixes #2511 + +2006-03-29 Ronaldo Maia <romaia@async.com.br> + + reviewed by: jdahlin + + * kiwi/ui/gazpacholoader.py: + * po/kiwi.pot: + * po/pt_BR.po: + * po/sv.po: + pt_BR translation + +2006-03-29 Ronaldo Maia <romaia@async.com.br> + + reviewed by: jdahlin + + * kiwi/ui/widgets/spinbutton.py: No need to press enter to notify that + the value of the spinbutton changed. + * tests/test_proxy.py: Fixing some tests and adding new ones. + +2006-03-28 Ronaldo Maia <romaia@async.com.br> + + reviewed by: jdahlin + + * examples/framework/diary/diary2.py: When the list is empty, pass None + to proxy.set_model + * examples/framework/news/news4.py: Fixing methods, so they work + properly with both callbacks and keyactions. + +2006-03-26 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/desktopparser.py: Add a GKeyFile inspired .desktop parser + +2006-03-24 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/comboentry.py: + * kiwi/ui/entry.py: + * kiwi/ui/widgets/combo.py: + * kiwi/ui/widgets/entry.py: + In ProxyComboEntry, only listen to content-changed on the ProxyEntry. + In ProxyEntry, work around GtkEntry::changed which sometimes is emitted + twice when set_text is called. + In KiwiEntry.get_selected_by_iter, return None if the text from the + model doesn't match the text + +2006-03-23 Johan Dahlin <jdahlin@async.com.br> + + * gazpacho-plugin/kiwiwidgets.xml: + * kiwi/ui/gazpacholoader.py: + * kiwi/ui/widgets/checkbutton.py: + * kiwi/ui/widgets/entry.py: + * kiwi/ui/widgets/filechooser.py: + * kiwi/ui/widgets/label.py: + * kiwi/ui/widgets/radiobutton.py: + * kiwi/ui/widgets/spinbutton.py: + * kiwi/ui/widgets/textview.py: + * tests/test_CheckButton.py: + * tests/test_Label.py: + * tests/test_SpinButton.py: + * tests/test_utils.py: + Rename all widgets to Proxy..., update gazpacho and tests. + +2006-03-23 Ronaldo Maia,,, <romaia@async.com.br> + + reviewed by: jdahlin: + + * kiwi/ui/proxy.py: allow None to be passed to proxy.set_model + * kiwi/ui/widgets/checkbutton.py: + * kiwi/ui/widgets/radiobutton.py: + Allow None to be passed to update + +2006-03-23 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/datatypes.py: Move setlocale() call to __init__.py + + * kiwi/environ.py (Library.enable_translation): Refactor a little bit + try to locate the .mo file and give a warning if it cannot + be found. + +2006-03-22 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/dist.py (KiwiInstallLib._write_dictionary): Replace / with + os.sep on win32, fixes installation. + + * kiwi/ui/entry.py: + * kiwi/ui/widgets/entry.py: + * tests/test_Entry.py: + Move stuff from ProxyEntry to KiwiEntry, use + a kiwi entry in the ComboEntry. + +2006-03-22 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/proxy.py: Rename from kiwi.proxies + * kiwi/acccessor.py: Rename from accessors + * kiwi/model.py: Rename from model + + * kiwi/proxies.py: + Reorganize, Deprecate new_model, Rename model to _model and + add a property. + + * kiwi/interfaces.py: + * kiwi/proxywidget.py: + Document/reorganize signals + +2006-03-21 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/proxywidget.py: + * kiwi/ui/proxywidget.py: + * kiwi/ui/widgets/checkbutton.py: + * kiwi/ui/widgets/combo.py: + * kiwi/ui/widgets/entry.py: + * kiwi/ui/widgets/filechooser.py: + * kiwi/ui/widgets/label.py: + * kiwi/ui/widgets/proxy.py: + * kiwi/ui/widgets/radiobutton.py: + * kiwi/ui/widgets/spinbutton.py: + * kiwi/ui/widgets/textview.py: + Rename mixins and move out of kiwi/ui/widgets/ + +2006-03-21 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/interfaces.py: + * kiwi/proxies.py: + * kiwi/ui/views.py: + * kiwi/ui/widgets/proxy.py: + Rename interfaces and start to document + +2006-03-21 Johan Dahlin <jdahlin@async.com.br> + + * gazpacho-plugin/kiwiwidgets.xml: + * tools/glade_conversor.py (filters): + Update to reflect renames. + + * kiwi/ui/widgets/radiobutton.py (RadioButton.__init__): Rename + RadioButton to ProxyRadioButton. + Add gtk.RadioButton compatible arguments to ProxyRadioButton + + * kiwi/ui/widgets/entry.py: Rename Entry to ProxyEntry + + * kiwi/ui/gazpacholoader.py (GazpachoWidgetTree.__init__): + Print deprecation warnings inside a glade file nicely + + * kiwi/python.py (deprecationwarn, disabledeprecationcall): New + functions, to manage deprecation warnings + +2005-12-14 Ali Afshar <aafshar@gmail.com> + + reviewed by: Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/filechooser.py: + Add widget support for filechooserbutton and filechooserdialog. + +2006-03-21 Johan Dahlin <jdahlin@async.com.br> + + + * kiwi/dist.py (setup): Add a distutils setup() replacement to + simplify installation of kiwi packages. + + * kiwi/__init__.py: + * kiwi/environ.py: + * kiwi/log.py: + Simplify localization for uninstalled applications. Use proper logging + in environment + +2006-03-20 Ronaldo Maia <romaia@async.com.br> + + reviewed by: jdahlin + + * kiwi/datatypes.py: + * tests/test_datatypes.py: + Output a string in a locale dependent way, even if a format is not + provided + Fixes #2486 + +2006-03-20 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/component.py: + * kiwi/interfaces.py: + * kiwi/proxies.py: + * kiwi/ui/views.py: + * kiwi/ui/widgets/proxy.py: + * tests/test_component.py: + Add implements() and providedBy() in a (almost) zope.interface + compatible way. Plenty of tests. + Fixes #2501 + +2006-03-20 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/decorators.py (deprecated.wrapper): Add an optional log argument + + * kiwi/log.py (_log_levels): Add a global log object + +2006-03-17 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/comboentry.py (ComboEntry._on_entry_completion__match_selected): When entry completion is used, update the iter in the treeview aswell. + +2006-03-13 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/comboentry.py (_ComboEntryPopup.popup): + Set the height on the treeview instead of the popup window. + +=== 1.9.7 === +2006-03-11 Johan Dahlin <jdahlin@async.com.br> + + * NEWS: Update + +2006-03-07 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/dateentry.py: + * kiwi/ui/entry.py: + * kiwi/ui/widgets/entry.py: + + Make sure the width of the dateentry is not longer than + it needs to be, don't expand at all. + +2006-03-06 Johan Dahlin <jdahlin@async.com.br> + + * gazpacho-plugin/kiwiwidgets.py: + * gazpacho-plugin/kiwiwidgets.xml: + * kiwi/ui/gazpacholoader.py: + * kiwi/ui/hyperlink.py: + + Add gazpacho support for hyperlink. + +2006-03-06 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/component.py: + (get_utility): Add limited support for zope.interfaces. + +2006-03-05 Johan Dahlin <jdahlin@async.com.br> + + * gazpacho-plugin/kiwiwidgets.xml: + * kiwi/ui/dateentry.py: + * kiwi/ui/gazpacholoader.py: + * kiwi/ui/widgets/entry.py: + * tests/test_dateentry.py: + + Add a DateEntry which has a toggle button that popups a calendar. + +2006-03-05 Johan Dahlin <jdahlin@async.com.br> + + * setup.py (version): Use the new features + + * kiwi/dist.py: Add support for $sysconfdir and add an install_data + subclass which replaces variables. Fetch name from distribution object + instead of subclass. Refactoring and cleanups + +2006-03-02 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/datatypes.py (_IntConverter.as_string): + Do not use a locale specific way of formatting integers. + + * tests/test_datatypes.py (IntTest.testAsStringUS) + (IntTest.testAsStringUS): Add a test + +2006-03-01 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/objectlist.py (ObjectList.remove): Add an optional select + argument to be consistent with append. + + * kiwi/ui/widgets/radiobutton.py (RadioButton._on_group_changed): + Emit content changed when any radio button in the group changes + +2006-02-24 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/combo.py: + * kiwi/ui/widgets/entry.py: + * tests/test_comboentry.py: + + Add support for comboentry.select_item_by_data. + Add tests and remove ComboMixin interface from ProxyComboEntry. + Rename _create_completion to _get_completion. + Reorganize methods in comboentry to match the + +2006-02-24 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/datatypes.py (_BaseDateTimeConverter.get_format): Remove + seconds and AM/PM for now, since we don't have enough infrastructure + to support optional AM/PM. + (filter_locale): Refactor to a function and replace decimal point + with a . + + * tests/test_datatypes.py (CurrencyTest.testFormatBR): + Add tests for decimal points which are not . + +2006-02-23 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/icon.py (IconEntry.deconstruct): + Add support for drawing the icon on the left side and when xalign + is higher than 0.5, draw the icon on the left side. + + * kiwi/datatypes.py (_BaseDateTimeConverter.from_string): + * kiwi/ui/widgets/entry.py (DATE_MASK_TABLE): + Add support for datetime.time + + * kiwi/ui/comboentry.py (ComboEntry.prefill): + Use entry.prefill + + * kiwi/ui/widgets/entry.py (Entry.prefill): New method + (Entry.set_completion_strings): Deprecate and use + prefill internally + +2006-02-23 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/entry.py: Split out mask and icon + to a separate entry which doesn't depend on the framework. + Make get_empty_mask() public. + +2006-02-22 Johan Dahlin <jdahlin@async.com.br> + + * examples/framework/diary/diary.glade: + * examples/framework/diary/diary.py: + * kiwi/proxies.py: + * kiwi/ui/delegates.py: + * kiwi/ui/gazpacholoader.py: + * kiwi/ui/libgladeloader.py: + * kiwi/ui/views.py: + Add ProxyDelegate and example. Rename proxy.new_model to + proxy.set_model. + Add sizegroup merging support (disabled). + Add show_and_loop method on the view. + Remove a few mutable default arguments. + +2006-02-21 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/entry.py (Entry.set_text): Set the cursor + after the inserted text + (Entry.prop_set_data_type): Right align entries which contain + numbers by default + + * kiwi/ui/objectlist.py: Add Column.editable_attribute which + is a row (object) specific way of saying if an attribute + is editable or not. + +2006-02-18 Patrick K O'Brien <pobrien@orbtech.com> + + reviewed by: Johan Dahlin <jdahlin@async.com.br> + + * kiwi/dist.py (TemplateInstallLib.install): win32 install fix + Fixes bug 2446 + +=== 1.9.6 === +2006-02-17 Johan Dahlin <jdahlin@async.com.br> + + * NEWS: 1.9.6 + + * kiwi/ui/widgets/entry.py: + (Entry._set_mask_for_data_type, Entry.prop_set_data_type): + For datetime objects, set a default mask + (Entry._insert_mask): Split into two + (Entry.read): If the input is just the empty mask + return an empty string. + + * tests/test_Entry.py: + Add paste/cut support. Refactor cleanup. + Add a couple of basic tests. + +2006-02-16 Johan Dahlin <jdahlin@async.com.br> + + * examples/validation/personalinformation.py: + * kiwi/ui/widgets/entry.py: + Add basic mask support to entry, still needs a few + improvements. Also add a simple example. + +2006-02-15 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/comboentry.py: + * kiwi/utils.py: + * tests/test_gazpacholoader.py: + * tests/test_utils.py: + + 2.6 compatibility added + +2006-02-15 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/utils.py (PropertyMeta._update_bases): Make sure subclassing + of a combobox works + + * tests/test_utils.py (Subclassing.testCombo): Add a test for this + + * gazpacho-plugin/kiwiwidgets.xml: + * kiwi/ui/comboboxentry.py: + * kiwi/ui/comboentry.py: + * kiwi/ui/combomixin.py: + * kiwi/ui/gazpacholoader.py: + * kiwi/ui/widgets/combo.py: + * kiwi/ui/widgets/combobox.py: + * kiwi/ui/widgets/list.py: + * tools/glade_conversor.py: + + Refactor combos, beginning of gazpacho/proxy support for comboentry. + +2006-02-14 Johan Dahlin <jdahlin@async.com.br> + + * examples/framework/news/news2.py: + * examples/framework/news/news3.py: + * examples/framework/news/news4.py: + * examples/list/editable.py: + * examples/list/kitchensink.py: + * examples/list/radio.py: + * examples/list/searchbar.py: + * examples/list/simple.py: + * examples/list/sortable.py: + * examples/list/stockicon.py: + * gazpacho-plugin/kiwiwidgets.xml: + * kiwi/ui/gazpacholoader.py: + * kiwi/ui/objectlist.py: + * kiwi/ui/test/listener.py: + * kiwi/ui/widgets/list.py: + * tests/test_List.py: + * tests/test_ObjectList.py: + * tools/glade_conversor.py: + + Rename List to ObjectList and move it to kiwi.ui. + Update examples, tests, callsites and conversion helpers. + Keep a backwards compatibility layer. + +2006-02-14 Johan Dahlin <jdahlin@async.com.br> + + * tests/test_utils.py: Add tests for various scenarios + + * kiwi/python.py: Use __init__ instead of __new__ in + ClassInittableMetaType. + + * kiwi/utils.py: Simplify, make sure the GObject Meta class + registers the GType instead of ourselves. That's the only way + to make it honor __gtype_name__ in PyGTK 2.8.x. Remove + some backwards compatibility code. And add a hack to make + it pickup signals and properties. + +2006-02-13 Johan Dahlin <jdahlin@async.com.br> + + * examples/comboentry.py: + * kiwi/ui/comboentry.py: + Add a comboentry and example + +2006-02-13 Johan Dahlin <jdahlin@async.com.br> + + * examples/validation/personalinformation.glade: + * examples/validation/personalinformation.py: + * kiwi/datatypes.py: + * kiwi/ui/gazpacholoader.py: + * tests/test_datatypes.py: + + Add a unicode datatype, tests and modify a model attribute in + personalinformation to use it. + +2006-02-09 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/component.py: + * kiwi/interfaces.py: + * tests/test_component.py: + Add a very basic component system, based on code by Ali Asfhar + +2006-02-09 Johan Dahlin <jdahlin@async.com.br> + + * tests/test_argcheck.py: 100% coverage here + + * kiwi/argcheck.py: Remove tests, they're in tests/ now + + * tools/showcoverage: Steal from gazpacho (who stole from flumotion) + + * kiwi/ui/widgets/list.py (List.index): Use is None instead of if, + return treeiter instead or item.iter. + (List.__iter__): Implement __iter__ in returned object so iter(klist) + works. + + * tests/test_List.py: Add tests. Unit coverage up to 50% globally now. + +2006-02-08 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py: + * tests/test_List.py: + + Add klist::has-rows and tests. + +2006-02-04 Johan Dahlin <jdahlin@async.com.br> + + * setup.py: Move kiwiwidgets to a subdirectory to mirror the layout + of the installed resources. + +2006-02-03 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (List._setup_columns): If there are no + expanded columns add a fake one after the last one. + +2006-02-03 Patrick K O'Brien <pobrien@orbtech.com> + + reviewed by: Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py: Use set_sort_column_id + better with column ids. Simplify _on_column__clicked. + When switching columns, always set to ascending sorting. + Fixes #2420 + +2006-02-01 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/dialogs.py: Really make it follow the HIG. + Copied some code from eel-alert-dialog.c + + Import stuff from gazpacho, save, open, BaseDialog + +2006-02-01 Patrick K O'Brien <pobrien@orbtech.com> + + reviewed by: Johan Dahlin <jdahlin@async.com.br> + + * kiwi/argcheck.py: + * tests/test_argcheck.py: + + Add parenthesis in percent checker, so it actually works and + does not allow values above 100. Add unit tests. + +=== 1.9.5 === +2006-01-30 Johan Dahlin <jdahlin@async.com.br> + + * NEWS: Update + + * kiwi/environ.py (Library.__init__): Do not use an empty from list, + it'll fail otherwise + +=== 1.9.4 === +2006-01-27 Johan Dahlin <jdahlin@async.com.br> + + * NEWS: Update + + * kiwi/proxies.py (Proxy.update_many): New method, like update but + takes a sequence instead + +2006-01-25 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/proxies.py (Proxy.remove_widget, Proxy.add_widget): Add, to + be able to add and remove widgets dynamically. Based on patch + by Henrique Romano + + * kiwi/ui/test/common.py (Base.get_object): New function, to avoid + accessing private members from subclasses. + + * kiwi/ui/test/player.py (Player.delete_window): delete the + reference to the window, so it can be destroyed properly and + new windows can be put here, eg when we reopen the dialog. + +2006-01-24 Henrique Romano <henrique@async.com.br> + + * kiwi/ui/widgets/label.py (Label.set_underline): + Implements set_underline method and a minor cleanup on all the other + text properties setters. + +2006-01-23 Johan Dahlin <jdahlin@async.com.br> + + * examples/list/stockicon.py: New example to demonstrate this feature. + + * kiwi/ui/widgets/list.py: Add Column:use_stock and Column:icon-size. + +2006-01-16 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/python.py (Settable): Another idea from twisted imported, + and improved. + + * kiwi/ui/test/listener.py: Pass signals to event types. + Add a SkipEvent exception to be able to filter inside the + event. Fix DoubleClick event on the list to be caught earlier. + + * kiwi/ui/test/player.py (ThreadSafeFunction._invoke): + Refactor to always return False after the call. + + * kiwi/ui/test/listener.py: Add a new event for toolbutton clicks. + +2006-01-13 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/combobox.py (ComboBox.clear): Emit content-changed + here so the model is updated. + + * kiwi/ui/test/listener.py: + * kiwi/ui/widgets/list.py: + Add get_selected_row_number() and double_click() methods to the + klist. + + Add support for List::double-click signal in the ui test. + + Fixes #2385 + +2006-01-13 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/test/common.py: Add support for GtkToolButtons + + * kiwi/ui/test/player.py: + Update UI tests, to be able to run several times in the same + process as done in stoqs ui test framework. + +2006-01-13 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/environ.py: Add support for py2exe, based on + patch by Carlos Augusto Marcicano + + * kiwi/argcheck.py (argcheck._type_check): Add support for sending + in the default value, even if the type is diffent + + * tests/test_argcheck.py (ArgTest.func_none): Add test for this + +2006-01-10 Johan Dahlin <jdahlin@async.com.br> + + * examples/list/searchbar.py: New example + + * kiwi/ui/widgets/list.py (List.add_list): + Be a bit smarter when cleaning the list, instead of removing + all items, check if they're inserted first. + Refactor remove and remove type sniffing. + (Column.__init__): Set data_type to string as default. + +2006-01-09 Johan Dahlin <jdahlin@async.com.br> + + * tests/test_datatypes.py: Check if the locale is present before + running the tests. Fixes #2377 + +2006-01-03 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/tasklet.py: Add a decorator, patch by Gustavo. + Fixes 2368 + +2006-01-03 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/datatypes.py (_BaseDateTimeConverter.get_lang_constant): + Move lang_constant from being a class variable to an accessor + since its undefined on win32. Fixes #2358 + +2005-12-16 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/environ.py (Library, Library.__init__): improve doc string + +=== kiwi 1.9.3 === +2005-12-15 Johan Dahlin <jdahlin@async.com.br> + + * NEWS: Added + * kiwi/__version__.py: Bump + +2005-12-15 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py: Subclass propertyobject. + +2005-12-14 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (SummaryLabel.update_total): Use + get_attribute and always convert to float. + + * kiwi/ui/views.py (SlaveView): Add simple notebook + validation support. It'll mark the text of the labels + red if there are any widgets inside which are mandatory + or invalid. Fixes bug 2286. + +2005-12-14 Ali Afshar <aafshar@gmail.com> + + reviewed by: Johan Dahlin <jdahlin@async.com.br> + + * examples/hyperlink/hyperlink_demo.py: + * kiwi/ui/hyperlink.py: + +2005-12-14 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/delegates.py (SlaveDelegate.__init__) + (Delegate.__init__): API Change, + move keyactions to the end of the list, to be as compatible + as possible with the parent klasses. + + * kiwi/ui/delegates.py: + * kiwi/ui/views.py: + Cleanups: + - Make a few variables private, remove duplicated code. + - Reorganize variables + - Refactor functionallity to methods + +2005-12-13 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py: Add support for check buttons + in kiwi lists. Also emit cell-edited when changing a radio + button. + + * kiwi/datatypes.py (currency): + (CurrencyConverter): + Add support for currency. + (format_price): Use currency.format + + * kiwi/ui/widgets/list.py (List._cell_data_func): Add support for + currency here. + +2005-12-09 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/dialogs.py: Add dialogs, stolen and extended from gazpacho. + +2005-12-06 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/test/common.py: + * kiwi/ui/test/listener.py: + * kiwi/ui/test/player.py: + Add API documentation, almost complete now. + Also add a timeout for accessing widgets, this will help us to handle + situations where it takes some time for some widgets to be created. + Also ignore eventual errors when the window is closed. + Fix support for selection of multiple rows in KiwiList and + add support for ComboBox. + + * tools/epyrun: + Do not ignore directories called test. + +2005-12-06 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/datatypes.py (BoolConverter.from_string): Do not + return a function, instead call the function and return the + value of it. Sigh. + (BoolConverter.from_string): Always return a boolean, default + to False + +2005-12-05 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/datatypes.py (converter): New baseclass + (BaseDateTimeConverter): New baseclass for datetime.* + (DateTimeConverter): + (TimeConverter): New converters + + * kiwi/ui/widgets/list.py + (List): Use datatype converter to convert to and from strings. + Add some optimizations, save the converter instance and send it as an argument + to the callbacks. + + * kiwi/ui/widgets/list.py (List.select_paths): New method, selects + a list of paths. + + * kiwi/proxies.py (Proxy._setup_widgets): + Cleanups: + Use consistent exception messages + Add and use ProxyError instead of TypeError + Add a new check to ensure that there are no unsupported + widgets added. + Change a warning into an exception + (Proxy._initialize_widgets): Remove error handler, + unused and a hack, unique clashes will be handled + in other ways. + +2005-12-03 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/test/listener.py: + * kiwi/ui/test/player.py: + + Improve the generated output format to be readable, remove + some old stuff. + +2005-12-02 Johan Dahlin <jdahlin@async.com.br> + + * bin/kiwi-ui-test: + * kiwi/ui/test/__init__.py: + * kiwi/ui/test/common.py: + * kiwi/ui/test/listener.py: + * kiwi/ui/test/main.py: + * kiwi/ui/test/player.py: + Check-in initial gui testing framework. + A recorder, which generates code which uses a simple + player object. + +2005-12-01 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/dist.py (get_site_packages_dir): + New function, to handle installation of modules in the site-packages + directory in a platform independent way. + + * setup.py (version): Use it here. + Fixes bug #2326 (Carlos Augusto Marcicano) + +2005-11-28 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/gazpacholoader.py (DataTypeProperty.save): Handle None, + since it's now an allowed type + +2005-11-26 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (List.remove): Remove the iter from the + cache before remove the row. + +2005-11-24 Henrique Romano <henrique@async.com.br> + + reviewed by: Johan Dahlin <jdahlin@async.com.br> + + * kiwi/argcheck.py: + Allowing a "extra_check" function be called to validate + data after type_check is executed over all the + parameters. + +2005-11-24 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/datatypes.py: + * kiwi/interfaces.py: + * kiwi/log.py: + * kiwi/proxies.py: + * kiwi/ui/gadgets.py: + * kiwi/ui/views.py: + * kiwi/ui/widgets/checkbutton.py: + * kiwi/ui/widgets/combobox.py: + * kiwi/ui/widgets/entry.py: + * kiwi/ui/widgets/label.py: + * kiwi/ui/widgets/proxy.py: + * kiwi/ui/widgets/radiobutton.py: + * kiwi/ui/widgets/spinbutton.py: + * kiwi/ui/widgets/textview.py: + Validation progress: + - Empty date fields are now working + - ValueUnset are not checked everywhere in the widgets + - Fadeout works reliably + - validate calls read() instead, since it can now raise + exceptions + - _as_string/_from_string were inverted. + Logging improvements: + - Add logging to proxy/view/fade + +2005-11-23 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/datatypes.py: + * kiwi/interfaces.py: + * kiwi/python.py: + * kiwi/ui/widgets/checkbutton.py: + * kiwi/ui/widgets/combobox.py: + * kiwi/ui/widgets/entry.py: + * kiwi/ui/widgets/label.py: + * kiwi/ui/widgets/proxy.py: + * kiwi/ui/widgets/radiobutton.py: + * kiwi/ui/widgets/spinbutton.py: + * kiwi/ui/widgets/textview.py: + * kiwi/utils.py: + Use PropertyObject for all widgets. Simplifies property + handling. Merge in properties, even for non gobjects for + all bases when using PropertyObject, so we can put properties + and signals in the WidgetMixins. + Add allowed_data_types, useful for SpinButton and RadioButton. + +2005-11-22 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/entry.py: + * kiwi/ui/widgets/label.py: + * kiwi/ui/widgets/proxy.py: + * kiwi/ui/widgets/radiobutton.py: + * kiwi/ui/widgets/textview.py: + Simplify, rename and privatize string converters. + +2005-11-22 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/interfaces.py: + * kiwi/proxies.py: + * kiwi/ui/widgets/proxy.py: + Kill default-value property + +2005-11-22 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/datatypes.py: Handle format == None, for all converters. + + * setup.py (version): + * MANIFEST.in: + Install & include AUTHORS NEWS README in the tarball + Do not include .pyc files in the tarball + +=== kiwi 1.9.2 === +2005-11-21 Johan Dahlin <jdahlin@async.com.br> + + * NEWS: Added + * kiwi/__version__.py: Bump + +2005-11-21 Johan Dahlin <jdahlin@async.com.br> + + * examples/tasklet/simple.py: + * examples/tasklet/test-tasklet.py: + * examples/tasklet/test-tasklet2.py: + * kiwi/tasklet.py: + Add gtasklet from Gustavo Carneiro. + +2005-11-21 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/controllers.py: + * kiwi/datatypes.py: + * kiwi/decorators.py: + * kiwi/dist.py: + * kiwi/environ.py: + * kiwi/i18n/__init__.py: + * kiwi/i18n/i18n.py: + * kiwi/interfaces.py: + * kiwi/models.py: + * kiwi/python.py: + * kiwi/ui/__init__.py: + * kiwi/ui/gadgets.py: + * kiwi/ui/gazpacholoader.py: + * kiwi/utils.py: + + Add docstrings + + * tools/epyrun: + Helper for running epydoc + +2005-11-16 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py: + Add cache property to column useful when using accessors which + can be expensive to compute. + +2005-11-15 Johan Dahlin <johan@gnome.org> + + * kiwi/ui/widgets/list.py (List._load): Catch StopIteration, in case + we have an empty list. + +2005-11-14 Gustavo Sverzut Barbieri <barbieri@gmail.com> + + reviewed by: Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/gazpacholoader.py: + Do not use get_name for getting the name of objects, since it's only + present for GtkWidgets, instead use get_data('gazpacho::object-id'), + which is set on all objects. Fixes #2231. + +2005-11-14 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (SummaryLabel.update_total): Remove + erroneousness show. + (ListLabel.set_value): Rename from set_text + +2005-11-11 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (ListLabel): + Add a new label, (actually an hbox), which can be put under or on + top of a KiwiList to have a label vertically aligned with + a column. + (SummaryLabel): Subclass of ListLabel which summarizes the + values of a column. + + * kiwi/ui/widgets/checkbutton.py (CheckButton.prop_set_data_type): + Accept string here. + + * kiwi/ui/widgets/proxy.py (WidgetMixinSupportValidation): Refactor + emitting of validation-changed since we also need to emit it when + calling set_[valid|invalid|blank] and not only in validate_data. + Fixes validation of mandatory entry with completion enabled. + +2005-11-10 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/proxies.py: + * kiwi/ui/widgets/combobox.py: + * kiwi/ui/widgets/proxy.py: + * kiwi/ui/widgets/spinbutton.py: + Move validate_data out of read, and do it manually afterwards, + there's only two call sites anyway. + +2005-11-09 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/gadgets.py: + * kiwi/ui/views.py: + * kiwi/ui/widgets/checkbutton.py: + * kiwi/ui/widgets/combobox.py: + * kiwi/ui/widgets/entry.py: + * kiwi/ui/widgets/label.py: + * kiwi/ui/widgets/list.py: + * kiwi/ui/widgets/radiobutton.py: + * kiwi/ui/widgets/spinbutton.py: + * kiwi/ui/widgets/textview.py: + * kiwi/utils.py: + + Add new method utils.type_register, use it everywhere. + +2005-11-09 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/proxy.py + (WidgetMixinSupportValidation.validate_data): Only set blank for + mandatory widgets and when data is empty. Always convert '' to None + for non-string types. + + * kiwi/ui/widgets/entry.py (Entry.read): Remove a couple of big hacks + +2005-11-08 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/entry.py (Entry.read): Add a hack to try to fix + validation for empty entries. + + * kiwi/controllers.py (BaseController.__init__): Add support for + automatic keyboard accelerators of type key_name or key_modifier_name. + + * kiwi/ui/widgets/proxy.py (WidgetMixinSupportValidation.set_invalid): + Only connect to done here, that's the only place where we need to + use it. When done, set text and icon. Also disconnect the signal + so it won't be called multiple times. + + * kiwi/ui/widgets/entry.py (Entry._update_current_object): Add custom + validation, when using objects. + + * kiwi/ui/gadgets.py (FadeOut.start): Add additional state, so we know + if we're done when start() is called multiple times. Always emit done, + since we're depending on it in other places. + + * kiwi/ui/widgets/proxy.py (WidgetMixinSupportValidation.don): Wait + until the completion is done to set the text. + + * kiwi/ui/gazpacholoader.py (EntryDataType.get_data_types): Add Object, + useful when using entry completion. + +2005-11-07 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/gadgets.py (FadeOut.stop): Simplify, use delayed.stop, avoids + extra state and makes it reliable. Add API documentation. + + * kiwi/decorators.py (delayed.stop): New function + + * kiwi/ui/widgets/proxy.py (WidgetMixinSupportValidation.set_blank) + (WidgetMixinSupportValidation.set_invalid) + (WidgetMixinSupportValidation.set_valid): Make public and add + API documentation. + +2005-11-03 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/dist.py (compile_po_files): Handle the case when msgfmt + is not found, print a warning and returning nothing, instead of + failing later on. + +2005-11-01 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/environ.py (app): Add global app reference + (Library.__init__): Add better error messages and insert + $prefix/lib/pythonX.Y/site-packages into sys.path + +2005-10-31 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/icon.py (IconEntry.update_background): Handle insensitive + widgets aswell, always use the current state instead of hard coding + GTK_STATE_NORMAL. + +2005-10-14 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/gadgets.py: + * kiwi/ui/widgets/proxy.py: + Add two signals (color-changed and done) to FadeOut and move it out + to gadgets. + +2005-10-14 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/interfaces.py: + * kiwi/proxies.py: + * kiwi/ui/widgets/combobox.py: + * kiwi/ui/widgets/entry.py: + * kiwi/ui/widgets/proxy.py: + * kiwi/ui/widgets/spinbutton.py: + Do validation in read, simplifies the interaction between the proxy + and the widgets. + Add some basic documentation to the proxy/validation "interfaces". + +2005-10-13 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/proxies.py: + * kiwi/ui/widgets/checkbutton.py: + * kiwi/ui/widgets/combobox.py: + * kiwi/ui/widgets/entry.py: + * kiwi/ui/widgets/label.py: + * kiwi/ui/widgets/proxy.py: + * kiwi/ui/widgets/radiobutton.py: + * kiwi/ui/widgets/spinbutton.py: + * kiwi/ui/widgets/textview.py: + Kill WidgetMixin.update, move the check it did to the proxy itself. + +2005-10-13 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/entry.py (Entry.do_unrealize): + * kiwi/ui/widgets/spinbutton.py (SpinButton.do_unrealize): + Chain to parents realize so the parent gets a chance to + free the relevent resources. + +2005-10-11 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/combobox.py: + * kiwi/ui/widgets/entry.py: + * kiwi/ui/widgets/list.py: + * kiwi/ui/widgets/proxy.py: + * kiwi/ui/widgets/spinbutton.py: + * kiwi/ui/widgets/textview.py: + Redo validation. Fixes #2123 + +2005-10-10 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (ColoredColumn): New column. + (Column): Add two new hooks, renderer_func & on_attach_renderer + +2005-10-09 Johan Dahlin <johan@gnome.org> + + * kiwi/__init__.py: + * kiwi/dist.py: + * kiwi/environ.py: + * kiwi/ui/wizard.py: + * setup.py: + + Add infrastructure for handling installed/uninstalled mode. + Introduces Library and Application instances in kiwi.environ. + Add distutils helpers. Use environ.Library in for kiwi itself (yay + dogfooding). Remove old hack in wizard. + +2005-10-08 Johan Dahlin <johan@gnome.org> + + * kiwi/argcheck.py (argcheck.__call__): + Check so the number of arguments are equal before checking + default values, so the user can get a useful exception + + * tests/test_argcheck.py (ArgTest.method2): Add a + few more tests. + +2005-10-07 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/gazpacholoader.py (DataTypeProperty.save): + Do not show editor for Radio/Check, they're always boolean. + +2005-10-06 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (List.refresh): New method. + +2005-09-30 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/comboboxentry.py (BaseComboBoxEntry): A + reimplementation of GtkComboBoxEntry in python. The main difference + between this one and the gtk+ one is that we put our own + entry (a kiwi entry) instead of the standard one, which allows + us to do put an icon in the right part, used by the validation. + + * kiwi/ui/widgets/tooltips.py (Tooltip.__init__): Add a tooltips + implementation, which is a bit more flexible than the one in Gtk+. + Currently unused. + + * tests/test_argcheck.py (ArgTest.testUserDefined): Add some basic + tests. + + * kiwi/argcheck.py: Move in decorator from fiscalprinter. + Add some additional tests and support for checking default values. + +2005-09-28 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py: + (List): do not save iterator in instance, save the iterators + in a local table. + + * kiwi/ui/widgets/list.py: + (List.count, List.index, List.extend): Add + (List.insert, List.pop, List.reverse, List.sort): Add stubs + (List.append, List.remove, List.update): Rename + (List.add_instance, List.remove_instance, List.update_instance) + (List.select_instance): Add backwards compat wrappers + (List._load): Clean up, add iterator support. + (List.select): Check selection mode + + * kiwi/utils.py (deprecated): New decorator + + * kiwi/ui/widgets/list.py: + Remove a couple of methods, now when we have the iter in the instance. + +2005-09-27 Johan Dahlin <johan@gnome.org> + + * kiwi/ui/widgets/list.py (List.get_previous, List.get_next): New + methods. + (List.add_instance, List._load): Set instance.iter upon insertion. + (Column.__init__): Raise ValueError if iter is used, it's reserved + (List.select): Rename from select_instance, use iter from + instance, scroll to cell. + +2005-09-27 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/accessors.py (CacheControl.invalidate): Use DefaultValue instead of + AttributeError. Fixes bug #695: Do not eat AttributeError's triggered + in kgetattr accessors. + +2005-09-21 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/combobox.py (ComboBox.__init__): Only emit changed + once. + +2005-09-20 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/entry.py: Add support for objects mapped + to strings for entry completion. Also add a property, exact-completion + which decides if it should be case insensitive and match substrings. + Fixes bug #2150 + + * tests/test_List.py: Make it pass again + + * kiwi/ui/widgets/list.py (List.get_columns): Return the columns here + instead of the column definition string. + (List.do_get_property): Access the column string directly here. + +2005-09-16 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/gazpacholoader.py: + Clean up /a bit/, fixes #2144 by inheriting from ComboBoxAdatper aswell. + +2005-09-15 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/gazpacholoader.py (DataTypeProperty.save): Add support for + data-type in KiwiLabel, fixes #2141 + +2005-09-13 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/utils.py: AMD64 fix ported from gazpachos copy. + +2005-09-06 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/datatypes.py (FloatConverter._filter_locale): Rewrite, easier + to read and understand now. Can't remember all bugs it fixes. + (IntConverter.from_string): Remove the thousand separators. + +2005-09-05 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/datatypes.py (format_price): Implement a function to format + a number according to the current currency. + + * tests/test_datatypes.py (DataTypesTest.testFormatPrice): + some basic tests. + + * kiwi/ui/widgets/list.py: + Add radio property to Column and set the radio property of + the CellRendererToggle if it's set to True. Add a new callback + for handling CellRendererToogle::toggled which updates the value + of the model. + +2005-09-05 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (List._setup_columns): + Add check for sortable, add a searchable check. + (Column): Add a searchable property. + (List._setup_column): Set up a search equal func + (List._search_equal_func): Define here, checks if + the string starts with the value, seems to be the expected behavior. + +2005-09-01 Henrique Romano <henrique@async.com.br> + + * kiwi/ui/widgets/list.py (List._setup_columns): + Just verifying if more than one column has the sorted attribute, if + so raise ValueError. + +2005-06-14 Henrique Romano <henrique@async.com.br> + + reviewed by: Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/gazpacholoader.py: Update to work with gazpacho trunk. + Add better data-type filters for various widgets. + +2005-08-02 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (Column, List): Add support for cell editing. + +2005-08-01 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (Column): subclass GObject implicitly. + + * kiwi/utils.py (PropertyObject): update to use ClassInittableObject + refactor a little bit and add extra checks so we don't accidentally + try to register a GObject type for it. + Move out so it's not a subclass of GObject, but require it to + be a subclass of GObject, this will make it possible to use + the class for GObject subclasses + + * kiwi/python.py: New file, add ClassInittableObject. + +2005-07-29 Johan Dahlin <jdahlin@async.com.br> + + * bin/kiwi-i18n: + * kiwi/i18n/__init__.py: + * kiwi/i18n/i18n.py: + * kiwi/i18n/msgfmt.py: + * kiwi/i18n/pygettext.py: + Add kiwi-i18n and copy in msgfmt/pygettext from the python + distribution, modify msgfmt slightly to be usable from outside + of the script. + +2005-07-28 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/proxies.py: + * kiwi/ui/views.py: + * kiwi/ui/widgets/proxy.py: + It turned out that the last patch was not flexible enough. + Slaves and proxies had to be attached in the correct order, and + sometimes the validation state of the widgets were not emitted. + + This patch changes the following two things: + 1) Always emit validation state for all widgets when attaching + a proxy to a view + 2) Always emit validation state for slaves attached to views + +2005-07-27 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (Column.__init__): Mark title_pixmap as + todo, since it's not implemented yet. Sort the other properties after + the doc string. Add tooltips doc string. + (List._cell_data_func): Clean up a little bit and add support for + format func + (Column): Add format_func attribute, documentation and + basic error handling + (Column.from_string): Make it a classmethod, not a staticmethod + +2005-07-26 Johan Dahlin <jdahlin@async.com.br> + + * examples/lang.glade: + * examples/slaves.py: + * kiwi/interfaces.py: + * kiwi/ui/views.py: + * kiwi/ui/widgets/proxy.py: + Add per view validation, including example. Fixes #2096 + r=kiko + +2005-07-15 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (Column): Almost a complete rewrite, + using a GObject and properties. + + * kiwi/utils.py: Add a new PropertyObject, fix gproperty to work + with float,int and enums + +2005-07-14 Johan Dahlin <jdahlin@async.com.br> + + * tests/test_utils.py (SliceTest): Add tests for slicerange + * kiwi/ui/widgets/list.py: Clean up treemodel usage, use python api + and define COL_MODEL as 0 and use it everywhere + (List.__getitem__): Fix slicing once and for all. + +2005-07-13 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (List.add_list): Remove selection, + GtkTreeView is different from a GtkCList, if this turns out to be + a problem we'll rewrite/readd this code. + (List.get_column_by_name): New method + (List.__init__): require a list or column, tuples are not allowed + (List.add_instance): Remove selection restore here aswell + (List.__getitem__): Oh my, fix slicing. + +2005-07-12 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/widgets/list.py (List.__contains__): Clean up, + use == instead of is + (List.__setitem__, List.__getitem__): Support strings, refactor + (List.__iter__): Impl. + (List.get_selected, List.get_selected_rows): Separate, mimic gtk+ + closely. + (List.__init__): Select first item in list if we selection is allowed + and we're inserting a list. + +2005-07-11 Johan Dahlin <jdahlin@async.com.br> + + * examples/completion.py: + * gazpacho-plugin/kiwi2.xml: + * kiwi/ui/widgets/entry.py: + + Add entry completion support and a small example. + +== 1.9.0 released == +2005-06-28 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/__init__.py: Kill pygtk.require() it won't be missed since + all systems which we can run on has pygtk 2.x installed as default. + Should also speed up imports. + + * kiwi/__init__.py: + * kiwi/environ.py: + * kiwi/interfaces.py: + * kiwi/ui/gazpacholoader.py: + * kiwi/ui/libgladeloader.py: + * kiwi/ui/loader.py: + * kiwi/ui/views.py: + + Kill loader. Move glade/imagepath handling to kiwi.environ. + Move abstract adaptor to kiwi.interfaces + +2005-06-28 Johan Dahlin <jdahlin@async.com.br> + + * README: + * kiwi/__init__.py: + * kiwi/ui/gazpacholoader.py: + * kiwi/ui/libgladeloader.py: + * kiwi/ui/loader.py: + * kiwi/ui/views.py: + + How much I hate this, but: Write a libglade loader to use as fallback + when gazpacho cannot be found. Add a hook to require gazpacho. + +2005-06-27 Johan Dahlin <jdahlin@async.com.br> + + * kiwi/ui/views.py: Allow us to function without a broker. + + * kiwi/ui/gadgets.py: + * kiwi/ui/widgets/label.py: + * kiwi/ui/widgets/proxy.py: + * kiwi/utils.py: + + Move gtk related functions from kiwi.utils to kiwi.ui.gadgets + +2005-06-27 Johan Dahlin <jdahlin@async.com.br> + + * examples/PersonalInformation/personalinformation.py: + * kiwi/initgtk.py: + * kiwi/ui/__init__.py: + * kiwi/ui/views.py: + * kiwi/ui/wizard.py: + + Kill initgtk, move quit_if_last to views and + pygtk.require() to kiwi.ui, adds a warning. + +2005-06-27 Johan Dahlin <jdahlin@async.com.br> + + * examples/PersonalInformation/personalinformation.glade: + * examples/PersonalInformation/personalinformation.py: + * gazpacho-plugin/kiwi2.py: + * kiwi/interfaces.py: + * kiwi/proxies.py: + * kiwi/ui/delegates.py: + * kiwi/ui/views.py: + * kiwi/ui/widgets/__init__.py: + * kiwi/ui/widgets/checkbutton.py: + * kiwi/ui/widgets/combobox.py: + * kiwi/ui/widgets/datatypes.py: + * kiwi/ui/widgets/entry.py: + * kiwi/ui/widgets/label.py: + * kiwi/ui/widgets/proxy.py: + * kiwi/ui/widgets/radiobutton.py: + * kiwi/ui/widgets/spinbutton.py: + * kiwi/ui/widgets/textview.py: + + Make the personinformation example work again. + +2005-06-20 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/ComboBox.py: + * Kiwi2/Widgets/WidgetProxy.py: + * examples/PersonalInformation/personalinformation.glade: + * examples/PersonalInformation/personalinformation.py: + + More validation work, allow non-string types to be validated. + ComboBox cleanups, adding a mode variable (string or data) which + helps. ComboBoxEntry only works for normal mode, editable, + searchable and auto-completion currently broken + +2005-06-18 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/WidgetProxy.py + (MixinSupportValidation._check_for_complaints): quit the idle, stops + us from eating up the CPU. + + * Kiwi2/Delegates.py: + * Kiwi2/Models.py: + * Kiwi2/Proxies.py: + * Kiwi2/Widgets/CheckButton.py: + * Kiwi2/Widgets/List.py: + * Kiwi2/Widgets/RadioButton.py: + * Kiwi2/Widgets/Wizard.py: + + More imports cleanup, remove unused cruft. + +2005-06-18 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Delegates.py: + * Kiwi2/Proxies.py: + * Kiwi2/Views.py: + * Kiwi2/Widgets/Entry.py: + * Kiwi2/Widgets/Label.py: + * Kiwi2/Widgets/SpinButton.py: + * Kiwi2/Widgets/TextView.py: + * Kiwi2/Widgets/WidgetProxy.py: + * Kiwi2/__init__.py: + * examples/News/news2.py: + * examples/News/news4.py: + * examples/PersonalInformation/personalinformation.py: + * examples/Wizard/survey.py: + * tests/Proxies/None.py: + * tests/Proxies/Separator.py: + * tests/test_Action.py: + * tests/test_CheckButton.py: + * tests/test_Entry.py: + * tests/test_Label.py: + * tests/test_List.py: + * tests/test_SpinButton.py: + + Remove unused imports. Clean up the rest we touched + Remove Proxies.OldVirtualProxy + +2005-06-18 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Proxies.py: + * Kiwi2/Views.py: + * Kiwi2/Widgets/ComboBox.py: + * Kiwi2/Widgets/Entry.py: + * Kiwi2/Widgets/SpinButton.py: + * Kiwi2/Widgets/TextView.py: + * Kiwi2/Widgets/WidgetProxy.py: + * examples/PersonalInformation/personalinformation.py: + + Rework validation. Only validate when the model content changes. + Simplify internal implementation of validation. + Fix ComboBoxEntry validation once for all. + Updated example and added comments and docstrings + +2005-06-14 Johan Dahlin <jdahlin@async.com.br> + + * gazpacho-plugin/kiwi2.py: Clean up and fix a bug, when moving rows + update up/down buttons. + +2005-06-14 Henrique Romano <henrique@async.com.br> + + reviewed by: Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Views.py: Correcting the way as widgets verification is made. + +2005-06-14 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/List.py: + * gazpacho-plugin/kiwi2.xml: + + Add List::selection-mode + +2005-06-13 Henrique Romano <henrique@async.com.br> + + reviewed by: Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/TextView.py: Just removing a useless callback. + +2005-06-07 Henrique Romano <henrique@async.com.br> + + * Kiwi2/Proxies.py: Also block/unblock all signals connected when + updating widgets. + * Kiwi2/Views.py: Allow signal_name to be None, if so block/unblock all + the connected + +2005-06-01 Henrique Romano <henrique@async.com.br> + + reviwed by: Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/WidgetProxy.py: + * Kiwi2/datatypes.py: + * examples/PersonalInformation/personalinformation.py: + * tests/test_datatypes.py: + Add set_format, update testsuite. + +2005-05-30 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/List.py: + * Kiwi2/Widgets/WidgetProxy.py: + * Kiwi2/Widgets/datatypes.py: + + Clean up datatypes. Introduce ConverterRegistry which is global object + you can use to convert to and from strings. Use the new API + everywhere, cleanup WidgetProxy a little bit. + +2005-05-25 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Views.py (SlaveView.attach_slave): Change show_all + into show. + +2005-05-24 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Delegates.py: + * Kiwi2/Models.py: + * Kiwi2/Proxies.py: + * Kiwi2/Views.py: + * Kiwi2/Widgets/CheckButton.py: + * Kiwi2/Widgets/ComboBox.py: + * Kiwi2/Widgets/WidgetProxy.py: + * Kiwi2/Widgets/Wizard.py: + * Kiwi2/utils.py: + pychecker fixes, remove ListDelegate. (replaced by the List widget) + +2005-05-24 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/List.py: Clean up column handling a bit futher. + Make pychecker happy. Remove decimal separator, we depend on 2.3 + where we can set LC_NUMERIC properly + +2005-05-23 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Views.py (SignalBroker.handler_block, + SignalBroker.handler_unblock): New methods, to block a signal tied + to a widget. Patch by Henrique + + * Kiwi2/Widgets/List.py: Ensure we can't hide all columns. + (ContextMenu): New object, factor out context menu from List. Make + rebuild it when columns change lazily. It now displays the columns + in correct order when columns are moved (or added/removed). + +2005-05-20 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/ComboBox.py: First validate, then return + return get_selected_data(), which will return the data if you have + some, otherwise the label will be returned. Fixes bug reported + by Henrique. + + * Kiwi2/Widgets/List.py: Clean up justification handling. + Rename col_definition to column, and always refer to treeview columns + as treeview_column, to avoid confusion. + (List): Setup sorting in a slightly saner way + +2005-05-19 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Controllers.py: + * Kiwi2/Proxies.py: + * Kiwi2/Views.py: + * Kiwi2/Widgets/List.py: + * Kiwi2/utils.py: Update docstrings, to make epydoc happy + * doc/Makefile: Clean up and add some more files + + * Kiwi2/WidgetProxies: Remove + +2005-05-19 Johan Dahlin <jdahlin@async.com.br> + + * AUTHORS: + * Kiwi2/Controllers.py: + * Kiwi2/Delegates.py: + * Kiwi2/Models.py: + * Kiwi2/Proxies.py: + * Kiwi2/Views.py: + * Kiwi2/Widgets/CheckButton.py: + * Kiwi2/Widgets/ComboBox.py: + * Kiwi2/Widgets/Entry.py: + * Kiwi2/Widgets/Label.py: + * Kiwi2/Widgets/List.py: + * Kiwi2/Widgets/RadioButton.py: + * Kiwi2/Widgets/SpinButton.py: + * Kiwi2/Widgets/TextView.py: + * Kiwi2/Widgets/WidgetProxy.py: + * Kiwi2/Widgets/Wizard.py: + * Kiwi2/Widgets/__init__.py: + * Kiwi2/Widgets/datatypes.py: + * Kiwi2/__init__.py: + * Kiwi2/accessors.py: + * Kiwi2/initgtk.py: + * Kiwi2/utils.py: + * Kiwi2/version.py: + + Update authors, remove #! in all files and + add licenses to a few files. + +2005-05-19 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/CheckButton.py: + * Kiwi2/Widgets/ComboBox.py: + * Kiwi2/Widgets/Entry.py: + * Kiwi2/Widgets/Label.py: + * Kiwi2/Widgets/List.py: + * Kiwi2/Widgets/RadioButton.py: + * Kiwi2/Widgets/SpinButton.py: + * Kiwi2/Widgets/TextView.py: + * Kiwi2/Widgets/__init__.py: + * Kiwi2/__init__.py: + + Add documentation strings + +2005-05-19 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Widgets/WidgetProxy.py (MixinSupportValidation._validate_data): + if the data is None don't try to validate + + * examples/PersonalInformation/personalinformation.py: validators + don't need to handler the None case now. + + * Kiwi2/Widgets/SpinButton.py (SpinButton.update): fix stupid mistake + + * Kiwi2/Widgets/WidgetProxy.py (MixinSupportValidation.set_mandatory): + don't redraw the widget here since that is done in the validate_data + method. + + * examples/PersonalInformation/personalinformation.py : + fix this example by allowing data to be None in the weight + validation + + * Kiwi2/Widgets/SpinButton.py: simplify this class but using just + the changed signal and forget about value-changed and output signals. + Fix it for gtk+ 2.4 using the same technique as in the Entry + + * Kiwi2/Widgets/Entry.py: + (Entry.__init__): setup the chain function in the constructor + instead of the expose handler + + * Kiwi2/Widgets/ComboBox.py: + - Make expose events work with GTK 2.4 and 2.6 + - Put as much validation code as possible in MixinSupportValidation + - Add some comments and docstring to parts that are not trivial + - Fix drawing mandatory icons. Now when somebody changes a widget + (either a proxy or the user) we check if the widget is empty to + draw the mandatory icon (if the widget mandatory prop is True) + - Reuse the validate signal in the ComboBoxEntry to perform aditional + validations + + * Kiwi2/Widgets/WidgetProxy.py (MixinSupportValidation.is_correct) + (MixinSupportValidation._validate_data) + (MixinSupportValidation.__init__): properly initialize and manage + the _blank_data attribute + + * Kiwi2/Views.py (SlaveView.check_widgets_validity) + (SlaveView.register_validate_function): use the is_correct method + to check if the data of a widget is ok. Document the + register_validate_function to understand the meaning of its only + parameter + (SlaveView.attach_slave): show the slave after the attacment process + + * Kiwi2/Widgets/WidgetProxy.py (MixinSupportValidation.__init__): + changed self.valid_data to self._blank_data to avoid confusing + names + + * Kiwi2/Widgets/ComboBox.py (ComboBoxEntry.read): fix validation + errors that were going to the console instead of showing in the + interface. + Update the model when the user edit the entry + Don't listen to model row changes since we don't want to inform our + proxy about them and we don't need to do anything special in the + comboboxentry itself + + * Kiwi2/Proxies.py (Proxy._initialize_widgets): block the widgets + when we initialize them so we don't get updates back to the model + +2005-05-18 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/List.py: Add expand property to Column. + +2005-05-18 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Widgets/ComboBox.py (ComboProxyMixin.select_item_by_data) + (ComboProxyMixin.select_item_by_label): improve error messages to + easily detect programming errors. + + * Kiwi2/Proxies.py (Proxy._setup_widgets): provides the widget name + in the warning message. Now is much easier to fix this programming + error. + +2005-05-17 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Widgets/List.py (Column.set_from_string, Column.__str__): + swap the order the tooltip and format are read/wrote since that's + the order Gazpacho is expecting + +2005-05-17 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/List.py (List._setup_columns): Check if it's + configured before adding the columns, prevents the columns from + being added twice when specifying data_types for all columns. + +2005-05-16 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Widgets/List.py (List.add_list): if we add an empty list + we should not select and focus any row + +2005-05-16 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/List.py: Reformat to fit in 79 columns. + +2005-05-14 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/List.py: Protect selection, it's None if called + after List is destroyed. + + * Kiwi2/initgtk.py: Guard pygtk.require, so we can import gtk before + +2005-05-12 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Widgets/List.py (List._create_column) + (List._on_header__button_release_event): change the event from + button_press to button_release to fix a bug related to right + click menu on the List headers + +2005-05-12 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/List.py: + * Kiwi2/Widgets/datatypes.py: + Add support for Column.Data, does not allow it for booleans. + Remove some unused code and comments from gazpacho. + Use locale.format to format strings, also use this for + float types. + + r=lgs + +2005-05-10 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/List.py (List._setup_column): Fix justification. + +2005-05-10 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Widgets/List.py (str2type): remove the default data type + attribute following kiko's suggestion since it's cleaner and + easier to detect future errors. + +2005-05-09 Sidnei da Silva <sidnei@awkly.org> + + reviewed by Johan Dahlin <jdahlin@async.com.br> + + * setup.py (packages): add Kiwi2.Widgets. + +2005-05-07 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Widgets/List.py: added support for dates in KiwiList. + (List._on_column__clicked): removed some code that should + never been there + +2005-05-04 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Widgets/Kiwi2/RadioButton.py: fixed error data-value + * Kiwi2/Widgets/Kiwi2/List.py: minor code improvements from comments + of last checkin + * Kiwi2/Widgets/Kiwi2/Label.py: now kiwilabels have the ability to + update the model + * Kiwi2/Widgets/Kiwi2/WidgetProxy.py: minor fix in do_get_property + +2005-05-03 Gustavo Rahal <gustavo@async.com.br> + + * tests/test_Entry.py: test now checks for ValueUnset instead of None + * Kiwi2/Widgets/ComboBox.py: proper error checking + * Kiwi2/Widgets/List.py: column with number are right justified by + default. Fixed justification error + +2005-04-26 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Widgets/List.py: fixed bug 1962 + +2005-04-26 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Widgets/SpinButton.py: minor cosmetic change in code to be + similar to other widgets. + * Kiwi2/Widgets/TextView.py: is data is None set text as empty + +2005-04-25 Johan Dahlin <jdahlin@async.com.br> + + reviewed by: Gustavo + + * Kiwi2/Proxies.py: + * Kiwi2/Widgets/ComboBox.py: + * Kiwi2/Widgets/WidgetProxy.py: use ValueUnset instead of None for + MixinSupportValidation._validate_data. Update widgets slightly for this + Fixes #1961 + +2005-04-25 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Widgets/ComboBox.py: bugs fixes. 1955, 1953, 1952, 1923 + * Kiwi2/Widgets/TextView.py + * Kiwi2/Widgets/Entry.py + * Kiwi2/Widgets/SpinButton.py: checking of pygtk version done inside + init + * Kiwi2/Widgets/WidgetProxy.py: now check widgets validity is only + called when the widget is attached to a view/delegate + +2005-04-25 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Views.py: Compare references, since some widgets overrides + equality checks (eg, __nonzero__ for ComboBoxEntry) + +2005-04-19 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/View.py: + * Kiwi2/Widgets/ComboBox.py: + * Kiwi2/Widgets/TextView.py + * Kiwi2/Widgets/List.py: + * Kiwi2/Widgets/Entry.py + * Kiwi2/Widgets/SpinButton.py: + * Kiwi2/Widgets/WidgetProxy.py: code clean up + * gazpacho-plugin/kiwi2.py: added support for object data-type + * Kiwi2/Widgets/datatype.py: added support for object data-type + +2005-04-19 Daniel Saran R. da Cunha <daniel@async.com.br> + + * Kiwi2/Widgets/ComboBox.py (ComboBoxEntry): Now ComboBoxEntry works + properly with objects + +2005-04-19 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Proxies.py: all widgets will have an attribute that specify the + views/delegate/etc... that owns it. + * Kiwi2/Views.py: added a global validation that check for correctness + on all widgets, + * Kiwi2/Widgets/ComboBox.py: refactoring, added ability to add items to + the comboboxentry list (dafault it not to add). + * Kiwi2/Widgets/List.py: added ability to slice kiwilist model + * Kiwi2/Widgets/TextView.py: + * Kiwi2/Widgets/Entry.py: + * Kiwi2/Widgets/SpinButton.py: code refactoring due to changes on + combobox. Some minor changes due to pygtk 2.6 + * Kiwi2/Widgets/WidgetProxy.py: code refactoring + * Kiwi2/examples/PersonalInformation/personalinformation.py: shows how + to use global validation + +2005-04-13 Daniel Saran R. da Cunha <daniel@async.com.br> + + * Kiwi2/Widgets/ComboBox.py: make the Widget work properly with + ValueUnset + +2005-04-13 Gustavo Rahal <gustavo@asyn.com.br> + + * tests/test_Entry.py: test work with different locales + * Kiwi2/Widgets/ComboBox.py: apparently mandatory icon is displayed + correctly at all times! Uhu! + * Kiwi2/Widgets/TextView.py: + * Kiwi2/Widgets/Entry.py: + * Kiwi2/Widgets/SpinButton.py: + * Kiwi2/Widgets/WidgetProxy.py: moved code around + +2005-04-13 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Widgets/TextView.py: added Kiwi TextView Widget + * Kiwi2/Widgets/ComboBox.py: fixed mandatory icon display + * Kiwi2/Widgets/CheckButton.py: renamed MixinSupportMandatory to + MixinSupportValidation + * Kiwi2/Widgets/RadioButton.py: same as CheckButton + * Kiwi2/Widgets/__init__.py: added Kiwi TextView Widget + * Kiwi2/Widgets/Entry.py: moved validation code to + WidgetProxy.MixinSupportValidation + * Kiwi2/Widgets/SpinButton.py: code reorganization to support + custom validation + * Kiwi2/Widgets/WidgetProxy.py: added custom validation code to the + MixinSupportValidation class. + * gazpacho-plugin/pixmaps/kiwitextview.png: added icon + * gazpacho-plugin/kiwi2.xml: added kiwitextview + * examples/PersonalInformation/personalinformation.py: added custom + validation examples + * examples/PersonalInformation/personalinformation.glade: added more + widgets for custom validation examples + +2005-04-11 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Widgets/CheckButton: fixed minor name mistake + * Kiwi2/examples/survey.py: renamed survey object + * Kiwi2/Views.py: added support for non-glade files to be slaves + * Kiwi2/Widgets/Wizard.py: wizard interface is not a glade file anymore + +2005-04-08 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Widgets/ComboBox.py: + * Kiwi2/Widgets/Entry.py: + * Kiwi2/Widgets/SpinButtonpy: added mandatory input capabilities + * Kiwi2/Widgets/WidgetProxy.py: renamed class WidgetProxyMinin to Mixin and created a new class named MixinSupportMandatory for Kiwi Widgets that needs to be set as mandatory + * Kiwi2/Widgets/RadioButton.py: + * Kiwi2/Widgets/Label.py: + * Kiwi2/Widgets/CheckButton.py: class renaming + +2005-04-07 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Widgets/ComboBox.py: + * Kiwi2/Widgets/CheckButton.py: + * Kiwi2/Widgets/RadioButton.py: + * Kiwi2/Widgets/Label.py: + * Kiwi2/Widgets/Entry.py: + * Kiwi2/Widgets/WidgetProxy.py: + * Kiwi2/Widgets/SpinButtonpy: make the widgets play nicely + with ValueUnset + + * Kiwi2/Widgets/datatypes.py (set_date_format): fix a typo + + * Kiwi2/Proxies.py (Proxy._initialize_widgets): allow to call + update on the widgets with ValueUnset + + * tests/actions.glade: updated the format of the glade file + + * tests/test_datatypes.py (DataTypesTest.teststr2date): update the + exceptions that are raised when the dates are wrong + +2005-04-06 Gustavo Rahal <gustavo@async.com.br> + + * some code refactor of last commit + +2005-04-05 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Widgets/Entry.py: fixed and improved input checking + * Kiwi2/Widgets/datatypes.py: improve float number and date + checkings to support locale variations + * examples/PersonalInformation/personalinformation.py: added + height entry + * test/test_Entry.py: added KiwiEntry test case + +2005-04-01 Evandro Vale Miquelito <evandro@async.com.br> + + * Kiwi2/Widgets/List.py: + Adding a new select_instance method. + +2005-04-01 Daniel Saran R. da Cunha <daniel@async.com.br> + + * Kiwi2/Widgets/ComboBox.py (ComboProxyMixin.select_item_by_data): + Cleaning the code + +2005-04-01 Daniel Saran R. da Cunha <daniel@async.com.br> + + * Kiwi2/Widgets/ComboBox.py (ComboProxyMixin.select_item_by_data): + Don't try to select a row if there is no data in the combo. + +2005-03-30 Gustavo Rahal <gustavo@async.com.br> + + * doc/Makefile: generates epydoc api + +2005-03-30 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Widgets/Label.py: added support for bold, italic and size + attributes for labels + * tests/test_Label.py: added a test case for Labels + +2005-03-30 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Widgets/SpinButton.py: fixed set_data_type function + * Kiwi2/Widgets/WidgetProxy.py: fixed __init__.py to set initial values + for _data_type and _model_attribute + +2005-03-30 Daniel Saran R. da Cunha <daniel@async.com.br> + + * Kiwi2/Widgets/ComboBox.py: ComboBox now use the data, when it exists, + instead of label of its items to update the model and view. + +2005-03-29 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Widgets/SpinButton.py: added Spin Button support to Kiwi + * Kiwi2/Widgets/__init__.py: spinbutton + * Kiwi2/tests/test_SpinButton.py: test spinbutton + * Kiwi2/gazpacho-plugin/kiwi2.xml: spin button + * Kiwi2/gazpacho-plugin/kiwi2.py: new SpinBtnDataTypeAdaptor to deal + with int and float only + +2001-12-02 Daniel Saran R. da Cunha <daniel@async.com.br> + + * Kiwi2/Widgets/WidgetProxy.py: don't try to set the widget content + if the data is None + + * Kiwi2/Widgets/RadioButton.py: don't update the view if there is no + data in the model + +2005-03-29 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Widgets/RadioButton.py (RadioButton.read): fixed small stylist + problems + +2001-12-02 Daniel Saran R. da Cunha <daniel@async.com.br> + + * Kiwi2/Widgets/RadioButton.py: fix for a wrong return type + +2005-03-29 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/__init__.py (imagepath): + * Kiwi2/Views.py (GazpachoWidgetTree.__init__): use a path resolver + to correctly load images + (image_path_resolver): + +2005-03-24 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/__init__.py: fixed KIWI_GLADE_PATH + * Kiwi2/Widgets/Wizard.py: new wizard widget + * Kiwi2/Widgets/Wizard.glade: glade file that defines the structure of + the wizard. + * Kiwi2/examples/Wizard: directory with a new three step wizard example + * Kiwi2/Widgets/CheckButton.py: since default data-types of widgets are + string is was necessary a modication on the constructor to set to + boolean + * Kiwi2/Widgets/__init__.py: added Wizard widget + +2005-03-24 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Widgets/WidgetProxy.py (WidgetProxyMixin.update): add a warning + when setting None in a widget + + * Kiwi2/examples/PersonalInformation: validation example + + * Kiwi2/Widgets/Entry.py: inform the user if he made a mistake while + typing a entry by setting the background of the entry and adding a + tooltip with a message explaining the error + + * Kiwi2/Widgets/datatypes.py (str2int, str2float): custom converter + functions that raise exceptions with nice messages if they find + errors in the data the user enters + + * Kiwi2/Widgets/WidgetProxy.py: + (WidgetProxyMixin.set_default_value): allow to set a custom default + value + (WidgetProxyMixin.__init__): added a flag to know if the user set + a default value different that the default value associated with the + data type + + * Kiwi2/utils.py (merge_colors): function to merge the background of + a widget between two different colors + + * Kiwi2/Proxies.py (Proxy._on_widget__content_changed): only update + the model if the data is correct + +2005-03-24 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Widgets/CheckButton.py: bool data-type is an object not a string + anymore + + +2001-11-27 Daniel Saran R. da Cunha <daniel@async.com.br> + + * Kiwi2/Widgets/Label.py (Label.set_color): method to change label's + color + +2005-03-23 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * gazpacho-plugin/kiwi2.py (DataTypeAdaptor.create_editor): add support + for date types + +2001-11-27 Daniel Saran R. da Cunha <daniel@async.com.br> + + * examples/SexSelection: New example to test Radio Button + + * Kiwi2/Widgets/WidgetProxy.py (WidgetProxyMixin.__init__): The default + data type is a string because we always need a default. Otherwise + gazpacho doesn't save this property. + + * gazpacho-plugin/kiwi2.xml: + * Kiwi2/Widgets/__init__.py: + * Kiwi2/Widgets/RadioButton.py : support for Radio Buttons + +2005-03-23 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Widgets/datatypes.py: added a date type and functions to + set a data from a string a viceversa + + * tests/test_datatypes.py: added some tests for the datetypes + + * tests/test_Action.py: + * tests/test_BaseView.py: + * tests/test_CheckButton.py: + * tests/test_ComboBox.py: + * tests/test_Delegate.py: + * tests/test_Entry.py: + * tests/test_List.py: don't use delays and remove all the non essential + refreshes. Also make it more unittest friendly + +2001-11-26 Daniel Saran R. da Cunha <daniel@async.com.br> + + * gazpacho-plugin/kiwi2.xml: + * gazpacho-plugin/kiwi2.py (DataTypeAdaptor.create_editor): now the + data-type does not need custom setter (neither getters). This fix a + bug about Gazpacho not saving the data type properties. + + * gazpacho-plugin/kiwi2.xml: disabled hadjustment and vadjustment + properties on the List since they are ScrollWindow properties that + do not make sense with the list. + +2005-03-22 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * gazpacho-plugin/kiwi2.py (DataTypeAdaptor.create_editor): handle + data-types as objects, not as strings + + * Kiwi2/Widgets/WidgetProxy.py: make data-type be an object property + instead of a string one. + + * Kiwi2/Widgets/List.py: + * Kiwi2/Widgets/datatypes.py: + * Kiwi2/Widgets/__init__.py: put all the type functionality in + datatypes.py + + * Kiwi2/Proxies.py (Proxy._setup_widgets): make sure all the + KiwiWidgets have a data-type + + * Kiwi2/Widgets/ComboBox.py (ComboBoxEntry.__init__): fixed a typo + +2005-03-22 Johan Dahlin <johan@async.com.br> + + * Kiwi2/Controllers.py: + * Kiwi2/Delegates.py: + * Kiwi2/Proxies.py: + * Kiwi2/Views.py: + * Kiwi2/WidgetProxies/Base.py: + * Kiwi2/WidgetProxies/CheckButton.py: + * Kiwi2/WidgetProxies/Entry.py: + * Kiwi2/WidgetProxies/OptionMenu.py: + * Kiwi2/Widgets/List.py: + * Kiwi2/Widgets/WidgetProxy.py: + * Kiwi2/accessors.py: + * Kiwi2/initgtk.py: + + Convert exceptions to use raise(x) instead of raise, x + +2005-03-22 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/ComboBox.py (ComboProxyMixin.__len__): Add + (ComboBox.clear): Call ComboProxyMixin.clear + (ComboBoxEntry.clear): Ditto + (ComboProxyMixin.get_selected_label): Add + (ComboProxyMixin.select_item_by_position) + (ComboProxyMixin.select_item_by_label) + (ComboProxyMixin.select_item_by_data): Simplify + +2005-03-22 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/tests/test_CheckButton.py: added a test for CheckButtons + * Kiwi2/Widgets/CheckButton.py: test for bool value in set_data_type + +2005-03-22 Gustavo Rahal <gustavo@async.com.br> + + * Kiwi2/Widgets/CheckButton.py: added Checkbutton kiwi widget + * Kiwi2/Widgets/__init__.py: support for Checkbutton + * kiwi2.xml: added checkbutton to gazpacho-plugin + +2005-03-22 Johan Dahlin <jdahlin@async.com.br> + + * Kiwi2/Widgets/ComboBox.py + (ComboProxyMixin.select_item_by_label): Use iter_next, not + next_iter! + (ComboProxyMixin.get_selected_data): Impl. for Henrique. + +2005-03-22 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * examples/NewsForm/newsform.py: added a size field to test + validations in integer entries + + * Kiwi2/Widgets/WidgetProxy.py (WidgetProxyMixin.__init__): allow to + initialize a widget with None values for their properties so we + can correctly get the default value when setting the data type + + * gazpacho-plugin/kiwi2.xml: disable text-column which is not useful + in ComboBoxEntry + + * Kiwi2/Widgets/ComboBox.py (ComboProxyMixin.prefill): allow + prefill with the empty list + + * examples/FavouriteColor/color2.py: example of ComboBoxEntry + + * examples/FavouriteColor/color.py: example of ComboBox + + * kiwi2.xml: added combos to gazpacho-plugin + + * Kiwi2/Widgets/__init__.py: + * Kiwi2/Widgets/ComboBox.py: first support for ComboBoxes + (old OptionMenu) and ComboBoxEntries (old Combos) + +2005-03-21 Evandro Vale Miquelito <evandro@async.com.br> + + * Kiwi2/Widgets/List.py (List.update_instance): A small fix for + update_instance method. Now we verify if the instance even + exists in the list. + +2005-03-21 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * tests/test_List.py (DataTests.testContains): added a test for + __contains__ + (DataTests.testUpdatingOneInstance): fixed test + + * Kiwi2/Widgets/List.py (List.update_instance): added update_instance + (List.__contains__): added __contains__ method + + * tests/test_List.py (DataTests.testUpdatingOneInstance): added a test + for update_instance + +2005-03-18 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * tests/test_List.py (DataTests.testClearList): added test for the + clear method + + * Kiwi2/Widgets/List.py (List.clear): added + + * Kiwi2/Views.py (SignalBroker._autoconnect_by_method_name): allow + to connect to the actions objects and also improve error message + when a method's signature is bad + + * Kiwi2/Widgets/List.py (List.remove_instance): added + + * tests/test_List.py: added several tests for removing and adding data + to the list + + * tests/test_Action.py: test that menubars and toolbars work with + Kiwi autoconnect mechanism + + * tests/test_Delegate.py: added tests to make sure that a signal + handler is only called once + +2005-03-16 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Views.py (SlaveView._init_glade_adaptor): allow the container + name to have the same name as the gladefile. Fix a bug with Daniel code + +2005-03-15 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * gazpacho-plugin/kiwi2.xml: add a libglade-module attribute since that + is used now for writing the 'requires' tag + + * gazpacho-plugin/kiwi2.py: change the order of the arguments in the + update_editor methods since that was changed in Gazpacho + +2005-03-11 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Views.py (GladeSignalBroker._connect_glade_signals): remove + the double connection + + * tests/test_Delegate.py (DelegateTest.testButtons): add another test + to check if the callbacks are being called more than one time + + * Kiwi2/Widgets/List.py: add two extra flags: _columns_created and + _columns_configured to avoid creating the columns several times + + * tests/test_List.py (ListTest.testAddingOneInstance): improve test + to check that the columns remain sane + +2005-03-10 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Views.py (GladeSignalBroker._connect_glade_signals): don't + call autoconnect_by_method_name twice + + * Kiwi2/utils.py (get_foreground): fix the call to gdk_color_to_string + + * Kiwi2/Views.py (SlaveView.__init__): if we don't have a toplevel + try to get it from the toplevel_name attribute + + * Kiwi2/Widgets/List.py (List): fixed several minor bugs discovered + by writing a simple test + + * Kiwi2/Views.py (SlaveView): use Johan gsignal and gproperty functions + to make the code more readable + + * Kiwi2/Widgets/List.py: remove some print debugging stuff + + * Kiwi2/Views.py (find_in_gladepath): fixed a typo + + * examples/* adapt examples to work with the new changes + + * Kiwi2/Controllers.py: don't use string module and ListType and + TupleType. + + * Kiwi2/utils.py: put here some useful functions that are needed from + several different places. + + * Kiwi2/Widgets/List.py: + * Kiwi2/Widgets/Entry.py: + * Kiwi2/Widgets/Label.py: + * Kiwi2/Widgets/__init__.py: + * Kiwi2/Widgets/WidgetProxy.py: new module to keep the KiwiWidgets. + These widgets inherit from a gtk widget and from WidgetProxyMixin, + which provides the functionality to work together with the Proxy + Kiwi Framework class. + + * Kiwi2/__init__.py: move some utility functions to utils.py and + better API of gladepath + + * Kiwi2/Delegates.py: remove GladeDelegate and GladeSlaveDelegate and + put more arguments to Delegate and SlaveDelegate so we keep the + same functionality. + + * Kiwi2/Views.py: remove GladeView and GladeSlaveView. Rename + AbstractView to SlaveView so now we just have SlaveView and BaseView + and they now how to handle glade files if the user gives them the + apropiate constructor argument. + Also, add add_proxy method to the views and make them work with + proxies by composition. + + * Kiwi2/Proxies.py: change the VirtualProxy class to be the only Proxy + class and work by composition of the View classes + + * gazpacho-plugin/kiwi2.py: + * gazpacho-plugin/kiwi2.xml: added support for Kiwi Label and Kiwi + Entry + + * gazpacho-plugin/README: added a note about how to create kiwi widget + icons + +2005-03-07 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/List.py (List.__init__): fix a typo + + * examples/Faren/faren3.py: this one uses a GladeDelegate + + * examples/Faren/faren2.py: second version of Faren example + + * examples/Faren/faren.py: ported the basic Temperature example + + * examples/Simple/simple.py: ported another example to Kiwi2 + +2005-03-05 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Views.py (GazpachoWidgetTree.__init__): move the gladename + and gladefile class attributes to GladeSlaveView and GladeView. Fix + #1843 + (GladeSlaveView, GladeView): + + * examples/HeyPlanet/heyglade3.py (MyView.gladefile): provide an + example of setting the gladefile as a class attribute + + * Kiwi2/Delegates.py: add a keyactions argument to all the Delegates + so we can use it for the Controller + + * examples/News/news4.py (Shell.__init__): provide an example of + keyactions + + * Kiwi2/initgtk.py (quit_if_last): also quit if there is no toplevels + (e.g., this function was called after hiding the last toplevel) + + * examples/News/news3.py (Shell.on_ok__clicked): stay on the safe + side by checking if there is something selected + + * Kiwi2/Views.py (BaseView._setup_keypress_handler): put this + method only in BaseView to avoid warnings + + * Kiwi2/List.py: use kgetattr instead of getattr when accesing the + attributes of an instance + + * Kiwi2/initgtk.py (quit_if_last): don't treat hide windows as + toplevels when seeing if we need to quit because usually there are + several windows in a glade file. + +2005-03-04 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Views.py (SignalBroker): super() only works with new style + classes + +2005-03-03 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/List.py (List.add_list): block and unblock the selection signal + on the selection object instead of the treeview object + (List._load): add a progress_handler (non used so far) argument so + the call from add_list() works + (List._create_best_renderer_for_type): don't make the cells editable + until we have a 'editable' property to switch this feature on and off. + This is needed so we can still double click on the rows + + * Kiwi2/Views.py (GladeSlaveView.__init__): fix some errors so we can + use this view + + * examples/News/news4.py: new version using a GladeSlaveDelegate with + the KiwList in the file news_list.glade. Note how the column + definitions are in the glade file this time and how we setup + the signals of the KiwiList as any other widget. + +2005-03-02 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/List.py: several changes to make the Columns serializable and + so we can use List from Gazpacho + + * Kiwi2/__init__.py (ValueUnset): put this class at the beginning to + avoid import problems + (str2bool, str2enum, str2type): utility functions + +2005-02-28 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/List.py: renamed KiwiList to List + * Kiwi2/Delegates.py (ListDelegate.__init__): + * examples/News/news3.py: + * examples/News/news2.py: + + * Kiwi2/Delegates.py (KiwiListDelegate.__init__): don't need a + scroll window anymore since that functionality is already in the + KiwiList. + + * examples/News/news3.py: don't use KiwiListDelegate anymore but just + a simple SlaveDelegate. Also fix the small bug about the color + + * Kiwi2/List.py (KiwiList.__init__): for now, use right click button + on the header to show the popup menu. Thunderbird style button on top + of the vertical scrollbar will be done later. + +2005-02-26 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * examples/News/news3.py: adapt the example to use the new signal + feature of the KiwiList + + * Kiwi2/List.py: improve the List with a menu to show/hide columns + and do column sorting and reordering. + + * Kiwi2/Delegates.py: move more things into KiwiList from + KiwiListDelegate. Use signals in KiwiList for the selection and + double click events. + + * Kiwi2/Views.py: optimize color conversion to string by using + shifts instead of divisions + + * tests/run_all_tests.py: fix the first line of the script + +2005-02-21 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/AbstractViews.py: we don't use this file anymore. Its contents + were moved to Views.py + + * Kiwi2/__init__.py: put the ValueUnset class here so we avoid + some cyclic dependencies + + * Kiwi2/Views.py (GladeSignalBroker._connect_glade_signals): make + AbstractView inherit form GObject so we can enjoy GSignals in the + views. + (BaseView.connect): can't proxy these methods anymore because we + have our own signals now + + * Kiwi2/Delegates.py: added the KiwiListDelegated. Not sure if we + should deprecate this delegate now that we are pushing all the + functionality to the Kiwi2.List class. + + * Kiwi2/initgtk.py: we need gobject for signals + + * examples/News/news3.py: + * examples/News/news2.py: converted examples to use Kiwi2 + +2005-02-18 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Views.py: implement attach_slave for GazpachoTree and so for + GladeView and GladeSlaveView + + * Kiwi2/initgtk.py (quit_if_last): only see TOPLEVEL windows, no + POPUPs + + * examples/News/news.py: adapted to Kiwi2. Also use TreeView instead + of CList + +2005-02-17 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/Views.py: forget about GazpachoViews. Make GladeView and + GladeSlaveView use Gazpacho internally with delegation and don't use + AbstractGladeView anymore. I still need to implement attach_slave + with this delegation aproach. + + * Kiwi2/Delegates.py: minor PEP-8 changes and change Kiwi to Kiwi2 + + * tests/run_all_tests.py: convenience script to run all of the tests + + * tests/test_BaseViewInherit.py: adapted to run under unittest + + * examples/HeyPlanet/heygazpacho3.py: copy of heygazpacho3.py using + Gazpachoview + + * examples/HeyPlanet/heygazpacho2.py: copy of heyglade2.py using + GazpachoView + + * examples/HeyPlanet/heygazpacho.py: copy of heyglade.py using + GazpachoView + + * Kiwi2/initgtk.py (quit_if_last): mainquit is deprecated, did you know + that? + + * examples/HeyPlanet/heyglade3.py: + * examples/HeyPlanet/heyglade2.py: + * examples/HeyPlanet/heyglade.py: + * examples/HeyPlanet/hey.py: adapted to Kiwi2 + + * examples/HeyPlanet/hey.glade: generated by Gazpacho, not Glade-2 + +2005-02-16 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * tests/test_BaseView.py: make all the tests run under the unittest + facilities. Integrate test_BaseView2.py here also. + + * Kiwi2/Views.py (AbstractView._gdk_color_to_string) + (AbstractView.get_background, AbstractView.get_foreground): provide + method to get the colors of a widget in the #XXXXX format + - Comment out the classes we don't care about right now: + GladeSlaveView and GladeView + + * Kiwi2/initgtk.py: don't load main_quit, it's deprecated + (quit_if_last): add this function to be used as a delete-event handler + so the user can open and close windows without worrying about when + to call gtk.mainquit + +2005-02-11 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/__init__.py (standard_widgets): fixed a bug about not importing + sys and using sys.stderr + + * Kiwi2/AbstractViews.py (SignalBroker.__init__): refactor SignalBroker + __init__ method so subclasses can customize it + (SignalBroker._do_connections): new method that do all the connections + this signal broker is supposed to make. In the base SignalBroker it + only calls _autoconnect_by_method_name but in GladeSignalBroker it + also calls _connect_glade_signals + +2005-02-10 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * Kiwi2/initgtk.py: added explanation on why do we have a separate + initgtk.py module + +2005-02-05 Lorenzo Gil Sanchez <lgs@sicem.biz> + + * setup.py: remove non used imports + diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..48484ef --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,14 @@ +recursive-include tests *.glade *.py +recursive-include doc * +recursive-include examples * +recursive-include gazpacho-plugin *.py *.png *.xml AUTHORS COPYING +recursive-include glade *.glade +recursive-include pixmaps *.png +recursive-include po *.po kiwi.pot POTFILES.list +include AUTHORS +include ChangeLog +include COPYING +include MANIFEST.in +include README +include tools/epyrun +include NEWS @@ -0,0 +1,67 @@ +kiwi-1.9.8: 25-april-2006 + - distutils.setup() replacement + - date tests + - FileChooser & FileChooserButton + - Rename all proxy widgets to start with Proxy + - Win32 installation fixes + - UI test threading fixes + - Sizegroup merging (Ronaldo) + - Mask improvements (Ronaldo) + - ObjectList improvements (Johan, Ronaldo, Patrick) + - Lots of bug fixes (Johan, Ronaldo, Sidnei) + +kiwi-1.9.7: 11-march-2006 + - Much improved mask support + - DateEntry widget + - Re-add ProxyDelegate (lost since kiwi1) + - Draw validation icon on the left side for right align entries + - Many ComboEntry bug fixes + - Distribution helper improvements + - Limited support for zope.interfaces + - Add a better HIG alert dialog + - Improved logging (a la GStreamer) + +kiwi-1.9.6: 17-february-2006 + - argcheck bugfix (Patrick K O'Brien) + - Some basic dialogs imported from gazpacho + - Fix kiwilist sorting (Patrick) + - Much improved unittest coverage + - Simple component system (Johan & Ali Afshar) + - Better Unicode and Decimal support + - ComboEntry widget + - Rename list to ObjectList + - Mask support for entry + +kiwi-1.9.5: 30-january-2006 + - Installation bug fix + +kiwi-1.9.4: 27-january-2006 + - Tasklet decorator (Gustavo) + - List.add_list optimizations + - py2exe support (Carlos Augusto Marcicano) + - UI test fixes, support lists and toolbars + - Plenty of bug fixes + +kiwi-1.9.3: 15-december-2005 + - UI Test framework + - Add a hyperlink widget (Ali Afshar) + - Add a selectable box + - Currency datatype + - Simple dialogs + - Logging helpers + - Validation improvements + - Documentation improvemnets + +kiwi-1.9.2: 21-november-2005 + - Added tasklet (Gustavo Carneiro) + - Wizard improvements (Evandro) + - Added icon for entries + - Documentation + - Decorators + - Bug fixes + - Currency + - Validation/Proxy refactoring + - List labels + - Colored column + - Distutils/distribution helpers + - Portuguese and Swedish translation diff --git a/PKG-INFO b/PKG-INFO new file mode 100644 index 0000000..f396ffd --- /dev/null +++ b/PKG-INFO @@ -0,0 +1,15 @@ +Metadata-Version: 1.0 +Name: kiwi +Version: 1.9.8 +Summary: A framework and a set of enhanced widgets based on PyGTK +Home-page: http://www.async.com.br/projects/ +Author: Async Open Source +Author-email: kiwi@async.com.br +License: GNU LGPL 2.1 (see COPYING) +Description: + kiwi offers a set of enhanced widgets for + Python based on PyGTK. It also includes a framework designed to make + creating Python applications using PyGTK and libglade much + simpler. + +Platform: UNKNOWN @@ -0,0 +1,91 @@ +Kiwi: A Framework for developing graphical applications in Python + +Kiwi is a framework composed of a set of modules, which eases Python +development using PyGTK. Kiwi makes graphical applications *much* faster +to code, with good architecture and more Python-like bindings; it also +offers extended widgets based upon the original PyGTK widgets. + +* Requirements + + - GTK+ 2.6.x ftp://ftp.gtk.org/pub/gtk/v2.6/ + - PyGTK 2.6.x ftp://ftp.gtk.org/pub/gtk/python/v2.6/ + - Python > 2.3 http://www.python.org/download/ + + Optional + + - gazpacho > 0.6.5 http://ftp.gnome.org/pub/GNOME/sources/gazpacho/ + - zope.interfaces http://www.zope.org/Products/ZopeInterface + +* Installation + + To install (having made sure that the dependencies are installed and + working) do (as root normally): + + python setup.py install + + (You can optionally provide a prefix using the following form, + but if you do remember to setup PYTHONPATH accordingly) + + python setup.py install [--prefix=<prefix>] + +* Documentation + + Included in doc/howto/ and doc/api/ are HTML versions of the + developer's guide and API reference, respectively. You can also + browse the online versions at: + + - Developer's guide: http://www.async.com.br/projects/kiwi/howto/ + - API documentation: http://www.async.com.br/projects/kiwi/api/ + + The developer's guide is available in PostScript format from: + + http://www.async.com.br/projects/kiwi/howto.ps + + You can regenerate all the documentation; just see doc/Makefile. + To generate the API docs you will need: + + - epydoc http://epydoc.sf.net/ + + To generate the developer's guide you will need: + + - Python source (the tarball) http://www.python.org/download/ + - LaTeX (various distributions) + - latex2html http://saftsack.fs.uni-bayreuth.de/~latex2ht/current/ + - GhostScript http://www.cs.wisc.edu/~ghost/ + - NetPBM (for latex2html) http://netbpm.sf.net/ + +* Directory Layout + + examples/ + + Contains a number of examples, most of which are referenced in + the documentation. + + kiwi/ + + Contains the module code itself; this is installed into your + Python's site-packages directory by setup.py. + + doc/ + + Contains documentation for Kiwi, including the LaTeX source code + which can be used to rebuild the docs. doc/Makefile contains + commands to regenerate the full set of docs. + + extra/ + + Contains patches to GTK+ and PyGTK code, and helper scripts that + can be used to accelerate certain tasks. + + tests/ + + Contains a number of test cases for the Kiwi widgets and + framework. All checkins and additions of new code should be + preceded by a working testcase. + +* Contact info: + + URL and download: http://www.async.com.br/projects/kiwi/ + + Maintainer: Johan Dahlin <jdahlin@async.com.br> + Original author: Christian Reis <kiko@async.com.br> diff --git a/bin/kiwi-i18n b/bin/kiwi-i18n new file mode 100755 index 0000000..c94325c --- /dev/null +++ b/bin/kiwi-i18n @@ -0,0 +1,81 @@ +#!/usr/bin/env python +# +# Copyright (C) 2005 by Async Open Source +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2 +# 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 Lesser General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import os +import sys + +# Required version of Python +REQUIRED_VERSION = (2, 1) + +# Directory name, defaults to name of binary, it is relative to .. +# a, __init__.py and main.py is expected to be found there. +DIRNAME = 'kiwi' + +# Application name, defaults to capitalized name of binary +APPNAME = None + +# Do not modify code below this point +dirname = DIRNAME or os.path.split(sys.argv[0])[1] +appname = APPNAME or dirname.capitalize() + +version_string = sys.version.split(' ')[0] +majmin = tuple(map(int, version_string.split('.'))) +if majmin < REQUIRED_VERSION: + raise SystemExit("ERROR: Python %s or higher is required to run %s, " + "%s found" % ('.'.join(map(str, REQUIRED_VERSION)), + appname, + version_string)) + +# Figure out the directy which is the prefix +# path-of-current-file/.. +currentdir = os.path.dirname(os.path.abspath(sys.argv[0])) +basedir = os.path.abspath(os.path.join(currentdir, '..')) + +# Add the base directory where the application is installed in to sys.path +if os.path.exists(os.path.join(basedir, 'lib')): + pythondir = os.path.join(basedir, 'lib', + 'python%d.%d' % sys.version_info[:2], + 'site-packages') + if not os.path.exists(pythondir): + raise SystemExit("ERROR: Could not find required directory: %s" % + pythondir) +elif not os.path.exists(os.path.join(basedir, dirname)): + raise SystemExit("ERROR: Could not find required directory: %s" % + os.path.join(basedir, dirname)) +else: + pythondir = basedir + +sys.path.insert(0, pythondir) + +main_module = 'kiwi.i18n.i18n' +try: + module = __import__(main_module, globals(), locals(), 'main') +except Exception, e: + raise SystemExit("ERROR: Failed to import required module %s\n\n" + "Exception raised during import:\n %s: %s\n" % + (main_module, e.__class__.__name__, e)) + +main = getattr(module, 'main', None) +if not main or not callable(main): + raise SystemExit("ERROR: Could not find callable 'main' in module %s" % + main_module) + +try: + sys.exit(main(sys.argv)) +except KeyboardInterrupt: + raise SystemExit diff --git a/bin/kiwi-ui-test b/bin/kiwi-ui-test new file mode 100755 index 0000000..3165f23 --- /dev/null +++ b/bin/kiwi-ui-test @@ -0,0 +1,81 @@ +#!/usr/bin/env python +# +# Copyright (C) 2005 by Async Open Source +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2 +# 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 Lesser General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import os +import sys + +# Required version of Python +REQUIRED_VERSION = (2, 3) + +# Directory name, defaults to name of binary, it is relative to .. +# a, __init__.py and main.py is expected to be found there. +DIRNAME = 'kiwi' + +# Application name, defaults to capitalized name of binary +APPNAME = None + +# Do not modify code below this point +dirname = DIRNAME or os.path.split(sys.argv[0])[1] +appname = APPNAME or dirname.capitalize() + +version_string = sys.version.split(' ')[0] +majmin = tuple(map(int, version_string.split('.'))) +if majmin < REQUIRED_VERSION: + raise SystemExit("ERROR: Python %s or higher is required to run %s, " + "%s found" % ('.'.join(map(str, REQUIRED_VERSION)), + appname, + version_string)) + +# Figure out the directy which is the prefix +# path-of-current-file/.. +currentdir = os.path.dirname(os.path.abspath(sys.argv[0])) +basedir = os.path.abspath(os.path.join(currentdir, '..')) + +# Add the base directory where the application is installed in to sys.path +if os.path.exists(os.path.join(basedir, 'lib')): + pythondir = os.path.join(basedir, 'lib', + 'python%d.%d' % sys.version_info[:2], + 'site-packages') + if not os.path.exists(pythondir): + raise SystemExit("ERROR: Could not find required directory: %s" % + pythondir) +elif not os.path.exists(os.path.join(basedir, dirname)): + raise SystemExit("ERROR: Could not find required directory: %s" % + os.path.join(basedir, dirname)) +else: + pythondir = basedir + +sys.path.insert(0, pythondir) + +main_module = 'kiwi.ui.test.main' +try: + module = __import__(main_module, globals(), locals(), 'main') +except Exception, e: + raise SystemExit("ERROR: Failed to import required module %s\n\n" + "Exception raised during import:\n %s: %s\n" % + (main_module, e.__class__.__name__, e)) + +main = getattr(module, 'main', None) +if not main or not callable(main): + raise SystemExit("ERROR: Could not find callable 'main' in module %s" % + main_module) + +try: + sys.exit(main(sys.argv)) +except KeyboardInterrupt: + raise SystemExit diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..fbbf298 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,58 @@ +# Tweak these to your local configuration. Note that mkhowto requires +# LaTeX and latex2html. + +MKHOWTO=/opt/src/python/2.4.1/Doc/tools/mkhowto +EPYDOC=epydoc + +# No user-serviceable parts below this line + +MODULES=../Kiwi/Views.py ../Kiwi/FrameWork.py ../Kiwi/Proxies.py \ + ../Kiwi/__init__.py ../Kiwi/List.py ../Kiwi/Menu.py \ + ../Kiwi/Delegates.py ../Kiwi/Basic.py +STYLE="PRE { border-left: 1px dashed blue; \ + border-right: 1px dashed blue; \ + border-top: 1px dashed blue; \ + border-bottom: 1px dashed blue; \ + padding: 1em; margin-right: 2.5em; \ + margin-left: 2.5em; }" +NAME=Kiwi +URL=http://www.async.com.br/projects/kiwi/ + +all: api howto + +howto: howto.tex + mkdir -p howto + # mkhowto pulls in /usr/src/Py*/Doc/perl/l2hinit.perl + $(MKHOWTO) -k --image-type png --a4 + echo $(STYLE) >> howto/howto.css + latex howto + latex howto + dvips howto + cp images/diary.png howto/img1.png + cp images/simple.png howto/img2.png + cp images/london.png howto/img3.png + cp images/london2.png howto/img4.png + cp images/shell1.png howto/img5.png + cp images/shell2.png howto/img6.png + cp images/faren.png howto/img7.png + cp images/simple2.png howto/img8.png + cp images/simple3.png howto/img9.png + cp images/news2.png howto/img10.png + cp images/news3.png howto/img11.png + cp images/newsform.png howto/img12.png + cp images/newsform2.png howto/img13.png + cp images/newsform4.png howto/img14.png + cp ../examples/Person/Person.glade howto/ + +api: $(MODULES) + mkdir -p api + $(EPYDOC) -c white --no-frames -o api -u $(URL) -n $(NAME) $(MODULES) + touch api + +apicheck: + epydoc --check $(MODULES) + +clean: + rm -rf api/ howto/ *.log *.aux *.l2h *.dvi *.ps *.bak *~ + +.PHONY: apicheck clean diff --git a/doc/base-model-design.txt b/doc/base-model-design.txt new file mode 100644 index 0000000..8c5a08c --- /dev/null +++ b/doc/base-model-design.txt @@ -0,0 +1,33 @@ +Current + +class BaseModel: + def block_proxy(self, proxy): + pass + + def unblock_proxy(self, proxy): + pass + + def register_proxy_for_attribute(self, attribute, proxy): + pass + + def unregister_proxy(self, proxy): + pass + +Suggested: + +class BaseModel: + def proxy_block(self, proxy): + pass + + def proxy_unblock(self, proxy): + pass + + def proxy_register_attribute(self, proxy, attribute): + pass + + def proxy_register(self, proxy): + pass + + def proxy_unregister(self, proxy): + pass + diff --git a/doc/class-diagram-kiwi2.dia b/doc/class-diagram-kiwi2.dia Binary files differnew file mode 100644 index 0000000..efa9442 --- /dev/null +++ b/doc/class-diagram-kiwi2.dia diff --git a/doc/environ.txt b/doc/environ.txt new file mode 100644 index 0000000..b03ada7 --- /dev/null +++ b/doc/environ.txt @@ -0,0 +1,34 @@ +1. Resources + + - Normal resource loading, + environ.find_resource(resource_name, object) + + * Locale + * Images + * Glade files + * Documentation + + - Directories + To be able to extend. + + Can a directory be a normal resource (dict) or a special list/constant? + +2. Library + + A resource container + +3. Application + + Like a library in most senses, but has some additional features + + - Launcher script and main script + - Translation + +4. Uninstalled vs Installed + + - Installed structure, defined in setup.py + + - Uninstalled structure, defined in __init__.py for library + and in launcher script or main.py for applications. + + diff --git a/doc/howto.tex b/doc/howto.tex new file mode 100644 index 0000000..35c0518 --- /dev/null +++ b/doc/howto.tex @@ -0,0 +1,2149 @@ +\documentclass[a4paper]{howto} + +% BIG FAT NOTICE: I hacked verbatim.perl to avoid it wrapping my +% verbatiminputs in <BR>s (no idea why it does that). The diff is as +% follows: +% +% --- verbatim.perl.orig Sat Oct 12 14:14:15 2002 +% +++ verbatim.perl Sat Oct 12 14:14:17 2002 +% @@ -110,7 +110,7 @@ +% $env_id .= ' CLASS="verbatim"' unless ($env_id =~ +% /(^|\s)CLASS\s*\=/i); +% $verb_pre =~ s/>/ $env_id>/; +% } +% - join('', $closures, "<BR>\n", $verb_pre +% + join('', $closures, "\n", $verb_pre +% , $verbatim_mark, 'verbatim', $global{'verbatim_counter'} +% , '#', $verb_post, $reopens, $outer); +% } +% +% Generating docs without this mod will cause verbatim stuff to look +% like crap, you have been warned. +% +% Oh, and the image scales are correct. Don't mess with them, it takes a +% lot of time to discover the right ones. And yes, I copy over the +% original pngs over the generated ones; look at the Makefile. + +\usepackage{verbatim} +\usepackage{graphicx} + +\title{Developing applications with Kiwi} + +\release{1.9.6} + +\author{Christian Reis\\Johan Dahlin\\Async Open Source, Brazil} +\authoraddress{kiko@async.com.br\\jdahlin@async.com.br\\http://www.async.com.br/projects/kiwi/} +\date{February, 2006} + +\begin{document} +\maketitle + +\begin{abstract} +\noindent +{\bf Kiwi is a library designed to make developing graphical +applications as easy as possible}. It targets developers that work with +{\bf Python} and that are looking for a way to produce applications with +good design without a lot of bureaucracy. It offers both a framework +and a set of enhanced widgets, and is based on Python and PyGTK. Kiwi +borrows concepts from MVC, Swing and Microsoft MFC, but implements a set +of unique classes that take advantage of the flexibility and simplicity +of Python and GTK+ to make real-world application creation much easier. +In practice, code using Kiwi will be shorter, simpler and easier to +maintain than raw PyGTK, and just browsing through the examples in this +guide and in the package should give you a good idea of how. + +{\bf Kiwi includes a framework and a set of enhanced widgets}. There is +\citetitle[http://www.async.com.br/projects/Kiwi/api/]{complete API +documentation} to accompany the library, and this paper covers the +Framework in detail, providing examples, screenshots and advice on +designing your application. + +All you need to use Kiwi is Python and PyGTK. Gazpacho is a useful add-on, +and is strongly recommended. Kiwi's free software licensed under the LGPL +and can be used and embedded in any application. +\end{abstract} + +\section{Kiwi: An Overview} + +\textbf{Kiwi} is a Python module for developing graphical applications. +While most free software projects that support programming of graphical +interfaces concentrate on low-level infrastructure and components, Kiwi +provides a high-level framework that helps developers organize their +code and develop applications quickly, removing the need to do a lot of +low-level work to get basic functionality implemented. The framework +allows you to easily write applications that look like this: + +\begin{center} +\includegraphics[scale=0.626]{images/diary.eps} + +\small{(This example application, \file{examples/Diary/diary2.py}, has +65 lines, not counting the XML specification)} +\end{center} + +\subsection{Introduction} +For many platforms, graphical applications are developed based on an +application framework that is provided by the platform. For Java we have +Swing (and AWT); for Windows we have MFC (and a number of others). In +general, these frameworks include a set of widgets that are used +natively. + +James Henstridge's +\citetitle[http://www.pygtk.org/]{PyGTK}, an excellent +set of \citetitle[http://www.gtk.org/]{GTK+} bindings for +\citetitle[http://www.python.org/]{Python}, supports graphical programs +written in Python, but it offers only a set of widgets, not a framework; +you have to do all the work of organizing your application yourself. +{\bf Kiwi wraps PyGTK to offer both a framework to organize your +application, and a set of enhanced widgets} that can be used either from +the framework or directly in your application. You can use as much or as +little of it as you like. + +A framework (in the object-oriented programming sense) is a set of +general purpose classes that work together to provide a base upon which +an application is built. Kiwi is a white-box framework; to use this type +of framework, you inherit and customize one or more classes, instantiate +them, and run it. In Kiwi, a high-level class that controls a window, +for instance, is called \class{BaseView}, and it provides a method +called \function{show\_and\_loop()} that renders it and starts the event +processing upon which all GTK+ (and therefore Kiwi) applications are +based. The Kiwi framework includes a number of classes that can be +adapted to your specific needs, and they are described further in the +next section. + +Kiwi is based on the real-world experience of using Python and GTK+ +(through PyGTK) to develop a fairly large application, +\citetitle[http://www.stoq.com.br/]{Stoq}, which uses many concepts +common to most graphical applications: multiple windows and dialogs, +forms, data persistence, lists and high-level classes that support +domain objects directly. + +\subsection{Why Use Kiwi?} + +You should use Kiwi if you develop a graphical software application +where Python is an option. Python is in my opinion the nicest of +the popular high-level languages available today, and I honestly +recommend all new applications be developed in a high-level language +for many reasons; ease of maintenance, speed of implementation and +security being the most important in my experience. + +Kiwi implements a number of interesting tweaks to the standard MVC (or +MV+C) architecture, which is the base of most application frameworks +that exist out there, and a lot of research has gone into the framework +and the widgets to make development as convenient as possible. It goes +way beyond providing a basic `document plus view' schema, doing widget +conversion, automatic signal connection, and adjusting behavior +automatically to reduce drastically the amount of code needed to define +the windows and dialogs for your application. Kiwi also includes native +gazpacho support, which allows you to graphically specify (using +Gazpacho, the UI designer) your user interfaces and use them seamlessly +as part of the framework. + +The code used in Kiwi has been developed with quite a lot of care, and +though it is complex in parts (even crufty in a few spots), we consider +it to be generally easy to understand and change, and you can hijack and +customize the code to your need if you feel you don't want YAD (yet +another dependency) for your application. + +Kiwi is also being actively developed and supported as a building block +in Stoq, and over the past years has grown to become very useful. +We welcome feedback and have been very fast to respond to requests and +bug reports, so you can be sure your application will be relying a +library that is actively supported and that its authors have a +continued interest in maintaining. + +\subsection{Getting and Installing Kiwi} + +Kiwi is distributed through its official website, at +\url{http://www.async.com.br/projects/kiwi/}. It is released as a +tarball frequently, and the tarball is distributed from that page. +Announcements of the release should go out to \code{pygtk-list}, +\citetitle[http://freshmeat.net/]{Freshmeat} and \code{python-announce}. + +You will need to install the following packages if they are not +already on your system: + +\begin{itemize} + \item \citetitle[http://www.python.org/]{Python} 2.3 or newer + \item \citetitle[http://www.gtk.org/]{GTK+} 2.6 + \item \citetitle[http://www.pygtk.org]{PyGTK} 2.6 + \item \citetitle[http://gazpacho.sicem.biz]{PyGTK} 0.6.5 +\end{itemize} + +% ==================== +% ====== MARK ======== +% ==================== + +Most of these packages are available on the main distributions, +including Redhat, Debian, Conectiva and Mandrake, and might even be +preinstalled in your system. If not, you can pull the source code, +compile and install them. Note that some distributions, notably Redhat +8, include PyGTK-2 by default, and you will need to install PyGTK-0.6 +yourself to get around this (use at least 0.6.11, in this case). + +You can also use CVS to check out Kiwi, by following the instructions on +the \citetitle[http://www.async.com.br/projects/cvs.php]{Async CVS +page}. The module name is \code{Kiwi}. +\citetitle[http://bonsai.async.com.br/cvsquery.cgi?treeid=default&module=Kiwi&branch=HEAD&branchtype=match&dir=&file=&filetype=match&who=&whotype=match&sortby=Date&hours=2&date=month&mindate=&maxdate=&cvsroot=\%2Fcvs]{Async's +Bonsai service} can be used to check development of the Kiwi module in +real time, and there is also an +\citetitle[http://lxr.async.com.br/source/Kiwi/]{LXR view} of the code. +Finally, bugs in Kiwi should be reported to +\citetitle[http://bugs.async.com.br/]{Async's installation of Bugzilla}. + +Kiwi includes a fair amount of tests in the \file{tests/} directory in +the tarball, and they can be run in-place (no need to install it first), +so you can easily see what sort of application it supports. + +Since Kiwi uses Distutils, installing Kiwi should be very simple. Once +you have installed the dependent packages, run (as root, normally): + + \begin{verbatim} + python setup.py install + \end{verbatim} + +in the main directory. That's it. To test the installation, do: + + \begin{verbatim} + >>> import Kiwi + \end{verbatim} + +from the Python console. It should work, and if it does, everything +is ready. + +\section{The Kiwi FrameWork} +\label{person} + +This section introduces the Kiwi framework, and shows the use cases that +each of the main classes were designed for. Throughout this guide, I'll +be showing code examples that are included in the distribution (in the +\file{examples/} directory); just install Kiwi and you are ready to run +them. To start off with, I'll show a very simple Kiwi application that +saves information defined in a graphical form. This app is included in +\file{Kiwi/examples/Person/person.py}. Note that this app uses the +glade file \citetitle[Person.glade]{Person.glade}. + +% \begin{center} +% \includegraphics[scale=0.905]{images/simple.eps} +% \end{center} + +% \verbatiminput{../examples/Person/person.py} + +This application (17 lines) renders an interface to edit personal data, +transparently saving and loading it. A quick glance at the code: + +\begin{enumerate} +\item We define Person, a class to hold our application information +\item \code{unpickle\_model()} loads (creating, if it didn't exist) a +Person instance. +\item We create a \class{GladeProxy} instance, which loads an interface +from a glade definition file and attaches it to the Person instance. +\item We run the application; changes in the interface reflect +transparently on the person instance. +\item Upon exiting the mainloop, the window closes and we save the +person. It is ready to be edited the next time we run the program. +\end{enumerate} + +This example is a summary of many Kiwi features; it exemplifies the +Proxy class, which is one of the more featureful parts of the +framework. This guide will take you gradually through the different +classes in Kiwi, and the next section begins by describing the general +Kiwi architecture. + +\subsection{Introduction} + +The Kiwi framework is based loosely on two important concepts. + +\begin{enumerate} +\item The first concept is Model-View-Controller (MVC), which is an +architecture developed for Smalltalk and that has been discussed and +reused many times before (there are some references at the end of the +text if you are curious about it). I have done some study of +MVC\footnote{ While MVC is both interesting and commonplace, I criticize +it as a generic solution to an application-level framework because it +tends to promote highly-coupled classes (it does work quite nicely as a +widget-level framework, having said that). +Of course, this doesn't mean it's not useful to many applications (or at +least parts of them).} and MVC implementations in modern frameworks +(Swing and MFC both implement MVC in their own ways), and Kiwi provides +traditional Views and Controllers (V and C) as well as Delegates, which +are combined Views and Controllers (using the same name as under Swing). + +\item The second concept is the Proxy, which borrows somewhat from Allen +Holub's `visual proxy' concept described in his series +\citetitle[http://www.javaworld.com/javaworld/jw-07-1999/jw-07-toolbox\_p.html] +{Building user interfaces for object-oriented systems}. Allen's views +are quite original and gave a lot of insight into what coupling really +meant for graphical interfaces. + +The visual proxy is an object that represents a model, or a certain part +of it. It is coupled to the model it represents, which isn't absurd +taking into account that it is simply a way to view and change it. In +Kiwi you use Proxies in combination with Delegates (or separate Views +and Controllers) to build forms for applications. +\end{enumerate} + +\subsection{The FrameWork Classes} + +The Kiwi framework is made up of a set of classes and some helper +functions that are used to define the behavior of your application. +The Kiwi classes are organized into the following groups: + +\begin{itemize} +\item \class{Views}, which represent the graphical display; a View defines +an interface's widgets and their layout. +\item \class{Controllers}, which handle signals generated by the user +interacting with the widgets in a View. +\item \class{Delegates}, which are classes that combine the features of +a View and a Controller. +\item \class{Models}, which are mixins your domain object can +inherit from to take advantage of special functionality. +\item \class{Proxies}, special types of Delegate designed to implement +forms. Proxies attach themselves to an instance, and transparently +modify this instance as the user interacts with the widgets in its +interface. +\end{itemize} + +Of these, \class{Controllers} and \class{Models} do not implement user +interfaces themselves, and are used together with one of the different +user interface (UI) classes. + +{\bf A special note:} When using a white-box framework, it is very +important to take care when defining names in the inherited classes to +avoid clobbering names defined in the base classes you inherit from. It +is useful to read through the +\citetitle[http://www.async.com.br/projects/Kiwi/api/]{API +documentation} and check for naming conflicts, and to understand which +hooks might be interesting to reimplement. If you find something in your +code is behaving very strangely, this could be one of the first things +to check. + +\subsection{Views} + +A View is a class that defines how a single window will look. +Differently from most frameworks, Kiwi requires almost no infrastructure +code to create a trivial app; Kiwi allows you to create a view and run +it by itself, with no attached handlers, controller or model. (Whether +or not this is a very useful app is another matter, but let's get you +started on it before you criticize me.) + +There are a number of different Views available for Kiwi, which live in +the \module{View} module: + +\begin{itemize} +\item \class{BaseView}, which is a View with a toplevel window, in which +you create and organize the widgets using PyGTK classes and commands. +\item \class{GladeView}, which allows widgets to be defined using Glade +and loaded in runtime using libglade. This allows widgets to be easily +changed and rearranged visually, without the code needing to be changed. +\item \class{SlaveView}, which is a View with a toplevel widget that is +not a window. SlaveViews are designed to be embedded into other Views, +usually representing a part of an interface that must be reused in +multiple places in your application. Kiwi makes it easy to reuse that +complicated form that you created in multiple windows of your app. +\end{itemize} + +To start off, the easiest way to demonstrate a View is to create a very +simple one that does nothing but present a fixed label on the screen. +This first example will use GTK+ widgets directly, just to show how they +fit in (it's available in the Kiwi tarball in +\file{Kiwi/examples/HeyPlanet/hey.py}). + +%% \begin{center} +%% \includegraphics[scale=0.905]{images/london.eps} +%% \end{center} + +%% \verbatiminput{../examples/HeyPlanet/hey.py} + +So what does the example do? To start off with, it defines a view class +that inherits from \class{BaseView}, the View with a toplevel window. +BaseView should always be subclassed, since it requires you to to create +the widgets programatically. You should instantiate and assemble PyGTK +widgets in the constructor before running +\function{BaseView.\_\_init\_\_()}. We initialize \class{BaseView} with +two parameters\footnote{Note that I used positional parameters here just +to make things clear; they are in the proper order and the whole call +could be \code{Views.BaseView.\_\_init\_\_(self, win, mainquit)}.} + +\begin{itemize} +\item \function{toplevel}, which defines which widget is the toplevel +widget for that view. For a BaseView, this is the window you want to +display. We pass in the GtkWindow we just created. The toplevel widget +is used for setting focus and showing the View. +\item \function{delete\_handler}, which defines which function should be +called when the window is deleted (this happens when the almost ubiquitous "X" +button offered by window managers is clicked, or \code{del(window)} is +invoked). We are passing in mainquit, which breaks the mainloop we are +running in, and allows the application to exit. + +If you didn't pass in a delete handler, closing the window would leave +the python interpreter hung in the mainloop. What mainloop? Read on. +\end{itemize} + +Right after we instantiate our view class, we call a special method in +it: \code{show\_all\_and\_loop()}. This method calls show() on all the +widgets under the toplevel widget including it (in our cases, it will +show the label and the window), and runs the GTK+ event loop (or +mainloop). The mainloop is a fundamental aspect of GUI programming: when +it is invoked, it assumes control of the normal flow of execution and +continuously processes events that are generated by user interaction +with the widgets. You can read more about the mainloop in the mainloop +section of +\citetitle[http://developer.gnome.org/doc/GGAD/sec-mainloop.html] +{GTK+/Gnome Application Development}. + +\code{show\_all\_and\_loop()} (and its variant \code{show\_and\_loop()}) +returns a value upon exit. This return value corresponds to the View's +\code{retval} instance variable, and you can use \code{self.retval} to +return any value you wish. In our example the use was rather trivial, +but \code{retval} is convenient when opening a dialog: use +\code{show\_all\_and\_loop()} to run it; the dialog modifies its +\code{retval} variable depending on a certain event (OK button was +pressed versus Cancel button, for instance), and the method will return +this value to the caller (which can then make a decision based on it). + +Right now, the relevant aspect of the mainloop is that we will need to +break this loop when we quit our application, which for this app should +happen when you click on "X". This is why we are passing in +\function{mainquit} as \code{delete\_handler}: to stop the mainloop and +let the control go back to our code (which also ends right after, at +which time you are left staring at the console). + +\class{BaseView} is the most basic type of view, and it's only worth so +much explaining. The next section describes \class{GladeView}, which is +a lot more interesting. + +\subsection{GladeView} + +Once you have written three (two?) applications using the PyGTK classes +and commands directly, you get very bored of hand-coding the widgets and +their structure. Sure, you have total control over them, and you can +build them programatically, which is why you {\it might} want to do it +for small parts of your application, but for anything that is medium to +large-scale, having to maintain all that code makes changing the UI very +painful. Damon Chaplin's application +\citetitle[http://glade.gnome.org/]{Glade} provides a way to create a +GTK+ interface visually, and it is normally used to generate C or C++ +code that creates the widgets. It also saves the interface specification +in an XML file. Knowing this, James Henstridge, the author of PyGTK, +wrote libglade, a killer library (this was years ago, but I digress) +that renders widgets based on specifications in an XML file. libglade +allows you to keep the interface definition separate from the code, +which is an awesome idea, since it drastically reduces the amount of +interface code (and the consequent burden of maintaining it). Being able +to use Glade to revisit and tweak your interface without having to +regenerate code is also a huge advantage. + +Anyway, Kiwi lets you use Glade interfaces in a {\bf very} convenient +manner, by using the \class{GladeView} class. Let's show this off by +redoing the last example using glade. First thing would be running Glade +and creating a window and putting a label into it. Name the window +\code{hey} and turn the visible property off (using the Common tab of +the Properties dialog). Save the file (careful with that Save dialog, it +creates directories and is generally evil in my opinion) as +\file{hey.glade}. And then code up \code{heyglade.py} (all this is +available in \file{examples/HeyPlanet/}): + +\verbatiminput{../examples/HeyPlanet/heyglade.py} + +Oops. Where did all that code go? Right, we are now using the glade file +to generate the UI. So we didn't even need to subclass +\class{GladeView}; we just passed in a parameter that told it what glade +file to use, and the same delete handler. Note also that we used +\code{show\_and\_loop()} instead of +\code{show\_all\_and\_loop()}\footnote{ It is important to note that +GladeView does *not* allow you to call \code{show\_all\_and\_loop()} --- +you must use \code{show\_and\_loop()} instead. There is a reason for +this. show\_all means that all widgets under the toplevel widget should +be shown; however in glade, since most widgets are visible by default, +you only need to turn off visibility on the toplevel window to get the +default hidden effect. This alone would not be a problem, but the fact +is that certain widgets can be configured in glade to *require* being +hidden (either because you want them initially hidden, or because they +do something special, like the GtkToolbar: if you choose to use `Only +Text' or `Only Icons', glade implements this by hiding the icons or +text, respectively). This would break with show\_all and too many bug +reports told me it was enough reason to turn it off. You can of course +call it manually on the window if you are really determined do so.}. + +The \code{gladefile} parameter indicates the file it should open. If the +name you pass in doesn't have a \file{.glade} suffix, \class{GladeView} +will append it and try to open it; in our cases, it will try to open the +file \file{hey.glade}. However, this argument does a bit more than just +specifying the file (when using this form of the constructor, which is +simplified): it also specifies by default the {\bf name of the toplevel +widget} in the glade file. This is why I specifically stated the window +should be named \code{hey} two paragraphs back. That widget is attached +to the view instance with the name \code{toplevel}. + +If you want to use another specific toplevel widget name, just use the +extra constructor parameter \code{toplevel\_name}. This can be useful +if you have many windows in the same Glade file; you can reuse the glade +file by just defining multiple \code{GladeView} instances (or subclass +instances) with the same \code{gladefile} but specifying different +toplevel widgets as each individual \code{toplevel\_name}. + +There are some common mistakes to be made when using the GladeView, and +Kiwi raises special exceptions for three them. + +\begin{enumerate} +\item The first one is forgetting to specify the gladefile, or giving it +the wrong name. Kiwi will try to look for the file in its glade search +path (which can be set by the GLADEPATH variable and also by using +\code{Kiwi.Views.set\_gladepath()}), and if it doesn't find it, it will +complain with an \exception{IOError} and stop. +\item The second is not having a widget with the name of the gladefile +in your glade interface. This is only a mistake if you don't specify +\code{toplevel\_name}, of course. Kiwi raises an +\exception{AttributeError} here. +\item The third mistake is forgetting to make the window hidden. We want +the window to be hidden to allow you to control when exactly it is +shown, and if you use the same glade file for all your dialogs, you +quickly will understand why. Kiwi prints a warning for this, as I +don't consider it a fatal error. +\end{enumerate} + +To use \class{GladeView} effectively, it's important to define the +\code{widgets} list, which defines what widgets are to be attached to +your class. This list has its own semantics, which I discuss in the next +section. + +\subsection{The Widgets List} + +\class{GladeView}, \class{BaseView} and \class{SlaveView} provide an +interesting feature: the widgets list specification. It is a list of +strings, each string corresponding to the name of a widget. In a +high-level sense, the list describes what widgets are attached to your +view. The list is processed in the following manner: + +\begin{enumerate} +\item All the widgets specified in \code{self.widgets} are converted to +Kiwi widgets automatically. You can use \code{Views.register\_widget()} +to change the conversion targets. This step applies for all View +classes. For SlaveView and BaseView, of course, the widget must already +be an instance variable of your View (which is why you should create the +interface variables before running the parent class' constructor). The +matter of widget conversion and signal callbacks is discussed further +in the Controller section. + +\item For \code{GladeView}, the widgets in the list are pulled using +libglade and attached as instance variables of your View. In other +words, if you define a widget \code{foo} in your glade file, and you +specify "foo" as a member of the widgets list, it will automatically be +set as \code{self.foo} (and converted to a Kiwi widget if a +corresponding widget is registered). A caveat: since the toplevel window +is attached to the view with the special name "toplevel" (as well as +"win", for historical reasons, and "gladefile"), these names are +reserved and should not be used for widgets in your glade file. + +\item For \code{Proxy}, the widgets list has a further association, +which is specified by prefixing the widget name by a colon in the +widgets list (using ":foo", for instance). Since we haven't discussed +Proxy yet, I'll leave this to be mentioned when we get there. +\end{enumerate} + +As an example of how \code{widgets} should be specified and used, let's +change \file{heyglade.py} to \file{heyglade2.py}: + +%% \begin{center} +%% \includegraphics[scale=0.905]{images/london2.eps} +%% \end{center} + +%% \verbatiminput{../examples/HeyPlanet/heyglade2.py} + +Of course, it is often useful to subclass \code{GladeView} to be able to +customize the behavior that you want for that view. I recommend +changes that are to be done to the widgets at startup time (like +\function{set\_bold()} and \function{set\_size()} for a label) should be +performed in the class constructor, right after +\function{GladeView.\_\_init\_\_()}\footnote{Yes, in a way this is the +opposite of the procedure in \class{SlaveView} and \class{BaseView}. It +has to be this way because the parent constructor for \class{GladeView} +is who attaches the widgets to the view, whereas the constructors for the +other Views {\it expect} them to be already attached}. If you subclass, +you can skip passing \code{widgets} to the constructor by creating a class +variable with the same name. + +An example of a subclassed \class{GladeView} using \code{widgets} as a +class variable follows (in the Kiwi tarball in +\file{Kiwi/examples/HeyPlanet/heyglade3.py}): + +%% \verbatiminput{../examples/HeyPlanet/heyglade3.py} + +\subsection{UI Composition} + +The examples we have seen so far use a simple mapping: one View per +window. While simple applications will use this and nothing else, +wouldn't it be interesting to reuse parts of your interface just like +you reuse code when programming? + +UI Composition allows you to create components of your application UI, +which in Kiwi are named {\bf slaves}, and attach them to other Views. +This allows you to embed widgets in any way you like. A slave is really +just another View (there {\it is} a class called SlaveView, which is for +interfaces without a toplevel window that do not use Glade, but any view +can be used as a slave) that happens to be attached to another view. + +To implement this, Kiwi uses GTK+'s really cool ``reparenting'', a +property which allows a widget to be removed from one place in the +widget hierarchy and placed in the other (in Kiwi terms, a View's widget +is replaced by another View). + +A view that will embed one or more slaves is called a Parent view +(though there is no class with that name; read on). There are two +important requirements for a Parent view: + +\begin{enumerate} +\item {\bf The parent View must be a GladeView}. This allows us to +easily find a named widget and change it for a slave. No, there is no +ParentView class: it would be a useless, as there is nothing a +ParentView needs to do that a GladeView doesn't do already. +\item The {\bf parent View must contain a "placeholder" widget +identified by a name, inside an EventBox}, name being the Name: property +defined in the Widget tab in Glade. The part about EventBox may seem a +bit awkward, but it allows us to guarantee that the child packing of the +substituted widget will not change. If we were to swap simply a widget +for another, the first widget's container would loose the child packing +information (i.e., GtkBox and GtkTable's child attributes: expand, fill, +padding and span). +\end{enumerate} + +I'll demonstrate by showing how a parent view is built in glade. Look at +\file{examples/Browser/news\_shell.glade}: + +%% \begin{center} +%% \includegraphics[scale=0.905]{images/shell1.eps} +%% \end{center} + +In \file{news.glade} I put together a simple dialog, and in the place where +I want the slave to be embedded, I have added an EventBox (with any +name) and a label (named \code{my\_placeholder}). We now write a +small SlaveView called \class{NewsView}, using some straight PyGTK code: + +\begin{verbatim} +import gtk +from Kiwi import Views, mainquit + +class NewsView(Views.SlaveView): + widgets = ["clist"] + def __init__(self): + clist = gtk.GtkCList(2, titles=["News", "Author"]) + clist.set_selection_mode(gtk.SELECTION_BROWSE) + for item in news: + clist.append(item[:-1]) + clist.columns_autosize() + Views.SlaveView.__init__(self, toplevel=clist) + +# Some news articles borrowed from Pigdog Journal for our example +news = [ + ("Smallpox Vaccinations for EVERYONE", + "JRoyale", + "http://www.pigdog.org/auto/Power_Corrupts/link/2700.html"), + ("Is that uranium in your pocket or are you just happy to see me?", + "Baron Earl", + "http://www.pigdog.org/auto/bad_people/link/2699.html"), +] + +\end{verbatim} + +Now of course, this view can't display itself; it's a \code{SlaveView}, +and it lacks a toplevel window. But that doesn't matter; we want to +attach it as a slave to a main View. We create \code{news}, an instance +of \class{NewsView}, and a \class{GladeView} instance called +\code{shell}, which will be our parent View. We then call the method +\code{attach\_slave()}, which does the actual reparenting; it takes as +arguments the name of the widget {\it to be replaced} and the view to be +attached. At this point, we run the parent view as we would normally: + +\begin{verbatim} + +news = NewsView() +shell = Views.GladeView("news_shell", delete_handler=mainquit) +shell.attach_slave("my_placeholder", news) + +news.show_all() +news.focus_toplevel() # explained next section, don't worry +shell.show_and_loop() +\end{verbatim} + +In summary, I gather some random news, create a \class{NewsView} +instance, a \class{GladeView} instance (that will be the parent), call +the special function \code{attach\_slave()}, and that's it. (There is a +minor detail with widget focus that is discussed in the next section; +basically, the slave needs to be attached to the parent before trying to +focus its widgets). The final result is shown below: + +%% \begin{center} +%% \includegraphics[scale=0.905]{images/shell2.eps} +%% \end{center} + +Note that all the examples up to now have been very simple and static: +there is no user interaction going on beyond closing the window (for +instance, the buttons in the previous example do nothing!). To be able +to handle events, we need to understand how the Controller classes (and +their derivates, the Delegates) work. The next section explains them in +detail. + +\subsection{Controllers} +\label{callbacks} + +In GTK+, all user events are interpreted by signals that are generated +by the widgets what are manipulated. This means obvious stuff like +button clicks and typing text into a \class{GtkEntry}, but it also +includes less obvious events like the initial rendering of the widget +and moving the mouse over a widget. To a signal, we can attach a +function that is called when it is triggered, and this function is +usually called a {\bf signal handler}. + +Many widgets have default handlers attached to their signals (these are +coded in the actual GTK+ source code); a default handler, for example, +is what makes the text that you type into an Entry actually display +inside its white box, and what makes the checkbutton depress and change +state when you click on it. However, there are many cases when you want +to do something special based on a certain signal occurring. A pushbutton +(\class{GtkButton}) is a good example: it doesn't do anything by default +when clicked beyond depressing, so you practically always will want to +connect to its "clicked" signal. Developing a graphical application +involves selecting which signals you think are important in the +interface widgets, and attaching functions to them. + +In Kiwi, we suggest grouping the relevant signal handlers for an +interface into a class. This means that instead of using a number of +independent functions, the signal handlers are really methods of +a class. This class is called the \class{Controller}. The +\class{Controller} is conceptually the part of the framework that +handles events that are generated in the UI; click a button, a +controller method is called. + +Since the View holds the interface, it makes sense to attach a +controller to each view\footnote{Ancient versions of Kiwi had a +MultiView class, that held various subviews for portions of it, and +required one controller for each subview. The new SlaveView approach is +nicer, because it allows reusing the actual interface in a much more +flexible manner.}, and vice-versa; the Controller constructor takes a +View instance and ties itself to it. Since the controller needs to +define special methods, it should be subclassed in your code, and the +methods implemented. + +The Kiwi Controller has a special feature: if you write your method +names using a certain syntax, it "discovers" what widget and signal you +want, and attaches the handler automatically for you. This works for any +type of View, even GladeViews, which means no more messing around with +\code{signal\_autoconnect()} and that pesky signal dialog in Glade. The +handler's method name should be written as follows: + +\begin{enumerate} +\item Start the name with \code{on\_} or \code{after\_}. Use \code{on\_} to +connect before the default handler for that widget's signal; use +\code{after\_} to connect after it. It is more common to use +\code{on\_}\footnote{Hint: if you are connecting +to a \class{GtkEntry}'s \code{insert\_text} signal and you want to use +\code{entry.get\_text()}, use \code{after\_entrywidget\_\_insert\_text} +--- the default signal handler is responsible for inserting the text +into the entry and you will need it to run before your handler.}. + +\item Add the widget name: this is the name of the View's instance +variable for that widget. If your view has a widget called +\code{quitbutton}, you would use "quitbutton". + +\item Follow the widget name by two underscores (\code{\_\_}). + +\item Finish the name by appending the signal name you want to capture. +For instance, if you wanted to handle that quitbutton's \code{clicked} +signal, you would use "clicked". The final method name would be +\code{on\_quitbutton\_\_clicked}. +\end{enumerate} + +Note that the widget must be attached {\it directly} to the controller's +corresponding View; it can't be attached using this syntax to a slave of +that view, for instance (you'll have to call \code{connect()} directly +in that case). Note also that signal handler's parameters will vary from +signal to signal, and the only thing that can be trusted is that the +first parameter will be the widget which generated the signal. You can +use a method signature like the following to avoid problems: + +\begin{verbatim} + def on_mybutton__clicked(self, button, *args): +\end{verbatim} + +This way, args will hold as many arguments as the signal defines for +that function (and you can connect this method explicitly to more than +one kind of signal, if you need to). Let's see a simple example to make +these concepts more concrete (included in the Kiwi tarball at +\file{Kiwi/examples/Faren/faren.py}): + +%% \begin{center} +%% \includegraphics[scale=0.905]{images/faren.eps} +%% \end{center} + +%% \verbatiminput{../examples/Faren/faren.py} + +Let's have a look at the code. I define a Controller +\class{FarenControl} that inherits from \class{BaseController}, and +which defines two methods that are signal handlers - one for the +"clicked" event for the widget \code{quitbutton}, and another for the +"insert\_text" signal for \code{temperature}. I attach the view to the +controller, and tell the view to show itself and run the event loop. Not +much else is worth noting, apart from the fact that the signal handlers +receive the widget as the first parameter, and that the GTK+ text +widgets (GtkEntry, GtkLabel, GtkText) usually take and return strings, +which makes us do conversion here and there. + +Thus, the event loop now has two signal handlers that will be triggered +according to the user's interaction: one called when clicking the +quitbutton and one when inserting text into the entry. The user can type +numbers into the entry, and through +\code{after\_temperature\_\_insert\_text()}, the celsius and farenheit +labels are changed automatically. Clicking quit calls a special method +in the view, \code{hide\_and\_quit()}, that hides the window and quits +the event loop. Note that the widgets "celsius" and "farenheit" are +empty labels that appear right next to the labels that {\it are written} +"Celsius" and "Farenheit"; if you are confused look at the glade file +\citetitle[faren.glade]{faren.glade}. + +\subsubsection{Signal handlers and widget conversion} +\label{handlerconvert} + +The way widget conversion is done in Kiwi calls for a bit of discussion +when thinking about signal handlers. Technically, what is done is a +dynamic re-instantiation of the PyGTK object into a Kiwi +instance\footnote{This is possible mainly because PyGTK classes are +really thin wrappers around low-level PyGTK objects coded in C - these +live in the module \file{\_gtkmodule.so} - and as such can be easily +swapped in runtime.}. This isn't terribly important except for one fact: +the signal hander functions receive the original, unconverted PyGTK +widget instance as their first parameter (when using a method, the +second), and not a Kiwi instance. + +This happens because there is no easy way to have the callers of the +signal handler (which live in C space) realize that the widget has been +converted in Python-space to a Kiwi widget. So you'll have to live with +this fact and not trust widget instances that come in the callback +parameters; access the View's instance variables instead, since they are +guaranteed to be Kiwi instances. An example handler can explain better. +Let's assume we have a GtkCList widget called clist which has been +attached to the View, and converted into a Kiwi CList (by way of being +in the \code{widgets} list for a GladeView, for instance). A signal +handler for GtkCList's "select\_row" follows: + +\begin{verbatim} +class CListController(BaseController): + + # ... assume a constructor, etc. + + def on_clist__select_row(self, clist, row, *args): + print type(clist) # prints <gtk.GtkCList.. + print type(self.view.clist) # prints <Kiwi.CList.. + + # but they represent the same widget! + print clist._o == self.view.clist._o + + print len(self.view.clist) # works fine + + print len(clist) # raises AttributeError, since + # it's a Kiwi extension + +\end{verbatim} + +In practice, this is hardly ever a problem if you stick to the rule of +thumb of not trusting the widget parameter to the callback, and +accessing it through the View's instance variables instead. You can use +the parameter widget, but remember - it's a pure PyGTK class, and the +Kiwi API will be unavailable in it! + +\subsubsection{Default Widget Focus} + +An important usability aspect of an application is having focus set by +default to the widget where it is most useful, so the user can start +working right away without having to tab his way through the window's +widgets. If you pay attention, when you first start the \file{faren.py} +example, the GtkEntry for temperature starts with the cursor focus; I've +set the "Has focus" property to True for that widget {\it in Glade}. +When using a version of PyGTK greater than 0.6.8, +\code{show*\_and\_loop()} checks your interface before running; if there +is an interactive widget attached to it, and none of the View's widgets +is focused, it prints a warning to standard error explaining the View +doesn't have an interactive widget focused: + + \begin{verbatim} + Kiwi warning: no widget is focused in view + <__main__.FarenView instance at 0x8335444> + but you have an interactive widget in it: + <Kiwi.Basic.Entry instance at 0x8774f14> + \end{verbatim} + +Setting the focused widget in Glade may seem unobvious; if so, you have +alternatives to set focus programatically: + +\begin{itemize} +\item Call \code{grab\_focus()} on the specific widget you want to focus. +If you are using a subclassed View, I would recommend doing this at the +end of your View's constructor; otherwise, call it directly before +running \code{show\_and\_loop()}. +% If it's a bad idea, should we document it? +% \item Call \code{view.focus\_toplevel()}. This causes the toplevel +% widget to be focused, which is usually a {\bf bad} idea because it is +% normally a window or container. +\item Call \code{view.focus\_topmost()}. For most forms, it makes sense +to focus the form widget most to the top and left when starting up the +application; you can use this convenience function to accomplish that. +\end{itemize} + +When using UI composition, remember that the slave view will lose its +focus state when the function \code{attach\_slave()} is run, so if you +wish to focus a widget that is part of the slave, you will need to do it +explicitly after that function call. If the widget to be focused is in +the parent view, you should have no problems (unless you are swapping +*that* particular widget for the slave, of course). + +\subsubsection{Advanced Controllers} + +While the previous section on Controllers offered a nice example with +the Faren application, it does present some issues. First, the interface +could use some extra niceness (deleting text from the entry does +nothing!). Second, the controller has to invoke methods on its view's +instance variables (\code{self.view.celsius.set\_text()} for example), +which is a sign of high coupling. One good way to solve these issues is +to provide a subclass of GladeView that does some extra setup and +provides an API for the Controller (\file{faren2.py}): + +%% \verbatiminput{../examples/Faren/faren2.py} + +This (much longer, sure, but with a nicer division) example shows us +using a separate View class, which presents an API for manipulating the +View interface widgets, consisting of the following methods: + +\begin{itemize} +\item \code{get\_temp()}: Gets the temperature from the GtkEntry in the +interface, and returns it. Returns None if the entry is empty. +\item \code{update\_temp()}: Updates the contents of the two labels that +represent the temperature (in farenheit and in celsius). +\item \code{clear\_temp()}: Clears the contents of the two labels that +represent the temperature. +\end{itemize} + +The Controller also uses \code{changed} instead of \code{insert\_text}, +so it supports both insertion and deletion. Note that, following the +suggestion in section \ref{handlerconvert}, we don't use the parameters +sent to our handlers; the View's API methods are based on its widgets +attached as instance variables (this is why we use +\code{self.temperature}, \code{self.farenheit} and \code{self.celsius}). + +This is basically what you need to know about the controller. While it +is useful in a number of applications, if your interface has a number of +widgets and rich interaction, you will notice that your View API will +start looking like a exact copy of the widget methods. This is highly +undesirable (as are accessor functions, for the same reason): it means +the Controller is tightly coupled to the View, which is not what we +want. And {\bf herein lies the main problem with the View/Controller +split}: if your interface is simple (as it is in our example), it's a +nice way to separate things; however, if your interface is complex and +has lots of widgets (I'd say a good rule of thumb is over 5 interactive +widgets) you will end up with a lot of low-level View/Controller message +passing. + +(Another potential problem with the split is that neither the Controller +nor the View are very reusable, which defeats part of the goals of +modularity). The next section describes UI Delegates, which are +combinations of View and Controller that simplify things somewhat. + +\subsection{UI Delegates} + +The UI Delegate classes, located in the \module{Delegates} module, use +multiple inheritance, being derived from both a View and a Controller. +This means they combine functionality from both into a single class: not +only does it specify the interface, it also handles the widget signals. +It's the "can't beat them, join them" solution to the V+C coupling +problem, and it's used in Swing, MFC and Bakery, a C++ framework for +GTK+. + +The \class{Delegate} class is a combination of \class{BaseView} and +\class{BaseController}. You can use it to create your interface +programatically and then hook up handlers to it, just like you would do +to individual views and controllers. A very simple (yes, I too get bored +of hand-coding PyGTK widgets) example follows, found in the distribution +as \file{examples/Simple/simple.py}: + +%% \begin{center} +%% \includegraphics[scale=0.905]{images/simple2.eps} +%% \end{center} + +%% \verbatiminput{../examples/Simple/simple.py} + +%% \begin{center} +%% \includegraphics[scale=0.905]{images/simple3.eps} +%% \end{center} + +As you can see, the Delegate was the only class we needed to inherit +from and instantiate. This makes the amount of infrastructure code go +down significantly, and most single-window applications (and individual +dialogs in multi-window applications) can be implemented with single +Delegate and GladeDelegate subclasses. As an example for using the +GladeDelegate, below is a third version of our temperature conversion +application, \file{examples/Faren/faren3.py}: + +%% \verbatiminput{../examples/Faren/faren3.py} + +As you can see, using the delegates makes a lot of sense in many cases: +the view and controller split isn't essential, and you can end up +with a lot less code with the same functionality at no reduced +maintainability or readability, which is what we are aiming for. For +larger applications, or apps where a lot of very unusual functionality +is required, it may still make sense to use separate Controllers and +Views, but for normal development, stick to delegates; they simplify +things. + +Note that there is also a \class{SlaveDelegate}, which works like a +normal SlaveView with an attached Controller. The next section describes +an important subclass of \class{SlaveDelegate}, the +\class{CListDelegate}. + +\subsubsection{The CListDelegate} + +There is a special type of SlaveDelegate that creates a columned list, +each row of the list representing an instance. This is the first +high-level class of the framework being described; high-level in the +sense that it goes beyond simply organizing the UI and handler methods, +offering functionality directed towards object-oriented development in +Python. + +The CListDelegate was designed for the very common task of presenting a +list of instance data in a GtkCList. Elaborating an example: lets say we +have a set of \class{Person} instances stored somewhere, each of these +instances possessing the attributes \code{name}, \code{address} and +\code{telephone}. A common problem is displaying a GtkCList with this data +and performing an action when a person is selected. This is exactly the +use case which CListDelegate supports. + +Before showing an example, it's important to explain how the +CListDelegate's constructor works, since it is rather special. + + \begin{verbatim} + class CListDelegate: + def __init__(self, columns, instance_list=None, + handler=None, mode=gtk.SELECTION_BROWSE) + \end{verbatim} + +The CListDelegate takes a \code{columns} parameter, and understanding it +is essential to using it correctly. \code{columns} should be a list of +\class{Column} instances, each of these instances representing a column +in the list (and therefore, an attribute in the instance). Let's have a +look at the constructor for \class{Column}: + + \begin{verbatim} + class Column: + __init__(self, attribute, title=None, visible=1, + tooltip=None, justify=None, format=None, + width=None, sorted=0, order=0) + \end{verbatim} + +Each Column instance determines the properties of the CList's column; +most important of these is \code{attribute}, which specifies the name of +the instance attribute the column should hold. Note that all of these +arguments but \code{attribute} are optional and can be safely be left +out. To create a CList for our example above, with columns for "name", +"address" and "telephone", we could have something like: + + \begin{verbatim} + my_columns = [ + Column("name", sorted=TRUE), + Column("address"), + Column("telephone", title="Phone") + ] + + cd = ClistDelegate(my_columns) + \end{verbatim} + +This section of code would create a new CListDelegate with 3 columns, +being sorted by the first one, and using "Name", "Address" and "Phone" +as column titles. See the API reference for \class{CListDelegate} and +\class{Column} to find out all the details on them; there are many +features, including sort ordering, tooltips, format strings and more. + +Note that you can produce a complete \code{column} specification by +running the delegate once with a simple set of columns, manipulating +them in runtime (changing sort order and widths, hiding columns) and and +then calling \code{dump\_columns()} on the delegate; this method creates +a list of \class{Column} instances corresponding to the current state of +the CList. This list can be reused in the CListDelegate constructor, +making it easy to save and restore the CList's state even between runs. + +The \code{instance\_list} parameter should provide a list of instances +to be inserted into the clist, and the handler is an optional callback +that will be run when items are selected in the clist. The instances in +the list {\bf must} offer either an accessor to the attribute specified +-- the accessor name must be in the format \code{get\_{\it +attribute\_name}}() -- or an attribute with the name specified (the +delegate will do a \code{getattr()} for it). Note that you can +instantiate a \class{CListDelegate} without a list and add it later by +calling \code{new\_list({\it instance\_list})}. + +To exemplify the CListDelegate, I'm going to build upon the News Browser +example we saw a while back. I'm going to need to change the news data +structures from tuples to instances, and create a CListDelegate for +it (see \code{News/news2.py}): + +%% \verbatiminput{../examples/News/news2.py} + +Wow! Assuming you have data in the correct format, in some 25 lines you +defined the data for your applications, and in about 5 lines you +set up and created the CListDelegate. This example, though, doesn't do +anything (try running it - it doesn't even flash a window open, which is +what normally happens if you create a window but don't run the mainloop) +because {\bf a SlaveView doesn't have a toplevel window associated to +it}. To be able to use the CListDelegate, we need to perform UI +composition: attach it to a parent view. I'll show for now a screenshot +of the generated widget inside a single window just so you know how it +looks: + +%% \begin{center} +%% \includegraphics[scale=0.88]{images/news2.eps} +%% \end{center} + +If you look at this image, you might notice some important details: +\begin{enumerate} +\item There is a little arrow in the right corner of the Title column. +What is that? A sort indicator! The titles in the first column are +sorted ascending. The CList is set up so that you can order it's columns +by clicking on the headers, and it even sorts numeric data properly. By +default the sorted column is the left-most one, but you can change that +by using the columns spec. + +\item There is a popup menu in the right corner of the image. What is +it? It's a list of the columns, allowing you to select which column is +displayed and which is hidden. As you can see, the URL column is hidden +(remember the FALSE we passed in the \code{my\_columns} list?) and +Title and Author are displayed. + +Note that both features are built in to the Kiwi CList, one of the +enhanced widgets we provide. You can use the CList independently of +CListDelegate, of course; check the module documentation for more +information. +\item (The CList has no window border around it. That's because I had to +do some magic to get this screenshot to display correctly. Don't worry +about it.) +\end{enumerate} + +\subsection{UI Composition with Delegates (or Views and Controllers)} + +As we saw before, it is possible to compose the interface for your +application using multiple views; this holds true whether the view has +an associated controller or not. I'm not going to provide an example +embedding views and controllers because it's not very enlightening; it +is easy to extend the original UI Composition example to use controller +associated to the views, and that example is much more interesting if +adapted to a CListDelegate. + +Since delegates inherit from views, it is also possible to compose +a delegate with multiple child delegates (and even mix and match them +with views). The requirement that the parent delegate be based on glade +is the same, too: you should subclass \class{GladeDelegate} for your +main window, though any kind of view can be attached to it. + +The nice part about doing UI composition using delegates is that the +interface and interaction is well encapsulated in a single class, and if +you are careful when writing a child delegate, you can reuse that class +in as many places of your applications as you like. I'm going to use +the CListDelegate from the last example to build a (rather fake) news +browsing application in the next example: + +%% \begin{center} +%% \includegraphics[scale=0.905]{images/news3.eps} +%% \end{center} + +%% \verbatiminput{../examples/News/news3.py} + +Let's have a quick look at the code: + +\begin{enumerate} +\item I create a list of instances and the columns specification; I then +define a class for the news shell, inheriting from +\class{GladeDelegate}. +\item In the constructor I show off some cosmetic features of Kiwi (the +"header" widget is an eventbox, in which the label is a child; look at +the glade file for more details). +\item I create and attach the slave, storing a reference to it in the +instance variable "slave", and set focus up. +\item I define handlers for the buttons, and the simple handler +\code{row\_selected()} for the \code{select\_row} signal, which will be +called when a row is selected. +\item I create and run the \class{Shell}, which renders the interface. +When the interface closes, I catch the return value \code{retval} and +use it as input to run a browser for the selected news item (okay, so +the app is not really a browser, I lied). +\end{enumerate} + +This example shows a lot of the power of Kiwi; in a few lines, and with +a little work in Glade, we have a working application that looks decent, +behaves well and isn't hard to maintain. The next section will go on +describing Proxies, which are high-level Views that represent an +instance or part of it. + +\subsection{Proxies and Models} + +This section describes a set of important high-level classes that Kiwi +offers, the Proxies. Proxies are special types of Delegates that attach +themselves to instances, and allow changes performed in the UI to +reflect automatically in the instance. This section does an introduction +to the concepts involved and then moves on to implementation details. + +\subsubsection{Domain Objects (or Models)} + +Doing Object Oriented (OO) implementation implies the system you are +creating revolves around objects; in the case of Python applications, we +use the word `instances'. OO applications call the instances that +represent your problem's logical entities +\citetitle[http://c2.com/cgi/wiki?DomainObject]{'domain objects'}. In a +mail application, for instance, you might have Person and Message domain +objects; in a sales application you could have Product and Sale. + +Picking up from our last example, you could say \class{NewsItem} +represented a class of domain objects, since its instances held data (or +`state') that represented a logical container relevant to the task we +had at hand, browsing news. This example was very simple, and there was +no mechanism coded into the \class{NewsItem} class, but the concept is +the same. + +One very common problem when coding a new UI to manipulate the +information in a domain object -- at the fundamental level, in an +instance -- is the amount of code that needs to be done to alter the +state of the instance. If you have a small form, with few controls in +it, it's merely a bother; if you have a complex form, with many controls +and lots of interaction, it can be a nightmare of accessors and message +passing. Each widget must have the appropriate signals connected, and +the handlers must either manipulate the instance directly, or call +accessors repeatedly. Changing the UI involves more coding and +complication. + +So, in summary: + +\begin{itemize} +\item I use the terms {\bf object, model\footnote{A note on naming: in +MVC, one third of the triad is called Model, which (I believe) is short +for Application Model. In theory, the Application Model represents the +real-world behavior of your application, just like the domain object; +synonyms, basically. Some authors, however, defend that the Application +Model and the domain object should be separate entities. I don't think +this is necessarily true. From my experience, in most cases the two are +functionally equivalent (and separating them showed me that I ended up +doing was proxying calls from one to the other).} and instance} +interchangeably to refer to a {\bf domain object}. +\item The problem at hand is propagating changes from the UI to the +domain objects attached to them. + +This is the task Proxies attempt to simplify. +\end{itemize} + +\subsubsection{Using Proxies} + +As stated before, Proxies attempt to reduce the "glue" code between UI +and domain object. They work by attaching themselves to the model, +detecting the widgets in the interface, attaching the correct signals to +these widgets, and providing handlers that manipulate the attached model +in a standard way. The updating mechanism works by associating selected +widgets in the Proxy to attributes in the model; if the model offers +accessors to these attributes, they will be called, and otherwise direct +manipulation of the model attributes is performed. {\bf This association +is done by name}: the names of the widgets determine the name of the +accessors or attributes that will be used in the model. + +There are three types of Proxy classes: \class{SlaveProxy}, +\class{Proxy} and \class{GladeProxy}. Their constructors are similar to +their Delegate counterparts, the main difference being a new parameter, +\code{model}, which specifies the instance that we should attach this +proxy to. The Proxy's \code{widgets} list uses an extended syntax: the +widget names that are to be associated to attributes should be prefixed +by a single colon character ({\bf :}). This prefixing should be done +*only* in the widgets list - the name in the glade file, the model and +the callback syntax should not include it. + +For the first example, let's attach a proxy to an interface specified +in glade (\file{examples/NewsForm/newsform.py}): + +%% \begin{center} +%% \includegraphics[scale=0.626]{images/newsform.eps} +%% \end{center} + +%% \verbatiminput{../examples/NewsForm/newsform.py} + +Let's look at this simple example. First, I define a model class which +is really just a shell class, with no methods or attributes: +\class{NewsItem}. We create an instance of this class, define the +widgets list (that will correspond to the model attributes), and create +a new proxy, specifying \code{item} in the constructor. + +After running the Proxy, there is a print call that outputs the +attributes from the \code{item} instance. Note that these attributes +were not defined initially in the model: this is not a problem; the +proxy will set them to sensible values on startup. If you run the +program, enter data in the entries, and close the window, you will also +see that the values printed out at the end correspond to the values +typed in. + +Note that we don't need to define any handlers for the Proxy's widgets. +This is the Proxy's "magic" - it defines internal handlers that take +care of updating the attached model automatically. As we insert and +delete text from the entries, the model is being transparently updated +to reflect the new value in the interface. In this way, the interface's +state is synchronized with the model's state. + +\subsubsection{Propagating changes from Model to Proxy} + +In our previous example, our model was defined as an instance of a +simple Python class. If we use the complete framework, by having our +model classes inherit from \class{FrameWork.Model}, we also get reverse +notifications from Model to Proxy: when the model is altered, the change +propagates to the proxy interface attached to it. + +To demonstrate, we can extend the example above to add a "reset" button +to trigger a change of the model; we will subclass GladeProxy (which is +also a Delegate, as stated before, and thus supports the special handler +syntax \code{on\_*()}) to define a handler for clicking on the reset +button (\file{examples/NewsForm/newsform2.py}): + +%% \begin{center} +%% \includegraphics[scale=0.626]{images/newsform2.eps} +%% \end{center} + +%% \verbatiminput{../examples/NewsForm/newsform2.py} + +If we look at the handler for reset, \code{on\_reset\_\_clicked()}, we +can see it alters the model directly. These changes reflect +automatically in the interface by means of an update mechanism present +in \class{FrameWork.Model}. This holds true no matter what function +triggers the change in the model: it is not limited to callbacks defined +in Proxy itself; any handler that alters the model will trigger the +model's update mechanism. + +In summary: if you need to alter your model independently of the +interface, have your model inherit from FrameWork.Model and enjoy +automatic UI updating. + +In all the examples we have shown up to now, you may notice that the +proxy manipulates the model's instance variables directly. There are +times where this is not desirable, and the next section explains how to +customize the proxy and model's behavior. + +\subsubsection{Customizing Proxies and Models} + +From our example, proxy and instance appear to be completely coupled - +even the names of the components and attributes are tied. This is a +precise interpretation of the situation, but in my opinion, this +coupling is not only unavoidable, it is the essence of UI architecture. +Treating the interface as a completely separate entity from the object +it manipulates is, honestly, a bad idea, because {\bf the interface is a +representation of the object}, and as such, essentially coupled to it. +Would it make sense to remove the \code{url} attribute from the model +and {\it not} remove it from the interface in question? + +Because the UI is really a representation, however, there are times +where the contents of the widget and its attached proxy attribute must +differ in some way. Often, it is a matter of cardinality: more than one +widget defines a single proxy attribute, or vice-versa; at other times, +the data format in the widget does not match the format in the model +(think of dates, represented by strings in the interface, but stored as +DateTime objects in the object)\footnote{ Apart from these reasons, some +people insist that it is bad or wrong to manipulate the instance +directly, and that accessors should always be used.}. The Kiwi Proxy was +designed to cater to these different requirements, using accessor +functions when available. + +Accessors provide an easy way to translate the model value to the +interface value: a pair of \code{get\_*()} and \code{set\_*()} functions +implemented in the model that perform internal manipulation of its +variables, removing the need to directly manipulate the instance +variable. You can define accessors for as few or as many model +attributes you want. + +To make the process clearer, it is worth discussing how the model and +the UI are updated. The heuristics for updating a model are: + +\begin{enumerate} +\item If a change happens in the Proxy's widget \code{X}, it looks at +the model attached to it. +\item If the model offers a \code{set\_X()} method, it is called, with +the new value as its only parameter. +\item If not, it manipulates the model directly by using +\code{setattr()}, which is the equivalent of \code{model.X = value}. If +\code{Proxies.set\_attr\_warnings(TRUE)} has been called, a warning like +the following will be printed: + + \begin{verbatim} + Kiwi warning: could not find method set_title in model + <__main__.NewsItem instance at 0x82011ac>, using setattr() + \end{verbatim} + +\item The model is updated (If multiple proxies are attached to the +model, special things happen, additionally, as you will see in section +\ref{multipleproxies}). +\end{enumerate} + +The heuristics for updating the interface widget are: + +\begin{enumerate} +\item On startup, the proxy queries the model for the value for +attribute \code{X}. +\item It tries first using an accessor method \code{get\_X()} +(which should return a single value). If the accessor does not exist, it +will attempt to access the model's variable directly (using +\code{getattr()}). As with \code{setattr()} above, a warning will be +printed if attribute warnings are enabled. +\item The interface is updated with this initial value, and normal +event processing begins. +\item If a model's state for \code{X} is altered (\code{item.X = +"foo"}), a notification is sent to the proxy, with the attribute that +was altered. If a callback calls \code{self.update("X")}, a notification +is sent to the proxy, with the attribute that was altered. +\item The proxy receives the notification; it gets the value of \code{X} +from the model using the same method as in step 2, and updates the +widget contents accordingly. +\end{enumerate} + +Summarizing: if you would like to customize the connection between model +and proxy for an attribute, implement accessor functions +(\code{get\_foo()} and \code{set\_foo()}) for it. If you would like to +verify that no direct instance manipulations are happening, use the +module function \code{set\_attr\_warnings()} and check the output +printed to the console's standard error. + +Let's extend our previous example to provide an accessor and explain how +things work out (\file{newsform3.py}). + +\begin{verbatim} + class NewsItem(FrameWork.Model): + """An instance representing an item of news. + Attributes: title, author, url""" + def set_url(self, url): + """sets the url, prefixing "http://" if missing""" + http = "http://" + if len(url) > len(http) and string.find(url, http) != 0: + url = http + url + self.url = url +\end{verbatim} + +In this example, we provide an accessor for setting the url (a "setter") +prefixed by "http://". The accessor is called when the entry's text +changes (for each character inserted or deleted), which is why I have to +check for the length of the url typed in. Note that I don't provide a +\code{get\_url()} method (a "getter"), which means the raw url would be +loaded from the instance into the interface. In this specific case, this +is not an issue, because data is only loaded from the instance at +instantiation time and when the model attribute is changed. However, for +most cases both setter and getter need to convert to and from the model +format. + +\subsubsection{Using Signal Handlers in Proxies} + +Proxies implement their behavior by using GTK+ signals extensively, but +this mechanism is implemented inside the Proxy and most of it happens +automatically, without user-visible effects beyond updating of the model +and the interface. However, many times an application needs custom +behavior beyond the simple model updating; for this, user-defined +handlers can be used normally. + +Proxies inherit from the Delegate classes, and they can define signal +handlers in the same way as normal Delegates (and Controllers), by using +the special syntax as defined in section \ref{callbacks}. However, there +is a special detail that should be understood when using custom +callbacks: + +\begin{quotation} +{\bf The Proxy's internal callbacks are executed first}. +\end{quotation} + +This means that, when your \code{on\_*()} or \code{after\_*()} handler +runs, the Proxy has already updated the model. In practice, this is a +{\it good} thing, since you usually want to work with the current +contents of the widget, not the contents it used to have. Of course, +signal handlers in the Proxy that are not associated to widgets attached +to model attributes (in other words, widgets not prefixed by a colon +(:) in the widgets list) do not present this issue (as there is no Proxy +signal handler for them anyway). + +One common task of using signal handlers is to trigger updates in some +other part of interface. For instance, you might have a radiobutton that +makes a certain part of the interface sensitive when toggled. Or an +entry that needs to update a label that represents a calculated field in +the interface. You can define handlers normally, and you can take +advantage of the special Proxy method \code{update({\it +attribute\_name})}, which notifies the Proxy that it should refresh the +interface representation of that attribute. + +As an example, I will include here a final version of the Faren application +that uses a Proxy (\file{Faren/faren4.py}): + +%% \verbatiminput{../examples/Faren/faren4.py} + +A step-by-step analysis of this example: + +\begin{itemize} +\item We define a class for our domain object, \class{Temperature}. This +class offers accessors for two "fake" attributes - they don't exist +permanently in the instance, but instead are calculated through +accessors. Note that we {\it must} initialize any values that we use in +the accessors, as they will be called upon startup; temperature will not +have been set through the interface at that point yet. + +\item The accessors return an empty string if temperature is an empty +string, and calculate the values otherwise. This agrees with the +behaviour defined for this application before: an empty temperature +should render no output for farenheit or celsius. + +\item We create a proxy class for our application. We first set a +conversion format for \code{farenheit} and \code{celsius} so it will +print out the float values they return correctly. \code{set\_format()} +is discussed further in section \ref{formats}. + +\item We then initialize the parent class, using the same glade file as +the other Faren examples. We do basic cosmetic updates, and then define +two handlers. + +\item The first handler is simply for quit, and doesn't do anything +special. The second handler, however, is triggered whenever the +temperature is changed, and it uses the special \code{update()} method +to notify the proxy that both \code{farenheit} and \code{celsius} were +updated. + +\end{itemize} + +Upon running the example you will see that it works as expected; +the \code{update()} messages in fact make the labels render the correct +values, and the accessors return empty strings when they should. + +There is an additional hook you can use in your Proxy classes to make +updating easier. If you define a method called \code{proxy\_updated()}, +this method will be called {\it each} time a proxy-managed widget is +manipulated by the user. This allows you to easily perform updating of +calculated text indicators, for instance. + +There is a set of more complex examples that demonstrate the use of +custom handlers in the package, under the directory +\file{examples/Diary}, which are recommended as further reference. + +\subsubsection{Widget support in Proxies} + +The Proxies provide a quite complex mechanism to handle updates in most +of the widgets normally used in "forms". There is a reason for +supporting these widgets: they are easily mapped to model attributes. +This doesn't mean that you can't use other widgets in your Proxy +interface, but there is no automatic update mechanism for it, and you +will have to use your own handlers for them. + +This is a reasonable property -- it would be difficult to map what +exactly the state of a GtkCurve means to the model, for instance -- and +the Proxy can be extended in the future to support other widgets (write +me if you are interested in contributing). What follows is a list of +widget types supported, details on the use of them, and details about +setting custom handlers if you need them. + +\begin{itemize} +\item {\bf GtkEntry}: the single-line entry box in gtk. Updates the +model on insertion or deletion of every character, which means you +should make sure your accessors take this into account, if you use +accessors (as opposed to \code{setattr()}). For instance, if you type in +"Foobar" into the box, the accessor for that model attribute will be +called 6 times. + +{\bf Custom handlers}: The best signal for hooking a user handler to a +GtkEntry is "changed", preferably by using \code{after\_{\it +entryname}\_\_changed()}; it will be called immediately after the entry +has text inserted or deleted. You can use the individual "insert\_text" +or "delete\_text" signals if you want to capture one of those specific +events. + +\item {\bf GtkLabel}: a read-only widget that displays text. It is +useful for displaying model attributes, but it doesn't generate signals +my itself. Use \code{update()} in other widget's custom handlers to +notify the Proxy a calculated label's value has changed. + +{\bf Custom handlers}: The GtkLabel doesn't generate signals. + +\item {\bf GtkOptionMenu (OM)}: the menuitem or listbox widget, +containing a list of items. The GTK+ OM has a very evil API by default, +but using the Proxy makes it much simpler; basically, the OM's choice +reflects directly in the model, without extra effort. The OM items can +be created in Glade or straight PyGTK commands; in this case the model +attribute will be set to the text in the label selected. To select an +item, set the model value to the string of text. The model is updated +each time an item is selected in the OM. + +However, this is a very limited way of using the OM, and the recommended +way to build your menu is to use Kiwi's \code{OptionMenu.prefill()} +call, which allows you to specify a data value for each item, along with +an extra callback to be called when the an item in the OM is selected. +This way, the model's attribute can be set to any value per item; for +instance, an integer value, or an instance associated with one +particular menuitem. + +If you use \code{OM.prefill()}, each item is associated to a data value, +and this value is sent to the model when the item is selected. To select +an item from the model, just set the attribute to the data value, and +the optionmenu updates itself automatically. Set the model attribute to +the data value, and the interface updates automatically. Check the API +for OM for more details. + +{\bf Custom handlers}: as stated above, use \code{prefill()}'s +\code{callback} parameter to specify a handler for the OptionMenu. +There is no signal you can connect to directly in GTK+ 1.2. + +\item {\bf GtkRadioButton}: Handling the radiobutton is slightly more +complicated, because there are in reality groups of radiobuttons that +bind to a single attribute. In other words, the multiple radiobutton +widgets are connected to a single attribute, which assumes a different +value depending on which button is toggled. + +To perform this grouping\footnote{Alas, we can't use radiobutton's +\code{group()} method to discover groups automatically because it is yet +to be wrapped in PyGTK.} the Proxy offers a special method called +\code{group\_radiobuttons()}. This method accepts \code{name} and set of +tuples as a parameter, each tuple being in the format \code{({\it +widget\_name}, {\it widget\_value})}. \code{name} indicates the model +attribute it is to be bound to, \code{widget\_name} is a string strings +with the name (like used in the widgets list) of the individual +radiobutton to be grouped. Once grouped, these radiobuttons are treated +by the Proxy as a single widget attached to the model attribute, and the +model attribute or accessor will receive the \code{widget\_value} +associated with the button selected. Setting the model value follows the +same rule as for OM. + +{\bf Custom handlers}: use the "clicked" signal, connecting after it +(see GtkEntry above for an \code{after\_*()} example), and check the +state of the widget if you need to check if it was selected or +de-selected (use \code{widget['active']} to check the state in your +callback). + +\item {\bf GtkCheckButton} and {\bf GtkToggleButton}: the two-state +button widgets allow values to be set to 1 or 0 (or, if using PyGTK +symbols, TRUE and FALSE). The value is updated every time the button's +state changes. + +{\bf Custom handlers}: use the "clicked" signal, in the same manner as +for GtkRadioButton. + +\item {\bf GtkSpinButton}, {\bf GtkCombo} and {\bf GtkText}: similarly +to the GtkEntry, these widgets are updated every time a single character +is changed in the editable space (yes, the SpinButton contains an +entry). There is no signal that can easily catch when a GtkCombo list +item was selected, which is why we have to handle things this was for +it. In practice, it should work as expected unless you rely on your +accessor being called a specific number of times for each change, which +you shouldn't. + +{\bf Custom handlers}: GtkSpinButton and GtkText are good candidates for +the "changed" signal; use the same rules as for GtkEntry. For GtkCombo, +things are not so easy, because there is no signal it offers you can +catch\footnote{A lively discussion could ensue about GtkCombo and the +lack of a signal that indicates an option was selected in its list, but +I deliberately choose to avoid it!}, and the fact that it holds two +subobjects, a GtkEntry and a GtkButton, means that you are forced to use +\code{connect()} on either of these to get the effect you desire. In +practice, the following works for me (taking into account the fact that +the handler will be called multiple times): + + \begin{verbatim} + widget = [":combo", ...] + def __init__(self, *args): + # [... in constructor ...] + entry = combo.entry + entry.connect("changed", on_combo_entry__changed) + + def on_combo_entry__changed(self, entry, *args): + # [...] + \end{verbatim} + +\end{itemize} + +The code in \file{tests/test\_Proxy.py} offers a sample of using all the +supported widgets in the same interface, and is highly recommended for +study; it is however a bit too long to include in this text. + +\subsubsection{Models} + +The \module{FrameWork} module holds the \class{Model} classes (apart +from holding the \class{BaseController} class as well). As discussed +before, the \class{Model} class provides a mechanism for updating the +user interface based on changed performed in the model instance. + +This is a powerful mechanism that allows you to guarantee that the +interface is always up-to-date with relation to an instance; it should +be used with care, however, because the update semantics are not trivial +to understand -- just imagine having custom callbacks that alter the +same attribute as the proxy callback and you will understand why it is +easy to get in recursive loops. This tip I can offer you, therefore: +avoid altering the model in custom callbacks, and only do it in special +situations. + +You can also attach multiple proxies to the same model and have them +update automatically; the next section will discuss this further. Before +passing on to that, however, I need to describe a special \class{Model} +called \class{PickledModel}. To demonstrate by example, I will revisit +the first example we saw in this text, the Person editor from section +\ref{person}. Let's see the code again: + +%% \verbatiminput{../examples/Person/person.py} + +Looking at the code, you might notice three special issues: + +\begin{enumerate} +\item The class our model inherits from is \class{FrameWork.PickledModel}. +\item We actually get our model instance by making a call to +\code{Framework.unpickle\_model()}, passing the class \class{Person} as +an argument. +\item We call \code{person.save()} at the end of the program. +\end{enumerate} + +\class{PickledModel} offers a very cheap way to offer persistence for +your model instances. If you are familiar with the ZODB, think of +\class{PickledModel} as a cheapo implementation that allows you to save +and restore an instance. To use it: + +\begin{enumerate} +\item Have your model class inherit from PickledModel. + +\item Use the \code{unpickle\_model} function as a "factory" function; +it takes the your model's class as the first parameter, and a filename +as the optional second parameter (if omitted, it uses the name of the +class, with an extension of ".pickle"). The function will try and load +the model state from a pickle file, and if it doesn't exist, will create +a new model and return it to you. If the pickle file is damaged, it will +save it with the extension ".err" (avoiding it being erased by an +unwitting \code{save()} call). + +\item Use the \code{save()} method to save the pickle when you are +ready. You may specify a filename to it; otherwise, it uses the default +filename specified through the \code{set\_pickle()} method. Note that +\code{unpickle\_model} makes the filename it tried to used the default +by calling \code{set\_pickle()} internally. +\end{enumerate} + +The \file{diary3.py} example in \code{examples/Diary/} uses pickling in a +more involved manner and is recommended as a reference. + +\subsubsection{Multiple Proxies} +\label{multipleproxies} + +One feature of the \class{Model} class is that it allows multiple +proxies to be attached to the same model, performing automatic +notification to all of them. Internally, when a proxy attaches itself to +a model, it lets the model know what attributes it is interested in; +later, when that attribute changes, the model lets the proxy know. The +syntax for using multiple proxies is straightforward; simply create the +proxies and attach the same model to them. A small example +(\file{NewsForm/newsform4.py}) follows: + +%% \begin{center} +%% \includegraphics[scale=0.626]{images/newsform4.eps} +%% \end{center} + +%% \verbatiminput{../examples/NewsForm/newsform4.py} + +This example shows some of the power of multiple proxies; as you edit +the title you can see the label update immediately. If you look at the +lines at the bottom, two proxies are attached to \code{item} - a +\class{NewsProxy} instance, and a \class{NewsLabels} instance, which has +labels that display the current contents of the model. + +This feature can be used in many different ways, and if you create small +proxies (that represent a part of the model, instead of the whole model) +and embed them in other interfaces you can end up with very dynamic +representations of your data. However, it should be noted that there are +a few gotchas that you can run into when using multiple Proxies: + +\begin{itemize} +\item Trying to edit the same value in two proxies. This is actually +possible, but it is a bad idea, both UI-wise and implementation-wise. If +you are using multiple proxies for a single model, have only one be +editable and the others read-only (displaying information using labels, +for instance). See in our example how the use of labels only in +\class{NewsLabels} fits nicely into this rule. + +\item Attaching two proxies to the same model and forgetting about it. +This can be quite misleading and hard to debug if you have a large +application. If you have many proxies for the same class, and they are +instantiated and run simultaneously, it may be tricky to notice that the +model sends messages to update both when it changes. Thankfully, it is +not common to have two windows with the same data loaded in the +application. This is related to the "Undo" problem discussed further in +section \ref{undo}. +\end{itemize} + +\subsubsection{Other Proxy features} + +Proxies are complex and featureful beasts; this section discusses some +additional details on them. + +\paragraph{Types} + +GTK+ treats most of the information in the interface as strings - its +API usually takes data as strings, and it returns strings. However, this +is a bit of a problem when dealing with an associated model, since the +model may very well use integer, float or any other types internally. + +For numeric types, Proxies have special support. On startup, the Proxy +will look at the attached model and try and detect what attributes are +numeric, by looking at their current values. Of course, if there is no +value in the model, or it is a string, it will be assumed to be a +string; however, if it is a number (float or integer) it will be +remembered, and the Proxy will convert it from the GTK's internal string +to a numeric type before sending it to the model. Note that this +conversion is rather dumb and if invalid characters are used, exceptions +will be raised (that's about it, though; the mainloop allows the +application to go on running); use a validated Entry\footnote{To be +released in the next version of Kiwi, but some examples have been posted +to pygtk-list} to avoid this problem. + +For other types, you must convert from strings using getter and setter +methods. If dealing with numeric types, you can also manually convert in +the \code{set\_*()} method and avoid any risks. + +\paragraph{Formats} +\label{formats} + +To avoid needing to provide accessors to deal with simple format +conversions, Proxies provide a way to set Python format strings that +will be applied to the attribute value when it is being applied to the +widget. The syntax is: \code{proxy.set\_format({\it attribute name}, +{\it format string})} -- the name is a string with the name of the +attribute. You can pass a list of strings, optionally, to apply the same +format string to multiple attributes. + +Note that this does {\it not} apply to the data that is set {\it to} the +model from the interface; it will be send without any conversion. Think +of it as a simple, one-way filter for data sent from the model to the +interface. + +\paragraph{"Instant-apply" and Undo} +\label{undo} + +The proxy can present something of a hazard for complex applications if +its "instant-apply" model is not understood completely. Instant-apply +means that, at any time, the UI and the model have the same state. If +you pop up a dialog with a Proxy, and you alter the model, even before +clicking "OK" the value in the model will have changed. + +This may cause two classes of problems. The first is undoing the changes +performed upon the model during manipulation of the Proxy (think "cancel +button" if you are having a hard time imagining why). Solutions: + +\begin{itemize} +\item One solution would be to store the initial state of the instance - +\module{pickle} can probably be used for implementing this. If Undo is +necessary, just reset the state of the model to the saved state. I have +not yet tested this, but I think it would work. + +\item If you are using Zope.com's {\it excellent} database +\citetitle[http://www.amk.ca/zodb/]{ZODB}, you already have undo and +rollback mechanisms in your persistent objects, and all you need to do +is call the appropriate method and your model state is back to the +previous state. + +\item Kiwi may at some point offer undo functionality, which would allow +one to undo selectively changes done to the model in the Proxy. At the +moment, this is just an idea, but I imagine it would not be hard to +implement. +\end{itemize} + +The second problem is using the model in another part of the application +simultaneously (think "I am editing a price at the same time she is +selling the product"). This problem can be aggravated when using +multiple proxies attached to the same model. Solutions: + +\begin{itemize} +\item You can offer a copy of your instance as the actual proxy +instance, and upon finishing editing using the proxy (or upon +"committing" the changes) you can transfer the state from the copy to +the real instance. This way, the application continues using the real +instance normally, and the proxy uses the copy without risking hard to +the application itself. + +\item The Proxy could implement this solution internally, too; an idea +would be a sort of GhostProxy, which had a \code{commit()} method which +copied state automatically from the "ghost" to the real model. +\end{itemize} + +(Yes, this part needs more research. I'll be looking into it.) + +\paragraph{Proxy startup values} + +When starting up a Proxy, the model attributes to be attached to the +Proxy are analyzed and the initial state of the Proxy interface is set. +The process by which this is performed is rather involved, and for the +sake of completeness (debugging these things can be a bit tiresome), is +listed here: + +\begin{itemize} +\item If the model's attribute value is {\bf unset}, and there is no +accessor, the default value in the interface (specified in Glade or GTK +previously to initializing the Proxy) is used {\it and is set to the +model attribute}. +\item If the instance variable is set but is \code{None}, the following +defaults are used for each widget: + \begin{itemize} + \item {\bf GtkEntry, GtkLabel, GtkCombo, GtkText, GtkSpinButton}: an + empty string is set to the model, and a blank widget is presented. + \item {\bf GtkRadioButton}: The button set in Glade or GTK as + initially on is selected, and if none is selected, the button that + is most to the top and left of the Proxy interface is selected. The + value associated with the radiobutton is set to the model attribute. + \item {\bf GtkOptionMenu}: the first item in the menu is selected, and + its value is set to the model attribute. + \item {\bf GtkToggleButton and GtkCheckButton}: the widgets are set + to unselected, and the model attribute is set to 0 (zero). + \end{itemize} +\end{itemize} + +\section{References} + +What follows in this section are references to FrameWorks and MVC that I +have collected from the Web and commented about. Each reference has a +bit of rambling I did when trying to understand what the papers meant, +and as such are biased towards what I think is right. + +{\bf Mukul Sood}: +\citetitle[http://www.ddj.com/documents/s=916/ddj9809m/9809m.htm] + {What is Swing} + +\begin{quotation} + + Made some interesting points about the JTable. The JTable is a form + generator based on a model. You specify if the property is editable, + if it's a boolean, etc, and the JTable knows how to render it - as + an editbox or as a label, as a checkbox, etc. You can register + handlers for each of the types (editbox or a custom edit widget for + editable properties, for instance). + + I wonder how it handles OptionMenu, but it does seem to. :) + + In Kiwi part of this is taken care of by CListDelegate, but there + are some differences. First, the CList widget is rather limited, so + you can't have checkboxes or editables in it (which is what the + ListView *does* allow in GTK2) - it just takes the model and + + There is a major difference in how Swing handles the Model. In Kiwi + the Model is the domain object proper, because the UI is specified + independently. In Swing (and in the GTK2 ListModel, too), there is a + Model that the UI is based upon, and your domain Model. In a sense, + the Glade file is what makes us avoid specifying the UI Model in + Kiwi, since the UI elements are already taken care of. + + In the example in this article, there is an AppMain class that is + what is created when the app runs. The AppMain creates an + AppController which takes care of initializing the Model and View. + The View, however, holds the JTable, which in itself is a Delegate! + This means part of the signals are treated internally by the JTable + delegate, and a part by the AppController ("The mouse handler is + implemented in AppController"). I don't know if I like this too + much. + +\end{quotation} + +{\bf Sachin Deshpande}: +\citetitle[http://www.cs.du.edu/~sdeshpan/comp4708/Lesson1/Part3.htm] + {MVC Architecture} + +\begin{quotation} + + Covers MVC and Swing together. + + As always the famous multiple view example uses a table and chart + view of the same data. Finding the same example over and over is a + bit boring and it makes me think that spreadsheets are the only + purpose of supporting multiple views. It also says that you can + modify views without changing the model - sure, you can, but why + would you *want* to? The view represents the model - it will + *usually* change when the model changes anyway. + + It does point out that Swing offers two kinds of models: GUI state + models and Application-data models. The nice part here is realizing + that the first are very low-level - they hold the data for the + button (which in GTK+ is internal to the widget - a checkbutton's + 'state', for instance) and the second, a bit more application-level. + I'm not sure how the second would map to domain attributes yet + though. + + Interesting point: the Model offers two forms of notification. A + light-weight form, which just informs "changed", and a complete one, + which provides an event object that describes what changed. + + Swing also has something called a Renderer. I have no idea what it + is used for - custom cells in tables and lists? + +\end{quotation} + +{\bf David Marshall}: +\citetitle[http://www.cs.cf.ac.uk/Dave/HCI/HCI\_Handout\_CALLER/]{HCI +Handout} + +\begin{quotation} + + Material for an HCI course that covers Swing, and has a bit or two + on MVC. It reminds us that in Swing, View + Controller is called "UI + Delegate" (which I promptly copied to Kiwi, fixing the problem with + "Simple"). It also goes into describing Swing. + + I find it funny that a toolkit's top feature listed are "Pluggable + look-and-feels". Oh, please. And tooltips. AWT must have *really* + sucked. + + It finally had me understand Swing a bit better though. The class + distinction is as follows: a Component (such as JFrame or JButton) + holds two instance variables - one for the Model and another for the + Delegate. That's what the diagram up in the DDJ article meant. We + have nothing like this in Kiwi --- Kiwi is really used to structure + applications, not widgets. + + It also reminded me that Java supports multiple constructors. Neat. + +\end{quotation} + + +{\bf Todd Sunsted}: +\citetitle[http://www.javaworld.com/javaworld/jw-04-1998/jw-04-howto.html] +{MVC meets Swing} + +\begin{quotation} + + 'While the MVC design pattern is typically used for constructing + entire user interfaces' - I'm not sure this is historically correct. + The Smalltalk papers I read did say that MVC was designed for + widgets, frames and so on. Application-level MVC has been used + before (hey!) but it's not a solution without it's issues. + + 'A model can have more than one view, but that is typically not the + case in the Swing set.' - Just as I suspected. Designed for + Spreadsheets<tm>. :-) No, I think the point is that there *may* be + more than one view for the same model, but it's only in spreadsheets + that we have more than one view *at the same time*. + + Interesting note: two types of events (or signals, which starts to + clear up the confusion the first article left me with). AWT/Swing + events, which are handled *inside* the Delegate, and Events which + are actually processed by the Model. So the Model defines behavior + too. And again it shows us that the Component hides both of these + from the user most of the time. + + The pluggable look and feels are actually implemented by subclassing + View - the default view (ButtonUI) for a button paints a simple + bordered rectangle. And it processes AWT events into "high-level + semantic events the button model expects". + +\end{quotation} + +{\bf Allen Holub}: +\citetitle[http://www.javaworld.com/javaworld/jw-07-1999/jw-07-toolbox.html] + {Building user interfaces for object-oriented systems, Part 1} +and +\citetitle[http://www.javaworld.com/javaworld/jw-09-1999/jw-09-toolbox.html] + {Part 2} + +\begin{quotation} + + Allen Holub's articles are interesting, though hard to grasp + entirely. I read the second article about 3 times till I had an idea + of what he intended to do, and in the end I didn't agree with most + of it. It seems that people have good plans but complicate things + when implementing them. My goal with Kiwi is to have the developer + need to do the least amount of things to get things working as + expected for the simple cases. + +\end{quotation} + +{\bf Todd Sundsted} +\citetitle[http://www.javaworld.com/javaworld/jw-08-1996/jw-08-event-p2.html] + {Java and event handling} + +\begin{quotation} + + Always neat to see that GTK+ and AWT share similarities - look at + the window events, for instance. And the way signal propagation + works is quite neat, too. But the way the callbacks are constructed + seems at least a bit different (AWT passes in a big Event object, + while in GTK+ we do have GdkEvent, but it's not passed to all events, + and lots of information is provided outside of it - target widget, + row number, etc. + + Apparently, AWT events (analogous to GTK+ signals) are usually + captured all together, and if you want to hook to a specific one, + you define a special function. It's a bit different from connect(), + again. + +\end{quotation} + +{\bf Claire Bono}: +\citetitle[http://www-scf.usc.edu/~csci201/notes/MFCintro/] + {Intro to MFC} + +\begin{quotation} + + Nice set of slides describing the main points of MFC. By what I can + understand from here, there is also a Document facility (wonder why + all these programs have Document, huh :-) and an "Empty" app with + menu and toolbar. It's harder to get things wrong if you have + everything set up for you! + + MFC is a C++ class library for Win32 programming. They call + event/signal handlers "message handlers". MFC also used combined V+C + called View (just like Bakery). Models are Documents. Interesting + that there are MDI and SDI app classes. + +\end{quotation} + +{\bf Murray Cumming}: +\citetitle[http://bakery.sourceforge.net/] +{Bakery} + +\begin{quotation} + + Wow. A project that has the same aim as Kiwi's framework. + + Bakery is a bit different in that it is really for "document"-based + applications (like editors), and generates a menu by default, for + instance. It provides some Application classes that I need to think + about for Kiwi-0.5.0. It also uses the name View for the combined + Controller/View, which is okay but might cause some confusion to + casual observers. + + One interesting thing is that Bakery provides a simple persistence + mechanism, which saves stuff as XML. I gues Kiwi could benefit + from something similar, perhaps using pickle(). + + Another interesting point is that Bakery suggests using MI to have a + class derive both from view and from GtkVBox, for instance. I hadn't + thought of things this way before, but I'm not sure it works for + Kiwi. It might, I guess. + + Bakery *always* has a Document (our Model) attached to a View. While + this may be good for the applications it targets, I have found this + is not necessarily true for all apps - sometimes you have a window + (a launcher, for instance) that has *no* model behind it. Then what? + + Bakery has composite views, just like Kiwi has SlaveViews. However, + it seems that the slaveviews all share the same document (at least + that's what \code{View\_Composite.set\_document()} seems to do). My + SlaveViews have their own models, which goes more in the line of the + Proxy Allen suggests (though his are a bit more complicated design + IMHO). I wonder what good does a shared model do to the subviews? + +\end{quotation} + +\end{document} + + +%\section{Creating a Kiwi application} + +%\subsection{Choosing the right classes} + +%\subsection{Writing your Application class} + +%\subsection{Customizing the Kiwi FrameWork classes} + +%\subsection{Further changes} + +%\section{Widgets} + +%\subsection{CList} + +%\subsection{OptionMenu} + +%\subsection{Entry and Validator} + +%\subsection{References} diff --git a/doc/images/diary.eps b/doc/images/diary.eps new file mode 100644 index 0000000..22b2b7d --- /dev/null +++ b/doc/images/diary.eps @@ -0,0 +1,12729 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: (ImageMagick) +%%Title: (diary.eps) +%%CreationDate: (Wed Feb 22 16:19:57 2006) +%%BoundingBox: 0 0 600 249 +%%HiResBoundingBox: 0 0 600.137 249 +%%DocumentData: Clean7Bit +%%LanguageLevel: 1 +%%Pages: 1 +%%EndComments + +%%BeginDefaults +%%EndDefaults + +%%BeginProlog +% +% Display a color image. The image is displayed in color on +% Postscript viewers or printers that support color, otherwise +% it is displayed as grayscale. +% +/DirectClassPacket +{ + % + % Get a DirectClass packet. + % + % Parameters: + % red. + % green. + % blue. + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/DirectClassImage +{ + % + % Display a DirectClass image. + % + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { DirectClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayDirectClassPacket } image + } ifelse +} bind def + +/GrayDirectClassPacket +{ + % + % Get a DirectClass packet; convert to grayscale. + % + % Parameters: + % red + % green + % blue + % length: number of pixels minus one of this color (optional). + % + currentfile color_packet readhexstring pop pop + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/GrayPseudoClassPacket +{ + % + % Get a PseudoClass packet; convert to grayscale. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + color_packet 0 get 0.299 mul + color_packet 1 get 0.587 mul add + color_packet 2 get 0.114 mul add + cvi + /gray_packet exch def + compression 0 eq + { + /number_pixels 1 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add def + } ifelse + 0 1 number_pixels 1 sub + { + pixels exch gray_packet put + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassPacket +{ + % + % Get a PseudoClass packet. + % + % Parameters: + % index: index into the colormap. + % length: number of pixels minus one of this color (optional). + % + currentfile byte readhexstring pop 0 get + /offset exch 3 mul def + /color_packet colormap offset 3 getinterval def + compression 0 eq + { + /number_pixels 3 def + } + { + currentfile byte readhexstring pop 0 get + /number_pixels exch 1 add 3 mul def + } ifelse + 0 3 number_pixels 1 sub + { + pixels exch color_packet putinterval + } for + pixels 0 number_pixels getinterval +} bind def + +/PseudoClassImage +{ + % + % Display a PseudoClass image. + % + % Parameters: + % class: 0-PseudoClass or 1-Grayscale. + % + currentfile buffer readline pop + token pop /class exch def pop + class 0 gt + { + currentfile buffer readline pop + token pop /depth exch def pop + /grays columns 8 add depth sub depth mul 8 idiv string def + columns rows depth + [ + columns 0 0 + rows neg 0 rows + ] + { currentfile grays readhexstring pop } image + } + { + % + % Parameters: + % colors: number of colors in the colormap. + % colormap: red, green, blue color packets. + % + currentfile buffer readline pop + token pop /colors exch def pop + /colors colors 3 mul def + /colormap colors string def + currentfile colormap readhexstring pop pop + systemdict /colorimage known + { + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { PseudoClassPacket } false 3 colorimage + } + { + % + % No colorimage operator; convert to grayscale. + % + columns rows 8 + [ + columns 0 0 + rows neg 0 rows + ] + { GrayPseudoClassPacket } image + } ifelse + } ifelse +} bind def + +/DisplayImage +{ + % + % Display a DirectClass or PseudoClass image. + % + % Parameters: + % x & y translation. + % x & y scale. + % label pointsize. + % image label. + % image columns & rows. + % class: 0-DirectClass or 1-PseudoClass. + % compression: 0-none or 1-RunlengthEncoded. + % hex color packets. + % + gsave + /buffer 512 string def + /byte 1 string def + /color_packet 3 string def + /pixels 768 string def + + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + x y translate + currentfile buffer readline pop + token pop /x exch def + token pop /y exch def pop + currentfile buffer readline pop + token pop /pointsize exch def pop + /Times-Roman findfont pointsize scalefont setfont + x y scale + currentfile buffer readline pop + token pop /columns exch def + token pop /rows exch def pop + currentfile buffer readline pop + token pop /class exch def pop + currentfile buffer readline pop + token pop /compression exch def pop + class 0 gt { PseudoClassImage } { DirectClassImage } ifelse + grestore +} bind def +%%EndProlog +%%Page: 1 1 +%%PageBoundingBox: 0 0 600 249 +userdict begin +DisplayImage +0 0 +600.137 249.057 +12.000000 +600 249 +0 +0 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +EEEAE6EEEAE6EEEAE6EEEAE6CDCAC583756A7B756283756A83756A83756A83756A7B7562 +83756A7B756A83756A83756ACDCAC5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE6CDCAC583756AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF83756ACDCAC5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6EEF2EEF6EEEEF6EEEEEEEAE6F6EAEE +EEEAE6EEE6E6E6E6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F6EEF6F2EEEEF2EEEEEEE6EEEEE6EEEAE6 +EEE6E6EEE6DEEEE6DEE6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6F2EEF6EEEEF6EEEEF6EAEEEEEEE6 +EEEAE6E6EADEEEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6EEEEEEF2E6EEEEE6101010EEEAE6 +EEE6E6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEF6F2EE101010101010101010 +E6EADEE6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEE2DED5D2CD9C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183D5D2CD +EEE2DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F6EEF6EEF6101010101010101010101010 +101010EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +E6E2DED5D2CD9C9183EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE69C9183 +D5D2CDE6E2DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F2EE101010101010101010101010101010 +101010101010EEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +E6DEDE9C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183E6E2D5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6EEEEEEF2EEF6EEEEEEEEE6EEEAE6 +E6EADEEEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +E6E2DE9C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183E6E2DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6101010101010101010101010101010101010101010EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6101010101010101010181C185A595ADEDAD5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6F2EEF6EEEEEEEEE6F6EAEEEEEEE6 +EEEAE6EEE6DEE6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEE2DE9C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183E6E6DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6DEDAD5626162525552EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6EEF6EEF2E6F6EEEEEEEAE6EEEAE6 +EEE6E6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +E6E6DE9C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183EEE2DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +101010101010101010101010EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE67B7573202020 +1014105A595AE6E2DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6101010101010101010EEEAE6EEEAE6EEEAE6101010101010101010EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6E6DEDE181818EEEAE6EEEAE6EEEAE67B7573202020 +1014105A595AE6E2DEEEEAE6EEEAE61010108B8983292820101010EEEAE6101010EEEAE6 +EEEAE6EEE6E66A6562181C18181C186A6962EEE6E6EEEAE6EEEAE6EEE6E6626162181818 +2024208B8583101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEEEF2EEF6EEEEF6EAEEEEEEE6 +EEEAE6E6EADEEEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +E6E6DE9C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183E6E6DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE683817B4A4C4AD5D2D5 +E6E2DE6261626A696AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010101010101010101010101010101010101010EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6E6DEDE181818EEEAE6EEEAE683817B4A4C4AD5D2D5 +E6E2DE6261626A696AEEEAE6EEEAE61010105A5D5ADEDAD5EEEAE6EEEAE6101010EEEAE6 +EEEAE6737173524C4ADEDAD5DED6D54A4C4A7B7573EEEAE6EEEAE67B757352504ADEDAD5 +DEDAD5524C4A101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFE6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEE6E69C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183EEE6E6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6292829CDCAC5EEEAE6 +EEEAE6DED6D5202420EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6101010101010101010101010101010EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6DEDAD5626162525552EEEAE6EEEAE6292829CDCAC5EEEAE6 +EEEAE6DED6D5202420EEEAE6EEEAE6101010DED6D5EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6202420CDCAC5EEEAE6EEEAE6CDCAC5202420EEEAE6EEEAE6202420CDCECDEEEAE6 +EEEAE6CDCAC5101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756A83756A83756A83756A7B756A83756A83756A7B756A83756A +83756A7B756A7B756A83756A7B756A83756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +101010101010101010101010101010101010101010EEEAE6EEEAE6EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +E6EADE9C9183EEEAE6FFFFFFFFFFFF000000000000000000000000000000000000000000 +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 +000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183EEE6DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6101410101010101010 +101010101010101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6101010101010101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6101010101010101010181C185A5552DED6D5EEEAE6EEEAE6101410101010101010 +101010101010101010EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6EEE6E6101410EEEAE6EEEAE6101010EEEAE6EEEAE6 +EEEAE6EEE6E6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEE6E69C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183EEEADEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6292829DED6D5EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6292829DED6D5EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6202420CDCECDEEEAE6EEEAE6CDCAC5202420EEEAE6EEEAE6202420CDCECDEEEAE6 +EEEAE6CDCECD101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEF6F2EEF6EEEEEEEEE6F6EAEEEEEAE6 +EEEAE6EEE6E6E6E6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6101010101010 +101010101010EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE67B75732020201014105A595A +E6E2DEEEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEADE9C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000949594181C18000400313031D5D2D5FFFFFFFFFFFFFFFFFF7B797B101410 +080808525552F6F2F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000949594181C18000400313031 +D5D2D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF202020D5D6D5FFFFFFFFFFFFA4A1A4FFFFFF +FFFFFFD5D2D5202020FFFFFFF6F6F6626562080C08080C08626562FFFAFFFFFFFFFFFFFF +F6F6F6626562080C08080C08626562FFFAFFFFFFFFFFFFFFFFFAFF626162080808101410 +8B898B000000FFFFFFFFFFFF000000949594202020000400292829C5C2C5A4A1A4202420 +000400313031D5D2D5FFFFFFFFFFFFDEDEDE4A4C4A080C08000400414441E6E6E6FFFFFF +FFFFFF000000949594181C18000400313031D5D2D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFB4B6B4292829000400181C189C999CFFFFFFFFFFFF0000008B898B101410080808 +626162FFFAFFFFFFFFFFFFFFFFFFFF7B797B101410080808525552F6F2F6FFFFFFFFFFFF +DEDEDE4A4C4A080C08000400414441E6E6E6FFFFFFFFFFFF000000FFFFFFFFFFFFCDCACD +181818949194FFFFFFB4B6B4292829000400181C189C999CFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6181C18CDCAC5EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6838183524C4AD5CECD +EEE6E6CDC6C55A595AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6838183524C4AD5CECD +EEE6E6CDC6C55A595AEEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE673716A525052DEDAD5DEDAD54A4C4A737573EEEAE6EEEAE67B7573525052DEDAD5 +DEDAD5525052101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F6EEF6EEEEEEF2E6F6EEEEEEEEE6EEEAE6 +EEE6E6EEE6E6E6E6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE683817B4A4C4AD5D2D5E6E2DE626162 +6A696AEEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE69C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF838183414441E6E2E6 +F6F2F66261626A696AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000525552E6E2E6F6F6F6838183 +313431FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A696A949594FFFFFFE6E2E6080C08F6F6F6 +FFFFFF9495946A696AFFFFFF7371734A484AEEEAEEEEEAEE414441737573FFFFFFFFFFFF +7371734A484AEEEAEEEEEAEE414441737573FFFFFFFFFFFF7375734A484AEEEAEEEEEAEE +4A484A000000FFFFFFFFFFFF000000525052E6E2E6F6F6F6838583080C08525552E6E2E6 +F6F6F6838183313431FFFFFFFFFFFF292829BDBEBDF6F6F6F6F2F66A6D6A5A595AFFFFFF +FFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF101410ACAEACFFFAFFE6E2E6626562FFFFFFFFFFFF0000004A484AEEEAEEEEEAEE +4A484A737573FFFFFFFFFFFF838183414441E6E2E6F6F2F66261626A696AFFFFFFFFFFFF +292829BDBEBDF6F6F6F6F2F66A6D6A5A595AFFFFFFFFFFFF000000FFFFFFB4B2B4101410 +B4B2B4FFFFFFFFFFFF101410ACAEACFFFAFFE6E2E6626562FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6838583181818101010EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6838183292829 +101410313431A4A19CEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6838183292829 +101410313431A4A19CEEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6EEE6E66265621818181818186A6562EEE6E6EEEAE6EEEAE6EEE6E6626162101410 +2024208B8583101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEF6EEEEEEEEEEF6EAEEEEEEE6 +EEEAE6E6EADEEEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6292829CDCAC5EEEAE6EEEAE6DED6D5 +202420EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE69C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF181C18D5D6D5FFFFFF +FFFFFFEEEAEE101410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6 +000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B2B4525552FFFFFF838583101410A4A1A4 +FFFFFF525552B4B2B4FFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF +181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFF +DEDADE000000FFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000000EEEEEEFFFFFF +FFFFFFF6F6F6000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6101410FFFFFF +FFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF181C18949194E6E2E6FFFFFFFFFFFFFFFFFFFFFFFF000000DEDADEFFFFFFFFFFFF +DEDADE181C18FFFFFFFFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFF6F6F6101410FFFFFFFFFFFF000000949194181818CDCECD +FFFFFFFFFFFFFFFFFF181C18949194E6E2E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F2EEF6EEF6EEF2EEEEEEE6EEEAEEEEEEE6 +EEE6E6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6101410101010101010101010101010 +101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6EAEE9C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000400000000000000 +000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F2F6181C18FFFFFF292C29B4B2B4393C39 +FFFFFF181C18F6F6F6FFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFAFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFC5C6C5393C39080808000000000000000000FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFCDCACD4A4C4A101410181C18ACAEACFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFAFF000400FFFFFFFFFFFF000400000000000000000000000000000000FFFFFFFFFFFF +C5C6C5393C39080808000000000000000000FFFFFFFFFFFF000000181C187B7D7BFFFFFF +FFFFFFFFFFFFFFFFFFCDCACD4A4C4A101410181C18ACAEACFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183EEEAEEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6F2EEF6EEEEF6EEEEEEEEE6EEEAE6 +EEEAE6EEE6DEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6292829DED6D5EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6EEEE9C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF181C18E6E6E6FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF414041ACAAAC393839FFFFFF313031 +B4B2B4414041FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF +181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFF +DEDADE000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF181C18ACAAACF6F2F6FFFFFFF6F2F6000000FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFB4B6B4181818FFFFFFFFFFFF000000DEDADEFFFFFFFFFFFF +DEDADE181C18FFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +181C18ACAAACF6F2F6FFFFFFF6F2F6000000FFFFFFFFFFFF000000DEDEDE2020208B8D8B +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B6B4181818FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183EEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEEAE6EEEADE +EEE6E6EEEAE6EEEAE6EEEADEEEEAE6EEEAE6E6EADEEEEAE6EEE6E6E6EADEEEE6E6EEEAE6 +E6EADEEEE6E6EEEAE6EEE6E6EEEAE6EEEADEEEE6E6EEEAE6EEEAE6E6EADEEEEAE6EEEADE +EEEADEEEE6E6E6EADEEEEADEEEEAE6EEE6E6EEEADEEEEAE6EEE6E6EEEAE6EEEADEEEEAE6 +E6EADEEEEADEEEE6E6EEEAE6EEEADEEEEAE6EEEADEEEEAE6EEE6E6EEEADEEEEAE6E6EADE +EEE6E6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEADEE6EADEEEE6E6EEEADEEEEAE6E6EADE +EEEAE6EEEAE6EEE6E6EEEAE6EEEADEEEEAE6EEE6E6EEEAE6EEEAE6EEEAE6EEEAE6E6EADE +EEE6E6EEEAE6EEEADEEEEAE6EEEAE6EEEADEEEEAE6E6EADEEEE6E6EEEAE6EEE6E6EEEAE6 +EEEAE6EEEADEEEEAE6EEEAE6E6EADEEEEAE6EEEADEEEE6E6E6EADEEEE6E6EEEAE6EEEAE6 +EEEAE6EEE6E6EEE6E6EEEADEEEEAE6EEE6E6EEEAE6EEEAE6E6EADEEEEAE6E6EADEEEE6E6 +EEEADEEEEAE6EEEAE6EEEAE6EEEAE6E6EADEEEEAE6E6EADEEEE6E6EEEAE6EEE6E6EEEAE6 +E6EADEEEE6E6EEEAE6E6EADEEEE6E6EEEADEEEEAE6EEEADEEEE6E6EEEAE6EEEAE6EEEADE +EEEAE6EEEAE6E6EADEEEEAE6EEE6E6E6EADEEEE6E6EEEAE6E6EADEEEE6E6EEEAE6EEE6E6 +EEEAE6EEEADEEEE6E6EEEAE6EEEAE6E6EADEEEEAE6EEEADEEEEADEEEE6E6E6EADEEEEADE +EEEAE6EEE6E6EEEADEEEEAE6EEE6E6EEEAE6EEEADEEEEAE6E6EADEEEEADEEEE6E6EEEAE6 +EEEADEEEEAE6EEEADEEEEAE6EEE6E6EEEADEEEEAE6E6EADEEEE6E6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEADEE6EADEEEE6E6EEEADEEEEAE6E6EADEEEEAE6EEEAE6EEE6E6EEEAE6 +EEEADEEEEAE6EEE6E6EEEAE6EEEAE6EEEAE6EEEAE6E6EADEEEE6E6EEEAE6EEEADEEEEAE6 +EEEAE6EEEADEEEEAE6E6EADEEEE6E6C5B6ACFFFAFFEEEAE6EEEAE6EEEADEEEEAE6EEEAE6 +E6EADEEEEAE6EEEADEEEE6E6E6EADEEEE6E6EEEAE6EEEAE6EEEAE6EEE6E6EEE6E6EEEADE +EEEAE6EEE6E6EEEAE6EEEAE6E6EADEEEEAE6E6EADEEEE6E6EEEADEEEEAE6EEEAE6EEEAE6 +EEEAE6E6EADEEEEAE6E6EADEEEE6E6EEEAE6EEE6E6EEEAE6E6EADEEEE6E6EEEAE6E6EADE +EEE6E6EEEADEEEEAE6EEEADEEEE6E6EEEAE6EEEAE6EEEADEEEEAE6EEEAE6E6EADEEEEAE6 +EEE6E6E6EADEEEE6E6EEEAE6E6EADEEEE6E6EEEAE6EEE6E6EEEAE6EEEADEEEE6E6EEEAE6 +EEEAE6E6EADEEEEAE6EEEADEEEEADEEEE6E6E6EADEEEEADEEEEAE6EEE6E6EEEADEEEEAE6 +EEE6E6EEEAE6EEEADEEEEAE6E6EADEEEEADEEEE6E6EEEAE6EEEADEEEEAE6EEEADEEEEAE6 +EEE6E6EEEADEEEEAE6E6EADEEEE6E6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEF6EEEEEEF2E6EEEEEEF6EAEEEEEAE6 +E6EADEEEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6181C18 +CDCAC5EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6838183524C4AD5CECDEEE6E6CDC6C5 +5A595AEEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEEE69C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF8385834A484ADEDEDE +FFFAFFD5D2D5525552FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B898B181C18949594FFFFFF8B8D8B +181C188B898BFFFFFFFFFFFF7371734A4C4AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFF +7371734A4C4AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFF7375734A4C4AEEEAEEEEEAEE +4A4C4A000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF101010B4B2B4FFFAFFDEDEDE525552000000FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF5A595ADEDADEFFFAFFB4B6B4101410FFFFFFFFFFFF0000004A4C4AEEEAEEEEEAEE +4A484A737573FFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552FFFFFFFFFFFF +101010B4B2B4FFFAFFDEDEDE525552000000FFFFFFFFFFFF000000FFFFFFE6E2E6202420 +8B898BFFFFFFFFFFFF5A595ADEDADEFFFAFFB4B6B4101410FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183EEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFE6EADEEEE6E6 +E6EADEEEEAE6EEE6E6EEE6E6EEEADEEEE6E6EEE6E6EEEAE6E6EADEEEEAE6EEE6E6EEEADE +EEE6E6E6EADEEEE6E6E6EADEEEE6E6EEE6E6E6EADEEEEADEEEE6E6EEEADEEEEAE6EEE6E6 +EEE6E6EEEADEEEE6E6EEE6E6EEEAE6E6EADEEEE6E6EEE6E6EEE6E6EEE6E6EEE6E6EEE6E6 +EEE6E6EEE6E6EEEAE6EEE6E6EEE6E6EEEAE6EEE6E6E6EADEEEEAE6EEE6E6EEE6E6EEEADE +EEE6E6E6EADEEEE6E6EEE6E6E6EADEEEE6E6EEEAE6EEE6E6EEEADEE6EADEEEE6E6EEE6E6 +E6EADEEEEAE6EEE6E6E6EADEEEE6E6EEE6E6E6EADEEEEAE6EEE6E6E6EADEEEE6E6EEEADE +EEE6E6E6EADEEEE6E6EEE6E6E6EADEEEE6E6EEEAE6EEE6E6E6EADEEEE6E6E6EADEEEE6E6 +EEEAE6EEE6E6EEEADEEEE6E6EEE6E6EEEAE6EEE6E6EEEADEEEE6E6E6EADEE6EADEEEE6E6 +EEE6E6E6EADEEEE6E6EEEAE6EEE6E6E6EADEEEE6E6E6EADEEEE6E6EEEAE6EEEADEEEE6E6 +EEEADEEEE6E6EEE6E6E6EADEEEE6E6EEE6E6EEE6E6EEE6E6EEE6E6E6EADEE6EADEEEE6E6 +EEE6E6E6EADEEEE6E6EEE6E6EEEADEEEE6E6E6EADEEEE6E6E6EADEEEEAE6EEE6E6EEE6E6 +EEEADEEEE6E6EEE6E6EEEAE6E6EADEEEEAE6EEE6E6EEEADEEEE6E6E6EADEEEE6E6E6EADE +EEE6E6EEE6E6E6EADEEEEADEEEE6E6EEEADEEEEAE6EEE6E6EEE6E6EEEADEEEE6E6EEE6E6 +EEEAE6E6EADEEEE6E6EEE6E6EEE6E6EEE6E6EEE6E6EEE6E6EEE6E6EEE6E6EEEAE6EEE6E6 +EEE6E6EEEAE6EEE6E6E6EADEEEEAE6EEE6E6EEE6E6EEEADEEEE6E6E6EADEEEE6E6EEE6E6 +E6EADEEEE6E6EEEAE6EEE6E6EEEADEE6EADEEEE6E6EEE6E6E6EADEEEEAE6EEE6E6E6EADE +EEE6E6EEE6E6E6EADEEEEAE6EEE6E6E6EADEEEE6E6EEEADEEEE6E6E6EADEEEE6E6EEE6E6 +E6EADEEEE6E6EEEAE6EEE6E6E6EADEC5B6ACFFFAFFEEE6E6EEEAE6EEE6E6EEEADEEEE6E6 +EEE6E6EEEAE6EEE6E6EEEADEEEE6E6E6EADEE6EADEEEE6E6EEE6E6E6EADEEEE6E6EEEAE6 +EEE6E6E6EADEEEE6E6E6EADEEEE6E6EEEAE6EEEADEEEE6E6EEEADEEEE6E6EEE6E6E6EADE +EEE6E6EEE6E6EEE6E6EEE6E6EEE6E6E6EADEE6EADEEEE6E6EEE6E6E6EADEEEE6E6EEE6E6 +EEEADEEEE6E6E6EADEEEE6E6E6EADEEEEAE6EEE6E6EEE6E6EEEADEEEE6E6EEE6E6EEEAE6 +E6EADEEEEAE6EEE6E6EEEADEEEE6E6E6EADEEEE6E6E6EADEEEE6E6EEE6E6E6EADEEEEADE +EEE6E6EEEADEEEEAE6EEE6E6EEE6E6EEEADEEEE6E6EEE6E6EEEAE6E6EADEEEE6E6EEE6E6 +EEE6E6EEE6E6EEE6E6EEE6E6EEE6E6EEE6E6EEEAE6EEE6E6EEE6E6EEEAE6EEE6E6E6EADE +EEEAE6EEE6E6EEE6E6EEEADEEEE6E6E6EADEEEE6E6EEE6E6E6EADEC5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6EEF2EEF6EEEEEEEEE6EEEEE6F6EAEE +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6838583 +181818101010EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6838183292829101410313431 +A4A19CEEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEF2E69C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF838583181C18 +000400292C29ACAAACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDCECD000400EEEAEEFFFFFFE6E6E6 +000000D5D2D5FFFFFFFFFFFFF6F6F6626162080C08080C08626562F6F6F6FFFFFFFFFFFF +F6F6F6626162080C08080C08626562F6F6F6FFFFFFFFFFFFF6F6F6626162080808101410 +8B898B000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFB4B2B4202020000400202020949594000000FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFA4A5A4202420000400292829BDBABDFFFFFFFFFFFF0000008B898B101410080808 +626162F6F6F6FFFFFFFFFFFFFFFFFF838583181C18000400292C29ACAAACFFFFFFFFFFFF +B4B2B4202020000400202020949594000000FFFFFFFFFFFF000000FFFFFFFFFFFFE6E6E6 +202420838183FFFFFFA4A5A4202420000400292829BDBABDFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183F6EEEEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEE6E6EEE6E6 +EEE6E6EEE6E6E6EADEE6EADEEEE6E6E6EADEEEE6E6E6E6DEEEE6E6EEE6E6E6EADEEEE6E6 +EEE6DEEEE6E6EEE6DEEEE6E6E6EADEEEE6DEEEE6E6EEE6E6E6EADEEEE6E6EEE6E6E6EADE +EEE6E6EEE6DEE6EADEEEE6E6EEE6E6E6E6DEEEE6E6E6E6DEE6EADEEEE6DEE6EADEE6E6DE +EEE6E6E6EADEEEE6E6E6EADEEEE6E6E6EADEEEE6DEEEE6E6E6EADEEEE6E6E6EADEEEE6DE +EEE6E6EEE6E6E6EADEE6E6DEEEE6E6E6E6DEEEE6E6E6EADEEEE6E6EEE6E6E6E6DEEEE6DE +EEE6E6EEE6E6E6EADEEEE6DEEEE6E6E6E6DEEEE6E6E6EADEEEE6DEEEE6E6E6EADEEEE6E6 +E6EADEEEE6E6E6E6DEE6E6DEEEE6E6EEE6E6E6EADEEEE6DEEEE6E6EEE6E6EEE6DEEEE6E6 +E6EADEEEE6DEEEE6E6E6EADEE6EADEEEE6E6E6EADEEEE6E6EEE6DEEEE6E6EEE6DEEEE6E6 +E6EADEEEE6E6E6EADEEEE6E6E6EADEEEE6E6E6E6DEEEE6DEEEE6E6E6EADEEEE6E6E6EADE +EEE6E6E6EADEE6E6DEEEE6E6EEE6E6E6EADEE6EADEEEE6DEE6E6DEEEE6E6EEE6E6E6E6DE +EEE6E6EEE6DEE6EADEEEE6E6E6E6DEEEE6E6EEE6E6EEE6E6EEE6E6EEE6E6E6EADEE6EADE +EEE6E6E6EADEEEE6E6E6E6DEEEE6E6EEE6E6E6EADEEEE6E6EEE6DEEEE6E6EEE6DEEEE6E6 +E6EADEEEE6DEEEE6E6EEE6E6E6EADEEEE6E6EEE6E6E6EADEEEE6E6EEE6DEE6EADEEEE6E6 +EEE6E6E6E6DEEEE6E6E6E6DEE6EADEEEE6DEE6EADEE6E6DEEEE6E6E6EADEEEE6E6E6EADE +EEE6E6E6EADEEEE6DEEEE6E6E6EADEEEE6E6E6EADEEEE6DEEEE6E6EEE6E6E6EADEE6E6DE +EEE6E6E6E6DEEEE6E6E6EADEEEE6E6EEE6E6E6E6DEEEE6DEEEE6E6EEE6E6E6EADEEEE6DE +EEE6E6E6E6DEEEE6E6E6EADEEEE6DEEEE6E6E6EADEEEE6E6E6EADEEEE6E6E6E6DEE6E6DE +EEE6E6EEE6E6E6EADEEEE6DEEEE6E6C5B6ACFFFAFFEEE6E6E6EADEEEE6DEEEE6E6E6EADE +E6EADEEEE6E6E6EADEEEE6E6EEE6DEEEE6E6EEE6DEEEE6E6E6EADEEEE6E6E6EADEEEE6E6 +E6EADEEEE6E6E6E6DEEEE6DEEEE6E6E6EADEEEE6E6E6EADEEEE6E6E6EADEE6E6DEEEE6E6 +EEE6E6E6EADEE6EADEEEE6DEE6E6DEEEE6E6EEE6E6E6E6DEEEE6E6EEE6DEE6EADEEEE6E6 +E6E6DEEEE6E6EEE6E6EEE6E6EEE6E6EEE6E6E6EADEE6EADEEEE6E6E6EADEEEE6E6E6E6DE +EEE6E6EEE6E6E6EADEEEE6E6EEE6DEEEE6E6EEE6DEEEE6E6E6EADEEEE6DEEEE6E6EEE6E6 +E6EADEEEE6E6EEE6E6E6EADEEEE6E6EEE6DEE6EADEEEE6E6EEE6E6E6E6DEEEE6E6E6E6DE +E6EADEEEE6DEE6EADEE6E6DEEEE6E6E6EADEEEE6E6E6EADEEEE6E6E6EADEEEE6DEEEE6E6 +E6EADEEEE6E6E6EADEEEE6DEEEE6E6EEE6E6E6EADEE6E6DEEEE6E6C5B6ACFFFAFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6EEF2EEF6EEEEF6EEEEEEEAE6EEEAE6 +EEEAE6EEE6E6E6E6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6EEEE9C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183EEF2EEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFE6E6DEE6E6DE +E6E6DEE6E6DEEEE6E6EEE6E6EEE6E6E6E6DEE6E6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6DE +E6E6DEE6E6DEE6E6DEEEE6E6E6E6DEEEE6E6E6E6DEE6E6DEEEE6DEE6E6DEE6E6DEEEE6E6 +E6E6DEEEE6E6EEE6E6E6E6DEE6E6DEEEE6E6E6E6DEEEE6DEEEE6E6E6E6DEEEE6E6EEE6E6 +E6E6DEEEE6E6E6E6DEE6E6DEEEE6E6E6E6DEEEE6E6EEE6DEE6E6DEEEE6E6E6E6DEEEE6E6 +E6E6DEE6E6DEEEE6E6EEE6E6E6E6DEEEE6E6E6E6DEEEE6E6EEE6DEE6E6DEEEE6DEEEE6E6 +E6E6DEE6E6DEEEE6E6EEE6DEE6E6DEEEE6E6EEE6DEEEE6E6EEE6E6E6E6DEEEE6E6EEE6DE +E6E6DEEEE6E6EEE6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6E6E6E6DEE6E6DEE6E6DEE6E6DE +EEE6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6DEE6E6DEE6E6DEEEE6E6E6E6DE +EEE6DEE6E6DEEEE6E6E6E6DEEEE6DEE6E6DEEEE6E6EEE6DEE6E6DEEEE6E6EEE6DEEEE6E6 +EEE6DEE6E6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6E6EEE6E6E6E6DEEEE6E6E6E6DEEEE6E6 +E6E6DEEEE6E6E6E6DEEEE6E6EEE6E6E6E6DEE6E6DEE6E6DEE6E6DEE6E6DEEEE6E6EEE6E6 +EEE6E6E6E6DEE6E6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6DEE6E6DEE6E6DEE6E6DEEEE6E6 +E6E6DEEEE6E6E6E6DEE6E6DEEEE6DEE6E6DEE6E6DEEEE6E6E6E6DEEEE6E6EEE6E6E6E6DE +E6E6DEEEE6E6E6E6DEEEE6DEEEE6E6E6E6DEEEE6E6EEE6E6E6E6DEEEE6E6E6E6DEE6E6DE +EEE6E6E6E6DEEEE6E6EEE6DEE6E6DEEEE6E6E6E6DEEEE6E6E6E6DEE6E6DEEEE6E6EEE6E6 +E6E6DEEEE6E6E6E6DEEEE6E6EEE6DEE6E6DEEEE6DEEEE6E6E6E6DEE6E6DEEEE6E6EEE6DE +E6E6DEEEE6E6EEE6DEEEE6E6EEE6E6E6E6DEEEE6E6EEE6DEE6E6DEEEE6E6EEE6DEEEE6E6 +E6E6DEEEE6E6E6E6DEEEE6E6E6E6DEE6E6DEE6E6DEE6E6DEEEE6DEEEE6E6E6E6DEEEE6E6 +E6E6DEEEE6E6E6E6DEEEE6DEE6E6DEE6E6DEEEE6E6E6E6DEEEE6DEE6E6DEEEE6E6E6E6DE +EEE6DEE6E6DEEEE6E6EEE6DEE6E6DEEEE6E6EEE6DEEEE6E6EEE6DEE6E6DEEEE6E6E6E6DE +EEE6E6E6E6DEEEE6E6EEE6E6E6E6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6E6 +EEE6E6E6E6DEE6E6DEE6E6DEE6E6DEE6E6DEEEE6E6EEE6E6EEE6E6E6E6DEE6E6DEEEE6E6 +E6E6DEEEE6E6E6E6DEEEE6DEE6E6DEE6E6DEE6E6DEEEE6E6E6E6DEEEE6E6E6E6DEE6E6DE +EEE6DEE6E6DEE6E6DEEEE6E6E6E6DEEEE6E6EEE6E6E6E6DEE6E6DEEEE6E6E6E6DEEEE6DE +EEE6E6E6E6DEEEE6E6EEE6E6E6E6DEEEE6E6E6E6DEE6E6DEEEE6E6E6E6DEEEE6E6EEE6DE +E6E6DEEEE6E6E6E6DEEEE6E6E6E6DEE6E6DEEEE6E6EEE6E6E6E6DEEEE6E6E6E6DEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F2EEF6EEF6F6F2EEEEEEE6F6EAEEEEEEE6 +EEE6E6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +101010101010101010101010101010101010101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6EEEE9C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183F6EEEEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFEEE2DEEEE6DE +EEE6DEEEE2E6E6E6DEE6E6DEE6E6DEEEE6DEEEE2DEEEE6DEE6E6DEEEE6DEE6E6DEEEE6DE +EEE2E6EEE6DEEEE2DEEEE6DEEEE2E6E6E6DEE6E6DEEEE6DEEEE6DEEEE2E6EEE6DEE6E6DE +EEE2DEE6E6DEE6E6DEEEE6DEEEE2E6E6E6DEEEE2DEE6E6DEE6E6DEEEE6DEE6E6DEE6E6DE +EEE6DEE6E6DEEEE2DEE6E6DEEEE2E6E6E6DEE6E6DEEEE2DEE6E6DEEEE2E6E6E6DEE6E6DE +EEE6DEEEE2DEE6E6DEE6E6DEEEE6DEEEE2E6E6E6DEE6E6DEEEE2E6E6E6DEEEE2E6E6E6DE +EEE2DEE6E6DEEEE2E6E6E6DEEEE2E6E6E6DEE6E6DEEEE6DEE6E6DEE6E6DEEEE6DEEEE2DE +E6E6DEE6E6DEE6E6DEE6E6DEE6E6DEE6E6DEEEE6DEEEE6DEE6E6DEEEE2DEEEE2E6EEE6DE +E6E6DEEEE6DEE6E6DEE6E6DEEEE2E6E6E6DEEEE2DEE6E6DEEEE2DEEEE6DEE6E6DEEEE2DE +EEE6DEE6E6DEE6E6DEEEE6DEEEE2E6E6E6DEE6E6DEEEE2DEE6E6DEE6E6DEE6E6DEE6E6DE +E6E6DEEEE2E6E6E6DEEEE6DEE6E6DEE6E6DEEEE6DEE6E6DEEEE6DEE6E6DEE6E6DEEEE6DE +E6E6DEEEE6DEEEE2DEE6E6DEE6E6DEE6E6DEEEE2DEEEE6DEEEE6DEEEE2E6E6E6DEE6E6DE +E6E6DEEEE6DEEEE2DEEEE6DEE6E6DEEEE6DEE6E6DEEEE6DEEEE2E6EEE6DEEEE2DEEEE6DE +EEE2E6E6E6DEE6E6DEEEE6DEEEE6DEEEE2E6EEE6DEE6E6DEEEE2DEE6E6DEE6E6DEEEE6DE +EEE2E6E6E6DEEEE2DEE6E6DEE6E6DEEEE6DEE6E6DEE6E6DEEEE6DEE6E6DEEEE2DEE6E6DE +EEE2E6E6E6DEE6E6DEEEE2DEE6E6DEEEE2E6E6E6DEE6E6DEEEE6DEEEE2DEE6E6DEE6E6DE +EEE6DEEEE2E6E6E6DEE6E6DEEEE2E6E6E6DEEEE2E6E6E6DEEEE2DEE6E6DEEEE2E6E6E6DE +EEE2E6E6E6DEE6E6DEEEE6DEE6E6DEE6E6DEEEE6DEEEE2DEE6E6DEE6E6DEE6E6DEE6E6DE +E6E6DEE6E6DEEEE6DEEEE6DEE6E6DEEEE2DEEEE2E6EEE6DEE6E6DEEEE6DEE6E6DEE6E6DE +EEE2E6E6E6DEEEE2DEE6E6DEEEE2DEEEE6DEE6E6DEEEE2DEEEE6DEE6E6DEE6E6DEEEE6DE +EEE2E6E6E6DEE6E6DEEEE2DEE6E6DEE6E6DEE6E6DEE6E6DEE6E6DEEEE2E6E6E6DEEEE6DE +E6E6DEE6E6DEEEE6DEE6E6DEEEE6DEE6E6DEE6E6DEEEE6DEE6E6DEEEE6DEEEE2DEE6E6DE +E6E6DEE6E6DEEEE2DEEEE6DEEEE6DEEEE2E6E6E6DEE6E6DEE6E6DEEEE6DEEEE2DEEEE6DE +E6E6DEEEE6DEE6E6DEEEE6DEEEE2E6EEE6DEEEE2DEEEE6DEEEE2E6E6E6DEE6E6DEEEE6DE +EEE6DEEEE2E6EEE6DEE6E6DEEEE2DEE6E6DEE6E6DEEEE6DEEEE2E6E6E6DEEEE2DEE6E6DE +E6E6DEEEE6DEE6E6DEE6E6DEEEE6DEE6E6DEEEE2DEE6E6DEEEE2E6E6E6DEE6E6DEEEE2DE +E6E6DEEEE2E6E6E6DEE6E6DEEEE6DEEEE2DEE6E6DEE6E6DEEEE6DEEEE2E6E6E6DEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6F2EEF6EEEEEEEEE6EEEAEEEEEAE6 +E6EADEEEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6F2EE9C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183F6F2EEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFAFFE6E2DEE6E6DE +E6E6DEE6E6DEE6E2DEEEE2DEEEE2DEE6E6DEE6E6DEEEE2DEE6E6DEE6E6DEEEE2DEE6E6DE +E6E6DEE6E6DEE6E2DEE6E6DEE6E6DEE6E2DEEEE2DEE6E6DEE6E6DEE6E6DEE6E6DEEEE2DE +E6E6DEEEE2DEEEE2DEE6E6DEE6E6DEE6E2DEE6E6DEEEE2DEEEE2DEE6E6DEEEE2DEE6E2DE +EEE2DEE6E6DEE6E6DEEEE2DEE6E6DEE6E2DEEEE2DEE6E6DEE6E6DEE6E2DEEEE2DEEEE2DE +E6E6DEEEE2DEE6E2DEEEE2DEE6E6DEE6E6DEEEE2DEE6E6DEE6E6DEEEE2DEE6E6DEE6E2DE +E6E6DEE6E6DEE6E2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E6DEE6E2DEEEE2DEE6E6DEE6E6DE +EEE2DEE6E6DEEEE2DEEEE2DEE6E2DEEEE2DEE6E6DEE6E6DEEEE2DEE6E6DEE6E2DEE6E6DE +EEE2DEEEE2DEE6E6DEEEE2DEE6E6DEE6E2DEE6E6DEEEE2DEE6E6DEE6E6DEE6E2DEE6E6DE +E6E6DEEEE2DEEEE2DEE6E6DEE6E6DEEEE2DEE6E2DEE6E6DEEEE2DEEEE2DEE6E6DEEEE2DE +E6E2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E6DE +EEE2DEE6E2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E2DEE6E6DEE6E6DEE6E6DEE6E2DEEEE2DE +EEE2DEE6E6DEE6E6DEEEE2DEE6E6DEE6E6DEEEE2DEE6E6DEE6E6DEE6E6DEE6E2DEE6E6DE +E6E6DEE6E2DEEEE2DEE6E6DEE6E6DEE6E6DEE6E6DEEEE2DEE6E6DEEEE2DEEEE2DEE6E6DE +E6E6DEE6E2DEE6E6DEEEE2DEEEE2DEE6E6DEEEE2DEE6E2DEEEE2DEE6E6DEE6E6DEEEE2DE +E6E6DEE6E2DEEEE2DEE6E6DEE6E6DEE6E2DEEEE2DEEEE2DEE6E6DEEEE2DEE6E2DEEEE2DE +E6E6DEE6E6DEEEE2DEE6E6DEE6E6DEEEE2DEE6E6DEE6E2DEE6E6DEE6E6DEE6E2DEE6E6DE +EEE2DEE6E6DEEEE2DEE6E6DEE6E2DEEEE2DEE6E6DEE6E6DEEEE2DEE6E6DEEEE2DEEEE2DE +E6E2DEEEE2DEE6E6DEE6E6DEEEE2DEE6E6DEE6E2DEE6E6DEEEE2DEEEE2DEE6E6DEEEE2DE +E6E6DEE6E2DEE6E6DEEEE2DEE6E6DEE6E6DEE6E2DEE6E6DEE6E6DEEEE2DEEEE2DEE6E6DE +E6E6DEEEE2DEE6E2DEE6E6DEEEE2DEEEE2DEE6E6DEEEE2DEE6E2DEE6E6DEEEE2DEE6E6DE +EEE2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E2DEE6E6DEEEE2DE +E6E6DEEEE2DEE6E2DEE6E6DEE6E6DEE6E6DEE6E2DEEEE2DEEEE2DEE6E6DEE6E6DEEEE2DE +E6E6DEE6E6DEEEE2DEE6E6DEE6E6DEE6E6DEE6E2DEE6E6DEE6E6DEE6E2DEEEE2DEE6E6DE +E6E6DEE6E6DEE6E6DEEEE2DEE6E6DEEEE2DEEEE2DEE6E6DEE6E6DEE6E2DEE6E6DEEEE2DE +EEE2DEE6E6DEEEE2DEE6E2DEEEE2DEE6E6DEE6E6DEEEE2DEE6E6DEE6E2DEEEE2DEE6E6DE +E6E6DEE6E2DEEEE2DEEEE2DEE6E6DEEEE2DEE6E2DEEEE2DEE6E6DEE6E6DEEEE2DEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6EEF2EEEEF2EEF6EEEEEEEEE6F6EAEE +EEEAE6EEE6DEE6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6F2EE9C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183F6F2F6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8B +AC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BAC9D8BC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F2EEF6F2EEF6EEEEEEEEEEEEEEE6EEEAE6 +EEEAE6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6F2F69C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183F6F6EEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEEEF2E6F6EEEEEEEEE6EEEAE6 +EEEAE6EEE6E6E6E6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6F6EE9C9183EEEAE6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +9C9183F6F6F6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F6EEF6F2EEF6EEEEEEEEE6EEEAEEEEEEE6 +EEE6E6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6F6EED5D2CD9C9183FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C9183 +D5D2CDF6F6EEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEEEF2EEEEEEEEF6EAEEEEEAE6 +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6EEEEFFFAF6D5D2CD9C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183D5D2CD +FFFAF6F6EEEEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6EEF2EEF6EEEEF6EEEEEEEEE6EEEAE6 +EEEAE6EEE6E6EEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6F6EEEEFFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +F6EEEEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F2EEF6F2EEF6EEEEEEEEE6F6EAEEEEEAE6 +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6EEF6EEF2E6F6EEEEEEEEE6EEEEE6 +EEE6E6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBEBD181C18000000FFFFFF +BDBEBD181C18000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6F2EEF6EEEEEEEEE6F6EAEEEEEAE6 +EEEAE6EEE6E6EEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF313431ACAEACFFFFFFFFFFFF +313431ACAEACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F2F6EEF2EEF6EEEEEEEEEEEEEEE6EEEAE6 +EEEAE6E6EADEEEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF080808FFFAFFFFFFFFFFFFFF +080808FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6F2EEEEF2E6F6EEEEEEEEE6EEEAE6 +EEEAE6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEF6EEEEEEEEEEF6EAEEEEEEE6 +EEEAE6EEE6DEE6E6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000 +949594181C18000400313031D5D2D5FFFFFFFFFFFF000000FFFFFFFFFFFFB4B6B4292829 +000400181C189C999CFFFFFFFFFFFF000000949594181C18000400313031D5D2D5FFFFFF +FFFFFF000000FFFFFFFFFFFF000000949594181C18000400313031D5D2D5FFFFFFFFFFFF +F6F6F65A5D5A0808081014108B898B000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +F6F6F6626562080C08080C08626562FFFAFFFFFFFF000000000000000000000000000000 +000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFF626162080808101410 +8B898B000000FFFFFFFFFFFFF6F6F6626562080C08080C08626562FFFAFFFFFFFFFFFFFF +FFFAFF7371731014101010108B8D8BFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF000000949594202020000400292829C5C2C5A4A1A4202420000400 +313031D5D2D5FFFFFFFFFFFFFFFFFF7B797B101410080808525552F6F2F6FFFFFFFFFFFF +000000949594181C18000400313031D5D2D5FFFFFF000000000000000000000000FFFFFF +FFFFFFDEDEDE4A4C4A080C08000400414441E6E6E6FFFFFF000000000000000000000000 +FFFFFFFFFFFF000000FFFFFFFFFFFFF6F6F6626562080C08080C08626562FFFAFFFFFFFF +FFFFFF000000949594181C18000400313031D5D2D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000949594202020000400292829C5C2C5A4A1A4202420000400313031D5D2D5FFFFFF +FFFFFFF6F6F6626562080C08080C08626562FFFAFFFFFFFFFFFFFF0000008B8D8B181C18 +000000FFFFFF000000949594181C18000400313031D5D2D5FFFFFFFFFFFF000000FFFFFF +FFFFFF000000949594181C18000400313031D5D2D5FFFFFFFFFFFFF6F6F65A5D5A080808 +1014108B898B000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6F2EEF6EEEEEEEEE6EEEEE6EEEAE6 +EEEAE6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000 +525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF000000FFFFFFFFFFFF101410ACAEAC +FFFAFFE6E2E6626562FFFFFFFFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFF +FFFFFF000000FFFFFFFFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF +7371734A4C4AEEEAEEEEEAEE4A4C4A000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +7371734A484AEEEAEEEEEAEE414441737573FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7375734A484AEEEAEEEEEAEE +4A484A000000FFFFFFFFFFFF7371734A484AEEEAEEEEEAEE414441737573FFFFFFFFFFFF +7B797B414441E6E2E6EEEEEE6A6D6AFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF000000525052E6E2E6F6F6F6838583080C08525552E6E2E6F6F6F6 +838183313431FFFFFFFFFFFF838183414441E6E2E6F6F2F66261626A696AFFFFFFFFFFFF +000000525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF292829BDBEBDF6F6F6F6F2F66A6D6A5A595AFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF7371734A484AEEEAEEEEEAEE414441737573FFFFFF +FFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000525052E6E2E6F6F6F6838583080C08525552E6E2E6F6F6F6838183313431FFFFFF +FFFFFF7371734A484AEEEAEEEEEAEE414441737573FFFFFFFFFFFF0000005A595AEEEAEE +FFFFFFFFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF000000FFFFFF +FFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF7371734A4C4AEEEAEE +EEEAEE4A4C4A000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEF6EEEEF6EEEEF6EAEEEEEAE6 +E6EADEEEE6E6EEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000000000000000000000000000FFFFFF000000FFFFFFFFFFFF000000 +EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF000000FFFFFFFFFFFF181C18949194 +E6E2E6FFFFFFFFFFFFFFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFF +FFFFFF000000FFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF +181818DEDEDEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181818DEDADEFFFFFFFFFFFF +DEDADE000000FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF +181C18DEDADEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000000EEEEEEFFFFFFFFFFFF +F6F6F6000400FFFFFFFFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFFFFFFFF +000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6101410FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFF +FFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000EEEEEEFFFFFFFFFFFFF6F6F6000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFF +FFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000E6E6E6FFFFFF +FFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF000000FFFFFF +FFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF181818DEDEDEFFFFFF +FFFFFFDEDADE000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6F2EEEEF2E6EEEEE6EEEEE6EEEAE6 +EEEAE6EEE6E6E6E6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFCDCACD4A4C4A +101410181C18ACAEACFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFAFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFAFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFF +000000FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFF000400000000000000000000000000000000FFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFC5C6C5393C39080808000000000000000000FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFAFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEF6EEEEF6EEEEEEEAE6EEEEE6 +EEEAE6EEE6DEEEE6E6E6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFB4B6B4181818FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +181818DEDEDEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181818DEDADEFFFFFFFFFFFF +DEDADE000000FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF +181C18DEDADEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000400F6F6F6FFFFFFFFFFFFEEEEEE +000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF181C18ACAAACF6F2F6FFFFFFF6F2F6000000FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF181818DEDEDEFFFFFF +FFFFFFDEDADE000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEEEF2EEF6F2EEEEEEE6EEEEE6F6EAEE +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6DED6CDC5B6ACACA194AC9D8BACA194C5B6ACDED6CD +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +DED6CDC5B6ACACA194AC9D8BACA194C5B6ACDED6CDEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6B4B6B4292829101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6DED6CDC5B6ACACA194AC9D8BACA194 +C5B6ACDED6CDEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF5A595ADEDADE +FFFAFFB4B6B4101410FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +737173525052EEEAEEEEEAEE4A4C4A000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +7371734A4C4AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7375734A4C4AEEEAEEEEEAEE +4A4C4A000000FFFFFFFFFFFF7371734A4C4AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFF +7B797B414441E6E2E6F6F2F6737173FFFFFFFFFFFF313431838183F6F6F6E6E6E6525552 +000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552FFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF101010D5D6D5FFFFFFFFFFFF +FFFFFF101010B4B2B4FFFAFFDEDEDE525552000000FFFFFFFFFFFF101010D5D6D5FFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF7371734A4C4AEEEAEEEEEAEE4A484A737573FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFF7371734A4C4AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF737173525052EEEAEE +EEEAEE4A4C4A000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6EEF6F6EEEEF6EEEEEEEEE6EEEAE6 +E6EADEEEE6DEEEE6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6C5BAB4B4AA9CCDC2BDDED6CDE6E2DEE6E2DEDED6D5BDAEA4 +C5BAB4EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5BAB4 +B4AA9CCDC2BDDED6CDE6E2DEE6E2DEDED6D5BDAEA4C5BAB4EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6393C39ACA5A4EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5BAB4B4AA9CCDC2BDDED6CDE6E2DEE6E2DE +DED6D5BDAEA4C5BAB4EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6000000EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFA4A5A4202420 +000400292829BDBABDFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +F6F6F65A595A080808101410838583000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +F6F6F6626162080C08080C08626562F6F6F6FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6626162080808101410 +8B898B000000FFFFFFFFFFFFF6F6F6626162080C08080C08626562F6F6F6FFFFFFFFFFFF +FFFAFF6A6D6A1010101010108B8D8BFFFFFFFFFFFFCDCECD313031000400181C18949594 +000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFF838583181C18000400292C29ACAAACFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF838583080C08000000FFFFFF +FFFFFFB4B2B4202020000400202020949594000000FFFFFFFFFFFF838583080C08000000 +FFFFFFFFFFFF000000FFFFFFFFFFFFF6F6F6626162080C08080C08626562F6F6F6FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFF6F6F6626162080C08080C08626562F6F6F6FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFF6F6F65A595A080808 +101410838583000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEEEF2EEEEF2E6F6EEEEEEEEE6EEEAE6 +EEE6E6EEE6E6EEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6C5BAB4BDB6ACE6DEDEEEEAE6FFF6F6FFFFFFFFFAFFFFFFFFFFFFFF +C5BEB4C5BAB4EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010313431EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6313031101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5BAB4BDB6AC +E6DEDEEEEAE6FFF6F6FFFFFFFFFAFFFFFFFFFFFFFFC5BEB4C5BAB4EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE68B85831010108B8583EEEAE6EEEAE6EEEAE6 +EEEAE6101410EEE6E6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5BAB4BDB6ACE6DEDEEEEAE6FFF6F6FFFFFFFFFAFF +FFFFFFFFFFFFC5BEB4C5BAB4EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6000000 +000000000000000000000000000000EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFD5D6D5202020FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFD5D6D5202020FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6EEF6F6EEEEEEEEEEF6EAEEEEEEE6 +EEEAE6E6EADEE6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6DED6CDB4AA9CE6E2DEF6EEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFBDAEA4DED6CDEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010393C39ACA5A4 +EEEAE6EEEAE6EEEAE6ACA5A4393C39101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6DED6CDB4AA9CE6E2DE +F6EEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDAEA4DED6CDEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6292C29948D8B292C29EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6DED6CDB4AA9CE6E2DEF6EEEEACAAAC4A505A2930394A505A +ACAEACFFFFFFFFFFFFBDAEA4DED6CDEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6000000 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF737173EEEEEEEEEAEE4A4C4A737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF737173EEEEEE +EEEAEE4A4C4A737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEEEF2EEEEF2EEF6EEEEEEEEE6EEEAE6 +EEEAE6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6C5B6ACCDC2BDE6E2E6FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFDEDAD5C5B6ACEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010A4A1A4414041 +EEEAE6EEEAE6EEEAE6414039A4A5A4101010EEEAE6EEEAE6EEE6E66A6562181C18181C18 +6A6962EEE6E6EEEAE6EEEAE61010108B8983292820101010EEEAE6101010949194292829 +101410393839C5C6C5EEEAE6EEEAE6101010EEEAE6EEEAE6101010949194292829101410 +393839C5C6C5EEEAE6EEEAE6EEE6E662615A1818182024208B8583101010EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACCDC2BDE6E2E6 +FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDAD5C5B6ACEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6ACAAAC393C39EEEAE6393C39ACAEACEEEAE6EEEAE6 +101010101010101010101010101010101010101010101010EEEAE6EEEAE6EEEAE67B7573 +2020201014105A595AE6E2DEEEEAE6EEEAE61010108B8983292820101010EEEAE6101010 +949194292829101410393839C5C6C5EEEAE6EEEAE6EEE6E66A6562181C18181C186A6962 +EEE6E6EEEAE6EEEAE6EEE6E66A6562181C18181C186A6962EEE6E6EEEAE6EEEAE6101010 +949194292829101410393839C5C6C5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACCDC2BDE6E2E6A4AAAC2934395A61626A757B5A6162 +293039ACAEACFFFFFFDEDAD5C5B6ACEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6000000 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6DEDAD5101010DEDADEEEEAE6EEEAE6EEEAE6DEDAD5 +101410DEDADEEEEAE6736D6A10101008080852504AE6DEDEEEEAE6EEEAE60000008B898B +181C18000400292C29C5C2BDEEEAE6EEEAE6000000EEEAE6EEEAE60000008B898B181C18 +000400292C29C5C2BDEEEAE6EEEAE6E6E2DE525552080808101410837D7B000000EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF949594101410080C085A5D5AF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF949594101410 +080C085A5D5AF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEF6EEEEEEEEE6F6EAEEEEEAE6 +EEE6E6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6ACA194DED6D5F6F2F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFF6F6F6ACA194EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6313031 +BDB6B4EEEAE6B4B6B4313031EEEAE6101010EEEAE6EEEAE6737173524C4ADEDAD5DED6D5 +4A4C4A7B7573EEEAE6EEEAE61010105A5D5ADEDAD5EEEAE6EEEAE61010105A5952D5D2D5 +E6E2DE837D7B393C39EEEAE6EEEAE6101010EEEAE6EEEAE61010105A5952D5D2D5E6E2DE +837D7B393C39EEEAE6EEEAE6737173525552DEDAD5DEDAD5525052101010EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6ACA194DED6D5F6F2F6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6ACA194EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6524C4A9C9994EEEAE69C9994524C4AEEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE683817B4A4C4A +D5D2D5E6E2DE6261626A696AEEEAE6EEEAE61010105A5D5ADEDAD5EEEAE6EEEAE6101010 +5A5952D5D2D5E6E2DE837D7B393C39EEEAE6EEEAE6737173524C4ADEDAD5DED6D54A4C4A +7B7573EEEAE6EEEAE6737173524C4ADEDAD5DED6D54A4C4A7B7573EEEAE6EEEAE6101010 +5A5952D5D2D5E6E2DE837D7B393C39EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6ACA194DED6D5F6F2F64A505A5A61625A656A293439293039 +1824294A505AFFFFFFF6F6F6ACA194EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6000000 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6625D5A837D7BEEEAE6EEEAE6EEEAE67B797B +6A6562EEEAE67B7973414039D5D2CDE6DEDE5A595262615AEEEAE6EEEAE60000004A4C4A +D5D2CDE6E2DE7B7573313031EEEAE6EEEAE6000000EEEAE6EEEAE60000004A4C4AD5D2CD +E6E2DE7B7573313031EEEAE6EEEAE66A696A4A484ADEDAD5DED6D5414441000000EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEEEF2EEF6EEEEF6EEEEEEEEE6EEEAE6 +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6AC9D8BEEE6E6FFF6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFAC9D8BEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6949594 +4A4C4AEEEAE64A4C4A9C9594EEEAE6101010EEEAE6EEEAE6202420CDCAC5EEEAE6EEEAE6 +CDCAC5202420EEEAE6EEEAE6101010DED6D5EEEAE6EEEAE6EEEAE6101010DEDAD5EEEAE6 +EEEAE6E6E2DE101410EEEAE6EEEAE6101010EEEAE6EEEAE6101010DEDAD5EEEAE6EEEAE6 +E6E2DE101410EEEAE6EEEAE6202420D5CECDEEEAE6EEEAE6CDCECD101010EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6AC9D8BEEE6E6FFF6F6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC9D8BEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6D5CECD202020EEE6E6EEEAE6EEE6E6202020D5CECDEEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6292829CDCAC5 +EEEAE6EEEAE6DED6D5202420EEEAE6EEEAE6101010DED6D5EEEAE6EEEAE6EEEAE6101010 +DEDAD5EEEAE6EEEAE6E6E2DE101410EEEAE6EEEAE6202420CDCAC5EEEAE6EEEAE6CDCAC5 +202420EEEAE6EEEAE6202420CDCAC5EEEAE6EEEAE6CDCAC5202420EEEAE6EEEAE6101010 +DEDAD5EEEAE6EEEAE6E6E2DE101410EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6AC9D8BEEE6E6FFF6F62930396A757B293439293039202C31 +182020293039FFFFFFFFFFFFAC9D8BEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6000000 +000000000000000000000000000000EEEAE6CDC6C5181C18EEEAE6EEEAE6EEE6E6181C18 +D5CECDEEEAE6181C18CDC6C5EEEAE6EEEAE6DED6D5101410EEEAE6EEEAE6000000DEDAD5 +EEEAE6EEEAE6E6E2DE000400EEEAE6EEEAE6000000EEEAE6EEEAE6000000DEDAD5EEEAE6 +EEEAE6E6E2DE000400EEEAE6EEEAE6181818CDCECDEEEAE6EEEAE6CDCAC5000000EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEEEF2EEEEEEEEEEEAEEEEEAE6 +EEEAE6EEE6E6EEE6DEE6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6ACA194EEE6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFF6F6F6ACA194EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEE6E6 +2024209C9994202420EEE6E6EEEAE6101010EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEE6E6101410EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6101010EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEE6E6101010EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6ACA194EEE6E6FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6ACA194EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6737573101010101010101010101010101010737573EEEAE6 +EEEAE6101010EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101410101010 +101010101010101010101010EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEE6E6 +101410EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEE6E6101410EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6ACA194EEE6E6FFFFFF4A505A5A6162293039202C31182429 +1824294A505AFFFFFFF6F6F6ACA194EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6000000 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6414041A49D9CEEEAE69C9994525052 +EEEAE6EEEAE6000400000000000000000000000000000000EEEAE6EEEAE6000000EEEAE6 +EEEAE6EEEAE6EEEAE6000000EEEAE6EEEAE6000000EEEAE6EEEAE6000000EEEAE6EEEAE6 +EEEAE6EEEAE6000000EEEAE6EEEAE6000000EEEAE6EEEAE6EEEAE6EEE6E6000000EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6EEF6F6EEEEEEEEE6F6EAEEEEEAE6 +EEEAE6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6C5B6ACDEDAD5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFDEDAD5C5B6ACEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6 +8B85831010108B8983EEEAE6EEEAE6101010EEEAE6EEEAE6202420CDCECDEEEAE6EEEAE6 +CDCAC5202420EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6101010EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6202420D5CECDEEEAE6EEEAE6CDCECD101010EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACDEDAD5FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDAD5C5B6ACEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEE6E6202020D5CECDEEEAE6EEEAE6EEEAE6D5CECD202020EEE6E6 +EEEAE6101010EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6292829DED6D5 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6202420CDCECDEEEAE6EEEAE6CDCAC5 +202420EEEAE6EEEAE6202420CDCECDEEEAE6EEEAE6CDCAC5202420EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACDEDAD5FFFFFFACAEAC293039182429182020182429 +202C31ACAEACFFFFFFDEDAD5C5B6ACEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6000000 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6ACAAA4393831EEEAE6313031C5BEBD +EEEAE6EEEAE6181818D5D2CDEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6000000EEEAE6 +EEEAE6EEEAE6EEEAE6000000EEEAE6EEEAE6000000EEEAE6EEEAE6000000EEEAE6EEEAE6 +EEEAE6EEEAE6000000EEEAE6EEEAE6181818CDCECDEEEAE6EEEAE6CDCAC5000000EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F2EEF6F2EEF6EEEEEEEEEEEEEEE6F6EAEE +EEEAE6EEE6E6EEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6DED6CDBDAEA4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFBDAEA4DED6CDEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE673716A525052DEDAD5DEDAD5 +4A4C4A737573EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6101010EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6737173525552DEDAD5DEDAD5525052101010EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6DED6CDBDAEA4FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDAEA4DED6CDEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE69C9994524C4AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE64A4C4A9C9994 +EEEAE6101010EEEAE6EEEAE6EEEAE6181C18CDCAC5EEEAE6EEEAE6EEEAE6838183524C4A +D5CECDEEE6E6CDC6C55A595AEEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE673716A525052DEDAD5DEDAD54A4C4A +737573EEEAE6EEEAE673716A525052DEDAD5DEDAD54A4C4A737573EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6DED6CDBDAEA4FFFFFFFFFFFFACAEAC4A505A2930394A505A +ACAEACFFFFFFFFFFFFBDAEA4DED6CDEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6000000 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE62024208B8983413C39EEEAE6 +EEEAE6EEEAE67B797B414441CDCAC5EEE6E6C5C2BD52504AEEEAE6EEEAE6000000EEEAE6 +EEEAE6EEEAE6EEEAE6000000EEEAE6EEEAE6000000EEEAE6EEEAE6000000EEEAE6EEEAE6 +EEEAE6EEEAE6000000EEEAE6EEEAE66A69624A484ADEDAD5DEDAD54A4441000000EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F6EEF6EEF6EEF2E6F6EEEEF6EAEEEEEEE6 +EEEAE6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6C5BAB4C5BEB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +C5BEB4C5BAB4EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEE6E6626562181818181818 +6A6562EEE6E6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6101010EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6E6E2DE5A5D5A101410202420838183101410EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5BAB4C5BEB4 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5BEB4C5BAB4EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6393C39ACAAA4EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6ACAAA4393C39 +EEEAE6101010EEEAE6EEEAE6EEEAE6838583181818101010EEEAE6EEEAE6EEEAE6838183 +292829101410313431A4A19CEEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEE6E66265621818181818186A6562 +EEE6E6EEEAE6EEEAE6EEE6E66265621818181818186A6562EEE6E6EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5BAB4C5BEB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFC5BEB4C5BAB4EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6000000 +000000000000000000000000000000EEEAE6EEEAE6EEEAE68B898B000000ACAAACEEEAE6 +EEEAE6EEEAE6EEEAE67B797B181C180004002928299C9D9CEEEAE6EEEAE6000000EEEAE6 +EEEAE6EEEAE6EEEAE6000000EEEAE6EEEAE6000000EEEAE6EEEAE6000000EEEAE6EEEAE6 +EEEAE6EEEAE6000000EEEAE6EEEAE6E6E2DE5255520808081014107B797B000400EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F2F6F6F2EEF6EEEEEEEEE6EEEEE6EEEAE6 +EEE6E6EEE6E6E6E6DEE6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6C5BAB4BDAEA4DEDAD5F6F6F6FFFFFFF6F6F6DEDAD5BDAEA4 +C5BAB4EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6CDCAC5292C29EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5BAB4 +BDAEA4DEDAD5F6F6F6FFFFFFF6F6F6DEDAD5BDAEA4C5BAB4EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5BAB4BDAEA4DEDAD5F6F6F6FFFFFFF6F6F6 +DEDAD5BDAEA4C5BAB4EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6CDC6C5181C18EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6F2EEF6EEEEEEEEEEF6EAEEEEEEE6 +EEEAE6EEE6DEEEE6E6E6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6DED6CDC5B6ACACA194AC9D8BACA194C5B6ACDED6CD +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE673716AE6DEDEDED6D5525052737573EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +DED6CDC5B6ACACA194AC9D8BACA194C5B6ACDED6CDEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6DED6CDC5B6ACACA194AC9D8BACA194 +C5B6ACDED6CDEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE66A6562DEDADEDED6D54144416A696AEEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F2F6EEF2EEF6EEEEEEEEE6EEEAE6EEEAE6 +EEE6E6E6EADEEEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6948D8B202020181818625D5AE6E2DEEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE68B8983101410080808525552E6E2DEEEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6F2EEEEF2EEF6EEEEEEEEE6EEEAE6 +EEEAE6EEE6E6EEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEF6EEF6F6EEEEEEEEE6F6EAEEEEEAE6 +EEE6E6EEE6DEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6EEF2EEF6EEEEF6EEEEEEEEE6EEEAE6 +E6EADEEEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEB4B2B4181818000000EEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F6EEF6F2EEEEF2EEEEEEE6EEEAE6EEEEE6 +EEE6E6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE313031A4A5A4EEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEF6EEEEEEEEEEF6EAEEEEEAE6 +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEDEDADE626162181C18000400101010414441ACAEACEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000400EEEAEEEEEEEEEEEEEE +000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6EEF6EEF2E6F6EEEEEEEEE6F6EAEE +E6EADEEEE6E6EEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEED5D6D5181C187B797BD5D2D5EEEAEEDEDEDEACAAAC414041EEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE +000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F2EEF6F2EEF6F2EEEEEEE6EEEAEEEEEEE6 +EEEAE6EEE6E6E6E6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEE5A5D5A7B7D7BEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEAEE5A5D5A080C08080C08626162EEEAEEEEEEEEEEEEEEEEEAEE5A595A080808101410 +838183000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEACAAAC292829000400181C18 +8B8D8BEEEEEEEEEEEECDCECD4A484A080808000400414041DEDADEDEDEDE101010DEDEDE +EEEEEEEEEEEEEEEEEEDEDEDE101410DEDEDEEEEEEE737173101410080808525052E6E2E6 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000000000000000000000EEEEEEEEEEEE000000 +8B8D8B181C18000400292C29C5C6C5EEEEEEEEEEEEEEEEEE737173101410080808525052 +E6E2E6EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEAEE5A595A080808101410838183 +000000EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE +737173101410080808525052E6E2E6EEEEEEEEEEEEEEEEEE737173101410080808525052 +E6E2E6EEEEEEEEEEEE0000008B8D8B181C18000400292C29C5C6C5EEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +CDCECD4A484A080808000400414041DEDADEEEEEEE000000000000000000000000000000 +000000000000000000EEEEEEEEEEEEEEEEEE737173101410080808525052E6E2E6EEEEEE +EEEEEE000000838583181818000000EEEEEE0000008B8D8B181C18000400292C29C5C6C5 +EEEEEEEEEEEEEEEAEE5A5D5A080C08080C08626162EEEAEEEEEEEEEEEEEEEEEAEE5A5D5A +080C08080C08626162EEEAEEEEEEEEEEEEEE0000008B8D8B181C18000400292C29C5C6C5 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6EEF2EEF6EEEEEEEEE6EEEAE6F6EAEE +EEEAE6EEE6E6EEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEE101410D5D6D5EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +6A6D6A414441DEDADEDEDADE4140416A6D6AEEEEEEEEEEEE6A6D6A414441DEDADEDEDADE +414441000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE101010A4A1A4EEEAEED5D2D5 +5A5D5AEEEEEEEEEEEE292829B4B2B4E6E6E6E6E2E66A696A525052EEEEEE626162838183 +EEEEEEEEEEEEEEEEEE7B7D7B6A696AEEEEEE7B797B414041D5D6D5E6E2E65A595A626162 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +4A4C4AD5D6D5E6E6E67B797B313031EEEEEEEEEEEE7B797B414041D5D6D5E6E2E65A595A +626162EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE6A6D6A414441DEDADEDEDADE414441 +000000EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEE7B797B +414041D5D6D5E6E2E65A595A626162EEEEEEEEEEEE7B797B414041D5D6D5E6E2E65A595A +626162EEEEEEEEEEEE0000004A4C4AD5D6D5E6E6E67B797B313031EEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +292829B4B2B4E6E6E6E6E2E66A696A525052EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE +000000EEEEEEEEEEEEEEEEEEEEEEEE7B797B414041D5D6D5E6E2E65A595A626162EEEEEE +EEEEEE000000525052DEDEDEEEEEEEEEEEEE0000004A4C4AD5D6D5E6E6E67B797B313031 +EEEEEEEEEEEE6A6D6A414441DEDADEDEDADE4140416A6D6AEEEEEEEEEEEE6A6D6A414441 +DEDADEDEDADE4140416A6D6AEEEEEEEEEEEE0000004A4C4AD5D6D5E6E6E67B797B313031 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEF6F2EEEEF2EEF6EEEEEEEEE6EEEEE6 +EEEAE6E6EADEEEE6E6E6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEE000400EEEAEEEEEEEEEEEEEEEEEEEE000000000000000000EEEEEEEEEEEE +181818CDCECDEEEEEEEEEEEECDCACD181818EEEEEEEEEEEE181818CDCECDEEEEEEEEEEEE +CDCECD000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE1818188B898BD5D2D5EEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE6E6E6101010EEEEEECDCACD181C18 +EEEEEEEEEEEEEEEAEE181C18D5D2D5EEEEEE181C18CDCACDEEEEEEEEEEEEDEDADE101410 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +DEDEDEEEEEEEEEEEEEE6E6E6000400EEEEEEEEEEEE181C18CDCACDEEEEEEEEEEEEDEDADE +101410EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE181818CDCECDEEEEEEEEEEEECDCECD +000000EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEE181C18 +CDCACDEEEEEEEEEEEEDEDADE101410EEEEEEEEEEEE181C18CDCACDEEEEEEEEEEEEDEDADE +101410EEEEEEEEEEEE000000DEDEDEEEEEEEEEEEEEE6E6E6000400EEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEE6E6E6101010EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE +000000EEEEEEEEEEEEEEEEEEEEEEEE181C18CDCACDEEEEEEEEEEEEDEDADE101410EEEEEE +EEEEEE000000DEDADEEEEEEEEEEEEEEEEEEE000000DEDEDEEEEEEEEEEEEEE6E6E6000400 +EEEEEEEEEEEE181818CDCECDEEEEEEEEEEEECDCACD181818EEEEEEEEEEEE181818CDCECD +EEEEEEEEEEEECDCACD181818EEEEEEEEEEEE000000DEDEDEEEEEEEEEEEEEE6E6E6000400 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6F2EEF6EEEEEEEEE6F6EAEEEEEAE6 +EEE6E6EEE6DEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEE101410D5D6D5EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEE +000000EEEEEEEEEEEEEEEEEEEEEAEE000400EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE +EEEAEE000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEBDBEBD4A484A101010181818 +A4A5A4EEEEEEEEEEEEBDBABD393839080808000000000000000000EEEEEEEEEEEE414041 +A4A1A4EEEEEE9C9D9C525552EEEEEEEEEEEE000400000000000000000000000000000000 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEE000400000000000000000000000000 +000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEAEE +000000EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEE000400 +000000000000000000000000000000EEEEEEEEEEEE000400000000000000000000000000 +000000EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +BDBABD393839080808000000000000000000EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE +000000EEEEEEEEEEEEEEEEEEEEEEEE000400000000000000000000000000000000EEEEEE +EEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEAEE000400EEEEEEEEEEEE000000EEEEEE +EEEEEEEEEEEEEEEAEE000400EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6EEF2EEF6EEEEF6EEEEEEEEE6EEEAE6 +EEEAE6E6EADEE6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEE5A595A7B7D7BEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEE +181818CDCECDEEEEEEEEEEEECDCACD181818EEEEEEEEEEEE181818CDCECDEEEEEEEEEEEE +CDCECD000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEACAAAC +101410EEEEEEEEEEEE1818189C9D9CE6E2E6EEEEEEE6E2E6000000EEEEEEEEEEEEACAEAC +393839EEEEEE313431C5C2C5EEEEEEEEEEEE181818D5D6D5EEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEE181818D5D6D5EEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE181818CDCECDEEEEEEEEEEEECDCECD +000000EEEEEEEEEEEE000400E6E6E6EEEEEEEEEEEEDEDEDE000000EEEEEEEEEEEE181818 +D5D6D5EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE181818D5D6D5EEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +1818189C9D9CE6E2E6EEEEEEE6E2E6000000EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE +000000EEEEEEEEEEEEEEEEEEEEEEEE181818D5D6D5EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEE181818CDCECDEEEEEEEEEEEECDCACD181818EEEEEEEEEEEE181818CDCECD +EEEEEEEEEEEECDCACD181818EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEF6EEEEEEEEE6F6EAEEEEEEE6 +EEE6E6EEE6E6EEE6E6E6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEED5D2D51818187B797BD5D2D5EEEAEEE6E6E6ACAEAC000000EEEEEEEEEEEE +6A696A4A484ADEDADEDEDADE4140416A6D6AEEEEEEEEEEEE6A6D6A4A484ADEDEDEDEDADE +414441000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE525552CDCACDEEEAEEACAAAC +101010EEEEEEEEEEEE101010A4A5A4EEEAEECDCECD525052000000EEEEEEEEEEEEEEEEEE +2024208B8D8B414041EEEEEEEEEEEEEEEEEE7B7D7B414441CDCECDEEEAEEC5C6C5525052 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE101010CDCACDEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEE7B7D7B414441CDCECDEEEAEEC5C6C5 +525052EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE6A6D6A4A484ADEDEDEDEDADE414441 +000000EEEEEEEEEEEE3130317B797BE6E6E6D5D6D54A4C4A000000EEEEEEEEEEEE7B7D7B +414441CDCECDEEEAEEC5C6C5525052EEEEEEEEEEEE7B7D7B414441CDCECDEEEAEEC5C6C5 +525052EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +101010A4A5A4EEEAEECDCECD525052000000EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE +101010CDCACDEEEEEEEEEEEEEEEEEE7B7D7B414441CDCECDEEEAEEC5C6C5525052EEEEEE +EEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEE6A696A4A484ADEDADEDEDADE4140416A6D6AEEEEEEEEEEEE6A696A4A484A +DEDADEDEDADE4140416A6D6AEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6EEEEF6EEEEEEEEE6EEEEE6F6EAEE +E6EADEEEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEED5D2D55A595A181818000400101010414441ACAEACEEEEEEEEEEEE +E6E6E65A5D5A080C08080C085A5D5AEEEAEEEEEEEEEEEEEEEEEAEE5A595A080808101410 +838183000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE9C999C202020000400292829 +ACAEACEEEEEEEEEEEEA4A5A4202020000400181C188B8D8B000000EEEEEEEEEEEEEEEEEE +8B8D8B000000ACAEACEEEEEEEEEEEEEEEEEEEEEEEE7B7D7B181C180004002928299C9D9C +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE7B7D7B080808000000EEEEEEEEEEEE000000 +EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE7B7D7B181C18000400292829 +9C9D9CEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEAEE5A595A080808101410838183 +000000EEEEEEEEEEEEC5C2C5292C290004001818188B898B000000EEEEEEEEEEEEEEEEEE +7B7D7B181C180004002928299C9D9CEEEEEEEEEEEEEEEEEE7B7D7B181C18000400292829 +9C9D9CEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +A4A5A4202020000400181C188B8D8B000000EEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEE +7B7D7B080808000000EEEEEEEEEEEEEEEEEE7B7D7B181C180004002928299C9D9CEEEEEE +EEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEEE6E6E65A5D5A080C08080C085A5D5AEEEAEEEEEEEEEEEEEEE6E6E65A5D5A +080C08080C085A5D5AEEEAEEEEEEEEEEEEEE000000EEEEEEEEEEEEEEEEEEEEEEEE000000 +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F2EEF6F2EEEEF2EEF6EEEEEEEAE6EEEEE6 +EEEAE6EEE6DEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFF000000FFFFFF414041949194FFFFFFFFFFFFFFFFFF949194414041 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6EEF6F6F2EEEEEEE6F6EAEEEEEAE6 +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFF000000FFFFFFCDCACD181C18FFFAFFFFFFFFFFFAFF181C18CDCACD +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F6EEEEF2EEF6EEEEF6EEEEEEEEE6F6EAEE +E6EADEEEE6E6E6E6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFF000000FFFFFFFFFFFF4A4C4AA4A1A4FFFFFFA4A1A44A4C4AF6F6F6 +626562080C08080C08626562FFFAFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000008B898B101410080808626162 +FFFAFFFFFFFFFFFFFFFFFFFF7B797B101410080808525552F6F2F6FFFFFFFFFFFFF6F6F6 +626562080C08080C08626562FFFAFFFFFFFFFFFFFF0000008B898B101410080808626162 +FFFAFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF7B797B101410080808525552F6F2F6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF202020D5D6D5FFFFFFFFFFFFA4A1A4FFFFFFFFFFFF +D5D2D5202020FFFFFF000000FFFFFF000000000000000000000000FFFFFFFFFFFF000000 +949594181C18000400313031D5D2D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +949594181C18000400313031D5D2D5FFFFFFFFFFFFFFFFFF7B797B101410080808525552 +F6F2F6FFFFFFFFFFFFDEDEDE4A4C4A080C08000400414441E6E6E6FFFFFFFFFFFF000000 +8B8D8B181C18000000000000000000000000000000FFFFFFFFFFFFB4B6B4292829000400 +181C189C999CFFFFFFFFFFFF000000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000949594181C18000400313031D5D2D5FFFFFF +FFFFFFFFFFFF7B797B101410080808525552F6F2F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFB4B6B4292829000400181C189C999CFFFFFFFFFFFFDEDEDE4A4C4A080C08000400 +414441E6E6E6FFFFFFFFFFFF000000FFFFFFFFFFFFFFFAFF6261620808081014108B898B +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEEEF2EEEEEEE6F6EAEEEEEEE6 +EEEAE6EEE6E6EEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFF000000FFFFFFFFFFFFD5D2D5292C29FFFFFF292829D5D2D5737173 +4A484AEEEAEEEEEAEE414441737573FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000004A484AEEEAEEEEEAEE4A484A +737573FFFFFFFFFFFF838183414441E6E2E6F6F2F66261626A696AFFFFFFFFFFFF737173 +4A484AEEEAEEEEEAEE414441737573FFFFFFFFFFFF0000004A484AEEEAEEEEEAEE4A484A +737573FFFFFFFFFFFF000000FFFFFFFFFFFF838183414441E6E2E6F6F2F66261626A696A +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A696A949594FFFFFFE6E2E6080C08F6F6F6FFFFFF +9495946A696AFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +525552E6E2E6F6F6F6838183313431FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF838183414441E6E2E6F6F2F6626162 +6A696AFFFFFFFFFFFF292829BDBEBDF6F6F6F6F2F66A6D6A5A595AFFFFFFFFFFFF000000 +5A595AEEEAEEFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF101410ACAEACFFFAFF +E6E2E6626562FFFFFFFFFFFF000000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFF +FFFFFF838183414441E6E2E6F6F2F66261626A696AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF101410ACAEACFFFAFFE6E2E6626562FFFFFFFFFFFF292829BDBEBDF6F6F6F6F2F6 +6A6D6A5A595AFFFFFFFFFFFF000000FFFFFFFFFFFF7375734A484AEEEAEEEEEAEE4A484A +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEEEF2EEF6EEEEF6EEEEEEEEE6EEEAE6 +EEEAE6EEE6DEE6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A595A5A5D5A5A5D5AFFFFFF181818 +DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000DEDADEFFFFFFFFFFFFDEDADE +181C18FFFFFFFFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFFFFFFFF181818 +DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000DEDADEFFFFFFFFFFFFDEDADE +181C18FFFFFFFFFFFF000000FFFFFFFFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B2B4525552FFFFFF838583101410A4A1A4FFFFFF +525552B4B2B4FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE +101410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6101410FFFFFFFFFFFF000000 +E6E6E6FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF181C18949194E6E2E6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFF +FFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF181C18949194E6E2E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +F6F6F6101410FFFFFFFFFFFF000000FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6EEEEEEF2EEF6EEEEEEEEE6F6EAEE +EEEAE6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE000000DEDEDEFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF +000400FFFFFFFFFFFF000400000000000000000000000000000000FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF +000400FFFFFFFFFFFF000000FFFFFFFFFFFF000400000000000000000000000000000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F2F6181C18FFFFFF292C29B4B2B4393C39FFFFFF +181C18F6F6F6FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000400000000000000000000000000 +000000FFFFFFFFFFFFC5C6C5393C39080808000000000000000000FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFCDCACD4A4C4A101410 +181C18ACAEACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFF000400000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFCDCACD4A4C4A101410181C18ACAEACFFFFFFFFFFFFC5C6C5393C39080808000000 +000000000000FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6EEF2EEF6F2EEEEEEE6F6EAEEEEEEE6 +EEE6E6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF181818 +DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000400F6F6F6FFFFFFFFFFFFEEEEEE +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000DEDADEFFFFFFFFFFFFDEDADE +181C18FFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181818 +DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000DEDADEFFFFFFFFFFFFDEDADE +181C18FFFFFFFFFFFF000000FFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF414041ACAAAC393839FFFFFF313031B4B2B4 +414041FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF181C18ACAAACF6F2F6FFFFFFF6F2F6000000FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +B4B6B4181818FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFB4B6B4181818FFFFFFFFFFFF181C18ACAAACF6F2F6FFFFFF +F6F2F6000000FFFFFFFFFFFF000000FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6F2EEF6EEEEF6EEEEEEEEE6EEEAE6 +EEEAE6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF737173 +4A4C4AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFF313431838183F6F6F6E6E6E6525552 +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000004A4C4AEEEAEEEEEAEE4A484A +737573FFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552FFFFFFFFFFFF737173 +4A4C4AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFF0000004A4C4AEEEAEEEEEAEE4A484A +737573FFFFFFFFFFFF000000FFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B898B181C18949594FFFFFF8B8D8B181C18 +8B898BFFFFFFFFFFFF000000FFFFFFFFFFFF101010D5D6D5FFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5 +525552FFFFFFFFFFFF101010B4B2B4FFFAFFDEDEDE525552000000FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF101010D5D6D5FFFFFFFFFFFFFFFFFF5A595ADEDADEFFFAFF +B4B6B4101410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF5A595ADEDADEFFFAFFB4B6B4101410FFFFFFFFFFFF101010B4B2B4FFFAFFDEDEDE +525552000000FFFFFFFFFFFF000000FFFFFFFFFFFF7375734A4C4AEEEAEEEEEAEE4A4C4A +000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE +EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEF6EEEEEEEEE6F6EAEEEEEAE6 +EEEAE6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFF6F6F6 +626162080C08080C08626562F6F6F6FFFFFFFFFFFFCDCECD313031000400181C18949594 +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000008B898B101410080808626162 +F6F6F6FFFFFFFFFFFFFFFFFF838583181C18000400292C29ACAAACFFFFFFFFFFFFF6F6F6 +626162080C08080C08626562F6F6F6FFFFFFFFFFFF0000008B898B101410080808626162 +F6F6F6FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF838583181C18000400292C29ACAAAC +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDCECD000400EEEAEEFFFFFFE6E6E6000000 +D5D2D5FFFFFFFFFFFF000000FFFFFFFFFFFF838583080C08000000FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF838583181C18000400292C29 +ACAAACFFFFFFFFFFFFB4B2B4202020000400202020949594000000FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF838583080C08000000FFFFFFFFFFFFA4A5A4202420000400 +292829BDBABDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5C6C5393839FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFF838583181C18000400292C29ACAAACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFA4A5A4202420000400292829BDBABDFFFFFFFFFFFFB4B2B4202020000400202020 +949594000000FFFFFFFFFFFF000000FFFFFFFFFFFFF6F6F66261620808081014108B898B +000000FFFFFFFFFFFFC5C6C5393839FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC6289B46289B4628DAC +6289B46289B45A8DAC6289B4628DAC6289B4628DAC6289B46289B4628DAC5A8DAC6289B4 +628DAC628DB46289B4628DAC6289B46289B4628DB45A8DAC6289B4628DAC6289B4628DB4 +628DAC6289B45A8DAC6289B4628DB46289B4628DAC6289B4628DB46289B4628DAC6289B4 +628DB46289B4628DAC6289B45A8DAC628DB46289B4628DAC6289B46289B46289B45A8DAC +6289B45A8DAC6289B4628DB4628DB46289B45A8DAC6289B4628DB46289B4628DAC6289B4 +628DAC6289B4628DB46289B46289B45A8DAC628DB46289B4628DAC6289B46289B4628DAC +6289B4628DB45A8DAC628DAC6289B46289B4628DAC6289B46289B46289B46289B4628DAC +628DB4628DB46289B45A8DAC6289B4628DAC6289B4628DAC6289B46289B46289B46289B4 +5A8DAC628DAC628DAC6289B4628DB4628DAC5A8DAC6289B4628DAC5A8DAC6289B46289B4 +628DAC628DB46289B4628DAC6289B46289B4628DAC6289B45A8DAC628DAC6289B4628DB4 +6289B45A8DAC6289B45A8DAC628DB46289B46289B4628DAC6289B46289B45A8DAC6289B4 +628DAC6289B4628DAC6289B46289B4628DAC5A8DAC6289B4628DAC628DB46289B4628DAC +6289B46289B4628DB45A8DAC6289B4628DAC6289B4628DB4628DAC6289B45A8DAC6289B4 +628DB46289B4628DAC6289B4628DB46289B4628DAC6289B4628DB46289B4628DAC6289B4 +5A8DAC628DB46289B4628DAC6289B46289B46289B45A8DAC6289B45A8DAC6289B4628DB4 +628DB46289B45A8DAC6289B4628DB46289B4628DAC6289B4628DAC6289B4628DB46289B4 +6289B45A8DAC628DB46289B4628DAC6289B46289B4628DAC6289B4628DB45A8DAC628DAC +6289B46289B4628DAC6289B46289B46289B46289B4628DAC628DB4628DB46289B45A8DAC +6289B4628DAC6289B4628DAC6289B46289B46289B46289B45A8DAC628DAC628DAC6289B4 +628DB4628DAC5A8DAC6289B4628DAC5A8DAC6289B46289B4628DAC628DB46289B4628DAC +6289B46289B4628DAC6289B45A8DAC628DAC6289B4628DB46289B45A8DAC6289B45A8DAC +628DB46289B46289B4628DAC6289B46289B45A8DAC6289B4628DAC6289B4628DAC6289B4 +6289B4628DAC5A8DAC6289B4628DAC628DB46289B4628DAC6289B46289B4628DB45A8DAC +6289B4628DAC6289B4628DB4628DAC6289B45A8DAC6289B4628DB46289B4628DAC6289B4 +628DB46289B4628DAC6289B4628DB46289B4628DAC6289B45A8DAC628DB46289B4628DAC +6289B46289B46289B45A8DAC6289B45A8DAC6289B4628DB4628DB46289B45A8DACC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6EEEEEEF2E6F6EEEEEEEEE6EEEEE6 +EEEAE6E6EADEE6E6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF414041BDBEBDFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF414041BDBEBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC5A89AC6289AC6289B4 +5A89AC6289AC6289B46289AC6289B46289AC5A89AC6289B45A89AC6289AC6289B46289AC +6289B45A89AC6289B46289AC6289AC6289AC6289B46289B45A89AC6289B45A89AC6289B4 +5A89AC6289B46289AC5A89AC6289B45A89AC6289B45A89AC6289B45A89AC6289AC5A89AC +6289B45A89AC6289AC6289AC6289B45A89AC6289AC6289AC6289B45A89AC6289AC6289B4 +6289AC6289AC6289B45A89AC6289B45A89AC6289AC6289B45A89AC6289B45A89AC6289B4 +6289B45A89AC6289B45A89AC6289AC6289B46289AC6289B46289AC6289AC5A89AC6289B4 +5A89AC6289B46289AC6289B46289AC5A89AC6289B45A89AC6289AC5A89AC6289AC6289B4 +5A89AC6289B45A89AC6289B45A89AC6289B45A89AC6289B46289AC5A89AC6289AC6289B4 +6289AC6289B46289AC5A89AC6289B46289AC6289B46289AC6289B46289B46289AC5A89AC +6289B45A89AC6289B46289AC5A89AC6289AC6289AC6289AC6289B46289AC5A89AC6289AC +6289B46289AC5A89AC6289B46289B45A89AC6289AC6289B45A89AC6289AC6289B46289AC +6289B46289AC5A89AC6289B45A89AC6289AC6289B46289AC6289B45A89AC6289B46289AC +6289AC6289AC6289B46289B45A89AC6289B45A89AC6289B45A89AC6289B46289AC5A89AC +6289B45A89AC6289B45A89AC6289B45A89AC6289AC5A89AC6289B45A89AC6289AC6289AC +6289B45A89AC6289AC6289AC6289B45A89AC6289AC6289B46289AC6289AC6289B45A89AC +6289B45A89AC6289AC6289B45A89AC6289B45A89AC6289B46289B45A89AC6289B45A89AC +6289AC6289B46289AC6289B46289AC6289AC5A89AC6289B45A89AC6289B46289AC6289B4 +6289AC5A89AC6289B45A89AC6289AC5A89AC6289AC6289B45A89AC6289B45A89AC6289B4 +5A89AC6289B45A89AC6289B46289AC5A89AC6289AC6289B46289AC6289B46289AC5A89AC +6289B46289AC6289B46289AC6289B46289B46289AC5A89AC6289B45A89AC6289B46289AC +5A89AC6289AC6289AC6289AC6289B46289AC5A89AC6289AC6289B46289AC5A89AC6289B4 +6289B45A89AC6289AC6289B45A89AC6289AC6289B46289AC6289B46289AC5A89AC6289B4 +5A89AC6289AC6289B46289AC6289B45A89AC6289B46289AC6289AC6289AC6289B46289B4 +5A89AC6289B45A89AC6289B45A89AC6289B46289AC5A89AC6289B45A89AC6289B45A89AC +6289B45A89AC6289AC5A89AC6289B45A89AC6289AC6289AC6289B45A89AC6289AC6289AC +6289B45A89AC6289AC6289B46289AC6289AC6289B45A89AC6289B45A89AC6289ACC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEF6EEEEEEEEEEF6EAEEEEEAE6 +EEEAE6EEE6E6EEE6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC6285B46289AC5A89AC +6285B46289AC5A89AC6289AC5A89AC6289AC6285B45A89AC6289AC6285B45A89AC5A89AC +6289AC6289AC6285B46289AC5A89AC6285B45A89AC6289AC6289AC6289AC6289AC6289AC +6289AC6289AC5A89AC6285B45A89AC6285B46289AC6289AC5A89AC6285B46289AC5A89AC +6285B46289AC6285B45A89AC6289AC5A89AC6289AC5A89AC5A89AC6285B46289AC5A89AC +6289AC6285B45A89AC6289AC5A89AC6285B46289AC5A89AC6289AC5A89AC6289AC5A89AC +6289AC6289AC6289AC5A89AC6289AC5A89AC6289AC5A89AC6285B46285B45A89AC6289AC +6285B45A89AC6289AC5A89AC6289AC6289AC5A89AC6289AC6289AC6285B46289AC5A89AC +6289AC6289AC6289AC5A89AC6289AC6285B45A89AC6289AC6289AC6289AC6285B45A89AC +6289AC5A89AC6285B46289AC5A89AC5A89AC6289AC5A89AC6285B45A89AC5A89AC6289AC +6289AC6289AC5A89AC6289AC6285B46285B45A89AC6285B45A89AC6285B46289AC6289AC +5A89AC6289AC6289AC5A89AC6289AC6285B46289AC5A89AC6285B46289AC5A89AC6289AC +5A89AC6289AC6285B45A89AC6289AC6285B45A89AC5A89AC6289AC6289AC6285B46289AC +5A89AC6285B45A89AC6289AC6289AC6289AC6289AC6289AC6289AC6289AC5A89AC6285B4 +5A89AC6285B46289AC6289AC5A89AC6285B46289AC5A89AC6285B46289AC6285B45A89AC +6289AC5A89AC6289AC5A89AC5A89AC6285B46289AC5A89AC6289AC6285B45A89AC6289AC +5A89AC6285B46289AC5A89AC6289AC5A89AC6289AC5A89AC6289AC6289AC6289AC5A89AC +6289AC5A89AC6289AC5A89AC6285B46285B45A89AC6289AC6285B45A89AC6289AC5A89AC +6289AC6289AC5A89AC6289AC6289AC6285B46289AC5A89AC6289AC6289AC6289AC5A89AC +6289AC6285B45A89AC6289AC6289AC6289AC6285B45A89AC6289AC5A89AC6285B46289AC +5A89AC5A89AC6289AC5A89AC6285B45A89AC5A89AC6289AC6289AC6289AC5A89AC6289AC +6285B46285B45A89AC6285B45A89AC6285B46289AC6289AC5A89AC6289AC6289AC5A89AC +6289AC6285B46289AC5A89AC6285B46289AC5A89AC6289AC5A89AC6289AC6285B45A89AC +6289AC6285B45A89AC5A89AC6289AC6289AC6285B46289AC5A89AC6285B45A89AC6289AC +6289AC6289AC6289AC6289AC6289AC6289AC5A89AC6285B45A89AC6285B46289AC6289AC +5A89AC6285B46289AC5A89AC6285B46289AC6285B45A89AC6289AC5A89AC6289AC5A89AC +5A89AC6285B46289AC5A89AC6289AC6285B45A89AC6289AC5A89AC6285B46289ACC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F2EEEEF2EEF6EEEEEEEEE6EEEAE6EEEEE6 +EEEAE6E6EADEEEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC5A89AC6285AC6285AC +5A89AC6285AC5A89AC6285AC6285AC5A89AC6285AC5A89AC5A89AC5A89AC5A89AC6285AC +5A89AC6285AC5A89AC5A89AC6285AC6285AC5A89AC6285AC5A89AC6285AC5A89AC5A89AC +5A89AC6285AC6285AC6285AC5A89AC6285AC5A89AC6285AC6285AC5A89AC6285AC6285AC +5A89AC5A89AC5A89AC6285AC5A89AC6285AC5A89AC6285AC6285AC5A89AC5A89AC6285AC +5A89AC5A89AC6285AC6285AC6285AC5A89AC6285AC6285AC5A89AC6285AC5A89AC5A89AC +6285AC5A89AC6285AC6285AC5A89AC5A89AC6285AC5A89AC5A89AC5A89AC6285AC6285AC +5A89AC6285AC5A89AC6285AC5A89AC5A89AC6285AC5A89AC5A89AC5A89AC6285AC5A89AC +6285AC5A89AC6285AC6285AC5A89AC6285AC5A89AC6285AC5A89AC6285AC5A89AC6285AC +5A89AC6285AC5A89AC6285AC6285AC6285AC5A89AC6285AC5A89AC6285AC6285AC5A89AC +6285AC5A89AC5A89AC6285AC5A89AC5A89AC6285AC5A89AC5A89AC5A89AC6285AC5A89AC +6285AC5A89AC6285AC5A89AC6285AC5A89AC6285AC6285AC5A89AC6285AC5A89AC6285AC +6285AC5A89AC6285AC5A89AC5A89AC5A89AC5A89AC6285AC5A89AC6285AC5A89AC5A89AC +6285AC6285AC5A89AC6285AC5A89AC6285AC5A89AC5A89AC5A89AC6285AC6285AC6285AC +5A89AC6285AC5A89AC6285AC6285AC5A89AC6285AC6285AC5A89AC5A89AC5A89AC6285AC +5A89AC6285AC5A89AC6285AC6285AC5A89AC5A89AC6285AC5A89AC5A89AC6285AC6285AC +6285AC5A89AC6285AC6285AC5A89AC6285AC5A89AC5A89AC6285AC5A89AC6285AC6285AC +5A89AC5A89AC6285AC5A89AC5A89AC5A89AC6285AC6285AC5A89AC6285AC5A89AC6285AC +5A89AC5A89AC6285AC5A89AC5A89AC5A89AC6285AC5A89AC6285AC5A89AC6285AC6285AC +5A89AC6285AC5A89AC6285AC5A89AC6285AC5A89AC6285AC5A89AC6285AC5A89AC6285AC +6285AC6285AC5A89AC6285AC5A89AC6285AC6285AC5A89AC6285AC5A89AC5A89AC6285AC +5A89AC5A89AC6285AC5A89AC5A89AC5A89AC6285AC5A89AC6285AC5A89AC6285AC5A89AC +6285AC5A89AC6285AC6285AC5A89AC6285AC5A89AC6285AC6285AC5A89AC6285AC5A89AC +5A89AC5A89AC5A89AC6285AC5A89AC6285AC5A89AC5A89AC6285AC6285AC5A89AC6285AC +5A89AC6285AC5A89AC5A89AC5A89AC6285AC6285AC6285AC5A89AC6285AC5A89AC6285AC +6285AC5A89AC6285AC6285AC5A89AC5A89AC5A89AC6285AC5A89AC6285AC5A89AC6285AC +6285AC5A89AC5A89AC6285AC5A89AC5A89AC6285AC6285AC6285AC5A89AC6285ACC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEF6EEEEEEEEE6EEEAEEEEEAE6 +EEE6E6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC5A85AC5A85AC5A89A4 +6285AC5A89AC6285AC5A89A45A85AC6285AC6285AC6285AC6285AC6285AC6285AC6285AC +5A89A45A85AC6285AC5A85AC6285AC5A89AC6285AC5A89A46285AC5A85AC6285AC6285AC +5A85AC5A89A46285AC5A85AC5A85AC6285AC5A85AC6285AC5A89AC5A85AC6285AC5A89A4 +6285AC6285AC6285AC5A89AC6285AC5A85AC6285AC5A85AC5A89A45A89AC6285AC5A85AC +6285AC6285AC5A85AC5A85AC5A89AC6285AC5A89A45A85AC6285AC5A89AC6285AC5A89AC +6285AC6285AC5A85AC5A89A46285AC5A89A46285AC6285AC6285AC5A85AC5A89A46285AC +5A85AC6285AC6285AC5A89A46285AC6285AC6285AC5A85AC6285AC6285AC5A85AC6285AC +5A85AC5A85AC6285AC5A85AC6285AC5A85AC6285AC5A85AC6285AC5A89AC6285AC6285AC +6285AC5A85AC6285AC5A89A45A85AC5A85AC6285AC6285AC5A89AC6285AC5A89A46285AC +5A89AC6285AC6285AC5A89AC5A85AC6285AC5A89A46285AC6285AC6285AC5A85AC6285AC +5A85AC6285AC5A85AC6285AC6285AC5A85AC5A85AC5A89A46285AC5A89AC6285AC5A89A4 +5A85AC6285AC6285AC6285AC6285AC6285AC6285AC6285AC5A89A45A85AC6285AC5A85AC +6285AC5A89AC6285AC5A89A46285AC5A85AC6285AC6285AC5A85AC5A89A46285AC5A85AC +5A85AC6285AC5A85AC6285AC5A89AC5A85AC6285AC5A89A46285AC6285AC6285AC5A89AC +6285AC5A85AC6285AC5A85AC5A89A45A89AC6285AC5A85AC6285AC6285AC5A85AC5A85AC +5A89AC6285AC5A89A45A85AC6285AC5A89AC6285AC5A89AC6285AC6285AC5A85AC5A89A4 +6285AC5A89A46285AC6285AC6285AC5A85AC5A89A46285AC5A85AC6285AC6285AC5A89A4 +6285AC6285AC6285AC5A85AC6285AC6285AC5A85AC6285AC5A85AC5A85AC6285AC5A85AC +6285AC5A85AC6285AC5A85AC6285AC5A89AC6285AC6285AC6285AC5A85AC6285AC5A89A4 +5A85AC5A85AC6285AC6285AC5A89AC6285AC5A89A46285AC5A89AC6285AC6285AC5A89AC +5A85AC6285AC5A89A46285AC6285AC6285AC5A85AC6285AC5A85AC6285AC5A85AC6285AC +6285AC5A85AC5A85AC5A89A46285AC5A89AC6285AC5A89A45A85AC6285AC6285AC6285AC +6285AC6285AC6285AC6285AC5A89A45A85AC6285AC5A85AC6285AC5A89AC6285AC5A89A4 +6285AC5A85AC6285AC6285AC5A85AC5A89A46285AC5A85AC5A85AC6285AC5A85AC6285AC +5A89AC5A85AC6285AC5A89A46285AC6285AC6285AC5A89AC6285AC5A85AC6285AC5A85AC +5A89A45A89AC6285AC5A85AC6285AC6285AC5A85AC5A85AC5A89AC6285AC5A89A4C5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6EEEEEEF2EEF6EEEEEEEEE6EEEAE6 +EEEAE6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC6285AC6285AC6285AC +5A85A46285AC5A85AC6285AC5A85AC5A85A45A85A45A85AC5A85A46285AC5A85A45A85A4 +6285AC5A85AC5A85A46285AC5A85A46285AC5A85A46285AC5A85AC5A85A46285AC5A85A4 +5A85AC6285AC5A85A45A85AC6285AC5A85A46285AC5A85A45A85AC6285AC5A85A46285AC +5A85A45A85A46285AC6285AC5A85A46285AC5A85AC5A85AC6285AC5A85AC6285AC5A85A4 +5A85A46285AC5A85A46285AC6285AC5A85AC5A85A46285AC5A85A45A85AC5A85AC6285AC +5A85A45A85AC6285AC6285AC5A85AC6285AC5A85A45A85A45A85A46285AC5A85AC5A85A4 +6285AC5A85A45A85AC5A85A45A85AC5A85A46285AC5A85A45A85AC5A85A46285AC5A85A4 +6285AC5A85A46285AC5A85A45A85AC6285AC5A85A45A85AC5A85AC6285AC5A85A45A85A4 +5A85AC5A85A46285AC5A85AC6285AC5A85A45A85AC5A85A46285AC5A85AC5A85AC6285AC +5A85AC5A85AC5A85A46285AC5A85AC6285AC5A85AC5A85AC5A85A45A85A46285AC5A85A4 +6285AC5A85A45A85A46285AC5A85A46285AC6285AC6285AC5A85A46285AC5A85AC6285AC +5A85AC5A85A45A85A45A85AC5A85A46285AC5A85A45A85A46285AC5A85AC5A85A46285AC +5A85A46285AC5A85A46285AC5A85AC5A85A46285AC5A85A45A85AC6285AC5A85A45A85AC +6285AC5A85A46285AC5A85A45A85AC6285AC5A85A46285AC5A85A45A85A46285AC6285AC +5A85A46285AC5A85AC5A85AC6285AC5A85AC6285AC5A85A45A85A46285AC5A85A46285AC +6285AC5A85AC5A85A46285AC5A85A45A85AC5A85AC6285AC5A85A45A85AC6285AC6285AC +5A85AC6285AC5A85A45A85A45A85A46285AC5A85AC5A85A46285AC5A85A45A85AC5A85A4 +5A85AC5A85A46285AC5A85A45A85AC5A85A46285AC5A85A46285AC5A85A46285AC5A85A4 +5A85AC6285AC5A85A45A85AC5A85AC6285AC5A85A45A85A45A85AC5A85A46285AC5A85AC +6285AC5A85A45A85AC5A85A46285AC5A85AC5A85AC6285AC5A85AC5A85AC5A85A46285AC +5A85AC6285AC5A85AC5A85AC5A85A45A85A46285AC5A85A46285AC5A85A45A85A46285AC +5A85A46285AC6285AC6285AC5A85A46285AC5A85AC6285AC5A85AC5A85A45A85A45A85AC +5A85A46285AC5A85A45A85A46285AC5A85AC5A85A46285AC5A85A46285AC5A85A46285AC +5A85AC5A85A46285AC5A85A45A85AC6285AC5A85A45A85AC6285AC5A85A46285AC5A85A4 +5A85AC6285AC5A85A46285AC5A85A45A85A46285AC6285AC5A85A46285AC5A85AC5A85AC +6285AC5A85AC6285AC5A85A45A85A46285AC5A85A46285AC6285AC5A85AC5A85A4C5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEF6F2EEF6EEEEEEEEE6EEEAE6EEEEE6 +EEE6E6EEE6E6E6E6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC5A85A45A85A45A85A4 +5A85AC6281AC5A85A45A85AC5A85A46281AC5A85A45A85AC5A85A4FFFFFF5A85AC5A85AC +5A85A45A85A46281AC5A85A45A85A45A85AC5A85A46281AC5A85A46281AC5A85A46281AC +5A85A46281AC5A85A46281AC5A85A46281AC5A85A46281AC5A85A45A85A45A85AC5A85A4 +5A85AC6281AC5A85A45A85A45A85AC5A85A45A85A45A85AC5A85A45A85A46281AC5A85A4 +6281AC5A85A45A85AC6281AC5A85A46281AC5A85A45A85AC5A85A46281AC5A85A46281AC +5A85A45A85AC5A85A45A85A45A85A45A85AC5A85AC6281AC5A85AC5A85A45A85A46281AC +5A85A45A85AC6281AC5A85AC6281AC5A85AC5A85A45A85AC5A85A4FFFFFF6281AC5A85A4 +5A85AC5A85A45A85A45A85AC6281AC5A85A45A85AC5A85A45A85AC5A85A45A85AC6281AC +5A85AC6281AC5A85A45A85AC5A85A45A85AC6281AC5A85A45A85AC5A85A46281AC5A85A4 +5A85AC5A85A45A85AC5A85A45A85A45A85A45A85AC5A85A46281AC5A85AC5A85A46281AC +5A85A45A85AC6281AC5A85A46281AC5A85A45A85A45A85A45A85AC6281AC5A85A45A85AC +5A85A46281AC5A85A45A85AC5A85A45A85A45A85AC5A85AC5A85A45A85A46281AC5A85A4 +5A85A45A85AC5A85A46281ACFFFFFF6281AC5A85A46281AC5A85A46281AC5A85A46281AC +5A85A46281AC5A85A46281AC5A85A45A85A45A85AC5A85A45A85AC6281AC5A85A45A85A4 +5A85AC5A85A45A85A45A85AC5A85A45A85A46281AC5A85A46281AC5A85A45A85AC6281AC +5A85A46281AC5A85A45A85AC5A85A46281AC5A85A46281AC5A85A45A85AC5A85A45A85A4 +5A85A45A85AC5A85AC6281AC5A85AC5A85A45A85A46281AC5A85A45A85AC6281AC5A85AC +6281AC5A85AC5A85A45A85AC5A85A45A85A46281AC5A85A45A85AC5A85A45A85A45A85AC +6281AC5A85A45A85AC5A85A45A85AC5A85A45A85AC6281AC5A85AC6281AC5A85A45A85AC +5A85A45A85AC6281AC5A85A45A85AC5A85A46281AC5A85A45A85AC5A85A45A85AC5A85A4 +5A85A45A85A45A85AC5A85A46281AC5A85AC5A85A46281AC5A85A45A85AC6281AC5A85A4 +6281AC5A85A45A85A45A85A45A85AC6281AC5A85A45A85AC5A85A46281AC5A85A45A85AC +5A85A45A85A45A85AC5A85AC5A85A45A85A46281AC5A85A45A85A45A85AC5A85A46281AC +5A85A46281AC5A85A46281AC5A85A46281AC5A85A46281AC5A85A46281AC5A85A46281AC +5A85A45A85A45A85AC5A85A45A85AC6281AC5A85A45A85A45A85AC5A85A45A85A45A85AC +5A85A45A85A46281AC5A85A46281AC5A85A45A85AC6281AC5A85A46281AC5A85A4C5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEEEF2E6F6EEEEEEEEE6F6EAEE +EEEAE6EEE6DEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC5A81A45A81A46281AC +5A85A45A85A45A81A45A85A45A81AC5A81A45A85A46281AC5A81A4FFFFFF5A85A45A81AC +5A81A45A81AC5A85A45A81A45A85A45A81AC5A85A45A85A45A81A45A81A45A85A45A85A4 +5A81A45A85A45A81A45A85A45A85A45A81A45A81A45A85A45A81AC5A81A45A85A46281AC +FFFFFF5A85A46281AC5A85A46281AC5A85A45A81AC5A85A45A81A45A81AC5A85A45A81A4 +5A85A45A81AC5A85A45A85A45A81A45A85A46281AC5A85A45A81AC5A81A45A85A45A81A4 +5A81A45A85A46281AC5A81A46281AC5A85A45A85A45A85A45A85A46281AC5A81A45A85A4 +5A81A45A85A45A85A45A85A45A81A45A85A45A81AC5A85A46281ACFFFFFF5A85A45A81A4 +6281AC5A85A46281AC5A85A45A85A45A81AC5A85A46281AC5A85A45A81A45A85A45A85A4 +5A85A45A85A45A81A45A85A45A85A45A81A45A85A45A85A45A81AC5A85A45A81A45A85A4 +5A81AC5A85A46281AC5A85A45A81AC5A81A45A85A46281AC5A85A45A85A45A81AC5A85A4 +5A81A45A85A45A81A45A85A45A85A45A81A45A81A46281AC5A85A45A85A45A81A45A85A4 +5A81AC5A81A45A85A46281AC5A81A45A81AC5A85A45A81AC5A81A45A81AC5A85A45A81A4 +5A85A45A81AC5A85A45A85A4FFFFFF5A81A45A85A45A85A45A81A45A85A45A81A45A85A4 +5A85A45A81A45A81A45A85A45A81AC5A81A45A85A46281AC5A85A45A85A46281AC5A85A4 +6281AC5A85A45A81AC5A85A45A81A45A81AC5A85A45A81A45A85A45A81AC5A85A45A85A4 +5A81A45A85A46281AC5A85A45A81AC5A81A45A85A45A81A45A81A45A85A46281AC5A81A4 +6281AC5A85A45A85A45A85A45A85A46281AC5A81A45A85A45A81A45A85A45A85A45A85A4 +5A81A45A85A45A81AC5A85A46281AC5A81A45A85A45A81A46281AC5A85A46281AC5A85A4 +5A85A45A81AC5A85A46281AC5A85A45A81A45A85A45A85A45A85A45A85A45A81A45A85A4 +5A85A45A81A45A85A45A85A45A81AC5A85A45A81A45A85A45A81AC5A85A46281AC5A85A4 +5A81AC5A81A45A85A46281AC5A85A45A85A45A81ACFFFFFF5A81A45A85A45A81A45A85A4 +5A85A45A81A45A81A46281AC5A85A45A85A45A81A45A85A45A81AC5A81A45A85A46281AC +5A81A45A81AC5A85A45A81AC5A81A45A81AC5A85A45A81A45A85A45A81AC5A85A45A85A4 +5A81A45A81A45A85A45A85A45A81A45A85A45A81A45A85A45A85A45A81A45A81A45A85A4 +5A81AC5A81A45A85A46281AC5A85A45A85A46281AC5A85A46281AC5A85A45A81AC5A85A4 +5A81A45A81AC5A85A45A81A45A85A45A81AC5A85A45A85A45A81A45A85A46281ACC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6F2EEF6EEEEEEEEEEF6EAEEEEEAE6 +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC5A85A45A85A45A81A4 +5A81A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A81A4FFFFFF6281AC5A81A4 +5A85A45A81A45A81A45A81A46281AC5A81A45A81A45A81A45A85A45A81A46281AC5A81A4 +5A81A45A85A45A81A45A81A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A85A4 +5A81A45A81A45A81A45A81A45A85A45A85A45A81A45A85A46281AC5A81A45A81A45A81A4 +5A81A45A81A46281AC5A81A45A81A45A81A45A81A45A81A45A81A45A85A45A81A45A81A4 +5A85A45A81A45A81A45A85A45A81A45A81A45A85A45A81A45A81A45A81A45A81A45A85A4 +6281AC5A85A45A81A46281AC5A85A46281AC5A85A45A81A45A81A4FFFFFF5A81A45A85A4 +5A81A45A81A45A81A45A81A45A81A45A85A45A81A45A85A45A81A45A85A46281AC5A81A4 +6281AC5A81A45A85A45A81A45A81A46281AC5A81A46281AC5A85A45A81A46281AC5A85A4 +5A81A45A81A45A85A45A81A45A85A45A81A45A81A45A85A45A81A45A81A45A81A45A81A4 +6281AC5A85A45A81A45A81A46281AC5A85A45A85A45A81A45A81A45A81A45A85A45A81A4 +5A85A45A81A45A85A45A81A45A81A45A81A46281AC5A81A45A85A45A81A45A81A45A81A4 +6281AC5A81A45A81A45A81A4FFFFFF5A81A46281AC5A81A45A81A45A85A45A81A45A81A4 +5A81A45A85A45A81A46281AC5A81A45A81A45A81A45A85A45A81A45A81A45A81A45A81A4 +5A85A45A85A45A81A45A85A46281AC5A81A45A81A45A81A45A81A45A81A46281AC5A81A4 +5A81A45A81A45A81A45A81A45A81A45A85A45A81A45A81A45A85A45A81A45A81A45A85A4 +5A81A45A81A45A85A45A81A45A81A45A81A45A81A45A85A46281AC5A85A45A81A46281AC +5A85A46281AC5A85A45A81A45A81A45A85A45A81A45A85A45A81A45A81A45A81A45A81A4 +5A81A45A85A45A81A45A85A45A81A45A85A46281AC5A81A46281AC5A81A45A85A45A81A4 +5A81A46281AC5A81A46281AC5A85A45A81A46281AC5A85A45A81A45A81A45A85A45A81A4 +5A85A45A81A45A81A45A85A45A81A45A81A45A81A45A81A46281AC5A85A45A81A45A81A4 +6281AC5A85A45A85A45A81A45A81A45A81A45A85A45A81A45A85A45A81A45A85A45A81A4 +5A81A45A81A46281AC5A81A45A85A45A81A45A81A45A81A46281AC5A81A45A81A45A81A4 +5A85A45A81A46281AC5A81A45A81A45A85A45A81A45A81A45A81A45A85A45A81A46281AC +5A81A45A81A45A81A45A85A45A81A45A81A45A81A45A81A45A85A45A85A45A81A45A85A4 +6281AC5A81A45A81A45A81A45A81A45A81A46281AC5A81A45A81A45A81A45A81A4C5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEF6EEEEEEEEE6EEEAEEEEEEE6 +EEEAE6E6EADEEEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC5A7DA45A81A45A81A4 +5A7DA45A819C5A81A45A7DA4FFFFFF5A81A45A819C5A81A45A81A4FFFFFF5A819C5A81A4 +5A7DA45A81A45A81A45A81A45A81A45A819C5A7DA45A81A45A7DA45A819C5A7DA45A819C +5A81A45A81A45A81A45A7DA45A81A45A7DA45A81A4FFFFFF5A819C5A7DA45A81A45A81A4 +5A81A45A7DA45A819C5A81A45A7DA45A81A45A81A45A81A45A81A45A81A45A81A45A7DA4 +5A81A45A81A45A81A45A819C5A7DA45A819C5A7DA45A81A45A81A45A7DA45A81A45A81A4 +5A7DA45A81A45A819C5A7DA45A81A45A81A45A81A45A7DA45A81A45A81A45A819C5A7DA4 +5A819C5A7DA45A81A45A81A45A81A45A81A45A819C5A81A45A81A4FFFFFF5A81A45A81A4 +5A81A45A7DA45A81A45A7DA45A81A45A7DA45A81A45A81A45A81A45A81A45A819C5A7DA4 +5A81A45A81A45A7DA45A81A45A7DA45A819C5A81A45A819C5A81A45A81A45A81A45A81A4 +5A819C5A7DA45A81A45A81A45A7DA45A81A45A7DA45A81A45A81A45A81A45A7DA45A819C +5A81A45A81A45A81A45A81A45A81A45A7DA45A81A45A81A45A7DA45A819C5A81A45A7DA4 +5A81A45A81A45A819C5A81A45A81A45A81A45A819C5A81A45A7DA45A81A45A81A45A81A4 +5A81A45A819C5A7DA45A81A4FFFFFF5A819C5A7DA45A819C5A81A45A81A45A81A45A7DA4 +5A81A45A7DA45A81A45A81A45A819C5A7DA45A81A45A81A45A81A45A7DA45A819C5A81A4 +5A7DA45A81A45A81A45A81A45A81A45A81A45A81A45A7DA45A81A45A81A45A81A45A819C +5A7DA45A819C5A7DA45A81A45A81A45A7DA45A81A45A81A45A7DA45A81A45A819C5A7DA4 +5A81A45A81A45A81A45A7DA45A81A45A81A45A819C5A7DA45A819C5A7DA45A81A45A81A4 +5A81A45A81A45A819C5A81A45A81A45A7DA45A81A45A81A45A81A45A7DA45A81A45A7DA4 +5A81A45A7DA45A81A45A81A45A81A45A81A45A819C5A7DA45A81A45A81A45A7DA45A81A4 +5A7DA45A819C5A81A45A819C5A81A45A81A45A81A45A81A45A819C5A7DA45A81A45A81A4 +5A7DA45A81A45A7DA45A81A45A81A45A81A45A7DA45A819C5A81A45A81A45A81A45A81A4 +5A81A45A7DA45A81A45A81A45A7DA45A819C5A81A45A7DA45A81A45A81A45A819C5A81A4 +5A81A45A81A45A819C5A81A45A7DA45A81A45A81A45A81A45A81A45A819C5A7DA45A81A4 +5A7DA45A819C5A7DA45A819C5A81A45A81A45A81A45A7DA45A81A45A7DA45A81A45A81A4 +5A819C5A7DA45A81A45A81A45A81A45A7DA45A819C5A81A45A7DA45A81A45A81A45A81A4 +5A81A45A81A45A81A45A7DA45A81A45A81A45A81A45A819C5A7DA45A819C5A7DA4C5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEEEF2EEEEF2EEF6EEEEEEEEE6EEEAE6 +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC5A819C5A81A45A7DA4 +5A81A45A7DA45A81A45A819CFFFFFF5A7DA45A7DA45A81A45A7DA4FFFFFF9CB2CDEEF2F6 +FFFFFFDEE6EE7B99AC5A7DA45A81A45A7DA4B4C6D5F6F6F6FFFAFFC5D6E66285AC5A81A4 +5A81A45A7DA45A81A45A7DA45A819C5A819C5A7DA4FFFFFF5A7DA45A81A45A7DA45A7DA4 +FFFFFF5A81A45A7DA4FFFFFF9CB6C5EEEEF6FFFFFFDEE6EE7B95B45A81A45A7DA45A81A4 +5A819C5A7DA4EEEEF67395B45A7DA45A7DA494AEC55A819C5A7DA47399ACEEEEF65A7DA4 +5A85ACBDCEDEF6FAFFF6FAFFBDCED55A81A45A81A45A819C5A81ACBDCEDEF6FAFFF6FAFF +BDCADE5A81A45A819C5A7DA45A85A4C5CEDEFFFAFFF6F2F6A4BACDFFFFFF5A7DA45A819C +FFFFFF9CB6C5EEEEF6FFFFFFE6EAEE83A1B494AEC5E6EEF6FFFFFFE6E6EE7395B45A81A4 +5A7DA47391B4CDDAE6F6FAFFFFFFFFD5DAE66A89AC5A7DA45A7DA4FFFFFF9CB2CDEEF2F6 +FFFFFFDEE6EE7B99B45A7DA45A819C5A7DA45A819C5A7DA45A81A48BA1BDE6EAF6FFFFFF +EEEEF69CB6CD5A7DA45A81A4FFFFFFA4BECDF6F6F6FFFAFFC5CEDE5A81A45A81A45A819C +5A81A4B4C2D5F6F6FFFFFAFFC5D2E66289AC5A7DA45A819C7391ACCDDAE6F6FAFFFFFAFF +D5DEE66A89AC5A81A45A819CFFFFFF5A81A45A7DA47B99B4EEF2F6A4B6CD5A81A48BA1BD +E6EAEEFFFFFFEEEEF69CB6CD5A7DA45A81A45A7DA45A7DA45A7DA45A81A45A7DA45A7DA4 +5A819C5A7DA45A81A45A819C5A7DA45A81A45A7DA45A81A45A819C5A7DA45A7DA45A81A4 +5A7DA45A7DA45A7DA45A819C5A7DA45A819C5A7DA45A7DA45A81A45A7DA45A7DA45A81A4 +5A819C5A7DA45A81A45A819C5A7DA45A7DA45A7DA45A81A45A7DA45A7DA45A819C5A7DA4 +5A81A45A7DA45A7DA45A7DA45A7DA45A819C5A7DA45A819C5A7DA45A819C5A7DA45A81A4 +5A819CB4C6D5F6F6FFFFFAFFC5D2E66289A46285ACF6F6FF6285AC5A81A45A819C5A7DA4 +6289A4F6F6F66285AC5A7DA4B4C2D5F6F6F6FFFAFFC5D6E66285AC5A819C5A81A4FFFFFF +9CB6C5EEEEF6FFFFFFDEE6EE7B99B45A7DA45A81A4FFFFFF5A7DA45A81A4FFFFFF9CB6CD +EEEEF6FFFFFFDEE6EE7B95B45A81A45A7DA46285ACC5D2DEFFFAFFF6F2F6A4BACDFFFFFF +5A7DA45A81A45A7DA45A819C5A819C5A7DA45A819C5A7DA45A81A45A7DA45A81A45A819C +5A7DA45A81A45A7DA45A81A45A81A45A7DA45A81A45A7DA45A819C5A819C5A7DA45A81A4 +5A7DA45A81A45A7DA45A7DA45A7DA45A81A45A7DA45A7DA45A819C5A7DA45A81A45A819C +5A7DA45A81A45A7DA45A81A45A819C5A7DA45A7DA45A81A45A7DA45A7DA45A7DA4C5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6C5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFF000000FFFFFFFFFFFF000000949594181C18000400313031D5D2D5 +FFFFFFFFFFFFDEDEDE4A4C4A080C08000400414441E6E6E6EEEEEE101410EEEEEEFFFFFF +FFFFFFFFFFFFEEEEEE101410EEEEEEFFFFFF7B797B101410080808525552F6F2F6FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B6B4292829000400181C189C999CFFFFFFFFFFFF +F6F6F6626562080C08080C08626562FFFAFFFFFFFFFFFFFF000000949594202020000400 +292829C5C2C5A4A1A4202420000400313031D5D2D5FFFFFFFFFFFFFFFFFF7B797B101410 +080808525552F6F2F6FFFFFF000000000000000000000000FFFFFFFFFFFF000000949594 +181C18000400313031D5D2D5FFFFFFFFFFFF000000FFFFFFFFFFFF000000949594181C18 +000400313031D5D2D5FFFFFFFFFFFFF6F6F65A5D5A0808081014108B898B000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000FFFFFFFFFFFFF6F6F6626562 +080C08080C08626562FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F65A5D5A +0808081014108B898B000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFAFF6261620808081014108B898B000000FFFFFF +FFFFFFFFFFFF7B797B101410080808525552F6F2F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +393C39A4A5A4FFFFFFFFFFFFFFFFFFE6E2E6181818F6F2F6F6F6F6626562080C08080C08 +626562FFFAFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE4A4C4A080C08000400 +414441E6E6E6FFFFFFFFFFFF000000949594181C18000400313031D5D2D5FFFFFFFFFFFF +FFFAFF6261620808081014108B898B000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC5A7D9C5A7DA45A819C +5A7DA45A7DA45A819C5A7DA4FFFFFF5A7DA45A819C5A7DA45A819CFFFFFFCDD6E66A89AC +6281ACACBECDDEE6EE5A7D9C5A7DA4ACBECDD5DEE66A89AC6289A4C5CEDEBDCED55A7DA4 +5A7DA45A819C5A7DA45A7D9C5A7DA45A7D9C5A7DA4FFFFFF5A7DA45A7D9C5A819C5A7DA4 +FFFFFF5A7D9C5A7DA4FFFFFFCDD6E66A89A46281ACACBED5DEE6EE5A819C5A7D9C5A7DA4 +5A7D9C5A7DA4BDCAD59CB2CD5A819C6A8DACF6FAFF6285A45A7DA49CB6C5BDCADE5A7DA4 +B4C6D5CDDAE66A8DA46A89ACD5DEE6B4C2D55A819C5A7DA4B4C6D5CDDAE66A89A46A89AC +D5DEE6B4C2D55A7DA45A7DA4B4C6D5CDDAE66A8DA46A8DA4CDDAE6FFFFFF5A7D9C5A7DA4 +FFFFFFCDD6E66A8DA46281ACACBED5F6FAFFCDD6E66A8DA46281A4ACBED5DEE2EE5A7DA4 +5A819CE6EAF6839DBD62859C6285ACB4C6D5C5D2DE5A7D9C5A819CFFFFFFCDD6E66A91A4 +6281A4ACBED5DEE6EE5A7DA45A7D9C5A7DA45A7DA45A7D9C5A819CF6F6FF94A5C55A859C +6A8DACBDCEDE5A7DA45A819CFFFFFFCDDAE66A89AC6A8DA4D5DAE6B4C2D55A819C5A7DA4 +ACBECDD5DEE66A91A46285ACC5D2DEBDCADE5A7DA45A7DA4E6EAF6839DB46281AC6285A4 +B4C6DEC5D6DE5A7DA45A7DA4FFFFFF5A7DA48BAABDF6F6F68BA5C55A819C5A7DA4F6F6F6 +94A5C55A819C6A8DB4BDCEDE5A7DA45A7D9C5A819C5A7DA45A819C5A7D9C5A7DA45A7D9C +5A7DA45A7D9C5A7DA45A7DA45A7DA45A819C5A7D9C5A7DA45A7D9C5A7DA45A819C5A7DA4 +5A819C5A7D9C5A7DA45A819C5A7DA45A7D9C5A7DA45A7DA45A819C5A7DA45A819C5A7DA4 +5A7DA45A7DA45A819C5A7DA45A7D9C5A7DA45A7D9C5A7DA45A7D9C5A7D9C5A7DA45A7DA4 +5A819C5A7DA45A819C5A819C5A7D9C5A7DA45A7D9C5A7DA45A7D9C5A7DA45A7D9C5A7DA4 +ACBED5D5DEE66A89AC6285A4C5CEDEBDCADE5A7D9CBDCADEA4BACD5A7DA45A7DA45A819C +ACBAD5B4C6D55A7D9CACBECDD5DEE66A89AC6285ACC5D2DEBDCAD55A7DA45A819CFFFFFF +CDD6DE6A89AC6281ACACBECDDEE6EE5A7DA45A7DA4FFFFFF5A7D9C5A819CFFFFFFCDD6DE +6A89AC6281A4ACBED5DEE6EE5A7DA45A7DA4B4C6D5CDD6E66285A46A89ACCDDAE6FFFFFF +5A819C5A7DA45A7DA45A7DA45A7DA45A7D9C5A7DA45A7D9C5A7DA45A819C5A7DA45A7DA4 +5A819C5A7DA45A819C5A7DA45A7DA45A819C5A7DA45A7D9C5A7DA45A7D9C5A7DA45A819C +5A7DA45A7D9C5A819C5A7DA45A819C5A7D9C5A7DA45A7D9C5A7DA45A7D9C5A7DA45A7DA4 +5A7DA45A819C5A7D9C5A7DA45A7D9C5A7DA45A819C5A7DA45A819C5A7D9C5A7DA4C5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F6EEFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFE6E6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFF000000FFFFFFFFFFFF000000525552E6E2E6F6F6F6838183313431 +FFFFFFFFFFFF292829BDBEBDF6F6F6F6F2F66A6D6A5A595AFFFFFF6265628B898BFFFFFF +FFFFFFFFFFFF838583737173FFFFFF838183414441E6E2E6F6F2F66261626A696AFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF101410ACAEACFFFAFFE6E2E6626562FFFFFFFFFFFF +7371734A484AEEEAEEEEEAEE414441737573FFFFFFFFFFFF000000525052E6E2E6F6F6F6 +838583080C08525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF838183414441E6E2E6 +F6F2F66261626A696AFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000525552 +E6E2E6F6F6F6838183313431FFFFFFFFFFFF000000FFFFFFFFFFFF000000525552E6E2E6 +F6F6F6838183313431FFFFFFFFFFFF7371734A4C4AEEEAEEEEEAEE4A4C4A000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF7371734A484A +EEEAEEEEEAEE414441737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7371734A4C4A +EEEAEEEEEAEE4A4C4A000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFF000000FFFFFFFFFFFF7375734A484AEEEAEEEEEAEE4A484A000000FFFFFF +FFFFFF838183414441E6E2E6F6F2F66261626A696AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +BDBABD292829FFFFFFFFFFFFFFFFFF6265628B898BFFFFFF7371734A484AEEEAEEEEEAEE +414441737573FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF292829BDBEBDF6F6F6F6F2F6 +6A6D6A5A595AFFFFFFFFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF +7375734A484AEEEAEEEEEAEE4A484A000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC5A7DA45A7D9C5A7D9C +5A7D9C5A7D9C5A7DA45A7DA4FFFFFF5A7D9C5A7D9C5A7D9C5A7D9CFFFFFF5A85A45A7D9C +5A7DA46281A4FFFFFF5A7D9C527D9CEEEEF67391AC5A7D9C5A7DA46289A4F6F2F65A7D9C +5A7D9C5A7DA4527D9C5A7D9C5A7DA45A7D9C5A7DA4FFFFFF5A7D9C5A7DA45A7DA45A7D9C +FFFFFF5A7DA45A7D9CFFFFFF5A85A45A7D9C5A7D9C6281A4FFFFFF5A7DA45A7D9C5A7D9C +5A7DA45A7D9C8BA5BDC5D2E65A7DA4ACBACDF6F6F694AEC55A7D9CCDD6E68BA5BD5A7D9C +EEF2F67391AC5A7DA45A7D9C7391ACEEF2F65A7DA45A7D9CEEF2F66A91AC5A7DA4527D9C +7391ACEEF2F6527D9C5A7D9CEEF2F6738DB45A7D9C5A7DA47391B4FFFFFF5A7D9C5A7D9C +FFFFFF6285A4527D9C5A7D9C6281A4FFFFFF5A85A45A7D9C5A7DA45A81A4FFFFFF5A7DA4 +5A7D9C5A7DA45A7D9C5A7DA45A7D9C5A81A4F6F6F65A7DA45A7D9CFFFFFF6285A45A7DA4 +5A7D9C6281A4FFFFFF5A7D9C5A7D9C527D9C5A7D9C5A7DA45A7D9CEEF2F6A4B6C56A8DB4 +5A7D9C5A7DA45A7DA45A7D9CFFFFFF738DB45A7D9C5A7D9C7391ACEEF2F65A7DA45A7DA4 +EEEEF67391AC5A7D9C5A7D9C6A89A4F6F2F6527D9C5A7D9C5A7DA45A7D9C5A7D9C5A7D9C +5A81A4F6F6FF5A7D9C5A7D9CFFFFFF9CB6C5EEF2F67B95B45A7D9C5A7DA4527D9CEEF2F6 +A4B6CD6A8DAC5A7DA45A7DA45A7D9C5A7DA45A7DA45A7D9C5A7D9C5A7DA45A7D9C5A7DA4 +527D9C5A7D9C5A7D9C5A7D9C5A7D9C5A7DA45A7D9C5A7D9C5A7DA45A7D9C5A7D9C5A7DA4 +5A7DA45A7D9C5A7D9C5A7DA45A7D9C5A7DA45A7D9C5A7D9C5A7DA45A7D9C5A7DA45A7D9C +5A7D9C5A7D9C5A7DA45A7D9C5A7DA4527D9C5A7DA4527D9C5A7D9C5A7DA4527D9C5A7D9C +5A7D9C5A7DA45A7D9C5A7DA45A7DA45A7D9C5A7D9C5A7D9C5A7D9C5A7D9C527D9C5A7D9C +EEEEF67391AC527D9C5A7D9C6A89ACEEF2F65A7D9C7391B4EEEEF65A7DA45A7D9C5A7DA4 +EEEEF6628DAC5A7D9CEEEEF67391AC5A7D9C5A7D9C6A89ACF6F2F65A7D9C5A7DA4FFFFFF +6285A4527D9C5A7D9C6281ACFFFFFF5A7DA45A7D9CFFFFFF5A7D9C5A7DA4FFFFFF6285A4 +5A7D9C5A7DA46281A4FFFFFF5A7D9C5A7D9CEEF2F6738DB4527D9C5A7D9C738DACFFFFFF +5A7D9C5A7D9C527D9C5A7D9C5A7DA45A7D9C5A7D9C5A7D9C527D9C5A7DA45A7D9C5A7D9C +5A7DA4527D9C5A7DA45A7D9C5A7D9C5A7DA4527D9C5A7D9C5A7DA45A7D9C5A7DA45A7DA4 +5A7D9C5A7DA45A7DA45A7D9C5A7D9C5A7DA45A7D9C5A7DA4527D9C5A7D9C5A7D9C5A7D9C +5A7D9C5A7DA45A7D9C5A7D9C5A7DA45A7D9C5A7D9C5A7DA45A7DA45A7D9C5A7D9CC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6EEF6EEF2EEF6EEEEF6EAEEEEEAE6 +EEEAE6E6EADEEEE6E6E6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6101410FFFFFFD5D6D5202020FFFFFF +FFFFFFFFFAFF202020E6E2E6FFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181C18949194E6E2E6FFFFFFFFFFFFFFFFFFFFFFFF +181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFF +F6F6F6000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF181C18D5D6D5FFFFFF +FFFFFFEEEAEE101410FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000EEEEEE +FFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF000000FFFFFFFFFFFF000000EEEEEEFFFFFF +FFFFFFF6F6F6000400FFFFFFFFFFFF181818DEDEDEFFFFFFFFFFFFDEDADE000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF181818DEDADE +FFFFFFFFFFFFDEDADE181818FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181818DEDEDE +FFFFFFFFFFFFDEDADE000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFF000000FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE000000FFFFFF +FFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF313431A4A5A4FFFFFFDEDADE181C18F6F6F6FFFFFF181818DEDADEFFFFFFFFFFFF +DEDADE181818FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +F6F6F6101410FFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF +181818DEDADEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC527D9C5A7DA45A7D9C +527D9C5A7D9C527D9C5A7D9CFFFFFF5A7DA4527D9C5A7D9C5A7D9CFFFFFF527D9C5A7D9C +527D9C5A7D9CFFFFFF5A7D9C5A7D9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A7D9C +5A7D9C5A7D9C5A7D9C5A7D9C527D9C5A7DA4527D9CFFFFFF5A7DA4527D9C5A7D9C5A7D9C +FFFFFF527D9C5A7D9CFFFFFF5A7D9C5A7D9C5A7D9C5A7D9CFFFFFF5A7D9C5A7DA45A7D9C +527D9C5A7DA45A81A4EEF2F65A7D9CE6EAEE83A5BDD5DEE65A7D9CEEF2F66281A45A7D9C +FFFFFF5A7D9C5A7D9C5A7D9C5A7D9CFFFFFF5A7D9C5A7D9CFFFFFF5A7DA45A7D9C5A7DA4 +5A7D9CFFFFFF5A7DA45A7D9CFFFFFF527D9C5A7D9C5A7D9C527D9CFFFFFF5A7D9C527D9C +FFFFFF5A7DA45A7D9C5A7DA45A7D9CFFFFFF5A7D9C527D9C5A7D9C5A7D9CFFFFFF5A7D9C +5A7D9C7B99B4DEE2E6FFFAFFFFFFFFFFFFFFFFFFFF5A7D9C527D9CFFFFFF527D9C5A7D9C +5A7DA4527D9CFFFFFF527D9C5A7D9C5A7D9C5A7D9C5A7D9C5A7D9C7399B4CDDAE6F6F6F6 +EEF2F68BA5BD5A7D9C5A7D9CFFFFFF527D9C5A7DA45A7D9C527D9CFFFFFF527D9C5A7D9C +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF527D9C5A7D9C7B99B4DEE2E6FFFAFFFFFFFF +FFFFFFFFFFFF5A7D9C527D9CFFFFFFEEF2F6ACBECD5A7D9C5A7D9C5A7D9C5A7D9C7B99B4 +CDDAE6F6F6FFEEF2F68BA5BD5A7DA4527D9C5A7D9C5A7D9C5A7D9C527D9C5A7D9C5A7D9C +5A7D9C5A7D9C5A7D9C5A7D9C527D9C5A7D9C5A7DA45A7D9C527D9C5A7DA4527D9C5A7D9C +5A7D9C5A7DA4527D9C5A7D9C5A7D9C527D9C5A7D9C5A7D9C527D9C5A7D9C5A7D9C5A7D9C +5A7D9C527D9C5A7D9C5A7D9C5A7D9C5A7DA45A7D9C5A7DA45A7D9C5A7D9C5A7DA45A7D9C +5A7DA4527D9C5A7D9C5A7D9C527D9C5A7D9C5A7D9C527D9C5A7D9C5A7DA45A7D9C5A7DA4 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A7D9C5A7D9CD5DAE68BA5BD5A7D9C94AABD +C5D2DE5A7DA4527D9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF527D9C5A7D9CFFFFFF +5A7D9C5A7D9C5A7D9C5A7D9CFFFFFF527D9C5A7D9CFFFFFF5A7D9C527D9CFFFFFF5A7D9C +5A7DA4527D9C5A7DA4FFFFFF527D9C5A7D9CFFFFFF5A7D9C5A7D9C5A7DA4527D9CFFFFFF +5A7D9C5A7D9C527D9C5A7D9C527D9C5A7D9C5A7D9C5A7D9C5A7D9C5A7D9C5A7D9C527D9C +5A7D9C5A7D9C527D9C5A7D9C5A7D9C5A7D9C5A7D9C5A7D9C527D9C5A7DA4527D9C5A7D9C +5A7DA4527D9C5A7D9C5A7D9C5A7D9C527D9C5A7D9C5A7D9C5A7D9C5A7D9C5A7D9C5A7D9C +527D9C5A7D9C5A7DA45A7D9C527D9C5A7DA4527D9C5A7D9C5A7D9C5A7DA4527D9CC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACEEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFC5C6C5393C39080808000000000000000000FFFFFFFFFFFF414441ACAEAC +FFFFFFA4A5A45A595AFFFFFFFFFFFF000400000000000000000000000000000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCDCACD4A4C4A101410181C18ACAEACFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000400000000000000 +000000000000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFAFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000000FFFFFF +FFFFFF000400000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFB4B2B4292829FFFFFF5A595A949194FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFAFF000400FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5C6C5393C39080808000000 +000000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFAFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC5A7D9C5A7D9C527D9C +5A7D9C5A7D9C5A799C5A7D9CFFFFFF527D9C5A7D9C527D9C5A7D9CFFFFFF5A7D9C5A7D9C +5A799C527D9CFFFFFF5A7D9C5A799CEEF2F66A89A4527D9C5A799C5A7D9C5A799C527D9C +5A7D9C5A7D9C527D9C5A7D9C5A799C527D9C5A7D9CFFFFFF5A7D9C5A799C5A799C527D9C +FFFFFF527D9C5A799CFFFFFF527D9C527D9C5A799C527D9CFFFFFF5A7D9C527D9C5A7D9C +5A7D9C527D9C5A7D9CD5DEE68BAABDDEE2EE527D9CDEE6EE83A5BDD5DEE6527D9C527D9C +EEF2F6738DAC527D9C5A799C6A91ACEEF2F65A799C5A7D9CEEF2F6738DAC527D9C5A7D9C +6A91ACEEF2F6527D9C5A7D9CEEF2F6738DAC527D9C5A7D9C738DACFFFFFF527D9C5A7D9C +FFFFFF527D9C5A7D9C527D9C527D9CFFFFFF5A7D9C5A799C527D9C5A799CFFFFFF527D9C +5A7D9CEEF2F68BAABD6281A4527D9C6285A4FFFFFF527D9C5A7D9CFFFFFF5A7D9C527D9C +5A7D9C5A7D9CFFFFFF5A799C527D9C527D9C5A799C527D9C527D9C5A799C5A7D9C5A799C +83A1BDEEF2F6527D9C5A7D9CFFFFFF738DAC5A7D9C527D9C7391ACEEF2F65A799C5A7D9C +EEF2F66289A45A7D9C527D9C5A7D9C527D9C5A7D9C5A7D9CEEF2F68BAABD6285A45A7D9C +6281A4FFFFFF5A7D9C527D9CFFFFFF6A8DACEEEEF69CB6CD5A7D9C5A7D9C527D9C5A7D9C +5A799C527D9C8BA1BDEEF2F65A7D9C5A799C5A799C527D9C5A7D9C527D9C5A799C527D9C +527D9C527D9C5A799C527D9C5A799C5A7D9C527D9C5A7D9C5A7D9C527D9C5A7D9C5A799C +527D9C5A7D9C527D9C5A799C527D9C5A799C527D9C527D9C5A7D9C5A799C527D9C5A799C +527D9C5A7D9C5A799C5A7D9C527D9C5A7D9C527D9C5A7D9C527D9C5A7D9C527D9C5A7D9C +527D9C5A799C527D9C5A7D9C5A799C5A7D9C527D9C5A7D9C5A7D9C527D9C5A7D9C527D9C +EEF2F66A85A45A7D9C5A799C527D9C5A799C5A7D9C527D9C8BA1BDDEDEE6527D9CDEE2EE +7395AC5A7D9C5A799CEEF2F66A89A4527D9C5A7D9C527D9C5A7D9C5A7D9C5A7D9CFFFFFF +527D9C527D9C5A799C527D9CFFFFFF5A799C5A7D9CFFFFFF527D9C5A799CFFFFFF5A7D9C +527D9C5A7D9C5A7D9CFFFFFF5A7D9C5A7D9CEEF2F6738DAC527D9C527D9C738DACFFFFFF +5A7D9C527D9C5A7D9C5A7D9C5A799C527D9C5A7D9C5A7D9C5A799C527D9C5A7D9C527D9C +5A799C5A7D9C5A799C527D9C5A7D9C5A7D9C527D9C5A7D9C5A799C527D9C5A7D9C527D9C +5A7D9C5A799C5A799C527D9C5A7D9C527D9C5A799C527D9C527D9C527D9C5A799C527D9C +5A799C5A7D9C527D9C5A7D9C5A7D9C527D9C5A7D9C5A799C527D9C5A7D9C527D9CC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6FFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFE6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFF181C18ACAAACF6F2F6FFFFFFF6F2F6000000FFFFFFFFFFFFB4B6B4393C39 +FFFFFF313431CDCECDFFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B6B4181818FFFFFFFFFFFF +181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF181C18E6E6E6FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF181818DEDEDEFFFFFFFFFFFFDEDADE000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF181818DEDADE +FFFFFFFFFFFFDEDADE181818FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181818DEDEDE +FFFFFFFFFFFFDEDADE000000FFFFFFFFFFFF000400F6F6F6FFFFFFFFFFFFEEEEEE000000 +FFFFFFFFFFFF000000FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE000000FFFFFF +FFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF292C297B797B202020FFFAFFFFFFFFFFFFFF181818DEDADEFFFFFFFFFFFF +DEDADE181818FFFFFFFFFFFF000400F6F6F6FFFFFFFFFFFFEEEEEE000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181C18ACAAACF6F2F6FFFFFF +F6F2F6000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +181818DEDADEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC527D945A799C527D9C +5A799C527D9C527D945A7D9CFFFFFF5A799C527D9C5A799C527D9CFFFFFF5A7D9C5A799C +527D9C5A799CFFFFFF527D94527D9CACBACDCDDAE67389AC527D9C7395ACC5D2DE527D9C +5A799C527D945A799C5A799C527D945A799C5A7D9CFFFFFF527D94527D9C5A7D9C527D94 +FFFFFF5A799C527D94FFFFFF5A799C5A799C5A7D9C527D94FFFFFF5A799C5A7D9C5A799C +527D9C5A799C5A7D9CA4BACDEEF2F69CB6C55A799C9CB6CDEEEEF6A4B6CD5A7D9C5A799C +B4C6D5CDDAE66A85A46289A4D5DAE6B4C2D5527D9C5A799CB4C6D5CDD6E662899C6A85A4 +CDDAE6B4C2D55A799C527D94B4C2D5CDDAE66285A46289A4CDDAE6FFFFFF5A799C527D9C +FFFFFF5A799C527D9C5A799C5A799CFFFFFF5A799C527D9C5A7D9C527D9CFFFFFF5A799C +527D9CF6F6FF8BA1BD5A819C7389ACC5D2DEFFFFFF5A799C5A799CFFFFFF5A7D9C5A799C +527D9C527D9CFFFFFF527D945A799C5A799C527D945A799C5A799CC5D2DE6A91A45A7D9C +83A1BDF6F6F65A799C527D94FFFFFFCDDADE6A85A46289A4CDDAE6ACC2D5527D945A7D9C +ACBACDCDDAE66A8DAC5A799C7395ACC5D2DE5A7D9C5A799CF6F6FF8BA1BD5A819C6A8DA4 +C5D2DEFFFFFF5A799C5A799CFFFFFF527D9C6A89A4E6EEF6A4BACD527D945A799CC5D2DE +6A91A45A7D9C8BA1BDF6F6F6527D94527D9C5A7D9C527D945A799C5A799C527D945A799C +5A799C5A799C5A7D9C527D945A7D9C5A799C5A7D9C5A799C527D9C5A799C5A7D9C527D9C +5A799C5A7D9C5A799C527D9C5A799C5A799C5A7D9C5A799C5A799C527D9C5A799C527D9C +5A7D9C5A799C527D9C5A799C527D9C5A799C527D945A799C527D9C5A799C5A799C527D94 +5A799C5A7D9C5A799C527D9C527D9C527D945A799C527D9C527D945A799C527D9C5A799C +ACBACDCDDAE67389AC527D9C7395ACC5D2DE527D9C5A799C527D9CE6EAEE9CB2C5D5DEE6 +5A799C5A799C527D94ACBACDCDDAE67389AC5A7D9C7391ACC5D2DE527D9C5A799CFFFFFF +5A799C5A799C527D945A799CFFFFFF5A7D9C527D94FFFFFF527D9C5A799CFFFFFF527D94 +5A799C527D945A799CFFFFFF5A799C527D9CB4C6CDCDD6E66285A46A85A4CDDAE6FFFFFF +527D9C5A799C5A7D9C5A799C527D9C5A799C5A7D9C527D94527D9C5A799C5A799C5A799C +527D9C527D9C5A799C527D9C5A799C527D945A799C5A799C527D945A799C5A7D9C5A799C +527D94527D9C5A7D9C527D945A799C5A799C527D945A799C5A799C5A799C5A7D9C527D94 +5A7D9C5A799C5A7D9C5A799C527D9C5A799C5A7D9C527D9C5A799C5A7D9C5A799CC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6F2EEF6EEEEEEEEE6EEEAE6F6EAEE +EEEAE6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFF101010B4B2B4FFFAFFDEDEDE525552000000FFFFFFFFFFFFFFFFFF292829 +949594414441FFFFFFFFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A595ADEDADEFFFAFFB4B6B4101410FFFFFFFFFFFF +7371734A4C4AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF8385834A484ADEDEDE +FFFAFFD5D2D5525552FFFFFFFFFFFF101010D5D6D5FFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF737173525052EEEAEEEEEAEE4A4C4A000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF101010D5D6D5FFFFFFFFFFFFFFFFFF7371734A4C4A +EEEAEEEEEAEE4A484A737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF737173525052 +EEEAEEEEEAEE4A4C4A000000FFFFFFFFFFFF313431838183F6F6F6E6E6E6525552000000 +FFFFFFFFFFFF000000FFFFFFFFFFFF7375734A4C4AEEEAEEEEEAEE4A4C4A000000FFFFFF +FFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFACAAAC0000009C9D9CFFFFFFFFFFFFFFFFFF7371734A4C4AEEEAEEEEEAEE +4A484A737573FFFFFFFFFFFF313431838183F6F6F6E6E6E6525552000000FFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF101010B4B2B4FFFAFFDEDEDE +525552000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +7375734A4C4AEEEAEEEEEAEE4A4C4A000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC52799C5A799C5A799C +527D9452799C5A799C5A799CFFFFFF5A799C527D9452799C5A799CFFFFFF5A799C527D94 +52799C5A799CFFFFFF5A799C5A799C527D94A4BAC5EEEEF6FFFFFFE6E6EE94A5BD5A799C +52799C5A799C52799C527D945A799C52799C5A799CFFFFFF5A799C5A799C5A799C5A799C +FFFFFF527D945A799CFFFFFF527D94527D945A799C5A799CFFFFFF5A799C527D945A799C +527D945A799C527D947B91ACFFFFFF62899C5A799C62899CFFFFFF7395AC5A799C527D94 +5A7D9CC5CEDEF6FAFFF6FAFFBDCADE5281945A799C527D94627D9CBDCED5F6FAFFF6FAFF +BDCADE52819452799C5A799C527D9CC5CEDEFFFAFFF6F2F6A4B6CDFFFFFF527D945A799C +FFFFFF52799C52799C5A799C527D94FFFFFF5A799C52799C5A799C5A799CFFFFFF527D94 +5A799C83A5B4EEEEF6FFFFFFEEEEF69CB2C5FFFFFF5A799C52799CFFFFFF527D945A799C +5A799C5A799CFFFFFF5A799C52799C5A799C5A799C52799C527D9494AABDE6EEF6FFFFFF +E6EAEE83A1B452799C5A799CFFFFFFA4B6CDF6F2F6FFFAFFBDCED5527D9C5A799C5A799C +527D94ACBACDEEEEF6FFFFFFE6E6EE8BAABD5A799C527D9483A1BDEEEEF6FFFFFFEEEEF6 +9CB2C5FFFFFF527D9452799CFFFFFF52799C5A799C6A85A4E6EAF6ACBACD52799C8BAABD +E6EEF6FFFFFFE6EAEE83A1B45A799C5A799C5A799C5A799C52799C527D945A799C52799C +527D94527D945A799C5A799C52799C5A799C527D945A799C527D945A799C527D945A799C +5A799C527D945A799C527D945A799C527D945A799C527D9452799C5A799C5A799C5A799C +5A799C527D945A799C527D945A799C527D945A799C52799C5A799C527D9452799C5A799C +52799C5A799C527D945A799C5A799C5A799C527D945A799C5A799C52799C52799C5A799C +527D94A4BACDEEEEF6FFFFFFE6E6EE94A5BD5A799C527D945A799C9CB2C5FFFFFF83A1B4 +52799C5A799C52799C5A799CA4BACDEEEEF6FFFFFFE6E6EE94A5BD5A799C52799CFFFFFF +52799C5A799C5A799C52799CFFFFFF5A799C5A799CFFFFFF5A799C527D94FFFFFF5A799C +5A799C52799C5A799CFFFFFF527D9452799C627DA4C5CEDEFFFAFFF6F2F6A4BAC5FFFFFF +5A799C527D945A799C527D9452799C5A799C52799C5A799C5A799C527D94527D9452799C +5A799C52799C5A799C5A799C52799C5A799C52799C527D945A799C52799C5A799C527D94 +5A799C5A799C5A799C5A799C52799C527D945A799C52799C527D94527D945A799C5A799C +52799C5A799C527D945A799C527D945A799C527D945A799C5A799C527D945A799CC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6C5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACE6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFB4B2B4202020000400202020949594000000FFFFFFFFFFFFFFFFFF949594 +000000BDBABDFFFFFFFFFFFFFFFFFFFFFFFF838583181C18000400292C29ACAAACFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4A5A4202420000400292829BDBABDFFFFFFFFFFFF +F6F6F6626162080C08080C08626562F6F6F6FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF838583181C18 +000400292C29ACAAACFFFFFFFFFFFF838583080C08000000FFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFF6F6F65A595A080808101410838583000400FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF838583080C08000000FFFFFFFFFFFFF6F6F6626162 +080C08080C08626562F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F65A595A +080808101410838583000400FFFFFFFFFFFFCDCECD313031000400181C18949594000000 +FFFFFFFFFFFF000000FFFFFFFFFFFFF6F6F66261620808081014108B898B000000FFFFFF +FFFFFFFFFFFF838583181C18000400292C29ACAAACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFACAAAC202420FFFAFFFFFFFFFFFFFFFFFFFFF6F6F6626162080C08080C08 +626562F6F6F6FFFFFFFFFFFFCDCECD313031000400181C18949594000000FFFFFFFFFFFF +C5C6C5393839FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B2B4202020000400202020 +949594000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +F6F6F66261620808081014108B898B000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC5A759C527994527994 +5A759C5A799C5279945A759C5279945A759C5A799C5279945A759C5279945A759C52799C +5A759C5279945A759C5279945279945A759C5279945A799C52799452799C527994527994 +5A759C5279945A799C5279945A759C5279945279945A759C52799C527994527994527994 +5A799C5A759C5279945A759C52799C5A759C5279945279945A799C5279945A759C527994 +52799452799C52799C5279945A799C5279945A759C5279945A759C52799452799C527994 +5A759C5279945279945279945A799C52799452799C5279945A799C52799C52799452799C +5279945A759C52799C5279945A759C5279945A799C5279945279945A759C5279945A759C +5279945A799C52799452799C5A759C5279945A759C52799452799C5279945279945A799C +52799452799C5279945A759C52799C52799452799C5279945279945A759C5A799C527994 +5A759C5279945A799C5279945A759C5279945279945A799C5279945A759C52799452799C +5279945A759C52799C527994FFFFFF5A759C5279945279945A759C5A799C5279945A759C +5279945A759C5A799C5279945A759C5279945A759C52799C5A759C5279945A759C527994 +5279945A759C5279945A799C52799452799C5279945279945A759C5279945A799C527994 +5A759C5279945279945A759C52799C5279945279945279945A799C5A759C5279945A759C +52799C5A759C5279945279945A799C5279945A759C52799452799452799C52799C527994 +5A799C5279945A759C5279945A759C52799452799C5279945A759C527994527994527994 +5A799C52799452799C5279945A799C52799C52799452799C5279945A759C52799C527994 +5A759C5279945A799C5279945279945A759C5279945A759C5279945A799C52799452799C +5A759C5279945A759C52799452799C5279945279945A799C52799452799C5279945A759C +52799C52799452799C5279945279945A759C5A799C5279945A759C5279945A799C527994 +5A759C5279945279945A799C5279945A759C52799452799C5279945A759C52799C527994 +5279945A759C5279945279945A759C5A799C5279945A759C5279945A759C738DACEEEEF6 +5A759C5279945A759C52799C5A759C5279945A759C5279945279945A759C5279945A799C +52799452799C5279945279945A759C5279945A799C5279945A759C5279945279945A759C +52799C5279945279945279945A799C5A759C5279945A759C52799C5A759C527994527994 +5A799C5279945A759C52799452799452799C52799C5279945A799C5279945A759CC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEFFFAFFFFFAFFFFFAFFFFFAFFFFFAFF +FFFAFFFFFAFFEEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5D6D5202020FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFD5D6D5202020FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF4A4C4AA4A5A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +414041BDBEBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC527994527594527994 +5A759C5279945279945A759C5279945279945279945A759C5279945A759C527994527594 +5279945A759C5275945279945A759C5279945A759C5279945A759C5275945A759C5A759C +5279945275945279945A759C5279945275945A759C5279945279945A759C5279945A759C +5279945275945279945275945279945279945A759C5279945275945A759C527994527594 +5A759C5279945279945A759C5279945A759C5275945279945279945A759C5279945A759C +5279945A759C5279945A759C5279945A759C5279945A759C5279945279945A759C527994 +5A759C5279945279945A759C5279945275945279945A759C5279945A759C527994527594 +5279945A759C5279945A759C5279945A759C5279945A759C5279945A759C527594527994 +5A759C5279945A759C5279945A759C5A759C5279945A759C5A759C527994527594527994 +5279945A759C5279945A759C5279945279945A759C5279945A759C5279945279945A759C +5275945279945A759C527994FFFFFF5279945275945279945A759C5279945279945A759C +5279945279945279945A759C5279945A759C5279945275945279945A759C527594527994 +5A759C5279945A759C5279945A759C5275945A759C5A759C5279945275945279945A759C +5279945275945A759C5279945279945A759C5279945A759C527994527594527994527594 +5279945279945A759C5279945275945A759C5279945275945A759C5279945279945A759C +5279945A759C5275945279945279945A759C5279945A759C5279945A759C5279945A759C +5279945A759C5279945A759C5279945279945A759C5279945A759C5279945279945A759C +5279945275945279945A759C5279945A759C5279945275945279945A759C5279945A759C +5279945A759C5279945A759C5279945A759C5275945279945A759C5279945A759C527994 +5A759C5A759C5279945A759C5A759C5279945275945279945279945A759C5279945A759C +5279945279945A759C5279945A759C5279945279945A759C5275945279945A759C527994 +5A759C5279945275945279945A759C527994527994B4C2D55A819C62859CCDD6DEB4C2D5 +5279945A759C5279945275945279945A759C5275945279945A759C5279945A759C527994 +5A759C5275945A759C5A759C5279945275945279945A759C5279945275945A759C527994 +5279945A759C5279945A759C5279945275945279945275945279945279945A759C527994 +5275945A759C5279945275945A759C5279945279945A759C5279945A759C527594C5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEEEF2EEEEEEE6F6EAEEEEEEE6 +EEEAE6EEE6E6E6E6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF737173EEEEEEEEEAEE4A4C4A737573FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF737173 +EEEEEEEEEAEE4A4C4A737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF9C999C292829FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC5A759C5275945A759C +5279945275945A759C5275945A759C5275945275945279945A75945279945A759C527994 +5A75945275945A759C5275945A7594527994527594527594527994527594527994527594 +5A759C5279945A75945275945275945275945279945275945275945A7594527594527994 +5275945275945A75945275945275945A759C5279945275945A759C527594527594527994 +5A75945275945A759C5275945275945279945275945A7594527594527994527594527994 +5275945275945279945275945A75945275945275945279945275945A759C5275945A7594 +5275945275945A759C5275945A75945279945A759C5275945A7594527594527594527594 +5A75945279945275945279945275945275945275945279945275945275945279945A7594 +5275945279945A75945275945275945279945275945279945279945A759C527994527594 +5275945275945A759C5279945A759C527594527594527594527594527994527594527594 +5275945275945275945A7594FFFFFF5A759C5275945A759C5279945275945A759C527594 +5A759C5275945275945279945A75945279945A759C5279945A75945275945A759C527594 +5A75945279945275945275945279945275945279945275945A759C5279945A7594527594 +5275945275945279945275945275945A75945275945279945275945275945A7594527594 +5275945A759C5279945275945A759C5275945275945279945A75945275945A759C527594 +5275945279945275945A7594527594527994527594527994527594527594527994527594 +5A75945275945275945279945275945A759C5275945A75945275945275945A759C527594 +5A75945279945A759C5275945A75945275945275945275945A7594527994527594527994 +5275945275945275945279945275945275945279945A75945275945279945A7594527594 +5275945279945275945279945279945A759C5279945275945275945275945A759C527994 +5A759C5275945275945275945275945279945275945275945275945275945275945A7594 +5279945A759C5275945A759C5279945275945A759C9CAEC5F6F2F6F6FAFFC5CEDE5A7D9C +5A75945279945A759C5279945A75945275945A759C5275945A7594527994527594527594 +5279945275945279945275945A759C5279945A7594527594527594527594527994527594 +5275945A75945275945279945275945275945A75945275945275945A759C527994527594 +5A759C5275945275945279945A75945275945A759C527594527594527994527594C5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F6EEF6EEEEF6EEEEEEEEE6EEEAE6EEEAE6 +EEEAE6EEE6E6EEE6DEE6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF949594101410080C085A5D5AF6F6F6FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF949594 +101410080C085A5D5AF6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000202020CDCACDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC527594527594527594 +527594527594527594527594527594527594527594527594527594527594527594527594 +5275945275945275945275945275945275945A7594527594527594527594527594527594 +5275945275945275945A75945275945275945275945275945A7594527594527594527594 +5275945275945275945275945275945275945275945275945275945A7594527594527594 +5275945275945275945275945A75945275945275945275945275945A7594527594527594 +5275945275945A7594527594527594527594527594527594527594527594527594527594 +5275945275945275945275945275945275945275945275945275945275945A7594527594 +5275945275945275945A75945275945275945275945A7594527594527594527594527594 +5275945275945275945A75945275945275945275945A7594527594527594527594527594 +5275945275945275945275945275945275945275945275945A7594527594527594527594 +5275945A7594527594527594527594527594527594527594527594527594527594527594 +527594527594527594527594527594527594527594527594527594527594527594527594 +5275945275945A75945275945275945275945275945275945275945275945275945A7594 +5275945275945275945275945A7594527594527594527594527594527594527594527594 +5275945275945275945275945275945A7594527594527594527594527594527594527594 +5A75945275945275945275945275945A75945275945275945275945275945A7594527594 +527594527594527594527594527594527594527594527594527594527594527594527594 +5275945275945275945275945275945275945A75945275945275945275945275945A7594 +5275945275945275945A75945275945275945275945275945275945275945275945A7594 +5275945275945275945A7594527594527594527594527594527594527594527594527594 +5275945275945275945275945A75945275945275945275945275945A7594527594527594 +527594527594527594527594527594527594527594527594527594527594527594527594 +5275945275945275945275945275945275945275945275945275945275945A7594527594 +5275945275945275945275945275945275945275945A7594527594527594527594527594 +5A7594527594527594527594527594527594527594527594527594527594527594527594 +5275945A75945275945275945275945275945275945275945A7594527594527594C5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEF6F2EEEEF2EEF6EEEEEEEEE6F6EAEE +EEEAE6EEE6E6E6E6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC527194527594527594 +527594527194527594527594527194527594527594527194527594527594527194527594 +52719452759452719452759452759452758B52759452758B52759452758B52759452758B +52719452759452758B527594527594527194527594527194527594527594527194527594 +52758B52719452758B52759452719452759452758B52719452759452758B527194527594 +52759452758B52759452759452759452759452758B52759452759452759452758B527194 +52758B52719452759452758B52759452719452758B52759452758B527594527194527594 +52759452759452719452759452719452758B527194527594527194527594527594527594 +52759452758B52759452759452759452758B52759452759452759452759452759452758B +52719452759452719452758B52759452759452758B52759452759452759452719452758B +52719452759452759452758B52719452758B52719452759452758B527594527194527594 +52759452758B527594527194527594527194527594527594527594527194527594527594 +527194527594527594527194527594527594527194527594527194527594527194527594 +52759452758B52759452758B52759452758B52759452758B52719452759452758B527594 +52759452719452759452719452759452759452719452759452758B52719452758B527594 +52719452759452758B52719452759452758B52719452759452759452758B527594527594 +52759452759452758B52759452759452759452758B52719452758B52719452759452758B +52759452719452758B52759452758B527594527194527594527594527594527194527594 +52719452758B52719452759452719452759452759452759452759452758B527594527594 +52759452758B52759452759452759452759452759452758B52719452759452719452758B +52759452759452758B52759452759452759452719452758B52719452759452759452758B +52719452758B52719452759452758B52759452719452759452759452758B527594527194 +527594527194527594527594527594527194527594527594527194527594527594527194 +52759452759452719452759452719452759452719452759452759452758B52759452758B +52759452758B52759452758B52719452759452758B527594527594527194527594527194 +52759452759452719452759452758B52719452758B52759452719452759452758B527194 +52759452758B52719452759452759452758B52759452759452759452759452758BC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEF6EEEEEEEEEEEEEAEEEEEAE6 +E6EADEEEE6E6EEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC52719452758B527194 +52758B52719452758B52719452758B52759452719452758B52719452758B527194527194 +52758B52758B52758B52719452758B52719452759452719452758B527194527194527194 +52758B52719452758B52719452758B52758B52719452758B52719452758B52759452758B +52719452758B52719452719452758B52758B52719452759452758B527194527594527194 +52758B52719452759452719452758B52719452758B52719452758B52719452719452758B +52719452759452758B52719452759452758B52719452719452719452719452758B527194 +52758B52719452758B52719452759452719452759452758B52719452758B52719452758B +52719452719452758B52719452758B52719452719452758B52719452758B527594527194 +52758B52758B52759452719452759452758B52719452719452758B52719452758B527194 +52759452719452719452719452758B52719452758B52759452719452719452758B527594 +52719452719452758B52719452758B52719452758B52719452758B52719452758B527194 +52758B52759452719452758B52719452758B52719452719452758B52758B52758B527194 +52758B52719452759452719452758B52719452719452719452758B52719452758B527194 +52758B52758B52719452758B52719452758B52759452758B52719452758B527194527194 +52758B52758B52719452759452758B52719452759452719452758B527194527594527194 +52758B52719452758B52719452758B52719452719452758B52719452759452758B527194 +52759452758B52719452719452719452719452758B52719452758B52719452758B527194 +52759452719452759452758B52719452758B52719452758B52719452719452758B527194 +52758B52719452719452758B52719452758B52759452719452758B52758B527594527194 +52759452758B52719452719452758B52719452758B527194527594527194527194527194 +52758B52719452758B52759452719452719452758B52759452719452719452758B527194 +52758B52719452758B52719452758B52719452758B52719452758B52759452719452758B +52719452758B52719452719452758B52758B52758B52719452758B527194527594527194 +52758B52719452719452719452758B52719452758B52719452758B52758B52719452758B +52719452758B52759452758B52719452758B52719452719452758B52758B527194527594 +52758B52719452759452719452758B52719452759452719452758B52719452758BC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F2EEF6F2EEEEF2E6F6EEEEEEEEE6EEEAE6 +EEEAE6EEE6E6E6E6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC52718B52719452718B +52718B52718B52719452718B52719452758B52718B52758B52719452719452718B527194 +52718B52719452719452758B52719452718B52719452758B52719452758B52718B527194 +4A758B52718B5271944A758B52719452758B52718B52719452718B5271945271944A758B +52718B52718B52758B52719452718B52719452758B52718B5271945271944A758B52718B +52719452718B52718B4A758B5271945271944A758B52719452718B52719452758B527194 +4A758B52719452719452718B5271944A758B5271944A758B52718B52719452718B4A758B +52719452718B52719452758B52718B4A758B5271945271944A758B52719452718B52758B +52758B52718B52719452718B52718B52719452758B52719452718B52719452719452718B +5271945271944A758B52719452758B5271944A758B52718B52719452718B527194527194 +52758B52718B4A758B52718B52719452718B5271945271944A758B52718B527194527194 +52758B52718B4A758B52719452718B52718B52719452718B52718B52718B52719452718B +52719452758B52718B52758B52719452719452718B52719452718B52719452719452758B +52719452718B52719452758B52719452758B52718B5271944A758B52718B5271944A758B +52719452758B52718B52719452718B5271945271944A758B52718B52718B52758B527194 +52718B52719452758B52718B5271945271944A758B52718B52719452718B52718B4A758B +5271945271944A758B52719452718B52719452758B5271944A758B52719452719452718B +5271944A758B5271944A758B52718B52719452718B4A758B52719452718B52719452758B +52718B4A758B5271945271944A758B52719452718B52758B52758B52718B52719452718B +52718B52719452758B52719452718B52719452719452718B5271945271944A758B527194 +52758B5271944A758B52718B52719452718B52719452719452758B52718B4A758B52718B +52719452718B5271945271944A758B52718B52719452719452758B52718B4A758B527194 +52718B52718B52719452718B52718B52718B52719452718B52719452758B52718B52758B +52719452719452718B52719452718B52719452719452758B52719452718B52719452758B +52719452758B52718B5271944A758B52718B5271944A758B52719452758B52718B527194 +52718B5271945271944A758B52718B52718B52758B52719452718B52719452758B52718B +5271945271944A758B52718B52719452718B52718B4A758B5271945271944A758BC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6F2EEEEF2EEF6EEEEEEEEE6EEEAE6 +EEE6E6E6EADEEEE6E6EEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6AC52718B4A718B52718B +4A718B52718B52718B4A718B52718B52718B52719452718B52718B4A718B5271944A718B +52718B4A718B52718B52718B52718B5271944A718B52718B52718B52719452718B4A718B +52719452718B4A718B52718B52718B52718B5271944A718B52719452718B52718B52718B +52719452718B52719452718B52718B4A718B52718B52718B4A718B52718B52719452718B +4A718B52719452718B52719452718B52718B52718B52718B52718B4A718B52718B52718B +52719452718B52718B4A718B52718B52718B52718B52718B5271944A718B52718B527194 +52718B52718B4A718B52719452718B5271944A718B52718B5271944A718B52718B527194 +52718B5271944A718B52719452718B4A718B52718B52718B5271944A718B52718B4A718B +52718B52719452718B4A718B52718B52718B52718B52718B4A718B52718B52718B4A718B +52718B52719452718B5271944A718B52718B4A718B52718B52719452718B52718B4A718B +52718B52719452718B4A718B52719452718B4A718B52718B4A718B52718B52718B4A718B +52718B52718B52719452718B52718B4A718B5271944A718B52718B4A718B52718B52718B +52718B5271944A718B52718B52718B52719452718B4A718B52719452718B4A718B52718B +52718B52718B5271944A718B52719452718B52718B52718B52719452718B52719452718B +52718B4A718B52718B52718B4A718B52718B52719452718B4A718B52719452718B527194 +52718B52718B52718B52718B52718B4A718B52718B52718B52719452718B52718B4A718B +52718B52718B52718B52718B5271944A718B52718B52719452718B52718B4A718B527194 +52718B5271944A718B52718B5271944A718B52718B52719452718B5271944A718B527194 +52718B4A718B52718B52718B5271944A718B52718B4A718B52718B52719452718B4A718B +52718B52718B52718B52718B4A718B52718B52718B4A718B52718B52719452718B527194 +4A718B52718B4A718B52718B52719452718B52718B4A718B52718B52719452718B4A718B +52719452718B4A718B52718B4A718B52718B52718B4A718B52718B52718B52719452718B +52718B4A718B5271944A718B52718B4A718B52718B52718B52718B5271944A718B52718B +52718B52719452718B4A718B52719452718B4A718B52718B52718B52718B5271944A718B +52719452718B52718B52718B52719452718B52719452718B52718B4A718B52718B52718B +4A718B52718B52719452718B4A718B52719452718B52719452718B52718B52718BC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6EEF2EEF6EEEEEEEEE6F6EAEEEEEEE6 +EEEAE6EEE6DEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEEEF2EEF6EEEEEEEEEEEEEAEEEEEEE6 +EEEAE6EEE6E6EEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6EEEEEEF2EEF6EEEEEEEEE6EEEAE6 +EEE6E6E6EADEEEE6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEEEF2E6EEEEEEF6EAEEEEEAE6 +EEEAE6EEE6DEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000949594181C18000400313031D5D2D5FFFFFFFFFFFFFFFFFF7B797B101410 +080808525552F6F2F6FFFFFFFFFFFFFFFFFF7B797B101410080808525552F6F2F6FFFFFF +FFFFFFFFFAFF6261620808081014108B898B000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000949594181C18000400313031D5D2D5FFFFFFFFFFFFFFFFFF7B797B101410 +080808525552F6F2F6EEEEEE101410EEEEEEFFFFFFFFFFFFFFFFFFEEEEEE101410EEEEEE +FFFFFF7B797B101410080808525552F6F2F6FFFFFFFFFFFF0000008B8D8B181C18000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFF6261620808081014108B898B000000FFFFFF +FFFFFFF6F6F6626562080C08080C08626562FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +202020D5D6D5FFFFFFFFFFFFA4A1A4FFFFFFFFFFFFD5D2D5202020FFFFFF0000008B8D8B +181C18000000FFFFFFF6F6F6626562080C08080C08626562FFFAFFFFFFFFFFFFFF000000 +949594181C18000400313031D5D2D5FFFFFFFFFFFFF6F6F65A5D5A0808081014108B898B +000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +8B898B101410080808626162FFFAFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFF000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000949594181C18000400313031 +D5D2D5FFFFFFFFFFFFDEDEDE4A4C4A080C08000400414441E6E6E6EEEEEE101410EEEEEE +FFFFFFFFFFFFFFFFFFEEEEEE101410EEEEEEFFFFFF7B797B101410080808525552F6F2F6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6F2EEF6EEEEF6EEEEEEEEE6EEEAE6 +E6EADEEEE6E6EEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF838183414441E6E2E6 +F6F2F66261626A696AFFFFFFFFFFFF838183414441E6E2E6F6F2F66261626A696AFFFFFF +FFFFFF7375734A484AEEEAEEEEEAEE4A484A000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF838183414441E6E2E6 +F6F2F66261626A696AFFFFFF6265628B898BFFFFFFFFFFFFFFFFFF838583737173FFFFFF +838183414441E6E2E6F6F2F66261626A696AFFFFFFFFFFFF0000005A595AEEEAEEFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7375734A484AEEEAEEEEEAEE4A484A000000FFFFFF +FFFFFF7371734A484AEEEAEEEEEAEE414441737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +6A696A949594FFFFFFE6E2E6080C08F6F6F6FFFFFF9495946A696AFFFFFF0000005A595A +EEEAEEFFFFFFFFFFFF7371734A484AEEEAEEEEEAEE414441737573FFFFFFFFFFFF000000 +525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF7371734A4C4AEEEAEEEEEAEE4A4C4A +000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +4A484AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000525552E6E2E6F6F6F6838183 +313431FFFFFFFFFFFF292829BDBEBDF6F6F6F6F2F66A6D6A5A595AFFFFFF6265628B898B +FFFFFFFFFFFFFFFFFF838583737173FFFFFF838183414441E6E2E6F6F2F66261626A696A +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEEEF2E6EEEEE6F6EAEEEEEAE6 +EEE6E6E6EADEE6E6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF181C18D5D6D5FFFFFF +FFFFFFEEEAEE101410FFFFFFFFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFF +FFFFFF181818DEDADEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF181C18D5D6D5FFFFFF +FFFFFFEEEAEE101410FFFFFFD5D6D5202020FFFFFFFFFFFFFFFAFF202020E6E2E6FFFFFF +181C18D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFFFFFFFF000000E6E6E6FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE000000FFFFFF +FFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +B4B2B4525552FFFFFF838583101410A4A1A4FFFFFF525552B4B2B4FFFFFF000000E6E6E6 +FFFFFFFFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000 +EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF181818DEDEDEFFFFFFFFFFFFDEDADE +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +DEDADEFFFFFFFFFFFFDEDADE181C18FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6 +000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6101410FFFFFFD5D6D5202020 +FFFFFFFFFFFFFFFAFF202020E6E2E6FFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEF6EEEEF6EEEEF6EAEEEEEEE6 +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000400000000000000 +000000000000000000FFFFFFFFFFFF000400000000000000000000000000000000FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000400000000000000 +000000000000000000FFFFFFFFFFFF414441ACAEACFFFFFFA4A5A45A595AFFFFFFFFFFFF +000400000000000000000000000000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000000FFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +F6F2F6181C18FFFFFF292C29B4B2B4393C39FFFFFF181C18F6F6F6FFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFC5C6C5393C39080808000000000000000000FFFFFFFFFFFF414441 +ACAEACFFFFFFA4A5A45A595AFFFFFFFFFFFF000400000000000000000000000000000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6EEEEF6F2EEEEEEE6EEEAE6EEEAE6 +EEE6E6EEE6E6E6E6DEE6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF181C18E6E6E6FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF181818DEDADEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF181C18E6E6E6FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B6B4393C39FFFFFF313431CDCECDFFFFFFFFFFFF +181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE000000FFFFFF +FFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF414041ACAAAC393839FFFFFF313031B4B2B4414041FFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF181818DEDEDEFFFFFFFFFFFFDEDADE +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +DEDADEFFFFFFFFFFFFDEDADE181C18FFFFFFFFFFFF000400F6F6F6FFFFFFFFFFFFEEEEEE +000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF181C18ACAAACF6F2F6FFFFFFF6F2F6000000FFFFFFFFFFFFB4B6B4 +393C39FFFFFF313431CDCECDFFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEEEF2EEF6EEEEF6EEEEEEEEE6EEEAE6 +EEEAE6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF8385834A484ADEDEDE +FFFAFFD5D2D5525552FFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552FFFFFF +FFFFFF7375734A4C4AEEEAEEEEEAEE4A4C4A000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF8385834A484ADEDEDE +FFFAFFD5D2D5525552FFFFFFFFFFFFFFFFFF292829949594414441FFFFFFFFFFFFFFFFFF +8385834A484ADEDEDEFFFAFFD5D2D5525552FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7375734A4C4AEEEAEEEEEAEE4A4C4A000000FFFFFF +FFFFFF7371734A4C4AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF8B898B181C18949594FFFFFF8B8D8B181C188B898BFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF7371734A4C4AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF737173525052EEEAEEEEEAEE4A4C4A +000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +4A4C4AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFF313431838183F6F6F6E6E6E6525552 +000000FFFFFFFFFFFF101010D5D6D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF101010B4B2B4FFFAFFDEDEDE525552000000FFFFFFFFFFFFFFFFFF +292829949594414441FFFFFFFFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F2EEF6EEF6F6F2EEEEEEE6F6EAEEEEEEE6 +EEE6E6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF838583181C18 +000400292C29ACAAACFFFFFFFFFFFFFFFFFF838583181C18000400292C29ACAAACFFFFFF +FFFFFFF6F6F66261620808081014108B898B000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF838583181C18 +000400292C29ACAAACFFFFFFFFFFFFFFFFFF949594000000BDBABDFFFFFFFFFFFFFFFFFF +FFFFFF838583181C18000400292C29ACAAACFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F66261620808081014108B898B000000FFFFFF +FFFFFFF6F6F6626162080C08080C08626562F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFCDCECD000400EEEAEEFFFFFFE6E6E6000000D5D2D5FFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFF6F6F6626162080C08080C08626562F6F6F6FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFF6F6F65A595A080808101410838583 +000400FFFFFFFFFFFFC5C6C5393839FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +8B898B101410080808626162F6F6F6FFFFFFFFFFFFCDCECD313031000400181C18949594 +000000FFFFFFFFFFFF838583080C08000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFB4B2B4202020000400202020949594000000FFFFFFFFFFFFFFFFFF +949594000000BDBABDFFFFFFFFFFFFFFFFFFFFFFFF838583181C18000400292C29ACAAAC +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6EEF2EEF6EEEEEEEEE6EEEAE6EEEAE6 +E6EADEEEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5D6D5 +202020FFFFFFFFFFFF414041BDBEBDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEF6EEEEEEF2E6F6EEEEEEEEE6F6EAEE +EEEAE6EEE6E6EEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF737173EEEEEEEEEAEE4A4C4A +737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6F2EEF6EEEEF6EEEEEEEAEEEEEEE6 +EEEAE6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF949594101410080C085A5D5A +F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6EEEEF6EEEEEEEEE6EEEEE6EEEAE6 +E6EADEEEE6E6EEE6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6F2EEEEF2EEEEEEE6F6EAEEEEEAE6 +EEEAE6EEE6E6E6E6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEF6EEEEF6EEEEEEEAE6EEEAE6 +EEEAE6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F6EEF6EEF6EEF2E6EEEEEEEEEEE6EEEAE6 +EEE6E6EEE6E6E6E6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEEEF2EEF6EEEEEEEAEEEEEEE6 +EEEAE6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEEEF2EEF6EEEEEEEEE6EEEEE6F6EAEE +EEEAE6EEE6E6EEE6DEE6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6EEF6EEF2EEF6EEEEEEEEE6EEEEE6 +EEE6E6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F2EEF6F2EEF6EEEEEEEEE6EEEAE6F6EAEE +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000949594181C18000400313031D5D2D5FFFFFFFFFFFFF6F6F6626562080C08 +080C08626562FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000949594181C18 +000400313031D5D2D5FFFFFFFFFFFFFFFFFF7B797B101410080808525552F6F2F6FFFFFF +FFFFFFDEDEDE4A4C4A080C08000400414441E6E6E6FFFFFFFFFFFF0000008B8D8B181C18 +000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE +4A4C4A080C08000400414441E6E6E6FFFFFFFFFFFF000000949594181C18000400313031 +D5D2D5FFFFFFFFFFFFFFFAFF6261620808081014108B898B000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFB4B6B4292829000400181C189C999CFFFFFFFFFFFFF6F6F6626562 +080C08080C08626562FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000949594202020000400292829C5C2C5A4A1A4 +202420000400313031D5D2D5FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFB4B6B4292829000400181C189C999CFFFFFF000000000000000000000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000008B898B101410080808626162FFFAFF +FFFFFFFFFFFFFFFFFF7B797B101410080808525552F6F2F6FFFFFFFFFFFFFFFFFFFFFFFF +EEEEEE101410EEEEEEFFFFFFFFFFFFFFFFFFEEEEEE101410EEEEEEFFFFFF7B797B101410 +080808525552F6F2F6FFFFFFFFFFFF0000008B8D8B181C18000000393C39A4A5A4FFFFFF +FFFFFFFFFFFFE6E2E6181818F6F2F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6F2EEF6EEEEEEEEE6EEEAEEEEEEE6 +EEEAE6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF7371734A484AEEEAEE +EEEAEE414441737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000525552E6E2E6 +F6F6F6838183313431FFFFFFFFFFFF838183414441E6E2E6F6F2F66261626A696AFFFFFF +FFFFFF292829BDBEBDF6F6F6F6F2F66A6D6A5A595AFFFFFFFFFFFF0000005A595AEEEAEE +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF292829 +BDBEBDF6F6F6F6F2F66A6D6A5A595AFFFFFFFFFFFF000000525552E6E2E6F6F6F6838183 +313431FFFFFFFFFFFF7375734A484AEEEAEEEEEAEE4A484A000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF101410ACAEACFFFAFFE6E2E6626562FFFFFFFFFFFF7371734A484A +EEEAEEEEEAEE414441737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000525052E6E2E6F6F6F6838583080C08525552 +E6E2E6F6F6F6838183313431FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFF101410ACAEACFFFAFFE6E2E6626562FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000004A484AEEEAEEEEEAEE4A484A737573 +FFFFFFFFFFFF838183414441E6E2E6F6F2F66261626A696AFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF6265628B898BFFFFFFFFFFFFFFFFFF838583737173FFFFFF838183414441E6E2E6 +F6F2F66261626A696AFFFFFFFFFFFF0000005A595AEEEAEEFFFFFFBDBABD292829FFFFFF +FFFFFFFFFFFF6265628B898BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6EEEEEEF2E6F6EEEEEEEEE6F6EAEE +EEEAE6EEE6E6E6E6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF181818DEDADEFFFFFF +FFFFFFDEDADE181818FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000EEEEEEFFFFFF +FFFFFFF6F6F6000400FFFFFFFFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6101410FFFFFFFFFFFF000000E6E6E6FFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFF6F6F6101410FFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6 +000400FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF181C18949194E6E2E6FFFFFFFFFFFFFFFFFFFFFFFF181818DEDADE +FFFFFFFFFFFFDEDADE181818FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000000EEEEEE +FFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFF181C18949194E6E2E6FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000DEDADEFFFFFFFFFFFFDEDADE181C18 +FFFFFFFFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFD5D6D5202020FFFFFFFFFFFFFFFAFF202020E6E2E6FFFFFF181C18D5D6D5FFFFFF +FFFFFFEEEAEE101410FFFFFFFFFFFF000000E6E6E6FFFFFFFFFFFFFFFFFF313431A4A5A4 +FFFFFFDEDADE181C18F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6EEEEEEF2EEF6EEEEEEEEE6EEEEE6 +EEEAE6EEE6DEEEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFAFF000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF000400000000000000000000000000000000FFFFFF +FFFFFFC5C6C5393C39080808000000000000000000FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5C6C5 +393C39080808000000000000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFCDCACD4A4C4A101410181C18ACAEACFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFCDCACD4A4C4A101410181C18ACAEACFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000400 +FFFFFFFFFFFF000400000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF414441ACAEACFFFFFFA4A5A45A595AFFFFFFFFFFFF000400000000000000 +000000000000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFB4B2B4292829 +FFFFFF5A595A949194FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEEEF2EEF6EEEEEEEEEEF6EAEEEEEAE6 +EEE6E6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF181818DEDADEFFFFFF +FFFFFFDEDADE181818FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF181C18ACAAACF6F2F6FFFFFFF6F2F6000000FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181C18 +ACAAACF6F2F6FFFFFFF6F2F6000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B6B4181818FFFFFFFFFFFF181818DEDADE +FFFFFFFFFFFFDEDADE181818FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000400F6F6F6FFFFFFFFFFFFEEEEEE000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B6B4181818FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000DEDADEFFFFFFFFFFFFDEDADE181C18 +FFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFB4B6B4393C39FFFFFF313431CDCECDFFFFFFFFFFFF181C18E6E6E6FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF292C29 +7B797B202020FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEF6EEEEEEEEE6EEEEE6EEEAE6 +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF7371734A4C4AEEEAEE +EEEAEE4A484A737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552FFFFFF +FFFFFF101010B4B2B4FFFAFFDEDEDE525552000000FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF101010D5D6D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF101010 +B4B2B4FFFAFFDEDEDE525552000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF7375734A4C4AEEEAEEEEEAEE4A4C4A000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF5A595ADEDADEFFFAFFB4B6B4101410FFFFFFFFFFFF7371734A4C4A +EEEAEEEEEAEE4A484A737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF313431838183F6F6F6E6E6E6525552000000 +FFFFFFFFFFFF5A595ADEDADEFFFAFFB4B6B4101410FFFFFFFFFFFF101010D5D6D5FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000004A4C4AEEEAEEEEEAEE4A484A737573 +FFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF292829949594414441FFFFFFFFFFFFFFFFFF8385834A484ADEDEDE +FFFAFFD5D2D5525552FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFACAAAC +0000009C9D9CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6EEEEF6F2EEF6EEEEF6EAEEEEEEE6 +EEE6E6EEE6DEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFF6F6F6626162080C08 +080C08626562F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF838583181C18000400292C29ACAAACFFFFFF +FFFFFFB4B2B4202020000400202020949594000000FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF838583080C08000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B2B4 +202020000400202020949594000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFF6F6F66261620808081014108B898B000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFA4A5A4202420000400292829BDBABDFFFFFFFFFFFFF6F6F6626162 +080C08080C08626562F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFCDCECD313031000400181C18949594000000 +FFFFFFFFFFFFA4A5A4202420000400292829BDBABDFFFFFFFFFFFF838583080C08000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000008B898B101410080808626162F6F6F6 +FFFFFFFFFFFFFFFFFF838583181C18000400292C29ACAAACFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF949594000000BDBABDFFFFFFFFFFFFFFFFFFFFFFFF838583181C18 +000400292C29ACAAACFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFACAAAC +202420FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEF6F2EEEEF2EEEEEEE6EEEEE6EEEAE6 +EEEAE6EEE6E6EEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A4C4A +A4A5A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6EEF2EEF6EEEEF6EEEEEEEAE6F6EAEE +EEEAE6EEE6E6E6E6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C999C292829 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F6EEF6F2EEEEF2EEEEEEE6EEEEE6EEEAE6 +EEE6E6EEE6DEEEE6DEE6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000202020CDCACD +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6F2EEF6EEEEF6EEEEF6EAEEEEEEE6 +EEEAE6E6EADEEEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6EEEEEEF2E6EEEEE6EEEAEEEEEAE6 +EEE6E6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEF6F2EEF6EEEEEEEEE6EEEAE6 +E6EADEE6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F6EEF6EEF6EEF2EEF6EEEEEEEAE6EEEAE6 +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBEBD181C18000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F2EEF6F2EEF6EEEEEEEEEEEEEEE6F6EAEE +EEEAE6E6EADEEEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF313431ACAEACFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6EEEEEEF2EEF6EEEEEEEEE6EEEAE6 +E6EADEEEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF080808FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAEE101410FFFAFFFFFFFFFFFFFFFFFFFF525052FFFFFFFFFFFFFFFFFF +F6F6F6101410EEEAEE000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5D2D54A484A080C08080C08 +4A484AD5D2D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6F2EEF6EEEEEEEEE6F6EAEEEEEEE6 +EEEAE6EEE6DEE6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF4A4C4AACAAACFFFFFFFFFFFFEEEEEE000000E6E6E6FFFFFFFFFFFF +A4A5A44A4C4AFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDADE1014109C999CF6F2F6F6F2F6 +9C999C101410DEDADEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6EEF6EEF2E6F6EEEEEEEAE6EEEAE6 +EEE6E6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFAFF7371731014101010108B8D8BFFFFFFFFFFFFDEDEDE4A4C4A080C08000400 +414441E6E6E6FFFFFFFFFFFF0000008B8D8B181C18000000FFFFFFFFFFFF7B797B101410 +080808525552F6F2F6FFFFFF000000000000000000000000FFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFACAEAC4A4C4AFFFFFFFFFFFFB4B6B4000000ACAEACFFFFFFFFFFFF +414441ACAEACFFFFFF000000949594181C18000400313031D5D2D5FFFFFFFFFFFFFFFFFF +7B797B101410080808525552F6F2F6FFFFFFFFFFFF000000949594181C18000400313031 +D5D2D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A595A8B898BFFFFFFFFFFFFFFFFFF +FFFFFF8B898B5A5D5AFFFFFFFFFFFF000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFF6F6F65A5D5A0808081014108B898B000000FFFFFFFFFFFF +000000EEEEEE101410EEEEEEFFFFFFFFFFFFFFFFFFEEEEEE101410EEEEEEFFFFFF7B797B +101410080808525552F6F2F6FFFFFFFFFFFFB4B6B4292829000400181C189C999CFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000949594202020000400292829C5C2C5A4A1A4 +202420000400313031D5D2D5FFFFFFFFFFFFFFFFFF7B797B101410080808525552F6F2F6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDEDE4A4C4A080C08000400414441E6E6E6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000949594181C18000400313031D5D2D5 +FFFFFFFFFFFFFFFFFF7B797B101410080808525552F6F2F6FFFFFFFFFFFFDEDEDE4A4C4A +080C08000400414441E6E6E6FFFFFFFFFFFF0000008B8D8B181C18000000000000000000 +000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEEEF2EEF6EEEEF6EAEEEEEEE6 +EEEAE6E6EADEEEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF7B797B414441E6E2E6EEEEEE6A6D6AFFFFFFFFFFFF292829BDBEBDF6F6F6F6F2F6 +6A6D6A5A595AFFFFFFFFFFFF0000005A595AEEEAEEFFFFFFFFFFFF838183414441E6E2E6 +F6F2F66261626A696AFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFAFF181818EEEAEEFFFFFF7B797B414441737173FFFFFFE6E6E6 +181818FFFAFFFFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF838183 +414441E6E2E6F6F2F66261626A696AFFFFFFFFFFFF000000525552E6E2E6F6F6F6838183 +313431FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF101410E6E6E6FFFFFFFFFFFFFFFFFF +FFFFFFE6E6E6181818FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C999C4A4C4AFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF7371734A4C4AEEEAEEEEEAEE4A4C4A000000FFFFFFFFFFFF +000000FFFFFF6265628B898BFFFFFFFFFFFFFFFFFF838583737173FFFFFF838183414441 +E6E2E6F6F2F66261626A696AFFFFFFFFFFFF101410ACAEACFFFAFFE6E2E6626562FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000525052E6E2E6F6F6F6838583080C08525552 +E6E2E6F6F6F6838183313431FFFFFFFFFFFF838183414441E6E2E6F6F2F66261626A696A +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF292829BDBEBDF6F6F6F6F2F66A6D6A5A595A +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000525552E6E2E6F6F6F6838183313431 +FFFFFFFFFFFF838183414441E6E2E6F6F2F66261626A696AFFFFFFFFFFFF292829BDBEBD +F6F6F6F6F2F66A6D6A5A595AFFFFFFFFFFFF0000005A595AEEEAEEFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6F2EEF6EEEEEEEEE6EEEEE6F6EAEE +EEEAE6EEE6E6EEE6E6E6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF181C18DEDADEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +F6F6F6101410FFFFFFFFFFFF000000E6E6E6FFFFFFFFFFFFFFFFFF181C18D5D6D5FFFFFF +FFFFFFEEEAEE101410FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF6A6D6A949194FFFFFF393C39C5C6C5313431FFFFFF838583 +6A6D6AFFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF181C18 +D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6 +000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFAFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFAFF000400FFFFFFFFFFFFFFFFFFFFFFFFBDBABD313031F6F2F6FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF181818DEDEDEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFF +000000FFFFFFD5D6D5202020FFFFFFFFFFFFFFFAFF202020E6E2E6FFFFFF181C18D5D6D5 +FFFFFFFFFFFFEEEAEE101410FFFFFFFFFFFF181C18949194E6E2E6FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000000EEEEEE +FFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F6F6101410 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400 +FFFFFFFFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF6F6F6101410FFFFFFFFFFFF000000E6E6E6FFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEF6F2EEF6EEEEEEEEE6EEEAE6 +EEEAE6EEE6DEE6E6DEE6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5C6C5393C39080808000000 +000000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000400000000000000 +000000000000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFCDCECD313031FFFAFF292829FFFFFF292829F6F6F6292829 +CDCECDFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000400 +000000000000000000000000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF101410E6E6E6FFFFFFFFFFFFFFFFFF +FFFFFFE6E6E6181818FFFFFFFFFFFFFFFFFFD5D6D5202420E6E2E6FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000000FFFFFFFFFFFF +000000FFFFFFFFFFFF414441ACAEACFFFFFFA4A5A45A595AFFFFFFFFFFFF000400000000 +000000000000000000000000FFFFFFFFFFFFCDCACD4A4C4A101410181C18ACAEACFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000400000000000000000000000000000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5C6C5393C39080808000000000000000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFF000400000000000000000000000000000000FFFFFFFFFFFFC5C6C5393C39 +080808000000000000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6F2EEEEF2E6F6EEEEEEEAE6EEEEE6 +EEE6E6EEE6E6EEE6E6EEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF181C18DEDADEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181C18ACAAACF6F2F6FFFFFF +F6F2F6000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF181C18E6E6E6FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000400F6F6F6FFFFFF +FFFFFFEEEEEE000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3130319C9D9C626162FFFFFF6265628B898B292C29 +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF181C18 +E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A595A8B898BFFFFFFFFFFFFFFFFFF +FFFFFF8B898B5A595AFFFFFFFFFFFFEEEAEE202420C5C6C5FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF181818DEDEDEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFF +000000FFFFFFFFFFFFB4B6B4393C39FFFFFF313431CDCECDFFFFFFFFFFFF181C18E6E6E6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B6B4181818FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181C18ACAAACF6F2F6FFFFFFF6F2F6000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181C18ACAAAC +F6F2F6FFFFFFF6F2F6000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEF6F2EEF6EEEEEEEEE6F6EAEEEEEAE6 +EEEAE6EEE6E6E6E6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF7B797B414441E6E2E6F6F2F6737173FFFFFFFFFFFF101010B4B2B4FFFAFFDEDEDE +525552000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF8385834A484ADEDEDE +FFFAFFD5D2D5525552FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF313431838183F6F6F6 +E6E6E6525552000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B8D8B101410A4A1A4FFFFFFA4A5A40808088B8D8B +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF838583 +4A484ADEDEDEFFFAFFD5D2D5525552FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDEDADE1014109C999CF6F2F6F6F2F6 +9C999C101410DEDADEFFFFFFFFFFFF393839A4A1A4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF737173525052EEEAEEEEEAEE4A4C4A000000FFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFF292829949594414441FFFFFFFFFFFFFFFFFF8385834A484A +DEDEDEFFFAFFD5D2D5525552FFFFFFFFFFFF5A595ADEDADEFFFAFFB4B6B4101410FFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF101010B4B2B4FFFAFFDEDEDE525552000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552FFFFFFFFFFFF101010B4B2B4 +FFFAFFDEDEDE525552000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF101010 +D5D6D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F6EEF6EEEEEEF2E6F6EEEEEEEEE6EEEAE6 +EEE6E6EEE6E6E6E6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFAFF6A6D6A1010101010108B8D8BFFFFFFFFFFFFB4B2B4202020000400202020 +949594000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF838583181C18 +000400292C29ACAAACFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFCDCECD313031000400 +181C18949594000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEAEE000400E6E2E6FFFFFFE6E2E6000400EEEAEE +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +838583181C18000400292C29ACAAACFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5D2D54A484A080808080808 +4A484AD5D2D5FFFFFFFFFFFFFFFFFF000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFF6F6F65A595A080808101410838583000400FFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFF949594000000BDBABDFFFFFFFFFFFFFFFFFFFFFFFF838583 +181C18000400292C29ACAAACFFFFFFFFFFFFA4A5A4202420000400292829BDBABDFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF838583181C18000400292C29ACAAAC +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B2B4202020000400202020949594000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFF838583181C18000400292C29ACAAACFFFFFFFFFFFFB4B2B4202020 +000400202020949594000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF838583 +080C08000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEF6EEEEEEEEEEF6EAEEEEEEE6 +EEEAE6E6EADEEEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5D6D5202020FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F2EEF6EEF6EEF2EEEEEEE6EEEAEEEEEEE6 +EEE6E6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF737173EEEEEEEEEAEE4A4C4A737573FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6F2EEF6EEEEF6EEEEEEEEE6EEEAE6 +EEEAE6EEE6DEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF949594101410080C085A5D5AF6F6F6FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEF6EEEEEEF2E6EEEEEEF6EAEEEEEAE6 +E6EADEEEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6EEF2EEF6EEEEEEEEE6EEEEE6F6EAEE +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6EEF2EEF6EEEEF6EEEEEEEAE6EEEAE6 +EEEAE6EEE6E6E6E6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F2EEF6EEF6F6F2EEEEEEE6F6EAEEEEEEE6 +EEE6E6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBDBEBD181C18000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6F2EEF6EEEEEEEEE6EEEAEEEEEAE6 +E6EADEEEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF313431ACAEACFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6EEF2EEEEF2EEF6EEEEEEEEE6F6EAEE +EEEAE6EEE6DEE6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF080808FFFAFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F2EEF6F2EEF6EEEEEEEEEEEEEEE6EEEAE6 +EEEAE6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6F6F2EEEEF2E6F6EEEEEEEEE6EEEAE6 +EEEAE6EEE6E6E6E6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFF6F6F6626562080C08080C08626562FFFAFFFFFFFF000000000000000000000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFF7371731014101010108B8D8BFFFFFFFFFFFF +F6F6F6626562080C08080C08626562FFFAFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFF0000008B8D8B181C18000000FFFFFFB4B6B4292829000400 +181C189C999CFFFFFFFFFFFFFFFFFF7B797B101410080808525552F6F2F6FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +949594181C18000400313031D5D2D5FFFFFFFFFFFFFFFFFF7B797B101410080808525552 +F6F2F6FFFFFFFFFFFFFFFFFF7B797B101410080808525552F6F2F6FFFFFFFFFFFFFFFAFF +6261620808081014108B898B000000FFFFFFFFFFFF000000949594181C18000400313031 +D5D2D5FFFFFFFFFFFF000000FFFFFF000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000949594202020000400292829C5C2C5A4A1A4202420000400 +313031D5D2D5FFFFFFFFFFFF000000FFFFFFFFFFFF000000949594181C18000400313031 +D5D2D5FFFFFFFFFFFFFFFAFF6261620808081014108B898B000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFB4B6B4292829000400181C189C999CFFFFFFFFFFFFF6F6F6626562 +080C08080C08626562FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000949594 +202020000400292829C5C2C5A4A1A4202420000400313031D5D2D5FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFAFF7371731014101010108B8D8B +FFFFFFFFFFFF000000949594181C18000400313031D5D2D5FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F6EEF6F2EEF6EEEEEEEEE6EEEAEEEEEEE6 +EEE6E6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF7371734A484AEEEAEEEEEAEE414441737573FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B797B414441E6E2E6EEEEEE6A6D6AFFFFFFFFFFFF +7371734A484AEEEAEEEEEAEE414441737573FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFF0000005A595AEEEAEEFFFFFFFFFFFF101410ACAEACFFFAFF +E6E2E6626562FFFFFFFFFFFF838183414441E6E2E6F6F2F66261626A696AFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF838183414441E6E2E6F6F2F6626162 +6A696AFFFFFFFFFFFF838183414441E6E2E6F6F2F66261626A696AFFFFFFFFFFFF737573 +4A484AEEEAEEEEEAEE4A484A000000FFFFFFFFFFFF000000525552E6E2E6F6F6F6838183 +313431FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000525052E6E2E6F6F6F6838583080C08525552E6E2E6F6F6F6 +838183313431FFFFFFFFFFFF000000FFFFFFFFFFFF000000525552E6E2E6F6F6F6838183 +313431FFFFFFFFFFFF7375734A484AEEEAEEEEEAEE4A484A000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF101410ACAEACFFFAFFE6E2E6626562FFFFFFFFFFFF7371734A484A +EEEAEEEEEAEE414441737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000525052 +E6E2E6F6F6F6838583080C08525552E6E2E6F6F6F6838183313431FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF7B797B414441E6E2E6EEEEEE6A6D6A +FFFFFFFFFFFF000000525552E6E2E6F6F6F6838183313431FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEEEF2EEEEEEEEF6EAEEEEEAE6 +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181C18DEDADEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFF000000E6E6E6FFFFFFFFFFFFFFFFFF181C18949194E6E2E6 +FFFFFFFFFFFFFFFFFFFFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE +101410FFFFFFFFFFFF181C18D5D6D5FFFFFFFFFFFFEEEAEE101410FFFFFFFFFFFF181818 +DEDADEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6 +000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000000EEEEEEFFFFFFFFFFFF +F6F6F6000400FFFFFFFFFFFF000000FFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6 +000400FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF181C18949194E6E2E6FFFFFFFFFFFFFFFFFFFFFFFF181818DEDADE +FFFFFFFFFFFFDEDADE181818FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000EEEEEE +FFFFFFFFFFFFF6F6F6000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF181C18DEDADEFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000EEEEEEFFFFFFFFFFFFF6F6F6000400FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2F6EEF2EEF6EEEEF6EEEEEEEEE6EEEAE6 +EEEAE6EEE6E6EEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFCDCACD4A4C4A101410 +181C18ACAEACFFFFFFFFFFFF000400000000000000000000000000000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000400000000000000000000000000 +000000FFFFFFFFFFFF000400000000000000000000000000000000FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFAFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFAFF000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFCDCACD4A4C4A101410181C18ACAEACFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFAFF000400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFAFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F2EEF6F2EEF6EEEEEEEEE6F6EAEEEEEAE6 +EEEAE6EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181C18DEDADEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +181818DEDADEFFFFFFFFFFFFDEDADE181818FFFFFFFFFFFF000400F6F6F6FFFFFFFFFFFF +EEEEEE000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +B4B6B4181818FFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF181C18E6E6E6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF181818 +DEDADEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF181818DEDADEFFFFFFFFFFFFDEDADE000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4B6B4181818FFFFFFFFFFFF181818DEDADE +FFFFFFFFFFFFDEDADE181818FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000400 +F6F6F6FFFFFFFFFFFFEEEEEE000000FFFFFFFFFFFF181C18DEDADEFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6EEF6EEF2E6F6EEEEEEEEE6EEEEE6 +EEE6E6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFF7371734A4C4AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B797B414441E6E2E6F6F2F6737173FFFFFFFFFFFF +7371734A4C4AEEEAEEEEEAEE4A484A737573FFFFFFFFFFFF313431838183F6F6F6E6E6E6 +525552000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF5A595ADEDADEFFFAFF +B4B6B4101410FFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5 +525552FFFFFFFFFFFF8385834A484ADEDEDEFFFAFFD5D2D5525552FFFFFFFFFFFF737573 +4A4C4AEEEAEEEEEAEE4A4C4A000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF101010D5D6D5FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFF7375734A4C4AEEEAEEEEEAEE4A4C4A000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF5A595ADEDADEFFFAFFB4B6B4101410FFFFFFFFFFFF7371734A4C4A +EEEAEEEEEAEE4A484A737573FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF313431 +838183F6F6F6E6E6E6525552000000FFFFFFFFFFFF7B797B414441E6E2E6F6F2F6737173 +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6F2EEF6EEEEEEEEE6F6EAEEEEEAE6 +EEEAE6EEE6E6EEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFF6F6F6626162080C08080C08626562F6F6F6FFFFFFFFFFFF000000FFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFF6A6D6A1010101010108B8D8BFFFFFFFFFFFF +F6F6F6626162080C08080C08626562F6F6F6FFFFFFFFFFFFCDCECD313031000400181C18 +949594000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFA4A5A4202420000400 +292829BDBABDFFFFFFFFFFFFFFFFFF838583181C18000400292C29ACAAACFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF838583181C18000400292C29 +ACAAACFFFFFFFFFFFFFFFFFF838583181C18000400292C29ACAAACFFFFFFFFFFFFF6F6F6 +6261620808081014108B898B000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF838583080C08000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF +FFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF +000000FFFFFFFFFFFFF6F6F66261620808081014108B898B000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFA4A5A4202420000400292829BDBABDFFFFFFFFFFFFF6F6F6626162 +080C08080C08626562F6F6F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF +FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFCDCECD +313031000400181C18949594000000FFFFFFFFFFFFFFFAFF6A6D6A1010101010108B8D8B +FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F2F6EEF2EEF6EEEEEEEEEEEEEEE6EEEAE6 +EEEAE6E6EADEEEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6F2EEEEF2E6F6EEEEEEEEE6EEEAE6 +EEEAE6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEF6EEEEEEEEEEF6EAEEEEEEE6 +EEEAE6EEE6DEE6E6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFF2F6F6F6EEF6F2EEF6EEEEEEEEE6EEEEE6EEEAE6 +EEEAE6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEF6EEEEF6EEEEF6EAEEEEEAE6 +E6EADEEEE6E6EEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFE6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756A83756A7B756A83756A83756A83756A83756A83756A7B7562 +83756A7B756A83756A83756A7B756A83756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEF6EEF6F6EEEEF6EEEEEEEEE6EEEAE6 +E6EADEEEE6DEEEE6DEEEE2E6E6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2EEEEF2EEEEF2E6F6EEEEEEEEE6EEEAE6 +EEE6E6EEE6E6EEE6DEE6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6EEF6F6EEEEEEEEEEF6EAEEEEEEE6 +EEEAE6E6EADEE6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEEEF2EEEEF2EEF6EEEEEEEEE6EEEAE6 +EEEAE6EEE6E6EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6101010101010101010101010101010 +101010101010EEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F2EEEEF2EE101010101010101010101010 +101010EEE6E6E6E6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F2F6F6F2EEEEF2EE101010101010101010 +EEEAE6EEE6E6EEE6DEE6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6F6F6F6EEF6EEF6F6EEEEEEEEE6101010EEEAE6 +EEEAE6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F2EEF6F2EEF6EEEEEEEEEEEEEEE6F6EAEE +EEEAE6EEE6E6EEE6DEEEE2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F6EEF6F6EEF6EEF6EEF2E6F6EEEEF6EAEEEEEEE6 +EEEAE6E6EADEEEE6E6E6E6DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE683756AFFFFFFF6F2F6F6F2F6F6F2EEF6EEEEEEEEE6EEEEE6EEEAE6 +EEE6E6EEE6E6E6E6DEE6E2DEE6DAD583756AEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5B6AC +EEEAE6EEEAE6EEEAE6CDCAC583756AE6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD583756ACDCAC5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +C5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6ACC5B6AC +EEEAE6EEEAE6EEEAE6EEEAE6CDCAC583756A83756A7B756A83756A7B756283756A83756A +83756A7B756283756A7B756ACDCAC5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DEEEE2DE +EEE2DEEEE2DEEEE2DEEEE2DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEE2DECDCAC583756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756ACDCAC5EEE2DEEEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEE2DECDCAC583756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A83756A +83756A83756A83756ACDCAC5EEE2DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +E6E2DECDCAC583756AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83756ACDCAC5E6DEDE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6E6E2DECDCAC583756AFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFF83756ACDCAC5E6DEDEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEDEDE83756AFFFFFFF6FAF6F6F6F6FFF6F6F6FAF6F6F6F6F6FAF6F6F6F6F6FAF6FFF6F6 +F6F6F6FFF6F6F6FAF6FFF6F6F6F6F6F6FAF6FFF6F6F6F6F6FFF6F6F6FAF6FFF6F6F6FAF6 +FFF6F6FFF6F6FFF6F6F6F6F6F6F6F6FFF6F6F6F6F6FFF6F6F6FAF6F6F6F6FFF6F6F6FAF6 +FFF6F6F6FAF6FFF6F6F6F6F6F6FAF6FFF6F6F6F6F6FFF6F6F6F6F6F6F6F6F6FAF6F6F6F6 +F6F6F6F6FAF6FFF6F6F6FAF6F6F6F6F6F6F6F6F6F6FFF6F6F6F6F6FFF6F6FFF6F6F6F6F6 +F6FAF6F6F6F6FFF6F6F6F6F6FFF6F6F6FAF6FFF6F6F6FAF6F6F6F6FFF6F6F6FAF6F6F6F6 +F6F6F6FFF6F6F6F6F6F6FAF6FFF6F6F6FAF6FFF6F6FFF6F6F6F6F6F6FAF6FFF6F6F6F6F6 +FFF6F6F6F6F6FFF6F6F6F6F6F6F6F6FFF6F6FFF6F6F6FAF6FFF6F6F6FAF6F6FAF6F6F6F6 +FFF6F6F6F6F6FFF6F6F6F6F6FFF6F6F6F6F6FFF6F6FFF6F6F6F6F6E6DAD57B756AE6E2DE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6E6E2D583756AFFFFFFF6F6F6F6F6F6F6FAF6 +FFF6F6F6F6F6F6FAF6F6F6F6FFF6F6F6FAF6FFF6F6F6F6F6FFF6F6FFF6F6F6F6F6F6FAF6 +F6F6F6FFF6F6F6FAF6F6F6F6F6FAF6F6F6F6F6FAF6FFF6F6F6F6F6FFF6F6F6FAF6FFF6F6 +F6F6F6F6FAF6FFF6F6F6F6F6FFF6F6F6FAF6FFF6F6F6FAF6FFF6F6FFF6F6FFF6F6F6F6F6 +F6F6F6FFF6F6F6F6F6FFF6F6F6FAF6F6F6F6FFF6F6F6FAF6FFF6F6F6FAF6FFF6F6F6F6F6 +F6FAF6FFF6F6F6F6F6FFF6F6F6F6F6F6F6F6F6FAF6F6F6F6F6F6F6F6FAF6FFF6F6F6FAF6 +F6F6F6F6F6F6F6F6F6FFF6F6F6F6F6FFF6F6FFF6F6F6F6F6F6FAF6F6F6F6FFF6F6F6F6F6 +FFF6F6F6FAF6FFF6F6F6FAF6F6F6F6FFF6F6F6FAF6F6F6F6F6F6F6FFF6F6F6F6F6F6FAF6 +FFF6F6F6FAF6FFF6F6FFF6F6F6F6F6F6FAF6FFF6F6F6F6F6FFF6F6F6F6F6FFF6F6F6F6F6 +F6F6F6FFF6F6FFF6F6E6DAD583756AE6E2D5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +E6E2DE7B796AFFFFFFF6F6F6F6F2F6F6F6EEFFF2F6F6F6F6F6F2F6F6F2F6F6F6EEF6F6F6 +F6F6F6F6F6EEF6F6F6F6F6F6F6F6EEF6F2F6F6F6F6F6F6EEF6F6EEF6F6F6F6F6EEF6F6F6 +F6F6F6F6F6EEF6F6EEFFF2F6F6F6F6F6F6EEF6F6F6F6F6EEFFF2F6F6F6F6F6F6F6FFF2F6 +F6F6EEF6F6F6F6F6F6F6F6EEFFF2F6F6F6EEF6F6F6F6F6F6F6F6EEFFF2F6F6F6F6F6F6EE +F6F6F6FFF2F6F6F6EEF6F6F6FFF2F6F6F6EEF6F6F6F6F6EEF6F6F6F6F6F6F6F6EEF6F6F6 +FFF2F6F6F6F6F6F6EEF6F2F6F6F6EEF6F6F6F6F6F6F6F2F6F6F6EEF6F6F6FFF2F6F6F6EE +F6F6F6F6F6EEF6F6F6FFF2F6F6F6EEFFF2F6F6F6EEF6F6EEF6F6F6F6F6F6F6F6EEF6F2F6 +F6F6EEF6F6F6F6F6EEF6F6EEF6F6F6F6F6EEF6F6EEF6F6F6F6F6F6F6F6F6FFF2F6F6F6F6 +F6F6F6F6F6EEF6F6F6F6F6EEF6F6F6F6F6EEF6F6F6F6F6EEF6F6F6E6DAD583756AEEE2DE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEE2DE83756AFFFFFFF6F6F6FFF2F6F6F6F6 +F6F6F6F6F6EEF6F2F6F6F6EEF6F6F6FFF2F6F6F6EEF6F6F6F6F6EEF6F6EEF6F2F6F6F6F6 +F6F2F6F6F6EEFFF2F6F6F6F6F6F2F6F6F2F6F6F6EEF6F6F6F6F6F6F6F6EEF6F6F6F6F6F6 +F6F6EEF6F2F6F6F6F6F6F6EEF6F6EEF6F6F6F6F6EEF6F6F6F6F6F6F6F6EEF6F6EEFFF2F6 +F6F6F6F6F6EEF6F6F6F6F6EEFFF2F6F6F6F6F6F6F6FFF2F6F6F6EEF6F6F6F6F6F6F6F6EE +FFF2F6F6F6EEF6F6F6F6F6F6F6F6EEFFF2F6F6F6F6F6F6EEF6F6F6FFF2F6F6F6EEF6F6F6 +FFF2F6F6F6EEF6F6F6F6F6EEF6F6F6F6F6F6F6F6EEF6F6F6FFF2F6F6F6F6F6F6EEF6F2F6 +F6F6EEF6F6F6F6F6F6F6F2F6F6F6EEF6F6F6FFF2F6F6F6EEF6F6F6F6F6EEF6F6F6FFF2F6 +F6F6EEFFF2F6F6F6EEF6F6EEF6F6F6F6F6F6F6F6EEF6F2F6F6F6EEF6F6F6F6F6EEF6F6EE +F6F6F6F6F6EEF6F6EEE6DAD583756AE6E2DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +E6E2DE83756AFFFFFFF6F2F6F6F6EEF6F2EEF6F2EEF6F2EEEEF6EEF6F2F6F6F2EEF6F2F6 +EEF6EEF6F2F6F6F2F6EEF6EEF6F2F6F6F6EEF6F2EEF6F2F6F6F2F6EEF6EEF6F2F6F6F2EE +F6F2F6F6F6EEF6F2F6EEF6EEF6F2EEF6F2F6F6F2EEF6F2F6F6F2EEF6F2F6EEF6EEF6F2EE +F6F2EEEEF6EEF6F2F6F6F2F6F6F2EEF6F2F6F6F2EEF6F6EEF6F2F6EEF6EEF6F2EEF6F2F6 +EEF6EEF6F2EEF6F2EEF6F2F6EEF6EEF6F2F6F6F2EEF6F2F6F6F2F6F6F2EEF6F2F6EEF6EE +F6F2EEF6F2F6F6F2F6EEF6EEF6F2F6EEF6EEF6F2EEF6F2EEF6F2F6EEF6EEF6F2F6F6F2EE +EEF6EEF6F2F6F6F2F6EEF6EEF6F2EEF6F2EEF6F2EEF6F2F6EEF6EEF6F2EEF6F2F6F6F2EE +F6F2F6F6F2EEF6F2F6F6F2F6F6F2EEF6F2F6F6F2EEF6F2F6EEF6EEF6F2EEF6F2EEEEF6EE +F6F2EEF6F2F6EEF6EEF6F2F6F6F2F6F6F2EEF6F2F6F6F2F6F6F2EEE6DAD583796AEEE2DE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6E6E2DE83756AFFFFFFF6F6EEF6F2F6EEF6EE +F6F2F6EEF6EEF6F2F6F6F2F6EEF6EEF6F2EEF6F6EEF6F2F6F6F2EEF6F2F6F6F2EEF6F2F6 +F6F6EEF6F2EEF6F2EEF6F2EEEEF6EEF6F2F6F6F2EEF6F2F6EEF6EEF6F2F6F6F2F6EEF6EE +F6F2F6F6F6EEF6F2EEF6F2F6F6F2F6EEF6EEF6F2F6F6F2EEF6F2F6F6F6EEF6F2F6EEF6EE +F6F2EEF6F2F6F6F2EEF6F2F6F6F2EEF6F2F6EEF6EEF6F2EEF6F2EEEEF6EEF6F2F6F6F2F6 +F6F2EEF6F2F6F6F2EEF6F6EEF6F2F6EEF6EEF6F2EEF6F2F6EEF6EEF6F2EEF6F2EEF6F2F6 +EEF6EEF6F2F6F6F2EEF6F2F6F6F2F6F6F2EEF6F2F6EEF6EEF6F2EEF6F2F6F6F2F6EEF6EE +F6F2F6EEF6EEF6F2EEF6F2EEF6F2F6EEF6EEF6F2F6F6F2EEEEF6EEF6F2F6F6F2F6EEF6EE +F6F2EEF6F2EEF6F2EEF6F2F6EEF6EEF6F2EEF6F2F6F6F2EEF6F2F6F6F2EEF6F2F6F6F2F6 +F6F2EEF6F2F6F6F2EEE6DAD57B796AE6E2DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +E6E6DE837573FFFFFFEEF2EEF6EEF6F6F2EEF6EEEEEEF2EEF6EEF6EEF2EEF6F2EEF6F2EE +F6F2EEF6F2EEF6F2EEF6F2EEF6F2EEF6EEF6F6F2EEEEF2EEF6F2EEF6F2EEEEF2EEF6F2EE +EEF2EEF6F2EEF6F2EEF6EEEEEEF2EEF6F2EEF6F2EEF6EEF6EEF2EEF6F2EEEEF2EEF6EEEE +F6F2EEF6EEF6F6F2EEF6F2EEF6F2EEEEF2EEF6F2EEF6EEEEF6F2EEF6F2EEEEF2EEF6F2EE +F6EEEEF6EEEEEEF2EEF6F2EEF6F2EEF6EEF6EEF2EEF6F2EEEEF2EEF6EEF6EEF2EEF6EEEE +F6F2EEEEF2EEF6F2EEF6F2EEF6F2EEF6F2EEF6EEF6EEF2EEF6F2EEF6F2EEF6EEEEEEF2EE +F6EEF6EEF2EEF6F2EEF6F2EEF6EEF6EEF2EEF6EEEEEEF2EEF6F2EEF6EEF6F6F2EEEEF2EE +F6F2EEF6F2EEF6F2EEEEF2EEF6F2EEEEF2EEF6F2EEEEF2EEF6EEEEF6F2EEF6F2EEF6EEEE +F6F2EEF6F2EEF6F2EEF6F2EEEEF2EEF6F2EEEEF2EEF6F2EEF6EEF6E6DAD5837573E6E6DE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEE2E683796AFFFFFFF6EEEEEEF2EEF6F2EE +F6F2EEF6F2EEEEF2EEF6F2EEF6F2EEF6F2EEF6EEEEF6F2EEEEF2EEF6EEF6F6F2EEEEF2EE +F6EEF6F6F2EEF6EEEEEEF2EEF6EEF6EEF2EEF6F2EEF6F2EEF6F2EEF6F2EEF6F2EEF6F2EE +F6F2EEF6EEF6F6F2EEEEF2EEF6F2EEF6F2EEEEF2EEF6F2EEEEF2EEF6F2EEF6F2EEF6EEEE +EEF2EEF6F2EEF6F2EEF6EEF6EEF2EEF6F2EEEEF2EEF6EEEEF6F2EEF6EEF6F6F2EEF6F2EE +F6F2EEEEF2EEF6F2EEF6EEEEF6F2EEF6F2EEEEF2EEF6F2EEF6EEEEF6EEEEEEF2EEF6F2EE +F6F2EEF6EEF6EEF2EEF6F2EEEEF2EEF6EEF6EEF2EEF6EEEEF6F2EEEEF2EEF6F2EEF6F2EE +F6F2EEF6F2EEF6EEF6EEF2EEF6F2EEF6F2EEF6EEEEEEF2EEF6EEF6EEF2EEF6F2EEF6F2EE +F6EEF6EEF2EEF6EEEEEEF2EEF6F2EEF6EEF6F6F2EEEEF2EEF6F2EEF6F2EEF6F2EEEEF2EE +F6F2EEEEF2EEF6F2EEE6DAD5837573E6E6DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEE2E6837D6AFFFFFFF6EEEEEEEEEEEEF2E6F6EEEEEEEEEEF6EEEEF6EEEEEEF2E6F6EEEE +EEF2E6F6EEEEEEF2E6F6EEEEEEEEEEEEF2E6EEEEEEF6EEEEF6EEEEEEEEEEF6EEEEEEEEEE +F6EEEEEEEEEEF6EEEEEEF2E6F6EEEEEEEEEEEEF2E6EEEEEEF6EEEEF6EEEEF6EEEEEEEEEE +EEF2E6F6EEEEEEF2E6F6EEEEEEF2E6F6EEEEF6EEEEEEF2E6F6EEEEEEEEEEF6EEEEEEF2E6 +EEEEEEEEEEEEEEF2E6F6EEEEF6EEEEEEF2E6F6EEEEF6EEEEF6EEEEEEEEEEEEF2E6EEEEEE +F6EEEEEEEEEEF6EEEEEEF2E6F6EEEEEEEEEEEEF2E6F6EEEEEEEEEEF6EEEEEEEEEEF6EEEE +F6EEEEEEEEEEF6EEEEF6EEEEEEF2E6F6EEEEEEEEEEEEEEEEF6EEEEEEF2E6F6EEEEEEEEEE +F6EEEEEEF2E6F6EEEEEEEEEEF6EEEEF6EEEEEEF2E6F6EEEEEEEEEEF6EEEEEEF2E6EEEEEE +EEF2E6F6EEEEEEEEEEEEF2E6F6EEEEEEEEEEF6EEEEF6EEEEEEF2E6E6DAD583796AE6E6DE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6E6E6DE837973FFFFFFEEF2E6F6EEEEF6EEEE +F6EEEEEEEEEEF6EEEEEEEEEEEEF2E6F6EEEEEEF2E6F6EEEEF6EEEEEEF2E6F6EEEEF6EEEE +EEEEEEEEF2E6F6EEEEEEEEEEF6EEEEF6EEEEEEF2E6F6EEEEEEF2E6F6EEEEEEF2E6F6EEEE +EEEEEEEEF2E6EEEEEEF6EEEEF6EEEEEEEEEEF6EEEEEEEEEEF6EEEEEEEEEEF6EEEEEEF2E6 +F6EEEEEEEEEEEEF2E6EEEEEEF6EEEEF6EEEEF6EEEEEEEEEEEEF2E6F6EEEEEEF2E6F6EEEE +EEF2E6F6EEEEF6EEEEEEF2E6F6EEEEEEEEEEF6EEEEEEF2E6EEEEEEEEEEEEEEF2E6F6EEEE +F6EEEEEEF2E6F6EEEEF6EEEEF6EEEEEEEEEEEEF2E6EEEEEEF6EEEEEEEEEEF6EEEEEEF2E6 +F6EEEEEEEEEEEEF2E6F6EEEEEEEEEEF6EEEEEEEEEEF6EEEEF6EEEEEEEEEEF6EEEEF6EEEE +EEF2E6F6EEEEEEEEEEEEEEEEF6EEEEEEF2E6F6EEEEEEEEEEF6EEEEEEF2E6F6EEEEEEEEEE +F6EEEEF6EEEEEEF2E6E6DAD583796AEEE2E6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEE6DE8B7973FFFFFFEEEEE6EEEEEEF6EAEEEEEEE6F6EAEEEEEEE6EEEEE6F6EAEEEEEEEE +EEEEE6EEEEEEEEEEEEEEEEE6EEEEE6F6EAEEEEEEEEEEEEE6EEEEEEEEEEE6EEEEE6EEEEEE +EEEEE6EEEEEEEEEEE6EEEEE6EEEEEEEEEEE6EEEEEEF6EAEEEEEEE6EEEEE6EEEEE6F6EAEE +EEEEE6F6EAEEEEEEEEEEEEE6F6EAEEEEEEE6EEEEE6EEEEEEEEEEE6EEEEEEEEEEE6EEEEEE +F6EAEEEEEEEEF6EAEEEEEEE6EEEEE6EEEEEEEEEEE6EEEEE6EEEEE6EEEEEEF6EAEEEEEEE6 +F6EAEEEEEEE6EEEEEEEEEEE6F6EAEEEEEEE6F6EAEEEEEEEEEEEEE6EEEEEEEEEEE6EEEEEE +EEEEE6F6EAEEEEEEE6EEEEE6F6EAEEEEEEEEF6EAEEEEEEEEEEEEE6F6EAEEEEEEE6F6EAEE +EEEEE6F6EAEEEEEEE6EEEEEEEEEEE6EEEEE6EEEEEEEEEEE6EEEEEEEEEEE6F6EAEEEEEEEE +EEEEEEEEEEE6EEEEEEF6EAEEEEEEE6EEEEE6F6EAEEEEEEE6EEEEE6E6DAD5837D6AEEE6E6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6E6E6DE837D6AFFFFFFEEEEE6F6EAEEEEEEE6 +EEEEE6EEEEE6EEEEEEF6EAEEEEEEEEEEEEE6EEEEEEEEEEE6EEEEEEF6EAEEEEEEE6EEEEE6 +EEEEEEF6EAEEEEEEE6F6EAEEEEEEE6EEEEE6F6EAEEEEEEEEEEEEE6EEEEEEEEEEEEEEEEE6 +EEEEE6F6EAEEEEEEEEEEEEE6EEEEEEEEEEE6EEEEE6EEEEEEEEEEE6EEEEEEEEEEE6EEEEE6 +EEEEEEEEEEE6EEEEEEF6EAEEEEEEE6EEEEE6EEEEE6F6EAEEEEEEE6F6EAEEEEEEEEEEEEE6 +F6EAEEEEEEE6EEEEE6EEEEEEEEEEE6EEEEEEEEEEE6EEEEEEF6EAEEEEEEEEF6EAEEEEEEE6 +EEEEE6EEEEEEEEEEE6EEEEE6EEEEE6EEEEEEF6EAEEEEEEE6F6EAEEEEEEE6EEEEEEEEEEE6 +F6EAEEEEEEE6F6EAEEEEEEEEEEEEE6EEEEEEEEEEE6EEEEEEEEEEE6F6EAEEEEEEE6EEEEE6 +F6EAEEEEEEEEF6EAEEEEEEEEEEEEE6F6EAEEEEEEE6F6EAEEEEEEE6F6EAEEEEEEE6EEEEEE +EEEEE6EEEEE6EEEEEEE6DAD58B7973E6E6DEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +E6EADE837D6AFFFFFFEEEEE6F6EAEEEEEEE6EEEAE6EEEEE6F6EAEEEEEAE6EEEEE6EEEEE6 +F6EAEEEEEEE6EEEEE6EEEAEEEEEAE6EEEEE6F6EAEEEEEEE6EEEAEEEEEAE6EEEEE6EEEAEE +EEEEE6EEEAEEEEEAE6F6EAEEEEEEE6EEEAEEEEEEE6EEEEE6EEEAEEEEEEE6EEEAE6EEEEE6 +EEEAE6EEEEE6EEEEE6EEEAEEEEEEE6EEEAE6EEEEE6F6EAEEEEEEE6EEEEE6EEEAEEEEEAE6 +EEEEE6EEEEE6EEEEE6EEEAE6F6EAEEEEEEE6F6EAEEEEEAE6EEEAEEEEEEE6EEEEE6EEEAE6 +EEEEE6EEEAEEEEEEE6EEEEE6EEEAE6EEEAE6EEEEE6EEEAE6EEEEE6EEEAEEEEEEE6F6EAEE +EEEEE6EEEAE6EEEEE6EEEAEEEEEEE6EEEEE6EEEEE6EEEAE6EEEEE6EEEAE6EEEEE6EEEAE6 +EEEAE6EEEEE6EEEAE6EEEEE6EEEAEEEEEAE6EEEEE6F6EAEEEEEEE6EEEAE6EEEEE6EEEEE6 +F6EAEEEEEEE6F6EAEEEEEEE6EEEAE6EEEEE6EEEAE6EEEAEEEEEEE6E6DAD5837D6AEEE6E6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEE6E68B7D73FFFFFFEEEAE6EEEEE6EEEEE6 +F6EAEEEEEAE6EEEEE6F6EAEEEEEEE6EEEAE6EEEEE6F6EAEEEEEEE6EEEEE6EEEAE6EEEEE6 +F6EAEEEEEEE6EEEAE6EEEEE6F6EAEEEEEAE6EEEEE6EEEEE6F6EAEEEEEEE6EEEEE6EEEAEE +EEEAE6EEEEE6F6EAEEEEEEE6EEEAEEEEEAE6EEEEE6EEEAEEEEEEE6EEEAEEEEEAE6F6EAEE +EEEEE6EEEAEEEEEEE6EEEEE6EEEAEEEEEEE6EEEAE6EEEEE6EEEAE6EEEEE6EEEEE6EEEAEE +EEEEE6EEEAE6EEEEE6F6EAEEEEEEE6EEEEE6EEEAEEEEEAE6EEEEE6EEEEE6EEEEE6EEEAE6 +F6EAEEEEEEE6F6EAEEEEEAE6EEEAEEEEEEE6EEEEE6EEEAE6EEEEE6EEEAEEEEEEE6EEEEE6 +EEEAE6EEEAE6EEEEE6EEEAE6EEEEE6EEEAEEEEEEE6F6EAEEEEEEE6EEEAE6EEEEE6EEEAEE +EEEEE6EEEEE6EEEEE6EEEAE6EEEEE6EEEAE6EEEEE6EEEAE6EEEAE6EEEEE6EEEAE6EEEEE6 +EEEAEEEEEAE6EEEEE6E6DAD5837D6AEEE6E6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +202020EEE6E6EEEAE6EEEAE6EEEAE6525552EEEAE6EEEAE6EEEAE6EEE6E6202020DEDAD5 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6DEDAD5292820101010EEEAE6EEEAE6EEEAE6EEEAE6101010101010 +101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +CDCAC55A5552202018101410393C39A4A19CEEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6B4AEAC4A4C4A10141020202062615A +DEDAD5EEEAE6EEEAE6EEEAE67B7573181C18181C187B7573EEEAE6EEEAE6EEEAE6EEEAE6 +101010101010101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE68B7D73FFFFFFEEEAE6EEEAE6EEEAE6EEEAEEEEEAE6EEEEE6EEEAE6EEEAE6101010 +1010101010101818184A484ACDC6C5EEEEE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAEEEEEAE6 +EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEAEEEEEEE6EEEAE6 +EEEAE6EEEAEEEEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEEE6EEEAE6EEEAEEEEEAE6EEEEE6 +EEEAE6EEEAE6EEEAEEEEEEE6EEEAE6EEEEE6EEEAE6EEEEE6EEEAE6EEEAE6EEEEE6EEEAE6 +EEEAE6EEEEE6EEEAE6EEEAEEEEEAE6EEEEE6101010101010101010101010101010101010 +EEEAE6EEEAE6EEEAEEEEEEE6EEEAE6EEEAE6EEEAEEEEEEE6EEEAE6EEEEE6101010EEEAE6 +EEEEE6EEEAE6EEEEE6EEEAEEEEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6 +EEEAE6EEEEE6EEEAE6EEEAE6EEEAEEEEEAE6EEEAEEEEEEE6EEEAE6E6DAD58B7D73EEEADE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6E6EADE8B7D73FFFFFFEEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEEE6EEEAE6 +101010EEEAE6EEEAEEEEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEEE6EEEAE6 +EEEAE6EEEEE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAEEEEEAE6EEEAE6EEEEE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEAEEEEEEE6101010EEEAE6EEEAEEEEEAE6EEEAE6 +EEEAE6EEEEE6EEEAE6EEEEE6101010101010101010101010101010101010EEEAEEEEEEE6 +EEEAE6EEEEE6EEEAE6EEEEE6EEEAE6EEEAE6EEEEE6EEEAE6101010EEEEE6EEEAE6EEEAEE +EEEAE6EEEEE6EEEAE6EEEAE6EEEAEEEEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEAEEEEEEE6 +EEEAE6EEEAE6EEEAEEEEEEE6EEEAE6EEEEE6EEEAEEEEEAE6EEEEE6EEEAE6EEEEE6EEEAEE +EEEEE6EEEAE6EEEAE6E6DAD58B7D73EEEADEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +525552A4A19CEEEAE6EEEAE6E6DEDE101010DED6D5EEEAE6EEEAE6A4A19C525552EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE66A6D6A83817B101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6D5CECD +202420948D8BDEDAD5EEE6E6BDBABD5A5552EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE64A4C4AB4AEACE6E2DEDEDAD56A6D6A +4A484AEEEAE6EEEAE6949194414041DED6D5DED6D5414039949594EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE68B7D73FFFFFFEEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010 +EEEAE6EEEAE6E6DEDE83817B393839EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6 +EEEEE6EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEEE6 +EEEAE6EEEEE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6 +EEEEE6EEEAE6EEEEE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEEE6EEEAE6EEEAE6E6DAD58B8173EEE6E6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEE6E68B7D73FFFFFFEEEAE6EEEEE6EEEEE6 +EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEEE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEEE6EEEAE6EEEEE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6101010EEEAE6EEEEE6EEEAE6EEEAE6 +EEEEE6EEEAE6EEEAE6EEEAE6101010EEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6101010EEEAE6EEEEE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEEE6EEEAE6 +EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6E6DAD58B8173EEE6E6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +ACA5A4525052EEEAE6EEEAE6B4AEAC101010A4A5A4EEEAE6EEEAE64A4C4AACA5A4EEE6E6 +6A6562181C18181C186A6962EEE6E6EEEAE6EEEAE61010108B8983292820101010EEEAE6 +EEE6E66261621818182024208B8583101010EEEAE6EEEAE6B4AEAC313431101410292829 +949194EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6CDCAC5292829EEE6E6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE65A5D5A +8B8983EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010949194292829101410 +393839C5C6C5EEEAE6EEEAE6D5CECD5250521818181014104A4C4ADED6D5EEEAE6EEEAE6 +1010108B8983292820101010EEEAE6D5CECD5250521818181014104A4C4ADED6D5EEEAE6 +EEEAE6EEE6E673716A202020181C188B8983EEEAE6101010101010101010101010EEEAE6 +EEEAE6EEEAE67B75732020201014105A595AE6E2DEEEEAE6EEEAE61010108B8983292820 +101010EEEAE6B4AEAC313431101410292829949194EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6E6E2DE +101410EEEAE6EEEAE6414041B4B2ACEEEAE6EEEAE6B4B2AC414041EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE68B7D73FFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010 +EEEAE6EEEAE6EEEAE6EEE6E6101410EEEAE6EEEAE67B75732020201014105A595AE6E2DE +EEEAE6EEEAE610101094918B292C29101410313431BDB6B49C999C313031101410393839 +CDC6C5EEEAE6EEEAE6EEE6E66A6562181C18181C186A6962EEE6E6DEDADE202020E6DEDE +EEEAE6EEEAE6EEEAE6DEDADE202020E6DEDEEEEAE67B75732020201014105A595AE6E2DE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010949194292829101410393839C5C6C5EEEAE6101010101010101010 +101010EEEAE6EEEAE61010108B8983292820101010414441A4A19CEEEAE6EEEAE6EEEAE6 +D5D2CD202420E6DEDEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6E6DAD58B7D7BEEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEE6E68B8173FFFFFFEEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +101010EEEAE6EEEAE6101010949194292829101410393839C5C6C5EEEAE6EEEAE6B4AEAC +313431101410292829949194EEEAE6EEEAE6EEEAE67B75732020201014105A595AE6E2DE +EEEAE6EEEAE61010108B8983292820101010101010101010101010101010EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +101010949194292829101410393839C5C6C5EEEAE6101010101010101010101010EEEAE6 +EEEAE61010108B8983292820101010414441A4A19CEEEAE6EEEAE6EEEAE6D5D2CD202420 +E6DEDEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6E6DAD58B7D73EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEE6E6202420DEDAD5EEEAE67B79734A4C4A73716AEEEAE6DED6D5202420EEE6E6737173 +524C4ADEDAD5DED6D54A4C4A7B7573EEEAE6EEEAE61010105A5D5ADEDAD5EEEAE6EEEAE6 +7B757352504ADEDAD5DEDAD5524C4A101010EEEAE6EEEAE6202020A4A5A4EEE6E6D5D2CD +6A6562EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE652504A9C9994EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6202420 +DED6D5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE61010105A5952D5D2D5E6E2DE +837D7B393C39EEEAE6EEEAE6313431B4B2B4EEE6E6E6DEDE736D6A5A595AEEEAE6EEEAE6 +1010105A5D5ADEDAD5EEEAE6EEEAE6313431B4B2B4EEE6E6E6DEDE736D6A5A595AEEEAE6 +EEEAE67B79734A484AD5D2CDE6DEDE736D6AEEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE683817B4A4C4AD5D2D5E6E2DE6261626A696AEEEAE6EEEAE61010105A5D5ADEDAD5 +EEEAE6EEEAE6202020A4A5A4EEE6E6D5D2CD6A6562EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6ACA5A4 +4A4441EEEAE6EEEAE6181C18E6DEDEEEEAE6EEEAE6E6DEDE181C18EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6947D7BFFFFFFEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010 +EEEAE6EEEAE6E6DEDE83817B413C39EEEAE683817B4A4C4AD5D2D5E6E2DE6261626A696A +EEEAE6EEEAE61010105A5552D5D2CDE6E2DE8381831818185A595AD5D2CDDEE2D583817B +394039EEEAE6EEEAE6737173524C4AD5DACDDED6D54A4C4A7B7573EEEAE66A69628B8583 +EEEAE6EEEAE6EEEAE683818373716AE6EADE83817B4A4C4AD5D2D5DEE2D56261626A696A +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010525952D5D2D5E6E2DE837D7B393C39EEEAE6EEEAE6101010E6EADE +EEEAE6EEEAE6EEEAE61010105A5D5ADEDAD5EEEAE6B4AEAC313431EEEAE6EEEAE6EEEAE6 +6A6562838583EEEAE6EEEAE6E6EADEEEEAE6EEEAE6EEEAE6E6EADEE6DAD58B8173EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE68B8173FFFFFFE6EADEEEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6E6EADEEEEAE6EEEAE6EEEAE6 +101010EEEAE6EEEAE61010105A5952D5D2D5E6E2DE837D7B393C39EEEAE6EEEAE6202020 +A4A5A4EEE6E6D5D2CD6A6562EEEAE6EEEAE683817B4A4C4AD5D2D5E6E2DE6261626A696A +EEEAE6EEEAE61010105A5D5ADEDAD5EEEAE6E6EADE101010E6EADEEEEAE6EEEAE6EEEAE6 +EEEAE6E6EADEEEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +101010525952D5D2D5E6E2DE837D7B393C39EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE61010105A5D5ADEDAD5EEEAE6B4AEAC313431EEEAE6EEEAE6EEEAE66A656283857B +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6E6EADEEEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6E6DAD58B8173EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6736D6A8B8D8BEEEAE6414441BDBABD413C39EEEAE6838583736D6AEEEAE6202420 +CDCAC5EEEAE6EEEAE6CDCAC5202420EEEAE6EEEAE6101010DED6D5EEEAE6EEEAE6EEEAE6 +202420CDCECDEEEAE6EEEAE6CDCAC5101010EEEAE6EEEAE6292829948D8BD5D2CDEEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6B4B2AC393839EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101410 +EEE6E6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010DEDAD5EEEAE6EEEAE6 +E6E2DE101410EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6E6E2DE202020EEEAE6EEEAE6 +101010DED6D5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6E6E2DE202020EEEAE6 +EEEAE6292820CDCAC5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6292829CDCAC5EEEAE6EEEAE6DED6D5202420EEEAE6EEEAE6101010DED6D5EEEAE6 +EEEAE6EEEAE6292829948D8BD5D2CDEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6C5C2BD292C29 +CDCAC5EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE68B8173FFFFFFEEE6E6EEEAE6E6EADEEEEAE6EEEAE6EEE6E6EEEAE6EEE6E6101010 +101010101010101010202420D5D2CDE6EADE292829C5CABDEEEAE6EEEAE6D5D6CD202420 +E6EADEEEEAE6101010D5DACDEEEAE6EEEAE6E6E2DE101010DED6D5EEEAE6EEE6E6E6E2DE +101410EEE6E6EEEAE6202420CDC6C5EEEAE6EEE6E6CDCAC5202420EEEAE6C5CABD292829 +E6EADEEEEAE6EEE6E6292829D5D2CDEEEAE6292829CDCAC5EEEAE6EEE6E6DED6D5202420 +EEEAE6EEEAE6EEEAE6E6EADEEEE6E6EEEAE6101010101010101010101010101010101010 +EEEAE6EEEAE6101010DEDAD5EEEAE6E6EADEE6DEDE101410EEEAE6EEEAE6101010EEEAE6 +EEE6E6EEEAE6EEE6E6101010DED6D5E6EADEEEEAE6EEEAE6393C39A49D9CEEEAE6CDCECD +202820E6DEDEEEEAE6EEE6E6EEEAE6E6EADEEEE6E6EEEAE6EEE6E6E6DAD58B8173F6EAEE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE68B8173FFFFFFEEE6E6EEEAE6E6EADE +EEE6E6E6EADEEEEAE6EEEAE6EEE6E6EEEAE6EEEAE6EEEAE6EEEAE6E6EADEEEEAE6EEE6E6 +101010E6EADEEEEAE6101010DED6D5EEEAE6EEE6E6DEE2D5101410E6EADEEEE6E6292829 +948D8BCDD2C5EEE6E6E6EADEEEEAE6EEEAE6292829CDC6C5E6EADEEEEAE6DED6D5202420 +EEEAE6EEEAE6101010D5D6CDEEE6E6EEEAE6EEE6E6101010EEEAE6EEE6E6EEEAE6EEEAE6 +EEE6E6EEEAE6EEE6E6EEEAE6101010101010101010101010101010101010EEEAE6EEE6E6 +101010DEDAD5EEEAE6EEEAE6E6E2DE101410EEEAE6EEEAE6101010EEEAE6EEEAE6E6EADE +EEE6E6101010DED2D5EEEAE6EEEAE6EEEAE6393C399C9D94EEEAE6CDCECD292820E6E2DE +EEEAE6E6EADEEEE6E6EEEAE6EEEAE6EEEAE6EEE6E6EEEAE6EEE6E6EEEAE6EEE6E6EEEAE6 +EEEAE6E6EADEEEEAE6E6DAD594817BEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6C5C2BD393839EEE6E6313431EEEAE6313431E6E2DE313031C5C2BDEEEAE6101010 +EEEAE6EEEAE6EEEAE6EEE6E6101410EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6 +101010EEEAE6EEEAE6EEEAE6EEE6E6101010EEEAE6EEEAE6C5BEBD525052202020292829 +ACA5A4EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6393839B4B2ACEEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6202420 +DED6D5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6BDBABD414441181818101010101010101010EEEAE6EEEAE6 +101010EEEAE6EEEAE6EEEAE6EEEAE6BDBABD414441181818101010101010101010EEEAE6 +EEEAE6101010EEE6E6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6101410101010101010101010101010101010EEEAE6EEEAE6101010EEEAE6EEEAE6 +EEEAE6EEEAE6C5BEBD525052202020292829ACA5A4EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6BDB6B4292829C5BEBD +EEEAE6EEEAE6EEEAE6181C18E6DEDEEEEAE6EEEAE6E6DEDE181C18EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEEE694817BFFFFFFE6EADEEEEAE6EEE6E6EEE6E6EEEADEEEEAE6E6EADEEEEAE6101010 +EEEAE6EEE6E6D5CECD414441ACA5A4EEE6E6101410101010101010101010101010101010 +EEEAE6EEEAE6101010EEEAE6EEE6E6EEE6E6EEEADE101010EEEAE6EEEAE6EEEADEEEE6E6 +101010EEEAE6EEE6E6101010EEEAE6EEEAE6E6EADEEEE2E6101410EEEAE6EEE6E64A4C4A +A4A5A4EEE6E69C9D945A5D5AEEEAE6EEEADE101410101010101010101010101010101010 +EEE6E6E6EADEEEEAE6EEE6E6EEEAE6EEEAE6101010EEEAE6EEE6E6E6EADEEEE6E6EEEAE6 +EEE6E6EEEADE101010E6EADEEEEAE6EEE6E6EEEAE6101010E6EADEEEE6E6101010EEEAE6 +EEEAE6EEEAE6E6EADE101010EEEAE6EEE6E6EEEADEEEEAE6A4A59C313031EEE6E65A5D5A +948D8BEEEAE6EEEADEEEEADEEEEAE6EEE6E6EEEAE6EEEAE6EEEAE6E6DAD594817BEEEEE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6F6EAEE8B8573FFFFFFE6EADEEEEAE6EEE6E6 +EEEAE6EEEAE6EEE6E6EEEADEEEEAE6E6EADEEEEAE6EEE6E6EEEAE6EEE6E6EEEAE6E6EADE +101010EEE6E6EEE6E6101010EEEAE6E6EADEEEEAE6EEEAE6101010EEE6E6EEEAE6C5BEBD +525052202020292829ACA5A4EEEADEEEEAE6101410101010101010101010101010101010 +EEE6E6EEE6E6101010EEE6E6EEEAE6EEEAE6EEEADE101010EEEADEEEEAE6EEE6E6E6EADE +EEEAE6EEEAE6E6EADEEEE6E6101010EEEAE6EEE6E6EEEAE6EEEAE6EEE6E6E6EADEEEEAE6 +101010EEEADEEEE6E6EEEAE6EEE6E6101010EEEAE6EEE6E6101010E6EADEEEEAE6EEE6E6 +EEEAE6101010E6EADEEEEAE6EEE6E6E6EADEACA5A4313031EEE6E65A5D5A94898BE6EADE +EEEAE6EEE6E6EEEAE6EEE6E6E6EADEEEE6E6E6EADEEEEAE6EEEAE6EEEAE6E6EADEEEE6E6 +EEEAE6EEE6E6EEEADEE6DAD58B8573EEEAEEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE63938399C9594626562EEEAE66A6562838583393839EEEAE6EEEAE6202420 +CDCECDEEEAE6EEEAE6CDCAC5202420EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6 +202420CDCECDEEEAE6EEEAE6CDCECD101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6B4AEAC +202420EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6101010101010101010101010101010101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE65A5D5A +8B898BEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6292820A4A19CE6DEDEEEEAE6E6E2DE101010EEEAE6EEEAE6 +101010EEEAE6EEEAE6EEEAE6EEEAE6292820A4A19CE6DEDEEEEAE6E6E2DE101010EEEAE6 +EEEAE6292820CDCAC5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6292829DED6D5EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6B4AEAC202420EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6A4A19C202420C5BEBDEEEAE6 +EEEAE6EEEAE6EEEAE6414041B4B2ACEEEAE6EEEAE6B4B2AC414041EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6EEEE8B8573FFFFFFEEE6E6EEE6E6EEEADEE6EADEEEE6E6EEE6E6EEEAE6E6EADE101010 +EEE6E6E6EADEEEE6E6D5D6CD202420E6DEDE292820DED2D5EEEAE6EEE6E6EEEAE6EEEADE +E6EADEEEE6E6101010EEE6E6E6EADEEEEAE6EEE6E6101010EEE6E6E6EADEEEE6E6EEEAE6 +101010EEE6E6E6EADE202420CDCACDE6EADEEEE6E6CDCAC5202420EEE6E6E6EADEB4AAAC +414441EEE6E6414039C5BEBDEEEAE6EEE6E6292820DED2D5E6EADEEEE6E6EEEADEE6EADE +EEEADEEEE6E6EEE6E6E6EADEEEE6E6EEE6E6101010EEEADEEEEAE6EEE6E6EEEAE6EEE6E6 +E6EADEEEE6E6101010EEE6E6EEEADEEEE6E6E6EADE101010EEE6E6EEEADE101010EEE6E6 +E6EADEEEE6E6EEE6E6101010EEE6E6E6EADEEEE6E6EEE6E6EEE6E63134317B7573292829 +E6E6DEEEE6E6EEE6E6EEE6E6EEE6E6E6EADEEEE6E6EEEADEE6EADEE6DAD594857BF6EAEE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEE694857BFFFFFFEEE6E6EEE6E6E6EADE +EEE6E6EEEAE6E6EADEEEE6E6EEE6E6EEE6E6EEE6E6E6EADEEEE6E6E6EADEEEEADEEEE6E6 +101010EEEADEE6EADE101010EEE6E6EEEAE6E6EADEEEE6E6101010E6EADEEEE6E6E6EADE +EEE6E6EEEAE6ACAEA4202420EEEAE6EEE6E6292829DED6CDE6EADEEEE6E6E6EADEEEE6E6 +E6EADEEEEAE6101010EEEAE6EEE6E6E6EADEEEE6E6101010EEE6E6EEE6E6E6EADEEEE6E6 +EEE6E6E6EADEEEE6E6EEEAE6101010EEE6E6E6EADEEEE6E6EEEADEEEE6E6EEEADEEEE6E6 +101010EEE6E6EEEADEEEE6E6E6EADE101010EEEADEE6EADE101010EEE6E6EEE6E6E6EADE +EEE6E6101010EEE6E6EEEADEEEEAE6EEE6E6EEEAE6313431737573292829EEE6E6EEE6E6 +EEEADEEEE6E6E6EADEEEE6E6EEE6E6EEEADEEEE6E6EEE6E6E6EADEEEE6E6EEE6E6EEEADE +EEE6E6E6EADEEEE6E6E6DAD594817BEEEEE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE68B898B2020209C9D9CEEEAE6A49D9C1818188B898BEEEAE6EEEAE673716A +525052DEDAD5DEDAD54A4C4A737573EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6 +7B7573525052DEDAD5DEDAD5525052101010EEEAE6EEEAE65A5D5ACDCAC5EEE6E6ACAAAC +202020EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6CDCAC5 +202420949194DEDADEEEE6E6BDBEBD5A5552EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6202020ACA5A4EEE6E6D5CECD5A595A101010EEEAE6EEEAE6 +101010EEEAE6EEEAE6EEEAE6EEEAE6202020ACA5A4EEE6E6D5CECD5A595A101010EEEAE6 +EEEAE67B79734A4C4AD5D2D5E6DEDE737173EEEAE6EEEAE6181C18CDCAC5EEEAE6EEEAE6 +EEEAE6838183524C4AD5CECDEEE6E6CDC6C55A595AEEEAE6EEEAE6101010EEEAE6EEEAE6 +EEEAE6EEEAE65A5D5ACDCAC5EEE6E6ACAAAC202020EEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE68B8983292829CDCAC5EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6949194414041DED6D5DED6D5414039949594EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEEE694857BFFFFFFE6EADEEEE6E6EEEAE6EEE6E6EEEADEE6EADEEEE6E6EEE6E6101010 +EEE6E6EEEADEEEEAE6EEE6E6525952948D8B83817B524C4AD5CEC5EEE2E6C5C6BD5A595A +EEE6E6EEE6E6101010EEE6E6EEEADEEEE6E6EEEADE101010E6EADEEEE6E6EEEADEEEE6E6 +101010EEEAE6E6EADE736D6A525052DED6D5DEDACD4A4C4A73756AEEEADEEEEAE6EEE6E6 +31303194918B4A484AE6EADEEEE6E6E6EADE838183524C4AD5CACDEEE6DECDC2C55A595A +EEEAE6EEE6E6E6EADEEEE6E6E6EADEEEE6E6101010EEEAE6EEE6E6E6EADEEEE6E6E6EADE +EEEAE6EEE6E6101010EEE6E6E6EADEEEE6E6E6EADE101010EEEADEEEE6E6181C18CDCAC5 +EEE6E6EEEAE6E6EADE101010EEE6E6EEE6E6EEEAE6E6EADEEEEADEA49D9C1010109C9194 +EEE6E6E6EADEEEE6E6EEEAE6E6EADEEEE6E6EEEADEEEE6E6EEE6E6E6DAD594857BEEEEE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEEE8B8573FFFFFFE6EADEEEE6E6EEE6E6 +E6EADEEEE6E6EEEADEEEE6E6EEEADEE6EADEEEE6E6EEEAE6E6EADEEEE6E6EEE6E6E6EADE +101010EEEAE6EEE6E6101010E6EADEEEE6E6EEE6E6E6EADE101010EEEADEEEEAE65A5D5A +C5CABDEEE2E6ACAAA4202020EEEADEEEE6E683817B524C4AD5CACDEEE2E6C5C6BD5A595A +EEEADEEEE6E6101010EEE6E6E6EADEEEE6E6EEEADE181C18C5CABDEEEAE6E6EADEEEE6E6 +EEEAE6EEE6E6EEEADEEEE6E6101010EEEADEEEEAE6EEE6E6E6EADEEEEAE6EEE6E6E6EADE +101010E6EADEEEE6E6EEE6E6EEE6E6101010EEE6E6EEE6E6181C18CDC6C5E6EADEEEE6E6 +E6EADE101010E6EADEEEEAE6EEE6E6E6EADEEEE6E69CA1941010109C9194E6EADEEEE6E6 +E6EADEEEE6E6E6EADEEEE6E6EEEADEEEE6E6E6EADEEEEAE6EEE6E6EEEAE6E6EADEEEEAE6 +EEE6E6EEE6E6EEEAE6E6DAD594857BF6EEEEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6DEDAD5101410D5D2D5EEEAE6D5D2D5101410DEDAD5EEEAE6EEEAE6EEE6E6 +6265621818181818186A6562EEE6E6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6 +EEE6E66261621014102024208B8583101010EEEAE6EEEAE6A49D9C313031101410313431 +B4AEACEEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6EEEAE6101010101010 +101010101010101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +CDCAC5525552181C18101410393839A4A19CEEEAE6EEEAE6101010EEEAE6EEEAE6EEEAE6 +EEEAE6101010EEEAE6EEEAE6ACAAA4292C29101410292C2994918B101010EEEAE6EEEAE6 +101010EEEAE6EEEAE6EEEAE6EEEAE6ACAAA4292C29101410292C2994918B101010EEEAE6 +EEEAE6EEE6E6736D6A202018181C188B898BEEEAE6EEEAE6838583181818101010EEEAE6 +EEEAE6EEEAE6838183292829101410313431A4A19CEEEAE6EEEAE6101010EEEAE6EEEAE6 +EEEAE6EEEAE6A49D9C313031101410313431B4AEACEEEAE6EEEAE6EEEAE6101010EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6101010101010101010101010101010 +101010E6E2DEEEEAE6EEEAE6737573181C18181C187B7573EEEAE6EEEAE6EEEAE6EEEAE6 +101010101010101010101010101010EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6EEEE94857BFFFFFFEEE6E6E6EADEEEE6E6EEE6E6E6EADEEEE6E6EEE6DEEEE6DE101010 +EEE6DEEEE6E6EEE6E6E6EADEB4AEAC393839EEE6E683817B292829101410313431A49D9C +E6EADEEEE6DE101010E6EADEEEE6E6E6EADEEEE6E6101010EEE6E6EEE6DEEEE6E6E6EADE +101010EEE6E6EEE6DEEEE2E662655A1818181818186A6562EEE2E6EEE6E6E6EADEEEE6E6 +949194101010B4AEACEEE6E6EEE6DEEEE6E6EEE6DE83817B2928291014103134319CA19C +EEE6E6EEE6DEEEE6E6EEE6DEEEE6E6E6EADE101010101010101010101010101010101010 +EEE6E6E6EADE101010EEE6DEEEE6E6EEE6DEEEE6E6101010EEE6E6EEE6DE838183181818 +101010EEE6E6EEE6E6101010EEE6E6E6EADEEEE6DEEEE6E6EEE6E6A4A19C313031E6E6DE +EEE6DEEEE6E6EEE6DEEEE6E6EEE6DEEEE6E6EEE6DEE6EADEEEE6E6E6DAD594857BF6EEEE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEEE94857BFFFFFFEEE6E6E6EADEEEE6DE +EEE6E6E6EADEEEE6E6E6EADEEEE6E6EEE6DEEEE6DEEEE6E6EEE6E6EEE6DEEEE6E6EEE6E6 +101010EEE6E6EEE6E6101010EEE6E6EEE6DEEEE6DEEEE6E6101010EEE6E6EEE6E69C9D94 +313031101410313431B4AAA4E6EADEEEE6E6EEE6E683817B2928291014103134319CA19C +EEE6E6E6EADE101010E6EADEEEE6E6EEE6DEEEE6E683857B181818101010EEE6DEEEE6E6 +E6EADEEEE6E6E6EADEEEE6E6101010101010101010101010101010101010EEE6E6EEE6E6 +101010EEE6E6EEE6DEE6EADEE6EADE101010EEE6E6E6EADE838183181818101010EEE6DE +EEE6E6101010EEE6E6EEE6E6E6EADEEEE6E6EEE6DEA4A1A4313031E6E6DEEEE6E6EEE6DE +EEE6E6EEE6DEEEE6E6E6EADEEEE6E6EEE6DEEEE6E6EEE6E6E6EADEEEE6E6EEE6E6E6EADE +EEE6E6E6EADEEEE6DEE6DAD594857BEEF2E6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEF2EE94857BFFFFFFEEE6DEEEE6E6E6E6DEE6EADEEEE6E6EEE6E6EEE6E6E6EADEEEE6E6 +E6EADEEEE6DEE6EADEEEE6E6EEE6E6E6EADEE6E6DEEEE6E6E6E6DEEEE6E6E6EADEEEE6E6 +EEE6DEEEE6E6E6E6DEEEE6E6EEE6E6EEE6DEEEE6E6EEE6E6E6EADEEEE6E6E6EADEEEE6DE +EEE6E6E6EADEEEE6E6E6E6DEEEE6E6E6E6DEEEE6DEEEE6E6E6EADEEEE6DEEEE6E6E6E6DE +EEE6E6E6EADEEEE6DEEEE6E6E6EADEEEE6DEEEE6E6EEE6E6EEE6E6EEE6E6E6EADEEEE6E6 +E6EADEEEE6E6E6EADEEEE6E6EEE6E6EEE6DEEEE6E6E6E6DEE6E6DEEEE6E6EEE6E6E6EADE +EEE6E6EEE6E6E6E6DEEEE6E6E6E6DEE6EADEEEE6E6EEE6DEE6EADEEEE6E6E6EADEE6E6DE +EEE6E6E6E6DEEEE6E6EEE6E6E6E6DEEEE6DEEEE6E6E6EADEEEE6E65250529C9D94EEE6E6 +EEE6E6E6EADEEEE6E6E6EADEEEE6E6E6EADEEEE6E6EEE6DEE6E6DEE6DAD594897BEEF2EE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEEEE94857BFFFFFFEEE6E6EEE6E6E6E6DE +EEE6E6E6EADEEEE6E6EEE6E6E6E6DEEEE6E6E6EADEEEE6E6E6EADEEEE6E6E6EADEEEE6DE +EEE6E6E6E6DEE6EADEEEE6E6EEE6E6EEE6E6E6EADEEEE6E6E6EADEEEE6DEE6EADEEEE6E6 +EEE6E6E6EADEE6E6DEEEE6E6E6E6DEEEE6E6E6EADEEEE6E6EEE6DEEEE6E6E6E6DEEEE6E6 +EEE6E6EEE6DEEEE6E6EEE6E6E6EADEEEE6E6E6EADEEEE6DEEEE6E6E6EADEEEE6E6E6E6DE +EEE6E6E6E6DEEEE6DEEEE6E6E6EADEEEE6DEEEE6E6E6E6DEEEE6E6E6EADEEEE6DEEEE6E6 +E6EADEEEE6DEEEE6E6EEE6E6EEE6E6EEE6E6E6EADEEEE6E6E6EADEEEE6E6E6EADEEEE6E6 +EEE6E6EEE6DEEEE6E6E6E6DEE6E6DEEEE6E6EEE6E652504AA49D9CEEE6E6E6E6DEEEE6E6 +E6E6DEE6EADEEEE6E6EEE6DEE6EADEEEE6E6E6EADEE6E6DEEEE6E6E6E6DEEEE6E6EEE6E6 +E6E6DEEEE6DEEEE6E6E6DAD594897BF6EEEEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6F2EE94897BFFFFFFEEE6DEE6E6DEEEE6E6EEE6DEE6E6DEEEE6DEE6E6DEEEE6E6101010 +101010101010101010101010101010101010EEE6E6E6E6DEEEE6E6E6E6DEEEE6DEE6E6DE +EEE6E6E6E6DEEEE6E6E6E6DEEEE6E6E6E6DEE6E6DEEEE6DEEEE6E6E6E6DEEEE6E6EEE6DE +EEE6E6EEE6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6DEEEE6E6E6E6DEEEE6E6 +EEE6DEEEE6E6EEE6E6E6E6DEEEE6E6EEE6E6E6E6DEEEE6E6E6E6DEE6E6DEEEE6E6EEE6DE +EEE6DEE6E6DEEEE6E6E6E6DEE6E6DEEEE6E6E6E6DEEEE6DEEEE6E6EEE6DEE6E6DEEEE6E6 +E6E6DEE6E6DEEEE6E6E6E6DEEEE6E6EEE6DEE6E6DEEEE6E6EEE6E6E6E6DEEEE6E6EEE6E6 +E6E6DEEEE6E6E6E6DEEEE6DEEEE6E6EEE6E6E6E6DEEEE6E694918B313431EEE6E6E6E6DE +E6E6DEEEE6E6EEE6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6E6E6E6DEE6DAD594897BF6EEEE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6F6EEEE94897BFFFFFFE6E6DEEEE6DEE6E6DE +EEE6DEEEE6E6EEE6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6E6EEE6DEE6E6DEEEE6E6EEE6DE +101010EEE6E6EEE6DEE6E6DEEEE6DEE6E6DEEEE6E6E6E6DEEEE6E6EEE6DEEEE6E6EEE6DE +E6E6DEEEE6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6DEE6E6DEEEE6E6E6E6DEEEE6E6E6E6DE +EEE6E6E6E6DEE6E6DEEEE6DEEEE6E6E6E6DEEEE6E6EEE6DEEEE6E6EEE6DEEEE6E6E6E6DE +EEE6E6E6E6DEEEE6E6E6E6DEEEE6DEEEE6E6E6E6DEEEE6E6EEE6DEEEE6E6EEE6E6E6E6DE +EEE6E6EEE6E6E6E6DEEEE6E6E6E6DEE6E6DEEEE6E6EEE6DEEEE6DEE6E6DEEEE6E6E6E6DE +E6E6DEEEE6E6E6E6DEEEE6DEEEE6E6EEE6DE94918B313431E6E6DEE6E6DEEEE6E6E6E6DE +EEE6E6EEE6DEE6E6DEEEE6E6EEE6E6E6E6DEEEE6E6EEE6E6E6E6DEEEE6E6E6E6DEEEE6DE +EEE6E6EEE6E6E6E6DEE6DAD594897BF6F2EEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEF2EE9C8983FFFFFFEEE6E6EEE6DEE6E6DEEEE6E6EEE6E6EEE6E6EEE6E6EEE6DEE6E6DE +EEE6E6E6E6DEE6E6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6E6EEE6DEEEE6DEEEE6E6EEE6DE +E6E6DEEEE6E6EEE6DEE6E6DEE6E6DEEEE6E6EEE6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6DE +E6E6DEE6E6DEEEE6DEEEE6E6E6E6DEEEE6DEEEE6DEEEE6E6E6E6DEE6E6DEEEE6E6E6E6DE +E6E6DEE6E6DEEEE6E6EEE6DEE6E6DEEEE6DEEEE6DEE6E6DEEEE6E6EEE6E6E6E6DEE6E6DE +EEE6E6EEE6DEE6E6DEEEE6DEEEE6E6E6E6DEEEE6E6EEE6DEE6E6DEEEE6E6EEE6E6E6E6DE +EEE6DEEEE6E6E6E6DEEEE6DEEEE6DEEEE6E6E6E6DEEEE6DEE6E6DEEEE6DEEEE6DEE6E6DE +EEE6E6EEE6E6EEE6DEEEE6E6E6E6DEE6E6DEEEE6DE101010292829C5BABDE6E6DEEEE6DE +EEE6E6E6E6DEE6E6DEEEE6DEEEE6E6EEE6DEEEE6DEEEE6E6E6E6DEE6DAD5948D7BF6F2EE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6F6F2EE9C897BFFFFFFEEE6E6E6E6DEEEE6E6 +EEE6DEE6E6DEEEE6DEE6E6DEEEE6DEEEE6DEEEE6E6E6E6DEE6E6DEEEE6E6E6E6DEEEE6E6 +EEE6DEE6E6DEEEE6E6EEE6E6EEE6E6EEE6E6EEE6DEE6E6DEEEE6E6E6E6DEE6E6DEEEE6E6 +E6E6DEEEE6E6E6E6DEEEE6E6EEE6DEEEE6DEEEE6E6EEE6DEE6E6DEEEE6E6EEE6DEE6E6DE +E6E6DEEEE6E6EEE6DEEEE6E6E6E6DEEEE6E6E6E6DEEEE6DEE6E6DEE6E6DEEEE6DEEEE6E6 +E6E6DEEEE6DEEEE6DEEEE6E6E6E6DEE6E6DEEEE6E6E6E6DEE6E6DEE6E6DEEEE6E6EEE6DE +E6E6DEEEE6DEEEE6DEE6E6DEEEE6E6EEE6E6E6E6DEE6E6DEEEE6E6EEE6DEE6E6DEEEE6DE +EEE6E6E6E6DEEEE6E6EEE6DEE6E6DE101010292829BDBAB4EEE6DEEEE6E6E6E6DEEEE6DE +EEE6DEEEE6E6E6E6DEEEE6DEE6E6DEEEE6DEEEE6DEE6E6DEEEE6E6EEE6E6EEE6DEEEE6E6 +E6E6DEE6E6DEEEE6DEE6DAD594897BF6EEF6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6F2EE9C8983FFFFFFE6E2DEEEE2DEE6E6DEE6E2DEE6E6DEE6E2DEE6E6DEE6E2DEEEE2DE +E6E6DEE6E2DEEEE2DEE6E2DEE6E2DEE6E6DEE6E2DEE6E6DEE6E2DEE6E6DEE6E2DEE6E2DE +EEE2DEE6E6DEE6E2DEE6E2DEEEE2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E6DE +EEE2DEE6E2DEE6E2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E6DEE6E2DEE6E2DEEEE2DEE6E2DE +EEE2DEE6E2DEE6E6DEE6E2DEEEE2DEE6E6DEE6E2DEEEE2DEE6E6DEE6E2DEE6E2DEEEE2DE +E6E6DEE6E2DEE6E2DEEEE2DEE6E2DEE6E6DEE6E2DEEEE2DEE6E2DEE6E2DEE6E6DEE6E2DE +EEE2DEE6E6DEEEE2DEE6E2DEE6E6DEEEE2DEE6E2DEEEE2DEE6E2DEE6E2DEEEE2DEE6E2DE +E6E2DEE6E6DEEEE2DEE6E6DEE6E2DEEEE2DEE6E6DEE6E2DEE6E2DEE6E6DEE6E2DEE6E2DE +E6E6DEEEE2DEE6E2DEEEE2DEE6E6DEEEE2DEE6E2DEE6E6DEE6E2DEE6DAD59C8983F6F2EE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6F6F2F69C8D7BFFFFFFE6E6DEE6E2DEE6E6DE +E6E2DEEEE2DEE6E2DEEEE2DEE6E2DEEEE2DEE6E6DEE6E2DEE6E2DEE6E2DEE6E6DEE6E2DE +EEE2DEE6E6DEE6E2DEE6E6DEE6E2DEE6E6DEE6E2DEEEE2DEE6E6DEE6E2DEEEE2DEE6E2DE +E6E2DEE6E6DEE6E2DEE6E6DEE6E2DEE6E6DEE6E2DEE6E2DEEEE2DEE6E6DEE6E2DEE6E2DE +EEE2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E6DEEEE2DEE6E2DEE6E2DEE6E6DE +EEE2DEE6E6DEEEE2DEE6E6DEE6E2DEE6E2DEEEE2DEE6E2DEEEE2DEE6E2DEE6E6DEE6E2DE +EEE2DEE6E6DEE6E2DEEEE2DEE6E6DEE6E2DEE6E2DEEEE2DEE6E6DEE6E2DEE6E2DEEEE2DE +E6E2DEE6E6DEE6E2DEEEE2DEE6E2DEE6E2DEE6E6DEE6E2DEEEE2DEE6E6DEEEE2DEE6E2DE +E6E6DEEEE2DEE6E2DEEEE2DEE6E2DEE6E2DEEEE2DEE6E2DEE6E2DEE6E6DEEEE2DEE6E6DE +E6E2DEEEE2DEE6E6DEE6DAD59C897BF6F2EEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6F6EE9C8D7BFFFFFFE6E2D5E6E2D5E6DEDEE6E2DEE6DEDEE6DEDEE6DEDEE6E2D5E6DEDE +E6E2DEE6DEDEE6E2D5E6E2D5E6E2DEE6DEDEE6E2DEE6DEDEE6E2D5E6DEDEE6DEDEE6E2D5 +E6DEDEE6E2DEE6DEDEE6E2DEE6E2D5E6DEDEE6E2D5E6DEDEE6E2DEE6DEDEE6E2D5E6DEDE +E6E2DEE6E2D5E6E2D5E6DEDEE6E2DEE6E2D5E6DEDEE6DEDEE6E2D5E6DEDEE6E2D5E6E2D5 +E6E2D5E6DEDEE6E2DEE6E2D5E6E2D5E6DEDEE6E2D5E6DEDEE6E2D5E6DEDEE6E2D5E6E2DE +E6E2D5E6E2DEE6DEDEE6E2D5E6E2D5E6DEDEE6E2DEE6E2D5E6DEDEE6DEDEE6E2D5E6DEDE +E6E2D5E6DEDEE6E2DEE6E2D5E6DEDEE6E2D5E6DEDEE6E2D5E6DEDEE6E2D5E6E2D5E6DEDE +E6DEDEE6E2D5E6DEDEE6DEDEE6E2D5E6DEDEE6E2DEE6DEDEE6DEDEE6E2D5E6DEDEE6E2DE +E6DEDEE6E2D5E6DEDEE6E2D5E6DEDEE6E2D5E6DEDEE6E2D5E6DEDEE6DAD59C8D83F6F6EE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6F6F6EE9C8D83FFFFFFE6E2DEE6DEDEE6E2DE +E6DEDEE6E2DEE6DEDEE6E2DEE6E2D5E6DEDEE6E2D5E6DEDEE6E2D5E6E2DEE6DEDEE6E2D5 +E6E2D5E6DEDEE6E2DEE6DEDEE6DEDEE6DEDEE6E2D5E6DEDEE6E2DEE6DEDEE6E2D5E6E2D5 +E6E2DEE6DEDEE6E2DEE6DEDEE6E2D5E6DEDEE6DEDEE6E2D5E6DEDEE6E2DEE6DEDEE6E2DE +E6E2D5E6DEDEE6E2D5E6DEDEE6E2DEE6DEDEE6E2D5E6DEDEE6E2DEE6E2D5E6E2D5E6DEDE +E6E2DEE6E2D5E6DEDEE6DEDEE6E2D5E6DEDEE6E2D5E6E2D5E6E2D5E6DEDEE6E2DEE6E2D5 +E6E2D5E6DEDEE6E2D5E6DEDEE6E2D5E6DEDEE6E2D5E6E2DEE6E2D5E6E2DEE6DEDEE6E2D5 +E6E2D5E6DEDEE6E2DEE6E2D5E6DEDEE6DEDEE6E2D5E6DEDEE6E2D5E6DEDEE6E2DEE6E2D5 +E6DEDEE6E2D5E6DEDEE6E2D5E6DEDEE6E2D5E6E2D5E6DEDEE6DEDEE6E2D5E6DEDEE6DEDE +E6E2D5E6DEDEE6E2DEE6DAD59C8D83F6F6EEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6F2F69C8D7BFFFFFFE6DED5E6DADEDEDED5E6DADEE6DED5DEDED5E6DED5E6DED5E6DED5 +E6DED5DEDED5E6DED5E6DADEE6DED5DEDED5E6DED5E6DED5DEDED5E6DADEDEDED5E6DED5 +E6DADEDEDED5DEDED5E6DADEE6DED5E6DED5E6DADEDEDED5E6DED5DEDED5E6DED5DEDED5 +E6DADEE6DED5E6DADEE6DED5DEDED5E6DADEDEDED5E6DADEE6DED5E6DED5E6DED5E6DED5 +E6DADEDEDED5E6DED5E6DADEE6DED5E6DADEE6DED5E6DADEE6DED5E6DED5E6DADEDEDED5 +E6DADEE6DED5DEDED5E6DED5E6DED5DEDED5E6DED5E6DADEDEDED5E6DADEE6DED5E6DADE +DEDED5E6DADEDEDED5E6DADEE6DED5E6DED5E6DADEDEDED5E6DED5E6DED5E6DED5E6DED5 +DEDED5E6DED5DEDED5E6DADEE6DED5E6DED5DEDED5E6DADEE6DED5E6DED5DEDED5E6DADE +DEDED5E6DADEDEDED5E6DED5E6DED5E6DADEDEDED5E6DED5E6DED5E6DAD59C8D83F6F6EE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6F6F2F69C917BFFFFFFE6DED5DEDED5E6DADE +DEDED5E6DED5DEDED5E6DADEE6DADEE6DED5DEDED5E6DED5E6DADEE6DED5E6DADEE6DED5 +E6DADEDEDED5E6DADEE6DED5DEDED5E6DED5E6DED5E6DED5E6DED5DEDED5E6DED5E6DADE +E6DED5DEDED5E6DED5E6DED5DEDED5E6DADEDEDED5E6DED5E6DADEDEDED5DEDED5E6DADE +E6DED5E6DED5E6DADEDEDED5E6DED5DEDED5E6DED5DEDED5E6DADEE6DED5E6DADEE6DED5 +DEDED5E6DADEDEDED5E6DADEE6DED5E6DED5E6DED5E6DED5E6DADEDEDED5E6DED5E6DADE +E6DED5E6DADEE6DED5E6DADEE6DED5E6DED5E6DADEDEDED5E6DADEE6DED5DEDED5E6DED5 +E6DED5DEDED5E6DED5E6DADEDEDED5E6DADEE6DED5E6DADEDEDED5E6DADEDEDED5E6DADE +E6DED5E6DED5E6DADEDEDED5E6DED5E6DED5E6DED5E6DED5DEDED5E6DED5DEDED5E6DADE +E6DED5E6DED5DEDED5E6DAD59C8D7BF6F2F6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6F6EE9C8D83FFFFFFDEDAD5DEDAD5E6DAD5DEDAD5E6DAD5DEDAD5E6DAD5DEDACDE6DAD5 +DEDAD5E6DAD5DEDAD5E6DAD5DEDACDE6DAD5E6DAD5DEDAD5E6DAD5DEDAD5DEDAD5E6DAD5 +DEDAD5E6DAD5E6DAD5DEDAD5DEDACDE6DAD5DEDAD5E6DAD5DEDAD5E6DAD5DEDAD5E6DAD5 +DEDAD5E6DAD5DEDACDDEDAD5E6DAD5DEDAD5DEDAD5E6DAD5DEDACDE6DAD5DEDAD5DEDAD5 +DEDAD5DEDAD5E6DAD5DEDACDDEDAD5DEDAD5DEDACDE6DAD5DEDAD5DEDACDDEDAD5E6DAD5 +DEDACDE6DAD5DEDAD5E6DAD5DEDAD5DEDAD5E6DAD5DEDAD5DEDAD5DEDAD5DEDAD5DEDAD5 +DEDAD5DEDAD5E6DAD5DEDAD5DEDACDE6DAD5DEDAD5E6DAD5DEDAD5DEDAD5E6DAD5DEDAD5 +E6DAD5DEDAD5E6DAD5DEDAD5DEDACDE6DAD5DEDAD5E6DAD5DEDACDDEDAD5E6DAD5DEDAD5 +DEDAD5E6DAD5DEDAD5DEDACDE6DAD5DEDAD5DEDAD5DEDAD5E6DAD5E6DAD59C9183F6F2F6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6F6F6F69C9183FFFFFFDEDAD5E6DAD5DEDAD5 +E6DAD5DEDAD5E6DAD5DEDAD5DEDACDE6DAD5DEDAD5E6DAD5DEDACDE6DAD5DEDACDDEDAD5 +DEDAD5E6DAD5DEDAD5E6DAD5DEDAD5E6DAD5DEDACDE6DAD5DEDAD5E6DAD5DEDAD5E6DAD5 +DEDACDE6DAD5E6DAD5DEDAD5E6DAD5DEDAD5DEDAD5E6DAD5DEDAD5E6DAD5E6DAD5DEDAD5 +DEDACDE6DAD5DEDAD5E6DAD5DEDAD5E6DAD5DEDAD5E6DAD5DEDAD5E6DAD5DEDACDDEDAD5 +E6DAD5DEDAD5DEDAD5E6DAD5DEDACDE6DAD5DEDAD5DEDAD5DEDAD5DEDAD5E6DAD5DEDACD +DEDAD5DEDAD5DEDACDE6DAD5DEDAD5DEDACDDEDAD5E6DAD5DEDACDE6DAD5DEDAD5E6DAD5 +DEDAD5DEDAD5E6DAD5DEDAD5DEDAD5DEDAD5DEDAD5DEDAD5DEDAD5DEDAD5E6DAD5DEDAD5 +DEDACDE6DAD5DEDAD5E6DAD5DEDAD5DEDAD5E6DAD5DEDAD5E6DAD5DEDAD5E6DAD5DEDAD5 +DEDACDE6DAD5DEDAD5E6DAD59C917BF6F6F6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6F6F6D5D2CD9C9183E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD59C9183D5D2CDF6F6F6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6F6F6EED5D2CD9C9183E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5E6DAD5 +E6DAD5E6DAD5E6DAD59C9183D5D2CDFFF6F6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +F6EEEEFFFAF6D5D2CD9C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C9183D5D2CDFFFAF6F6EEEE +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6F6EEEEFFFAF6D5D2CD9C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C91839C9183 +9C91839C91839C9183D5D2CDFFFAF6F6EEEEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6F6EEEEFFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6F6EEEEEEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6F6EEEEFFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6FFFAF6 +FFFAF6FFFAF6FFFAF6FFFAF6F6EEEEEEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 +EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6EEEAE6 + +end +%%PageTrailer +%%Trailer +%%EOF diff --git a/doc/images/diary.png b/doc/images/diary.png Binary files differnew file mode 100644 index 0000000..1629205 --- /dev/null +++ b/doc/images/diary.png diff --git a/doc/release-checklist.txt b/doc/release-checklist.txt new file mode 100644 index 0000000..45d82f9 --- /dev/null +++ b/doc/release-checklist.txt @@ -0,0 +1,22 @@ +Check bugzilla +Run epydoc, fix all problems: + tools/epydoc +Go through the examples +Run pyflakes +Run all tests +Check buildbot +Bump version number +Update translations +Update NEWS +Update ChangeLog, add marker +Commit +Branch: svn cp svn+ssh://svn.async.com.br/pub/kiwi/trunk \ + svn+ssh://svn.async.com.br/pub/kiwi/tags/1.9.x +python setup.py -q sdist +python setup.py -q bdist_wininst +Upload tarballs and windows installer +Upload epydoc +Add bugzilla version: +http://bugs/editversions.cgi?action=new&product=Kiwi&submit=Add&version=1.9.x +Update website +Write release announcement diff --git a/examples/comboentry.py b/examples/comboentry.py new file mode 100644 index 0000000..896e8a5 --- /dev/null +++ b/examples/comboentry.py @@ -0,0 +1,24 @@ +import sys + +import gtk + +from kiwi.ui.comboentry import ComboEntry + +def main(args): + w = gtk.Window() + w.set_position(gtk.WIN_POS_CENTER) + w.set_size_request(250, -1) + w.set_title('ComboEntry example') + w.connect('delete-event', gtk.main_quit) + + e = ComboEntry() + e.prefill(['foo', 'bar', 'baz', 'biz', 'boz', + 'bsz', 'byz', 'kus', 'kaz', 'kes', + 'buz', 'bwq', 'uys']) + w.add(e) + + w.show_all() + gtk.main() + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/examples/completion.py b/examples/completion.py new file mode 100644 index 0000000..4e907e5 --- /dev/null +++ b/examples/completion.py @@ -0,0 +1,35 @@ +# encoding: iso-8859-1 +import gtk + +from kiwi.ui.widgets.entry import ProxyEntry + +def on_entry_activate(entry): + print 'You selected:', entry.read() + gtk.main_quit() + +win = gtk.Window() +win.connect('delete-event', gtk.main_quit) + +vbox = gtk.VBox() +win.add(vbox) + +# Normal entry +entry = ProxyEntry() +entry.data_type = str +entry.connect('activate', on_entry_activate) +entry.prefill(['Belo Horizonte', u'São Carlos', + u'São Paulo', u'Båstad', + u'Örnsköldsvik', 'sanca', 'sampa']) +vbox.pack_start(entry) + +entry = ProxyEntry() +entry.data_type = int +entry.connect('activate', on_entry_activate) +entry.prefill([('Brazil', 186), + ('Sweden', 9), + ('China', 1306)]) +vbox.pack_start(entry) + +win.show_all() + +gtk.main() diff --git a/examples/framework/color/color.py b/examples/framework/color/color.py new file mode 100644 index 0000000..42c5e01 --- /dev/null +++ b/examples/framework/color/color.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +from sets import Set + +import gtk + +from kiwi.ui.views import BaseView +from kiwi.ui.widgets.combobox import ComboBox + +def load_colors(): + filename = "/usr/X11R6/etc/X11/rgb.txt" + try: + lines = file(filename).readlines() + except IOError: + return ['red', 'blue', 'yellow', 'green'] + + # the first line we don't want + lines = lines[1:] + s = Set([c.strip().split('\t')[2] for c in lines]) + if '' in s: s.remove('') + return list(s) + +class Color: + color = 'blue' + +class FavouriteColor(BaseView): + def __init__(self): + win = gtk.Window() + win.set_title("Silly question") + win.set_border_width(12) + label = gtk.Label("What is your favourite color?") + box = gtk.VBox(spacing=6) + box.pack_start(label, False) + self.combo = ComboBox() + self.combo.data_type = str + self.combo.model_attribute = 'color' + self.combo.prefill(load_colors(), sort=True) + box.pack_start(self.combo, False) + win.add(box) + BaseView.__init__(self, toplevel=win, + delete_handler=self.quit_if_last) + +the_color = Color() +app = FavouriteColor() +app.add_proxy(the_color, ['combo']) +app.show_all() +gtk.main() +print 'Your favourite color is', the_color.color diff --git a/examples/framework/color/color2.py b/examples/framework/color/color2.py new file mode 100644 index 0000000..5eb5e69 --- /dev/null +++ b/examples/framework/color/color2.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +from sets import Set + +import gtk + +from kiwi.ui.views import BaseView +from kiwi.ui.widgets.combo import ProxyComboEntry + +def load_colors(): + filename = "/usr/X11R6/etc/X11/rgb.txt" + try: + lines = file(filename).readlines() + except IOError: + return ['red', 'blue', 'yellow', 'green'] + + # the first line we don't want + lines = lines[1:] + s = Set([c.strip().split('\t')[2] for c in lines]) + if '' in s: s.remove('') + return list(s) + +class Color: + color = 'blue' + +class FavouriteColor(BaseView): + def __init__(self): + win = gtk.Window() + win.set_title("Silly question") + win.set_border_width(12) + label = gtk.Label("What is your favourite color?") + box = gtk.VBox(spacing=6) + box.pack_start(label, False) + self.combo = ProxyComboEntry() + self.combo.data_type = str + self.combo.model_attribute = 'color' + self.combo.prefill(load_colors(), sort=True) + box.pack_start(self.combo, False) + win.add(box) + BaseView.__init__(self, toplevel=win, + delete_handler=self.quit_if_last) + +the_color = Color() +app = FavouriteColor() +app.add_proxy(the_color, ['combo']) +app.show_all() +gtk.main() +print 'Your favourite color is', the_color.color diff --git a/examples/framework/diary/diary.glade b/examples/framework/diary/diary.glade new file mode 100644 index 0000000..eecc9ca --- /dev/null +++ b/examples/framework/diary/diary.glade @@ -0,0 +1,185 @@ +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> +<!DOCTYPE glade-interface SYSTEM "http://gazpacho.sicem.biz/gazpacho-0.1.dtd"> +<glade-interface domain="gazpacho"> + <widget class="GtkWindow" id="diary"> + <property name="default_height">400</property> + <property name="default_width">600</property> + <property name="title" context="yes" translatable="yes">Diary Editor</property> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <child> + <widget class="GtkHBox" id="hbox"> + <property name="border_width">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkVBox" id="leftbox"> + <property name="border_width">6</property> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkHBox" id="hbox4"> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label3"> + <property name="justify">center</property> + <property name="label" context="yes" translatable="yes">_Title:</property> + <property name="mnemonic_widget">title</property> + <property name="use_underline">True</property> + <property name="visible">True</property> + <property name="xalign">1.0</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+entry+Entry" id="title"> + <property name="data_type">str</property> + <property name="model_attribute">title</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox5"> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="kiwi+ui+widgets+radiobutton+RadioButton" id="period"> + <property name="data_type">str</property> + <property name="data_value">morning</property> + <property name="is_focus">True</property> + <property name="label" context="yes" translatable="yes">Morning</property> + <property name="model_attribute">period</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+radiobutton+RadioButton" id="afternoon"> + <property name="data_type">str</property> + <property name="data_value">afternoon</property> + <property name="group">period</property> + <property name="label" context="yes" translatable="yes">Afternoon</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+radiobutton+RadioButton" id="evening"> + <property name="data_type">str</property> + <property name="data_value">evening</property> + <property name="group">period</property> + <property name="label" context="yes" translatable="yes">Evening</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+textview+TextView" id="text"> + <property name="data_type">str</property> + <property name="model_attribute">text</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <placeholder/> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">6</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox2"> + <property name="border_width">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label6"> + <property name="justify">center</property> + <property name="label" context="yes" translatable="yes"> </property> + <property name="visible">True</property> + <property name="xalign">0.0</property> + </widget> + </child> + <child> + <widget class="GtkHButtonBox" id="hbuttonbox3"> + <property name="layout_style">end</property> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkButton" id="remove"> + <property name="can_default">True</property> + <property name="is_focus">True</property> + <property name="label" context="yes" translatable="yes">_Remove Entry</property> + <property name="use_underline">True</property> + <property name="visible">True</property> + </widget> + </child> + <child> + <widget class="GtkButton" id="add"> + <property name="can_default">True</property> + <property name="is_focus">True</property> + <property name="label" context="yes" translatable="yes">_Insert Entry</property> + <property name="use_underline">True</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/examples/framework/diary/diary.py b/examples/framework/diary/diary.py new file mode 100755 index 0000000..fb7d6c3 --- /dev/null +++ b/examples/framework/diary/diary.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +from kiwi.ui.delegates import ProxyDelegate +from kiwi.ui.objectlist import Column, ObjectList + +class DiaryEntry: + title = '' + text = '' + period = '' + +class Diary(ProxyDelegate): + def __init__(self): + self.entries = ObjectList([Column("title", width=120), + Column("period", width=80), + Column("text", expand=True)]) + + ProxyDelegate.__init__(self, DiaryEntry(), ['title', 'period', 'text'], + gladefile="diary", + delete_handler=self.quit_if_last) + self.hbox.pack_start(self.entries) + self.entries.show() + self.entries.grab_focus() + + def on_add__clicked(self, button): + entry = DiaryEntry() + entry.title = 'New title' + + self.set_model(entry) + self.entries.append(entry) + self.title.grab_focus() + + def on_remove__clicked(self, button): + entry = self.entries.get_selected() + if entry: + self.entries.remove(entry) + + def on_entries__selection_changed(self, entries, instance): + if instance: + self.set_model(instance) + +proxy = Diary() +proxy.show_and_loop() diff --git a/examples/framework/diary/diary2.glade b/examples/framework/diary/diary2.glade new file mode 100644 index 0000000..57c4d71 --- /dev/null +++ b/examples/framework/diary/diary2.glade @@ -0,0 +1,235 @@ +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> +<!DOCTYPE glade-interface SYSTEM "http://gazpacho.sicem.biz/gazpacho-0.1.dtd"> +<glade-interface domain="gazpacho"> + <widget class="GtkWindow" id="diary2"> + <property name="default_height">400</property> + <property name="default_width">600</property> + <property name="title" context="yes" translatable="yes">Diary Editor</property> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <child> + <widget class="GtkHBox" id="hbox"> + <property name="border_width">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkVBox" id="leftbox"> + <property name="border_width">6</property> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkHBox" id="hbox4"> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label3"> + <property name="justify">center</property> + <property name="label" context="yes" translatable="yes">_Title:</property> + <property name="mnemonic_widget">title</property> + <property name="use_underline">True</property> + <property name="visible">True</property> + <property name="xalign">1.0</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+entry+Entry" id="title"> + <property name="data_type">str</property> + <property name="model_attribute">title</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox5"> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="kiwi+ui+widgets+radiobutton+RadioButton" id="period"> + <property name="data_type">str</property> + <property name="data_value">morning</property> + <property name="is_focus">True</property> + <property name="label" context="yes" translatable="yes">Morning</property> + <property name="model_attribute">period</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+radiobutton+RadioButton" id="afternoon"> + <property name="active">False</property> + <property name="data_type">str</property> + <property name="data_value">afternoon</property> + <property name="group">period</property> + <property name="label" context="yes" translatable="yes">Afternoon</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+radiobutton+RadioButton" id="evening"> + <property name="active">False</property> + <property name="data_type">str</property> + <property name="data_value">evening</property> + <property name="group">period</property> + <property name="label" context="yes" translatable="yes">Evening</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+textview+TextView" id="text"> + <property name="data_type">str</property> + <property name="model_attribute">text</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <placeholder/> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">6</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox2"> + <property name="border_width">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label1"> + <property name="label" context="yes" translatable="yes">Words:</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+label+Label" id="words"> + <property name="data_type">int</property> + <property name="label" context="yes" translatable="yes">0</property> + <property name="model_attribute">words</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label2"> + <property name="label" context="yes" translatable="yes">Characters:</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+label+Label" id="chars"> + <property name="data_type">int</property> + <property name="label" context="yes" translatable="yes">0</property> + <property name="model_attribute">chars</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">6</property> + </packing> + </child> + <child> + <widget class="GtkHButtonBox" id="hbuttonbox3"> + <property name="layout_style">end</property> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkButton" id="remove"> + <property name="can_default">True</property> + <property name="is_focus">True</property> + <property name="label" context="yes" translatable="yes">_Remove Entry</property> + <property name="use_underline">True</property> + <property name="visible">True</property> + </widget> + </child> + <child> + <widget class="GtkButton" id="add"> + <property name="can_default">True</property> + <property name="is_focus">True</property> + <property name="label" context="yes" translatable="yes">_Insert Entry</property> + <property name="use_underline">True</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/examples/framework/diary/diary2.py b/examples/framework/diary/diary2.py new file mode 100755 index 0000000..1facee8 --- /dev/null +++ b/examples/framework/diary/diary2.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python +from kiwi.python import Settable +from kiwi.ui.delegates import ProxyDelegate +from kiwi.ui.objectlist import Column, ObjectList + +class DiaryEntry(Settable): + def __init__(self): + Settable.__init__(self, title='', period='morning', text='') + + def get_words(self): + return len(self.text.split()) + + def get_chars(self): + return len(self.text) + +class Diary(ProxyDelegate): + def __init__(self): + self.entries = ObjectList([Column("title", width=120, sorted=True), + Column("period", width=80), + Column("text", expand=True, visible=False)]) + ProxyDelegate.__init__(self, DiaryEntry(), + ['title', 'period', 'text', 'chars', 'words'], + gladefile="diary2", + delete_handler=self.quit_if_last) + self.hbox.pack_start(self.entries) + self.entries.show() + self.entries.grab_focus() + self.set_editable(False) + + def set_editable(self, editable): + self.leftbox.set_sensitive(editable) + self.remove.set_sensitive(editable) + + def proxy_updated(self, *args): + self.entries.update(self.model) + + def on_add__clicked(self, button): + entry = DiaryEntry() + entry.title = 'Untitled' + self.entries.append(entry, select=True) + self.set_editable(True) + + def on_remove__clicked(self, button): + entry = self.entries.get_selected() + if entry: + self.entries.remove(entry, select=True) + + self.set_editable(len(self.entries) >= 1) + if not len(self.entries): + self.set_model(None) + + def on_text__content_changed(self, text): + self.proxy.update_many(("chars", "words")) + self.entries.update(self.model) + + def on_entries__selection_changed(self, entries, instance): + if instance: + self.set_model(instance) + self.title.grab_focus() + +proxy = Diary() +proxy.show_and_loop() diff --git a/examples/framework/faren/faren.glade b/examples/framework/faren/faren.glade new file mode 100644 index 0000000..bee3289 --- /dev/null +++ b/examples/framework/faren/faren.glade @@ -0,0 +1,179 @@ +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> +<!DOCTYPE glade-interface SYSTEM "http://gazpacho.sicem.biz/gazpacho-0.1.dtd"> +<glade-interface> + <widget class="GtkWindow" id="faren"> + <property name="role"></property> + <property name="title" context="yes" translatable="yes">Temperature converter</property> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label1"> + <property name="label" context="yes" translatable="yes">Temperature converter</property> + <property name="visible">True</property> + <property name="xalign">0.0</property> + <property name="xpad">6</property> + <property name="ypad">6</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="GtkHSeparator" id="hseparator1"> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkAlignment" id="alignment1"> + <property name="border_width">6</property> + <property name="visible">True</property> + <property name="yscale">0.980000019073</property> + <child> + <widget class="GtkHBox" id="hbox2"> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="temperature_label"> + <property name="label" context="yes" translatable="yes"><b>_Temperature:</b></property> + <property name="use_underline">True</property> + <property name="use_markup">True</property> + <property name="visible">True</property> + </widget> + </child> + <child> + <widget class="GtkEntry" id="temperature"> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="vbox2"> + <property name="visible">True</property> + <child> + <widget class="GtkHBox" id="hbox3"> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="celsius_label"> + <property name="label" context="yes" translatable="yes"><b>Celsius:</b></property> + <property name="use_markup">True</property> + <property name="visible">True</property> + <property name="xalign">1.0</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="celsius"> + <property name="visible">True</property> + <property name="xalign">1.0</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + <child> + <widget class="GtkHSeparator" id="hseparator3"> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox4"> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="farenheit_label"> + <property name="label" context="yes" translatable="yes"><b>Farenheit:</b></property> + <property name="use_markup">True</property> + <property name="visible">True</property> + <property name="xalign">1.0</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="farenheit"> + <property name="visible">True</property> + <property name="xalign">1.0</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkHSeparator" id="hseparator2"> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">3</property> + </packing> + </child> + <child> + <widget class="GtkHButtonBox" id="hbuttonbox1"> + <property name="border_width">6</property> + <property name="layout_style">end</property> + <property name="visible">True</property> + <child> + <widget class="GtkButton" id="quitbutton"> + <property name="label" context="yes" translatable="yes">_Quit</property> + <property name="use_underline">True</property> + <property name="visible">True</property> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">4</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/examples/framework/faren/faren.py b/examples/framework/faren/faren.py new file mode 100644 index 0000000..89f4355 --- /dev/null +++ b/examples/framework/faren/faren.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +import gtk + +from kiwi.controllers import BaseController +from kiwi.ui.views import BaseView +from kiwi.ui.gadgets import quit_if_last + +class FarenControl(BaseController): + + def on_quitbutton__clicked(self, *args): + self.view.hide_and_quit() + + def after_temperature__changed(self, entry, *args): + try: + temp = float(entry.get_text()) + except ValueError: + temp = 0 + celsius = (temp - 32) * 5/9.0 + farenheit = (temp * 9/5.0) + 32 + self.view.celsius.set_text("%.2f" % celsius) + self.view.farenheit.set_text("%.2f" % farenheit) + +widgets = ["quitbutton", "temperature", "celsius", "farenheit"] +view = BaseView(gladefile="faren", delete_handler=quit_if_last, + widgets=widgets) +ctl = FarenControl(view) +view.show() +gtk.main() diff --git a/examples/framework/faren/faren2.py b/examples/framework/faren/faren2.py new file mode 100644 index 0000000..228b37c --- /dev/null +++ b/examples/framework/faren/faren2.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +import gtk + +from kiwi.controllers import BaseController +from kiwi.ui.views import BaseView + +class FarenControl(BaseController): + + def convert_temperature(self, temp): + celsius = (temp - 32) * 5/9.0 + farenheit = (temp * 9/5.0) + 32 + return farenheit, celsius + + def on_quitbutton__clicked(self, *args): + self.view.hide_and_quit() + + # use changed instead of insert_text, since it catches deletes too + def after_temperature__changed(self, entry, *args): + temp = view.get_temp() + if temp == None: + self.view.clear_temp() + else: + farenheit, celsius = self.convert_temperature(float(temp)) + self.view.update_temp(farenheit, celsius) + +class FarenView(BaseView): + widgets = ["quitbutton", "temperature", "celsius", "farenheit", + "celsius_label" , "farenheit_label", "temperature_label"] + def __init__(self): + BaseView.__init__(self, gladefile="faren", + delete_handler=self.quit_if_last) + + def get_temp(self): + return self.temperature.get_text() or None + + def update_temp(self, farenheit, celsius): + self.farenheit.set_text("%.2f" % farenheit) + self.celsius.set_text("%.2f" % celsius) + + def clear_temp(self): + self.farenheit.set_text("") + self.celsius.set_text("") + +view = FarenView() +ctl = FarenControl(view) +view.show() +gtk.main() diff --git a/examples/framework/faren/faren3.py b/examples/framework/faren/faren3.py new file mode 100644 index 0000000..2e002b1 --- /dev/null +++ b/examples/framework/faren/faren3.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +import gtk + +from kiwi.ui.delegates import Delegate + +class Farenheit(Delegate): + widgets = ["quitbutton", "temperature", "celsius", "farenheit", + "celsius_label" , "farenheit_label", "temperature_label"] + gladefile = "faren" + def __init__(self): + Delegate.__init__(self, delete_handler=self.quit_if_last) + + def convert_temperature(self, temp): + farenheit = (temp * 9/5.0) + 32 + celsius = (temp - 32) * 5/9.0 + return farenheit, celsius + + def clear_temperature(self): + self.farenheit.set_text("") + self.celsius.set_text("") + + # Signal handlers + + def on_quitbutton__clicked(self, *args): + self.hide_and_quit() + + def after_temperature__changed(self, entry, *args): + temp = entry.get_text().strip() or None + if temp is None: + self.clear_temperature() + else: + try: + farenheit, celsius = self.convert_temperature(float(temp)) + except ValueError: + farenheit = celsius = float('nan') + self.farenheit.set_text("%.2f" % farenheit) + self.celsius.set_text("%.2f" % celsius) + +delegate = Farenheit() +delegate.show() +gtk.main() diff --git a/examples/framework/gender/gender.glade b/examples/framework/gender/gender.glade new file mode 100644 index 0000000..9ce4414 --- /dev/null +++ b/examples/framework/gender/gender.glade @@ -0,0 +1,68 @@ +<?xml version="1.0" ?> +<glade-interface> + <widget class="GtkWindow" id="gender"> + <property name="title" context="True" translatable="True">Gender Selection</property> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label1"> + <property name="label" context="True" translatable="True">Choose your gender:</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <child> + <widget class="kiwi+ui+widgets+radiobutton+RadioButton" id="male"> + <property name="active">True</property> + <property name="data_value">Male</property> + <property name="label" context="True" translatable="True">Male</property> + <property name="data_type">str</property> + <property name="visible">True</property> + <property name="model_attribute">gender</property> + </widget> + <packing/> + </child> + <child> + <widget class="kiwi+ui+widgets+radiobutton+RadioButton" id="female"> + <property name="active">False</property> + <property name="data_value">Female</property> + <property name="group">male</property> + <property name="label" context="True" translatable="True">Female</property> + <property name="data_type">str</property> + <property name="visible">True</property> + <property name="model_attribute">gender</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+radiobutton+RadioButton" id="other"> + <property name="active">False</property> + <property name="data_value">Other</property> + <property name="label" context="True" translatable="True">Other</property> + <property name="group">male</property> + <property name="data_type">str</property> + <property name="draw_indicator">True</property> + <property name="visible">True</property> + <property name="model_attribute">gender</property> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/examples/framework/gender/genderselection.py b/examples/framework/gender/genderselection.py new file mode 100644 index 0000000..c259393 --- /dev/null +++ b/examples/framework/gender/genderselection.py @@ -0,0 +1,20 @@ +import gtk + +from kiwi.ui.views import BaseView, quit_if_last + +class Person: + gender = 'Male' + +class GenderSelection(BaseView): + gladefile = 'gender' + widgets = ['male', 'female', 'other'] + + def __init__(self): + BaseView.__init__(self, delete_handler=quit_if_last) + self.model = Person() + self.add_proxy(self.model, self.widgets) + +view = GenderSelection() +view.show_all() +gtk.main() +print view.model.gender diff --git a/examples/framework/hey/hey.glade b/examples/framework/hey/hey.glade new file mode 100644 index 0000000..2b04cad --- /dev/null +++ b/examples/framework/hey/hey.glade @@ -0,0 +1,18 @@ +<?xml version="1.0" ?> +<glade-interface> + <widget class="GtkWindow" id="hey"> + <property name="default_width">200</property> + <property name="default_height">50</property> + <property name="role"></property> + <property name="events">all-events-mask | button-motion-mask | button-press-mask | button-release-mask | button1-motion-mask | button2-motion-mask | button3-motion-mask | enter-notify-mask | exposure-mask | focus-change-mask | key-press-mask | key-release-mask | leave-notify-mask | pointer-motion-hint-mask | pointer-motion-mask | property-change-mask | proximity-in-mask | proximity-out-mask | scroll-mask | structure-mask | substructure-mask | visibility-notify-mask</property> + <property name="title" context="True" translatable="True">Anything to declare?</property> + <child> + <widget class="GtkLabel" id="the_label"> + <property name="pattern" context="True" translatable="True"></property> + <property name="label" context="True" translatable="True">Yeah. Don't go to London</property> + <property name="events">all-events-mask | button-motion-mask | button-press-mask | button-release-mask | button1-motion-mask | button2-motion-mask | button3-motion-mask | enter-notify-mask | exposure-mask | focus-change-mask | key-press-mask | key-release-mask | leave-notify-mask | pointer-motion-hint-mask | pointer-motion-mask | property-change-mask | proximity-in-mask | proximity-out-mask | scroll-mask | structure-mask | substructure-mask | visibility-notify-mask</property> + <property name="visible">True</property> + </widget> + </child> + </widget> +</glade-interface> diff --git a/examples/framework/hey/hey.py b/examples/framework/hey/hey.py new file mode 100644 index 0000000..b22b37a --- /dev/null +++ b/examples/framework/hey/hey.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python +import gtk + +from kiwi.ui.views import BaseView + +class HeyPlanet(BaseView): + def __init__(self): + win = gtk.Window() + win.set_title("I'm coming to London") + label = gtk.Label("Anything to declare?") + win.add(label) + win.set_default_size(200, 50) + BaseView.__init__(self, toplevel=win, + delete_handler=self.quit_if_last) +app = HeyPlanet() +app.show_all() +gtk.main() diff --git a/examples/framework/hey/heyglade.py b/examples/framework/hey/heyglade.py new file mode 100644 index 0000000..5dceed6 --- /dev/null +++ b/examples/framework/hey/heyglade.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +import gtk + +from kiwi.ui.gadgets import quit_if_last +from kiwi.ui.views import BaseView + +app = BaseView(gladefile="hey", delete_handler=quit_if_last) +app.show() +gtk.main() diff --git a/examples/framework/hey/heyglade2.py b/examples/framework/hey/heyglade2.py new file mode 100644 index 0000000..e119723 --- /dev/null +++ b/examples/framework/hey/heyglade2.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +import gtk + +from kiwi.ui.gadgets import quit_if_last +from kiwi.ui.views import BaseView + +widgets = ["the_label"] +app = BaseView(gladefile="hey", + delete_handler=quit_if_last, + widgets=widgets) + +# the_label, a widget defined in glade, is +text = app.the_label.get_text() +# now an instance variable of the view +app.the_label.set_markup('<b>%s</b>' % text) +app.the_label.set_use_markup(True) +app.show() +gtk.main() diff --git a/examples/framework/hey/heyglade3.py b/examples/framework/hey/heyglade3.py new file mode 100644 index 0000000..23bacab --- /dev/null +++ b/examples/framework/hey/heyglade3.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python +import gtk + +from kiwi.ui.gadgets import quit_if_last +from kiwi.ui.views import BaseView + +class MyView(BaseView): + widgets = ["the_label"] # widgets list + gladefile = "hey" + def __init__(self): + BaseView.__init__(self, delete_handler=quit_if_last) + text = self.the_label.get_text() # attached by constructor + self.the_label.set_markup('<b>%s</b>' % text) + self.the_label.set_use_markup(True) + self.set_title("Avi's declaration") # change window title + +app = MyView() +app.show() +gtk.main() diff --git a/examples/framework/news/news.py b/examples/framework/news/news.py new file mode 100644 index 0000000..bad56bc --- /dev/null +++ b/examples/framework/news/news.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +import gtk + +from kiwi.ui.views import BaseView, SlaveView +from kiwi.ui.gadgets import quit_if_last + +news = [ + ("Smallpox Vaccinations for EVERYONE", + "JRoyale", + "http://www.pigdog.org/auto/Power_Corrupts/link/2700.html"), + ("Is that uranium in your pocket or are you just happy to see me?", + "Baron Earl", + "http://www.pigdog.org/auto/bad_people/link/2699.html"), + ("Cut 'n Paste", + "Baron Earl", + "http://www.pigdog.org/auto/ArtFux/link/2690.html"), + ("A Slippery Exit", + "Reverend CyberSatan", + "http://www.pigdog.org/auto/TheCorporateFuck/link/2683.html"), + ("Those Crazy Dutch Have Resurrected Elvis", + "Miss Conduct", + "http://www.pigdog.org/auto/viva_la_musica/link/2678.html") +] + +class News(SlaveView): + def __init__(self): + model = gtk.ListStore(str, str) + treeview = gtk.TreeView(model) + renderer = gtk.CellRendererText() + col1 = gtk.TreeViewColumn('News', renderer, text=0) + col2 = gtk.TreeViewColumn('Author', renderer, text=1) + treeview.append_column(col1) + treeview.append_column(col2) + treeview.get_selection().set_mode(gtk.SELECTION_BROWSE) + for item in news: + model.append(item[:-1]) + SlaveView.__init__(self, treeview) + +news = News() + +shell = BaseView(gladefile="news_shell", delete_handler=quit_if_last) +shell.attach_slave("placeholder", news) + +news.show_all() +news.focus_toplevel() # explained next section, don't worry +shell.show() +gtk.main() diff --git a/examples/framework/news/news2.py b/examples/framework/news/news2.py new file mode 100644 index 0000000..f6bd833 --- /dev/null +++ b/examples/framework/news/news2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +import gtk + +from kiwi.ui.objectlist import ObjectList, Column + +class NewsItem: + """An instance that holds information about a news article.""" + def __init__(self, title, author, url): + self.title, self.author, self.url = title, author, url + +# Assemble friendly Pigdog.org news into NewsItem instances so they can +# be used in the ObjectList +news = [ + NewsItem("Smallpox Vaccinations for EVERYONE", "JRoyale", + "http://www.pigdog.org/auto/Power_Corrupts/link/2700.html"), + NewsItem("Is that uranium in your pocket or are you just happy to see me?", + "Baron Earl", + "http://www.pigdog.org/auto/bad_people/link/2699.html"), + NewsItem("Cut 'n Paste", "Baron Earl", + "http://www.pigdog.org/auto/ArtFux/link/2690.html"), + NewsItem("A Slippery Exit", "Reverend CyberSatan", + "http://www.pigdog.org/auto/TheCorporateFuck/link/2683.html"), + NewsItem("Those Crazy Dutch Have Resurrected Elvis", "Miss Conduct", + "http://www.pigdog.org/auto/viva_la_musica/link/2678.html") +] + +# Specify the columns: one for each attribute of NewsItem, the URL +# column invisible by default +my_columns = [Column("title", sorted=True), + Column("author", justify=gtk.JUSTIFY_RIGHT), + Column("url", title="URL", visible=False)] + +objectlist = ObjectList(my_columns) +objectlist.add_list(news) + +w = gtk.Window() +w.connect('delete-event', gtk.main_quit) +w.set_size_request(600, 250) + +w.add(objectlist) + +w.show_all() +gtk.main() diff --git a/examples/framework/news/news3.py b/examples/framework/news/news3.py new file mode 100644 index 0000000..794c088 --- /dev/null +++ b/examples/framework/news/news3.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python +import os + +import gtk + +from kiwi.ui import gadgets +from kiwi.ui.delegates import Delegate, SlaveDelegate +from kiwi.ui.objectlist import ObjectList, Column + +class NewsItem: + def __init__(self, title, author, url): + self.title, self.author, self.url = title, author, url + +# Friendly Pigdog.org news +news = [ + NewsItem("Smallpox Vaccinations for EVERYONE", "JRoyale", + "http://www.pigdog.org/auto/Power_Corrupts/link/2700.html"), + NewsItem("Is that uranium in your pocket or are you just happy to see me?", + "Baron Earl", + "http://www.pigdog.org/auto/bad_people/link/2699.html"), + NewsItem("Cut 'n Paste", "Baron Earl", + "http://www.pigdog.org/auto/ArtFux/link/2690.html"), + NewsItem("A Slippery Exit", "Reverend CyberSatan", + "http://www.pigdog.org/auto/TheCorporateFuck/link/2683.html"), + NewsItem("Those Crazy Dutch Have Resurrected Elvis", "Miss Conduct", + "http://www.pigdog.org/auto/viva_la_musica/link/2678.html") +] + +my_columns = [Column("title", sorted=True, tooltip="Title of article", width=50), + Column("author", tooltip="Author of article"), + Column("url", title="Address", visible=False, + tooltip="Address of article")] + +class Shell(Delegate): + widgets = ["ok", "cancel", "header", "footer", "title"] + def __init__(self): + Delegate.__init__(self, gladefile="news_shell", + delete_handler=self.quit_if_last) + + # paint header and footer; they are eventboxes that hold a + # label and buttonbox respectively + gadgets.set_background(self.header, "white") + gadgets.set_background(self.footer, "#A0A0A0") + gadgets.set_foreground(self.title, "blue") + + # Create the delegate and set it up + objectlist = ObjectList(my_columns, news) + objectlist.connect('selection-changed', self.news_selected) + objectlist.connect('double-click', self.double_click) + slave = SlaveDelegate(toplevel=objectlist) + + self.attach_slave("placeholder", slave) + slave.focus_toplevel() # Must be done after attach + + self.slave = slave + + def news_selected(self, the_list, item): + objectlist = self.slave.get_toplevel() + print "%s %s %s\n" % (item.title, item.author, item.url) + + def double_click(self, the_list, selected_object): + self.emit('result', selected_object.url) + self.hide_and_quit() + + def on_ok__clicked(self, *args): + objectlist = self.slave.get_toplevel() + item = objectlist.get_selected() + if item: + self.emit('result', item.url) + self.hide_and_quit() + + def on_cancel__clicked(self, *args): + self.hide_and_quit() + +url = None +shell = Shell() +shell.show_all() +def get_url(view, result): + global url + url = result + +shell.connect('result', get_url) + +gtk.main() + +if url is not None: + # Try to run BROWSER (or lynx) on the URL returned + browser = os.environ.get("BROWSER", "lynx") + os.system("%s %s" % (browser, url)) diff --git a/examples/framework/news/news4.py b/examples/framework/news/news4.py new file mode 100644 index 0000000..9a57574 --- /dev/null +++ b/examples/framework/news/news4.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python + +import os + +import gtk + +from kiwi.ui.delegates import Delegate, SlaveDelegate +from kiwi.ui.gadgets import quit_if_last, set_background, set_foreground + +class NewsItem: + def __init__(self, title, author, url): + self.title, self.author, self.url = title, author, url + +# Friendly Pigdog.org news +news = [ + NewsItem("Smallpox Vaccinations for EVERYONE", "JRoyale", + "http://www.pigdog.org/auto/Power_Corrupts/link/2700.html"), + NewsItem("Is that uranium in your pocket or are you just happy to see me?", + "Baron Earl", + "http://www.pigdog.org/auto/bad_people/link/2699.html"), + NewsItem("Cut 'n Paste", "Baron Earl", + "http://www.pigdog.org/auto/ArtFux/link/2690.html"), + NewsItem("A Slippery Exit", "Reverend CyberSatan", + "http://www.pigdog.org/auto/TheCorporateFuck/link/2683.html"), + NewsItem("Those Crazy Dutch Have Resurrected Elvis", "Miss Conduct", + "http://www.pigdog.org/auto/viva_la_musica/link/2678.html") +] + +class ListSlave(SlaveDelegate): + def __init__(self, parent): + self.parent = parent + SlaveDelegate.__init__(self, gladefile="news_list", + toplevel_name="window_container", + widgets=["news_list"]) + self.news_list.add_list(news) + + def on_news_list__selection_changed(self, list, item): + print "%s %s %s\n" % (item.title, item.author, item.url) + + def on_news_list__double_click(self, the_list, selected_object): + self.parent.ok.clicked() + +class Shell(Delegate): + widgets = ["ok", "cancel", "header", "footer", "title"] + def __init__(self): + keyactions = { + gtk.keysyms.a: self.on_ok__clicked, + gtk.keysyms.b: self.on_cancel__clicked, + } + + Delegate.__init__(self, gladefile="news_shell", + delete_handler=quit_if_last, keyactions=keyactions) + + # paint header and footer; they are eventboxes that hold a + # label and buttonbox respectively + set_background(self.header, "white") + set_background(self.footer, "#A0A0A0") + set_foreground(self.title, "blue") + + self.slave = ListSlave(self) + self.attach_slave("placeholder", self.slave) + self.slave.show() + self.slave.focus_toplevel() # Must be done after attach + + def on_ok__clicked(self, *args): + objectlist = self.slave.news_list + item = objectlist.get_selected() + self.emit('result', item.url) + self.hide_and_quit() + + def on_cancel__clicked(self, *args): + self.hide_and_quit() + +url = None + +shell = Shell() +shell.show() + +def get_url(view, result): + global url + url = result + +shell.connect('result', get_url) + +gtk.main() + +if url is not None: + # Try to run BROWSER (or lynx) on the URL returned + browser = os.environ.get("BROWSER", "lynx") + os.system("%s %s" % (browser, url)) diff --git a/examples/framework/news/news_list.glade b/examples/framework/news/news_list.glade new file mode 100644 index 0000000..5e9f8be --- /dev/null +++ b/examples/framework/news/news_list.glade @@ -0,0 +1,14 @@ +<?xml version="1.0" ?> +<glade-interface> + <requires lib="kiwi2"/> + <widget class="GtkWindow" id="window_container"> + <child> + <widget class="ObjectList" id="news_list"> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">automatic</property> + <property name="column_definitions">title|Title|str|True|left|Title of article||0|True|^author|Author|str|True|left|Author of article||0|False|^url|Url|str|False|left|Address of article||0|False|</property> + <property name="can_focus">True</property> + </widget> + </child> + </widget> +</glade-interface> diff --git a/examples/framework/news/news_shell.glade b/examples/framework/news/news_shell.glade new file mode 100644 index 0000000..104a76f --- /dev/null +++ b/examples/framework/news/news_shell.glade @@ -0,0 +1,111 @@ +<?xml version="1.0" ?> +<glade-interface> + <widget class="GtkWindow" id="news_shell"> + <property name="default_width">550</property> + <property name="default_height">300</property> + <property name="title" context="True" translatable="True">News Browser</property> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <child> + <widget class="GtkEventBox" id="header"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="title"> + <property name="ypad">10</property> + <property name="pattern"></property> + <property name="label" context="True" translatable="True">Select news item to view in Web browser</property> + <property name="xpad">5</property> + <property name="xalign">0.0</property> + <property name="justify">center</property> + <property name="visible">True</property> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="GtkHSeparator" id="hseparator1"> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkEventBox" id="placeholder"> + <property name="border_width">5</property> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="labelX"> + <property name="pattern"></property> + <property name="label" context="True" translatable="True">Slave comes here +(this widget is called "placeholder" +and is packed inside a GtkEventBox)</property> + <property name="justify">center</property> + <property name="visible">True</property> + </widget> + </child> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkHSeparator" id="hseparator2"> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">3</property> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkEventBox" id="footer"> + <property name="visible">True</property> + <child> + <widget class="GtkHButtonBox" id="hbuttonbox1"> + <property name="layout_style">end</property> + <property name="spacing">5</property> + <property name="border_width">5</property> + <property name="visible">True</property> + <child> + <widget class="GtkButton" id="cancel"> + <property name="receives_default">True</property> + <property name="label" context="True" translatable="True">Cancel</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="visible">True</property> + </widget> + <packing/> + </child> + <child> + <widget class="GtkButton" id="ok"> + <property name="receives_default">True</property> + <property name="label" context="True" translatable="True">OK</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="can_focus">True</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="position">4</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/examples/framework/newsform/newsform.glade b/examples/framework/newsform/newsform.glade new file mode 100644 index 0000000..e64bdbf --- /dev/null +++ b/examples/framework/newsform/newsform.glade @@ -0,0 +1,115 @@ +<?xml version="1.0" ?> +<glade-interface> + <requires lib="kiwi2"/> + <widget class="GtkWindow" id="newsform"> + <property name="title" context="True" translatable="True">News Editor</property> + <child> + <widget class="GtkTable" id="table1"> + <property name="row_spacing">6</property> + <property name="column_spacing">6</property> + <property name="border_width">6</property> + <property name="n_rows">4</property> + <property name="n_columns">2</property> + <property name="visible">True</property> + <child> + <widget class="kiwi+ui+widgets+entry+Entry" id="size"> + <property name="model_attribute">size</property> + <property name="can_focus">True</property> + <property name="data_type">int</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="bottom_attach">4</property> + <property name="top_attach">3</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label4"> + <property name="label" translatable="True">Size:</property> + <property name="xalign">1.0</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="bottom_attach">4</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label3"> + <property name="label" context="True" translatable="True">_URL:</property> + <property name="use_underline">True</property> + <property name="xalign">1.0</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="bottom_attach">3</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label2"> + <property name="label" context="True" translatable="True">_Author:</property> + <property name="use_underline">True</property> + <property name="xalign">1.0</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="bottom_attach">2</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label1"> + <property name="label" context="True" translatable="True">_Title:</property> + <property name="use_underline">True</property> + <property name="xalign">1.0</property> + <property name="visible">True</property> + </widget> + <packing/> + </child> + <child> + <widget class="kiwi+ui+widgets+entry+Entry" id="title"> + <property name="model_attribute">title</property> + <property name="can_focus">True</property> + <property name="data_type">str</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+entry+Entry" id="author"> + <property name="model_attribute">author</property> + <property name="can_focus">True</property> + <property name="data_type">str</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="bottom_attach">2</property> + <property name="top_attach">1</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+entry+Entry" id="url"> + <property name="model_attribute">url</property> + <property name="can_focus">True</property> + <property name="data_type">str</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="bottom_attach">3</property> + <property name="top_attach">2</property> + <property name="right_attach">2</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/examples/framework/newsform/newsform.py b/examples/framework/newsform/newsform.py new file mode 100644 index 0000000..b44bdc1 --- /dev/null +++ b/examples/framework/newsform/newsform.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +import gtk + +from kiwi.ui.gadgets import quit_if_last +from kiwi.ui.views import BaseView + +class NewsItem: + """An instance representing an item of news. + Attributes: title, author, url, size""" + title = '' + url = '' + author = '' + size = 0 + +item = NewsItem() +my_widgets = ["title", "author", "url", "size"] +view = BaseView(gladefile="newsform", widgets=my_widgets, + delete_handler=quit_if_last) +view.add_proxy(item, my_widgets) +view.focus_topmost() +view.show() +gtk.main() # runs till window is closed as per delete_handler + +print 'Item: "%s" (%s) %s %d' % (item.title, item.author, item.url, item.size) diff --git a/examples/framework/sizegroup/shell.glade b/examples/framework/sizegroup/shell.glade new file mode 100644 index 0000000..08e9609 --- /dev/null +++ b/examples/framework/sizegroup/shell.glade @@ -0,0 +1,136 @@ +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> +<!DOCTYPE glade-interface SYSTEM "http://gazpacho.sicem.biz/gazpacho-0.1.dtd"> +<glade-interface> + <widget class="GtkSizeGroup" id="sizegroup1"> + <property name="mode">horizontal</property> + </widget> + <widget class="GtkWindow" id="shell"> + <property name="default_height">300</property> + <property name="default_width">550</property> + <property name="title" context="yes" translatable="yes">Sizegroup example</property> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label1"> + <property name="justify">center</property> + <property name="label" context="yes" translatable="yes">Full name</property> + <property name="sizegroup">sizegroup1</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="padding">10</property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="entry1"> + <property name="is_focus">True</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox2"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label2"> + <property name="justify">center</property> + <property name="label" context="yes" translatable="yes">Age</property> + <property name="sizegroup">sizegroup1</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="padding">10</property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="entry2"> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkHSeparator" id="hseparator1"> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkEventBox" id="placeholder"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="labelX"> + <property name="justify">center</property> + <property name="label" context="yes" translatable="yes">Slave comes here +(this widget is called "placeholder" +and is packed inside a GtkEventBox)</property> + <property name="visible">True</property> + </widget> + </child> + </widget> + <packing> + <property name="position">3</property> + </packing> + </child> + <child> + <widget class="GtkHSeparator" id="hseparator2"> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">4</property> + </packing> + </child> + <child> + <widget class="GtkEventBox" id="footer"> + <property name="visible">True</property> + <child> + <widget class="GtkHButtonBox" id="hbuttonbox1"> + <property name="border_width">5</property> + <property name="layout_style">end</property> + <property name="spacing">5</property> + <property name="visible">True</property> + <child> + <widget class="GtkButton" id="ok"> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="label" context="yes" translatable="yes">OK</property> + <property name="visible">True</property> + </widget> + </child> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">5</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/examples/framework/sizegroup/slave_view.glade b/examples/framework/sizegroup/slave_view.glade new file mode 100644 index 0000000..440dcf5 --- /dev/null +++ b/examples/framework/sizegroup/slave_view.glade @@ -0,0 +1,92 @@ +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> +<!DOCTYPE glade-interface SYSTEM "http://gazpacho.sicem.biz/gazpacho-0.1.dtd"> +<glade-interface> + <widget class="GtkSizeGroup" id="sizegroup1"> + <property name="mode">horizontal</property> + </widget> + <widget class="GtkWindow" id="window_container"> + <child> + <widget class="GtkVBox" id="slave_view"> + <property name="visible">True</property> + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label1"> + <property name="label" context="yes" translatable="yes">Email address</property> + <property name="sizegroup">sizegroup1</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="padding">10</property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="entry1"> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox2"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label2"> + <property name="label" context="yes" translatable="yes">Personal website address</property> + <property name="sizegroup">sizegroup1</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="padding">10</property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="entry2"> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkHSeparator" id="hseparator1"> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkEventBox" id="eventbox"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label4"> + <property name="label" context="yes" translatable="yes">Placeholder</property> + <property name="visible">True</property> + </widget> + </child> + </widget> + <packing> + <property name="position">3</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/examples/framework/sizegroup/slave_view2.glade b/examples/framework/sizegroup/slave_view2.glade new file mode 100644 index 0000000..83b29b8 --- /dev/null +++ b/examples/framework/sizegroup/slave_view2.glade @@ -0,0 +1,70 @@ +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> +<!DOCTYPE glade-interface SYSTEM "http://gazpacho.sicem.biz/gazpacho-0.1.dtd"> +<glade-interface> + <widget class="GtkSizeGroup" id="sizegroup1"> + <property name="mode">horizontal</property> + </widget> + <widget class="GtkWindow" id="window_container"> + <child> + <widget class="GtkVBox" id="slave_view2"> + <property name="visible">True</property> + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label1"> + <property name="label" context="yes" translatable="yes">Complete home address</property> + <property name="sizegroup">sizegroup1</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="padding">10</property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="entry1"> + <property name="is_focus">True</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox2"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label2"> + <property name="label" context="yes" translatable="yes">Country</property> + <property name="sizegroup">sizegroup1</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="padding">10</property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="entry2"> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/examples/framework/sizegroup/slaves.py b/examples/framework/sizegroup/slaves.py new file mode 100644 index 0000000..2cc26bc --- /dev/null +++ b/examples/framework/sizegroup/slaves.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python +import gtk + +from kiwi.ui.delegates import Delegate, SlaveDelegate +from kiwi.ui.gadgets import quit_if_last + + +class NestedSlave(SlaveDelegate): + def __init__(self, parent): + self.parent = parent + SlaveDelegate.__init__(self, gladefile="slave_view2", + toplevel_name="window_container", + widgets=["slave_view2"]) + + +# This slave will be attached to the toplevel view, and will contain another +# slave +class TestSlave(SlaveDelegate): + def __init__(self, parent): + self.parent = parent + # Be carefull that, when passing the widget list, the sizegroups + # that you want to be merged are in the list, otherwise, they wont + # be. + SlaveDelegate.__init__(self, gladefile="slave_view", + toplevel_name="window_container", + widgets=["slave_view", "sizegroup1"]) + + self.slave = NestedSlave(self) + self.attach_slave("eventbox", self.slave) + self.slave.show() + self.slave.focus_toplevel() # Must be done after attach + +class Shell(Delegate): + def __init__(self): + Delegate.__init__(self, gladefile="shell", + delete_handler=quit_if_last) + + self.slave = TestSlave(self) + self.attach_slave("placeholder", self.slave) + self.slave.show() + self.slave.focus_toplevel() # Must be done after attach + + def on_ok__clicked(self, *args): + self.hide_and_quit() + +shell = Shell() +shell.show() + +gtk.main() + diff --git a/examples/hyperlink/hyperlink_demo.py b/examples/hyperlink/hyperlink_demo.py new file mode 100644 index 0000000..75d5c59 --- /dev/null +++ b/examples/hyperlink/hyperlink_demo.py @@ -0,0 +1,165 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Lorenzo Gil Sanchez <lgs@sicem.biz> +# Johan Dahlin <jdahlin@async.com.br> +# +# This module: (C) Ali Afshar <aafshar@gmail.com> +# (contact if you require release under a different license) + + +""" HyperLink demo application. """ + + +import time + +import gtk + +from kiwi.ui import hyperlink + +class App(object): + + def __init__(self): + self._window = gtk.Window() + self._window.connect('destroy', self._on_window__destroy) + self._window.set_title('Hyperlink Widget Demo') + vb = gtk.VBox(spacing=3) + vb.set_border_width(12) + self._window.add(vb) + self._build_basic_hyperlink(vb) + vb.pack_start(gtk.HSeparator(), expand=False, padding=6) + self._build_formatted_hyperlink(vb) + vb.pack_start(gtk.HSeparator(), expand=False, padding=6) + self._build_menu_hyperlink(vb) + vb.pack_start(gtk.HSeparator(), expand=False, padding=6) + sw = gtk.ScrolledWindow() + vb.pack_start(sw) + sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS) + self._logger = gtk.TextView() + sw.add(self._logger) + self._logger.set_editable(False) + self._window.show_all() + + def _build_basic_hyperlink(self, vb): + self._hl1 = hyperlink.HyperLink('basic hyperlink') + vb.pack_start(self._hl1, expand=False) + self._hl1.connect('clicked', self._on_hl1__clicked) + self._hl1.connect('right-clicked', self._on_hl1__right_clicked) + d1 = gtk.Label( + 'I am a basic hyperlink. The signals I emit are "clicked" and' + ' "right-clicked". Try me out') + d1.set_line_wrap(True) + vb.pack_start(d1, expand=False) + + def _build_formatted_hyperlink(self, vb): + self._hl2 = hyperlink.HyperLink('hyperlink with formatting') + vb.pack_start(self._hl2, expand=False) + self._hl2.normal_color = '#c000c0' + self._hl2.hover_color = '#00c0c0' + self._hl2.active_color = '#000000' + self._hl2.hover_bold = True + self._hl2.active_bold = True + self._hl2.connect('clicked', self._on_hl2__clicked) + self._hl2.connect('right-clicked', self._on_hl2__right_clicked) + d1 = gtk.Label( + 'I am a formatted hyperlink. I can be modified by setting' + ' my properties like normal-color. Click me to change me!') + d1.set_line_wrap(True) + vb.pack_start(d1, expand=False) + + def _build_menu_hyperlink(self, vb): + self._hl3 = hyperlink.HyperLink('menu hyperlink') + vb.pack_start(self._hl3, expand=False) + self._hl3.connect('clicked', self._on_hl3__clicked) + self._hl3.connect('right-clicked', self._on_hl3__right_clicked) + self._hl3.hover_underline = False + self._hl3.active_underline = False + menu = gtk.Menu() + m1 = gtk.MenuItem() + m1.add(gtk.Label('toggle bold')) + menu.add(m1) + m1.connect('activate', self._on_m1_activated) + m2 = gtk.MenuItem() + m2.add(gtk.Label('toggle underline')) + menu.add(m2) + m2.connect('activate', self._on_m2_activated) + menu.show_all() + self._hl3.set_menu(menu) + d1 = gtk.Label( + 'I am a hyperlink with a menu. Right click me to pop it up.') + d1.set_line_wrap(True) + vb.pack_start(d1, expand=False) + + def start(self): + gtk.main() + + def stop(self): + gtk.main_quit() + + def _on_window__destroy(self, window): + self.stop() + + def _on_hl1__clicked(self, hyperlink): + self.log('basic hyperlink clicked') + + def _on_hl1__right_clicked(self, hyperlink): + self.log('basic hyperlink right-clicked') + + def _on_hl2__clicked(self, hyperlink): + self.log('formatted hyperlink clicked') + hyperlink.normal_color = '#c00000' + hyperlink.normal_bold = True + if not hyperlink.text.startswith('au'): + hyperlink.text = 'automatically! by setting self.text = foo' + else: + hyperlink.text = 'and changed back again' + + def _on_hl2__right_clicked(self, hyperlink): + self.log('formatted hyperlink right-clicked') + + def _on_hl3__clicked(self, hyperlink): + self.log('menu hyperlink clicked') + + def _on_hl3__right_clicked(self, hyperlink): + self.log('menu hyperlink right-clicked') + + def _on_m1_activated(self, menuitem): + self.log('menuitem 1 activated') + self._hl3.normal_bold = not self._hl3.normal_bold + self._hl3.hover_bold = not self._hl3.hover_bold + self._hl3.active_bold = not self._hl3.active_bold + + def _on_m2_activated(self, menuitem): + self.log('menuitem 2 activated') + self._hl3.normal_underline = not self._hl3.normal_underline + self._hl3.hover_underline = not self._hl3.hover_underline + self._hl3.active_underline = not self._hl3.active_underline + + def log(self, msg): + buf = self._logger.get_buffer() + timestr = time.strftime('%H:%M:%S') + buf.insert(buf.get_start_iter(), '%s...%s\n' % (timestr, msg)) + +def main(): + a = App() + a.start() + +if __name__ == '__main__': + main() diff --git a/examples/list/editable.py b/examples/list/editable.py new file mode 100644 index 0000000..aa4def2 --- /dev/null +++ b/examples/list/editable.py @@ -0,0 +1,29 @@ +import gtk + +from kiwi.ui.objectlist import Column, ObjectList + +class Fruit: + def __init__(self, name, cost): + self.name = name + self.cost = cost + +fruits = ObjectList([Column('name', data_type=str, editable=True, + expand=True), + Column('cost', data_type=int, editable=True)]) + +for name, cost in [('Apple', 4), + ('Pineapple', 2), + ('Kiwi', 8), + ('Banana', 3), + ('Melon', 5)]: + fruits.append(Fruit(name, cost)) + +window = gtk.Window() +window.connect('delete-event', gtk.main_quit) +window.set_title('Editable Fruit List') +window.set_size_request(230, 150) + +window.add(fruits) +window.show_all() + +gtk.main() diff --git a/examples/list/kitchensink.py b/examples/list/kitchensink.py new file mode 100644 index 0000000..4566488 --- /dev/null +++ b/examples/list/kitchensink.py @@ -0,0 +1,88 @@ +# encoding: utf-8 +import datetime +import random +import time + +import gtk + +from kiwi.datatypes import currency +from kiwi.ui.objectlist import (Column, ObjectList, SequentialColumn, + ColoredColumn, SummaryLabel) + +def random_date(): + max = datetime.datetime.today() + min = max.replace(year=max.year-5) + + timestamp = random.randint( + time.mktime(min.timetuple()), + time.mktime(max.timetuple())) + return datetime.datetime.fromtimestamp(timestamp) + +class Person: + """The parameters need to be of the same name of the column headers""" + def __init__(self, name, age, city): + (self.name, self.age, + self.city) = name, age, city + self.date = self.datetime = self.time = random_date() + self.extra = -1 + self.salary = random.randint(40, 180) * 10 + self.bonus = random.randint(0, 1) and True or False + + def __repr__(self): + return '<Person %s>' % self._name + +class MyColumn(Column): + pass + +def format_func(age): + if age % 2 == 0: + return float(age) + return age + +def color(data): + return data % 2 == 0 + +columns = [ + SequentialColumn(), + MyColumn('name', tooltip='What about a stupid tooltip?', editable=True), + Column('age', data_type=int, format_func=format_func, editable=True), + Column('bonus', data_type=bool, editable=True), + Column('salary', data_type=currency, editable=True), + Column('city', visible=True, sorted=True), + Column('date', data_type=datetime.date), + Column('time', data_type=datetime.time), + Column('datetime', data_type=datetime.datetime), + ColoredColumn('age', data_type=int, color='red', data_func=color), + ] + +data = (Person('Evandro', 23, 'Belo Horizonte'), + Person('Daniel', 22, 'São Carlos'), + Person('Henrique', 21, 'São Carlos'), + Person('Gustavo', 23, 'São Jose do Santos'), + Person('Johan', 23, 'Göteborg'), + Person('Lorenzo', 26, 'Granada') + ) + +win = gtk.Window() +win.set_size_request(850, 300) +win.connect('destroy', gtk.main_quit) + +vbox = gtk.VBox() +win.add(vbox) + +l = ObjectList(columns, mode=gtk.SELECTION_MULTIPLE) +l.extend(data) +l.append(Person('Nando', 29+len(l), 'Santos')) + + +# add an extra person + +vbox.pack_start(l) + +label = SummaryLabel(klist=l, column='salary', label='<b>Total:</b>', + value_format='<b>%s</b>') +vbox.pack_start(label, expand=False, padding=6) + +win.show_all() + +gtk.main() diff --git a/examples/list/radio.py b/examples/list/radio.py new file mode 100644 index 0000000..8b87b66 --- /dev/null +++ b/examples/list/radio.py @@ -0,0 +1,26 @@ +import gtk +from kiwi.ui.objectlist import Column, ObjectList + +class Object: + def __init__(self, name, value): + self.name, self.value = name, value + +columns = [Column('name'), + Column('value', data_type=bool, radio=True, editable=True)] + +win = gtk.Window() +win.set_size_request(300, 120) +win.connect('delete-event', gtk.main_quit) + +list = ObjectList(columns) +win.add(list) + +for name, value in [('First', False), + ('Second', False), + ('Third', True), + ('Fourth', False), + ('Fifth', False)]: + list.append(Object(name, value)) +win.show_all() + +gtk.main() diff --git a/examples/list/searchbar.py b/examples/list/searchbar.py new file mode 100644 index 0000000..90cdb6f --- /dev/null +++ b/examples/list/searchbar.py @@ -0,0 +1,51 @@ +import gtk + +from kiwi.datatypes import currency +from kiwi.ui.objectlist import Column, ObjectList + +class Product: + def __init__(self, name, price): + self.name = name + self.price = price + + def __repr__(self): + return '<Product %s>' % self.name + +columns = [ + Column('name', data_type=str), + Column('price', data_type=currency, sorted=True), + ] + +data = (Product('Snacks', '3.50'), + Product('Juice', '4.75'), + Product('Apple', '0.35'), + Product('Chocolate bar', '8.5'), + Product('Bubble gum', '0.3'), + Product('Tutti-frutti', '1.50') + ) + +win = gtk.Window() +win.connect('destroy', gtk.main_quit) +win.set_border_width(6) +win.set_size_request(650, 300) + +vbox = gtk.VBox() +win.add(vbox) + +def entry_activate_cb(entry): + text = entry.get_text() + products = [product for product in data + if text.lower() in product.name.lower()] + l.add_list(products) + +entry = gtk.Entry() +entry.connect('activate', entry_activate_cb) +vbox.pack_start(entry, False, False, 6) + +l = ObjectList(columns) +l.extend(data) +vbox.pack_start(l) + +win.show_all() + +gtk.main() diff --git a/examples/list/simple.py b/examples/list/simple.py new file mode 100644 index 0000000..aeb6c1b --- /dev/null +++ b/examples/list/simple.py @@ -0,0 +1,28 @@ +import gtk + +from kiwi.ui.objectlist import Column, ObjectList + +class Fruit: + def __init__(self, name, price): + self.name = name + self.price = price + +fruits = ObjectList([Column('name', data_type=str), + Column('price', data_type=int)]) + +for name, price in [('Apple', 4), + ('Pineapple', 2), + ('Kiwi', 8), + ('Banana', 3), + ('Melon', 5)]: + fruits.append(Fruit(name, price)) + +window = gtk.Window() +window.connect('delete-event', gtk.main_quit) +window.set_title('Fruits') +window.set_size_request(150, 180) + +window.add(fruits) +window.show_all() + +gtk.main() diff --git a/examples/list/sortable.py b/examples/list/sortable.py new file mode 100644 index 0000000..4c0ebd9 --- /dev/null +++ b/examples/list/sortable.py @@ -0,0 +1,28 @@ +import gtk + +from kiwi.ui.objectlist import Column, ObjectList + +class Fruit: + def __init__(self, name, price): + self.name = name + self.price = price + +fruits = ObjectList([Column('name', data_type=str, sorted=True), + Column('price', data_type=int)]) + +for name, price in [('Apple', 4), + ('Pineapple', 2), + ('Kiwi', 8), + ('Banana', 3), + ('Melon', 5)]: + fruits.append(Fruit(name, price)) + +window = gtk.Window() +window.connect('delete-event', gtk.main_quit) +window.set_title('Fruits') +window.set_size_request(150, 180) + +window.add(fruits) +window.show_all() + +gtk.main() diff --git a/examples/list/stockicon.py b/examples/list/stockicon.py new file mode 100644 index 0000000..a763a90 --- /dev/null +++ b/examples/list/stockicon.py @@ -0,0 +1,30 @@ +import gtk + +from kiwi.ui.objectlist import Column, ObjectList + +class Fruit: + def __init__(self, icon, name): + self.icon = icon + self.name = name + +fruits = ObjectList([Column('icon', use_stock=True, + justify=gtk.JUSTIFY_CENTER, + icon_size=gtk.ICON_SIZE_LARGE_TOOLBAR), + Column('name')]) + +for icon, name in [(gtk.STOCK_OK, 'Apple'), + (gtk.STOCK_CANCEL, 'Pineapple'), + (gtk.STOCK_HELP, 'Kiwi'), + (gtk.STOCK_DELETE, 'Banana'), + (gtk.STOCK_HOME, 'Melon')]: + fruits.append(Fruit(icon, name)) + +window = gtk.Window() +window.connect('delete-event', gtk.main_quit) +window.set_title('Fruits') +window.set_size_request(150, 180) + +window.add(fruits) +window.show_all() + +gtk.main() diff --git a/examples/simple/simple.py b/examples/simple/simple.py new file mode 100644 index 0000000..44c021e --- /dev/null +++ b/examples/simple/simple.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python +import gtk + +from kiwi.ui.delegates import Delegate + +class Hello(Delegate): + def __init__(self): + self.index = 0 + self.text = ["I've decided to take my work back underground", + "To keep it from falling into the wrong hands."] + + topwidget = gtk.Window() + topwidget.set_title("So...") + self.button = gtk.Button(self.text[self.index]) + topwidget.add(self.button) + + Delegate.__init__(self, topwidget, delete_handler=self.quit_if_last) + # focus button, our only widget + self.focus_topmost() + + def on_button__clicked(self, button, *args): + self.index = self.index + 1 + # Two clicks and we're gone + if self.index > 1: + self.hide_and_quit() + # the *handler's* return value disappears into GTK+ + return + button.set_label(self.text[self.index]) + +app = Hello() +app.show_all() +gtk.main() diff --git a/examples/tasklet/simple.py b/examples/tasklet/simple.py new file mode 100644 index 0000000..005f284 --- /dev/null +++ b/examples/tasklet/simple.py @@ -0,0 +1,59 @@ +import gobject + +from kiwi.tasklet import Tasklet, WaitForTimeout, WaitForMessages, Message, \ + WaitForTasklet, get_event + +## ---------------------------- +## And here's an example... +## ---------------------------- +class _CountSomeNumbers2(Tasklet): + '''Counts numbers with at random time spacings''' + + def __init__(self, count, timeout): + self.count = count + self.timeout = timeout + Tasklet.__init__(self) + + def run(self): + '''Execute the task.''' + import random + for i in xrange(self.count): + print ">> _count_some_numbers2", i + yield (WaitForTimeout(random.randint(70, self.timeout)), + WaitForMessages(accept='quit')) + event = get_event() + if isinstance(event, Message) and event.name == 'quit': + ## this would be the place to do some cleanup. + return + raise StopIteration(self.count*2) + +def _count_some_numbers1(count): + '''Counts numbers with at fixed time spacings''' + timeout = WaitForTimeout(1000) + for i in xrange(count): + print "_count_some_numbers1", i + task2 = _CountSomeNumbers2(10, 130) + yield timeout, task2 + event = get_event() + if event is timeout: + print ">>> Got tired of waiting for task!! Canceling!" + ## send a message asking the tasklet to stop + yield Message('quit', dest=task2) + elif isinstance(event, WaitForTasklet): + print ">>> task returned %r, good task!" % event.retval + ## restart timeout from scratch, otherwise it keeps + ## running and we end up giving the next task too little + ## time. + timeout.restart() + else: + assert False, "strange event" + + +def _test(): + '''a simple test/example''' + Tasklet(_count_some_numbers1(100)) + gobject.MainLoop().run() + + +if __name__ == '__main__': + _test() diff --git a/examples/tasklet/test-tasklet.py b/examples/tasklet/test-tasklet.py new file mode 100644 index 0000000..dd04567 --- /dev/null +++ b/examples/tasklet/test-tasklet.py @@ -0,0 +1,96 @@ +""" +kiwi.tasklet demo program +""" +import gtk + +from kiwi import tasklet + +class Counter(tasklet.Tasklet): + def __init__(self, dialog): + self.dialog = dialog + super(Counter, self).__init__() + + def run(self): + timeout = tasklet.WaitForTimeout(1000) + msgwait = tasklet.WaitForMessages(accept='quit') + + for i in xrange(10, 0, -1): + self.dialog.format_secondary_markup( + "Time left: <b>%i</b> seconds" % i) + + yield timeout, msgwait + ev = tasklet.get_event() + + if isinstance(ev, tasklet.Message) and ev.name == 'quit': + return + elif ev is timeout: + pass + else: + raise AssertionError + +def main(): + dialog = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_QUESTION, + buttons=gtk.BUTTONS_YES_NO, + message_format="Please answer Yes or No") + dialog.format_secondary_markup("Time left: <b>??</b> seconds") + dialog.show() + + counter = Counter(dialog) + + yield (tasklet.WaitForTasklet(counter), + tasklet.WaitForSignal(dialog, "response"), + tasklet.WaitForSignal(dialog, "close")) + + event = tasklet.get_event() + if isinstance(event, tasklet.WaitForSignal): + print "signal '%s', stopping counter" % event.signal + yield tasklet.Message("quit", dest=counter) # stop the counter + + if event.signal == 'close': + gtk.main_quit() + return + + response = event.signal_args[0] + msgbox = gtk.MessageDialog(parent=dialog, + flags=gtk.DIALOG_DESTROY_WITH_PARENT, + type=gtk.MESSAGE_INFO, + buttons=gtk.BUTTONS_OK, + message_format=("Thank you " + "for your kind answer!")) + print "response was", response + if response == gtk.RESPONSE_YES: + msgbox.format_secondary_markup( + "Your response was <i><b>Yes</b></i>") + elif response == gtk.RESPONSE_NO: + msgbox.format_secondary_markup( + "Your response was <i><b>No</b></i>") + else: + ## must have been a delete event + print "response was delete event" + gtk.main_quit() + return + msgbox.show() + + print "showing dialog" + yield (tasklet.WaitForSignal(msgbox, "response"), + tasklet.WaitForSignal(msgbox, "close")) + print "event", tasklet.get_event() + + else: + ## timeout must have exausted.. + assert isinstance(event, tasklet.WaitForTasklet) + msgbox = gtk.MessageDialog(parent=dialog, + flags=gtk.DIALOG_DESTROY_WITH_PARENT, + type=gtk.MESSAGE_WARNING, + buttons=gtk.BUTTONS_OK, + message_format="You're too slow!!") + msgbox.show() + + yield (tasklet.WaitForSignal(msgbox, "response"), + tasklet.WaitForSignal(msgbox, "close")) + + gtk.main_quit() + +if __name__ == '__main__': + tasklet.run(main()) + gtk.main() diff --git a/examples/tasklet/test-tasklet2.py b/examples/tasklet/test-tasklet2.py new file mode 100644 index 0000000..5b8a15f --- /dev/null +++ b/examples/tasklet/test-tasklet2.py @@ -0,0 +1,95 @@ +""" +gtasklets demo program #2 + +needs patch at http://bugzilla.gnome.org/show_bug.cgi?id=139176 +""" + +from optparse import OptionParser +import os +import subprocess +import sys + +import gobject +import gtk +import pango + +from kiwi import tasklet + +try: + import win32api + def killproc(pid): + """kill function for Win32""" + handle = win32api.OpenProcess(1, 0, pid) + return (0 != win32api.TerminateProcess(handle, 0)) +except ImportError: + import signal + def killproc(pid): + """kill function for POSIX""" + return os.kill(pid, signal.SIGTERM) + +def process_stdout_sink(chan, buffer, view): + timeout = tasklet.WaitForTimeout(200) + iowait = tasklet.WaitForIO(chan, priority=1000) + msgwait = tasklet.WaitForMessages(accept='quit') + while True: + yield iowait, msgwait + ev = tasklet.get_event() + if isinstance(ev, tasklet.Message) and ev.name == 'quit': + return + assert ev is iowait + text = chan.read() + buffer.insert(buffer.get_end_iter(), text) + view.scroll_to_mark(buffer.get_insert(), 0) + ## Now wait for some time, don't let process output "drown" + ## the TextView updates + yield timeout, tasklet.WaitForMessages(defer='quit') + ev = tasklet.get_event() + assert ev is timeout + +def main(): + parser = OptionParser(usage="usage: %prog command") + (options, args) = parser.parse_args() + if len(args) != 1: + parser.print_help() + sys.exit(1) + + win = gtk.Window() + textview = gtk.TextView() + textview.modify_font(pango.FontDescription("Monospace")) + textview.show() + sw = gtk.ScrolledWindow() + sw.add(textview) + sw.show() + win.add(sw) + win.set_default_size(gtk.gdk.screen_width()*2/3, + gtk.gdk.screen_height()*2/3) + win.show() + + ## launch process + proc = subprocess.Popen(args[0], shell=True, stdout=subprocess.PIPE, + bufsize=1, close_fds=True) + win.set_title("%s (running)" % args[0]) + #print proc.stdout, type(proc.stdout), dir(proc.stdout) + chan = gobject.IOChannel(filedes=proc.stdout.fileno()) + chan.set_flags(gobject.IO_FLAG_NONBLOCK) + sink = tasklet.run(process_stdout_sink(chan, textview.get_buffer(), + textview)) + + ## child watch + yield (tasklet.WaitForProcess(proc.pid), + tasklet.WaitForSignal(win, "destroy")) + + if isinstance(tasklet.get_event(), tasklet.WaitForSignal): + killproc(proc.pid) + gtk.main_quit() + else: + ## stop reader + yield tasklet.Message("quit", dest=sink) + win.set_title("%s (completed)" % args[0]) + yield tasklet.WaitForSignal(win, "destroy") + tasklet.get_event() + gtk.main_quit() + +if __name__ == '__main__': + tasklet.run(main()) + gtk.main() diff --git a/examples/validation/datatypes.py b/examples/validation/datatypes.py new file mode 100644 index 0000000..57cdb8d --- /dev/null +++ b/examples/validation/datatypes.py @@ -0,0 +1,46 @@ +import datetime +import gtk + +from kiwi.datatypes import currency +from kiwi.ui.widgets.entry import ProxyEntry +from kiwi.ui.widgets.label import ProxyLabel + +window = gtk.Window() +window.connect('delete-event', gtk.main_quit) +window.set_border_width(6) + +vbox = gtk.VBox() +window.add(vbox) + +data_types = [ + (True, bool), + (42, int), + (22.0/7.0, float), + (3000L, long), + ('THX', str), + (datetime.datetime.now(), datetime.datetime), + (datetime.date.today(), datetime.date), + (datetime.time(11, 38, 00), datetime.time), + (currency('50.1'), currency), + ] + +for data, data_type in data_types: + hbox = gtk.HBox(True) + vbox.pack_start(hbox, False, False, 6) + + label = ProxyLabel(data_type.__name__.capitalize()) + label.set_bold(True) + hbox.pack_start(label) + + label = ProxyLabel(data_type=data_type) + label.update(data) + hbox.pack_start(label, False, False, 6) + + entry = ProxyEntry(data_type=data_type) + entry.update(data) + entry.validate() + hbox.pack_start(entry, False, False, 6) + +window.show_all() + +gtk.main() diff --git a/examples/validation/lang.glade b/examples/validation/lang.glade new file mode 100644 index 0000000..c66b0bb --- /dev/null +++ b/examples/validation/lang.glade @@ -0,0 +1,75 @@ +<?xml version="1.0" ?> +<glade-interface> + <widget class="GtkWindow" id="lang"> + <property name="resize_mode">queue</property> + <property name="type">toplevel</property> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <child> + <widget class="GtkFrame" id="frame1"> + <property name="border_width">6</property> + <property name="label" translatable="True">English</property> + <property name="label_xalign">0.0</property> + <property name="visible">True</property> + <child> + <widget class="GtkEventBox" id="english"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label1"> + <property name="label" translatable="True">label</property> + <property name="visible">True</property> + </widget> + </child> + </widget> + </child> + </widget> + <packing/> + </child> + <child> + <widget class="GtkFrame" id="frame2"> + <property name="border_width">6</property> + <property name="label" translatable="True">Swedish</property> + <property name="label_xalign">0.0</property> + <property name="visible">True</property> + <child> + <widget class="GtkEventBox" id="swedish"> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label2"> + <property name="label" translatable="True">label</property> + <property name="visible">True</property> + </widget> + </child> + </widget> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkHButtonBox" id="hbuttonbox1"> + <property name="border_width">6</property> + <property name="layout_style">end</property> + <property name="spacing">6</property> + <property name="visible">True</property> + <child> + <widget class="GtkButton" id="ok_button"> + <property name="label" translatable="True">gtk-ok</property> + <property name="use_stock">True</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/examples/validation/personalinformation.glade b/examples/validation/personalinformation.glade new file mode 100644 index 0000000..78602b0 --- /dev/null +++ b/examples/validation/personalinformation.glade @@ -0,0 +1,309 @@ +<?xml version="1.0" ?> +<glade-interface> + <requires lib="kiwi2"/> + <widget class="GtkWindow" id="personalinformation"> + <property name="title" context="True" translatable="True">Personal Information</property> + <property name="border_width">12</property> + <property name="role"></property> + <property name="events"></property> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="events"></property> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label6"> + <property name="ypad">8</property> + <property name="label" context="True" translatable="True"><b>Please fill in some personal information</b></property> + <property name="use_markup">True</property> + <property name="events"></property> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkTable" id="table1"> + <property name="row_spacing">6</property> + <property name="column_spacing">6</property> + <property name="events"></property> + <property name="n_rows">8</property> + <property name="n_columns">2</property> + <property name="visible">True</property> + <child> + <widget class="GtkLabel" id="label9"> + <property name="label" context="True" translatable="True">Gender:</property> + <property name="events"></property> + <property name="xalign">1.0</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="bottom_attach">7</property> + <property name="top_attach">6</property> + </packing> + </child> + <child> + <widget class="ProxyComboBox" id="gender"> + <property name="model_attribute">gender</property> + <property name="events"></property> + <property name="data_type">str</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="bottom_attach">7</property> + <property name="top_attach">6</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label1"> + <property name="label" context="True" translatable="True">Name:</property> + <property name="events"></property> + <property name="xalign">1.0</property> + <property name="visible">True</property> + </widget> + <packing/> + </child> + <child> + <widget class="GtkLabel" id="label2"> + <property name="label" context="True" translatable="True">Age:</property> + <property name="events"></property> + <property name="xalign">1.0</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="bottom_attach">2</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label3"> + <property name="label" context="True" translatable="True">Birthdate:</property> + <property name="events"></property> + <property name="xalign">1.0</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="bottom_attach">3</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+entry+Entry" id="name"> + <property name="mandatory">True</property> + <property name="model_attribute">name</property> + <property name="events"></property> + <property name="can_focus">True</property> + <property name="data_type">unicode</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+entry+Entry" id="age"> + <property name="mandatory">True</property> + <property name="model_attribute">age</property> + <property name="events"></property> + <property name="can_focus">True</property> + <property name="data_type">int</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="bottom_attach">2</property> + <property name="top_attach">1</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <widget class="ProxyDateEntry" id="birthdate"> + <property name="mandatory">True</property> + <property name="model_attribute">birthdate</property> + <property name="events"></property> + <property name="data_type">date</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="bottom_attach">3</property> + <property name="top_attach">2</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+entry+Entry" id="height"> + <property name="mandatory">True</property> + <property name="model_attribute">height</property> + <property name="events"></property> + <property name="can_focus">True</property> + <property name="data_type">float</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="bottom_attach">4</property> + <property name="top_attach">3</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label4"> + <property name="label" context="True" translatable="True">Height:</property> + <property name="events"></property> + <property name="xalign">1.0</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="bottom_attach">4</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label5"> + <property name="label" context="True" translatable="True">Weight:</property> + <property name="events"></property> + <property name="xalign">1.0</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="bottom_attach">5</property> + <property name="top_attach">4</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+spinbutton+SpinButton" id="weight"> + <property name="mandatory">True</property> + <property name="adjustment">0.000000 0.000000 100.000000 1.000000 10.000000 0.000000</property> + <property name="model_attribute">weight</property> + <property name="events"></property> + <property name="can_focus">True</property> + <property name="data_type">float</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="bottom_attach">5</property> + <property name="top_attach">4</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <widget class="ProxyComboEntry" id="nationality"> + <property name="mandatory">True</property> + <property name="model_attribute">nationality</property> + <property name="events"></property> + <property name="data_type">str</property> + <property name="visible">True</property> + <property name="list-editable">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="bottom_attach">6</property> + <property name="top_attach">5</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label8"> + <property name="label" context="True" translatable="True">Nationality:</property> + <property name="events"></property> + <property name="xalign">1.0</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="bottom_attach">6</property> + <property name="top_attach">5</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+radiobutton+RadioButton" id="status"> + <property name="model_attribute">status</property> + <property name="data_value">False</property> + <property name="data_type">bool</property> + <property name="visible">True</property> + <property name="label" context="True" translatable="True">Married</property> + </widget> + <packing> + <property name="bottom_attach">8</property> + <property name="top_attach">7</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+radiobutton+RadioButton" id="status_single"> + <property name="model_attribute">status</property> + <property name="data_value">True</property> + <property name="data_type">bool</property> + <property name="visible">True</property> + <property name="label" context="True" translatable="True">Single</property> + <property name="group">status</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="bottom_attach">8</property> + <property name="top_attach">7</property> + <property name="right_attach">2</property> + </packing> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label7"> + <property name="ypad">5</property> + <property name="label" context="True" translatable="True">Tell us a little bit about yourself:</property> + <property name="events"></property> + <property name="xalign">0.0</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">2</property> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+textview+TextView" id="about"> + <property name="mandatory">True</property> + <property name="model_attribute">about</property> + <property name="border_width">10</property> + <property name="events"></property> + <property name="can_focus">True</property> + <property name="data_type">str</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">3</property> + </packing> + </child> + <child> + <widget class="GtkHButtonBox" id="hbuttonbox1"> + <property name="events"></property> + <property name="layout_style">end</property> + <property name="visible">True</property> + <child> + <widget class="GtkButton" id="ok_btn"> + <property name="receives_default">True</property> + <property name="events"></property> + <property name="can_focus">True</property> + <property name="sensitive">False</property> + <property name="visible">True</property> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + </widget> + <packing/> + </child> + </widget> + <packing> + <property name="position">4</property> + <property name="expand">False</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/examples/validation/personalinformation.py b/examples/validation/personalinformation.py new file mode 100644 index 0000000..180fd75 --- /dev/null +++ b/examples/validation/personalinformation.py @@ -0,0 +1,98 @@ +# This example illustrates the use of entries with validations + +import datetime + +import gtk + +from kiwi.environ import require_gazpacho +require_gazpacho() +from kiwi.datatypes import ValidationError +from kiwi.ui.delegates import Delegate + + +class Person: + pass + +class Form(Delegate): + + def __init__(self): + Delegate.__init__(self, + gladefile="personalinformation", + delete_handler=self.quit_if_last) + + self.nationality.prefill(['Brazilian', + 'Yankee', + 'Other']) + self.gender.prefill(('Male', 'Female')) + self.age.set_mask('00') + + self.register_validate_function(self.validity) + # XXX: Get rid of this + self.force_validation() + + # here we define our custom validation. When a user types anything, + # the validate signal calls methods with the signature + # on_widgetname__validate + def on_name__validate(self, widget, data): + if len(data) > 20: + # we need to return an exception that will be displayed on + # the information tooltip and the delegate option + return ValidationError("The name is too long") + + def on_age__validate(self, widget, year): + if year > 75: + return ValidationError("Too old") + + def on_height__validate(self, widget, data): + if data > 200: + return ValidationError("The height is too tall") + + def on_weight__validate(self, widget, data): + if float(data) > 90: + # this is really not the type of validation that you would use :) + # anyway, it's just for reference + return ValidationError("Dude! You need to lose " + "some weight!") + + def on_nationality__validate(self, widget, data): + if data != 'Yankee': + return ValidationError("Go home terrorist!") + + def validity(self, valid): + self.ok_btn.set_sensitive(valid) + + def on_about__validate(self, widget, data): + if not 'kinda' in data.lower(): + return ValidationError("use a better language") + +person = Person() +person.name = u'John Doe' +person.age = 36 +person.birthdate = datetime.datetime(year=1969, month=2, day=20) +person.height = 183.0 +person.weight = 86.0 +person.nationality = 'Yankee' +person.about = 'Kinda fat' +person.status = True +person.gender = 'Female' + +form = Form() +proxy = form.add_proxy(person, ['name', 'age', 'birthdate', + 'height', 'weight', 'about', + 'nationality', 'status', 'gender']) +form.show_all() + +def on_ok_btn_clicked(widget): + print "Name:", person.name + print "Age:", person.age + print "Birthday:", person.birthdate + print "Height:", person.height + print "Weight:", person.weight + print "Nationality:", person.nationality + print "About Your self:", person.about + print "Status:", person.status + + gtk.main_quit() + +form.ok_btn.connect("clicked", on_ok_btn_clicked) +gtk.main() diff --git a/examples/validation/slaves.py b/examples/validation/slaves.py new file mode 100644 index 0000000..8176fbe --- /dev/null +++ b/examples/validation/slaves.py @@ -0,0 +1,97 @@ +# encoding: iso-8859-1 +import gtk + +from kiwi.datatypes import ValidationError +from kiwi.ui.widgets.combo import ProxyComboEntry +from kiwi.ui.delegates import Delegate, SlaveDelegate + +class Dialog(Delegate): + def __init__(self): + Delegate.__init__(self, gladefile='lang', + widgets=['ok_button'], + delete_handler=self.quit_if_last) + self.register_validate_function(self.validity) + + def validity(self, data): + self.ok_button.set_sensitive(data) + + def on_ok_button__clicked(self, button): + raise SystemExit + +class English(SlaveDelegate): + def __init__(self): + box = gtk.HBox(spacing=6) + box.set_border_width(6) + box.show() + + label = gtk.Label("Number:") + label.show() + box.pack_start(label, False, False) + + combo = ProxyComboEntry() + combo.set_property('model-attribute', 'number') + combo.set_property('data-type', 'str') + combo.prefill(['One', 'Two', 'Three']) + combo.show() + box.pack_start(combo) + self.combo = combo + + SlaveDelegate.__init__(self, toplevel=box, widgets=['combo']) + + def on_combo__validate(self, widget, data): + if data != 'Two': + return ValidationError("foo") + +class Swedish(SlaveDelegate): + def __init__(self): + box = gtk.HBox(spacing=6) + box.set_border_width(6) + box.show() + + label = gtk.Label("Nummer:") + label.show() + box.pack_start(label, False, False) + + combo = ProxyComboEntry() + combo.set_property('model-attribute', 'nummer') + combo.set_property('data-type', 'str') + combo.prefill(['Ett', u'Två', 'Tre']) + combo.show() + box.pack_start(combo) + self.combo = combo + + SlaveDelegate.__init__(self, toplevel=box, widgets=['combo']) + + def on_combo__validate(self, widget, data): + if data != 'Tre': + return ValidationError("bar") + +class EnglishModel: + pass + +class SwedishModel: + # Sylvia Saint? + pass + +dialog = Dialog() + +# English +babe = EnglishModel() +babe.number = 'One' + +eng = English() +eng.show() +dialog.attach_slave("english", eng) +eng.add_proxy(babe, ['combo']) + +# Swedish part +brud = SwedishModel() +brud.nummer = 'Ett' + +swe = Swedish() +swe.show() +dialog.attach_slave("swedish", swe) +swe.add_proxy(brud, ['combo']) +dialog.show_all() + +gtk.main() diff --git a/gazpacho-plugin/AUTHORS b/gazpacho-plugin/AUTHORS new file mode 100644 index 0000000..f7a25a4 --- /dev/null +++ b/gazpacho-plugin/AUTHORS @@ -0,0 +1 @@ +Lorenzo Gil Sanchez <lgs@sicem.biz> diff --git a/gazpacho-plugin/COPYING b/gazpacho-plugin/COPYING new file mode 100644 index 0000000..b1e3f5a --- /dev/null +++ b/gazpacho-plugin/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey 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 library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/gazpacho-plugin/kiwiwidgets.py b/gazpacho-plugin/kiwiwidgets.py new file mode 100644 index 0000000..dac57ee --- /dev/null +++ b/gazpacho-plugin/kiwiwidgets.py @@ -0,0 +1,258 @@ +# Copyright (C) 2005 by Async Open Source +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2 +# 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 Lesser General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from gettext import gettext as _ + +import gtk +from gazpacho.util import get_bool_from_string_with_default + +# Register adapters +from kiwi.ui.gazpacholoader import HyperLinkAdaptor, ComboEntryAdaptor + +root_library = 'kiwi.ui.widgets' +widget_prefix = 'Kiwi' + +class ColumnDefinitionsAdaptor(object): + def __init__(self): + self._editor = ListColumnDefinitionsEditor() + + def set(self, context, kiwilist, value): + kiwilist.set_property('column-definitions', value) + + def create_editor(self, context): + button = gtk.Button(_('Edit...')) + button.set_data('connection-id', -1) + return button + + def update_editor(self, context, button, kiwilist, proxy): + connection_id = button.get_data('connection-id') + if connection_id != -1: + button.disconnect(connection_id) + connection_id = button.connect('clicked', self._editor_edit, kiwilist, + proxy, context) + button.set_data('connection-id', connection_id) + + def _editor_edit(self, button, kiwilist, proxy, context): + application_window = context.get_application_window() + self._editor.set_transient_for(application_window) + self._editor.set_widget(kiwilist, proxy) + self._editor.present() + +(ATTRIBUTE, + TITLE, + DATA_TYPE, + VISIBLE, + JUSTIFY, + TOOLTIP, + FORMAT, + WIDTH, + SORTED, + ORDER) = range(10) + +class ListColumnDefinitionsEditor(object): + """This dialog is used to edit the column definitions of a Kiwi List""" + + def set_widget(self, widget, proxy): + super(ListColumnDefinitionsEditor, self).set_widget(widget, proxy) + self.set_title((_('Editing columns of list %s') % self.gwidget.name)) + self._load_columns() + + def _create_widgets(self): + h_button_box = gtk.HButtonBox() + h_button_box.set_layout(gtk.BUTTONBOX_START) + self.add = gtk.Button(stock=gtk.STOCK_ADD) + self.add.connect('clicked', self._on_add_clicked) + h_button_box.pack_start(self.add) + self.remove = gtk.Button(stock=gtk.STOCK_REMOVE) + self.remove.connect('clicked', self._on_remove_clicked) + h_button_box.pack_start(self.remove) + self.up = gtk.Button(stock=gtk.STOCK_GO_UP) + self.up.connect('clicked', self._on_up_clicked) + h_button_box.pack_start(self.up) + self.down = gtk.Button(stock=gtk.STOCK_GO_DOWN) + self.down.connect('clicked', self._on_down_clicked) + h_button_box.pack_start(self.down) + self.vbox.pack_start(h_button_box, False, False) + self.model = gtk.ListStore(str, str, str, bool, str, str, str, int, + bool, str) + self.treeview = gtk.TreeView(self.model) + self.treeview.set_size_request(580, 300) + selection = self.treeview.get_selection() + selection.connect('changed', self._on_selection__changed) + for i, title in enumerate(('Attribute', + 'Title', + 'Data type')): + self.treeview.append_column(self._create_text_column(title, i)) + + self.treeview.append_column(self._create_bool_column('Visible', 3)) + for i, title in enumerate(('Justify', + 'Tooltip', + 'Format')): + self.treeview.append_column(self._create_text_column(title, + (i + 4))) + + self.treeview.append_column(self._create_int_column('Width', 7)) + self.treeview.append_column(self._create_bool_column('Sorted', 8)) + self.treeview.append_column(self._create_text_column('Order', 9)) + sw = gtk.ScrolledWindow() + sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + sw.add(self.treeview) + self.vbox.pack_start(sw, True, True) + label = gtk.Label() + instructions = """<small>Valid values: + <b>Data type:</b> str, int, float or date + <b>Justify:</b> left, center or right + <b>Order:</b> ascending or descending</small>""" + label.set_alignment(0.0, 0.0) + label.set_markup(instructions) + self.vbox.pack_start(label, False, False) + + def _create_text_column(self, title, index): + renderer = gtk.CellRendererText() + renderer.set_property('editable', True) + renderer.connect('edited', self._on_text_renderer__edited, index) + col = gtk.TreeViewColumn(title, renderer, text=index) + return col + + def _create_bool_column(self, title, index): + renderer = gtk.CellRendererToggle() + renderer.set_property('activatable', True) + renderer.connect('toggled', self._on_toggle_renderer__toggled, index) + col = gtk.TreeViewColumn(title, renderer, active=index) + return col + + def _create_int_column(self, title, index): + col = self._create_text_column(title, index) + return col + + def _get_default_values(self): + return ('unnamed', '', 'str', True, 'left', '', '', 1, False, '') + + def _update_proxy(self): + cols = [] + for column in self.model: + cols.append('|'.join(map(str, tuple(column)))) + + data = '^'.join(cols) + self.proxy.set_value(data) + + def _load_columns(self): + self.model.clear() + cd = self.gwidget.get_glade_property('column-definitions').value + if not cd: + return + + for col in cd.split('^'): + (attr, title, data_type, + visible, justify, tooltip, + format, width, sorted, order) = col.split('|') + + visible = get_bool_from_string_with_default(visible, True) + width = int(width) + sorted = get_bool_from_string_with_default(sorted, False) + self.model.append((attr, title, data_type, + visible, justify, tooltip, + format, width, sorted, order)) + + def _on_add_clicked(self, button): + row_iter = self.model.append(self._get_default_values()) + path = self.model.get_path(row_iter) + col = self.treeview.get_column(0) + self.treeview.set_cursor(path, col, True) + self._update_proxy() + + def _on_remove_clicked(self, button): + model, selected_iter = self.treeview.get_selection().get_selected() + if selected_iter: + model.remove(selected_iter) + self._update_proxy() + + def _on_up_clicked(self, button): + model, selected_iter = self.treeview.get_selection().get_selected() + if not selected_iter: + return + + path = self.model.get_path(selected_iter) + prev_iter = self.model.get_iter(((path[0] - 1))) + if not prev_iter: + return + + model.swap(prev_iter, selected_iter) + self._update_proxy() + self._update_buttons() + + def _on_down_clicked(self, button): + model, selected_iter = self.treeview.get_selection().get_selected() + if not selected_iter: + return + + next_iter = model.iter_next(selected_iter) + if not next_iter: + return + + model.swap(selected_iter, next_iter) + self._update_proxy() + self._update_buttons() + + def _on_text_renderer__edited(self, renderer, path, new_text, col_index): + value = new_text + if col_index == WIDTH: + try: + value = int(new_text) + except ValueError: + return + + row = self.model[path[0]] + row[col_index] = value + if col_index == ATTRIBUTE: + title = row[TITLE] + if not title: + row[TITLE] = value.capitalize() + self._update_proxy() + + def _on_toggle_renderer__toggled(self, renderer, path, col_index): + row = self.model[path[0]] + row[col_index] = not row[col_index] + self._update_proxy() + + def _on_selection__changed(self, selection): + self._update_buttons() + + def _update_buttons(self): + selection = self.treeview.get_selection() + model, selected_iter = selection.get_selected() + if not selected_iter: + self.remove.set_sensitive(False) + self.down.set_sensitive(False) + self.up.set_sensitive(False) + return + + self.remove.set_sensitive(True) + path = model.get_path(selected_iter)[0] + size = len(model) + if path == 0: + self.up.set_sensitive(False) + if size > 1: + self.down.set_sensitive(True) + + if path == size - 1: + self.down.set_sensitive(False) + if size > 1: + self.up.set_sensitive(True) + + if path > 0 and path < (size - 1): + self.up.set_sensitive(True) + self.down.set_sensitive(True) diff --git a/gazpacho-plugin/kiwiwidgets.xml b/gazpacho-plugin/kiwiwidgets.xml new file mode 100644 index 0000000..dd78785 --- /dev/null +++ b/gazpacho-plugin/kiwiwidgets.xml @@ -0,0 +1,62 @@ +<?xml version="1.0"?> +<glade-catalog name="kiwiwidgets" library="kiwi"> + <glade-widget-classes> + <glade-widget-class name="ObjectList" + generic-name="objectlist" + title="Object List" /> + <glade-widget-class name="HyperLink" + generic-name="hyperlink" + title="Hyper Link" + adaptor-class="HyperLinkAdaptor"/> + <glade-widget-class name="ProxyEntry" + generic-name="kiwientry" + title="Kiwi Entry" /> + <glade-widget-class name="ProxyDateEntry" + generic-name="kiwidateentry" + title="Kiwi Date Entry" + adaptor-class="DateEntryAdaptor"/> + <glade-widget-class name="ProxyLabel" + generic-name="kiwilabel" + title="Kiwi Label" /> + <glade-widget-class name="ProxyComboBox" + generic-name="kiwicombobox" + title="Kiwi Combo Box"/> + <glade-widget-class name="ProxyComboEntry" + generic-name="kiwicomboentry" + title="Kiwi Combo Entry" + adaptor-class="ComboEntryAdaptor"/> + <glade-widget-class name="ProxyCheckButton" + generic-name="kiwicheckbutton" + title="Kiwi Check Button"/> + <glade-widget-class name="ProxyRadioButton" + generic-name="kiwiradiobutton" + title="Kiwi Radio Button"/> + <glade-widget-class name="ProxySpinButton" + generic-name="kiwispinbutton" + title="Kiwi Spin Button"/> + <glade-widget-class name="ProxyTextView" + generic-name="kiwitextview" + title="Kiwi TextView"/> + + <!-- Deprecated, but kept for compatibility --> + <glade-widget-class name="ProxyComboBoxEntry" + generic-name="kiwicomboboxentry" + title="Kiwi Combo Box Entry"/> + + </glade-widget-classes> + + <glade-widget-group name="kiwi" title="Kiwi Widgets"> + <glade-widget-class-ref name="ObjectList"/> + <glade-widget-class-ref name="HyperLink"/> + <glade-widget-class-ref name="ProxyEntry"/> + <glade-widget-class-ref name="ProxyLabel"/> + <glade-widget-class-ref name="ProxyComboBox"/> + <glade-widget-class-ref name="ProxyComboEntry"/> + <glade-widget-class-ref name="ProxyCheckButton"/> + <glade-widget-class-ref name="ProxyRadioButton"/> + <glade-widget-class-ref name="ProxySpinButton"/> + <glade-widget-class-ref name="ProxyTextView"/> + <glade-widget-class-ref name="ProxyDateEntry"/> + </glade-widget-group> + +</glade-catalog> diff --git a/gazpacho-plugin/resources/kiwiwidgets/hyperlink.png b/gazpacho-plugin/resources/kiwiwidgets/hyperlink.png Binary files differnew file mode 100644 index 0000000..54fd785 --- /dev/null +++ b/gazpacho-plugin/resources/kiwiwidgets/hyperlink.png diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwicheckbutton.png b/gazpacho-plugin/resources/kiwiwidgets/kiwicheckbutton.png Binary files differnew file mode 100644 index 0000000..acfe6a3 --- /dev/null +++ b/gazpacho-plugin/resources/kiwiwidgets/kiwicheckbutton.png diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwicombobox.png b/gazpacho-plugin/resources/kiwiwidgets/kiwicombobox.png Binary files differnew file mode 100644 index 0000000..fcd4319 --- /dev/null +++ b/gazpacho-plugin/resources/kiwiwidgets/kiwicombobox.png diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwicomboboxentry.png b/gazpacho-plugin/resources/kiwiwidgets/kiwicomboboxentry.png Binary files differnew file mode 100644 index 0000000..21220ad --- /dev/null +++ b/gazpacho-plugin/resources/kiwiwidgets/kiwicomboboxentry.png diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwicomboentry.png b/gazpacho-plugin/resources/kiwiwidgets/kiwicomboentry.png Binary files differnew file mode 100644 index 0000000..21220ad --- /dev/null +++ b/gazpacho-plugin/resources/kiwiwidgets/kiwicomboentry.png diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwidateentry.png b/gazpacho-plugin/resources/kiwiwidgets/kiwidateentry.png Binary files differnew file mode 100644 index 0000000..2ac0e95 --- /dev/null +++ b/gazpacho-plugin/resources/kiwiwidgets/kiwidateentry.png diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwientry.png b/gazpacho-plugin/resources/kiwiwidgets/kiwientry.png Binary files differnew file mode 100644 index 0000000..2ac0e95 --- /dev/null +++ b/gazpacho-plugin/resources/kiwiwidgets/kiwientry.png diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwilabel.png b/gazpacho-plugin/resources/kiwiwidgets/kiwilabel.png Binary files differnew file mode 100644 index 0000000..54fd785 --- /dev/null +++ b/gazpacho-plugin/resources/kiwiwidgets/kiwilabel.png diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwiradiobutton.png b/gazpacho-plugin/resources/kiwiwidgets/kiwiradiobutton.png Binary files differnew file mode 100644 index 0000000..7444d8c --- /dev/null +++ b/gazpacho-plugin/resources/kiwiwidgets/kiwiradiobutton.png diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwispinbutton.png b/gazpacho-plugin/resources/kiwiwidgets/kiwispinbutton.png Binary files differnew file mode 100644 index 0000000..55f3293 --- /dev/null +++ b/gazpacho-plugin/resources/kiwiwidgets/kiwispinbutton.png diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwitextview.png b/gazpacho-plugin/resources/kiwiwidgets/kiwitextview.png Binary files differnew file mode 100644 index 0000000..2d51029 --- /dev/null +++ b/gazpacho-plugin/resources/kiwiwidgets/kiwitextview.png diff --git a/gazpacho-plugin/resources/kiwiwidgets/objectlist.png b/gazpacho-plugin/resources/kiwiwidgets/objectlist.png Binary files differnew file mode 100644 index 0000000..b66c7c8 --- /dev/null +++ b/gazpacho-plugin/resources/kiwiwidgets/objectlist.png diff --git a/glade/PluggableWizard.glade b/glade/PluggableWizard.glade new file mode 100644 index 0000000..32bf66b --- /dev/null +++ b/glade/PluggableWizard.glade @@ -0,0 +1,119 @@ +<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> +<!DOCTYPE glade-interface SYSTEM "http://gazpacho.sicem.biz/gazpacho-0.1.dtd"> +<glade-interface> + <widget class="GtkDialog" id="PluggableWizard"> + <property name="default_height">260</property> + <property name="default_width">320</property> + <property name="has_separator">False</property> + <property name="type_hint">normal</property> + <child internal-child="vbox"> + <widget class="GtkVBox" id="PluggableWizard-vbox"> + <property name="border_width">2</property> + <property name="visible">True</property> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <child> + <widget class="kiwi+ui+widgets+label+Label" id="header_lbl"> + <property name="data_type">str</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkEventBox" id="slave_area"> + <property name="visible">True</property> + <child> + <placeholder/> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="border_width">5</property> + <property name="spacing">5</property> + <property name="visible">True</property> + <child> + <widget class="GtkHButtonBox" id="buttonbox"> + <property name="visible">True</property> + <child> + <widget class="GtkButton" id="cancel_button"> + <property name="is_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="visible">True</property> + <property name="width_request">90</property> + </widget> + </child> + <child> + <widget class="GtkFixed" id="fixed1"> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="previous_button"> + <property name="is_focus">True</property> + <property name="label">gtk-go-back</property> + <property name="use_stock">True</property> + <property name="visible">True</property> + <property name="width_request">90</property> + </widget> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="next_button"> + <property name="is_focus">True</property> + <property name="label">gtk-go-forward</property> + <property name="use_stock">True</property> + <property name="visible">True</property> + <property name="width_request">90</property> + </widget> + <packing> + <property name="position">3</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="ok_button"> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + </widget> + <packing> + <property name="position">4</property> + </packing> + </child> + </widget> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="pack-type">end</property> + <property name="position">2</property> + </packing> + </child> + <child> + <widget class="kiwi+ui+widgets+label+Label" id="notification_lbl"> + <property name="data_type">str</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">3</property> + </packing> + </child> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/kiwi/__init__.py b/kiwi/__init__.py new file mode 100644 index 0000000..e60e24b --- /dev/null +++ b/kiwi/__init__.py @@ -0,0 +1,74 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2003-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# Johan Dahlin <jdahlin@async.com.br> +# + +"""Kiwi is a library designed to make developing graphical applications as +easy as possible. It offers both a framework and a set of enhanced widgets, +and is based on Python and GTK+. Kiwi borrows concepts from MVC, Java Swing +and Microsoft MFC, but implements a set of unique classes that take +advantage of the flexibility and simplicity of Python to make real-world +application creation much easier. + +Kiwi includes a Framework and a set of enhanced widgets + + - Authors: + - Christian Reis <kiko@async.com.br> + - Johan Dahlin <jdahlin@async.com.br> + - Website: U{http://www.async.com.br/projects/kiwi/} + - Organization: Async Open Source +""" + +try: + import gobject + gobject +except ImportError: + raise SystemExit( + "PyGTK 2.8 or PyGObject 2.9.0 or higher is required by kiwi") + +from kiwi.__version__ import version as kiwi_version +from kiwi.environ import Library + +assert kiwi_version # pyflakes + +lib = Library('kiwi') +if lib.uninstalled: + lib.add_global_resource('glade', 'glade') + lib.add_global_resource('pixmap', 'pixmaps') +lib.enable_translation() + +# Be careful to not export too much +del Library, lib, gobject + +class ValueUnset: + """To differentiate from places where None is a valid default. Used + mainly in the Kiwi Proxy""" + pass + +__all__ = ['ValueUnset', 'kiwi_version'] + +# by default locale uses the C locale but our date conversions use the user +# locale so we need to set the locale to that one +import locale +locale.setlocale(locale.LC_ALL, '') # this set the user locale ( $LANG ) +del locale diff --git a/kiwi/__version__.py b/kiwi/__version__.py new file mode 100644 index 0000000..a482559 --- /dev/null +++ b/kiwi/__version__.py @@ -0,0 +1,22 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005,2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# + +version = (1, 9, 8) diff --git a/kiwi/accessor.py b/kiwi/accessor.py new file mode 100644 index 0000000..8018a1e --- /dev/null +++ b/kiwi/accessor.py @@ -0,0 +1,468 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2002-2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Andreas Kostyrka <andreas@mtg.co.at> +# Christian Reis <kiko@async.com.br> +# Johan Dahlin <jdahlin@async.com.br> +# + +"""The accessor module offers two important front-end functions: +kgetattr and ksetattr. These functions allow retrieving attribute values +from objects much in the same way as getattr/setattr allow, but with two +important differences: + - They follow a dot hierarchy to retrieve or modify any value + reachable from the object. + - They cache the method used to access a certain attribute and reuse + it the next time the value is retrieved. +""" + +import string +import types + +def get_default_getter(model, attr_name, cache): + """Obtains from model a callable through which attr_name can be + retrieved. This callable is an accessor named get_foo, where + foo is the value of attr_name, or getattr(model, foo) if the + accessor does not exist. If the callable exists, it is returned; + if getattr() is to be used a tuple in the format (model, + attr_name) is returned.""" + func = getattr(model, "get_%s" % attr_name, None) + if callable(func): + return func + else: + return (model, attr_name) + +def get_default_setter(model, attr_name, cache): + """Obtains from model a callable through which attr_name can be + set. This callable is an accessor named set_foo, where + foo is the value of attr_name, or setattr(model, foo, value) if the + accessor does not exist. If the callable exists, it is returned; + if setattr() is to be used a tuple in the format (model, + attr_name) is returned.""" + func = getattr(model, "set_%s" % attr_name, None) + if callable(func): + return func + else: + return (model, attr_name) + +# The _*_cache dictionaries cache the objects, attributes and callables +# (called `accessor tuples' here) we retrieve values from. If possible, +# we use weakrefs to avoid holding hard references to objects, allowing +# them to be garbage collected. Certain objects (ZODB.Persistent for +# one) cannot be weakref()ed and *will* leak - be sure to call +# clear_attr_cache() if you need them released. +# +# Key structure: +# (objref_or_weakref, attrname) +# +# Value structure (accessor tuples): +# +# kgetattr: (access_code, data1, data2) +# ksetattr: (access_code, data1, data2, value_mode) +# +# Access codes: +# +# 0: data1() unbound methods and functions (data2 is None) +# 1: data2(data1()) bound methods and weakref +# 2: getattr(data1(), data2) using straight getattr and weakref +# 3: data2(data1) bound methods (no weakref) +# 4: getattr(data1, data2) using straight getattr (no weakref) + +import weakref +_kgetattr_cache = {} +_kgetattr_wref = {} +_ksetattr_cache = {} +_ksetattr_wref = {} + +class CacheControl(object): + __slots__ = ['key', 'cacheable'] + def __init__(self, key): + self.key = key + self.cacheable = 1 + + def disable(self): + self.cacheable = 0 + + def invalidate(self): + key = self.key + if _kgetattr_cache.has_key(key): + del _kgetattr_cache[key] + if _ksetattr_cache.has_key(key): + del _ksetattr_cache[key] + +class _AttrUnset: + # indicates an unset value since None needs to be used + pass + +class DefaultValue(Exception): + """ + This can be raised in kgetattr accessors to indicate that the default + value should be used + """ + +def kgetattr_guard(wref): + try: + key = _kgetattr_wref[id(wref)][0] + del _kgetattr_wref[id(wref)] + del _kgetattr_cache[key] + except KeyError: + # This path is used only when the program terminates. + pass + +def ksetattr_guard(wref): + try: + key = _ksetattr_wref[id(wref)][0] + del _ksetattr_wref[id(wref)] + del _ksetattr_cache[key] + except KeyError: + # This path is used only when the program terminates. + pass + +# 1. Break up attr_name into parts +# 2. Loop around main lookup code for each part: +# 2.1. Try and get accessor tuple out of cache +# 2.2. If not there, generate tuple from callable and store it +# 2.3. Use accessor tuple to grab value +# 2.4. Value wasn't found, return default or raise ValueError +# Use value as obj in next iteration +# 3. Return value + +def kgetattr(model, + attr_name, + default=_AttrUnset, + flat=0, + # bind to local variables for speed: + ref=weakref.ref, + TupleType=types.TupleType, + MethodType=types.MethodType, + split=string.split, + kgetattr_guard=kgetattr_guard, + getattr=getattr, + dummycache=CacheControl((None,None)), + # constants: + # access opcodes: + LAMBDA_ACCESS = 0, + METHOD_ACCESS = 1, + TUPLE_ACCESS = 2, + NWR_METHOD_ACCESS = 3, + NWR_TUPLE_ACCESS = 4, + # FAST tuples do not store the object, as the input object + # is also the accesses object. + FAST_METHOD_ACCESS = 5, + FAST_TUPLE_ACCESS = 6, + ): + """Returns the value associated with the attribute in model + named by attr_name. If default is provided and model does not + have an attribute called attr_name, the default value is + returned. If flat=1 is specified, no dot path parsing will + be done.""" + + # 1. Break up attr_name into parts + if flat or "." not in attr_name: + names = [attr_name, ] + else: + try: + names = attr_name.split(".") + except AttributeError: + names = split(attr_name, ".") + + # 2. Loop around main lookup code for each part: + obj = model + for name in names: + key = (id(obj), name) + # First time round, obj is the model. Every subsequent loop, obj + # is the subattribute value indicated by the current part in + # [names]. The last loop grabs the target value and returns it. + + try: + # 2.1 Fetch the opcode tuple from the cache. + objref, icode, data1, data2 = _kgetattr_cache[key] + except KeyError: + # 2.2. If not there, generate tuple from callable and store it + try: + get_getter = obj.__class__.get_getter + cache = CacheControl(key) + except AttributeError: + # This is needed so that the check below if the result is + # cacheable can be done. The inbuilt get_getter always + # allows caching. + cache = dummycache + get_getter = None + + func = getattr(obj, "get_%s" % name, None) + if callable(func): + icode = FAST_METHOD_ACCESS + data1 = func.im_func + data2 = None + else: + icode = FAST_TUPLE_ACCESS + data1 = None + data2 = name + + if get_getter is not None: + try: + func = get_getter(obj, name, cache) + except DefaultValue: + if default == _AttrUnset: + raise + return default + + if isinstance(func, TupleType): + data1, data2 = func + if data1 == obj: + data1 = None + icode = FAST_TUPLE_ACCESS + else: + try: + data1 = ref(data1, kgetattr_guard) + _kgetattr_wref[id(data1)] = (key, data1) + icode = TUPLE_ACCESS + except TypeError: + icode = NWR_TUPLE_ACCESS + + elif isinstance(func, MethodType): + data1 = func.im_func + data2 = func.im_self + if data2 == obj: + data2 = None + icode = FAST_METHOD_ACCESS + else: + try: + data2 = ref(func.im_self, kgetattr_guard) + _kgetattr_wref[id(data2)] = (key, data2) + icode = METHOD_ACCESS + except TypeError: + data2 = func.im_self + icode = NWR_METHOD_ACCESS + else: + icode = LAMBDA_ACCESS + data1 = func + data2 = None + if cache.cacheable: + # Store access opcode: + # objref or obj are used as a protection against id-aliasing + # as we use just a plain id(obj) in the cache entry key. + # + # We either have to use a weakref, so we get to know when the + # object dies. We just remove the cache entry containing the + # weakref, _kgetattr_wref is used to associate which key has + # to be killed for a given weakref. + + try: + objref = ref(obj, kgetattr_guard) + _kgetattr_wref[id(objref)] = (key, objref) + _kgetattr_cache[key] = (objref, icode, data1, data2) + except TypeError: + # it's not weakrefable (probably ZODB!) + # store a hard reference. + _kgetattr_cache[key] = (obj, icode, data1, data2) + else: + if _kgetattr_cache.has_key(key): + del _kgetattr_cache[key] + + # 2.3. Use accessor tuple to grab value + try: + if icode == FAST_METHOD_ACCESS: + obj = data1(obj) + elif icode == FAST_TUPLE_ACCESS: + obj = getattr(obj, data2) + elif icode == TUPLE_ACCESS: + obj = getattr(data1(), data2) + elif icode == NWR_TUPLE_ACCESS: + obj = getattr(data1, data2) + elif icode == NWR_METHOD_ACCESS: + obj = data1(data2) + elif icode == METHOD_ACCESS: + obj = data1(data2()) + elif icode == LAMBDA_ACCESS: + obj = data1() + else: + raise AssertionError("Unknown tuple type in _kgetattr_cache") + + # 2.4. Value wasn't found, return default or raise ValueError + except DefaultValue: + if default == _AttrUnset: + raise + return default + + # At the end of the iteration, the value retrieved becomes the new obj + + # 3. Return value + return obj + +# A general algo for ksetattr: +# +# 1. Use attr_name to kgetattr the target object, and get the real attribute +# 2. Try and get accessor tuple from cache +# 3. If not there, generate accessor tuple and store it +# 4. Set value to target object's attribute + +def ksetattr(model, + attr_name, + value, + flat=0, + + # bind to local variables for speed: + ref=weakref.ref, + TupleType=types.TupleType, + MethodType=types.MethodType, + ksetattr_guard=ksetattr_guard, + getattr=getattr, + dummycache=CacheControl((None,None)), + + # constants: + LAMBDA_ACCESS = 0, + METHOD_ACCESS = 1, + TUPLE_ACCESS = 2, + NWR_METHOD_ACCESS = 3, + NWR_TUPLE_ACCESS = 4, + FAST_METHOD_ACCESS = 5, + FAST_TUPLE_ACCESS = 6, + ): + """Set the value associated with the attribute in model + named by attr_name. If flat=1 is specified, no dot path parsing will + be done.""" + + # 1. kgetattr the target object, and get the real attribute + # This is the only section which is special about ksetattr. When you + # set foo.bar.baz to "x", what you really want to do is get hold of + # foo.bar and use an accessor (set_baz/setattr) on it. This bit gets + # the attribute name and the model we want. + + if not flat: + lastdot = string.rfind(attr_name, ".") + if lastdot != -1: + model = kgetattr(model, attr_name[:lastdot]) + attr_name = attr_name[lastdot+1:] + + # At this point we only have a flat attribute and the right model. + key = (id(model), attr_name) + + try: + # 2. Try and get accessor tuple from cache + objref, icode, data1, data2 = _ksetattr_cache[key] + except KeyError: + # 3. If not there, generate accessor tuple and store it + # cache = CacheControl(key) + try: + get_setter = model.__class__.get_setter + cache = CacheControl(key) + except AttributeError: + # No get_setter found: + get_setter = None + # This is needed so the entry storing code can check if it's ok + # to cache. + cache = dummycache + + func = getattr(model, "set_%s" % attr_name, None) + if callable(func): + icode = FAST_METHOD_ACCESS + data1 = func.im_func + data2 = None + else: + icode = FAST_TUPLE_ACCESS + data1 = None + data2 = attr_name + + if get_setter is not None: + func = get_setter(model, attr_name, cache) + + if isinstance(func, TupleType): + data1, data2 = func + if data1 == model: + data1 = None + icode = FAST_TUPLE_ACCESS + else: + try: + data1 = ref(data1, ksetattr_guard) + _ksetattr_wref[id(data1)] = (key, data1) + icode = TUPLE_ACCESS + except TypeError: + icode = NWR_TUPLE_ACCESS + elif isinstance(func, MethodType): + data1 = func.im_func + data2 = func.im_self + if data2 == model: + data2 = None + icode = FAST_METHOD_ACCESS + else: + try: + data2 = ref(data2, ksetattr_guard) + _ksetattr_wref[id(data2)] = (key, data2) + icode = METHOD_ACCESS + except TypeError: + data2 = func.im_self + icode = NWR_METHOD_ACCESS + else: + icode = LAMBDA_ACCESS + data1 = func + data2 = None + + if cache.cacheable: + # store the access opcode. + # for the use of model/objref as first value in the opcode tuple + # see the kgetattr comments. + try: + objref = ref(model, ksetattr_guard) + _ksetattr_wref[id(objref)] = (key, objref) + _ksetattr_cache[key] = (objref, icode, data1, data2) + except TypeError: + # it's not weakref-able, store a hard reference. + _ksetattr_cache[key] = (model, icode, data1, data2) + else: + if _ksetattr_cache.has_key(key): + del _ksetattr_cache.has_key[key] + + if icode == FAST_TUPLE_ACCESS: + setattr(model, data2, value) + elif icode == FAST_METHOD_ACCESS: + data1(model, value) + elif icode == TUPLE_ACCESS: + setattr(data1(), data2, value) + elif icode == NWR_TUPLE_ACCESS: + setattr(data1, data2, value) + elif icode == NWR_METHOD_ACCESS: + data1(data2, value) + elif icode == METHOD_ACCESS: + data1(data2(), value) + elif icode == LAMBDA_ACCESS: + data1(value) + else: + raise AssertionError("Unknown tuple type in _ksetattr_cache") + +def enable_attr_cache(): + """Enables the use of the kgetattr cache when using Python + versions that do not support weakrefs (1.5.x and earlier). Be + warned, using the cache in these versions causes leaked + references to accessor methods and models!""" + global _kgetattr_cache, _ksetattr_cache, _kgetattr_wref, _ksetattr_wref + _kgetattr_cache = {} + _ksetattr_cache = {} + _kgetattr_wref = {} + _ksetattr_wref = {} + +def clear_attr_cache(): + """Clears the kgetattr cache. It must be called repeatedly to + avoid memory leaks in Python 2.0 and earlier.""" + global _kgetattr_cache, _ksetattr_cache, _kgetattr_wref, _ksetattr_wref + _kgetattr_cache = {} + _ksetattr_cache = {} + _kgetattr_wref = {} + _ksetattr_wref = {} diff --git a/kiwi/argcheck.py b/kiwi/argcheck.py new file mode 100644 index 0000000..bf3c19d --- /dev/null +++ b/kiwi/argcheck.py @@ -0,0 +1,201 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005,2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +""" +Argument checking decorator and support +""" + +import inspect +from types import ClassType + +from kiwi.datatypes import number as number_type + +class CustomType(type): + def value_check(mcs, name, value): + pass + value_check = classmethod(value_check) + +class number(CustomType): + """ + Custom type that verifies that the type is a number (eg float or int) + """ + type = number_type + +class percent(CustomType): + """ + Custom type that verifies that the value is a percentage + """ + type = number_type + + def value_check(mcs, name, value): + if (value < 0) or (value > 100): + raise ValueError("%s must be between 0 and 100" % name) + value_check = classmethod(value_check) + +_NoValue = object() + +class argcheck(object): + """ + Decorator to check type and value of arguments. + + Usage: + + >>> @argcheck(types...) + ... def function(args..) + + or + + >>> class Class: + ... @argcheck(types..) + ... def method(self, args) + + You can customize the checks by subclassing your type from CustomType, + there are two builtin types: number which is a float/int combined check + and a percent which verifis that the value is a percentage + """ + + __enabled__ = True + + def __init__(self, *types): + for argtype in types: + if not isinstance(argtype, (type, ClassType)): + raise TypeError("must be a type or class instance") + self.types = types + + def enable(cls): + """ + Enable argcheck globally + """ + cls.__enabled__ = True + enable = classmethod(enable) + + def disable(cls): + """ + Disable argcheck globally + """ + cls.__enabled__ = False + disable = classmethod(disable) + + def __call__(self, func): + if not callable(func): + raise TypeError("%r must be callable" % func) + + # Useful for optimized runs + if not self.__enabled__: + return func + + spec = inspect.getargspec(func) + arg_names, is_varargs, is_kwargs, default_values = spec + if not default_values: + default_values = [] + else: + default_values = list(default_values) + + # Set all the remaining default values to _NoValue + default_values = ([_NoValue] * (len(arg_names) - len(default_values)) + + default_values) + + # TODO: Is there another way of doing this? + # Not trivial since func is not attached to the class at + # this point. Nor is the class attached to the namespace. + if arg_names and arg_names[0] in ('self', 'cls'): + arg_names = arg_names[1:] + default_values = default_values[1:] + is_method = True + else: + is_method = False + + types = self.types + if is_kwargs and not is_varargs and self.types: + raise TypeError("argcheck cannot be used with only keywords") + elif not is_varargs: + if len(types) != len(arg_names): + raise TypeError("%s has wrong number of arguments, " + "%d specified in decorator, " + "but function has %d" % + (func.__name__, + len(types), + len(arg_names))) + + kwarg_types = {} + kwarg_defaults = {} + + for i, arg_name in enumerate(arg_names): + kwarg_types[arg_name] = types[i] + value = default_values[i] + kwarg_defaults[arg_name] = value + if value is None or value is _NoValue: + continue + arg_type = types[i] + try: + self._type_check(value, arg_type, arg_name) + except TypeError: + raise TypeError("default value for %s must be of type %s " + "and not %s" % (arg_name, + arg_type.__name__, + type(value).__name__)) + kwarg_defaults[arg_name] = value + + def wrapper(*args, **kwargs): + if self.__enabled__: + cargs = args + if is_method: + cargs = cargs[1:] + + # Positional arguments + for arg, type, name, default in zip(cargs, types, arg_names, + default_values): + self._type_check(arg, type, name, default) + + # Keyword arguments + for name, arg in kwargs.items(): + self._type_check(arg, kwarg_types[name], name, + kwarg_defaults[name]) + + self.extra_check(arg_names, types, args, kwargs) + return func(*args, **kwargs) + wrapper.__name__ = func.__name__ + return wrapper + + def extra_check(self, names, types, args, kwargs): + pass + + def _type_check(self, value, argument_type, name, default=_NoValue): + if default is not _NoValue and value == default: + return + + if issubclass(argument_type, CustomType): + custom = True + check_type = argument_type.type + else: + custom = False + check_type = argument_type + + type_name = argument_type.__name__ + + if not isinstance(value, check_type): + raise TypeError( + "%s must be %s, not %s" % (name, type_name, + type(value).__name__)) + if custom: + argument_type.value_check(name, value) diff --git a/kiwi/component.py b/kiwi/component.py new file mode 100644 index 0000000..9f2632a --- /dev/null +++ b/kiwi/component.py @@ -0,0 +1,105 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# Ali Afshar <aafshar@gmail.com> + +import sys + +try: + from zope.interface import implements, Attribute, Interface + # pyflakes + implements, Attribute, Interface +except ImportError: + class Interface(object): + def providedBy(cls, impl): + for iface in getattr(impl, '__interfaces__', []): + if issubclass(iface, cls): + return True + return False + + providedBy = classmethod(providedBy) + + class Attribute(object): + def __init__(self, __name__, __doc__=''): + self.__name__=__name__ + self.__doc__=__doc__ + + def implements(iface): + frame = sys._getframe(1) + try: + frame.f_locals.setdefault('__interfaces__', []).append(iface) + finally: + del frame + +class AlreadyImplementedError(Exception): + """Called when a utility already exists.""" + +class _UtilityHandler(object): + def __init__(self): + self._utilities = {} + + def provide(self, iface, obj): + global _interfaces + if not issubclass(iface, Interface): + raise TypeError( + "iface must be an Interface subclass and not %r" % iface) + + if iface in self._utilities: + raise AlreadyImplementedError("%s is already implemented" % iface) + self._utilities[iface] = obj + + def get(self, iface): + global _interfaces + if not issubclass(iface, Interface): + raise TypeError( + "iface must be an Interface subclass and not %r" % iface) + + if not iface in self._utilities: + raise NotImplementedError("No utility provided for %r" % iface) + + return self._utilities[iface] + +def provide_utility(iface, utility): + """ + Set the utility for the named interface. If the utility is already + set, an {AlreadyImplementedError} is raised. + + @param iface: interface to set the utility for. + @param utility: utility providing the interface. + """ + global _handler + _handler.provide(iface, utility) + +def get_utility(iface): + """ + Get the utility for the named interface. If the utility is not + available (has not been set) a {NotImplementedError} is raised. + + @param iface: interface to retrieve the utility for. + @type iface: utility providing the interface + """ + + global _handler + return _handler.get(iface) + +_handler = _UtilityHandler() + + diff --git a/kiwi/controllers.py b/kiwi/controllers.py new file mode 100644 index 0000000..629ea3e --- /dev/null +++ b/kiwi/controllers.py @@ -0,0 +1,147 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2001-2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# + +from gtk import gdk + +"""Holds the base controller class for the Kiwi Framework""" + +class BaseController: + """ + A generic controller that can be attached to any View + + BaseController defines one public variable: + + - view: corresponds to a the associated View instance, which + holds the UI implementation itself (widgets, layout, etc.) + """ + view = None + def __init__(self, view=None, keyactions=None): + """ + Creates a new controller, and attaches itself to a view. The + constructor triggers a view.set_constructor(self) call, so the + view is also attached to it. The arguments are identical to the + view and keyactions class variables. + + - view: the correspondent view for the controller + - keyactions: a mapping from GDK key symbol (GDK.A, etc.) to a + method. The method will be called when any relevant keypress is + generated for that view. The handler definition should look like: + + >>> def my_A_handler(self, widget, event, args): + """ + + if not view and not self.view: + raise AssertionError( + "Need a view to create controller, found None" ) + else: + self.set_view(view) + + # Copy just to be on the safe side, avoiding problems with + # mutable class variables + self._keyactions = keyactions or {} + + self.view._attach_callbacks(self) + + # Call finalization hook + self.view.on_startup() + + def on_key_press(self, widget, event): + """ + The keypress handler, which dispatches keypresses to the + functions mapped to in self.keyactions""" + + # Order is important, we want control_shift_alt_XXX + method_name = 'key_' + if event.state & gdk.CONTROL_MASK: + method_name += 'control_' + if event.state & gdk.SHIFT_MASK: + method_name += 'shift_' + if event.state & gdk.MOD1_MASK: + method_name += 'alt_' + method_name += gdk.keyval_name(event.keyval) + func = getattr(self, method_name, None) + if func: + return func() + elif event.keyval in self._keyactions: + func = self._keyactions[event.keyval] + return func(widget, event) + + + # + # Accessors + # + + def get_parent(self): + """parent: the correspondent parent for the controller""" + return self.parent + + def set_parent(self, parent): + """parent: the correspondent parent for the controller""" + self.parent = parent + + def get_view(self): + """view: the correspondent view for the controller""" + return self.view + + def set_view(self, view): + """view: the correspondent view for the controller""" + if self.view: + msg = "This controller already has a view: %s" + raise AssertionError(msg % self.view) + self.view = view + view.set_controller(self) + + def set_keyactions(self, keyactions): + """ + Sets the keyactions mapping. See the constructor + documentation for a description of it.""" + self._keyactions = keyactions + + def update_keyactions(self, new_actions): + """ + XXX + """ + self._keyactions.update(new_actions) + + # + # + # + + def _get_all_methods(self, klass=None): + klass = klass or self.__class__ + # Very poor simulation of inheritance, but WFM(tm) + classes = [klass] + # Collect bases for class, using a pretty evil recursion + for klass in classes: + map(classes.append, klass.__bases__) + # Order bases so that the class itself is the last one referred to + # in the loop. This guarantees that the inheritance ordering for the + # methods is preserved. + classes.reverse() + methods = {} + for c in classes: + for name in c.__dict__.keys(): + # Need to use getattr() to ensure we get bound methods + methods[name] = getattr(self, name) + return methods diff --git a/kiwi/datatypes.py b/kiwi/datatypes.py new file mode 100644 index 0000000..9a2ff59 --- /dev/null +++ b/kiwi/datatypes.py @@ -0,0 +1,656 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Lorenzo Gil Sanchez <lgs@sicem.biz> +# Johan Dahlin <jdahlin@async.com.br> +# + +"""Data type converters with locale and currency support. + +Provides routines for converting data to and from strings. +Simple example: + + >>> from kiwi.datatypes import converter + >>> converter.from_string(int, '1,234') + '1234' + >>> converter.from_string(float, '1,234') + '1234.0' + >>> converter.to_string(currency, currency('10.5')) + '$10.50' +""" + +import datetime +from decimal import Decimal, InvalidOperation +import locale +import sys +import time + +from kiwi import ValueUnset + +__all__ = ['ValidationError', 'lformat', 'converter', 'format_price'] + +number = (int, float, long, Decimal) + +class ValidationError(Exception): + pass + +class ConverterRegistry: + def __init__(self): + self._converters = {} + + def add(self, converter_type): + """ + Adds converter_type as a new converter + @param converter_type: a L{BaseConverter} subclass + """ + if not issubclass(converter_type, BaseConverter): + raise TypeError("converter_type must be a BaseConverter subclass") + + c = converter_type() + self._converters[c.type] = c + + def get_converter(self, converter_type): + try: + return self._converters[converter_type] + except KeyError: + raise KeyError(converter_type) + + def check_supported(self, data_type): + value = None + for t in self._converters.values(): + if t.type == data_type or t.type.__name__ == data_type: + value = t.type + break + + assert not isinstance(value, str), value + + if not value: + type_names = [t.type.__name__ for t in self._converters.values()] + raise TypeError("%s is not supported. Supported types are: %s" + % (data_type, ', '.join(type_names))) + + return value + + def as_string(self, converter_type, value, format=None): + """ + Convert to a string + @param converter_type: + @param value: + @param format: + """ + c = self.get_converter(converter_type) + if c.as_string is None: + return value + + if not isinstance(value, c.type): + raise TypeError('data: %s must be of %r not %r' % ( + value, c.type, type(value))) + + return c.as_string(value, format=format) + + def from_string(self, converter_type, value): + """ + Convert from a string + @param converter_type: + @param value: + """ + c = self.get_converter(converter_type) + if c.from_string is None: + return value + + return c.from_string(value) + + def str_to_type(self, value): + for c in self._converters.values(): + if c.type.__name__ == value: + return c.type + +# Global converter, can be accessed from outside +converter = ConverterRegistry() + +class BaseConverter(object): + """ + Abstract converter used by all datatypes + @cvar type: + """ + type = None + + def get_compare_function(self): + """ + @returns: + """ + return cmp + + def as_string(self, value, format): + """ + @param value: + @param format: + @returns: + """ + + def from_string(self, value): + """ + @param value: + @returns: + """ + +class _StringConverter(BaseConverter): + type = str + + def as_string(self, value, format=None): + if format is None: + format = '%s' + return format % value + + def from_string(self, value): + return str(value) + +converter.add(_StringConverter) + +class _UnicodeConverter(BaseConverter): + type = unicode + + def as_string(self, value, format=None): + if format is None: + format = u'%s' + return format % value + + def from_string(self, value): + return unicode(value) + +converter.add(_UnicodeConverter) + +class _IntConverter(BaseConverter): + type = int + + def as_string(self, value, format=None): + """Convert a float to a string""" + if format is None: + format = '%d' + + # Do not use lformat here, since an integer should always + # be formatted without thousand separators. Think of the + # use case of a port number, "3128" is desired, and not "3,128" + return format % value + + def from_string(self, value): + "Convert a string to an integer" + if value == '': + return ValueUnset + + conv = locale.localeconv() + thousands_sep = conv["thousands_sep"] + # Remove all thousand separators, so int() won't barf at us + if thousands_sep and thousands_sep in value: + value = value.replace(thousands_sep, '') + + try: + return self.type(value) + except ValueError: + raise ValidationError( + "%s could not be converted to an integer" % value) + +converter.add(_IntConverter) + +class _LongConverter(_IntConverter): + type = long +converter.add(_LongConverter) + +class _BoolConverter(BaseConverter): + type = bool + + def as_string(self, value, format=None): + return str(value) + + def from_string(self, value): + "Convert a string to a boolean" + if value == '': + return ValueUnset + + if value.upper() in ('TRUE', '1'): + return True + elif value.upper() in ('FALSE', '0'): + return False + + return ValidationError("'%s' can not be converted to a boolean" % value) + +converter.add(_BoolConverter) + +class _FloatConverter(BaseConverter): + type = float + + def as_string(self, value, format=None): + """Convert a float to a string""" + format_set = True + + if format is None: + # From Objects/floatobject.c: + # + # The precision (12) is chosen so that in most cases, the rounding noise + # created by various operations is suppressed, while giving plenty of + # precision for practical use. + format = '%.12g' + + format_set = False + + as_str = lformat(format, value) + + # If the format was not set, the resoult should be treated, as + # follows. + if not format_set and not value % 1: + # value % 1 is used to check if value has an decimal part. If it + # doen't then it's an integer + + # When format is '%g', if value is an integer, the result + # will also be formated as an integer, so we add a '.0' + + conv = locale.localeconv() + as_str += conv.get('decimal_point') + '0' + + return as_str + + def from_string(self, value): + """Convert a string to a float""" + + if value == '': + return ValueUnset + + value = filter_locale(value) + try: + retval = float(value) + except ValueError: + raise ValidationError("This field requires a number, not %r" % + value) + + return retval + +converter.add(_FloatConverter) + +class _DecimalConverter(_FloatConverter): + type = Decimal + def from_string(self, value): + if value == '': + return ValueUnset + + value = filter_locale(value) + + try: + retval = Decimal(value) + except InvalidOperation: + raise ValidationError("This field requires a number, not %r" % + value) + + return retval + +converter.add(_DecimalConverter) + +class _BaseDateTimeConverter(BaseConverter): + """ + Abstract class for converting datatime objects to and from strings + @cvar date_format: + @cvar lang_constant: + """ + date_format = None + + def __init__(self): + self._keep_am_pm = False + self._keep_seconds = False + + def get_lang_constant(self): + # This is a method and not a class variable since it does not + # exist on all supported platforms, eg win32 + raise NotImplementedError + + def from_dateinfo(self, dateinfo): + raise NotImplementedError + + def get_compare_function(self): + # Provide a special comparison function that allows None to be + # used, which the __cmp__/__eq__ methods for datatime objects doesn't + def _datecmp(a, b): + if a is None: + if b is None: + return 0 + return 1 + elif b is None: + return -1 + else: + return cmp(a, b) + return _datecmp + + def get_format(self): + if sys.platform == 'win32': + format = self.date_format + else: + format = locale.nl_langinfo(self.get_lang_constant()) + + format = format.replace('%r', '%I:%M:%S %p') + format = format.replace('%T', '%H:%M:%S') + + # Strip AM/PM + if not self._keep_am_pm: + if '%p' in format: + format = format.replace('%p', '') + # 12h -> 24h + format = format.replace('%I', '%H') + + # Strip seconds + if not self._keep_seconds: + if '%S' in format: + format = format.replace('%S', '') + + # Strip trailing characters + while format[-1] in ('.', ':', ' '): + format = format[:-1] + + return format + + def as_string(self, value, format=None): + "Convert a date to a string" + if format is None: + format = self.get_format() + + if value is None: + return '' + + return value.strftime(format) + + def from_string(self, value): + "Convert a string to a date" + + if value == "": + return None + + # We're only supporting strptime values for now, + # perhaps we should add macros, to be able to write + # yyyy instead of %Y + + format = self.get_format() + try: + # time.strptime (python 2.4) does not support %r + # pending SF bug #1396946 + dateinfo = time.strptime(value, format) + return self.from_dateinfo(dateinfo) + except ValueError: + raise ValidationError( + 'This field requires a date of the format "%s" and ' + 'not "%s"' % (format, value)) + +class _TimeConverter(_BaseDateTimeConverter): + type = datetime.time + date_format = '%X' + def get_lang_constant(self): + return locale.T_FMT + + def from_dateinfo(self, dateinfo): + # hour, minute, second + return datetime.time(*dateinfo[3:6]) +converter.add(_TimeConverter) + +class _DateTimeConverter(_BaseDateTimeConverter): + type = datetime.datetime + date_format = '%c' + def get_lang_constant(self): + return locale.D_T_FMT + + def from_dateinfo(self, dateinfo): + # year, month, day, hour, minute, second + return datetime.datetime(*dateinfo[:6]) +converter.add(_DateTimeConverter) + +class _DateConverter(_BaseDateTimeConverter): + type = datetime.date + date_format = '%x' + def get_lang_constant(self): + return locale.D_FMT + + def from_dateinfo(self, dateinfo): + # year, month, day + return datetime.date(*dateinfo[:3]) +converter.add(_DateConverter) + +class _ObjectConverter(BaseConverter): + type = object + + as_string = None + from_string = None +converter.add(_ObjectConverter) + +class currency(Decimal): + """ + A datatype representing currency, used together with the list and + the framework + """ + _converter = converter.get_converter(Decimal) + + def __new__(cls, value): + """ + @param value: value to convert + @type value: string or number + """ + if isinstance(value, str): + conv = locale.localeconv() + currency_symbol = conv.get('currency_symbol') + text = value.strip(currency_symbol) + value = currency._converter.from_string(text) + if value == ValueUnset: + raise InvalidOperation + elif isinstance(value, float): + print ('Warning: losing precision converting float %r to currency' + % value) + value = str(value) + elif not isinstance(value, (int, long, Decimal)): + raise TypeError( + "cannot convert %r of type %s to a currency" % ( + value, type(value))) + + return Decimal.__new__(cls, value) + + def format(self, symbol=True, precision=None): + value = Decimal(self) + + conv = locale.localeconv() + + # Grouping (eg thousand separator) of integer part + groups = conv.get('mon_grouping', [])[:] + groups.reverse() + if groups: + group = groups.pop() + else: + group = 3 + + intparts = [] + + # We're iterating over every character in the integer part + # make sure to remove the negative sign, it'll be added later + intpart = str(int(abs(value))) + + while True: + if not intpart: + break + + s = intpart[-group:] + intparts.insert(0, s) + intpart = intpart[:-group] + if not groups: + continue + + last = groups.pop() + # if 0 reuse last one, see struct lconv in locale.h + if last != 0: + group = last + + # Add the sign, and the list of decmial parts, which now are grouped + # properly and can be joined by mon_thousand_sep + if value > 0: + sign = conv.get('positive_sign', '') + elif value < 0: + sign = conv.get('negative_sign', '-') + else: + sign = '' + currency = sign + conv.get('mon_thousands_sep', '.').join(intparts) + + # Only add decimal part if it has one, is this correct? + if precision is not None or value % 1 != 0: + # Pythons string formatting can't handle %.127f + # 127 is the default value from glibc/python + if precision: + frac_digits = precision + else: + frac_digits = conv.get('frac_digits', 2) + if frac_digits == 127: + frac_digits = 2 + + format = '%%.%sf' % frac_digits + dec_part = (format % value)[-frac_digits:] + + mon_decimal_point = conv.get('mon_decimal_point', '.') + currency += mon_decimal_point + dec_part + + # If requested include currency symbol + currency_symbol = conv.get('currency_symbol', '') + if currency_symbol and symbol: + if value > 0: + cs_precedes = conv.get('p_cs_precedes', 1) + sep_by_space = conv.get('p_sep_by_space', 1) + else: + cs_precedes = conv.get('n_cs_precedes', 1) + sep_by_space = conv.get('n_sep_by_space', 1) + + # Patching glibc's output + # See http://sources.redhat.com/bugzilla/show_bug.cgi?id=1294 + current_locale = locale.getlocale(locale.LC_MONETARY) + if current_locale[0] == 'pt_BR': + cs_precedes = 1 + sep_by_space = 0 + + if sep_by_space: + space = ' ' + else: + space = '' + if cs_precedes: + currency = currency_symbol + space + currency + else: + currency = currency + space + currency_symbol + + return currency + + def __repr__(self): + return '<currency %s> ' % self.format() + +class _CurrencyConverter(_DecimalConverter): + type = currency + + def __init__(self): + self.symbol = True + self.precision = 2 + + def as_string(self, value, format=None): + if not isinstance(value, currency): + try: + value = currency(value) + except ValueError: + raise ValidationError( + "%s can not be converted to a currency" % value) + + return value.format(self.symbol, self.precision) + + def from_string(self, value): + if value == '': + return ValueUnset + try: + return currency(value) + except (ValueError, InvalidOperation): + raise ValidationError( + "%s can not be converted to a currency" % value) + +converter.add(_CurrencyConverter) + +def lformat(format, value): + """Like locale.format but with grouping enabled""" + return locale.format(format, value, 1) + +def format_price(value, symbol=True, precision=None): + """ + Formats a price according to the current locales monetary + settings + + @param value: number + @param symbol: whether to include the currency symbol + """ + + return currency(value).format(symbol, precision) + +def filter_locale(value): + """ + Removes the locale specific data from the value string. + Currently we only remove the thousands separator and + convert the decimal point. + The returned value of this function can safely be passed to float() + + @param value: value to convert + @returns: the value without locale specific data + """ + + conv = locale.localeconv() + + # Check so we only have one decimal point + decimal_point = conv["decimal_point"] + decimal_points = value.count(decimal_point) + if decimal_points > 1: + raise ValidationError( + 'You have more than one decimal point ("%s") ' + ' in your number "%s"' % (decimal_point, value)) + + thousands_sep = conv["thousands_sep"] + if thousands_sep: + # Check so we don't have any thousand separators to the right + # of the decimal point + th_sep_count = value.count(thousands_sep) + if th_sep_count and decimal_points: + decimal_point_pos = value.index(decimal_point) + if thousands_sep in value[decimal_point_pos+1:]: + raise ValidationError("You have a thousand separator to the " + "right of the decimal point") + check_value = value[:decimal_point_pos] + else: + check_value = value + + # Verify so the thousand separators are placed properly + # TODO: Use conv['grouping'] for locales where it's not 3 + parts = check_value.split(thousands_sep) + + # First part is a special case, It can be 1, 2 or 3 + if 3 > len(parts[0]) < 1: + raise ValidationError("Inproperly placed thousands separator") + + # Middle parts should have a length of 3 + for part in parts[1:]: + if len(part) != 3: + raise ValidationError("Inproperly placed thousand " + "separators") + + # Remove all thousand separators + value = value.replace(thousands_sep, '') + + # Replace all decimal points with . + if decimal_point != '.': + value = value.replace(decimal_point, '.') + return value diff --git a/kiwi/decorators.py b/kiwi/decorators.py new file mode 100644 index 0000000..bd33b50 --- /dev/null +++ b/kiwi/decorators.py @@ -0,0 +1,95 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +"""Function and method decorators used in kiwi""" + +from kiwi.log import kiwi_log + +class deprecated(object): + """ + I am a decorator which prints a deprecation warning each + time you call the decorated (and deprecated) function + """ + def __init__(self, new, log=None): + """ + @param new: the name of the new function replacing the old + deprecated one + @type new: string + """ + self._new = new + self._log = log or kiwi_log + + def __call__(self, func): + def wrapper(*args, **kwargs): + self._log.warn("%s is deprecated, use %s instead" % + (func.__name__, self._new)) + return func(*args, **kwargs) + wrapper.__name__ = func.__name__ + return wrapper + +class signal_block(object): + """ + A decorator to be used on L{kiwi.ui.views.SlaveView} methods. + It takes a list of arguments which is the name of the widget and + the signal name separated by a dot. + + For instance: + + >>> class MyView(SlaveView): + ... @signal_block('money.changed') + ... def update_money(self): + ... self.money.set_value(10) + ... def on_money__changed(self): + ... pass + + + When calling update_money() the value of the spinbutton called money + will be updated, but on_money__changed will not be called. + """ + + def __init__(self, *signals): + self.signals = [] + for signal in signals: + if not isinstance(signal, str): + raise TypeError("signals must be a list of strings") + if signal.count('.') != 1: + raise TypeError("signal must have exactly one dot") + self.signals.append(signal.split('.')) + + def __call__(self, func): + def wrapper(view, *args, **kwargs): + for name, signal in self.signals: + widget = getattr(view, name, None) + if widget is None: + raise TypeError("Unknown widget %s in view " % name) + view.handler_block(widget, signal) + + retval = func(view, *args, **kwargs) + + for name, signal in self.signals: + widget = getattr(view, name, None) + view.handler_unblock(widget, signal) + + return retval + wrapper.__name__ = func.__name__ + return wrapper diff --git a/kiwi/desktopparser.py b/kiwi/desktopparser.py new file mode 100644 index 0000000..92b7aef --- /dev/null +++ b/kiwi/desktopparser.py @@ -0,0 +1,161 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2006 Johan Dahlin <jdahlin@async.com.br> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# +# Based on gkeyfile.c from glib, written by +# +# Ray Strode <rstrode@redhat.com> +# Matthias Clasen <mclasen@redhat.com> +# + +from ConfigParser import ConfigParser + +# Private + +def _localize(option, locale): + if locale: + option = option + '[%s]' % locale + return option + +def _tobool(s): + if s == 'true': + return True + return False + +def _frombool(s): + if s: + return 'true' + return 'false' + +class DesktopParser(ConfigParser): + """ + A DesktopParser for GNOME/KDE .desktop files. + The API is similar to GKeyFile from glib. + + Example: + + >>> parser = DesktopParser() + >>> parser.read('/usr/share/applications/gnome-terminal.desktop') + >>> parser.get_locale('Desktop Entry', 'Comment', 'pt') + """ + def __init__(self, defaults=None): + ConfigParser.__init__(self, defaults) + self._list_separator = ';' + + # ConfigParser overrides + + def optionxform(self, optionstr): + # .desktop files are case sensitive + # The default implementation makes it lowercase, + # so override to just use it as it was read + return optionstr + + # Public + + def set_list_separator(self, separator): + """ + Sets the character which is used to separate + values in lists. Typically ';' or ',' are used + as separators. The default list separator is ';'. + + @param separator: the separator + """ + self._list_separator = separator + + def set_locale(self, section, option, locale, value): + """ + @param section: section name + @param option: an option + @param locale: a locale + @param value: value to set + """ + self.set(section, _localize(option, locale), value) + + def get_locale(self, section, option, locale): + """ + @param section: section name + @param option: an option + @param locale: a locale + """ + return self.get(section, _localize(option, locale)) + + def get_string_list(self, section, option): + """ + @param section: section name + @param option: an option + """ + return self.get(section, option).split(self._list_separator) + + def set_string_list(self, section, option, values): + """ + @param section: section name + @param option: an option + @param values: list of string values + """ + value = self._list_separator.join(values) + self.set(section, option, value) + + def get_integer_list(self, section, option): + """ + @param section: section name + @param option: an option + """ + return map(int, self.get_string_list(section, option)) + + def set_integer_list(self, section, option, values): + """ + @param section: section name + @param option: an option + @param values: list of integer values + """ + self.set_string_list(section, option, map(str, values)) + + def get_boolean_list(self, section, option): + """ + @param section: section name + @param option: an option + """ + return map(_tobool, self.get_string_list(section, option)) + + def set_boolean_list(self, section, option, values): + """ + @param section: section name + @param option: an option + @param values: list of boolean values + """ + self.set_string_list(section, option, map(_frombool, values)) + + def set_string_list_locale(self, section, option, locale, values): + """ + @param section: section name + @param option: an option + @param locale: a locale + @param values: list of string values + """ + self.set_string_list(section, _localize(option, locale), values) + + def get_string_list_locale(self, section, option, locale): + """ + @param section: section name + @param option: an option + @param locale: a locale + """ + return self.get_string_list(section, _localize(option, locale)) diff --git a/kiwi/dist.py b/kiwi/dist.py new file mode 100644 index 0000000..0130b35 --- /dev/null +++ b/kiwi/dist.py @@ -0,0 +1,252 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +"""Distutils extensions and utilities""" + +from distutils.command.install_data import install_data +from distutils.command.install_lib import install_lib +from distutils.core import setup as DS_setup +from distutils.dep_util import newer +from distutils.log import info, warn +from distutils.sysconfig import get_python_lib +from fnmatch import fnmatch +import os +import new +import sys + +class _VariableExtender: + def __init__(self, distribution): + install = distribution.get_command_obj('install') + name = distribution.get_name() + # Remove trailing / + prefix = install.prefix + if prefix[-1] == '/': + prefix = prefix[:-1] + self.prefix = prefix + + self.datadir = os.path.join(self.prefix, 'share', name) + if self.prefix == '/usr': + self.sysconfdir = '/etc' + else: + self.sysconfdir = os.path.join(self.prefix, 'etc') + + def extend(self, string): + for name, var in [('sysconfdir', self.sysconfdir), + ('datadir', self.datadir)]: + string = string.replace('$' + name, var) + return string + +class KiwiInstallLib(install_lib): + # Overridable by subclass + resources = {} + global_resources = {} + + def generate_template(self): + if 'bdist_wininst' in sys.argv: + prefix = 'import sys\nprefix = sys.prefix' + else: + install = self.distribution.get_command_obj('install') + prefix = 'prefix = "%s"' % install.prefix + + name = self.distribution.get_name() + filename = os.path.join(self.install_dir, name, '__installed__.py') + self.mkpath(os.path.dirname(filename)) + fp = open(filename, 'w') + fp.write('# Generated by setup.py do not modify\n') + fp.write('import os\n') + fp.write('%s\n' % prefix) + self._write_dictionary(fp, 'resources', self.resources) + self._write_dictionary(fp, 'global_resources', self.global_resources) + fp.close() + + return filename + + def _write_dictionary(self, fp, name, dictionary): + fp.write('%s = {}\n' % name) + for key, value in dictionary.items(): + value = value.replace('/', os.sep) + value = self.varext.extend(value) + value = value.replace(self.varext.prefix, '$prefix') + parts = [] + for part in value.split(os.sep): + if part == "": + part = os.sep + if part == '$prefix': + part = 'prefix' + else: + part = '"%s"' % part + parts.append(part) + fp.write("%s['%s'] = %s\n" % ( + name, key, 'os.path.join(%s)' % ', '.join(parts))) + + def install(self): + self.varext = _VariableExtender(self.distribution) + return install_lib.install(self) + [self.generate_template()] + +# Backwards compat +TemplateInstallLib = KiwiInstallLib + +class KiwiInstallData(install_data): + def run(self): + self.varext = _VariableExtender(self.distribution) + + # Extend variables in all data files + data_files = [] + for target, files in self.data_files[:]: + data_files.append((self.varext.extend(target), files)) + self.data_files = data_files + return install_data.run(self) + +def get_site_packages_dir(*dirs): + """ + Gets the relative path of the site-packages directory + + This is mainly useful for setup.py usage: + + >>> setup(... + data_files=[(get_site_packages_dir('foo'), + files..)]) + + where files is a list of files to be installed in + a directory called foo created in your site-packages directory + + @param dirs: directory names to be appended + """ + + libdir = get_python_lib(plat_specific=False, + standard_lib=True, prefix='') + return os.path.join(libdir, 'site-packages', *dirs) + +def listfiles(*dirs): + """ + Lists all files in directories and optionally uses basic shell + matching, example: + + >>> listfiles('data', 'glade', '*.glade') + ['data/glade/Foo.glade', 'data/glade/Bar.glade', ...] + + @param dirs: directory parts + """ + + dir, pattern = os.path.split(os.path.join(*dirs)) + return [os.path.join(dir, filename) + for filename in os.listdir(os.path.abspath(dir)) + if filename[0] != '.' and fnmatch(filename, pattern)] + +def compile_po_files(domain, dirname='locale'): + """ + Compiles po files to mo files. + Note. this function depends on gettext utilities being installed + + @param domain: gettext domain + @param dirname: base directory + @returns: a list of po files + """ + if os.system('msgfmt 2> /dev/null') != 256: + warn('msgfmt is missing, not installing translations') + return [] + + data_files = [] + for po in listfiles('po', '*.po'): + lang = os.path.basename(po[:-3]) + mo = os.path.join(dirname, lang, 'LC_MESSAGES', domain + '.mo') + + if not os.path.exists(mo) or newer(po, mo): + directory = os.path.dirname(mo) + if not os.path.exists(directory): + info("creating %s" % directory) + os.makedirs(directory) + cmd = 'msgfmt -o %s %s' % (mo, po) + info('compiling %s -> %s' % (po, mo)) + if os.system(cmd) != 0: + raise SystemExit("Error while running msgfmt") + dest = os.path.dirname(os.path.join('share', mo)) + data_files.append((dest, [mo])) + + return data_files + +def listpackages(root, exclude=None): + """Recursivly list all packages in directory root + Optionally exclude can be specified which is a string + like foo/bar. + + @param root: directory + @param exclude: optional packages to be skipped + """ + + packages = [] + if not os.path.isdir(root): + raise ValueError("root must be a directory") + + if os.path.exists(os.path.join(root, '__init__.py')): + packages.append(root.replace('/', '.')) + + for filename in os.listdir(root): + full = os.path.join(root, filename) + if os.path.isdir(full): + packages.extend(listpackages(full)) + + if exclude: + for package in packages[:]: + if package.startswith(exclude): + packages.remove(package) + + return packages + +def setup(**kwargs): + """ + A drop in replacement for distutils.core.setup which + integrates nicely with kiwi.environ + @kwarg resources: + @kwarg global_resources: + """ + resources = {} + global_resources = {} + if 'resources' in kwargs: + resources = kwargs.pop('resources') + if 'global_resources' in kwargs: + global_resources = kwargs.pop('global_resources') + + def run_install(self): + self.data_files.extend(compile_po_files(kwargs['name'])) + KiwiInstallData.run(self) + + # Copied from gazpacho, needs to be tested + + #if 'bdist_wininst' in sys.argv: + # prefix_code = 'import sys; prefix = sys.prefix' + #else: + # install = self.distribution.get_command_obj('install') + # prefix = install.prefix + # prefix_code = 'prefix = r"%s"' % prefix + + # distutils uses old style classes + InstallData = new.classobj('InstallData', (KiwiInstallData,), + dict(run=run_install)) + InstallLib = new.classobj('InstallLib', (KiwiInstallLib,), + dict(resources=resources, + global_resources=global_resources)) + kwargs['cmdclass'] = dict(install_data=InstallData, + install_lib=InstallLib) + + DS_setup(**kwargs) diff --git a/kiwi/environ.py b/kiwi/environ.py new file mode 100644 index 0000000..e97eb9d --- /dev/null +++ b/kiwi/environ.py @@ -0,0 +1,389 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +"""Environment helpers: path mangling and resource management""" + +import gettext +import imp +import locale +import os +import sys + +from kiwi.log import Logger +from kiwi.python import namedAny + +__all__ = ['Application', 'Library', 'app', 'environ', 'require_gazpacho', + 'is_gazpacho_required'] + +log = Logger('environ') + +EnvironmentError = EnvironmentError + +# From http://tinyurl.com/77ukj +def _is_frozen(): + "Helper function to check if we're frozen in a py2exe'd file" + return (hasattr(sys, "frozen") or # new py2exe + hasattr(sys, "importers") # old py2exe + or imp.is_frozen("__main__")) # tools/freeze + +class Environment: + """Environment control + + When you want to access a resource on the filesystem, such as + an image or a glade file you use this object. + + External libraries or applications are free to add extra directories""" + + def __init__(self, root='.'): + self._resources = {} + self._extensions = {} + self._root = root + + # Add some compressed formats as alternative extensions to + # "glade" resources. A patch has been added to gazpacho trunk + # (rev. 2251) to support loading those compressed formats. + self._add_extensions("glade", ".bz2", ".gz") + + self._add_resource_variable("glade", "KIWI_GLADE_PATH") + self._add_resource_variable("image", "KIWI_IMAGE_PATH") + + def get_root(self): + return self._root + + def get_log_level(self): + return os.environ.get('KIWI_LOG') + + def _add_extensions(self, resource, *args): + exts = self._extensions.setdefault(resource, []) + exts.extend(list(args)) + + def _add_resource_variable(self, resource, variable): + """Add resources from an environment variable""" + env = os.environ.get(variable, '') + for path in env.split(os.pathsep): + if not path: + continue + self.add_resource(resource, env) + + def get_resource_paths(self, resource): + if not resource in self._resources: + raise EnvironmentError("No resource called: %s" % resource) + return self._resources[resource] + + def add_resource(self, resource, path): + path = os.path.join(self._root, path) + + if not os.path.isdir(path): + raise EnvironmentError("path %s must be a directory" % path) + + self._resources.setdefault(resource, []).append(path) + + def add_resources(self, **kwargs): + for resource, path in kwargs.items(): + self.add_resource(resource, path) + + def find_resource(self, resource, name): + """Locate a specific resource of called name of type resource""" + + resource_paths = self.get_resource_paths(resource) + + # Look for alternative extensions for this resource. + # But check without extensions first + exts = [""] + self._extensions.get(resource, []) + + # Check "scriptdir", which is the directory the script is ran from + # and the working directory ("") after all the others fail + scriptdir = os.path.dirname(os.path.abspath(sys.argv[0])) + for path in resource_paths + [scriptdir, ""]: + for ext in exts: + filename = os.path.join(self._root, path, "".join((name, ext))) + if os.path.exists(filename): + return filename + + raise EnvironmentError("Could not find %s resource: %s" % ( + resource, name)) + + def _get_epydoc(self): + if sys.argv == ['IGNORE']: + return True + elif os.path.basename(sys.argv[0]) == 'epyrun': + return True + return False + + epydoc = property(_get_epydoc) + +class Library(Environment): + """A Library is a local environment object, it's a subclass of the + Environment class. + It's used by libraries and applications (through the Application class) + + It provides a way to manage local resources, which should only be seen + in the current context. + + Libraries are usually instantiated in __init__.py in the topmost package + in your library, an example usage is kiwi itself which does: + + >>> from kiwi.environ import Library + >>> lib = Library('kiwi') + >>> if lib.uninstalled: + >>> lib.add_global_resource('glade', 'glade') + >>> lib.add_global_resource('pixmap', 'pixmaps') + + which is combined with the following class in setup.py: + + >>> from kiwi.dist import InstallLib + >>> class InstallLib(TemplateInstallLib): + >>> name = 'kiwi' + >>> global_resources = dict(glade='$datadir/glade', + >>> pixmap='$datadir/pixmaps') + >>> + >>> setup(..., + >>> data_files=[('share/kiwi/glade', + >>> listfiles('glade', '*.glade')), + >>> ('share/kiwi/pixmaps', + >>> listfiles('pixmaps', '*.png')), + >>> cmdclass=dict(install_lib=InstallLib)) + + It may seems like a bit of work, but this is everything that's needed + for kiwi to figure out how to load resources when installed and when + running in an uninstalled mode, eg directly from the source tree. + To locate a pixmap called kiwi.png the following is enough: + + >>> from kiwi.environ import environ + >>> environ.find_resource('pixmap', 'kiwi.png') + '/usr/share/kiwi/pixmaps/kiwi.png' # installed mode + + Which will lookup the resource kiwi.png in the domain pixmap, which + points to $datadir/pixmaps (eg $prefix/share/kiwi/pixmaps) when running + in installed mode and from $builddir/pixmaps otherwise. + + """ + def __init__(self, name, root='..', dirname=None): + """ + Creates a new library, this is usually called in __init__.py in a + toplevel package. All resources will be relative to the I{root} + directory. + + @param name: name of the library + @param root: root directory + @param dirname: + """ + self.name = name + + # py2exe + if _is_frozen(): + log.info('py2exe found') + executable = os.path.realpath(os.path.abspath(sys.executable)) + root = os.path.dirname(executable) + # normal + else: + if dirname == None: + # Figure out the absolute path to the caller + caller = sys._getframe(1).f_locals['__file__'] + dirname = os.path.split(caller)[0] + + dirname = os.path.realpath(os.path.abspath(dirname)) + root = os.path.abspath(os.path.join(dirname, root)) + Environment.__init__(self, root=root) + + sys.path.insert(0, os.path.join(root, 'lib', 'python%d.%d' % + sys.version_info[:2], 'site-packages')) + g = globals() + l = locals() + try: + module = __import__(name, g, l) + except ImportError: + raise ImportError("Failed to import module %s" % name) + + # Load installed + try: + module = __import__(name + '.__installed__', g, l, [name]) + except ImportError: + uninstalled = True + else: + uninstalled = False + if not hasattr(module, 'resources'): + raise ValueError("module %s.__installed__ must define a " + "resources attribute" % name) + if not hasattr(module, 'global_resources'): + raise ValueError("module %s.__installed__ must define a " + "global_resources attribute" % name) + self.add_resources(**module.resources) + self.add_global_resources(**module.global_resources) + + self.uninstalled = uninstalled + + def _check_translation(self, domain, directory): + loc = locale.getlocale()[0] + + # We're not interested in warnings for these locales + if loc in (None, 'C', 'en_US'): + return + + # check sv_SE and sv + locales = [loc] + if '_' in loc: + locales.append(loc.split('_')[0]) + + for l in locales: + path = os.path.join(directory, l, 'LC_MESSAGES', domain + '.mo') + if os.path.exists(path): + break + else: + log.warn('No %s translation found for domain %s' % (loc, domain)) + + def enable_translation(self, domain=None, localedir=None): + """ + Enables translation for a library + + @param domain: optional, if not specified name sent to constructor + will be used + @param localedir: directory to get locales from when running in + uninstalled mode. If not specified a directory called 'locale' in + the root will be used. + """ + if not domain: + domain = self.name + + if not localedir: + localedir = 'locale' + + if self.uninstalled: + try: + self.add_resource('locale', localedir) + except EnvironmentError: + pass + + # XXX: locale should not be a list + localedir = self._resources.get('locale') + if not localedir: + # Only complain when running installed + if not self.uninstalled: + log.warn('no localedir for: %s' % domain) + + return + directory = gettext.bindtextdomain(domain, localedir[0]) + self._check_translation(domain, directory) + + # Gtk+ only supports utf-8, it makes no sense to support + # other encodings in kiwi it self + gettext.bind_textdomain_codeset(domain, 'utf-8') + + def set_application_domain(self, domain): + """ + Sets the default application domain + @param domain: the domain + """ + gettext.textdomain(domain) + + def add_global_resource(self, resource, path): + """Convenience method to add a global resource. + This is the same as calling kiwi.environ.environ.add_resource + """ + global environ + environ.add_resource(resource, os.path.join(self._root, path)) + + def add_global_resources(self, **kwargs): + for resource, path in kwargs.items(): + self.add_global_resource(resource, path) + +class Application(Library): + """Application extends a L{Library}. It's meant to be used + by applications + + Libraries are usually instantiated in __init__.py in the topmost package + in your library, an example usage is kiwi itself which does: + + >>> from kiwi.environ import Application + >>> app = Application('gnomovision') + >>> if app.uninstalled: + >>> app.add_global_resource('glade', 'glade') + >>> app.add_global_resource('pixmap', 'pixmaps') + + If you want to do translations, you also need to do the following: + + >>> app.enable_translation() + + @see: L{Library} for more information on how to integrate it with + the standard distutils configuration. + """ + + def __init__(self, name, root='..', path='main', dirname=None): + global app + if app is not None: + raise TypeError("Application is already set to %r" % app) + app = self + + if not dirname: + dirname = os.path.abspath(os.path.dirname(sys.argv[0])) + Library.__init__(self, name, root, dirname) + self._path = path + + def _get_main(self): + try: + module = namedAny(self._path) + except: + log.warn('importing %s' % self._path) + raise + + main = getattr(module, 'main', None) + if not main or not callable(main): + raise SystemExit("ERROR: Could not find item '%s' in module %s" % + 'main', self._path) + return main + + def enable_translation(self, domain=None, localedir=None): + """ + Enables translation for a application + See L{Library.enable_translation}. + + """ + Library.enable_translation(self, domain, localedir) + old_domain = gettext.textdomain() + if old_domain != 'messages': + log.warn('overriding default domain, was %s' % old_domain) + + self.set_application_domain(domain) + + def run(self): + main = self._get_main() + + try: + sys.exit(main(sys.argv)) + except KeyboardInterrupt: + raise SystemExit + +_require_gazpacho_loader = False + +def require_gazpacho(): + global _require_gazpacho_loader + _require_gazpacho_loader = True + +def is_gazpacho_required(): + global _require_gazpacho_loader + return _require_gazpacho_loader + +# Global variables +environ = Environment() + +app = None diff --git a/kiwi/i18n/__init__.py b/kiwi/i18n/__init__.py new file mode 100644 index 0000000..6a3a3b6 --- /dev/null +++ b/kiwi/i18n/__init__.py @@ -0,0 +1,22 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# + +"""Internationalization helpers""" diff --git a/kiwi/i18n/i18n.py b/kiwi/i18n/i18n.py new file mode 100644 index 0000000..2dfa064 --- /dev/null +++ b/kiwi/i18n/i18n.py @@ -0,0 +1,167 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# + +"""Internationalization utilities. Requires intltool and gettext""" + +from distutils.dep_util import newer +from distutils.filelist import FileList +from optparse import OptionParser +import os +from shutil import copyfile + +from kiwi.dist import listfiles + +# This is a template, used to generate a list of translatable file +# which intltool can understand. +# It reuses the syntax from distutils MANIFEST files, a POTFILES.in +# will be generate from it, see update_po() +POTFILES = 'POTFILES.list' + +def check_directory(root): + po_dir = os.path.join(root, 'po') + if not os.path.exists(po_dir): + raise SystemExit("A 'po` directory must exist") + if not os.path.isdir(po_dir): + raise SystemExit("po must be a directory") + + locale_dir = os.path.join(root, 'locale') + if os.path.exists(locale_dir): + if not os.path.isdir(po_dir): + raise SystemExit("locale must be a directory") + +def check_pot_file(root, package): + pot_file = os.path.join(root, 'po', '%s.pot' % package) + if not os.path.exists(pot_file): + raise SystemExit("Need a pot file, run --update first") + return pot_file + +def get_translatable_files(root): + pofiles = os.path.join(root, 'po', POTFILES) + if not os.path.exists(pofiles): + print 'Warning: Could not find %s' % pofiles + return [] + + filelist = FileList() + + fp = open(pofiles) + for line in fp.readlines(): + filelist.process_template_line(line) + return filelist.files + +def list_languages(root): + return [os.path.basename(po_file[:-3]) + for po_file in listfiles(root, 'po', '*.po')] + +def update_po(root, package): + files = get_translatable_files(root) + potfiles_in = os.path.join(root, 'po', 'POTFILES.in') + fd = open(potfiles_in, 'w') + for filename in files: + fd.write(filename + '\n') + fd.close() + + old = os.getcwd() + os.chdir(os.path.join(root, 'po')) + + if os.system('intltool-update 2> /dev/null > /dev/null') != 0: + raise SystemExit('ERROR: intltool-update could not be found') + + # POT file first + os.system('intltool-update --pot --gettext-package=%s' % package) + + for lang in list_languages(root): + new = lang + '.new.po' + cmd = ('intltool-update --dist --gettext-package=%s ' + '-o %s %s > /dev/null' % (package, new, lang)) + os.system(cmd) + if not os.path.exists(new): + raise SystemExit("ERROR: intltool failed, see above") + + os.rename(new, lang + '.po') + + os.chdir(old) + + os.unlink(potfiles_in) + +def compile_po_files(root, package): + if os.system('msgfmt 2> /dev/null') != 256: + print 'msgfmt could not be found, disabling translations' + return + + mo_file = package + '.mo' + for po_file in listfiles(root, 'po', '*.po'): + lang = os.path.basename(po_file[:-3]) + mo = os.path.join(root, 'locale', lang, 'LC_MESSAGES', mo_file) + + if not os.path.exists(mo) or newer(po_file, mo): + directory = os.path.dirname(mo) + if not os.path.exists(directory): + os.makedirs(directory) + os.system('msgfmt %s -o %s' % (po_file, mo)) + +def main(args): + parser = OptionParser() + parser.add_option('-a', '--add', + action="store", type="string", + dest="lang", + help="Add a new language") + parser.add_option('-l', '--list', + action="store_true", + dest="list", + help="List all supported languages") + parser.add_option('-u', '--update', + action="store_true", + dest="update", + help="Update pot file and all po files") + parser.add_option('-c', '--compile', + action="store_true", + dest="compile", + help="Compile all .po files into .mo") + parser.add_option('-p', '--package', + action="store", type="string", + dest="package", + help="Package name") + + options, args = parser.parse_args(args) + + root = os.getcwd() + check_directory(root) + + if options.package: + package = options.package + else: + package = os.path.split(root)[1] + + if options.lang: + pot_file = check_pot_file(root, package) + copyfile(pot_file, os.path.join(root, 'po', options.lang + '.po')) + return + elif options.list: + for lang in list_languages(root): + print lang + return + + if options.update: + update_po(root, package) + + if options.compile: + check_pot_file(root, package) + compile_po_files(root, package) diff --git a/kiwi/i18n/msgfmt.py b/kiwi/i18n/msgfmt.py new file mode 100644 index 0000000..c89825b --- /dev/null +++ b/kiwi/i18n/msgfmt.py @@ -0,0 +1,204 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-1 -*- +# Written by Martin v. Löwis <loewis@informatik.hu-berlin.de> + +doc = """Generate binary message catalog from textual translation description. + +This program converts a textual Uniforum-style message catalog (.po file) into +a binary GNU catalog (.mo file). This is essentially the same function as the +GNU msgfmt program, however, it is a simpler implementation. + +Usage: msgfmt.py [OPTIONS] filename.po + +Options: + -o file + --output-file=file + Specify the output file to write to. If omitted, output will go to a + file named filename.mo (based off the input file name). + + -h + --help + Print this message and exit. + + -V + --version + Display version information and exit. +""" + +import sys +import os +import getopt +import struct +import array + +__version__ = "1.1" + +MESSAGES = {} + + + +def usage(code, msg=''): + print >> sys.stderr, doc + if msg: + print >> sys.stderr, msg + sys.exit(code) + + + +def add(id, str, fuzzy): + "Add a non-fuzzy translation to the dictionary." + global MESSAGES + if not fuzzy and str: + MESSAGES[id] = str + + + +def generate(): + "Return the generated output." + global MESSAGES + keys = MESSAGES.keys() + # the keys are sorted in the .mo file + keys.sort() + offsets = [] + ids = strs = '' + for id in keys: + # For each string, we need size and file offset. Each string is NUL + # terminated; the NUL does not count into the size. + offsets.append((len(ids), len(id), len(strs), len(MESSAGES[id]))) + ids += id + '\0' + strs += MESSAGES[id] + '\0' + output = '' + # The header is 7 32-bit unsigned integers. We don't use hash tables, so + # the keys start right after the index tables. + # translated string. + keystart = 7*4+16*len(keys) + # and the values start after the keys + valuestart = keystart + len(ids) + koffsets = [] + voffsets = [] + # The string table first has the list of keys, then the list of values. + # Each entry has first the size of the string, then the file offset. + for o1, l1, o2, l2 in offsets: + koffsets += [l1, o1+keystart] + voffsets += [l2, o2+valuestart] + offsets = koffsets + voffsets + output = struct.pack("Iiiiiii", + 0x950412deL, # Magic + 0, # Version + len(keys), # # of entries + 7*4, # start of key index + 7*4+len(keys)*8, # start of value index + 0, 0) # size and offset of hash table + output += array.array("i", offsets).tostring() + output += ids + output += strs + return output + + + +def make(filename, outfile): + ID = 1 + STR = 2 + + # Compute .mo name from .po name and arguments + if filename.endswith('.po'): + infile = filename + else: + infile = filename + '.po' + if outfile is None: + outfile = os.path.splitext(infile)[0] + '.mo' + + try: + lines = open(infile).readlines() + except IOError, msg: + print >> sys.stderr, msg + sys.exit(1) + + section = None + fuzzy = 0 + + # Parse the catalog + lno = 0 + msgid = msgstr = '' + for l in lines: + lno += 1 + # If we get a comment line after a msgstr, this is a new entry + if l[0] == '#' and section == STR: + add(msgid, msgstr, fuzzy) + section = None + fuzzy = 0 + # Record a fuzzy mark + if l[:2] == '#,' and l.find('fuzzy'): + fuzzy = 1 + # Skip comments + if l[0] == '#': + continue + # Now we are in a msgid section, output previous section + if l.startswith('msgid'): + if section == STR: + add(msgid, msgstr, fuzzy) + section = ID + l = l[5:] + msgid = msgstr = '' + # Now we are in a msgstr section + elif l.startswith('msgstr'): + section = STR + l = l[6:] + # Skip empty lines + l = l.strip() + if not l: + continue + # XXX: Does this always follow Python escape semantics? + l = eval(l) + if section == ID: + msgid += l + elif section == STR: + msgstr += l + else: + print >> sys.stderr, 'Syntax error on %s:%d' % (infile, lno), \ + 'before:' + print >> sys.stderr, l + sys.exit(1) + # Add last entry + if section == STR: + add(msgid, msgstr, fuzzy) + + # Compute output + output = generate() + + try: + open(outfile,"wb").write(output) + except IOError,msg: + print >> sys.stderr, msg + + + +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], 'hVo:', + ['help', 'version', 'output-file=']) + except getopt.error, msg: + usage(1, msg) + + outfile = None + # parse options + for opt, arg in opts: + if opt in ('-h', '--help'): + usage(0) + elif opt in ('-V', '--version'): + print >> sys.stderr, "msgfmt.py", __version__ + sys.exit(0) + elif opt in ('-o', '--output-file'): + outfile = arg + # do it + if not args: + print >> sys.stderr, 'No input file given' + print >> sys.stderr, "Try `msgfmt --help' for more information." + return + + for filename in args: + make(filename, outfile) + + +if __name__ == '__main__': + main() diff --git a/kiwi/interfaces.py b/kiwi/interfaces.py new file mode 100644 index 0000000..d2c2fe0 --- /dev/null +++ b/kiwi/interfaces.py @@ -0,0 +1,95 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Lorenzo Gil Sanchez <lgs@sicem.biz> +# Johan Dahlin <jdahlin@async.com.br> +# + +"""Interface specifications and utilities""" + +from kiwi.component import Interface + +class IProxyWidget(Interface): + """ + IProxyWidget is a widget that can be attached to a proxy. + + Signals: + content-changed: This must be emitted when the content changes + + Properties: + data-type: string, data type of the model + model-attribute: string, name of the attribute in the model + """ + + def read(): + """ + Reads the content of the widget and returns in an appropriate + data type. + ValueUnset is returned when the user has not modified the entry + """ + pass + + def update(value): + """ + Updates the content of the widget with a value + """ + pass + +class IValidatableProxyWidget(IProxyWidget): + """ + IValidatableProxyWidget extends IProxyWidget with validation support + + Signals: + validate: This emitted so each widget can provide it's own + custom validation. + validation-changed: This is emitted when the validation status + changes, mainly used by the proxy. + + Properties: + mandatory: bool, if the widget is mandatory + """ + + def is_valid(): + pass + + def validate(force=False): + pass + +class AbstractGladeAdaptor(Interface): + """Abstract class that define the functionality an class that handle + glade files should provide.""" + + def get_widget(self, widget_name): + """Return the widget in the glade file that has that name""" + + def get_widgets(self): + """Return a tuple with all the widgets in the glade file""" + + def attach_slave(self, name, slave): + """Attaches a slaveview to the view this adaptor belongs to, + substituting the widget specified by name. + The widget specified *must* be a eventbox; its child widget will be + removed and substituted for the specified slaveview's toplevel widget + """ + + def signal_autoconnect(self, dic): + """Connect the signals in the keys of dict with the objects in the + values of dic + """ diff --git a/kiwi/log.py b/kiwi/log.py new file mode 100644 index 0000000..7f08818 --- /dev/null +++ b/kiwi/log.py @@ -0,0 +1,119 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Adriano Monteiro <adriano@globalret.com.br> +# Johan Dahlin <jdahlin@async.com.br> +## + +import logging +import os +import sys + +class LogError(Exception): + pass + +class Formatter(logging.Formatter): + def format(self, record): + frame = sys._getframe(9) + filename = os.path.basename(frame.f_code.co_filename) + record.msg = '%s:%d %s' % (filename, frame.f_lineno, record.msg) + return logging.Formatter.format(self, record) + +class Logger(logging.Logger): + log_domain = 'default' + def __init__(self, name=None, level=logging.NOTSET): + """Initializes Log module, creating log handler and defining log + level. level attribute is not mandatory. It defines from which level + messages should be logged. Logs with lower level are ignored. + + logging default levels table: + + Level + - logging.NOTSET + - logging.DEBUG + - logging.INFO + - logging.WARNING + - logging.ERROR + - logging.CRITICAL + """ + if not name: + name = Logger.log_name + logging.Logger.__init__(self, name, get_log_level(name)) + + stream_handler = logging.StreamHandler(sys.stdout) + + # Formater class define a format for the log messages been + # logged with this handler + # The following format string + # ("%(asctime)s (%(levelname)s) - %(message)s") will result + # in a log message like this: + # 2005-09-07 18:15:12,636 (WARNING) - (message!) + format_string = ("%(asctime)s %(message)s") + stream_handler.setFormatter(Formatter(format_string, + datefmt='%T')) + self.addHandler(stream_handler) + + def __call__(self, message, *args, **kwargs): + self.info(message, *args, **kwargs) + +_log_levels = {} + +def set_log_level(name, level): + """ + @param name: logging category + @param level: level + """ + global _log_levels + _log_levels[name] = level + +def get_log_level(name): + """ + @param name: logging category + @returns: the level + """ + global _log_levels + return _log_levels.get(name, logging.WARNING) + +def _read_log_level(): + log_levels = {} + # bootstrap issue, cannot depend on environ + log_level = os.environ.get('KIWI_LOG') + if not log_level: + return log_levels + + for part in log_level.split(','): + if ':' in part: + if part.count(':') > 1: + raise LogError("too many : in part %s" % part) + name, level = part.split(':') + try: + level = int(level) + except ValueError: + raise LogError("invalid level: %s" % level) + + if level < 0 or level > 5: + raise LogError("level must be between 0 and 5") + log_levels[name] = level + + return log_levels + +_log_levels = _read_log_level() + +kiwi_log = Logger('kiwi') diff --git a/kiwi/model.py b/kiwi/model.py new file mode 100644 index 0000000..3fc4832 --- /dev/null +++ b/kiwi/model.py @@ -0,0 +1,264 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2002-2003, 2005-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Johan Dahlin <jdahlin@async.com.br> +# + +"""Holds the models part of the Kiwi Framework""" + +import os +import pickle + +from kiwi import ValueUnset +from kiwi.log import Logger + +log = Logger('model') + +# +# A model that implements half of an observer pattern; when its +# attributes are changed, it notifies any proxies of the change. +# + +class Model: + """ + The Model is a mixin to be used by domain classes when attached to + Proxies. It also provides autonotification of changes to the + attached proxies. Note that if using setters, a specific call to + notify_proxies() may be necessary; see the doc for __setattr__.""" + def __init__(self): + self.ensure_init() + + def ensure_init(self): + """ + Sets up the variables so the Model's getattr hook and proxy + notification work properly. + """ + # Work around setattr hook. The _v prefixes to the variables let + # the ZODB know that there are non-persistant values. This + # workaround is fine because the API protects them and it + # doesn't affect any other persistence mechanism I know of. + self.__dict__["_v_blocked_proxies"] = [] + self.__dict__["_v_proxies"] = {} + self.__dict__["_v_autonotify"] = 1 + + def disable_autonotify(self): + """ + disable automatic notification to proxies based on __setattr__. + All changes to the model must be followed by a call to + notify_proxies() to allow the proxies to notice the change.""" + if not hasattr(self, "_v_proxies"): + self.ensure_init() + self._v_autonotify = 0 + + def notify_proxies(self, attr): + """Notify proxies that an attribute value has changed.""" + if not hasattr(self, "_v_proxies"): + self.ensure_init() + for proxy in self._v_proxies.get(attr, []): + if proxy not in self._v_blocked_proxies: + proxy.update(attr, ValueUnset, block=True) + + def register_proxy_for_attribute(self, attr, proxy): + """ + Attach a proxy to an attribute. The proxy will be notified of + changes to that particular attribute (my means of + Proxy.notify()).""" + if not hasattr(self, "_v_proxies"): + self.ensure_init() + + # XXX: should use weakref if possible, and if not, warn of leaks + proxies = self._v_proxies + if not proxies.has_key(attr): + proxies[attr] = [proxy] + else: + if proxy in proxies[attr]: + raise AssertionError, ("Tried to attach proxy %s " + "twice to attribute `%s'." + % ( proxy, attr )) + proxies[attr].append(proxy) + + def unregister_proxy_for_attribute(self, attr, proxy): + """Detach a proxy from an attribute.""" + if not hasattr(self, "_v_proxies"): + self.ensure_init() + proxies = self._v_proxies + if proxies.has_key(attr) and proxy in proxies[attr]: + # Only one listener per attribute per proxy, so remove() + # works + proxies[attr].remove(proxy) + + def unregister_proxy(self, proxy): + """Deattach a proxy completely from the model""" + if not hasattr(self, "_v_proxies"): + self.ensure_init() + proxies = self._v_proxies + for attribute in proxies.keys(): + if proxy in proxies[attribute]: + # Only one listener per attribute per proxy, so remove() + # works + proxies[attribute].remove(proxy) + + def flush_proxies(self): + """Removes all proxies attached to Model""" + self._v_proxies = {} + self._v_blocked_proxies = [] + + def block_proxy(self, proxy): + """ + Temporarily block a proxy from receiving any notification. See + unblock_proxy()""" + if not hasattr(self, "_v_proxies"): + self.ensure_init() + blocked_proxies = self._v_blocked_proxies + if proxy not in blocked_proxies: + blocked_proxies.append(proxy) + + def unblock_proxy(self, proxy): + """Re-enable notifications to a proxy""" + if not hasattr(self, "_v_proxies"): + self.ensure_init() + blocked_proxies = self._v_blocked_proxies + if proxy in blocked_proxies: + blocked_proxies.remove(proxy) + + def __setattr__(self, attr, value): + """ + A special setattr hook that notifies the registered proxies that + the model has changed. Work around it setting attributes + directly to self.__dict__. + + Note that setattr() assumes that the name of the attribute being + changed and the proxy attribute are the same. If this is not the + case (as may happen when using setters) you must call + notify_proxies() manually from the subclass' setter. + """ + # XXX: this should be done last, since the proxy notification + # may raise an exception. Or do we ignore this fact? + self.__dict__[attr] = value + + if not hasattr(self, "_v_proxies"): + self.ensure_init() + + if self._v_autonotify and self._v_proxies.has_key(attr): + self.notify_proxies(attr) + +# +# A sample model that pickles itself into a file +# + +class PickledModel(Model): + """ + PickledModel is a model that is able to save itself into a pickle + using save(). This has all the limitations of a pickle: its + instance variables must be picklable, or pickle.dump() will raise + exceptions. You can prefix variables with an underscore to make them + non-persistent (and you can restore them accordingly by overriding + __setstate__, but don't forget to call PickledModel.__setstate__)""" + + def save(self, file=None): + """ + Saves the instance to a pickle file. If no file argument is + provided, will try to use the internal _file attribute that is + set using set_filename()""" + file = file or getattr(self, "_file", None) + if not file: + msg = "No pickle specified, don't know where to save myself" + raise AttributeError, msg + fh = open(file, "w") + try: + pickle.dump(self, fh) + except pickle.PicklingError, e: + fh.close() + msg = ("Tried to pickle an instance variable that isn't " + "supported by pickle.dump(). To work around this, you " + "can prefix the variable name with an underscore " + " and it will be ignored by the pickle machinery " + "in PickledModel. The original error " + "follows:\n\n%s") + raise AttributeError, msg % e + fh.close() + + def set_filename(self, filename): + """ + Sets the name of the file which will be used to pickle the + model""" + self._file = filename + + def __getstate__(self): + """Gets the state from the instance to be pickled""" + odict = self.__dict__ + for key in odict.keys(): + if key[0] == "_": + del odict[key] + return odict + + def __setstate__(self, dict): + """Sets the state to the instance when being unpickled""" + Model.__dict__["__init__"](self) + self.__dict__.update(dict) + + def unpickle(cls, filename=None): + """ + Loads an instance from a pickle file; if it fails for some reason, + create a new instance. + + - filename: the file from which the pickle should be loaded. + If file is not provided, the name of the class suffixed by + ".pickle" is used (i.e. "FooClass.pickle" for the + class FooClass). + + If the pickle file is damaged, it will be saved with the extension + ".err"; if a file with that name also exists, it will use ".err.1" + and so on. This is to avoid the damaged file being clobbered by an + instance calling save() unsuspectingly. + """ + if not filename: + filename = cls.__name__ + ".pickle" + + if not os.path.exists(filename): + ret = cls() + ret.set_filename(filename) + return ret + + fh = open(filename, "r") + try: + data = fh.read() + ret = pickle.loads(data) + except (EOFError, KeyError): + # save backup of original pickle with an extension of + # .err, .err.1, .err.2, etc. + stem = filename + ".err" + i = 0 + backup = stem + while os.path.exists(backup): + i = i + 1 + backup = stem + ".%d" % i + open(backup, "w").write(data) + log.warn( + "pickle in %r was broken, saving backup in %r and creating " + "new <%s> instance\n""" % (filename, backup, cls.__name__)) + ret = cls() + fh.close() + ret.set_filename(filename) + return ret + unpickle = classmethod(unpickle) + +# TODO: implement a Model that saves itself as CSV/XML? diff --git a/kiwi/python.py b/kiwi/python.py new file mode 100644 index 0000000..00ccbd5 --- /dev/null +++ b/kiwi/python.py @@ -0,0 +1,169 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005,2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +"""Generic python addons""" + +import sys +import warnings + +__all__ = ['ClassInittableMetaType', 'ClassInittableObject'] + +class ClassInittableMetaType(type): + # pylint fails to understand this is a metaclass + def __init__(self, name, bases, namespace): + type.__init__(self, name, bases, namespace) + self.__class_init__(namespace) + +class ClassInittableObject(object): + """ + I am an object which will call a classmethod called + __class_init__ when I am created. + Subclasses of me will also have __class_init__ called. + + Note that __class_init__ is called when the class is created, + eg when the file is imported at the first time. + It's called after the class is created, but before it is put + in the namespace of the module where it is defined. + """ + __metaclass__ = ClassInittableMetaType + + def __class_init__(cls, namespace): + """ + Called when the class is created + + @param cls: class + @param namespace: namespace for newly created + @type namespace: dict + """ + __class_init__ = classmethod(__class_init__) + +# copied from twisted/python/reflect.py +def namedAny(name): + """Get a fully named package, module, module-global object, or attribute. + + @param name: + @returns: object, module or attribute + """ + + names = name.split('.') + topLevelPackage = None + moduleNames = names[:] + while not topLevelPackage: + try: + trialname = '.'.join(moduleNames) + topLevelPackage = __import__(trialname) + except ImportError: + # if the ImportError happened in the module being imported, + # this is a failure that should be handed to our caller. + # count stack frames to tell the difference. + import traceback + exc_info = sys.exc_info() + if len(traceback.extract_tb(exc_info[2])) > 1: + try: + # Clean up garbage left in sys.modules. + del sys.modules[trialname] + except KeyError: + # Python 2.4 has fixed this. Yay! + pass + raise exc_info[0], exc_info[1], exc_info[2] + moduleNames.pop() + + obj = topLevelPackage + for n in names[1:]: + obj = getattr(obj, n) + + return obj + +class Settable: + """ + A mixin class for syntactic sugar. Lets you assign attributes by + calling with keyword arguments; for example, C{x(a=b,c=d,y=z)} is the + same as C{x.a=b;x.c=d;x.y=z}. The most useful place for this is + where you don't want to name a variable, but you do want to set + some attributes; for example, C{X()(y=z,a=b)}. + """ + def __init__(self, **kw): + self._attrs = kw.keys() + self._attrs.sort() + self.__dict__.update(**kw) + + def __repr__(self): + return '<%s %s>' % (self.__class__.__name__, + ', '.join( + ['%s=%r' % (attr, getattr(self, attr)) for attr in self._attrs])) + +def qual(klass): + """ + @returns: fully qualified module and class name + """ + return klass.__module__ + '.' + klass.__name__ + +def clamp(x, low, high): + """ + Ensures that x is between the limits set by low and high. + For example, + * clamp(5, 10, 15) is 10. + * clamp(15, 5, 10) is 10. + * clamp(20, 15, 25) is 20. + + @param x: the value to clamp. + @param low: the minimum value allowed. + @param high: the maximum value allowed. + @returns: the clamped value + """ + + return min(max(x, low), high) + +def slicerange(slice, limit): + """Takes a slice object and returns a range iterator + + @param slice: slice object + @param limit: maximum value allowed + @returns: iterator + """ + + return xrange(*slice.indices(limit)) + +_no_deprecation = False + +def deprecationwarn(msg, stacklevel=2): + """ + Prints a deprecation warning + """ + global _no_deprecation + if _no_deprecation: + return + + warnings.warn(msg, DeprecationWarning, stacklevel=stacklevel) + +def disabledeprecationcall(func, *args, **kwargs): + """ + Disables all deprecation warnings during the function call to func + """ + global _no_deprecation + old = _no_deprecation + _no_deprecation = True + retval = func(*args, **kwargs) + _no_deprecation = old + return retval + diff --git a/kiwi/tasklet.py b/kiwi/tasklet.py new file mode 100644 index 0000000..f0496d4 --- /dev/null +++ b/kiwi/tasklet.py @@ -0,0 +1,871 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Gustavo J. A. M. Carneiro +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Gustavo J. A. M. Carneiro <gjc@inescporto.pt> +# + +""" +Pseudo-thread (coroutines) framework + +Introduction +============ + + This module adds infrastructure for managing tasklets. In this + context, a X{tasklet} is defined as a routine that explicitly gives + back control to the main program a certain points in the code, while + waiting for certain events. Other terms that may be used to describe + tasklets include I{coroutines}, or I{cooperative threads}. + + The main advantages of tasklets are: + + - Eliminates the danger of unexpected race conditions or deadlocks + that happen with preemptive (regular) threads; + + - Reduces the number of callbacks in your code, that sometimes are + so many that you end up with I{spaghetti code}. + + The fundamental block used to create tasklets is Python's generators. + Generators are objects that are defined as functions, and when called + produce iterators that return values defined by the body of the + function, specifically C{yield} statements. + + The neat thing about generators are not the iterators themselves but + the fact that a function's state is completely frozen and restored + between one call to the iterator's C{next()} and the following + one. This allows the function to return control to a program's main + loop while waiting for an event, such as IO on a socket, thus allowing + other code to run in the mean time. When the specified event occurs, + the function regains control and continues executing as if nothing had + happened. + +Structure of a tasklet +====================== + + At the outset, a tasklet is simply a python U{generator + function<http://www.python.org/peps/pep-0255.html>}, i.e. a function + or method containing one or more C{yield} statements. Tasklets add a + couple more requirements to regular generator functions: + + 1. The values contained in C{yield} statements cannot be arbitrary + (see below); + + 2. After each C{yield} that indicates events, the function + L{kiwi.tasklet.get_event} must be called to retrieve the event that + just occurred. + +Syntax for yield in tasklets +============================ + + Inside tasklet functions, C{yield} statements are used to suspend + execution of the tasklet while waiting for certain events. Valid + C{yield} values are: + + - A single L{Message} object, with a correctly set I{dest} + parameter. With this form, a message is sent to the indicated + tasklet. When C{yield} returns, no event is generated, so the + tasklet should B{not} call L{get_event}. + + - One, or a sequence of: + + - L{WaitCondition}, meaning to wait for that specific condition + + - L{Tasklet}, with the same meaning as L{WaitForTasklet}C{(tasklet)} + + - generator, with the same meaning as L{WaitForTasklet}C{(Tasklet(gen))} + + In this case, the tasklet is suspended until either one of the + indicated events occurs. The tasklet must call L{get_event} in + this case. + +Launching a tasklet +=================== + + To start a tasklet, the L{Tasklet} constructor must be used:: + from kiwi import tasklet + + def my_task(x): + [...] + + tasklet.Tasklet(my_task(x=0)) + + Alternatively, L{kiwi.tasklet.run} can be used to the same effect:: + from kiwi import tasklet + tasklet.run(my_task(x=0)) + + Yet another approach is to use the @tasklet.task decorator:: + from kiwi import tasklet + + @tasklet.task + def my_task(x): + [...] + raise StopIteration("return value") + + yield my_task(x=0) + retval = tasklet.get_event().retval + +Examples +======== + + Background timeout task + ----------------------- + This example demonstrates basic tasklet structure and timeout events:: + import gobject + from kiwi import tasklet + + mainloop = gobject.MainLoop() + + def simple_counter(numbers): + timeout = tasklet.WaitForTimeout(1000) + for x in xrange(numbers): + print x + yield timeout + tasklet.get_event() + mainloop.quit() + + tasklet.run(simple_counter(10)) + mainloop.run() + + Message passing + --------------- + This example extends the previous one and demonstrates message passing:: + + import gobject + from kiwi import tasklet + + mainloop = gobject.MainLoop() + + @tasklet.task + def printer(): + msgwait = tasklet.WaitForMessages(accept=("quit", "print")) + while True: + yield msgwait + msg = tasklet.get_event() + if msg.name == "quit": + return + assert msg.name == 'print' + print ">>> ", msg.value + + @tasklet.task + def simple_counter(numbers, task): + timeout = tasklet.WaitForTimeout(1000) + for x in xrange(numbers): + yield tasklet.Message('print', dest=task, value=x) + yield timeout + tasklet.get_event() + yield tasklet.Message('quit', dest=task) + mainloop.quit() + + task = printer() + simple_counter(10, task) + mainloop.run() + +""" + +import types +import warnings + +import gobject + +if gobject.pygtk_version <= (2, 8): + raise RuntimeError("PyGTK 2.8 or later is required for kiwi.tasklet") + +_event = None + +class task(object): + """A decorator that modifies a tasklet function to avoid the need + to call C{tasklet.run(func())} or C{tasklet.Tasklet(func())}. + """ + def __init__(self, func): + self._func = func + self.__name__ = func.__name__ + self.__doc__ = func.__doc__ + + def __call__(self, *args, **kwargs): + return Tasklet(self._func(*args, **kwargs)) + +def get_event(): + """ + Return the last event that caused the current tasklet to regain control. + + @warning: this function should be called exactly once after each + yield that includes a wait condition. + + """ + global _event + assert _event is not None + event = _event + _event = None + return event + +def run(gen): + """Start running a generator as a L{Tasklet}. + + @parameter gen: generator object that implements the tasklet body. + @return: a new L{Tasklet} instance, already running. + + @note: this is strictly equivalent to calling C{Tasklet(gen)}. + + """ + return Tasklet(gen) + + +class WaitCondition(object): + ''' + Base class for all wait-able condition objects. + + WaitConditions are used in a yield statement inside tasklets body + for specifying what event(s) it should wait for in order to + receive control once more.''' + + def __init__(self): + '''Abstract base class, do not call directly''' + self.triggered = False + + def arm(self, tasklet): + '''Prepare the wait condition to receive events. + + When a wait condition receives the event it is waiting for, it + should call the method + L{wait_condition_fired<Tasklet.wait_condition_fired>} of the + tasklet with the wait condition as argument. The method + returns True or False; if it returns True, it means the + WaitCondition object must "rearm" itself (continue to monitor + events), otherwise it should disarm. + + @parameter tasklet: the tasklet instance the wait condition is + to be associated with. + @attention: this method normally should not be called directly + by the programmer. + + ''' + raise NotImplementedError + + def disarm(self): + '''Stop the wait condition from receiving events. + + @attention: this method normally should not be called by the + programmer.''' + raise NotImplementedError + + +class WaitForIO(WaitCondition): + '''An object that waits for IO conditions on sockets or file + descriptors. + ''' + def __init__(self, filedes, condition=gobject.IO_IN, + priority=gobject.PRIORITY_DEFAULT): + ''' + @param filedes: object to monitor for IO + @type filedes: int file descriptor, or a + gobject.IOChannel, or an object with a C{fileno()} + method, such as socket or unix file. + + @param condition: IO event mask + @type condition: a set of C{gobject.IO_*} flags ORed together + @param priority: mainloop source priority + ''' + + WaitCondition.__init__(self) + self.filedes = filedes + self._condition = condition # listen condition + self.condition = None # last occurred condition + self._callback = None + self._id = None + self._priority = priority + + def arm(self, tasklet): + '''Overrides WaitCondition.arm''' + self._callback = tasklet.wait_condition_fired + if self._id is None: + try: + ## http://bugzilla.gnome.org/show_bug.cgi?id=139176 + iochan = isinstance(self.filedes, gobject.IOChannel) + except AttributeError: + iochan = False + if iochan: + self._id = self.filedes.add_watch(self._condition, + self._io_cb, + priority=self._priority) + else: + if isinstance(self.filedes, int): + filedes = self.filedes + else: + filedes = self.filedes.fileno() + self._id = gobject.io_add_watch(filedes, self._condition, + self._io_cb, + priority=self._priority) + + def disarm(self): + '''Overrides WaitCondition.disarm''' + if self._id is not None: + gobject.source_remove(self._id) + self._id = None + self._callback = None + + def _io_cb(self, unused_filedes, condition): + self.triggered = True + self.condition = condition + retval = self._callback(self) + self.triggered = False + if not retval: + self._id = None + return retval + + +class WaitForTimeout(WaitCondition): + '''An object that waits for a specified ammount of time (a timeout)''' + def __init__(self, timeout, priority=gobject.PRIORITY_DEFAULT): + '''An object that waits for a specified ammount of time. + + @param timeout: ammount of time to wait, in miliseconds + @param priority: mainloop priority for the timeout event + ''' + + WaitCondition.__init__(self) + self.timeout = timeout + self._id = None + self._tasklet = None + self._priority = priority + + def arm(self, tasklet): + '''See L{WaitCondition.arm}''' + if self._id is None: + self._tasklet = tasklet + self._id = gobject.timeout_add(self.timeout, self._timeout_cb, + priority=self._priority) + + def disarm(self): + '''See L{WaitCondition.disarm}''' + if self._id is not None: + gobject.source_remove(self._id) + self._id = None + self._tasklet = None + + def restart(self): + '''Restart the timeout. Makes time counting start again from zero.''' + tasklet = self._tasklet + self.disarm() + self.arm(tasklet) + + def _timeout_cb(self): + self.triggered = True + retval = self._tasklet.wait_condition_fired(self) + assert retval is not None + self.triggered = False + if not retval: + self._id = None + return retval + +class WaitForIdle(WaitCondition): + '''An object that waits for the main loop to become idle''' + + def __init__(self, priority=gobject.PRIORITY_DEFAULT_IDLE): + '''An object that waits for the main loop to become idle, with a + priority indicated by @priority''' + WaitCondition.__init__(self) + self._callback = None + self._id = None + self._priority = priority + + def arm(self, tasklet): + '''See L{WaitCondition.arm}''' + if self._id is None: + self._callback = tasklet.wait_condition_fired + self._id = gobject.idle_add(self._idle_cb, self._priority) + + def disarm(self): + '''See L{WaitCondition.disarm}''' + if self._id is not None: + gobject.source_remove(self._id) + self._id = None + self._callback = None + + def _idle_cb(self): + self.triggered = True + retval = self._callback(self) + self.triggered = False + if not retval: + self._id = None + return retval + + +class WaitForTasklet(WaitCondition): + '''An object that waits for a tasklet to complete''' + def __init__(self, tasklet): + '''An object that waits for another tasklet to complete''' + + WaitCondition.__init__(self) + self._tasklet = tasklet + self._id = None + self._idle_id = None + self._callback = None + self.retval = None + + def arm(self, tasklet): + '''See L{WaitCondition.arm}''' + self._callback = tasklet.wait_condition_fired + if self._id is None: + self._id = self._tasklet.add_join_callback(self._join_cb) + + def disarm(self): + '''See L{WaitCondition.disarm}''' + if self._idle_id is not None: + gobject.source_remove(self._idle_id) + self._idle_id = None + if self._id is not None: + self._tasklet.remove_join_callback(self._id) + self._id = None + self._callback = None + + def _join_cb(self, tasklet, retval): + assert tasklet is self._tasklet + assert self._idle_id is None + self._id = None + self._idle_id = gobject.idle_add(self._idle_cb) + self.retval = retval + + def _idle_cb(self): + self.triggered = True + self._callback(self) + self.triggered = False + self._tasklet = None + self._callback = None + self._id = None + self._idle_id = None + return False + +class WaitForSignal(WaitCondition): + '''An object that waits for a signal emission''' + + def __init__(self, obj, signal): + '''Waits for a signal to be emitted on a specific GObject instance. + + @param obj: object monitor for the signal + @type obj: gobject.GObject + @param signal: signal name + @type signal: str + ''' + WaitCondition.__init__(self) + if not isinstance(obj, gobject.GObject): + raise TypeError("obj must be a GObject instance") + if not gobject.signal_lookup(signal, obj): + raise ValueError("gobject %r does not have a signal called %r" % + (obj, signal)) + self.object = obj + self.signal = signal + self._callback = None + self._id = None + self._destroy_id = None + self.signal_args = None + + def arm(self, tasklet): + '''See L{WaitCondition.arm}''' + if self._id is None: + self._callback = tasklet.wait_condition_fired + self._id = self.object.connect(self.signal, self._signal_cb) + if gobject.signal_lookup("destroy", self.object): + self._destroy_id = self.object.connect("destroy", + self._object_destroyed) + + def _object_destroyed(self, obj): + self.object = None + self._id = None + self._destroy_id = None + self._callback = None + + def disarm(self): + '''See WaitCondition.disarm''' + if self._id is not None: + self.object.disconnect(self._id) + self._id = None + self._callback = None + if self._destroy_id is not None: + self.object.disconnect(self._destroy_id) + self._destroy_id = None + + def _signal_cb(self, obj, *args): + assert obj is self.object + self.triggered = True + self.signal_args = args + retval = self._callback(self) + self.triggered = False + if not retval: + self._id = None + return retval + + +class WaitForProcess(WaitCondition): + '''An object that waits for a process to end''' + def __init__(self, pid): + ''' + Creates an object that waits for a subprocess + + @parameter pid: Process identifier + @type pid: int + ''' + WaitCondition.__init__(self) + self.pid = pid + self._callback = None + self._id = None + self.status = None + + def arm(self, tasklet): + '''See L{WaitCondition.arm}''' + self._callback = tasklet.wait_condition_fired + if self._id is None: + self._id = gobject.child_watch_add(self.pid, self._child_cb) + + def disarm(self): + '''See L{WaitCondition.disarm}''' + if self._id is not None: + gobject.source_remove(self._id) + self._id = None + self._callback = None + + def _child_cb(self, unused_pid, status): + self.triggered = True + self.status = status + self._callback(self) + self.triggered = False + self.status = None + self._id = None + + +class Message(object): + '''A message that can be received by or sent to a tasklet.''' + + _slots_ = 'name', 'dest', 'value', 'sender' + + ACCEPT, DEFER, DISCARD = range(3) + + def __init__(self, name, dest=None, value=None, sender=None): + ''' + @param name: name of message + @type name: str + @param dest: destination tasklet for this message + @type dest: L{Tasklet} + @param value: value associated with the message + @param sender: sender tasklet for this message + @type sender: L{Tasklet} + + ''' + assert isinstance(sender, (Tasklet, type(None))) + assert isinstance(dest, (Tasklet, type(None))) + assert isinstance(name, basestring) + self.name = name + self.value = value + self.sender = sender + self.dest = dest + +# def get_name(self): +# """Return the message name""" +# return self.name +# def get_value(self): +# """Return the message value""" +# return self.value +# def get_sender(self): +# """Return the message sender""" +# return self.sender +# def get_dest(self): +# """Return the message destination""" +# return self.dest + + +def _normalize_list_argument(arg, name): + """returns a list of strings from an argument that can be either + list of strings, None (returns []), or a single string returns + ([arg])""" + + if arg is None: + return [] + elif isinstance(arg, basestring): + return [arg] + elif isinstance(arg, (list, tuple)): + return arg + raise TypeError("Argument '%s' must be None, a string, or " + "a sequence of strings, not %r" % (name, type(arg))) + + +class WaitForMessages(WaitCondition): + '''An object that waits for messages to arrive''' + def __init__(self, accept=None, defer=None, discard=None): + '''Creates an object that waits for a set of messages to + arrive. + + @warning: unlike other wait conditions, when a message + is received, a L{Message} instance is returned by L{get_event()}, + not the L{WaitForMessages} instance. + @param accept: message name or names to accept (receive) in + the current state + @type accept: string or sequence of string + @param defer: message name or names to defer (queue) in the + current state + @type defer: string or sequence of string + @param discard: message name or names to discard (drop) in the + current state + @type discard: string or sequence of string + ''' + WaitCondition.__init__(self) + self._tasklet = None + accept = _normalize_list_argument(accept, 'accept') + defer = _normalize_list_argument(defer, 'defer') + discard = _normalize_list_argument(discard, 'discard') + self.actions = dict() + for name in accept: + self.actions[name] = Message.ACCEPT + for name in defer: + self.actions[name] = Message.DEFER + for name in discard: + self.actions[name] = Message.DISCARD + + def arm(self, tasklet): + '''Overrides WaitCondition.arm''' + self._tasklet = tasklet + tasklet.message_actions.update(self.actions) + + def disarm(self): + '''Overrides WaitCondition.disarm''' + assert self._tasklet is not None + for name in self.actions: + del self._tasklet.message_actions[name] + + +class Tasklet(object): + '''An object that launches and manages a tasklet.''' + + STATE_RUNNING, STATE_SUSPENDED, STATE_MSGSEND = range(3) + + def __init__(self, gen=None): + ''' + Launch a generator tasklet. + + @param gen: a generator object that implements the tasklet main body + + If `gen` is omitted or None, L{run} should be overridden in a + subclass. + + ''' + self._event = None + self._join_callbacks = {} + self.wait_list = [] + self._message_queue = [] + self._message_actions = {} + self.state = Tasklet.STATE_SUSPENDED + if gen is None: + self.gen = self.run() + else: + assert isinstance(gen, types.GeneratorType) + self.gen = gen + self._next_round() # bootstrap + + def get_message_actions(self): + """Dictionary mapping message names to actions ('accept' or + 'discard' or 'defer'). Should normally not be accessed + directly by the programmer. + """ + return self._message_actions + + message_actions = property(get_message_actions) + + def run(self): + """ + Method that executes the task. + + Should be overridden in a subclass if no generator is passed + into the constructor.""" + raise ValueError("Should be overridden in a subclass " + "if no generator is passed into the constructor") + + def _invoke(self): + global _event + assert _event is None + had_event = (self._event is not None) + _event = self._event + try: + self.state = Tasklet.STATE_RUNNING + gen_value = self.gen.next() + self.state = Tasklet.STATE_SUSPENDED + assert gen_value is not None + except StopIteration, ex: + if ex.args: + retval, = ex.args + else: + retval = None + self._join(retval) + return None + if __debug__: + if had_event and _event is not None: + warnings.warn("Tasklet %s forgot to read an event!" % self) + self._event = None + return gen_value + + def _next_round(self): + assert self.state == Tasklet.STATE_SUSPENDED + old_wait_list = self.wait_list + while True: # loop while tasklet yields tasklet.post_message(...) + + gen_value = self._invoke() + if gen_value is None: + return + + if isinstance(gen_value, Message): + msg = gen_value + self.state = Tasklet.STATE_MSGSEND + msg.dest.send_message(msg) + continue # loop because we posted a message + elif isinstance(gen_value, tuple): + self.wait_list = list(gen_value) + elif isinstance(gen_value, list): + self.wait_list = gen_value + else: + self.wait_list = [gen_value] + + for i, val in enumerate(self.wait_list): + if isinstance(val, WaitCondition): + continue + elif isinstance(val, types.GeneratorType): + self.wait_list[i] = WaitForTasklet(Tasklet(val)) + elif isinstance(val, Tasklet): + self.wait_list[i] = WaitForTasklet(val) + else: + raise TypeError("yielded values must be WaitConditions," + " generators, or a single Message") + + self._update_wait_conditions(old_wait_list) + + msg = self._dispatch_message() + if msg is not None: + self._event = msg + continue ## send a message + + break + + def _dispatch_message(self): + '''get next message that a tasklet wants to receive; discard + messages that should be discarded''' + ## while sending out messages, the tasklet implicitly queues + ## all incoming messages + if self.state == Tasklet.STATE_MSGSEND: + return None + + ## filter out messages with discard action + def _get_action(msg): + try: + return self._message_actions[msg.name] + except KeyError: + warnings.warn("Implicitly discarding message %s" + " directed to tasklet %s" % (msg, self)) + return Message.DISCARD + if __debug__: + self._message_queue = [msg + for msg in self._message_queue + if _get_action(msg) != Message.DISCARD] + else: + ## slightly more efficient version of the above + self._message_queue = [msg for msg in self._message_queue + if (self._message_actions.getdefault(msg.name, Message.DISCARD) + != Message.DISCARD)] + + ## find next ACCEPT-able message from queue, and pop it out + for idx, msg in enumerate(self._message_queue): + if self._message_actions[msg.name] == Message.ACCEPT: + break + else: + return None + return self._message_queue.pop(idx) + + + def _update_wait_conditions(self, old_wait_list): + '''disarm wait conditions removed and arm new wait conditions''' + + ## disarm conditions removed from the wait list + for cond in old_wait_list: + if cond not in self.wait_list: + cond.disarm() + + ## arm the conditions added to the wait list + for cond in self.wait_list: + if cond not in old_wait_list: + cond.arm(self) + + def wait_condition_fired(self, triggered_cond): + """Method that should be called when a wait condition fires""" + assert triggered_cond in self.wait_list + assert self._event is None + self._event = triggered_cond + self._next_round() + self._event = None + if self.wait_list is None: + return False + else: + return (triggered_cond in self.wait_list) + + def add_join_callback(self, callback): + ''' + Add a callable to be invoked when the tasklet finishes. + Return a connection handle that can be used in + remove_join_callback() + + The callback will be called like this:: + callback(tasklet, retval) + where tasklet is the tasklet that finished, and retval its + return value (or None). + + When a join callback is invoked, it is automatically removed, + so calling L{remove_join_callback} afterwards produces a KeyError + exception. + + ''' + handle = hash(callback) + while handle in self._join_callbacks: # handle collisions + handle += 1 + self._join_callbacks[handle] = callback + return handle + + def remove_join_callback(self, handle): + '''Remove a join callback previously added with L{add_join_callback}''' + del self._join_callbacks[handle] + + def _join(self, retval): + for cond in self.wait_list: + cond.disarm() + self.gen = None + self.wait_list = [] + callbacks = self._join_callbacks.values() + self._join_callbacks.clear() + for callback in callbacks: + callback(self, retval) + + def send_message(self, message): + """Send a message to be received by the tasklet as an event. + + @warning: Don't call this from another tasklet, only from the + main loop! To send a message from another tasklet, yield a + L{Message} with a correctly set 'dest' parameter. + + """ + assert isinstance(message, Message) + assert self._event is None + if message.dest is None: + message.dest = self + self._message_queue.append(message) + self._event = self._dispatch_message() + if self._event is not None: + self._next_round() diff --git a/kiwi/ui/__init__.py b/kiwi/ui/__init__.py new file mode 100644 index 0000000..1946454 --- /dev/null +++ b/kiwi/ui/__init__.py @@ -0,0 +1,39 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# + +"""User interface: Framework and Widget support""" + + +try: + import gtk + gtk +except ImportError: + try: + import pygtk + pygtk.require('2.0') + except: + pass + try: + import gtk + gtk + except ImportError: + raise SystemExit( + "PyGTK is required by kiwi.ui") diff --git a/kiwi/ui/comboboxentry.py b/kiwi/ui/comboboxentry.py new file mode 100644 index 0000000..9ef89b1 --- /dev/null +++ b/kiwi/ui/comboboxentry.py @@ -0,0 +1,129 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> + +"""Reimplementation of GtkComboBoxEntry in Python. + +The main difference between the L{BaseComboBoxEntry} and GtkComboBoxEntry +is that a {kiwi.ui.widgets.entry.Entry} is used instead of a GtkEntry.""" + +import gobject +import gtk + +from kiwi.python import deprecationwarn +from kiwi.ui.widgets.entry import ProxyEntry + +class BaseComboBoxEntry(gtk.ComboBox): + def __init__(self, model=None, text_column=-1): + deprecationwarn( + 'ComboBoxEntry is deprecated, use ComboEntry instead', + stacklevel=3) + + gtk.ComboBox.__init__(self) + self.entry = ProxyEntry() + # HACK: We need to set a private variable, this seems to + # be the only way of doing so + self.entry.start_editing(gtk.gdk.Event(gtk.gdk.BUTTON_PRESS)) + self.add(self.entry) + self.entry.show() + + self._text_renderer = gtk.CellRendererText() + self.pack_start(self._text_renderer, True) + self.set_active(-1) + self.entry_changed_id = self.entry.connect('changed', + self._on_entry__changed) + self._active_changed_id = self.connect("changed", + self._on_entry__active_changed) + self._has_frame_changed(None) + self.connect("notify::has-frame", self._has_frame_changed) + + if not model: + model = gtk.ListStore(str) + text_column = 0 + self.set_model(model) + self.set_text_column(text_column) + + # Virtual methods + def do_mnemnoic_activate(self, group_cycling): + self.entry.grab_focus() + return True + + def do_grab_focus(self): + self.entry.grab_focus() + + # Signal handlers + def _on_entry__active_changed(self, combobox): + iter = combobox.get_active_iter() + if not iter: + return + + self.entry.handler_block(self.entry_changed_id) + model = self.get_model() + self.entry.set_text(model[iter][self._text_column]) + self.entry.handler_unblock(self.entry_changed_id) + + def _has_frame_changed(self, pspec): + has_frame = self.get_property("has-frame") + self.entry.set_has_frame(has_frame) + + def _on_entry__changed(self, entry): + self.handler_block(self._active_changed_id) + self.set_active(-1) + self.handler_unblock(self._active_changed_id) + + # Public API + def set_text_column(self, text_column): + self._text_column = text_column + if text_column != -1: + self.set_attributes(self._text_renderer, text=text_column) + + def get_text_column(self): + return self._text_column + + # IconEntry + def set_pixbuf(self, pixbuf): + self.entry.set_pixbuf(pixbuf) + + def update_background(self, color): + self.entry.update_background(color) + + def get_icon_window(self): + return self.entry.get_icon_window() + +gobject.type_register(BaseComboBoxEntry) + +def test(): + win = gtk.Window() + win.connect('delete-event', gtk.main_quit) + + e = BaseComboBoxEntry() + win.add(e) + + m = gtk.ListStore(str) + m.append(['foo']) + m.append(['bar']) + m.append(['baz']) + e.set_model(m) + win.show_all() + gtk.main() + +if __name__ == '__main__': + test() diff --git a/kiwi/ui/comboentry.py b/kiwi/ui/comboentry.py new file mode 100644 index 0000000..11ee92f --- /dev/null +++ b/kiwi/ui/comboentry.py @@ -0,0 +1,540 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +"""Widget for displaying a list of objects""" + +import gtk +from gtk import gdk, keysyms + +from kiwi.ui.entry import KiwiEntry +from kiwi.utils import gsignal, type_register + +class _ComboEntryPopup(gtk.Window): + gsignal('text-selected', str) + def __init__(self, comboentry): + gtk.Window.__init__(self, gtk.WINDOW_POPUP) + self.add_events(gdk.BUTTON_PRESS_MASK) + self.connect('key-press-event', self._on__key_press_event) + self.connect('button-press-event', self._on__button_press_event) + self._comboentry = comboentry + + # Number of visible rows in the popup window, sensible + # default value from other toolkits + self._visible_rows = 10 + self._initial_text = None + + frame = gtk.Frame() + frame.set_shadow_type(gtk.SHADOW_ETCHED_OUT) + self.add(frame) + frame.show() + + vbox = gtk.VBox() + frame.add(vbox) + vbox.show() + + self._sw = gtk.ScrolledWindow() + self._sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER) + vbox.pack_start(self._sw) + self._sw.show() + + self._model = gtk.ListStore(str) + self._treeview = gtk.TreeView(self._model) + self._treeview.set_enable_search(False) + self._treeview.connect('motion-notify-event', + self._on_treeview__motion_notify_event) + self._treeview.connect('button-release-event', + self._on_treeview__button_release_event) + self._treeview.add_events(gdk.BUTTON_PRESS_MASK) + self._selection = self._treeview.get_selection() + self._selection.set_mode(gtk.SELECTION_BROWSE) + self._treeview.append_column( + gtk.TreeViewColumn('Foo', gtk.CellRendererText(), + text=0)) + self._treeview.set_headers_visible(False) + self._sw.add(self._treeview) + self._treeview.show() + + self._label = gtk.Label() + vbox.pack_start(self._label, False, False) + + self.set_resizable(False) + self.set_screen(comboentry.get_screen()) + + def popup(self, text=None): + """ + Shows the list of options. And optionally selects an item + @param text: text to select + """ + combo = self._comboentry + if not (combo.flags() & gtk.REALIZED): + return + + treeview = self._treeview + toplevel = combo.get_toplevel() + if isinstance(toplevel, gtk.Window) and toplevel.group: + toplevel.group.add_window(self) + + # width is meant for the popup window + # height is meant for the treeview, since it calculates using + # the height of the cells on the rows + x, y, width, height = self._get_position() + self.set_size_request(width, -1) + treeview.set_size_request(-1, height) + self.move(x, y) + self.show() + + treeview.set_hover_expand(True) + selection = treeview.get_selection() + if text: + for row in treeview.get_model(): + if text in row: + selection.select_iter(row.iter) + treeview.scroll_to_cell(row.path, use_align=True, + row_align=0.5) + treeview.set_cursor(row.path) + break + self.grab_focus() + + if not (self._treeview.flags() & gtk.HAS_FOCUS): + self._treeview.grab_focus() + + if not self._popup_grab_window(): + self.hide() + return + + self.grab_add() + + def popdown(self): + combo = self._comboentry + if not (combo.flags() & gtk.REALIZED): + return + + self.grab_remove() + self.hide() + + def set_label_text(self, text): + if text is None: + text = '' + self._label.hide() + else: + self._label.show() + self._label.set_text(text) + + def set_model(self, model): + self._treeview.set_model(model) + self._model = model + + # Callbacks + + def _on__key_press_event(self, window, event): + """ + Mimics Combobox behavior + + Escape or Alt+Up: Close + Enter, Return or Space: Select + """ + + keyval = event.keyval + state = event.state & gtk.accelerator_get_default_mod_mask() + if (keyval == keysyms.Escape or + ((keyval == keysyms.Up or keyval == keysyms.KP_Up) and + state == gdk.MOD1_MASK)): + self.popdown() + return True + elif keyval == keysyms.Tab: + self.popdown() + # XXX: private member of comboentry + self._comboentry._button.grab_focus() + return True + elif (keyval == keysyms.Return or + keyval == keysyms.space or + keyval == keysyms.KP_Enter or + keyval == keysyms.KP_Space): + model, treeiter = self._selection.get_selected() + self.emit('text-selected', model[treeiter][0]) + return True + + return False + + def _on__button_press_event(self, window, event): + # If we're clicking outside of the window + # close the popup + if (event.window != self.window or + (tuple(self.allocation.intersect( + gdk.Rectangle(x=int(event.x), y=int(event.y), + width=1, height=1)))) == (0, 0, 0, 0)): + self.popdown() + + def _on_treeview__motion_notify_event(self, treeview, event): + retval = treeview.get_path_at_pos(int(event.x), + int(event.y)) + if not retval: + return + path, column, x, y = retval + self._selection.select_path(path) + self._treeview.set_cursor(path) + + def _on_treeview__button_release_event(self, treeview, event): + retval = treeview.get_path_at_pos(int(event.x), + int(event.y)) + if not retval: + return + path, column, x, y = retval + + model = treeview.get_model() + self.emit('text-selected', model[path][0]) + + def _popup_grab_window(self): + activate_time = 0L + if gdk.pointer_grab(self.window, True, + (gdk.BUTTON_PRESS_MASK | + gdk.BUTTON_RELEASE_MASK | + gdk.POINTER_MOTION_MASK), + None, None, activate_time) == 0: + if gdk.keyboard_grab(self.window, True, activate_time) == 0: + return True + else: + self.window.get_display().pointer_ungrab(activate_time); + return False + return False + + def _get_position(self): + treeview = self._treeview + treeview.realize() + + sample = self._comboentry + + # We need to fetch the coordinates of the entry window + # since comboentry itself does not have a window + x, y = sample.entry.window.get_origin() + width = sample.allocation.width + + hpolicy = vpolicy = gtk.POLICY_NEVER + self._sw.set_policy(hpolicy, vpolicy) + + pwidth = self.size_request()[0] + if pwidth > width: + self._sw.set_policy(gtk.POLICY_ALWAYS, vpolicy) + pwidth, pheight = self.size_request() + + rows = len(self._model) + if rows > self._visible_rows: + rows = self._visible_rows + self._sw.set_policy(hpolicy, gtk.POLICY_ALWAYS) + + focus_padding = treeview.style_get_property('focus-line-width') * 2 + cell_height = treeview.get_column(0).cell_get_size()[4] + height = (cell_height + focus_padding) * rows + + screen = self._comboentry.get_screen() + monitor_num = screen.get_monitor_at_window(sample.window) + monitor = screen.get_monitor_geometry(monitor_num) + + if x < monitor.x: + x = monitor.x + elif x + width > monitor.x + monitor.width: + x = monitor.x + monitor.width - width + + if y + sample.allocation.height + height <= monitor.y + monitor.height: + y += sample.allocation.height + elif y - height >= monitor.y: + y -= height + elif (monitor.y + monitor.height - (y + sample.allocation.height) > + y - monitor.y): + y += sample.allocation.height + height = monitor.y + monitor.height - y + else : + height = y - monitor.y + y = monitor.y + + # Use half of the available screen space + max_height = monitor.height / 2 + if height > max_height: + height = int(max_height) + elif height < 0: + height = 0 + + return x, y, width, height + + def get_selected_iter(self): + return self._selection.get_selected()[1] + + def set_selected_iter(self, iter): + self._selection.select_iter(iter) +type_register(_ComboEntryPopup) + +class ComboEntry(gtk.HBox): + gsignal('changed') + gsignal('activate') + def __init__(self, entry=None): + """ + @param entry: a gtk.Entry subclass to use + """ + gtk.HBox.__init__(self) + self._popping_down = False + + if not entry: + entry = KiwiEntry() + + self.entry = entry + self.entry.connect('activate', + self._on_entry__activate) + self.entry.connect('changed', + self._on_entry__changed) + self.entry.connect('scroll-event', + self._on_entry__scroll_event) + self.entry.connect('key-press-event', + self._on_entry__key_press_event) + self.pack_start(self.entry, True, True) + self.entry.show() + + self._button = gtk.ToggleButton() + self._button.connect('scroll-event', self._on_entry__scroll_event) + self._button.connect('toggled', self._on_button__toggled) + self._button.set_focus_on_click(False) + self.pack_end(self._button, False, False) + self._button.show() + + arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_NONE) + self._button.add(arrow) + arrow.show() + + self._popup = _ComboEntryPopup(self) + self._popup.connect('text-selected', self._on_popup__text_selected) + self._popup.connect('hide', self._on_popup__hide) + self._popup.set_size_request(-1, 24) + + completion = gtk.EntryCompletion() + self.entry.set_completion(completion) + self.set_model(completion.get_model()) + + # Virtual methods + + def do_grab_focus(self): + self.entry.grab_focus() + + # Callbacks + + def _on_entry_completion__match_selected(self, completion, model, iter): + # the iter we receive is specific to the tree model filter used + # In the entry completion, convert it to an iter in the real model + self.set_active_iter(model.convert_iter_to_child_iter(iter)) + + def _on_entry__activate(self, entry): + self.emit('activate') + + def _on_entry__changed(self, entry): + self.emit('changed') + + def _on_entry__scroll_event(self, entry, event): + model = self.get_model() + treeiter = self._popup.get_selected_iter() + # If nothing is selected, select the first one + if not treeiter: + self.set_active_iter(model[0].iter) + return + + curr = model[treeiter].path[0] + # Scroll up, select the previous item + if event.direction == gdk.SCROLL_UP: + curr -= 1 + if curr >= 0: + self.set_active_iter(model[curr].iter) + # Scroll down, select the next item + elif event.direction == gdk.SCROLL_DOWN: + curr += 1 + if curr < len(model): + self.set_active_iter(model[curr].iter) + + def _on_entry__key_press_event(self, entry, event): + """ + Mimics Combobox behavior + + Alt+Down: Open popup + """ + keyval, state = event.keyval, event.state + state &= gtk.accelerator_get_default_mod_mask() + if ((keyval == keysyms.Down or keyval == keysyms.KP_Down) and + state == gdk.MOD1_MASK): + self.popup() + return True + + def _on_popup__hide(self, popup): + self._popping_down = True + self._button.set_active(False) + self._popping_down = False + + def _on_popup__text_selected(self, popup, text): + self.entry.set_text(text) + popup.popdown() + self.entry.grab_focus() + self.entry.set_position(len(self.entry.get_text())) + self.emit('changed') + + def _on_button__toggled(self, button): + if self._popping_down: + return + self.popup() + + # Private + + def _update(self): + model = self._model + if not len(model): + return + + iter = self._popup.get_selected_iter() + if not iter: + iter = model[0].iter + self._popup.set_selected_iter(iter) + + # Public API + + def clicked(self): + pass + + def popup(self): + """ + Hide the popup window + """ + self._popup.popup(self.entry.get_text()) + + def popdown(self): + """ + Show the popup window + """ + self._popup.popdown() + + # Entry interface + + def set_text(self, text): + """ + @param text: + """ + self.entry.set_text(text) + + def get_text(self): + """ + @returns: current text + """ + return self.entry.get_text() + + # ComboMixin interface + + def set_model(self, model): + """ + Set the tree model to model + @param model: new model + @type model: gtk.TreeModel + """ + self._model = model + self._popup.set_model(model) + completion = self.entry.get_completion() + completion.connect('match-selected', + self._on_entry_completion__match_selected) + completion.set_model(model) + + self._update() + + def get_model(self): + """ + @returns: our model + @rtype: gtk.TreeModel + """ + return self._model + + def set_active_iter(self, iter): + """ + @param iter: iter to select + @type iter: gtk.TreeIter + """ + self._popup.set_selected_iter(iter) + self.set_text(self._model[iter][0]) + + def get_active_iter(self): + """ + @returns: the selected iter + @rtype: gtk.TreeIter + """ + return self._popup.get_selected_iter() + + def prefill(self, itemdata, sort=False): + """ + See L{kiwi.ui.widgets.entry} + """ + self._model.clear() + self.entry.prefill(itemdata, sort) + + def select_item_by_data(self, data): + """ + @param data: object to select + """ + treeiter = self.entry.get_iter_by_data(data) + self.set_active_iter(treeiter) + + def select_item_by_label(self, text): + """ + @param text: text to select + """ + treeiter = self.entry.get_iter_by_label(text) + self.set_active_iter(treeiter) + + def get_selected(self): + """ + @returns: selected text or item or None if nothing + is selected + """ + treeiter = self.get_active_iter() + if treeiter: + return self.entry.get_selected_by_iter(treeiter) + + def get_selected_label(self): + """ + @returns: the label of the currently selected item + """ + treeiter = self.get_active_iter() + if treeiter: + return self.entry.get_selected_label(treeiter) + + def select(self, obj): + """ + @param obj: data or text to select + """ + treeiter = self.entry.get_iter_from_obj(obj) + self.set_active_iter(treeiter) + + def set_label_text(self, text): + self._popup.set_label_text(text) + + # IconEntry + + def set_pixbuf(self, pixbuf): + self.entry.set_pixbuf(pixbuf) + + def update_background(self, color): + self.entry.update_background(color) + + def get_icon_window(self): + return self.entry.get_icon_window() + +type_register(ComboEntry) diff --git a/kiwi/ui/combomixin.py b/kiwi/ui/combomixin.py new file mode 100644 index 0000000..d15e961 --- /dev/null +++ b/kiwi/ui/combomixin.py @@ -0,0 +1,231 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# + +import gtk + +(COL_COMBO_LABEL, + COL_COMBO_DATA) = range(2) + +(COMBO_MODE_UNKNOWN, + COMBO_MODE_STRING, + COMBO_MODE_DATA) = range(3) + +class ComboMixin(object): + """Our combos always have one model with two columns, one for the string + that is displayed and one for the object it cames from. + """ + def __init__(self): + """Call this constructor after the Combo one""" + model = gtk.ListStore(str, object) + self.set_model(model) + self.mode = COMBO_MODE_UNKNOWN + + def set_mode(self, mode): + if self.mode != COMBO_MODE_UNKNOWN: + raise AssertionError + self.mode = mode + + def __nonzero__(self): + return True + + def __len__(self): + return len(self.get_model()) + + def prefill(self, itemdata, sort=False): + """Fills the Combo with listitems corresponding to the itemdata + provided. + + Parameters: + - itemdata is a list of strings or tuples, each item corresponding + to a listitem. The simple list format is as follows:: + + >>> [ label0, label1, label2 ] + + If you require a data item to be specified for each item, use a + 2-item tuple for each element. The format is as follows:: + + >>> [ ( label0, data0 ), (label1, data1), ... ] + + - Sort is a boolean that specifies if the list is to be sorted by + label or not. By default it is not sorted + """ + if not isinstance(itemdata, (list, tuple)): + raise TypeError("'data' parameter must be a list or tuple of item " + "descriptions, found %s") % type(itemdata) + + self.clear() + if len(itemdata) == 0: + return + + if self.mode == COMBO_MODE_UNKNOWN: + first = itemdata[0] + if isinstance(first, basestring): + self.set_mode(COMBO_MODE_STRING) + elif isinstance(first, (tuple, list)): + self.set_mode(COMBO_MODE_DATA) + else: + raise TypeError("Could not determine type, items must " + "be strings or tuple/list") + + mode = self.mode + model = self.get_model() + + values = {} + if mode == COMBO_MODE_STRING: + if sort: + itemdata.sort() + + for item in itemdata: + if item in values: + raise KeyError("Tried to insert duplicate value " + "%s into Combo!" % item) + else: + values[item] = None + + model.append((item, None)) + elif mode == COMBO_MODE_DATA: + if sort: + itemdata.sort(lambda x, y: cmp(x[0], y[0])) + + for item in itemdata: + text, data = item + if text in values: + raise KeyError("Tried to insert duplicate value " + "%s into Combo!" % item) + else: + values[text] = None + model.append((text, data)) + else: + raise TypeError("Incorrect format for itemdata; see " + "docstring for more information") + + def append_item(self, label, data=None): + """ Adds a single item to the Combo. Takes: + - label: a string with the text to be added + - data: the data to be associated with that item + """ + if not isinstance(label, basestring): + raise TypeError("label must be string, found %s" % label) + + if self.mode == COMBO_MODE_UNKNOWN: + if data is not None: + self.set_mode(COMBO_MODE_DATA) + else: + self.set_mode(COMBO_MODE_STRING) + + model = self.get_model() + if self.mode == COMBO_MODE_STRING: + if data is not None: + raise TypeError("data can not be specified in string mode") + model.append((label, None)) + elif self.mode == COMBO_MODE_DATA: + if data is None: + raise TypeError("data must be specified in string mode") + model.append((label, data)) + else: + raise AssertionError + + def clear(self): + """Removes all items from list""" + model = self.get_model() + model.clear() + + def select(self, data): + mode = self.mode + if self.mode == COMBO_MODE_STRING: + self.select_item_by_label(data) + elif self.mode == COMBO_MODE_DATA: + self.select_item_by_data(data) + else: + # XXX: When setting the datatype to non string, automatically go to + # data mode + raise TypeError("unknown ComboBox mode. Did you call prefill?") + + def select_item_by_position(self, pos): + self.set_active(pos) + + def select_item_by_label(self, label): + model = self.get_model() + for row in model: + if row[COL_COMBO_LABEL] == label: + self.set_active_iter(row.iter) + break + else: + raise KeyError("No item correspond to label %r in the combo %s" + % (label, self.name)) + + def select_item_by_data(self, data): + if self.mode != COMBO_MODE_DATA: + raise TypeError("select_item_by_data can only be used in data mode") + + model = self.get_model() + for row in model: + if row[COL_COMBO_DATA] == data: + self.set_active_iter(row.iter) + break + else: + raise KeyError("No item correspond to data %r in the combo %s" + % (data, self.name)) + + def get_model_strings(self): + return [row[COL_COMBO_LABEL] for row in self.get_model()] + + def get_model_items(self): + if self.mode != COMBO_MODE_DATA: + raise TypeError("get_model_items can only be used in data mode") + + model = self.get_model() + items = {} + for row in model: + items[row[COL_COMBO_LABEL]] = row[COL_COMBO_DATA] + + return items + + def get_selected_label(self): + iter = self.get_active_iter() + if not iter: + return + + model = self.get_model() + return model[iter][COL_COMBO_LABEL] + + def get_selected_data(self): + if self.mode != COMBO_MODE_DATA: + raise TypeError("get_selected_data can only be used in data mode") + + iter = self.get_active_iter() + if not iter: + return + + model = self.get_model() + return model[iter][COL_COMBO_DATA] + + def get_selected(self): + mode = self.mode + if mode == COMBO_MODE_STRING: + return self.get_selected_label() + elif mode == COMBO_MODE_DATA: + return self.get_selected_data() + else: + raise AssertionError diff --git a/kiwi/ui/dateentry.py b/kiwi/ui/dateentry.py new file mode 100644 index 0000000..90d675e --- /dev/null +++ b/kiwi/ui/dateentry.py @@ -0,0 +1,352 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +# +# Based on date cell renderer in Planner written by Richard Hult +# and Mikael Hallendal +# + +import gettext +import datetime + +import gtk +from gtk import gdk, keysyms + +from kiwi.datatypes import converter, ValidationError +from kiwi.utils import gsignal, type_register + +_ = lambda m: gettext.dgettext('kiwi', m) + +date_converter = converter.get_converter(datetime.date) + +class _DateEntryPopup(gtk.Window): + gsignal('date-selected', object) + def __init__(self, dateentry): + gtk.Window.__init__(self, gtk.WINDOW_POPUP) + self.add_events(gdk.BUTTON_PRESS_MASK) + self.connect('key-press-event', self._on__key_press_event) + self.connect('button-press-event', self._on__button_press_event) + self._dateentry = dateentry + + frame = gtk.Frame() + frame.set_shadow_type(gtk.SHADOW_ETCHED_IN) + self.add(frame) + frame.show() + + vbox = gtk.VBox() + vbox.set_border_width(6) + frame.add(vbox) + vbox.show() + self._vbox = vbox + + self.calendar = gtk.Calendar() + self.calendar.connect('day-selected-double-click', + self._on_calendar__day_selected_double_click) + vbox.pack_start(self.calendar, False, False) + self.calendar.show() + + buttonbox = gtk.HButtonBox() + buttonbox.set_border_width(6) + buttonbox.set_layout(gtk.BUTTONBOX_SPREAD) + vbox.pack_start(buttonbox, False, False) + buttonbox.show() + + for label, callback in [(_('_Today'), self._on_today__clicked), + (_('_Cancel'), self._on_cancel__clicked), + (_('_Select'), self._on_select__clicked)]: + button = gtk.Button(label, use_underline=True) + button.connect('clicked', callback) + buttonbox.pack_start(button) + button.show() + + self.set_resizable(False) + self.set_screen(dateentry.get_screen()) + + self.realize() + self.height = self._vbox.size_request()[1] + + def _on_calendar__day_selected_double_click(self, calendar): + self.emit('date-selected', self.get_date()) + + def _on__button_press_event(self, window, event): + # If we're clicking outside of the window close the popup + if tuple(self.allocation.intersect( + gdk.Rectangle(x=int(event.x), y=int(event.y), + width=1, height=1))) == (0, 0, 0, 0): + self.popdown() + + # XXX: Clicking on button + entry + + def _on__key_press_event(self, window, event): + """ + Mimics Combobox behavior + + Escape or Alt+Up: Close + Enter, Return or Space: Select + """ + + keyval = event.keyval + state = event.state & gtk.accelerator_get_default_mod_mask() + if (keyval == keysyms.Escape or + ((keyval == keysyms.Up or keyval == keysyms.KP_Up) and + state == gdk.MOD1_MASK)): + self.popdown() + return True + elif keyval == keysyms.Tab: + self.popdown() + # XXX: private member of dateentry + self._comboentry._button.grab_focus() + return True + elif (keyval == keysyms.Return or + keyval == keysyms.space or + keyval == keysyms.KP_Enter or + keyval == keysyms.KP_Space): + self.emit('date-selected', self.get_date()) + return True + + return False + + def _on_select__clicked(self, button): + self.emit('date-selected', self.get_date()) + + def _on_cancel__clicked(self, button): + self.popdown() + + def _on_today__clicked(self, button): + self.set_date(datetime.date.today()) + + def _popup_grab_window(self): + activate_time = 0L + if gdk.pointer_grab(self.window, True, + (gdk.BUTTON_PRESS_MASK | + gdk.BUTTON_RELEASE_MASK | + gdk.POINTER_MOTION_MASK), + None, None, activate_time) == 0: + if gdk.keyboard_grab(self.window, True, activate_time) == 0: + return True + else: + self.window.get_display().pointer_ungrab(activate_time); + return False + return False + + def _get_position(self): + self.realize() + calendar = self + + sample = self._dateentry + + # We need to fetch the coordinates of the entry window + # since comboentry itself does not have a window + x, y = sample.entry.window.get_origin() + width, height = calendar.size_request() + height = self.height + + screen = sample.get_screen() + monitor_num = screen.get_monitor_at_window(sample.window) + monitor = screen.get_monitor_geometry(monitor_num) + + if x < monitor.x: + x = monitor.x + elif x + width > monitor.x + monitor.width: + x = monitor.x + monitor.width - width + + if y + sample.allocation.height + height <= monitor.y + monitor.height: + y += sample.allocation.height + elif y - height >= monitor.y: + y -= height + elif (monitor.y + monitor.height - (y + sample.allocation.height) > + y - monitor.y): + y += sample.allocation.height + height = monitor.y + monitor.height - y + else : + height = y - monitor.y + y = monitor.y + + return x, y, width, height + + def popup(self, date): + """ + Shows the list of options. And optionally selects an item + @param date: date to select + """ + combo = self._dateentry + if not (combo.flags() & gtk.REALIZED): + return + + treeview = self.calendar + if treeview.flags() & gtk.MAPPED: + return + toplevel = combo.get_toplevel() + if isinstance(toplevel, gtk.Window) and toplevel.group: + toplevel.group.add_window(self) + + x, y, width, height = self._get_position() + self.set_size_request(width, height) + self.move(x, y) + self.show_all() + + if date: + self.set_date(date) + self.grab_focus() + + if not (self.calendar.flags() & gtk.HAS_FOCUS): + self.calendar.grab_focus() + + if not self._popup_grab_window(): + self.hide() + return + + self.grab_add() + + def popdown(self): + combo = self._dateentry + if not (combo.flags() & gtk.REALIZED): + return + + self.grab_remove() + self.hide_all() + + # month in gtk.Calendar is zero-based (i.e the allowed values are 0-11) + # datetime one-based (i.e. the allowed values are 1-12) + # So convert between them + + def get_date(self): + y, m, d = self.calendar.get_date() + return datetime.date(y, m + 1, d) + + def set_date(self, date): + self.calendar.select_month(date.month - 1, date.year) + self.calendar.select_day(date.day) + # FIXME: Only mark the day in the current month? + self.calendar.clear_marks() + self.calendar.mark_day(date.day) + +class DateEntry(gtk.HBox): + gsignal('changed') + gsignal('activate') + def __init__(self): + gtk.HBox.__init__(self) + + self._popping_down = False + self._old_date = None + + # bootstrap problems, kiwi.ui.widgets.entry imports dateentry + # we need to use a proxy entry because we want the mask + from kiwi.ui.widgets.entry import ProxyEntry + self.entry = ProxyEntry() + self.entry.connect('changed', self._on_entry__changed) + self.entry.set_mask_for_data_type(datetime.date) + mask = self.entry.get_mask() + if mask: + self.entry.set_width_chars(len(mask)) + self.pack_start(self.entry, False, False) + self.entry.show() + + self._button = gtk.ToggleButton() + self._button.connect('scroll-event', self._on_entry__scroll_event) + self._button.connect('toggled', self._on_button__toggled) + self._button.set_focus_on_click(False) + self.pack_start(self._button, False, False) + self._button.show() + + arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_NONE) + self._button.add(arrow) + arrow.show() + + self._popup = _DateEntryPopup(self) + self._popup.connect('date-selected', self._on_popup__date_selected) + self._popup.connect('hide', self._on_popup__hide) + self._popup.set_size_request(-1, 24) + + # Virtual methods + + def do_grab_focus(self): + self.entry.grab_focus() + + # Callbacks + + def _on_entry__changed(self, entry): + self._changed(self.get_date()) + + def _on_entry__activate(self, entry): + self.emit('activate') + + def _on_entry__scroll_event(self, entry, event): + if event.direction == gdk.SCROLL_UP: + days = 1 + elif event.direction == gdk.SCROLL_DOWN: + days = -1 + else: + return + + date = self.get_date() + if not date: + newdate = datetime.date.today() + else: + newdate = date + datetime.timedelta(days=days) + self.set_date(newdate) + + def _on_button__toggled(self, button): + if self._popping_down: + return + + self._popup.popup(self.get_date()) + + def _on_popup__hide(self, popup): + self._popping_down = True + self._button.set_active(False) + self._popping_down = False + + def _on_popup__date_selected(self, popup, date): + self.set_date(date) + popup.popdown() + self.entry.grab_focus() + self.entry.set_position(len(self.entry.get_text())) + self._changed(date) + + def _changed(self, date): + if self._old_date != date: + self.emit('changed') + self._old_date = date + + # Public API + + def set_date(self, date): + """ + @param date: a datetime.date instance + """ + if not isinstance(date, datetime.date): + raise TypeError("date must be a datetime.date instance") + + self.entry.set_text(date_converter.as_string(date)) + + def get_date(self): + """ + @returns: the currently selected day + """ + try: + return date_converter.from_string(self.entry.get_text()) + except ValidationError: + pass + +type_register(DateEntry) diff --git a/kiwi/ui/delegates.py b/kiwi/ui/delegates.py new file mode 100644 index 0000000..e183229 --- /dev/null +++ b/kiwi/ui/delegates.py @@ -0,0 +1,103 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2002, 2003 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# Johan Dahlin <jdahlin@async.com.br> +# + +"""Defines the Delegate classes that are included in the Kiwi Framework.""" + +from kiwi.ui.views import SlaveView, BaseView +from kiwi.controllers import BaseController + +class SlaveDelegate(SlaveView, BaseController): + """A class that combines view and controller functionality into a + single package. It does not possess a top-level window, but is instead + intended to be plugged in to a View or Delegate using attach_slave(). + """ + def __init__(self, toplevel=None, widgets=(), gladefile=None, + gladename=None, toplevel_name=None, domain=None, + keyactions=None): + """ + The keyactions parameter is sent to L{kiwi.controllers.BaseController}, + the rest are sent to L{kiwi.ui.views.SlaveView} + """ + SlaveView.__init__(self, toplevel, widgets, gladefile, gladename, + toplevel_name, domain) + BaseController.__init__(self, view=self, keyactions=keyactions) + +class Delegate(BaseView, BaseController): + """A class that combines view and controller functionality into a + single package. The Delegate class possesses a top-level window. + """ + def __init__(self, toplevel=None, widgets=(), gladefile=None, + gladename=None, toplevel_name=None, domain=None, + delete_handler=None, keyactions=None): + """Creates a new Delegate. + The keyactions parameter is sent to L{kiwi.controllers.BaseController}, + the rest are sent to L{kiwi.ui.views.BaseView} + """ + + BaseView.__init__(self, toplevel, widgets, gladefile, + gladename, toplevel_name, domain, + delete_handler) + BaseController.__init__(self, view=self, keyactions=keyactions) + +class ProxyDelegate(Delegate): + """A class that combines view, controller and proxy functionality into a + single package. The Delegate class possesses a top-level window. + + @ivar model: the model + @ivar proxy: the proxy + """ + def __init__(self, model, proxy_widgets=None, gladefile=None, + toplevel=None, widgets=(), gladename=None, + toplevel_name=None, domain=None, delete_handler=None, + keyactions=None): + """Creates a new Delegate. + @param model: instance to be attached + @param proxy_widgets: + The keyactions parameter is sent to L{kiwi.controllers.BaseController}, + the rest are sent to L{kiwi.ui.views.BaseView} + """ + + BaseView.__init__(self, toplevel, widgets, gladefile, + gladename, toplevel_name, domain, + delete_handler) + self.model = model + self.proxy = self.add_proxy(model, proxy_widgets) + self.proxy.proxy_updated = self.proxy_updated + + BaseController.__init__(self, view=self, keyactions=keyactions) + + def set_model(self, model): + """ + @param model: + """ + self.proxy.set_model(model) + self.model = model + + def proxy_updated(self, widget, attribute, value): + # Can be overriden in subclasses + pass + + def update(self, attribute): + self.proxy.update(attribute) diff --git a/kiwi/ui/dialogs.py b/kiwi/ui/dialogs.py new file mode 100644 index 0000000..6ee8f8a --- /dev/null +++ b/kiwi/ui/dialogs.py @@ -0,0 +1,326 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005,2006 Async Open Source +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License +# as published by the Free Software Foundation; either version 2 +# 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 Lesser General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +import os +import gettext + +import atk +import gtk + +__all__ = ['error', 'info', 'messagedialog', 'warning', 'yesno', 'save', + 'open', 'HIGAlertDialog', 'BaseDialog'] + +_ = gettext.gettext + +_IMAGE_TYPES = { + gtk.MESSAGE_INFO: gtk.STOCK_DIALOG_INFO, + gtk.MESSAGE_WARNING : gtk.STOCK_DIALOG_WARNING, + gtk.MESSAGE_QUESTION : gtk.STOCK_DIALOG_QUESTION, + gtk.MESSAGE_ERROR : gtk.STOCK_DIALOG_ERROR, +} + +_BUTTON_TYPES = { + gtk.BUTTONS_NONE: (), + gtk.BUTTONS_OK: (gtk.STOCK_OK, gtk.RESPONSE_OK,), + gtk.BUTTONS_CLOSE: (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE,), + gtk.BUTTONS_CANCEL: (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,), + gtk.BUTTONS_YES_NO: (gtk.STOCK_NO, gtk.RESPONSE_NO, + gtk.STOCK_YES, gtk.RESPONSE_YES), + gtk.BUTTONS_OK_CANCEL: (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OK, gtk.RESPONSE_OK) + } + +class HIGAlertDialog(gtk.Dialog): + def __init__(self, parent, flags, + type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_NONE): + if not type in _IMAGE_TYPES: + raise TypeError( + "type must be one of: %s", ', '.join(_IMAGE_TYPES.keys())) + if not buttons in _BUTTON_TYPES: + raise TypeError( + "buttons be one of: %s", ', '.join(_BUTTON_TYPES.keys())) + + gtk.Dialog.__init__(self, '', parent, flags) + self.set_border_width(5) + self.set_resizable(False) + self.set_has_separator(False) + # Some window managers (ION) displays a default title (???) if + # the specified one is empty, workaround this by setting it + # to a single space instead + self.set_title(" ") + self.set_skip_taskbar_hint(True) + self.vbox.set_spacing(14) + self.get_accessible().set_role(atk.ROLE_ALERT) + + self._primary_label = gtk.Label() + self._secondary_label = gtk.Label() + self._details_label = gtk.Label() + self._image = gtk.image_new_from_stock(_IMAGE_TYPES[type], + gtk.ICON_SIZE_DIALOG) + self._image.set_alignment(0.5, 0.0) + + self._primary_label.set_use_markup(True) + for label in (self._primary_label, self._secondary_label, + self._details_label): + label.set_line_wrap(True) + label.set_selectable(True) + label.set_alignment(0.0, 0.5) + + hbox = gtk.HBox(False, 12) + hbox.set_border_width(5) + hbox.pack_start(self._image, False, False) + + vbox = gtk.VBox(False, 0) + hbox.pack_start(vbox, False, False) + vbox.pack_start(self._primary_label, False, False) + vbox.pack_start(self._secondary_label, False, False) + + self._expander = gtk.expander_new_with_mnemonic( + _("Show more _details")) + self._expander.set_spacing(6) + self._expander.add(self._details_label) + vbox.pack_start(self._expander, False, False) + self.vbox.pack_start(hbox, False, False) + hbox.show_all() + self._expander.hide() + self.add_buttons(*_BUTTON_TYPES[buttons]) + + def set_primary(self, text): + self._primary_label.set_markup( + "<span weight=\"bold\" size=\"larger\">%s</span>" % text) + + def set_secondary(self, text): + self._secondary_label.set_markup(text) + + def set_details(self, text): + self._details_label.set_text(text) + self._expander.show() + + def set_details_widget(self, widget): + self._expander.remove(self._details_label) + self._expander.add(widget) + widget.show() + self._expander.show() + +class BaseDialog(gtk.Dialog): + def __init__(self, parent=None, title='', flags=0, buttons=()): + if parent and not isinstance(parent, gtk.Window): + raise TypeError("parent needs to be None or a gtk.Window subclass") + + if not flags and parent: + flags &= (gtk.DIALOG_MODAL | + gtk.DIALOG_DESTROY_WITH_PARENT) + + gtk.Dialog.__init__(self, title=title, parent=parent, + flags=flags, buttons=buttons) + self.set_border_width(6) + self.set_has_separator(False) + self.vbox.set_spacing(6) + +def messagedialog(dialog_type, short, long=None, parent=None, + buttons=gtk.BUTTONS_OK, default=-1): + """Create and show a MessageDialog. + + @param dialog_type: one of constants + - gtk.MESSAGE_INFO + - gtk.MESSAGE_WARNING + - gtk.MESSAGE_QUESTION + - gtk.MESSAGE_ERROR + @param short: A header text to be inserted in the dialog. + @param long: A long description of message. + @param parent: The parent widget of this dialog + @type parent: a gtk.Window subclass + @param buttons: The button type that the dialog will be display, + one of the constants: + - gtk.BUTTONS_NONE + - gtk.BUTTONS_OK + - gtk.BUTTONS_CLOSE + - gtk.BUTTONS_CANCEL + - gtk.BUTTONS_YES_NO + - gtk.BUTTONS_OK_CANCEL + or a tuple or 2-sized tuples representing label and response. If label + is a stock-id a stock icon will be displayed. + @param default: optional default response id + """ + if buttons in (gtk.BUTTONS_NONE, gtk.BUTTONS_OK, gtk.BUTTONS_CLOSE, + gtk.BUTTONS_CANCEL, gtk.BUTTONS_YES_NO, + gtk.BUTTONS_OK_CANCEL): + dialog_buttons = buttons + buttons = [] + else: + if type(buttons) != tuple: + raise TypeError( + "buttons must be a GtkButtonsTypes constant or a tuple") + dialog_buttons = gtk.BUTTONS_NONE + + if parent and not isinstance(parent, gtk.Window): + raise TypeError("parent must be a gtk.Window subclass") + + d = HIGAlertDialog(parent=parent, flags=gtk.DIALOG_MODAL, + type=dialog_type, buttons=dialog_buttons) + for text, response in buttons: + d.add_buttons(text, response) + + d.set_primary(short) + + if long: + if isinstance(long, gtk.Widget): + d.set_details_widget(long) + elif isinstance(long, basestring): + d.set_details(long) + else: + raise TypeError("long must be a gtk.Widget or a string") + + if default != -1: + d.set_default_response(default) + + if parent: + d.set_transient_for(parent) + d.set_modal(True) + + response = d.run() + d.destroy() + return response + +def _simple(type, short, long=None, parent=None, buttons=gtk.BUTTONS_OK, + default=-1): + if buttons == gtk.BUTTONS_OK: + default = gtk.RESPONSE_OK + return messagedialog(type, short, long, + parent=parent, buttons=buttons, + default=default) + +def error(short, long=None, parent=None, buttons=gtk.BUTTONS_OK, default=-1): + return _simple(gtk.MESSAGE_ERROR, short, long, parent=parent, + buttons=buttons, default=default) + +def info(short, long=None, parent=None, buttons=gtk.BUTTONS_OK, default=-1): + return _simple(gtk.MESSAGE_INFO, short, long, parent=parent, + buttons=buttons, default=default) + +def warning(short, long=None, parent=None, buttons=gtk.BUTTONS_OK, default=-1): + return _simple(gtk.MESSAGE_WARNING, short, long, parent=parent, + buttons=buttons, default=default) + +def yesno(text, parent=None, default=gtk.RESPONSE_YES): + return messagedialog(gtk.MESSAGE_WARNING, text, None, parent, + buttons=gtk.BUTTONS_YES_NO, + default=default) + +def open(title='', parent=None, patterns=[], folder=None): + """Displays an open dialog.""" + filechooser = gtk.FileChooserDialog(title or _('Open'), + parent, + gtk.FILE_CHOOSER_ACTION_OPEN, + (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OPEN, gtk.RESPONSE_OK)) + + if patterns: + file_filter = gtk.FileFilter() + for pattern in patterns: + file_filter.add_pattern(pattern) + filechooser.set_filter(file_filter) + filechooser.set_default_response(gtk.RESPONSE_OK) + + if folder: + filechooser.set_current_folder(folder) + + response = filechooser.run() + if response != gtk.RESPONSE_OK: + filechooser.destroy() + return + + path = filechooser.get_filename() + if path and os.access(path, os.R_OK): + filechooser.destroy() + return path + + abspath = os.path.abspath(path) + + error(_('Could not open file "%s"') % abspath, + _('The file "%s" could not be opened. ' + 'Permission denied.') % abspath) + + filechooser.destroy() + return path + +def ask_overwrite(filename, parent=None): + submsg1 = _('A file named "%s" already exists') % os.path.abspath(filename) + submsg2 = _('Do you wish to replace it with the current one?') + text = ('<span weight="bold" size="larger">%s</span>\n\n%s\n' + % (submsg1, submsg2)) + result = messagedialog(gtk.MESSAGE_ERROR, text, parent=parent, + buttons=((gtk.STOCK_CANCEL, + gtk.RESPONSE_CANCEL), + (_("Replace"), + gtk.RESPONSE_YES))) + return result == gtk.RESPONSE_YES + +def save(title='', parent=None, current_name='', folder=None): + """Displays a save dialog.""" + filechooser = gtk.FileChooserDialog(title or _('Save'), + parent, + gtk.FILE_CHOOSER_ACTION_SAVE, + (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_SAVE, gtk.RESPONSE_OK)) + if current_name: + filechooser.set_current_name(current_name) + filechooser.set_default_response(gtk.RESPONSE_OK) + + if folder: + filechooser.set_current_folder(folder) + + path = None + while True: + response = filechooser.run() + if response != gtk.RESPONSE_OK: + path = None + break + + path = filechooser.get_filename() + if not os.path.exists(path): + break + + if ask_overwrite(path, parent): + break + filechooser.destroy() + return path + +def _test(): + yesno('Kill?', default=gtk.RESPONSE_NO) + + info('Some information displayed not too long\nbut not too short', + long=('foobar ba asdjaiosjd oiadjoisjaoi aksjdasdasd kajsdhakjsdh\n' + 'askdjhaskjdha skjdhasdasdjkasldj alksdjalksjda lksdjalksdj\n' + 'asdjaslkdj alksdj lkasjdlkjasldkj alksjdlkasjd jklsdjakls\n' + 'ask;ldjaklsjdlkasjd alksdj laksjdlkasjd lkajs kjaslk jkl\n'), + default=gtk.RESPONSE_OK, + ) + + error('An error occurred', gtk.Button('Woho')) + error('Unable to mount the selected volume.', + 'mount: can\'t find /media/cdrom0 in /etc/fstab or /etc/mtab') + print open(title='Open a file', patterns=['*.py']) + print save(title='Save a file', current_name='foobar.py') + +if __name__ == '__main__': + _test() diff --git a/kiwi/ui/entry.py b/kiwi/ui/entry.py new file mode 100644 index 0000000..cd495b7 --- /dev/null +++ b/kiwi/ui/entry.py @@ -0,0 +1,603 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +""" +An enchanced version of GtkEntry that supports icons and masks +""" + +import gettext +import string + +import gobject +import pango +import gtk + +from kiwi.ui.icon import IconEntry +from kiwi.utils import PropertyObject, gsignal, gproperty, type_register + +class MaskError(Exception): + pass + +(INPUT_ASCII_LETTER, + INPUT_ALPHA, + INPUT_ALPHANUMERIC, + INPUT_DIGIT) = range(4) + +INPUT_FORMATS = { + '0': INPUT_DIGIT, + 'L': INPUT_ASCII_LETTER, + 'A': INPUT_ALPHANUMERIC, + 'a': INPUT_ALPHANUMERIC, + '&': INPUT_ALPHA, + } + +# Todo list: Other usefull Masks +# 9 - Digit, optional +# ? - Ascii letter, optional +# C - Alpha, optional + +INPUT_CHAR_MAP = { + INPUT_ASCII_LETTER: lambda text: text in string.ascii_letters, + INPUT_ALPHA: unicode.isalpha, + INPUT_ALPHANUMERIC: unicode.isalnum, + INPUT_DIGIT: unicode.isdigit, + } + + +(COL_TEXT, + COL_OBJECT) = range(2) + +(ENTRY_MODE_TEXT, + ENTRY_MODE_DATA) = range(2) + +_ = lambda msg: gettext.dgettext('kiwi', msg) + +class KiwiEntry(PropertyObject, gtk.Entry): + """ + The KiwiEntry is a Entry subclass with the following additions: + + - IconEntry, allows you to have an icon inside the entry + - Mask, force the input to meet certain requirements + - IComboMixin: Allows you work with objects instead of strings + Adds a number of convenience methods such as L{prefill}(). + """ + __gtype_name__ = 'KiwiEntry' + + gproperty("completion", bool, False) + gproperty('exact-completion', bool, default=False) + gproperty("mask", str, default='') + + def __init__(self): + gtk.Entry.__init__(self) + PropertyObject.__init__(self) + + self.connect('insert-text', self._on_insert_text) + self.connect('delete-text', self._on_delete_text) + + self._current_object = None + self._mode = ENTRY_MODE_TEXT + self._icon = IconEntry(self) + + # List of validators + # str -> static characters + # int -> dynamic, according to constants above + self._mask_validators = [] + self._mask = None + self._block_insert = False + self._block_delete = False + + # Virtual methods + + gsignal('size-allocate', 'override') + def do_size_allocate(self, allocation): + #gtk.Entry.do_size_allocate(self, allocation) + self.chain(allocation) + + if self.flags() & gtk.REALIZED: + self._icon.resize_windows() + + def do_expose_event(self, event): + gtk.Entry.do_expose_event(self, event) + + if event.window == self.window: + self._icon.draw_pixbuf() + + def do_realize(self): + gtk.Entry.do_realize(self) + self._icon.construct() + + def do_unrealize(self): + self._icon.deconstruct() + gtk.Entry.do_unrealize(self) + + # Properties + + def prop_set_exact_completion(self, value): + self.set_exact_completion(value) + return value + + def prop_set_completion(self, value): + if not self.get_completion(): + self.set_completion(gtk.EntryCompletion()) + return value + + def prop_set_mask(self, value): + try: + self.set_mask(value) + return self.get_mask() + except MaskError, e: + pass + return '' + + # Public API + def set_mask(self, mask): + """ + Sets the mask of the Entry. + Supported format characters are: + - '0' digit + - 'L' ascii letter (a-z and A-Z) + - '&' alphabet, honors the locale + - 'a' alphanumeric, honors the locale + - 'A' alphanumeric, honors the locale + + This is similar to MaskedTextBox: + U{http://msdn2.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.mask(VS.80).aspx} + + Example mask for a ISO-8601 date + >>> entry.set_mask('0000-00-00') + + @param mask: the mask to set + """ + + mask = unicode(mask) + if not mask: + self.modify_font(pango.FontDescription("sans")) + self._mask = mask + return + + input_length = len(mask) + lenght = 0 + pos = 0 + while True: + if pos >= input_length: + break + if mask[pos] in INPUT_FORMATS: + self._mask_validators += [INPUT_FORMATS[mask[pos]]] + else: + self._mask_validators.append(mask[pos]) + pos += 1 + + self.modify_font(pango.FontDescription("monospace")) + + self.set_text("") + self._insert_mask(0, input_length) + self._mask = mask + + def get_mask(self): + """ + @returns: the mask + """ + return self._mask + + def get_field_text(self): + """ + Get the fields assosiated with the entry. + A field is dynamic content separated by static. + For example, the format string 000-000 has two fields + separated by a dash. + if a field is empty it'll return an empty string + otherwise it'll include the content + + @returns: fields + @rtype: list of strings + """ + if not self._mask: + raise MaskError("a mask must be set before calling get_field_text") + + def append_field(fields, field_type, s): + if s.count(' ') == len(s): + s = '' + if field_type == INPUT_DIGIT: + try: + s = int(s) + except ValueError: + s = None + fields.append(s) + + fields = [] + pos = 0 + s = '' + field_type = -1 + text = unicode(self.get_text()) + validators = self._mask_validators + while True: + if pos >= len(validators): + append_field(fields, field_type, s) + break + + validator = validators[pos] + if isinstance(validator, int): + try: + s += text[pos] + except IndexError: + s = '' + field_type = validator + else: + append_field(fields, field_type, s) + s = '' + field_type = -1 + pos += 1 + + return fields + + def get_empty_mask(self, start=None, end=None): + """ + Gets the empty mask between start and end + + @param start: + @param end: + @returns: mask + @rtype: string + """ + + if start is None: + start = 0 + if end is None: + end = len(self._mask_validators) + + s = '' + for validator in self._mask_validators[start:end]: + if isinstance(validator, int): + s += ' ' + elif isinstance(validator, unicode): + s += validator + else: + raise AssertionError + return s + + def set_exact_completion(self, value): + """ + Enable exact entry completion. + Exact means it needs to start with the value typed + and the case needs to be correct. + + @param value: enable exact completion + @type value: boolean + """ + + if value: + match_func = self._completion_exact_match_func + else: + match_func = self._completion_normal_match_func + completion = self._get_completion() + completion.set_match_func(match_func) + + # Private + + def _really_delete_text(self, start, end): + # A variant of delete_text() that never is blocked by us + self._block_delete = True + self.delete_text(start, end) + self._block_delete = False + + def _really_insert_text(self, text, position): + # A variant of insert_text() that never is blocked by us + self._block_insert = True + self.insert_text(text, position) + self._block_insert = False + + def _insert_mask(self, start, end): + text = self.get_empty_mask(start, end) + self._really_insert_text(text, position=start) + + def _confirms_to_mask(self, position, text): + validators = self._mask_validators + if position >= len(validators): + return False + + validator = validators[position] + if isinstance(validator, int): + if not INPUT_CHAR_MAP[validator](text): + return False + if isinstance(validator, unicode): + if validator == text: + return True + return False + + return True + + def _update_current_object(self, text): + if self._mode != ENTRY_MODE_DATA: + return + + for row in self.get_completion().get_model(): + if row[COL_TEXT] == text: + self._current_object = row[COL_OBJECT] + break + else: + # Customized validation + if text: + self.set_invalid(_("'%s' is not a valid object" % text)) + elif self.mandatory: + self.set_blank() + else: + self.set_valid() + self._current_object = None + + def _get_text_from_object(self, obj): + if self._mode != ENTRY_MODE_DATA: + return + + for row in self.get_completion().get_model(): + if row[COL_OBJECT] == obj: + return row[COL_TEXT] + + def _get_completion(self): + # Check so we have completion enabled, not this does not + # depend on the property, the user can manually override it, + # as long as there is a completion object set + completion = self.get_completion() + if completion: + return completion + + completion = gtk.EntryCompletion() + self.set_completion(completion) + return completion + + def set_completion(self, completion): + gtk.Entry.set_completion(self, completion) + completion.set_model(gtk.ListStore(str, object)) + completion.set_text_column(0) + self.set_exact_completion(False) + completion.connect("match-selected", + self._on_completion__match_selected) + self._current_object = None + return completion + + def _completion_exact_match_func(self, completion, _, iter): + model = completion.get_model() + if not len(model): + return + + content = model[iter][COL_TEXT] + return self.get_text().startswith(content) + + def _completion_normal_match_func(self, completion, _, iter): + model = completion.get_model() + if not len(model): + return + + content = model[iter][COL_TEXT].lower() + return self.get_text().lower() in content + + def _on_completion__match_selected(self, completion, model, iter): + if not len(model): + return + + # this updates current_object and triggers content-changed + self.set_text(model[iter][COL_TEXT]) + self.set_position(-1) + # FIXME: Enable this at some point + #self.activate() + + # Callbacks + + def _on_insert_text(self, editable, new, length, position): + if not self._mask or self._block_insert: + return + + position = self.get_position() + new = unicode(new) + for inc, c in enumerate(new): + if not self._confirms_to_mask(position + inc, c): + self.stop_emission('insert-text') + return + + self._really_delete_text(position, position+1) + + # If the next character is a static character and + # the one after the next is input, skip over + # the static character + next = position + 1 + validators = self._mask_validators + if len(validators) > next + 1: + if (isinstance(validators[next], unicode) and + isinstance(validators[next+1], int)): + # Ugly: but it must be done after the entry + # inserts the text + gobject.idle_add(self.set_position, next+1) + + def _on_delete_text(self, editable, start, end): + if not self._mask or self._block_delete: + return + + # This is tricky, quite ugly but it works. + # We want to insert the mask after the delete is done + # Instead of using idle_add we delete the text first + # insert our mask afterwards and finally blocks the call + # from happing in the entry itself + self._really_delete_text(start, end) + self._insert_mask(start, end) + + self.stop_emission('delete-text') + + # IconEntry + def set_tooltip(self, text): + self._icon.set_tooltip(text) + + def set_pixbuf(self, pixbuf): + self._icon.set_pixbuf(pixbuf) + + def update_background(self, color): + self._icon.update_background(color) + + def get_icon_window(self): + return self._icon.get_icon_window() + + # IComboMixin + + def prefill(self, itemdata, sort=False): + """Fills the Combo with listitems corresponding to the itemdata + provided. + + Parameters: + - itemdata is a list of strings or tuples, each item corresponding + to a listitem. The simple list format is as follows:: + + >>> [ label0, label1, label2 ] + + If you require a data item to be specified for each item, use a + 2-item tuple for each element. The format is as follows:: + + >>> [ ( label0, data0 ), (label1, data1), ... ] + + - Sort is a boolean that specifies if the list is to be sorted by + label or not. By default it is not sorted + """ + if not isinstance(itemdata, (list, tuple)): + raise TypeError("'data' parameter must be a list or tuple of item " + "descriptions, found %s") % type(itemdata) + + completion = self._get_completion() + model = completion.get_model() + + if len(itemdata) == 0: + model.clear() + return + + if (len(itemdata) > 0 and + type(itemdata[0]) in (tuple, list) and + len(itemdata[0]) == 2): + mode = self._mode = ENTRY_MODE_DATA + else: + mode = self._mode + + values = {} + if mode == ENTRY_MODE_TEXT: + if sort: + itemdata.sort() + + for item in itemdata: + if item in values: + raise KeyError("Tried to insert duplicate value " + "%s into Combo!" % item) + else: + values[item] = None + + model.append((item, None)) + elif mode == ENTRY_MODE_DATA: + if sort: + itemdata.sort(lambda x, y: cmp(x[0], y[0])) + + for item in itemdata: + text, data = item + if text in values: + raise KeyError("Tried to insert duplicate value " + "%s into Combo!" % item) + else: + values[text] = None + model.append((text, data)) + else: + raise TypeError("Incorrect format for itemdata; see " + "docstring for more information") + + def get_iter_by_data(self, data): + if self._mode != ENTRY_MODE_DATA: + raise TypeError( + "select_item_by_data can only be used in data mode") + + completion = self._get_completion() + model = completion.get_model() + + for row in model: + if row[COL_OBJECT] == data: + return row.iter + break + else: + raise KeyError("No item correspond to data %r in the combo %s" + % (data, self.name)) + + def get_iter_by_label(self, label): + completion = self._get_completion() + model = completion.get_model() + for row in model: + if row[COL_TEXT] == label: + return row.iter + else: + raise KeyError("No item correspond to label %r in the combo %s" + % (label, self.name)) + + def get_selected_by_iter(self, treeiter): + completion = self._get_completion() + model = completion.get_model() + mode = self._mode + text = model[treeiter][COL_TEXT] + if text != self.get_text(): + return + + if mode == ENTRY_MODE_TEXT: + return text + elif mode == ENTRY_MODE_DATA: + return model[treeiter][COL_OBJECT] + else: + raise AssertionError + + def get_selected_label(self, treeiter): + completion = self._get_completion() + model = completion.get_model() + return model[treeiter][COL_TEXT] + + def get_iter_from_obj(self, obj): + mode = self._mode + if mode == ENTRY_MODE_TEXT: + return self.get_iter_by_label(obj) + elif mode == ENTRY_MODE_DATA: + return self.get_iter_by_data(obj) + else: + # XXX: When setting the datatype to non string, automatically go to + # data mode + raise TypeError("unknown Entry mode. Did you call prefill?") + +type_register(KiwiEntry) + +def main(args): + win = gtk.Window() + win.set_title('gtk.Entry subclass') + def cb(window, event): + print 'fields', widget.get_field_text() + gtk.main_quit() + win.connect('delete-event', cb) + + widget = KiwiEntry() + widget.set_mask('000.000.000.000') + + win.add(widget) + + win.show_all() + + widget.select_region(0, 0) + gtk.main() + +if __name__ == '__main__': + import sys + sys.exit(main(sys.argv)) diff --git a/kiwi/ui/gadgets.py b/kiwi/ui/gadgets.py new file mode 100644 index 0000000..442a962 --- /dev/null +++ b/kiwi/ui/gadgets.py @@ -0,0 +1,182 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Lorenzo Gil Sanchez <lgs@sicem.biz> +# Johan Dahlin <jdahlin@async.com.br> +# + +"""Graphical utilities: color management and eyecandy""" + +import gobject +import gtk +from gtk import gdk + +from kiwi.log import Logger +from kiwi.utils import gsignal, type_register + +def gdk_color_to_string(color): + """Convert a color to a #AABBCC string""" + return "#%02X%02X%02X" % (int(color.red) >> 8, + int(color.green) >> 8, + int(color.blue) >> 8) + +def set_foreground(widget, color, state=gtk.STATE_NORMAL): + """ + Set the foreground color of a widget: + + - widget: the widget we are changing the color + - color: a hexadecimal code or a well known color name + - state: the state we are afecting, see gtk.STATE_* + """ + widget.modify_fg(state, gdk.color_parse(color)) + +def get_foreground(widget, state=gtk.STATE_NORMAL): + """Return the foreground color of the widget as a string""" + style = widget.get_style() + color = style.fg[state] + return gdk_color_to_string(color) + +def set_background(widget, color, state=gtk.STATE_NORMAL): + """ + Set the background color of a widget: + + - widget: the widget we are changing the color + - color: a hexadecimal code or a well known color name + - state: the state we are afecting, see gtk.STATE_* + """ + if isinstance(widget, gtk.Entry): + widget.modify_base(state, gdk.color_parse(color)) + else: + widget.modify_bg(state, gdk.color_parse(color)) + +def get_background(widget, state=gtk.STATE_NORMAL): + """Return the background color of the widget as a string""" + style = widget.get_style() + color = style.bg[state] + return gdk_color_to_string(color) + +def quit_if_last(*args): + windows = [toplevel + for toplevel in gtk.window_list_toplevels() + if toplevel.get_property('type') == gtk.WINDOW_TOPLEVEL] + if len(windows) == 1: + gtk.main_quit() + + +class FadeOut(gobject.GObject): + """I am a helper class to draw the fading effect of the background + Call my methods start() and stop() to control the fading. + """ + gsignal('done') + gsignal('color-changed', gdk.Color) + + # How long time it'll take before we start (in ms) + COMPLAIN_DELAY = 500 + + MERGE_COLORS_DELAY = 100 + + # XXX: Fetch the default value from the widget instead of hard coding it. + GOOD_COLOR = "white" + ERROR_COLOR = "#ffd5d5" + + def __init__(self, widget): + gobject.GObject.__init__(self) + self._widget = widget + self._background_timeout_id = -1 + self._countdown_timeout_id = -1 + self._log = Logger('fade') + self._done = False + + def _merge_colors(self, src_color, dst_color, steps=10): + """ + Change the background of widget from src_color to dst_color + in the number of steps specified + """ + self._log.debug('_merge_colors: %s -> %s' % (src_color, dst_color)) + + gdk_src = gdk.color_parse(src_color) + gdk_dst = gdk.color_parse(dst_color) + rs, gs, bs = gdk_src.red, gdk_src.green, gdk_src.blue + rd, gd, bd = gdk_dst.red, gdk_dst.green, gdk_dst.blue + rinc = (rd - rs) / float(steps) + ginc = (gd - gs) / float(steps) + binc = (bd - bs) / float(steps) + for dummy in xrange(steps): + rs += rinc + gs += ginc + bs += binc + col = gdk.color_parse("#%02X%02X%02X" % (int(rs) >> 8, + int(gs) >> 8, + int(bs) >> 8)) + self.emit('color-changed', col) + yield True + + self.emit('done') + self._background_timeout_id = -1 + self._done = True + yield False + + def _start_merging(self): + # If we changed during the delay + if self._background_timeout_id != -1: + self._log.debug('_start_merging: Already running') + return + + self._log.debug('_start_merging: Starting') + func = self._merge_colors(FadeOut.GOOD_COLOR, + FadeOut.ERROR_COLOR).next + self._background_timeout_id = ( + gobject.timeout_add(FadeOut.MERGE_COLORS_DELAY, func)) + self._countdown_timeout_id = -1 + + def start(self): + """Schedules a start of the countdown. + @returns: True if we could start, False if was already in progress + """ + if self._background_timeout_id != -1: + self._log.debug('start: Background change already running') + return False + if self._countdown_timeout_id != -1: + self._log.debug('start: Countdown already running') + return False + if self._done: + self._log.debug('start: Not running, already set') + return False + + self._log.debug('start: Scheduling') + self._countdown_timeout_id = gobject.timeout_add( + FadeOut.COMPLAIN_DELAY, self._start_merging) + + return True + + def stop(self): + """Stops the fadeout and restores the background color""" + self._log.debug('Stopping') + if self._background_timeout_id != -1: + gobject.source_remove(self._background_timeout_id) + self._background_timeout_id = -1 + if self._countdown_timeout_id != -1: + gobject.source_remove(self._countdown_timeout_id) + self._countdown_timeout_id = -1 + + self._widget.update_background(gdk.color_parse(FadeOut.GOOD_COLOR)) + self._done = False + +type_register(FadeOut) diff --git a/kiwi/ui/gazpacholoader.py b/kiwi/ui/gazpacholoader.py new file mode 100644 index 0000000..b5e4426 --- /dev/null +++ b/kiwi/ui/gazpacholoader.py @@ -0,0 +1,360 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Lorenzo Gil Sanchez <lgs@sicem.biz> +# Johan Dahlin <jdahlin@async.com.br> +# + +"""Gazpacho integration: loader and extensions""" + +import datetime +from decimal import Decimal +import gettext +import os +import warnings + +import gobject +import gtk +from gazpacho.editor import PropertyCustomEditor +from gazpacho.loader.loader import ObjectBuilder +from gazpacho.loader.custom import Adapter, ComboBoxAdapter, \ + PythonWidgetAdapter, adapter_registry +from gazpacho.properties import prop_registry, CustomProperty, StringType +from gazpacho.widgets.base.base import ContainerAdaptor +from gazpacho.widgets.base.box import BoxAdaptor + +from kiwi.datatypes import currency +from kiwi.environ import environ +from kiwi.log import Logger +from kiwi.python import disabledeprecationcall +from kiwi.ui.hyperlink import HyperLink +from kiwi.ui.objectlist import Column, ObjectList +from kiwi.ui.widgets.checkbutton import ProxyCheckButton +from kiwi.ui.widgets.combo import ProxyComboEntry, ProxyComboBox, \ + ProxyComboBoxEntry +from kiwi.ui.widgets.entry import ProxyDateEntry, ProxyEntry +from kiwi.ui.widgets.label import ProxyLabel +from kiwi.ui.widgets.radiobutton import ProxyRadioButton +from kiwi.ui.widgets.spinbutton import ProxySpinButton +from kiwi.ui.widgets.textview import ProxyTextView + +# Backwards compatibility + pyflakes +from kiwi.ui.widgets.combobox import ComboBox, ComboBoxEntry +from kiwi.ui.widgets.list import List +HyperLink +_ = gettext.gettext + +log = Logger('gazpacholoader') + +class Builder(ObjectBuilder): + def find_resource(self, filename): + return environ.find_resource("pixmaps", filename) + +class GazpachoWidgetTree: + """Example class of GladeAdaptor that uses Gazpacho loader to load the + glade files + """ + def __init__(self, view, gladefile, widgets, gladename=None, domain=None): + + if not gladefile: + raise ValueError("A gladefile wasn't provided.") + elif not isinstance(gladefile, basestring): + raise TypeError( + "gladefile should be a string, found %s" % type(gladefile)) + filename = os.path.splitext(os.path.basename(gladefile))[0] + self._filename = filename + '.glade' + self._view = view + self._gladefile = environ.find_resource("glade", self._filename) + self._widgets = (widgets or view.widgets or [])[:] + self.gladename = gladename or filename + self._showwarning = warnings.showwarning + warnings.showwarning = self._on_load_warning + self._tree = Builder(self._gladefile, domain=domain) + warnings.showwarning = self._showwarning + if not self._widgets: + self._widgets = [w.get_data("gazpacho::object-id") + for w in self._tree.get_widgets()] + self._attach_widgets() + + def _on_load_warning(self, warning, category, file, line): + self._showwarning('while loading glade file: %s' % warning, + category, self._filename, '???') + + def _attach_widgets(self): + # Attach widgets in the widgetlist to the view specified, so + # widgets = [label1, button1] -> view.label1, view.button1 + for w in self._widgets: + widget = self._tree.get_widget(w) + if widget is not None: + setattr(self._view, w, widget) + else: + log.warn("Widget %s was not found in glade widget tree." % w) + + def get_widget(self, name): + """Retrieves the named widget from the View (or glade tree)""" + name = name.replace('.', '_') + name = name.replace('-', '_') + widget = self._tree.get_widget(name) + if widget is None: + raise AttributeError( + "Widget %s not found in view %s" % (name, self._view)) + return widget + + def get_widgets(self): + return self._tree.get_widgets() + + def signal_autoconnect(self, dic): + self._tree.signal_autoconnect(dic) + + def get_sizegroups(self): + return self._tree.sizegroups + +# Normal widgets +for prop in ('normal-color', 'normal-underline', 'normal-bold', + 'hover-color', 'hover-underline', 'hover-bold', + 'active-color', 'active-underline', 'active-bold'): + prop_registry.override_simple('HyperLink::%s' % prop, editable=False) + +class HyperLinkAdaptor(ContainerAdaptor): + def fill_empty(self, context, widget): + pass + + def post_create(self, context, widget, interactive): + widget.set_text(widget.get_name()) + +class ComboEntryAdaptor(BoxAdaptor): + def get_children(self, context, comboentry): + return [] + +class DateEntryAdaptor(BoxAdaptor): + def get_children(self, context, comboentry): + return [] + +class KiwiColumnAdapter(Adapter): + object_type = Column + def construct(self, name, gtype, properties): + return Column(name) +adapter_registry.register_adapter(KiwiColumnAdapter) + +class ObjectListAdapter(PythonWidgetAdapter): + object_type = ObjectList + def construct(self, name, gtype, properties): + if gtype == List: + gtype == ObjectList + return super(ObjectListAdapter, self).construct(name, gtype, + properties) +adapter_registry.register_adapter(ObjectListAdapter) + +# Framework widgets + +class DataTypeAdaptor(PropertyCustomEditor): + def __init__(self): + super(DataTypeAdaptor, self).__init__() + self._input = self.create_editor() + + def get_editor_widget(self): + return self._input + + def get_data_types(self): + """ + Subclasses should override this. + Expected to return a list of 2 sized tuples with + name of type and type, to be used in a combo box. + """ + raise NotImplementedError + + def create_editor(self): + model = gtk.ListStore(str, object) + for datatype in self.get_data_types(): + model.append(datatype) + combo = gtk.ComboBox(model) + renderer = gtk.CellRendererText() + combo.pack_start(renderer) + combo.add_attribute(renderer, 'text', 0) + combo.set_active(0) + combo.set_data('connection-id', -1) + return combo + + def update(self, context, kiwiwidget, proxy): + combo = self._input + connection_id = combo.get_data('connection-id') + if (connection_id != -1): + combo.disconnect(connection_id) + model = combo.get_model() + connection_id = combo.connect('changed', self._editor_edit, + proxy, model) + combo.set_data('connection-id', connection_id) + value = kiwiwidget.get_property('data-type') + for row in model: + if row[1] == value: + combo.set_active_iter(row.iter) + break + + def _editor_edit(self, combo, proxy, model): + active_iter = combo.get_active_iter() + proxy.set_value(model[active_iter][1]) + +class SpinBtnDataType(DataTypeAdaptor): + def get_data_types(self): + return [ + (_('Integer'), int), + (_('Float'), float), + (_('Decimal'), Decimal), + (_('Currency'), currency) + ] + +class EntryDataType(DataTypeAdaptor): + def get_data_types(self): + return [ + (_('String'), str), + (_('Unicode'), unicode), + (_('Integer'), int), + (_('Float'), float), + (_('Decimal'), Decimal), + (_('Currency'), currency), + (_('Date'), datetime.date), + (_('Date and Time'), datetime.datetime), + (_('Time'), datetime.time), + (_('Object'), object) + ] + +class TextViewDataType(DataTypeAdaptor): + def get_data_types(self): + return [ + (_('String'), str), + (_('Unicode'), unicode), + (_('Integer'), int), + (_('Float'), float), + (_('Decimal'), Decimal), + (_('Date'), datetime.date), + ] + +class ComboBoxDataType(DataTypeAdaptor): + def get_data_types(self): + return [ + (_('String'), str), + (_('Unicode'), unicode), + (_('Boolean'), bool), + (_('Integer'), int), + (_('Float'), float), + (_('Decimal'), Decimal), + (_('Object'), object) + ] + +class LabelDataType(DataTypeAdaptor): + def get_data_types(self): + return [ + (_('String'), str), + (_('Unicode'), unicode), + (_('Boolean'), bool), + (_('Integer'), int), + (_('Float'), float), + (_('Decimal'), Decimal), + (_('Date'), datetime.date), + (_('Date and Time'), datetime.datetime), + (_('Time'), datetime.time), + (_('Currency'), currency) + ] + +class DataType(CustomProperty, StringType): + translatable = False + def save(self): + value = self.get() + if value is not None: + return value.__name__ + +class BoolOnlyDataType(CustomProperty, StringType): + translatable = False + editable = False + def save(self): + return 'bool' + +class DateOnlyDataType(CustomProperty, StringType): + translatable = False + editable = False + def save(self): + return 'date' + +class ModelProperty(CustomProperty, StringType): + translatable = False + +class DataValueProperty(CustomProperty, StringType): + translatable = False + +# Register widgets which have data-type and model-attributes +# ComboBox is a special case, it needs to inherit from another +# adapter and need to support two types. +class KiwiComboBoxAdapter(ComboBoxAdapter): + object_type = ProxyComboBox, ProxyComboBoxEntry + def construct(self, name, gtype, properties): + if gtype in (ProxyComboBox.__gtype__, + ComboBox.__gtype__): + object_type = ProxyComboBox + elif gtype in (ProxyComboBoxEntry.__gtype__, + ComboBoxEntry.__gtype__): + object_type = ProxyComboBoxEntry + else: + raise AssertionError("Unknown ComboBox GType: %r" % gtype) + + obj = disabledeprecationcall(object_type) + obj.set_name(name) + return obj +adapter_registry.register_adapter(KiwiComboBoxAdapter) + +def register_widgets(): + for gobj, editor, data_type in [ + (ProxyEntry, EntryDataType, DataType), + (ProxyDateEntry, None, DateOnlyDataType), + (ProxyCheckButton, None, BoolOnlyDataType), + (ProxyLabel, LabelDataType, DataType), + (ProxyComboBox, ComboBoxDataType, DataType), + (ProxyComboBoxEntry, ComboBoxDataType, DataType), + (ProxyComboEntry, ComboBoxDataType, DataType), + (ProxySpinButton, SpinBtnDataType, DataType), + (ProxyRadioButton, None, BoolOnlyDataType), + (ProxyTextView, TextViewDataType, DataType) + ]: + # Property overrides, used in the editor + type_name = gobject.type_name(gobj) + + data_name = type_name + '::data-type' + if editor: + prop_registry.override_simple(data_name, data_type, editor=editor) + else: + prop_registry.override_simple(data_name, data_type) + + prop_registry.override_simple(type_name + '::model-attribute', + ModelProperty) + + if issubclass(gobj, ProxyRadioButton): + prop_registry.override_simple(type_name + '::data-value', + DataValueProperty) + # Register custom adapters, since gobject.new is broken in 2.6 + # Used by loader, eg in gazpacho and in applications + # ComboBox is registered above + if gobj == ProxyComboBox: + continue + + klass = type('Kiwi%sAdapter', (PythonWidgetAdapter,), + dict(object_type=gobj)) + adapter_registry.register_adapter(klass) + +if not environ.epydoc: + register_widgets() diff --git a/kiwi/ui/hyperlink.py b/kiwi/ui/hyperlink.py new file mode 100644 index 0000000..988cef3 --- /dev/null +++ b/kiwi/ui/hyperlink.py @@ -0,0 +1,255 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): (C) Ali Afshar <aafshar@gmail.com> +# +# Contact Ali if you require release under a different license. + + +"""A hyper link widget.""" + + +from cgi import escape + +import gtk + +from kiwi.utils import gsignal, gproperty, PropertyObject, type_register + +class HyperLink(PropertyObject, gtk.EventBox): + __gtype_name__ = 'HyperLink' + """ + A hyperlink widget. + + This widget behaves much like a hyperlink from a browser. The markup that + will be displayed is contained in the properties normal-markup + hover-markup and active-markup. There is a clicked signal which is fired + when hyperlink is clicked with the left mouse button. + + Additionally, the user may set a menu that will be popped up when the user + right clicks the hyperlink. + """ + + gproperty('text', str, '') + gproperty('normal-color', str, '#0000c0') + gproperty('normal-underline', bool, False) + gproperty('normal-bold', bool, False) + gproperty('hover-color', str, '#0000c0') + gproperty('hover-underline', bool, True) + gproperty('hover-bold', bool, False) + gproperty('active-color', str, '#c00000') + gproperty('active-underline', bool, True) + gproperty('active-bold', bool, False) + + gsignal('clicked') + gsignal('right-clicked') + + def __init__(self, text=None, menu=None): + """ + Create a new hyperlink. + + @param text: The text of the hyperlink. + @type text: str + """ + gtk.EventBox.__init__(self) + PropertyObject.__init__(self) + self._gproperties = {} + if text is not None: + self.set_property('text', text) + self._is_active = False + self._is_hover = False + self._menu = menu + self._label = gtk.Label() + self.add(self._label) + self.add_events(gtk.gdk.BUTTON_PRESS_MASK | + gtk.gdk.BUTTON_RELEASE_MASK | + gtk.gdk.ENTER_NOTIFY_MASK | + gtk.gdk.LEAVE_NOTIFY_MASK) + self.connect('button-press-event', self._on_button_press_event) + self.connect('button-release-event', self._on_button_release_event) + self.connect('enter-notify-event', self._on_hover_changed, True) + self.connect('leave-notify-event', self._on_hover_changed, False) + self.connect('map-event', self._on_map_event) + self.connect('notify', self._on_notify) + self.set_text(text) + + # public API + + def get_text(self): + """ + Return the hyperlink text. + """ + return self.text + + def set_text(self, text): + """ + Set the text of the hyperlink. + + @param text: The text to set the hyperlink to. + @type text: str + """ + self.text = text + self._update_look() + + def set_menu(self, menu): + """ + Set the menu to be used for popups. + + @param menu: the gtk.Menu to be used. + @type menu: gtk.Menu + """ + self._menu = menu + + def has_menu(self): + """ + Return whether the widget has a menu set. + + @return: a boolean value indicating whether the internal menu has been + set. + """ + return self._menu is not None + + def popup(self, menu=None, button=3, etime=0L): + """ + Popup the menu and emit the popup signal. + + @param menu: The gtk.Menu to be popped up. This menu will be + used instead of the internally set menu. If this parameter is not + passed or None, the internal menu will be used. + @type menu: gtk.Menu + @param button: An integer representing the button number pressed to + cause the popup action. + @type button: int + @param etime: The time that the popup event was initiated. + @type etime: long + """ + if menu is None: + menu = self._menu + if menu is not None: + menu.popup(None, None, None, button, etime) + self.emit('right-clicked') + + def clicked(self): + """ + Fire a clicked signal. + """ + self.emit('clicked') + + def get_label(self): + """ + Get the internally stored widget. + """ + return self._label + + # private API + + def _update_look(self): + """ + Update the look of the hyperlink depending on state. + """ + if self._is_active: + state = 'active' + elif self._is_hover: + state = 'hover' + else: + state = 'normal' + color = self.get_property('%s-color' % state) + underline = self.get_property('%s-underline' % state) + bold = self.get_property('%s-bold' % state) + markup_string = self._build_markup(self.get_text() or '', + color, underline, bold) + self._label.set_markup(markup_string) + + def _build_markup(self, text, color, underline, bold): + """ + Build a marked up string depending on parameters. + """ + out = '<span color="%s">%s</span>' % (color, escape(text)) + if underline: + out = '<u>%s</u>' % out + if bold: + out = '<b>%s</b>' % out + return out + + # signal callbacks + + def _on_button_press_event(self, eventbox, event): + """ + Called on mouse down. + + Behaves in 2 ways. + 1. if left-button, register the start of a click and grab the + mouse. + 1. if right-button, emit a right-clicked signal +/- popup the + menu. + """ + if event.button == 1: + self.grab_add() + self._is_active = True + self._update_look() + elif event.button == 3: + if event.type == gtk.gdk.BUTTON_PRESS: + self.popup(button=event.button, etime=event.time) + + def _on_button_release_event(self, eventbox, event): + """ + Called on mouse up. + + If the left-button is released and the widget was earlier activated by + a mouse down event a clicked signal is fired. + """ + if event.button == 1: + self.grab_remove() + if self._is_active: + self.clicked() + self._is_active = False + self._update_look() + + def _on_hover_changed(self, eb, event, hover): + """ + Called when the mouse pinter enters or leaves the widget. + + @param hover: Whether the mouse has entered the widget. + @type hover: boolean + """ + self._is_hover = hover + self._update_look() + + def _on_notify(self, eventbox, param): + """ + Called on property notification. + + Ensure that the look is up to date with the properties + """ + if (param.name == 'text' or + param.name.endswith('-color') or + param.name.endswith('-underline') or + param.name.endswith('-bold')): + self._update_look() + + def _on_map_event(self, eventbox, event): + """ + Called on initially mapping the widget. + + Used here to set the cursor type. + """ + cursor = gtk.gdk.Cursor(gtk.gdk.HAND1) + self.window.set_cursor(cursor) + +type_register(HyperLink) diff --git a/kiwi/ui/icon.py b/kiwi/ui/icon.py new file mode 100644 index 0000000..9ff8794 --- /dev/null +++ b/kiwi/ui/icon.py @@ -0,0 +1,280 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +# +# This is tricky and contains quite a few hacks: +# An entry contains 2 GdkWindows, one for the background and one for +# the text area. The normal one, on which the (normally white) background +# is drawn can be accessed through entry.window (after realization) +# The other window is the one where the cursor and the text is drawn upon, +# it's refered to as "text area" inside the GtkEntry code and it is called +# the same here. It can only be accessed through window.get_children()[0], +# since it's considered private to the entry. +# +# +-------------------------------------+ +# | (1) | (1) parent widget (grey) +# |+----------------(2)----------------+| +# || |-- /-\ | || (2) entry.window (white) +# || |- | | |(4) (3) || +# || | \-/ | || (3) text area (transparent) +# |+-----------------------------------+| +# |-------------------------------------| (4) cursor, black +# | | +# +-------------------------------------| +# +# So, now we want to put an icon in the edge: +# An earlier approached by Lorzeno drew the icon directly on the text area, +# which is not desired since if the text is using the whole width of the +# entry the icon will be drawn on top of the text. +# Now what we want to do is to resize the text area and create a +# new window upon which we can draw the icon. +# +# +-------------------------------------+ +# | | (5) icon window +# |+----------------------------++-----+| +# || |-- /-\ | || || +# || |- | | | || (5) || +# || | \-/ | || || +# |+----------------------------++-----+| +# |-------------------------------------| +# | | +# +-------------------------------------+ +# +# When resizing the text area the cursor and text is not moved into the +# correct position, it'll still be off by the width of the icon window +# To fix this we need to call a private function, gtk_entry_recompute, +# a workaround is to call set_visiblity() which calls recompute() +# internally. +# + +"""Provides a helper classes for displaying icons in widgets. + +Currently only a L{kiwi.ui.widgets.entry.Entry} and widgets +which embed them, L{kiwi.ui.widgets.spinbutton.SpinButton} and +L{kiwi.ui.comboboxentry.BaseComboBoxEntry}. +""" + +import gtk +from gtk import gdk +from kiwi.ui.tooltip import Tooltip + +class IconEntry(object): + """ + Helper object for rendering an icon in a GtkEntry + """ + + def __init__(self, entry): + if not isinstance(entry, gtk.Entry): + raise TypeError("entry must be a gtk.Entry") + self._constructed = False + self._pixbuf = None + self._pixw = 1 + self._pixh = 1 + self._text_area = None + self._text_area_pos = (0, 0) + self._icon_win = None + self._entry = entry + self._tooltip = Tooltip(self) + entry.connect('enter-notify-event', + self._on_entry__enter_notify_event) + entry.connect('leave-notify-event', + self._on_entry__leave_notify_event) + entry.connect('notify::xalign', + self._on_entry__notify_xalign) + self._update_position() + + def _on_entry__notify_xalign(self, entry, pspec): + self._update_position() + + def _on_entry__enter_notify_event(self, entry, event): + icon_win = self.get_icon_window() + if event.window != icon_win: + return + + self._tooltip.display(entry) + + def _on_entry__leave_notify_event(self, entry, event): + if event.window != self.get_icon_window(): + return + + self._tooltip.hide() + + def set_tooltip(self, text): + self._tooltip.set_text(text) + + def get_icon_window(self): + return self._icon_win + + def set_pixbuf(self, pixbuf): + """ + @param pixbuf: a gdk.Pixbuf or None + """ + entry = self._entry + if not isinstance(entry.get_toplevel(), gtk.Window): + # For widgets in SlaveViews, wait until they're attached + # to something visible, then set the pixbuf + entry.connect_object('realize', self.set_pixbuf, pixbuf) + return + + if pixbuf: + if not isinstance(pixbuf, gdk.Pixbuf): + raise TypeError("pixbuf must be a GdkPixbuf") + else: + # Turning of the icon should also restore the background + entry.modify_base(gtk.STATE_NORMAL, None) + if not self._pixbuf: + return + self._pixbuf = pixbuf + + if pixbuf: + self._pixw = pixbuf.get_width() + self._pixh = pixbuf.get_height() + else: + self._pixw = self._pixh = 0 + + win = self._icon_win + if not win: + self.construct() + win = self._icon_win + + self.resize_windows() + + # XXX: Why? + if win: + if not pixbuf: + win.hide() + else: + win.show() + + # Hack: This triggers a .recompute() which is private + entry.set_visibility(entry.get_visibility()) + entry.queue_draw() + + def construct(self): + if self._constructed: + return + + entry = self._entry + if not entry.flags() & gtk.REALIZED: + entry.realize() + + # Hack: Save a reference to the text area, now when its created + self._text_area = entry.window.get_children()[0] + self._text_area_pos = self._text_area.get_position() + + # PyGTK should allow default values for most of the values here. + win = gtk.gdk.Window(entry.window, + self._pixw, self._pixh, + gtk.gdk.WINDOW_CHILD, + (gtk.gdk.ENTER_NOTIFY_MASK | + gtk.gdk.LEAVE_NOTIFY_MASK), + gtk.gdk.INPUT_OUTPUT, + 'icon window', + 0, 0, + entry.get_visual(), + entry.get_colormap(), + gtk.gdk.Cursor(entry.get_display(), gdk.LEFT_PTR), + '', '', True) + self._icon_win = win + win.set_user_data(entry) + win.set_background(entry.style.base[entry.state]) + self._constructed = True + + def deconstruct(self): + if self._icon_win: + # This is broken on PyGTK 2.6.x + try: + self._icon_win.set_user_data(None) + except: + pass + # Destroy not needed, called by the GC. + self._icon_win = None + + def update_background(self, color): + if not self._icon_win: + return + + self._entry.modify_base(gtk.STATE_NORMAL, color) + + self.draw_pixbuf() + + def resize_windows(self): + if not self._pixbuf: + return + + icony = iconx = 4 + + # Make space for the icon, both windows + winw = self._entry.window.get_size()[0] + textw, texth = self._text_area.get_size() + textw = winw - self._pixw - (iconx + icony) + + if self._pos == gtk.POS_LEFT: + textx, texty = self._text_area_pos + textx += iconx + self._pixw + + # FIXME: Why is this needed. Focus padding? + # The text jumps without this + textw -= 2 + self._text_area.move_resize(textx, texty, textw, texth) + elif self._pos == gtk.POS_RIGHT: + self._text_area.resize(textw, texth) + iconx += textw + + icon_win = self._icon_win + # XXX: Why? + if not icon_win: + return + + # If the size of the window is large enough, resize and move it + # Otherwise just move it to the right side of the entry + if icon_win.get_size() != (self._pixw, self._pixh): + icon_win.move_resize(iconx, icony, self._pixw, self._pixh) + else: + icon_win.move(iconx, icony) + + def draw_pixbuf(self): + if not self._pixbuf: + return + + win = self._icon_win + # XXX: Why? + if not win: + return + + # Draw background first + color = self._entry.style.base_gc[self._entry.state] + win.draw_rectangle(color, True, + 0, 0, self._pixw, self._pixh) + + # If sensitive draw the icon, regardless of the window emitting the + # event since makes it a bit smoother on resize + if self._entry.flags() & gtk.SENSITIVE: + win.draw_pixbuf(None, self._pixbuf, 0, 0, 0, 0, + self._pixw, self._pixh) + + def _update_position(self): + if self._entry.get_property('xalign') > 0.5: + self._pos = gtk.POS_LEFT + else: + self._pos = gtk.POS_RIGHT diff --git a/kiwi/ui/libgladeloader.py b/kiwi/ui/libgladeloader.py new file mode 100644 index 0000000..d3c2872 --- /dev/null +++ b/kiwi/ui/libgladeloader.py @@ -0,0 +1,76 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +import os + +from gtk.glade import XML + +from kiwi.environ import environ +from kiwi.log import Logger + +log = Logger('libgladeloader') + +class LibgladeWidgetTree(XML): + def __init__(self, view, gladefile, widgets, gladename=None, domain=None): + + if not gladefile: + raise ValueError("A gladefile wasn't provided.") + elif not isinstance(gladefile, basestring): + raise TypeError( + "gladefile should be a string, found %s" % type(gladefile)) + filename = os.path.splitext(os.path.basename(gladefile))[0] + + self._view = view + self._gladefile = environ.find_resource("glade", filename + ".glade") + self._widgets = (widgets or view.widgets or [])[:] + self.gladename = gladename or filename + XML.__init__(self, self._gladefile, domain) + if not self._widgets: + self._widgets = [w.get_name() for w in self.get_widget_prefix('')] + self._attach_widgets() + + def _attach_widgets(self): + # Attach widgets in the widgetlist to the view specified, so + # widgets = [label1, button1] -> view.label1, view.button1 + for w in self._widgets: + widget = XML.get_widget(self, w) + if widget is not None: + setattr(self._view, w, widget) + else: + log.warn("Widget %s was not found in glade widget tree." % w) + + def get_widget(self, name): + """Retrieves the named widget from the View (or glade tree)""" + name = name.replace('.', '_') + widget = XML.get_widget(self, name) + + if widget is None: + raise AttributeError( + "Widget %s not found in view %s" % (name, self._view)) + return widget + + def get_widgets(self): + return self.get_widget_prefix('') + + def get_sizegroups(self): + return [] diff --git a/kiwi/ui/objectlist.py b/kiwi/ui/objectlist.py new file mode 100644 index 0000000..d6b1720 --- /dev/null +++ b/kiwi/ui/objectlist.py @@ -0,0 +1,1705 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2001-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# Gustavo Rahal <gustavo@async.com.br> +# Johan Dahlin <jdahlin@async.com.br> +# + +"""High level wrapper for GtkTreeView""" + +import datetime +import gettext + +import gobject +import gtk +from gtk import gdk + +from kiwi.accessor import kgetattr +from kiwi.datatypes import converter, currency, number +from kiwi.log import Logger +from kiwi.python import slicerange +from kiwi.utils import PropertyObject, gsignal, gproperty, type_register + +_ = gettext.gettext + +log = Logger('objectlist') + +str2type = converter.str_to_type + +def str2enum(value_name, enum_class): + "converts a string to a enum" + for _, enum in enum_class.__enum_values__.items(): + if value_name in (enum.value_name, enum.value_nick): + return enum + +def str2bool(value, from_string=converter.from_string): + "converts a boolean to a enum" + return from_string(bool, value) + +class Column(PropertyObject, gobject.GObject): + """Specifies a column for an L{ObjectList}""" + gproperty('title', str) + gproperty('data-type', object) + gproperty('visible', bool, default=True) + gproperty('justify', gtk.Justification, default=gtk.JUSTIFY_LEFT) + gproperty('format', str) + gproperty('width', int, maximum=2**16) + gproperty('sorted', bool, default=False) + gproperty('order', gtk.SortType, default=gtk.SORT_ASCENDING) + gproperty('expand', bool, default=False) + gproperty('tooltip', str) + gproperty('format_func', object) + gproperty('editable', bool, default=False) + gproperty('searchable', bool, default=False) + gproperty('radio', bool, default=False) + gproperty('cache', bool, default=False) + gproperty('use-stock', bool, default=False) + gproperty('icon-size', gtk.IconSize, default=gtk.ICON_SIZE_MENU) + gproperty('editable_attribute', str) + #gproperty('title_pixmap', str) + + # This can be set in subclasses, to be able to allow custom + # cell_data_functions, used by SequentialColumn + cell_data_func = None + + # This is called after the renderer property is set, to allow + # us to set custom rendering properties + renderer_func = None + + # This is called when the renderer is created, so we can set/fetch + # initial properties + on_attach_renderer = None + + def __init__(self, attribute, title=None, data_type=None, **kwargs): + """ + Creates a new Column, which describes how a column in a + ObjectList should be rendered. + + @param attribute: a string with the name of the instance attribute the + column represents. + @param title: the title of the column, defaulting to the capitalized + form of the attribute. + @param data_type: the type of the attribute that will be inserted + into the column. + + @keyword visible: a boolean specifying if it is initially hidden or + shown. + @keyword justify: one of gtk.JUSTIFY_LEFT, gtk.JUSTIFY_RIGHT or + gtk.JUSTIFY_CENTER or None. If None, the justification will be + determined by the type of the attribute value of the first + instance to be inserted in the ObjectList (numbers will be + right-aligned). + @keyword format: a format string to be applied to the attribute + value upon insertion in the list. + @keyword width: the width in pixels of the column, if not set, uses the + default to ObjectList. If no Column specifies a width, + columns_autosize() will be called on the ObjectList upon append() + or the first add_list(). + @keyword sorted: whether or not the ObjectList is to be sorted by this + column. + If no Columns are sorted, the ObjectList will be created unsorted. + @keyword order: one of gtk.SORT_ASCENDING or gtk.SORT_DESCENDING or + -1. The value -1 is used internally when the column is not sorted. + @keyword expand: if set column will expand. Note: this space is shared + equally amongst all columns that have the expand set to True. + @keyword tooltip: a string which will be used as a tooltip for + the column header + @keyword format_func: a callable which will be used to format + the output of a column. The function will take one argument + which is the value to convert and is expected to return a string. + Note that you cannot use format and format_func at the same time, + if you provide a format function you'll be responsible for + converting the value to a string. + @keyword editable: if true the field is editable and when you modify + the contents of the cell the model will be updated. + @keyword searchable: if true the attribute values of the column can + be searched using type ahead search. Only string attributes are + currently supported. + @keyword radio: If true render the column as a radio instead of toggle. + Only applicable for columns with boolean data types. + @keyword cache: If true, the value will only be fetched once, + and the same value will be reused for futher access. + @keyword use_stock: If true, this will be rendered as pixbuf from the + value which should be a stock id. + @keyword icon_size: a gtk.IconSize constant, gtk.ICON_SIZE_MENU if not + specified. + @keyword editable_attribute: a string which is the attribute + which should decide if the cell is editable or not. + @keyword title_pixmap: (TODO) if set to a filename a pixmap will be + used *instead* of the title set. The title string will still be + used to identify the column in the column selection and in a + tooltip, if a tooltip is not set. + """ + + # XXX: filter function? + if ' ' in attribute: + msg = ("The attribute can not contain spaces, otherwise I can" + " not find the value in the instances: %s" % attribute) + raise AttributeError(msg) + + self.attribute = attribute + self.compare = None + self.from_string = None + + kwargs['title'] = title or attribute.capitalize() + if not data_type: + data_type = str + kwargs['data_type'] = data_type + + # If we don't specify a justification, right align it for int/float + # center for bools and left align it for everything else. + if "justify" not in kwargs: + if data_type: + if issubclass(data_type, bool): + kwargs['justify'] = gtk.JUSTIFY_CENTER + elif issubclass(data_type, (number, currency)): + kwargs['justify'] = gtk.JUSTIFY_RIGHT + + format_func = kwargs.get('format_func') + if format_func: + if not callable(format_func): + raise TypeError("format_func must be callable") + if 'format' in kwargs: + raise TypeError( + "format and format_func can not be used at the same time") + + # editable_attribute always turns on editable + if 'editable_attribute' in kwargs: + if not kwargs.get('editable', True): + raise TypeError( + "editable cannot be disabled when using editable_attribute") + kwargs['editable'] = True + + PropertyObject.__init__(self, **kwargs) + gobject.GObject.__init__(self) + + # This is meant to be subclassable, we're using kgetattr, as + # a staticmethod as an optimization, so we can avoid a function call. + get_attribute = staticmethod(kgetattr) + + def prop_set_data_type(self, data): + if data is not None: + conv = converter.get_converter(data) + self.compare = conv.get_compare_function() + self.from_string = conv.from_string + return data + + def __repr__(self): + namespace = self.__dict__.copy() + attr = namespace['attribute'] + del namespace['attribute'] + return "<%s %s: %s>" % (self.__class__.__name__, attr, namespace) + + # XXX: Replace these two with a gazpacho loader adapter + def __str__(self): + if self.data_type is None: + data_type = '' + else: + data_type = self.data_type.__name__ + + return "%s|%s|%s|%s|%d|%s|%s|%d|%s|%d" % \ + (self.attribute, self.title, data_type, self.visible, + self.justify, self.tooltip, self.format, self.width, + self.sorted, self.order) + + def as_string(self, data): + data_type = self.data_type + if (self.format or + data_type == datetime.date or + data_type == datetime.datetime or + data_type == datetime.time): + conv = converter.get_converter(data_type) + text = conv.as_string(data, format=self.format or None) + elif self.format_func: + text = self.format_func(data) + else: + text = data + + return text + + def from_string(cls, data_string): + fields = data_string.split('|') + if len(fields) != 10: + msg = 'every column should have 10 fields, not %d' % len(fields) + raise ValueError(msg) + + # the attribute is mandatory + if not fields[0]: + raise TypeError + + column = cls(fields[0]) + column.title = fields[1] or '' + column.data_type = str2type(fields[2]) + column.visible = str2bool(fields[3]) + column.justify = str2enum(fields[4], gtk.JUSTIFY_LEFT) + column.tooltip = fields[5] + column.format = fields[6] + + try: + column.width = int(fields[7]) + except ValueError: + pass + + column.sorted = str2bool(fields[8]) + column.order = str2enum(fields[9], gtk.SORT_ASCENDING) \ + or gtk.SORT_ASCENDING + + # XXX: expand, remember to sync with __str__ + + return column + from_string = classmethod(from_string) + +class SequentialColumn(Column): + """I am a column which will display a sequence of numbers, which + represent the row number. The value is independent of the data in + the other columns, so no matter what I will always display 1 in + the first column, unless you reverse it by clicking on the column + header. + + If you don't give me any argument I'll have the title of a hash (#) and + right justify the sequences.""" + def __init__(self, title='#', justify=gtk.JUSTIFY_RIGHT, **kwargs): + Column.__init__(self, '_kiwi_sequence_id', + title=title, justify=justify, data_type=int, **kwargs) + + def cell_data_func(self, tree_column, renderer, model, treeiter, + (column, renderer_prop)): + reversed = tree_column.get_sort_order() == gtk.SORT_DESCENDING + + row = model[treeiter] + if reversed: + sequence_id = len(model) - row.path[0] + else: + sequence_id = row.path[0] + 1 + + row[COL_MODEL]._kiwi_sequence_id = sequence_id + + try: + renderer.set_property(renderer_prop, sequence_id) + except TypeError: + raise TypeError("%r does not support parameter %s" % + (renderer, renderer_prop)) + +class ColoredColumn(Column): + """ + I am a column which can colorize the text of columns under + certain circumstances. I take a color and an extra function + which will be called for each row + + Example, to colorize negative values to red: + + >>> def colorize(value): + ... return value < 0 + ... + ... ColoredColumn('age', data_type=int, color='red', + ... data_func=colorize), + """ + + def __init__(self, attribute, title=None, data_type=None, + color=None, data_func=None, **kwargs): + if not issubclass(data_type, number): + raise TypeError("data type must be a number") + if not callable(data_func): + raise TypeError("data func must be callable") + + self._color = gdk.color_parse(color) + self._color_normal = None + + self._data_func = data_func + + Column.__init__(self, attribute, title, data_type, **kwargs) + + def on_attach_renderer(self, renderer): + renderer.set_property('foreground-set', True) + self._color_normal = renderer.get_property('foreground-gdk') + + def renderer_func(self, renderer, data): + if self._data_func(data): + color = self._color + else: + color = self._color_normal + + renderer.set_property('foreground-gdk', color) + +class _ContextMenu(gtk.Menu): + + """ + ContextMenu is a wrapper for the menu that's displayed when right + clicking on a column header. It monitors the treeview and rebuilds + when columns are added, removed or moved. + """ + + def __init__(self, treeview): + gtk.Menu.__init__(self) + + self._dirty = True + self._signal_ids = [] + self._treeview = treeview + self._treeview.connect('columns-changed', + self._on_treeview__columns_changed) + self._create() + + def clean(self): + for child in self.get_children(): + self.remove(child) + + for menuitem, signal_id in self._signal_ids: + menuitem.disconnect(signal_id) + self._signal_ids = [] + + def popup(self, event): + self._create() + gtk.Menu.popup(self, None, None, None, + event.button, event.time) + + def _create(self): + if not self._dirty: + return + + self.clean() + + for column in self._treeview.get_columns(): + header_widget = column.get_widget() + if not header_widget: + continue + title = header_widget.get_text() + + menuitem = gtk.CheckMenuItem(title) + menuitem.set_active(column.get_visible()) + signal_id = menuitem.connect("activate", + self._on_menuitem__activate, + column) + self._signal_ids.append((menuitem, signal_id)) + menuitem.show() + self.append(menuitem) + + self._dirty = False + + def _on_treeview__columns_changed(self, treeview): + self._dirty = True + + def _on_menuitem__activate(self, menuitem, column): + active = menuitem.get_active() + column.set_visible(active) + + # The width or height of some of the rows might have + # changed after changing the visibility of the column, + # so we have to re-measure all the rows, this can be done + # using row_changed. + model = self._treeview.get_model() + for row in model: + model.row_changed(row.path, row.iter) + + children = self.get_children() + if active: + # Make sure all items are selectable + for child in children: + child.set_sensitive(True) + else: + # Protect so we can't hide all the menu items + # If there's only one menuitem less to select, set + # it to insensitive + active_children = [child for child in children + if child.get_active()] + if len(active_children) == 1: + active_children[0].set_sensitive(False) + +COL_MODEL = 0 + +_marker = object() + +class ObjectList(PropertyObject, gtk.ScrolledWindow): + """ + An enhanced version of GtkTreeView, which provides pythonic wrappers + for accessing rows, and optional facilities for column sorting (with + types) and column selection. + + Items in an ObjectList is stored in objects. Each row represents an object + and each column represents an attribute in the object. + The column description object must be a subclass of L{Column}. + Simple example + + >>> class Fruit: + >>> pass + + >>> apple = Fruit() + >>> apple.name = 'Apple' + >>> apple.description = 'Worm house' + + >>> banana = Fruit() + >>> banana.name = 'Banana' + >>> banana.description = 'Monkey food' + + >>> list = ObjectList([Column('name'), + >>> Column('description')]) + >>> list.append(apple) + >>> list.append(banana) + """ + + __gtype_name__ = 'ObjectList' + + # row activated + gsignal('row-activated', object) + + # selected row(s) + gsignal('selection-changed', object) + + # row double-clicked + gsignal('double-click', object) + + # edited object, attribute name + gsignal('cell-edited', object, str) + + # emitted when empty or non-empty status changes + gsignal('has-rows', bool) + + # this property is used to serialize the columns of a ObjectList. The format + # is a big string with '^' as the column separator and '|' as the field + # separator + gproperty('column-definitions', str, nick="ColumnDefinitions") + gproperty('selection-mode', gtk.SelectionMode, + default=gtk.SELECTION_BROWSE, nick="SelectionMode") + + def __init__(self, columns=[], + instance_list=None, + mode=gtk.SELECTION_BROWSE): + """ + @param columns: a list of L{Column}s + @param instance_list: a list of objects to be inserted or None + @param mode: selection mode + """ + # allow to specify only one column + if isinstance(columns, Column): + columns = [columns] + elif not isinstance(columns, list): + raise TypeError("columns must be a list or a Column") + + if not isinstance(mode, gtk.SelectionMode): + raise TypeError("mode must be an gtk.SelectionMode enum") + # gtk.SELECTION_EXTENDED & gtk.SELECTION_MULTIPLE are both 3. + # so we can't do this check. + #elif mode == gtk.SELECTION_EXTENDED: + # raise TypeError("gtk.SELECTION_EXTENDED is deprecated") + + # Mapping of instance id -> treeiter + self._iters = {} + self._cell_data_caches = {} + self._columns_configured = False + self._autosize = True + self._vscrollbar = None + # by default we are unordered. This index points to the column + # definition of the column that dictates the order, in case there is + # any + self._sort_column_index = -1 + + gtk.ScrolledWindow.__init__(self) + + # we always want a vertical scrollbar. Otherwise the button on top + # of it doesn't make sense. This button is used to display the popup + # menu + self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS) + self.set_shadow_type(gtk.SHADOW_ETCHED_IN) + + self._model = gtk.ListStore(object) + self._model.connect('row-inserted', self._on_model__row_inserted) + self._model.connect('row-deleted', self._on_model__row_deleted) + self._treeview = gtk.TreeView(self._model) + self._treeview.connect('button-press-event', + self._on_treeview__button_press_event) + self._treeview.connect_after('row-activated', + self._after_treeview__row_activated) + self._treeview.set_rules_hint(True) + self._treeview.show() + self.add(self._treeview) + + # these tooltips are used for the columns + self._tooltips = gtk.Tooltips() + + # create a popup menu for showing or hiding columns + self._popup = _ContextMenu(self._treeview) + + # when setting the column definition the columns are created + self.set_columns(columns) + + if instance_list: + self._treeview.freeze_notify() + self._load(instance_list, clear=True) + self._treeview.thaw_notify() + + if self._sort_column_index != -1: + column = self._columns[self._sort_column_index] + self._model.set_sort_column_id(self._sort_column_index, + column.order) + + # Set selection mode last to avoid spurious events + selection = self._treeview.get_selection() + selection.connect("changed", self._on_selection__changed) + + # Select the first item if no items are selected + if mode != gtk.SELECTION_NONE and instance_list: + selection.select_iter(self._model[COL_MODEL].iter) + + # Depends on treeview and selection being set up + PropertyObject.__init__(self) + + self.set_selection_mode(mode) + + # Python list object implementation + # These methods makes the kiwi list behave more or less + # like a normal python list + # + # TODO: + # operators + # __add__, __eq__, __ge__, __gt__, __iadd__, + # __imul__, __le__, __lt__, __mul__, __ne__, + # __rmul__ + # + # misc + # __delitem__, __hash__, __reduce__, __reduce_ex__ + # __reversed__ + + def __len__(self): + "len(list)" + return len(self._model) + + def __nonzero__(self): + "if list" + return True + + def __contains__(self, instance): + "item in list" + for row in self._model: + if row[COL_MODEL] == instance: + return True + return False + + def __iter__(self): + "for item in list" + class ModelIterator: + def __init__(self): + self._index = -1 + + def __iter__(self): + return self + + def next(self, model=self._model): + try: + self._index += 1 + return model[self._index][COL_MODEL] + except IndexError: + raise StopIteration + + return ModelIterator() + + def __getitem__(self, arg): + "list[n]" + if isinstance(arg, (int, gtk.TreeIter, str)): + item = self._model[arg][COL_MODEL] + elif isinstance(arg, slice): + model = self._model + return [model[item][COL_MODEL] + for item in slicerange(arg, len(self._model))] + else: + raise TypeError("argument arg must be int, gtk.Treeiter or " + "slice, not %s" % type(arg)) + return item + + def __setitem__(self, arg, item): + "list[n] = m" + if isinstance(arg, (int, gtk.TreeIter, str)): + self._model[arg] = (item,) + elif isinstance(arg, slice): + raise NotImplementedError("slices for list are not implemented") + else: + raise TypeError("argument arg must be int or gtk.Treeiter," + " not %s" % type(arg)) + + # append and remove are below + + def extend(self, iterable): + """ + Extend list by appending elements from the iterable + + @param iterable: + """ + + return self.add_list(iterable, clear=False) + + def index(self, item, start=None, stop=None): + """ + Return first index of value + + @param item: + @param start: + @param stop + """ + + if start is not None or stop is not None: + raise NotImplementedError("start and stop") + + treeiter = self._iters.get(id(item), _marker) + if treeiter is _marker: + raise ValueError("item %r is not in the list" % item) + + return self._model[treeiter].path[0] + + def count(self, item): + "L.count(item) -> integer -- return number of occurrences of value" + + count = 0 + for row in self._model: + if row[COL_MODEL] == item: + count += 1 + return count + + def insert(self, index, item): + "L.insert(index, item) -- insert object before index" + raise NotImplementedError + + def pop(self, index): + """ + Remove and return item at index (default last) + @param index: + """ + raise NotImplementedError + + def reverse(self, pos, item): + "L.reverse() -- reverse *IN PLACE*" + raise NotImplementedError + + def sort(self, pos, item): + """L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*; + cmp(x, y) -> -1, 0, 1""" + raise NotImplementedError + + # Properties + + def prop_set_column_definition(self, value): + self.set_columns(value) + return value + + def prop_set_selection_mode(self, mode): + self.set_selection_mode(mode) + + def prop_get_selection_mode(self): + return self.get_selection_mode() + + # Model + + def _on_model__row_inserted(self, model, path, iter): + if len(model) == 1: + self.emit('has-rows', True) + + def _on_model__row_deleted(self, model, path): + if not len(model): + self.emit('has-rows', False) + + # Columns handling + def _load(self, instances, clear): + # do nothing if empty list or None provided + model = self._model + if clear: + if not instances: + self.unselect_all() + self.clear() + return + + model = self._model + iters = self._iters + + old_instances = [row[COL_MODEL] for row in model] + + # Save selection + selected_instances = [] + if old_instances: + selection = self._treeview.get_selection() + _, paths = selection.get_selected_rows() + if paths: + selected_instances = [model[path][COL_MODEL] + for (path,) in paths] + + iters = self._iters + prev = None + # Do not always just clear the list, check if we have the same + # instances in the list we want to insert and merge in the new + # items + if clear: + for instance in iter(instances): + objid = id(instance) + # If the instance is not in the list insert it after + # the previous inserted object + if not objid in iters: + if prev is None: + prev = model.append((instance,)) + else: + prev = model.insert_after(prev, (instance,)) + iters[objid] = prev + else: + prev = iters[objid] + + # Optimization when we were empty, we wont need to remove anything + # nor restore selection + if old_instances: + # Remove + objids = [id(instance) for instance in instances] + for instance in old_instances: + objid = id(instance) + if objid in objids: + continue + self._remove(objid) + else: + for instance in iter(instances): + iters[id(instance)] = model.append((instance,)) + + # Restore selection + for instance in selected_instances: + objid = id(instance) + if objid in iters: + selection.select_iter(iters[objid]) + + # As soon as we have data for that list, we can autosize it, and + # we don't want to autosize again, or we may cancel user + # modifications. + if self._autosize: + self._treeview.columns_autosize() + self._autosize = False + + def _setup_columns(self): + if self._columns_configured: + return + + searchable = None + sorted = None + expand = False + for column in self._columns: + if column.searchable: + if searchable: + raise ValueError("Can't make column %s searchable, column" + " %s is already set as searchable" % ( + column.attribute, searchable.attribute)) + searchable = column.searchable + if column.sorted: + if sorted: + raise ValueError("Can't make column %s sorted, column" + " %s is already set as sortable" % ( + column.attribute, sorted.attribute)) + sorted = column.sorted + if column.expand: + expand = True + + for column in self._columns: + self._setup_column(column) + + if not expand: + column = gtk.TreeViewColumn() + self._treeview.append_column(column) + + self._columns_configured = True + + def _setup_column(self, column): + # You can't subclass bool, so this is okay + if (column.data_type is bool and column.format): + raise TypeError("format is not supported for boolean columns") + + index = self._columns.index(column) + self._model.set_sort_func(index, self._sort_function) + treeview_column = self._treeview.get_column(index) + if treeview_column is None: + treeview_column = self._create_column(column) + + renderer, renderer_prop = self._guess_renderer_for_type(column) + if column.on_attach_renderer: + column.on_attach_renderer(renderer) + justify = column.justify + if justify == gtk.JUSTIFY_RIGHT: + xalign = 1.0 + elif justify == gtk.JUSTIFY_CENTER: + xalign = 0.5 + elif justify in (gtk.JUSTIFY_LEFT, + gtk.JUSTIFY_FILL): + xalign = 0.0 + else: + raise AssertionError + renderer.set_property("xalign", xalign) + treeview_column.set_property("alignment", xalign) + + if column.use_stock: + cell_data_func = self._cell_data_pixbuf_func + else: + cell_data_func = self._cell_data_text_func + + if column.cell_data_func: + cell_data_func = column.cell_data_func + elif column.cache: + self._cell_data_caches[column.attribute] = {} + + treeview_column.pack_start(renderer) + treeview_column.set_cell_data_func(renderer, cell_data_func, + (column, renderer_prop)) + treeview_column.set_visible(column.visible) + + treeview_column.connect("clicked", self._on_column__clicked, column) + if column.width: + treeview_column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) + treeview_column.set_fixed_width(column.width) + if column.tooltip: + widget = self._get_column_button(treeview_column) + if widget is not None: + self._tooltips.set_tip(widget, column.tooltip) + + if column.expand: + # Default is False + treeview_column.set_expand(True) + + if column.sorted: + self._sort_column_index = index + treeview_column.set_sort_indicator(True) + + if column.width: + self._autosize = False + + if column.searchable: + if not issubclass(column.data_type, basestring): + raise TypeError("Unsupported data type for " + "searchable column: %s" % column.data_type) + self._treeview.set_search_column(index) + self._treeview.set_search_equal_func(self._search_equal_func, + column) + + if column.radio: + if not issubclass(column.data_type, bool): + raise TypeError("You can only use radio for boolean columns") + + # typelist here may be none. It's okay; justify_columns will try + # and use the specified justifications and if not present will + # not touch the column. When typelist is not set, + # append/add_list have a chance to fix up the remaining + # justification by looking at the first instance's data. +# self._justify_columns(columns, typelist) + + def _create_column(self, column): + treeview_column = gtk.TreeViewColumn() + # we need to set our own widget because otherwise + # __get_column_button won't work + + label = gtk.Label(column.title) + label.show() + treeview_column.set_widget(label) + treeview_column.set_resizable(True) + treeview_column.set_clickable(True) + treeview_column.set_reorderable(True) + self._treeview.append_column(treeview_column) + + # setup the button to show the popup menu + button = self._get_column_button(treeview_column) + button.connect('button-release-event', + self._on_header__button_release_event) + return treeview_column + + def _on_renderer_toggle_check__toggled(self, renderer, path, model, attr): + obj = model[path][COL_MODEL] + value = not getattr(obj, attr, None) + setattr(obj, attr, value) + self.emit('cell-edited', obj, attr) + + def _on_renderer_toggle_radio__toggled(self, renderer, path, model, attr): + # Deactive old one + old = renderer.get_data('kiwilist::radio-active') + + # If we don't have the radio-active set it means we're doing + # This for the first time, so scan and see which one is currently + # active, so we can deselect it + if not old: + # XXX: Handle multiple values set to True, this + # algorithm just takes the first one it finds + for row in self._model: + obj = row[COL_MODEL] + value = getattr(obj, attr) + if value == True: + old = obj + break + else: + raise TypeError("You need an initial attribute value set " + "to true when using radio") + + setattr(old, attr, False) + + # Active new and save a reference to the object of the + # previously selected row + new = model[path][COL_MODEL] + setattr(new, attr, True) + renderer.set_data('kiwilist::radio-active', new) + self.emit('cell-edited', new, attr) + + def _on_renderer_text__edited(self, renderer, path, text, + model, attr, column, from_string): + obj = model[path][COL_MODEL] + value = from_string(text) + setattr(obj, attr, value) + self.emit('cell-edited', obj, attr) + + def _guess_renderer_for_type(self, column): + """Gusses which CellRenderer we should use for a given type. + It also set the property of the renderer that depends on the model, + in the renderer. + """ + + # TODO: Move to column + data_type = column.data_type + if data_type is bool: + renderer = gtk.CellRendererToggle() + if column.editable: + renderer.set_property('activatable', True) + # Boolean can be either a radio or a checkbox. + # Changes are handled by the toggled callback, which + # should only be connected if the column is editable. + if column.radio: + renderer.set_radio(True) + cb = self._on_renderer_toggle_radio__toggled + else: + cb = self._on_renderer_toggle_check__toggled + renderer.connect('toggled', cb, self._model, column.attribute) + prop = 'active' + elif column.use_stock or data_type == gdk.Pixbuf: + renderer = gtk.CellRendererPixbuf() + prop = 'pixbuf' + if column.editable: + raise TypeError("use-stock columns cannot be editable") + elif issubclass(data_type, (datetime.date, datetime.time, + basestring, number, + currency)): + renderer = gtk.CellRendererText() + prop = 'text' + if column.editable: + renderer.set_property('editable', True) + renderer.connect('edited', self._on_renderer_text__edited, + self._model, column.attribute, column, + column.from_string) + + else: + raise ValueError("the type %s is not supported yet" % data_type) + + return renderer, prop + + def _search_equal_func(self, model, tree_column, key, treeiter, column): + data = column.get_attribute(model[treeiter][COL_MODEL], + column.attribute, None) + if data.startswith(key): + return False + return True + + def _cell_data_text_func(self, tree_column, renderer, model, treeiter, + (column, renderer_prop)): + + row = model[treeiter] + if column.editable_attribute: + data = column.get_attribute(row[COL_MODEL], + column.editable_attribute, None) + data_type = column.data_type + if isinstance(renderer, gtk.CellRendererToggle): + renderer.set_property('activatable', data) + elif isinstance(renderer, gtk.CellRendererText): + renderer.set_property('editable', data) + else: + raise AssertionError + + if column.cache: + cache = self._cell_data_caches[column.attribute] + path = row.path[0] + if path in cache: + data = cache[path] + else: + data = column.get_attribute(row[COL_MODEL], + column.attribute, None) + cache[path] = data + else: + data = column.get_attribute(row[COL_MODEL], + column.attribute, None) + + text = column.as_string(data) + + renderer.set_property(renderer_prop, text) + + if column.renderer_func: + column.renderer_func(renderer, data) + + def _cell_data_pixbuf_func(self, tree_column, renderer, model, treeiter, + (column, renderer_prop)): + row = model[treeiter] + data = column.get_attribute(row[COL_MODEL], + column.attribute, None) + pixbuf = self.render_icon(data, column.icon_size) + renderer.set_property(renderer_prop, pixbuf) + + def _on_header__button_release_event(self, button, event): + if event.button == 3: + self._popup.popup(event) + return False + + return False + + def _on_renderer__edited(self, renderer, path, value, column): + data_type = column.data_type + if data_type in number: + value = data_type(value) + + # XXX convert new_text to the proper data type + setattr(self._model[path][COL_MODEL], column.attribute, value) + + def _on_renderer__toggled(self, renderer, path, column): + setattr(self._model[path][COL_MODEL], column.attribute, + not renderer.get_active()) + + def _clear_columns(self): + while self._treeview.get_columns(): + self._treeview.remove_column(self._treeview.get_column(COL_MODEL)) + + self._popup.clean() + + self._columns_configured = False + + # selection methods + def _select_and_focus_row(self, row_iter): + self._treeview.set_cursor(self._model[row_iter].path) + + def _sort_function(self, model, iter1, iter2): + column = self._columns[self._sort_column_index] + attr = column.attribute + return column.compare( + column.get_attribute(model[iter1][COL_MODEL], attr), + column.get_attribute(model[iter2][COL_MODEL], attr)) + + def _on_column__clicked(self, treeview_column, column): + # this means we are not sorting at all + if self._sort_column_index == -1: + return + + old_treeview_column = self._treeview.get_column( + self._sort_column_index) + + if treeview_column is old_treeview_column: + # same column, so reverse the order + if column.order == gtk.SORT_ASCENDING: + new_order = gtk.SORT_DESCENDING + elif column.order == gtk.SORT_DESCENDING: + new_order = gtk.SORT_ASCENDING + else: + raise AssertionError + else: + # new column, sort ascending + new_order = gtk.SORT_ASCENDING + self._sort_column_index = self._columns.index(column) + # cosmetic changes + old_treeview_column.set_sort_indicator(False) + treeview_column.set_sort_indicator(True) + + column.order = new_order + treeview_column.set_sort_order(new_order) + + # This performs the actual ordering + self._model.set_sort_column_id(self._sort_column_index, new_order) + + # handlers + def _after_treeview__row_activated(self, treeview, path, view_column): + try: + row = self._model[path] + except IndexError: + print 'path %s was not found in model: %s' % ( + path, map(list, self._model)) + return + item = row[COL_MODEL] + self.emit('row-activated', item) + + def _on_selection__changed(self, selection): + mode = selection.get_mode() + if mode == gtk.SELECTION_MULTIPLE: + item = self.get_selected_rows() + elif mode in (gtk.SELECTION_SINGLE, gtk.SELECTION_BROWSE): + item = self.get_selected() + else: + raise AssertionError + self.emit('selection-changed', item) + + def _on_treeview__button_press_event(self, treeview, event): + if event.type == gtk.gdk._2BUTTON_PRESS: + selection = self._treeview.get_selection() + mode = selection.get_mode() + if mode == gtk.SELECTION_MULTIPLE: + item = self.get_selected_rows() + else: + item = self.get_selected() + self.emit('double-click', item) + + # hacks + def _get_column_button(self, column): + """Return the button widget of a particular TreeViewColumn. + + This hack is needed since that widget is private of the TreeView but + we need access to them for Tooltips, right click menus, ... + + Use this function at your own risk + """ + + button = column.get_widget() + assert button is not None, ("You must call column.set_widget() " + "before calling _get_column_button") + + while not isinstance(button, gtk.Button): + button = button.get_parent() + + return button + + # start of the hack to put a button on top of the vertical scrollbar + def _setup_popup_button(self): + """Put a button on top of the vertical scrollbar to show the popup + menu. + Internally it uses a POPUP window so you can tell how *Evil* is this. + """ + self._popup_window = gtk.Window(gtk.WINDOW_POPUP) + self._popup_button = gtk.Button('*') + self._popup_window.add(self._popup_button) + self._popup_window.show_all() + + self.forall(self._find_vertical_scrollbar) + self.connect('size-allocate', self._on_scrolled_window__size_allocate) + self.connect('realize', self._on_scrolled_window__realize) + + def _find_vertical_scrollbar(self, widget): + """This method is called from a .forall() method in the ScrolledWindow. + It just save a reference to the vertical scrollbar for doing evil + things later. + """ + if isinstance(widget, gtk.VScrollbar): + self._vscrollbar = widget + + def _get_header_height(self): + treeview_column = self._treeview.get_column(0) + button = self._get_column_button(treeview_column) + alloc = button.get_allocation() + return alloc.height + + def _on_scrolled_window__realize(self, widget): + toplevel = widget.get_toplevel() + self._popup_window.set_transient_for(toplevel) + self._popup_window.set_destroy_with_parent(True) + + def _on_scrolled_window__size_allocate(self, widget, allocation): + """Resize the Vertical Scrollbar to make it smaller and let space + for the popup button. Also put that button there. + """ + old_alloc = self._vscrollbar.get_allocation() + height = self._get_header_height() + new_alloc = gtk.gdk.Rectangle(old_alloc.x, old_alloc.y + height, + old_alloc.width, + old_alloc.height - height) + self._vscrollbar.size_allocate(new_alloc) + # put the popup_window in its position + gdk_window = self.window + if gdk_window: + winx, winy = gdk_window.get_origin() + self._popup_window.move(winx + old_alloc.x, + winy + old_alloc.y) + + # end of the popup button hack + + # + # Public API + # + def get_model(self): + "Return treemodel of the current list" + return self._model + + def get_treeview(self): + "Return treeview of the current list" + return self._treeview + + def get_columns(self): + return self._columns + + def get_column_by_name(self, name): + """Returns the name of a column""" + for column in self._columns: + if column.attribute == name: + return column + + raise LookupError("There is no column called %s" % name) + + def get_treeview_column(self, column): + """ + @param column: a @Column + """ + if not isinstance(column, Column): + raise TypeError + + if not column in self._columns: + raise ValueError + + index = self._columns.index(column) + tree_columns = self._treeview.get_columns() + return tree_columns[index] + + def set_columns(self, value): + """This function can be called in two different ways: + - value is a string with the column definitions in a special format + (see column-definitions property at the beginning of this class) + + - value is a list/tuple of Column objects + """ + + if isinstance(value, basestring): + self._columns_string = value + self._columns = [] + for col in value.split('^'): + if not col: + continue + self._columns.append(Column.from_string(col)) + elif isinstance(value, (list, tuple)): + self._columns = value + self._columns_string = '^'.join([str(col) for col in value]) + else: + raise ValueError("value should be a string of a list of columns") + + self._clear_columns() + self._setup_columns() + + def append(self, instance, select=False): + """Adds an instance to the list. + - instance: the instance to be added (according to the columns spec) + - select: whether or not the new item should appear selected. + """ + + # Freeze and save original selection mode to avoid blinking + self._treeview.freeze_notify() + + row_iter = self._model.append((instance,)) + self._iters[id(instance)] = row_iter + + if self._autosize: + self._treeview.columns_autosize() + + if select: + self._select_and_focus_row(row_iter) + self._treeview.thaw_notify() + + def _remove(self, objid): + # linear search for the instance to remove + treeiter = self._iters.pop(objid) + if not treeiter: + return False + + # Remove any references to this path + self._clear_cache_for_iter(treeiter) + + # All references to the iter gone, now it can be removed + self._model.remove(treeiter) + + return True + + def _clear_cache_for_iter(self, treeiter): + # Not as inefficent as it looks + path = self._model[treeiter].path[0] + for cache in self._cell_data_caches.values(): + if path in cache: + del cache[path] + + def remove(self, instance, select=False): + """Remove an instance from the list. + If the instance is not in the list it returns False. Otherwise it + returns True. + + @param instance: + @param select: if true, the previous item will be selected + if there is one. + """ + + objid = id(instance) + if not objid in self._iters: + raise ValueError("instance %r is not in the list" % instance) + + + if select: + prev = self.get_previous(instance) + rv = self._remove(objid) + if prev != instance: + self.select(prev) + else: + rv = self._remove(objid) + return rv + + def update(self, instance): + objid = id(instance) + if not objid in self._iters: + raise ValueError("instance %r is not in the list" % instance) + treeiter = self._iters[objid] + self._clear_cache_for_iter(treeiter) + self._model.row_changed(self._model[treeiter].path, treeiter) + + def refresh(self): + """ + Reloads the values from all objects. + """ + # XXX: Optimize this to only reload items, no need to remove/readd + model = self._model + instances = [row[COL_MODEL] for row in model] + model.clear() + self.add_list(instances) + + def set_column_visibility(self, column_index, visibility): + treeview_column = self._treeview.get_column(column_index) + treeview_column.set_visible(visibility) + + def get_selection_mode(self): + selection = self._treeview.get_selection() + if selection: + return selection.get_mode() + + def set_selection_mode(self, mode): + selection = self._treeview.get_selection() + if selection: + self.notify('selection-mode') + return selection.set_mode(mode) + + def unselect_all(self): + selection = self._treeview.get_selection() + if selection: + selection.unselect_all() + + def select_paths(self, paths): + """ + Selects a number of rows corresponding to paths + + @param paths: rows to be selected + """ + + selection = self._treeview.get_selection() + if selection.get_mode() == gtk.SELECTION_NONE: + raise TypeError("Selection not allowed") + + selection.unselect_all() + for path in paths: + selection.select_path(path) + + def select(self, instance, scroll=True): + selection = self._treeview.get_selection() + if selection.get_mode() == gtk.SELECTION_NONE: + raise TypeError("Selection not allowed") + + objid = id(instance) + if not objid in self._iters: + raise ValueError("instance %s is not in the list" % repr(instance)) + + treeiter = self._iters[objid] + + selection.select_iter(treeiter) + + if scroll: + self._treeview.scroll_to_cell(self._model[treeiter].path, + None, True, 0.5, 0) + + def get_selected(self): + """Returns the currently selected object + If an object is not selected, None is returned + """ + selection = self._treeview.get_selection() + if not selection: + # AssertionError ? + return + + mode = selection.get_mode() + if mode == gtk.SELECTION_NONE: + raise TypeError("Selection not allowed in %r mode" % mode) + elif mode not in (gtk.SELECTION_SINGLE, gtk.SELECTION_BROWSE): + log.warn('get_selected() called when multiple rows ' + 'can be selected') + + model, treeiter = selection.get_selected() + if treeiter: + return model[treeiter][COL_MODEL] + + def get_selected_rows(self): + """Returns a list of currently selected objects + If no objects are selected an empty list is returned + """ + selection = self._treeview.get_selection() + if not selection: + # AssertionError ? + return + + mode = selection.get_mode() + if mode == gtk.SELECTION_NONE: + raise TypeError("Selection not allowed in %r mode" % mode) + elif mode in (gtk.SELECTION_SINGLE, gtk.SELECTION_BROWSE): + log.warn('get_selected_rows() called when only a single row ' + 'can be selected') + + model, paths = selection.get_selected_rows() + if paths: + return [model[path][COL_MODEL] for (path,) in paths] + return [] + + def add_list(self, instances, clear=True): + """ + Allows a list to be loaded, by default clearing it first. + freeze() and thaw() are called internally to avoid flashing. + + @param instances: a list to be added + @param clear: a boolean that specifies whether or not to + clear the list + """ + + self._treeview.freeze_notify() + + ret = self._load(instances, clear) + + self._treeview.thaw_notify() + + return ret + + def clear(self): + """Removes all the instances of the list""" + self._model.clear() + self._iters = {} + + # Don't clear the whole cache, just the + # individual column caches + for key in self._cell_data_caches: + self._cell_data_caches[key] = {} + + def get_next(self, instance): + """ + Returns the item after instance in the list. + Note that the instance must be inserted before this can be called + If there are no instances after, the first item will be returned. + + @param instance: the instance + """ + + objid = id(instance) + if not objid in self._iters: + raise ValueError("instance %r is not in the list" % instance) + + treeiter = self._iters[objid] + + model = self._model + pos = model[treeiter].path[0] + if pos >= len(model) - 1: + pos = 0 + else: + pos += 1 + return model[pos][COL_MODEL] + + def get_previous(self, instance): + """ + Returns the item before instance in the list. + Note that the instance must be inserted before this can be called + If there are no instances before, the last item will be returned. + + @param instance: the instance + """ + + objid = id(instance) + if not objid in self._iters: + raise ValueError("instance %r is not in the list" % instance) + treeiter = self._iters[objid] + + model = self._model + pos = model[treeiter].path[0] + if pos == 0: + pos = len(model) - 1 + else: + pos -= 1 + return model[pos][COL_MODEL] + + def get_selected_row_number(self): + """ + @returns: the selected row number or None if no rows were selected + """ + selection = self._treeview.get_selection() + if selection.get_mode() == gtk.SELECTION_MULTIPLE: + model, paths = selection.get_selected_rows() + if paths: + return paths[0][0] + else: + model, iter = selection.get_selected() + if iter: + return model[iter].path[0] + + def double_click(self, rowno): + """ + Same as double clicking on the row rowno + + @param rowno: integer + """ + columns = self._treeview.get_columns() + if not columns: + raise AssertionError( + "%s has no columns" % self.get_name()) + + self._treeview.row_activated(rowno, columns[0]) + + def set_headers_visible(self, value): + """ + @param value: if true, shows the headers, if false hide then + """ + self._treeview.set_headers_visible(value) + +type_register(ObjectList) + +class ListLabel(gtk.HBox): + """I am a subclass of a GtkHBox which you can use if you want + to vertically align a label with a column + """ + + def __init__(self, klist, column, label='', value_format='%s'): + """ + @param klist: list to follow + @type klist: kiwi.ui.objectlist.ObjectList + @param column: name of a column in a klist + @type column: string + @param label: label + @type label: string + @param value_format: format string used to format value + @type value_format: string + """ + self._label = label + self._label_width = -1 + if not isinstance(klist, ObjectList): + raise TypeError("list must be a kiwi list and not %r" % + type(klist).__name__) + self._klist = klist + if not isinstance(column, str): + raise TypeError("column must be a string and not %r" % + type(column).__name__) + self._column = klist.get_column_by_name(column) + self._value_format = value_format + + gtk.HBox.__init__(self) + + self._create_ui() + + # Public API + + def set_value(self, value): + """Sets the value of the label. + Note that it needs to be of the same type as you specified in + value_format in the constructor. + I also support the GMarkup syntax, so you can use "<b>%d</b>" if + you want.""" + self._value_widget.set_markup(self._value_format % value) + + def get_value_widget(self): + return self._value_widget + + def get_label_widget(self): + return self._label_widget + + # Private + + def _create_ui(self): + + # When tracking the position/size of a column, we need to pay + # attention to the following two things: + # * treeview_column::width + # * size-allocate of treeview_columns header widget + # + tree_column = self._klist.get_treeview_column(self._column) + tree_column.connect('notify::width', + self._on_treeview_column__notify_width) + + button = self._klist._get_column_button(tree_column) + button.connect('size-allocate', + self._on_treeview_column_button__size_allocate) + + self._label_widget = gtk.Label() + self._label_widget.set_markup(self._label) + + layout = self._label_widget.get_layout() + self._label_width = layout.get_pixel_size()[0] + self._label_widget.set_alignment(1.0, 0.5) + self.pack_start(self._label_widget, False, False, padding=6) + self._label_widget.show() + + self._value_widget = gtk.Label() + xalign = tree_column.get_property('alignment') + self._value_widget.set_alignment(xalign, 0.5) + self.pack_start(self._value_widget, False, False) + self._value_widget.show() + + def _resize(self, position=-1, width=-1): + if position != -1: + if position != 0: + if self._label_width > position: + self._label_widget.set_text('') + else: + self._label_widget.set_markup(self._label) + + # XXX: Replace 12 with a constant + if position >= 12: + self._label_widget.set_size_request(position - 12, -1) + + if width != -1: + self._value_widget.set_size_request(width, -1) + + # Callbacks + + def _on_treeview_column_button__size_allocate(self, label, rect): + self._resize(position=rect[0]) + + def _on_treeview_column__notify_width(self, treeview, pspec): + value = treeview.get_property(pspec.name) + self._resize(width=value) + + def _on_list__size_allocate(self, list, rect): + self._resize(position=rect[0], width=rect[2]) + + +class SummaryLabel(ListLabel): + """I am a subclass of ListLabel which you can use if you want + to summarize all the values of a specific column. + Please note that I only know how to handle number column + data types and I will complain if you give me something else.""" + + def __init__(self, klist, column, label=_('Total:'), value_format='%s'): + ListLabel.__init__(self, klist, column, label, value_format) + if not issubclass(self._column.data_type, number): + raise TypeError("data_type of column must be a number, not %r", + self._column.data_type) + klist.connect('cell-edited', self._on_klist__cell_edited) + self.update_total() + + # Public API + + def update_total(self): + """Recalculate the total value of all columns""" + column = self._column + attr = column.attribute + get_attribute = column.get_attribute + + value = sum([get_attribute(obj, attr) for obj in self._klist], + column.data_type('0')) + + self.set_value(column.as_string(value)) + + # Callbacks + + def _on_klist__cell_edited(self, klist, object, attribute): + self.update_total() diff --git a/kiwi/ui/proxy.py b/kiwi/ui/proxy.py new file mode 100644 index 0000000..fb80138 --- /dev/null +++ b/kiwi/ui/proxy.py @@ -0,0 +1,373 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2002-2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# Gustavo Rahal <gustavo@async.com.br> +# Johan Dahlin <jdahlin@async.com.br> +# + +"""This module defines the Proxy class, which is a facility that can be used +to keep the state of a model object synchronized with a View. +""" + +import gobject +import gtk + +from kiwi import ValueUnset +from kiwi.accessor import kgetattr, ksetattr, clear_attr_cache +from kiwi.decorators import deprecated +from kiwi.interfaces import IProxyWidget, IValidatableProxyWidget +from kiwi.log import Logger + +class ProxyError(Exception): + pass + +log = Logger('proxy') + +def block_widget(widget): + """Blocks the signal handler of the 'content-changed' signal on widget""" + connection_id = widget.get_data('content-changed-id') + if connection_id: + widget.handler_block(connection_id) + +def unblock_widget(widget): + """Unblocks the signal handler of the 'content-changed' signal on widget""" + connection_id = widget.get_data('content-changed-id') + if connection_id: + widget.handler_unblock(connection_id) + +class Proxy: + """ A Proxy is a class that 'attaches' an instance to an interface's + widgets, and transparently manipulates that instance's attributes as + the user alters the content of the widgets. + + The Proxy takes the widget list and detects what widgets are to be + attached to the model by looking if it is a KiwiWidget and if it + has the model-attribute set. + """ + + def __init__(self, view, model=None, widgets=()): + """ + @param view: view attched to the slave + @type view: a L{kiwi.ui.views.BaseView} subclass + @param model: model attached to proxy + @param widgets: the widget names + @type widgets: list of strings + """ + self._view = view + self._model = model + self._model_attributes = {} + + for widget_name in widgets: + widget = getattr(self._view, widget_name, None) + if widget is None: + raise AttributeError("The widget %s was not found in the " + "view %s" % ( + widget_name, self._view.__class__.__name__)) + + self._setup_widget(widget_name, widget) + + # Private API + + def _reset_widget(self, attribute, widget): + if self._model is None: + # if we have no model, leave value unset so we pick up + # the widget default below. + value = ValueUnset + else: + # if we have a model, grab its value to update the widgets + self._register_proxy_in_model(attribute) + value = kgetattr(self._model, attribute, ValueUnset) + + self.update(attribute, value, block=True) + + # The initial value of the model is set, at this point + # do a read, it'll trigger a validation for widgets who + # supports it. + if not IValidatableProxyWidget.providedBy(widget): + return + + widget.validate(force=True) + + def _setup_widget(self, widget_name, widget): + if not IProxyWidget.providedBy(widget): + raise ProxyError("The widget %s (%r), in view %s is not " + "a kiwi widget and cannot be added to a proxy" + % (widget_name, widget, + self._view.__class__.__name__)) + + data_type = widget.get_property('data-type') + if data_type is None: + raise ProxyError("The kiwi widget %s (%r) in view %s should " + "have a data type set" % ( + widget_name, widget, self._view.__class__.__name__)) + + attribute = widget.get_property('model-attribute') + if not attribute: + raise ProxyError( + "The widget %s (%s) in view %s is a kiwi widget but does " + "not have a model attribute set so it will not be " + "associated with the model" % ( + widget_name, widget, self._view.__class__.__name__)) + + # Do a isinstance here instead of in the callback, + # as an optimization, it'll never change in runtime anyway + connection_id = widget.connect( + 'content-changed', + self._on_widget__content_changed, + attribute, + IValidatableProxyWidget.providedBy(widget)) + widget.set_data('content-changed-id', connection_id) + + model_attributes = self._model_attributes + # save this widget in our map + if (attribute in model_attributes and + # RadioButtons are allowed several times + not gobject.type_is_a(widget, 'GtkRadioButton')): + old_widget = model_attributes[attribute] + raise KeyError("The widget %s (%r) in view %s is already in " + "the proxy, defined by widget %s (%r)" % ( + widget_name, widget, self._view.__class__.__name__, + old_widget.name, old_widget)) + + model_attributes[attribute] = widget + self._reset_widget(attribute, widget) + + def _register_proxy_in_model(self, attribute): + model = self._model + if not hasattr(model, "register_proxy_for_attribute"): + return + try: + model.register_proxy_for_attribute(attribute, self) + except AttributeError: + msg = ("Failed to run register_proxy() on Model %s " + "(that was supplied to %s. \n" + "(Hint: if this model also inherits from ZODB's " + "Persistent class, this problem occurs if you haven't " + "set __setstate__() up correctly. __setstate__() " + "should call Model.__init__() (and " + "Persistent.__setstate__() of course) to rereset " + "things properly.)") + raise TypeError(msg % (model, self)) + + def _unregister_proxy_in_model(self): + if self._model and hasattr(self._model, "unregister_proxy"): + self._model.unregister_proxy(self) + + # Callbacks + + def _on_widget__content_changed(self, widget, attribute, validate): + """This is called as soon as the content of one of the widget + changes, the widgets tries fairly hard to not emit when it's not + neccessary""" + + # skip updates for model if there is none, right? + if self._model is None: + return + + if validate: + value = widget.validate() + else: + value = widget.read() + + log('%s.%s = %r' % (self._model.__class__.__name__, + attribute, value)) + + # only update the model if the data is correct + if value is ValueUnset: + return + + model = self._model + # XXX: one day we might want to queue and unique updates? + if hasattr(model, "block_proxy"): + model.block_proxy(self) + ksetattr(model, attribute, value) + model.unblock_proxy(self) + else: + ksetattr(model, attribute, value) + + # Call global update hook + self.proxy_updated(widget, attribute, value) + + # Properties + + def _get_model(self): + return self._model + model = property(_get_model) + + # Public API + + def proxy_updated(self, widget, attribute, value): + """ This is a hook that is called whenever the proxy updates the + model. Implement it in the inherited class to perform actions that + should be done each time the user changes something in the interface. + This hook by default does nothing. + @param widget: + @param attribute: + @param value: + """ + + def update_many(self, attributes, value=ValueUnset, block=False): + """ + Like L{update} but takes a sequence of attributes + + @param attributes: sequence of attributes to update + @param value: see L{update} + @param block: see L{update} + """ + + for attribute in attributes: + self.update(attribute, value, block) + + def update(self, attribute, value=ValueUnset, block=False): + """ Generic frontend function to update the contentss of a widget based + on its model attribute name using the internal update functions. + + @param attribute: the name of the attribute whose widget we wish to + updated. If accessing a radiobutton, specify its group + name. + @param value: specifies the value to set in the widget. If + unspecified, it defaults to the current model's value + (through an accessor, if it exists, or getattr). + @param block: defines if we are to block cascading proxy updates + triggered by this update. You should use block if you are + calling update on *the same attribute that is currently + being updated*. + This means if you have hooked to a signal of the widget + associated to that attribute, and you call update() for + the *same attribute*, use block=True. And pray. 8). If + block is set to False, the normal update mechanism will + occur (the model being updated in the end, hopefully). + """ + + if value is ValueUnset: + # We want to obtain a value from our model + if self._model is None: + # We really want to avoid trying to update our UI if our + # model doesn't exist yet and no value was provided. + # update() is also called by user code, but it should be + # safe to return here since you shouldn't need to code + # around the lack of a model in your callbacks if you + # can help it. + value = None + else: + value = kgetattr(self._model, attribute, ValueUnset) + + widget = self._model_attributes.get(attribute, None) + + if widget is None: + raise AttributeError("Called update for `%s', which isn't " + "attached to the proxy %s. Valid " + "attributes are: %s (you may have " + "forgetten to add `:' to the name in " + "the widgets list)" + % (attribute, self, + self._model_attributes.keys())) + + + # The type of value should match the data-type property. The two + # exceptions to this rule are ValueUnset and None + if not (value is ValueUnset or value is None): + data_type = widget.get_property('data-type') + value_type = type(value) + if not isinstance(value, data_type): + raise TypeError( + "attribute %s of model %r requires a value of " + "type %s, not %s" % ( + attribute, self._model, + data_type.__name__, + value_type.__name__)) + + if block: + block_widget(widget) + self._view.handler_block(widget) + widget.update(value) + self._view.handler_unblock(widget) + unblock_widget(widget) + else: + widget.update(value) + return True + + def set_model(self, model, relax_type=False): + """ + Updates the model instance of the proxy. + Allows a proxy interface to change model without the need to destroy + and recreate the UI (which would cause flashing, at least) + + @param model: + @param relax_type: + """ + if self._model is not None and model is not None: + if (not relax_type and + type(model) != type(self._model) and + not isinstance(model, self._model.__class__)): + raise TypeError("model has wrong type %s, expected %s" + % (type(model), type(self._model))) + + # the following isn't strictly necessary, but it currently works + # around a bug with reused ids in the attribute cache and also + # makes a lot of sense for most applications (don't want a huge + # eternal cache pointing to models that you're not using anyway) + clear_attr_cache() + + # unregister previous proxy + self._unregister_proxy_in_model() + + self._model = model + + for attribute, widget in self._model_attributes.items(): + self._reset_widget(attribute, widget) + + def add_widget(self, name, widget): + """ + Adds a new widget to the proxy + + @param name: name of the widget + @param widget: widget, must be a gtk.Widget subclass + """ + if name in self._model_attributes: + raise TypeError("there is already a widget called %s" % name) + + if not isinstance(widget, gtk.Widget): + raise TypeError("%r must be a gtk.Widget subclass" % widget) + + self._setup_widget(name, widget) + + def remove_widget(self, name): + """ + Removes a widget from the proxy + + @param name: the name of the widget to remove + """ + if not name in self._model_attributes: + raise TypeError("there is no widget called %s" % name) + + widget = self._model_attributes.pop(name) + if IValidatableProxyWidget.providedBy(widget): + connection_id = widget.get_data('content-changed-id') + widget.disconnect(connection_id) + + # Backwards compatibility + + def new_model(self, model, relax_type=False): + self.set_model(model) + new_model = deprecated('set_model', log)(new_model) + diff --git a/kiwi/ui/proxywidget.py b/kiwi/ui/proxywidget.py new file mode 100644 index 0000000..717e832 --- /dev/null +++ b/kiwi/ui/proxywidget.py @@ -0,0 +1,316 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2003-2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# Gustavo Rahal <gustavo@async.com.br> +# Johan Dahlin <jdahlin@async.com.br> +# Daniel Saran R. da Cunha <daniel@async.com.br> +# + +"""Basic classes for widget support for the Kiwi Framework""" + +import gettext + +import gtk +from gtk import gdk + +from kiwi import ValueUnset +from kiwi.component import implements +from kiwi.datatypes import ValidationError, converter +from kiwi.environ import environ +from kiwi.interfaces import IProxyWidget, IValidatableProxyWidget +from kiwi.log import Logger +from kiwi.ui.gadgets import FadeOut +from kiwi.utils import gsignal, gproperty + +log = Logger('widget proxy') + +_ = gettext.gettext + +class ProxyWidgetMixin(object): + """This class is a mixin that provide a common interface for KiwiWidgets. + + Usually the Proxy class need to set and get data from the widgets. It also + need a validation framework. + + @cvar allowed_data_types: A list of types which we are allowed to use + in this class. + """ + + implements(IProxyWidget) + + gsignal('content-changed') + gsignal('validation-changed', bool) + gsignal('validate', object, retval=object) + + gproperty('data-type', object, blurb='Data Type') + gproperty('model-attribute', str, blurb='Model attribute') + + allowed_data_types = object, + + # To be able to call the as/from_string without setting the data_type + # property and still receiving a good warning. + _converter = None + + def __init__(self): + if not type(self.allowed_data_types) == tuple: + raise TypeError("%s.allowed_data_types must be a tuple" % ( + self.allowed_data_types)) + self._data_format = None + + # Properties + + def prop_set_data_type(self, data_type): + """Set the data type for the widget + + @param data_type: can be None, a type object or a string with the + name of the type object, so None, "<type 'str'>" + or 'str' + """ + if data_type is None: + return data_type + + # This may convert from string to type, + # A type object will always be returned + data_type = converter.check_supported(data_type) + + if not issubclass(data_type, self.allowed_data_types): + raise TypeError( + "%s only accept %s types, not %r" + % (self, + ' or '.join([t.__name__ for t in self.allowed_data_types]), + data_type)) + + self._converter = converter.get_converter(data_type) + return data_type + + # Public API + def set_data_format(self, format): + self._data_format = format + + def read(self): + """Get the content of the widget. + The type of the return value + @returns: None if the user input a invalid value + @rtype: Must matche the data-type property. + """ + raise NotImplementedError + + def update(self, value): + """ + @param value: + """ + raise NotImplementedError + + # Private + + def _as_string(self, data): + """Convert a value to a string + @param data: data to convert + """ + conv = self._converter + if conv is None: + raise AssertionError( + "You need to set a data type before calling _as_string") + + return conv.as_string(data, format=self._data_format) + + def _from_string(self, data): + """Convert a string to the data type of the widget + This may raise a L{kiwi.datatypes.ValidationError} if conversion + failed + @param data: data to convert + """ + conv = self._converter + if conv is None: + raise AssertionError( + "You need to set a data type before calling _from_string") + + return conv.from_string(data) + +MANDATORY_ICON = gtk.STOCK_EDIT +ERROR_ICON = gdk.pixbuf_new_from_file( + environ.find_resource('pixmap', 'validation-error-16.png')) + +class ValidatableProxyWidgetMixin(ProxyWidgetMixin): + """Class used by some Kiwi Widgets that need to support mandatory + input and validation features such as custom validation and data-type + validation. + + Mandatory support provides a way to warn the user when input is necessary. + The validatation feature provides a way to check the data entered and to + display information about what is wrong. + """ + + implements(IValidatableProxyWidget) + + gproperty('mandatory', bool, default=False) + + def __init__(self, widget=None): + ProxyWidgetMixin.__init__(self) + + self._valid = True + self._fade = FadeOut(self) + self._fade.connect('color-changed', self._on_fadeout__color_changed) + + # Override in subclass + + def update_background(self, color): + "Implement in subclass" + + def set_pixbuf(self, pixbuf): + "Implement in subclass" + + def get_icon_window(self): + "Implement in subclass" + + def set_tooltip(self, text): + "Implement in subclass" + + # Public API + + def is_valid(self): + """ + @returns: True if the widget is in validated state + """ + return self._valid + + def validate(self, force=False): + """Checks if the data is valid. + Validates data-type and custom validation. + + @param force: if True, force validation + @returns: validated data or ValueUnset if it failed + """ + + try: + data = self.read() + log.debug('Read %r for %s' % (data, self.model_attribute)) + + # check if we should draw the mandatory icon + # this need to be done before any data conversion because we + # we don't want to end drawing two icons + if self.mandatory and (data == None or + data == '' or + data == ValueUnset): + self.set_blank() + return ValueUnset + else: + + # The widgets themselves have now valid the data + # Next step is to call the application specificed + # checks, which are found in the view. + if data is not None and data is not ValueUnset: + # this signal calls the on_widgetname__validate method + # of the view class and gets the exception (if any). + error = self.emit("validate", data) + if error: + raise error + + self.set_valid() + return data + except ValidationError, e: + self.set_invalid(str(e)) + return ValueUnset + + def set_valid(self): + """Changes the validation state to valid, which will remove icons and + reset the background color + """ + + log.debug('Setting state for %s to VALID' % self.model_attribute) + self._set_valid_state(True) + + self._fade.stop() + self.set_pixbuf(None) + + def set_invalid(self, text=None, fade=True): + """Changes the validation state to invalid. + @param text: text of tooltip of None + @param fade: if we should fade the background + """ + log.debug('Setting state for %s to INVALID' % self.model_attribute) + + self._set_valid_state(False) + + if not fade: + return + + # If there is no error text, set a generic one so the error icon + # still have a tooltip + if not text: + text = _("'%s' is not a valid value for this field") % self.read() + + self.set_tooltip(text) + + # When the fading animation is finished, set the error icon + # We don't need to check if the state is valid, since stop() + # (which removes this timeout) is called as soon as the user + # types valid data. + def done(fadeout, c): + self.set_pixbuf(ERROR_ICON) + self.queue_draw() + fadeout.disconnect(c.signal_id) + + class SignalContainer: + pass + c = SignalContainer() + c.signal_id = self._fade.connect('done', done, c) + + if self._fade.start(): + self.set_pixbuf(None) + + def set_blank(self): + """Changes the validation state to blank state, this only applies + for mandatory widgets, draw an icon and set a tooltip""" + + log.debug('Setting state for %s to BLANK' % self.model_attribute) + + if self.mandatory: + self._draw_stock_icon(MANDATORY_ICON) + self.set_tooltip(_('This field is mandatory')) + self._fade.stop() + valid = False + else: + valid = True + + self._set_valid_state(valid) + + # Private + + def _set_valid_state(self, state): + """Updates the validation state and emits a signal iff it changed""" + + if self._valid == state: + return + + self.emit('validation-changed', state) + self._valid = state + + def _draw_stock_icon(self, stock_id): + icon = self.render_icon(stock_id, gtk.ICON_SIZE_MENU) + self.set_pixbuf(icon) + self.queue_draw() + + # Callbacks + + def _on_fadeout__color_changed(self, fadeout, color): + self.update_background(color) diff --git a/kiwi/ui/selectablebox.py b/kiwi/ui/selectablebox.py new file mode 100644 index 0000000..33d2085 --- /dev/null +++ b/kiwi/ui/selectablebox.py @@ -0,0 +1,186 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +""" +A box which you can select and will have a border around it when +you click on any widgets in it +""" + +import gtk +from gtk import gdk + +class SelectableBox(object): + def __init__(self, width=4): + self._selected = None + self._draw_gc = None + self._selection_width = width + self.unset_flags(gtk.NO_WINDOW) + self.set_redraw_on_allocate(True) + self.set_spacing(width) + self.set_border_width(width) + + # Public API + + def get_selected(self): + """ + @returns: the currently selected widget + """ + + return self._selected + + def set_selected(self, widget): + """ + @param widget: widget to select, must be a children of self + """ + + if not widget in self.get_children(): + raise ValueError("widget must be a child of %r" % self) + + old_selected = self._selected + self._selected = widget + if old_selected != widget: + self.queue_draw() + + def pack_start(self, child, expand=True, fill=True, padding=0): + """ + Identical to gtk.Box.pack_start + """ + super(SelectableBox, self).pack_start(child, expand=expand, + fill=fill, padding=padding) + self._child_added(child) + + def pack_end(self, child, expand=True, fill=True, padding=0): + """ + Identical to gtk.Box.pack_end + """ + super(SelectableBox, self).pack_end(child, expand=expand, + fill=fill, padding=padding) + self._child_added(child) + + def add(self, child): + """ + Identical to gtk.Container.add + """ + super(SelectableBox, self).add(child) + self._child_added(child) + + def update_selection(self): + selected = self._selected + if not selected: + return + + border = self._selection_width + x, y, w, h = selected.allocation + self.window.draw_rectangle(self._draw_gc, False, + x - (border / 2), y - (border / 2), + w + border, h + border) + + # GtkWidget + + def do_realize(self): + assert not (self.flags() & gtk.NO_WINDOW) + self.set_flags(self.flags() | gtk.REALIZED) + self.window = gdk.Window(self.get_parent_window(), + width=self.allocation.width, + height=self.allocation.height, + window_type=gdk.WINDOW_CHILD, + wclass=gdk.INPUT_OUTPUT, + event_mask=(self.get_events() | + gdk.EXPOSURE_MASK | + gdk.BUTTON_PRESS_MASK)) + self.window.set_user_data(self) + self.style.attach(self.window) + self.style.set_background(self.window, gtk.STATE_NORMAL) + + self._draw_gc = gdk.GC(self.window, + line_width=self._selection_width, + line_style=gdk.SOLID, + foreground=self.style.bg[gtk.STATE_SELECTED]) + + def do_button_press_event(self, event): + selected = self._get_child_at_pos(int(event.x), int(event.y)) + if selected: + self.set_selected(selected) + + # Private + + def _get_child_at_pos(self, x, y): + """ + @param x: x coordinate + @type x: integer + @param y: y coordinate + @type y: integer + """ + toplevel = self.get_toplevel() + for child in self.get_children(): + coords = toplevel.translate_coordinates(child, x, y) + if not coords: + continue + + child_x, child_y = coords + if (0 <= child_x < child.allocation.width and + 0 <= child_y < child.allocation.height and + child.flags() & (gtk.MAPPED | gtk.VISIBLE)): + return child + + def _child_added(self, child): + child.connect('button-press-event', + lambda child, e: self.set_selected(child)) + +class SelectableHBox(SelectableBox, gtk.HBox): + __gtype_name__ = 'SelectableHBox' + + def __init__(self, width=4): + gtk.HBox.__init__(self) + SelectableBox.__init__(self, width=width) + + do_realize = SelectableBox.do_realize + do_button_press_event = SelectableBox.do_button_press_event + + def do_size_allocate(self, allocation): + gtk.HBox.do_size_allocate(self, allocation) + if self.flags() & gtk.REALIZED: + self.window.move_resize(*allocation) + + def do_expose_event(self, event): + gtk.HBox.do_expose_event(self, event) + self.update_selection() + +class SelectableVBox(SelectableBox, gtk.VBox): + __gtype_name__ = 'SelectableVBox' + + def __init__(self, width=4): + gtk.VBox.__init__(self) + SelectableBox.__init__(self, width=width) + + do_realize = SelectableBox.do_realize + do_button_press_event = SelectableBox.do_button_press_event + + def do_size_allocate(self, allocation): + gtk.VBox.do_size_allocate(self, allocation) + if self.flags() & gtk.REALIZED: + self.window.move_resize(*allocation) + + def do_expose_event(self, event): + gtk.VBox.do_expose_event(self, event) + self.update_selection() diff --git a/kiwi/ui/test/__init__.py b/kiwi/ui/test/__init__.py new file mode 100644 index 0000000..436680f --- /dev/null +++ b/kiwi/ui/test/__init__.py @@ -0,0 +1,24 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br +# + +"""User interface: Testing""" diff --git a/kiwi/ui/test/common.py b/kiwi/ui/test/common.py new file mode 100644 index 0000000..37474e7 --- /dev/null +++ b/kiwi/ui/test/common.py @@ -0,0 +1,198 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br +# + +""" +Common routines used by L{kiwi.ui.test.listener.Listener} and +L{kiwi.ui.test.player.Player} +""" + +import sets + +import gobject +import gtk + +class Base(object): + def __init__(self): + self._windows = {} + self._window_list = self._list_windows() + gobject.timeout_add(25, self._check_windows) + self._objects = {} + + # Public API + + def parse_one(self, toplevel, gobj): + """ + @param toplevel: + @param gobj: + """ + + if not isinstance(gobj, gobject.GObject): + raise TypeError + + gtype = gobj + while True: + name = gobject.type_name(gtype) + func = getattr(self, name, None) + if func: + if func(toplevel, gobj): + break + if gtype == gobject.GObject.__gtype__: + break + + gtype = gobject.type_parent(gtype) + + def get_object(self, attr): + """ + @param attr: name of toplevel object to get + @returns: toplevel object + """ + return self._objects[attr] + + # Override in subclass + + def window_added(self, window): + """ + This will be called when a window is displayed + @param window: + """ + + def window_removed(self, window): + """ + This will be called when a window is destroyed + @param window: + """ + + # Private + + def _on_window_name_change(self, window, pspec, old_name): + # Update datastructures, no need to notify that the dialog + # was added, we already know about it and all its children + self._windows[window.get_name()] = self._windows.pop(old_name) + + def _list_windows(self): + # We're only interested in toplevels for now, tooltip windows are + # popups for example + rv = [] + for window in gtk.window_list_toplevels(): + if window.type != gtk.WINDOW_TOPLEVEL: + if not isinstance(window.child, gtk.Menu): + continue + + # Hack to get all the entries of a popup menu in + # the same namespace as the window they were launched + # in. + parent_menu = window.child.get_data('parent-menu') + if parent_menu: + main = parent_menu.get_toplevel() + rv.append((main.get_name(), window)) + else: + rv.append((window.get_name(), window)) + + return sets.Set(rv) + + def _check_windows(self): + new_windows = self._list_windows() + if self._windows != new_windows: + for name, window in new_windows.difference(self._window_list): + # Popup window, eg menu popups needs to be treated + # specially, only parse the contained widgets, do not + # add it or listen to name changes, we don't care about them + if window.type == gtk.WINDOW_POPUP: + # XXX: This is trigged by stoq.test.gui.salewizard + if name in self._windows: + toplevel = self._windows[name] + self.parse_one(toplevel, window) + else: + self.parse_one(window, window) + + window.connect('notify::name', self._on_window_name_change, + window.get_name()) + self.window_added(window) + self._windows[name] = window + + for name, window in self._window_list.difference(new_windows): + # We don care about popup windows, see above + if window.type == gtk.WINDOW_POPUP: + continue + + self.window_removed(window) + del self._windows[name] + + self._window_list = new_windows + return True + + def ignore(self, toplevel, gobj): + pass + + GtkSeparatorMenuItem = GtkTearoffMenuItem = ignore + + def _add_widget(self, toplevel, widget, name): + toplevel_widgets = self._objects.setdefault(toplevel.get_name(), {}) + if not name in toplevel_widgets: + toplevel_widgets[name] = widget + + def GtkWidget(self, toplevel, widget): + """ + Called when a GtkWidget is about to be traversed + """ + self._add_widget(toplevel, widget, widget.get_name()) + + def GtkContainer(self, toplevel, container): + """ + Called when a GtkContainer is about to be traversed + + Parsers all the children and listens for new children, which + may be added at a later point. + """ + for child in container.get_children(): + self.parse_one(toplevel, child) + + def _on_container_add(container, widget): + self.parse_one(toplevel, widget) + container.connect('add', _on_container_add) + + def GtkDialog(self, toplevel, dialog): + """ + Called when a GtkDialog is about to be traversed + + Just parses the widgets embedded in the dialogs. + """ + self.parse_one(toplevel, dialog.action_area) + self.parse_one(toplevel, dialog.vbox) + + def GtkMenuItem(self, toplevel, item): + """ + Called when a GtkMenuItem is about to be traversed + + It does some magic to tie a stronger connection between toplevel + menuitems and submenus, which later will be used. + """ + submenu = item.get_submenu() + if submenu: + submenu.set_data('parent-menu', item) + for child_item in submenu.get_children(): + child_item.set_data('parent-menu', item) + self.parse_one(toplevel, submenu) + + def GtkToolButton(self, toplevel, item): + item.child.set_name(item.get_name()) diff --git a/kiwi/ui/test/listener.py b/kiwi/ui/test/listener.py new file mode 100644 index 0000000..bfb4583 --- /dev/null +++ b/kiwi/ui/test/listener.py @@ -0,0 +1,458 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br +# + +""" +User interface event listener and serializer. + +This module provides an interface for creating, listening to +and saving events. +It uses the gobject introspection base class +L{kiwi.ui.test.common.Base} to gather widgets, windows and other objects. + +The user interfaces are saved in a format so they can easily be played +back by simply executing the script through a standard python interpreter. +""" + +import atexit + +from gtk import gdk +import gtk + +from kiwi.ui.test.common import Base +from kiwi.ui.combomixin import ComboMixin +from kiwi.ui.objectlist import ObjectList + +_events = [] + +def register_event_type(event_type): + """ + Add an event type to a list of event types. + + @param event_type: a L{Event} subclass + """ + if event_type in _events: + raise AssertionError("event %s already registered" % event_type) + _events.append(event_type) + +def get_event_types(): + """ + Returns the collection of event types. + @returns: the event types. + """ + return _events + +class SkipEvent(Exception): + pass + +class Event(object): + """ + Event is a base class for all events. + An event represent a user change of an interactive widget. + @cvar object_type: subclass for type, L{Listener} uses this to + automatically attach events to objects when they appear + """ + object_type = None + def __init__(self, object, name=None): + """ + @param object: a gobject subclass + @param name: name of the object, if None, the + method get_name() will be called + """ + self.object = object + if name is None: + name = object.get_name() + self.name = name + self.toplevel_name = self.get_toplevel(object).get_name() + + # Override in subclass + def get_toplevel(self, widget): + """ + This fetches the toplevel widget for a specific object, + by default it assumes it's a wiget subclass and calls + get_toplevel() for the widget + + Override this in a subclass. + """ + return widget.get_toplevel() + + def serialize(self): + """ + Serialize the widget, write the code here which is + used to reproduce the event, for a button which is clicked + the implementation looks like this: + + >>> def serialize(self): + >>> ... return '%s.clicked' % self.name + + @returns: string to reproduce event + Override this in a subclass. + """ + pass + +class SignalEvent(Event): + """ + A SignalEvent is an L{Event} which is tied to a GObject signal, + L{Listener} uses this to automatically attach itself to a signal + at which point this object will be instantiated. + + @cvar signal_name: signal to listen to + """ + signal_name = None + def __init__(self, object, name, args): + """ + @param object: + @param name: + @param args: + """ + Event.__init__(self, object, name) + self.args = args + + def connect(cls, object, signal_name, cb): + """ + Calls connect on I{object} for signal I{signal_name}. + + @param object: object to connect on + @param signal_name: signal name to listen to + @param cb: callback + """ + object.connect(signal_name, cb, cls, object) + connect = classmethod(connect) + +class WindowDeleteEvent(SignalEvent): + """ + This event represents a user click on the close button in the + window manager. + """ + + signal_name = 'delete-event' + object_type = gtk.Window + + def serialize(self): + return 'delete_window("%s")' % self.name + +register_event_type(WindowDeleteEvent) + +class MenuItemActivateEvent(SignalEvent): + """ + This event represents a user click on a menu item. + It could be a toplevel or a normal entry in a submenu. + """ + signal_name = 'activate' + object_type = gtk.MenuItem + + def serialize(self): + return '%s.activate()' % self.name +register_event_type(MenuItemActivateEvent) + +class ImageMenuItemButtonReleaseEvent(SignalEvent): + """ + This event represents a click on a normal menu entry + It's sort of a hack to use button-press-event, instea + of listening to activate, but we'll get the active callback + after the user specified callbacks are called, at which point + it is already too late. + """ + signal_name = 'button-release-event' + object_type = gtk.ImageMenuItem + + def get_toplevel(self, widget): + parent = widget + while True: + widget = parent.get_data('parent-menu') + if not widget: + break + parent = widget + toplevel = parent.get_toplevel() + return toplevel + + def serialize(self): + return '%s.activate()' % self.name +register_event_type(ImageMenuItemButtonReleaseEvent) + +class ToolButtonReleaseEvent(SignalEvent): + """ + This event represents a click on a normal toolbar button + Hackish, see L{ImageMenuItemButtonReleaseEvent} for more details. + """ + signal_name = 'button-release-event' + object_type = gtk.Button + + def serialize(self): + return '%s.activate()' % self.name +register_event_type(ToolButtonReleaseEvent) + +class EntrySetTextEvent(SignalEvent): + """ + This event represents a content modification of a GtkEntry. + When the user deletes, clears, adds, modifies the text this + event will be created. + """ + signal_name = 'notify::text' + object_type = gtk.Entry + + def __init__(self, object, name, args): + SignalEvent.__init__(self, object, name, args) + self.text = self.object.get_text() + + def serialize(self): + return '%s.set_text("%s")' % (self.name, self.text) +register_event_type(EntrySetTextEvent) + +class EntryActivateEvent(SignalEvent): + """ + This event represents an activate event for a GtkEntry, eg when + the user presses enter in a GtkEntry. + """ + + signal_name = 'activate' + object_type = gtk.Entry + + def serialize(self): + return '%s.activate()' % (self.name) +register_event_type(EntryActivateEvent) + +# Also works for Toggle, Radio and Check +class ButtonClickedEvent(SignalEvent): + """ + This event represents a button click. + Note that this will also work for GtkToggleButton, GtkRadioButton + and GtkCheckButton. + """ + signal_name = 'clicked' + object_type = gtk.Button + + def serialize(self): + return '%s.clicked()' % self.name +register_event_type(ButtonClickedEvent) + +# Kiwi widget support +class ObjectListSelectionChanged(SignalEvent): + """ + This event represents a selection change on a + L{kiwi.ui.objectlist.ObjectList}, + eg when the user selects or unselects a row. + It is actually tied to the signal changed on GtkTreeSelection object. + """ + object_type = ObjectList + signal_name = 'changed' + def __init__(self, objectlist, name, args): + self._objectlist = objectlist + SignalEvent.__init__(self, objectlist, name=objectlist.get_name(), + args=args) + self.rows = self._get_rows() + + def _get_rows(self): + selection = self._objectlist.get_treeview().get_selection() + + if selection.get_mode() == gtk.SELECTION_MULTIPLE: + # get_selected_rows() returns a list of paths + iters = selection.get_selected_rows()[1] + if iters: + return iters + else: + # while get_selected returns an iter, yay. + model, iter = selection.get_selected() + if iter is not None: + # so convert it to a path and put it in an empty list + return [model.get_string_from_iter(iter)] + + return [] + + def connect(cls, orig, signal_name, cb): + object = orig.get_treeview().get_selection() + object.connect(signal_name, cb, cls, orig) + connect = classmethod(connect) + + def get_toplevel(self, widget): + return self._objectlist.get_toplevel() + + def serialize(self): + return '%s.select_paths(%s)' % (self.name, self.rows) +register_event_type(ObjectListSelectionChanged) + +class ObjectListDoubleClick(SignalEvent): + """ + This event represents a double click on a row in objectlist + """ + signal_name = 'button-press-event' + object_type = ObjectList + + def __init__(self, objectlist, name, args): + event, = args + if event.type != gdk._2BUTTON_PRESS: + raise SkipEvent + + SignalEvent.__init__(self, objectlist, name, args) + self.row = objectlist.get_selected_row_number() + + def connect(cls, orig, signal_name, cb): + object = orig.get_treeview() + object.connect(signal_name, cb, cls, orig) + connect = classmethod(connect) + + def serialize(self): + return '%s.double_click(%s)' % (self.name, self.row) +register_event_type(ObjectListDoubleClick) + +class KiwiComboBoxChangedEvent(SignalEvent): + """ + This event represents a a selection of an item + in a L{kiwi.ui.widgets.combobox.ComboBoxEntry} or + L{kiwi.ui.widgets.combobox.ComboBox}. + """ + signal_name = 'changed' + object_type = ComboMixin + def __init__(self, combo, name, args): + SignalEvent.__init__(self, combo, name, args) + self.label = combo.get_selected_label() + + def serialize(self): + return '%s.select_item_by_label("%s")' % (self.name, self.label) + +register_event_type(KiwiComboBoxChangedEvent) + +class Listener(Base): + """ + Listener takes care of attaching events to widgets, when the appear, + and creates the events when the user is interacting with some widgets. + When the tracked program is closed the events are serialized into + a script which can be played back with help of + L{kiwi.ui.test.player.Player}. + """ + + def __init__(self, filename, args): + """ + @param filename: name of the script + @param args: command line used to run the script + """ + Base.__init__(self) + self._filename = filename + self._args = args + self._events = [] + self._listened_objects = [] + self._event_types = self._configure_event_types() + + atexit.register(self.save) + + def _configure_event_types(self): + event_types = {} + for event_type in get_event_types(): + if event_type.object_type is None: + raise AssertionError + elist = event_types.setdefault(event_type.object_type, []) + elist.append(event_type) + + return event_types + + def _add_event(self, event): + self._events.append(event) + + def _listen_event(self, object, event_type): + if not issubclass(event_type, SignalEvent): + raise TypeError("Can only listen to SignalEvents, not %r" + % event_type) + + if event_type.signal_name is None: + raise ValueError("signal_name cannot be None") + + # This is horrible, but there's no good way of passing in + # more than one variable to the script and we really want to be + # able to connect it to any kind of signal, regardless of + # the number of parameters the signal has + def on_signal(object, *args): + event_type, orig = args[-2:] + try: + self._add_event(event_type(orig, None, args[:-2])) + except SkipEvent: + pass + event_type.connect(object, event_type.signal_name, on_signal) + + def window_removed(self, window): + self._add_event(WindowDeleteEvent(window, None, [])) + + def parse_one(self, toplevel, gobj): + Base.parse_one(self, toplevel, gobj) + + # mark the object as "listened" to ensure we'll always + # receive unique objects + if gobj in self._listened_objects: + return + self._listened_objects.append(gobj) + + for object_type, event_types in self._event_types.items(): + if not isinstance(gobj, object_type): + continue + + for event_type in event_types: + # These 3 hacks should move into the event class itself + if event_type == MenuItemActivateEvent: + if not isinstance(gobj.get_parent(), gtk.MenuBar): + continue + elif event_type == ToolButtonReleaseEvent: + if not isinstance(gobj.get_parent(), gtk.ToolButton): + continue + elif event_type == ButtonClickedEvent: + if isinstance(gobj.get_parent(), gtk.ToolButton): + continue + + if issubclass(event_type, SignalEvent): + self._listen_event(gobj, event_type) + + def save(self): + """ + Collect events and serialize them into a script and save + the script. + This should be called when the tracked program has + finished executing. + """ + + try: + fd = open(self._filename, 'w') + except IOError: + raise SystemExit("Could not write: %s" % self._filename) + fd.write("from kiwi.ui.test.player import Player\n" + "\n" + "player = Player(%s)\n" + "app = player.get_app()\n" % repr(self._args)) + + windows = {} + + for event in self._events: + toplevel = event.toplevel_name + if not toplevel in windows: + fd.write('\n' + 'player.wait_for_window("%s")\n' % toplevel) + windows[toplevel] = True + + if isinstance(event, WindowDeleteEvent): + fd.write("player.%s\n\n" % (event.serialize())) + if not event.name in windows: + # Actually a bug + continue + del windows[event.name] + else: + fd.write("app.%s.%s\n" % (toplevel, + event.serialize())) + + fd.write('player.finish()\n') + fd.close() diff --git a/kiwi/ui/test/main.py b/kiwi/ui/test/main.py new file mode 100644 index 0000000..b1c1d37 --- /dev/null +++ b/kiwi/ui/test/main.py @@ -0,0 +1,52 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005,2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# + +""" +Kiwi UI Test: command line interface +""" + +import optparse +import sys + +def _play(filename, args): + from kiwi.ui.test.player import play_file + play_file(filename, args) + +def _record(filename, args): + from kiwi.ui.test.listener import Listener + + Listener(filename, args[1:]) + + sys.argv = args[1:] + execfile(sys.argv[0]) + +def main(args): + parser = optparse.OptionParser() + parser.add_option('', '--record', action="store", + dest="record") + options, args = parser.parse_args(args) + + if options.record: + _record(options.record, args) + else: + if len(args) < 2: + raise SystemExit("Error: needs a filename to play") + _play(args[1], args[2:]) diff --git a/kiwi/ui/test/player.py b/kiwi/ui/test/player.py new file mode 100644 index 0000000..0e17e16 --- /dev/null +++ b/kiwi/ui/test/player.py @@ -0,0 +1,250 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005,2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br +# + +""" +Test script playback system and infrastructure. +""" +import os +import sys +import threading +import time + +import gobject +gobject.threads_init() +import gtk +from gtk import gdk +gdk.threads_init() + +from kiwi.log import Logger +from kiwi.ui.test.common import Base + +WINDOW_TIMEOUT = 10 +WINDOW_WAIT = 0.5 +WIDGET_TIMEOUT = 2 + +# This is pretty important, it gives the application 2 seconds +# to finish closing the dialog, eg write stuff to the database and +# yada yada +DELETE_WINDOW_WAIT = 4 + +class TimeOutError(Exception): + """ + Exception that will be raised when a widget cannot be found, + which will happen after a few seconds depending on the type + of widget + """ + pass + +log = Logger('uitest') + +class ThreadSafeFunction: + """ + A function which is safe thread in the mainloop context + All widgets and object functions will be wrapped by this. + """ + + def __init__(self, func, obj_name): + self._func = func + self._obj_name = obj_name + + def _invoke(self, *args, **kwargs): + gdk.threads_enter() + log('Calling %s.%s(%s)' % (self._obj_name, + self._func.__name__, + ', '.join(map(repr, args)))) + self._func(*args, **kwargs) + gdk.threads_leave() + return False + + def __call__(self, *args, **kwargs): + # dialog.run locks us out + #rv = self._func(*args, **kwargs) + gobject.idle_add(self._invoke, *args, **kwargs) + +class ThreadSafeObject: + """ + A wrapper around a gobject which replaces all callable + objects which wraps all callable objects uses L{ThreadSafeFunction}. + """ + def __init__(self, gobj): + """ + @param gobj: + """ + self._gobj = gobj + + def __getattr__(self, name): + attr = getattr(self._gobj, name, None) + if attr is None: + raise KeyError(name) + if callable(attr): + return ThreadSafeFunction(attr, self._gobj.get_name()) + return attr + +class DictWrapper(object): + def __init__(self, dict, name): + self._dict = dict + self._name = name + + def __getattr__(self, attr): + start = time.time() + while True: + if (time.time() - start) > WIDGET_TIMEOUT: + raise TimeOutError("no %s called %s" % (self._name, attr)) + + if attr in self._dict: + return ThreadSafeObject(self._dict[attr]) + + time.sleep(0.1) + +class App(DictWrapper): + def __init__(self, player): + self._player = player + + def __getattr__(self, attr): + return DictWrapper(self._player.get_object(attr), 'widget') + +class Player(Base): + """ + Event playback object. Usually used inside a scripted generated by + L{kiwi.ui.test.listener.Listener}. + + The application script will be exectured in a different thread, + so to be able to conveniently use it a number of tricks are used + to avoid making the user worry about threadsafety. + """ + def __init__(self, args): + """ + @param args: + """ + Base.__init__(self) + + self._app = App(self) + + if not os.path.exists(args[0]): + print >> sys.stderr, \ + "ERROR: %s: No such a file or directory" % args[0] + os._exit(1) + + # Send notification to main thread + gobject.idle_add(self._start_app, args) + + def _start_app(self, args): + sys.argv = args[:] + execfile(sys.argv[0]) + + # Run all pending events, such as idle adds + while gtk.events_pending(): + gtk.main_iteration() + + def get_app(self): + """ + Returns a virtual application object, which is a special object + where you can access the windows as attributes and widget in the + windows as attributes on the window, examples: + + >>> app = player.get_app() + >>> app.WindowName.WidgetName.method() + + @return: virtual application object + """ + return self._app + + def wait_for_window(self, name, timeout=WINDOW_TIMEOUT): + """ + Waits for a window with name I{name} to appear. + + @param name: the name of the window to wait for + @param timeout: number of seconds to wait after the window appeared. + """ + + log('waiting for %s (%d)' % (name, timeout)) + + # XXX: No polling! + start_time = time.time() + while True: + if name in self._objects: + window = self.get_object(name) + time.sleep(WINDOW_WAIT) + return window + + if time.time() - start_time > timeout: + raise TimeOutError("could not find window %s" % name) + time.sleep(0.05) + + def delete_window(self, window_name): + """ + Deletes a window, creates a delete-event and sends it to the window + """ + + log('deleting window %s' % window_name) + + if window_name in self._objects: + del self._objects[window_name] + + start_time = time.time() + while True: + window = self._windows.get(window_name) + # If the window is already removed, skip + if (not window_name in self._windows or + window is None or + window.window is None): + return False + + if time.time() - start_time > DELETE_WINDOW_WAIT: + event = gdk.Event(gdk.DELETE) + event.window = window.window + event.put() + return True + time.sleep(0.1) + + def finish(self): + pass + +def play_file(filename, args=None): + """ + Plays a recorded script file + + @param filename: name to play + @param args: additional arguments to put in sys.argv + """ + if not os.path.exists(filename): + raise SystemExit("%s: No such a file or directory" % filename) + + if not args: + args = [] + + sys.argv = [filename] + args + + def _thread(filename): + try: + execfile(filename) + except: + import traceback + etype, value, tb = sys.exc_info() + traceback.print_exception(etype, value, tb.tb_next) + os._exit(1) + + t = threading.Thread(target=_thread, args=[filename]) + t.start() + + gobject.MainLoop().run() diff --git a/kiwi/ui/tooltip.py b/kiwi/ui/tooltip.py new file mode 100644 index 0000000..23ad395 --- /dev/null +++ b/kiwi/ui/tooltip.py @@ -0,0 +1,118 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +"""A tooltip popup window which only pop ups on demand, which +makes it possible for us to tie it to a specific gtk.gdk.Window +""" + +import gobject +import gtk + +DEFAULT_DELAY = 500 +BORDER_WIDTH = 4 + +class Tooltip(gtk.Window): + def __init__(self, widget): + gtk.Window.__init__(self, gtk.WINDOW_POPUP) + # from gtktooltips.c:gtk_tooltips_force_window + self.set_app_paintable(True) + self.set_resizable(False) + self.set_name("gtk-tooltips") + self.set_border_width(BORDER_WIDTH) + self.connect('expose-event', self._on__expose_event) + + self._label = gtk.Label() + self.add(self._label) + self._show_timeout_id = -1 + + # from gtktooltips.c:gtk_tooltips_draw_tips + def _calculate_pos(self, widget): + screen = widget.get_screen() + + w, h = self.size_request() + + x, y = widget.window.get_origin() + + if widget.flags() & gtk.NO_WINDOW: + x += widget.allocation.x + y += widget.allocation.y + + x = screen.get_root_window().get_pointer()[0] + x -= (w / 2 + BORDER_WIDTH) + + pointer_screen, px, py, _ = screen.get_display().get_pointer() + if pointer_screen != screen: + px = x + py = y + + monitor_num = screen.get_monitor_at_point(px, py) + monitor = screen.get_monitor_geometry(monitor_num) + + if (x + w) > monitor.x + monitor.width: + x -= (x + w) - (monitor.x + monitor.width); + elif x < monitor.x: + x = monitor.x + + if ((y + h + widget.allocation.height + BORDER_WIDTH) > + monitor.y + monitor.height): + y = y - h - BORDER_WIDTH + else: + y = y + widget.allocation.height + BORDER_WIDTH + + return x, y + + # from gtktooltips.c:gtk_tooltips_paint_window + def _on__expose_event(self, window, event): + w, h = window.size_request() + window.style.paint_flat_box(window.window, + gtk.STATE_NORMAL, gtk.SHADOW_OUT, + None, window, "tooltip", + 0, 0, w, h) + return False + + def _real_display(self, widget): + x, y = self._calculate_pos(widget) + + self.move(x, y) + self.show_all() + + # Public API + + def set_text(self, text): + self._label.set_text(text) + + def hide(self): + gtk.Window.hide(self) + gobject.source_remove(self._show_timeout_id) + self._show_timeout_id = -1 + + def display(self, widget): + if not self._label.get_text(): + return + + if self._show_timeout_id != -1: + return + + self._show_timeout_id = gobject.timeout_add(DEFAULT_DELAY, + self._real_display, + widget) diff --git a/kiwi/ui/views.py b/kiwi/ui/views.py new file mode 100644 index 0000000..0c68d4e --- /dev/null +++ b/kiwi/ui/views.py @@ -0,0 +1,967 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2001-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Jon Nelson <jnelson@securepipe.com> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# Johan Dahlin <jdahlin@async.com.br> +# Henrique Romano <henrique@async.com.br> +# + +""" +Defines the View classes that are included in the Kiwi Framework, which +are the base of Delegates and Proxies. +""" + +import re +import string + +import gobject +import gtk +from gtk import gdk + +from kiwi.environ import is_gazpacho_required +from kiwi.interfaces import IValidatableProxyWidget +from kiwi.log import Logger +from kiwi.utils import gsignal, type_register +from kiwi.ui.gadgets import quit_if_last +from kiwi.ui.proxy import Proxy + +log = Logger('view') + +_non_interactive = ( + gtk.Label, + gtk.Alignment, + gtk.AccelLabel, + gtk.Arrow, + gtk.EventBox, + gtk.Fixed, + gtk.Frame, + gtk.HBox, + gtk.HButtonBox, + gtk.HPaned, + gtk.HSeparator, + gtk.Layout, + gtk.Progress, + gtk.ProgressBar, + gtk.ScrolledWindow, + gtk.Table, + gtk.VBox, + gtk.VButtonBox, + gtk.VPaned, + gtk.VSeparator, + gtk.Window, +) + +color_red = gdk.color_parse('red') +color_black = gdk.color_parse('black') + +# +# Signal brokers +# + +method_regex = re.compile(r'^(on|after)_(\w+)__(\w+)$') + +class SignalBroker(object): + def __init__(self, view, controller): + methods = controller._get_all_methods() + self._do_connections(view, methods) + + def _do_connections(self, view, methods): + """This method allows subclasses to add more connection mechanism""" + self._autoconnect_by_method_name(view, methods) + + def _autoconnect_by_method_name(self, view, methods): + """ + Offers autoconnection of widget signals based on function names. + You simply need to define your controller method in the format:: + + def on_widget_name__signal_name(self, widget, *args): + + In other words, start the method by "on_", followed by the + widget name, followed by two underscores ("__"), followed by the + signal name. Note: If more than one double underscore sequences + are in the string, the last one is assumed to separate the + signal name. + """ + self._autoconnected = {} + + for fname in methods.keys(): + # `on_x__y' has 7 chars and is the smallest possible handler + # (though illegal, of course, since the signal name x is bogus) + if len(fname) < 7: + continue + match = method_regex.match(fname) + if match is None: + continue + after, w_name, signal = match.groups() + widget = getattr(view, w_name, None) + if widget is None: + raise AttributeError("couldn't find widget %s in %s" + % (w_name, view)) + if not isinstance(widget, gobject.GObject): + raise AttributeError("%s (%s) is not a widget or an action " + "and can't be connected to" + % (w_name, widget)) + # Must use getattr; using the class method ends up with it + # being called unbound and lacking, thus, "self". + try: + if after: + signal_id = widget.connect_after(signal, methods[fname]) + else: + signal_id = widget.connect(signal, methods[fname]) + except TypeError: + log.warn("Widget %s doesn't provide a signal %s" % ( + widget.__class__, signal)) + continue + self._autoconnected.setdefault(widget, []).append(( + signal, signal_id)) + + def handler_block(self, widget, signal_name): + signals = self._autoconnected + if not widget in signals: + return + + for signal, signal_id in signals[widget]: + if signal_name is None or signal == signal_name: + widget.handler_block(signal_id) + + def handler_unblock(self, widget, signal_name): + signals = self._autoconnected + if not widget in signals: + return + + for signal, signal_id in signals[widget]: + if signal_name is None or signal == signal_name: + widget.handler_unblock(signal_id) + + def disconnect_autoconnected(self): + for widget, signals in self._autoconnected.items(): + for signal in signals: + widget.disconnect(signal[1]) + +class GladeSignalBroker(SignalBroker): + def _do_connections(self, view, methods): + super(GladeSignalBroker, self)._do_connections(view, methods) + self._connect_glade_signals(view, methods) + + def _connect_glade_signals(self, view, methods): + # mainly because the two classes cannot have a common base + # class. studying the class layout carefully or using + # composition may be necessary. + + # called by framework.basecontroller. takes a controller, and + # creates the dictionary to attach to the signals in the tree. + if not methods: + raise AssertionError("controller must be provided") + + dict = {} + for name, method in methods.items(): + if callable(method): + dict[name] = method + view._glade_adaptor.signal_autoconnect(dict) + + +class SlaveView(gobject.GObject): + """ + Base class for all View classes. Defines the essential class + attributes (controller, toplevel, widgets) and handles + initialization of toplevel and widgets. Once + AbstractView.__init__() has been called, you can be sure + self.toplevel and self.widgets are sane and processed. + + When a controller is associated with a View (the view should be + passed in to its constructor) it will try and call a hook in the + View called _attach_callbacks. See AbstractGladeView for an example + of this method. + """ + controller = None + toplevel = None + widgets = [] + toplevel_name = None + gladefile = None + gladename = None + domain = None + + # This signal is emited when the view wants to return a result value + gsignal("result", object) + + # This is emitted when validation changed for a view + # Used by parents views to know when child slaves changes + gsignal('validation-changed', bool) + + def __init__(self, toplevel=None, widgets=None, gladefile=None, + gladename=None, toplevel_name=None, domain=None): + """ Creates a new SlaveView. Sets up self.toplevel and self.widgets + and checks for reserved names. + """ + gobject.GObject.__init__(self) + + self._broker = None + self.slaves = {} + self._proxies = [] + self._valid = True + + # slave/widget name -> validation status + self._validation = {} + + # stores the function that will be called when widgets + # validity is checked + self._validate_function = None + + # setup the initial state with the value of the arguments or the + # class variables + klass = type(self) + self.toplevel = toplevel or klass.toplevel + self.widgets = widgets or klass.widgets + self.gladefile = gladefile or klass.gladefile + self.gladename = gladename or klass.gladename + self.toplevel_name = (toplevel_name or + klass.toplevel_name or + self.gladefile or + self.gladename) + self.domain = domain or klass.domain + + self._check_reserved() + self._glade_adaptor = self.get_glade_adaptor() + self.toplevel = self._get_toplevel() + + # grab the accel groups + self._accel_groups = gtk.accel_groups_from_object(self.toplevel) + + # XXX: support normal widgets + # notebook page label widget -> + # dict (slave name -> validation status) + self._notebook_validation = {} + self._notebooks = self._get_notebooks() + + def _get_notebooks(self): + if not self._glade_adaptor: + return [] + + return [widget for widget in self._glade_adaptor.get_widgets() + if isinstance(widget, gtk.Notebook)] + + def _check_reserved(self): + for reserved in ["widgets", "toplevel", "gladefile", + "gladename", "tree", "model", "controller"]: + # XXX: take into account widget constructor? + if reserved in self.widgets: + raise AttributeError( + "The widgets list for %s contains a widget named `%s', " + "which is a reserved. name""" % (self, reserved)) + + def _get_toplevel(self): + toplevel = self.toplevel + if not toplevel and self.toplevel_name: + if self._glade_adaptor: + toplevel = self._glade_adaptor.get_widget(self.toplevel_name) + else: + toplevel = getattr(self, self.toplevel_name, None) + + if not toplevel: + raise TypeError("A View requires an instance variable " + "called toplevel that specifies the " + "toplevel widget in it") + + if isinstance(toplevel, gtk.Window): + if toplevel.flags() & gtk.VISIBLE: + log.warn("Toplevel widget %s (%s) is visible; that's probably " + "wrong" % (toplevel, toplevel.get_name())) + + return toplevel + + def get_glade_adaptor(self): + """Special init code that subclasses may want to override.""" + if not self.gladefile: + return + + glade_adaptor = _open_glade(self, self.gladefile, + self.widgets, self.gladename, + self.domain) + + container_name = self.toplevel_name + if not container_name: + raise ValueError( + "You provided a gladefile %s to grab the widgets from " + "but you didn't give me a toplevel/container name!" % + self.gladefile) + + # a SlaveView inside a glade file needs to come inside a toplevel + # window, so we pull our slave out from it, grab its groups and + # muerder it later + shell = glade_adaptor.get_widget(container_name) + if not isinstance(shell, gtk.Window): + raise TypeError("Container %s should be a Window, found %s" % ( + container_name, type(shell))) + + self.toplevel = shell.get_child() + shell.remove(self.toplevel) + shell.destroy() + + return glade_adaptor + + # + # Hooks + # + + def on_attach(self, parent): + """ Hook function called when attach_slave is performed on slave views. + """ + pass + + def on_startup(self): + """ + This is a virtual method that can be customized by classes that + want to perform additional initalization after a controller has + been set for it. If you need this, add this method to your View + subclass and BaseController will call it when the controller is + set to the proxy.""" + pass + + # + # Accessors + # + + def get_toplevel(self): + """Returns the toplevel widget in the view""" + return self.toplevel + + def get_widget(self, name): + """Retrieves the named widget from the View""" + name = string.replace(name, '.', '_') + widget = getattr(self, name, None) + if widget is None: + raise AttributeError("Widget %s not found in view %s" + % (name, self)) + if not isinstance(widget, gtk.Widget): + raise TypeError("%s in view %s is not a Widget" + % (name, self)) + return widget + + def set_controller(self, controller): + """ + Sets the view's controller, checking to see if one has already + been set before.""" + # Only one controller per view, please + if self.controller: + raise AssertionError("This view already has a controller: %s" + % self.controller) + self.controller = controller + + # + # GTK+ proxies and convenience functions + # + + def show_and_loop(self, parent=None): + """ + Runs show() and runs the GTK+ event loop. If the parent + argument is supplied and is a valid view, this view is set as a + transient for the parent view + + @param parent: + """ + + self.show() + if parent: + self.set_transient_for(parent) + gtk.main() + + def show(self, *args): + """Shows the toplevel widget""" + self.toplevel.show() + + def show_all(self, *args): + """Shows all widgets attached to the toplevel widget""" + if self._glade_adaptor is not None: + raise AssertionError("You don't want to call show_all on a " + "SlaveView. Use show() instead.") + self.toplevel.show_all() + + def focus_toplevel(self): + """Focuses the toplevel widget in the view""" + # XXX: warn if there is no GdkWindow + if self.toplevel and self.toplevel.window is not None: + self.toplevel.grab_focus() + + def focus_topmost(self, widgets=None): + """ + Looks through widgets specified (if no widgets are specified, + look through all widgets attached to the view and sets focus to + the widget that is rendered in the position closest to the view + window's top and left + + - widgets: a list of widget names to be searched through + """ + widget = self.get_topmost_widget(widgets, can_focus=True) + if widget is not None: + widget.grab_focus() + # So it can be idle_added safely + return False + + def get_topmost_widget(self, widgets=None, can_focus=False): + """ + A real hack; returns the widget that is most to the left and + top of the window. + + - widgets: a list of widget names. If widgets is supplied, + it only checks in the widgets in the list; otherwise, it + looks at the widgets named in self.widgets, or, if + self.widgets is None, looks through all widgets attached + to the view. + + - can_focus: boolean, if set only searches through widget + that can be focused + """ + # XXX: recurse through containers from toplevel widget, better + # idea and will work. + widgets = widgets or self.widgets or self.__dict__.keys() + top_widget = None + for widget_name in widgets: + widget = getattr(self, widget_name) + if not isinstance(widget, gtk.Widget): + continue + if not widget.flags() & gtk.REALIZED: + # If widget isn't realized but we have a toplevel + # window, it's safe to realize it. If this check isn't + # performed, we get a crash as per + # http://bugzilla.gnome.org/show_bug.cgi?id=107872 + if isinstance(widget.get_toplevel(), gtk.Window): + widget.realize() + else: + log.warn("get_topmost_widget: widget %s was not realized" + % widget_name) + continue + if can_focus: + # Combos don't focus, but their entries do + if isinstance(widget, gtk.Combo): + widget = widget.entry + if not widget.flags() & gtk.CAN_FOCUS or \ + isinstance(widget, (gtk.Label, gtk.HSeparator, + gtk.VSeparator, gtk.Window)): + continue + + if top_widget: + allocation = widget.allocation + top_allocation = getattr(top_widget, 'allocation', None) + assert top_allocation != None + if (top_allocation[0] + top_allocation[1] > + allocation[0] + allocation[1]): + top_widget = widget + else: + top_widget = widget + return top_widget + + # + # Callback handling + # + + def _attach_callbacks(self, controller): + if self._glade_adaptor is None: + brokerclass = SignalBroker + else: + brokerclass = GladeSignalBroker + + self._broker = brokerclass(self, controller) + +# def _setup_keypress_handler(self, keypress_handler): +# # Only useful in BaseView and derived classes +# # XXX: support slaveview correctly +# log.warn("Tried to setup a keypress handler for %s " +# "but no toplevel window exists to attach to" % self) + + # + # Slave handling + # + + def attach_slave(self, name, slave): + """Attaches a slaveview to the current view, substituting the + widget specified by name. the widget specified *must* be a + eventbox; its child widget will be removed and substituted for + the specified slaveview's toplevel widget:: + + .-----------------------. the widget that is indicated in the diagram + |window/view (self.view)| as placeholder will be substituted for the + | .----------------. | slaveview's toplevel. + | | eventbox (name)| | .-----------------. + | |.--------------.| |slaveview (slave)| + | || placeholder <----. |.---------------.| + | |'--------------'| \___ toplevel || + | '----------------' | ''---------------'| + '-----------------------' '-----------------' + + the original way of attachment (naming the *child* widget + instead of the eventbox) is still supported for compatibility + reasons but will print a warning. + """ + log('%s: Attaching slave %s of type %s' % (self.__class__.__name__, + name, + slave.__class__.__name__)) + + if name in self.slaves: + # XXX: TypeError + log.warn("A slave with name %s is already attached to %r" % ( + name, self)) + self.slaves[name] = slave + + if not isinstance(slave, SlaveView): + raise TypeError("slave must be a SlaveView, not a %s" % + type(slave)) + + shell = slave.get_toplevel() + + if isinstance(shell, gtk.Window): # view with toplevel window + new_widget = shell.get_child() + shell.remove(new_widget) # remove from window to allow reparent + else: # slaveview + new_widget = shell + + # if our widgets are in a glade file get the placeholder from them + # or take it from the view itself otherwise + if self._glade_adaptor: + placeholder = self._glade_adaptor.get_widget(name) + else: + placeholder = getattr(self, name, None) + + if not placeholder: + raise AttributeError( + "slave container widget `%s' not found" % name) + parent = placeholder.get_parent() + + if slave._accel_groups: + # take care of accelerator groups; attach to parent window if we + # have one; if embedding a slave into another slave, store its + # accel groups; otherwise complain if we're dropping the + # accelerators + win = parent.get_toplevel() + if isinstance(win, gtk.Window): + # use idle_add to be sure we attach the groups as late + # as possible and avoid reattaching groups -- see + # comment in _attach_groups. + gtk.idle_add(self._attach_groups, win, slave._accel_groups) + elif isinstance(self, SlaveView): + self._accel_groups.extend(slave._accel_groups) + else: + log.warn("attached slave %s to parent %s, but parent lacked " + "a window and was not a slave view" % (slave, self)) + slave._accel_groups = [] + + # Merge the sizegroups of the slave that is being attached with the + # sizegroups of where it is being attached to. Only the sizegroups + # with the same name will be merged. + if slave._glade_adaptor: + sizegroups = slave._glade_adaptor.get_sizegroups() + for sizegroup in sizegroups: + self._merge_sizegroup(sizegroup) + + if isinstance(placeholder, gtk.EventBox): + # standard mechanism + child = placeholder.get_child() + if child is not None: + placeholder.remove(child) + placeholder.set_visible_window(False) + placeholder.add(new_widget) + elif isinstance(parent, gtk.EventBox): + # backwards compatibility + log.warn("attach_slave's api has changed: read docs, update code!") + parent.remove(placeholder) + parent.add(new_widget) + else: + raise TypeError( + "widget to be replaced must be wrapped in eventbox") + + # when attaching a slave we usually want it visible + parent.show() + # call slave's callback + slave.on_attach(self) + + slave.connect_object('validation-changed', + self._on_child__validation_changed, + name) + + for notebook in self._notebooks: + for child in notebook.get_children(): + if not shell.is_ancestor(child): + continue + + label = notebook.get_tab_label(child) + slave.connect('validation-changed', + self._on_notebook_slave__validation_changed, + name, label) + self._notebook_validation[label] = {} + + # Fire of an initial notification + slave.check_and_notify_validity(force=True) + + # return placeholder we just removed + return placeholder + + def _merge_sizegroup(self, other_sizegroup): + # Merge sizegroup from other with self that have the same name. + # Actually, no merging is being done, since the old group is preserved + + name = other_sizegroup.get_data('gazpacho::object-id') + sizegroup = getattr(self, name, None) + if not sizegroup: + return + + widgets = other_sizegroup.get_data('gazpacho::sizegroup-widgets') + if not widgets: + return + + for widget in widgets: + sizegroup.add_widget(widget) + + def detach_slave(self, name): + """ + Detatch a slave called name from view + """ + if not name in self.slaves: + raise LookupError("There is no slaved called %s attached to %r" % + (name, self)) + del self.slaves[name] + + def _attach_groups(self, win, accel_groups): + # get groups currently attached to the window; we use them + # to avoid reattaching an accelerator to the same window, which + # generates messages like: + # + # gtk-critical **: file gtkaccelgroup.c: line 188 + # (gtk_accel_group_attach): assertion `g_slist_find + # (accel_group->attach_objects, object) == null' failed. + # + # interestingly, this happens many times with notebook, + # because libglade creates and attaches groups in runtime to + # its toplevel window. + current_groups = gtk.accel_groups_from_object(win) + for group in accel_groups: + if group in current_groups: + # skip group already attached + continue + win.add_accel_group(group) + + def get_slave(self, holder): + return self.slaves.get(holder) + + + + # + # Signal connection + # + + def connect_multiple(self, widgets, signal, handler, after=False): + """ + Connect the same handler to the specified signal for a number of + widgets. + - widgets: a list of GtkWidgets + - signal: a string specifying the signals + - handler: a callback method + - after: a boolean; if TRUE, we use connect_after(), otherwise, + connect() + """ + if not isinstance(widgets, (list, tuple)): + raise TypeError("widgets must be a list, found %s" % widgets) + for widget in widgets: + if not isinstance(widget, gtk.Widget): + raise TypeError( + "Only Gtk widgets may be passed in list, found\n%s" % widget) + if after: + widget.connect_after(signal, handler) + else: + widget.connect(signal, handler) + + def disconnect_autoconnected(self): + """ + Disconnect handlers previously connected with + autoconnect_signals()""" + self._broker.disconnect_autoconnected() + + def handler_block(self, widget, signal_name=None): + # XXX: Warning, or bail out? + if not self._broker: + return + self._broker.handler_block(widget, signal_name) + + def handler_unblock(self, widget, signal_name=None): + if not self._broker: + return + self._broker.handler_unblock(widget, signal_name) + + # + # Proxies + # + + def add_proxy(self, model=None, widgets=None): + """ + Add a proxy to this view that automatically update a model when + the view changes. Arguments: + + - model. the object we are proxing. It can be None if we don't have + a model yet and we want to display the interface and set it up with + future models. + - widgets. the list of widgets that contains model attributes to be + proxied. If it is None (or not specified) it will be the whole list + of widgets this View has. + + This method return a Proxy object that you may want to use to force + updates or setting new models. Keep a reference to it since there is + no way to get that proxy later on. You have been warned (tm) + """ + log('%s: adding proxy for %s' % ( + self.__class__.__name__, + model and model.__class__.__name__)) + + widgets = widgets or self.widgets + + for widget_name in widgets: + widget = getattr(self, widget_name, None) + if widget is None: + continue + + if not IValidatableProxyWidget.providedBy(widget): + continue + + try: + widget.connect_object('validation-changed', + self._on_child__validation_changed, + widget_name) + except TypeError: + raise AssertionError("%r does not have a validation-changed " + "signal." % widget) + + proxy = Proxy(self, model, widgets) + self._proxies.append(proxy) + return proxy + + # + # Validation + # + + def _on_child__validation_changed(self, name, value): + # Children of the view, eg slaves or widgets are connected to + # this signal. When validation changes of a validatable child + # this callback is called + self._validation[name] = value + + self.check_and_notify_validity() + + def _on_notebook_slave__validation_changed(self, slave, value, name, + label): + validation = self._notebook_validation[label] + validation[name] = value + + is_valid = True + if False in validation.values(): + is_valid = False + + if is_valid: + color = color_black + else: + color = color_red + + # Only modify active state, since that's the (somewhat badly named) + # state used for the pages which are not selected. + label.modify_fg(gtk.STATE_ACTIVE, color) + label.modify_fg(gtk.STATE_NORMAL, color) + + def check_and_notify_validity(self, force=False): + # Current view is only valid if we have no invalid children + # their status are stored as values in the dictionary + is_valid = True + if False in self._validation.values(): + is_valid = False + + # Check if validation really changed + if self._valid == is_valid and force == False: + return + + self._valid = is_valid + self.emit('validation-changed', is_valid) + + # FIXME: Remove and update all callsites to use validation-changed + if self._validate_function: + self._validate_function(is_valid) + + def force_validation(self): + self.check_and_notify_validity(force=True) + + def register_validate_function(self, function): + """The signature of the validate function is: + + def function(is_valid): + + or, if it is a method: + + def function(self, is_valid): + + where the 'is_valid' parameter is True if all the widgets have + valid data or False otherwise. + """ + self._validate_function = function + +type_register(SlaveView) + +class BaseView(SlaveView): + """A view with a toplevel window.""" + + def __init__(self, toplevel=None, widgets=None, gladefile=None, + gladename=None, toplevel_name=None, domain=None, + delete_handler=None): + SlaveView.__init__(self, toplevel, widgets, gladefile, gladename, + toplevel_name, domain) + + if not isinstance(self.toplevel, gtk.Window): + raise TypeError("toplevel widget must be a Window " + "(or inherit from it),\nfound `%s' %s" + % (toplevel, self.toplevel)) + self.toplevel.set_name(self.__class__.__name__) + + if delete_handler: + id = self.toplevel.connect("delete-event", delete_handler) + if not id: + raise ValueError( + "Invalid delete handler provided: %s" % delete_handler) + + def get_glade_adaptor(self): + if not self.gladefile: + return + + return _open_glade(self, self.gladefile, self.widgets, + self.gladename, self.domain) + + # + # Hook for keypress handling + # + + def _attach_callbacks(self, controller): + super(BaseView, self)._attach_callbacks(controller) + self._setup_keypress_handler(controller.on_key_press) + + def _setup_keypress_handler(self, keypress_handler): + self.toplevel.connect_after("key_press_event", keypress_handler) + + # + # Proxying for self.toplevel + # + def set_transient_for(self, view): + """Makes the view a transient for another view; this is commonly done + for dialogs, so the dialog window is managed differently than a + top-level one. + """ + if hasattr(view, 'toplevel') and isinstance(view.toplevel, gtk.Window): + self.toplevel.set_transient_for(view.toplevel) + # In certain cases, it is more convenient to send in a window; + # for instance, in a deep slaveview hierarchy, getting the + # top view is difficult. We used to print a warning here, I + # removed it for convenience; we might want to put it back when + # http://bugs.async.com.br/show_bug.cgi?id=682 is fixed + elif isinstance(view, gtk.Window): + self.toplevel.set_transient_for(view) + else: + raise TypeError("Parameter to set_transient_for should " + "be View (found %s)" % view) + + def set_title(self, title): + """Sets the view's window title""" + self.toplevel.set_title(title) + + # + # Focus handling + # + + def get_focus_widget(self): + """Returns the currently focused widget in the window""" + return self.toplevel.focus_widget + + def check_focus(self): + """ Tests the focus in the window and prints a warning if no + widget is focused. + """ + focus = self.toplevel.focus_widget + if focus: + return + values = self.__dict__.values() + interactive = None + # Check if any of the widgets is interactive + for v in values: + if (isinstance(v, gtk.Widget) and not + isinstance(v, _non_interactive)): + interactive = v + if interactive: + log.warn("No widget is focused in view %s but you have an " + "interactive widget in it: %s""" % (self, interactive)) + + # + # Window show/hide and mainloop manipulation + # + + def hide(self, *args): + """Hide the view's window""" + self.toplevel.hide() + + def show_all(self, parent=None, *args): + self.toplevel.show_all() + self.show(parent, *args) + + def show(self, parent=None, *args): + """Show the view's window. + If the parent argument is supplied and is a valid view, this view + is set as a transient for the parent view. + """ + # Uniconize window if minimized + self.toplevel.present() # this call win.show() for us + self.check_focus() + if parent is not None: + self.set_transient_for(parent) + + def quit_if_last(self, *args): + quit_if_last(*args) + + def hide_and_quit(self, *args): + """Hides the current window and breaks the GTK+ event loop if this + is the last window. + Its method signature allows it to be used as a signal handler. + """ + self.toplevel.hide() + self.quit_if_last() + +WidgetTree = None + +def _open_glade(view, gladefile, widgets, name, domain): + global WidgetTree + if not WidgetTree: + try: + from gazpacho.loader import loader + loader # pyflakes + except ImportError, e: + if is_gazpacho_required(): + raise RuntimeError( + "Gazpacho is required, but could not be found: %s" % e) + else: + try: + from kiwi.ui.libgladeloader import LibgladeWidgetTree as WT + WidgetTree = WT + except ImportError: + raise RuntimeError("Could not find a glade parser library") + else: + from kiwi.ui.gazpacholoader import GazpachoWidgetTree as WT + WidgetTree = WT + + return WidgetTree(view, gladefile, widgets, name, domain) diff --git a/kiwi/ui/widgets/__init__.py b/kiwi/ui/widgets/__init__.py new file mode 100644 index 0000000..1c8b70f --- /dev/null +++ b/kiwi/ui/widgets/__init__.py @@ -0,0 +1,20 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# diff --git a/kiwi/ui/widgets/checkbutton.py b/kiwi/ui/widgets/checkbutton.py new file mode 100644 index 0000000..f7bf5c1 --- /dev/null +++ b/kiwi/ui/widgets/checkbutton.py @@ -0,0 +1,69 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2003-2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Gustavo Rahal <gustavo@async.com.br> +# Johan Dahlin <jdahlin@async.com.br> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# + +"""GtkCheckButton support for the Kiwi Framework""" + +import gtk + +from kiwi.python import deprecationwarn +from kiwi.ui.proxywidget import ProxyWidgetMixin +from kiwi.utils import PropertyObject, gsignal, type_register + +class ProxyCheckButton(PropertyObject, gtk.CheckButton, ProxyWidgetMixin): + __gtype_name__ = 'ProxyCheckButton' + + # changed allowed data types because checkbuttons can only + # accept bool values + allowed_data_types = bool, + + def __init__(self): + ProxyWidgetMixin.__init__(self) + PropertyObject.__init__(self, data_type=bool) + gtk.CheckButton.__init__(self) + + gsignal('toggled', 'override') + def do_toggled(self): + self.emit('content-changed') + self.chain() + + def read(self): + return self.get_active() + + def update(self, data): + if data is None: + self.set_active(False); + return + + # No conversion to string needed, we only accept bool + self.set_active(data) + +class CheckButton(ProxyCheckButton): + def __init__(self): + deprecationwarn( + 'CheckButton is deprecated, use ProxyCheckButton instead', + stacklevel=3) + ProxyCheckButton.__init__(self) +type_register(CheckButton) diff --git a/kiwi/ui/widgets/colorbutton.py b/kiwi/ui/widgets/colorbutton.py new file mode 100644 index 0000000..7b17e78 --- /dev/null +++ b/kiwi/ui/widgets/colorbutton.py @@ -0,0 +1,46 @@ +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Ali Afshar <aafshar@gmail.com> +# + +"""ColorButton proxy for the kiwi framework""" + +import gtk + +from kiwi.ui.proxywidget import ProxyWidgetMixin +from kiwi.utils import PropertyObject, gsignal, type_register + + +class ProxyColorButton(PropertyObject, gtk.ColorButton, ProxyWidgetMixin): + __gtype_name__ = 'ProxyColorButton' + + allowed_data_types = object, + + def __init__(self, color=gtk.gdk.Color(0, 0, 0)): + ProxyWidgetMixin.__init__(self) + PropertyObject.__init__(self, data_type=object) + gtk.ColorButton.__init__(self, color) + + gsignal('color-set', 'override') + def do_color_set(self): + self.emit('content-changed') + self.chain() + + def read(self): + return self.get_color() + + def update(self, data): + self.set_color(data) + + +type_register(ProxyColorButton) diff --git a/kiwi/ui/widgets/combo.py b/kiwi/ui/widgets/combo.py new file mode 100644 index 0000000..491008f --- /dev/null +++ b/kiwi/ui/widgets/combo.py @@ -0,0 +1,254 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2003-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# Johan Dahlin <jdahlin@async.com.br> +# Gustavo Rahal <gustavo@async.com.br> +# Daniel Saran R. da Cunha <daniel@async.com.br> +# Evandro Vale Miquelito <evandro@async.com.br> +# + +"""GtkComboBox and GtkComboBoxEntry support for the Kiwi Framework. + +The GtkComboBox and GtkComboBoxEntry classes here are also slightly extended +they contain methods to easily insert and retrieve data from combos. +""" + +import gobject +import gtk +from gtk import keysyms + +from kiwi import ValueUnset +from kiwi.python import deprecationwarn +from kiwi.ui.comboboxentry import BaseComboBoxEntry +from kiwi.ui.comboentry import ComboEntry +from kiwi.ui.combomixin import COL_COMBO_LABEL, COMBO_MODE_STRING, \ + COMBO_MODE_DATA, COMBO_MODE_UNKNOWN, ComboMixin +from kiwi.ui.proxywidget import ProxyWidgetMixin, ValidatableProxyWidgetMixin +from kiwi.ui.widgets.entry import ProxyEntry +from kiwi.utils import PropertyObject, gproperty + +class ProxyComboBox(PropertyObject, gtk.ComboBox, ComboMixin, ProxyWidgetMixin): + + __gtype_name__ = 'ProxyComboBox' + + def __init__(self): + gtk.ComboBox.__init__(self) + ComboMixin.__init__(self) + ProxyWidgetMixin.__init__(self) + PropertyObject.__init__(self) + self.connect('changed', self._on__changed) + + renderer = gtk.CellRendererText() + self.pack_start(renderer) + self.add_attribute(renderer, 'text', COL_COMBO_LABEL) + + # GtkComboBox is a GtkContainer subclass which implements __len__ in + # PyGTK in 2.8 and higher. Therefor we need to provide our own + # implementation to be backwards compatible and override the new + # behavior in 2.8 + def __len__(self): + return len(self.get_model()) + + def _on__changed(self, combo): + self.emit('content-changed') + + def read(self): + if self.mode == COMBO_MODE_UNKNOWN: + return ValueUnset + + data = self.get_selected() + if self.mode == COMBO_MODE_STRING: + data = self._from_string(data) + + return data + + def update(self, data): + # We dont need validation because the user always + # choose a valid value + + if data is None: + return + + if self.mode == COMBO_MODE_STRING: + data = self._as_string(data) + + self.select(data) + + def prefill(self, itemdata, sort=False): + ComboMixin.prefill(self, itemdata, sort) + + # we always have something selected, by default the first item + self.set_active(0) + self.emit('content-changed') + + def clear(self): + ComboMixin.clear(self) + self.emit('content-changed') + +class ProxyComboBoxEntry(PropertyObject, BaseComboBoxEntry, ComboMixin, + ValidatableProxyWidgetMixin): + __gtype_name__ = 'ProxyComboBoxEntry' + # it doesn't make sense to connect to this signal + # because we want to monitor the entry of the combo + # not the combo box itself. + + gproperty("list-editable", bool, True, "Editable") + + def __init__(self, **kwargs): + deprecationwarn( + 'ProxyComboBoxEntry is deprecated, use ProxyComboEntry instead', + stacklevel=3) + BaseComboBoxEntry.__init__(self) + ComboMixin.__init__(self) + ValidatableProxyWidgetMixin.__init__(self, widget=self.entry) + PropertyObject.__init__(self, **kwargs) + + self.set_text_column(COL_COMBO_LABEL) + + # here we connect the expose-event signal directly to the entry + self.child.connect('changed', self._on_child_entry__changed) + + # HACK! we force a queue_draw because when the window is first + # displayed the icon is not drawn. + gobject.idle_add(self.queue_draw) + + self.set_events(gtk.gdk.KEY_RELEASE_MASK) + self.connect("key-release-event", self._on__key_release_event) + + def prop_set_list_editable(self, value): + if self.mode == COMBO_MODE_DATA: + return + + self.entry.set_editable(value) + + return value + + def _update_selection(self, text=None): + if text is None: + text = self.entry.get_text() + + self.select_item_by_label(text) + + def _add_text_to_combo_list(self): + text = self.entry.get_text() + if not text.strip(): + return + + if text in self.get_model_strings(): + return + + self.entry.set_text('') + self.append_item(text) + self._update_selection(text) + + def _on__key_release_event(self, widget, event): + """Checks for "Enter" key presses and add the entry text to + the combo list if the combo list is set as editable. + """ + if not self.list_editable: + return + + if event.keyval in (keysyms.KP_Enter, + keysyms.Return): + self._add_text_to_combo_list() + + def _on_child_entry__changed(self, widget): + """Called when something on the entry changes""" + if not widget.get_text(): + return + + self.emit('content-changed') + + def set_mode(self, mode): + # If we're in the transition to go from + # unknown->label set editable to False + if (self.mode == COMBO_MODE_UNKNOWN and mode == COMBO_MODE_DATA): + self.entry.set_editable(False) + + ComboMixin.set_mode(self, mode) + + def read(self): + if self.mode == COMBO_MODE_UNKNOWN: + return ValueUnset + return self.get_selected() + + def update(self, data): + if data is ValueUnset or data is None: + self.entry.set_text("") + else: + self.select(data) + + def prefill(self, itemdata, sort=False, clear_entry=False): + ComboMixin.prefill(self, itemdata, sort) + if clear_entry: + self.entry.set_text("") + + # setup the autocompletion + auto = gtk.EntryCompletion() + auto.set_model(self.get_model()) + auto.set_text_column(COL_COMBO_LABEL) + self.entry.set_completion(auto) + + def clear(self): + """Removes all items from list and erases entry""" + ComboMixin.clear(self) + self.entry.set_text("") + +class ProxyComboEntry(PropertyObject, ComboEntry, + ValidatableProxyWidgetMixin): + __gtype_name__ = 'ProxyComboEntry' + + gproperty("list-editable", bool, True, "Editable") + + def __init__(self): + entry = ProxyEntry() + ComboEntry.__init__(self, entry=entry) + ValidatableProxyWidgetMixin.__init__(self) + PropertyObject.__init__(self) + entry.connect('content-changed', self._on_entry__content_changed) + + # We only need to listen for changes in the entry, it's updated + # even if you select something in the popup list + def _on_entry__content_changed(self, entry): + self.emit('content-changed') + + def prop_set_list_editable(self, value): + self.entry.set_editable(value) + return value + + def read(self): + return self.get_selected() + + def update(self, data): + if data is ValueUnset or data is None: + self.entry.set_text("") + else: + self.select(data) + + def clear(self): + """Removes all items from list and erases entry""" + ComboMixin.clear(self) + self.entry.set_text("") + + def set_tooltip(self, text): + self.entry.set_tooltip(text) + diff --git a/kiwi/ui/widgets/combobox.py b/kiwi/ui/widgets/combobox.py new file mode 100644 index 0000000..7bfcc60 --- /dev/null +++ b/kiwi/ui/widgets/combobox.py @@ -0,0 +1,43 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2001-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# Gustavo Rahal <gustavo@async.com.br> +# Johan Dahlin <jdahlin@async.com.br> +# + +"""GtkComboBox and GtkComboBoxEntry support for the Kiwi Framework. +backwards compatibility layer""" + +from kiwi.ui.widgets.combo import ProxyComboBox +from kiwi.ui.widgets.combo import ProxyComboBoxEntry +from kiwi.ui.combomixin import COL_COMBO_LABEL, COL_COMBO_DATA, \ + COMBO_MODE_STRING, COMBO_MODE_DATA, COMBO_MODE_UNKNOWN + +class ComboBox(ProxyComboBox): + pass + +class ComboBoxEntry(ProxyComboBoxEntry): + pass + +# pyflakes +(COL_COMBO_LABEL, COL_COMBO_DATA, COMBO_MODE_STRING, + COMBO_MODE_DATA, COMBO_MODE_UNKNOWN) diff --git a/kiwi/ui/widgets/entry.py b/kiwi/ui/widgets/entry.py new file mode 100644 index 0000000..9ab8f0f --- /dev/null +++ b/kiwi/ui/widgets/entry.py @@ -0,0 +1,255 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# Gustavo Rahal <gustavo@async.com.br> +# + +"""GtkEntry support for the Kiwi Framework""" + +import datetime + +import gtk + +from kiwi.datatypes import ValidationError, converter, number +from kiwi.decorators import deprecated +from kiwi.python import deprecationwarn +from kiwi.ui.entry import MaskError, KiwiEntry, ENTRY_MODE_TEXT, \ + ENTRY_MODE_DATA +from kiwi.ui.dateentry import DateEntry +from kiwi.ui.proxywidget import ValidatableProxyWidgetMixin +from kiwi.utils import PropertyObject, gsignal, type_register + +DATE_MASK_TABLE = { + '%m': '00', + '%y': '00', + '%d': '00', + '%Y': '0000', + '%H': '00', + '%M': '00', + '%S': '00', + '%T': '00:00:00', + # FIXME: locale specific + '%r': '00:00:00 LL', + } + +class ProxyEntry(KiwiEntry, ValidatableProxyWidgetMixin): + """The Kiwi Entry widget has many special features that extend the basic + gtk entry. + + First of all, as every Kiwi Widget, it implements the Proxy protocol. + As the users types the entry can interact with the application model + automatically. + Kiwi Entry also implements interesting UI additions. If the input data + does not match the data type of the entry the background nicely fades + to a light red color. As the background changes an information icon + appears. When the user passes the mouse over the information icon a + tooltip is displayed informing the user how to correctly fill the + entry. When dealing with date and float data-type the information on + how to fill these entries is displayed according to the current locale. + """ + + __gtype_name__ = 'ProxyEntry' + + def __init__(self, data_type=None): + self._block_changed = False + KiwiEntry.__init__(self) + ValidatableProxyWidgetMixin.__init__(self) + self.set_property('data-type', data_type) + + # Virtual methods + gsignal('changed', 'override') + def do_changed(self): + """Called when the content of the entry changes. + + Sets an internal variable that stores the last time the user + changed the entry + """ + + self.chain() + + self._update_current_object(self.get_text()) + self.emit('content-changed') + + def prop_set_data_type(self, data_type): + data_type = super(ProxyEntry, self).prop_set_data_type(data_type) + + # Numbers should be right aligned + if data_type and issubclass(data_type, number): + self.set_property('xalign', 1.0) + + # Apply a mask for the data types, some types like + # dates has a default mask + try: + self.set_mask_for_data_type(data_type) + except MaskError: + pass + return data_type + + # Public API + + def set_mask_for_data_type(self, data_type): + """ + @param data_type: + """ + + if not data_type in (datetime.datetime, datetime.date, datetime.time): + return + conv = converter.get_converter(data_type) + mask = conv.get_format() + + # For win32, skip mask + # FIXME: How can we figure out the real locale specific string? + if mask == '%X': + mask = '%H:%M:%S' + elif mask == '%x': + mask = '%d/%m/%Y' + elif mask == '%c': + mask = '%d/%m/%Y %H:%M:%S' + + for format_char, mask_char in DATE_MASK_TABLE.items(): + mask = mask.replace(format_char, mask_char) + + self.set_mask(mask) + + #@deprecated('prefill') + def set_completion_strings(self, strings=[], values=[]): + """ + Set strings used for entry completion. + If values are provided, each string will have an additional + data type. + + @param strings: + @type strings: list of strings + @param values: + @type values: list of values + """ + + completion = self._get_completion() + model = completion.get_model() + model.clear() + + if values: + self._mode = ENTRY_MODE_DATA + self.prefill(zip(strings, values)) + else: + self._mode = ENTRY_MODE_TEXT + self.prefill(strings) + set_completion_strings = deprecated('prefill')(set_completion_strings) + + def set_text(self, text): + """ + Sets the text of the entry + + @param text: + """ + + self._update_current_object(text) + + # If content isn't empty set_text emitts changed twice. + # Protect content-changed from being updated and issue + # a manual emission afterwards + self._block_changed = True + gtk.Entry.set_text(self, text) + self._block_changed = False + self.emit('content-changed') + + self.set_position(-1) + + def do_changed(self): + if self._block_changed: + self.emit_stop_by_name('changed') + return + self.emit('content-changed') + + # ProxyWidgetMixin implementation + + def read(self): + mode = self._mode + if mode == ENTRY_MODE_TEXT: + text = self.get_text() + try: + return self._from_string(text) + except ValidationError: + # Do not consider masks which only displays static + # characters invalid, instead return an empty string + if self.get_mask() and text == self.get_empty_mask(): + return "" + else: + raise + elif mode == ENTRY_MODE_DATA: + return self._current_object + else: + raise AssertionError + + def update(self, data): + if data is None: + text = "" + else: + mode = self._mode + if mode == ENTRY_MODE_DATA: + new = self._get_text_from_object(data) + if new is None: + raise TypeError("%r is not a data object" % data) + text = new + elif mode == ENTRY_MODE_TEXT: + text = self._as_string(data) + + self.set_text(text) + +type_register(ProxyEntry) + +class Entry(ProxyEntry): + def __init__(self, data_type=None): + deprecationwarn('Entry is deprecated, use ProxyEntry instead', + stacklevel=3) + ProxyEntry.__init__(self, data_type) +type_register(Entry) + +class ProxyDateEntry(PropertyObject, DateEntry, ValidatableProxyWidgetMixin): + __gtype_name__ = 'ProxyDateEntry' + + # changed allowed data types because checkbuttons can only + # accept bool values + allowed_data_types = datetime.date, + + def __init__(self): + DateEntry.__init__(self) + ValidatableProxyWidgetMixin.__init__(self) + PropertyObject.__init__(self) + + gsignal('changed', 'override') + def do_changed(self): + self.chain() + self.emit('content-changed') + + # ProxyWidgetMixin implementation + + def read(self): + return self.get_date() + + def update(self, data): + if data is None: + self.entry.set_text("") + else: + self.set_date(data) + +type_register(ProxyDateEntry) diff --git a/kiwi/ui/widgets/filechooser.py b/kiwi/ui/widgets/filechooser.py new file mode 100644 index 0000000..bbfdda1 --- /dev/null +++ b/kiwi/ui/widgets/filechooser.py @@ -0,0 +1,80 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Ali Afshar <aafshar@gmail.com> +# + + +"""Filechooser widgets for the kiwi framework""" + +import gtk + +from kiwi.ui.proxywidget import ProxyWidgetMixin +from kiwi.utils import PropertyObject, gsignal + +class _FileChooserMixin(object): + """Mixin to use common methods of the FileChooser interface""" + + allowed_data_types = str, + + gsignal('selection_changed', 'override') + def do_selection_changed(self): + self.emit('content-changed') + self.chain() + + def read(self): + return self.get_filename() + + def update(self, data): + if data is None: + return + self.set_filename(data) + +class ProxyFileChooserButton(_FileChooserMixin, PropertyObject, + gtk.FileChooserButton, ProxyWidgetMixin): + __gtype_name__ = 'ProxyFileChooserButton' + def __init__(self, title=None, parent=None, + action=gtk.FILE_CHOOSER_ACTION_OPEN, + buttons=None, backend=None): + """ + @param title: + @param parent: + @param action: + @param buttons: + @param backend: + """ + ProxyWidgetMixin.__init__(self) + PropertyObject.__init__(self, data_type=str) + gtk.FileChooserButton.__init__(self, title=title, + parent=parent, action=action, + buttons=buttons, backend=backend) + +class ProxyFileChooserWidget(_FileChooserMixin, PropertyObject, + gtk.FileChooserWidget, ProxyWidgetMixin): + __gtype_name__ = 'ProxyFileChooserWidget' + def __init__(self, title, backend=None): + """ + @param title: + @param backend: + """ + ProxyWidgetMixin.__init__(self) + PropertyObject.__init__(self, data_type=str) + gtk.FileChooserWidget.__init__(self, title=title, backend=backend) + diff --git a/kiwi/ui/widgets/fontbutton.py b/kiwi/ui/widgets/fontbutton.py new file mode 100644 index 0000000..5852c02 --- /dev/null +++ b/kiwi/ui/widgets/fontbutton.py @@ -0,0 +1,47 @@ +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Ali Afshar <aafshar@gmail.com> +# + +"""FontButton proxy for the kiwi framework""" + +import gtk + +from kiwi.ui.proxywidget import ProxyWidgetMixin +from kiwi.utils import PropertyObject, gsignal, type_register + + +class ProxyFontButton(PropertyObject, gtk.FontButton, ProxyWidgetMixin): + __gtype_name__ = 'ProxyFontButton' + + allowed_data_types = str, + + def __init__(self, fontname=None): + ProxyWidgetMixin.__init__(self) + PropertyObject.__init__(self, data_type=str) + gtk.FontButton.__init__(self, fontname) + + gsignal('font-set', 'override') + def do_font_set(self): + self.emit('content-changed') + self.chain() + + def read(self): + return self.get_font_name() + + def update(self, data): + self.set_font_name(data) + + +type_register(ProxyFontButton) + diff --git a/kiwi/ui/widgets/label.py b/kiwi/ui/widgets/label.py new file mode 100644 index 0000000..b91cc76 --- /dev/null +++ b/kiwi/ui/widgets/label.py @@ -0,0 +1,157 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2003-2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Lorenzo Gil Sanchez <lgs@sicem.biz> +# Gustavo Rahal <gustavo@async.com.br> +# + +"""GtkLabel support for the Kiwi Framework + +The L{Label} is also extended to support some basic markup like +L{Label.set_bold}""" + +import gtk + +from kiwi.python import deprecationwarn +from kiwi.ui.gadgets import set_foreground +from kiwi.ui.proxywidget import ProxyWidgetMixin +from kiwi.utils import PropertyObject, type_register + +class ProxyLabel(PropertyObject, gtk.Label, ProxyWidgetMixin): + __gtype_name__ = 'ProxyLabel' + def __init__(self, label='', data_type=None): + """ + @param label: initial text + @param data_type: data type of label + """ + gtk.Label.__init__(self, label) + PropertyObject.__init__(self, data_type=data_type) + ProxyWidgetMixin.__init__(self) + self.set_use_markup(True) + self._attr_dic = { "style": None, + "weight": None, + "size": None, + "underline": None} + self._size_list = ('xx-small', 'x-small', + 'small', 'medium', + 'large', 'x-large', + 'xx-large') + + self.connect("notify::label", self._on_label_changed) + + def _on_label_changed(self, label, param): + # Since most of the time labels do not have a model attached to it + # we should just emit a signal if a model is defined + if self.model_attribute: + self.emit('content-changed') + + def read(self): + return self._from_string(self.get_text()) + + def update(self, data): + if data is None: + text = "" + else: + text = self._as_string(data) + self.set_text(text) + + def _apply_attributes(self): + # sorting is been done so we can be sure of the order of the + # attributes. Helps writing tests cases + attrs = self._attr_dic + keys = attrs.keys() + keys.sort() + + attr_pairs = ['%s="%s"' % (key, attrs[key]) for key in keys + if attrs[key]] + self.set_markup('<span %s>%s</span>' % (' '.join(attr_pairs), + self.get_text())) + + def _set_text_attribute(self, attribute_name, attr, value): + if value: + if self._attr_dic[attribute_name] is None: + self._attr_dic[attribute_name] = attr + self._apply_attributes() + else: + if self._attr_dic[attribute_name] is not None: + self._attr_dic[attribute_name] = None + self._apply_attributes() + + def set_bold(self, value): + """ If True set the text to bold. False sets the text to normal """ + self._set_text_attribute("weight", "bold", value) + + def set_italic(self, value): + """ Enable or disable italic text + @param value: Allowed values: + - True: enable Italic attribute + - False: disable Italic attribute + """ + self._set_text_attribute("style", "italic", value) + + def set_underline(self, value): + """ Enable or disable underlined text + @param value: Allowed values: + - True: enable Underline attribute + - Fase: disable Underline attribute + """ + self._set_text_attribute("underline", "single", value) + + def set_size(self, size=None): + """ Set the size of the label. If size is empty the label will be + set to the default size. + @param size: Allowed values: + - xx-small + - x-small + - small + - medium, + - large + - x-large + - xx-large + @type size: string + """ + if (size is not None and + size not in self._size_list): + raise ValueError('Size of "%s" label is not valid' % + self.get_text()) + + self._attr_dic["size"] = size + self._apply_attributes() + + def set_text(self, text): + """ Overrides gtk.Label set_text method. Sets the new text of + the label but keeps the formating + @param text: label + @type text: string + """ + gtk.Label.set_text(self, text) + self._apply_attributes() + + def set_color(self, color): + set_foreground(self, color) +type_register(ProxyLabel) + +class Label(ProxyLabel): + def __init__(self, label='', data_type=None): + deprecationwarn( + 'Label is deprecated, use ProxyLabel instead', + stacklevel=3) + ProxyLabel.__init__(self, label=label, data_type=data_type) +type_register(Label) diff --git a/kiwi/ui/widgets/list.py b/kiwi/ui/widgets/list.py new file mode 100644 index 0000000..e57d412 --- /dev/null +++ b/kiwi/ui/widgets/list.py @@ -0,0 +1,62 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2001-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Johan Dahlin <jdahlin@async.com.br> +# + +"""High level wrapper for GtkTreeView: backwards compatibility layer""" + +import gtk + +from kiwi.decorators import deprecated +from kiwi.python import deprecationwarn +from kiwi.ui.objectlist import Column, SequentialColumn, ColoredColumn, \ + ListLabel, SummaryLabel +from kiwi.ui.objectlist import ObjectList, log + +# pyflakes +Column, SequentialColumn, ColoredColumn, ListLabel, SummaryLabel + +class List(ObjectList): + def __init__(self, columns=[], + instance_list=None, + mode=gtk.SELECTION_BROWSE): + deprecationwarn( + 'List is deprecated, use ObjectList instead', + stacklevel=3) + ObjectList.__init__(self, columns, instance_list, mode) + + # Backwards compat + def add_instance(self, *args, **kwargs): + return self.append(*args, **kwargs) + add_instance = deprecated('append', log)(add_instance) + + def remove_instance(self, *args, **kwargs): + return self.remove(*args, **kwargs) + remove_instance = deprecated('remove', log)(remove_instance) + + def update_instance(self, *args, **kwargs): + return self.update(*args, **kwargs) + update_instance = deprecated('update', log)(update_instance) + + def select_instance(self, *args, **kwargs): + return self.select(*args, **kwargs) + select_instance = deprecated('select', log)(select_instance) + diff --git a/kiwi/ui/widgets/radiobutton.py b/kiwi/ui/widgets/radiobutton.py new file mode 100644 index 0000000..147613f --- /dev/null +++ b/kiwi/ui/widgets/radiobutton.py @@ -0,0 +1,94 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2003-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Daniel Saran R. da Cunha <daniel@async.com.br> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# Gustavo Rahal <gustavo@async.com.br> +# + +"""GtkRadioButton support for the Kiwi Framework""" + +import gtk + +from kiwi import ValueUnset +from kiwi.python import deprecationwarn +from kiwi.utils import PropertyObject, gproperty, type_register +from kiwi.ui.proxywidget import ProxyWidgetMixin + +class ProxyRadioButton(PropertyObject, gtk.RadioButton, ProxyWidgetMixin): + __gtype_name__ = 'ProxyRadioButton' + gproperty('data-value', str, nick='Data Value') + + def __init__(self, group=None, label=None, use_underline=True): + gtk.RadioButton.__init__(self, None, label, use_underline) + if group: + self.set_group(group) + ProxyWidgetMixin.__init__(self) + PropertyObject.__init__(self) + self.connect('group-changed', self._on_group_changed) + + def _on_radio__toggled(self, radio): + self.emit('content-changed') + + def _on_group_changed(self, radio): + for radio in radio.get_group(): + radio.connect('toggled', self._on_radio__toggled) + + def get_selected(self): + """ + Get the currently selected radiobutton. + + @returns: The selected L{RadioButton} or None if there are no + selected radiobuttons. + """ + + for button in self.get_group(): + if button.get_active(): + return button + + def read(self): + button = self.get_selected() + if button is None: + return ValueUnset + + return self._from_string(button.data_value) + + def update(self, data): + if data is None: + # In a group of radiobuttons, the only widget which is in + # the proxy is ourself, the other buttons do not get their + # update() method called, so the default value is activate + # ourselves when the model is empty + self.set_active(True) + return + + data = self._as_string(data) + for rb in self.get_group(): + if rb.get_property('data-value') == data: + rb.set_active(True) + +class RadioButton(ProxyRadioButton): + def __init__(self): + deprecationwarn( + 'RadioButton is deprecated, use ProxyRadioButton instead', + stacklevel=3) + ProxyRadioButton.__init__(self) +type_register(RadioButton) diff --git a/kiwi/ui/widgets/spinbutton.py b/kiwi/ui/widgets/spinbutton.py new file mode 100644 index 0000000..1c7c78e --- /dev/null +++ b/kiwi/ui/widgets/spinbutton.py @@ -0,0 +1,124 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2003-2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Gustavo Rahal <gustavo@async.com.br> +# Lorenzo Gil Sanchez <lgs@sicem.biz> +# Evandro Vale Miquelito <evandro@async.com.br> +# + +"""GtkSpinButton support for the Kiwi Framework + +L{SpinButton} is also enhanced to display an icon using +L{kiwi.ui.icon.IconEntry} +""" + +import gtk + +from kiwi.datatypes import number +from kiwi.python import deprecationwarn +from kiwi.ui.icon import IconEntry +from kiwi.ui.proxywidget import ValidatableProxyWidgetMixin +from kiwi.utils import PropertyObject, gsignal, type_register + +class ProxySpinButton(PropertyObject, gtk.SpinButton, ValidatableProxyWidgetMixin): + """ + A SpinButton subclass which adds supports for the Kiwi Framework. + This widget supports validation + The only allowed types for spinbutton are int and float. + + """ + __gtype_name__ = 'ProxySpinButton' + allowed_data_types = number + + def __init__(self): + # since the default data_type is str we need to set it to int + # or float for spinbuttons + gtk.SpinButton.__init__(self) + PropertyObject.__init__(self, data_type=int) + ValidatableProxyWidgetMixin.__init__(self) + self._icon = IconEntry(self) + self.set_property('xalign', 1.0) + + gsignal('changed', 'override') + def do_changed(self): + """Called when the content of the spinbutton changes. + """ + # This is a work around, because GtkEditable.changed is called too + # often, as reported here: http://bugzilla.gnome.org/show_bug.cgi?id=64998 + if self.get_text() != '': + self.emit('content-changed') + self.chain() + + def read(self): + return self._from_string(self.get_text()) + + def update(self, data): + if data is None: + self.set_text("") + else: + # set_value accepts a float or int, no as_string conversion needed, + # and since we accept only int and float just send it in. + self.set_value(data) + + def do_expose_event(self, event): + # This gets called when any of our three windows needs to be redrawn + gtk.SpinButton.do_expose_event(self, event) + + if event.window == self.window: + self._icon.draw_pixbuf() + + gsignal('size-allocate', 'override') + def do_size_allocate(self, allocation): + + self.chain(allocation) + + if self.flags() & gtk.REALIZED: + self._icon.resize_windows() + + def do_realize(self): + gtk.SpinButton.do_realize(self) + self._icon.construct() + + def do_unrealize(self): + self._icon.deconstruct() + gtk.SpinButton.do_unrealize(self) + + # IconEntry + + def set_tooltip(self, text): + self._icon.set_tooltip(text) + + def set_pixbuf(self, pixbuf): + self._icon.set_pixbuf(pixbuf) + + def update_background(self, color): + self._icon.update_background(color) + + def get_icon_window(self): + return self._icon.get_icon_window() + +class SpinButton(ProxySpinButton): + def __init__(self): + deprecationwarn( + 'SpinButton is deprecated, use ProxySpinButton instead', + stacklevel=3) + ProxySpinButton.__init__(self) +type_register(SpinButton) diff --git a/kiwi/ui/widgets/textview.py b/kiwi/ui/widgets/textview.py new file mode 100644 index 0000000..d35b945 --- /dev/null +++ b/kiwi/ui/widgets/textview.py @@ -0,0 +1,70 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2003-2005 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Christian Reis <kiko@async.com.br> +# Gustavo Rahal <gustavo@async.com.br> +# Evandro Vale Miquelito <evandro@async.com.br> +# Johan Dahlin <jdahlin@async.com.br> + +"""GtkTextView support for the Kiwi Framework""" + +import gtk + +from kiwi.python import deprecationwarn +from kiwi.ui.proxywidget import ValidatableProxyWidgetMixin +from kiwi.utils import PropertyObject, type_register + +class ProxyTextView(PropertyObject, gtk.TextView, ValidatableProxyWidgetMixin): + __gtype_name__ = 'ProxyTextView' + def __init__(self): + gtk.TextView.__init__(self) + PropertyObject.__init__(self, data_type=str) + ValidatableProxyWidgetMixin.__init__(self) + + self._textbuffer = gtk.TextBuffer() + self._textbuffer.connect('changed', + self._on_textbuffer__changed) + self.set_buffer(self._textbuffer) + + def _on_textbuffer__changed(self, textbuffer): + self.emit('content-changed') + self.read() + + def read(self): + textbuffer = self._textbuffer + data = textbuffer.get_text(textbuffer.get_start_iter(), + textbuffer.get_end_iter()) + return self._from_string(data) + + def update(self, data): + if data is None: + text = "" + else: + text = self._as_string(data) + + self._textbuffer.set_text(text) + +class TextView(ProxyTextView): + def __init__(self): + deprecationwarn( + 'TextView is deprecated, use ProxyTextView instead', + stacklevel=3) + ProxyTextView.__init__(self) +type_register(TextView) diff --git a/kiwi/ui/wizard.py b/kiwi/ui/wizard.py new file mode 100644 index 0000000..26e72b8 --- /dev/null +++ b/kiwi/ui/wizard.py @@ -0,0 +1,236 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Gustavo Rahal <gustavo@async.com.br> +# Evandro Vale Miquelito <evandro@async.com.br> +# Johan Dahlin <jdahlin@async.com.br> +# + +import gettext + +import gtk + +from kiwi.ui.delegates import Delegate + +_ = lambda m: gettext.dgettext('kiwi', m) + +class WizardStep: + """ This class must be inherited by the steps """ + def __init__(self, previous=None, header=None): + self.previous = previous + self.header = header + + def next_step(self): + # This is a virtual method, which must be redefined on children + # classes. It should not be called by the last step (in this case, + # has_next_step should return 0). + raise NotImplementedError + + def post_init(self): + """A virtual method that must be defined on child when it's + necessary. This method will be called right after the change_step + method on PluggableWizard is concluded for the current step. + """ + + def has_next_step(self): + # This method should return False on last step classes + return True + + def has_previous_step(self): + # This method should return False on first step classes; since + # self.previous is normally None for them, we can get away with + # this simplified check. Redefine as necessary. + return self.previous is not None + + def previous_step(self): + return self.previous + + def validate_step(self): + """A hook called always when changing steps. If it returns False + we can not go forward. + """ + return True + +class PluggableWizard(Delegate): + """ Wizard controller and view class """ + gladefile = 'PluggableWizard' + retval = None + + def __init__(self, title, first_step, size=None, edit_mode=False): + """ + @param title: + @param first_step: + @param size: + @param edit_mode: + """ + Delegate.__init__(self, delete_handler=self.quit_if_last, + gladefile=self.gladefile, + widgets=self.widgets) + if not isinstance(first_step, WizardStep): + raise TypeError("first_step must be a WizardStep instance") + + self.set_title(title) + self._current = None + self._first_step = first_step + self.edit_mode = edit_mode + if size: + self.get_toplevel().set_default_size(size[0], size[1]) + + self._change_step(first_step) + if not self.edit_mode: + self.ok_button.hide() + + # Callbacks + + def on_next_button__clicked(self, button): + if not self._current.validate_step(): + return + + if not self._current.has_next_step(): + # This is the last step + self._change_step() + return + + self._change_step(self._current.next_step()) + + def on_ok_button__clicked(self, button): + self._change_step() + + def on_previous_button__clicked(self, button): + self._change_step(self._current.previous_step()) + + def on_cancel_button__clicked(self, button): + self.cancel() + + # Private API + + def _change_step(self, step=None): + if step is None: + # This is the last step and we can finish the job here + self.finish() + return + step.show() + self._current = step + self._refresh_slave() + if step.header: + self.header_lbl.show() + self.header_lbl.set_text(step.header) + else: + self.header_lbl.hide() + self.update_view() + self._current.post_init() + + def _refresh_slave(self): + holder_name = 'slave_area' + if self.get_slave(holder_name): + self.detach_slave(holder_name) + self.attach_slave(holder_name, self._current) + + def _show_first_page(self): + self.enable_next() + self.disable_back() + self.disable_finish() + self.notification_lbl.hide() + + def _show_page(self): + self.enable_back() + self.enable_next() + self.disable_finish() + self.notification_lbl.hide() + + def _show_last_page(self): + self.enable_back() + self.notification_lbl.show() + if self.edit_mode: + self.disable_next() + else: + self.enable_next() + self.enable_finish() + + # Public API + def update_view(self): + if self.edit_mode: + self.ok_button.set_sensitive(True) + + if not self._current.has_previous_step(): + self._show_first_page() + elif self._current.has_next_step(): + self._show_page() + else: + self._show_last_page() + + def enable_next(self): + """ + Enables the next button in the wizard. + """ + self.next_button.set_sensitive(True) + + def disable_next(self): + """ + Enables the next button in the wizard. + """ + self.next_button.set_sensitive(False) + + def enable_back(self): + """ + Enables the back button in the wizard. + """ + self.previous_button.set_sensitive(True) + + def disable_back(self): + """ + Enables the back button in the wizard. + """ + self.previous_button.set_sensitive(False) + + def enable_finish(self): + """ + Enables the finish button in the wizard. + """ + if self.edit_mode: + button = self.ok_button + else: + button = self.next_button + button.set_label(_('Finish')) + + def disable_finish(self): + """ + Disables the finish button in the wizard. + """ + if self.edit_mode: + self.ok_button.set_label(gtk.STOCK_OK) + else: + self.next_button.set_label(gtk.STOCK_GO_FORWARD) + + def set_message(self, message): + """ + @param message: + """ + self.notification_lbl.set_text(message) + + def cancel(self, *args): + # Redefine this method if you want something done when cancelling the + # wizard. + self.retval = None + + def finish(self): + # Redefine this method if you want something done when finishing the + # wizard. + pass diff --git a/kiwi/utils.py b/kiwi/utils.py new file mode 100644 index 0000000..516f1d2 --- /dev/null +++ b/kiwi/utils.py @@ -0,0 +1,362 @@ +# +# Kiwi: a Framework and Enhanced Widgets for Python +# +# Copyright (C) 2005-2006 Async Open Source +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA +# +# Author(s): Lorenzo Gil Sanchez <lgs@sicem.biz> +# Johan Dahlin <jdahlin@async.com.br> +# + +"""GObject utilities and addons""" + +import os +import struct +import sys + +import gobject + +HAVE_2_6 = gobject.pygtk_version[:2] == (2, 6) + +# When we can depend on 2.8 clean this up, so ClassInittable does not +# need to be tied to GObjectMeta, since it doesn't need to be a GObject +# Always use type for epydoc, since GObjectMeta creates lots of trouble +# for us when using fake objects. +if HAVE_2_6 or os.path.basename(sys.argv[0]) == 'epyrun': + metabase = type +else: + metabase = gobject.GObjectMeta + +def list_properties(gtype, parent=True): + """ + Return a list of all properties for GType gtype, excluding + properties in parent classes + """ + pspecs = gobject.list_properties(gtype) + if parent: + return pspecs + + parent = gobject.type_parent(gtype) + + parent_pspecs = gobject.list_properties(parent) + return [pspec for pspec in pspecs + if pspec not in parent_pspecs] + +def type_register(gtype): + """Register the type, but only if it's not already registered + @param gtype: the class to register + """ + + # copied from gobjectmodule.c:_wrap_type_register + if (getattr(gtype, '__gtype__', None) != + getattr(gtype.__base__, '__gtype__', None)): + return False + + gobject.type_register(gtype) + + return True + +class _GObjectClassInittableMetaType(metabase): + def __init__(self, name, bases, namespace): + metabase.__init__(self, name, bases, namespace) + self.__class_init__(namespace) + +class _GobjectClassInittableObject(object): + __metaclass__ = _GObjectClassInittableMetaType + + def __class_init__(cls, namespace): + pass + __class_init__ = classmethod(__class_init__) + +class PropertyMeta(_GObjectClassInittableMetaType): + """ + Metaclass that takes into account properties and signals + of baseclasses, even if they're not GObject subclasses. + Which allows you to put signals and properties in mixin + classes. + """ + # pylint fails to understand this is a metaclass + def __init__(self, name, bases, namespace): + def _update_bases(bases, props, signals): + for base in bases: + props.update(getattr(base, '__gproperties__', {})) + signals.update(getattr(base, '__gsignals__', {})) + _update_bases(base.__bases__, props, signals) + + for base in bases: + if issubclass(base, gobject.GObject): + # This will be fun. + # Merge in properties and signals from all bases, this + # is not the default behavior of PyGTK, but we need it + props = namespace.setdefault('__gproperties__', {}) + signals = namespace.setdefault('__gsignals__', {}) + + _update_bases(bases, props, signals) + break + + # Workaround brokenness in PyGObject meta/type registration + props = namespace.get('__gproperties__', {}) + signals = namespace.get('__gsignals__', {}) + if hasattr(self, '__gtype__'): + self.__gproperties__ = props + self.__gsignals__ = signals + gtype = self.__gtype__ + # Delete signals and properties which are already + # present in the list + signal_names = gobject.signal_list_names(gtype) + for signal in signals.copy(): + if signal in signal_names : + del signals[signal] + prop_names = [prop.name for prop in gobject.list_properties(gtype)] + for prop in props.copy(): + if prop in prop_names: + del props[prop] + + if HAVE_2_6 and issubclass(self, gobject.GObject): + gobject.type_register(self) + + _GObjectClassInittableMetaType.__init__(self, name, bases, namespace) + + # The metaclass forgets to remove properties and signals + self.__gproperties__ = {} + self.__gsignals__ = {} + +class PropertyObject(object): + """ + I am an object which maps GObject properties to attributes + To be able to use me, you must also inherit from a + gobject.GObject subclass. + + Example: + + >>> from kiwi.utils import PropertyObject, gproperty + + >>> class Person(PropertyObject, gobject.GObject): + >>> gproperty('name', str) + >>> gproperty('age', int) + >>> gproperty('married', bool, False) + + >>> test = Test() + >>> test.age = 20 + >>> test.age + 20 + >>> test.married + False + """ + + __metaclass__ = PropertyMeta + + _default_values = {} + def __init__(self, **kwargs): + self._attributes = {} + + if not isinstance(self, gobject.GObject): + raise TypeError("%r must be a GObject subclass" % self) + + defaults = self._default_values.copy() + for kwarg in kwargs: + if not kwarg in defaults: + raise TypeError("Unknown keyword argument: %s" % kwarg) + defaults.update(kwargs) + for name, value in defaults.items(): + self._set(name, value) + + def __class_init__(cls, namespace): + # Do not try to register gobject subclasses + # If you try to instantiate an object you'll get a warning, + # So it is safe to ignore here. + if not issubclass(cls, gobject.GObject): + return + + # Create python properties for gobject properties, store all + # the values in self._attributes, so do_set/get_property + # can access them. Using set property for attribute assignments + # allows us to add hooks (notify::attribute) when they change. + default_values = {} + + for pspec in list_properties(cls, parent=False): + prop_name = pspec.name.replace('-', '_') + + p = property(lambda self, n=prop_name: self._attributes[n], + lambda self, v, n=prop_name: self.set_property(n, v)) + setattr(cls, prop_name, p) + + default_values[prop_name] = pspec.default_value + + cls._default_values.update(default_values) + + __class_init__ = classmethod(__class_init__) + + def _set(self, name, value): + func = getattr(self, 'prop_set_%s' % name, None) + if callable(func) and func: + value = func(value) + self._attributes[name] = value + + def _get(self, name): + func = getattr(self, 'prop_get_%s' % name, None) + if callable(func) and func: + return func() + return self._attributes[name] + + def get_attribute_names(self): + return self._attributes.keys() + + def is_default_value(self, attr, value): + return self._default_values[attr] == value + + def do_set_property(self, pspec, value): + prop_name = pspec.name.replace('-', '_') + self._set(prop_name, value) + + def do_get_property(self, pspec): + prop_name = pspec.name.replace('-', '_') + return self._get(prop_name) + +def gsignal(name, *args, **kwargs): + """ + Add a GObject signal to the current object. + It current supports the following types: + - str, int, float, long, object, enum + @param name: name of the signal + @type name: string + @param args: types for signal parameters, + if the first one is a string 'override', the signal will be + overridden and must therefor exists in the parent GObject. + @keyword flags: One of the following: + - gobject.SIGNAL_RUN_FIRST + - gobject.SIGNAL_RUN_LAST + - gobject.SIGNAL_RUN_CLEANUP + - gobject.SIGNAL_NO_RECURSE + - gobject.SIGNAL_DETAILED + - gobject.SIGNAL_ACTION + - gobject.SIGNAL_NO_HOOKS + @keyword retval: return value in signal callback + """ + + frame = sys._getframe(1) + try: + locals = frame.f_locals + finally: + del frame + + dict = locals.setdefault('__gsignals__', {}) + + if args and args[0] == 'override': + dict[name] = 'override' + else: + retval = kwargs.get('retval', None) + if retval is None: + default_flags = gobject.SIGNAL_RUN_FIRST + else: + default_flags = gobject.SIGNAL_RUN_LAST + + flags = kwargs.get('flags', default_flags) + if retval is not None and flags != gobject.SIGNAL_RUN_LAST: + raise TypeError( + "You cannot use a return value without setting flags to " + "gobject.SIGNAL_RUN_LAST") + + dict[name] = (flags, retval, args) + +def _max(c): + # Python 2.3 does not like bitshifting here + return 2 ** ((8 * struct.calcsize(c)) - 1) - 1 + +_MAX_VALUES = {int : _max('i'), + float : _max('f'), + long : _max('l') } +_DEFAULT_VALUES = {str : '', float : 0.0, int : 0, long : 0L} + +def gproperty(name, ptype, default=None, nick='', blurb='', + flags=gobject.PARAM_READWRITE, **kwargs): + """ + Add a GObject property to the current object. + @param name: name of property + @type name: string + @param ptype: type of property + @type ptype: type + @param default: default value + @param nick: short description + @param blurb: long description + @param flags: parameter flags, one of: + - PARAM_READABLE + - PARAM_READWRITE + - PARAM_WRITABLE + - PARAM_CONSTRUCT + - PARAM_CONSTRUCT_ONLY + - PARAM_LAX_VALIDATION + Optional, only for int, float, long types: + @keyword minimum: minimum allowed value + @keyword maximum: maximum allowed value + """ + + # General type checking + if default is None: + default = _DEFAULT_VALUES.get(ptype) + elif not isinstance(default, ptype): + raise TypeError("default must be of type %s, not %r" % ( + ptype, default)) + if not isinstance(nick, str): + raise TypeError('nick for property %s must be a string, not %r' % ( + name, nick)) + nick = nick or name + if not isinstance(blurb, str): + raise TypeError('blurb for property %s must be a string, not %r' % ( + name, blurb)) + + # Specific type checking + if ptype == int or ptype == float or ptype == long: + default = (kwargs.get('minimum', ptype(0)), + kwargs.get('maximum', _MAX_VALUES[ptype]), + default) + elif ptype == bool: + if (default is not True and + default is not False): + raise TypeError("default must be True or False, not %r" % ( + default)) + default = default, + elif gobject.type_is_a(ptype, gobject.GEnum): + if default is None: + raise TypeError("enum properties needs a default value") + elif not isinstance(default, ptype): + raise TypeError("enum value %s must be an instance of %r" % + (default, ptype)) + default = default, + elif ptype == str: + default = default, + elif ptype == object: + if default is not None: + raise TypeError("object types does not have default values") + default = () + else: + raise NotImplementedError("type %r" % ptype) + + if flags not in (gobject.PARAM_READABLE, gobject.PARAM_READWRITE, + gobject.PARAM_WRITABLE, gobject.PARAM_CONSTRUCT, + gobject.PARAM_CONSTRUCT_ONLY, + gobject.PARAM_LAX_VALIDATION): + raise TypeError("invalid flag value: %r" % flags) + + frame = sys._getframe(1) + try: + locals = frame.f_locals + dict = locals.setdefault('__gproperties__', {}) + finally: + del frame + + dict[name] = (ptype, nick, blurb) + default + (flags,) diff --git a/pixmaps/validation-error-16.png b/pixmaps/validation-error-16.png Binary files differnew file mode 100644 index 0000000..8595501 --- /dev/null +++ b/pixmaps/validation-error-16.png diff --git a/po/POTFILES.list b/po/POTFILES.list new file mode 100644 index 0000000..de150a2 --- /dev/null +++ b/po/POTFILES.list @@ -0,0 +1 @@ +recursive-include kiwi *.py diff --git a/po/kiwi.pot b/po/kiwi.pot new file mode 100644 index 0000000..07a28b2 --- /dev/null +++ b/po/kiwi.pot @@ -0,0 +1,140 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-03-30 16:53-0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../kiwi/ui/dateentry.py:74 +msgid "_Today" +msgstr "" + +#: ../kiwi/ui/dateentry.py:75 +msgid "_Cancel" +msgstr "" + +#: ../kiwi/ui/dateentry.py:76 +msgid "_Select" +msgstr "" + +#: ../kiwi/ui/wizard.py:211 +msgid "Finish" +msgstr "" + +#: ../kiwi/ui/entry.py:352 +#, python-format +msgid "'%s' is not a valid object" +msgstr "" + +#: ../kiwi/ui/objectlist.py:1656 +msgid "Total:" +msgstr "" + +#: ../kiwi/ui/dialogs.py:98 +msgid "Show more _details" +msgstr "" + +#: ../kiwi/ui/dialogs.py:231 +msgid "Open" +msgstr "" + +#: ../kiwi/ui/dialogs.py:259 +#, python-format +msgid "Could not open file \"%s\"" +msgstr "" + +#: ../kiwi/ui/dialogs.py:260 +#, python-format +msgid "The file \"%s\" could not be opened. Permission denied." +msgstr "" + +#: ../kiwi/ui/dialogs.py:267 +#, python-format +msgid "A file named \"%s\" already exists" +msgstr "" + +#: ../kiwi/ui/dialogs.py:268 +msgid "Do you wish to replace it with the current one?" +msgstr "" + +#: ../kiwi/ui/dialogs.py:274 +msgid "Replace" +msgstr "" + +#: ../kiwi/ui/dialogs.py:280 +msgid "Save" +msgstr "" + +#: ../kiwi/ui/gazpacholoader.py:217 ../kiwi/ui/gazpacholoader.py:228 +#: ../kiwi/ui/gazpacholoader.py:243 ../kiwi/ui/gazpacholoader.py:255 +#: ../kiwi/ui/gazpacholoader.py:267 +msgid "Integer" +msgstr "" + +#: ../kiwi/ui/gazpacholoader.py:218 ../kiwi/ui/gazpacholoader.py:229 +#: ../kiwi/ui/gazpacholoader.py:244 ../kiwi/ui/gazpacholoader.py:256 +#: ../kiwi/ui/gazpacholoader.py:268 +msgid "Float" +msgstr "" + +#: ../kiwi/ui/gazpacholoader.py:219 ../kiwi/ui/gazpacholoader.py:230 +#: ../kiwi/ui/gazpacholoader.py:245 ../kiwi/ui/gazpacholoader.py:257 +#: ../kiwi/ui/gazpacholoader.py:269 +msgid "Decimal" +msgstr "" + +#: ../kiwi/ui/gazpacholoader.py:220 ../kiwi/ui/gazpacholoader.py:231 +#: ../kiwi/ui/gazpacholoader.py:273 +msgid "Currency" +msgstr "" + +#: ../kiwi/ui/gazpacholoader.py:226 ../kiwi/ui/gazpacholoader.py:241 +#: ../kiwi/ui/gazpacholoader.py:252 ../kiwi/ui/gazpacholoader.py:264 +msgid "String" +msgstr "" + +#: ../kiwi/ui/gazpacholoader.py:227 ../kiwi/ui/gazpacholoader.py:242 +#: ../kiwi/ui/gazpacholoader.py:253 ../kiwi/ui/gazpacholoader.py:265 +msgid "Unicode" +msgstr "" + +#: ../kiwi/ui/gazpacholoader.py:232 ../kiwi/ui/gazpacholoader.py:246 +#: ../kiwi/ui/gazpacholoader.py:270 +msgid "Date" +msgstr "" + +#: ../kiwi/ui/gazpacholoader.py:233 ../kiwi/ui/gazpacholoader.py:271 +msgid "Date and Time" +msgstr "" + +#: ../kiwi/ui/gazpacholoader.py:234 ../kiwi/ui/gazpacholoader.py:272 +msgid "Time" +msgstr "" + +#: ../kiwi/ui/gazpacholoader.py:235 ../kiwi/ui/gazpacholoader.py:258 +msgid "Object" +msgstr "" + +#: ../kiwi/ui/gazpacholoader.py:254 ../kiwi/ui/gazpacholoader.py:266 +msgid "Boolean" +msgstr "" + +#: ../kiwi/ui/proxywidget.py:268 +#, python-format +msgid "'%s' is not a valid value for this field" +msgstr "" + +#: ../kiwi/ui/proxywidget.py:297 +msgid "This field is mandatory" +msgstr "" diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 0000000..bfc3ce7 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,139 @@ +# Tradução português para Kiwi +# Copyright (C) 2005 Johan Dahlin +# This file is distributed under the same license as the kiwi package. +# Johan Dahlin <jdahlin@async.com.br>, 2005 +# +# +msgid "" +msgstr "" +"Project-Id-Version: kiwi 1.9.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-03-30 16:53-0300\n" +"PO-Revision-Date: 2005-11-14 10:07-0200\n" +"Last-Translator: Ronaldo Maia <romaia@async.com.br>\n" +"Language-Team: Brazilian Portuguese <ldp-br@bazar.conectiva.com.br>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../kiwi/ui/dateentry.py:74 +msgid "_Today" +msgstr "_Hoje" + +#: ../kiwi/ui/dateentry.py:75 +msgid "_Cancel" +msgstr "_Cancelar" + +#: ../kiwi/ui/dateentry.py:76 +msgid "_Select" +msgstr "_Selecionar" + +#: ../kiwi/ui/wizard.py:211 +msgid "Finish" +msgstr "Terminar" + +#: ../kiwi/ui/entry.py:352 +#, python-format +msgid "'%s' is not a valid object" +msgstr "'%s' não é um objeto válido" + +#: ../kiwi/ui/objectlist.py:1656 +msgid "Total:" +msgstr "Total:" + +#: ../kiwi/ui/dialogs.py:98 +msgid "Show more _details" +msgstr "Exibir mais _detalhes" + +#: ../kiwi/ui/dialogs.py:231 +msgid "Open" +msgstr "Abrir" + +#: ../kiwi/ui/dialogs.py:259 +#, python-format +msgid "Could not open file \"%s\"" +msgstr "Não foi possivel abrir o arquivo \"%s\"" + +#: ../kiwi/ui/dialogs.py:260 +#, python-format +msgid "The file \"%s\" could not be opened. Permission denied." +msgstr "O arquivo \"%s\" não pode ser aberto. Permissão negada." + +#: ../kiwi/ui/dialogs.py:267 +#, python-format +msgid "A file named \"%s\" already exists" +msgstr "Já existe um arquivo com o nome \"%s\"" + +#: ../kiwi/ui/dialogs.py:268 +msgid "Do you wish to replace it with the current one?" +msgstr "Deseja substituÃ-lo pelo arquivo atual?" + +#: ../kiwi/ui/dialogs.py:274 +msgid "Replace" +msgstr "Substituir" + +#: ../kiwi/ui/dialogs.py:280 +msgid "Save" +msgstr "Salvar" + +#: ../kiwi/ui/gazpacholoader.py:217 ../kiwi/ui/gazpacholoader.py:228 +#: ../kiwi/ui/gazpacholoader.py:243 ../kiwi/ui/gazpacholoader.py:255 +#: ../kiwi/ui/gazpacholoader.py:267 +msgid "Integer" +msgstr "Inteiro" + +#: ../kiwi/ui/gazpacholoader.py:218 ../kiwi/ui/gazpacholoader.py:229 +#: ../kiwi/ui/gazpacholoader.py:244 ../kiwi/ui/gazpacholoader.py:256 +#: ../kiwi/ui/gazpacholoader.py:268 +msgid "Float" +msgstr "Flutuante" + +#: ../kiwi/ui/gazpacholoader.py:219 ../kiwi/ui/gazpacholoader.py:230 +#: ../kiwi/ui/gazpacholoader.py:245 ../kiwi/ui/gazpacholoader.py:257 +#: ../kiwi/ui/gazpacholoader.py:269 +msgid "Decimal" +msgstr "Decimal" + +#: ../kiwi/ui/gazpacholoader.py:220 ../kiwi/ui/gazpacholoader.py:231 +#: ../kiwi/ui/gazpacholoader.py:273 +msgid "Currency" +msgstr "Monetário" + +#: ../kiwi/ui/gazpacholoader.py:226 ../kiwi/ui/gazpacholoader.py:241 +#: ../kiwi/ui/gazpacholoader.py:252 ../kiwi/ui/gazpacholoader.py:264 +msgid "String" +msgstr "String" + +#: ../kiwi/ui/gazpacholoader.py:227 ../kiwi/ui/gazpacholoader.py:242 +#: ../kiwi/ui/gazpacholoader.py:253 ../kiwi/ui/gazpacholoader.py:265 +msgid "Unicode" +msgstr "Unicode" + +#: ../kiwi/ui/gazpacholoader.py:232 ../kiwi/ui/gazpacholoader.py:246 +#: ../kiwi/ui/gazpacholoader.py:270 +msgid "Date" +msgstr "Data" + +#: ../kiwi/ui/gazpacholoader.py:233 ../kiwi/ui/gazpacholoader.py:271 +msgid "Date and Time" +msgstr "Data e Hora" + +#: ../kiwi/ui/gazpacholoader.py:234 ../kiwi/ui/gazpacholoader.py:272 +msgid "Time" +msgstr "Hora" + +#: ../kiwi/ui/gazpacholoader.py:235 ../kiwi/ui/gazpacholoader.py:258 +msgid "Object" +msgstr "Objeto" + +#: ../kiwi/ui/gazpacholoader.py:254 ../kiwi/ui/gazpacholoader.py:266 +msgid "Boolean" +msgstr "Boleano" + +#: ../kiwi/ui/proxywidget.py:268 +msgid "'%s' is not a valid value for this field" +msgstr "'%s' não é um valor válido para este campo" + +#: ../kiwi/ui/proxywidget.py:297 +msgid "This field is mandatory" +msgstr "Essa campo é obrigatorio" diff --git a/po/sv.po b/po/sv.po new file mode 100644 index 0000000..7896904 --- /dev/null +++ b/po/sv.po @@ -0,0 +1,143 @@ +# Swedish translation for Kiwi +# Copyright (C) 2005 Johan Dahlin +# This file is distributed under the same license as the kiwi package. +# Johan Dahlin <jdahlin@async.com.br>, 2005 +# +# +msgid "" +msgstr "" +"Project-Id-Version: kiwi 1.9.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-03-30 16:53-0300\n" +"PO-Revision-Date: 2006-03-08 13:42-0300\n" +"Last-Translator: Johan Dahlin <jdahlin@async.com.br>\n" +"Language-Team: Swedish <sv@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../kiwi/ui/dateentry.py:74 +msgid "_Today" +msgstr "" + +#: ../kiwi/ui/dateentry.py:75 +msgid "_Cancel" +msgstr "" + +#: ../kiwi/ui/dateentry.py:76 +msgid "_Select" +msgstr "" + +#: ../kiwi/ui/wizard.py:211 +msgid "Finish" +msgstr "" + +#: ../kiwi/ui/entry.py:352 +#, python-format +msgid "'%s' is not a valid object" +msgstr "'%s' är inte ett giltligt objekt" + +#: ../kiwi/ui/objectlist.py:1656 +msgid "Total:" +msgstr "Total:" + +#: ../kiwi/ui/dialogs.py:98 +msgid "Show more _details" +msgstr "Visa mer _detaljer" + +#: ../kiwi/ui/dialogs.py:231 +msgid "Open" +msgstr "Öppna" + +#: ../kiwi/ui/dialogs.py:259 +#, python-format +msgid "Could not open file \"%s\"" +msgstr "Kunde inte öppna filen \"%s\"" + +#: ../kiwi/ui/dialogs.py:260 +#, python-format +msgid "The file \"%s\" could not be opened. Permission denied." +msgstr "Filen \"%s\" kunde inte öppnas. Rättigheter saknas." + +#: ../kiwi/ui/dialogs.py:267 +#, python-format +msgid "A file named \"%s\" already exists" +msgstr "En fil kallad \"%s\" existerar redan" + +#: ../kiwi/ui/dialogs.py:268 +msgid "Do you wish to replace it with the current one?" +msgstr "Vill du verkligen ersätta den med den nuvarande?" + +#: ../kiwi/ui/dialogs.py:274 +msgid "Replace" +msgstr "Ersätt" + +#: ../kiwi/ui/dialogs.py:280 +msgid "Save" +msgstr "Spara" + +#: ../kiwi/ui/gazpacholoader.py:217 ../kiwi/ui/gazpacholoader.py:228 +#: ../kiwi/ui/gazpacholoader.py:243 ../kiwi/ui/gazpacholoader.py:255 +#: ../kiwi/ui/gazpacholoader.py:267 +msgid "Integer" +msgstr "Heltal" + +#: ../kiwi/ui/gazpacholoader.py:218 ../kiwi/ui/gazpacholoader.py:229 +#: ../kiwi/ui/gazpacholoader.py:244 ../kiwi/ui/gazpacholoader.py:256 +#: ../kiwi/ui/gazpacholoader.py:268 +msgid "Float" +msgstr "Flyttal" + +#: ../kiwi/ui/gazpacholoader.py:219 ../kiwi/ui/gazpacholoader.py:230 +#: ../kiwi/ui/gazpacholoader.py:245 ../kiwi/ui/gazpacholoader.py:257 +#: ../kiwi/ui/gazpacholoader.py:269 +msgid "Decimal" +msgstr "" + +#: ../kiwi/ui/gazpacholoader.py:220 ../kiwi/ui/gazpacholoader.py:231 +#: ../kiwi/ui/gazpacholoader.py:273 +msgid "Currency" +msgstr "Valuta" + +#: ../kiwi/ui/gazpacholoader.py:226 ../kiwi/ui/gazpacholoader.py:241 +#: ../kiwi/ui/gazpacholoader.py:252 ../kiwi/ui/gazpacholoader.py:264 +msgid "String" +msgstr "Sträng" + +#: ../kiwi/ui/gazpacholoader.py:227 ../kiwi/ui/gazpacholoader.py:242 +#: ../kiwi/ui/gazpacholoader.py:253 ../kiwi/ui/gazpacholoader.py:265 +msgid "Unicode" +msgstr "" + +#: ../kiwi/ui/gazpacholoader.py:232 ../kiwi/ui/gazpacholoader.py:246 +#: ../kiwi/ui/gazpacholoader.py:270 +msgid "Date" +msgstr "Datum" + +#: ../kiwi/ui/gazpacholoader.py:233 ../kiwi/ui/gazpacholoader.py:271 +#, fuzzy +msgid "Date and Time" +msgstr "Datumtid" + +#: ../kiwi/ui/gazpacholoader.py:234 ../kiwi/ui/gazpacholoader.py:272 +msgid "Time" +msgstr "Tid" + +#: ../kiwi/ui/gazpacholoader.py:235 ../kiwi/ui/gazpacholoader.py:258 +msgid "Object" +msgstr "Objekt" + +#: ../kiwi/ui/gazpacholoader.py:254 ../kiwi/ui/gazpacholoader.py:266 +msgid "Boolean" +msgstr "Boolean" + +#: ../kiwi/ui/proxywidget.py:268 +msgid "'%s' is not a valid value for this field" +msgstr "'%s' är inte ett giltligt värde för detta fältet" + +#: ../kiwi/ui/proxywidget.py:297 +msgid "This field is mandatory" +msgstr "Detta fältet är obligatoriskt" + +#~ msgid "Datetime" +#~ msgstr "Datumtid" diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..2560629 --- /dev/null +++ b/setup.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +# Setup file for Kiwi +# Code by Async Open Source <http://www.async.com.br> +# setup.py written by Christian Reis <kiko@async.com.br> +# re-written various times by Johan Dahlin <jdahlin@async.com.br> + +""" +kiwi offers a set of enhanced widgets for +Python based on PyGTK. It also includes a framework designed to make +creating Python applications using PyGTK and libglade much +simpler. +""" + +from kiwi import kiwi_version +from kiwi.dist import setup, listfiles, listpackages, get_site_packages_dir + +setup(name="kiwi", + version=".".join(map(str, kiwi_version)), + description="A framework and a set of enhanced widgets based on PyGTK", + long_description=__doc__, + author="Async Open Source", + author_email="kiwi@async.com.br", + url="http://www.async.com.br/projects/", + license="GNU LGPL 2.1 (see COPYING)", + data_files=[('$datadir/glade', + listfiles('glade', '*.glade')), + ('$datadir/pixmaps', + listfiles('pixmaps', '*.png')), + ('share/gazpacho/catalogs', + listfiles('gazpacho-plugin', 'kiwiwidgets.xml')), + ('share/gazpacho/resources/kiwiwidgets', + listfiles('gazpacho-plugin', 'resources', + 'kiwiwidgets', '*.png')), + (get_site_packages_dir('gazpacho', 'widgets'), + listfiles('gazpacho-plugin', 'kiwiwidgets.py')), + ('share/doc/kiwi', + ('AUTHORS', 'ChangeLog', 'NEWS', 'README')), + ('$sysconfdir/kiwi', ['setup.py']), + ], + scripts=['bin/kiwi-i18n', + 'bin/kiwi-ui-test'], + packages=listpackages('kiwi'), + resources=dict(locale='$prefix/share/locale'), + global_resources=dict(glade='$datadir/glade', + pixmap='$datadir/pixmaps'), + ) diff --git a/tests/Proxies/CheckButton.py b/tests/Proxies/CheckButton.py new file mode 100644 index 0000000..1907aa0 --- /dev/null +++ b/tests/Proxies/CheckButton.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +import sys +sys.path.insert(0, "../..") + +DEBUG = 0 +if len(sys.argv) > 1: + DEBUG = 1 + +from Kiwi.initgtk import gtk +from Kiwi.Proxies import Proxy +from Kiwi.Models import Model + +class Foo(Model): + A = 1 + B = 0 + +class CheckProxy(Proxy): + widgets = [":B", ":A"] + def __init__(self, model): + self._build() + Proxy.__init__(self, model, delete_handler=gtk.mainquit) + gtk.idle_add(self.focus_topmost) + + def _build(self): + self.win = gtk.Window() + self.A = gtk.CheckButton("This is A") + self.B = gtk.CheckButton("This is B") + vbox = gtk.VBox() + vbox.add(self.A) + vbox.add(self.B) + self.win.add(vbox) + +class ToggleProxy(CheckProxy): + def _build(self): + self.win = gtk.Window() + self.A = gtk.ToggleButton("This is A") + self.B = gtk.ToggleButton("This is B") + vbox = gtk.VBox() + vbox.add(self.A) + vbox.add(self.B) + self.win.add(vbox) + +f = Foo() +c = CheckProxy(f) +assert f.A == 1 +assert f.B == 0 +c.A.clicked() +c.B.clicked() +assert f.A == 0, f.A +assert f.B == 1, f.B +if DEBUG: c.show_all_and_loop() ; print f.__dict__ +print "CheckButton OK" + +f = Foo() +c = ToggleProxy(f) +assert f.A == 1, f.A +assert f.B == 0, f.B +c.A.clicked() +c.B.clicked() +assert f.A == 0, f.A +assert f.B == 1, f.B +if DEBUG: c.show_all_and_loop(); print f.__dict__ +print "ToggleButton OK" diff --git a/tests/Proxies/Entry.py b/tests/Proxies/Entry.py new file mode 100644 index 0000000..05b7304 --- /dev/null +++ b/tests/Proxies/Entry.py @@ -0,0 +1,274 @@ +#!/usr/bin/env python +import sys, pprint +sys.path.insert(0, "../..") + +DEBUG = 0 +if len(sys.argv) > 1: + DEBUG = 1 + +from mx import DateTime + +from Kiwi.initgtk import gtk +from Kiwi.Proxies import Proxy +from Kiwi.Models import Model + +class Foo(Model): + A = "Alphabet" + B = "Beetroot" + C = 10 + D = 20 + E = DateTime.now() + # F unset + G = 30 + # H unset + +class NumberFoo(Model): + A = 1 + B = 2 + C = 3 + D = 4 + E = DateTime.now() + # F unset + G = 6 + # H unset + +class EntryProxy(Proxy): + widgets = [":B", ":A", ":C", ":D", ":E", ":F", ":G", ":H"] + def __init__(self, model, flag=0): + self._build() + self.set_numeric("C") + if flag: + self.set_datetime("E") + self.set_numeric("G") + self.set_numeric("H") + self.set_format("H", "%.3f") + self.set_format("G", "%.3f") + self.set_decimal_separator(",") + Proxy.__init__(self, model, delete_handler=gtk.mainquit) + gtk.idle_add(self.focus_topmost) + + def _build(self): + self.win = gtk.Window() + self.A = gtk.Entry() + self.B = gtk.Entry() + self.C = gtk.Entry() + self.D = gtk.Entry() + self.E = gtk.Entry() + self.F = gtk.Entry() + self.F.set_text("NOOGIE") + self.G = gtk.Entry() + self.H = gtk.Entry() + self.H.set_text("30.41") + vbox = gtk.VBox() + vbox.add(self.A) + vbox.add(self.B) + vbox.add(self.C) + vbox.add(self.D) + vbox.add(self.E) + vbox.add(self.F) + vbox.add(self.G) + vbox.add(self.H) + self.vbox = vbox + self.win.add(vbox) + +class ComboProxy(EntryProxy): + def _build(self): + self.win = gtk.Window() + self.A = gtk.Combo() + self.A.set_popdown_strings(["foo"]) + self.B = gtk.Combo() + self.B.set_popdown_strings(["bar"]) + self.C = gtk.Combo() + self.C.set_popdown_strings(["99"]) + self.D = gtk.Combo() + self.D.set_popdown_strings(["100"]) + self.E = gtk.Combo() + self.F = gtk.Combo() + self.F.entry.set_text("NOOGIE") + self.G = gtk.Combo() + self.H = gtk.Combo() + self.H.entry.set_text("30.41") + vbox = gtk.VBox() + vbox.add(self.A) + vbox.add(self.B) + vbox.add(self.C) + vbox.add(self.D) + vbox.add(self.E) + vbox.add(self.F) + vbox.add(self.G) + vbox.add(self.H) + self.win.add(vbox) + +class LabelProxy(EntryProxy): + def _build(self): + self.win = gtk.Window() + self.A = gtk.Label() + self.B = gtk.Label() + self.C = gtk.Label() + self.D = gtk.Label() + self.E = gtk.Label() + self.F = gtk.Label("NOOGIE") + self.G = gtk.Label() + self.H = gtk.Label() + self.H.set_text("30.41") + vbox = gtk.VBox() + vbox.add(self.A) + vbox.add(self.B) + vbox.add(self.C) + vbox.add(self.D) + vbox.add(self.E) + vbox.add(self.F) + vbox.add(self.G) + vbox.add(self.H) + self.win.add(vbox) + +class SpinProxy(EntryProxy): + def _build(self): + self.win = gtk.Window() + self.A = gtk.SpinButton(None, 1, 2) + adj = self.A.get_adjustment() + adj.step_increment = 1.0 + adj.changed() + self.A.set_adjustment(adj) + self.A.set_range(-100, 100) + self.B = gtk.SpinButton(None, 1, 2) + self.B.set_range(-100, 100) + self.C = gtk.SpinButton(None, 1, 2) + self.C.set_range(-100, 100) + self.D = gtk.SpinButton(None, 1, 2) + self.D.set_range(-100, 100) + self.E = gtk.SpinButton(None, 1, 2) + self.E.set_range(-100, 100) + self.F = gtk.SpinButton(None, 1, 2) + self.F.set_range(-100, 100) + self.F.set_text("NOOGIE") + self.G = gtk.SpinButton(None, 1, 2) + self.G.set_range(-100, 100) + self.H = gtk.SpinButton(None, 1, 2) + self.H.set_range(-100, 100) + vbox = gtk.VBox() + vbox.add(self.A) + vbox.add(self.B) + vbox.add(self.C) + vbox.add(self.D) + vbox.add(self.E) + vbox.add(self.F) + vbox.add(self.G) + vbox.add(self.H) + self.win.add(vbox) + self.set_numeric(["A", "B", "C", "D", "E", "F"]) + +f = Foo() +try: + c = EntryProxy(f) +except TypeError: + pass +f.flush_proxies() +c = EntryProxy(f, 1) +assert f.A == "Alphabet", f.A +assert f.B == "Beetroot", f.B +assert f.C == 10, f.C +assert f.D == "20", f.D +assert f.F == "NOOGIE", f.F +assert f.H == 30.41, f.H +f.G = 30.42 +c.A.set_text("Aspargus") +c.B.set_text("Barney") +c.C.set_text("200") +c.D.set_text("barney") +assert f.A == "Aspargus", f.A +assert f.B == "Barney", f.B +assert f.C == 200, f.D +assert f.D == "barney", f.D +t = c.G.get_text() +assert t == "30,420", t +assert f.G == 30.42 +if DEBUG: c.show_all_and_loop() ; pprint.pprint(f.__dict__) +print "Entry OK" + +f = Foo() +try: + c = ComboProxy(f) +except TypeError: + pass +f.flush_proxies() +c = ComboProxy(f, 1) +assert f.A == "Alphabet", f.A +assert f.B == "Beetroot", f.B +assert f.C == 10, f.C +assert f.D == "20", f.D +assert f.F == "NOOGIE", f.F +c.A.entry.set_text("Aspargus") +c.B.entry.set_text("Barney") +c.C.entry.set_text("200") +c.D.entry.set_text("barney") +f.G = 30.42 +assert f.A == "Aspargus", f.A +assert f.B == "Barney", f.B +assert f.C == 200, f.D +assert f.D == "barney", f.D +t = c.G.entry.get_text() +assert t == "30,420", t +if DEBUG: c.show_all_and_loop() ; pprint.pprint(f.__dict__) +print "Combo OK" + +f = Foo() +try: + c = LabelProxy(f) +except TypeError: + pass +f.flush_proxies() +c = LabelProxy(f, 1) +assert f.A == "Alphabet", f.A +assert f.B == "Beetroot", f.B +assert f.C == 10, f.C +# XXX: Label does *NOT* convert to text on startup because it never +# triggers signals - is this correct, and is Entry correct? +assert f.D == 20 +# XXX: label doesn't generate signals, so we can't pick up the +# set_text() changes done to it. This is why +# assert f.F == "NOOGIE" +# fails here. See WidgetProxies.Entry:Labelproxy.update for details. +f.A = "Aspargus" +f.B = "Barney" +try: + f.C = "200" +except TypeError: + f.C = 200 +f.D = "barney" +f.G = 30.42 +assert c.A.get() == "Aspargus", f.A +assert c.B.get() == "Barney", f.B +assert c.C.get() == "200", f.C +assert c.D.get() == "barney", f.D +t = c.G.get_text() +assert t == "30,420", t +if DEBUG: c.show_all_and_loop() ; pprint.pprint(f.__dict__) +print "Label OK" + +f = NumberFoo() +assert f.D == 4, f.D +try: + c = SpinProxy(f) +except TypeError: + pass +f.flush_proxies() +c = SpinProxy(f, 1) +if DEBUG: c.show_all_and_loop() ; pprint.pprint(f.__dict__) +assert f.A == 0, f.A +assert f.B == 0, f.B +assert f.C == 0 +assert f.D == 0, f.D +assert f.F == 0, f.F +c.A.set_text("4") +c.B.set_text("3") +c.C.set_text("2") +c.D.set_text("1") +f.G = 30.42 +assert f.A == 4, f.A +assert f.B == 3, f.B +assert f.C == 2, f.D +assert f.D == 1, f.D +t = c.G.get_text() +assert t == "30,420", t +print "SpinButton OK" diff --git a/tests/Proxies/NoModel.py b/tests/Proxies/NoModel.py new file mode 100644 index 0000000..aae6802 --- /dev/null +++ b/tests/Proxies/NoModel.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python + +# +# Tests creating a Proxy with no initial model, and then adding one later +# + +import sys, pprint +sys.path.insert(0, "../..") + +DEBUG = 0 +if len(sys.argv) > 1: + DEBUG = 1 + +from Kiwi.initgtk import gtk +from Kiwi.Proxies import Proxy +from Kiwi.Models import Model + +class Foo(Model): + pass + +class XProxy(Proxy): + widgets = [":A"] + def __init__(self, model=None, flag=0): + self._build() + self.set_numeric("A") + Proxy.__init__(self, model, delete_handler=gtk.mainquit) + self.A.grab_focus() + + def _build(self): + self.win = gtk.Window() + self.A = gtk.Entry() + self.win.add(self.A) + +f = Foo() +c = XProxy() +c.new_model(f) +if DEBUG: + c.show_all() + gtk.mainloop() + pprint.pprint(f.__dict__) +assert f.A == 0, f.A # XXX: Is this really expected? + +f = Foo() +f.A = 10 +c.new_model(f) +assert f.A == 10, f.A +t = c.A.get_text() +assert t == "10", t +print "NoModel ok" diff --git a/tests/Proxies/None.py b/tests/Proxies/None.py new file mode 100644 index 0000000..0cdcd15 --- /dev/null +++ b/tests/Proxies/None.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +# +# Tests creating a Proxy against a widget that is not supported by +# Proxies (a Frame). +# + +import sys +sys.path.insert(0, "../..") + +DEBUG = 0 +if len(sys.argv) > 1: + DEBUG = 1 + +from Kiwi.initgtk import gtk +from Kiwi.Proxies import Proxy +from Kiwi.Models import Model + +class Foo(Model): + pass + +class NoProxy(Proxy): + widgets = [":A"] + def __init__(self, model, flag=0): + self._build() + Proxy.__init__(self, model, delete_handler=gtk.mainquit) + + def _build(self): + self.win = gtk.Window() + self.A = gtk.Frame() + self.win.add(self.A) + +f = Foo() +try: + c = NoProxy(f) + raise AssertionError +except TypeError: + print "None ok" diff --git a/tests/Proxies/OptionMenu.py b/tests/Proxies/OptionMenu.py new file mode 100644 index 0000000..962275a --- /dev/null +++ b/tests/Proxies/OptionMenu.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +import sys, pprint +sys.path.insert(0, "../..") + +DEBUG = 0 +if len(sys.argv) > 1: + DEBUG = 1 + +from Kiwi.initgtk import gtk +from Kiwi.Proxies import Proxy +from Kiwi.Models import Model +#from Kiwi.Menu import OptionMenu +from gtk import OptionMenu + +def prefill(args): + print "ARGS", args + +class Foo(Model): + A = "Run" + B = "Hide" + C = None # Play + # No D - Play + E = 666 # Run + # No F - Play + +class CheckProxy(Proxy): + widgets = [":A", ":B", ":C", ":D", ":E", ":F"] + def __init__(self, model): + self._build() + Proxy.__init__(self, model, delete_handler=gtk.mainquit) + gtk.idle_add(self.focus_topmost) + + def _build(self): + self.win = gtk.Window() + self.A = OptionMenu() + self.A.prefill(["Play", "Hide", "Run"]) + self.B = OptionMenu() + self.B.prefill(["Play", "Hide", "Run"]) + self.C = OptionMenu() + self.C.prefill(["Play", "Hide", "Run"]) + self.D = OptionMenu() + self.D.prefill(["Play", "Hide", "Run"]) + self.E = OptionMenu() + self.E.prefill([("Play", 111), ("Hide", 222) , ("Run", 666)]) + self.F = OptionMenu() + self.F.prefill([("Play", 111), ("Hide", 222) , ("Run", 666)]) + vbox = gtk.VBox() + vbox.add(self.A) + vbox.add(self.B) + vbox.add(self.C) + vbox.add(self.D) + vbox.add(self.E) + vbox.add(self.F) + self.win.add(vbox) + +f = Foo() +c = CheckProxy(f) +assert f.A == "Run", f.A +assert f.B == "Hide", f.B +assert f.C == "Play", f.C +assert f.D == "Play", f.D +assert f.E == 666, f.E +assert f.F == 111, f.E +c.A.get_menu().children()[0].activate() +c.B.get_menu().children()[2].activate() +c.E.get_menu().children()[1].activate() +assert f.A == "Play", f.A +assert f.B == "Run", f.B +assert f.E == 222, f.B +try: + f.E = 231 + raise AssertionError +except ValueError: + # XXX: set value back to normal. See Model.__setattr__ + f.E = 222 +if DEBUG: c.show_all_and_loop() ; pprint.pprint(f.__dict__) +print "OptionMenu OK" diff --git a/tests/Proxies/RadioGroup.py b/tests/Proxies/RadioGroup.py new file mode 100644 index 0000000..8714797 --- /dev/null +++ b/tests/Proxies/RadioGroup.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python +import sys, pprint +sys.path.insert(0, "../..") + +DEBUG = 0 +if len(sys.argv) > 1: + DEBUG = 1 + +from Kiwi.initgtk import gtk +from Kiwi.Proxies import Proxy +from Kiwi.Models import Model + +class Foo(Model): + A = "Play" + B = 222 + C = "OOH" + # No D - Play + E = None # Run + # No F - Play + +class RadioProxy(Proxy): + def __init__(self, model): + self._build() + Proxy.__init__(self, model, delete_handler=gtk.mainquit) + gtk.idle_add(self.focus_topmost) + + def _build(self): + self.win = gtk.Window() + self.A1 = gtk.RadioButton(label="Play") + self.A2 = gtk.RadioButton(self.A1, label="Hide") + self.A3 = gtk.RadioButton(self.A1, label="Run") + self.group_radiobuttons("A", ["A1", "A2", "A3"]) + + self.B1 = gtk.RadioButton(label="B Play") + self.B2 = gtk.RadioButton(self.B1, label="B Hide") + self.B3 = gtk.RadioButton(self.B1, label="B Run") + self.group_radiobuttons("B", {"B1": 111, "B2": 222, "B3": 333}) + + self.C1 = gtk.RadioButton(label="C Play") + self.C2 = gtk.RadioButton(self.C1, label="C Hide") + self.C3 = gtk.RadioButton(self.C1, label="C Run") + self.group_radiobuttons("C", {"C1": 111, "C2": 222, "C3": 333}) + + self.D1 = gtk.RadioButton(label="D Play") + self.D2 = gtk.RadioButton(self.D1, label="D Hide") + self.D3 = gtk.RadioButton(self.D1, label="D Run") + self.group_radiobuttons("D", {"D1": 111, "D2": 222, "D3": 333}) + + self.E1 = gtk.RadioButton(label="E Play") + self.E2 = gtk.RadioButton(self.E1, label="E Hide") + self.E3 = gtk.RadioButton(self.E1, label="E Run") + self.group_radiobuttons("E", {"E1": 111, "E2": 222, "E3": 333}) + + vbox = gtk.VBox() + vbox.add(self.A1) + vbox.add(self.A2) + vbox.add(self.A3) + vbox.add(self.B1) + vbox.add(self.B2) + vbox.add(self.B3) + vbox.add(self.C1) + vbox.add(self.C2) + vbox.add(self.C3) + vbox.add(self.D1) + vbox.add(self.D2) + vbox.add(self.D3) + vbox.add(self.E1) + vbox.add(self.E2) + vbox.add(self.E3) + self.win.add(vbox) + +f = Foo() +try: + f.D + raise AssertionError +except: + pass +assert f.E == None, f.E +try: + c = RadioProxy(f) + raise AssertionError +except ValueError: + pass +f.flush_proxies() +f.C = 333 +c = RadioProxy(f) +assert f.A == "Play", f.A +assert f.B == 222, f.B +assert f.C == 333, f.C +assert f.D == 111, f.D +assert f.E == 111, f.E +c.A2.clicked() +c.B3.clicked() +c.C1.clicked() +assert f.A == "Hide", f.A +assert f.B == 333, f.B +assert f.C == 111, f.B +c.A3.clicked() +assert f.A == "Run", f.A +f.E = None +assert f.E == 111, f.E +if DEBUG: c.show_all_and_loop(); pprint.pprint(f.__dict__) +print 'RadioButton OK' diff --git a/tests/Proxies/Separator.py b/tests/Proxies/Separator.py new file mode 100644 index 0000000..bf77ac4 --- /dev/null +++ b/tests/Proxies/Separator.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +import sys +sys.path.insert(0, "../..") + +DEBUG = 0 +if len(sys.argv) > 1: + DEBUG = 1 + +from Kiwi import set_decimal_separator +from Kiwi.initgtk import gtk +from Kiwi.Proxies import Proxy +from Kiwi.Models import Model + +class Foo(Model): + A = 10.10 + +class EntryProxy(Proxy): + widgets = [":A"] + def __init__(self, model): + self.set_numeric("A") + self._build() + Proxy.__init__(self, model, delete_handler=gtk.mainquit) + gtk.idle_add(self.focus_topmost) + + def _build(self): + self.win = gtk.Window() + self.A = gtk.Entry() + self.win.add(self.A) + +set_decimal_separator(",") +f = Foo() +c = EntryProxy(f) +assert c.A.get_text() == "10,1", c.A.get_text() +assert f.A == 10.1 + +set_decimal_separator("X") +f = Foo() +c = EntryProxy(f) +assert c.A.get_text() == "10X1", c.A.get_text() +assert f.A == 10.1 + +set_decimal_separator(".") +f = Foo() +c = EntryProxy(f) +assert c.A.get_text() == "10.1", c.A.get_text() +assert f.A == 10.1 + +set_decimal_separator("X") +f = Foo() +c = EntryProxy(f) +c.set_decimal_separator(".") +c.update("A") # Trigger view refresh +assert c.A.get_text() == "10.1", c.A.get_text() +assert f.A == 10.1 + +print "Separator OK" diff --git a/tests/Proxies/Text.py b/tests/Proxies/Text.py new file mode 100644 index 0000000..b99a978 --- /dev/null +++ b/tests/Proxies/Text.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python +import sys, pprint +sys.path.insert(0, "../..") + +DEBUG = 0 +if len(sys.argv) > 1: + DEBUG = 1 + +from mx import DateTime + +from Kiwi.initgtk import gtk +from Kiwi.Proxies import Proxy +from Kiwi.FrameWork import Model + +class Foo(Model): + A = "Alphabet" + B = "Beetroot" + C = 10 + D = 20 + E = DateTime.now() + # F unset + G = 30.42 + +class TextProxy(Proxy): + widgets = [":A", ":B", ":C", ":D", ":E", ":F", ":G"] + def __init__(self, model, flag=0): + self._build() + self.set_numeric("C") + if flag: + self.set_datetime("E") + self.set_numeric("G") + self.set_format("G", "%.3f") + Proxy.__init__(self, model, delete_handler=gtk.mainquit) + gtk.idle_add(self.focus_topmost) + + def _build(self): + self.win = gtk.GtkWindow() + self.A = gtk.GtkText() + self.A.set_editable(1) + self.B = gtk.GtkText() + self.B.set_editable(1) + self.C = gtk.GtkText() + self.C.set_editable(1) + self.D = gtk.GtkText() + self.D.set_editable(1) + self.E = gtk.GtkText() + self.E.set_editable(1) + self.F = gtk.GtkText() + self.F.set_editable(1) + self.F.insert_text("NOOGIE") + self.G = gtk.GtkText() + self.G.set_editable(1) + vbox = gtk.GtkVBox() + vbox.add(self.A) + vbox.add(self.B) + vbox.add(self.C) + vbox.add(self.D) + vbox.add(self.E) + vbox.add(self.F) + vbox.add(self.G) + self.win.add(vbox) + +f = Foo() +try: + c = TextProxy(f) +except TypeError: + pass +f.flush_proxies() +assert f.A == "Alphabet", f.A +c = TextProxy(f, 1) +assert f.A == "Alphabet", f.A +assert f.B == "Beetroot", f.B +assert f.C == 10, f.C +assert f.D == "20", f.D +assert f.F == "NOOGIE", f.F +c.A.delete_text(0, c.A.get_length()) +c.A.insert_text("Aspargus") +c.B.delete_text(0, c.B.get_length()) +c.B.insert_text("Barney") +c.C.delete_text(0, c.C.get_length()) +c.C.insert_text("200") +c.D.delete_text(0, c.D.get_length()) +c.D.insert_text("barney") +f.G = 30.42 +assert f.A == "Aspargus", f.A +assert f.B == "Barney", f.B +assert f.C == 200, f.D +assert f.D == "barney", f.D +t = c.G.get_chars(0, c.G.get_length()) +assert t == "30.420", t +if DEBUG: c.show_all_and_loop() ; pprint.pprint(f.__dict__) +print "Text OK" diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..b861dc2 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,5 @@ +try: + import pygtk + pygtk.require('2.0') +except ImportError: + pass diff --git a/tests/actions.glade b/tests/actions.glade new file mode 100644 index 0000000..59c9a2f --- /dev/null +++ b/tests/actions.glade @@ -0,0 +1,150 @@ +<?xml version="1.0" ?> +<glade-interface> + <object class="GtkUIManager" id="uimanager"> + <child> + <object class="GtkActionGroup" id="DefaultActions"> + <child> + <object class="GtkAction" id="FileMenu"> + <property name="label">_File</property> + <property name="tooltip"></property> + <property name="callback"></property> + <property name="accelerator"></property> + </object> + </child> + <child> + <object class="GtkAction" id="New"> + <property name="label">_New</property> + <property name="tooltip">Create a new file</property> + <property name="stock_id">gtk-new</property> + <property name="callback"></property> + <property name="accelerator"><control>N</property> + </object> + </child> + <child> + <object class="GtkAction" id="Open"> + <property name="label">_Open</property> + <property name="tooltip">Open a file</property> + <property name="stock_id">gtk-open</property> + <property name="callback"></property> + <property name="accelerator"><control>O</property> + </object> + </child> + <child> + <object class="GtkAction" id="Save"> + <property name="label">_Save</property> + <property name="tooltip">Save a file</property> + <property name="stock_id">gtk-save</property> + <property name="callback"></property> + <property name="accelerator"><control>S</property> + </object> + </child> + <child> + <object class="GtkAction" id="SaveAs"> + <property name="label">Save _as</property> + <property name="tooltip">Save with a differente name</property> + <property name="stock_id">gtk-save-as</property> + <property name="callback"></property> + <property name="accelerator"></property> + </object> + </child> + <child> + <object class="GtkAction" id="Quit"> + <property name="label">_Quit</property> + <property name="tooltip">Quit the program</property> + <property name="stock_id">gtk-quit</property> + <property name="callback"></property> + <property name="accelerator"><control>Q</property> + </object> + </child> + <child> + <object class="GtkAction" id="EditMenu"> + <property name="label">_Edit</property> + <property name="tooltip"></property> + <property name="callback"></property> + <property name="accelerator"></property> + </object> + </child> + <child> + <object class="GtkAction" id="Copy"> + <property name="label">_Copy</property> + <property name="tooltip">Copy selected object into the clipboard</property> + <property name="stock_id">gtk-copy</property> + <property name="callback"></property> + <property name="accelerator"><control>C</property> + </object> + </child> + <child> + <object class="GtkAction" id="Cut"> + <property name="label">C_ut</property> + <property name="tooltip">Cut selected object into the clipboard</property> + <property name="stock_id">gtk-cut</property> + <property name="callback"></property> + <property name="accelerator"><control>X</property> + </object> + </child> + <child> + <object class="GtkAction" id="Paste"> + <property name="label">_Paste</property> + <property name="tooltip">Paste object from the Clipboard</property> + <property name="stock_id">gtk-paste</property> + <property name="callback"></property> + <property name="accelerator"><control>V</property> + </object> + </child> + </object> + </child> + <ui id="initial-state"><![CDATA[<ui> + <menubar action="menubar1" name="menubar1"> + <menu action="FileMenu" name="FileMenu"> + <menuitem action="New" name="New"/> + <menuitem action="Open" name="Open"/> + <menuitem action="Save" name="Save"/> + <menuitem action="SaveAs" name="SaveAs"/> + <separator name="sep1"/> + <menuitem action="Quit" name="Quit"/> + </menu> + <menu action="EditMenu" name="EditMenu"> + <menuitem action="Copy" name="Copy"/> + <menuitem action="Cut" name="Cut"/> + <menuitem action="Paste" name="Paste"/> + </menu> + </menubar> + <toolbar action="toolbar1" name="toolbar1"> + <toolitem action="New" name="New"/> + <toolitem action="Open" name="Open"/> + <toolitem action="Save" name="Save"/> + <separator name="sep2"/> + <toolitem action="Copy" name="Copy"/> + <toolitem action="Cut" name="Cut"/> + <toolitem action="Paste" name="Paste"/> + </toolbar> + </ui>]]></ui> + </object> + <widget class="GtkWindow" id="window1"> + <property name="title" translatable="True"></property> + <property name="role"></property> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <child> + <widget class="GtkMenuBar" id="menubar1" constructor="initial-state"> + <property name="visible">True</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkToolbar" id="toolbar1" constructor="initial-state"> + <property name="toolbar_style">both</property> + <property name="visible">True</property> + </widget> + <packing> + <property name="position">1</property> + <property name="expand">False</property> + </packing> + </child> + </widget> + </child> + </widget> +</glade-interface> diff --git a/tests/run_all_tests.py b/tests/run_all_tests.py new file mode 100644 index 0000000..66fe3e3 --- /dev/null +++ b/tests/run_all_tests.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +import os +import glob +import sys +import inspect +import unittest + +myself = os.path.abspath(__file__) +testdir = os.path.dirname(myself) +if testdir not in sys.path: + sys.path.append(testdir) +sys.path.insert(0, os.path.join(testdir, '..')) + +print 'Running tests on', testdir + +from kiwi.environ import require_gazpacho +require_gazpacho() +suite = unittest.TestSuite() + +for file in glob.glob(os.path.join(testdir, 'test_*.py')): + filename = os.path.basename(file) + modulename = os.path.splitext(filename)[0] + mod = __import__(modulename, globals(), locals()) + members = [mem[1] for mem in inspect.getmembers(mod, inspect.isclass) \ + if issubclass(mem[1], unittest.TestCase) \ + and not mem[1] == unittest.TestCase] + for mem in members: + suite.addTest(unittest.makeSuite(mem)) + + +unittest.TextTestRunner(verbosity=2).run(suite) diff --git a/tests/simple_button.glade b/tests/simple_button.glade new file mode 100644 index 0000000..929a950 --- /dev/null +++ b/tests/simple_button.glade @@ -0,0 +1,17 @@ +<?xml version="1.0" ?> +<glade-interface> + <widget class="GtkWindow" id="simple_button"> + <property name="role"></property> + <property name="events">all-events-mask | button-motion-mask | button-press-mask | button-release-mask | button1-motion-mask | button2-motion-mask | button3-motion-mask | enter-notify-mask | exposure-mask | focus-change-mask | key-press-mask | key-release-mask | leave-notify-mask | pointer-motion-hint-mask | pointer-motion-mask | property-change-mask | proximity-in-mask | proximity-out-mask | scroll-mask | structure-mask | substructure-mask | visibility-notify-mask</property> + <property name="title" context="True" translatable="True"></property> + <child> + <widget class="GtkButton" id="button"> + <property name="receives_default">True</property> + <property name="label" context="True" translatable="True">Click me!</property> + <property name="events">all-events-mask | button-motion-mask | button-press-mask | button-release-mask | button1-motion-mask | button2-motion-mask | button3-motion-mask | enter-notify-mask | exposure-mask | focus-change-mask | key-press-mask | key-release-mask | leave-notify-mask | pointer-motion-hint-mask | pointer-motion-mask | property-change-mask | proximity-in-mask | proximity-out-mask | scroll-mask | structure-mask | substructure-mask | visibility-notify-mask</property> + <property name="can_focus">True</property> + <property name="visible">True</property> + </widget> + </child> + </widget> +</glade-interface> diff --git a/tests/test_Action.py b/tests/test_Action.py new file mode 100644 index 0000000..21ec18f --- /dev/null +++ b/tests/test_Action.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +from utils import refresh_gui +import unittest + +from kiwi.ui.delegates import Delegate + +class ActionDelegate(Delegate): + def __init__(self): + Delegate.__init__(self, gladefile="actions.glade", + toplevel_name='window1', + widgets=['New'], + delete_handler=self.quit_if_last) + self.new_activated = False + + def on_New__activate(self, *args): + self.new_activated = True + +class ActionTest(unittest.TestCase): + def testButtons(self): + action_delegate = ActionDelegate() + refresh_gui() + action_delegate.New.activate() + refresh_gui() + self.assertEqual(action_delegate.new_activated, True) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_BaseView.py b/tests/test_BaseView.py new file mode 100644 index 0000000..f077f55 --- /dev/null +++ b/tests/test_BaseView.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python +import unittest +import gtk +from gtk import keysyms + +from utils import refresh_gui + +from kiwi.controllers import BaseController +from kiwi.ui.gadgets import set_foreground, get_foreground, \ + set_background, get_background +from kiwi.ui.views import BaseView + +class FooView(BaseView): + widgets = [ "vbox", "label" ] + def __init__(self): + self.build_ui() + BaseView.__init__(self, toplevel_name='win') + + def build_ui(self): + self.win = gtk.Window() + vbox = gtk.VBox() + self.label = gtk.Label("Pick one noogie") + vbox.add(self.label) + self.button = gtk.Button(label="Noogie!") + vbox.add(self.button) + self.foo__button = gtk.Button(label="Boogie!") + vbox.add(self.foo__button) + self.win.add(vbox) + self.vbox = vbox + return vbox + +class FooController(BaseController): + def __init__(self, view): + keyactions = { + keysyms.A: self.on_button__clicked, + keysyms.a: self.on_button__clicked, + keysyms.B: self.on_foo__button__clicked, + keysyms.b: self.on_foo__button__clicked + } + BaseController.__init__(self, view, keyactions) + + def on_button__clicked(self, *args): + self.bar = Bar() + + def on_foo__button__clicked(self, *args): + # This is subclassed + self.view.label.set_text("Good click!") + +class Bar(BaseView, BaseController): + def __init__(self): + self.win = gtk.Window() + self.label = gtk.Label("foobar!") + self.win.add(self.label) + BaseView.__init__(self, toplevel=self.win) + BaseController.__init__(self, view=self) + set_foreground(self.label, "#CC99FF") + set_background(self.win, "#001100") + +# these classes are bad and should trigger exceptions + +class NoWinFoo(BaseView, BaseController): + def __init__(self): + self.win = 0 + BaseView.__init__(self) + BaseController.__init__(self, view=self) + + +class NotWidgetFoo(FooView, BaseController): + def __init__(self): + self.vbox = self.build_ui() + # It's dumb, and it breaks + self.noogie = NotWidgetFoo + FooView.__init__(self) + BaseController.__init__(self, view=self) + + def on_noogie__haxored(self, *args): + print "I AM NOT A NUMBER I AM A FREE MAN" + +class BaseViewTest(unittest.TestCase): + + def setUp(self): + self.foo = FooController(FooView()) + refresh_gui() + + def tearDown(self): + for win in gtk.window_list_toplevels(): + win.destroy() + + def testFooButton(self): + self.foo.view.foo__button.clicked() + refresh_gui() + self.assertEqual(self.foo.view.label.get_text(), + "Good click!") + + def testSubView(self): + self.foo.view.button.clicked() + refresh_gui() + self.assertEqual(self.foo.bar, self.foo.bar.view) + self.assertEqual(self.foo.bar.toplevel, self.foo.bar.win) + # setting None as transient window should be an error + self.assertRaises(TypeError, self.foo.bar.set_transient_for, None) + + def testColors(self): + self.foo.view.button.clicked() + refresh_gui() + win = self.foo.bar.win + win.realize() + color = get_background(win) + self.assertEqual(color, "#001100") + label = self.foo.bar.label + label.realize() + color = get_foreground(label) + self.assertEqual(color, "#CC99FF") + + +class BrokenViewsTest(unittest.TestCase): + + def testNoWindow(self): + # A View requires an instance variable called toplevel that + # specifies the toplevel widget in it + self.assertRaises(TypeError, NoWinFoo) + + def testNotAWidget(self): + # noogie (__main__.NotWidgetFoo) is not a widget and + # can't be connected to + self.assertRaises(AttributeError, NotWidgetFoo) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_CheckButton.py b/tests/test_CheckButton.py new file mode 100644 index 0000000..ca18395 --- /dev/null +++ b/tests/test_CheckButton.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python +import utils + +import unittest + +from kiwi.ui.widgets.checkbutton import ProxyCheckButton + +class CheckButtonTest(unittest.TestCase): + def testForBool(self): + myChkBtn = ProxyCheckButton() + self.assertEqual(myChkBtn.get_property("data-type"), bool) + + # this test doens't work... maybe be a pygtk bug + #self.assertRaises(TypeError, myChkBtn.set_property, 'data-type', str) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_ComboBox.py b/tests/test_ComboBox.py new file mode 100644 index 0000000..da7ac5f --- /dev/null +++ b/tests/test_ComboBox.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python +import utils + +import unittest + +from kiwi.python import disabledeprecationcall, Settable +from kiwi.ui.proxy import Proxy +from kiwi.ui.widgets.combobox import ProxyComboBox, ProxyComboBoxEntry + +class TestComboBox(unittest.TestCase): + def setUp(self): + self.combo = ProxyComboBox() + + def _prefill(self): + self.combo.prefill((('Johan', 1981), + ('Lorenzo', 1979), + ('Christian', 1976))) + + def testPrefill(self): + self.combo.prefill(('foo', 'bar')) + model = self.combo.get_model() + self.assertEqual(tuple(model[0]), ('foo', None)) + self.assertEqual(tuple(model[1]), ('bar', None)) + + def testPrefillWithData(self): + self.combo.prefill((('foo', 42), ('bar', 138))) + model = self.combo.get_model() + self.assertEqual(tuple(model[0]), ('foo', 42)) + self.assertEqual(tuple(model[1]), ('bar', 138)) + self.combo.prefill([]) + self.assertEqual(len(self.combo.get_model()), 0) + self.assertEqual(len(model), 0) + self.assertEqual(len(self.combo), 0) + + def testSelectItemByPosition(self): + self._prefill() + self.combo.select_item_by_position(1) + model = self.combo.get_model() + iter = self.combo.get_active_iter() + self.assertEqual(model.get_value(iter, 0), 'Lorenzo') + self.assertEqual(model.get_value(iter, 1), 1979) + self.assertRaises(KeyError, self.combo.select_item_by_label, 4) + + def testSelectItemByLabel(self): + self._prefill() + self.combo.select_item_by_label('Christian') + model = self.combo.get_model() + iter = self.combo.get_active_iter() + rowNo = model.get_path(iter)[0] + self.assertEqual(rowNo, 2) + self.assertRaises(KeyError, self.combo.select_item_by_label, 'Salgado') + + def testSelectByData(self): + self._prefill() + self.combo.select_item_by_data(1976) + model = self.combo.get_model() + iter = self.combo.get_active_iter() + rowNo = model.get_path(iter)[0] + self.assertEqual(rowNo, 2) + self.assertEqual(model.get_value(iter, 0), 'Christian') + self.assertEqual(model.get_value(iter, 1), 1976) + self.assertRaises(KeyError, self.combo.select_item_by_data, 1980) + + def testGetSelectedData(self): + self._prefill() + self.combo.select_item_by_position(0) + self.assertEqual(self.combo.get_selected_data(), 1981) + self.assertRaises(TypeError, + self.combo.select_item_by_position, 'foobar') + + def testGetSelectedLabel(self): + self._prefill() + + def testClear(self): + self._prefill() + self.combo.clear() + self.assertEqual(map(list, self.combo.get_model()), []) + +class FakeView: + def handler_block(self, widget): + pass + + def handler_unblock(self, widget): + pass + +class BaseModelTest: + def setUp(self): + self.model = Settable(attr=0) + proxy = Proxy(FakeView(), self.model) + self.combo = disabledeprecationcall(self.type) + self.combo.data_type = int + self.combo.model_attribute = 'attr' + self.combo.prefill([('foo', 0), + ('bar', 1)]) + proxy.add_widget('attr', self.combo) + + def testSelectItemByData(self): + self.combo.select_item_by_data(1) + self.assertEqual(self.model.attr, 1) + self.combo.select_item_by_data(0) + self.assertEqual(self.model.attr, 0) + + def testSelectItemBylabel(self): + self.combo.select_item_by_label('bar') + self.assertEqual(self.model.attr, 1) + self.combo.select_item_by_label('foo') + self.assertEqual(self.model.attr, 0) + +class ComboModelTest(BaseModelTest, unittest.TestCase): + type = ProxyComboBox + +class ComboEntryModelTest(BaseModelTest, unittest.TestCase): + type = ProxyComboBoxEntry + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_Delegate.py b/tests/test_Delegate.py new file mode 100644 index 0000000..1a37a1d --- /dev/null +++ b/tests/test_Delegate.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python +import unittest +import gtk + +from kiwi.ui.delegates import Delegate +from utils import refresh_gui + +class A: + def on_foo__clicked(self, *args): + self.x = "FOO in A" + +class B: + def on_foo__clicked(self, *args): + self.x = "FOO in B" + + def on_bar__clicked(self, *args): + self.y = "BAR in B" + +class C: + def on_foo__clicked(self, *args): + self.x = "FOO in C" + +class X(A,B,C): + def on_foo__clicked(self, *args): + self.x = "FOO in X" + +class Y: + def on_foo__clicked(self, *args): + self.x = "FOO in Y" + +class Foo(X,Y,Delegate): + widget = ["foo"] + def __init__(self): + self.win = gtk.Window() + self.foo = gtk.Button("CLICK ME AND BE HAPPY") + self.bar = gtk.Button("CLICK ME AND BE HAPPY") + v = gtk.VBox() + v.add(self.foo) + v.add(self.bar) + self.win.add(v) + self.x = self.y = "NOOO" + Delegate.__init__(self, toplevel=self.win, + delete_handler=self.quit_if_last) + + def on_foo__clicked(self, *args): + self.x = "FOO in Foo" + + def on_bar__clicked(self, *args): + self.y = "BAR in B" + +class ClickCounter(Delegate): + """In this delegate we count the number of clicks we do""" + def __init__(self): + self.win = gtk.Window() + self.button = gtk.Button('Click me!') + self.win.add(self.button) + Delegate.__init__(self, toplevel=self.win, + delete_handler=self.quit_if_last) + + self.clicks = 0 + + def on_button__clicked(self, *args): + self.clicks += 1 + +class GladeClickCounter(Delegate): + def __init__(self): + Delegate.__init__(self, gladefile="simple_button", + widgets=['button'], + delete_handler=self.quit_if_last) + + self.clicks = 0 + + def on_button__clicked(self, *args): + self.clicks += 1 + +class DelegateTest(unittest.TestCase): + def testButtons(self): + f = Foo() + refresh_gui() + f.foo.clicked() + refresh_gui() + self.assertEqual(f.x, "FOO in Foo") + f.bar.clicked() + refresh_gui() + self.assertEqual(f.y, "BAR in B") + + def testClickCounter(self): + clickcounter = ClickCounter() + refresh_gui() + + # one for the boys + clickcounter.button.clicked() + self.assertEqual(clickcounter.clicks, 1) + + # one for the girls + clickcounter.button.clicked() + self.assertEqual(clickcounter.clicks, 2) + + def testClickCounterGlade(self): + clickcounter = GladeClickCounter() + refresh_gui() + + # one for the boys + clickcounter.button.clicked() + self.assertEqual(clickcounter.clicks, 1) + + # one for the girls + clickcounter.button.clicked() + self.assertEqual(clickcounter.clicks, 2) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_Entry.py b/tests/test_Entry.py new file mode 100644 index 0000000..cf41c55 --- /dev/null +++ b/tests/test_Entry.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import unittest + +import gobject + +from kiwi import ValueUnset +from kiwi import datatypes +from kiwi.ui.entry import KiwiEntry +from kiwi.ui.widgets.entry import ProxyEntry + +import utils + +class EntryTest(unittest.TestCase): + def testModel(self): + entry = ProxyEntry() + entry.set_text('value') + entry.set_property("data-type", "str") + self.assertEqual(entry.read(), 'value') + + # FIXME + def _testValidDataType(self): + + entry = ProxyEntry() + entry.set_property("data-type", "date") + # let's make the entry complain! + entry.set_text("string") + self.assertEqual(entry.read(), ValueUnset) + self.assertNotEqual(entry._complaint_checker_id, -1) + + # now let's put proper data + entry.set_text(self.date_format) + date = datatypes.date2str(entry.read()) + self.assertEqual(date, self.date_format) + self.assertEqual(entry._background_timeout_id, -1) + + locale_dictionary = datatypes.locale_dictionary + + # now change the data-type and do it again + entry.set_property("data-type", "float") + if locale_dictionary["thousands_sep"] == ',': + # correct value + entry.set_text("23,400,000.2") + self.assertEqual(entry.read(), 23400000.2) + self.assertEqual(entry._background_timeout_id, -1) + + # wrong value + entry.set_text("23.400.000,2") + self.assertEqual(entry.read(), ValueUnset) + + def testDigitMask(self): + e = ProxyEntry() + e.set_mask('000.000') + self.assertEqual(e.get_text(), ' . ') + self.assertEqual(e.get_field_text(), [None, None]) + e.set_text('123.456') + self.assertEqual(e.get_text(), '123.456') + self.assertEqual(e.get_field_text(), [123, 456]) + e.delete_text(0, 2) + self.assertEqual(e.get_text(), ' 3.456') + self.assertEqual(e.get_field_text(), [3, 456]) + + def testAsciiMask(self): + e = ProxyEntry() + e.set_mask('LLLL-L') + self.assertEqual(e.get_text(), ' - ') + self.assertEqual(e.get_field_text(), ['', '']) + e.set_text('abcd-e') + self.assertEqual(e.get_text(), 'abcd-e') + self.assertEqual(e.get_field_text(), ['abcd', 'e']) + + def testAlphaNumericMask(self): + e = ProxyEntry() + e.set_mask('&&&-aaa') + self.assertEqual(e.get_text(), ' - ') + self.assertEqual(e.get_field_text(), ['', '']) + e.set_text('aáé-á1e') + self.assertEqual(e.get_text(), 'aáé-á1e') + self.assertEqual(e.get_field_text(), ['aáé', 'á1e']) + + def testMaskSmallFields(self): + e = ProxyEntry() + e.set_mask('0.0.0') + self.assertEqual(e.get_text(), ' . . ') + self.assertEqual(e.get_field_text(), [None, None, None]) + e.set_text('1.2.3') + self.assertEqual(e.get_text(), '1.2.3') + self.assertEqual(e.get_field_text(), [1, 2, 3]) + + def testGType(self): + entry = KiwiEntry() + self.assertEqual(gobject.type_name(entry), 'KiwiEntry') + + entry = ProxyEntry() + self.assertEqual(gobject.type_name(entry), 'ProxyEntry') + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_Label.py b/tests/test_Label.py new file mode 100644 index 0000000..d97c8f2 --- /dev/null +++ b/tests/test_Label.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +import unittest + +from kiwi.ui.widgets.label import ProxyLabel + +class LabelTest(unittest.TestCase): + def testAttr(self): + label = ProxyLabel() + label.set_text("test label") + label.set_italic(True) + self.assertEqual(label.get_label(), + '<span style="italic">test label</span>') + + label.set_bold(True) + label.set_size("xx-small") + self.assertEqual(label.get_label(), + '<span size="xx-small" style="italic" weight="bold">' + 'test label</span>') + + label.set_italic(True) + label.set_bold(False) + label.set_size("xx-large") + self.assertEqual(label.get_label(), + '<span size="xx-large" style="italic">' + 'test label</span>') + + label.set_bold(True) + label.set_label("<b>different label</b>") + label.set_text("test one more label") + label.set_size("xx-small") + self.assertEqual(label.get_label(), + '<span size="xx-small" style="italic" weight="bold">' + 'test one more label</span>') + + self.assertRaises(ValueError, label.set_size, "wrong size") + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_ObjectList.py b/tests/test_ObjectList.py new file mode 100644 index 0000000..626155a --- /dev/null +++ b/tests/test_ObjectList.py @@ -0,0 +1,332 @@ +#!/usr/bin/env python +import unittest + +import gtk + +from kiwi.ui.objectlist import ObjectList, Column +from kiwi.python import Settable + +from utils import refresh_gui + +class Person: + def __init__(self, name, age): + self.name, self.age = name, age + +# we will use this tuple in several tests +persons = (Person('Johan', 24), Person('Gustavo', 25), + Person('Kiko', 28), Person('Salgado', 25), + Person('Lorenzo', 26), Person('Henrique', 21)) + +class ColumnTests(unittest.TestCase): + + def setUp(self): + self.win = gtk.Window() + self.win.set_default_size(400, 400) + + def tearDown(self): + self.win.destroy() + del self.win + + def testEmptyObjectList(self): + mylist = ObjectList() + self.win.add(mylist) + refresh_gui() + + def testOneColumn(self): + # column's attribute can not contain spaces + self.assertRaises(AttributeError, Column, 'test column') + + mylist = ObjectList(Column('test_column')) + self.win.add(mylist) + refresh_gui() + + self.assertEqual(1, len(mylist.get_columns())) + +class DataTests(unittest.TestCase): + """In all this tests we use the same configuration for a list""" + def setUp(self): + self.win = gtk.Window() + self.win.set_default_size(400, 400) + self.list = ObjectList([Column('name'), Column('age')]) + self.win.add(self.list) + refresh_gui() + + def tearDown(self): + self.win.destroy() + del self.win + + def testAddingOneInstance(self): + # we should have two columns now + self.assertEqual(2, len(self.list.get_columns())) + + person = Person('henrique', 21) + self.list.append(person) + + refresh_gui() + + # usually you don't use the model directly, but tests are all about + # breaking APIs, right? + self.assertEqual(self.list[0], person) + self.assertEqual(self.list[0].name, 'henrique') + self.assertEqual(self.list[0].age, 21) + + # we still have to columns, right? + self.assertEqual(2, len(self.list.get_columns())) + + def testAddingAObjectList(self): + global persons + + self.list.add_list(persons) + refresh_gui() + + self.assertEqual(len(self.list), len(persons)) + + def testAddingABunchOfInstances(self): + global persons + + for person in persons: + self.list.append(person) + refresh_gui() + + self.assertEqual(len(self.list), len(persons)) + + def testRemovingOneInstance(self): + global persons + + self.list.add_list(persons) + refresh_gui() + + # we are going to remove Kiko + person = persons[2] + + self.list.remove(person) + + self.assertEqual(len(self.list), len(persons) - 1) + + # now let's remove something that is not on the list + #new_person = Person('Evandro', 24) + #self.assertRaises(ValueError, self.list.remove, new_person) + + # note that even a new person with the same values as a person + # in the list is not considered to be in the list + #existing_person = Person('Gustavo', 25) + #self.assertRaises(ValueError, self.list.remove, + # existing_person) + + def testClearObjectList(self): + global persons + + self.list.add_list(persons) + refresh_gui() + + self.list.clear() + + self.assertEqual(len(self.list), 0) + + + def testUpdatingOneInstance(self): + global persons + + self.list.add_list(persons) + refresh_gui() + + persons[0].age = 29 + self.list.update(persons[0]) + + refresh_gui() + + # Do we have the same number of instances that we had before ? + self.assertEqual(len(self.list), len(persons)) + + # Trying to find our updated instance in the list + self.assertEqual(self.list[0].age, 29) + + # let's be evil + new_person = Person('Nando', 32) + self.assertRaises(ValueError, self.list.update, new_person) + + + def testContains(self): + global persons + + self.list.add_list(persons) + self.assertEqual(persons[0] in self.list, True) + + new_person = Person('Nando', 32) + self.assertEqual(new_person in self.list, False) + + def testSelect(self): + first = persons[0] + self.list.add_list(persons) + self.list.select(first) + self.assertEqual(self.list.get_selected(), first) + + self.list.remove(first) + self.assertRaises(ValueError, self.list.select, first) + +class TestSignals(unittest.TestCase): + def setUp(self): + self.klist = ObjectList() + self.klist.connect('has-rows', self._on_klist__has_rows) + self.klist.connect('selection-changed', + self._on_klist__selection_changed) + self.rows = None + self.selected = None + + def _on_klist__has_rows(self, klist, rows): + self.rows = rows + + def _on_klist__selection_changed(self, klist, selected): + self.selected = selected + + def testHasRows(self): + self.assertEqual(self.rows, None) + self.assertEqual(len(self.klist), 0) + + # Add one + self.klist.append(0) + self.assertEqual(len(self.klist), 1) + self.assertEqual(self.rows, True) + self.klist.remove(0) + self.assertEqual(self.rows, False) + self.assertEqual(len(self.klist), 0) + + # Add several + self.klist.extend((1, 2)) + self.assertEqual(len(self.klist), 2) + self.assertEqual(self.rows, True) + self.klist.remove(1) + self.assertEqual(self.rows, True) + self.klist.remove(2) + self.assertEqual(self.rows, False) + self.assertEqual(len(self.klist), 0) + + def testSelectionChanged(self): + self.assertEqual(self.selected, None) + self.assertEqual(len(self.klist), 0) + self.klist.extend((0, 1)) + self.klist.select(0) + self.assertEqual(self.selected, 0) + self.klist.unselect_all() + self.assertEqual(self.selected, None) + self.assertRaises(ValueError, self.klist.select, 2) + +class ConstructorTest(unittest.TestCase): + def testInvalidArguments(self): + self.assertRaises(TypeError, ObjectList, columns='') + self.assertRaises(TypeError, ObjectList, mode='') + + def testInstanceObjectList(self): + klist = ObjectList([Column('name', sorted=True)], + [Settable(name='first')]) + columns = klist.get_columns() + self.assertEqual(len(columns), 1) + self.assertEqual(columns[0].attribute, 'name') + + def testInstanceObjectListWithNoneData(self): + klist = ObjectList([Column('name', sorted=True)], + [Settable(name=None)]) + columns = klist.get_columns() + self.assertEqual(len(columns), 1) + +class MethodTest(unittest.TestCase): + def setUp(self): + self.klist = ObjectList([Column('name', sorted=True)], + [Settable(name='first')]) + + def testNonZero(self): + self.assertEqual(self.klist.__nonzero__(), True) + self.klist.remove(self.klist[0]) + self.assertEqual(self.klist.__nonzero__(), True) + if not self.klist: + raise AssertionError + + def testIter(self): + for item1 in self.klist: + pass + for item2 in iter(self.klist): + self.assertEqual(item1, item2) + + def testGetItem(self): + self.klist.append(Settable(name='second')) + model = self.klist.get_model() + item1 = model[0][0] + item2 = model[1][0] + self.assertEqual(self.klist[0], item1) + self.assertEqual(self.klist[:1], [item1]) + self.assertEqual(self.klist[-1:], [item2]) + self.assertRaises(TypeError, self.klist.__getitem__, None) + + def testSetItem(self): + self.klist[0] = Settable(name='second') + self.assertRaises(NotImplementedError, self.klist.__setitem__, + slice(0), None) + self.assertRaises(TypeError, self.klist.__setitem__, None, None) + + def testIndex(self): + self.assertRaises(NotImplementedError, self.klist.index, 0, start=0) + self.assertRaises(NotImplementedError, self.klist.index, 0, stop=0) + + self.assertEqual(self.klist.index(self.klist[0]), 0) + self.assertRaises(ValueError, self.klist.index, None) + + def testCount(self): + item = self.klist[0] + self.assertEqual(self.klist.count(item), 1) + self.klist.append(item) + self.assertEqual(self.klist.count(item), 2) + self.klist.clear() + self.assertEqual(self.klist.count(item), 0) + + def testInsert(self): + self.assertRaises(NotImplementedError, self.klist.insert, 1, 2) + + def testPop(self): + self.assertRaises(NotImplementedError, self.klist.pop, None) + + def testReverse(self): + self.assertRaises(NotImplementedError, self.klist.reverse, 1, 2) + + def testSort(self): + self.assertRaises(NotImplementedError, self.klist.sort, 1, 2) + + def testSelectPath(self): + self.klist.get_treeview().get_selection().set_mode(gtk.SELECTION_NONE) + self.assertRaises(TypeError, self.klist.select_paths, (0,)) + self.klist.get_treeview().get_selection().set_mode(gtk.SELECTION_SINGLE) + self.klist.select_paths((0,)) + + def testSelect(self): + self.klist.get_treeview().get_selection().set_mode(gtk.SELECTION_NONE) + self.assertRaises(TypeError, self.klist.select, None) + self.klist.get_treeview().get_selection().set_mode(gtk.SELECTION_SINGLE) + + def testGetSelected(self): + item = self.klist[0] + self.klist.select(item) + self.klist.get_treeview().get_selection().set_mode(gtk.SELECTION_SINGLE) + self.assertEqual(self.klist.get_selected(), item) + + def testGetSelectedRows(self): + self.klist.get_treeview().get_selection().set_mode(gtk.SELECTION_MULTIPLE) + item = self.klist[0] + self.klist.select(item) + self.assertEqual(self.klist.get_selected_rows(), [item]) + + def testGetNextAndPrevious(self): + self.klist.append(Settable(name='second')) + self.klist.append(Settable(name='third')) + item1, item2, item3 = self.klist + + self.assertEqual(self.klist.get_next(item1), item2) + self.assertEqual(self.klist.get_next(item2), item3) + self.assertEqual(self.klist.get_next(item3), item1) + self.assertRaises(ValueError, self.klist.get_next, None) + + self.assertEqual(self.klist.get_previous(item1), item3) + self.assertEqual(self.klist.get_previous(item2), item1) + self.assertEqual(self.klist.get_previous(item3), item2) + self.assertRaises(ValueError, self.klist.get_previous, None) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_SpinButton.py b/tests/test_SpinButton.py new file mode 100644 index 0000000..5ba937d --- /dev/null +++ b/tests/test_SpinButton.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +import unittest + +from kiwi.ui.widgets.spinbutton import ProxySpinButton + +class SpinButtonTest(unittest.TestCase): + def testForIntFloat(self): + mySpinBtn = ProxySpinButton() + self.assertEqual(mySpinBtn.get_property("data-type"), int) + + # this test doens't work... might be a pygtk bug + #self.assertRaises(TypeError, mySpinBtn.set_property, 'data-type', str) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_argcheck.py b/tests/test_argcheck.py new file mode 100644 index 0000000..1682149 --- /dev/null +++ b/tests/test_argcheck.py @@ -0,0 +1,164 @@ +import datetime +from decimal import Decimal +import unittest + +from kiwi.argcheck import argcheck, number, percent + +class ArgTest(unittest.TestCase): + def testOneArg(self): + f = argcheck(str)(lambda s: None) + f('str') + self.assertRaises(TypeError, f, None) + self.assertRaises(TypeError, f, 1) + + def testTwoArgs(self): + f = argcheck(str, int)(lambda s, i: None) + f('str', 1) + self.assertRaises(TypeError, f, 1, 1) # first incorret + self.assertRaises(TypeError, f, 'str', 'str') # second incorrect + self.assertRaises(TypeError, f, 1, 'str') # swapped + self.assertRaises(TypeError, f, 1) # too few + self.assertRaises(TypeError, f, 'str', 1, 1) # too many + + def testVarArgs(self): + f = argcheck(int)(lambda *v: None) + f(1) + f(1, 'str') + f(1, 2, 3) + #self.assertRaises(TypeError, f, 'str') + + def testDefault(self): + f1 = lambda a, b=1: None + d1 = argcheck(int, int)(f1) + self.assertRaises(TypeError, d1, 'f') + + f2 = lambda a, b='str': None + self.assertRaises(TypeError, argcheck, f2) + + def testKwargs(self): + self.assertRaises(TypeError, argcheck, lambda **kw: None) + + def testUserDefined(self): + class Payment(object): + pass + + @argcheck(Payment, str) + def pay(payment, description): + pass + pay(Payment(), 'foo') + self.assertRaises(TypeError, 'bar', 'bar') + self.assertRaises(TypeError, Payment(), Payment()) + + def testClass(self): + class Custom(object): + pass + + class Test: + @argcheck(int, int) + def method1(self, foo, bar): + return foo + bar + + @argcheck(Custom, int, datetime.datetime, int, int, + float, float) + def method2(self, a, b, c, d, e, f, g=0.0): + return g + + @argcheck(str, datetime.datetime, datetime.datetime) + def method3(self, s, date=None, date2=None): + return + + @argcheck(percent) + def method4(self, n): + return n + + t = Test() + self.assertEqual(t.method1(1, 2), 3) + self.assertRaises(TypeError, t.method1, None, None) + self.assertEqual(t.method2(Custom(), 2, datetime.datetime.now(), + 4, 5, 6.0), 0.0) + + t.method3('foo') + t.method3('bar', None) + t.method3('baz', None, None) + t.method3(s='foo') + t.method3(s='bar', date=None) + t.method3(s='baz', date=None, date2=None) + t.method4(n=0) + t.method4(n=50) + t.method4(n=100) + self.assertRaises(TypeError, t.method3, 'noggie', True) + self.assertRaises(TypeError, t.method3, 'boogie', None, True) + self.assertRaises(TypeError, t.method3, s='noggie', date2=True) + self.assertRaises(TypeError, t.method3, s='boogie', + date=None, date2=True) + self.assertRaises(ValueError, t.method4, -1) + self.assertRaises(ValueError, t.method4, 101) + + def testNone(self): + @argcheck(datetime.datetime) + def func_none(date=None): + return date + func_none() + func_none(None) + self.assertRaises(TypeError, func_none, True) + self.assertRaises(TypeError, func_none, date=True) + + @argcheck(str, datetime.datetime, datetime.datetime) + def func_none2(s, date=None, date2=None): + return date + + func_none2('foo') + func_none2('bar', None) + func_none2('baz', None, None) + func_none2(s='foo') + func_none2(s='bar', date=None) + func_none2(s='baz', date=None, date2=None) + self.assertRaises(TypeError, func_none2, 'noggie', True) + self.assertRaises(TypeError, func_none2, 'boogie', None, True) + self.assertRaises(TypeError, func_none2, s='noggie', date2=True) + self.assertRaises(TypeError, func_none2, s='boogie', + date=None, date2=True) + + + def testNumber(self): + @argcheck(number) + def func(n): + return n + self.assertEqual(func(0), 0) + self.assertEqual(func(0L), 0L) + self.assertEqual(func(0.0), 0.0) + self.assertEqual(func(Decimal(0)), Decimal(0)) + + def testPercent(self): + @argcheck(percent) + def func(n): + return n + self.assertEqual(func(50), 50) + self.assertEqual(func(50L), 50L) + self.assertEqual(func(50.0), 50.0) + self.assertEqual(func(Decimal(50)), Decimal(50)) + self.assertRaises(ValueError, func, -1) + self.assertRaises(ValueError, func, -1L) + self.assertRaises(ValueError, func, -1.0) + self.assertRaises(ValueError, func, Decimal(-1)) + self.assertRaises(ValueError, func, 101) + self.assertRaises(ValueError, func, 101L) + self.assertRaises(ValueError, func, 101.0) + self.assertRaises(ValueError, func, Decimal(101)) + + def testDisable(self): + argcheck.disable() + @argcheck(str) + def func(s): + pass + func(10) + argcheck.enable() + + def testErrorHandling(self): + self.assertRaises(TypeError, argcheck(str), True) + self.assertRaises(TypeError, argcheck(int), lambda **x: None) + self.assertRaises(TypeError, argcheck(int), lambda : None) + self.assertRaises(TypeError, argcheck(int), lambda x='str': None) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_comboentry.py b/tests/test_comboentry.py new file mode 100644 index 0000000..b2d0501 --- /dev/null +++ b/tests/test_comboentry.py @@ -0,0 +1,94 @@ +import unittest + +import gtk + +from kiwi.ui.comboentry import ComboEntry +from kiwi.ui.widgets.combo import ProxyComboEntry + +class TestComboEntry(unittest.TestCase): + def setUp(self): + self.called = False + + def testSimple(self): + entry = ComboEntry() + self.failUnless(isinstance(entry, ComboEntry)) + + def testPopup(self): + entry = ComboEntry() + win = gtk.Window() + win.add(entry) + win.show_all() + entry.hide() + entry.popup() + entry.popdown() + + def _on_activate(self, combo): + self.called = True + + def testActivate(self): + entry = ComboEntry() + entry.connect('activate', self._on_activate) + entry.entry.emit('activate') + self.assertEqual(self.called, True) + +class TestProxyComboEntry(unittest.TestCase): + def testSelectItemByLabel(self): + entry = ProxyComboEntry() + entry.prefill(['one', 'two']) + entry.select_item_by_label('one') + self.assertEqual(entry.get_text(), 'one') + entry.select_item_by_label('two') + self.assertEqual(entry.get_text(), 'two') + self.assertRaises(KeyError, entry.select_item_by_label, 'three') + + def testSelectItemByLabelInDataMode(self): + entry = ProxyComboEntry() + entry.prefill([('one', 1), ('two', 2)]) + entry.select_item_by_label('one') + self.assertEqual(entry.get_text(), 'one') + entry.select_item_by_label('two') + self.assertEqual(entry.get_text(), 'two') + self.assertRaises(KeyError, entry.select_item_by_label, 'three') + + def testSelectItemByData(self): + entry = ProxyComboEntry() + entry.prefill([('one', 1), ('two', 2)]) + entry.select_item_by_data(1) + self.assertEqual(entry.get_text(), 'one') + entry.select_item_by_data(2) + self.assertEqual(entry.get_text(), 'two') + self.assertRaises(KeyError, entry.select_item_by_data, 3) + + def testSelectItemByDataInTextMode(self): + entry = ProxyComboEntry() + entry.prefill(['one', 'two']) + self.assertRaises(TypeError, entry.select_item_by_data, 1) + + def testGetSelectedInTextMode(self): + entry = ProxyComboEntry() + self.assertEqual(entry.get_selected(), None) + entry.prefill(['one', 'two']) + entry.select_item_by_label('two') + self.assertEqual(entry.get_selected(), 'two') + + def testGetSelectedInDataMode(self): + entry = ProxyComboEntry() + self.assertEqual(entry.get_selected(), None) + entry.prefill([('one', 1), ('two', 2)]) + entry.select_item_by_label('two') + self.assertEqual(entry.get_selected(), 2) + + def testSelectInTextMode(self): + entry = ProxyComboEntry() + entry.prefill(['one', 'two']) + entry.select('two') + self.assertEqual(entry.get_selected(), 'two') + + def testSelectInDataMode(self): + entry = ProxyComboEntry() + entry.prefill([('one', 1), ('two', 2)]) + entry.select(2) + self.assertEqual(entry.get_selected(), 2) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_component.py b/tests/test_component.py new file mode 100644 index 0000000..7f421c4 --- /dev/null +++ b/tests/test_component.py @@ -0,0 +1,121 @@ +import unittest + +from kiwi.component import AlreadyImplementedError, Interface, \ + get_utility, provide_utility, implements + +class IBanana(Interface): + pass + +class Obj(object): pass +o = Obj() + +class TestUtilities(unittest.TestCase): + def _clear(self, iface): + # Yey, yey + from kiwi.component import _handler + del _handler._utilities[iface] + + def testGet(self): + provide_utility(IBanana, o) + self.assertRaises(TypeError, get_utility, object) + self.assertEqual(get_utility(IBanana), o) + self._clear(IBanana) + + def testProvide(self): + self.assertRaises(NotImplementedError, get_utility, IBanana) + provide_utility(IBanana, o) + self.assertRaises(TypeError, provide_utility, object, o) + self._clear(IBanana) + + def testAlreadyImplemented(self): + self.assertRaises(NotImplementedError, get_utility, IBanana) + provide_utility(IBanana, o) + self.assertRaises(AlreadyImplementedError, + provide_utility, IBanana, o) + self._clear(IBanana) + + def testZopeInterface(self): + try: + from zope.interface import Interface + except ImportError: + return + + class IApple(Interface): + pass + + self.assertRaises(NotImplementedError, get_utility, IApple) + provide_utility(IApple, o) + self.assertRaises(AlreadyImplementedError, + provide_utility, IApple, o) + self._clear(IApple) + + def testImplements(self): + class I1(Interface): + pass + class C(object): + implements(I1) + c = C() + class X(object): + pass + x = X() + self.assertEqual(I1.providedBy(x), False) + #self.assertEqual(I1.providedBy(C), False) + self.assertEqual(I1.providedBy(c), True) + + def testInterfaceSub(self): + class I1(Interface): + pass + class I2(I1): + pass + class C(object): + implements(I2) + class D(object): + implements(I1) + c = C() + self.assertEqual(I1.providedBy(c), True) + self.assertEqual(I2.providedBy(c), True) + d = D() + self.assertEqual(I1.providedBy(d), True) + self.assertEqual(I2.providedBy(d), False) + + def testZImplements(self): + try: + from zope.interface import Interface, implements + except ImportError: + return + + class I1(Interface): + pass + class C(object): + implements(I1) + c = C() + class X(object): + pass + x = X() + self.assertEqual(I1.providedBy(x), False) + self.assertEqual(I1.providedBy(C), False) + self.assertEqual(I1.providedBy(c), True) + + def testZInterfaceSub(self): + try: + from zope.interface import Interface, implements + except ImportError: + return + + class I1(Interface): + pass + class I2(I1): + pass + class C(object): + implements(I2) + class D(object): + implements(I1) + c = C() + self.assertEqual(I1.providedBy(c), True) + self.assertEqual(I2.providedBy(c), True) + d = D() + self.assertEqual(I1.providedBy(d), True) + self.assertEqual(I2.providedBy(d), False) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_datatypes.py b/tests/test_datatypes.py new file mode 100644 index 0000000..d82a2b4 --- /dev/null +++ b/tests/test_datatypes.py @@ -0,0 +1,271 @@ +from decimal import Decimal +import datetime +import unittest +import locale + +from kiwi.datatypes import currency, converter, ValidationError, ValueUnset + +import utils + +def set_locale(category, name): + # set the date format to the spanish one + try: + locale.setlocale(category, name) + except locale.Error: + print 'skipping %s, locale not available' % name + return False + return True + +class RegistryTest(unittest.TestCase): + def testAdd(self): + self.assertRaises(TypeError, converter.add, object) + +class BoolTest(unittest.TestCase): + def setUp(self): + self.conv = converter.get_converter(bool) + + def testFromString(self): + self.assertEqual(self.conv.from_string('TRUE'), True) + self.assertEqual(self.conv.from_string('true'), True) + self.assertEqual(self.conv.from_string('TrUe'), True) + self.assertEqual(self.conv.from_string('1'), True) + self.assertEqual(self.conv.from_string('FALSE'), False) + self.assertEqual(self.conv.from_string('false'), False) + self.assertEqual(self.conv.from_string('FalSE'), False) + self.assertEqual(self.conv.from_string('0'), False) + + # you are not supposed to pass something that is not a string + self.assertRaises(AttributeError, self.conv.from_string, None) + +class DateTest(unittest.TestCase): + def setUp(self): + self.date = datetime.date(1979, 2, 12) + self.conv = converter.get_converter(datetime.date) + + def tearDown(self): + set_locale(locale.LC_ALL, 'C') + + def testFromStringES(self): + if not set_locale(locale.LC_TIME, 'es_ES'): + return + + self.assertEqual(self.conv.from_string("12/2/79"), self.date) + self.assertEqual(self.conv.from_string("12/02/79"), self.date) + + def testAsStringES(self): + if not set_locale(locale.LC_TIME, 'es_ES'): + return + + self.assertEqual(self.conv.as_string(self.date), "12/02/79") + + def testFromStringBR(self): + if not set_locale(locale.LC_TIME, 'pt_BR'): + return + + self.assertEqual(self.conv.from_string("12-2-1979"), self.date) + self.assertEqual(self.conv.from_string("12-02-1979"), self.date) + + # test some invalid dates + self.assertRaises(ValidationError, + self.conv.from_string, "40-10-2005") + self.assertRaises(ValidationError, + self.conv.from_string, "30-02-2005") + + def testAsStringBR(self): + if not set_locale(locale.LC_TIME, 'pt_BR'): + return + + self.assertEqual(self.conv.as_string(self.date), "12-02-1979") + +class CurrencyTest(unittest.TestCase): + def setUp(self): + self.conv = converter.get_converter(currency) + + def tearDown(self): + set_locale(locale.LC_ALL, 'C') + + def testFormatBR(self): + if not set_locale(locale.LC_MONETARY, 'pt_BR'): + return + + self.assertEqual(currency(100).format(), 'R$100') + self.assertEqual(currency('123.45').format(), 'R$123,45') + self.assertEqual(currency(12345).format(), 'R$12.345') + self.assertEqual(currency(-100).format(), 'R$-100') + + # Sometimes it works, sometimes it doesn''10,000,000.0't + #self.assertEqual(self.conv.from_string('0,5'), currency('0.5')) + + def testFormatUS(self): + if not set_locale(locale.LC_MONETARY, 'en_US'): + return + + self.assertEqual(currency(100).format(), '$100') + self.assertEqual(currency('123.45').format(), '$123.45') + self.assertEqual(currency(12345).format(), '$12,345') + self.assertEqual(currency(-100).format(), '$-100') + self.assertEqual(currency(1).format(True), '$1') + self.assertEqual(currency(1).format(False), '1') + self.assertEqual(currency(0).format(True), '$0') + + self.assertEqual(self.conv.from_string(''), ValueUnset) + self.assertEqual(self.conv.from_string('0'), currency(0)) + self.assertEqual(self.conv.from_string('0.5'), currency('0.5')) + self.assertRaises(ValidationError, self.conv.from_string, 'foo') + + self.assertEqual(self.conv.as_string(currency(0)), '$0.00') + self.assertEqual(self.conv.as_string(currency(-10)), '$-10.00') + #self.assertEqual(ValidationError, self.conv.as_string, object) + +class UnicodeTest(unittest.TestCase): + def setUp(self): + self.conv = converter.get_converter(unicode) + + def testFromString(self): + self.assertEqual(self.conv.from_string('foobar'), u'foobar') + # utf-8 encoded, as default after importing gtk + self.assertEqual(self.conv.from_string('\xc3\xa4'), u'\xe4') + + def testAsString(self): + self.assertEqual(self.conv.as_string(u'foobar'), 'foobar') + self.assertEqual(self.conv.as_string(u'\xe4'), '\xc3\xa4') + +class IntTest(unittest.TestCase): + def setUp(self): + self.conv = converter.get_converter(int) + + def tearDown(self): + set_locale(locale.LC_ALL, 'C') + + def testFromString(self): + self.assertEqual(self.conv.from_string('0'), 0) + self.assertRaises(ValidationError, self.conv.from_string, '0.5') + + def testAsString(self): + self.assertEqual(self.conv.as_string(0), '0') + self.assertEqual(self.conv.as_string(-10), '-10') + + def testAsStringUS(self): + if not set_locale(locale.LC_NUMERIC, 'en_US'): + return + + self.assertEqual(self.conv.as_string(123456789), '123456789') + +class FloatTest(unittest.TestCase): + def setUp(self): + self.conv = converter.get_converter(float) + + def tearDown(self): + set_locale(locale.LC_ALL, 'C') + + def testFromString(self): + self.assertEqual(self.conv.from_string('0'), 0.0) + self.assertEqual(self.conv.from_string('-0'), 0.0) + self.assertEqual(self.conv.from_string('0.'), 0.0) + self.assertEqual(self.conv.from_string('0.0'), 0.0) + self.assertEqual(self.conv.from_string('.5'), .5) + self.assertEqual(self.conv.from_string('-2.5'), -2.5) + self.assertEqual(self.conv.from_string('10.33'), 10.33) + self.assertEqual(self.conv.from_string('0.00000000001'), 0.00000000001) + self.assertRaises(ValidationError, self.conv.from_string, 'foo') + self.assertRaises(ValidationError, self.conv.from_string, '1.2.3') + self.assertEqual(self.conv.from_string(''), ValueUnset) + + def testFromStringUS(self): + if not set_locale(locale.LC_NUMERIC, 'en_US'): + return + self.assertEqual(self.conv.from_string('0.'), 0) + self.assertEqual(self.conv.from_string('1.75'), 1.75) + self.assertEqual(self.conv.from_string('10,000'), 10000) + self.assertEqual(self.conv.from_string('10,000,000.5'), 10000000.5) + self.assertRaises(ValidationError, + self.conv.from_string, ',210,000,000.5') + + def testFromStringSE(self): + # Swedish is interesting here because it has different + # thousand separator and decimal points (compared to en_US) + if not set_locale(locale.LC_NUMERIC, 'sv_SE'): + return + self.assertEqual(self.conv.from_string('0,'), 0) + self.assertEqual(self.conv.from_string('1,75'), 1.75) + self.assertEqual(self.conv.from_string('4 321'), 4321) + self.assertEqual(self.conv.from_string('54 321'), 54321) + self.assertEqual(self.conv.from_string('654 321'), 654321) + self.assertEqual(self.conv.from_string('7 654 321'), 7654321) + self.assertEqual(self.conv.from_string('10 000 000,5'), 10000000.5) + self.assertRaises(ValidationError, self.conv.from_string, '1,2 3') + self.assertRaises(ValidationError, self.conv.from_string, '1 23 ') + self.assertRaises(ValidationError, self.conv.from_string, ' 23 ') + #self.assertRaises(ValidationError, self.conv.from_string, '1234 234') + + def testAsString(self): + self.assertEqual(self.conv.as_string(0.0), '0.0') + self.assertEqual(self.conv.as_string(0.5), '0.5') + self.assertEqual(self.conv.as_string(-0.5), '-0.5') + self.assertEqual(self.conv.as_string(0.123456789), '0.123456789') + self.assertEqual(self.conv.as_string(-0.123456789), '-0.123456789') + self.assertEqual(self.conv.as_string(10000000), '10000000.0') + self.assertEqual(self.conv.as_string(10000000.0), '10000000.0') + + def testAsStringUS(self): + if not set_locale(locale.LC_NUMERIC, 'en_US'): + return + self.assertEqual(self.conv.as_string(10000000), '10,000,000.0') + self.assertEqual(self.conv.as_string(10000000.0), '10,000,000.0') + + def testAsStringSE(self): + if not set_locale(locale.LC_NUMERIC, 'sv_SE'): + return + self.assertEqual(self.conv.as_string(0.0), '0,0') + self.assertEqual(self.conv.as_string(0.5), '0,5') + self.assertEqual(self.conv.as_string(-0.5), '-0,5') + self.assertEqual(self.conv.as_string(0.123456789), '0,123456789') + self.assertEqual(self.conv.as_string(-0.123456789), '-0,123456789') + self.assertEqual(self.conv.as_string(10000000), '10000000,0') + self.assertEqual(self.conv.as_string(10000000.0), '10000000,0') + + +class DecimalTest(unittest.TestCase): + def setUp(self): + self.conv = converter.get_converter(Decimal) + + def tearDown(self): + set_locale(locale.LC_ALL, 'C') + + def testFromString(self): + self.assertEqual(self.conv.from_string('-2.5'), Decimal('-2.5')) + self.assertEqual(self.conv.from_string('10.33'), Decimal('10.33')) + self.assertRaises(ValidationError, self.conv.from_string, 'foo') + self.assertRaises(ValidationError, self.conv.from_string, '1.2.3') + self.assertEqual(self.conv.from_string(''), ValueUnset) + + def testAsString(self): + self.assertEqual(self.conv.as_string(Decimal('0.0')), '0.0') + self.assertEqual(self.conv.as_string(Decimal('0.5')), '0.5') + self.assertEqual(self.conv.as_string(Decimal('-0.5')), '-0.5') + self.assertEqual(self.conv.as_string(Decimal('0.123456789')), '0.123456789') + self.assertEqual(self.conv.as_string(Decimal('-0.123456789')), '-0.123456789') + self.assertEqual(self.conv.as_string(Decimal('10000000')), '10000000.0') + self.assertEqual(self.conv.as_string(Decimal('10000000.0')), '10000000.0') + + def testAsStringUS(self): + if not set_locale(locale.LC_NUMERIC, 'en_US'): + return + self.assertEqual(self.conv.as_string(Decimal('10000000')), '10,000,000.0') + self.assertEqual(self.conv.as_string(Decimal('10000000.0')), '10,000,000.0') + + def testAsStringSE(self): + if not set_locale(locale.LC_NUMERIC, 'sv_SE'): + return + self.assertEqual(self.conv.as_string(Decimal('0.0')), '0,0') + self.assertEqual(self.conv.as_string(Decimal('0.5')), '0,5') + self.assertEqual(self.conv.as_string(Decimal('-0.5')), '-0,5') + self.assertEqual(self.conv.as_string(Decimal('0.123456789')), '0,123456789') + self.assertEqual(self.conv.as_string(Decimal('-0.123456789')), '-0,123456789') + self.assertEqual(self.conv.as_string(Decimal('10000000')), '10000000,0') + self.assertEqual(self.conv.as_string(Decimal('10000000.0')), '10000000,0') + + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_dateentry.py b/tests/test_dateentry.py new file mode 100644 index 0000000..382fee3 --- /dev/null +++ b/tests/test_dateentry.py @@ -0,0 +1,19 @@ +import sys +import datetime +import unittest + +from kiwi.ui.dateentry import DateEntry + +class TestDateEntry(unittest.TestCase): + def setUp(self): + self.date = datetime.date.today() + + def testGetSetDate(self): + if sys.platform == 'win32': + return + entry = DateEntry() + entry.set_date(self.date) + self.assertEqual(entry.get_date(), self.date) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_desktopparser.py b/tests/test_desktopparser.py new file mode 100644 index 0000000..d583504 --- /dev/null +++ b/tests/test_desktopparser.py @@ -0,0 +1,74 @@ +# encoding: utf-8 +import StringIO +import unittest + +from kiwi.desktopparser import DesktopParser + +desktop_data = """ +[Desktop Entry] +Name=Totem Movie Player +Name[pt]=Reprodutor de Filmes Totem +Name[sv]=Filmspelaren Totem +Categories=GNOME;Application;AudioVideo +""" + +class TestTotem(unittest.TestCase): + def setUp(self): + self.parser = DesktopParser() + self.parser.readfp(StringIO.StringIO(desktop_data)) + + def test(self): + self.assertEqual(self.parser.get('Desktop Entry', 'Name'), + 'Totem Movie Player') + self.assertEqual(self.parser.get_locale( + 'Desktop Entry', 'Name', 'pt'), 'Reprodutor de Filmes Totem') + self.assertEqual(self.parser.get_locale( + 'Desktop Entry', 'Name', 'sv'), 'Filmspelaren Totem') + self.assertEqual( + self.parser.get_string_list('Desktop Entry', 'Categories'), + ['GNOME', 'Application', 'AudioVideo']) + + +class TestDesktopParser(unittest.TestCase): + def setUp(self): + self.parser = DesktopParser() + self.parser.add_section('Section') + + def testList(self): + self.parser.set_string_list('Section', 'Foo', ['A', 'B', 'C']) + self.assertEqual( + self.parser.get_string_list('Section', 'Foo'), + ['A', 'B', 'C']) + + self.parser.set_integer_list('Section', 'Bar', [1, 2, 3]) + self.assertEqual( + self.parser.get_integer_list('Section', 'Bar'), + [1, 2, 3]) + + self.parser.set_boolean_list('Section', 'Bar', [True, False]) + self.assertEqual( + self.parser.get_boolean_list('Section', 'Bar'), + [True, False]) + + def testLocale(self): + self.parser.set_locale( + 'Section', 'Foo', 'sv', 'Apa') + self.assertEqual( + self.parser.get_locale('Section', 'Foo', 'sv'), + 'Apa') + + self.parser.set_string_list_locale( + 'Section', 'Foo', 'sv', ['Ã¥', 'ä', 'ö']) + self.assertEqual( + self.parser.get_string_list_locale('Section', 'Foo', 'sv'), + ['Ã¥', 'ä', 'ö']) + + def testListSeparator(self): + self.parser.set('Section', 'Comma', '1,2,3') + self.assertEqual( + self.parser.get_string_list('Section', 'Comma'), + ['1,2,3']) + self.parser.set_list_separator(',') + self.assertEqual( + self.parser.get_string_list('Section', 'Comma'), + ['1', '2', '3']) diff --git a/tests/test_gazpacholoader.py b/tests/test_gazpacholoader.py new file mode 100644 index 0000000..376dd0b --- /dev/null +++ b/tests/test_gazpacholoader.py @@ -0,0 +1,41 @@ +import unittest + +import gobject +import gtk +from gazpacho.loader.loader import ObjectBuilder + +from kiwi.python import disabledeprecationcall +import kiwi.ui.gazpacholoader +kiwi + +HAVE_2_8 = gobject.pygtk_version[:2] == (2, 8) + +def glade(s): + return '<glade-interface>%s</glade-interface>' % s + +class TestGazpachoLoader(unittest.TestCase): + def testConstruct(self): + objs = [("kiwi+ui+widgets+list+List", "w1"), + ("kiwi+ui+widgets+combobox+ComboBox", "w3"), + ("kiwi+ui+widgets+combobox+ComboBoxEntry", "w5") + ] + + if HAVE_2_8: + objs.extend([("ObjectList", "w2"), + ("ProxyComboBox", "w4"), + ("ProxyComboBoxEntry", "w6") + ]) + s = '' + + for obj, name in objs: + s += '<widget class="%s" id="%s"/>\n' % (obj, name) + ob = disabledeprecationcall(ObjectBuilder, buffer=glade(s)) + for obj, name in objs: + widget = ob.get_widget(name) + self.failUnless(isinstance(widget, gtk.Widget)) + gtype = gobject.type_from_name(obj) + self.failUnless(gobject.type_is_a(gtype, gtk.Widget)) + self.failUnless(gobject.type_is_a(gtype, widget)) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_proxy.py b/tests/test_proxy.py new file mode 100644 index 0000000..f8338d1 --- /dev/null +++ b/tests/test_proxy.py @@ -0,0 +1,123 @@ +import unittest + +from kiwi import ValueUnset +from kiwi.python import Settable +from kiwi.ui.proxy import Proxy +from kiwi.ui.widgets.checkbutton import ProxyCheckButton +from kiwi.ui.widgets.entry import ProxyEntry +from kiwi.ui.widgets.label import ProxyLabel +from kiwi.ui.widgets.radiobutton import ProxyRadioButton +from kiwi.ui.widgets.spinbutton import ProxySpinButton +from kiwi.ui.widgets.textview import ProxyTextView +from kiwi.ui.widgets.combo import ProxyComboEntry, ProxyComboBox + +class FakeView(object): + def __init__(self): + self.widgets = [] + + def add(self, name, data_type, widget_type): + widget = widget_type() + widget.set_property('model-attribute', name) + widget.set_property('data-type', data_type) + + setattr(self, name, widget) + self.widgets.append(name) + return widget + + def handler_block(self, *args): + pass + + def handler_unblock(self, *args): + pass + +class Model(Settable): + def __init__(self): + Settable.__init__(self, + entry='foo', + checkbutton=True, + radiobutton='first', + label='label', + spinbutton=100, + textview='sliff', + comboentry='CE1', + combobox='CB1') + +class TestProxy(unittest.TestCase): + def setUp(self): + self.view = FakeView() + self.view.add('checkbutton', bool, ProxyCheckButton) + self.view.add('entry', str, ProxyEntry) + self.view.add('label', str, ProxyLabel) + self.view.add('spinbutton', int, ProxySpinButton) + self.view.add('textview', str, ProxyTextView) + self.radio_first = self.view.add('radiobutton', str, ProxyRadioButton) + self.radio_first.set_property('data_value', 'first') + self.radio_second = ProxyRadioButton() + self.radio_second.set_group(self.radio_first) + self.radio_second.set_property('data_value', 'second') + + self.comboentry = self.view.add('comboentry', str, ProxyComboEntry) + self.comboentry.prefill(['CE1','CE2','CE3']) + + self.combobox = self.view.add('combobox', str, ProxyComboBox) + self.combobox.prefill(['CB1','CB2','CB3']) + + self.model = Model() + self.proxy = Proxy(self.view, self.model, self.view.widgets) + + def testCheckButton(self): + self.assertEqual(self.model.checkbutton, True) + self.view.checkbutton.set_active(False) + self.assertEqual(self.model.checkbutton, False) + + def testEntry(self): + self.assertEqual(self.model.entry, 'foo') + self.view.entry.set_text('bar') + self.assertEqual(self.model.entry, 'bar') + + def testLabel(self): + self.assertEqual(self.model.label, 'label') + self.view.label.set_text('other label') + self.assertEqual(self.model.label, 'other label') + + def testRadioButton(self): + self.assertEqual(self.model.radiobutton, 'first') + self.radio_second.set_active(True) + self.assertEqual(self.model.radiobutton, 'second') + self.radio_first.set_active(True) + self.assertEqual(self.model.radiobutton, 'first') + + def testSpinButton(self): + self.assertEqual(self.model.spinbutton, 100) + self.view.spinbutton.set_text("200") + self.assertEqual(self.model.spinbutton, 200) + + def testTextView(self): + self.assertEqual(self.model.textview, 'sliff') + self.view.textview.get_buffer().set_text('sloff') + self.assertEqual(self.model.textview, 'sloff') + + def testComboEntry(self): + self.assertEqual(self.model.comboentry, 'CE1') + self.view.comboentry.select('CE2') + self.assertEqual(self.model.comboentry, 'CE2') + self.view.comboentry.entry.set_text('CENone') + self.assertEqual(self.model.comboentry, None) + + def testComboBox(self): + self.assertEqual(self.model.combobox, 'CB1') + self.view.combobox.select('CB2') + self.assertEqual(self.model.combobox, 'CB2') + + def testEmptyModel(self): + self.radio_second.set_active(True) + + self.proxy.set_model(None) + self.assertEqual(self.view.entry.read(), '') + self.assertEqual(self.view.checkbutton.read(), False) + self.assertEqual(self.view.radiobutton.read(), 'first') + self.assertEqual(self.view.label.read(), '') + self.assertEqual(self.view.spinbutton.read(), ValueUnset) + self.assertEqual(self.view.textview.read(), '') + self.assertEqual(self.view.comboentry.read(), None) + self.assertEqual(self.view.combobox.read(), 'CB1') diff --git a/tests/test_python.py b/tests/test_python.py new file mode 100644 index 0000000..5acd9e1 --- /dev/null +++ b/tests/test_python.py @@ -0,0 +1,28 @@ +import unittest + +from kiwi.python import slicerange + +class SliceTest(unittest.TestCase): + def genlist(self, limit, start, stop=None, step=None): + if stop == None: + stop = start + start = None + + return list(slicerange(slice(start, stop, step), limit)) + + def testStop(self): + self.assertEqual(self.genlist(10, 10), range(10)) + self.assertEqual(self.genlist(10, -5), range(5)) + self.assertEqual(self.genlist(10, -15), []) + self.assertEqual(self.genlist(5, 10), range(5)) + self.assertEqual(self.genlist(0, 10), []) + + def testStartStop(self): + self.assertEqual(self.genlist(10, 0, 10), range(10)) + self.assertEqual(self.genlist(10, 1, 9), range(10)[1:9]) + self.assertEqual(self.genlist(10, -1, -1), range(10)[-1:-1]) + self.assertEqual(self.genlist(10, 0, -15), range(10)[0:-15]) + self.assertEqual(self.genlist(10, 15, 0), range(10)[-15:0]) + + def testStartStopStep(self): + self.assertEqual(self.genlist(10, 0, 10, 2), range(10)[0:10:2]) diff --git a/tests/test_tasklet.py b/tests/test_tasklet.py new file mode 100644 index 0000000..dd5292f --- /dev/null +++ b/tests/test_tasklet.py @@ -0,0 +1,18 @@ +import unittest + +import gobject + +from kiwi.tasklet import WaitForSignal + +import utils + +class TestWaitForSignal(unittest.TestCase): + def testBadArguments(self): + self.assertRaises(TypeError, WaitForSignal, '', '') + self.assertRaises(ValueError, WaitForSignal, gobject.GObject(), 'foo') + + def testGoodArgumnets(self): + WaitForSignal(gobject.GObject(), 'notify') + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 0000000..362bd6c --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,74 @@ +import unittest + +import gobject + +from kiwi.ui.widgets.combo import ProxyComboBox +from kiwi.utils import PropertyObject, gproperty, HAVE_2_6 + +class Test(gobject.GObject, PropertyObject): + __gtype_name__ = 'Test' + gproperty('str-prop', str, nick='Nick', blurb='Blurb', + default='Default') + + def __init__(self, **kwargs): + gobject.GObject.__init__(self) + PropertyObject.__init__(self, **kwargs) + +class GPropertyTest(unittest.TestCase): + def testProperties(self): + for pspec in gobject.list_properties(Test): + self.assertEqual(pspec.name, 'str-prop') + self.assertEqual(pspec.nick, 'Nick', pspec.nick) + self.assertEqual(pspec.default_value, 'Default', + pspec.default_value) + self.assertEqual(pspec.blurb, 'Blurb', pspec.blurb) + +class Subclassing(unittest.TestCase): + def testSimple(self): + subtype = type('Test2', (Test,), {}) + self.failUnless(issubclass(subtype, Test)) + instance = subtype() + self.failUnless(isinstance(instance, Test)) + self.failUnless(isinstance(instance, subtype)) + + def testCombo(self): + self.assertEqual(getattr(ProxyComboBox, '__gsignals__', {}), {}) + self.assertEqual(getattr(ProxyComboBox, '__gproperties__', {}), {}) + subentry = type('MyClass', (ProxyComboBox,), {}) + self.assertNotEqual(gobject.type_name(subentry), + gobject.type_name(ProxyComboBox)) + +class MixinTest(unittest.TestCase): + def testProperties(self): + class Mixin(object): + gproperty('mixin-prop', str, default='foo') + + class Object(gobject.GObject, PropertyObject, Mixin): + gproperty('normal-prop', str, default='bar') + + def __init__(self, **kwargs): + gobject.GObject.__init__(self) + PropertyObject.__init__(self, **kwargs) + + o = Object() + + self.failUnless(hasattr(o, 'normal_prop')) + self.assertEqual(o.normal_prop, 'bar') + self.failUnless(hasattr(o, 'mixin_prop')) + self.assertEqual(o.mixin_prop, 'foo') + + def testSpinButton(self): + from kiwi.ui.widgets.spinbutton import ProxySpinButton + s = ProxySpinButton() + self.failUnless(hasattr(s, 'data_type')) + self.assertEqual(s.data_type, int) + + def testTypeName(self): + class Object(gobject.GObject, PropertyObject): + __gtype_name__ = 'Object' + if HAVE_2_6: + return + self.assertEqual(gobject.type_name(Object), 'Object') + +if __name__ == '__main__': + unittest.main() diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 0000000..6adf8bf --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,23 @@ +import os +import sys +import time + +try: + import pygtk + pygtk.require('2.0') +except: + pass + +import gtk + +def refresh_gui(delay=0): + while gtk.events_pending(): + gtk.main_iteration_do(block=False) + time.sleep(delay) + +dir = os.path.dirname(__file__) +if not dir in sys.path: + sys.path.insert(0, os.path.join(dir)) + +from kiwi.environ import environ +environ.add_resource('glade', dir) diff --git a/tools/epyrun b/tools/epyrun new file mode 100755 index 0000000..ab80303 --- /dev/null +++ b/tools/epyrun @@ -0,0 +1,352 @@ +#!/usr/bin/env python +# system +# ### Twisted Preamble +# # This makes sure that users don't have to set up their environment +# # specially in order to run these programs from bin/. +import new +import os +import re +import shutil +import sys + +import gobject +import kiwi +import kiwi.utils +from kiwi.__version__ import version + +from twisted.python import reflect + +class _GObject(object): + "I am not a real type, just a helper type for epydoc" + __module__ = 'kiwi' +kiwi._GObject = _GObject + +def fakeFunction(func): + code = func.func_code + newcode = new.code(code.co_argcount, code.co_nlocals, code.co_stacksize, + code.co_flags, 'd\x01\x00S', code.co_consts, + code.co_names, code.co_varnames, code.co_filename, + code.co_name, 1, code.co_lnotab) + return new.function(newcode, func.func_globals, func.__name__, + func.func_defaults, func.func_closure) + +class FakeModule(object): + + def __init__(self, name, level, *ignore): + self.__level = level + self.__name__ = name + + def __repr__(self): + return '<Fake %s>' % self.__name__ + __str__ = __repr__ + + def __nonzero__(self): + return 1 + + def __call__(self, *args, **kw): + pass #print 'Called:', args + + def __getattr__(self, attr): + if self.__level == 0: + raise AttributeError + if self.__name__ == 'gobject': + if attr == 'GObject': + return object + #elif attr == 'list_properties': + # return lambda x: [] + elif attr == 'pygtk_version': + return gobject.pygtk_version + + if (self.__name__, attr) in skipped_types: + return _GObject + + return FakeModule(self.__name__+'.'+attr, self.__level-1) + + def __cmp__(self, other): + if not hasattr(other, '___name__'): + return -1 + return cmp(self.__name__, other.__name__) + +def fakeOut(modname): + modpath = modname.split('.') + prevmod = None + for m in range(len(modpath)): + mp = '.'.join(modpath[:m+1]) + nm = FakeModule(mp, 4) + if prevmod: + setattr(prevmod, modpath[m], nm) + sys.modules[mp] = nm + prevmod = nm + +kiwi.utils.gproperty = fakeFunction(kiwi.utils.gproperty) +kiwi.utils.type_register = fakeFunction(kiwi.utils.type_register) +gobject.type_is_a = lambda x: None +gobject.list_properties = lambda x: [] + +skipped_types = {} +for name in ('gobject', 'pango', 'atk', 'gtk', 'gtk.gdk', 'gtk.glade'): + mod = reflect.namedAny(name) + for attr in dir(mod): + value = getattr(mod, attr) + if not issubclass(type(value), gobject.GObjectMeta): + continue + if issubclass(value, gobject.GObject): + skipped_types[(name , attr)] = None +fakeOut("gobject") +fakeOut("pango") +fakeOut("atk") +fakeOut("gtk") +fakeOut("gtk.gdk") +fakeOut("gtk.glade") + +# epydoc +import epydoc +assert epydoc.__version__[0] == '2', "You need epydoc 2.x!" +from epydoc.cli import cli +from epydoc.html import HTMLFormatter +from epydoc import uid +import epydoc.html + +# HACK: Force everything to be public. + +def is_private(self): + if self._name.split('.')[-1].startswith('_'): + return True + return False + +def is_public(self): + return not self.is_private() #True + +uid.UID.is_private = is_private +uid.UID.is_public = is_public + +#from twisted.cred.portal import IRealm +#print uid.ObjectUID(IRealm.requestAvatar).is_routine() +#sys.exit() + +# HACK: Don't append -module and -class to the filenames, and generate +# redirecty-files for all methods. + +class TwistedHTMLFormatter(HTMLFormatter): + def _uid_to_filename(self, uid): + # Enforce same restrictions as HTMLFormatter._uid_to_filename for sanity + # checking + assert uid.is_module() or uid.is_class(), 'Bad UID type: %r' % (uid,) + return uid.name() + '.html' + + def _uid_to_uri(self, uid): + if uid.is_module() or uid.is_class(): + return uid.name() + '.html' + + parent = uid.parent() + if parent is None: + return uid.name() + '.html' + + return parent.name() + '.html#' + uid.shortname() + + def _method_to_html(self, uid): + """ + Dodgy redirect hack. + """ + str = ('<html><head>\n' + '<meta http-equiv=refresh content="0; url=%s#%s">\n' + '</head></html>\n') + str = str % (self._uid_to_uri(uid.parent()), uid.shortname()) + return str + + def write(self, directory=None, progress_callback=None): + HTMLFormatter.write(self, directory, progress_callback) + + # Write method redirectors + self._write_method_redirects(directory) + + def _write_method_redirects(self, directory): + import os.path + seen = {} + for uid, doc in self._docmap.data.iteritems(): + if uid.is_method() or uid.is_function(): + if uid.name() in seen: continue + seen[uid.name()] = 1 + filename = os.path.join(directory, uid.name() + '.html') + #assert not os.path.exists(filename), filename + s = self._method_to_html(uid) + open(filename, 'w').write(s) + + # when doing non-full builds we need to fake epydoc in to thinking that + # all twisted modules are being documented so that the html links + # to the modules that aren't being documented get generated correctly + def _documented(self, uid): + value = HTMLFormatter._documented(self, uid) + if not document_all: + if not value: + try: + if uid._name.startswith('kiwi.'): #ha ha sucker + return True + except: + pass + return value + +epydoc.html.HTMLFormatter = TwistedHTMLFormatter + +# HACK: Another "only doc what we tell you". We don't want epydoc to +# automatically recurse into subdirectories: "twisted"'s presence was +# causing "twisted/test" to be docced, even thought we explicitly +# didn't put any twisted/test in our modnames. + +from epydoc import imports +orig_find_modules = imports.find_modules + +def find_modules(dirname): + if not os.path.isdir(dirname): return [] + found_init = 0 + modules = {} + dirs = [] + + # Search for directories & modules, and check for __init__.py. + # Don't include duplicates (like foo.py and foo.pyc), and give + # precedance to the .py files. + for file in os.listdir(dirname): + filepath = os.path.join(dirname, file) + if os.path.isdir(filepath): dirs.append(filepath) + elif not re.match(r'\w+.py.?', file): + continue # Ignore things like ".#foo.py" or "a-b.py" + elif file[-3:] == '.py': + modules[file] = os.path.join(dirname, file) + if file == '__init__.py': found_init = 1 + elif file[-4:-1] == '.py': + modules.setdefault(file[:-1], file) + if file[:-1] == '__init__.py': found_init = 1 + modules = modules.values() + + # If there was no __init__.py, then this isn't a package + # directory; return nothing. + if not found_init: return [] + + # Recurse to the child directories. + # **twisted** here's the change: commented next line out + #for d in dirs: modules += find_modules(d) + return modules + +imports.find_modules = find_modules + +# Now, set up the list of modules for epydoc to document +modnames = [] +def addMod(arg, path, files): + if 'topfiles' in files: + files.remove('topfiles') + for fn in files: + file = os.path.join(path, fn).replace('%s__init__'%os.sep, '') + if file[-3:] == '.py': + modName = file[:-3].replace(os.sep,'.') + try: + #print 'pre-loading', modName + reflect.namedModule(modName) + except ImportError: + print 'import error:', modName + except Exception, e: + print 'other error:', modName + raise + else: + modnames.append(modName) + +document_all = True # are we doing a full build? +names = ['kiwi/'] #default, may be overriden below +tmp_dir = '_epyrun_tmp' #only used for partial builds + +#get list of modules/pkgs on cmd-line +try: + i = sys.argv.index("--modules") +except: + pass +else: + names = sys.argv[i+1:] + document_all = False + sys.argv[i:] = [] + #sanity check on names + for i in range(len(names)): + try: + j = names[i].rindex('kiwi/') + except: + raise SystemExit, 'You can only specify twisted modules or packages' + else: + #strip off any leading directories before the 'twisted/' + #dir. this makes it easy to specify full paths, such as + #from TwistedEmacs + names[i] = names[i][j:] + + old_out_dir = "html" + #if -o was specified, we need to change it to point to a tmp dir + #otherwise add our own -o option + try: + i = sys.argv.index('-o') + old_out_dir = sys.argv[i+1] + try: + os.mkdir(tmp_dir) + except OSError: + pass + sys.argv[i+1] = tmp_dir + except ValueError: + sys.argv[1:1] = ['-o', tmp_dir] + +osrv = sys.argv +sys.argv=["IGNORE"] +im = __import__ + +real_imp = __builtins__.__import__ +# HACK: Don't import stuff that we don't like +# this is why we have to convert +def myimport(*args): + try: + return im(*args) + except: + raise + mod = FakeModule(args[0], 4) + i = args[0].rfind('.') + if i != -1: + setattr(sys.modules[args[0][:i]], args[0][i+1:], mod) + return mod +__builtins__.__import__ = myimport + +for name in names: + if name.endswith(".py"): + # turn it in to a python module name + name = name[:-3].replace(os.sep, ".") + try: + reflect.namedModule(name) + except ImportError: + print 'import error:', name + except Exception, e: + print 'other error:', name + raise e + else: + modnames.append(name) + else: #assume it's a dir + os.path.walk(name, addMod, None) + +__builtins__.__import__ = im +sys.argv = osrv + +sys.argv.extend(modnames) + +sys.argv[1:1] = ['-n', 'Kiwi %s' % '.'.join(map(str, version)), + '-u', 'http://www.async.com.br/projects/kiwi/', + '--no-private'] + +# Make it easy to profile epyrun +cli() + +# used when doing partial builds to move the new files +# out of the tmp dir and in to the real output dir. +# only does "twisted." files since the others (index.html and such) +# won't be right when not doing full builds. +def moveFilesOut(arg, dirname, fnames): + for fn in fnames: + if fn.startswith('kiwi.'): + shutil.move('%s%s%s' % (tmp_dir, os.sep, fn), old_out_dir) + +if not document_all: + print "Updating files in %s" % old_out_dir + #move the right html files in to place + os.path.walk(tmp_dir, moveFilesOut, None) + #clean up + shutil.rmtree(tmp_dir) |