summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSVN-Git Migration <python-modules-team@lists.alioth.debian.org>2015-10-08 09:27:57 -0700
committerSVN-Git Migration <python-modules-team@lists.alioth.debian.org>2015-10-08 09:27:57 -0700
commit928ccf929c26a5344c224303b5108e99c2eb597a (patch)
tree6d371148311fe4467b0c9a208e9c36d24380c75e
Imported Upstream version 1.9.8
-rw-r--r--AUTHORS28
-rw-r--r--COPYING504
-rw-r--r--ChangeLog2696
-rw-r--r--MANIFEST.in14
-rw-r--r--NEWS67
-rw-r--r--PKG-INFO15
-rw-r--r--README91
-rwxr-xr-xbin/kiwi-i18n81
-rwxr-xr-xbin/kiwi-ui-test81
-rw-r--r--doc/Makefile58
-rw-r--r--doc/base-model-design.txt33
-rw-r--r--doc/class-diagram-kiwi2.diabin0 -> 6275 bytes
-rw-r--r--doc/environ.txt34
-rw-r--r--doc/howto.tex2149
-rw-r--r--doc/images/diary.eps12729
-rw-r--r--doc/images/diary.pngbin0 -> 43676 bytes
-rw-r--r--doc/release-checklist.txt22
-rw-r--r--examples/comboentry.py24
-rw-r--r--examples/completion.py35
-rw-r--r--examples/framework/color/color.py47
-rw-r--r--examples/framework/color/color2.py47
-rw-r--r--examples/framework/diary/diary.glade185
-rwxr-xr-xexamples/framework/diary/diary.py41
-rw-r--r--examples/framework/diary/diary2.glade235
-rwxr-xr-xexamples/framework/diary/diary2.py62
-rw-r--r--examples/framework/faren/faren.glade179
-rw-r--r--examples/framework/faren/faren.py28
-rw-r--r--examples/framework/faren/faren2.py47
-rw-r--r--examples/framework/faren/faren3.py41
-rw-r--r--examples/framework/gender/gender.glade68
-rw-r--r--examples/framework/gender/genderselection.py20
-rw-r--r--examples/framework/hey/hey.glade18
-rw-r--r--examples/framework/hey/hey.py17
-rw-r--r--examples/framework/hey/heyglade.py9
-rw-r--r--examples/framework/hey/heyglade2.py18
-rw-r--r--examples/framework/hey/heyglade3.py19
-rw-r--r--examples/framework/news/news.py47
-rw-r--r--examples/framework/news/news2.py43
-rw-r--r--examples/framework/news/news3.py89
-rw-r--r--examples/framework/news/news4.py90
-rw-r--r--examples/framework/news/news_list.glade14
-rw-r--r--examples/framework/news/news_shell.glade111
-rw-r--r--examples/framework/newsform/newsform.glade115
-rw-r--r--examples/framework/newsform/newsform.py24
-rw-r--r--examples/framework/sizegroup/shell.glade136
-rw-r--r--examples/framework/sizegroup/slave_view.glade92
-rw-r--r--examples/framework/sizegroup/slave_view2.glade70
-rw-r--r--examples/framework/sizegroup/slaves.py50
-rw-r--r--examples/hyperlink/hyperlink_demo.py165
-rw-r--r--examples/list/editable.py29
-rw-r--r--examples/list/kitchensink.py88
-rw-r--r--examples/list/radio.py26
-rw-r--r--examples/list/searchbar.py51
-rw-r--r--examples/list/simple.py28
-rw-r--r--examples/list/sortable.py28
-rw-r--r--examples/list/stockicon.py30
-rw-r--r--examples/simple/simple.py32
-rw-r--r--examples/tasklet/simple.py59
-rw-r--r--examples/tasklet/test-tasklet.py96
-rw-r--r--examples/tasklet/test-tasklet2.py95
-rw-r--r--examples/validation/datatypes.py46
-rw-r--r--examples/validation/lang.glade75
-rw-r--r--examples/validation/personalinformation.glade309
-rw-r--r--examples/validation/personalinformation.py98
-rw-r--r--examples/validation/slaves.py97
-rw-r--r--gazpacho-plugin/AUTHORS1
-rw-r--r--gazpacho-plugin/COPYING504
-rw-r--r--gazpacho-plugin/kiwiwidgets.py258
-rw-r--r--gazpacho-plugin/kiwiwidgets.xml62
-rw-r--r--gazpacho-plugin/resources/kiwiwidgets/hyperlink.pngbin0 -> 854 bytes
-rw-r--r--gazpacho-plugin/resources/kiwiwidgets/kiwicheckbutton.pngbin0 -> 781 bytes
-rw-r--r--gazpacho-plugin/resources/kiwiwidgets/kiwicombobox.pngbin0 -> 869 bytes
-rw-r--r--gazpacho-plugin/resources/kiwiwidgets/kiwicomboboxentry.pngbin0 -> 884 bytes
-rw-r--r--gazpacho-plugin/resources/kiwiwidgets/kiwicomboentry.pngbin0 -> 884 bytes
-rw-r--r--gazpacho-plugin/resources/kiwiwidgets/kiwidateentry.pngbin0 -> 903 bytes
-rw-r--r--gazpacho-plugin/resources/kiwiwidgets/kiwientry.pngbin0 -> 903 bytes
-rw-r--r--gazpacho-plugin/resources/kiwiwidgets/kiwilabel.pngbin0 -> 854 bytes
-rw-r--r--gazpacho-plugin/resources/kiwiwidgets/kiwiradiobutton.pngbin0 -> 919 bytes
-rw-r--r--gazpacho-plugin/resources/kiwiwidgets/kiwispinbutton.pngbin0 -> 865 bytes
-rw-r--r--gazpacho-plugin/resources/kiwiwidgets/kiwitextview.pngbin0 -> 877 bytes
-rw-r--r--gazpacho-plugin/resources/kiwiwidgets/objectlist.pngbin0 -> 911 bytes
-rw-r--r--glade/PluggableWizard.glade119
-rw-r--r--kiwi/__init__.py74
-rw-r--r--kiwi/__version__.py22
-rw-r--r--kiwi/accessor.py468
-rw-r--r--kiwi/argcheck.py201
-rw-r--r--kiwi/component.py105
-rw-r--r--kiwi/controllers.py147
-rw-r--r--kiwi/datatypes.py656
-rw-r--r--kiwi/decorators.py95
-rw-r--r--kiwi/desktopparser.py161
-rw-r--r--kiwi/dist.py252
-rw-r--r--kiwi/environ.py389
-rw-r--r--kiwi/i18n/__init__.py22
-rw-r--r--kiwi/i18n/i18n.py167
-rw-r--r--kiwi/i18n/msgfmt.py204
-rw-r--r--kiwi/interfaces.py95
-rw-r--r--kiwi/log.py119
-rw-r--r--kiwi/model.py264
-rw-r--r--kiwi/python.py169
-rw-r--r--kiwi/tasklet.py871
-rw-r--r--kiwi/ui/__init__.py39
-rw-r--r--kiwi/ui/comboboxentry.py129
-rw-r--r--kiwi/ui/comboentry.py540
-rw-r--r--kiwi/ui/combomixin.py231
-rw-r--r--kiwi/ui/dateentry.py352
-rw-r--r--kiwi/ui/delegates.py103
-rw-r--r--kiwi/ui/dialogs.py326
-rw-r--r--kiwi/ui/entry.py603
-rw-r--r--kiwi/ui/gadgets.py182
-rw-r--r--kiwi/ui/gazpacholoader.py360
-rw-r--r--kiwi/ui/hyperlink.py255
-rw-r--r--kiwi/ui/icon.py280
-rw-r--r--kiwi/ui/libgladeloader.py76
-rw-r--r--kiwi/ui/objectlist.py1705
-rw-r--r--kiwi/ui/proxy.py373
-rw-r--r--kiwi/ui/proxywidget.py316
-rw-r--r--kiwi/ui/selectablebox.py186
-rw-r--r--kiwi/ui/test/__init__.py24
-rw-r--r--kiwi/ui/test/common.py198
-rw-r--r--kiwi/ui/test/listener.py458
-rw-r--r--kiwi/ui/test/main.py52
-rw-r--r--kiwi/ui/test/player.py250
-rw-r--r--kiwi/ui/tooltip.py118
-rw-r--r--kiwi/ui/views.py967
-rw-r--r--kiwi/ui/widgets/__init__.py20
-rw-r--r--kiwi/ui/widgets/checkbutton.py69
-rw-r--r--kiwi/ui/widgets/colorbutton.py46
-rw-r--r--kiwi/ui/widgets/combo.py254
-rw-r--r--kiwi/ui/widgets/combobox.py43
-rw-r--r--kiwi/ui/widgets/entry.py255
-rw-r--r--kiwi/ui/widgets/filechooser.py80
-rw-r--r--kiwi/ui/widgets/fontbutton.py47
-rw-r--r--kiwi/ui/widgets/label.py157
-rw-r--r--kiwi/ui/widgets/list.py62
-rw-r--r--kiwi/ui/widgets/radiobutton.py94
-rw-r--r--kiwi/ui/widgets/spinbutton.py124
-rw-r--r--kiwi/ui/widgets/textview.py70
-rw-r--r--kiwi/ui/wizard.py236
-rw-r--r--kiwi/utils.py362
-rw-r--r--pixmaps/validation-error-16.pngbin0 -> 436 bytes
-rw-r--r--po/POTFILES.list1
-rw-r--r--po/kiwi.pot140
-rw-r--r--po/pt_BR.po139
-rw-r--r--po/sv.po143
-rw-r--r--setup.py47
-rw-r--r--tests/Proxies/CheckButton.py63
-rw-r--r--tests/Proxies/Entry.py274
-rw-r--r--tests/Proxies/NoModel.py49
-rw-r--r--tests/Proxies/None.py38
-rw-r--r--tests/Proxies/OptionMenu.py77
-rw-r--r--tests/Proxies/RadioGroup.py103
-rw-r--r--tests/Proxies/Separator.py56
-rw-r--r--tests/Proxies/Text.py92
-rw-r--r--tests/__init__.py5
-rw-r--r--tests/actions.glade150
-rw-r--r--tests/run_all_tests.py31
-rw-r--r--tests/simple_button.glade17
-rw-r--r--tests/test_Action.py27
-rw-r--r--tests/test_BaseView.py129
-rw-r--r--tests/test_CheckButton.py17
-rw-r--r--tests/test_ComboBox.py116
-rw-r--r--tests/test_Delegate.py112
-rw-r--r--tests/test_Entry.py98
-rw-r--r--tests/test_Label.py38
-rw-r--r--tests/test_ObjectList.py332
-rw-r--r--tests/test_SpinButton.py15
-rw-r--r--tests/test_argcheck.py164
-rw-r--r--tests/test_comboentry.py94
-rw-r--r--tests/test_component.py121
-rw-r--r--tests/test_datatypes.py271
-rw-r--r--tests/test_dateentry.py19
-rw-r--r--tests/test_desktopparser.py74
-rw-r--r--tests/test_gazpacholoader.py41
-rw-r--r--tests/test_proxy.py123
-rw-r--r--tests/test_python.py28
-rw-r--r--tests/test_tasklet.py18
-rw-r--r--tests/test_utils.py74
-rw-r--r--tests/utils.py23
-rwxr-xr-xtools/epyrun352
180 files changed, 41153 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..20f5c07
--- /dev/null
+++ b/AUTHORS
@@ -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>
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..b1e3f5a
--- /dev/null
+++ b/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/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
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..77e7159
--- /dev/null
+++ b/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
diff --git a/README b/README
new file mode 100644
index 0000000..4581500
--- /dev/null
+++ b/README
@@ -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
new file mode 100644
index 0000000..efa9442
--- /dev/null
+++ b/doc/class-diagram-kiwi2.dia
Binary files differ
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
new file mode 100644
index 0000000..1629205
--- /dev/null
+++ b/doc/images/diary.png
Binary files differ
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">&lt;b&gt;_Temperature:&lt;/b&gt;</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">&lt;b&gt;Celsius:&lt;/b&gt;</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">&lt;b&gt;Farenheit:&lt;/b&gt;</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">&lt;b&gt;Please fill in some personal information&lt;/b&gt;</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
new file mode 100644
index 0000000..54fd785
--- /dev/null
+++ b/gazpacho-plugin/resources/kiwiwidgets/hyperlink.png
Binary files differ
diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwicheckbutton.png b/gazpacho-plugin/resources/kiwiwidgets/kiwicheckbutton.png
new file mode 100644
index 0000000..acfe6a3
--- /dev/null
+++ b/gazpacho-plugin/resources/kiwiwidgets/kiwicheckbutton.png
Binary files differ
diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwicombobox.png b/gazpacho-plugin/resources/kiwiwidgets/kiwicombobox.png
new file mode 100644
index 0000000..fcd4319
--- /dev/null
+++ b/gazpacho-plugin/resources/kiwiwidgets/kiwicombobox.png
Binary files differ
diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwicomboboxentry.png b/gazpacho-plugin/resources/kiwiwidgets/kiwicomboboxentry.png
new file mode 100644
index 0000000..21220ad
--- /dev/null
+++ b/gazpacho-plugin/resources/kiwiwidgets/kiwicomboboxentry.png
Binary files differ
diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwicomboentry.png b/gazpacho-plugin/resources/kiwiwidgets/kiwicomboentry.png
new file mode 100644
index 0000000..21220ad
--- /dev/null
+++ b/gazpacho-plugin/resources/kiwiwidgets/kiwicomboentry.png
Binary files differ
diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwidateentry.png b/gazpacho-plugin/resources/kiwiwidgets/kiwidateentry.png
new file mode 100644
index 0000000..2ac0e95
--- /dev/null
+++ b/gazpacho-plugin/resources/kiwiwidgets/kiwidateentry.png
Binary files differ
diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwientry.png b/gazpacho-plugin/resources/kiwiwidgets/kiwientry.png
new file mode 100644
index 0000000..2ac0e95
--- /dev/null
+++ b/gazpacho-plugin/resources/kiwiwidgets/kiwientry.png
Binary files differ
diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwilabel.png b/gazpacho-plugin/resources/kiwiwidgets/kiwilabel.png
new file mode 100644
index 0000000..54fd785
--- /dev/null
+++ b/gazpacho-plugin/resources/kiwiwidgets/kiwilabel.png
Binary files differ
diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwiradiobutton.png b/gazpacho-plugin/resources/kiwiwidgets/kiwiradiobutton.png
new file mode 100644
index 0000000..7444d8c
--- /dev/null
+++ b/gazpacho-plugin/resources/kiwiwidgets/kiwiradiobutton.png
Binary files differ
diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwispinbutton.png b/gazpacho-plugin/resources/kiwiwidgets/kiwispinbutton.png
new file mode 100644
index 0000000..55f3293
--- /dev/null
+++ b/gazpacho-plugin/resources/kiwiwidgets/kiwispinbutton.png
Binary files differ
diff --git a/gazpacho-plugin/resources/kiwiwidgets/kiwitextview.png b/gazpacho-plugin/resources/kiwiwidgets/kiwitextview.png
new file mode 100644
index 0000000..2d51029
--- /dev/null
+++ b/gazpacho-plugin/resources/kiwiwidgets/kiwitextview.png
Binary files differ
diff --git a/gazpacho-plugin/resources/kiwiwidgets/objectlist.png b/gazpacho-plugin/resources/kiwiwidgets/objectlist.png
new file mode 100644
index 0000000..b66c7c8
--- /dev/null
+++ b/gazpacho-plugin/resources/kiwiwidgets/objectlist.png
Binary files differ
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
new file mode 100644
index 0000000..8595501
--- /dev/null
+++ b/pixmaps/validation-error-16.png
Binary files differ
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">&lt;control&gt;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">&lt;control&gt;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">&lt;control&gt;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">&lt;control&gt;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">&lt;control&gt;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">&lt;control&gt;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">&lt;control&gt;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)